diff --git a/README.build b/README.build
index b0b8497..251a290 100644
--- a/README.build
+++ b/README.build
@@ -21,6 +21,37 @@
 # BR2_TARGET_ROOTFS_TAR is not set
 ----------------------------------------------------
 
+
+-- Next apply this patch to make all of the host build statically
+   to remove dependence on locally generated shared libs.
+
+----------------------------------------------------------------------
+From 39c92fa91756747fa8eaf1fc898214658d1f8451 Mon Sep 17 00:00:00 2001
+From: John Newlin <jnewlin@google.com>
+Date: Fri, 3 Oct 2014 21:58:51 -0700
+Subject: [PATCH] Build libraries statically to make hermetic builds work.
+
+---
+ package/pkg-autotools.mk | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/package/pkg-autotools.mk b/package/pkg-autotools.mk
+index 4404f15..e4e4df9 100644
+--- a/package/pkg-autotools.mk
++++ b/package/pkg-autotools.mk
+@@ -165,7 +165,7 @@ define $(2)_CONFIGURE_CMDS
+                ./configure \
+                --prefix="$$(HOST_DIR)/usr" \
+                --sysconfdir="$$(HOST_DIR)/etc" \
+-               --enable-shared --disable-static \
++               --disable-shared --enable-static \
+                --disable-gtk-doc \
+                --disable-doc \
+                --disable-docs \
+-- 
+2.1.0.rc2.206.gedb03e5
+----------------------------------------------------------------------
+
 Run 'make'  (go grab some coffee this will take awhile)
 
 
diff --git a/arm-buildroot-linux-gnueabi/bin/ar b/arm-buildroot-linux-gnueabi/bin/ar
index f1ec35b..d92ee64 100755
--- a/arm-buildroot-linux-gnueabi/bin/ar
+++ b/arm-buildroot-linux-gnueabi/bin/ar
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/bin/as b/arm-buildroot-linux-gnueabi/bin/as
index 46fe577..a430cac 100755
--- a/arm-buildroot-linux-gnueabi/bin/as
+++ b/arm-buildroot-linux-gnueabi/bin/as
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/bin/ld b/arm-buildroot-linux-gnueabi/bin/ld
index 4e4f3b8..41e6350 100755
--- a/arm-buildroot-linux-gnueabi/bin/ld
+++ b/arm-buildroot-linux-gnueabi/bin/ld
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/bin/ld.bfd b/arm-buildroot-linux-gnueabi/bin/ld.bfd
index 4e4f3b8..41e6350 100755
--- a/arm-buildroot-linux-gnueabi/bin/ld.bfd
+++ b/arm-buildroot-linux-gnueabi/bin/ld.bfd
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/bin/nm b/arm-buildroot-linux-gnueabi/bin/nm
index b4f726e..ea9edb9 100755
--- a/arm-buildroot-linux-gnueabi/bin/nm
+++ b/arm-buildroot-linux-gnueabi/bin/nm
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/bin/objcopy b/arm-buildroot-linux-gnueabi/bin/objcopy
index 0589d47..1068fc6 100755
--- a/arm-buildroot-linux-gnueabi/bin/objcopy
+++ b/arm-buildroot-linux-gnueabi/bin/objcopy
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/bin/objdump b/arm-buildroot-linux-gnueabi/bin/objdump
index 6446b2d..003124d 100755
--- a/arm-buildroot-linux-gnueabi/bin/objdump
+++ b/arm-buildroot-linux-gnueabi/bin/objdump
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/bin/ranlib b/arm-buildroot-linux-gnueabi/bin/ranlib
index 49a3a7f..377e8ba 100755
--- a/arm-buildroot-linux-gnueabi/bin/ranlib
+++ b/arm-buildroot-linux-gnueabi/bin/ranlib
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/bin/strip b/arm-buildroot-linux-gnueabi/bin/strip
index 2f23bb0..ff12f53 100755
--- a/arm-buildroot-linux-gnueabi/bin/strip
+++ b/arm-buildroot-linux-gnueabi/bin/strip
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/lib/libasan.a b/arm-buildroot-linux-gnueabi/lib/libasan.a
index e1f4153..0aba3c6 100644
--- a/arm-buildroot-linux-gnueabi/lib/libasan.a
+++ b/arm-buildroot-linux-gnueabi/lib/libasan.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/lib/libasan.so.1.0.0 b/arm-buildroot-linux-gnueabi/lib/libasan.so.1.0.0
index 18436e5..c83ad5c 100755
--- a/arm-buildroot-linux-gnueabi/lib/libasan.so.1.0.0
+++ b/arm-buildroot-linux-gnueabi/lib/libasan.so.1.0.0
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/lib/libasan_preinit.o b/arm-buildroot-linux-gnueabi/lib/libasan_preinit.o
index 74c8bf5..d0625e1 100644
--- a/arm-buildroot-linux-gnueabi/lib/libasan_preinit.o
+++ b/arm-buildroot-linux-gnueabi/lib/libasan_preinit.o
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/lib/libatomic.a b/arm-buildroot-linux-gnueabi/lib/libatomic.a
index 2612a15..987674d 100644
--- a/arm-buildroot-linux-gnueabi/lib/libatomic.a
+++ b/arm-buildroot-linux-gnueabi/lib/libatomic.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/lib/libatomic.so.1.1.0 b/arm-buildroot-linux-gnueabi/lib/libatomic.so.1.1.0
index d554cf9..d9aea00 100755
--- a/arm-buildroot-linux-gnueabi/lib/libatomic.so.1.1.0
+++ b/arm-buildroot-linux-gnueabi/lib/libatomic.so.1.1.0
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/lib/libgcc_s.so.1 b/arm-buildroot-linux-gnueabi/lib/libgcc_s.so.1
index bdec9de..612b076 100644
--- a/arm-buildroot-linux-gnueabi/lib/libgcc_s.so.1
+++ b/arm-buildroot-linux-gnueabi/lib/libgcc_s.so.1
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/lib/libitm.a b/arm-buildroot-linux-gnueabi/lib/libitm.a
index 8be73e0..a540124 100644
--- a/arm-buildroot-linux-gnueabi/lib/libitm.a
+++ b/arm-buildroot-linux-gnueabi/lib/libitm.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/lib/libitm.so.1.0.0 b/arm-buildroot-linux-gnueabi/lib/libitm.so.1.0.0
index 1ad909e..5cf816d 100755
--- a/arm-buildroot-linux-gnueabi/lib/libitm.so.1.0.0
+++ b/arm-buildroot-linux-gnueabi/lib/libitm.so.1.0.0
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/lib/libstdc++.a b/arm-buildroot-linux-gnueabi/lib/libstdc++.a
index e4a0291..d7c1c4c 100644
--- a/arm-buildroot-linux-gnueabi/lib/libstdc++.a
+++ b/arm-buildroot-linux-gnueabi/lib/libstdc++.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/lib/libstdc++.so.6.0.20 b/arm-buildroot-linux-gnueabi/lib/libstdc++.so.6.0.20
index 0ad6c90..73e0838 100755
--- a/arm-buildroot-linux-gnueabi/lib/libstdc++.so.6.0.20
+++ b/arm-buildroot-linux-gnueabi/lib/libstdc++.so.6.0.20
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/lib/libsupc++.a b/arm-buildroot-linux-gnueabi/lib/libsupc++.a
index b64555d..8c6b2fd 100644
--- a/arm-buildroot-linux-gnueabi/lib/libsupc++.a
+++ b/arm-buildroot-linux-gnueabi/lib/libsupc++.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/lib/libubsan.a b/arm-buildroot-linux-gnueabi/lib/libubsan.a
index ffad848..5e1eb92 100644
--- a/arm-buildroot-linux-gnueabi/lib/libubsan.a
+++ b/arm-buildroot-linux-gnueabi/lib/libubsan.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/lib/libubsan.so.0.0.0 b/arm-buildroot-linux-gnueabi/lib/libubsan.so.0.0.0
index 37d22d4..5223a8d 100755
--- a/arm-buildroot-linux-gnueabi/lib/libubsan.so.0.0.0
+++ b/arm-buildroot-linux-gnueabi/lib/libubsan.so.0.0.0
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/ld-2.19.so b/arm-buildroot-linux-gnueabi/sysroot/lib/ld-2.19.so
index 7639aa1..fba00e0 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/ld-2.19.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/ld-2.19.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libBrokenLocale-2.19.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libBrokenLocale-2.19.so
index 8ea7e85..d3f3dda 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libBrokenLocale-2.19.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libBrokenLocale-2.19.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libSegFault.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libSegFault.so
index d964c9d..19a0a88 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libSegFault.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libSegFault.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libanl-2.19.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libanl-2.19.so
index b466368..373d030 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libanl-2.19.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libanl-2.19.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libc-2.19.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libc-2.19.so
index a3b2804..a9cd88a 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libc-2.19.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libc-2.19.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libcidn-2.19.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libcidn-2.19.so
index 659db9b..079b324 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libcidn-2.19.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libcidn-2.19.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libcrypt-2.19.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libcrypt-2.19.so
index 07c4b36..a312e57 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libcrypt-2.19.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libcrypt-2.19.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libdl-2.19.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libdl-2.19.so
index 4f7064a..f2e3a93 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libdl-2.19.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libdl-2.19.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libgcc_s.so.1 b/arm-buildroot-linux-gnueabi/sysroot/lib/libgcc_s.so.1
index bdec9de..612b076 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libgcc_s.so.1
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libgcc_s.so.1
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libm-2.19.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libm-2.19.so
index 26b67c0..ddead73 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libm-2.19.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libm-2.19.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libmemusage.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libmemusage.so
index 4585c19..8312dad 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libmemusage.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libmemusage.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libnsl-2.19.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libnsl-2.19.so
index 0d089c5..dbf06e7 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libnsl-2.19.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libnsl-2.19.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_compat-2.19.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_compat-2.19.so
index 47fbc72..6efc5c1 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_compat-2.19.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_compat-2.19.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_db-2.19.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_db-2.19.so
index f4c4635..422d78b 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_db-2.19.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_db-2.19.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_dns-2.19.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_dns-2.19.so
index 6330ba9..b1f761a 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_dns-2.19.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_dns-2.19.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_files-2.19.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_files-2.19.so
index 51fb35b..3ccafa1 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_files-2.19.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_files-2.19.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_hesiod-2.19.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_hesiod-2.19.so
index b379ce1..957076a 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_hesiod-2.19.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_hesiod-2.19.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_nis-2.19.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_nis-2.19.so
index f7a3286..8661d20 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_nis-2.19.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_nis-2.19.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_nisplus-2.19.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_nisplus-2.19.so
index 2905dd6..45619e0 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_nisplus-2.19.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libnss_nisplus-2.19.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libpcprofile.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libpcprofile.so
index d378817..0ffea85 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libpcprofile.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libpcprofile.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libpthread-2.19.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libpthread-2.19.so
index cc7cf92..9aa18de 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libpthread-2.19.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libpthread-2.19.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libresolv-2.19.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libresolv-2.19.so
index c0918be..2ab73c6 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libresolv-2.19.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libresolv-2.19.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/librt-2.19.so b/arm-buildroot-linux-gnueabi/sysroot/lib/librt-2.19.so
index 6afa692..b4ecd89 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/librt-2.19.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/librt-2.19.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libthread_db-1.0.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libthread_db-1.0.so
index 9e75d52..df1c6a4 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libthread_db-1.0.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libthread_db-1.0.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/lib/libutil-2.19.so b/arm-buildroot-linux-gnueabi/sysroot/lib/libutil-2.19.so
index c07d926..9a6239e 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/lib/libutil-2.19.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/lib/libutil-2.19.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/sbin/ldconfig b/arm-buildroot-linux-gnueabi/sysroot/sbin/ldconfig
index 58ac041..0746023 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/sbin/ldconfig
+++ b/arm-buildroot-linux-gnueabi/sysroot/sbin/ldconfig
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/sbin/sln b/arm-buildroot-linux-gnueabi/sysroot/sbin/sln
index 7aa6441..2c905ad 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/sbin/sln
+++ b/arm-buildroot-linux-gnueabi/sysroot/sbin/sln
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/gencat b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/gencat
index 3ec5402..8dabf18 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/gencat
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/gencat
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/getconf b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/getconf
index 0613880..9e1ca1d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/getconf
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/getconf
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/getent b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/getent
index 1ff59db..74003e2 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/getent
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/getent
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/iconv b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/iconv
index a9e9930..f5ec9fa 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/iconv
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/iconv
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/locale b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/locale
index 7ec4a64..ffc1893 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/locale
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/locale
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/localedef b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/localedef
index 41c7002..ca3f5f0 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/localedef
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/localedef
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/makedb b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/makedb
index d1defd4..2305b06 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/makedb
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/makedb
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/pcprofiledump b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/pcprofiledump
index 17f4e8e..99d48c7 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/pcprofiledump
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/pcprofiledump
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/pldd b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/pldd
index 051f6b4..a8a1cc4 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/pldd
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/pldd
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/rpcgen b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/rpcgen
index c87f7dd..6dd8711 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/rpcgen
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/rpcgen
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/sprof b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/sprof
index 9225342..3f261f6 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/bin/sprof
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/bin/sprof
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/Mcrt1.o b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/Mcrt1.o
index 7cb6fff..a218b7f 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/Mcrt1.o
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/Mcrt1.o
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/Scrt1.o b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/Scrt1.o
index f617355..996ca81 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/Scrt1.o
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/Scrt1.o
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/audit/sotruss-lib.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/audit/sotruss-lib.so
index 8f3a4cb..9291b0f 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/audit/sotruss-lib.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/audit/sotruss-lib.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/crt1.o b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/crt1.o
index 30231ad..0136830 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/crt1.o
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/crt1.o
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ANSI_X3.110.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ANSI_X3.110.so
index 6f262c9..0fcb92d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ANSI_X3.110.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ANSI_X3.110.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ARMSCII-8.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ARMSCII-8.so
index efe0ef2..bf351e6 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ARMSCII-8.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ARMSCII-8.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ASMO_449.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ASMO_449.so
index 1b75a85..958f3da 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ASMO_449.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ASMO_449.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/BIG5.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/BIG5.so
index 9085b4d..21b4e6a 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/BIG5.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/BIG5.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/BIG5HKSCS.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/BIG5HKSCS.so
index 9fec63e..5331dff 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/BIG5HKSCS.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/BIG5HKSCS.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/BRF.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/BRF.so
index cf17850..5ff827d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/BRF.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/BRF.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP10007.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP10007.so
index 58c2fee..2b53567 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP10007.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP10007.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1125.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1125.so
index 883b4de..d005e35 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1125.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1125.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1250.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1250.so
index f2cd27e..e3567b1 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1250.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1250.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1251.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1251.so
index 8521ff0..657f4a1 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1251.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1251.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1252.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1252.so
index 5df5416..71d9d60 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1252.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1252.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1253.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1253.so
index 5fab0a7..dfda05d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1253.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1253.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1254.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1254.so
index 34b436b..1676ae1 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1254.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1254.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1255.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1255.so
index 28b20df..fa1d42f 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1255.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1255.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1256.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1256.so
index f970ef6..114ef78 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1256.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1256.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1257.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1257.so
index 7fca0b8..66df593 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1257.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1257.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1258.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1258.so
index 029b140..b4e7f71 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1258.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP1258.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP737.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP737.so
index b74e5f0..2029659 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP737.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP737.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP770.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP770.so
index e43c07d..f18d438 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP770.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP770.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP771.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP771.so
index cd84c01..2324ed1 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP771.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP771.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP772.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP772.so
index 1b18ab6..02458e6 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP772.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP772.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP773.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP773.so
index 742d0d9..572b889 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP773.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP773.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP774.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP774.so
index b780352..f7517f3 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP774.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP774.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP775.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP775.so
index 95c7160..3cdba4b 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP775.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP775.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP932.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP932.so
index fc23e30..0576887 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP932.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CP932.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CSN_369103.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CSN_369103.so
index e233b75..2aadfdf 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CSN_369103.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CSN_369103.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CWI.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CWI.so
index fd0c805..a226da4 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CWI.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/CWI.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/DEC-MCS.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/DEC-MCS.so
index d310354..6273115 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/DEC-MCS.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/DEC-MCS.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-AT-DE-A.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-AT-DE-A.so
index 07b9aa5..7cc10c1 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-AT-DE-A.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-AT-DE-A.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-AT-DE.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-AT-DE.so
index da9cbd9..5f30070 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-AT-DE.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-AT-DE.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-CA-FR.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-CA-FR.so
index 2ddd3f8..a00970a 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-CA-FR.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-CA-FR.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-DK-NO-A.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-DK-NO-A.so
index ce80fca..7142ced 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-DK-NO-A.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-DK-NO-A.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-DK-NO.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-DK-NO.so
index b384312..1769d67 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-DK-NO.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-DK-NO.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-ES-A.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-ES-A.so
index 7350f67..414297a 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-ES-A.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-ES-A.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-ES-S.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-ES-S.so
index dfa376c..f5c1c4b 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-ES-S.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-ES-S.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-ES.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-ES.so
index f14f72e..99b6331 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-ES.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-ES.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-FI-SE-A.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-FI-SE-A.so
index 4d4ce02..a2fb98b 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-FI-SE-A.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-FI-SE-A.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-FI-SE.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-FI-SE.so
index c61ab37..ea05f6b 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-FI-SE.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-FI-SE.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-FR.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-FR.so
index cff1353..fe5eacd 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-FR.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-FR.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-IS-FRISS.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-IS-FRISS.so
index bd6d795..7b4b137 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-IS-FRISS.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-IS-FRISS.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-IT.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-IT.so
index 780baf8..5a60749 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-IT.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-IT.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-PT.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-PT.so
index aba6bd5..3f1cfd3 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-PT.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-PT.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-UK.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-UK.so
index 9a19f13..10bcf78 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-UK.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-UK.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-US.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-US.so
index 829a065..64d90ef 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-US.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EBCDIC-US.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ECMA-CYRILLIC.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ECMA-CYRILLIC.so
index 8b6045c..ed704fa 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ECMA-CYRILLIC.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ECMA-CYRILLIC.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-CN.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-CN.so
index 04e27b5..4541ab9 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-CN.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-CN.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-JISX0213.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-JISX0213.so
index 8ca1f8e..2a739ad 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-JISX0213.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-JISX0213.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-JP-MS.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-JP-MS.so
index 78507f0..01212ee 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-JP-MS.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-JP-MS.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-JP.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-JP.so
index e8d4495..154352b 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-JP.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-JP.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-KR.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-KR.so
index 84dd2a1..645c2c2 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-KR.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-KR.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-TW.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-TW.so
index 02706d4..a17fef7 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-TW.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/EUC-TW.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GB18030.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GB18030.so
index 90d26c1..4926e9c 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GB18030.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GB18030.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GBBIG5.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GBBIG5.so
index 4d6b8e8..72449ad 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GBBIG5.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GBBIG5.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GBGBK.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GBGBK.so
index a6ef778..50ce1a6 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GBGBK.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GBGBK.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GBK.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GBK.so
index cd4e5c8..88e98b3 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GBK.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GBK.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GEORGIAN-ACADEMY.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GEORGIAN-ACADEMY.so
index 3bf7ae8..db42966 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GEORGIAN-ACADEMY.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GEORGIAN-ACADEMY.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GEORGIAN-PS.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GEORGIAN-PS.so
index 3145c76..581ca7c 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GEORGIAN-PS.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GEORGIAN-PS.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GOST_19768-74.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GOST_19768-74.so
index ac44f7f..8898b0a 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GOST_19768-74.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GOST_19768-74.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GREEK-CCITT.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GREEK-CCITT.so
index f5c0f80..d286b44 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GREEK-CCITT.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GREEK-CCITT.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GREEK7-OLD.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GREEK7-OLD.so
index ef12673..4cb6aa6 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GREEK7-OLD.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GREEK7-OLD.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GREEK7.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GREEK7.so
index f405844..c151d38 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GREEK7.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/GREEK7.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/HP-GREEK8.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/HP-GREEK8.so
index 86ce9cf..3ee62cc 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/HP-GREEK8.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/HP-GREEK8.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/HP-ROMAN8.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/HP-ROMAN8.so
index 5955736..21ac20f 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/HP-ROMAN8.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/HP-ROMAN8.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/HP-ROMAN9.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/HP-ROMAN9.so
index f3f03cf..f84af69 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/HP-ROMAN9.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/HP-ROMAN9.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/HP-THAI8.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/HP-THAI8.so
index 46514e2..ec1f453 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/HP-THAI8.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/HP-THAI8.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/HP-TURKISH8.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/HP-TURKISH8.so
index 66947e4..6494571 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/HP-TURKISH8.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/HP-TURKISH8.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM037.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM037.so
index 9bf0f0c..e0ceac4 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM037.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM037.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM038.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM038.so
index 57363c6..5096323 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM038.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM038.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1004.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1004.so
index 39b9d27..e886876 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1004.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1004.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1008.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1008.so
index 54e79fc..bda2cfb 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1008.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1008.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1008_420.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1008_420.so
index 909f74d..2afd104 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1008_420.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1008_420.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1025.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1025.so
index 2060fbe..4ecb5e4 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1025.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1025.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1026.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1026.so
index b3e41e2..401da87 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1026.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1026.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1046.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1046.so
index 118e3d3..9ac49db 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1046.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1046.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1047.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1047.so
index 79682e8..428999e 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1047.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1047.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1097.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1097.so
index eaa0ac3..564b653 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1097.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1097.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1112.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1112.so
index a4b6065..d9f81f2 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1112.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1112.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1122.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1122.so
index 14cd358..91ebda1 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1122.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1122.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1123.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1123.so
index e643195..e973e2c 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1123.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1123.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1124.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1124.so
index e33b96b..dbf1351 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1124.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1124.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1129.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1129.so
index 4b45933..5eb03b4 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1129.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1129.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1130.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1130.so
index a58b0a9..992e835 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1130.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1130.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1132.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1132.so
index 0ba8163..076ad38 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1132.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1132.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1133.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1133.so
index a15148d..179dc49 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1133.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1133.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1137.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1137.so
index 8349c29..34397d7 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1137.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1137.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1140.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1140.so
index 94fcd78..76ea84c 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1140.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1140.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1141.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1141.so
index 63a9795..493e11a 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1141.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1141.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1142.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1142.so
index b8c41b9..ac0f7e4 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1142.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1142.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1143.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1143.so
index 8dc0323..8f42950 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1143.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1143.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1144.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1144.so
index f653352..96f99af 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1144.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1144.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1145.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1145.so
index 2c11b91..039be2d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1145.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1145.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1146.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1146.so
index 0018d84..e71c4dd 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1146.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1146.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1147.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1147.so
index a3fdfdc..9ce0277 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1147.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1147.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1148.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1148.so
index a0f1ca3..12bc95a 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1148.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1148.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1149.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1149.so
index 36d14dd..349dcbb 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1149.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1149.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1153.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1153.so
index a02bf91..a8f9ec3 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1153.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1153.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1154.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1154.so
index 18425f0..8e2bf2a 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1154.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1154.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1155.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1155.so
index 022fab8..ec5e025 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1155.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1155.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1156.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1156.so
index ef85c83..ab25996 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1156.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1156.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1157.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1157.so
index a8a5736..77d3065 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1157.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1157.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1158.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1158.so
index a1e7cdb..cfc1c0d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1158.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1158.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1160.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1160.so
index f63b1cd..e4aa4cd 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1160.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1160.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1161.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1161.so
index da7fa1e..f63eeb2 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1161.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1161.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1162.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1162.so
index 6fd84cc..d312c41 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1162.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1162.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1163.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1163.so
index f40c96d..3a6857d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1163.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1163.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1164.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1164.so
index f1ffc41..320b6eb 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1164.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1164.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1166.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1166.so
index af937c2..fd6ccd3 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1166.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1166.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1167.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1167.so
index 6e62646..054663a 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1167.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1167.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM12712.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM12712.so
index 440d2b6..e1b0163 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM12712.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM12712.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1364.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1364.so
index 5464fe8..62515a5 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1364.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1364.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1371.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1371.so
index c74efa9..09cc75d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1371.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1371.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1388.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1388.so
index b3f4e66..a68f9cf 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1388.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1388.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1390.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1390.so
index f38fe23..182cfb0 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1390.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1390.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1399.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1399.so
index aa29e80..c69b2e1 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1399.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM1399.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM16804.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM16804.so
index 5f7f07c..9eccda2 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM16804.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM16804.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM256.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM256.so
index 2ecb372..864bd00 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM256.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM256.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM273.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM273.so
index c4f18f1..1820afb 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM273.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM273.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM274.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM274.so
index 713bc85..47c40f4 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM274.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM274.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM275.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM275.so
index 6edc2bf..1fb8df8 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM275.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM275.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM277.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM277.so
index e989d67..fb8a390 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM277.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM277.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM278.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM278.so
index cbccc6f..1a8c72d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM278.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM278.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM280.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM280.so
index 5d491d6..aceaadb 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM280.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM280.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM281.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM281.so
index b292b61..ee487a7 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM281.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM281.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM284.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM284.so
index 0ad66ec..350e1df 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM284.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM284.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM285.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM285.so
index 6f00d4d..f2233d1 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM285.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM285.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM290.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM290.so
index 84ccc85..a49ba7c 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM290.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM290.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM297.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM297.so
index 38e1682..15eb0ab 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM297.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM297.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM420.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM420.so
index 69094c4..8bd0104 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM420.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM420.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM423.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM423.so
index a3aa97f..48275b4 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM423.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM423.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM424.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM424.so
index cbd490f..aa7338b 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM424.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM424.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM437.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM437.so
index b69e05e..caa6271 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM437.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM437.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM4517.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM4517.so
index 92bcdfd..781787a 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM4517.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM4517.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM4899.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM4899.so
index 4d8c81a..18a7878 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM4899.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM4899.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM4909.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM4909.so
index 32abcf4..9cfc341 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM4909.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM4909.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM4971.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM4971.so
index 5b732e1..a798e96 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM4971.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM4971.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM500.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM500.so
index f53534b..a1f0fda 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM500.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM500.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM5347.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM5347.so
index 7addf10..bd4b126 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM5347.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM5347.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM803.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM803.so
index c8539ff..f4a547d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM803.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM803.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM850.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM850.so
index ec4a7e8..7d0fbd1 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM850.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM850.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM851.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM851.so
index 04a22d3..a1cc3a9 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM851.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM851.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM852.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM852.so
index 2ec75de..b2f58e2 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM852.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM852.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM855.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM855.so
index f4d3ffe..3faa3ff 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM855.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM855.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM856.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM856.so
index 8f57213..5fbacb1 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM856.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM856.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM857.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM857.so
index cc9150c..216025a 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM857.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM857.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM860.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM860.so
index 0e49e60..fb7ca03 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM860.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM860.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM861.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM861.so
index b6bcd89..00ce83c 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM861.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM861.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM862.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM862.so
index b7cacd8..ad90f9a 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM862.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM862.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM863.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM863.so
index 7236e4f..22f5f81 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM863.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM863.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM864.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM864.so
index 1911641..56b73ff 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM864.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM864.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM865.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM865.so
index 4b01ea3..582cbb9 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM865.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM865.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM866.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM866.so
index e0ea0c8..ad96aa5 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM866.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM866.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM866NAV.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM866NAV.so
index e44ef6b..67571a4 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM866NAV.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM866NAV.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM868.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM868.so
index e9cd2fe..0f02167 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM868.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM868.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM869.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM869.so
index 5d9e01a..8c1562e 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM869.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM869.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM870.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM870.so
index 8a70de5..7d773d7 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM870.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM870.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM871.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM871.so
index aeb21e2..64f4856 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM871.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM871.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM874.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM874.so
index b650517..4c8d903 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM874.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM874.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM875.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM875.so
index 07edbb6..dcaf7c3 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM875.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM875.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM880.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM880.so
index 966f2ae..41afb9d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM880.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM880.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM891.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM891.so
index 24092de..38c74cc 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM891.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM891.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM901.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM901.so
index 76a97bc..44cd9bb 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM901.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM901.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM902.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM902.so
index ebe2fe5..950b273 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM902.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM902.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM903.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM903.so
index a99dc96..8071f87 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM903.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM903.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM9030.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM9030.so
index de6cabb..ad16ad1 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM9030.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM9030.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM904.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM904.so
index 428e6a7..2f4e74c 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM904.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM904.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM905.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM905.so
index 96298f5..149cb8e 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM905.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM905.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM9066.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM9066.so
index d10eefb..572a05d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM9066.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM9066.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM918.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM918.so
index 7a7573c..f67a9bf 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM918.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM918.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM921.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM921.so
index 1f4ca70..1e6d4b0 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM921.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM921.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM922.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM922.so
index 118b279..0184065 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM922.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM922.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM930.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM930.so
index 52bb6cf..894dc68 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM930.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM930.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM932.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM932.so
index ed680ee..e8a8572 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM932.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM932.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM933.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM933.so
index a6ad9e2..6234500 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM933.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM933.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM935.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM935.so
index c410959..ad10be7 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM935.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM935.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM937.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM937.so
index f9f4ba0..5f21f0e 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM937.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM937.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM939.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM939.so
index cc401f5..c8007a3 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM939.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM939.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM943.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM943.so
index 3969afe..5949706 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM943.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM943.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM9448.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM9448.so
index 7f618ba..9b70df8 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM9448.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IBM9448.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IEC_P27-1.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IEC_P27-1.so
index e8f9662..be807a1 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IEC_P27-1.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/IEC_P27-1.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/INIS-8.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/INIS-8.so
index a143081..fe1bc76 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/INIS-8.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/INIS-8.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/INIS-CYRILLIC.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/INIS-CYRILLIC.so
index 75edb6d..c0c37b6 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/INIS-CYRILLIC.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/INIS-CYRILLIC.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/INIS.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/INIS.so
index 33a543c..0399dc4 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/INIS.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/INIS.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISIRI-3342.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISIRI-3342.so
index 1598a18..700adc2 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISIRI-3342.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISIRI-3342.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-2022-CN-EXT.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-2022-CN-EXT.so
index 04c8ef7..c89fcf7 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-2022-CN-EXT.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-2022-CN-EXT.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-2022-CN.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-2022-CN.so
index 78a30ab..de5cf04 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-2022-CN.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-2022-CN.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-2022-JP-3.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-2022-JP-3.so
index 6619e86..60eacf6 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-2022-JP-3.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-2022-JP-3.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-2022-JP.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-2022-JP.so
index 9281b10..3299920 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-2022-JP.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-2022-JP.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-2022-KR.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-2022-KR.so
index feca3d1..260bad4 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-2022-KR.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-2022-KR.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-IR-197.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-IR-197.so
index 0edb159..1129677 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-IR-197.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-IR-197.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-IR-209.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-IR-209.so
index a1beeb2..da6108b 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-IR-209.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO-IR-209.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO646.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO646.so
index 5f36ccd..86e74df 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO646.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO646.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-1.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-1.so
index 8fd1688..ef3665d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-1.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-1.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-10.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-10.so
index a5068ba..1b1ec1d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-10.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-10.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-11.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-11.so
index 6fddcdb..b3df008 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-11.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-11.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-13.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-13.so
index c042191..71ba9ce 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-13.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-13.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-14.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-14.so
index 5895deb..cd84dc7 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-14.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-14.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-15.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-15.so
index 2b8ff67..4b6d1d9 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-15.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-15.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-16.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-16.so
index 56e681b..a0102f3 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-16.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-16.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-2.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-2.so
index 6727710..51b2c72 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-2.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-2.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-3.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-3.so
index bc478a0..90d6506 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-3.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-3.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-4.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-4.so
index ef2b8ab..c8bdd01 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-4.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-4.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-5.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-5.so
index b560114..2b52e38 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-5.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-5.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-6.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-6.so
index 604564a..7b1de4c 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-6.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-6.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-7.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-7.so
index d34ab20..13fc1ed 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-7.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-7.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-8.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-8.so
index aad16db..a699267 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-8.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-8.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-9.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-9.so
index c5be8e4..357922d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-9.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-9.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-9E.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-9E.so
index b191930..5c8eac8 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-9E.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO8859-9E.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_10367-BOX.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_10367-BOX.so
index 09d5fc0..15b5ec2 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_10367-BOX.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_10367-BOX.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_11548-1.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_11548-1.so
index cfd8f7c..f5830f4 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_11548-1.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_11548-1.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_2033.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_2033.so
index 350eacc..e63b503 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_2033.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_2033.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_5427-EXT.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_5427-EXT.so
index 1f3dc56..85236e0 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_5427-EXT.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_5427-EXT.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_5427.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_5427.so
index 081663e..2752061 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_5427.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_5427.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_5428.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_5428.so
index fe9b72b..4980a19 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_5428.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_5428.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_6937-2.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_6937-2.so
index f7742d1..e4ec8c7 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_6937-2.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_6937-2.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_6937.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_6937.so
index 6aa23c9..86925a1 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_6937.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/ISO_6937.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/JOHAB.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/JOHAB.so
index d54fbd3..f8ba03c 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/JOHAB.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/JOHAB.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/KOI-8.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/KOI-8.so
index 7b66fc6..e9d860a 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/KOI-8.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/KOI-8.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/KOI8-R.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/KOI8-R.so
index 95bfaff..4019c5a 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/KOI8-R.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/KOI8-R.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/KOI8-RU.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/KOI8-RU.so
index 886594c..e8c02a1 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/KOI8-RU.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/KOI8-RU.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/KOI8-T.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/KOI8-T.so
index 8fc6bed..902a30b 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/KOI8-T.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/KOI8-T.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/KOI8-U.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/KOI8-U.so
index c876a09..a79e61f 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/KOI8-U.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/KOI8-U.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/LATIN-GREEK-1.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/LATIN-GREEK-1.so
index 46c8ff5..6f5b858 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/LATIN-GREEK-1.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/LATIN-GREEK-1.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/LATIN-GREEK.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/LATIN-GREEK.so
index edf2834..529f9ca 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/LATIN-GREEK.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/LATIN-GREEK.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MAC-CENTRALEUROPE.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MAC-CENTRALEUROPE.so
index 8539495..5b533e1 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MAC-CENTRALEUROPE.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MAC-CENTRALEUROPE.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MAC-IS.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MAC-IS.so
index db56690..4d8acee 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MAC-IS.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MAC-IS.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MAC-SAMI.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MAC-SAMI.so
index a0adcc0..8d54f19 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MAC-SAMI.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MAC-SAMI.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MAC-UK.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MAC-UK.so
index 0d2014f..fd7f9ba 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MAC-UK.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MAC-UK.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MACINTOSH.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MACINTOSH.so
index b89bc9a..9d1816d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MACINTOSH.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MACINTOSH.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MIK.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MIK.so
index c8ef6fa..279c68b 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MIK.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/MIK.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/NATS-DANO.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/NATS-DANO.so
index aacdb68..c5bd93f 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/NATS-DANO.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/NATS-DANO.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/NATS-SEFI.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/NATS-SEFI.so
index 4feca46..6bd212c 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/NATS-SEFI.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/NATS-SEFI.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/PT154.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/PT154.so
index cfe624e..dfc2bf7 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/PT154.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/PT154.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/RK1048.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/RK1048.so
index c607827..7ca76ad 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/RK1048.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/RK1048.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/SAMI-WS2.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/SAMI-WS2.so
index 0a81f78..e4aa645 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/SAMI-WS2.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/SAMI-WS2.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/SHIFT_JISX0213.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/SHIFT_JISX0213.so
index 603d43d..229e204 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/SHIFT_JISX0213.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/SHIFT_JISX0213.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/SJIS.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/SJIS.so
index 5b2822b..be255d0 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/SJIS.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/SJIS.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/T.61.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/T.61.so
index a5de482..d8bb394 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/T.61.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/T.61.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/TCVN5712-1.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/TCVN5712-1.so
index 721a9b9..b79ccc4 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/TCVN5712-1.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/TCVN5712-1.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/TIS-620.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/TIS-620.so
index 831dad3..b2a1ed1 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/TIS-620.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/TIS-620.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/TSCII.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/TSCII.so
index c10d25d..d5c322e 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/TSCII.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/TSCII.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/UHC.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/UHC.so
index 93a1f0f..e362881 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/UHC.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/UHC.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/UNICODE.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/UNICODE.so
index 872cc51..6db2a6c 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/UNICODE.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/UNICODE.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/UTF-16.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/UTF-16.so
index 1916fa9..f41144f 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/UTF-16.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/UTF-16.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/UTF-32.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/UTF-32.so
index cbb78c3..8e99fd2 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/UTF-32.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/UTF-32.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/UTF-7.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/UTF-7.so
index 1c237e0..71e7266 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/UTF-7.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/UTF-7.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/VISCII.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/VISCII.so
index 71b4119..2ec6ef3 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/VISCII.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/VISCII.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libCNS.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libCNS.so
index 45650be..5ff1669 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libCNS.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libCNS.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libGB.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libGB.so
index e345c78..542efdc 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libGB.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libGB.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libISOIR165.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libISOIR165.so
index 5c7451e..e145334 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libISOIR165.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libISOIR165.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libJIS.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libJIS.so
index b954f6f..836301b 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libJIS.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libJIS.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libJISX0213.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libJISX0213.so
index 5762015..1d1b023 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libJISX0213.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libJISX0213.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libKSC.so b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libKSC.so
index f3d088e..0465d57 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libKSC.so
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gconv/libKSC.so
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gcrt1.o b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gcrt1.o
index 4d58a64..78beb56 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gcrt1.o
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/gcrt1.o
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libBrokenLocale.a b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libBrokenLocale.a
index 15a07eb..cd0d60f 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libBrokenLocale.a
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libBrokenLocale.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libanl.a b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libanl.a
index a236930..f738b3c 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libanl.a
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libanl.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libc.a b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libc.a
index 2c34c3f..4ff9bd9 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libc.a
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libc.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libc_nonshared.a b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libc_nonshared.a
index b063bf1..ad2a96c 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libc_nonshared.a
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libc_nonshared.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libcrypt.a b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libcrypt.a
index 2bbbc74..0409b5c 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libcrypt.a
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libcrypt.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libdl.a b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libdl.a
index 47bce92..03209c8 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libdl.a
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libdl.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libg.a b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libg.a
index da1886a..913ac82 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libg.a
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libg.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libieee.a b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libieee.a
index 4154d67..e32caa8 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libieee.a
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libieee.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libm.a b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libm.a
index b7a4ede..e85d6b7 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libm.a
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libm.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libmcheck.a b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libmcheck.a
index d7cc227..0fd21a7 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libmcheck.a
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libmcheck.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libnsl.a b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libnsl.a
index 84647fe..7af34a8 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libnsl.a
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libnsl.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libpthread.a b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libpthread.a
index 18df3e7..b7a6163 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libpthread.a
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libpthread.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libpthread_nonshared.a b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libpthread_nonshared.a
index 91eedc7..38289b2 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libpthread_nonshared.a
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libpthread_nonshared.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libresolv.a b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libresolv.a
index f684c05..b744469 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libresolv.a
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libresolv.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/librpcsvc.a b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/librpcsvc.a
index 24e8db3..dd9dadf 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/librpcsvc.a
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/librpcsvc.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/librt.a b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/librt.a
index ec28763..1cbf56d 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/librt.a
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/librt.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libstdc++.a b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libstdc++.a
index e4a0291..d7c1c4c 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libstdc++.a
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libstdc++.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libstdc++.so.6.0.20 b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libstdc++.so.6.0.20
index 0ad6c90..73e0838 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libstdc++.so.6.0.20
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libstdc++.so.6.0.20
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libutil.a b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libutil.a
index 5ef7b19..4d70cd6 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libutil.a
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libutil.a
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/POSIX_V6_ILP32_OFF32 b/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/POSIX_V6_ILP32_OFF32
index 0613880..9e1ca1d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/POSIX_V6_ILP32_OFF32
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/POSIX_V6_ILP32_OFF32
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/POSIX_V6_ILP32_OFFBIG b/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/POSIX_V6_ILP32_OFFBIG
index 0613880..9e1ca1d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/POSIX_V6_ILP32_OFFBIG
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/POSIX_V6_ILP32_OFFBIG
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/POSIX_V7_ILP32_OFF32 b/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/POSIX_V7_ILP32_OFF32
index 0613880..9e1ca1d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/POSIX_V7_ILP32_OFF32
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/POSIX_V7_ILP32_OFF32
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/POSIX_V7_ILP32_OFFBIG b/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/POSIX_V7_ILP32_OFFBIG
index 0613880..9e1ca1d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/POSIX_V7_ILP32_OFFBIG
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/POSIX_V7_ILP32_OFFBIG
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/XBS5_ILP32_OFF32 b/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/XBS5_ILP32_OFF32
index 0613880..9e1ca1d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/XBS5_ILP32_OFF32
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/XBS5_ILP32_OFF32
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/XBS5_ILP32_OFFBIG b/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/XBS5_ILP32_OFFBIG
index 0613880..9e1ca1d 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/XBS5_ILP32_OFFBIG
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/libexec/getconf/XBS5_ILP32_OFFBIG
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/sbin/iconvconfig b/arm-buildroot-linux-gnueabi/sysroot/usr/sbin/iconvconfig
index d4a7712..9b88f36 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/sbin/iconvconfig
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/sbin/iconvconfig
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/sbin/nscd b/arm-buildroot-linux-gnueabi/sysroot/usr/sbin/nscd
index 14018c9..3a312d1 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/sbin/nscd
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/sbin/nscd
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/sbin/zdump b/arm-buildroot-linux-gnueabi/sysroot/usr/sbin/zdump
index fed6404..278ad8a 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/sbin/zdump
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/sbin/zdump
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/sbin/zic b/arm-buildroot-linux-gnueabi/sysroot/usr/sbin/zic
index ae1eca3..fd4b94c 100755
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/sbin/zic
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/sbin/zic
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info
index 7e49bff..21b89f8 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info
@@ -1,7 +1,24 @@
-This is
-/usr/local/google/home/jnewlin/src/uclibc/buildroot/output/build/glibc-2.19/build/manual/libc.info,
-produced by makeinfo version 4.13 from libc.texinfo.
+This is libc.info, produced by makeinfo version 5.2 from libc.texinfo.
 
+This file documents the GNU C Library.
+
+   This is 'The GNU C Library Reference Manual', for version 2.19
+(Buildroot).
+
+   Copyright (C) 1993-2014 Free Software Foundation, Inc.
+
+   Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being "Free Software Needs Free Documentation" and
+"GNU Lesser General Public License", the Front-Cover texts being "A GNU
+Manual", and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled "GNU Free Documentation
+License".
+
+   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
+modify this GNU manual.  Buying copies from the FSF supports it in
+developing GNU and promoting software freedom."
 INFO-DIR-SECTION Software libraries
 START-INFO-DIR-ENTRY
 * Libc: (libc).                 C library.
@@ -1692,758 +1709,740 @@
 * ynl: (libc)Special Functions.
 END-INFO-DIR-ENTRY
 
-   This file documents the GNU C Library.
-
-   This is `The GNU C Library Reference Manual', for version 2.19
-(Buildroot).
-
-   Copyright (C) 1993-2014 Free Software Foundation, Inc.
-
-   Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version
-1.3 or any later version published by the Free Software Foundation;
-with the Invariant Sections being "Free Software Needs Free
-Documentation" and "GNU Lesser General Public License", the Front-Cover
-texts being "A GNU Manual", and with the Back-Cover Texts as in (a)
-below.  A copy of the license is included in the section entitled "GNU
-Free Documentation License".
-
-   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
-modify this GNU manual.  Buying copies from the FSF supports it in
-developing GNU and promoting software freedom."
-
 
 Indirect:
-libc.info-1: 64179
-libc.info-2: 362623
-libc.info-3: 660437
-libc.info-4: 960045
-libc.info-5: 1258958
-libc.info-6: 1555484
-libc.info-7: 1849446
-libc.info-8: 2147081
-libc.info-9: 2446946
-libc.info-10: 2618618
-libc.info-11: 2891605
-libc.info-12: 3067919
+libc.info-1: 64085
+libc.info-2: 365308
+libc.info-3: 664384
+libc.info-4: 968444
+libc.info-5: 1267893
+libc.info-6: 1568219
+libc.info-7: 1864094
+libc.info-8: 2164465
+libc.info-9: 2467785
+libc.info-10: 2766282
+libc.info-11: 3064697
+libc.info-12: 3528714
+libc.info-13: 3688300
+libc.info-14: 4031944
 
 Tag Table:
 (Indirect)
-Node: Top64179
-Node: Introduction123999
-Node: Getting Started125350
-Node: Standards and Portability126814
-Node: ISO C128269
-Node: POSIX129797
-Node: POSIX Safety Concepts131890
-Node: Unsafe Features137597
-Node: Conditionally Safe Features142142
-Node: Other Safety Remarks153490
-Node: Berkeley Unix162234
-Node: SVID163007
-Node: XPG164016
-Node: Using the Library164966
-Node: Header Files165694
-Node: Macro Definitions169655
-Node: Reserved Names172004
-Node: Feature Test Macros176727
-Node: Roadmap to the Manual186353
-Node: Error Reporting193681
-Node: Checking for Errors194600
-Node: Error Codes198846
-Node: Error Messages218579
-Node: Memory234622
-Node: Memory Concepts235480
-Node: Memory Allocation241162
-Node: Memory Allocation and C242068
-Node: Unconstrained Allocation245645
-Node: Basic Allocation247074
-Node: Malloc Examples248898
-Node: Freeing after Malloc250854
-Node: Changing Block Size252897
-Node: Allocating Cleared Space255615
-Node: Efficiency and Malloc256747
-Node: Aligned Memory Blocks257859
-Node: Malloc Tunable Parameters261863
-Node: Heap Consistency Checking264296
-Node: Hooks for Malloc269704
-Node: Statistics of Malloc276001
-Node: Summary of Malloc278111
-Node: Allocation Debugging280727
-Node: Tracing malloc281839
-Node: Using the Memory Debugger284062
-Node: Tips for the Memory Debugger285955
-Node: Interpreting the traces287271
-Node: Obstacks290809
-Node: Creating Obstacks292432
-Node: Preparing for Obstacks294347
-Node: Allocation in an Obstack297208
-Node: Freeing Obstack Objects299980
-Node: Obstack Functions301442
-Node: Growing Objects303685
-Node: Extra Fast Growing308877
-Node: Status of an Obstack313048
-Node: Obstacks Data Alignment314781
-Node: Obstack Chunks316756
-Node: Summary of Obstacks319214
-Node: Variable Size Automatic322644
-Node: Alloca Example324268
-Node: Advantages of Alloca325402
-Node: Disadvantages of Alloca327302
-Node: GNU C Variable-Size Arrays328058
-Node: Resizing the Data Segment329227
-Node: Locking Pages331524
-Node: Why Lock Pages332266
-Node: Locked Memory Details333905
-Node: Page Lock Functions336174
-Node: Character Handling342404
-Node: Classification of Characters343862
-Node: Case Conversion348899
-Node: Classification of Wide Characters351236
-Node: Using Wide Char Classes360307
-Node: Wide Character Case Conversion362623
-Node: String and Array Utilities365695
-Node: Representation of Strings367760
-Node: String/Array Conventions373289
-Node: String Length376227
-Node: Copying and Concatenation380391
-Node: String/Array Comparison408293
-Node: Collation Functions419523
-Node: Search Functions430212
-Node: Finding Tokens in a String444608
-Node: strfry456714
-Node: Trivial Encryption457836
-Node: Encode Binary Data459393
-Node: Argz and Envz Vectors464257
-Node: Argz Functions464864
-Node: Envz Functions472605
-Node: Character Set Handling476132
-Node: Extended Char Intro477285
-Node: Charset Function Overview490402
-Node: Restartable multibyte conversion491370
-Node: Selecting the Conversion493485
-Node: Keeping the state495868
-Node: Converting a Character499188
-Node: Converting Strings515950
-Node: Multibyte Conversion Example526718
-Node: Non-reentrant Conversion529669
-Node: Non-reentrant Character Conversion531358
-Node: Non-reentrant String Conversion536502
-Node: Shift State539773
-Node: Generic Charset Conversion542435
-Node: Generic Conversion Interface545627
-Node: iconv Examples555962
-Node: Other iconv Implementations561260
-Node: glibc iconv Implementation566659
-Node: Locales606202
-Node: Effects of Locale607872
-Node: Choosing Locale609841
-Node: Locale Categories611220
-Node: Setting the Locale613742
-Node: Standard Locales618775
-Node: Locale Information620069
-Node: The Lame Way to Locale Data621790
-Node: General Numeric623788
-Node: Currency Symbol626784
-Node: Sign of Money Amount630985
-Node: The Elegant and Fast Way633128
-Node: Formatting Numbers645368
-Node: Yes-or-No Questions654905
-Node: Message Translation657092
-Node: Message catalogs a la X/Open659134
-Node: The catgets Functions660437
-Node: The message catalog files669772
-Node: The gencat program676520
-Node: Common Usage679663
-Node: The Uniforum approach686827
-Node: Message catalogs with gettext688326
-Node: Translation with gettext689370
-Node: Locating gettext catalog696109
-Node: Advanced gettext functions703196
-Ref: Advanced gettext functions-Footnote-1714357
-Node: Charset conversion in gettext714449
-Node: GUI program problems717052
-Node: Using gettextized software722599
-Node: Helper programs for gettext730928
-Node: Searching and Sorting732705
-Node: Comparison Functions733621
-Node: Array Search Function734838
-Node: Array Sort Function738462
-Node: Search/Sort Example740698
-Node: Hash Search Function744137
-Node: Tree Search Function752560
-Node: Pattern Matching760098
-Node: Wildcard Matching760903
-Node: Globbing764792
-Node: Calling Glob765663
-Node: Flags for Globbing776465
-Node: More Flags for Globbing780100
-Node: Regular Expressions786485
-Node: POSIX Regexp Compilation787479
-Node: Flags for POSIX Regexps791768
-Node: Matching POSIX Regexps792686
-Node: Regexp Subexpressions795049
-Node: Subexpression Complications797116
-Node: Regexp Cleanup799492
-Node: Word Expansion802095
-Node: Expansion Stages803457
-Node: Calling Wordexp804961
-Node: Flags for Wordexp809256
-Node: Wordexp Example811220
-Node: Tilde Expansion813022
-Node: Variable Substitution814105
-Node: I/O Overview818242
-Node: I/O Concepts819759
-Node: Streams and File Descriptors820915
-Node: File Position824015
-Node: File Names826160
-Node: Directories827055
-Node: File Name Resolution828803
-Node: File Name Errors831737
-Node: File Name Portability833290
-Node: I/O on Streams835255
-Node: Streams837368
-Node: Standard Streams838719
-Node: Opening Streams840521
-Node: Closing Streams851813
-Node: Streams and Threads854591
-Node: Streams and I18N864011
-Node: Simple Output870286
-Node: Character Input877740
-Node: Line Input884480
-Node: Unreading891994
-Node: Unreading Idea892812
-Node: How Unread893630
-Node: Block Input/Output896628
-Node: Formatted Output899885
-Node: Formatted Output Basics901521
-Node: Output Conversion Syntax904021
-Node: Table of Output Conversions909134
-Node: Integer Conversions912153
-Node: Floating-Point Conversions917707
-Node: Other Output Conversions923552
-Node: Formatted Output Functions927376
-Node: Dynamic Output934274
-Node: Variable Arguments Output936409
-Node: Parsing a Template String943637
-Node: Example of Parsing947579
-Node: Customizing Printf949699
-Node: Registering New Conversions951417
-Node: Conversion Specifier Options953734
-Node: Defining the Output Handler957587
-Node: Printf Extension Example960045
-Node: Predefined Printf Handlers962408
-Node: Formatted Input965547
-Node: Formatted Input Basics966635
-Node: Input Conversion Syntax969343
-Node: Table of Input Conversions972724
-Node: Numeric Input Conversions976907
-Node: String Input Conversions981375
-Node: Dynamic String Input986715
-Node: Other Input Conversions987894
-Node: Formatted Input Functions989552
-Node: Variable Arguments Input993153
-Node: EOF and Errors996258
-Node: Error Recovery999559
-Node: Binary Streams1001549
-Node: File Positioning1004084
-Node: Portable Positioning1011917
-Node: Stream Buffering1018070
-Node: Buffering Concepts1019678
-Node: Flushing Buffers1021060
-Node: Controlling Buffering1024653
-Node: Other Kinds of Streams1031039
-Node: String Streams1032223
-Node: Custom Streams1036666
-Node: Streams and Cookies1037339
-Node: Hook Functions1040540
-Node: Formatted Messages1042844
-Node: Printing Formatted Messages1043518
-Node: Adding Severity Classes1050067
-Node: Example1051798
-Node: Low-Level I/O1055011
-Node: Opening and Closing Files1058022
-Node: I/O Primitives1066496
-Node: File Position Primitive1081643
-Node: Descriptors and Streams1089133
-Node: Stream/Descriptor Precautions1092130
-Node: Linked Channels1093343
-Node: Independent Channels1094615
-Node: Cleaning Streams1096529
-Node: Scatter-Gather1098366
-Node: Memory-mapped I/O1101166
-Node: Waiting for I/O1114367
-Node: Synchronizing I/O1123065
-Node: Asynchronous I/O1126732
-Node: Asynchronous Reads/Writes1134803
-Node: Status of AIO Operations1147961
-Node: Synchronizing AIO Operations1151887
-Node: Cancel AIO Operations1158722
-Node: Configuration of AIO1162448
-Node: Control Operations1164758
-Node: Duplicating Descriptors1167548
-Node: Descriptor Flags1171990
-Node: File Status Flags1175403
-Node: Access Modes1176867
-Node: Open-time Flags1179193
-Node: Operating Modes1183969
-Node: Getting File Status Flags1186754
-Node: File Locks1189371
-Node: Interrupt Input1198296
-Node: IOCTLs1200737
-Ref: IOCTLs-Footnote-11202811
-Node: File System Interface1202908
-Node: Working Directory1204440
-Node: Accessing Directories1209960
-Node: Directory Entries1211621
-Node: Opening a Directory1215384
-Node: Reading/Closing Directory1219698
-Node: Simple Directory Lister1226290
-Node: Random Access Directory1227282
-Node: Scanning Directory Content1229157
-Node: Simple Directory Lister Mark II1234281
-Node: Working with Directory Trees1235388
-Node: Hard Links1248150
-Node: Symbolic Links1251072
-Node: Deleting Files1258958
-Node: Renaming Files1262187
-Node: Creating Directories1265902
-Node: File Attributes1267751
-Node: Attribute Meanings1269282
-Node: Reading Attributes1278491
-Node: Testing File Type1283100
-Node: File Owner1288149
-Node: Permission Bits1291992
-Node: Access Permission1297323
-Node: Setting Permissions1298476
-Node: Testing File Access1304065
-Node: File Times1307832
-Node: File Size1314625
-Node: Making Special Files1321410
-Node: Temporary Files1323192
-Node: Pipes and FIFOs1333293
-Node: Creating a Pipe1334879
-Node: Pipe to a Subprocess1338240
-Node: FIFO Special Files1341502
-Node: Pipe Atomicity1343171
-Node: Sockets1344061
-Node: Socket Concepts1346106
-Node: Communication Styles1350353
-Node: Socket Addresses1352217
-Node: Address Formats1354260
-Node: Setting Address1357473
-Node: Reading Address1359294
-Node: Interface Naming1361163
-Node: Local Namespace1364014
-Node: Local Namespace Concepts1364681
-Node: Local Namespace Details1366209
-Node: Local Socket Example1368260
-Node: Internet Namespace1369738
-Node: Internet Address Formats1371972
-Node: Host Addresses1374138
-Node: Abstract Host Addresses1375298
-Node: Host Address Data Type1379820
-Node: Host Address Functions1382967
-Node: Host Names1388191
-Node: Ports1399197
-Node: Services Database1401244
-Node: Byte Order1404918
-Node: Protocols Database1407597
-Node: Inet Example1412001
-Node: Misc Namespaces1414002
-Node: Open/Close Sockets1414755
-Node: Creating a Socket1415260
-Node: Closing a Socket1417044
-Node: Socket Pairs1418669
-Node: Connections1420779
-Node: Connecting1421880
-Node: Listening1424806
-Node: Accepting Connections1426972
-Node: Who is Connected1430205
-Node: Transferring Data1431406
-Node: Sending Data1432522
-Node: Receiving Data1435164
-Node: Socket Data Options1437018
-Node: Byte Stream Example1437899
-Node: Server Example1439922
-Node: Out-of-Band Data1443910
-Node: Datagrams1449777
-Node: Sending Datagrams1450815
-Node: Receiving Datagrams1452851
-Node: Datagram Example1455022
-Node: Example Receiver1457020
-Node: Inetd1459558
-Node: Inetd Servers1460376
-Node: Configuring Inetd1461631
-Node: Socket Options1464313
-Node: Socket Option Functions1465030
-Node: Socket-Level Options1466782
-Node: Networks Database1470429
-Node: Low-Level Terminal Interface1474151
-Node: Is It a Terminal1475623
-Node: I/O Queues1477854
-Node: Canonical or Not1479818
-Node: Terminal Modes1481671
-Node: Mode Data Types1483247
-Node: Mode Functions1485090
-Node: Setting Modes1489211
-Node: Input Modes1491216
-Node: Output Modes1496522
-Node: Control Modes1498250
-Node: Local Modes1502372
-Node: Line Speed1508782
-Node: Special Characters1513413
-Node: Editing Characters1515338
-Node: Signal Characters1519716
-Node: Start/Stop Characters1522603
-Node: Other Special1524490
-Node: Noncanonical Input1526511
-Node: BSD Terminal Modes1531430
-Node: Line Control1533091
-Node: Noncanon Example1538240
-Node: Pseudo-Terminals1540420
-Node: Allocation1541339
-Node: Pseudo-Terminal Pairs1546675
-Node: Syslog1549512
-Node: Overview of Syslog1550464
-Node: Submitting Syslog Messages1554659
-Node: openlog1555484
-Node: syslog; vsyslog1560575
-Node: closelog1565110
-Node: setlogmask1566367
-Node: Syslog Example1568326
-Node: Mathematics1568980
-Node: Mathematical Constants1570707
-Node: Trig Functions1572722
-Node: Inverse Trig Functions1577094
-Node: Exponents and Logarithms1581533
-Node: Hyperbolic Functions1591450
-Node: Special Functions1596577
-Node: Errors in Math Functions1602236
-Node: Pseudo-Random Numbers1688794
-Node: ISO Random1691044
-Node: BSD Random1693284
-Node: SVID Random1698709
-Node: FP Function Optimizations1714041
-Node: Arithmetic1716135
-Node: Integers1717417
-Node: Integer Division1720446
-Node: Floating Point Numbers1724496
-Node: Floating Point Classes1726244
-Node: Floating Point Errors1730978
-Node: FP Exceptions1731485
-Node: Infinity and NaN1735917
-Node: Status bit operations1738869
-Node: Math Error Reporting1743471
-Node: Rounding1746356
-Node: Control Functions1749994
-Node: Arithmetic Functions1755428
-Node: Absolute Value1756303
-Node: Normalization Functions1758645
-Node: Rounding Functions1762483
-Node: Remainder Functions1767899
-Node: FP Bit Twiddling1770323
-Node: FP Comparison Functions1773901
-Node: Misc FP Arithmetic1777151
-Node: Complex Numbers1780264
-Node: Operations on Complex1781978
-Node: Parsing of Numbers1784783
-Node: Parsing of Integers1785484
-Node: Parsing of Floats1797880
-Node: System V Number Conversion1803455
-Node: Date and Time1810024
-Node: Time Basics1810757
-Node: Elapsed Time1812658
-Node: Processor And CPU Time1816294
-Node: CPU Time1818189
-Node: Processor Time1819980
-Node: Calendar Time1822641
-Node: Simple Calendar Time1824587
-Node: High-Resolution Calendar1827187
-Node: Broken-down Time1832907
-Node: High Accuracy Clock1841824
-Node: Formatting Calendar Time1849446
-Node: Parsing Date and Time1866302
-Node: Low-Level Time String Parsing1867157
-Node: General Time String Parsing1880880
-Node: TZ Variable1888289
-Node: Time Zone Functions1895633
-Node: Time Functions Example1898615
-Node: Setting an Alarm1899700
-Node: Sleeping1905758
-Node: Resource Usage And Limitation1910565
-Node: Resource Usage1911245
-Node: Limits on Resources1916902
-Node: Priority1926694
-Node: Absolute Priority1929134
-Node: Realtime Scheduling1934251
-Node: Basic Scheduling Functions1937709
-Node: Traditional Scheduling1946341
-Node: Traditional Scheduling Intro1946925
-Node: Traditional Scheduling Functions1951205
-Node: CPU Affinity1955394
-Node: Memory Resources1961946
-Node: Memory Subsystem1962804
-Node: Query Memory Parameters1965197
-Node: Processor Resources1969171
-Node: Non-Local Exits1971590
-Node: Non-Local Intro1972303
-Node: Non-Local Details1976017
-Node: Non-Local Exits and Signals1979327
-Node: System V contexts1981086
-Node: Signal Handling1994481
-Node: Concepts of Signals1996518
-Node: Kinds of Signals1997089
-Node: Signal Generation1998495
-Node: Delivery of Signal2000773
-Node: Standard Signals2003638
-Node: Program Error Signals2005239
-Node: Termination Signals2012729
-Node: Alarm Signals2016588
-Node: Asynchronous I/O Signals2017843
-Node: Job Control Signals2019044
-Node: Operation Error Signals2023676
-Node: Miscellaneous Signals2025632
-Node: Signal Messages2027343
-Node: Signal Actions2029533
-Node: Basic Signal Handling2030487
-Node: Advanced Signal Handling2036834
-Node: Signal and Sigaction2039910
-Node: Sigaction Function Example2041670
-Node: Flags for Sigaction2043967
-Node: Initial Signal Actions2046359
-Node: Defining Handlers2047741
-Node: Handler Returns2049933
-Node: Termination in Handler2051960
-Node: Longjmp in Handler2053394
-Node: Signals in Handler2055490
-Node: Merged Signals2057621
-Node: Nonreentrancy2063290
-Node: Atomic Data Access2068707
-Node: Non-atomic Example2069764
-Node: Atomic Types2071550
-Node: Atomic Usage2072539
-Node: Interrupted Primitives2074024
-Node: Generating Signals2077504
-Node: Signaling Yourself2078104
-Node: Signaling Another Process2080246
-Node: Permission for kill2083811
-Node: Kill Example2085618
-Node: Blocking Signals2087927
-Node: Why Block2089706
-Node: Signal Sets2091253
-Node: Process Signal Mask2094735
-Node: Testing for Delivery2098217
-Node: Blocking for Handler2099461
-Node: Checking for Pending Signals2101876
-Node: Remembering a Signal2103993
-Node: Waiting for a Signal2107538
-Node: Using Pause2108090
-Node: Pause Problems2109872
-Node: Sigsuspend2111597
-Node: Signal Stack2114441
-Node: BSD Signal Handling2119990
-Node: BSD Handler2121275
-Node: Blocking in BSD2123929
-Node: Program Basics2125850
-Node: Program Arguments2127918
-Node: Argument Syntax2129924
-Node: Parsing Program Arguments2132606
-Node: Getopt2133721
-Node: Using Getopt2134366
-Node: Example of Getopt2138672
-Node: Getopt Long Options2141517
-Node: Getopt Long Option Example2147081
-Node: Argp2150105
-Node: Argp Global Variables2153630
-Node: Argp Parsers2155677
-Node: Argp Option Vectors2159063
-Node: Argp Option Flags2162290
-Node: Argp Parser Functions2164351
-Node: Argp Special Keys2167055
-Node: Argp Parsing State2172356
-Node: Argp Helper Functions2175935
-Node: Argp Children2179578
-Node: Argp Flags2181672
-Node: Argp Help Filtering2183961
-Node: Argp Help Filter Keys2185208
-Node: Argp Help2186136
-Node: Argp Help Flags2187485
-Node: Argp Examples2189848
-Node: Argp Example 12190331
-Node: Argp Example 22191105
-Node: Argp Example 32193988
-Node: Argp Example 42200873
-Node: Argp User Customization2208435
-Node: Suboptions2210176
-Node: Suboptions Example2212217
-Node: Environment Variables2214364
-Node: Environment Access2216240
-Node: Standard Environment2222729
-Node: Auxiliary Vector2226913
-Node: System Calls2228399
-Node: Program Termination2231977
-Node: Normal Termination2233193
-Node: Exit Status2234726
-Node: Cleanups on Exit2238100
-Node: Aborting a Program2240141
-Node: Termination Internals2241166
-Node: Processes2243535
-Node: Running a Command2245559
-Node: Process Creation Concepts2247711
-Node: Process Identification2249727
-Node: Creating a Process2250839
-Node: Executing a File2254676
-Node: Process Completion2262417
-Node: Process Completion Status2268960
-Node: BSD Wait Functions2271228
-Node: Process Creation Example2273196
-Node: Job Control2275444
-Node: Concepts of Job Control2276725
-Node: Job Control is Optional2280086
-Node: Controlling Terminal2281139
-Node: Access to the Terminal2282054
-Node: Orphaned Process Groups2283664
-Node: Implementing a Shell2284662
-Node: Data Structures2285552
-Node: Initializing the Shell2288186
-Node: Launching Jobs2291878
-Node: Foreground and Background2299297
-Node: Stopped and Terminated Jobs2302397
-Node: Continuing Stopped Jobs2307532
-Node: Missing Pieces2309155
-Node: Functions for Job Control2310790
-Node: Identifying the Terminal2311277
-Node: Process Group Functions2312954
-Node: Terminal Access Functions2317616
-Node: Name Service Switch2321370
-Node: NSS Basics2322668
-Node: NSS Configuration File2324268
-Node: Services in the NSS configuration2325958
-Node: Actions in the NSS configuration2327257
-Node: Notes on NSS Configuration File2330429
-Node: NSS Module Internals2332317
-Node: NSS Module Names2333020
-Ref: NSS Module Names-Footnote-12335075
-Ref: NSS Module Names-Footnote-22335229
-Node: NSS Modules Interface2335407
-Node: Extending NSS2340110
-Node: Adding another Service to NSS2341048
-Node: NSS Module Function Internals2343290
-Node: Users and Groups2348205
-Node: User and Group IDs2350819
-Node: Process Persona2351734
-Node: Why Change Persona2353426
-Node: How Change Persona2355314
-Node: Reading Persona2357208
-Node: Setting User ID2359933
-Node: Setting Groups2363113
-Node: Enable/Disable Setuid2369489
-Node: Setuid Program Example2371531
-Node: Tips for Setuid2374927
-Node: Who Logged In2377451
-Node: User Accounting Database2380176
-Node: Manipulating the Database2381369
-Node: XPG Functions2395190
-Node: Logging In and Out2400788
-Node: User Database2403457
-Node: User Data Structure2404128
-Node: Lookup User2405401
-Node: Scanning All Users2408586
-Node: Writing a User Entry2412459
-Node: Group Database2413597
-Node: Group Data Structure2414182
-Node: Lookup Group2414961
-Node: Scanning All Groups2418083
-Node: Database Example2422029
-Node: Netgroup Database2424206
-Node: Netgroup Data2424629
-Node: Lookup Netgroup2426170
-Node: Netgroup Membership2430270
-Node: System Management2431777
-Node: Host Identification2432711
-Node: Platform Type2439849
-Node: Filesystem Handling2443251
-Node: Mount Information2444758
-Node: fstab2446946
-Node: mtab2453525
-Node: Other Mount Information2463613
-Node: Mount-Unmount-Remount2464142
-Node: System Parameters2474405
-Node: System Configuration2480045
-Node: General Limits2481619
-Node: System Options2485273
-Node: Version Supported2488619
-Node: Sysconf2490226
-Node: Sysconf Definition2490869
-Node: Constants for Sysconf2491673
-Node: Examples of Sysconf2504660
-Node: Minimums2505664
-Node: Limits for Files2508382
-Node: Options for Files2511729
-Node: File Minimums2514032
-Node: Pathconf2516259
-Node: Utility Limits2519916
-Node: Utility Minimums2521863
-Node: String Parameters2523627
-Node: Cryptographic Functions2527614
-Node: Legal Problems2529942
-Node: getpass2532217
-Node: crypt2534505
-Node: DES Encryption2539500
-Node: Debugging Support2546418
-Node: Backtraces2547063
-Node: POSIX Threads2552164
-Node: Thread-specific Data2552574
-Node: Non-POSIX Extensions2554359
-Node: Default Thread Attributes2554796
-Node: Internal Probes2556068
-Node: Memory Allocation Probes2556883
-Node: Mathematical Function Probes2566967
-Node: Language Features2573676
-Node: Consistency Checking2574623
-Node: Variadic Functions2579418
-Node: Why Variadic2580495
-Node: How Variadic2582468
-Node: Variadic Prototypes2583700
-Node: Receiving Arguments2584854
-Node: How Many Arguments2587538
-Node: Calling Variadics2589213
-Node: Argument Macros2591326
-Node: Variadic Example2594688
-Node: Null Pointer Constant2595815
-Node: Important Data Types2596904
-Node: Data Type Measurements2598756
-Node: Width of Type2599618
-Node: Range of Type2600532
-Node: Floating Type Macros2604095
-Node: Floating Point Concepts2605362
-Node: Floating Point Parameters2609107
-Node: IEEE Floating Point2616061
-Node: Structure Measurement2617827
-Node: Library Summary2618618
-Node: Installation2824231
-Node: Configuring and compiling2825366
-Node: Running make install2836996
-Node: Tools for Compilation2840680
-Node: Linux2843282
-Node: Reporting Bugs2845711
-Node: Maintenance2848062
-Node: Source Layout2848463
-Node: Adding Platform-specific2852536
-Node: Porting2855574
-Node: Hierarchy Conventions2863306
-Node: Porting to Unix2868363
-Node: Platform2870387
-Node: PowerPC2870698
-Node: Contributors2874590
-Node: Free Manuals2886666
-Node: Copying2891605
-Node: Documentation License2919777
-Node: Concept Index2944935
-Node: Type Index3049482
-Node: Function Index3067919
-Node: Variable Index3197377
-Node: File Index3304512
+Node: Top64085
+Node: Introduction123894
+Node: Getting Started125243
+Node: Standards and Portability126708
+Node: ISO C128163
+Node: POSIX129690
+Node: POSIX Safety Concepts131783
+Node: Unsafe Features137490
+Node: Conditionally Safe Features142027
+Node: Other Safety Remarks153369
+Node: Berkeley Unix162100
+Node: SVID162873
+Node: XPG163880
+Node: Using the Library164829
+Node: Header Files165557
+Node: Macro Definitions169506
+Node: Reserved Names171855
+Node: Feature Test Macros176559
+Node: Roadmap to the Manual186179
+Node: Error Reporting193507
+Node: Checking for Errors194424
+Node: Error Codes198668
+Node: Error Messages218396
+Node: Memory234439
+Node: Memory Concepts235297
+Node: Memory Allocation240975
+Node: Memory Allocation and C241881
+Node: Unconstrained Allocation245452
+Node: Basic Allocation246881
+Node: Malloc Examples248703
+Node: Freeing after Malloc250659
+Node: Changing Block Size252700
+Node: Allocating Cleared Space255416
+Node: Efficiency and Malloc256546
+Node: Aligned Memory Blocks257658
+Node: Malloc Tunable Parameters261661
+Node: Heap Consistency Checking264083
+Node: Hooks for Malloc269480
+Node: Statistics of Malloc275777
+Node: Summary of Malloc277894
+Node: Allocation Debugging280511
+Node: Tracing malloc281623
+Node: Using the Memory Debugger283846
+Node: Tips for the Memory Debugger285739
+Node: Interpreting the traces287056
+Node: Obstacks290594
+Node: Creating Obstacks292217
+Node: Preparing for Obstacks294130
+Node: Allocation in an Obstack296989
+Node: Freeing Obstack Objects299761
+Node: Obstack Functions365308
+Node: Growing Objects367551
+Node: Extra Fast Growing372742
+Node: Status of an Obstack376912
+Node: Obstacks Data Alignment378645
+Node: Obstack Chunks380620
+Node: Summary of Obstacks383078
+Node: Variable Size Automatic386508
+Node: Alloca Example388130
+Node: Advantages of Alloca389264
+Node: Disadvantages of Alloca391164
+Node: GNU C Variable-Size Arrays391920
+Node: Resizing the Data Segment393089
+Node: Locking Pages395385
+Node: Why Lock Pages396127
+Node: Locked Memory Details397762
+Node: Page Lock Functions400030
+Node: Character Handling406262
+Node: Classification of Characters407718
+Node: Case Conversion412759
+Node: Classification of Wide Characters415093
+Node: Using Wide Char Classes424166
+Node: Wide Character Case Conversion426482
+Node: String and Array Utilities429555
+Node: Representation of Strings431620
+Node: String/Array Conventions437147
+Node: String Length440084
+Node: Copying and Concatenation444246
+Node: String/Array Comparison472132
+Node: Collation Functions483359
+Node: Search Functions494042
+Node: Finding Tokens in a String508430
+Node: strfry520527
+Node: Trivial Encryption521647
+Node: Encode Binary Data523198
+Node: Argz and Envz Vectors528062
+Node: Argz Functions528669
+Node: Envz Functions536410
+Node: Character Set Handling539938
+Node: Extended Char Intro541091
+Node: Charset Function Overview554207
+Node: Restartable multibyte conversion555175
+Node: Selecting the Conversion557289
+Node: Keeping the state559670
+Node: Converting a Character562991
+Node: Converting Strings579749
+Node: Multibyte Conversion Example590517
+Node: Non-reentrant Conversion593468
+Node: Non-reentrant Character Conversion595157
+Node: Non-reentrant String Conversion664384
+Node: Shift State667654
+Node: Generic Charset Conversion670316
+Node: Generic Conversion Interface673508
+Node: iconv Examples683845
+Node: Other iconv Implementations689143
+Node: glibc iconv Implementation694543
+Node: Locales734107
+Node: Effects of Locale735778
+Node: Choosing Locale737747
+Node: Locale Categories739126
+Node: Setting the Locale741646
+Node: Standard Locales746679
+Node: Locale Information747973
+Node: The Lame Way to Locale Data749695
+Node: General Numeric751691
+Node: Currency Symbol754683
+Node: Sign of Money Amount758884
+Node: The Elegant and Fast Way761033
+Node: Formatting Numbers773295
+Node: Yes-or-No Questions782834
+Node: Message Translation785019
+Node: Message catalogs a la X/Open787059
+Node: The catgets Functions788362
+Node: The message catalog files797706
+Node: The gencat program804445
+Node: Common Usage807585
+Node: The Uniforum approach814748
+Node: Message catalogs with gettext816247
+Node: Translation with gettext817291
+Node: Locating gettext catalog824031
+Node: Advanced gettext functions831117
+Ref: Advanced gettext functions-Footnote-1842276
+Node: Charset conversion in gettext842368
+Node: GUI program problems844971
+Node: Using gettextized software850518
+Node: Helper programs for gettext858839
+Node: Searching and Sorting860615
+Node: Comparison Functions861531
+Node: Array Search Function862748
+Node: Array Sort Function866365
+Node: Search/Sort Example868594
+Node: Hash Search Function872033
+Node: Tree Search Function880456
+Node: Pattern Matching887992
+Node: Wildcard Matching888797
+Node: Globbing892691
+Node: Calling Glob893562
+Node: Flags for Globbing968444
+Node: More Flags for Globbing972081
+Node: Regular Expressions978465
+Node: POSIX Regexp Compilation979459
+Node: Flags for POSIX Regexps983742
+Node: Matching POSIX Regexps984660
+Node: Regexp Subexpressions987022
+Node: Subexpression Complications989091
+Node: Regexp Cleanup991464
+Node: Word Expansion994066
+Node: Expansion Stages995428
+Node: Calling Wordexp996932
+Node: Flags for Wordexp1001234
+Node: Wordexp Example1003198
+Node: Tilde Expansion1005000
+Node: Variable Substitution1006083
+Node: I/O Overview1010219
+Node: I/O Concepts1011736
+Node: Streams and File Descriptors1012890
+Node: File Position1015990
+Node: File Names1018129
+Node: Directories1019022
+Node: File Name Resolution1020770
+Node: File Name Errors1023704
+Node: File Name Portability1025257
+Node: I/O on Streams1027223
+Node: Streams1029336
+Node: Standard Streams1030679
+Node: Opening Streams1032470
+Node: Closing Streams1043769
+Node: Streams and Threads1046547
+Node: Streams and I18N1055971
+Node: Simple Output1062246
+Node: Character Input1069699
+Node: Line Input1076437
+Node: Unreading1083949
+Node: Unreading Idea1084765
+Node: How Unread1085582
+Node: Block Input/Output1088580
+Node: Formatted Output1091833
+Node: Formatted Output Basics1093469
+Node: Output Conversion Syntax1095969
+Node: Table of Output Conversions1101074
+Node: Integer Conversions1104093
+Node: Floating-Point Conversions1109637
+Node: Other Output Conversions1115482
+Node: Formatted Output Functions1119305
+Node: Dynamic Output1126203
+Node: Variable Arguments Output1128339
+Node: Parsing a Template String1135550
+Node: Example of Parsing1139492
+Node: Customizing Printf1141612
+Node: Registering New Conversions1143330
+Node: Conversion Specifier Options1145645
+Node: Defining the Output Handler1149511
+Node: Printf Extension Example1151969
+Node: Predefined Printf Handlers1154332
+Node: Formatted Input1157471
+Node: Formatted Input Basics1158559
+Node: Input Conversion Syntax1161257
+Node: Table of Input Conversions1164633
+Node: Numeric Input Conversions1168815
+Node: String Input Conversions1173283
+Node: Dynamic String Input1178623
+Node: Other Input Conversions1179802
+Node: Formatted Input Functions1181461
+Node: Variable Arguments Input1185060
+Node: EOF and Errors1188165
+Node: Error Recovery1191461
+Node: Binary Streams1193451
+Node: File Positioning1195984
+Node: Portable Positioning1267893
+Node: Stream Buffering1274045
+Node: Buffering Concepts1275653
+Node: Flushing Buffers1277030
+Node: Controlling Buffering1280621
+Node: Other Kinds of Streams1287004
+Node: String Streams1288187
+Node: Custom Streams1292629
+Node: Streams and Cookies1293302
+Node: Hook Functions1296504
+Node: Formatted Messages1298808
+Node: Printing Formatted Messages1299482
+Node: Adding Severity Classes1306026
+Node: Example1307757
+Node: Low-Level I/O1310970
+Node: Opening and Closing Files1313981
+Node: I/O Primitives1322462
+Node: File Position Primitive1337608
+Node: Descriptors and Streams1345098
+Node: Stream/Descriptor Precautions1348083
+Node: Linked Channels1349296
+Node: Independent Channels1350568
+Node: Cleaning Streams1352482
+Node: Scatter-Gather1354320
+Node: Memory-mapped I/O1357116
+Node: Waiting for I/O1370349
+Node: Synchronizing I/O1379043
+Node: Asynchronous I/O1382709
+Node: Asynchronous Reads/Writes1390785
+Node: Status of AIO Operations1403924
+Node: Synchronizing AIO Operations1407850
+Node: Cancel AIO Operations1414677
+Node: Configuration of AIO1418403
+Node: Control Operations1420714
+Node: Duplicating Descriptors1423512
+Node: Descriptor Flags1427955
+Node: File Status Flags1431367
+Node: Access Modes1432829
+Node: Open-time Flags1435155
+Node: Operating Modes1439921
+Node: Getting File Status Flags1442709
+Node: File Locks1445327
+Node: Interrupt Input1454264
+Node: IOCTLs1456708
+Ref: IOCTLs-Footnote-11458782
+Node: File System Interface1458879
+Node: Working Directory1460409
+Node: Accessing Directories1465933
+Node: Directory Entries1467594
+Node: Opening a Directory1471357
+Node: Reading/Closing Directory1475679
+Node: Simple Directory Lister1482267
+Node: Random Access Directory1483259
+Node: Scanning Directory Content1485134
+Node: Simple Directory Lister Mark II1490258
+Node: Working with Directory Trees1491365
+Node: Hard Links1568219
+Node: Symbolic Links1571138
+Node: Deleting Files1579033
+Node: Renaming Files1582265
+Node: Creating Directories1585993
+Node: File Attributes1587845
+Node: Attribute Meanings1589376
+Node: Reading Attributes1598611
+Node: Testing File Type1603222
+Node: File Owner1608267
+Node: Permission Bits1612116
+Node: Access Permission1617447
+Node: Setting Permissions1618600
+Node: Testing File Access1624195
+Node: File Times1627962
+Node: File Size1634732
+Node: Making Special Files1641524
+Node: Temporary Files1643308
+Node: Pipes and FIFOs1653401
+Node: Creating a Pipe1654987
+Node: Pipe to a Subprocess1658348
+Node: FIFO Special Files1661610
+Node: Pipe Atomicity1663279
+Node: Sockets1664169
+Node: Socket Concepts1666213
+Node: Communication Styles1670459
+Node: Socket Addresses1672321
+Node: Address Formats1674364
+Node: Setting Address1677580
+Node: Reading Address1679407
+Node: Interface Naming1681279
+Node: Local Namespace1684131
+Node: Local Namespace Concepts1684798
+Node: Local Namespace Details1686326
+Node: Local Socket Example1688376
+Node: Internet Namespace1689854
+Node: Internet Address Formats1692086
+Node: Host Addresses1694256
+Node: Abstract Host Addresses1695416
+Node: Host Address Data Type1699942
+Node: Host Address Functions1703088
+Node: Host Names1708316
+Node: Ports1719325
+Node: Services Database1721372
+Node: Byte Order1725049
+Node: Protocols Database1727726
+Node: Inet Example1732131
+Node: Misc Namespaces1734132
+Node: Open/Close Sockets1734885
+Node: Creating a Socket1735390
+Node: Closing a Socket1737177
+Node: Socket Pairs1738807
+Node: Connections1740921
+Node: Connecting1742022
+Node: Listening1744960
+Node: Accepting Connections1747129
+Node: Who is Connected1750365
+Node: Transferring Data1751570
+Node: Sending Data1752686
+Node: Receiving Data1755336
+Node: Socket Data Options1757195
+Node: Byte Stream Example1758076
+Node: Server Example1760099
+Node: Out-of-Band Data1764087
+Node: Datagrams1769954
+Node: Sending Datagrams1770992
+Node: Receiving Datagrams1773029
+Node: Datagram Example1775200
+Node: Example Receiver1777199
+Node: Inetd1779738
+Node: Inetd Servers1780556
+Node: Configuring Inetd1781811
+Node: Socket Options1784493
+Node: Socket Option Functions1785210
+Node: Socket-Level Options1786965
+Node: Networks Database1790614
+Node: Low-Level Terminal Interface1794340
+Node: Is It a Terminal1795812
+Node: I/O Queues1798046
+Node: Canonical or Not1864094
+Node: Terminal Modes1865947
+Node: Mode Data Types1867523
+Node: Mode Functions1869371
+Node: Setting Modes1873494
+Node: Input Modes1875499
+Node: Output Modes1880799
+Node: Control Modes1882527
+Node: Local Modes1886645
+Node: Line Speed1893051
+Node: Special Characters1897685
+Node: Editing Characters1899610
+Node: Signal Characters1903989
+Node: Start/Stop Characters1906876
+Node: Other Special1908763
+Node: Noncanonical Input1910779
+Node: BSD Terminal Modes1915697
+Node: Line Control1917359
+Node: Noncanon Example1922529
+Node: Pseudo-Terminals1924709
+Node: Allocation1925628
+Node: Pseudo-Terminal Pairs1930962
+Node: Syslog1933791
+Node: Overview of Syslog1934743
+Node: Submitting Syslog Messages1938934
+Node: openlog1939759
+Node: syslog; vsyslog1944853
+Node: closelog1949390
+Node: setlogmask1950646
+Node: Syslog Example1952604
+Node: Mathematics1953259
+Node: Mathematical Constants1954984
+Node: Trig Functions1956987
+Node: Inverse Trig Functions1961359
+Node: Exponents and Logarithms1965793
+Node: Hyperbolic Functions1975713
+Node: Special Functions1980840
+Node: Errors in Math Functions1986496
+Node: Pseudo-Random Numbers2073050
+Node: ISO Random2075299
+Node: BSD Random2077537
+Node: SVID Random2082959
+Node: FP Function Optimizations2098287
+Node: Arithmetic2164466
+Node: Integers2165748
+Node: Integer Division2168749
+Node: Floating Point Numbers2172805
+Node: Floating Point Classes2174553
+Node: Floating Point Errors2179280
+Node: FP Exceptions2179787
+Node: Infinity and NaN2184203
+Node: Status bit operations2187147
+Node: Math Error Reporting2191739
+Node: Rounding2194620
+Node: Control Functions2198258
+Node: Arithmetic Functions2203690
+Node: Absolute Value2204565
+Node: Normalization Functions2206906
+Node: Rounding Functions2210744
+Node: Remainder Functions2216161
+Node: FP Bit Twiddling2218580
+Node: FP Comparison Functions2222153
+Node: Misc FP Arithmetic2225402
+Node: Complex Numbers2228515
+Node: Operations on Complex2230224
+Node: Parsing of Numbers2233027
+Node: Parsing of Integers2233728
+Node: Parsing of Floats2246121
+Node: System V Number Conversion2251696
+Node: Date and Time2258266
+Node: Time Basics2258997
+Node: Elapsed Time2260882
+Node: Processor And CPU Time2264521
+Node: CPU Time2266413
+Node: Processor Time2268202
+Node: Calendar Time2270864
+Node: Simple Calendar Time2272804
+Node: High-Resolution Calendar2275405
+Node: Broken-down Time2281117
+Node: High Accuracy Clock2290030
+Node: Formatting Calendar Time2297675
+Node: Parsing Date and Time2314559
+Node: Low-Level Time String Parsing2315414
+Node: General Time String Parsing2329194
+Node: TZ Variable2336597
+Node: Time Zone Functions2343939
+Node: Time Functions Example2346920
+Node: Setting an Alarm2348005
+Node: Sleeping2354056
+Node: Resource Usage And Limitation2358860
+Node: Resource Usage2359541
+Node: Limits on Resources2365216
+Node: Priority2375006
+Node: Absolute Priority2377446
+Node: Realtime Scheduling2382559
+Node: Basic Scheduling Functions2386017
+Node: Traditional Scheduling2394644
+Node: Traditional Scheduling Intro2395228
+Node: Traditional Scheduling Functions2399507
+Node: CPU Affinity2467785
+Node: Memory Resources2474342
+Node: Memory Subsystem2475200
+Node: Query Memory Parameters2477591
+Node: Processor Resources2481566
+Node: Non-Local Exits2483986
+Node: Non-Local Intro2484699
+Node: Non-Local Details2488414
+Node: Non-Local Exits and Signals2491723
+Node: System V contexts2493480
+Node: Signal Handling2506882
+Node: Concepts of Signals2508919
+Node: Kinds of Signals2509490
+Node: Signal Generation2510896
+Node: Delivery of Signal2513174
+Node: Standard Signals2516038
+Node: Program Error Signals2517639
+Node: Termination Signals2525116
+Node: Alarm Signals2528970
+Node: Asynchronous I/O Signals2530216
+Node: Job Control Signals2531417
+Node: Operation Error Signals2536036
+Node: Miscellaneous Signals2537992
+Node: Signal Messages2539703
+Node: Signal Actions2541888
+Node: Basic Signal Handling2542842
+Node: Advanced Signal Handling2549184
+Node: Signal and Sigaction2552257
+Node: Sigaction Function Example2554017
+Node: Flags for Sigaction2556314
+Node: Initial Signal Actions2558702
+Node: Defining Handlers2560082
+Node: Handler Returns2562275
+Node: Termination in Handler2564303
+Node: Longjmp in Handler2565738
+Node: Signals in Handler2567834
+Node: Merged Signals2569965
+Node: Nonreentrancy2575634
+Node: Atomic Data Access2581051
+Node: Non-atomic Example2582108
+Node: Atomic Types2583894
+Node: Atomic Usage2584883
+Node: Interrupted Primitives2586368
+Node: Generating Signals2589848
+Node: Signaling Yourself2590448
+Node: Signaling Another Process2592588
+Node: Permission for kill2596150
+Node: Kill Example2597957
+Node: Blocking Signals2600266
+Node: Why Block2602045
+Node: Signal Sets2603592
+Node: Process Signal Mask2607072
+Node: Testing for Delivery2610556
+Node: Blocking for Handler2611801
+Node: Checking for Pending Signals2614216
+Node: Remembering a Signal2616331
+Node: Waiting for a Signal2619876
+Node: Using Pause2620428
+Node: Pause Problems2622210
+Node: Sigsuspend2623935
+Node: Signal Stack2626779
+Node: BSD Signal Handling2632338
+Node: BSD Handler2633621
+Node: Blocking in BSD2636276
+Node: Program Basics2638196
+Node: Program Arguments2640264
+Node: Argument Syntax2642270
+Node: Parsing Program Arguments2644954
+Node: Getopt2646069
+Node: Using Getopt2646714
+Node: Example of Getopt2651012
+Node: Getopt Long Options2653857
+Node: Getopt Long Option Example2659418
+Node: Argp2662442
+Node: Argp Global Variables2665966
+Node: Argp Parsers2668013
+Node: Argp Option Vectors2671405
+Node: Argp Option Flags2674627
+Node: Argp Parser Functions2676688
+Node: Argp Special Keys2679392
+Node: Argp Parsing State2684688
+Node: Argp Helper Functions2688281
+Node: Argp Children2691924
+Node: Argp Flags2694021
+Node: Argp Help Filtering2696310
+Node: Argp Help Filter Keys2697557
+Node: Argp Help2698485
+Node: Argp Help Flags2699834
+Node: Argp Examples2766282
+Node: Argp Example 12766765
+Node: Argp Example 22767539
+Node: Argp Example 32770422
+Node: Argp Example 42777307
+Node: Argp User Customization2784869
+Node: Suboptions2786609
+Node: Suboptions Example2788650
+Node: Environment Variables2790797
+Node: Environment Access2792673
+Node: Standard Environment2799156
+Node: Auxiliary Vector2803354
+Node: System Calls2804840
+Node: Program Termination2808417
+Node: Normal Termination2809633
+Node: Exit Status2811167
+Node: Cleanups on Exit2814538
+Node: Aborting a Program2816573
+Node: Termination Internals2817596
+Node: Processes2819958
+Node: Running a Command2821982
+Node: Process Creation Concepts2824134
+Node: Process Identification2826151
+Node: Creating a Process2827259
+Node: Executing a File2831095
+Node: Process Completion2838835
+Node: Process Completion Status2845381
+Node: BSD Wait Functions2847647
+Node: Process Creation Example2849617
+Node: Job Control2851865
+Node: Concepts of Job Control2853145
+Node: Job Control is Optional2856507
+Node: Controlling Terminal2857560
+Node: Access to the Terminal2858475
+Node: Orphaned Process Groups2860085
+Node: Implementing a Shell2861083
+Node: Data Structures2861973
+Node: Initializing the Shell2864607
+Node: Launching Jobs2868299
+Node: Foreground and Background2875718
+Node: Stopped and Terminated Jobs2878817
+Node: Continuing Stopped Jobs2883952
+Node: Missing Pieces2885575
+Node: Functions for Job Control2887210
+Node: Identifying the Terminal2887697
+Node: Process Group Functions2889372
+Node: Terminal Access Functions2894040
+Node: Name Service Switch2897801
+Node: NSS Basics2899099
+Node: NSS Configuration File2900687
+Node: Services in the NSS configuration2902376
+Node: Actions in the NSS configuration2903675
+Node: Notes on NSS Configuration File2906847
+Node: NSS Module Internals2908735
+Node: NSS Module Names2909438
+Ref: NSS Module Names-Footnote-12911485
+Ref: NSS Module Names-Footnote-22911639
+Node: NSS Modules Interface2911817
+Node: Extending NSS2916556
+Node: Adding another Service to NSS2917494
+Node: NSS Module Function Internals2919736
+Node: Users and Groups2924644
+Node: User and Group IDs2927256
+Node: Process Persona2928169
+Node: Why Change Persona2929861
+Node: How Change Persona2931749
+Node: Reading Persona2933642
+Node: Setting User ID2936365
+Node: Setting Groups2939544
+Node: Enable/Disable Setuid2945913
+Node: Setuid Program Example2947955
+Node: Tips for Setuid2951347
+Node: Who Logged In2953869
+Node: User Accounting Database2956592
+Node: Manipulating the Database2957785
+Node: XPG Functions2971606
+Node: Logging In and Out2977193
+Node: User Database2979860
+Node: User Data Structure2980531
+Node: Lookup User2981810
+Node: Scanning All Users2984996
+Node: Writing a User Entry2988868
+Node: Group Database2990005
+Node: Group Data Structure2990590
+Node: Lookup Group2991371
+Node: Scanning All Groups2994489
+Node: Database Example2998435
+Node: Netgroup Database3064697
+Node: Netgroup Data3065120
+Node: Lookup Netgroup3066651
+Node: Netgroup Membership3070751
+Node: System Management3072257
+Node: Host Identification3073191
+Node: Platform Type3080313
+Node: Filesystem Handling3083719
+Node: Mount Information3085225
+Node: fstab3087412
+Node: mtab3093982
+Node: Other Mount Information3104048
+Node: Mount-Unmount-Remount3104577
+Node: System Parameters3114850
+Node: System Configuration3120483
+Node: General Limits3122057
+Node: System Options3125706
+Node: Version Supported3129052
+Node: Sysconf3130659
+Node: Sysconf Definition3131302
+Node: Constants for Sysconf3132107
+Node: Examples of Sysconf3145092
+Node: Minimums3146096
+Node: Limits for Files3148813
+Node: Options for Files3152160
+Node: File Minimums3154463
+Node: Pathconf3156690
+Node: Utility Limits3160350
+Node: Utility Minimums3162297
+Node: String Parameters3164061
+Node: Cryptographic Functions3168044
+Node: Legal Problems3170372
+Node: getpass3172647
+Node: crypt3174935
+Node: DES Encryption3179931
+Node: Debugging Support3186856
+Node: Backtraces3187501
+Node: POSIX Threads3192590
+Node: Thread-specific Data3193000
+Node: Non-POSIX Extensions3194785
+Node: Default Thread Attributes3195222
+Node: Internal Probes3196495
+Node: Memory Allocation Probes3197310
+Node: Mathematical Function Probes3207389
+Node: Language Features3214097
+Node: Consistency Checking3215042
+Node: Variadic Functions3219832
+Node: Why Variadic3220909
+Node: How Variadic3222883
+Node: Variadic Prototypes3224115
+Node: Receiving Arguments3225268
+Node: How Many Arguments3227953
+Node: Calling Variadics3229628
+Node: Argument Macros3231742
+Node: Variadic Example3235091
+Node: Null Pointer Constant3236218
+Node: Important Data Types3237307
+Node: Data Type Measurements3239157
+Node: Width of Type3240019
+Node: Range of Type3240933
+Node: Floating Type Macros3244509
+Node: Floating Point Concepts3245776
+Node: Floating Point Parameters3249521
+Node: IEEE Floating Point3256485
+Node: Structure Measurement3258251
+Node: Library Summary3259042
+Node: Installation3528714
+Node: Configuring and compiling3529849
+Node: Running make install3541484
+Node: Tools for Compilation3545169
+Node: Linux3547770
+Node: Reporting Bugs3550200
+Node: Maintenance3552551
+Node: Source Layout3552952
+Node: Adding Platform-specific3557024
+Node: Porting3560062
+Node: Hierarchy Conventions3567779
+Node: Porting to Unix3572833
+Node: Platform3574857
+Node: PowerPC3575168
+Node: Contributors3579060
+Node: Free Manuals3591120
+Node: Copying3596058
+Node: Documentation License3688300
+Node: Concept Index3713438
+Node: Type Index3819465
+Node: Function Index3838048
+Node: Variable Index4031944
+Node: File Index4139216
 
 End Tag Table
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-1 b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-1
index 57a4dbd..f397da6 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-1
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-1
@@ -1,7 +1,24 @@
-This is
-/usr/local/google/home/jnewlin/src/uclibc/buildroot/output/build/glibc-2.19/build/manual/libc.info,
-produced by makeinfo version 4.13 from libc.texinfo.
+This is libc.info, produced by makeinfo version 5.2 from libc.texinfo.
 
+This file documents the GNU C Library.
+
+   This is 'The GNU C Library Reference Manual', for version 2.19
+(Buildroot).
+
+   Copyright (C) 1993-2014 Free Software Foundation, Inc.
+
+   Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being "Free Software Needs Free Documentation" and
+"GNU Lesser General Public License", the Front-Cover texts being "A GNU
+Manual", and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled "GNU Free Documentation
+License".
+
+   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
+modify this GNU manual.  Buying copies from the FSF supports it in
+developing GNU and promoting software freedom."
 INFO-DIR-SECTION Software libraries
 START-INFO-DIR-ENTRY
 * Libc: (libc).                 C library.
@@ -1692,33 +1709,13 @@
 * ynl: (libc)Special Functions.
 END-INFO-DIR-ENTRY
 
-   This file documents the GNU C Library.
-
-   This is `The GNU C Library Reference Manual', for version 2.19
-(Buildroot).
-
-   Copyright (C) 1993-2014 Free Software Foundation, Inc.
-
-   Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version
-1.3 or any later version published by the Free Software Foundation;
-with the Invariant Sections being "Free Software Needs Free
-Documentation" and "GNU Lesser General Public License", the Front-Cover
-texts being "A GNU Manual", and with the Back-Cover Texts as in (a)
-below.  A copy of the license is included in the section entitled "GNU
-Free Documentation License".
-
-   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
-modify this GNU manual.  Buying copies from the FSF supports it in
-developing GNU and promoting software freedom."
-
 
 File: libc.info,  Node: Top,  Next: Introduction,  Prev: (dir),  Up: (dir)
 
 Main Menu
 *********
 
-This is `The GNU C Library Reference Manual', for Version 2.19
+This is 'The GNU C Library Reference Manual', for Version 2.19
 (Buildroot) of the GNU C Library.
 
 * Menu:
@@ -1736,7 +1733,7 @@
 * Message Translation::          How to make the program speak the user's
                                    language.
 * Searching and Sorting::        General searching and sorting functions.
-* Pattern Matching::             Matching shell ``globs'' and regular
+* Pattern Matching::             Matching shell "globs" and regular
                                    expressions.
 * I/O Overview::                 Introduction to the I/O facilities.
 * I/O on Streams::               High-level, portable I/O facilities.
@@ -1798,7 +1795,8 @@
 * Variable Index::               Index of variables and variable-like macros.
 * File Index::                   Index of programs and files.
 
-  --- The Detailed Node Listing ---
+ 
+ -- The Detailed Node Listing --
 
 Introduction
 
@@ -1848,13 +1846,13 @@
 
 * Memory Concepts::             An introduction to concepts and terminology.
 * Memory Allocation::           Allocating storage for your program data
-* Resizing the Data Segment::   `brk', `sbrk'
+* Resizing the Data Segment::   'brk', 'sbrk'
 * Locking Pages::               Preventing page faults
 
 Memory Allocation
 
 * Memory Allocation and C::     How to get different kinds of allocation in C.
-* Unconstrained Allocation::    The `malloc' facility allows fully general
+* Unconstrained Allocation::    The 'malloc' facility allows fully general
 		 		 dynamic allocation.
 * Allocation Debugging::        Finding memory leaks and not freed memory.
 * Obstacks::                    Obstacks are less general than malloc
@@ -1865,25 +1863,25 @@
 
 Unconstrained Allocation
 
-* Basic Allocation::            Simple use of `malloc'.
-* Malloc Examples::             Examples of `malloc'.  `xmalloc'.
-* Freeing after Malloc::        Use `free' to free a block you
-				 got with `malloc'.
-* Changing Block Size::         Use `realloc' to make a block
+* Basic Allocation::            Simple use of 'malloc'.
+* Malloc Examples::             Examples of 'malloc'.  'xmalloc'.
+* Freeing after Malloc::        Use 'free' to free a block you
+				 got with 'malloc'.
+* Changing Block Size::         Use 'realloc' to make a block
 				 bigger or smaller.
-* Allocating Cleared Space::    Use `calloc' to allocate a
+* Allocating Cleared Space::    Use 'calloc' to allocate a
 				 block and clear it.
 * Efficiency and Malloc::       Efficiency considerations in use of
 				 these functions.
 * Aligned Memory Blocks::       Allocating specially aligned memory.
-* Malloc Tunable Parameters::   Use `mallopt' to adjust allocation
+* Malloc Tunable Parameters::   Use 'mallopt' to adjust allocation
                                  parameters.
 * Heap Consistency Checking::   Automatic checking for errors.
 * Hooks for Malloc::            You can use these hooks for debugging
-				 programs that use `malloc'.
+				 programs that use 'malloc'.
 * Statistics of Malloc::        Getting information about how much
 				 memory your program is using.
-* Summary of Malloc::           Summary of `malloc' and related functions.
+* Summary of Malloc::           Summary of 'malloc' and related functions.
 
 Allocation Debugging
 
@@ -1912,9 +1910,9 @@
 
 Variable Size Automatic
 
-* Alloca Example::              Example of using `alloca'.
-* Advantages of Alloca::        Reasons to use `alloca'.
-* Disadvantages of Alloca::     Reasons to avoid `alloca'.
+* Alloca Example::              Example of using 'alloca'.
+* Advantages of Alloca::        Reasons to use 'alloca'.
+* Disadvantages of Alloca::     Reasons to avoid 'alloca'.
 * GNU C Variable-Size Arrays::  Only in GNU C, here is an alternative
 				 method of allocating dynamically and
 				 freeing automatically.
@@ -1991,10 +1989,10 @@
 Generic Charset Conversion
 
 * Generic Conversion Interface::    Generic Character Set Conversion Interface.
-* iconv Examples::                  A complete `iconv' example.
-* Other iconv Implementations::     Some Details about other `iconv'
+* iconv Examples::                  A complete 'iconv' example.
+* Other iconv Implementations::     Some Details about other 'iconv'
                                      Implementations.
-* glibc iconv Implementation::      The `iconv' Implementation in the GNU C
+* glibc iconv Implementation::      The 'iconv' Implementation in the GNU C
                                      library.
 
 Locales
@@ -2013,36 +2011,36 @@
 
 Locale Information
 
-* The Lame Way to Locale Data::   ISO C's `localeconv'.
-* The Elegant and Fast Way::      X/Open's `nl_langinfo'.
+* The Lame Way to Locale Data::   ISO C's 'localeconv'.
+* The Elegant and Fast Way::      X/Open's 'nl_langinfo'.
 
 The Lame Way to Locale Data
 
 * General Numeric::             Parameters for formatting numbers and
                                  currency amounts.
 * Currency Symbol::             How to print the symbol that identifies an
-                                 amount of money (e.g. `$').
+                                 amount of money (e.g. '$').
 * Sign of Money Amount::        How to print the (positive or negative) sign
                                  for a monetary amount, if one exists.
 
 Message Translation
 
-* Message catalogs a la X/Open::  The `catgets' family of functions.
-* The Uniforum approach::         The `gettext' family of functions.
+* Message catalogs a la X/Open::  The 'catgets' family of functions.
+* The Uniforum approach::         The 'gettext' family of functions.
 
 Message catalogs a la X/Open
 
-* The catgets Functions::      The `catgets' function family.
+* The catgets Functions::      The 'catgets' function family.
 * The message catalog files::  Format of the message catalog files.
 * The gencat program::         How to generate message catalogs files which
                                 can be used by the functions.
-* Common Usage::               How to use the `catgets' interface.
+* Common Usage::               How to use the 'catgets' interface.
 
 The Uniforum approach
 
-* Message catalogs with gettext::  The `gettext' family of functions.
+* Message catalogs with gettext::  The 'gettext' family of functions.
 * Helper programs for gettext::    Programs to handle message catalogs
-                                    for `gettext'.
+                                    for 'gettext'.
 
 Message catalogs with gettext
 
@@ -2051,10 +2049,10 @@
 * Advanced gettext functions::     Additional functions for more complicated
                                     situations.
 * Charset conversion in gettext::  How to specify the output character set
-                                    `gettext' uses.
-* GUI program problems::           How to use `gettext' in GUI programs.
+                                    'gettext' uses.
+* GUI program problems::           How to use 'gettext' in GUI programs.
 * Using gettextized software::     The possibilities of the user to influence
-                                    the way `gettext' works.
+                                    the way 'gettext' works.
 
 Searching and Sorting
 
@@ -2062,11 +2060,11 @@
 				 Since the sort and search facilities
                                  are general, you have to specify the
                                  ordering.
-* Array Search Function::       The `bsearch' function.
-* Array Sort Function::         The `qsort' function.
+* Array Search Function::       The 'bsearch' function.
+* Array Sort Function::         The 'qsort' function.
 * Search/Sort Example::         An example program.
-* Hash Search Function::        The `hsearch' function.
-* Tree Search Function::        The `tsearch' function.
+* Hash Search Function::        The 'hsearch' function.
+* Tree Search Function::        The 'tsearch' function.
 
 Pattern Matching
 
@@ -2079,16 +2077,16 @@
 
 Globbing
 
-* Calling Glob::             Basic use of `glob'.
-* Flags for Globbing::       Flags that enable various options in `glob'.
-* More Flags for Globbing::  GNU specific extensions to `glob'.
+* Calling Glob::             Basic use of 'glob'.
+* Flags for Globbing::       Flags that enable various options in 'glob'.
+* More Flags for Globbing::  GNU specific extensions to 'glob'.
 
 Regular Expressions
 
-* POSIX Regexp Compilation::    Using `regcomp' to prepare to match.
-* Flags for POSIX Regexps::     Syntax variations for `regcomp'.
-* Matching POSIX Regexps::      Using `regexec' to match the compiled
-				   pattern that you get from `regcomp'.
+* POSIX Regexp Compilation::    Using 'regcomp' to prepare to match.
+* Flags for POSIX Regexps::     Syntax variations for 'regcomp'.
+* Matching POSIX Regexps::      Using 'regexec' to match the compiled
+				   pattern that you get from 'regcomp'.
 * Regexp Subexpressions::       Finding which parts of the string were matched.
 * Subexpression Complications:: Find points of which parts were matched.
 * Regexp Cleanup::		Freeing storage; reporting errors.
@@ -2096,8 +2094,8 @@
 Word Expansion
 
 * Expansion Stages::            What word expansion does to a string.
-* Calling Wordexp::             How to call `wordexp'.
-* Flags for Wordexp::           Options you can enable in `wordexp'.
+* Calling Wordexp::             How to call 'wordexp'.
+* Flags for Wordexp::           Options you can enable in 'wordexp'.
 * Wordexp Example::             A sample program that does word expansion.
 * Tilde Expansion::             Details of how tilde expansion works.
 * Variable Substitution::       Different types of variable substitution.
@@ -2135,10 +2133,10 @@
 * Line Input::                  Reading a line or a record from a stream.
 * Unreading::                   Peeking ahead/pushing back input just read.
 * Block Input/Output::          Input and output operations on blocks of data.
-* Formatted Output::            `printf' and related functions.
+* Formatted Output::            'printf' and related functions.
 * Customizing Printf::          You can define new conversion specifiers for
-				 `printf' and friends.
-* Formatted Input::             `scanf' and related functions.
+				 'printf' and friends.
+* Formatted Input::             'scanf' and related functions.
 * EOF and Errors::              How you can tell if an I/O error happens.
 * Error Recovery::		What you can do about errors.
 * Binary Streams::              Some systems distinguish between text files
@@ -2153,7 +2151,7 @@
 Unreading
 
 * Unreading Idea::              An explanation of unreading with pictures.
-* How Unread::                  How to call `ungetc' to do unreading.
+* How Unread::                  How to call 'ungetc' to do unreading.
 
 Formatted Output
 
@@ -2169,24 +2167,24 @@
 				 characters, pointers, and the like.
 * Formatted Output Functions::  Descriptions of the actual functions.
 * Dynamic Output::		Functions that allocate memory for the output.
-* Variable Arguments Output::   `vprintf' and friends.
+* Variable Arguments Output::   'vprintf' and friends.
 * Parsing a Template String::   What kinds of args does a given template
 				 call for?
-* Example of Parsing::          Sample program using `parse_printf_format'.
+* Example of Parsing::          Sample program using 'parse_printf_format'.
 
 Customizing Printf
 
-* Registering New Conversions::         Using `register_printf_function'
+* Registering New Conversions::         Using 'register_printf_function'
 					 to register a new output conversion.
 * Conversion Specifier Options::        The handler must be able to get
 					 the options specified in the
 					 template when it is called.
 * Defining the Output Handler::         Defining the handler and arginfo
 					 functions that are passed as arguments
-					 to `register_printf_function'.
-* Printf Extension Example::            How to define a `printf'
+					 to 'register_printf_function'.
+* Printf Extension Example::            How to define a 'printf'
 					 handler function.
-* Predefined Printf Handlers::          Predefined `printf' handlers.
+* Predefined Printf Handlers::          Predefined 'printf' handlers.
 
 Formatted Input
 
@@ -2195,10 +2193,10 @@
 * Table of Input Conversions::  Summary of input conversions and what they do.
 * Numeric Input Conversions::   Details of conversions for reading numbers.
 * String Input Conversions::    Details of conversions for reading strings.
-* Dynamic String Input::	String conversions that `malloc' the buffer.
+* Dynamic String Input::	String conversions that 'malloc' the buffer.
 * Other Input Conversions::     Details of miscellaneous other conversions.
 * Formatted Input Functions::   Descriptions of the actual functions.
-* Variable Arguments Input::    `vscanf' and friends.
+* Variable Arguments Input::    'vscanf' and friends.
 
 Stream Buffering
 
@@ -2222,9 +2220,9 @@
 
 Formatted Messages
 
-* Printing Formatted Messages::   The `fmtmsg' function.
+* Printing Formatted Messages::   The 'fmtmsg' function.
 * Adding Severity Classes::       Add more severity classes.
-* Example::                       How to use `fmtmsg' and `addseverity'.
+* Example::                       How to use 'fmtmsg' and 'addseverity'.
 
 Low-Level I/O
 
@@ -2276,7 +2274,7 @@
 File Status Flags
 
 * Access Modes::                Whether the descriptor can read or write.
-* Open-time Flags::             Details of `open'.
+* Open-time Flags::             Details of 'open'.
 * Operating Modes::             Special modes to control I/O operations.
 * Getting File Status Flags::   Fetching and changing these flags.
 
@@ -2289,7 +2287,7 @@
 * Working with Directory Trees:: Apply actions to all files or a selectable
                                  subset of a directory hierarchy.
 * Hard Links::                  Adding alternate names to a file.
-* Symbolic Links::              A file that ``points to'' a file name.
+* Symbolic Links::              A file that "points to" a file name.
 * Deleting Files::              How to delete a file, and what that means.
 * Renaming Files::              Changing a file's name.
 * Creating Directories::        A system call just for creating a directory.
@@ -2330,7 +2328,7 @@
 
 Pipes and FIFOs
 
-* Creating a Pipe::             Making a pipe with the `pipe' function.
+* Creating a Pipe::             Making a pipe with the 'pipe' function.
 * Pipe to a Subprocess::        Using a pipe to communicate with a
 				 child process.
 * FIFO Special Files::          Making a FIFO special file.
@@ -2340,7 +2338,7 @@
 
 * Socket Concepts::	Basic concepts you need to know about.
 * Communication Styles::Stream communication, datagrams and other styles.
-* Socket Addresses::	How socket names (``addresses'') work.
+* Socket Addresses::	How socket names ("addresses") work.
 * Interface Naming::	Identifying specific network interfaces.
 * Local Namespace::	Details about the local namespace.
 * Internet Namespace::	Details about the Internet namespace.
@@ -2356,7 +2354,7 @@
 
 Socket Addresses
 
-* Address Formats::		About `struct sockaddr'.
+* Address Formats::		About 'struct sockaddr'.
 * Setting Address::		Binding an address to a socket.
 * Reading Address::		Reading the address of a socket.
 
@@ -2407,9 +2405,9 @@
 
 Transferring Data
 
-* Sending Data::		Sending data with `send'.
-* Receiving Data::		Reading data with `recv'.
-* Socket Data Options::		Using `send' and `recv'.
+* Sending Data::		Sending data with 'send'.
+* Receiving Data::		Reading data with 'recv'.
+* Socket Data Options::		Using 'send' and 'recv'.
 
 Datagrams
 
@@ -2447,7 +2445,7 @@
 
 Terminal Modes
 
-* Mode Data Types::             The data type `struct termios' and
+* Mode Data Types::             The data type 'struct termios' and
                                  related types.
 * Mode Functions::              Functions to read and set the terminal
                                  attributes.
@@ -2508,9 +2506,9 @@
 
 Pseudo-Random Numbers
 
-* ISO Random::                  `rand' and friends.
-* BSD Random::                  `random' and friends.
-* SVID Random::                 `drand48' and friends.
+* ISO Random::                  'rand' and friends.
+* BSD Random::                  'random' and friends.
+* SVID Random::                 'drand48' and friends.
 
 Arithmetic
 
@@ -2555,14 +2553,14 @@
 * Time Basics::                 Concepts and definitions.
 * Elapsed Time::                Data types to represent elapsed times
 * Processor And CPU Time::      Time a program has spent executing.
-* Calendar Time::               Manipulation of ``real'' dates and times.
+* Calendar Time::               Manipulation of "real" dates and times.
 * Setting an Alarm::            Sending a signal after a specified time.
 * Sleeping::                    Waiting for a period of time.
 
 Processor And CPU Time
 
-* CPU Time::                    The `clock' function.
-* Processor Time::              The `times' function.
+* CPU Time::                    The 'clock' function.
+* Processor Time::              The 'times' function.
 
 Calendar Time
 
@@ -2626,8 +2624,8 @@
 * Signal Actions::              Specifying what happens when a
                                  particular signal is delivered.
 * Defining Handlers::           How to write a signal handler function.
-* Interrupted Primitives::	Signal handlers affect use of `open',
-				 `read', `write' and other functions.
+* Interrupted Primitives::	Signal handlers affect use of 'open',
+				 'read', 'write' and other functions.
 * Generating Signals::          How to send a signal to a process.
 * Blocking Signals::            Making the system hold signals temporarily.
 * Waiting for a Signal::        Suspending your program until a signal
@@ -2657,8 +2655,8 @@
 
 Signal Actions
 
-* Basic Signal Handling::       The simple `signal' function.
-* Advanced Signal Handling::    The more powerful `sigaction' function.
+* Basic Signal Handling::       The simple 'signal' function.
+* Advanced Signal Handling::    The more powerful 'sigaction' function.
 * Signal and Sigaction::        How those two functions interact.
 * Sigaction Function Example::  An example of using the sigaction function.
 * Flags for Sigaction::         Specifying options for signal handling.
@@ -2690,8 +2688,8 @@
 
 * Signaling Yourself::          A process can send a signal to itself.
 * Signaling Another Process::   Send a signal to another process.
-* Permission for kill::         Permission for using `kill'.
-* Kill Example::                Using `kill' for Communication.
+* Permission for kill::         Permission for using 'kill'.
+* Kill Example::                Using 'kill' for Communication.
 
 Blocking Signals
 
@@ -2712,7 +2710,7 @@
 
 Waiting for a Signal
 
-* Using Pause::                 The simple way, using `pause'.
+* Using Pause::                 The simple way, using 'pause'.
 * Pause Problems::              Why the simple way is often not very good.
 * Sigsuspend::                  Reliably waiting for a specific signal.
 
@@ -2736,10 +2734,10 @@
 
 Parsing Program Arguments
 
-* Getopt::                      Parsing program options using `getopt'.
-* Argp::                        Parsing program options using `argp_parse'.
+* Getopt::                      Parsing program options using 'getopt'.
+* Argp::                        Parsing program options using 'argp_parse'.
 * Suboptions::                  Some programs need more detailed options.
-* Suboptions Example::          This shows how it could be done for `mount'.
+* Suboptions Example::          This shows how it could be done for 'mount'.
 
 Environment Variables
 
@@ -2750,13 +2748,13 @@
 
 Program Termination
 
-* Normal Termination::          If a program calls `exit', a
+* Normal Termination::          If a program calls 'exit', a
                                  process terminates normally.
-* Exit Status::                 The `exit status' provides information
+* Exit Status::                 The 'exit status' provides information
                                  about why the process terminated.
 * Cleanups on Exit::            A process can run its own cleanup
                                  functions upon normal termination.
-* Aborting a Program::          The `abort' function causes
+* Aborting a Program::          The 'abort' function causes
                                  abnormal program termination.
 * Termination Internals::       What happens when a process terminates.
 
@@ -2902,8 +2900,8 @@
 
 Mount Information
 
-* fstab::                       The `fstab' file
-* mtab::                        The `mtab' file
+* fstab::                       The 'fstab' file
+* mtab::                        The 'mtab' file
 * Other Mount Information::     Other (non-libc) sources of mount information
 
 System Configuration
@@ -2931,9 +2929,9 @@
 
 Sysconf
 
-* Sysconf Definition::        Detailed specifications of `sysconf'.
-* Constants for Sysconf::     The list of parameters `sysconf' can read.
-* Examples of Sysconf::       How to use `sysconf' and the parameter
+* Sysconf Definition::        Detailed specifications of 'sysconf'.
+* Constants for Sysconf::     The list of parameters 'sysconf' can read.
+* Examples of Sysconf::       How to use 'sysconf' and the parameter
 				 macros properly together.
 
 Cryptographic Functions
@@ -2967,11 +2965,11 @@
 
 Language Features
 
-* Consistency Checking::        Using `assert' to abort if
-				 something ``impossible'' happens.
+* Consistency Checking::        Using 'assert' to abort if
+				 something "impossible" happens.
 * Variadic Functions::          Defining functions with varying numbers
                                  of args.
-* Null Pointer Constant::       The macro `NULL'.
+* Null Pointer Constant::       The macro 'NULL'.
 * Important Data Types::        Data types for object sizes.
 * Data Type Measurements::      Parameters of data type representations.
 
@@ -3032,7 +3030,7 @@
 
 Porting
 
-* Hierarchy Conventions::       The layout of the `sysdeps' hierarchy.
+* Hierarchy Conventions::       The layout of the 'sysdeps' hierarchy.
 * Porting to Unix::             Porting the library to an average
                                    Unix-like system.
 
@@ -3049,7 +3047,7 @@
 The C language provides no built-in facilities for performing such
 common operations as input/output, memory management, string
 manipulation, and the like.  Instead, these facilities are defined in a
-standard "library", which you compile and link with your programs.  
+standard "library", which you compile and link with your programs.
 
    The GNU C Library, described in this document, defines all of the
 library functions that are specified by the ISO C standard, as well as
@@ -3085,20 +3083,20 @@
    The GNU C Library includes several "header files", each of which
 provides definitions and declarations for a group of related facilities;
 this information is used by the C compiler when processing your program.
-For example, the header file `stdio.h' declares facilities for
-performing input and output, and the header file `string.h' declares
+For example, the header file 'stdio.h' declares facilities for
+performing input and output, and the header file 'string.h' declares
 string processing utilities.  The organization of this manual generally
 follows the same division as the header files.
 
    If you are reading this manual for the first time, you should read
-all of the introductory material and skim the remaining chapters.
-There are a _lot_ of functions in the GNU C Library and it's not
-realistic to expect that you will be able to remember exactly _how_ to
-use each and every one of them.  It's more important to become
-generally familiar with the kinds of facilities that the library
-provides, so that when you are writing your programs you can recognize
-_when_ to make use of library functions, and _where_ in this manual you
-can find more specific information about them.
+all of the introductory material and skim the remaining chapters.  There
+are a _lot_ of functions in the GNU C Library and it's not realistic to
+expect that you will be able to remember exactly _how_ to use each and
+every one of them.  It's more important to become generally familiar
+with the kinds of facilities that the library provides, so that when you
+are writing your programs you can recognize _when_ to make use of
+library functions, and _where_ in this manual you can find more specific
+information about them.
 
 
 File: libc.info,  Node: Standards and Portability,  Next: Using the Library,  Prev: Getting Started,  Up: Introduction
@@ -3139,31 +3137,31 @@
 -----------
 
 The GNU C Library is compatible with the C standard adopted by the
-American National Standards Institute (ANSI): `American National
+American National Standards Institute (ANSI): 'American National
 Standard X3.159-1989--"ANSI C"' and later by the International
-Standardization Organization (ISO): `ISO/IEC 9899:1990, "Programming
-languages--C"'.  We here refer to the standard as ISO C since this is
-the more general standard in respect of ratification.  The header files
-and library facilities that make up the GNU C Library are a superset of
+Standardization Organization (ISO): 'ISO/IEC 9899:1990, "Programming
+languages--C"'. We here refer to the standard as ISO C since this is the
+more general standard in respect of ratification.  The header files and
+library facilities that make up the GNU C Library are a superset of
 those specified by the ISO C standard.
 
    If you are concerned about strict adherence to the ISO C standard,
-you should use the `-ansi' option when you compile your programs with
+you should use the '-ansi' option when you compile your programs with
 the GNU C compiler.  This tells the compiler to define _only_ ISO
 standard features from the library header files, unless you explicitly
 ask for additional features.  *Note Feature Test Macros::, for
 information on how to do this.
 
    Being able to restrict the library to include only ISO C features is
-important because ISO C puts limitations on what names can be defined
-by the library implementation, and the GNU extensions don't fit these
+important because ISO C puts limitations on what names can be defined by
+the library implementation, and the GNU extensions don't fit these
 limitations.  *Note Reserved Names::, for more information about these
 restrictions.
 
    This manual does not attempt to give you complete details on the
-differences between ISO C and older dialects.  It gives advice on how
-to write programs to work portably under multiple C dialects, but does
-not aim for completeness.
+differences between ISO C and older dialects.  It gives advice on how to
+write programs to work portably under multiple C dialects, but does not
+aim for completeness.
 
 
 File: libc.info,  Node: POSIX,  Next: Berkeley Unix,  Prev: ISO C,  Up: Standards and Portability
@@ -3178,23 +3176,23 @@
 versions of the Unix operating system.
 
    The library facilities specified by the POSIX standards are a
-superset of those required by ISO C; POSIX specifies additional
-features for ISO C functions, as well as specifying new additional
-functions.  In general, the additional requirements and functionality
-defined by the POSIX standards are aimed at providing lower-level
-support for a particular kind of operating system environment, rather
-than general programming language support which can run in many diverse
-operating system environments.
+superset of those required by ISO C; POSIX specifies additional features
+for ISO C functions, as well as specifying new additional functions.  In
+general, the additional requirements and functionality defined by the
+POSIX standards are aimed at providing lower-level support for a
+particular kind of operating system environment, rather than general
+programming language support which can run in many diverse operating
+system environments.
 
    The GNU C Library implements all of the functions specified in
-`ISO/IEC 9945-1:1996, the POSIX System Application Program Interface',
+'ISO/IEC 9945-1:1996, the POSIX System Application Program Interface',
 commonly referred to as POSIX.1.  The primary extensions to the ISO C
 facilities specified by this standard include file system interface
 primitives (*note File System Interface::), device-specific terminal
 control functions (*note Low-Level Terminal Interface::), and process
 control functions (*note Processes::).
 
-   Some facilities from `ISO/IEC 9945-2:1993, the POSIX Shell and
+   Some facilities from 'ISO/IEC 9945-2:1993, the POSIX Shell and
 Utilities standard' (POSIX.2) are also implemented in the GNU C Library.
 These include utilities for dealing with regular expressions and other
 pattern matching facilities (*note Pattern Matching::).
@@ -3223,17 +3221,17 @@
 and Async-Cancel- -Safety.  Intuitive definitions of these properties,
 attempting to capture the meaning of the standard definitions, follow.
 
-   * `MT-Safe' or Thread-Safe functions are safe to call in the presence
+   * 'MT-Safe' or Thread-Safe functions are safe to call in the presence
      of other threads.  MT, in MT-Safe, stands for Multi Thread.
 
-     Being MT-Safe does not imply a function is atomic, nor that it
-     uses any of the memory synchronization mechanisms POSIX exposes to
+     Being MT-Safe does not imply a function is atomic, nor that it uses
+     any of the memory synchronization mechanisms POSIX exposes to
      users.  It is even possible that calling MT-Safe functions in
      sequence does not yield an MT-Safe combination.  For example,
      having a thread call two MT-Safe functions one right after the
-     other does not guarantee behavior equivalent to atomic execution
-     of a combination of both functions, since concurrent calls in
-     other threads may interfere in a destructive way.
+     other does not guarantee behavior equivalent to atomic execution of
+     a combination of both functions, since concurrent calls in other
+     threads may interfere in a destructive way.
 
      Whole-program optimizations that could inline functions across
      library interfaces may expose unsafe reordering, and so performing
@@ -3242,27 +3240,27 @@
      whole-program optimization.  However, functions defined in
      user-visible headers are designed to be safe for inlining.
 
-   * `AS-Safe' or Async-Signal-Safe functions are safe to call from
+   * 'AS-Safe' or Async-Signal-Safe functions are safe to call from
      asynchronous signal handlers.  AS, in AS-Safe, stands for
      Asynchronous Signal.
 
-     Many functions that are AS-Safe may set `errno', or modify the
+     Many functions that are AS-Safe may set 'errno', or modify the
      floating-point environment, because their doing so does not make
      them unsuitable for use in signal handlers.  However, programs
      could misbehave should asynchronous signal handlers modify this
      thread-local state, and the signal handling machinery cannot be
      counted on to preserve it.  Therefore, signal handlers that call
-     functions that may set `errno' or modify the floating-point
+     functions that may set 'errno' or modify the floating-point
      environment _must_ save their original values, and restore them
      before returning.
 
-   * `AC-Safe' or Async-Cancel-Safe functions are safe to call when
+   * 'AC-Safe' or Async-Cancel-Safe functions are safe to call when
      asynchronous cancellation is enabled.  AC in AC-Safe stands for
      Asynchronous Cancellation.
 
      The POSIX standard defines only three functions to be AC-Safe,
-     namely `pthread_cancel', `pthread_setcancelstate', and
-     `pthread_setcanceltype'.  At present the GNU C Library provides no
+     namely 'pthread_cancel', 'pthread_setcancelstate', and
+     'pthread_setcanceltype'.  At present the GNU C Library provides no
      guarantees beyond these three functions, but does document which
      functions are presently AC-Safe.  This documentation is provided
      for use by the GNU C Library developers.
@@ -3270,19 +3268,19 @@
      Just like signal handlers, cancellation cleanup routines must
      configure the floating point environment they require.  The
      routines cannot assume a floating point environment, particularly
-     when asynchronous cancellation is enabled.  If the configuration
-     of the floating point environment cannot be performed atomically
-     then it is also possible that the environment encountered is
-     internally inconsistent.
+     when asynchronous cancellation is enabled.  If the configuration of
+     the floating point environment cannot be performed atomically then
+     it is also possible that the environment encountered is internally
+     inconsistent.
 
-   * `MT-Unsafe', `AS-Unsafe', `AC-Unsafe' functions are not safe to
+   * 'MT-Unsafe', 'AS-Unsafe', 'AC-Unsafe' functions are not safe to
      call within the safety contexts described above.  Calling them
      within such contexts invokes undefined behavior.
 
      Functions not explicitly documented as safe in a safety context
      should be regarded as Unsafe.
 
-   * `Preliminary' safety properties are documented, indicating these
+   * 'Preliminary' safety properties are documented, indicating these
      properties may _not_ be counted on in future releases of the GNU C
      Library.
 
@@ -3293,10 +3291,10 @@
      Although we strive to abide by the standards, in some cases our
      implementation is safe even when the standard does not demand
      safety, and in other cases our implementation does not meet the
-     standard safety requirements.  The latter are most likely bugs;
-     the former, when marked as `Preliminary', should not be counted
-     on: future standards may require changes that are not compatible
-     with the additional safety properties afforded by the current
+     standard safety requirements.  The latter are most likely bugs; the
+     former, when marked as 'Preliminary', should not be counted on:
+     future standards may require changes that are not compatible with
+     the additional safety properties afforded by the current
      implementation.
 
      Furthermore, the POSIX standard does not offer a detailed
@@ -3314,10 +3312,9 @@
 
      Over time, we envision evolving the preliminary safety notes into
      stable commitments, as stable as those of our interfaces.  As we
-     do, we will remove the `Preliminary' keyword from safety notes.
-     As long as the keyword remains, however, they are not to be
-     regarded as a promise of future behavior.
-
+     do, we will remove the 'Preliminary' keyword from safety notes.  As
+     long as the keyword remains, however, they are not to be regarded
+     as a promise of future behavior.
 
    Other keywords that appear in safety notes are defined in subsequent
 sections.
@@ -3335,45 +3332,45 @@
 indicate they are never safe to call when asynchronous cancellation is
 enabled.  There are no MT-Unsafe marks in this section.
 
-   * `lock' 
+   * 'lock'
 
-     Functions marked with `lock' as an AS-Unsafe feature may be
+     Functions marked with 'lock' as an AS-Unsafe feature may be
      interrupted by a signal while holding a non-recursive lock.  If the
      signal handler calls another such function that takes the same
      lock, the result is a deadlock.
 
-     Functions annotated with `lock' as an AC-Unsafe feature may, if
+     Functions annotated with 'lock' as an AC-Unsafe feature may, if
      cancelled asynchronously, fail to release a lock that would have
      been released if their execution had not been interrupted by
      asynchronous thread cancellation.  Once a lock is left taken,
      attempts to take that lock will block indefinitely.
 
-   * `corrupt' 
+   * 'corrupt'
 
-     Functions marked with `corrupt' as an AS-Unsafe feature may corrupt
+     Functions marked with 'corrupt' as an AS-Unsafe feature may corrupt
      data structures and misbehave when they interrupt, or are
      interrupted by, another such function.  Unlike functions marked
-     with `lock', these take recursive locks to avoid MT-Safety
+     with 'lock', these take recursive locks to avoid MT-Safety
      problems, but this is not enough to stop a signal handler from
      observing a partially-updated data structure.  Further corruption
-     may arise from the interrupted function's failure to notice
-     updates made by signal handlers.
+     may arise from the interrupted function's failure to notice updates
+     made by signal handlers.
 
-     Functions marked with `corrupt' as an AC-Unsafe feature may leave
+     Functions marked with 'corrupt' as an AC-Unsafe feature may leave
      data structures in a corrupt, partially updated state.  Subsequent
      uses of the data structure may misbehave.
 
-   * `heap' 
+   * 'heap'
 
-     Functions marked with `heap' may call heap memory management
-     functions from the `malloc'/`free' family of functions and are
-     only as safe as those functions.  This note is thus equivalent to:
+     Functions marked with 'heap' may call heap memory management
+     functions from the 'malloc'/'free' family of functions and are only
+     as safe as those functions.  This note is thus equivalent to:
 
      | AS-Unsafe lock | AC-Unsafe lock fd mem |
 
-   * `dlopen' 
+   * 'dlopen'
 
-     Functions marked with `dlopen' use the dynamic loader to load
+     Functions marked with 'dlopen' use the dynamic loader to load
      shared libraries into the current execution image.  This involves
      opening files, mapping them into memory, allocating additional
      memory, resolving symbols, applying relocations and more, all of
@@ -3381,46 +3378,45 @@
 
      The locks are enough for these functions to be AS- and AC-Unsafe,
      but other issues may arise.  At present this is a placeholder for
-     all potential safety issues raised by `dlopen'.
+     all potential safety issues raised by 'dlopen'.
 
-   * `plugin' 
+   * 'plugin'
 
-     Functions annotated with `plugin' may run code from plugins that
+     Functions annotated with 'plugin' may run code from plugins that
      may be external to the GNU C Library.  Such plugin functions are
      assumed to be MT-Safe, AS-Unsafe and AC-Unsafe.  Examples of such
      plugins are stack unwinding libraries, name service switch (NSS)
      and character set conversion (iconv) back-ends.
 
      Although the plugins mentioned as examples are all brought in by
-     means of dlopen, the `plugin' keyword does not imply any direct
-     involvement of the dynamic loader or the `libdl' interfaces, those
-     are covered by `dlopen'.  For example, if one function loads a
+     means of dlopen, the 'plugin' keyword does not imply any direct
+     involvement of the dynamic loader or the 'libdl' interfaces, those
+     are covered by 'dlopen'.  For example, if one function loads a
      module and finds the addresses of some of its functions, while
      another just calls those already-resolved functions, the former
-     will be marked with `dlopen', whereas the latter will get the
-     `plugin'.  When a single function takes all of these actions, then
+     will be marked with 'dlopen', whereas the latter will get the
+     'plugin'.  When a single function takes all of these actions, then
      it gets both marks.
 
-   * `i18n' 
+   * 'i18n'
 
-     Functions marked with `i18n' may call internationalization
-     functions of the `gettext' family and will be only as safe as those
+     Functions marked with 'i18n' may call internationalization
+     functions of the 'gettext' family and will be only as safe as those
      functions.  This note is thus equivalent to:
 
      | MT-Safe env | AS-Unsafe corrupt heap dlopen | AC-Unsafe corrupt |
 
-   * `timer' 
+   * 'timer'
 
-     Functions marked with `timer' use the `alarm' function or similar
+     Functions marked with 'timer' use the 'alarm' function or similar
      to set a time-out for a system call or a long-running operation.
      In a multi-threaded program, there is a risk that the time-out
      signal will be delivered to a different thread, thus failing to
      interrupt the intended thread.  Besides being MT-Unsafe, such
      functions are always AS-Unsafe, because calling them in signal
-     handlers may interfere with timers set in the interrupted code,
-     and AC-Unsafe, because there is no safe way to guarantee an
-     earlier timer will be reset in case of asynchronous cancellation.
-
+     handlers may interfere with timers set in the interrupted code, and
+     AC-Unsafe, because there is no safe way to guarantee an earlier
+     timer will be reset in case of asynchronous cancellation.
 
 
 File: libc.info,  Node: Conditionally Safe Features,  Next: Other Safety Remarks,  Prev: Unsafe Features,  Up: POSIX
@@ -3438,9 +3434,9 @@
 documented constraints, does the function become safe to call in a
 context.
 
-   * `init' 
+   * 'init'
 
-     Functions marked with `init' as an MT-Unsafe feature perform
+     Functions marked with 'init' as an MT-Unsafe feature perform
      MT-Unsafe initialization when they are first called.
 
      Calling such a function at least once in single-threaded mode
@@ -3448,12 +3444,12 @@
      MT-Unsafe.  If no other cause for that remains, the function can
      then be safely called after other threads are started.
 
-     Functions marked with `init' as an AS- or AC-Unsafe feature use the
-     internal `libc_once' machinery or similar to initialize internal
+     Functions marked with 'init' as an AS- or AC-Unsafe feature use the
+     internal 'libc_once' machinery or similar to initialize internal
      data structures.
 
      If a signal handler interrupts such an initializer, and calls any
-     function that also performs `libc_once' initialization, it will
+     function that also performs 'libc_once' initialization, it will
      deadlock if the thread library has been loaded.
 
      Furthermore, if an initializer is partially complete before it is
@@ -3462,58 +3458,58 @@
      more than once, leaking resources or even resulting in corrupt
      internal data.
 
-     Applications that need to call functions marked with `init' as an
+     Applications that need to call functions marked with 'init' as an
      AS- or AC-Unsafe feature should ensure the initialization is
      performed before configuring signal handlers or enabling
      cancellation, so that the AS- and AC-Safety issues related with
-     `libc_once' do not arise.
+     'libc_once' do not arise.
 
-   * `race' 
+   * 'race'
 
-     Functions annotated with `race' as an MT-Safety issue operate on
+     Functions annotated with 'race' as an MT-Safety issue operate on
      objects in ways that may cause data races or similar forms of
      destructive interference out of concurrent execution.  In some
-     cases, the objects are passed to the functions by users; in
-     others, they are used by the functions to return values to users;
-     in others, they are not even exposed to users.
+     cases, the objects are passed to the functions by users; in others,
+     they are used by the functions to return values to users; in
+     others, they are not even exposed to users.
 
      We consider access to objects passed as (indirect) arguments to
      functions to be data race free.  The assurance of data race free
      objects is the caller's responsibility.  We will not mark a
-     function as MT-Unsafe or AS-Unsafe if it misbehaves when users
-     fail to take the measures required by POSIX to avoid data races
-     when dealing with such objects.  As a general rule, if a function
-     is documented as reading from an object passed (by reference) to
-     it, or modifying it, users ought to use memory synchronization
+     function as MT-Unsafe or AS-Unsafe if it misbehaves when users fail
+     to take the measures required by POSIX to avoid data races when
+     dealing with such objects.  As a general rule, if a function is
+     documented as reading from an object passed (by reference) to it,
+     or modifying it, users ought to use memory synchronization
      primitives to avoid data races just as they would should they
      perform the accesses themselves rather than by calling the library
-     function.  `FILE' streams are the exception to the general rule,
-     in that POSIX mandates the library to guard against data races in
-     many functions that manipulate objects of this specific opaque
-     type.  We regard this as a convenience provided to users, rather
-     than as a general requirement whose expectations should extend to
-     other types.
+     function.  'FILE' streams are the exception to the general rule, in
+     that POSIX mandates the library to guard against data races in many
+     functions that manipulate objects of this specific opaque type.  We
+     regard this as a convenience provided to users, rather than as a
+     general requirement whose expectations should extend to other
+     types.
 
      In order to remind users that guarding certain arguments is their
      responsibility, we will annotate functions that take objects of
-     certain types as arguments.  We draw the line for objects passed
-     by users as follows: objects whose types are exposed to users, and
-     that users are expected to access directly, such as memory
-     buffers, strings, and various user-visible `struct' types, do
-     _not_ give reason for functions to be annotated with `race'.  It
-     would be noisy and redundant with the general requirement, and not
-     many would be surprised by the library's lack of internal guards
-     when accessing objects that can be accessed directly by users.
+     certain types as arguments.  We draw the line for objects passed by
+     users as follows: objects whose types are exposed to users, and
+     that users are expected to access directly, such as memory buffers,
+     strings, and various user-visible 'struct' types, do _not_ give
+     reason for functions to be annotated with 'race'.  It would be
+     noisy and redundant with the general requirement, and not many
+     would be surprised by the library's lack of internal guards when
+     accessing objects that can be accessed directly by users.
 
      As for objects that are opaque or opaque-like, in that they are to
      be manipulated only by passing them to library functions (e.g.,
-     `FILE', `DIR', `obstack', `iconv_t'), there might be additional
+     'FILE', 'DIR', 'obstack', 'iconv_t'), there might be additional
      expectations as to internal coordination of access by the library.
-     We will annotate, with `race' followed by a colon and the argument
-     name, functions that take such objects but that do not take care
-     of synchronizing access to them by default.  For example, `FILE'
-     stream `unlocked' functions will be annotated, but those that
-     perform implicit locking on `FILE' streams by default will not,
+     We will annotate, with 'race' followed by a colon and the argument
+     name, functions that take such objects but that do not take care of
+     synchronizing access to them by default.  For example, 'FILE'
+     stream 'unlocked' functions will be annotated, but those that
+     perform implicit locking on 'FILE' streams by default will not,
      even though the implicit locking may be disabled on a per-stream
      basis.
 
@@ -3526,69 +3522,69 @@
      This user responsibility does not apply, however, to objects
      controlled by the library itself, such as internal objects and
      static buffers used to return values from certain calls.  When the
-     library doesn't guard them against concurrent uses, these cases
-     are regarded as MT-Unsafe and AS-Unsafe (although the `race' mark
-     under AS-Unsafe will be omitted as redundant with the one under
+     library doesn't guard them against concurrent uses, these cases are
+     regarded as MT-Unsafe and AS-Unsafe (although the 'race' mark under
+     AS-Unsafe will be omitted as redundant with the one under
      MT-Unsafe).  As in the case of user-exposed objects, the mark may
      be followed by a colon and an identifier.  The identifier groups
-     all functions that operate on a certain unguarded object; users
-     may avoid the MT-Safety issues related with unguarded concurrent
-     access to such internal objects by creating a non-recursive mutex
-     related with the identifier, and always holding the mutex when
-     calling any function marked as racy on that identifier, as they
-     would have to should the identifier be an object under user
-     control.  The non-recursive mutex avoids the MT-Safety issue, but
-     it trades one AS-Safety issue for another, so use in asynchronous
-     signals remains undefined.
+     all functions that operate on a certain unguarded object; users may
+     avoid the MT-Safety issues related with unguarded concurrent access
+     to such internal objects by creating a non-recursive mutex related
+     with the identifier, and always holding the mutex when calling any
+     function marked as racy on that identifier, as they would have to
+     should the identifier be an object under user control.  The
+     non-recursive mutex avoids the MT-Safety issue, but it trades one
+     AS-Safety issue for another, so use in asynchronous signals remains
+     undefined.
 
      When the identifier relates to a static buffer used to hold return
-     values, the mutex must be held for as long as the buffer remains
-     in use by the caller.  Many functions that return pointers to
-     static buffers offer reentrant variants that store return values
-     in caller-supplied buffers instead.  In some cases, such as
-     `tmpname', the variant is chosen not by calling an alternate entry
-     point, but by passing a non-`NULL' pointer to the buffer in which
-     the returned values are to be stored.  These variants are
-     generally preferable in multi-threaded programs, although some of
-     them are not MT-Safe because of other internal buffers, also
-     documented with `race' notes.
+     values, the mutex must be held for as long as the buffer remains in
+     use by the caller.  Many functions that return pointers to static
+     buffers offer reentrant variants that store return values in
+     caller-supplied buffers instead.  In some cases, such as 'tmpname',
+     the variant is chosen not by calling an alternate entry point, but
+     by passing a non-'NULL' pointer to the buffer in which the returned
+     values are to be stored.  These variants are generally preferable
+     in multi-threaded programs, although some of them are not MT-Safe
+     because of other internal buffers, also documented with 'race'
+     notes.
 
-   * `const' 
+   * 'const'
 
-     Functions marked with `const' as an MT-Safety issue non-atomically
+     Functions marked with 'const' as an MT-Safety issue non-atomically
      modify internal objects that are better regarded as constant,
      because a substantial portion of the GNU C Library accesses them
-     without synchronization.  Unlike `race', that causes both readers
+     without synchronization.  Unlike 'race', that causes both readers
      and writers of internal objects to be regarded as MT-Unsafe and
      AS-Unsafe, this mark is applied to writers only.  Writers remain
-     equally MT- and AS-Unsafe to call, but the then-mandatory
-     constness of objects they modify enables readers to be regarded as
-     MT-Safe and AS-Safe (as long as no other reasons for them to be
-     unsafe remain), since the lack of synchronization is not a problem
-     when the objects are effectively constant.
+     equally MT- and AS-Unsafe to call, but the then-mandatory constness
+     of objects they modify enables readers to be regarded as MT-Safe
+     and AS-Safe (as long as no other reasons for them to be unsafe
+     remain), since the lack of synchronization is not a problem when
+     the objects are effectively constant.
 
-     The identifier that follows the `const' mark will appear by itself
+     The identifier that follows the 'const' mark will appear by itself
      as a safety note in readers.  Programs that wish to work around
      this safety issue, so as to call writers, may use a non-recursve
-     `rwlock' associated with the identifier, and guard _all_ calls to
-     functions marked with `const' followed by the identifier with a
+     'rwlock' associated with the identifier, and guard _all_ calls to
+     functions marked with 'const' followed by the identifier with a
      write lock, and _all_ calls to functions marked with the identifier
      by itself with a read lock.  The non-recursive locking removes the
-     MT-Safety problem, but it trades one AS-Safety problem for
-     another, so use in asynchronous signals remains undefined.
+     MT-Safety problem, but it trades one AS-Safety problem for another,
+     so use in asynchronous signals remains undefined.
 
-   * `sig' 
+   * 'sig'
 
-     Functions marked with `sig' as a MT-Safety issue (that implies an
+     Functions marked with 'sig' as a MT-Safety issue (that implies an
      identical AS-Safety issue, omitted for brevity) may temporarily
-     install a signal handler for internal purposes, which may
-     interfere with other uses of the signal, identified after a colon.
+     install a signal handler for internal purposes, which may interfere
+     with other uses of the signal, identified after a colon.
 
      This safety problem can be worked around by ensuring that no other
      uses of the signal will take place for the duration of the call.
      Holding a non-recursive mutex while calling all functions that use
-     the same temporary signal; blocking that signal before the call
-     and resetting its handler afterwards is recommended.
+     the same temporary signal; blocking that signal before the call and
+     resetting its handler afterwards is recommended.
 
      There is no safe way to guarantee the original signal handler is
      restored in case of asynchronous cancellation, therefore so-marked
@@ -3600,13 +3596,13 @@
      handler to restore the signal to the desired state and to release
      the mutex are recommended.
 
-   * `term' 
+   * 'term'
 
-     Functions marked with `term' as an MT-Safety issue may change the
-     terminal settings in the recommended way, namely: call `tcgetattr',
-     modify some flags, and then call `tcsetattr'; this creates a window
+     Functions marked with 'term' as an MT-Safety issue may change the
+     terminal settings in the recommended way, namely: call 'tcgetattr',
+     modify some flags, and then call 'tcsetattr'; this creates a window
      in which changes made by other threads are lost.  Thus, functions
-     marked with `term' are MT-Unsafe.  The same window enables changes
+     marked with 'term' are MT-Unsafe.  The same window enables changes
      made by asynchronous signals to be lost.  These functions are also
      AS-Unsafe, but the corresponding mark is omitted as redundant.
 
@@ -3615,12 +3611,12 @@
      signal handlers or blocking signals that might use it, and holding
      a lock while calling these functions and interacting with the
      terminal.  This lock should also be used for mutual exclusion with
-     functions marked with `race:tcattr(fd)', where FD is a file
+     functions marked with 'race:tcattr(fd)', where FD is a file
      descriptor for the controlling terminal.  The caller may use a
-     single mutex for simplicity, or use one mutex per terminal, even
-     if referenced by different file descriptors.
+     single mutex for simplicity, or use one mutex per terminal, even if
+     referenced by different file descriptors.
 
-     Functions marked with `term' as an AC-Safety issue are supposed to
+     Functions marked with 'term' as an AC-Safety issue are supposed to
      restore terminal settings to their original state, after
      temporarily changing them, but they may fail to do so if cancelled.
 
@@ -3630,7 +3626,6 @@
      handler to restore the terminal settings to the original state and
      to release the mutex are recommended.
 
-
 
 File: libc.info,  Node: Other Safety Remarks,  Prev: Conditionally Safe Features,  Up: POSIX
 
@@ -3641,92 +3636,92 @@
 that do not make a function unsafe to call, but that may need to be
 taken into account in certain classes of programs:
 
-   * `locale' 
+   * 'locale'
 
-     Functions annotated with `locale' as an MT-Safety issue read from
+     Functions annotated with 'locale' as an MT-Safety issue read from
      the locale object without any form of synchronization.  Functions
-     annotated with `locale' called concurrently with locale changes may
+     annotated with 'locale' called concurrently with locale changes may
      behave in ways that do not correspond to any of the locales active
      during their execution, but an unpredictable mix thereof.
 
      We do not mark these functions as MT- or AS-Unsafe, however,
      because functions that modify the locale object are marked with
-     `const:locale' and regarded as unsafe.  Being unsafe, the latter
+     'const:locale' and regarded as unsafe.  Being unsafe, the latter
      are not to be called when multiple threads are running or
      asynchronous signals are enabled, and so the locale can be
      considered effectively constant in these contexts, which makes the
      former safe.
 
-   * `env' 
+   * 'env'
 
-     Functions marked with `env' as an MT-Safety issue access the
-     environment with `getenv' or similar, without any guards to ensure
+     Functions marked with 'env' as an MT-Safety issue access the
+     environment with 'getenv' or similar, without any guards to ensure
      safety in the presence of concurrent modifications.
 
      We do not mark these functions as MT- or AS-Unsafe, however,
      because functions that modify the environment are all marked with
-     `const:env' and regarded as unsafe.  Being unsafe, the latter are
+     'const:env' and regarded as unsafe.  Being unsafe, the latter are
      not to be called when multiple threads are running or asynchronous
      signals are enabled, and so the environment can be considered
      effectively constant in these contexts, which makes the former
      safe.
 
-   * `hostid' 
+   * 'hostid'
 
-     The function marked with `hostid' as an MT-Safety issue reads from
+     The function marked with 'hostid' as an MT-Safety issue reads from
      the system-wide data structures that hold the "host ID" of the
      machine.  These data structures cannot generally be modified
      atomically.  Since it is expected that the "host ID" will not
-     normally change, the function that reads from it (`gethostid') is
+     normally change, the function that reads from it ('gethostid') is
      regarded as safe, whereas the function that modifies it
-     (`sethostid') is marked with `const:hostid', indicating it may
-     require special care if it is to be called.  In this specific
-     case, the special care amounts to system-wide (not merely
-     intra-process) coordination.
+     ('sethostid') is marked with 'const:hostid', indicating it may
+     require special care if it is to be called.  In this specific case,
+     the special care amounts to system-wide (not merely intra-process)
+     coordination.
 
-   * `sigintr' 
+   * 'sigintr'
 
-     Functions marked with `sigintr' as an MT-Safety issue access the
-     `_sigintr' internal data structure without any guards to ensure
+     Functions marked with 'sigintr' as an MT-Safety issue access the
+     '_sigintr' internal data structure without any guards to ensure
      safety in the presence of concurrent modifications.
 
      We do not mark these functions as MT- or AS-Unsafe, however,
      because functions that modify the this data structure are all
-     marked with `const:sigintr' and regarded as unsafe.  Being unsafe,
+     marked with 'const:sigintr' and regarded as unsafe.  Being unsafe,
      the latter are not to be called when multiple threads are running
      or asynchronous signals are enabled, and so the data structure can
      be considered effectively constant in these contexts, which makes
      the former safe.
 
-   * `fd' 
+   * 'fd'
 
-     Functions annotated with `fd' as an AC-Safety issue may leak file
+     Functions annotated with 'fd' as an AC-Safety issue may leak file
      descriptors if asynchronous thread cancellation interrupts their
      execution.
 
      Functions that allocate or deallocate file descriptors will
-     generally be marked as such.  Even if they attempted to protect
-     the file descriptor allocation and deallocation with cleanup
-     regions, allocating a new descriptor and storing its number where
-     the cleanup region could release it cannot be performed as a
-     single atomic operation.  Similarly, releasing the descriptor and
-     taking it out of the data structure normally responsible for
-     releasing it cannot be performed atomically.  There will always be
-     a window in which the descriptor cannot be released because it was
-     not stored in the cleanup handler argument yet, or it was already
-     taken out before releasing it.  It cannot be taken out after
-     release: an open descriptor could mean either that the descriptor
-     still has to be closed, or that it already did so but the
-     descriptor was reallocated by another thread or signal handler.
+     generally be marked as such.  Even if they attempted to protect the
+     file descriptor allocation and deallocation with cleanup regions,
+     allocating a new descriptor and storing its number where the
+     cleanup region could release it cannot be performed as a single
+     atomic operation.  Similarly, releasing the descriptor and taking
+     it out of the data structure normally responsible for releasing it
+     cannot be performed atomically.  There will always be a window in
+     which the descriptor cannot be released because it was not stored
+     in the cleanup handler argument yet, or it was already taken out
+     before releasing it.  It cannot be taken out after release: an open
+     descriptor could mean either that the descriptor still has to be
+     closed, or that it already did so but the descriptor was
+     reallocated by another thread or signal handler.
 
      Such leaks could be internally avoided, with some performance
-     penalty, by temporarily disabling asynchronous thread
-     cancellation.  However, since callers of allocation or
-     deallocation functions would have to do this themselves, to avoid
-     the same sort of leak in their own layer, it makes more sense for
-     the library to assume they are taking care of it than to impose a
-     performance penalty that is redundant when the problem is solved
-     in upper layers, and insufficient when it is not.
+     penalty, by temporarily disabling asynchronous thread cancellation.
+     However, since callers of allocation or deallocation functions
+     would have to do this themselves, to avoid the same sort of leak in
+     their own layer, it makes more sense for the library to assume they
+     are taking care of it than to impose a performance penalty that is
+     redundant when the problem is solved in upper layers, and
+     insufficient when it is not.
 
      This remark by itself does not cause a function to be regarded as
      AC-Unsafe.  However, cumulative effects of such leaks may pose a
@@ -3734,9 +3729,9 @@
      asynchronous cancellation for the duration of calls to such
      functions is recommended.
 
-   * `mem' 
+   * 'mem'
 
-     Functions annotated with `mem' as an AC-Safety issue may leak
+     Functions annotated with 'mem' as an AC-Safety issue may leak
      memory if asynchronous thread cancellation interrupts their
      execution.
 
@@ -3747,51 +3742,51 @@
      asynchronous cancellation, which these functions do not do.
 
      This remark does not by itself cause a function to be regarded as
-     generally AC-Unsafe.  However, cumulative effects of such leaks
-     may be severe enough for some programs that disabling asynchronous
+     generally AC-Unsafe.  However, cumulative effects of such leaks may
+     be severe enough for some programs that disabling asynchronous
      cancellation for the duration of calls to such functions may be
      required.
 
-   * `cwd' 
+   * 'cwd'
 
-     Functions marked with `cwd' as an MT-Safety issue may temporarily
+     Functions marked with 'cwd' as an MT-Safety issue may temporarily
      change the current working directory during their execution, which
      may cause relative pathnames to be resolved in unexpected ways in
      other threads or within asynchronous signal or cancellation
      handlers.
 
      This is not enough of a reason to mark so-marked functions as MT-
-     or AS-Unsafe, but when this behavior is optional (e.g., `nftw' with
-     `FTW_CHDIR'), avoiding the option may be a good alternative to
-     using full pathnames or file descriptor-relative (e.g. `openat')
+     or AS-Unsafe, but when this behavior is optional (e.g., 'nftw' with
+     'FTW_CHDIR'), avoiding the option may be a good alternative to
+     using full pathnames or file descriptor-relative (e.g.  'openat')
      system calls.
 
-   * `!posix' 
+   * '!posix'
 
      This remark, as an MT-, AS- or AC-Safety note to a function,
-     indicates the safety status of the function is known to differ
-     from the specified status in the POSIX standard.  For example,
-     POSIX does not require a function to be Safe, but our
-     implementation is, or vice-versa.
+     indicates the safety status of the function is known to differ from
+     the specified status in the POSIX standard.  For example, POSIX
+     does not require a function to be Safe, but our implementation is,
+     or vice-versa.
 
      For the time being, the absence of this remark does not imply the
      safety properties we documented are identical to those mandated by
      POSIX for the corresponding functions.
 
-   * `:identifier' 
+   * ':identifier'
 
      Annotations may sometimes be followed by identifiers, intended to
-     group several functions that e.g. access the data structures in an
-     unsafe way, as in `race' and `const', or to provide more specific
+     group several functions that e.g.  access the data structures in an
+     unsafe way, as in 'race' and 'const', or to provide more specific
      information, such as naming a signal in a function marked with
-     `sig'.  It is envisioned that it may be applied to `lock' and
-     `corrupt' as well in the future.
+     'sig'.  It is envisioned that it may be applied to 'lock' and
+     'corrupt' as well in the future.
 
      In most cases, the identifier will name a set of functions, but it
      may name global objects or function arguments, or identifiable
      properties or logical components associated with them, with a
-     notation such as e.g. `:buf(arg)' to denote a buffer associated
-     with the argument ARG, or `:tcattr(fd)' to denote the terminal
+     notation such as e.g.  ':buf(arg)' to denote a buffer associated
+     with the argument ARG, or ':tcattr(fd)' to denote the terminal
      attributes of a file descriptor FD.
 
      The most common use for identifiers is to provide logical groups of
@@ -3799,23 +3794,21 @@
      synchronization primitive in order to ensure safe operation in a
      given context.
 
-   * `/condition' 
+   * '/condition'
 
-     Some safety annotations may be conditional, in that they only
-     apply if a boolean expression involving arguments, global
-     variables or even the underlying kernel evaluates evaluates to
-     true.  Such conditions as `/hurd' or `/!linux!bsd' indicate the
-     preceding marker only applies when the underlying kernel is the
-     HURD, or when it is neither Linux nor a BSD kernel, respectively.
-     `/!ps' and `/one_per_line' indicate the preceding marker only
-     applies when argument PS is NULL, or global variable ONE_PER_LINE
-     is nonzero.
+     Some safety annotations may be conditional, in that they only apply
+     if a boolean expression involving arguments, global variables or
+     even the underlying kernel evaluates evaluates to true.  Such
+     conditions as '/hurd' or '/!linux!bsd' indicate the preceding
+     marker only applies when the underlying kernel is the HURD, or when
+     it is neither Linux nor a BSD kernel, respectively.  '/!ps' and
+     '/one_per_line' indicate the preceding marker only applies when
+     argument PS is NULL, or global variable ONE_PER_LINE is nonzero.
 
      When all marks that render a function unsafe are adorned with such
      conditions, and none of the named conditions hold, then the
      function can be regarded as safe.
 
-
 
 File: libc.info,  Node: Berkeley Unix,  Next: SVID,  Prev: POSIX,  Up: Standards and Portability
 
@@ -3827,11 +3820,11 @@
 and 4.4 BSD Unix systems (also known as "Berkeley Unix") and from
 "SunOS" (a popular 4.2 BSD derivative that includes some Unix System V
 functionality).  These systems support most of the ISO C and POSIX
-facilities, and 4.4 BSD and newer releases of SunOS in fact support
-them all.
+facilities, and 4.4 BSD and newer releases of SunOS in fact support them
+all.
 
    The BSD facilities include symbolic links (*note Symbolic Links::),
-the `select' function (*note Waiting for I/O::), the BSD signal
+the 'select' function (*note Waiting for I/O::), the BSD signal
 functions (*note BSD Signal Handling::), and sockets (*note Sockets::).
 
 
@@ -3840,21 +3833,20 @@
 1.2.4 SVID (The System V Interface Description)
 -----------------------------------------------
 
-The "System V Interface Description" (SVID) is a document describing
-the AT&T Unix System V operating system.  It is to some extent a
-superset of the POSIX standard (*note POSIX::).
+The "System V Interface Description" (SVID) is a document describing the
+AT&T Unix System V operating system.  It is to some extent a superset of
+the POSIX standard (*note POSIX::).
 
    The GNU C Library defines most of the facilities required by the SVID
 that are not also required by the ISO C or POSIX standards, for
-compatibility with  System V Unix and other Unix systems (such as
-SunOS) which include these facilities.  However, many of the more
-obscure and less generally useful facilities required by the SVID are
-not included.  (In fact, Unix System V itself does not provide them
-all.)
+compatibility with System V Unix and other Unix systems (such as SunOS)
+which include these facilities.  However, many of the more obscure and
+less generally useful facilities required by the SVID are not included.
+(In fact, Unix System V itself does not provide them all.)
 
    The supported facilities from System V include the methods for
-inter-process communication and shared memory, the `hsearch' and
-`drand48' families of functions, `fmtmsg' and several of the
+inter-process communication and shared memory, the 'hsearch' and
+'drand48' families of functions, 'fmtmsg' and several of the
 mathematical functions.
 
 
@@ -3864,7 +3856,7 @@
 ----------------------------------------
 
 The X/Open Portability Guide, published by the X/Open Company, Ltd., is
-a more general standard than POSIX.  X/Open owns the Unix copyright and
+a more general standard than POSIX. X/Open owns the Unix copyright and
 the XPG specifies the requirements for systems which are intended to be
 a Unix system.
 
@@ -3875,9 +3867,9 @@
    The additions on top of POSIX are mainly derived from functionality
 available in System V and BSD systems.  Some of the really bad mistakes
 in System V systems were corrected, though.  Since fulfilling the XPG
-standard with the Unix extensions is a precondition for getting the
-Unix brand chances are good that the functionality is available on
-commercial systems.
+standard with the Unix extensions is a precondition for getting the Unix
+brand chances are good that the functionality is available on commercial
+systems.
 
 
 File: libc.info,  Node: Using the Library,  Next: Roadmap to the Manual,  Prev: Standards and Portability,  Up: Introduction
@@ -3905,28 +3897,28 @@
 ------------------
 
 Libraries for use by C programs really consist of two parts: "header
-files" that define types and macros and declare variables and
-functions; and the actual library or "archive" that contains the
-definitions of the variables and functions.
+files" that define types and macros and declare variables and functions;
+and the actual library or "archive" that contains the definitions of the
+variables and functions.
 
-   (Recall that in C, a "declaration" merely provides information that
-a function or variable exists and gives its type.  For a function
+   (Recall that in C, a "declaration" merely provides information that a
+function or variable exists and gives its type.  For a function
 declaration, information about the types of its arguments might be
 provided as well.  The purpose of declarations is to allow the compiler
 to correctly process references to the declared variables and functions.
 A "definition", on the other hand, actually allocates storage for a
-variable or says what a function does.)  
+variable or says what a function does.)
 
    In order to use the facilities in the GNU C Library, you should be
 sure that your program source files include the appropriate header
 files.  This is so that the compiler has declarations of these
-facilities available and can correctly process references to them.
-Once your program has been compiled, the linker resolves these
-references to the actual definitions provided in the archive file.
+facilities available and can correctly process references to them.  Once
+your program has been compiled, the linker resolves these references to
+the actual definitions provided in the archive file.
 
    Header files are included into a program source file by the
-`#include' preprocessor directive.  The C language supports two forms
-of this directive; the first,
+'#include' preprocessor directive.  The C language supports two forms of
+this directive; the first,
 
      #include "HEADER"
 
@@ -3937,19 +3929,19 @@
 
      #include <file.h>
 
-is typically used to include a header file `file.h' that contains
+is typically used to include a header file 'file.h' that contains
 definitions and declarations for a standard library.  This file would
 normally be installed in a standard place by your system administrator.
 You should use this second form for the C library header files.
 
-   Typically, `#include' directives are placed at the top of the C
+   Typically, '#include' directives are placed at the top of the C
 source file, before any other code.  If you begin your source files with
 some comments explaining what the code in the file does (a good idea),
-put the `#include' directives immediately afterwards, following the
+put the '#include' directives immediately afterwards, following the
 feature test macro definition (*note Feature Test Macros::).
 
-   For more information about the use of header files and `#include'
-directives, *note Header Files: (cpp.info)Header Files.
+   For more information about the use of header files and '#include'
+directives, *note (cpp.info)Header Files::.
 
    The GNU C Library provides several header files, each of which
 contains the type and macro definitions and variable and function
@@ -3967,13 +3959,13 @@
 program needs to include multiple header files, the order in which they
 are included doesn't matter.
 
-   *Compatibility Note:* Inclusion of standard header files in any
-order and any number of times works in any ISO C implementation.
-However, this has traditionally not been the case in many older C
+   *Compatibility Note:* Inclusion of standard header files in any order
+and any number of times works in any ISO C implementation.  However,
+this has traditionally not been the case in many older C
 implementations.
 
-   Strictly speaking, you don't _have to_ include a header file to use
-a function it declares; you could declare the function explicitly
+   Strictly speaking, you don't _have to_ include a header file to use a
+function it declares; you could declare the function explicitly
 yourself, according to the specifications in this manual.  But it is
 usually better to include the header file because it may define types
 and macros that are not otherwise available and because it may define
@@ -4004,26 +3996,26 @@
 function--perhaps to make your program easier to debug.  There are two
 ways you can do this:
 
-   * You can avoid a macro definition in a specific use by enclosing
-     the name of the function in parentheses.  This works because the
-     name of the function doesn't appear in a syntactic context where
-     it is recognizable as a macro call.
+   * You can avoid a macro definition in a specific use by enclosing the
+     name of the function in parentheses.  This works because the name
+     of the function doesn't appear in a syntactic context where it is
+     recognizable as a macro call.
 
    * You can suppress any macro definition for a whole source file by
-     using the `#undef' preprocessor directive, unless otherwise stated
+     using the '#undef' preprocessor directive, unless otherwise stated
      explicitly in the description of that facility.
 
-   For example, suppose the header file `stdlib.h' declares a function
-named `abs' with
+   For example, suppose the header file 'stdlib.h' declares a function
+named 'abs' with
 
      extern int abs (int);
 
-and also provides a macro definition for `abs'.  Then, in:
+and also provides a macro definition for 'abs'.  Then, in:
 
      #include <stdlib.h>
      int f (int *i) { return abs (++*i); }
 
-the reference to `abs' might refer to either a macro or a function.  On
+the reference to 'abs' might refer to either a macro or a function.  On
 the other hand, in each of the following examples the reference is to a
 function and not a macro.
 
@@ -4046,13 +4038,13 @@
 
 The names of all library types, macros, variables and functions that
 come from the ISO C standard are reserved unconditionally; your program
-*may not* redefine these names.  All other library names are reserved
-if your program explicitly includes the header file that defines or
+*may not* redefine these names.  All other library names are reserved if
+your program explicitly includes the header file that defines or
 declares them.  There are several reasons for these restrictions:
 
    * Other people reading your code could get very confused if you were
-     using a function named `exit' to do something completely different
-     from what the standard `exit' function does, for example.
+     using a function named 'exit' to do something completely different
+     from what the standard 'exit' function does, for example.
      Preventing this situation helps to make your programs easier to
      understand and contributes to modularity and maintainability.
 
@@ -4063,17 +4055,17 @@
 
    * It allows the compiler to do whatever special optimizations it
      pleases on calls to these functions, without the possibility that
-     they may have been redefined by the user.  Some library
-     facilities, such as those for dealing with variadic arguments
-     (*note Variadic Functions::) and non-local exits (*note Non-Local
-     Exits::), actually require a considerable amount of cooperation on
-     the part of the C compiler, and with respect to the
-     implementation, it might be easier for the compiler to treat these
-     as built-in parts of the language.
+     they may have been redefined by the user.  Some library facilities,
+     such as those for dealing with variadic arguments (*note Variadic
+     Functions::) and non-local exits (*note Non-Local Exits::),
+     actually require a considerable amount of cooperation on the part
+     of the C compiler, and with respect to the implementation, it might
+     be easier for the compiler to treat these as built-in parts of the
+     language.
 
    In addition to the names documented in this manual, reserved names
 include all external identifiers (global functions and variables) that
-begin with an underscore (`_') and all identifiers regardless of use
+begin with an underscore ('_') and all identifiers regardless of use
 that begin with either two underscores or an underscore followed by a
 capital letter are reserved names.  This is so that the library and
 header files can define functions, variables, and macros for internal
@@ -4085,61 +4077,61 @@
 they do raise the possibility of conflict with future versions of the C
 or POSIX standards, so you should avoid these names.
 
-   * Names beginning with a capital `E' followed a digit or uppercase
+   * Names beginning with a capital 'E' followed a digit or uppercase
      letter may be used for additional error code names.  *Note Error
      Reporting::.
 
-   * Names that begin with either `is' or `to' followed by a lowercase
+   * Names that begin with either 'is' or 'to' followed by a lowercase
      letter may be used for additional character testing and conversion
      functions.  *Note Character Handling::.
 
-   * Names that begin with `LC_' followed by an uppercase letter may be
+   * Names that begin with 'LC_' followed by an uppercase letter may be
      used for additional macros specifying locale attributes.  *Note
      Locales::.
 
    * Names of all existing mathematics functions (*note Mathematics::)
-     suffixed with `f' or `l' are reserved for corresponding functions
-     that operate on `float' and `long double' arguments, respectively.
+     suffixed with 'f' or 'l' are reserved for corresponding functions
+     that operate on 'float' and 'long double' arguments, respectively.
 
-   * Names that begin with `SIG' followed by an uppercase letter are
+   * Names that begin with 'SIG' followed by an uppercase letter are
      reserved for additional signal names.  *Note Standard Signals::.
 
-   * Names that begin with `SIG_' followed by an uppercase letter are
+   * Names that begin with 'SIG_' followed by an uppercase letter are
      reserved for additional signal actions.  *Note Basic Signal
      Handling::.
 
-   * Names beginning with `str', `mem', or `wcs' followed by a
-     lowercase letter are reserved for additional string and array
-     functions.  *Note String and Array Utilities::.
+   * Names beginning with 'str', 'mem', or 'wcs' followed by a lowercase
+     letter are reserved for additional string and array functions.
+     *Note String and Array Utilities::.
 
-   * Names that end with `_t' are reserved for additional type names.
+   * Names that end with '_t' are reserved for additional type names.
 
    In addition, some individual header files reserve names beyond those
 that they actually define.  You only need to worry about these
 restrictions if your program includes that particular header file.
 
-   * The header file `dirent.h' reserves names prefixed with `d_'.  
+   * The header file 'dirent.h' reserves names prefixed with 'd_'.
 
-   * The header file `fcntl.h' reserves names prefixed with `l_', `F_',
-     `O_', and `S_'.  
+   * The header file 'fcntl.h' reserves names prefixed with 'l_', 'F_',
+     'O_', and 'S_'.
 
-   * The header file `grp.h' reserves names prefixed with `gr_'.  
+   * The header file 'grp.h' reserves names prefixed with 'gr_'.
 
-   * The header file `limits.h' reserves names suffixed with `_MAX'.  
+   * The header file 'limits.h' reserves names suffixed with '_MAX'.
 
-   * The header file `pwd.h' reserves names prefixed with `pw_'.  
+   * The header file 'pwd.h' reserves names prefixed with 'pw_'.
 
-   * The header file `signal.h' reserves names prefixed with `sa_' and
-     `SA_'.  
+   * The header file 'signal.h' reserves names prefixed with 'sa_' and
+     'SA_'.
 
-   * The header file `sys/stat.h' reserves names prefixed with `st_'
-     and `S_'.  
+   * The header file 'sys/stat.h' reserves names prefixed with 'st_' and
+     'S_'.
 
-   * The header file `sys/times.h' reserves names prefixed with `tms_'.  
+   * The header file 'sys/times.h' reserves names prefixed with 'tms_'.
 
-   * The header file `termios.h' reserves names prefixed with `c_',
-     `V', `I', `O', and `TC'; and names prefixed with `B' followed by a
-     digit.  
+   * The header file 'termios.h' reserves names prefixed with 'c_', 'V',
+     'I', 'O', and 'TC'; and names prefixed with 'B' followed by a
+     digit.
 
 
 File: libc.info,  Node: Feature Test Macros,  Prev: Reserved Names,  Up: Using the Library
@@ -4150,19 +4142,18 @@
 The exact set of features available when you compile a source file is
 controlled by which "feature test macros" you define.
 
-   If you compile your programs using `gcc -ansi', you get only the
-ISO C library features, unless you explicitly request additional
-features by defining one or more of the feature macros.  *Note GNU CC
-Command Options: (gcc.info)Invoking GCC, for more information about GCC
-options.
+   If you compile your programs using 'gcc -ansi', you get only the ISO C
+library features, unless you explicitly request additional features by
+defining one or more of the feature macros.  *Note GNU CC Command
+Options: (gcc.info)Invoking GCC, for more information about GCC options.
 
-   You should define these macros by using `#define' preprocessor
+   You should define these macros by using '#define' preprocessor
 directives at the top of your source code files.  These directives
-_must_ come before any `#include' of a system header file.  It is best
+_must_ come before any '#include' of a system header file.  It is best
 to make them the very first thing in the file, preceded only by
-comments.  You could also use the `-D' option to GCC, but it's better
-if you make the source files indicate their own meaning in a
-self-contained way.
+comments.  You could also use the '-D' option to GCC, but it's better if
+you make the source files indicate their own meaning in a self-contained
+way.
 
    This system exists to allow the library to conform to multiple
 standards.  Although the different standards are often described as
@@ -4170,46 +4161,46 @@
 standards require functions with names that smaller ones reserve to the
 user program.  This is not mere pedantry -- it has been a problem in
 practice.  For instance, some non-GNU programs define functions named
-`getline' that have nothing to do with this library's `getline'.  They
+'getline' that have nothing to do with this library's 'getline'.  They
 would not be compilable if all features were enabled indiscriminately.
 
    This should not be used to verify that a program conforms to a
 limited standard.  It is insufficient for this purpose, as it will not
-protect you from including header files outside the standard, or
-relying on semantics undefined within the standard.
+protect you from including header files outside the standard, or relying
+on semantics undefined within the standard.
 
  -- Macro: _POSIX_SOURCE
      If you define this macro, then the functionality from the POSIX.1
      standard (IEEE Standard 1003.1) is available, as well as all of the
      ISO C facilities.
 
-     The state of `_POSIX_SOURCE' is irrelevant if you define the macro
-     `_POSIX_C_SOURCE' to a positive integer.
+     The state of '_POSIX_SOURCE' is irrelevant if you define the macro
+     '_POSIX_C_SOURCE' to a positive integer.
 
  -- Macro: _POSIX_C_SOURCE
      Define this macro to a positive integer to control which POSIX
      functionality is made available.  The greater the value of this
      macro, the more functionality is made available.
 
-     If you define this macro to a value greater than or equal to `1',
+     If you define this macro to a value greater than or equal to '1',
      then the functionality from the 1990 edition of the POSIX.1
      standard (IEEE Standard 1003.1-1990) is made available.
 
-     If you define this macro to a value greater than or equal to `2',
+     If you define this macro to a value greater than or equal to '2',
      then the functionality from the 1992 edition of the POSIX.2
      standard (IEEE Standard 1003.2-1992) is made available.
 
      If you define this macro to a value greater than or equal to
-     `199309L', then the functionality from the 1993 edition of the
+     '199309L', then the functionality from the 1993 edition of the
      POSIX.1b standard (IEEE Standard 1003.1b-1993) is made available.
 
-     Greater values for `_POSIX_C_SOURCE' will enable future extensions.
+     Greater values for '_POSIX_C_SOURCE' will enable future extensions.
      The POSIX standards process will define these values as necessary,
      and the GNU C Library should support them some time after they
      become standardized.  The 1996 edition of POSIX.1 (ISO/IEC 9945-1:
-     1996) states that if you define `_POSIX_C_SOURCE' to a value
-     greater than or equal to `199506L', then the functionality from
-     the 1996 edition is made available.
+     1996) states that if you define '_POSIX_C_SOURCE' to a value
+     greater than or equal to '199506L', then the functionality from the
+     1996 edition is made available.
 
  -- Macro: _BSD_SOURCE
      If you define this macro, functionality derived from 4.3 BSD Unix
@@ -4224,26 +4215,26 @@
  -- Macro: _XOPEN_SOURCE_EXTENDED
      If you define this macro, functionality described in the X/Open
      Portability Guide is included.  This is a superset of the POSIX.1
-     and POSIX.2 functionality and in fact `_POSIX_SOURCE' and
-     `_POSIX_C_SOURCE' are automatically defined.
+     and POSIX.2 functionality and in fact '_POSIX_SOURCE' and
+     '_POSIX_C_SOURCE' are automatically defined.
 
      As the unification of all Unices, functionality only available in
      BSD and SVID is also included.
 
-     If the macro `_XOPEN_SOURCE_EXTENDED' is also defined, even more
+     If the macro '_XOPEN_SOURCE_EXTENDED' is also defined, even more
      functionality is available.  The extra functions will make all
      functions available which are necessary for the X/Open Unix brand.
 
-     If the macro `_XOPEN_SOURCE' has the value 500 this includes all
+     If the macro '_XOPEN_SOURCE' has the value 500 this includes all
      functionality described so far plus some new definitions from the
      Single Unix Specification, version 2.
 
  -- Macro: _LARGEFILE_SOURCE
      If this macro is defined some extra functions are available which
      rectify a few shortcomings in all previous standards.
-     Specifically, the functions `fseeko' and `ftello' are available.
+     Specifically, the functions 'fseeko' and 'ftello' are available.
      Without these functions the difference between the ISO C interface
-     (`fseek', `ftell') and the low-level POSIX interface (`lseek')
+     ('fseek', 'ftell') and the low-level POSIX interface ('lseek')
      would lead to problems.
 
      This macro was introduced as part of the Large File Support
@@ -4252,42 +4243,41 @@
  -- Macro: _LARGEFILE64_SOURCE
      If you define this macro an additional set of functions is made
      available which enables 32 bit systems to use files of sizes beyond
-     the usual limit of 2GB.  This interface is not available if the
+     the usual limit of 2GB. This interface is not available if the
      system does not support files that large.  On systems where the
      natural file size limit is greater than 2GB (i.e., on 64 bit
      systems) the new functions are identical to the replaced functions.
 
      The new functionality is made available by a new set of types and
      functions which replace the existing ones.  The names of these new
-     objects contain `64' to indicate the intention, e.g., `off_t' vs.
-     `off64_t' and `fseeko' vs. `fseeko64'.
+     objects contain '64' to indicate the intention, e.g., 'off_t' vs.
+     'off64_t' and 'fseeko' vs.  'fseeko64'.
 
      This macro was introduced as part of the Large File Support
-     extension (LFS).  It is a transition interface for the period when
-     64 bit offsets are not generally used (see `_FILE_OFFSET_BITS').
+     extension (LFS). It is a transition interface for the period when 64 bit
+     offsets are not generally used (see '_FILE_OFFSET_BITS').
 
  -- Macro: _FILE_OFFSET_BITS
      This macro determines which file system interface shall be used,
-     one replacing the other.  Whereas `_LARGEFILE64_SOURCE' makes the
-     64 bit interface available as an additional interface,
-     `_FILE_OFFSET_BITS' allows the 64 bit interface to replace the old
-     interface.
+     one replacing the other.  Whereas '_LARGEFILE64_SOURCE' makes the 64 bit
+     interface available as an additional interface, '_FILE_OFFSET_BITS'
+     allows the 64 bit interface to replace the old interface.
 
-     If `_FILE_OFFSET_BITS' is undefined, or if it is defined to the
-     value `32', nothing changes.  The 32 bit interface is used and
-     types like `off_t' have a size of 32 bits on 32 bit systems.
+     If '_FILE_OFFSET_BITS' is undefined, or if it is defined to the
+     value '32', nothing changes.  The 32 bit interface is used and
+     types like 'off_t' have a size of 32 bits on 32 bit systems.
 
-     If the macro is defined to the value `64', the large file interface
+     If the macro is defined to the value '64', the large file interface
      replaces the old interface.  I.e., the functions are not made
      available under different names (as they are with
-     `_LARGEFILE64_SOURCE').  Instead the old function names now
-     reference the new functions, e.g., a call to `fseeko' now indeed
-     calls `fseeko64'.
+     '_LARGEFILE64_SOURCE').  Instead the old function names now
+     reference the new functions, e.g., a call to 'fseeko' now indeed
+     calls 'fseeko64'.
 
      This macro should only be selected if the system provides
      mechanisms for handling large files.  On 64 bit systems this macro
-     has no effect since the `*64' functions are identical to the
-     normal functions.
+     has no effect since the '*64' functions are identical to the normal
+     functions.
 
      This macro was introduced as part of the Large File Support
      extension (LFS).
@@ -4295,25 +4285,25 @@
  -- Macro: _ISOC99_SOURCE
      Until the revised ISO C standard is widely adopted the new features
      are not automatically enabled.  The GNU C Library nevertheless has
-     a complete implementation of the new standard and to enable the
-     new features the macro `_ISOC99_SOURCE' should be defined.
+     a complete implementation of the new standard and to enable the new
+     features the macro '_ISOC99_SOURCE' should be defined.
 
  -- Macro: _GNU_SOURCE
-     If you define this macro, everything is included: ISO C89,
-     ISO C99, POSIX.1, POSIX.2, BSD, SVID, X/Open, LFS, and GNU
-     extensions.  In the cases where POSIX.1 conflicts with BSD, the
-     POSIX definitions take precedence.
+     If you define this macro, everything is included: ISO C89, ISO C99,
+     POSIX.1, POSIX.2, BSD, SVID, X/Open, LFS, and GNU extensions.  In
+     the cases where POSIX.1 conflicts with BSD, the POSIX definitions
+     take precedence.
 
  -- Macro: _DEFAULT_SOURCE
      If you define this macro, most features are included apart from
      X/Open, LFS and GNU extensions; the effect is similar to defining
-     `_POSIX_C_SOURCE' to `200809L' and `_POSIX_SOURCE',
-     `_SVID_SOURCE', and `_BSD_SOURCE' to 1.  Defining this macro, on
-     its own and without using compiler options such as `-ansi' or
-     `-std=c99', has the same effect as not defining any feature test
-     macros; defining it together with other feature test macros, or
-     when options such as `-ansi' are used, enables those features even
-     when the other options would otherwise cause them to be disabled.
+     '_POSIX_C_SOURCE' to '200809L' and '_POSIX_SOURCE', '_SVID_SOURCE',
+     and '_BSD_SOURCE' to 1.  Defining this macro, on its own and
+     without using compiler options such as '-ansi' or '-std=c99', has
+     the same effect as not defining any feature test macros; defining
+     it together with other feature test macros, or when options such as
+     '-ansi' are used, enables those features even when the other
+     options would otherwise cause them to be disabled.
 
  -- Macro: _REENTRANT
  -- Macro: _THREAD_SAFE
@@ -4328,17 +4318,17 @@
      compiling this it must have been specified to compile as thread
      safe.
 
-   We recommend you use `_GNU_SOURCE' in new programs.  If you don't
-specify the `-ansi' option to GCC, or other conformance options such as
-`-std=c99', and don't define any of these macros explicitly, the effect
-is the same as defining `_DEFAULT_SOURCE' to 1.
+   We recommend you use '_GNU_SOURCE' in new programs.  If you don't
+specify the '-ansi' option to GCC, or other conformance options such as
+'-std=c99', and don't define any of these macros explicitly, the effect
+is the same as defining '_DEFAULT_SOURCE' to 1.
 
    When you define a feature test macro to request a larger class of
 features, it is harmless to define in addition a feature test macro for
 a subset of those features.  For example, if you define
-`_POSIX_C_SOURCE', then defining `_POSIX_SOURCE' as well has no effect.
-Likewise, if you define `_GNU_SOURCE', then defining either
-`_POSIX_SOURCE' or `_POSIX_C_SOURCE' or `_SVID_SOURCE' as well has no
+'_POSIX_C_SOURCE', then defining '_POSIX_SOURCE' as well has no effect.
+Likewise, if you define '_GNU_SOURCE', then defining either
+'_POSIX_SOURCE' or '_POSIX_C_SOURCE' or '_SVID_SOURCE' as well has no
 effect.
 
 
@@ -4354,9 +4344,9 @@
      library are reported.
 
    * *note Language Features::, contains information about library
-     support for standard parts of the C language, including things
-     like the `sizeof' operator and the symbolic constant `NULL', how
-     to write functions accepting variable numbers of arguments, and
+     support for standard parts of the C language, including things like
+     the 'sizeof' operator and the symbolic constant 'NULL', how to
+     write functions accepting variable numbers of arguments, and
      constants describing the ranges and other properties of the
      numerical types.  There is also a simple debugging mechanism which
      allows you to put assertions in your code, and have diagnostic
@@ -4369,7 +4359,7 @@
      instead, and manipulate it via pointers.
 
    * *note Character Handling::, contains information about character
-     classification functions (such as `isspace') and functions for
+     classification functions (such as 'isspace') and functions for
      performing case conversion.
 
    * *note String and Array Utilities::, has descriptions of functions
@@ -4382,30 +4372,30 @@
      concepts such as file names.
 
    * *note I/O on Streams::, describes I/O operations involving streams
-     (or `FILE *' objects).  These are the normal C library functions
-     from `stdio.h'.
+     (or 'FILE *' objects).  These are the normal C library functions
+     from 'stdio.h'.
 
-   * *note Low-Level I/O::, contains information about I/O operations
-     on file descriptors.  File descriptors are a lower-level mechanism
+   * *note Low-Level I/O::, contains information about I/O operations on
+     file descriptors.  File descriptors are a lower-level mechanism
      specific to the Unix family of operating systems.
 
    * *note File System Interface::, has descriptions of operations on
      entire files, such as functions for deleting and renaming them and
      for creating new directories.  This chapter also contains
-     information about how you can access the attributes of a file,
-     such as its owner and file protection modes.
+     information about how you can access the attributes of a file, such
+     as its owner and file protection modes.
 
    * *note Pipes and FIFOs::, contains information about simple
      interprocess communication mechanisms.  Pipes allow communication
-     between two related processes (such as between a parent and
-     child), while FIFOs allow communication between processes sharing
-     a common file system on the same machine.
+     between two related processes (such as between a parent and child),
+     while FIFOs allow communication between processes sharing a common
+     file system on the same machine.
 
    * *note Sockets::, describes a more complicated interprocess
      communication mechanism that allows processes running on different
-     machines to communicate over a network.  This chapter also
-     contains information about Internet host addressing and how to use
-     the system network databases.
+     machines to communicate over a network.  This chapter also contains
+     information about Internet host addressing and how to use the
+     system network databases.
 
    * *note Low-Level Terminal Interface::, describes how you can change
      the attributes of a terminal device.  If you want to disable echo
@@ -4417,8 +4407,8 @@
      and exponential functions on floating-point numbers.
 
    * *note Low-Level Arithmetic Functions: Arithmetic, describes
-     functions for simple arithmetic, analysis of floating-point
-     values, and reading numbers from strings.
+     functions for simple arithmetic, analysis of floating-point values,
+     and reading numbers from strings.
 
    * *note Searching and Sorting::, contains information about functions
      for searching and sorting arrays.  You can use these functions on
@@ -4429,21 +4419,21 @@
      as the shell does.
 
    * *note Date and Time::, describes functions for measuring both
-     calendar time and CPU time, as well as functions for setting
-     alarms and timers.
+     calendar time and CPU time, as well as functions for setting alarms
+     and timers.
 
    * *note Character Set Handling::, contains information about
      manipulating characters and strings using character sets larger
-     than will fit in the usual `char' data type.
+     than will fit in the usual 'char' data type.
 
    * *note Locales::, describes how selecting a particular country or
      language affects the behavior of the library.  For example, the
      locale affects collation sequences for strings and how monetary
      values are formatted.
 
-   * *note Non-Local Exits::, contains descriptions of the `setjmp' and
-     `longjmp' functions.  These functions provide a facility for
-     `goto'-like jumps which can jump from one function to another.
+   * *note Non-Local Exits::, contains descriptions of the 'setjmp' and
+     'longjmp' functions.  These functions provide a facility for
+     'goto'-like jumps which can jump from one function to another.
 
    * *note Signal Handling::, tells you all about signals--what they
      are, how to establish a handler that is called when a particular
@@ -4474,9 +4464,9 @@
      getting information about the hardware and software configuration
      your program is executing under.
 
-   * *note System Configuration::, tells you how you can get
-     information about various operating system limits.  Most of these
-     parameters are provided for compatibility with POSIX.
+   * *note System Configuration::, tells you how you can get information
+     about various operating system limits.  Most of these parameters
+     are provided for compatibility with POSIX.
 
    * *note Library Summary::, gives a summary of all the functions,
      variables, and macros in the library, with complete data types and
@@ -4490,12 +4480,12 @@
      library to a new system.
 
    If you already know the name of the facility you are interested in,
-you can look it up in *note Library Summary::.  This gives you a
-summary of its syntax and a pointer to where you can find a more
-detailed description.  This appendix is particularly useful if you just
-want to verify the order and type of arguments to a function, for
-example.  It also tells you what standard or system each function,
-variable, or macro is derived from.
+you can look it up in *note Library Summary::.  This gives you a summary
+of its syntax and a pointer to where you can find a more detailed
+description.  This appendix is particularly useful if you just want to
+verify the order and type of arguments to a function, for example.  It
+also tells you what standard or system each function, variable, or macro
+is derived from.
 
 
 File: libc.info,  Node: Error Reporting,  Next: Memory,  Prev: Introduction,  Up: Top
@@ -4510,7 +4500,7 @@
 other appropriate action if the call to the library function failed.
 
    This chapter describes how the error reporting facility works.  Your
-program should include the header file `errno.h' to use this facility.  
+program should include the header file 'errno.h' to use this facility.
 
 * Menu:
 
@@ -4526,77 +4516,77 @@
 =======================
 
 Most library functions return a special value to indicate that they have
-failed.  The special value is typically `-1', a null pointer, or a
-constant such as `EOF' that is defined for that purpose.  But this
+failed.  The special value is typically '-1', a null pointer, or a
+constant such as 'EOF' that is defined for that purpose.  But this
 return value tells you only that an error has occurred.  To find out
 what kind of error it was, you need to look at the error code stored in
-the variable `errno'.  This variable is declared in the header file
-`errno.h'.  
+the variable 'errno'.  This variable is declared in the header file
+'errno.h'.
 
  -- Variable: volatile int errno
-     The variable `errno' contains the system error number.  You can
-     change the value of `errno'.
+     The variable 'errno' contains the system error number.  You can
+     change the value of 'errno'.
 
-     Since `errno' is declared `volatile', it might be changed
+     Since 'errno' is declared 'volatile', it might be changed
      asynchronously by a signal handler; see *note Defining Handlers::.
      However, a properly written signal handler saves and restores the
-     value of `errno', so you generally do not need to worry about this
+     value of 'errno', so you generally do not need to worry about this
      possibility except when writing signal handlers.
 
-     The initial value of `errno' at program startup is zero.  Many
+     The initial value of 'errno' at program startup is zero.  Many
      library functions are guaranteed to set it to certain nonzero
      values when they encounter certain kinds of errors.  These error
      conditions are listed for each function.  These functions do not
-     change `errno' when they succeed; thus, the value of `errno' after
+     change 'errno' when they succeed; thus, the value of 'errno' after
      a successful call is not necessarily zero, and you should not use
-     `errno' to determine _whether_ a call failed.  The proper way to
-     do that is documented for each function.  _If_ the call failed,
-     you can examine `errno'.
+     'errno' to determine _whether_ a call failed.  The proper way to do
+     that is documented for each function.  _If_ the call failed, you
+     can examine 'errno'.
 
-     Many library functions can set `errno' to a nonzero value as a
+     Many library functions can set 'errno' to a nonzero value as a
      result of calling other library functions which might fail.  You
-     should assume that any library function might alter `errno' when
+     should assume that any library function might alter 'errno' when
      the function returns an error.
 
-     *Portability Note:* ISO C specifies `errno' as a "modifiable
+     *Portability Note:* ISO C specifies 'errno' as a "modifiable
      lvalue" rather than as a variable, permitting it to be implemented
      as a macro.  For example, its expansion might involve a function
-     call, like `*__errno_location ()'.  In fact, that is what it is on
-     GNU/Linux and GNU/Hurd systems.  The GNU C Library, on each
-     system, does whatever is right for the particular system.
+     call, like '*__errno_location ()'.  In fact, that is what it is on
+     GNU/Linux and GNU/Hurd systems.  The GNU C Library, on each system,
+     does whatever is right for the particular system.
 
-     There are a few library functions, like `sqrt' and `atan', that
+     There are a few library functions, like 'sqrt' and 'atan', that
      return a perfectly legitimate value in case of an error, but also
-     set `errno'.  For these functions, if you want to check to see
-     whether an error occurred, the recommended method is to set `errno'
+     set 'errno'.  For these functions, if you want to check to see
+     whether an error occurred, the recommended method is to set 'errno'
      to zero before calling the function, and then check its value
      afterward.
 
    All the error codes have symbolic names; they are macros defined in
-`errno.h'.  The names start with `E' and an upper-case letter or digit;
+'errno.h'.  The names start with 'E' and an upper-case letter or digit;
 you should consider names of this form to be reserved names.  *Note
 Reserved Names::.
 
    The error code values are all positive integers and are all distinct,
-with one exception: `EWOULDBLOCK' and `EAGAIN' are the same.  Since the
-values are distinct, you can use them as labels in a `switch'
-statement; just don't use both `EWOULDBLOCK' and `EAGAIN'.  Your
-program should not make any other assumptions about the specific values
-of these symbolic constants.
+with one exception: 'EWOULDBLOCK' and 'EAGAIN' are the same.  Since the
+values are distinct, you can use them as labels in a 'switch' statement;
+just don't use both 'EWOULDBLOCK' and 'EAGAIN'.  Your program should not
+make any other assumptions about the specific values of these symbolic
+constants.
 
-   The value of `errno' doesn't necessarily have to correspond to any
-of these macros, since some library functions might return other error
+   The value of 'errno' doesn't necessarily have to correspond to any of
+these macros, since some library functions might return other error
 codes of their own for other situations.  The only values that are
 guaranteed to be meaningful for a particular library function are the
 ones that this manual lists for that function.
 
    Except on GNU/Hurd systems, almost any system call can return
-`EFAULT' if it is given an invalid pointer as an argument.  Since this
+'EFAULT' if it is given an invalid pointer as an argument.  Since this
 could only happen as a result of a bug in your program, and since it
 will not happen on GNU/Hurd systems, we have saved space by not
-mentioning `EFAULT' in the descriptions of individual functions.
+mentioning 'EFAULT' in the descriptions of individual functions.
 
-   In some Unix systems, many system calls can also return `EFAULT' if
+   In some Unix systems, many system calls can also return 'EFAULT' if
 given as an argument a pointer into the stack, and the kernel for some
 obscure reason fails in its attempt to extend the stack.  If this ever
 happens, you should probably try using statically or dynamically
@@ -4608,7 +4598,7 @@
 2.2 Error Codes
 ===============
 
-The error code macros are defined in the header file `errno.h'.  All of
+The error code macros are defined in the header file 'errno.h'.  All of
 them expand into integer constant values.  Some of these error codes
 can't occur on GNU systems, but they can occur using the GNU C Library
 on other systems.
@@ -4632,7 +4622,7 @@
      try the call again.
 
      You can choose to have functions resume after a signal that is
-     handled, rather than failing with `EINTR'; see *note Interrupted
+     handled, rather than failing with 'EINTR'; see *note Interrupted
      Primitives::.
 
  -- Macro: int EIO
@@ -4647,13 +4637,13 @@
 
  -- Macro: int E2BIG
      Argument list too long; used when the arguments passed to a new
-     program being executed with one of the `exec' functions (*note
+     program being executed with one of the 'exec' functions (*note
      Executing a File::) occupy too much memory space.  This condition
      never arises on GNU/Hurd systems.
 
  -- Macro: int ENOEXEC
      Invalid executable file format.  This condition is detected by the
-     `exec' functions; see *note Executing a File::.
+     'exec' functions; see *note Executing a File::.
 
  -- Macro: int EBADF
      Bad file descriptor; for example, I/O on a descriptor that has been
@@ -4681,8 +4671,8 @@
      operation.
 
  -- Macro: int EFAULT
-     Bad address; an invalid pointer was detected.  On GNU/Hurd
-     systems, this error never happens; you get a signal instead.
+     Bad address; an invalid pointer was detected.  On GNU/Hurd systems,
+     this error never happens; you get a signal instead.
 
  -- Macro: int ENOTBLK
      A file that isn't a block special file was given in a situation
@@ -4690,9 +4680,9 @@
      as a file system in Unix gives this error.
 
  -- Macro: int EBUSY
-     Resource busy; a system resource that can't be shared is already
-     in use.  For example, if you try to delete a file that is the root
-     of a currently mounted filesystem, you get this error.
+     Resource busy; a system resource that can't be shared is already in
+     use.  For example, if you try to delete a file that is the root of
+     a currently mounted filesystem, you get this error.
 
  -- Macro: int EEXIST
      File exists; an existing file was specified in a context where it
@@ -4700,8 +4690,8 @@
 
  -- Macro: int EXDEV
      An attempt to make an improper link across file systems was
-     detected.  This happens not only when you use `link' (*note Hard
-     Links::) but also when you rename a file with `rename' (*note
+     detected.  This happens not only when you use 'link' (*note Hard
+     Links::) but also when you rename a file with 'rename' (*note
      Renaming Files::).
 
  -- Macro: int ENODEV
@@ -4726,8 +4716,8 @@
 
      In BSD and GNU, the number of open files is controlled by a
      resource limit that can usually be increased.  If you get this
-     error, you might want to increase the `RLIMIT_NOFILE' limit or
-     make it unlimited; *note Limits on Resources::.
+     error, you might want to increase the 'RLIMIT_NOFILE' limit or make
+     it unlimited; *note Limits on Resources::.
 
  -- Macro: int ENFILE
      There are too many distinct file openings in the entire system.
@@ -4743,9 +4733,9 @@
      An attempt to execute a file that is currently open for writing, or
      write to a file that is currently being executed.  Often using a
      debugger to run a program is considered having it open for writing
-     and will cause this error.  (The name stands for "text file
-     busy".)  This is not an error on GNU/Hurd systems; the text is
-     copied as necessary.
+     and will cause this error.  (The name stands for "text file busy".)
+     This is not an error on GNU/Hurd systems; the text is copied as
+     necessary.
 
  -- Macro: int EFBIG
      File too big; the size of a file would be larger than allowed by
@@ -4763,20 +4753,19 @@
 
  -- Macro: int EMLINK
      Too many links; the link count of a single file would become too
-     large.  `rename' can cause this error if the file being renamed
+     large.  'rename' can cause this error if the file being renamed
      already has as many links as it can take (*note Renaming Files::).
 
  -- Macro: int EPIPE
      Broken pipe; there is no process reading from the other end of a
      pipe.  Every library function that returns this error code also
-     generates a `SIGPIPE' signal; this signal terminates the program
-     if not handled or blocked.  Thus, your program will never actually
-     see `EPIPE' unless it has handled or blocked `SIGPIPE'.
+     generates a 'SIGPIPE' signal; this signal terminates the program if
+     not handled or blocked.  Thus, your program will never actually see
+     'EPIPE' unless it has handled or blocked 'SIGPIPE'.
 
  -- Macro: int EDOM
-     Domain error; used by mathematical functions when an argument
-     value does not fall into the domain over which the function is
-     defined.
+     Domain error; used by mathematical functions when an argument value
+     does not fall into the domain over which the function is defined.
 
  -- Macro: int ERANGE
      Range error; used by mathematical functions when the result value
@@ -4784,7 +4773,7 @@
 
  -- Macro: int EAGAIN
      Resource temporarily unavailable; the call might work if you try
-     again later.  The macro `EWOULDBLOCK' is another name for `EAGAIN';
+     again later.  The macro 'EWOULDBLOCK' is another name for 'EAGAIN';
      they are always the same in the GNU C Library.
 
      This error can happen in a few different situations:
@@ -4793,39 +4782,39 @@
           has non-blocking mode selected.  Trying the same operation
           again will block until some external condition makes it
           possible to read, write, or connect (whatever the operation).
-          You can use `select' to find out when the operation will be
+          You can use 'select' to find out when the operation will be
           possible; *note Waiting for I/O::.
 
           *Portability Note:* In many older Unix systems, this condition
-          was indicated by `EWOULDBLOCK', which was a distinct error
-          code different from `EAGAIN'.  To make your program portable,
+          was indicated by 'EWOULDBLOCK', which was a distinct error
+          code different from 'EAGAIN'.  To make your program portable,
           you should check for both codes and treat them the same.
 
         * A temporary resource shortage made an operation impossible.
-          `fork' can return this error.  It indicates that the shortage
+          'fork' can return this error.  It indicates that the shortage
           is expected to pass, so your program can try the call again
-          later and it may succeed.  It is probably a good idea to
-          delay for a few seconds before trying it again, to allow time
-          for other processes to release scarce resources.  Such
-          shortages are usually fairly serious and affect the whole
-          system, so usually an interactive program should report the
-          error to the user and return to its command loop.
+          later and it may succeed.  It is probably a good idea to delay
+          for a few seconds before trying it again, to allow time for
+          other processes to release scarce resources.  Such shortages
+          are usually fairly serious and affect the whole system, so
+          usually an interactive program should report the error to the
+          user and return to its command loop.
 
  -- Macro: int EWOULDBLOCK
-     In the GNU C Library, this is another name for `EAGAIN' (above).
+     In the GNU C Library, this is another name for 'EAGAIN' (above).
      The values are always the same, on every operating system.
 
-     C libraries in many older Unix systems have `EWOULDBLOCK' as a
+     C libraries in many older Unix systems have 'EWOULDBLOCK' as a
      separate error code.
 
  -- Macro: int EINPROGRESS
      An operation that cannot complete immediately was initiated on an
      object that has non-blocking mode selected.  Some functions that
-     must always block (such as `connect'; *note Connecting::) never
-     return `EAGAIN'.  Instead, they return `EINPROGRESS' to indicate
+     must always block (such as 'connect'; *note Connecting::) never
+     return 'EAGAIN'.  Instead, they return 'EINPROGRESS' to indicate
      that the operation has begun and will take some time.  Attempts to
-     manipulate the object before the call completes return `EALREADY'.
-     You can use the `select' function to find out when the pending
+     manipulate the object before the call completes return 'EALREADY'.
+     You can use the 'select' function to find out when the pending
      operation has completed; *note Waiting for I/O::.
 
  -- Macro: int EALREADY
@@ -4858,11 +4847,11 @@
 
  -- Macro: int EOPNOTSUPP
      The operation you requested is not supported.  Some socket
-     functions don't make sense for all types of sockets, and others
-     may not be implemented for all communications protocols.  On
-     GNU/Hurd systems, this error can happen for many calls when the
-     object does not support the particular operation; it is a generic
-     indication that the server knows nothing to do for that call.
+     functions don't make sense for all types of sockets, and others may
+     not be implemented for all communications protocols.  On GNU/Hurd
+     systems, this error can happen for many calls when the object does
+     not support the particular operation; it is a generic indication
+     that the server knows nothing to do for that call.
 
  -- Macro: int EPFNOSUPPORT
      The socket communications protocol family you requested is not
@@ -4902,7 +4891,7 @@
 
  -- Macro: int ENOBUFS
      The kernel's buffers for I/O operations are all in use.  In GNU,
-     this error is always synonymous with `ENOMEM'; you may get one or
+     this error is always synonymous with 'ENOMEM'; you may get one or
      the other from network operations.
 
  -- Macro: int EISCONN
@@ -4913,13 +4902,13 @@
      The socket is not connected to anything.  You get this error when
      you try to transmit data over a socket, without first specifying a
      destination for the data.  For a connectionless socket (for
-     datagram protocols, such as UDP), you get `EDESTADDRREQ' instead.
+     datagram protocols, such as UDP), you get 'EDESTADDRREQ' instead.
 
  -- Macro: int EDESTADDRREQ
      No default destination address was set for the socket.  You get
      this error when you try to transmit data over a connectionless
      socket, without first specifying a destination for the data with
-     `connect'.
+     'connect'.
 
  -- Macro: int ESHUTDOWN
      The socket has already been shut down.
@@ -4940,8 +4929,8 @@
      file name.  This often indicates a cycle of symbolic links.
 
  -- Macro: int ENAMETOOLONG
-     Filename too long (longer than `PATH_MAX'; *note Limits for
-     Files::) or host name too long (in `gethostname' or `sethostname';
+     Filename too long (longer than 'PATH_MAX'; *note Limits for
+     Files::) or host name too long (in 'gethostname' or 'sethostname';
      *note Host Identification::).
 
  -- Macro: int EHOSTDOWN
@@ -4957,9 +4946,9 @@
      directory.
 
  -- Macro: int EPROCLIM
-     This means that the per-user limit on new process would be
-     exceeded by an attempted `fork'.  *Note Limits on Resources::, for
-     details on the `RLIMIT_NPROC' limit.
+     This means that the per-user limit on new process would be exceeded
+     by an attempted 'fork'.  *Note Limits on Resources::, for details
+     on the 'RLIMIT_NPROC' limit.
 
  -- Macro: int EUSERS
      The file quota system is confused because there are too many users.
@@ -4976,9 +4965,9 @@
 
  -- Macro: int EREMOTE
      An attempt was made to NFS-mount a remote file system with a file
-     name that already specifies an NFS-mounted file.  (This is an
-     error on some operating systems, but we expect it to work properly
-     on GNU/Hurd systems, making this error code impossible.)
+     name that already specifies an NFS-mounted file.  (This is an error
+     on some operating systems, but we expect it to work properly on
+     GNU/Hurd systems, making this error code impossible.)
 
  -- Macro: int EBADRPC
      ???
@@ -5002,10 +4991,10 @@
      running another operating system.
 
  -- Macro: int EFTYPE
-     Inappropriate file type or format.  The file was the wrong type
-     for the operation, or a data file had the wrong format.
+     Inappropriate file type or format.  The file was the wrong type for
+     the operation, or a data file had the wrong format.
 
-     On some systems `chmod' returns this error if you try to set the
+     On some systems 'chmod' returns this error if you try to set the
      sticky bit on a non-directory file; *note Setting Permissions::.
 
  -- Macro: int EAUTH
@@ -5018,7 +5007,7 @@
      Function not implemented.  This indicates that the function called
      is not implemented at all, either in the C library itself or in the
      operating system.  When you get this error, you can be sure that
-     this particular function will always fail with `ENOSYS' unless you
+     this particular function will always fail with 'ENOSYS' unless you
      install a new version of the C library or the operating system.
 
  -- Macro: int ENOTSUP
@@ -5026,14 +5015,14 @@
      parameter values are valid, but the functionality they request is
      not available.  This can mean that the function does not implement
      a particular command or option value or flag bit at all.  For
-     functions that operate on some object given in a parameter, such
-     as a file descriptor or a port, it might instead mean that only
-     _that specific object_ (file descriptor, port, etc.) is unable to
+     functions that operate on some object given in a parameter, such as
+     a file descriptor or a port, it might instead mean that only _that
+     specific object_ (file descriptor, port, etc.)  is unable to
      support the other parameters given; different file descriptors
      might support different ranges of parameter values.
 
      If the entire function is not available at all in the
-     implementation, it returns `ENOSYS' instead.
+     implementation, it returns 'ENOSYS' instead.
 
  -- Macro: int EILSEQ
      While decoding a multibyte character the function came along an
@@ -5041,12 +5030,12 @@
      character is invalid.
 
  -- Macro: int EBACKGROUND
-     On GNU/Hurd systems, servers supporting the `term' protocol return
+     On GNU/Hurd systems, servers supporting the 'term' protocol return
      this error for certain operations when the caller is not in the
-     foreground process group of the terminal.  Users do not usually
-     see this error because functions such as `read' and `write'
-     translate it into a `SIGTTIN' or `SIGTTOU' signal.  *Note Job
-     Control::, for information on process groups and these signals.
+     foreground process group of the terminal.  Users do not usually see
+     this error because functions such as 'read' and 'write' translate
+     it into a 'SIGTTIN' or 'SIGTTOU' signal.  *Note Job Control::, for
+     information on process groups and these signals.
 
  -- Macro: int EDIED
      On GNU/Hurd systems, opening a file returns this error when the
@@ -5090,7 +5079,7 @@
  -- Macro: int ECANCELED
      Operation canceled; an asynchronous operation was canceled before
      it completed.  *Note Asynchronous I/O::.  When you call
-     `aio_cancel', the normal result is for the operations affected to
+     'aio_cancel', the normal result is for the operations affected to
      complete with this error; *note Cancel AIO Operations::.
 
    _The following error codes are defined by the Linux/i386 kernel.
@@ -5198,117 +5187,117 @@
 
 The library has functions and variables designed to make it easy for
 your program to report informative error messages in the customary
-format about the failure of a library call.  The functions `strerror'
-and `perror' give you the standard error message for a given error
-code; the variable `program_invocation_short_name' gives you convenient
-access to the name of the program that encountered the error.
+format about the failure of a library call.  The functions 'strerror'
+and 'perror' give you the standard error message for a given error code;
+the variable 'program_invocation_short_name' gives you convenient access
+to the name of the program that encountered the error.
 
  -- Function: char * strerror (int ERRNUM)
      Preliminary: | MT-Unsafe race:strerror | AS-Unsafe heap i18n |
      AC-Unsafe mem | *Note POSIX Safety Concepts::.
 
-     The `strerror' function maps the error code (*note Checking for
+     The 'strerror' function maps the error code (*note Checking for
      Errors::) specified by the ERRNUM argument to a descriptive error
      message string.  The return value is a pointer to this string.
 
-     The value ERRNUM normally comes from the variable `errno'.
+     The value ERRNUM normally comes from the variable 'errno'.
 
-     You should not modify the string returned by `strerror'.  Also, if
-     you make subsequent calls to `strerror', the string might be
+     You should not modify the string returned by 'strerror'.  Also, if
+     you make subsequent calls to 'strerror', the string might be
      overwritten.  (But it's guaranteed that no library function ever
-     calls `strerror' behind your back.)
+     calls 'strerror' behind your back.)
 
-     The function `strerror' is declared in `string.h'.
+     The function 'strerror' is declared in 'string.h'.
 
  -- Function: char * strerror_r (int ERRNUM, char *BUF, size_t N)
      Preliminary: | MT-Safe | AS-Unsafe i18n | AC-Unsafe | *Note POSIX
      Safety Concepts::.
 
-     The `strerror_r' function works like `strerror' but instead of
-     returning the error message in a statically allocated buffer
-     shared by all threads in the process, it returns a private copy
-     for the thread. This might be either some permanent global data or
-     a message string in the user supplied buffer starting at BUF with
-     the length of N bytes.
+     The 'strerror_r' function works like 'strerror' but instead of
+     returning the error message in a statically allocated buffer shared
+     by all threads in the process, it returns a private copy for the
+     thread.  This might be either some permanent global data or a
+     message string in the user supplied buffer starting at BUF with the
+     length of N bytes.
 
      At most N characters are written (including the NUL byte) so it is
      up to the user to select the buffer large enough.
 
      This function should always be used in multi-threaded programs
      since there is no way to guarantee the string returned by
-     `strerror' really belongs to the last call of the current thread.
+     'strerror' really belongs to the last call of the current thread.
 
-     This function `strerror_r' is a GNU extension and it is declared in
-     `string.h'.
+     This function 'strerror_r' is a GNU extension and it is declared in
+     'string.h'.
 
  -- Function: void perror (const char *MESSAGE)
      Preliminary: | MT-Safe race:stderr | AS-Unsafe corrupt i18n heap
      lock | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety
      Concepts::.
 
-     This function prints an error message to the stream `stderr'; see
-     *note Standard Streams::.  The orientation of `stderr' is not
+     This function prints an error message to the stream 'stderr'; see
+     *note Standard Streams::.  The orientation of 'stderr' is not
      changed.
 
-     If you call `perror' with a MESSAGE that is either a null pointer
-     or an empty string, `perror' just prints the error message
-     corresponding to `errno', adding a trailing newline.
+     If you call 'perror' with a MESSAGE that is either a null pointer
+     or an empty string, 'perror' just prints the error message
+     corresponding to 'errno', adding a trailing newline.
 
-     If you supply a non-null MESSAGE argument, then `perror' prefixes
-     its output with this string.  It adds a colon and a space
-     character to separate the MESSAGE from the error string
-     corresponding to `errno'.
+     If you supply a non-null MESSAGE argument, then 'perror' prefixes
+     its output with this string.  It adds a colon and a space character
+     to separate the MESSAGE from the error string corresponding to
+     'errno'.
 
-     The function `perror' is declared in `stdio.h'.
+     The function 'perror' is declared in 'stdio.h'.
 
-   `strerror' and `perror' produce the exact same message for any given
-error code; the precise text varies from system to system.  With the
-GNU C Library, the messages are fairly short; there are no multi-line
+   'strerror' and 'perror' produce the exact same message for any given
+error code; the precise text varies from system to system.  With the GNU
+C Library, the messages are fairly short; there are no multi-line
 messages or embedded newlines.  Each error message begins with a capital
 letter and does not include any terminating punctuation.
 
-   *Compatibility Note:* The `strerror' function was introduced in
+   *Compatibility Note:* The 'strerror' function was introduced in
 ISO C89.  Many older C systems do not support this function yet.
 
    Many programs that don't read input from the terminal are designed to
 exit if any system call fails.  By convention, the error message from
 such a program should start with the program's name, sans directories.
-You can find that name in the variable `program_invocation_short_name';
-the full file name is stored the variable `program_invocation_name'.
+You can find that name in the variable 'program_invocation_short_name';
+the full file name is stored the variable 'program_invocation_name'.
 
  -- Variable: char * program_invocation_name
      This variable's value is the name that was used to invoke the
      program running in the current process.  It is the same as
-     `argv[0]'.  Note that this is not necessarily a useful file name;
+     'argv[0]'.  Note that this is not necessarily a useful file name;
      often it contains no directory names.  *Note Program Arguments::.
 
  -- Variable: char * program_invocation_short_name
      This variable's value is the name that was used to invoke the
      program running in the current process, with directory names
      removed.  (That is to say, it is the same as
-     `program_invocation_name' minus everything up to the last slash,
-     if any.)
+     'program_invocation_name' minus everything up to the last slash, if
+     any.)
 
    The library initialization code sets up both of these variables
-before calling `main'.
+before calling 'main'.
 
    *Portability Note:* These two variables are GNU extensions.  If you
 want your program to work with non-GNU libraries, you must save the
-value of `argv[0]' in `main', and then strip off the directory names
+value of 'argv[0]' in 'main', and then strip off the directory names
 yourself.  We added these extensions to make it possible to write
 self-contained error-reporting subroutines that require no explicit
-cooperation from `main'.
+cooperation from 'main'.
 
    Here is an example showing how to handle failure to open a file
-correctly.  The function `open_sesame' tries to open the named file for
-reading and returns a stream if successful.  The `fopen' library
+correctly.  The function 'open_sesame' tries to open the named file for
+reading and returns a stream if successful.  The 'fopen' library
 function returns a null pointer if it couldn't open the file for some
-reason.  In that situation, `open_sesame' constructs an appropriate
-error message using the `strerror' function, and terminates the
-program.  If we were going to make some other library calls before
-passing the error code to `strerror', we'd have to save it in a local
-variable instead, because those other library functions might overwrite
-`errno' in the meantime.
+reason.  In that situation, 'open_sesame' constructs an appropriate
+error message using the 'strerror' function, and terminates the program.
+If we were going to make some other library calls before passing the
+error code to 'strerror', we'd have to save it in a local variable
+instead, because those other library functions might overwrite 'errno'
+in the meantime.
 
      #include <errno.h>
      #include <stdio.h>
@@ -5332,53 +5321,53 @@
          return stream;
      }
 
-   Using `perror' has the advantage that the function is portable and
-available on all systems implementing ISO C.  But often the text
-`perror' generates is not what is wanted and there is no way to extend
-or change what `perror' does.  The GNU coding standard, for instance,
-requires error messages to be preceded by the program name and programs
-which read some input files should provide information about the input
-file name and the line number in case an error is encountered while
-reading the file.  For these occasions there are two functions
-available which are widely used throughout the GNU project.  These
-functions are declared in `error.h'.
+   Using 'perror' has the advantage that the function is portable and
+available on all systems implementing ISO C. But often the text 'perror'
+generates is not what is wanted and there is no way to extend or change
+what 'perror' does.  The GNU coding standard, for instance, requires
+error messages to be preceded by the program name and programs which
+read some input files should provide information about the input file
+name and the line number in case an error is encountered while reading
+the file.  For these occasions there are two functions available which
+are widely used throughout the GNU project.  These functions are
+declared in 'error.h'.
 
  -- Function: void error (int STATUS, int ERRNUM, const char *FORMAT,
           ...)
      Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap i18n |
      AC-Safe | *Note POSIX Safety Concepts::.
 
-     The `error' function can be used to report general problems during
+     The 'error' function can be used to report general problems during
      program execution.  The FORMAT argument is a format string just
-     like those given to the `printf' family of functions.  The
+     like those given to the 'printf' family of functions.  The
      arguments required for the format can follow the FORMAT parameter.
-     Just like `perror', `error' also can report an error code in
-     textual form.  But unlike `perror' the error value is explicitly
+     Just like 'perror', 'error' also can report an error code in
+     textual form.  But unlike 'perror' the error value is explicitly
      passed to the function in the ERRNUM parameter.  This eliminates
      the problem mentioned above that the error reporting function must
      be called immediately after the function causing the error since
-     otherwise `errno' might have a different value.
+     otherwise 'errno' might have a different value.
 
-     The `error' prints first the program name.  If the application
-     defined a global variable `error_print_progname' and points it to a
+     The 'error' prints first the program name.  If the application
+     defined a global variable 'error_print_progname' and points it to a
      function this function will be called to print the program name.
-     Otherwise the string from the global variable `program_name' is
-     used.  The program name is followed by a colon and a space which
-     in turn is followed by the output produced by the format string.
-     If the ERRNUM parameter is non-zero the format string output is
+     Otherwise the string from the global variable 'program_name' is
+     used.  The program name is followed by a colon and a space which in
+     turn is followed by the output produced by the format string.  If
+     the ERRNUM parameter is non-zero the format string output is
      followed by a colon and a space, followed by the error message for
-     the error code ERRNUM.  In any case is the output terminated with
-     a newline.
+     the error code ERRNUM.  In any case is the output terminated with a
+     newline.
 
-     The output is directed to the `stderr' stream.  If the `stderr'
+     The output is directed to the 'stderr' stream.  If the 'stderr'
      wasn't oriented before the call it will be narrow-oriented
      afterwards.
 
-     The function will return unless the STATUS parameter has a
-     non-zero value.  In this case the function will call `exit' with
-     the STATUS value for its parameter and therefore never return.  If
-     `error' returns the global variable `error_message_count' is
-     incremented by one to keep track of the number of errors reported.
+     The function will return unless the STATUS parameter has a non-zero
+     value.  In this case the function will call 'exit' with the STATUS
+     value for its parameter and therefore never return.  If 'error'
+     returns the global variable 'error_message_count' is incremented by
+     one to keep track of the number of errors reported.
 
  -- Function: void error_at_line (int STATUS, int ERRNUM, const char
           *FNAME, unsigned int LINENO, const char *FORMAT, ...)
@@ -5386,10 +5375,10 @@
      locale | AS-Unsafe corrupt heap i18n | AC-Unsafe
      corrupt/error_one_per_line | *Note POSIX Safety Concepts::.
 
-     The `error_at_line' function is very similar to the `error'
+     The 'error_at_line' function is very similar to the 'error'
      function.  The only difference are the additional parameters FNAME
      and LINENO.  The handling of the other parameters is identical to
-     that of `error' except that between the program name and the string
+     that of 'error' except that between the program name and the string
      generated by the format string additional text is inserted.
 
      Directly following the program name a colon, followed by the file
@@ -5400,40 +5389,40 @@
      error in an input file (like a programming language source code
      file etc).
 
-     If the global variable `error_one_per_line' is set to a non-zero
-     value `error_at_line' will avoid printing consecutive messages for
+     If the global variable 'error_one_per_line' is set to a non-zero
+     value 'error_at_line' will avoid printing consecutive messages for
      the same file and line.  Repetition which are not directly
      following each other are not caught.
 
-     Just like `error' this function only returned if STATUS is zero.
-     Otherwise `exit' is called with the non-zero value.  If `error'
-     returns the global variable `error_message_count' is incremented
-     by one to keep track of the number of errors reported.
+     Just like 'error' this function only returned if STATUS is zero.
+     Otherwise 'exit' is called with the non-zero value.  If 'error'
+     returns the global variable 'error_message_count' is incremented by
+     one to keep track of the number of errors reported.
 
-   As mentioned above the `error' and `error_at_line' functions can be
-customized by defining a variable named `error_print_progname'.
+   As mentioned above the 'error' and 'error_at_line' functions can be
+customized by defining a variable named 'error_print_progname'.
 
  -- Variable: void (*error_print_progname) (void)
-     If the `error_print_progname' variable is defined to a non-zero
-     value the function pointed to is called by `error' or
-     `error_at_line'.  It is expected to print the program name or do
+     If the 'error_print_progname' variable is defined to a non-zero
+     value the function pointed to is called by 'error' or
+     'error_at_line'.  It is expected to print the program name or do
      something similarly useful.
 
-     The function is expected to be print to the `stderr' stream and
+     The function is expected to be print to the 'stderr' stream and
      must be able to handle whatever orientation the stream has.
 
      The variable is global and shared by all threads.
 
  -- Variable: unsigned int error_message_count
-     The `error_message_count' variable is incremented whenever one of
-     the functions `error' or `error_at_line' returns.  The variable is
+     The 'error_message_count' variable is incremented whenever one of
+     the functions 'error' or 'error_at_line' returns.  The variable is
      global and shared by all threads.
 
  -- Variable: int error_one_per_line
-     The `error_one_per_line' variable influences only `error_at_line'.
-     Normally the `error_at_line' function creates output for every
-     invocation.  If `error_one_per_line' is set to a non-zero value
-     `error_at_line' keeps track of the last file name and line number
+     The 'error_one_per_line' variable influences only 'error_at_line'.
+     Normally the 'error_at_line' function creates output for every
+     invocation.  If 'error_one_per_line' is set to a non-zero value
+     'error_at_line' keeps track of the last file name and line number
      for which an error was reported and avoid directly following
      messages for the same file and line.  This variable is global and
      shared by all threads.
@@ -5467,82 +5456,82 @@
          error (EXIT_FAILURE, 0, "%u errors found", error_message_count);
      }
 
-   `error' and `error_at_line' are clearly the functions of choice and
+   'error' and 'error_at_line' are clearly the functions of choice and
 enable the programmer to write applications which follow the GNU coding
 standard.  The GNU C Library additionally contains functions which are
 used in BSD for the same purpose.  These functions are declared in
-`err.h'.  It is generally advised to not use these functions.  They are
+'err.h'.  It is generally advised to not use these functions.  They are
 included only for compatibility.
 
  -- Function: void warn (const char *FORMAT, ...)
      Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap i18n |
      AC-Unsafe corrupt lock mem | *Note POSIX Safety Concepts::.
 
-     The `warn' function is roughly equivalent to a call like
+     The 'warn' function is roughly equivalent to a call like
             error (0, errno, format, the parameters)
-     except that the global variables `error' respects and modifies are
+     except that the global variables 'error' respects and modifies are
      not used.
 
  -- Function: void vwarn (const char *FORMAT, va_list AP)
      Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap i18n |
      AC-Unsafe corrupt lock mem | *Note POSIX Safety Concepts::.
 
-     The `vwarn' function is just like `warn' except that the
-     parameters for the handling of the format string FORMAT are passed
-     in as a value of type `va_list'.
+     The 'vwarn' function is just like 'warn' except that the parameters
+     for the handling of the format string FORMAT are passed in as a
+     value of type 'va_list'.
 
  -- Function: void warnx (const char *FORMAT, ...)
      Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
      corrupt lock mem | *Note POSIX Safety Concepts::.
 
-     The `warnx' function is roughly equivalent to a call like
+     The 'warnx' function is roughly equivalent to a call like
             error (0, 0, format, the parameters)
-     except that the global variables `error' respects and modifies are
-     not used.  The difference to `warn' is that no error number string
+     except that the global variables 'error' respects and modifies are
+     not used.  The difference to 'warn' is that no error number string
      is printed.
 
  -- Function: void vwarnx (const char *FORMAT, va_list AP)
      Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
      corrupt lock mem | *Note POSIX Safety Concepts::.
 
-     The `vwarnx' function is just like `warnx' except that the
+     The 'vwarnx' function is just like 'warnx' except that the
      parameters for the handling of the format string FORMAT are passed
-     in as a value of type `va_list'.
+     in as a value of type 'va_list'.
 
  -- Function: void err (int STATUS, const char *FORMAT, ...)
      Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap i18n |
      AC-Unsafe corrupt lock mem | *Note POSIX Safety Concepts::.
 
-     The `err' function is roughly equivalent to a call like
+     The 'err' function is roughly equivalent to a call like
             error (status, errno, format, the parameters)
-     except that the global variables `error' respects and modifies are
+     except that the global variables 'error' respects and modifies are
      not used and that the program is exited even if STATUS is zero.
 
  -- Function: void verr (int STATUS, const char *FORMAT, va_list AP)
      Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap i18n |
      AC-Unsafe corrupt lock mem | *Note POSIX Safety Concepts::.
 
-     The `verr' function is just like `err' except that the parameters
+     The 'verr' function is just like 'err' except that the parameters
      for the handling of the format string FORMAT are passed in as a
-     value of type `va_list'.
+     value of type 'va_list'.
 
  -- Function: void errx (int STATUS, const char *FORMAT, ...)
      Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
      corrupt lock mem | *Note POSIX Safety Concepts::.
 
-     The `errx' function is roughly equivalent to a call like
+     The 'errx' function is roughly equivalent to a call like
             error (status, 0, format, the parameters)
-     except that the global variables `error' respects and modifies are
+     except that the global variables 'error' respects and modifies are
      not used and that the program is exited even if STATUS is zero.
-     The difference to `err' is that no error number string is printed.
+     The difference to 'err' is that no error number string is printed.
 
  -- Function: void verrx (int STATUS, const char *FORMAT, va_list AP)
      Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
      corrupt lock mem | *Note POSIX Safety Concepts::.
 
-     The `verrx' function is just like `errx' except that the
-     parameters for the handling of the format string FORMAT are passed
-     in as a value of type `va_list'.
+     The 'verrx' function is just like 'errx' except that the parameters
+     for the handling of the format string FORMAT are passed in as a
+     value of type 'va_list'.
 
 
 File: libc.info,  Node: Memory,  Next: Character Handling,  Prev: Error Reporting,  Up: Top
@@ -5562,7 +5551,7 @@
 
 * Memory Concepts::             An introduction to concepts and terminology.
 * Memory Allocation::           Allocating storage for your program data
-* Resizing the Data Segment::   `brk', `sbrk'
+* Resizing the Data Segment::   'brk', 'sbrk'
 * Locking Pages::               Preventing page faults
 
    Memory mapped I/O is not discussed in this chapter.  *Note
@@ -5586,14 +5575,14 @@
 "frame") or some secondary storage, usually disk space.  The disk space
 might be swap space or just some ordinary disk file.  Actually, a page
 of all zeroes sometimes has nothing at all backing it - there's just a
-flag saying it is all zeroes.  
+flag saying it is all zeroes.
 
    The same frame of real memory or backing store can back multiple
 virtual pages belonging to multiple processes.  This is normally the
 case, for example, with virtual memory occupied by GNU C Library code.
-The same real memory frame containing the `printf' function backs a
+The same real memory frame containing the 'printf' function backs a
 virtual memory page in each of the existing processes that has a
-`printf' call in its program.
+'printf' call in its program.
 
    In order for a program to access any part of a virtual page, the page
 must at that moment be backed by ("connected to") a real frame.  But
@@ -5613,7 +5602,7 @@
 time of an instruction that would normally be a few nanoseconds is
 suddenly much, much, longer (because the kernel normally has to do I/O
 to complete the page-in).  For programs sensitive to that, the functions
-described in *note Locking Pages:: can control it.  
+described in *note Locking Pages:: can control it.
 
    Within each virtual address space, a process has to keep track of
 what is at which addresses, and that process is called memory
@@ -5629,13 +5618,13 @@
 
    Exec is the operation of creating a virtual address space for a
 process, loading its basic program into it, and executing the program.
-It is done by the "exec" family of functions (e.g. `execl').  The
+It is done by the "exec" family of functions (e.g.  'execl').  The
 operation takes a program file (an executable), it allocates space to
 load all the data in the executable, loads it, and transfers control to
 it.  That data is most notably the instructions of the program (the
 "text"), but also literals and constants in the program and even some
 variables: C variables with the static storage class (*note Memory
-Allocation and C::).  
+Allocation and C::).
 
    Once that program begins to execute, it uses programmatic allocation
 to gain additional memory.  In a C program with the GNU C Library, there
@@ -5646,25 +5635,26 @@
 allocation.  Mapping memory to a file means declaring that the contents
 of certain range of a process' addresses shall be identical to the
 contents of a specified regular file.  The system makes the virtual
-memory initially contain the contents of the file, and if you modify
-the memory, the system writes the same modification to the file.  Note
-that due to the magic of virtual memory and page faults, there is no
-reason for the system to do I/O to read the file, or allocate real
-memory for its contents, until the program accesses the virtual memory.
-*Note Memory-mapped I/O::.  
+memory initially contain the contents of the file, and if you modify the
+memory, the system writes the same modification to the file.  Note that
+due to the magic of virtual memory and page faults, there is no reason
+for the system to do I/O to read the file, or allocate real memory for
+its contents, until the program accesses the virtual memory.  *Note
+Memory-mapped I/O::.
 
    Just as it programmatically allocates memory, the program can
-programmatically deallocate ("free") it.  You can't free the memory
-that was allocated by exec.  When the program exits or execs, you might
-say that all its memory gets freed, but since in both cases the address
+programmatically deallocate ("free") it.  You can't free the memory that
+was allocated by exec.  When the program exits or execs, you might say
+that all its memory gets freed, but since in both cases the address
 space ceases to exist, the point is really moot.  *Note Program
-Termination::.  
+Termination::.
 
-   A process' virtual address space is divided into segments.  A
-segment is a contiguous range of virtual addresses.  Three important
-segments are:
+   A process' virtual address space is divided into segments.  A segment
+is a contiguous range of virtual addresses.  Three important segments
+are:
 
-   *  The "text segment" contains a program's instructions and literals
+   * 
+     The "text segment" contains a program's instructions and literals
      and static constants.  It is allocated by exec and stays the same
      size for the life of the virtual address space.
 
@@ -5676,7 +5666,6 @@
    * The "stack segment" contains a program stack.  It grows as the
      stack grows, but doesn't shrink when the stack shrinks.
 
-
 
 File: libc.info,  Node: Memory Allocation,  Next: Resizing the Data Segment,  Prev: Memory Concepts,  Up: Memory
 
@@ -5684,13 +5673,13 @@
 =======================================
 
 This section covers how ordinary programs manage storage for their data,
-including the famous `malloc' function and some fancier facilities
+including the famous 'malloc' function and some fancier facilities
 special the GNU C Library and GNU Compiler.
 
 * Menu:
 
 * Memory Allocation and C::     How to get different kinds of allocation in C.
-* Unconstrained Allocation::    The `malloc' facility allows fully general
+* Unconstrained Allocation::    The 'malloc' facility allows fully general
 		 		 dynamic allocation.
 * Allocation Debugging::        Finding memory leaks and not freed memory.
 * Obstacks::                    Obstacks are less general than malloc
@@ -5712,20 +5701,20 @@
      global variable.  Each static or global variable defines one block
      of space, of a fixed size.  The space is allocated once, when your
      program is started (part of the exec operation), and is never
-     freed.  
+     freed.
 
    * "Automatic allocation" happens when you declare an automatic
      variable, such as a function argument or a local variable.  The
      space for an automatic variable is allocated when the compound
      statement containing the declaration is entered, and is freed when
-     that compound statement is exited.  
+     that compound statement is exited.
 
      In GNU C, the size of the automatic storage can be an expression
      that varies.  In other C implementations, it must be a constant.
 
-   A third important kind of memory allocation, "dynamic allocation",
-is not supported by C variables but is available via GNU C Library
-functions.  
+   A third important kind of memory allocation, "dynamic allocation", is
+not supported by C variables but is available via GNU C Library
+functions.
 
 3.2.1.1 Dynamic Memory Allocation
 .................................
@@ -5753,8 +5742,8 @@
 as you want.
 
    Dynamic allocation is not supported by C variables; there is no
-storage class "dynamic", and there can never be a C variable whose
-value is stored in dynamically allocated space.  The only way to get
+storage class "dynamic", and there can never be a C variable whose value
+is stored in dynamically allocated space.  The only way to get
 dynamically allocated memory is via a system call (which is generally
 via a GNU C Library function call), and the only way to refer to
 dynamically allocated space is through a pointer.  Because it is less
@@ -5763,11 +5752,11 @@
 allocation only when neither static nor automatic allocation will serve.
 
    For example, if you want to allocate dynamically some space to hold a
-`struct foobar', you cannot declare a variable of type `struct foobar'
-whose contents are the dynamically allocated space.  But you can
-declare a variable of pointer type `struct foobar *' and assign it the
-address of the space.  Then you can use the operators `*' and `->' on
-this pointer variable to refer to the contents of the space:
+'struct foobar', you cannot declare a variable of type 'struct foobar'
+whose contents are the dynamically allocated space.  But you can declare
+a variable of pointer type 'struct foobar *' and assign it the address
+of the space.  Then you can use the operators '*' and '->' on this
+pointer variable to refer to the contents of the space:
 
      {
        struct foobar *ptr
@@ -5783,32 +5772,32 @@
 3.2.2 Unconstrained Allocation
 ------------------------------
 
-The most general dynamic allocation facility is `malloc'.  It allows
-you to allocate blocks of memory of any size at any time, make them
-bigger or smaller at any time, and free the blocks individually at any
-time (or never).
+The most general dynamic allocation facility is 'malloc'.  It allows you
+to allocate blocks of memory of any size at any time, make them bigger
+or smaller at any time, and free the blocks individually at any time (or
+never).
 
 * Menu:
 
-* Basic Allocation::            Simple use of `malloc'.
-* Malloc Examples::             Examples of `malloc'.  `xmalloc'.
-* Freeing after Malloc::        Use `free' to free a block you
-				 got with `malloc'.
-* Changing Block Size::         Use `realloc' to make a block
+* Basic Allocation::            Simple use of 'malloc'.
+* Malloc Examples::             Examples of 'malloc'.  'xmalloc'.
+* Freeing after Malloc::        Use 'free' to free a block you
+				 got with 'malloc'.
+* Changing Block Size::         Use 'realloc' to make a block
 				 bigger or smaller.
-* Allocating Cleared Space::    Use `calloc' to allocate a
+* Allocating Cleared Space::    Use 'calloc' to allocate a
 				 block and clear it.
 * Efficiency and Malloc::       Efficiency considerations in use of
 				 these functions.
 * Aligned Memory Blocks::       Allocating specially aligned memory.
-* Malloc Tunable Parameters::   Use `mallopt' to adjust allocation
+* Malloc Tunable Parameters::   Use 'mallopt' to adjust allocation
                                  parameters.
 * Heap Consistency Checking::   Automatic checking for errors.
 * Hooks for Malloc::            You can use these hooks for debugging
-				 programs that use `malloc'.
+				 programs that use 'malloc'.
 * Statistics of Malloc::        Getting information about how much
 				 memory your program is using.
-* Summary of Malloc::           Summary of `malloc' and related functions.
+* Summary of Malloc::           Summary of 'malloc' and related functions.
 
 
 File: libc.info,  Node: Basic Allocation,  Next: Malloc Examples,  Up: Unconstrained Allocation
@@ -5816,8 +5805,8 @@
 3.2.2.1 Basic Memory Allocation
 ...............................
 
-To allocate a block of memory, call `malloc'.  The prototype for this
-function is in `stdlib.h'.  
+To allocate a block of memory, call 'malloc'.  The prototype for this
+function is in 'stdlib.h'.
 
  -- Function: void * malloc (size_t SIZE)
      Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock fd mem |
@@ -5827,11 +5816,11 @@
      bytes long, or a null pointer if the block could not be allocated.
 
    The contents of the block are undefined; you must initialize it
-yourself (or use `calloc' instead; *note Allocating Cleared Space::).
+yourself (or use 'calloc' instead; *note Allocating Cleared Space::).
 Normally you would cast the value as a pointer to the kind of object
 that you want to store in the block.  Here we show an example of doing
 so, and of initializing the space with zeros using the library function
-`memset' (*note Copying and Concatenation::):
+'memset' (*note Copying and Concatenation::):
 
      struct foo *ptr;
      ...
@@ -5839,14 +5828,14 @@
      if (ptr == 0) abort ();
      memset (ptr, 0, sizeof (struct foo));
 
-   You can store the result of `malloc' into any pointer variable
-without a cast, because ISO C automatically converts the type `void *'
-to another type of pointer when necessary.  But the cast is necessary
-in contexts other than assignment operators or if you might want your
-code to run in traditional C.
+   You can store the result of 'malloc' into any pointer variable
+without a cast, because ISO C automatically converts the type 'void *'
+to another type of pointer when necessary.  But the cast is necessary in
+contexts other than assignment operators or if you might want your code
+to run in traditional C.
 
    Remember that when allocating space for a string, the argument to
-`malloc' must be one plus the length of the string.  This is because a
+'malloc' must be one plus the length of the string.  This is because a
 string is terminated with a null character that doesn't count in the
 "length" of the string but does need space.  For example:
 
@@ -5859,14 +5848,14 @@
 
 File: libc.info,  Node: Malloc Examples,  Next: Freeing after Malloc,  Prev: Basic Allocation,  Up: Unconstrained Allocation
 
-3.2.2.2 Examples of `malloc'
+3.2.2.2 Examples of 'malloc'
 ............................
 
-If no more space is available, `malloc' returns a null pointer.  You
-should check the value of _every_ call to `malloc'.  It is useful to
-write a subroutine that calls `malloc' and reports an error if the
-value is a null pointer, returning only if the value is nonzero.  This
-function is conventionally called `xmalloc'.  Here it is:
+If no more space is available, 'malloc' returns a null pointer.  You
+should check the value of _every_ call to 'malloc'.  It is useful to
+write a subroutine that calls 'malloc' and reports an error if the value
+is a null pointer, returning only if the value is nonzero.  This
+function is conventionally called 'xmalloc'.  Here it is:
 
      void *
      xmalloc (size_t size)
@@ -5877,8 +5866,8 @@
        return value;
      }
 
-   Here is a real example of using `malloc' (by way of `xmalloc').  The
-function `savestring' will copy a sequence of characters into a newly
+   Here is a real example of using 'malloc' (by way of 'xmalloc').  The
+function 'savestring' will copy a sequence of characters into a newly
 allocated null-terminated string:
 
      char *
@@ -5889,51 +5878,51 @@
        return (char *) memcpy (value, ptr, len);
      }
 
-   The block that `malloc' gives you is guaranteed to be aligned so
-that it can hold any type of data.  On GNU systems, the address is
-always a multiple of eight on 32-bit systems, and a multiple of 16 on
-64-bit systems.  Only rarely is any higher boundary (such as a page
-boundary) necessary; for those cases, use `aligned_alloc' or
-`posix_memalign' (*note Aligned Memory Blocks::).
+   The block that 'malloc' gives you is guaranteed to be aligned so that
+it can hold any type of data.  On GNU systems, the address is always a
+multiple of eight on 32-bit systems, and a multiple of 16 on 64-bit
+systems.  Only rarely is any higher boundary (such as a page boundary)
+necessary; for those cases, use 'aligned_alloc' or 'posix_memalign'
+(*note Aligned Memory Blocks::).
 
    Note that the memory located after the end of the block is likely to
 be in use for something else; perhaps a block already allocated by
-another call to `malloc'.  If you attempt to treat the block as longer
+another call to 'malloc'.  If you attempt to treat the block as longer
 than you asked for it to be, you are liable to destroy the data that
-`malloc' uses to keep track of its blocks, or you may destroy the
+'malloc' uses to keep track of its blocks, or you may destroy the
 contents of another block.  If you have already allocated a block and
-discover you want it to be bigger, use `realloc' (*note Changing Block
+discover you want it to be bigger, use 'realloc' (*note Changing Block
 Size::).
 
 
 File: libc.info,  Node: Freeing after Malloc,  Next: Changing Block Size,  Prev: Malloc Examples,  Up: Unconstrained Allocation
 
-3.2.2.3 Freeing Memory Allocated with `malloc'
+3.2.2.3 Freeing Memory Allocated with 'malloc'
 ..............................................
 
-When you no longer need a block that you got with `malloc', use the
-function `free' to make the block available to be allocated again.  The
-prototype for this function is in `stdlib.h'.  
+When you no longer need a block that you got with 'malloc', use the
+function 'free' to make the block available to be allocated again.  The
+prototype for this function is in 'stdlib.h'.
 
  -- Function: void free (void *PTR)
      Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock fd mem |
      *Note POSIX Safety Concepts::.
 
-     The `free' function deallocates the block of memory pointed at by
+     The 'free' function deallocates the block of memory pointed at by
      PTR.
 
  -- Function: void cfree (void *PTR)
      Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock fd mem |
      *Note POSIX Safety Concepts::.
 
-     This function does the same thing as `free'.  It's provided for
-     backward compatibility with SunOS; you should use `free' instead.
+     This function does the same thing as 'free'.  It's provided for
+     backward compatibility with SunOS; you should use 'free' instead.
 
    Freeing a block alters the contents of the block.  *Do not expect to
-find any data (such as a pointer to the next block in a chain of
-blocks) in the block after freeing it.*  Copy whatever you need out of
-the block before freeing it!  Here is an example of the proper way to
-free all the blocks in a chain, and the strings that they point to:
+find any data (such as a pointer to the next block in a chain of blocks)
+in the block after freeing it.*  Copy whatever you need out of the block
+before freeing it!  Here is an example of the proper way to free all the
+blocks in a chain, and the strings that they point to:
 
      struct chain
        {
@@ -5953,11 +5942,11 @@
          }
      }
 
-   Occasionally, `free' can actually return memory to the operating
+   Occasionally, 'free' can actually return memory to the operating
 system and make the process smaller.  Usually, all it can do is allow a
-later call to `malloc' to reuse the space.  In the meantime, the space
+later call to 'malloc' to reuse the space.  In the meantime, the space
 remains in your program as part of a free-list used internally by
-`malloc'.
+'malloc'.
 
    There is no point in freeing blocks at the end of a program, because
 all of the program's space is given back to the system when the process
@@ -5975,37 +5964,37 @@
 file; no matter how long you make the buffer initially, you may
 encounter a line that is longer.
 
-   You can make the block longer by calling `realloc'.  This function
-is declared in `stdlib.h'.  
+   You can make the block longer by calling 'realloc'.  This function is
+declared in 'stdlib.h'.
 
  -- Function: void * realloc (void *PTR, size_t NEWSIZE)
      Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock fd mem |
      *Note POSIX Safety Concepts::.
 
-     The `realloc' function changes the size of the block whose address
+     The 'realloc' function changes the size of the block whose address
      is PTR to be NEWSIZE.
 
-     Since the space after the end of the block may be in use, `realloc'
-     may find it necessary to copy the block to a new address where
-     more free space is available.  The value of `realloc' is the new
-     address of the block.  If the block needs to be moved, `realloc'
-     copies the old contents.
+     Since the space after the end of the block may be in use, 'realloc'
+     may find it necessary to copy the block to a new address where more
+     free space is available.  The value of 'realloc' is the new address
+     of the block.  If the block needs to be moved, 'realloc' copies the
+     old contents.
 
-     If you pass a null pointer for PTR, `realloc' behaves just like
-     `malloc (NEWSIZE)'.  This can be convenient, but beware that older
+     If you pass a null pointer for PTR, 'realloc' behaves just like
+     'malloc (NEWSIZE)'.  This can be convenient, but beware that older
      implementations (before ISO C) may not support this behavior, and
-     will probably crash when `realloc' is passed a null pointer.
+     will probably crash when 'realloc' is passed a null pointer.
 
-   Like `malloc', `realloc' may return a null pointer if no memory
-space is available to make the block bigger.  When this happens, the
-original block is untouched; it has not been modified or relocated.
+   Like 'malloc', 'realloc' may return a null pointer if no memory space
+is available to make the block bigger.  When this happens, the original
+block is untouched; it has not been modified or relocated.
 
    In most cases it makes no difference what happens to the original
-block when `realloc' fails, because the application program cannot
-continue when it is out of memory, and the only thing to do is to give
-a fatal error message.  Often it is convenient to write and use a
-subroutine, conventionally called `xrealloc', that takes care of the
-error message as `xmalloc' does for `malloc':
+block when 'realloc' fails, because the application program cannot
+continue when it is out of memory, and the only thing to do is to give a
+fatal error message.  Often it is convenient to write and use a
+subroutine, conventionally called 'xrealloc', that takes care of the
+error message as 'xmalloc' does for 'malloc':
 
      void *
      xrealloc (void *ptr, size_t size)
@@ -6016,15 +6005,14 @@
        return value;
      }
 
-   You can also use `realloc' to make a block smaller.  The reason you
+   You can also use 'realloc' to make a block smaller.  The reason you
 would do this is to avoid tying up a lot of memory space when only a
-little is needed.  In several allocation implementations, making a
-block smaller sometimes necessitates copying it, so it can fail if no
-other space is available.
+little is needed.  In several allocation implementations, making a block
+smaller sometimes necessitates copying it, so it can fail if no other
+space is available.
 
-   If the new size you specify is the same as the old size, `realloc'
-is guaranteed to change nothing and return the same address that you
-gave.
+   If the new size you specify is the same as the old size, 'realloc' is
+guaranteed to change nothing and return the same address that you gave.
 
 
 File: libc.info,  Node: Allocating Cleared Space,  Next: Efficiency and Malloc,  Prev: Changing Block Size,  Up: Unconstrained Allocation
@@ -6032,8 +6020,8 @@
 3.2.2.5 Allocating Cleared Space
 ................................
 
-The function `calloc' allocates memory and clears it to zero.  It is
-declared in `stdlib.h'.  
+The function 'calloc' allocates memory and clears it to zero.  It is
+declared in 'stdlib.h'.
 
  -- Function: void * calloc (size_t COUNT, size_t ELTSIZE)
      Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock fd mem |
@@ -6041,9 +6029,9 @@
 
      This function allocates a block long enough to contain a vector of
      COUNT elements, each of size ELTSIZE.  Its contents are cleared to
-     zero before `calloc' returns.
+     zero before 'calloc' returns.
 
-   You could define `calloc' as follows:
+   You could define 'calloc' as follows:
 
      void *
      calloc (size_t count, size_t eltsize)
@@ -6055,32 +6043,31 @@
        return value;
      }
 
-   But in general, it is not guaranteed that `calloc' calls `malloc'
+   But in general, it is not guaranteed that 'calloc' calls 'malloc'
 internally.  Therefore, if an application provides its own
-`malloc'/`realloc'/`free' outside the C library, it should always
-define `calloc', too.
+'malloc'/'realloc'/'free' outside the C library, it should always define
+'calloc', too.
 
 
 File: libc.info,  Node: Efficiency and Malloc,  Next: Aligned Memory Blocks,  Prev: Allocating Cleared Space,  Up: Unconstrained Allocation
 
-3.2.2.6 Efficiency Considerations for `malloc'
+3.2.2.6 Efficiency Considerations for 'malloc'
 ..............................................
 
-As opposed to other versions, the `malloc' in the GNU C Library does
-not round up block sizes to powers of two, neither for large nor for
-small sizes.  Neighboring chunks can be coalesced on a `free' no matter
-what their size is.  This makes the implementation suitable for all
-kinds of allocation patterns without generally incurring high memory
-waste through fragmentation.
+As opposed to other versions, the 'malloc' in the GNU C Library does not
+round up block sizes to powers of two, neither for large nor for small
+sizes.  Neighboring chunks can be coalesced on a 'free' no matter what
+their size is.  This makes the implementation suitable for all kinds of
+allocation patterns without generally incurring high memory waste
+through fragmentation.
 
-   Very large blocks (much larger than a page) are allocated with
-`mmap' (anonymous or via `/dev/zero') by this implementation.  This has
-the great advantage that these chunks are returned to the system
-immediately when they are freed.  Therefore, it cannot happen that a
-large chunk becomes "locked" in between smaller ones and even after
-calling `free' wastes memory.  The size threshold for `mmap' to be used
-can be adjusted with `mallopt'.  The use of `mmap' can also be disabled
-completely.
+   Very large blocks (much larger than a page) are allocated with 'mmap'
+(anonymous or via '/dev/zero') by this implementation.  This has the
+great advantage that these chunks are returned to the system immediately
+when they are freed.  Therefore, it cannot happen that a large chunk
+becomes "locked" in between smaller ones and even after calling 'free'
+wastes memory.  The size threshold for 'mmap' to be used can be adjusted
+with 'mallopt'.  The use of 'mmap' can also be disabled completely.
 
 
 File: libc.info,  Node: Aligned Memory Blocks,  Next: Malloc Tunable Parameters,  Prev: Efficiency and Malloc,  Up: Unconstrained Allocation
@@ -6088,92 +6075,88 @@
 3.2.2.7 Allocating Aligned Memory Blocks
 ........................................
 
-The address of a block returned by `malloc' or `realloc' in GNU systems
+The address of a block returned by 'malloc' or 'realloc' in GNU systems
 is always a multiple of eight (or sixteen on 64-bit systems).  If you
 need a block whose address is a multiple of a higher power of two than
-that, use `aligned_alloc' or `posix_memalign'.  `aligned_alloc' and
-`posix_memalign' are declared in `stdlib.h'.
+that, use 'aligned_alloc' or 'posix_memalign'.  'aligned_alloc' and
+'posix_memalign' are declared in 'stdlib.h'.
 
  -- Function: void * aligned_alloc (size_t ALIGNMENT, size_t SIZE)
      Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock fd mem |
      *Note POSIX Safety Concepts::.
 
-     The `aligned_alloc' function allocates a block of SIZE bytes whose
+     The 'aligned_alloc' function allocates a block of SIZE bytes whose
      address is a multiple of ALIGNMENT.  The ALIGNMENT must be a power
      of two and SIZE must be a multiple of ALIGNMENT.
 
-     The `aligned_alloc' function returns a null pointer on error and
-     sets `errno' to one of the following values:
+     The 'aligned_alloc' function returns a null pointer on error and
+     sets 'errno' to one of the following values:
 
-    `ENOMEM'
+     'ENOMEM'
           There was insufficient memory available to satisfy the
           request.
 
-    `EINVAL'
+     'EINVAL'
           ALIGNMENT is not a power of two.
 
           This function was introduced in ISO C11 and hence may have
           better portability to modern non-POSIX systems than
-          `posix_memalign'.
-
+          'posix_memalign'.
 
  -- Function: void * memalign (size_t BOUNDARY, size_t SIZE)
      Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock fd mem |
      *Note POSIX Safety Concepts::.
 
-     The `memalign' function allocates a block of SIZE bytes whose
-     address is a multiple of BOUNDARY.  The BOUNDARY must be a power
-     of two!  The function `memalign' works by allocating a somewhat
-     larger block, and then returning an address within the block that
-     is on the specified boundary.
+     The 'memalign' function allocates a block of SIZE bytes whose
+     address is a multiple of BOUNDARY.  The BOUNDARY must be a power of
+     two!  The function 'memalign' works by allocating a somewhat larger
+     block, and then returning an address within the block that is on
+     the specified boundary.
 
-     The `memalign' function returns a null pointer on error and sets
-     `errno' to one of the following values:
+     The 'memalign' function returns a null pointer on error and sets
+     'errno' to one of the following values:
 
-    `ENOMEM'
+     'ENOMEM'
           There was insufficient memory available to satisfy the
           request.
 
-    `EINVAL'
+     'EINVAL'
           ALIGNMENT is not a power of two.
 
-
-     The `memalign' function is obsolete and `aligned_alloc' or
-     `posix_memalign' should be used instead.
+     The 'memalign' function is obsolete and 'aligned_alloc' or
+     'posix_memalign' should be used instead.
 
  -- Function: int posix_memalign (void **MEMPTR, size_t ALIGNMENT,
           size_t SIZE)
      Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock fd mem |
      *Note POSIX Safety Concepts::.
 
-     The `posix_memalign' function is similar to the `memalign'
-     function in that it returns a buffer of SIZE bytes aligned to a
-     multiple of ALIGNMENT.  But it adds one requirement to the
-     parameter ALIGNMENT: the value must be a power of two multiple of
-     `sizeof (void *)'.
+     The 'posix_memalign' function is similar to the 'memalign' function
+     in that it returns a buffer of SIZE bytes aligned to a multiple of
+     ALIGNMENT.  But it adds one requirement to the parameter ALIGNMENT:
+     the value must be a power of two multiple of 'sizeof (void *)'.
 
      If the function succeeds in allocation memory a pointer to the
-     allocated memory is returned in `*MEMPTR' and the return value is
-     zero.  Otherwise the function returns an error value indicating
-     the problem.  The possible error values returned are:
+     allocated memory is returned in '*MEMPTR' and the return value is
+     zero.  Otherwise the function returns an error value indicating the
+     problem.  The possible error values returned are:
 
-    `ENOMEM'
+     'ENOMEM'
           There was insufficient memory available to satisfy the
           request.
 
-    `EINVAL'
-          ALIGNMENT is not a power of two multiple of `sizeof (void *)'.
+     'EINVAL'
+          ALIGNMENT is not a power of two multiple of 'sizeof (void *)'.
 
-
-     This function was introduced in POSIX 1003.1d. Although this
-     function is superseded by `aligned_alloc', it is more portable to
+     This function was introduced in POSIX 1003.1d.  Although this
+     function is superseded by 'aligned_alloc', it is more portable to
      older POSIX systems that do not support ISO C11.
 
  -- Function: void * valloc (size_t SIZE)
      Preliminary: | MT-Unsafe init | AS-Unsafe init lock | AC-Unsafe
      init lock fd mem | *Note POSIX Safety Concepts::.
 
-     Using `valloc' is like using `memalign' and passing the page size
+     Using 'valloc' is like using 'memalign' and passing the page size
      as the value of the second argument.  It is implemented like this:
 
           void *
@@ -6185,8 +6168,8 @@
      *note Query Memory Parameters:: for more information about the
      memory subsystem.
 
-     The `valloc' function is obsolete and `aligned_alloc' or
-     `posix_memalign' should be used instead.
+     The 'valloc' function is obsolete and 'aligned_alloc' or
+     'posix_memalign' should be used instead.
 
 
 File: libc.info,  Node: Malloc Tunable Parameters,  Next: Heap Consistency Checking,  Prev: Aligned Memory Blocks,  Up: Unconstrained Allocation
@@ -6195,89 +6178,82 @@
 .................................
 
 You can adjust some parameters for dynamic memory allocation with the
-`mallopt' function.  This function is the general SVID/XPG interface,
-defined in `malloc.h'.  
+'mallopt' function.  This function is the general SVID/XPG interface,
+defined in 'malloc.h'.
 
  -- Function: int mallopt (int PARAM, int VALUE)
-     Preliminary: | MT-Unsafe init const:mallopt | AS-Unsafe init lock
-     | AC-Unsafe init lock | *Note POSIX Safety Concepts::.
+     Preliminary: | MT-Unsafe init const:mallopt | AS-Unsafe init lock |
+     AC-Unsafe init lock | *Note POSIX Safety Concepts::.
 
-     When calling `mallopt', the PARAM argument specifies the parameter
-     to be set, and VALUE the new value to be set.  Possible choices
-     for PARAM, as defined in `malloc.h', are:
+     When calling 'mallopt', the PARAM argument specifies the parameter
+     to be set, and VALUE the new value to be set.  Possible choices for
+     PARAM, as defined in 'malloc.h', are:
 
-    `M_MMAP_MAX'
-          The maximum number of chunks to allocate with `mmap'.
-          Setting this to zero disables all use of `mmap'.
-
-    `M_MMAP_THRESHOLD'
+     'M_MMAP_MAX'
+          The maximum number of chunks to allocate with 'mmap'.  Setting
+          this to zero disables all use of 'mmap'.
+     'M_MMAP_THRESHOLD'
           All chunks larger than this value are allocated outside the
-          normal heap, using the `mmap' system call.  This way it is
-          guaranteed that the memory for these chunks can be returned
-          to the system on `free'.  Note that requests smaller than
-          this threshold might still be allocated via `mmap'.
-
-    `M_PERTURB'
-          If non-zero, memory blocks are filled with values depending
-          on some low order bits of this parameter when they are
-          allocated (except when allocated by `calloc') and freed.
-          This can be used to debug the use of uninitialized or freed
-          heap memory.  Note that this option does not guarantee that
-          the freed block will have any specific values.  It only
-          guarantees that the content the block had before it was freed
-          will be overwritten.
-
-    `M_TOP_PAD'
-          This parameter determines the amount of extra memory to
-          obtain from the system when a call to `sbrk' is required.  It
-          also specifies the number of bytes to retain when shrinking
-          the heap by calling `sbrk' with a negative argument.  This
+          normal heap, using the 'mmap' system call.  This way it is
+          guaranteed that the memory for these chunks can be returned to
+          the system on 'free'.  Note that requests smaller than this
+          threshold might still be allocated via 'mmap'.
+     'M_PERTURB'
+          If non-zero, memory blocks are filled with values depending on
+          some low order bits of this parameter when they are allocated
+          (except when allocated by 'calloc') and freed.  This can be
+          used to debug the use of uninitialized or freed heap memory.
+          Note that this option does not guarantee that the freed block
+          will have any specific values.  It only guarantees that the
+          content the block had before it was freed will be overwritten.
+     'M_TOP_PAD'
+          This parameter determines the amount of extra memory to obtain
+          from the system when a call to 'sbrk' is required.  It also
+          specifies the number of bytes to retain when shrinking the
+          heap by calling 'sbrk' with a negative argument.  This
           provides the necessary hysteresis in heap size such that
           excessive amounts of system calls can be avoided.
-
-    `M_TRIM_THRESHOLD'
+     'M_TRIM_THRESHOLD'
           This is the minimum size (in bytes) of the top-most,
-          releasable chunk that will cause `sbrk' to be called with a
+          releasable chunk that will cause 'sbrk' to be called with a
           negative argument in order to return memory to the system.
 
-
 
 File: libc.info,  Node: Heap Consistency Checking,  Next: Hooks for Malloc,  Prev: Malloc Tunable Parameters,  Up: Unconstrained Allocation
 
 3.2.2.9 Heap Consistency Checking
 .................................
 
-You can ask `malloc' to check the consistency of dynamic memory by
-using the `mcheck' function.  This function is a GNU extension,
-declared in `mcheck.h'.  
+You can ask 'malloc' to check the consistency of dynamic memory by using
+the 'mcheck' function.  This function is a GNU extension, declared in
+'mcheck.h'.
 
  -- Function: int mcheck (void (*ABORTFN) (enum mcheck_status STATUS))
-     Preliminary: | MT-Unsafe race:mcheck const:malloc_hooks |
-     AS-Unsafe corrupt | AC-Unsafe corrupt | *Note POSIX Safety
-     Concepts::.
+     Preliminary: | MT-Unsafe race:mcheck const:malloc_hooks | AS-Unsafe
+     corrupt | AC-Unsafe corrupt | *Note POSIX Safety Concepts::.
 
-     Calling `mcheck' tells `malloc' to perform occasional consistency
+     Calling 'mcheck' tells 'malloc' to perform occasional consistency
      checks.  These will catch things such as writing past the end of a
-     block that was allocated with `malloc'.
+     block that was allocated with 'malloc'.
 
      The ABORTFN argument is the function to call when an inconsistency
-     is found.  If you supply a null pointer, then `mcheck' uses a
-     default function which prints a message and calls `abort' (*note
+     is found.  If you supply a null pointer, then 'mcheck' uses a
+     default function which prints a message and calls 'abort' (*note
      Aborting a Program::).  The function you supply is called with one
      argument, which says what sort of inconsistency was detected; its
      type is described below.
 
      It is too late to begin allocation checking once you have allocated
-     anything with `malloc'.  So `mcheck' does nothing in that case.
-     The function returns `-1' if you call it too late, and `0'
+     anything with 'malloc'.  So 'mcheck' does nothing in that case.
+     The function returns '-1' if you call it too late, and '0'
      otherwise (when it is successful).
 
-     The easiest way to arrange to call `mcheck' early enough is to use
-     the option `-lmcheck' when you link your program; then you don't
-     need to modify your program source at all.  Alternatively you
-     might use a debugger to insert a call to `mcheck' whenever the
-     program is started, for example these gdb commands will
-     automatically call `mcheck' whenever the program starts:
+     The easiest way to arrange to call 'mcheck' early enough is to use
+     the option '-lmcheck' when you link your program; then you don't
+     need to modify your program source at all.  Alternatively you might
+     use a debugger to insert a call to 'mcheck' whenever the program is
+     started, for example these gdb commands will automatically call
+     'mcheck' whenever the program starts:
 
           (gdb) break main
           Breakpoint 1, main (argc=2, argv=0xbffff964) at whatever.c:10
@@ -6290,23 +6266,21 @@
           (gdb) ...
 
      This will however only work if no initialization function of any
-     object involved calls any of the `malloc' functions since `mcheck'
+     object involved calls any of the 'malloc' functions since 'mcheck'
      must be called before the first such function.
 
-
  -- Function: enum mcheck_status mprobe (void *POINTER)
-     Preliminary: | MT-Unsafe race:mcheck const:malloc_hooks |
-     AS-Unsafe corrupt | AC-Unsafe corrupt | *Note POSIX Safety
-     Concepts::.
+     Preliminary: | MT-Unsafe race:mcheck const:malloc_hooks | AS-Unsafe
+     corrupt | AC-Unsafe corrupt | *Note POSIX Safety Concepts::.
 
-     The `mprobe' function lets you explicitly check for inconsistencies
+     The 'mprobe' function lets you explicitly check for inconsistencies
      in a particular allocated block.  You must have already called
-     `mcheck' at the beginning of the program, to do its occasional
-     checks; calling `mprobe' requests an additional consistency check
+     'mcheck' at the beginning of the program, to do its occasional
+     checks; calling 'mprobe' requests an additional consistency check
      to be done at the time of the call.
 
-     The argument POINTER must be a pointer returned by `malloc' or
-     `realloc'.  `mprobe' returns a value that says what inconsistency,
+     The argument POINTER must be a pointer returned by 'malloc' or
+     'realloc'.  'mprobe' returns a value that says what inconsistency,
      if any, was found.  The values are described below.
 
  -- Data Type: enum mcheck_status
@@ -6314,52 +6288,48 @@
      detected in an allocated block, if any.  Here are the possible
      values:
 
-    `MCHECK_DISABLED'
-          `mcheck' was not called before the first allocation.  No
+     'MCHECK_DISABLED'
+          'mcheck' was not called before the first allocation.  No
           consistency checking can be done.
-
-    `MCHECK_OK'
+     'MCHECK_OK'
           No inconsistency detected.
-
-    `MCHECK_HEAD'
+     'MCHECK_HEAD'
           The data immediately before the block was modified.  This
-          commonly happens when an array index or pointer is
-          decremented too far.
-
-    `MCHECK_TAIL'
+          commonly happens when an array index or pointer is decremented
+          too far.
+     'MCHECK_TAIL'
           The data immediately after the block was modified.  This
-          commonly happens when an array index or pointer is
-          incremented too far.
-
-    `MCHECK_FREE'
+          commonly happens when an array index or pointer is incremented
+          too far.
+     'MCHECK_FREE'
           The block was already freed.
 
    Another possibility to check for and guard against bugs in the use of
-`malloc', `realloc' and `free' is to set the environment variable
-`MALLOC_CHECK_'.  When `MALLOC_CHECK_' is set, a special (less
+'malloc', 'realloc' and 'free' is to set the environment variable
+'MALLOC_CHECK_'.  When 'MALLOC_CHECK_' is set, a special (less
 efficient) implementation is used which is designed to be tolerant
-against simple errors, such as double calls of `free' with the same
+against simple errors, such as double calls of 'free' with the same
 argument, or overruns of a single byte (off-by-one bugs).  Not all such
 errors can be protected against, however, and memory leaks can result.
-If `MALLOC_CHECK_' is set to `0', any detected heap corruption is
-silently ignored; if set to `1', a diagnostic is printed on `stderr';
-if set to `2', `abort' is called immediately.  This can be useful
-because otherwise a crash may happen much later, and the true cause for
-the problem is then very hard to track down.
+If 'MALLOC_CHECK_' is set to '0', any detected heap corruption is
+silently ignored; if set to '1', a diagnostic is printed on 'stderr'; if
+set to '2', 'abort' is called immediately.  This can be useful because
+otherwise a crash may happen much later, and the true cause for the
+problem is then very hard to track down.
 
-   There is one problem with `MALLOC_CHECK_': in SUID or SGID binaries
+   There is one problem with 'MALLOC_CHECK_': in SUID or SGID binaries
 it could possibly be exploited since diverging from the normal programs
 behavior it now writes something to the standard error descriptor.
-Therefore the use of `MALLOC_CHECK_' is disabled by default for SUID
-and SGID binaries.  It can be enabled again by the system administrator
-by adding a file `/etc/suid-debug' (the content is not important it
-could be empty).
+Therefore the use of 'MALLOC_CHECK_' is disabled by default for SUID and
+SGID binaries.  It can be enabled again by the system administrator by
+adding a file '/etc/suid-debug' (the content is not important it could
+be empty).
 
-   So, what's the difference between using `MALLOC_CHECK_' and linking
-with `-lmcheck'?  `MALLOC_CHECK_' is orthogonal with respect to
-`-lmcheck'.  `-lmcheck' has been added for backward compatibility.
-Both `MALLOC_CHECK_' and `-lmcheck' should uncover the same bugs - but
-using `MALLOC_CHECK_' you don't need to recompile your application.
+   So, what's the difference between using 'MALLOC_CHECK_' and linking
+with '-lmcheck'?  'MALLOC_CHECK_' is orthogonal with respect to
+'-lmcheck'.  '-lmcheck' has been added for backward compatibility.  Both
+'MALLOC_CHECK_' and '-lmcheck' should uncover the same bugs - but using
+'MALLOC_CHECK_' you don't need to recompile your application.
 
 
 File: libc.info,  Node: Hooks for Malloc,  Next: Statistics of Malloc,  Prev: Heap Consistency Checking,  Up: Unconstrained Allocation
@@ -6367,94 +6337,94 @@
 3.2.2.10 Memory Allocation Hooks
 ................................
 
-The GNU C Library lets you modify the behavior of `malloc', `realloc',
-and `free' by specifying appropriate hook functions.  You can use these
-hooks to help you debug programs that use dynamic memory allocation,
-for example.
+The GNU C Library lets you modify the behavior of 'malloc', 'realloc',
+and 'free' by specifying appropriate hook functions.  You can use these
+hooks to help you debug programs that use dynamic memory allocation, for
+example.
 
-   The hook variables are declared in `malloc.h'.  
+   The hook variables are declared in 'malloc.h'.
 
  -- Variable: __malloc_hook
      The value of this variable is a pointer to the function that
-     `malloc' uses whenever it is called.  You should define this
-     function to look like `malloc'; that is, like:
+     'malloc' uses whenever it is called.  You should define this
+     function to look like 'malloc'; that is, like:
 
           void *FUNCTION (size_t SIZE, const void *CALLER)
 
      The value of CALLER is the return address found on the stack when
-     the `malloc' function was called.  This value allows you to trace
+     the 'malloc' function was called.  This value allows you to trace
      the memory consumption of the program.
 
  -- Variable: __realloc_hook
-     The value of this variable is a pointer to function that `realloc'
+     The value of this variable is a pointer to function that 'realloc'
      uses whenever it is called.  You should define this function to
-     look like `realloc'; that is, like:
+     look like 'realloc'; that is, like:
 
           void *FUNCTION (void *PTR, size_t SIZE, const void *CALLER)
 
      The value of CALLER is the return address found on the stack when
-     the `realloc' function was called.  This value allows you to trace
+     the 'realloc' function was called.  This value allows you to trace
      the memory consumption of the program.
 
  -- Variable: __free_hook
-     The value of this variable is a pointer to function that `free'
+     The value of this variable is a pointer to function that 'free'
      uses whenever it is called.  You should define this function to
-     look like `free'; that is, like:
+     look like 'free'; that is, like:
 
           void FUNCTION (void *PTR, const void *CALLER)
 
      The value of CALLER is the return address found on the stack when
-     the `free' function was called.  This value allows you to trace the
+     the 'free' function was called.  This value allows you to trace the
      memory consumption of the program.
 
  -- Variable: __memalign_hook
      The value of this variable is a pointer to function that
-     `aligned_alloc', `memalign', `posix_memalign' and `valloc' use
-     whenever they are called. You should define this function to look
-     like `aligned_alloc'; that is, like:
+     'aligned_alloc', 'memalign', 'posix_memalign' and 'valloc' use
+     whenever they are called.  You should define this function to look
+     like 'aligned_alloc'; that is, like:
 
           void *FUNCTION (size_t ALIGNMENT, size_t SIZE, const void *CALLER)
 
      The value of CALLER is the return address found on the stack when
-     the `aligned_alloc', `memalign', `posix_memalign' or `valloc'
+     the 'aligned_alloc', 'memalign', 'posix_memalign' or 'valloc'
      functions are called.  This value allows you to trace the memory
      consumption of the program.
 
    You must make sure that the function you install as a hook for one of
 these functions does not call that function recursively without
-restoring the old value of the hook first!  Otherwise, your program
-will get stuck in an infinite recursion.  Before calling the function
+restoring the old value of the hook first!  Otherwise, your program will
+get stuck in an infinite recursion.  Before calling the function
 recursively, one should make sure to restore all the hooks to their
-previous value.  When coming back from the recursive call, all the
-hooks should be resaved since a hook might modify itself.
+previous value.  When coming back from the recursive call, all the hooks
+should be resaved since a hook might modify itself.
 
  -- Variable: __malloc_initialize_hook
      The value of this variable is a pointer to a function that is
-     called once when the malloc implementation is initialized.  This
-     is a weak variable, so it can be overridden in the application
-     with a definition like the following:
+     called once when the malloc implementation is initialized.  This is
+     a weak variable, so it can be overridden in the application with a
+     definition like the following:
 
           void (*__MALLOC_INITIALIZE_HOOK) (void) = my_init_hook;
 
    An issue to look out for is the time at which the malloc hook
 functions can be safely installed.  If the hook functions call the
 malloc-related functions recursively, it is necessary that malloc has
-already properly initialized itself at the time when `__malloc_hook'
-etc. is assigned to.  On the other hand, if the hook functions provide a
-complete malloc implementation of their own, it is vital that the hooks
-are assigned to _before_ the very first `malloc' call has completed,
-because otherwise a chunk obtained from the ordinary, un-hooked malloc
-may later be handed to `__free_hook', for example.
+already properly initialized itself at the time when '__malloc_hook'
+etc.  is assigned to.  On the other hand, if the hook functions provide
+a complete malloc implementation of their own, it is vital that the
+hooks are assigned to _before_ the very first 'malloc' call has
+completed, because otherwise a chunk obtained from the ordinary,
+un-hooked malloc may later be handed to '__free_hook', for example.
 
    In both cases, the problem can be solved by setting up the hooks from
 within a user-defined function pointed to by
-`__malloc_initialize_hook'--then the hooks will be set up safely at the
+'__malloc_initialize_hook'--then the hooks will be set up safely at the
 right time.
 
-   Here is an example showing how to use `__malloc_hook' and
-`__free_hook' properly.  It installs a function that prints out
-information every time `malloc' or `free' is called.  We just assume
-here that `realloc' and `memalign' are not used in our program.
+   Here is an example showing how to use '__malloc_hook' and
+'__free_hook' properly.  It installs a function that prints out
+information every time 'malloc' or 'free' is called.  We just assume
+here that 'realloc' and 'memalign' are not used in our program.
 
      /* Prototypes for __malloc_hook, __free_hook */
      #include <malloc.h>
@@ -6488,7 +6458,7 @@
        /* Save underlying hooks */
        old_malloc_hook = __malloc_hook;
        old_free_hook = __free_hook;
-       /* `printf' might call `malloc', so protect it too. */
+       /* 'printf' might call 'malloc', so protect it too. */
        printf ("malloc (%u) returns %p\n", (unsigned int) size, result);
        /* Restore our own hooks */
        __malloc_hook = my_malloc_hook;
@@ -6507,7 +6477,7 @@
        /* Save underlying hooks */
        old_malloc_hook = __malloc_hook;
        old_free_hook = __free_hook;
-       /* `printf' might call `free', so protect it too. */
+       /* 'printf' might call 'free', so protect it too. */
        printf ("freed pointer %p\n", ptr);
        /* Restore our own hooks */
        __malloc_hook = my_malloc_hook;
@@ -6519,133 +6489,132 @@
        ...
      }
 
-   The `mcheck' function (*note Heap Consistency Checking::) works by
+   The 'mcheck' function (*note Heap Consistency Checking::) works by
 installing such hooks.
 
 
 File: libc.info,  Node: Statistics of Malloc,  Next: Summary of Malloc,  Prev: Hooks for Malloc,  Up: Unconstrained Allocation
 
-3.2.2.11 Statistics for Memory Allocation with `malloc'
+3.2.2.11 Statistics for Memory Allocation with 'malloc'
 .......................................................
 
 You can get information about dynamic memory allocation by calling the
-`mallinfo' function.  This function and its associated data type are
-declared in `malloc.h'; they are an extension of the standard SVID/XPG
-version.  
+'mallinfo' function.  This function and its associated data type are
+declared in 'malloc.h'; they are an extension of the standard SVID/XPG
+version.
 
  -- Data Type: struct mallinfo
      This structure type is used to return information about the dynamic
      memory allocator.  It contains the following members:
 
-    `int arena'
-          This is the total size of memory allocated with `sbrk' by
-          `malloc', in bytes.
+     'int arena'
+          This is the total size of memory allocated with 'sbrk' by
+          'malloc', in bytes.
 
-    `int ordblks'
+     'int ordblks'
           This is the number of chunks not in use.  (The memory
           allocator internally gets chunks of memory from the operating
-          system, and then carves them up to satisfy individual
-          `malloc' requests; see *note Efficiency and Malloc::.)
+          system, and then carves them up to satisfy individual 'malloc'
+          requests; see *note Efficiency and Malloc::.)
 
-    `int smblks'
+     'int smblks'
           This field is unused.
 
-    `int hblks'
-          This is the total number of chunks allocated with `mmap'.
+     'int hblks'
+          This is the total number of chunks allocated with 'mmap'.
 
-    `int hblkhd'
-          This is the total size of memory allocated with `mmap', in
+     'int hblkhd'
+          This is the total size of memory allocated with 'mmap', in
           bytes.
 
-    `int usmblks'
+     'int usmblks'
           This field is unused.
 
-    `int fsmblks'
+     'int fsmblks'
           This field is unused.
 
-    `int uordblks'
-          This is the total size of memory occupied by chunks handed
-          out by `malloc'.
+     'int uordblks'
+          This is the total size of memory occupied by chunks handed out
+          by 'malloc'.
 
-    `int fordblks'
-          This is the total size of memory occupied by free (not in
-          use) chunks.
+     'int fordblks'
+          This is the total size of memory occupied by free (not in use)
+          chunks.
 
-    `int keepcost'
+     'int keepcost'
           This is the size of the top-most releasable chunk that
           normally borders the end of the heap (i.e., the high end of
           the virtual address space's data segment).
 
-
  -- Function: struct mallinfo mallinfo (void)
-     Preliminary: | MT-Unsafe init const:mallopt | AS-Unsafe init lock
-     | AC-Unsafe init lock | *Note POSIX Safety Concepts::.
+     Preliminary: | MT-Unsafe init const:mallopt | AS-Unsafe init lock |
+     AC-Unsafe init lock | *Note POSIX Safety Concepts::.
 
      This function returns information about the current dynamic memory
-     usage in a structure of type `struct mallinfo'.
+     usage in a structure of type 'struct mallinfo'.
 
 
 File: libc.info,  Node: Summary of Malloc,  Prev: Statistics of Malloc,  Up: Unconstrained Allocation
 
-3.2.2.12 Summary of `malloc'-Related Functions
+3.2.2.12 Summary of 'malloc'-Related Functions
 ..............................................
 
-Here is a summary of the functions that work with `malloc':
+Here is a summary of the functions that work with 'malloc':
 
-`void *malloc (size_t SIZE)'
+'void *malloc (size_t SIZE)'
      Allocate a block of SIZE bytes.  *Note Basic Allocation::.
 
-`void free (void *ADDR)'
-     Free a block previously allocated by `malloc'.  *Note Freeing
-     after Malloc::.
+'void free (void *ADDR)'
+     Free a block previously allocated by 'malloc'.  *Note Freeing after
+     Malloc::.
 
-`void *realloc (void *ADDR, size_t SIZE)'
-     Make a block previously allocated by `malloc' larger or smaller,
+'void *realloc (void *ADDR, size_t SIZE)'
+     Make a block previously allocated by 'malloc' larger or smaller,
      possibly by copying it to a new location.  *Note Changing Block
      Size::.
 
-`void *calloc (size_t COUNT, size_t ELTSIZE)'
-     Allocate a block of COUNT * ELTSIZE bytes using `malloc', and set
+'void *calloc (size_t COUNT, size_t ELTSIZE)'
+     Allocate a block of COUNT * ELTSIZE bytes using 'malloc', and set
      its contents to zero.  *Note Allocating Cleared Space::.
 
-`void *valloc (size_t SIZE)'
-     Allocate a block of SIZE bytes, starting on a page boundary.
-     *Note Aligned Memory Blocks::.
+'void *valloc (size_t SIZE)'
+     Allocate a block of SIZE bytes, starting on a page boundary.  *Note
+     Aligned Memory Blocks::.
 
-`void *aligned_alloc (size_t SIZE, size_t ALIGNMENT)'
+'void *aligned_alloc (size_t SIZE, size_t ALIGNMENT)'
      Allocate a block of SIZE bytes, starting on an address that is a
      multiple of ALIGNMENT.  *Note Aligned Memory Blocks::.
 
-`int posix_memalign (void **MEMPTR, size_t ALIGNMENT, size_t SIZE)'
+'int posix_memalign (void **MEMPTR, size_t ALIGNMENT, size_t SIZE)'
      Allocate a block of SIZE bytes, starting on an address that is a
      multiple of ALIGNMENT.  *Note Aligned Memory Blocks::.
 
-`void *memalign (size_t SIZE, size_t BOUNDARY)'
+'void *memalign (size_t SIZE, size_t BOUNDARY)'
      Allocate a block of SIZE bytes, starting on an address that is a
      multiple of BOUNDARY.  *Note Aligned Memory Blocks::.
 
-`int mallopt (int PARAM, int VALUE)'
+'int mallopt (int PARAM, int VALUE)'
      Adjust a tunable parameter.  *Note Malloc Tunable Parameters::.
 
-`int mcheck (void (*ABORTFN) (void))'
-     Tell `malloc' to perform occasional consistency checks on
+'int mcheck (void (*ABORTFN) (void))'
+     Tell 'malloc' to perform occasional consistency checks on
      dynamically allocated memory, and to call ABORTFN when an
      inconsistency is found.  *Note Heap Consistency Checking::.
 
-`void *(*__malloc_hook) (size_t SIZE, const void *CALLER)'
-     A pointer to a function that `malloc' uses whenever it is called.
+'void *(*__malloc_hook) (size_t SIZE, const void *CALLER)'
+     A pointer to a function that 'malloc' uses whenever it is called.
 
-`void *(*__realloc_hook) (void *PTR, size_t SIZE, const void *CALLER)'
-     A pointer to a function that `realloc' uses whenever it is called.
+'void *(*__realloc_hook) (void *PTR, size_t SIZE, const void *CALLER)'
+     A pointer to a function that 'realloc' uses whenever it is called.
 
-`void (*__free_hook) (void *PTR, const void *CALLER)'
-     A pointer to a function that `free' uses whenever it is called.
+'void (*__free_hook) (void *PTR, const void *CALLER)'
+     A pointer to a function that 'free' uses whenever it is called.
 
-`void (*__memalign_hook) (size_t SIZE, size_t ALIGNMENT, const void *CALLER)'
-     A pointer to a function that `aligned_alloc', `memalign',
-     `posix_memalign' and `valloc' use whenever they are called.
+'void (*__memalign_hook) (size_t SIZE, size_t ALIGNMENT, const void *CALLER)'
+     A pointer to a function that 'aligned_alloc', 'memalign',
+     'posix_memalign' and 'valloc' use whenever they are called.
 
-`struct mallinfo mallinfo (void)'
+'struct mallinfo mallinfo (void)'
      Return information about the current dynamic memory usage.  *Note
      Statistics of Malloc::.
 
@@ -6661,10 +6630,10 @@
 freed at the end of their lifetime.  If this does not happen the system
 runs out of memory, sooner or later.
 
-   The `malloc' implementation in the GNU C Library provides some
-simple means to detect such leaks and obtain some information to find
-the location.  To do this the application must be started in a special
-mode which is enabled by an environment variable.  There are no speed
+   The 'malloc' implementation in the GNU C Library provides some simple
+means to detect such leaks and obtain some information to find the
+location.  To do this the application must be started in a special mode
+which is enabled by an environment variable.  There are no speed
 penalties for the program if the debugging mode is not enabled.
 
 * Menu:
@@ -6685,40 +6654,40 @@
      AS-Unsafe init heap corrupt lock | AC-Unsafe init corrupt lock fd
      mem | *Note POSIX Safety Concepts::.
 
-     When the `mtrace' function is called it looks for an environment
-     variable named `MALLOC_TRACE'.  This variable is supposed to
+     When the 'mtrace' function is called it looks for an environment
+     variable named 'MALLOC_TRACE'.  This variable is supposed to
      contain a valid file name.  The user must have write access.  If
      the file already exists it is truncated.  If the environment
      variable is not set or it does not name a valid file which can be
-     opened for writing nothing is done.  The behavior of `malloc' etc.
+     opened for writing nothing is done.  The behavior of 'malloc' etc.
      is not changed.  For obvious reasons this also happens if the
      application is installed with the SUID or SGID bit set.
 
-     If the named file is successfully opened, `mtrace' installs special
-     handlers for the functions `malloc', `realloc', and `free' (*note
-     Hooks for Malloc::).  From then on, all uses of these functions
-     are traced and protocolled into the file.  There is now of course
-     a speed penalty for all calls to the traced functions so tracing
+     If the named file is successfully opened, 'mtrace' installs special
+     handlers for the functions 'malloc', 'realloc', and 'free' (*note
+     Hooks for Malloc::).  From then on, all uses of these functions are
+     traced and protocolled into the file.  There is now of course a
+     speed penalty for all calls to the traced functions so tracing
      should not be enabled during normal use.
 
      This function is a GNU extension and generally not available on
-     other systems.  The prototype can be found in `mcheck.h'.
+     other systems.  The prototype can be found in 'mcheck.h'.
 
  -- Function: void muntrace (void)
      Preliminary: | MT-Unsafe race:mtrace const:malloc_hooks locale |
      AS-Unsafe corrupt heap | AC-Unsafe corrupt mem lock fd | *Note
      POSIX Safety Concepts::.
 
-     The `muntrace' function can be called after `mtrace' was used to
-     enable tracing the `malloc' calls.  If no (successful) call of
-     `mtrace' was made `muntrace' does nothing.
+     The 'muntrace' function can be called after 'mtrace' was used to
+     enable tracing the 'malloc' calls.  If no (successful) call of
+     'mtrace' was made 'muntrace' does nothing.
 
-     Otherwise it deinstalls the handlers for `malloc', `realloc', and
-     `free' and then closes the protocol file.  No calls are
-     protocolled anymore and the program runs again at full speed.
+     Otherwise it deinstalls the handlers for 'malloc', 'realloc', and
+     'free' and then closes the protocol file.  No calls are protocolled
+     anymore and the program runs again at full speed.
 
      This function is a GNU extension and generally not available on
-     other systems.  The prototype can be found in `mcheck.h'.
+     other systems.  The prototype can be found in 'mcheck.h'.
 
 
 File: libc.info,  Node: Using the Memory Debugger,  Next: Tips for the Memory Debugger,  Prev: Tracing malloc,  Up: Allocation Debugging
@@ -6727,11 +6696,11 @@
 ................................
 
 Even though the tracing functionality does not influence the runtime
-behavior of the program it is not a good idea to call `mtrace' in all
-programs.  Just imagine that you debug a program using `mtrace' and all
-other programs used in the debugging session also trace their `malloc'
+behavior of the program it is not a good idea to call 'mtrace' in all
+programs.  Just imagine that you debug a program using 'mtrace' and all
+other programs used in the debugging session also trace their 'malloc'
 calls.  The output file would be the same for all programs and thus is
-unusable.  Therefore one should call `mtrace' only if compiled for
+unusable.  Therefore one should call 'mtrace' only if compiled for
 debugging.  A program could therefore start like this:
 
      #include <mcheck.h>
@@ -6747,21 +6716,21 @@
 
    This is all what is needed if you want to trace the calls during the
 whole runtime of the program.  Alternatively you can stop the tracing at
-any time with a call to `muntrace'.  It is even possible to restart the
-tracing again with a new call to `mtrace'.  But this can cause
+any time with a call to 'muntrace'.  It is even possible to restart the
+tracing again with a new call to 'mtrace'.  But this can cause
 unreliable results since there may be calls of the functions which are
 not called.  Please note that not only the application uses the traced
 functions, also libraries (including the C library itself) use these
 functions.
 
-   This last point is also why it is no good idea to call `muntrace'
+   This last point is also why it is no good idea to call 'muntrace'
 before the program terminated.  The libraries are informed about the
-termination of the program only after the program returns from `main'
-or calls `exit' and so cannot free the memory they use before this time.
+termination of the program only after the program returns from 'main' or
+calls 'exit' and so cannot free the memory they use before this time.
 
-   So the best thing one can do is to call `mtrace' as the very first
-function in the program and never call `muntrace'.  So the program
-traces almost all uses of the `malloc' functions (except those calls
+   So the best thing one can do is to call 'mtrace' as the very first
+function in the program and never call 'muntrace'.  So the program
+traces almost all uses of the 'malloc' functions (except those calls
 which are executed by constructors of the program or used libraries).
 
 
@@ -6806,9 +6775,9 @@
      }
 
    I.e., the user can start the memory debugger any time s/he wants if
-the program was started with `MALLOC_TRACE' set in the environment.
-The output will of course not show the allocations which happened before
-the first signal but if there is a memory leak this will show up
+the program was started with 'MALLOC_TRACE' set in the environment.  The
+output will of course not show the allocations which happened before the
+first signal but if there is a memory leak this will show up
 nevertheless.
 
 
@@ -6833,20 +6802,20 @@
 not meant to be read by a human.  Therefore no attention is given to
 readability.  Instead there is a program which comes with the GNU C
 Library which interprets the traces and outputs a summary in an
-user-friendly way.  The program is called `mtrace' (it is in fact a
-Perl script) and it takes one or two arguments.  In any case the name of
-the file with the trace output must be specified.  If an optional
-argument precedes the name of the trace file this must be the name of
-the program which generated the trace.
+user-friendly way.  The program is called 'mtrace' (it is in fact a Perl
+script) and it takes one or two arguments.  In any case the name of the
+file with the trace output must be specified.  If an optional argument
+precedes the name of the trace file this must be the name of the program
+which generated the trace.
 
      drepper$ mtrace tst-mtrace log
      No memory leaks.
 
-   In this case the program `tst-mtrace' was run and it produced a
-trace file `log'.  The message printed by `mtrace' shows there are no
-problems with the code, all allocated memory was freed afterwards.
+   In this case the program 'tst-mtrace' was run and it produced a trace
+file 'log'.  The message printed by 'mtrace' shows there are no problems
+with the code, all allocated memory was freed afterwards.
 
-   If we call `mtrace' on the example trace given above we would get a
+   If we call 'mtrace' on the example trace given above we would get a
 different outout:
 
      drepper$ mtrace errlog
@@ -6862,7 +6831,7 @@
      0x08064c78     0x14  at 0x80481eb
      0x08064c90     0x14  at 0x80481eb
 
-   We have called `mtrace' with only one argument and so the script has
+   We have called 'mtrace' with only one argument and so the script has
 no chance to find out what is meant with the addresses given in the
 trace.  We can do better:
 
@@ -6883,7 +6852,7 @@
 immediately where the function calls causing the trouble can be found.
 
    Interpreting this output is not complicated.  There are at most two
-different situations being detected.  First, `free' was called for
+different situations being detected.  First, 'free' was called for
 pointers which were never returned by one of the allocation functions.
 This is usually a very bad problem and what this looks like is shown in
 the first three lines of the output.  Situations like this are quite
@@ -6891,11 +6860,11 @@
 normally crashes.
 
    The other situation which is much harder to detect are memory leaks.
-As you can see in the output the `mtrace' function collects all this
+As you can see in the output the 'mtrace' function collects all this
 information and so can say that the program calls an allocation function
-from line 33 in the source file `/home/drepper/tst-mtrace.c' four times
-without freeing this memory before the program terminates.  Whether
-this is a real problem remains to be investigated.
+from line 33 in the source file '/home/drepper/tst-mtrace.c' four times
+without freeing this memory before the program terminates.  Whether this
+is a real problem remains to be investigated.
 
 
 File: libc.info,  Node: Obstacks,  Next: Variable Size Automatic,  Prev: Allocation Debugging,  Up: Memory Allocation
@@ -6903,8 +6872,8 @@
 3.2.4 Obstacks
 --------------
 
-An "obstack" is a pool of memory containing a stack of objects.  You
-can create any number of separate obstacks, and then allocate objects in
+An "obstack" is a pool of memory containing a stack of objects.  You can
+create any number of separate obstacks, and then allocate objects in
 specified obstacks.  Within each obstack, the last object allocated must
 always be the first one freed, but distinct obstacks are independent of
 each other.
@@ -6941,29 +6910,29 @@
 .........................
 
 The utilities for manipulating obstacks are declared in the header file
-`obstack.h'.  
+'obstack.h'.
 
  -- Data Type: struct obstack
-     An obstack is represented by a data structure of type `struct
+     An obstack is represented by a data structure of type 'struct
      obstack'.  This structure has a small fixed size; it records the
      status of the obstack and how to find the space in which objects
      are allocated.  It does not contain any of the objects themselves.
      You should not try to access the contents of the structure
      directly; use only the functions described in this chapter.
 
-   You can declare variables of type `struct obstack' and use them as
+   You can declare variables of type 'struct obstack' and use them as
 obstacks, or you can allocate obstacks dynamically like any other kind
 of object.  Dynamic allocation of obstacks allows your program to have a
 variable number of different stacks.  (You can even allocate an obstack
 structure in another obstack, but this is rarely useful.)
 
    All the functions that work with obstacks require you to specify
-which obstack to use.  You do this with a pointer of type `struct
+which obstack to use.  You do this with a pointer of type 'struct
 obstack *'.  In the following, we often say "an obstack" when strictly
 speaking the object at hand is such a pointer.
 
    The objects in the obstack are packed into large blocks called
-"chunks".  The `struct obstack' structure points to a chain of the
+"chunks".  The 'struct obstack' structure points to a chain of the
 chunks currently in use.
 
    The obstack library obtains a new chunk whenever you allocate an
@@ -6971,7 +6940,7 @@
 manages chunks automatically, you don't need to pay much attention to
 them, but you do need to supply a function which the obstack library
 should use to get a chunk.  Usually you supply a function which uses
-`malloc' directly or indirectly.  You must also supply a function to
+'malloc' directly or indirectly.  You must also supply a function to
 free a chunk.  These matters are described in the following section.
 
 
@@ -6981,40 +6950,40 @@
 ....................................
 
 Each source file in which you plan to use the obstack functions must
-include the header file `obstack.h', like this:
+include the header file 'obstack.h', like this:
 
      #include <obstack.h>
 
-   Also, if the source file uses the macro `obstack_init', it must
+   Also, if the source file uses the macro 'obstack_init', it must
 declare or define two functions or macros that will be called by the
-obstack library.  One, `obstack_chunk_alloc', is used to allocate the
+obstack library.  One, 'obstack_chunk_alloc', is used to allocate the
 chunks of memory into which objects are packed.  The other,
-`obstack_chunk_free', is used to return chunks when the objects in them
-are freed.  These macros should appear before any use of obstacks in
-the source file.
+'obstack_chunk_free', is used to return chunks when the objects in them
+are freed.  These macros should appear before any use of obstacks in the
+source file.
 
-   Usually these are defined to use `malloc' via the intermediary
-`xmalloc' (*note Unconstrained Allocation::).  This is done with the
+   Usually these are defined to use 'malloc' via the intermediary
+'xmalloc' (*note Unconstrained Allocation::).  This is done with the
 following pair of macro definitions:
 
      #define obstack_chunk_alloc xmalloc
      #define obstack_chunk_free free
 
-Though the memory you get using obstacks really comes from `malloc',
-using obstacks is faster because `malloc' is called less often, for
+Though the memory you get using obstacks really comes from 'malloc',
+using obstacks is faster because 'malloc' is called less often, for
 larger blocks of memory.  *Note Obstack Chunks::, for full details.
 
-   At run time, before the program can use a `struct obstack' object as
-an obstack, it must initialize the obstack by calling `obstack_init'.
+   At run time, before the program can use a 'struct obstack' object as
+an obstack, it must initialize the obstack by calling 'obstack_init'.
 
  -- Function: int obstack_init (struct obstack *OBSTACK-PTR)
      Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Safe mem |
      *Note POSIX Safety Concepts::.
 
      Initialize obstack OBSTACK-PTR for allocation of objects.  This
-     function calls the obstack's `obstack_chunk_alloc' function.  If
+     function calls the obstack's 'obstack_chunk_alloc' function.  If
      allocation of memory fails, the function pointed to by
-     `obstack_alloc_failed_handler' is called.  The `obstack_init'
+     'obstack_alloc_failed_handler' is called.  The 'obstack_init'
      function always returns 1 (Compatibility notice: Former versions of
      obstack returned 0 if allocation failed).
 
@@ -7034,17 +7003,16 @@
 
  -- Variable: obstack_alloc_failed_handler
      The value of this variable is a pointer to a function that
-     `obstack' uses when `obstack_chunk_alloc' fails to allocate
-     memory.  The default action is to print a message and abort.  You
-     should supply a function that either calls `exit' (*note Program
-     Termination::) or `longjmp' (*note Non-Local Exits::) and doesn't
+     'obstack' uses when 'obstack_chunk_alloc' fails to allocate memory.
+     The default action is to print a message and abort.  You should
+     supply a function that either calls 'exit' (*note Program
+     Termination::) or 'longjmp' (*note Non-Local Exits::) and doesn't
      return.
 
           void my_obstack_alloc_failed (void)
           ...
           obstack_alloc_failed_handler = &my_obstack_alloc_failed;
 
-
 
 File: libc.info,  Node: Allocation in an Obstack,  Next: Freeing Obstack Objects,  Prev: Preparing for Obstacks,  Up: Obstacks
 
@@ -7052,7 +7020,7 @@
 ................................
 
 The most direct way to allocate an object in an obstack is with
-`obstack_alloc', which is invoked almost like `malloc'.
+'obstack_alloc', which is invoked almost like 'malloc'.
 
  -- Function: void * obstack_alloc (struct obstack *OBSTACK-PTR, int
           SIZE)
@@ -7061,17 +7029,17 @@
 
      This allocates an uninitialized block of SIZE bytes in an obstack
      and returns its address.  Here OBSTACK-PTR specifies which obstack
-     to allocate the block in; it is the address of the `struct obstack'
+     to allocate the block in; it is the address of the 'struct obstack'
      object which represents the obstack.  Each obstack function or
      macro requires you to specify an OBSTACK-PTR as the first argument.
 
-     This function calls the obstack's `obstack_chunk_alloc' function if
+     This function calls the obstack's 'obstack_chunk_alloc' function if
      it needs to allocate a new chunk of memory; it calls
-     `obstack_alloc_failed_handler' if allocation of memory by
-     `obstack_chunk_alloc' failed.
+     'obstack_alloc_failed_handler' if allocation of memory by
+     'obstack_chunk_alloc' failed.
 
    For example, here is a function that allocates a copy of a string STR
-in a specific obstack, which is in the variable `string_obstack':
+in a specific obstack, which is in the variable 'string_obstack':
 
      struct obstack string_obstack;
 
@@ -7085,7 +7053,7 @@
      }
 
    To allocate a block with specified contents, use the function
-`obstack_copy', declared like this:
+'obstack_copy', declared like this:
 
  -- Function: void * obstack_copy (struct obstack *OBSTACK-PTR, void
           *ADDRESS, int SIZE)
@@ -7093,18 +7061,18 @@
      corrupt mem | *Note POSIX Safety Concepts::.
 
      This allocates a block and initializes it by copying SIZE bytes of
-     data starting at ADDRESS.  It calls `obstack_alloc_failed_handler'
-     if allocation of memory by `obstack_chunk_alloc' failed.
+     data starting at ADDRESS.  It calls 'obstack_alloc_failed_handler'
+     if allocation of memory by 'obstack_chunk_alloc' failed.
 
  -- Function: void * obstack_copy0 (struct obstack *OBSTACK-PTR, void
           *ADDRESS, int SIZE)
      Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
      corrupt mem | *Note POSIX Safety Concepts::.
 
-     Like `obstack_copy', but appends an extra byte containing a null
+     Like 'obstack_copy', but appends an extra byte containing a null
      character.  This extra byte is not counted in the argument SIZE.
 
-   The `obstack_copy0' function is convenient for copying a sequence of
+   The 'obstack_copy0' function is convenient for copying a sequence of
 characters into an obstack as a null-terminated string.  Here is an
 example of its use:
 
@@ -7114,7 +7082,7 @@
        return obstack_copy0 (&myobstack, addr, size);
      }
 
-Contrast this with the previous example of `savestring' using `malloc'
+Contrast this with the previous example of 'savestring' using 'malloc'
 (*note Basic Allocation::).
 
 
@@ -7124,7 +7092,7 @@
 .....................................
 
 To free an object allocated in an obstack, use the function
-`obstack_free'.  Since the obstack is a stack of objects, freeing one
+'obstack_free'.  Since the obstack is a stack of objects, freeing one
 object automatically frees all other objects allocated more recently in
 the same obstack.
 
@@ -7133,15 +7101,15 @@
      Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
      corrupt | *Note POSIX Safety Concepts::.
 
-     If OBJECT is a null pointer, everything allocated in the obstack
-     is freed.  Otherwise, OBJECT must be the address of an object
+     If OBJECT is a null pointer, everything allocated in the obstack is
+     freed.  Otherwise, OBJECT must be the address of an object
      allocated in the obstack.  Then OBJECT is freed, along with
      everything allocated in OBSTACK since OBJECT.
 
-   Note that if OBJECT is a null pointer, the result is an
-uninitialized obstack.  To free all memory in an obstack but leave it
-valid for further allocation, call `obstack_free' with the address of
-the first object allocated on the obstack:
+   Note that if OBJECT is a null pointer, the result is an uninitialized
+obstack.  To free all memory in an obstack but leave it valid for
+further allocation, call 'obstack_free' with the address of the first
+object allocated on the obstack:
 
      obstack_free (obstack_ptr, first_object_allocated_ptr);
 
@@ -7151,1564 +7119,3 @@
 other obstacks, or non-obstack allocation, can reuse the space of the
 chunk.
 
-
-File: libc.info,  Node: Obstack Functions,  Next: Growing Objects,  Prev: Freeing Obstack Objects,  Up: Obstacks
-
-3.2.4.5 Obstack Functions and Macros
-....................................
-
-The interfaces for using obstacks may be defined either as functions or
-as macros, depending on the compiler.  The obstack facility works with
-all C compilers, including both ISO C and traditional C, but there are
-precautions you must take if you plan to use compilers other than GNU C.
-
-   If you are using an old-fashioned non-ISO C compiler, all the obstack
-"functions" are actually defined only as macros.  You can call these
-macros like functions, but you cannot use them in any other way (for
-example, you cannot take their address).
-
-   Calling the macros requires a special precaution: namely, the first
-operand (the obstack pointer) may not contain any side effects, because
-it may be computed more than once.  For example, if you write this:
-
-     obstack_alloc (get_obstack (), 4);
-
-you will find that `get_obstack' may be called several times.  If you
-use `*obstack_list_ptr++' as the obstack pointer argument, you will get
-very strange results since the incrementation may occur several times.
-
-   In ISO C, each function has both a macro definition and a function
-definition.  The function definition is used if you take the address of
-the function without calling it.  An ordinary call uses the macro
-definition by default, but you can request the function definition
-instead by writing the function name in parentheses, as shown here:
-
-     char *x;
-     void *(*funcp) ();
-     /* Use the macro.  */
-     x = (char *) obstack_alloc (obptr, size);
-     /* Call the function.  */
-     x = (char *) (obstack_alloc) (obptr, size);
-     /* Take the address of the function.  */
-     funcp = obstack_alloc;
-
-This is the same situation that exists in ISO C for the standard library
-functions.  *Note Macro Definitions::.
-
-   *Warning:* When you do use the macros, you must observe the
-precaution of avoiding side effects in the first operand, even in ISO C.
-
-   If you use the GNU C compiler, this precaution is not necessary,
-because various language extensions in GNU C permit defining the macros
-so as to compute each argument only once.
-
-
-File: libc.info,  Node: Growing Objects,  Next: Extra Fast Growing,  Prev: Obstack Functions,  Up: Obstacks
-
-3.2.4.6 Growing Objects
-.......................
-
-Because memory in obstack chunks is used sequentially, it is possible to
-build up an object step by step, adding one or more bytes at a time to
-the end of the object.  With this technique, you do not need to know
-how much data you will put in the object until you come to the end of
-it.  We call this the technique of "growing objects".  The special
-functions for adding data to the growing object are described in this
-section.
-
-   You don't need to do anything special when you start to grow an
-object.  Using one of the functions to add data to the object
-automatically starts it.  However, it is necessary to say explicitly
-when the object is finished.  This is done with the function
-`obstack_finish'.
-
-   The actual address of the object thus built up is not known until the
-object is finished.  Until then, it always remains possible that you
-will add so much data that the object must be copied into a new chunk.
-
-   While the obstack is in use for a growing object, you cannot use it
-for ordinary allocation of another object.  If you try to do so, the
-space already added to the growing object will become part of the other
-object.
-
- -- Function: void obstack_blank (struct obstack *OBSTACK-PTR, int SIZE)
-     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
-     corrupt mem | *Note POSIX Safety Concepts::.
-
-     The most basic function for adding to a growing object is
-     `obstack_blank', which adds space without initializing it.
-
- -- Function: void obstack_grow (struct obstack *OBSTACK-PTR, void
-          *DATA, int SIZE)
-     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
-     corrupt mem | *Note POSIX Safety Concepts::.
-
-     To add a block of initialized space, use `obstack_grow', which is
-     the growing-object analogue of `obstack_copy'.  It adds SIZE bytes
-     of data to the growing object, copying the contents from DATA.
-
- -- Function: void obstack_grow0 (struct obstack *OBSTACK-PTR, void
-          *DATA, int SIZE)
-     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
-     corrupt mem | *Note POSIX Safety Concepts::.
-
-     This is the growing-object analogue of `obstack_copy0'.  It adds
-     SIZE bytes copied from DATA, followed by an additional null
-     character.
-
- -- Function: void obstack_1grow (struct obstack *OBSTACK-PTR, char C)
-     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
-     corrupt mem | *Note POSIX Safety Concepts::.
-
-     To add one character at a time, use the function `obstack_1grow'.
-     It adds a single byte containing C to the growing object.
-
- -- Function: void obstack_ptr_grow (struct obstack *OBSTACK-PTR, void
-          *DATA)
-     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
-     corrupt mem | *Note POSIX Safety Concepts::.
-
-     Adding the value of a pointer one can use the function
-     `obstack_ptr_grow'.  It adds `sizeof (void *)' bytes containing
-     the value of DATA.
-
- -- Function: void obstack_int_grow (struct obstack *OBSTACK-PTR, int
-          DATA)
-     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
-     corrupt mem | *Note POSIX Safety Concepts::.
-
-     A single value of type `int' can be added by using the
-     `obstack_int_grow' function.  It adds `sizeof (int)' bytes to the
-     growing object and initializes them with the value of DATA.
-
- -- Function: void * obstack_finish (struct obstack *OBSTACK-PTR)
-     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     When you are finished growing the object, use the function
-     `obstack_finish' to close it off and return its final address.
-
-     Once you have finished the object, the obstack is available for
-     ordinary allocation or for growing another object.
-
-     This function can return a null pointer under the same conditions
-     as `obstack_alloc' (*note Allocation in an Obstack::).
-
-   When you build an object by growing it, you will probably need to
-know afterward how long it became.  You need not keep track of this as
-you grow the object, because you can find out the length from the
-obstack just before finishing the object with the function
-`obstack_object_size', declared as follows:
-
- -- Function: int obstack_object_size (struct obstack *OBSTACK-PTR)
-     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Safe |
-     *Note POSIX Safety Concepts::.
-
-     This function returns the current size of the growing object, in
-     bytes.  Remember to call this function _before_ finishing the
-     object.  After it is finished, `obstack_object_size' will return
-     zero.
-
-   If you have started growing an object and wish to cancel it, you
-should finish it and then free it, like this:
-
-     obstack_free (obstack_ptr, obstack_finish (obstack_ptr));
-
-This has no effect if no object was growing.
-
-   You can use `obstack_blank' with a negative size argument to make
-the current object smaller.  Just don't try to shrink it beyond zero
-length--there's no telling what will happen if you do that.
-
-
-File: libc.info,  Node: Extra Fast Growing,  Next: Status of an Obstack,  Prev: Growing Objects,  Up: Obstacks
-
-3.2.4.7 Extra Fast Growing Objects
-..................................
-
-The usual functions for growing objects incur overhead for checking
-whether there is room for the new growth in the current chunk.  If you
-are frequently constructing objects in small steps of growth, this
-overhead can be significant.
-
-   You can reduce the overhead by using special "fast growth" functions
-that grow the object without checking.  In order to have a robust
-program, you must do the checking yourself.  If you do this checking in
-the simplest way each time you are about to add data to the object, you
-have not saved anything, because that is what the ordinary growth
-functions do.  But if you can arrange to check less often, or check
-more efficiently, then you make the program faster.
-
-   The function `obstack_room' returns the amount of room available in
-the current chunk.  It is declared as follows:
-
- -- Function: int obstack_room (struct obstack *OBSTACK-PTR)
-     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Safe |
-     *Note POSIX Safety Concepts::.
-
-     This returns the number of bytes that can be added safely to the
-     current growing object (or to an object about to be started) in
-     obstack OBSTACK using the fast growth functions.
-
-   While you know there is room, you can use these fast growth functions
-for adding data to a growing object:
-
- -- Function: void obstack_1grow_fast (struct obstack *OBSTACK-PTR,
-          char C)
-     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
-     corrupt mem | *Note POSIX Safety Concepts::.
-
-     The function `obstack_1grow_fast' adds one byte containing the
-     character C to the growing object in obstack OBSTACK-PTR.
-
- -- Function: void obstack_ptr_grow_fast (struct obstack *OBSTACK-PTR,
-          void *DATA)
-     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Safe |
-     *Note POSIX Safety Concepts::.
-
-     The function `obstack_ptr_grow_fast' adds `sizeof (void *)' bytes
-     containing the value of DATA to the growing object in obstack
-     OBSTACK-PTR.
-
- -- Function: void obstack_int_grow_fast (struct obstack *OBSTACK-PTR,
-          int DATA)
-     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Safe |
-     *Note POSIX Safety Concepts::.
-
-     The function `obstack_int_grow_fast' adds `sizeof (int)' bytes
-     containing the value of DATA to the growing object in obstack
-     OBSTACK-PTR.
-
- -- Function: void obstack_blank_fast (struct obstack *OBSTACK-PTR, int
-          SIZE)
-     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Safe |
-     *Note POSIX Safety Concepts::.
-
-     The function `obstack_blank_fast' adds SIZE bytes to the growing
-     object in obstack OBSTACK-PTR without initializing them.
-
-   When you check for space using `obstack_room' and there is not
-enough room for what you want to add, the fast growth functions are not
-safe.  In this case, simply use the corresponding ordinary growth
-function instead.  Very soon this will copy the object to a new chunk;
-then there will be lots of room available again.
-
-   So, each time you use an ordinary growth function, check afterward
-for sufficient space using `obstack_room'.  Once the object is copied
-to a new chunk, there will be plenty of space again, so the program will
-start using the fast growth functions again.
-
-   Here is an example:
-
-     void
-     add_string (struct obstack *obstack, const char *ptr, int len)
-     {
-       while (len > 0)
-         {
-           int room = obstack_room (obstack);
-           if (room == 0)
-             {
-               /* Not enough room. Add one character slowly,
-                  which may copy to a new chunk and make room.  */
-               obstack_1grow (obstack, *ptr++);
-               len--;
-             }
-           else
-             {
-               if (room > len)
-                 room = len;
-               /* Add fast as much as we have room for. */
-               len -= room;
-               while (room-- > 0)
-                 obstack_1grow_fast (obstack, *ptr++);
-             }
-         }
-     }
-
-
-File: libc.info,  Node: Status of an Obstack,  Next: Obstacks Data Alignment,  Prev: Extra Fast Growing,  Up: Obstacks
-
-3.2.4.8 Status of an Obstack
-............................
-
-Here are functions that provide information on the current status of
-allocation in an obstack.  You can use them to learn about an object
-while still growing it.
-
- -- Function: void * obstack_base (struct obstack *OBSTACK-PTR)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     This function returns the tentative address of the beginning of the
-     currently growing object in OBSTACK-PTR.  If you finish the object
-     immediately, it will have that address.  If you make it larger
-     first, it may outgrow the current chunk--then its address will
-     change!
-
-     If no object is growing, this value says where the next object you
-     allocate will start (once again assuming it fits in the current
-     chunk).
-
- -- Function: void * obstack_next_free (struct obstack *OBSTACK-PTR)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     This function returns the address of the first free byte in the
-     current chunk of obstack OBSTACK-PTR.  This is the end of the
-     currently growing object.  If no object is growing,
-     `obstack_next_free' returns the same value as `obstack_base'.
-
- -- Function: int obstack_object_size (struct obstack *OBSTACK-PTR)
-     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Safe |
-     *Note POSIX Safety Concepts::.
-
-     This function returns the size in bytes of the currently growing
-     object.  This is equivalent to
-
-          obstack_next_free (OBSTACK-PTR) - obstack_base (OBSTACK-PTR)
-
-
-File: libc.info,  Node: Obstacks Data Alignment,  Next: Obstack Chunks,  Prev: Status of an Obstack,  Up: Obstacks
-
-3.2.4.9 Alignment of Data in Obstacks
-.....................................
-
-Each obstack has an "alignment boundary"; each object allocated in the
-obstack automatically starts on an address that is a multiple of the
-specified boundary.  By default, this boundary is aligned so that the
-object can hold any type of data.
-
-   To access an obstack's alignment boundary, use the macro
-`obstack_alignment_mask', whose function prototype looks like this:
-
- -- Macro: int obstack_alignment_mask (struct obstack *OBSTACK-PTR)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The value is a bit mask; a bit that is 1 indicates that the
-     corresponding bit in the address of an object should be 0.  The
-     mask value should be one less than a power of 2; the effect is
-     that all object addresses are multiples of that power of 2.  The
-     default value of the mask is a value that allows aligned objects
-     to hold any type of data: for example, if its value is 3, any type
-     of data can be stored at locations whose addresses are multiples
-     of 4.  A mask value of 0 means an object can start on any multiple
-     of 1 (that is, no alignment is required).
-
-     The expansion of the macro `obstack_alignment_mask' is an lvalue,
-     so you can alter the mask by assignment.  For example, this
-     statement:
-
-          obstack_alignment_mask (obstack_ptr) = 0;
-
-     has the effect of turning off alignment processing in the
-     specified obstack.
-
-   Note that a change in alignment mask does not take effect until
-_after_ the next time an object is allocated or finished in the
-obstack.  If you are not growing an object, you can make the new
-alignment mask take effect immediately by calling `obstack_finish'.
-This will finish a zero-length object and then do proper alignment for
-the next object.
-
-
-File: libc.info,  Node: Obstack Chunks,  Next: Summary of Obstacks,  Prev: Obstacks Data Alignment,  Up: Obstacks
-
-3.2.4.10 Obstack Chunks
-.......................
-
-Obstacks work by allocating space for themselves in large chunks, and
-then parceling out space in the chunks to satisfy your requests.  Chunks
-are normally 4096 bytes long unless you specify a different chunk size.
-The chunk size includes 8 bytes of overhead that are not actually used
-for storing objects.  Regardless of the specified size, longer chunks
-will be allocated when necessary for long objects.
-
-   The obstack library allocates chunks by calling the function
-`obstack_chunk_alloc', which you must define.  When a chunk is no
-longer needed because you have freed all the objects in it, the obstack
-library frees the chunk by calling `obstack_chunk_free', which you must
-also define.
-
-   These two must be defined (as macros) or declared (as functions) in
-each source file that uses `obstack_init' (*note Creating Obstacks::).
-Most often they are defined as macros like this:
-
-     #define obstack_chunk_alloc malloc
-     #define obstack_chunk_free free
-
-   Note that these are simple macros (no arguments).  Macro definitions
-with arguments will not work!  It is necessary that
-`obstack_chunk_alloc' or `obstack_chunk_free', alone, expand into a
-function name if it is not itself a function name.
-
-   If you allocate chunks with `malloc', the chunk size should be a
-power of 2.  The default chunk size, 4096, was chosen because it is long
-enough to satisfy many typical requests on the obstack yet short enough
-not to waste too much memory in the portion of the last chunk not yet
-used.
-
- -- Macro: int obstack_chunk_size (struct obstack *OBSTACK-PTR)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This returns the chunk size of the given obstack.
-
-   Since this macro expands to an lvalue, you can specify a new chunk
-size by assigning it a new value.  Doing so does not affect the chunks
-already allocated, but will change the size of chunks allocated for
-that particular obstack in the future.  It is unlikely to be useful to
-make the chunk size smaller, but making it larger might improve
-efficiency if you are allocating many objects whose size is comparable
-to the chunk size.  Here is how to do so cleanly:
-
-     if (obstack_chunk_size (obstack_ptr) < NEW-CHUNK-SIZE)
-       obstack_chunk_size (obstack_ptr) = NEW-CHUNK-SIZE;
-
-
-File: libc.info,  Node: Summary of Obstacks,  Prev: Obstack Chunks,  Up: Obstacks
-
-3.2.4.11 Summary of Obstack Functions
-.....................................
-
-Here is a summary of all the functions associated with obstacks.  Each
-takes the address of an obstack (`struct obstack *') as its first
-argument.
-
-`void obstack_init (struct obstack *OBSTACK-PTR)'
-     Initialize use of an obstack.  *Note Creating Obstacks::.
-
-`void *obstack_alloc (struct obstack *OBSTACK-PTR, int SIZE)'
-     Allocate an object of SIZE uninitialized bytes.  *Note Allocation
-     in an Obstack::.
-
-`void *obstack_copy (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)'
-     Allocate an object of SIZE bytes, with contents copied from
-     ADDRESS.  *Note Allocation in an Obstack::.
-
-`void *obstack_copy0 (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)'
-     Allocate an object of SIZE+1 bytes, with SIZE of them copied from
-     ADDRESS, followed by a null character at the end.  *Note
-     Allocation in an Obstack::.
-
-`void obstack_free (struct obstack *OBSTACK-PTR, void *OBJECT)'
-     Free OBJECT (and everything allocated in the specified obstack
-     more recently than OBJECT).  *Note Freeing Obstack Objects::.
-
-`void obstack_blank (struct obstack *OBSTACK-PTR, int SIZE)'
-     Add SIZE uninitialized bytes to a growing object.  *Note Growing
-     Objects::.
-
-`void obstack_grow (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)'
-     Add SIZE bytes, copied from ADDRESS, to a growing object.  *Note
-     Growing Objects::.
-
-`void obstack_grow0 (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)'
-     Add SIZE bytes, copied from ADDRESS, to a growing object, and then
-     add another byte containing a null character.  *Note Growing
-     Objects::.
-
-`void obstack_1grow (struct obstack *OBSTACK-PTR, char DATA-CHAR)'
-     Add one byte containing DATA-CHAR to a growing object.  *Note
-     Growing Objects::.
-
-`void *obstack_finish (struct obstack *OBSTACK-PTR)'
-     Finalize the object that is growing and return its permanent
-     address.  *Note Growing Objects::.
-
-`int obstack_object_size (struct obstack *OBSTACK-PTR)'
-     Get the current size of the currently growing object.  *Note
-     Growing Objects::.
-
-`void obstack_blank_fast (struct obstack *OBSTACK-PTR, int SIZE)'
-     Add SIZE uninitialized bytes to a growing object without checking
-     that there is enough room.  *Note Extra Fast Growing::.
-
-`void obstack_1grow_fast (struct obstack *OBSTACK-PTR, char DATA-CHAR)'
-     Add one byte containing DATA-CHAR to a growing object without
-     checking that there is enough room.  *Note Extra Fast Growing::.
-
-`int obstack_room (struct obstack *OBSTACK-PTR)'
-     Get the amount of room now available for growing the current
-     object.  *Note Extra Fast Growing::.
-
-`int obstack_alignment_mask (struct obstack *OBSTACK-PTR)'
-     The mask used for aligning the beginning of an object.  This is an
-     lvalue.  *Note Obstacks Data Alignment::.
-
-`int obstack_chunk_size (struct obstack *OBSTACK-PTR)'
-     The size for allocating chunks.  This is an lvalue.  *Note Obstack
-     Chunks::.
-
-`void *obstack_base (struct obstack *OBSTACK-PTR)'
-     Tentative starting address of the currently growing object.  *Note
-     Status of an Obstack::.
-
-`void *obstack_next_free (struct obstack *OBSTACK-PTR)'
-     Address just after the end of the currently growing object.  *Note
-     Status of an Obstack::.
-
-
-File: libc.info,  Node: Variable Size Automatic,  Prev: Obstacks,  Up: Memory Allocation
-
-3.2.5 Automatic Storage with Variable Size
-------------------------------------------
-
-The function `alloca' supports a kind of half-dynamic allocation in
-which blocks are allocated dynamically but freed automatically.
-
-   Allocating a block with `alloca' is an explicit action; you can
-allocate as many blocks as you wish, and compute the size at run time.
-But all the blocks are freed when you exit the function that `alloca'
-was called from, just as if they were automatic variables declared in
-that function.  There is no way to free the space explicitly.
-
-   The prototype for `alloca' is in `stdlib.h'.  This function is a BSD
-extension.  
-
- -- Function: void * alloca (size_t SIZE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The return value of `alloca' is the address of a block of SIZE
-     bytes of memory, allocated in the stack frame of the calling
-     function.
-
-   Do not use `alloca' inside the arguments of a function call--you
-will get unpredictable results, because the stack space for the
-`alloca' would appear on the stack in the middle of the space for the
-function arguments.  An example of what to avoid is `foo (x, alloca
-(4), y)'.
-
-* Menu:
-
-* Alloca Example::              Example of using `alloca'.
-* Advantages of Alloca::        Reasons to use `alloca'.
-* Disadvantages of Alloca::     Reasons to avoid `alloca'.
-* GNU C Variable-Size Arrays::  Only in GNU C, here is an alternative
-				 method of allocating dynamically and
-				 freeing automatically.
-
-
-File: libc.info,  Node: Alloca Example,  Next: Advantages of Alloca,  Up: Variable Size Automatic
-
-3.2.5.1 `alloca' Example
-........................
-
-As an example of the use of `alloca', here is a function that opens a
-file name made from concatenating two argument strings, and returns a
-file descriptor or minus one signifying failure:
-
-     int
-     open2 (char *str1, char *str2, int flags, int mode)
-     {
-       char *name = (char *) alloca (strlen (str1) + strlen (str2) + 1);
-       stpcpy (stpcpy (name, str1), str2);
-       return open (name, flags, mode);
-     }
-
-Here is how you would get the same results with `malloc' and `free':
-
-     int
-     open2 (char *str1, char *str2, int flags, int mode)
-     {
-       char *name = (char *) malloc (strlen (str1) + strlen (str2) + 1);
-       int desc;
-       if (name == 0)
-         fatal ("virtual memory exceeded");
-       stpcpy (stpcpy (name, str1), str2);
-       desc = open (name, flags, mode);
-       free (name);
-       return desc;
-     }
-
-   As you can see, it is simpler with `alloca'.  But `alloca' has
-other, more important advantages, and some disadvantages.
-
-
-File: libc.info,  Node: Advantages of Alloca,  Next: Disadvantages of Alloca,  Prev: Alloca Example,  Up: Variable Size Automatic
-
-3.2.5.2 Advantages of `alloca'
-..............................
-
-Here are the reasons why `alloca' may be preferable to `malloc':
-
-   * Using `alloca' wastes very little space and is very fast.  (It is
-     open-coded by the GNU C compiler.)
-
-   * Since `alloca' does not have separate pools for different sizes of
-     block, space used for any size block can be reused for any other
-     size.  `alloca' does not cause memory fragmentation.
-
-   * Nonlocal exits done with `longjmp' (*note Non-Local Exits::)
-     automatically free the space allocated with `alloca' when they exit
-     through the function that called `alloca'.  This is the most
-     important reason to use `alloca'.
-
-     To illustrate this, suppose you have a function
-     `open_or_report_error' which returns a descriptor, like `open', if
-     it succeeds, but does not return to its caller if it fails.  If
-     the file cannot be opened, it prints an error message and jumps
-     out to the command level of your program using `longjmp'.  Let's
-     change `open2' (*note Alloca Example::) to use this subroutine:
-
-          int
-          open2 (char *str1, char *str2, int flags, int mode)
-          {
-            char *name = (char *) alloca (strlen (str1) + strlen (str2) + 1);
-            stpcpy (stpcpy (name, str1), str2);
-            return open_or_report_error (name, flags, mode);
-          }
-
-     Because of the way `alloca' works, the memory it allocates is
-     freed even when an error occurs, with no special effort required.
-
-     By contrast, the previous definition of `open2' (which uses
-     `malloc' and `free') would develop a memory leak if it were
-     changed in this way.  Even if you are willing to make more changes
-     to fix it, there is no easy way to do so.
-
-
-File: libc.info,  Node: Disadvantages of Alloca,  Next: GNU C Variable-Size Arrays,  Prev: Advantages of Alloca,  Up: Variable Size Automatic
-
-3.2.5.3 Disadvantages of `alloca'
-.................................
-
-These are the disadvantages of `alloca' in comparison with `malloc':
-
-   * If you try to allocate more memory than the machine can provide,
-     you don't get a clean error message.  Instead you get a fatal
-     signal like the one you would get from an infinite recursion;
-     probably a segmentation violation (*note Program Error Signals::).
-
-   * Some non-GNU systems fail to support `alloca', so it is less
-     portable.  However, a slower emulation of `alloca' written in C is
-     available for use on systems with this deficiency.
-
-
-File: libc.info,  Node: GNU C Variable-Size Arrays,  Prev: Disadvantages of Alloca,  Up: Variable Size Automatic
-
-3.2.5.4 GNU C Variable-Size Arrays
-..................................
-
-In GNU C, you can replace most uses of `alloca' with an array of
-variable size.  Here is how `open2' would look then:
-
-     int open2 (char *str1, char *str2, int flags, int mode)
-     {
-       char name[strlen (str1) + strlen (str2) + 1];
-       stpcpy (stpcpy (name, str1), str2);
-       return open (name, flags, mode);
-     }
-
-   But `alloca' is not always equivalent to a variable-sized array, for
-several reasons:
-
-   * A variable size array's space is freed at the end of the scope of
-     the name of the array.  The space allocated with `alloca' remains
-     until the end of the function.
-
-   * It is possible to use `alloca' within a loop, allocating an
-     additional block on each iteration.  This is impossible with
-     variable-sized arrays.
-
-   *NB:* If you mix use of `alloca' and variable-sized arrays within
-one function, exiting a scope in which a variable-sized array was
-declared frees all blocks allocated with `alloca' during the execution
-of that scope.
-
-
-File: libc.info,  Node: Resizing the Data Segment,  Next: Locking Pages,  Prev: Memory Allocation,  Up: Memory
-
-3.3 Resizing the Data Segment
-=============================
-
-The symbols in this section are declared in `unistd.h'.
-
-   You will not normally use the functions in this section, because the
-functions described in *note Memory Allocation:: are easier to use.
-Those are interfaces to a GNU C Library memory allocator that uses the
-functions below itself.  The functions below are simple interfaces to
-system calls.
-
- -- Function: int brk (void *ADDR)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `brk' sets the high end of the calling process' data segment to
-     ADDR.
-
-     The address of the end of a segment is defined to be the address
-     of the last byte in the segment plus 1.
-
-     The function has no effect if ADDR is lower than the low end of
-     the data segment.  (This is considered success, by the way).
-
-     The function fails if it would cause the data segment to overlap
-     another segment or exceed the process' data storage limit (*note
-     Limits on Resources::).
-
-     The function is named for a common historical case where data
-     storage and the stack are in the same segment.  Data storage
-     allocation grows upward from the bottom of the segment while the
-     stack grows downward toward it from the top of the segment and the
-     curtain between them is called the "break".
-
-     The return value is zero on success.  On failure, the return value
-     is `-1' and `errno' is set accordingly.  The following `errno'
-     values are specific to this function:
-
-    `ENOMEM'
-          The request would cause the data segment to overlap another
-          segment or exceed the process' data storage limit.
-
-
- -- Function: void *sbrk (ptrdiff_t DELTA)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is the same as `brk' except that you specify the new
-     end of the data segment as an offset DELTA from the current end
-     and on success the return value is the address of the resulting
-     end of the data segment instead of zero.
-
-     This means you can use `sbrk(0)' to find out what the current end
-     of the data segment is.
-
-
-
-File: libc.info,  Node: Locking Pages,  Prev: Resizing the Data Segment,  Up: Memory
-
-3.4 Locking Pages
-=================
-
-You can tell the system to associate a particular virtual memory page
-with a real page frame and keep it that way -- i.e., cause the page to
-be paged in if it isn't already and mark it so it will never be paged
-out and consequently will never cause a page fault.  This is called
-"locking" a page.
-
-   The functions in this chapter lock and unlock the calling process'
-pages.
-
-* Menu:
-
-* Why Lock Pages::                Reasons to read this section.
-* Locked Memory Details::         Everything you need to know locked
-                                    memory
-* Page Lock Functions::           Here's how to do it.
-
-
-File: libc.info,  Node: Why Lock Pages,  Next: Locked Memory Details,  Up: Locking Pages
-
-3.4.1 Why Lock Pages
---------------------
-
-Because page faults cause paged out pages to be paged in transparently,
-a process rarely needs to be concerned about locking pages.  However,
-there are two reasons people sometimes are:
-
-   * Speed.  A page fault is transparent only insofar as the process is
-     not sensitive to how long it takes to do a simple memory access.
-     Time-critical processes, especially realtime processes, may not be
-     able to wait or may not be able to tolerate variance in execution
-     speed.  
-
-     A process that needs to lock pages for this reason probably also
-     needs priority among other processes for use of the CPU.  *Note
-     Priority::.
-
-     In some cases, the programmer knows better than the system's demand
-     paging allocator which pages should remain in real memory to
-     optimize system performance.  In this case, locking pages can help.
-
-   * Privacy.  If you keep secrets in virtual memory and that virtual
-     memory gets paged out, that increases the chance that the secrets
-     will get out.  If a password gets written out to disk swap space,
-     for example, it might still be there long after virtual and real
-     memory have been wiped clean.
-
-
-   Be aware that when you lock a page, that's one fewer page frame that
-can be used to back other virtual memory (by the same or other
-processes), which can mean more page faults, which means the system
-runs more slowly.  In fact, if you lock enough memory, some programs
-may not be able to run at all for lack of real memory.
-
-
-File: libc.info,  Node: Locked Memory Details,  Next: Page Lock Functions,  Prev: Why Lock Pages,  Up: Locking Pages
-
-3.4.2 Locked Memory Details
----------------------------
-
-A memory lock is associated with a virtual page, not a real frame.  The
-paging rule is: If a frame backs at least one locked page, don't page it
-out.
-
-   Memory locks do not stack.  I.e., you can't lock a particular page
-twice so that it has to be unlocked twice before it is truly unlocked.
-It is either locked or it isn't.
-
-   A memory lock persists until the process that owns the memory
-explicitly unlocks it.  (But process termination and exec cause the
-virtual memory to cease to exist, which you might say means it isn't
-locked any more).
-
-   Memory locks are not inherited by child processes.  (But note that
-on a modern Unix system, immediately after a fork, the parent's and the
-child's virtual address space are backed by the same real page frames,
-so the child enjoys the parent's locks).  *Note Creating a Process::.
-
-   Because of its ability to impact other processes, only the superuser
-can lock a page.  Any process can unlock its own page.
-
-   The system sets limits on the amount of memory a process can have
-locked and the amount of real memory it can have dedicated to it.
-*Note Limits on Resources::.
-
-   In Linux, locked pages aren't as locked as you might think.  Two
-virtual pages that are not shared memory can nonetheless be backed by
-the same real frame.  The kernel does this in the name of efficiency
-when it knows both virtual pages contain identical data, and does it
-even if one or both of the virtual pages are locked.
-
-   But when a process modifies one of those pages, the kernel must get
-it a separate frame and fill it with the page's data.  This is known as
-a "copy-on-write page fault".  It takes a small amount of time and in a
-pathological case, getting that frame may require I/O.  
-
-   To make sure this doesn't happen to your program, don't just lock the
-pages.  Write to them as well, unless you know you won't write to them
-ever.  And to make sure you have pre-allocated frames for your stack,
-enter a scope that declares a C automatic variable larger than the
-maximum stack size you will need, set it to something, then return from
-its scope.
-
-
-File: libc.info,  Node: Page Lock Functions,  Prev: Locked Memory Details,  Up: Locking Pages
-
-3.4.3 Functions To Lock And Unlock Pages
-----------------------------------------
-
-The symbols in this section are declared in `sys/mman.h'.  These
-functions are defined by POSIX.1b, but their availability depends on
-your kernel.  If your kernel doesn't allow these functions, they exist
-but always fail.  They _are_ available with a Linux kernel.
-
-   *Portability Note:* POSIX.1b requires that when the `mlock' and
-`munlock' functions are available, the file `unistd.h' define the macro
-`_POSIX_MEMLOCK_RANGE' and the file `limits.h' define the macro
-`PAGESIZE' to be the size of a memory page in bytes.  It requires that
-when the `mlockall' and `munlockall' functions are available, the
-`unistd.h' file define the macro `_POSIX_MEMLOCK'.  The GNU C Library
-conforms to this requirement.
-
- -- Function: int mlock (const void *ADDR, size_t LEN)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `mlock' locks a range of the calling process' virtual pages.
-
-     The range of memory starts at address ADDR and is LEN bytes long.
-     Actually, since you must lock whole pages, it is the range of
-     pages that include any part of the specified range.
-
-     When the function returns successfully, each of those pages is
-     backed by (connected to) a real frame (is resident) and is marked
-     to stay that way.  This means the function may cause page-ins and
-     have to wait for them.
-
-     When the function fails, it does not affect the lock status of any
-     pages.
-
-     The return value is zero if the function succeeds.  Otherwise, it
-     is `-1' and `errno' is set accordingly.  `errno' values specific
-     to this function are:
-
-    `ENOMEM'
-             * At least some of the specified address range does not
-               exist in the calling process' virtual address space.
-
-             * The locking would cause the process to exceed its locked
-               page limit.
-
-    `EPERM'
-          The calling process is not superuser.
-
-    `EINVAL'
-          LEN is not positive.
-
-    `ENOSYS'
-          The kernel does not provide `mlock' capability.
-
-
-     You can lock _all_ a process' memory with `mlockall'.  You unlock
-     memory with `munlock' or `munlockall'.
-
-     To avoid all page faults in a C program, you have to use
-     `mlockall', because some of the memory a program uses is hidden
-     from the C code, e.g. the stack and automatic variables, and you
-     wouldn't know what address to tell `mlock'.
-
-
- -- Function: int munlock (const void *ADDR, size_t LEN)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `munlock' unlocks a range of the calling process' virtual pages.
-
-     `munlock' is the inverse of `mlock' and functions completely
-     analogously to `mlock', except that there is no `EPERM' failure.
-
-
- -- Function: int mlockall (int FLAGS)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `mlockall' locks all the pages in a process' virtual memory address
-     space, and/or any that are added to it in the future.  This
-     includes the pages of the code, data and stack segment, as well as
-     shared libraries, user space kernel data, shared memory, and
-     memory mapped files.
-
-     FLAGS is a string of single bit flags represented by the following
-     macros.  They tell `mlockall' which of its functions you want.  All
-     other bits must be zero.
-
-    `MCL_CURRENT'
-          Lock all pages which currently exist in the calling process'
-          virtual address space.
-
-    `MCL_FUTURE'
-          Set a mode such that any pages added to the process' virtual
-          address space in the future will be locked from birth.  This
-          mode does not affect future address spaces owned by the same
-          process so exec, which replaces a process' address space,
-          wipes out `MCL_FUTURE'.  *Note Executing a File::.
-
-
-     When the function returns successfully, and you specified
-     `MCL_CURRENT', all of the process' pages are backed by (connected
-     to) real frames (they are resident) and are marked to stay that
-     way.  This means the function may cause page-ins and have to wait
-     for them.
-
-     When the process is in `MCL_FUTURE' mode because it successfully
-     executed this function and specified `MCL_CURRENT', any system call
-     by the process that requires space be added to its virtual address
-     space fails with `errno' = `ENOMEM' if locking the additional space
-     would cause the process to exceed its locked page limit.  In the
-     case that the address space addition that can't be accommodated is
-     stack expansion, the stack expansion fails and the kernel sends a
-     `SIGSEGV' signal to the process.
-
-     When the function fails, it does not affect the lock status of any
-     pages or the future locking mode.
-
-     The return value is zero if the function succeeds.  Otherwise, it
-     is `-1' and `errno' is set accordingly.  `errno' values specific
-     to this function are:
-
-    `ENOMEM'
-             * At least some of the specified address range does not
-               exist in the calling process' virtual address space.
-
-             * The locking would cause the process to exceed its locked
-               page limit.
-
-    `EPERM'
-          The calling process is not superuser.
-
-    `EINVAL'
-          Undefined bits in FLAGS are not zero.
-
-    `ENOSYS'
-          The kernel does not provide `mlockall' capability.
-
-
-     You can lock just specific pages with `mlock'.  You unlock pages
-     with `munlockall' and `munlock'.
-
-
- -- Function: int munlockall (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `munlockall' unlocks every page in the calling process' virtual
-     address space and turn off `MCL_FUTURE' future locking mode.
-
-     The return value is zero if the function succeeds.  Otherwise, it
-     is `-1' and `errno' is set accordingly.  The only way this
-     function can fail is for generic reasons that all functions and
-     system calls can fail, so there are no specific `errno' values.
-
-
-
-File: libc.info,  Node: Character Handling,  Next: String and Array Utilities,  Prev: Memory,  Up: Top
-
-4 Character Handling
-********************
-
-Programs that work with characters and strings often need to classify a
-character--is it alphabetic, is it a digit, is it whitespace, and so
-on--and perform case conversion operations on characters.  The
-functions in the header file `ctype.h' are provided for this purpose.  
-
-   Since the choice of locale and character set can alter the
-classifications of particular character codes, all of these functions
-are affected by the current locale.  (More precisely, they are affected
-by the locale currently selected for character classification--the
-`LC_CTYPE' category; see *note Locale Categories::.)
-
-   The ISO C standard specifies two different sets of functions.  The
-one set works on `char' type characters, the other one on `wchar_t'
-wide characters (*note Extended Char Intro::).
-
-* Menu:
-
-* Classification of Characters::       Testing whether characters are
-			                letters, digits, punctuation, etc.
-
-* Case Conversion::                    Case mapping, and the like.
-* Classification of Wide Characters::  Character class determination for
-                                        wide characters.
-* Using Wide Char Classes::            Notes on using the wide character
-                                        classes.
-* Wide Character Case Conversion::     Mapping of wide characters.
-
-
-File: libc.info,  Node: Classification of Characters,  Next: Case Conversion,  Up: Character Handling
-
-4.1 Classification of Characters
-================================
-
-This section explains the library functions for classifying characters.
-For example, `isalpha' is the function to test for an alphabetic
-character.  It takes one argument, the character to test, and returns a
-nonzero integer if the character is alphabetic, and zero otherwise.  You
-would use it like this:
-
-     if (isalpha (c))
-       printf ("The character `%c' is alphabetic.\n", c);
-
-   Each of the functions in this section tests for membership in a
-particular class of characters; each has a name starting with `is'.
-Each of them takes one argument, which is a character to test, and
-returns an `int' which is treated as a boolean value.  The character
-argument is passed as an `int', and it may be the constant value `EOF'
-instead of a real character.
-
-   The attributes of any given character can vary between locales.
-*Note Locales::, for more information on locales.
-
-   These functions are declared in the header file `ctype.h'.  
-
- -- Function: int islower (int C)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Returns true if C is a lower-case letter.  The letter need not be
-     from the Latin alphabet, any alphabet representable is valid.
-
- -- Function: int isupper (int C)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Returns true if C is an upper-case letter.  The letter need not be
-     from the Latin alphabet, any alphabet representable is valid.
-
- -- Function: int isalpha (int C)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Returns true if C is an alphabetic character (a letter).  If
-     `islower' or `isupper' is true of a character, then `isalpha' is
-     also true.
-
-     In some locales, there may be additional characters for which
-     `isalpha' is true--letters which are neither upper case nor lower
-     case.  But in the standard `"C"' locale, there are no such
-     additional characters.
-
- -- Function: int isdigit (int C)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Returns true if C is a decimal digit (`0' through `9').
-
- -- Function: int isalnum (int C)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Returns true if C is an alphanumeric character (a letter or
-     number); in other words, if either `isalpha' or `isdigit' is true
-     of a character, then `isalnum' is also true.
-
- -- Function: int isxdigit (int C)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Returns true if C is a hexadecimal digit.  Hexadecimal digits
-     include the normal decimal digits `0' through `9' and the letters
-     `A' through `F' and `a' through `f'.
-
- -- Function: int ispunct (int C)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Returns true if C is a punctuation character.  This means any
-     printing character that is not alphanumeric or a space character.
-
- -- Function: int isspace (int C)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Returns true if C is a "whitespace" character.  In the standard
-     `"C"' locale, `isspace' returns true for only the standard
-     whitespace characters:
-
-    `' ''
-          space
-
-    `'\f''
-          formfeed
-
-    `'\n''
-          newline
-
-    `'\r''
-          carriage return
-
-    `'\t''
-          horizontal tab
-
-    `'\v''
-          vertical tab
-
- -- Function: int isblank (int C)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Returns true if C is a blank character; that is, a space or a tab.
-     This function was originally a GNU extension, but was added in
-     ISO C99.
-
- -- Function: int isgraph (int C)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Returns true if C is a graphic character; that is, a character
-     that has a glyph associated with it.  The whitespace characters
-     are not considered graphic.
-
- -- Function: int isprint (int C)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Returns true if C is a printing character.  Printing characters
-     include all the graphic characters, plus the space (` ') character.
-
- -- Function: int iscntrl (int C)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Returns true if C is a control character (that is, a character that
-     is not a printing character).
-
- -- Function: int isascii (int C)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Returns true if C is a 7-bit `unsigned char' value that fits into
-     the US/UK ASCII character set.  This function is a BSD extension
-     and is also an SVID extension.
-
-
-File: libc.info,  Node: Case Conversion,  Next: Classification of Wide Characters,  Prev: Classification of Characters,  Up: Character Handling
-
-4.2 Case Conversion
-===================
-
-This section explains the library functions for performing conversions
-such as case mappings on characters.  For example, `toupper' converts
-any character to upper case if possible.  If the character can't be
-converted, `toupper' returns it unchanged.
-
-   These functions take one argument of type `int', which is the
-character to convert, and return the converted character as an `int'.
-If the conversion is not applicable to the argument given, the argument
-is returned unchanged.
-
-   *Compatibility Note:* In pre-ISO C dialects, instead of returning
-the argument unchanged, these functions may fail when the argument is
-not suitable for the conversion.  Thus for portability, you may need to
-write `islower(c) ? toupper(c) : c' rather than just `toupper(c)'.
-
-   These functions are declared in the header file `ctype.h'.  
-
- -- Function: int tolower (int C)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     If C is an upper-case letter, `tolower' returns the corresponding
-     lower-case letter.  If C is not an upper-case letter, C is
-     returned unchanged.
-
- -- Function: int toupper (int C)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     If C is a lower-case letter, `toupper' returns the corresponding
-     upper-case letter.  Otherwise C is returned unchanged.
-
- -- Function: int toascii (int C)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function converts C to a 7-bit `unsigned char' value that
-     fits into the US/UK ASCII character set, by clearing the high-order
-     bits.  This function is a BSD extension and is also an SVID
-     extension.
-
- -- Function: int _tolower (int C)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This is identical to `tolower', and is provided for compatibility
-     with the SVID.  *Note SVID::.
-
- -- Function: int _toupper (int C)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This is identical to `toupper', and is provided for compatibility
-     with the SVID.
-
-
-File: libc.info,  Node: Classification of Wide Characters,  Next: Using Wide Char Classes,  Prev: Case Conversion,  Up: Character Handling
-
-4.3 Character class determination for wide characters
-=====================================================
-
-Amendment 1 to ISO C90 defines functions to classify wide characters.
-Although the original ISO C90 standard already defined the type
-`wchar_t', no functions operating on them were defined.
-
-   The general design of the classification functions for wide
-characters is more general.  It allows extensions to the set of
-available classifications, beyond those which are always available.
-The POSIX standard specifies how extensions can be made, and this is
-already implemented in the GNU C Library implementation of the
-`localedef' program.
-
-   The character class functions are normally implemented with bitsets,
-with a bitset per character.  For a given character, the appropriate
-bitset is read from a table and a test is performed as to whether a
-certain bit is set.  Which bit is tested for is determined by the class.
-
-   For the wide character classification functions this is made visible.
-There is a type classification type defined, a function to retrieve this
-value for a given class, and a function to test whether a given
-character is in this class, using the classification value.  On top of
-this the normal character classification functions as used for `char'
-objects can be defined.
-
- -- Data type: wctype_t
-     The `wctype_t' can hold a value which represents a character class.
-     The only defined way to generate such a value is by using the
-     `wctype' function.
-
-     This type is defined in `wctype.h'.
-
- -- Function: wctype_t wctype (const char *PROPERTY)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     The `wctype' returns a value representing a class of wide
-     characters which is identified by the string PROPERTY.  Beside
-     some standard properties each locale can define its own ones.  In
-     case no property with the given name is known for the current
-     locale selected for the `LC_CTYPE' category, the function returns
-     zero.
-
-     The properties known in every locale are:
-
-     `"alnum"'         `"alpha"'         `"cntrl"'         `"digit"'
-     `"graph"'         `"lower"'         `"print"'         `"punct"'
-     `"space"'         `"upper"'         `"xdigit"'        
-
-     This function is declared in `wctype.h'.
-
-   To test the membership of a character to one of the non-standard
-classes the ISO C standard defines a completely new function.
-
- -- Function: int iswctype (wint_t WC, wctype_t DESC)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function returns a nonzero value if WC is in the character
-     class specified by DESC.  DESC must previously be returned by a
-     successful call to `wctype'.
-
-     This function is declared in `wctype.h'.
-
-   To make it easier to use the commonly-used classification functions,
-they are defined in the C library.  There is no need to use `wctype' if
-the property string is one of the known character classes.  In some
-situations it is desirable to construct the property strings, and then
-it is important that `wctype' can also handle the standard classes.
-
- -- Function: int iswalnum (wint_t WC)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     This function returns a nonzero value if WC is an alphanumeric
-     character (a letter or number); in other words, if either
-     `iswalpha' or `iswdigit' is true of a character, then `iswalnum'
-     is also true.
-
-     This function can be implemented using
-
-          iswctype (wc, wctype ("alnum"))
-
-     It is declared in `wctype.h'.
-
- -- Function: int iswalpha (wint_t WC)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     Returns true if WC is an alphabetic character (a letter).  If
-     `iswlower' or `iswupper' is true of a character, then `iswalpha'
-     is also true.
-
-     In some locales, there may be additional characters for which
-     `iswalpha' is true--letters which are neither upper case nor lower
-     case.  But in the standard `"C"' locale, there are no such
-     additional characters.
-
-     This function can be implemented using
-
-          iswctype (wc, wctype ("alpha"))
-
-     It is declared in `wctype.h'.
-
- -- Function: int iswcntrl (wint_t WC)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     Returns true if WC is a control character (that is, a character
-     that is not a printing character).
-
-     This function can be implemented using
-
-          iswctype (wc, wctype ("cntrl"))
-
-     It is declared in `wctype.h'.
-
- -- Function: int iswdigit (wint_t WC)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     Returns true if WC is a digit (e.g., `0' through `9').  Please
-     note that this function does not only return a nonzero value for
-     _decimal_ digits, but for all kinds of digits.  A consequence is
-     that code like the following will *not* work unconditionally for
-     wide characters:
-
-          n = 0;
-          while (iswdigit (*wc))
-            {
-              n *= 10;
-              n += *wc++ - L'0';
-            }
-
-     This function can be implemented using
-
-          iswctype (wc, wctype ("digit"))
-
-     It is declared in `wctype.h'.
-
- -- Function: int iswgraph (wint_t WC)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     Returns true if WC is a graphic character; that is, a character
-     that has a glyph associated with it.  The whitespace characters
-     are not considered graphic.
-
-     This function can be implemented using
-
-          iswctype (wc, wctype ("graph"))
-
-     It is declared in `wctype.h'.
-
- -- Function: int iswlower (wint_t WC)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     Returns true if WC is a lower-case letter.  The letter need not be
-     from the Latin alphabet, any alphabet representable is valid.
-
-     This function can be implemented using
-
-          iswctype (wc, wctype ("lower"))
-
-     It is declared in `wctype.h'.
-
- -- Function: int iswprint (wint_t WC)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     Returns true if WC is a printing character.  Printing characters
-     include all the graphic characters, plus the space (` ') character.
-
-     This function can be implemented using
-
-          iswctype (wc, wctype ("print"))
-
-     It is declared in `wctype.h'.
-
- -- Function: int iswpunct (wint_t WC)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     Returns true if WC is a punctuation character.  This means any
-     printing character that is not alphanumeric or a space character.
-
-     This function can be implemented using
-
-          iswctype (wc, wctype ("punct"))
-
-     It is declared in `wctype.h'.
-
- -- Function: int iswspace (wint_t WC)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     Returns true if WC is a "whitespace" character.  In the standard
-     `"C"' locale, `iswspace' returns true for only the standard
-     whitespace characters:
-
-    `L' ''
-          space
-
-    `L'\f''
-          formfeed
-
-    `L'\n''
-          newline
-
-    `L'\r''
-          carriage return
-
-    `L'\t''
-          horizontal tab
-
-    `L'\v''
-          vertical tab
-
-     This function can be implemented using
-
-          iswctype (wc, wctype ("space"))
-
-     It is declared in `wctype.h'.
-
- -- Function: int iswupper (wint_t WC)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     Returns true if WC is an upper-case letter.  The letter need not be
-     from the Latin alphabet, any alphabet representable is valid.
-
-     This function can be implemented using
-
-          iswctype (wc, wctype ("upper"))
-
-     It is declared in `wctype.h'.
-
- -- Function: int iswxdigit (wint_t WC)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     Returns true if WC is a hexadecimal digit.  Hexadecimal digits
-     include the normal decimal digits `0' through `9' and the letters
-     `A' through `F' and `a' through `f'.
-
-     This function can be implemented using
-
-          iswctype (wc, wctype ("xdigit"))
-
-     It is declared in `wctype.h'.
-
-   The GNU C Library also provides a function which is not defined in
-the ISO C standard but which is available as a version for single byte
-characters as well.
-
- -- Function: int iswblank (wint_t WC)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     Returns true if WC is a blank character; that is, a space or a tab.
-     This function was originally a GNU extension, but was added in
-     ISO C99.  It is declared in `wchar.h'.
-
-
-File: libc.info,  Node: Using Wide Char Classes,  Next: Wide Character Case Conversion,  Prev: Classification of Wide Characters,  Up: Character Handling
-
-4.4 Notes on using the wide character classes
-=============================================
-
-The first note is probably not astonishing but still occasionally a
-cause of problems.  The `iswXXX' functions can be implemented using
-macros and in fact, the GNU C Library does this.  They are still
-available as real functions but when the `wctype.h' header is included
-the macros will be used.  This is the same as the `char' type versions
-of these functions.
-
-   The second note covers something new.  It can be best illustrated by
-a (real-world) example.  The first piece of code is an excerpt from the
-original code.  It is truncated a bit but the intention should be clear.
-
-     int
-     is_in_class (int c, const char *class)
-     {
-       if (strcmp (class, "alnum") == 0)
-         return isalnum (c);
-       if (strcmp (class, "alpha") == 0)
-         return isalpha (c);
-       if (strcmp (class, "cntrl") == 0)
-         return iscntrl (c);
-       ...
-       return 0;
-     }
-
-   Now, with the `wctype' and `iswctype' you can avoid the `if'
-cascades, but rewriting the code as follows is wrong:
-
-     int
-     is_in_class (int c, const char *class)
-     {
-       wctype_t desc = wctype (class);
-       return desc ? iswctype ((wint_t) c, desc) : 0;
-     }
-
-   The problem is that it is not guaranteed that the wide character
-representation of a single-byte character can be found using casting.
-In fact, usually this fails miserably.  The correct solution to this
-problem is to write the code as follows:
-
-     int
-     is_in_class (int c, const char *class)
-     {
-       wctype_t desc = wctype (class);
-       return desc ? iswctype (btowc (c), desc) : 0;
-     }
-
-   *Note Converting a Character::, for more information on `btowc'.
-Note that this change probably does not improve the performance of the
-program a lot since the `wctype' function still has to make the string
-comparisons.  It gets really interesting if the `is_in_class' function
-is called more than once for the same class name.  In this case the
-variable DESC could be computed once and reused for all the calls.
-Therefore the above form of the function is probably not the final one.
-
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-10 b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-10
index ce0c969..7382771 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-10
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-10
@@ -1,7 +1,24 @@
-This is
-/usr/local/google/home/jnewlin/src/uclibc/buildroot/output/build/glibc-2.19/build/manual/libc.info,
-produced by makeinfo version 4.13 from libc.texinfo.
+This is libc.info, produced by makeinfo version 5.2 from libc.texinfo.
 
+This file documents the GNU C Library.
+
+   This is 'The GNU C Library Reference Manual', for version 2.19
+(Buildroot).
+
+   Copyright (C) 1993-2014 Free Software Foundation, Inc.
+
+   Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being "Free Software Needs Free Documentation" and
+"GNU Lesser General Public License", the Front-Cover texts being "A GNU
+Manual", and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled "GNU Free Documentation
+License".
+
+   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
+modify this GNU manual.  Buying copies from the FSF supports it in
+developing GNU and promoting software freedom."
 INFO-DIR-SECTION Software libraries
 START-INFO-DIR-ENTRY
 * Libc: (libc).                 C library.
@@ -1692,8438 +1709,5814 @@
 * ynl: (libc)Special Functions.
 END-INFO-DIR-ENTRY
 
-   This file documents the GNU C Library.
-
-   This is `The GNU C Library Reference Manual', for version 2.19
-(Buildroot).
-
-   Copyright (C) 1993-2014 Free Software Foundation, Inc.
-
-   Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version
-1.3 or any later version published by the Free Software Foundation;
-with the Invariant Sections being "Free Software Needs Free
-Documentation" and "GNU Lesser General Public License", the Front-Cover
-texts being "A GNU Manual", and with the Back-Cover Texts as in (a)
-below.  A copy of the license is included in the section entitled "GNU
-Free Documentation License".
-
-   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
-modify this GNU manual.  Buying copies from the FSF supports it in
-developing GNU and promoting software freedom."
-
 
-File: libc.info,  Node: Library Summary,  Next: Installation,  Prev: Language Features,  Up: Top
+File: libc.info,  Node: Argp Examples,  Next: Argp User Customization,  Prev: Argp Help,  Up: Argp
 
-Appendix B Summary of Library Facilities
-****************************************
+25.3.11 Argp Examples
+---------------------
 
-This appendix is a complete list of the facilities declared within the
-header files supplied with the GNU C Library.  Each entry also lists the
-standard or other source from which each facility is derived, and tells
-you where in the manual you can find more information about how to use
-it.
-
-`long int a64l (const char *STRING)'
-     `stdlib.h' (XPG):  *note Encode Binary Data::.
-
-`void abort (void)'
-     `stdlib.h' (ISO):  *note Aborting a Program::.
-
-`int abs (int NUMBER)'
-     `stdlib.h' (ISO):  *note Absolute Value::.
-
-`int accept (int SOCKET, struct sockaddr *ADDR, socklen_t *LENGTH_PTR)'
-     `sys/socket.h' (BSD):  *note Accepting Connections::.
-
-`int access (const char *FILENAME, int HOW)'
-     `unistd.h' (POSIX.1):  *note Testing File Access::.
-
-`ACCOUNTING'
-     `utmp.h' (SVID):  *note Manipulating the Database::.
-
-`double acos (double X)'
-     `math.h' (ISO):  *note Inverse Trig Functions::.
-
-`float acosf (float X)'
-     `math.h' (ISO):  *note Inverse Trig Functions::.
-
-`double acosh (double X)'
-     `math.h' (ISO):  *note Hyperbolic Functions::.
-
-`float acoshf (float X)'
-     `math.h' (ISO):  *note Hyperbolic Functions::.
-
-`long double acoshl (long double X)'
-     `math.h' (ISO):  *note Hyperbolic Functions::.
-
-`long double acosl (long double X)'
-     `math.h' (ISO):  *note Inverse Trig Functions::.
-
-`int addmntent (FILE *STREAM, const struct mntent *MNT)'
-     `mntent.h' (BSD):  *note mtab::.
-
-`int adjtime (const struct timeval *DELTA, struct timeval *OLDDELTA)'
-     `sys/time.h' (BSD):  *note High-Resolution Calendar::.
-
-`int adjtimex (struct timex *TIMEX)'
-     `sys/timex.h' (GNU):  *note High-Resolution Calendar::.
-
-`AF_FILE'
-     `sys/socket.h' (GNU):  *note Address Formats::.
-
-`AF_INET'
-     `sys/socket.h' (BSD):  *note Address Formats::.
-
-`AF_INET6'
-     `sys/socket.h' (IPv6 Basic API):  *note Address Formats::.
-
-`AF_LOCAL'
-     `sys/socket.h' (POSIX):  *note Address Formats::.
-
-`AF_UNIX'
-     `sys/socket.h' (BSD, Unix98):  *note Address Formats::.
-
-`AF_UNSPEC'
-     `sys/socket.h' (BSD):  *note Address Formats::.
-
-`int aio_cancel (int FILDES, struct aiocb *AIOCBP)'
-     `aio.h' (POSIX.1b):  *note Cancel AIO Operations::.
-
-`int aio_cancel64 (int FILDES, struct aiocb64 *AIOCBP)'
-     `aio.h' (Unix98):  *note Cancel AIO Operations::.
-
-`int aio_error (const struct aiocb *AIOCBP)'
-     `aio.h' (POSIX.1b):  *note Status of AIO Operations::.
-
-`int aio_error64 (const struct aiocb64 *AIOCBP)'
-     `aio.h' (Unix98):  *note Status of AIO Operations::.
-
-`int aio_fsync (int OP, struct aiocb *AIOCBP)'
-     `aio.h' (POSIX.1b):  *note Synchronizing AIO Operations::.
-
-`int aio_fsync64 (int OP, struct aiocb64 *AIOCBP)'
-     `aio.h' (Unix98):  *note Synchronizing AIO Operations::.
-
-`void aio_init (const struct aioinit *INIT)'
-     `aio.h' (GNU):  *note Configuration of AIO::.
-
-`int aio_read (struct aiocb *AIOCBP)'
-     `aio.h' (POSIX.1b):  *note Asynchronous Reads/Writes::.
-
-`int aio_read64 (struct aiocb64 *AIOCBP)'
-     `aio.h' (Unix98):  *note Asynchronous Reads/Writes::.
-
-`ssize_t aio_return (struct aiocb *AIOCBP)'
-     `aio.h' (POSIX.1b):  *note Status of AIO Operations::.
-
-`ssize_t aio_return64 (struct aiocb64 *AIOCBP)'
-     `aio.h' (Unix98):  *note Status of AIO Operations::.
-
-`int aio_suspend (const struct aiocb *const LIST[], int NENT, const struct timespec *TIMEOUT)'
-     `aio.h' (POSIX.1b):  *note Synchronizing AIO Operations::.
-
-`int aio_suspend64 (const struct aiocb64 *const LIST[], int NENT, const struct timespec *TIMEOUT)'
-     `aio.h' (Unix98):  *note Synchronizing AIO Operations::.
-
-`int aio_write (struct aiocb *AIOCBP)'
-     `aio.h' (POSIX.1b):  *note Asynchronous Reads/Writes::.
-
-`int aio_write64 (struct aiocb64 *AIOCBP)'
-     `aio.h' (Unix98):  *note Asynchronous Reads/Writes::.
-
-`unsigned int alarm (unsigned int SECONDS)'
-     `unistd.h' (POSIX.1):  *note Setting an Alarm::.
-
-`void * aligned_alloc (size_t ALIGNMENT, size_t SIZE)'
-     `stdlib.h' (stdlib.h):  *note Aligned Memory Blocks::.
-
-`void * alloca (size_t SIZE)'
-     `stdlib.h' (GNU, BSD):  *note Variable Size Automatic::.
-
-`int alphasort (const void *A, const void *B)'
-     `dirent.h' (BSD/SVID):  *note Scanning Directory Content::.
-
-`int alphasort64 (const void *A, const void *B)'
-     `dirent.h' (GNU):  *note Scanning Directory Content::.
-
-`tcflag_t ALTWERASE'
-     `termios.h' (BSD):  *note Local Modes::.
-
-`int ARG_MAX'
-     `limits.h' (POSIX.1):  *note General Limits::.
-
-`error_t argp_err_exit_status'
-     `argp.h' (GNU):  *note Argp Global Variables::.
-
-`void argp_error (const struct argp_state *STATE, const char *FMT, ...)'
-     `argp.h' (GNU):  *note Argp Helper Functions::.
-
-`int ARGP_ERR_UNKNOWN'
-     `argp.h' (GNU):  *note Argp Parser Functions::.
-
-`void argp_failure (const struct argp_state *STATE, int STATUS, int ERRNUM, const char *FMT, ...)'
-     `argp.h' (GNU):  *note Argp Helper Functions::.
-
-`void argp_help (const struct argp *ARGP, FILE *STREAM, unsigned FLAGS, char *NAME)'
-     `argp.h' (GNU):  *note Argp Help::.
-
-`ARGP_IN_ORDER'
-     `argp.h' (GNU):  *note Argp Flags::.
-
-`ARGP_KEY_ARG'
-     `argp.h' (GNU):  *note Argp Special Keys::.
-
-`ARGP_KEY_ARGS'
-     `argp.h' (GNU):  *note Argp Special Keys::.
-
-`ARGP_KEY_END'
-     `argp.h' (GNU):  *note Argp Special Keys::.
-
-`ARGP_KEY_ERROR'
-     `argp.h' (GNU):  *note Argp Special Keys::.
-
-`ARGP_KEY_FINI'
-     `argp.h' (GNU):  *note Argp Special Keys::.
-
-`ARGP_KEY_HELP_ARGS_DOC'
-     `argp.h' (GNU):  *note Argp Help Filter Keys::.
-
-`ARGP_KEY_HELP_DUP_ARGS_NOTE'
-     `argp.h' (GNU):  *note Argp Help Filter Keys::.
-
-`ARGP_KEY_HELP_EXTRA'
-     `argp.h' (GNU):  *note Argp Help Filter Keys::.
-
-`ARGP_KEY_HELP_HEADER'
-     `argp.h' (GNU):  *note Argp Help Filter Keys::.
-
-`ARGP_KEY_HELP_POST_DOC'
-     `argp.h' (GNU):  *note Argp Help Filter Keys::.
-
-`ARGP_KEY_HELP_PRE_DOC'
-     `argp.h' (GNU):  *note Argp Help Filter Keys::.
-
-`ARGP_KEY_INIT'
-     `argp.h' (GNU):  *note Argp Special Keys::.
-
-`ARGP_KEY_NO_ARGS'
-     `argp.h' (GNU):  *note Argp Special Keys::.
-
-`ARGP_KEY_SUCCESS'
-     `argp.h' (GNU):  *note Argp Special Keys::.
-
-`ARGP_LONG_ONLY'
-     `argp.h' (GNU):  *note Argp Flags::.
-
-`ARGP_NO_ARGS'
-     `argp.h' (GNU):  *note Argp Flags::.
-
-`ARGP_NO_ERRS'
-     `argp.h' (GNU):  *note Argp Flags::.
-
-`ARGP_NO_EXIT'
-     `argp.h' (GNU):  *note Argp Flags::.
-
-`ARGP_NO_HELP'
-     `argp.h' (GNU):  *note Argp Flags::.
-
-`error_t argp_parse (const struct argp *ARGP, int ARGC, char **ARGV, unsigned FLAGS, int *ARG_INDEX, void *INPUT)'
-     `argp.h' (GNU):  *note Suboptions: Argp.
-
-`ARGP_PARSE_ARGV0'
-     `argp.h' (GNU):  *note Argp Flags::.
-
-`const char * argp_program_bug_address'
-     `argp.h' (GNU):  *note Argp Global Variables::.
-
-`const char * argp_program_version'
-     `argp.h' (GNU):  *note Argp Global Variables::.
-
-`argp_program_version_hook'
-     `argp.h' (GNU):  *note Argp Global Variables::.
-
-`ARGP_SILENT'
-     `argp.h' (GNU):  *note Argp Flags::.
-
-`void argp_state_help (const struct argp_state *STATE, FILE *STREAM, unsigned FLAGS)'
-     `argp.h' (GNU):  *note Argp Helper Functions::.
-
-`void argp_usage (const struct argp_state *STATE)'
-     `argp.h' (GNU):  *note Argp Helper Functions::.
-
-`error_t argz_add (char **ARGZ, size_t *ARGZ_LEN, const char *STR)'
-     `argz.h' (GNU):  *note Argz Functions::.
-
-`error_t argz_add_sep (char **ARGZ, size_t *ARGZ_LEN, const char *STR, int DELIM)'
-     `argz.h' (GNU):  *note Argz Functions::.
-
-`error_t argz_append (char **ARGZ, size_t *ARGZ_LEN, const char *BUF, size_t BUF_LEN)'
-     `argz.h' (GNU):  *note Argz Functions::.
-
-`size_t argz_count (const char *ARGZ, size_t ARG_LEN)'
-     `argz.h' (GNU):  *note Argz Functions::.
-
-`error_t argz_create (char *const ARGV[], char **ARGZ, size_t *ARGZ_LEN)'
-     `argz.h' (GNU):  *note Argz Functions::.
-
-`error_t argz_create_sep (const char *STRING, int SEP, char **ARGZ, size_t *ARGZ_LEN)'
-     `argz.h' (GNU):  *note Argz Functions::.
-
-`void argz_delete (char **ARGZ, size_t *ARGZ_LEN, char *ENTRY)'
-     `argz.h' (GNU):  *note Argz Functions::.
-
-`void argz_extract (const char *ARGZ, size_t ARGZ_LEN, char **ARGV)'
-     `argz.h' (GNU):  *note Argz Functions::.
-
-`error_t argz_insert (char **ARGZ, size_t *ARGZ_LEN, char *BEFORE, const char *ENTRY)'
-     `argz.h' (GNU):  *note Argz Functions::.
-
-`char * argz_next (const char *ARGZ, size_t ARGZ_LEN, const char *ENTRY)'
-     `argz.h' (GNU):  *note Argz Functions::.
-
-`error_t argz_replace (char **ARGZ, size_t *ARGZ_LEN, const char *STR, const char *WITH, unsigned *REPLACE_COUNT)'
-     `argz.h' (GNU):  *note Argz Functions::.
-
-`void argz_stringify (char *ARGZ, size_t LEN, int SEP)'
-     `argz.h' (GNU):  *note Argz Functions::.
-
-`char * asctime (const struct tm *BROKENTIME)'
-     `time.h' (ISO):  *note Formatting Calendar Time::.
-
-`char * asctime_r (const struct tm *BROKENTIME, char *BUFFER)'
-     `time.h' (POSIX.1c):  *note Formatting Calendar Time::.
-
-`double asin (double X)'
-     `math.h' (ISO):  *note Inverse Trig Functions::.
-
-`float asinf (float X)'
-     `math.h' (ISO):  *note Inverse Trig Functions::.
-
-`double asinh (double X)'
-     `math.h' (ISO):  *note Hyperbolic Functions::.
-
-`float asinhf (float X)'
-     `math.h' (ISO):  *note Hyperbolic Functions::.
-
-`long double asinhl (long double X)'
-     `math.h' (ISO):  *note Hyperbolic Functions::.
-
-`long double asinl (long double X)'
-     `math.h' (ISO):  *note Inverse Trig Functions::.
-
-`int asprintf (char **PTR, const char *TEMPLATE, ...)'
-     `stdio.h' (GNU):  *note Dynamic Output::.
-
-`void assert (int EXPRESSION)'
-     `assert.h' (ISO):  *note Consistency Checking::.
-
-`void assert_perror (int ERRNUM)'
-     `assert.h' (GNU):  *note Consistency Checking::.
-
-`double atan (double X)'
-     `math.h' (ISO):  *note Inverse Trig Functions::.
-
-`double atan2 (double Y, double X)'
-     `math.h' (ISO):  *note Inverse Trig Functions::.
-
-`float atan2f (float Y, float X)'
-     `math.h' (ISO):  *note Inverse Trig Functions::.
-
-`long double atan2l (long double Y, long double X)'
-     `math.h' (ISO):  *note Inverse Trig Functions::.
-
-`float atanf (float X)'
-     `math.h' (ISO):  *note Inverse Trig Functions::.
-
-`double atanh (double X)'
-     `math.h' (ISO):  *note Hyperbolic Functions::.
-
-`float atanhf (float X)'
-     `math.h' (ISO):  *note Hyperbolic Functions::.
-
-`long double atanhl (long double X)'
-     `math.h' (ISO):  *note Hyperbolic Functions::.
-
-`long double atanl (long double X)'
-     `math.h' (ISO):  *note Inverse Trig Functions::.
-
-`int atexit (void (*FUNCTION) (void))'
-     `stdlib.h' (ISO):  *note Cleanups on Exit::.
-
-`double atof (const char *STRING)'
-     `stdlib.h' (ISO):  *note Parsing of Floats::.
-
-`int atoi (const char *STRING)'
-     `stdlib.h' (ISO):  *note Parsing of Integers::.
-
-`long int atol (const char *STRING)'
-     `stdlib.h' (ISO):  *note Parsing of Integers::.
-
-`long long int atoll (const char *STRING)'
-     `stdlib.h' (ISO):  *note Parsing of Integers::.
-
-`B0'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`B110'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`B115200'
-     `termios.h' (GNU):  *note Line Speed::.
-
-`B1200'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`B134'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`B150'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`B1800'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`B19200'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`B200'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`B230400'
-     `termios.h' (GNU):  *note Line Speed::.
-
-`B2400'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`B300'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`B38400'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`B460800'
-     `termios.h' (GNU):  *note Line Speed::.
-
-`B4800'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`B50'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`B57600'
-     `termios.h' (GNU):  *note Line Speed::.
-
-`B600'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`B75'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`B9600'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`int backtrace (void **BUFFER, int SIZE)'
-     `execinfo.h' (GNU):  *note Backtraces::.
-
-`char ** backtrace_symbols (void *const *BUFFER, int SIZE)'
-     `execinfo.h' (GNU):  *note Backtraces::.
-
-`void backtrace_symbols_fd (void *const *BUFFER, int SIZE, int FD)'
-     `execinfo.h' (GNU):  *note Backtraces::.
-
-`char * basename (const char *FILENAME)'
-     `string.h' (GNU):  *note Finding Tokens in a String::.
-
-`char * basename (const char *PATH)'
-     `libgen.h' (XPG):  *note Finding Tokens in a String::.
-
-`int BC_BASE_MAX'
-     `limits.h' (POSIX.2):  *note Utility Limits::.
-
-`int BC_DIM_MAX'
-     `limits.h' (POSIX.2):  *note Utility Limits::.
-
-`int bcmp (const void *A1, const void *A2, size_t SIZE)'
-     `string.h' (BSD):  *note String/Array Comparison::.
-
-`void bcopy (const void *FROM, void *TO, size_t SIZE)'
-     `string.h' (BSD):  *note Copying and Concatenation::.
-
-`int BC_SCALE_MAX'
-     `limits.h' (POSIX.2):  *note Utility Limits::.
-
-`int BC_STRING_MAX'
-     `limits.h' (POSIX.2):  *note Utility Limits::.
-
-`int bind (int SOCKET, struct sockaddr *ADDR, socklen_t LENGTH)'
-     `sys/socket.h' (BSD):  *note Setting Address::.
-
-`char * bindtextdomain (const char *DOMAINNAME, const char *DIRNAME)'
-     `libintl.h' (GNU):  *note Locating gettext catalog::.
-
-`char * bind_textdomain_codeset (const char *DOMAINNAME, const char *CODESET)'
-     `libintl.h' (GNU):  *note Charset conversion in gettext::.
-
-`blkcnt64_t'
-     `sys/types.h' (Unix98):  *note Attribute Meanings::.
-
-`blkcnt_t'
-     `sys/types.h' (Unix98):  *note Attribute Meanings::.
-
-`BOOT_TIME'
-     `utmp.h' (SVID):  *note Manipulating the Database::.
-
-`BOOT_TIME'
-     `utmpx.h' (XPG4.2):  *note XPG Functions::.
-
-`int brk (void *ADDR)'
-     `unistd.h' (BSD):  *note Resizing the Data Segment::.
-
-`tcflag_t BRKINT'
-     `termios.h' (POSIX.1):  *note Input Modes::.
-
-`_BSD_SOURCE'
-     (GNU):  *note Feature Test Macros::.
-
-`void * bsearch (const void *KEY, const void *ARRAY, size_t COUNT, size_t SIZE, comparison_fn_t COMPARE)'
-     `stdlib.h' (ISO):  *note Array Search Function::.
-
-`wint_t btowc (int C)'
-     `wchar.h' (ISO):  *note Converting a Character::.
-
-`int BUFSIZ'
-     `stdio.h' (ISO):  *note Controlling Buffering::.
-
-`void bzero (void *BLOCK, size_t SIZE)'
-     `string.h' (BSD):  *note Copying and Concatenation::.
-
-`double cabs (complex double Z)'
-     `complex.h' (ISO):  *note Absolute Value::.
-
-`float cabsf (complex float Z)'
-     `complex.h' (ISO):  *note Absolute Value::.
-
-`long double cabsl (complex long double Z)'
-     `complex.h' (ISO):  *note Absolute Value::.
-
-`complex double cacos (complex double Z)'
-     `complex.h' (ISO):  *note Inverse Trig Functions::.
-
-`complex float cacosf (complex float Z)'
-     `complex.h' (ISO):  *note Inverse Trig Functions::.
-
-`complex double cacosh (complex double Z)'
-     `complex.h' (ISO):  *note Hyperbolic Functions::.
-
-`complex float cacoshf (complex float Z)'
-     `complex.h' (ISO):  *note Hyperbolic Functions::.
-
-`complex long double cacoshl (complex long double Z)'
-     `complex.h' (ISO):  *note Hyperbolic Functions::.
-
-`complex long double cacosl (complex long double Z)'
-     `complex.h' (ISO):  *note Inverse Trig Functions::.
-
-`void * calloc (size_t COUNT, size_t ELTSIZE)'
-     `malloc.h', `stdlib.h' (ISO):  *note Allocating Cleared Space::.
-
-`char * canonicalize_file_name (const char *NAME)'
-     `stdlib.h' (GNU):  *note Symbolic Links::.
-
-`double carg (complex double Z)'
-     `complex.h' (ISO):  *note Operations on Complex::.
-
-`float cargf (complex float Z)'
-     `complex.h' (ISO):  *note Operations on Complex::.
-
-`long double cargl (complex long double Z)'
-     `complex.h' (ISO):  *note Operations on Complex::.
-
-`complex double casin (complex double Z)'
-     `complex.h' (ISO):  *note Inverse Trig Functions::.
-
-`complex float casinf (complex float Z)'
-     `complex.h' (ISO):  *note Inverse Trig Functions::.
-
-`complex double casinh (complex double Z)'
-     `complex.h' (ISO):  *note Hyperbolic Functions::.
-
-`complex float casinhf (complex float Z)'
-     `complex.h' (ISO):  *note Hyperbolic Functions::.
-
-`complex long double casinhl (complex long double Z)'
-     `complex.h' (ISO):  *note Hyperbolic Functions::.
-
-`complex long double casinl (complex long double Z)'
-     `complex.h' (ISO):  *note Inverse Trig Functions::.
-
-`complex double catan (complex double Z)'
-     `complex.h' (ISO):  *note Inverse Trig Functions::.
-
-`complex float catanf (complex float Z)'
-     `complex.h' (ISO):  *note Inverse Trig Functions::.
-
-`complex double catanh (complex double Z)'
-     `complex.h' (ISO):  *note Hyperbolic Functions::.
-
-`complex float catanhf (complex float Z)'
-     `complex.h' (ISO):  *note Hyperbolic Functions::.
-
-`complex long double catanhl (complex long double Z)'
-     `complex.h' (ISO):  *note Hyperbolic Functions::.
-
-`complex long double catanl (complex long double Z)'
-     `complex.h' (ISO):  *note Inverse Trig Functions::.
-
-`nl_catd catopen (const char *CAT_NAME, int FLAG)'
-     `nl_types.h' (X/Open):  *note The catgets Functions::.
-
-`int cbc_crypt (char *KEY, char *BLOCKS, unsigned LEN, unsigned MODE, char *IVEC)'
-     `rpc/des_crypt.h' (SUNRPC):  *note DES Encryption::.
-
-`double cbrt (double X)'
-     `math.h' (BSD):  *note Exponents and Logarithms::.
-
-`float cbrtf (float X)'
-     `math.h' (BSD):  *note Exponents and Logarithms::.
-
-`long double cbrtl (long double X)'
-     `math.h' (BSD):  *note Exponents and Logarithms::.
-
-`complex double ccos (complex double Z)'
-     `complex.h' (ISO):  *note Trig Functions::.
-
-`complex float ccosf (complex float Z)'
-     `complex.h' (ISO):  *note Trig Functions::.
-
-`complex double ccosh (complex double Z)'
-     `complex.h' (ISO):  *note Hyperbolic Functions::.
-
-`complex float ccoshf (complex float Z)'
-     `complex.h' (ISO):  *note Hyperbolic Functions::.
-
-`complex long double ccoshl (complex long double Z)'
-     `complex.h' (ISO):  *note Hyperbolic Functions::.
-
-`complex long double ccosl (complex long double Z)'
-     `complex.h' (ISO):  *note Trig Functions::.
-
-`cc_t'
-     `termios.h' (POSIX.1):  *note Mode Data Types::.
-
-`tcflag_t CCTS_OFLOW'
-     `termios.h' (BSD):  *note Control Modes::.
-
-`double ceil (double X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`float ceilf (float X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`long double ceill (long double X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`complex double cexp (complex double Z)'
-     `complex.h' (ISO):  *note Exponents and Logarithms::.
-
-`complex float cexpf (complex float Z)'
-     `complex.h' (ISO):  *note Exponents and Logarithms::.
-
-`complex long double cexpl (complex long double Z)'
-     `complex.h' (ISO):  *note Exponents and Logarithms::.
-
-`speed_t cfgetispeed (const struct termios *TERMIOS-P)'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`speed_t cfgetospeed (const struct termios *TERMIOS-P)'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`void cfmakeraw (struct termios *TERMIOS-P)'
-     `termios.h' (BSD):  *note Noncanonical Input::.
-
-`void cfree (void *PTR)'
-     `stdlib.h' (Sun):  *note Freeing after Malloc::.
-
-`int cfsetispeed (struct termios *TERMIOS-P, speed_t SPEED)'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`int cfsetospeed (struct termios *TERMIOS-P, speed_t SPEED)'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`int cfsetspeed (struct termios *TERMIOS-P, speed_t SPEED)'
-     `termios.h' (BSD):  *note Line Speed::.
-
-`CHAR_BIT'
-     `limits.h' (ISO):  *note Width of Type::.
-
-`CHAR_MAX'
-     `limits.h' (ISO):  *note Range of Type::.
-
-`CHAR_MIN'
-     `limits.h' (ISO):  *note Range of Type::.
-
-`int chdir (const char *FILENAME)'
-     `unistd.h' (POSIX.1):  *note Working Directory::.
-
-`int CHILD_MAX'
-     `limits.h' (POSIX.1):  *note General Limits::.
-
-`int chmod (const char *FILENAME, mode_t MODE)'
-     `sys/stat.h' (POSIX.1):  *note Setting Permissions::.
-
-`int chown (const char *FILENAME, uid_t OWNER, gid_t GROUP)'
-     `unistd.h' (POSIX.1):  *note File Owner::.
-
-`tcflag_t CIGNORE'
-     `termios.h' (BSD):  *note Control Modes::.
-
-`double cimag (complex double Z)'
-     `complex.h' (ISO):  *note Operations on Complex::.
-
-`float cimagf (complex float Z)'
-     `complex.h' (ISO):  *note Operations on Complex::.
-
-`long double cimagl (complex long double Z)'
-     `complex.h' (ISO):  *note Operations on Complex::.
-
-`int clearenv (void)'
-     `stdlib.h' (GNU):  *note Environment Access::.
-
-`void clearerr (FILE *STREAM)'
-     `stdio.h' (ISO):  *note Error Recovery::.
-
-`void clearerr_unlocked (FILE *STREAM)'
-     `stdio.h' (GNU):  *note Error Recovery::.
-
-`int CLK_TCK'
-     `time.h' (POSIX.1):  *note Processor Time::.
-
-`tcflag_t CLOCAL'
-     `termios.h' (POSIX.1):  *note Control Modes::.
-
-`clock_t clock (void)'
-     `time.h' (ISO):  *note CPU Time::.
-
-`int CLOCKS_PER_SEC'
-     `time.h' (ISO):  *note CPU Time::.
-
-`clock_t'
-     `time.h' (ISO):  *note CPU Time::.
-
-`complex double clog (complex double Z)'
-     `complex.h' (ISO):  *note Exponents and Logarithms::.
-
-`complex double clog10 (complex double Z)'
-     `complex.h' (GNU):  *note Exponents and Logarithms::.
-
-`complex float clog10f (complex float Z)'
-     `complex.h' (GNU):  *note Exponents and Logarithms::.
-
-`complex long double clog10l (complex long double Z)'
-     `complex.h' (GNU):  *note Exponents and Logarithms::.
-
-`complex float clogf (complex float Z)'
-     `complex.h' (ISO):  *note Exponents and Logarithms::.
-
-`complex long double clogl (complex long double Z)'
-     `complex.h' (ISO):  *note Exponents and Logarithms::.
-
-`int close (int FILEDES)'
-     `unistd.h' (POSIX.1):  *note Opening and Closing Files::.
-
-`int closedir (DIR *DIRSTREAM)'
-     `dirent.h' (POSIX.1):  *note Reading/Closing Directory::.
-
-`void closelog (void)'
-     `syslog.h' (BSD):  *note closelog::.
-
-`int COLL_WEIGHTS_MAX'
-     `limits.h' (POSIX.2):  *note Utility Limits::.
-
-`size_t confstr (int PARAMETER, char *BUF, size_t LEN)'
-     `unistd.h' (POSIX.2):  *note String Parameters::.
-
-`complex double conj (complex double Z)'
-     `complex.h' (ISO):  *note Operations on Complex::.
-
-`complex float conjf (complex float Z)'
-     `complex.h' (ISO):  *note Operations on Complex::.
-
-`complex long double conjl (complex long double Z)'
-     `complex.h' (ISO):  *note Operations on Complex::.
-
-`int connect (int SOCKET, struct sockaddr *ADDR, socklen_t LENGTH)'
-     `sys/socket.h' (BSD):  *note Connecting::.
-
-`cookie_close_function'
-     `stdio.h' (GNU):  *note Hook Functions::.
-
-`cookie_io_functions_t'
-     `stdio.h' (GNU):  *note Streams and Cookies::.
-
-`cookie_read_function'
-     `stdio.h' (GNU):  *note Hook Functions::.
-
-`cookie_seek_function'
-     `stdio.h' (GNU):  *note Hook Functions::.
-
-`cookie_write_function'
-     `stdio.h' (GNU):  *note Hook Functions::.
-
-`double copysign (double X, double Y)'
-     `math.h' (ISO):  *note FP Bit Twiddling::.
-
-`float copysignf (float X, float Y)'
-     `math.h' (ISO):  *note FP Bit Twiddling::.
-
-`long double copysignl (long double X, long double Y)'
-     `math.h' (ISO):  *note FP Bit Twiddling::.
-
-`double cos (double X)'
-     `math.h' (ISO):  *note Trig Functions::.
-
-`float cosf (float X)'
-     `math.h' (ISO):  *note Trig Functions::.
-
-`double cosh (double X)'
-     `math.h' (ISO):  *note Hyperbolic Functions::.
-
-`float coshf (float X)'
-     `math.h' (ISO):  *note Hyperbolic Functions::.
-
-`long double coshl (long double X)'
-     `math.h' (ISO):  *note Hyperbolic Functions::.
-
-`long double cosl (long double X)'
-     `math.h' (ISO):  *note Trig Functions::.
-
-`complex double cpow (complex double BASE, complex double POWER)'
-     `complex.h' (ISO):  *note Exponents and Logarithms::.
-
-`complex float cpowf (complex float BASE, complex float POWER)'
-     `complex.h' (ISO):  *note Exponents and Logarithms::.
-
-`complex long double cpowl (complex long double BASE, complex long double POWER)'
-     `complex.h' (ISO):  *note Exponents and Logarithms::.
-
-`complex double cproj (complex double Z)'
-     `complex.h' (ISO):  *note Operations on Complex::.
-
-`complex float cprojf (complex float Z)'
-     `complex.h' (ISO):  *note Operations on Complex::.
-
-`complex long double cprojl (complex long double Z)'
-     `complex.h' (ISO):  *note Operations on Complex::.
-
-`void CPU_CLR (int CPU, cpu_set_t *SET)'
-     `sched.h' (GNU):  *note CPU Affinity::.
-
-`int CPU_ISSET (int CPU, const cpu_set_t *SET)'
-     `sched.h' (GNU):  *note CPU Affinity::.
-
-`void CPU_SET (int CPU, cpu_set_t *SET)'
-     `sched.h' (GNU):  *note CPU Affinity::.
-
-`int CPU_SETSIZE'
-     `sched.h' (GNU):  *note CPU Affinity::.
-
-`cpu_set_t'
-     `sched.h' (GNU):  *note CPU Affinity::.
-
-`void CPU_ZERO (cpu_set_t *SET)'
-     `sched.h' (GNU):  *note CPU Affinity::.
-
-`tcflag_t CREAD'
-     `termios.h' (POSIX.1):  *note Control Modes::.
-
-`double creal (complex double Z)'
-     `complex.h' (ISO):  *note Operations on Complex::.
-
-`float crealf (complex float Z)'
-     `complex.h' (ISO):  *note Operations on Complex::.
-
-`long double creall (complex long double Z)'
-     `complex.h' (ISO):  *note Operations on Complex::.
-
-`int creat (const char *FILENAME, mode_t MODE)'
-     `fcntl.h' (POSIX.1):  *note Opening and Closing Files::.
-
-`int creat64 (const char *FILENAME, mode_t MODE)'
-     `fcntl.h' (Unix98):  *note Opening and Closing Files::.
-
-`tcflag_t CRTS_IFLOW'
-     `termios.h' (BSD):  *note Control Modes::.
-
-`char * crypt (const char *KEY, const char *SALT)'
-     `crypt.h' (BSD, SVID):  *note crypt::.
-
-`char * crypt_r (const char *KEY, const char *SALT, struct crypt_data * DATA)'
-     `crypt.h' (GNU):  *note crypt::.
-
-`tcflag_t CS5'
-     `termios.h' (POSIX.1):  *note Control Modes::.
-
-`tcflag_t CS6'
-     `termios.h' (POSIX.1):  *note Control Modes::.
-
-`tcflag_t CS7'
-     `termios.h' (POSIX.1):  *note Control Modes::.
-
-`tcflag_t CS8'
-     `termios.h' (POSIX.1):  *note Control Modes::.
-
-`complex double csin (complex double Z)'
-     `complex.h' (ISO):  *note Trig Functions::.
-
-`complex float csinf (complex float Z)'
-     `complex.h' (ISO):  *note Trig Functions::.
-
-`complex double csinh (complex double Z)'
-     `complex.h' (ISO):  *note Hyperbolic Functions::.
-
-`complex float csinhf (complex float Z)'
-     `complex.h' (ISO):  *note Hyperbolic Functions::.
-
-`complex long double csinhl (complex long double Z)'
-     `complex.h' (ISO):  *note Hyperbolic Functions::.
-
-`complex long double csinl (complex long double Z)'
-     `complex.h' (ISO):  *note Trig Functions::.
-
-`tcflag_t CSIZE'
-     `termios.h' (POSIX.1):  *note Control Modes::.
-
-`_CS_LFS64_CFLAGS'
-     `unistd.h' (Unix98):  *note String Parameters::.
-
-`_CS_LFS64_LDFLAGS'
-     `unistd.h' (Unix98):  *note String Parameters::.
-
-`_CS_LFS64_LIBS'
-     `unistd.h' (Unix98):  *note String Parameters::.
-
-`_CS_LFS64_LINTFLAGS'
-     `unistd.h' (Unix98):  *note String Parameters::.
-
-`_CS_LFS_CFLAGS'
-     `unistd.h' (Unix98):  *note String Parameters::.
-
-`_CS_LFS_LDFLAGS'
-     `unistd.h' (Unix98):  *note String Parameters::.
-
-`_CS_LFS_LIBS'
-     `unistd.h' (Unix98):  *note String Parameters::.
-
-`_CS_LFS_LINTFLAGS'
-     `unistd.h' (Unix98):  *note String Parameters::.
-
-`_CS_PATH'
-     `unistd.h' (POSIX.2):  *note String Parameters::.
-
-`complex double csqrt (complex double Z)'
-     `complex.h' (ISO):  *note Exponents and Logarithms::.
-
-`complex float csqrtf (complex float Z)'
-     `complex.h' (ISO):  *note Exponents and Logarithms::.
-
-`complex long double csqrtl (complex long double Z)'
-     `complex.h' (ISO):  *note Exponents and Logarithms::.
-
-`tcflag_t CSTOPB'
-     `termios.h' (POSIX.1):  *note Control Modes::.
-
-`complex double ctan (complex double Z)'
-     `complex.h' (ISO):  *note Trig Functions::.
-
-`complex float ctanf (complex float Z)'
-     `complex.h' (ISO):  *note Trig Functions::.
-
-`complex double ctanh (complex double Z)'
-     `complex.h' (ISO):  *note Hyperbolic Functions::.
-
-`complex float ctanhf (complex float Z)'
-     `complex.h' (ISO):  *note Hyperbolic Functions::.
-
-`complex long double ctanhl (complex long double Z)'
-     `complex.h' (ISO):  *note Hyperbolic Functions::.
-
-`complex long double ctanl (complex long double Z)'
-     `complex.h' (ISO):  *note Trig Functions::.
-
-`char * ctermid (char *STRING)'
-     `stdio.h' (POSIX.1):  *note Identifying the Terminal::.
-
-`char * ctime (const time_t *TIME)'
-     `time.h' (ISO):  *note Formatting Calendar Time::.
-
-`char * ctime_r (const time_t *TIME, char *BUFFER)'
-     `time.h' (POSIX.1c):  *note Formatting Calendar Time::.
-
-`char * cuserid (char *STRING)'
-     `stdio.h' (POSIX.1):  *note Who Logged In::.
-
-`int daylight'
-     `time.h' (SVID):  *note Time Zone Functions::.
-
-`DBL_DIG'
-     `float.h' (ISO):  *note Floating Point Parameters::.
-
-`DBL_EPSILON'
-     `float.h' (ISO):  *note Floating Point Parameters::.
-
-`DBL_MANT_DIG'
-     `float.h' (ISO):  *note Floating Point Parameters::.
-
-`DBL_MAX'
-     `float.h' (ISO):  *note Floating Point Parameters::.
-
-`DBL_MAX_10_EXP'
-     `float.h' (ISO):  *note Floating Point Parameters::.
-
-`DBL_MAX_EXP'
-     `float.h' (ISO):  *note Floating Point Parameters::.
-
-`DBL_MIN'
-     `float.h' (ISO):  *note Floating Point Parameters::.
-
-`DBL_MIN_10_EXP'
-     `float.h' (ISO):  *note Floating Point Parameters::.
-
-`DBL_MIN_EXP'
-     `float.h' (ISO):  *note Floating Point Parameters::.
-
-`char * dcgettext (const char *DOMAINNAME, const char *MSGID, int CATEGORY)'
-     `libintl.h' (GNU):  *note Translation with gettext::.
-
-`char * dcngettext (const char *DOMAIN, const char *MSGID1, const char *MSGID2, unsigned long int N, int CATEGORY)'
-     `libintl.h' (GNU):  *note Advanced gettext functions::.
-
-`DEAD_PROCESS'
-     `utmp.h' (SVID):  *note Manipulating the Database::.
-
-`DEAD_PROCESS'
-     `utmpx.h' (XPG4.2):  *note XPG Functions::.
-
-`_DEFAULT_SOURCE'
-     (GNU):  *note Feature Test Macros::.
-
-`DES_DECRYPT'
-     `rpc/des_crypt.h' (SUNRPC):  *note DES Encryption::.
-
-`DES_ENCRYPT'
-     `rpc/des_crypt.h' (SUNRPC):  *note DES Encryption::.
-
-`DESERR_BADPARAM'
-     `rpc/des_crypt.h' (SUNRPC):  *note DES Encryption::.
-
-`DESERR_HWERROR'
-     `rpc/des_crypt.h' (SUNRPC):  *note DES Encryption::.
-
-`DESERR_NOHWDEVICE'
-     `rpc/des_crypt.h' (SUNRPC):  *note DES Encryption::.
-
-`DESERR_NONE'
-     `rpc/des_crypt.h' (SUNRPC):  *note DES Encryption::.
-
-`int DES_FAILED (int ERR)'
-     `rpc/des_crypt.h' (SUNRPC):  *note DES Encryption::.
-
-`DES_HW'
-     `rpc/des_crypt.h' (SUNRPC):  *note DES Encryption::.
-
-`void des_setparity (char *KEY)'
-     `rpc/des_crypt.h' (SUNRPC):  *note DES Encryption::.
-
-`DES_SW'
-     `rpc/des_crypt.h' (SUNRPC):  *note DES Encryption::.
-
-`dev_t'
-     `sys/types.h' (POSIX.1):  *note Attribute Meanings::.
-
-`char * dgettext (const char *DOMAINNAME, const char *MSGID)'
-     `libintl.h' (GNU):  *note Translation with gettext::.
-
-`double difftime (time_t TIME1, time_t TIME0)'
-     `time.h' (ISO):  *note Elapsed Time::.
-
-`DIR'
-     `dirent.h' (POSIX.1):  *note Opening a Directory::.
-
-`int dirfd (DIR *DIRSTREAM)'
-     `dirent.h' (GNU):  *note Opening a Directory::.
-
-`char * dirname (char *PATH)'
-     `libgen.h' (XPG):  *note Finding Tokens in a String::.
-
-`div_t div (int NUMERATOR, int DENOMINATOR)'
-     `stdlib.h' (ISO):  *note Integer Division::.
-
-`div_t'
-     `stdlib.h' (ISO):  *note Integer Division::.
-
-`char * dngettext (const char *DOMAIN, const char *MSGID1, const char *MSGID2, unsigned long int N)'
-     `libintl.h' (GNU):  *note Advanced gettext functions::.
-
-`double drand48 (void)'
-     `stdlib.h' (SVID):  *note SVID Random::.
-
-`int drand48_r (struct drand48_data *BUFFER, double *RESULT)'
-     `stdlib.h' (GNU):  *note SVID Random::.
-
-`double drem (double NUMERATOR, double DENOMINATOR)'
-     `math.h' (BSD):  *note Remainder Functions::.
-
-`float dremf (float NUMERATOR, float DENOMINATOR)'
-     `math.h' (BSD):  *note Remainder Functions::.
-
-`long double dreml (long double NUMERATOR, long double DENOMINATOR)'
-     `math.h' (BSD):  *note Remainder Functions::.
-
-`mode_t DTTOIF (int DTYPE)'
-     `dirent.h' (BSD):  *note Directory Entries::.
-
-`int dup (int OLD)'
-     `unistd.h' (POSIX.1):  *note Duplicating Descriptors::.
-
-`int dup2 (int OLD, int NEW)'
-     `unistd.h' (POSIX.1):  *note Duplicating Descriptors::.
-
-`int E2BIG'
-     `errno.h' (POSIX.1: Argument list too long):  *note Error Codes::.
-
-`int EACCES'
-     `errno.h' (POSIX.1: Permission denied):  *note Error Codes::.
-
-`int EADDRINUSE'
-     `errno.h' (BSD: Address already in use):  *note Error Codes::.
-
-`int EADDRNOTAVAIL'
-     `errno.h' (BSD: Cannot assign requested address):  *note Error
-     Codes::.
-
-`int EADV'
-     `errno.h' (Linux???: Advertise error):  *note Error Codes::.
-
-`int EAFNOSUPPORT'
-     `errno.h' (BSD: Address family not supported by protocol):  *note
-     Error Codes::.
-
-`int EAGAIN'
-     `errno.h' (POSIX.1: Resource temporarily unavailable):  *note
-     Error Codes::.
-
-`int EALREADY'
-     `errno.h' (BSD: Operation already in progress):  *note Error
-     Codes::.
-
-`int EAUTH'
-     `errno.h' (BSD: Authentication error):  *note Error Codes::.
-
-`int EBACKGROUND'
-     `errno.h' (GNU: Inappropriate operation for background process):
-     *note Error Codes::.
-
-`int EBADE'
-     `errno.h' (Linux???: Invalid exchange):  *note Error Codes::.
-
-`int EBADF'
-     `errno.h' (POSIX.1: Bad file descriptor):  *note Error Codes::.
-
-`int EBADFD'
-     `errno.h' (Linux???: File descriptor in bad state):  *note Error
-     Codes::.
-
-`int EBADMSG'
-     `errno.h' (XOPEN: Bad message):  *note Error Codes::.
-
-`int EBADR'
-     `errno.h' (Linux???: Invalid request descriptor):  *note Error
-     Codes::.
-
-`int EBADRPC'
-     `errno.h' (BSD: RPC struct is bad):  *note Error Codes::.
-
-`int EBADRQC'
-     `errno.h' (Linux???: Invalid request code):  *note Error Codes::.
-
-`int EBADSLT'
-     `errno.h' (Linux???: Invalid slot):  *note Error Codes::.
-
-`int EBFONT'
-     `errno.h' (Linux???: Bad font file format):  *note Error Codes::.
-
-`int EBUSY'
-     `errno.h' (POSIX.1: Device or resource busy):  *note Error Codes::.
-
-`int ECANCELED'
-     `errno.h' (POSIX.1: Operation canceled):  *note Error Codes::.
-
-`int ecb_crypt (char *KEY, char *BLOCKS, unsigned LEN, unsigned MODE)'
-     `rpc/des_crypt.h' (SUNRPC):  *note DES Encryption::.
-
-`int ECHILD'
-     `errno.h' (POSIX.1: No child processes):  *note Error Codes::.
-
-`tcflag_t ECHO'
-     `termios.h' (POSIX.1):  *note Local Modes::.
-
-`tcflag_t ECHOCTL'
-     `termios.h' (BSD):  *note Local Modes::.
-
-`tcflag_t ECHOE'
-     `termios.h' (POSIX.1):  *note Local Modes::.
-
-`tcflag_t ECHOK'
-     `termios.h' (POSIX.1):  *note Local Modes::.
-
-`tcflag_t ECHOKE'
-     `termios.h' (BSD):  *note Local Modes::.
-
-`tcflag_t ECHONL'
-     `termios.h' (POSIX.1):  *note Local Modes::.
-
-`tcflag_t ECHOPRT'
-     `termios.h' (BSD):  *note Local Modes::.
-
-`int ECHRNG'
-     `errno.h' (Linux???: Channel number out of range):  *note Error
-     Codes::.
-
-`int ECOMM'
-     `errno.h' (Linux???: Communication error on send):  *note Error
-     Codes::.
-
-`int ECONNABORTED'
-     `errno.h' (BSD: Software caused connection abort):  *note Error
-     Codes::.
-
-`int ECONNREFUSED'
-     `errno.h' (BSD: Connection refused):  *note Error Codes::.
-
-`int ECONNRESET'
-     `errno.h' (BSD: Connection reset by peer):  *note Error Codes::.
-
-`char * ecvt (double VALUE, int NDIGIT, int *DECPT, int *NEG)'
-     `stdlib.h' (SVID, Unix98):  *note System V Number Conversion::.
-
-`int ecvt_r (double VALUE, int NDIGIT, int *DECPT, int *NEG, char *BUF, size_t LEN)'
-     `stdlib.h' (GNU):  *note System V Number Conversion::.
-
-`int ED'
-     `errno.h' (GNU: ?):  *note Error Codes::.
-
-`int EDEADLK'
-     `errno.h' (POSIX.1: Resource deadlock avoided):  *note Error
-     Codes::.
-
-`int EDEADLOCK'
-     `errno.h' (Linux???: File locking deadlock error):  *note Error
-     Codes::.
-
-`int EDESTADDRREQ'
-     `errno.h' (BSD: Destination address required):  *note Error
-     Codes::.
-
-`int EDIED'
-     `errno.h' (GNU: Translator died):  *note Error Codes::.
-
-`int EDOM'
-     `errno.h' (ISO: Numerical argument out of domain):  *note Error
-     Codes::.
-
-`int EDOTDOT'
-     `errno.h' (Linux???: RFS specific error):  *note Error Codes::.
-
-`int EDQUOT'
-     `errno.h' (BSD: Disk quota exceeded):  *note Error Codes::.
-
-`int EEXIST'
-     `errno.h' (POSIX.1: File exists):  *note Error Codes::.
-
-`int EFAULT'
-     `errno.h' (POSIX.1: Bad address):  *note Error Codes::.
-
-`int EFBIG'
-     `errno.h' (POSIX.1: File too large):  *note Error Codes::.
-
-`int EFTYPE'
-     `errno.h' (BSD: Inappropriate file type or format):  *note Error
-     Codes::.
-
-`int EGRATUITOUS'
-     `errno.h' (GNU: Gratuitous error):  *note Error Codes::.
-
-`int EGREGIOUS'
-     `errno.h' (GNU: You really blew it this time):  *note Error
-     Codes::.
-
-`int EHOSTDOWN'
-     `errno.h' (BSD: Host is down):  *note Error Codes::.
-
-`int EHOSTUNREACH'
-     `errno.h' (BSD: No route to host):  *note Error Codes::.
-
-`int EHWPOISON'
-     `errno.h' (Linux: Memory page has hardware error):  *note Error
-     Codes::.
-
-`int EIDRM'
-     `errno.h' (XOPEN: Identifier removed):  *note Error Codes::.
-
-`int EIEIO'
-     `errno.h' (GNU: Computer bought the farm):  *note Error Codes::.
-
-`int EILSEQ'
-     `errno.h' (ISO: Invalid or incomplete multibyte or wide
-     character):  *note Error Codes::.
-
-`int EINPROGRESS'
-     `errno.h' (BSD: Operation now in progress):  *note Error Codes::.
-
-`int EINTR'
-     `errno.h' (POSIX.1: Interrupted system call):  *note Error Codes::.
-
-`int EINVAL'
-     `errno.h' (POSIX.1: Invalid argument):  *note Error Codes::.
-
-`int EIO'
-     `errno.h' (POSIX.1: Input/output error):  *note Error Codes::.
-
-`int EISCONN'
-     `errno.h' (BSD: Transport endpoint is already connected):  *note
-     Error Codes::.
-
-`int EISDIR'
-     `errno.h' (POSIX.1: Is a directory):  *note Error Codes::.
-
-`int EISNAM'
-     `errno.h' (Linux???: Is a named type file):  *note Error Codes::.
-
-`int EKEYEXPIRED'
-     `errno.h' (Linux: Key has expired):  *note Error Codes::.
-
-`int EKEYREJECTED'
-     `errno.h' (Linux: Key was rejected by service):  *note Error
-     Codes::.
-
-`int EKEYREVOKED'
-     `errno.h' (Linux: Key has been revoked):  *note Error Codes::.
-
-`int EL2HLT'
-     `errno.h' (Obsolete: Level 2 halted):  *note Error Codes::.
-
-`int EL2NSYNC'
-     `errno.h' (Obsolete: Level 2 not synchronized):  *note Error
-     Codes::.
-
-`int EL3HLT'
-     `errno.h' (Obsolete: Level 3 halted):  *note Error Codes::.
-
-`int EL3RST'
-     `errno.h' (Obsolete: Level 3 reset):  *note Error Codes::.
-
-`int ELIBACC'
-     `errno.h' (Linux???: Can not access a needed shared library):
-     *note Error Codes::.
-
-`int ELIBBAD'
-     `errno.h' (Linux???: Accessing a corrupted shared library):  *note
-     Error Codes::.
-
-`int ELIBEXEC'
-     `errno.h' (Linux???: Cannot exec a shared library directly):
-     *note Error Codes::.
-
-`int ELIBMAX'
-     `errno.h' (Linux???: Attempting to link in too many shared
-     libraries):  *note Error Codes::.
-
-`int ELIBSCN'
-     `errno.h' (Linux???: .lib section in a.out corrupted):  *note
-     Error Codes::.
-
-`int ELNRNG'
-     `errno.h' (Linux???: Link number out of range):  *note Error
-     Codes::.
-
-`int ELOOP'
-     `errno.h' (BSD: Too many levels of symbolic links):  *note Error
-     Codes::.
-
-`int EMEDIUMTYPE'
-     `errno.h' (Linux???: Wrong medium type):  *note Error Codes::.
-
-`int EMFILE'
-     `errno.h' (POSIX.1: Too many open files):  *note Error Codes::.
-
-`int EMLINK'
-     `errno.h' (POSIX.1: Too many links):  *note Error Codes::.
-
-`EMPTY'
-     `utmp.h' (SVID):  *note Manipulating the Database::.
-
-`EMPTY'
-     `utmpx.h' (XPG4.2):  *note XPG Functions::.
-
-`int EMSGSIZE'
-     `errno.h' (BSD: Message too long):  *note Error Codes::.
-
-`int EMULTIHOP'
-     `errno.h' (XOPEN: Multihop attempted):  *note Error Codes::.
-
-`int ENAMETOOLONG'
-     `errno.h' (POSIX.1: File name too long):  *note Error Codes::.
-
-`int ENAVAIL'
-     `errno.h' (Linux???: No XENIX semaphores available):  *note Error
-     Codes::.
-
-`void encrypt (char *BLOCK, int EDFLAG)'
-     `crypt.h' (BSD, SVID):  *note DES Encryption::.
-
-`void encrypt_r (char *BLOCK, int EDFLAG, struct crypt_data * DATA)'
-     `crypt.h' (GNU):  *note DES Encryption::.
-
-`void endfsent (void)'
-     `fstab.h' (BSD):  *note fstab::.
-
-`void endgrent (void)'
-     `grp.h' (SVID, BSD):  *note Scanning All Groups::.
-
-`void endhostent (void)'
-     `netdb.h' (BSD):  *note Host Names::.
-
-`int endmntent (FILE *STREAM)'
-     `mntent.h' (BSD):  *note mtab::.
-
-`void endnetent (void)'
-     `netdb.h' (BSD):  *note Networks Database::.
-
-`void endnetgrent (void)'
-     `netdb.h' (BSD):  *note Lookup Netgroup::.
-
-`void endprotoent (void)'
-     `netdb.h' (BSD):  *note Protocols Database::.
-
-`void endpwent (void)'
-     `pwd.h' (SVID, BSD):  *note Scanning All Users::.
-
-`void endservent (void)'
-     `netdb.h' (BSD):  *note Services Database::.
-
-`void endutent (void)'
-     `utmp.h' (SVID):  *note Manipulating the Database::.
-
-`void endutxent (void)'
-     `utmpx.h' (XPG4.2):  *note XPG Functions::.
-
-`int ENEEDAUTH'
-     `errno.h' (BSD: Need authenticator):  *note Error Codes::.
-
-`int ENETDOWN'
-     `errno.h' (BSD: Network is down):  *note Error Codes::.
-
-`int ENETRESET'
-     `errno.h' (BSD: Network dropped connection on reset):  *note Error
-     Codes::.
-
-`int ENETUNREACH'
-     `errno.h' (BSD: Network is unreachable):  *note Error Codes::.
-
-`int ENFILE'
-     `errno.h' (POSIX.1: Too many open files in system):  *note Error
-     Codes::.
-
-`int ENOANO'
-     `errno.h' (Linux???: No anode):  *note Error Codes::.
-
-`int ENOBUFS'
-     `errno.h' (BSD: No buffer space available):  *note Error Codes::.
-
-`int ENOCSI'
-     `errno.h' (Linux???: No CSI structure available):  *note Error
-     Codes::.
-
-`int ENODATA'
-     `errno.h' (XOPEN: No data available):  *note Error Codes::.
-
-`int ENODEV'
-     `errno.h' (POSIX.1: No such device):  *note Error Codes::.
-
-`int ENOENT'
-     `errno.h' (POSIX.1: No such file or directory):  *note Error
-     Codes::.
-
-`int ENOEXEC'
-     `errno.h' (POSIX.1: Exec format error):  *note Error Codes::.
-
-`int ENOKEY'
-     `errno.h' (Linux: Required key not available):  *note Error
-     Codes::.
-
-`int ENOLCK'
-     `errno.h' (POSIX.1: No locks available):  *note Error Codes::.
-
-`int ENOLINK'
-     `errno.h' (XOPEN: Link has been severed):  *note Error Codes::.
-
-`int ENOMEDIUM'
-     `errno.h' (Linux???: No medium found):  *note Error Codes::.
-
-`int ENOMEM'
-     `errno.h' (POSIX.1: Cannot allocate memory):  *note Error Codes::.
-
-`int ENOMSG'
-     `errno.h' (XOPEN: No message of desired type):  *note Error
-     Codes::.
-
-`int ENONET'
-     `errno.h' (Linux???: Machine is not on the network):  *note Error
-     Codes::.
-
-`int ENOPKG'
-     `errno.h' (Linux???: Package not installed):  *note Error Codes::.
-
-`int ENOPROTOOPT'
-     `errno.h' (BSD: Protocol not available):  *note Error Codes::.
-
-`int ENOSPC'
-     `errno.h' (POSIX.1: No space left on device):  *note Error Codes::.
-
-`int ENOSR'
-     `errno.h' (XOPEN: Out of streams resources):  *note Error Codes::.
-
-`int ENOSTR'
-     `errno.h' (XOPEN: Device not a stream):  *note Error Codes::.
-
-`int ENOSYS'
-     `errno.h' (POSIX.1: Function not implemented):  *note Error
-     Codes::.
-
-`int ENOTBLK'
-     `errno.h' (BSD: Block device required):  *note Error Codes::.
-
-`int ENOTCONN'
-     `errno.h' (BSD: Transport endpoint is not connected):  *note Error
-     Codes::.
-
-`int ENOTDIR'
-     `errno.h' (POSIX.1: Not a directory):  *note Error Codes::.
-
-`int ENOTEMPTY'
-     `errno.h' (POSIX.1: Directory not empty):  *note Error Codes::.
-
-`int ENOTNAM'
-     `errno.h' (Linux???: Not a XENIX named type file):  *note Error
-     Codes::.
-
-`int ENOTRECOVERABLE'
-     `errno.h' (Linux: State not recoverable):  *note Error Codes::.
-
-`int ENOTSOCK'
-     `errno.h' (BSD: Socket operation on non-socket):  *note Error
-     Codes::.
-
-`int ENOTSUP'
-     `errno.h' (POSIX.1: Not supported):  *note Error Codes::.
-
-`int ENOTTY'
-     `errno.h' (POSIX.1: Inappropriate ioctl for device):  *note Error
-     Codes::.
-
-`int ENOTUNIQ'
-     `errno.h' (Linux???: Name not unique on network):  *note Error
-     Codes::.
-
-`char ** environ'
-     `unistd.h' (POSIX.1):  *note Environment Access::.
-
-`error_t envz_add (char **ENVZ, size_t *ENVZ_LEN, const char *NAME, const char *VALUE)'
-     `envz.h' (GNU):  *note Envz Functions::.
-
-`char * envz_entry (const char *ENVZ, size_t ENVZ_LEN, const char *NAME)'
-     `envz.h' (GNU):  *note Envz Functions::.
-
-`char * envz_get (const char *ENVZ, size_t ENVZ_LEN, const char *NAME)'
-     `envz.h' (GNU):  *note Envz Functions::.
-
-`error_t envz_merge (char **ENVZ, size_t *ENVZ_LEN, const char *ENVZ2, size_t ENVZ2_LEN, int OVERRIDE)'
-     `envz.h' (GNU):  *note Envz Functions::.
-
-`void envz_strip (char **ENVZ, size_t *ENVZ_LEN)'
-     `envz.h' (GNU):  *note Envz Functions::.
-
-`int ENXIO'
-     `errno.h' (POSIX.1: No such device or address):  *note Error
-     Codes::.
-
-`int EOF'
-     `stdio.h' (ISO):  *note EOF and Errors::.
-
-`int EOPNOTSUPP'
-     `errno.h' (BSD: Operation not supported):  *note Error Codes::.
-
-`int EOVERFLOW'
-     `errno.h' (XOPEN: Value too large for defined data type):  *note
-     Error Codes::.
-
-`int EOWNERDEAD'
-     `errno.h' (Linux: Owner died):  *note Error Codes::.
-
-`int EPERM'
-     `errno.h' (POSIX.1: Operation not permitted):  *note Error Codes::.
-
-`int EPFNOSUPPORT'
-     `errno.h' (BSD: Protocol family not supported):  *note Error
-     Codes::.
-
-`int EPIPE'
-     `errno.h' (POSIX.1: Broken pipe):  *note Error Codes::.
-
-`int EPROCLIM'
-     `errno.h' (BSD: Too many processes):  *note Error Codes::.
-
-`int EPROCUNAVAIL'
-     `errno.h' (BSD: RPC bad procedure for program):  *note Error
-     Codes::.
-
-`int EPROGMISMATCH'
-     `errno.h' (BSD: RPC program version wrong):  *note Error Codes::.
-
-`int EPROGUNAVAIL'
-     `errno.h' (BSD: RPC program not available):  *note Error Codes::.
-
-`int EPROTO'
-     `errno.h' (XOPEN: Protocol error):  *note Error Codes::.
-
-`int EPROTONOSUPPORT'
-     `errno.h' (BSD: Protocol not supported):  *note Error Codes::.
-
-`int EPROTOTYPE'
-     `errno.h' (BSD: Protocol wrong type for socket):  *note Error
-     Codes::.
-
-`int EQUIV_CLASS_MAX'
-     `limits.h' (POSIX.2):  *note Utility Limits::.
-
-`double erand48 (unsigned short int XSUBI[3])'
-     `stdlib.h' (SVID):  *note SVID Random::.
-
-`int erand48_r (unsigned short int XSUBI[3], struct drand48_data *BUFFER, double *RESULT)'
-     `stdlib.h' (GNU):  *note SVID Random::.
-
-`int ERANGE'
-     `errno.h' (ISO: Numerical result out of range):  *note Error
-     Codes::.
-
-`int EREMCHG'
-     `errno.h' (Linux???: Remote address changed):  *note Error Codes::.
-
-`int EREMOTE'
-     `errno.h' (BSD: Object is remote):  *note Error Codes::.
-
-`int EREMOTEIO'
-     `errno.h' (Linux???: Remote I/O error):  *note Error Codes::.
-
-`int ERESTART'
-     `errno.h' (Linux???: Interrupted system call should be restarted):
-     *note Error Codes::.
-
-`double erf (double X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`double erfc (double X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`float erfcf (float X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`long double erfcl (long double X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`float erff (float X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`int ERFKILL'
-     `errno.h' (Linux: Operation not possible due to RF-kill):  *note
-     Error Codes::.
-
-`long double erfl (long double X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`int EROFS'
-     `errno.h' (POSIX.1: Read-only file system):  *note Error Codes::.
-
-`int ERPCMISMATCH'
-     `errno.h' (BSD: RPC version wrong):  *note Error Codes::.
-
-`void err (int STATUS, const char *FORMAT, ...)'
-     `err.h' (BSD):  *note Error Messages::.
-
-`volatile int errno'
-     `errno.h' (ISO):  *note Checking for Errors::.
-
-`void error (int STATUS, int ERRNUM, const char *FORMAT, ...)'
-     `error.h' (GNU):  *note Error Messages::.
-
-`void error_at_line (int STATUS, int ERRNUM, const char *FNAME, unsigned int LINENO, const char *FORMAT, ...)'
-     `error.h' (GNU):  *note Error Messages::.
-
-`unsigned int error_message_count'
-     `error.h' (GNU):  *note Error Messages::.
-
-`int error_one_per_line'
-     `error.h' (GNU):  *note Error Messages::.
-
-`void errx (int STATUS, const char *FORMAT, ...)'
-     `err.h' (BSD):  *note Error Messages::.
-
-`int ESHUTDOWN'
-     `errno.h' (BSD: Cannot send after transport endpoint shutdown):
-     *note Error Codes::.
-
-`int ESOCKTNOSUPPORT'
-     `errno.h' (BSD: Socket type not supported):  *note Error Codes::.
-
-`int ESPIPE'
-     `errno.h' (POSIX.1: Illegal seek):  *note Error Codes::.
-
-`int ESRCH'
-     `errno.h' (POSIX.1: No such process):  *note Error Codes::.
-
-`int ESRMNT'
-     `errno.h' (Linux???: Srmount error):  *note Error Codes::.
-
-`int ESTALE'
-     `errno.h' (BSD: Stale file handle):  *note Error Codes::.
-
-`int ESTRPIPE'
-     `errno.h' (Linux???: Streams pipe error):  *note Error Codes::.
-
-`int ETIME'
-     `errno.h' (XOPEN: Timer expired):  *note Error Codes::.
-
-`int ETIMEDOUT'
-     `errno.h' (BSD: Connection timed out):  *note Error Codes::.
-
-`int ETOOMANYREFS'
-     `errno.h' (BSD: Too many references: cannot splice):  *note Error
-     Codes::.
-
-`int ETXTBSY'
-     `errno.h' (BSD: Text file busy):  *note Error Codes::.
-
-`int EUCLEAN'
-     `errno.h' (Linux???: Structure needs cleaning):  *note Error
-     Codes::.
-
-`int EUNATCH'
-     `errno.h' (Linux???: Protocol driver not attached):  *note Error
-     Codes::.
-
-`int EUSERS'
-     `errno.h' (BSD: Too many users):  *note Error Codes::.
-
-`int EWOULDBLOCK'
-     `errno.h' (BSD: Operation would block):  *note Error Codes::.
-
-`int EXDEV'
-     `errno.h' (POSIX.1: Invalid cross-device link):  *note Error
-     Codes::.
-
-`int execl (const char *FILENAME, const char *ARG0, ...)'
-     `unistd.h' (POSIX.1):  *note Executing a File::.
-
-`int execle (const char *FILENAME, const char *ARG0, ..., char *const ENV[])'
-     `unistd.h' (POSIX.1):  *note Executing a File::.
-
-`int execlp (const char *FILENAME, const char *ARG0, ...)'
-     `unistd.h' (POSIX.1):  *note Executing a File::.
-
-`int execv (const char *FILENAME, char *const ARGV[])'
-     `unistd.h' (POSIX.1):  *note Executing a File::.
-
-`int execve (const char *FILENAME, char *const ARGV[], char *const ENV[])'
-     `unistd.h' (POSIX.1):  *note Executing a File::.
-
-`int execvp (const char *FILENAME, char *const ARGV[])'
-     `unistd.h' (POSIX.1):  *note Executing a File::.
-
-`int EXFULL'
-     `errno.h' (Linux???: Exchange full):  *note Error Codes::.
-
-`void _Exit (int STATUS)'
-     `stdlib.h' (ISO):  *note Termination Internals::.
-
-`void _exit (int STATUS)'
-     `unistd.h' (POSIX.1):  *note Termination Internals::.
-
-`void exit (int STATUS)'
-     `stdlib.h' (ISO):  *note Normal Termination::.
-
-`int EXIT_FAILURE'
-     `stdlib.h' (ISO):  *note Exit Status::.
-
-`int EXIT_SUCCESS'
-     `stdlib.h' (ISO):  *note Exit Status::.
-
-`double exp (double X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`double exp10 (double X)'
-     `math.h' (GNU):  *note Exponents and Logarithms::.
-
-`float exp10f (float X)'
-     `math.h' (GNU):  *note Exponents and Logarithms::.
-
-`long double exp10l (long double X)'
-     `math.h' (GNU):  *note Exponents and Logarithms::.
-
-`double exp2 (double X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`float exp2f (float X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`long double exp2l (long double X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`float expf (float X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`long double expl (long double X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`double expm1 (double X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`float expm1f (float X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`long double expm1l (long double X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`int EXPR_NEST_MAX'
-     `limits.h' (POSIX.2):  *note Utility Limits::.
-
-`double fabs (double NUMBER)'
-     `math.h' (ISO):  *note Absolute Value::.
-
-`float fabsf (float NUMBER)'
-     `math.h' (ISO):  *note Absolute Value::.
-
-`long double fabsl (long double NUMBER)'
-     `math.h' (ISO):  *note Absolute Value::.
-
-`size_t __fbufsize (FILE *STREAM)'
-     `stdio_ext.h' (GNU):  *note Controlling Buffering::.
-
-`int fchdir (int FILEDES)'
-     `unistd.h' (XPG):  *note Working Directory::.
-
-`int fchmod (int FILEDES, mode_t MODE)'
-     `sys/stat.h' (BSD):  *note Setting Permissions::.
-
-`int fchown (int FILEDES, uid_t OWNER, gid_t GROUP)'
-     `unistd.h' (BSD):  *note File Owner::.
-
-`int fclose (FILE *STREAM)'
-     `stdio.h' (ISO):  *note Closing Streams::.
-
-`int fcloseall (void)'
-     `stdio.h' (GNU):  *note Closing Streams::.
-
-`int fcntl (int FILEDES, int COMMAND, ...)'
-     `fcntl.h' (POSIX.1):  *note Control Operations::.
-
-`char * fcvt (double VALUE, int NDIGIT, int *DECPT, int *NEG)'
-     `stdlib.h' (SVID, Unix98):  *note System V Number Conversion::.
-
-`int fcvt_r (double VALUE, int NDIGIT, int *DECPT, int *NEG, char *BUF, size_t LEN)'
-     `stdlib.h' (SVID, Unix98):  *note System V Number Conversion::.
-
-`int fdatasync (int FILDES)'
-     `unistd.h' (POSIX):  *note Synchronizing I/O::.
-
-`int FD_CLOEXEC'
-     `fcntl.h' (POSIX.1):  *note Descriptor Flags::.
-
-`void FD_CLR (int FILEDES, fd_set *SET)'
-     `sys/types.h' (BSD):  *note Waiting for I/O::.
-
-`double fdim (double X, double Y)'
-     `math.h' (ISO):  *note Misc FP Arithmetic::.
-
-`float fdimf (float X, float Y)'
-     `math.h' (ISO):  *note Misc FP Arithmetic::.
-
-`long double fdiml (long double X, long double Y)'
-     `math.h' (ISO):  *note Misc FP Arithmetic::.
-
-`int FD_ISSET (int FILEDES, const fd_set *SET)'
-     `sys/types.h' (BSD):  *note Waiting for I/O::.
-
-`FILE * fdopen (int FILEDES, const char *OPENTYPE)'
-     `stdio.h' (POSIX.1):  *note Descriptors and Streams::.
-
-`DIR * fdopendir (int FD)'
-     `dirent.h' (GNU):  *note Opening a Directory::.
-
-`void FD_SET (int FILEDES, fd_set *SET)'
-     `sys/types.h' (BSD):  *note Waiting for I/O::.
-
-`fd_set'
-     `sys/types.h' (BSD):  *note Waiting for I/O::.
-
-`int FD_SETSIZE'
-     `sys/types.h' (BSD):  *note Waiting for I/O::.
-
-`int F_DUPFD'
-     `fcntl.h' (POSIX.1):  *note Duplicating Descriptors::.
-
-`void FD_ZERO (fd_set *SET)'
-     `sys/types.h' (BSD):  *note Waiting for I/O::.
-
-`int feclearexcept (int EXCEPTS)'
-     `fenv.h' (ISO):  *note Status bit operations::.
-
-`int fedisableexcept (int EXCEPTS)'
-     `fenv.h' (GNU):  *note Control Functions::.
-
-`FE_DIVBYZERO'
-     `fenv.h' (ISO):  *note Status bit operations::.
-
-`FE_DOWNWARD'
-     `fenv.h' (ISO):  *note Rounding::.
-
-`int feenableexcept (int EXCEPTS)'
-     `fenv.h' (GNU):  *note Control Functions::.
-
-`int fegetenv (fenv_t *ENVP)'
-     `fenv.h' (ISO):  *note Control Functions::.
-
-`int fegetexcept (void)'
-     `fenv.h' (GNU):  *note Control Functions::.
-
-`int fegetexceptflag (fexcept_t *FLAGP, int EXCEPTS)'
-     `fenv.h' (ISO):  *note Status bit operations::.
-
-`int fegetround (void)'
-     `fenv.h' (ISO):  *note Rounding::.
-
-`int feholdexcept (fenv_t *ENVP)'
-     `fenv.h' (ISO):  *note Control Functions::.
-
-`FE_INEXACT'
-     `fenv.h' (ISO):  *note Status bit operations::.
-
-`FE_INVALID'
-     `fenv.h' (ISO):  *note Status bit operations::.
-
-`int feof (FILE *STREAM)'
-     `stdio.h' (ISO):  *note EOF and Errors::.
-
-`int feof_unlocked (FILE *STREAM)'
-     `stdio.h' (GNU):  *note EOF and Errors::.
-
-`FE_OVERFLOW'
-     `fenv.h' (ISO):  *note Status bit operations::.
-
-`int feraiseexcept (int EXCEPTS)'
-     `fenv.h' (ISO):  *note Status bit operations::.
-
-`int ferror (FILE *STREAM)'
-     `stdio.h' (ISO):  *note EOF and Errors::.
-
-`int ferror_unlocked (FILE *STREAM)'
-     `stdio.h' (GNU):  *note EOF and Errors::.
-
-`int fesetenv (const fenv_t *ENVP)'
-     `fenv.h' (ISO):  *note Control Functions::.
-
-`int fesetexceptflag (const fexcept_t *FLAGP, int EXCEPTS)'
-     `fenv.h' (ISO):  *note Status bit operations::.
-
-`int fesetround (int ROUND)'
-     `fenv.h' (ISO):  *note Rounding::.
-
-`int fetestexcept (int EXCEPTS)'
-     `fenv.h' (ISO):  *note Status bit operations::.
-
-`FE_TONEAREST'
-     `fenv.h' (ISO):  *note Rounding::.
-
-`FE_TOWARDZERO'
-     `fenv.h' (ISO):  *note Rounding::.
-
-`FE_UNDERFLOW'
-     `fenv.h' (ISO):  *note Status bit operations::.
-
-`int feupdateenv (const fenv_t *ENVP)'
-     `fenv.h' (ISO):  *note Control Functions::.
-
-`FE_UPWARD'
-     `fenv.h' (ISO):  *note Rounding::.
-
-`int fflush (FILE *STREAM)'
-     `stdio.h' (ISO):  *note Flushing Buffers::.
-
-`int fflush_unlocked (FILE *STREAM)'
-     `stdio.h' (POSIX):  *note Flushing Buffers::.
-
-`int fgetc (FILE *STREAM)'
-     `stdio.h' (ISO):  *note Character Input::.
-
-`int fgetc_unlocked (FILE *STREAM)'
-     `stdio.h' (POSIX):  *note Character Input::.
-
-`int F_GETFD'
-     `fcntl.h' (POSIX.1):  *note Descriptor Flags::.
-
-`int F_GETFL'
-     `fcntl.h' (POSIX.1):  *note Getting File Status Flags::.
-
-`struct group * fgetgrent (FILE *STREAM)'
-     `grp.h' (SVID):  *note Scanning All Groups::.
-
-`int fgetgrent_r (FILE *STREAM, struct group *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct group **RESULT)'
-     `grp.h' (GNU):  *note Scanning All Groups::.
-
-`int F_GETLK'
-     `fcntl.h' (POSIX.1):  *note File Locks::.
-
-`int F_GETOWN'
-     `fcntl.h' (BSD):  *note Interrupt Input::.
-
-`int fgetpos (FILE *STREAM, fpos_t *POSITION)'
-     `stdio.h' (ISO):  *note Portable Positioning::.
-
-`int fgetpos64 (FILE *STREAM, fpos64_t *POSITION)'
-     `stdio.h' (Unix98):  *note Portable Positioning::.
-
-`struct passwd * fgetpwent (FILE *STREAM)'
-     `pwd.h' (SVID):  *note Scanning All Users::.
-
-`int fgetpwent_r (FILE *STREAM, struct passwd *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct passwd **RESULT)'
-     `pwd.h' (GNU):  *note Scanning All Users::.
-
-`char * fgets (char *S, int COUNT, FILE *STREAM)'
-     `stdio.h' (ISO):  *note Line Input::.
-
-`char * fgets_unlocked (char *S, int COUNT, FILE *STREAM)'
-     `stdio.h' (GNU):  *note Line Input::.
-
-`wint_t fgetwc (FILE *STREAM)'
-     `wchar.h' (ISO):  *note Character Input::.
-
-`wint_t fgetwc_unlocked (FILE *STREAM)'
-     `wchar.h' (GNU):  *note Character Input::.
-
-`wchar_t * fgetws (wchar_t *WS, int COUNT, FILE *STREAM)'
-     `wchar.h' (ISO):  *note Line Input::.
-
-`wchar_t * fgetws_unlocked (wchar_t *WS, int COUNT, FILE *STREAM)'
-     `wchar.h' (GNU):  *note Line Input::.
-
-`FILE'
-     `stdio.h' (ISO):  *note Streams::.
-
-`int FILENAME_MAX'
-     `stdio.h' (ISO):  *note Limits for Files::.
-
-`int fileno (FILE *STREAM)'
-     `stdio.h' (POSIX.1):  *note Descriptors and Streams::.
-
-`int fileno_unlocked (FILE *STREAM)'
-     `stdio.h' (GNU):  *note Descriptors and Streams::.
-
-`int finite (double X)'
-     `math.h' (BSD):  *note Floating Point Classes::.
-
-`int finitef (float X)'
-     `math.h' (BSD):  *note Floating Point Classes::.
-
-`int finitel (long double X)'
-     `math.h' (BSD):  *note Floating Point Classes::.
-
-`int __flbf (FILE *STREAM)'
-     `stdio_ext.h' (GNU):  *note Controlling Buffering::.
-
-`void flockfile (FILE *STREAM)'
-     `stdio.h' (POSIX):  *note Streams and Threads::.
-
-`double floor (double X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`float floorf (float X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`long double floorl (long double X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`FLT_DIG'
-     `float.h' (ISO):  *note Floating Point Parameters::.
-
-`FLT_EPSILON'
-     `float.h' (ISO):  *note Floating Point Parameters::.
-
-`FLT_MANT_DIG'
-     `float.h' (ISO):  *note Floating Point Parameters::.
-
-`FLT_MAX'
-     `float.h' (ISO):  *note Floating Point Parameters::.
-
-`FLT_MAX_10_EXP'
-     `float.h' (ISO):  *note Floating Point Parameters::.
-
-`FLT_MAX_EXP'
-     `float.h' (ISO):  *note Floating Point Parameters::.
-
-`FLT_MIN'
-     `float.h' (ISO):  *note Floating Point Parameters::.
-
-`FLT_MIN_10_EXP'
-     `float.h' (ISO):  *note Floating Point Parameters::.
-
-`FLT_MIN_EXP'
-     `float.h' (ISO):  *note Floating Point Parameters::.
-
-`FLT_RADIX'
-     `float.h' (ISO):  *note Floating Point Parameters::.
-
-`FLT_ROUNDS'
-     `float.h' (ISO):  *note Floating Point Parameters::.
-
-`void _flushlbf (void)'
-     `stdio_ext.h' (GNU):  *note Flushing Buffers::.
-
-`tcflag_t FLUSHO'
-     `termios.h' (BSD):  *note Local Modes::.
-
-`double fma (double X, double Y, double Z)'
-     `math.h' (ISO):  *note Misc FP Arithmetic::.
-
-`float fmaf (float X, float Y, float Z)'
-     `math.h' (ISO):  *note Misc FP Arithmetic::.
-
-`long double fmal (long double X, long double Y, long double Z)'
-     `math.h' (ISO):  *note Misc FP Arithmetic::.
-
-`double fmax (double X, double Y)'
-     `math.h' (ISO):  *note Misc FP Arithmetic::.
-
-`float fmaxf (float X, float Y)'
-     `math.h' (ISO):  *note Misc FP Arithmetic::.
-
-`long double fmaxl (long double X, long double Y)'
-     `math.h' (ISO):  *note Misc FP Arithmetic::.
-
-`FILE * fmemopen (void *BUF, size_t SIZE, const char *OPENTYPE)'
-     `stdio.h' (GNU):  *note String Streams::.
-
-`double fmin (double X, double Y)'
-     `math.h' (ISO):  *note Misc FP Arithmetic::.
-
-`float fminf (float X, float Y)'
-     `math.h' (ISO):  *note Misc FP Arithmetic::.
-
-`long double fminl (long double X, long double Y)'
-     `math.h' (ISO):  *note Misc FP Arithmetic::.
-
-`double fmod (double NUMERATOR, double DENOMINATOR)'
-     `math.h' (ISO):  *note Remainder Functions::.
-
-`float fmodf (float NUMERATOR, float DENOMINATOR)'
-     `math.h' (ISO):  *note Remainder Functions::.
-
-`long double fmodl (long double NUMERATOR, long double DENOMINATOR)'
-     `math.h' (ISO):  *note Remainder Functions::.
-
-`int fmtmsg (long int CLASSIFICATION, const char *LABEL, int SEVERITY, const char *TEXT, const char *ACTION, const char *TAG)'
-     `fmtmsg.h' (XPG):  *note Printing Formatted Messages::.
-
-`int fnmatch (const char *PATTERN, const char *STRING, int FLAGS)'
-     `fnmatch.h' (POSIX.2):  *note Wildcard Matching::.
-
-`FNM_CASEFOLD'
-     `fnmatch.h' (GNU):  *note Wildcard Matching::.
-
-`FNM_EXTMATCH'
-     `fnmatch.h' (GNU):  *note Wildcard Matching::.
-
-`FNM_FILE_NAME'
-     `fnmatch.h' (GNU):  *note Wildcard Matching::.
-
-`FNM_LEADING_DIR'
-     `fnmatch.h' (GNU):  *note Wildcard Matching::.
-
-`FNM_NOESCAPE'
-     `fnmatch.h' (POSIX.2):  *note Wildcard Matching::.
-
-`FNM_PATHNAME'
-     `fnmatch.h' (POSIX.2):  *note Wildcard Matching::.
-
-`FNM_PERIOD'
-     `fnmatch.h' (POSIX.2):  *note Wildcard Matching::.
-
-`int F_OK'
-     `unistd.h' (POSIX.1):  *note Testing File Access::.
-
-`FILE * fopen (const char *FILENAME, const char *OPENTYPE)'
-     `stdio.h' (ISO):  *note Opening Streams::.
-
-`FILE * fopen64 (const char *FILENAME, const char *OPENTYPE)'
-     `stdio.h' (Unix98):  *note Opening Streams::.
-
-`FILE * fopencookie (void *COOKIE, const char *OPENTYPE, cookie_io_functions_t IO-FUNCTIONS)'
-     `stdio.h' (GNU):  *note Streams and Cookies::.
-
-`int FOPEN_MAX'
-     `stdio.h' (ISO):  *note Opening Streams::.
-
-`pid_t fork (void)'
-     `unistd.h' (POSIX.1):  *note Creating a Process::.
-
-`int forkpty (int *AMASTER, char *NAME, const struct termios *TERMP, const struct winsize *WINP)'
-     `pty.h' (BSD):  *note Pseudo-Terminal Pairs::.
-
-`long int fpathconf (int FILEDES, int PARAMETER)'
-     `unistd.h' (POSIX.1):  *note Pathconf::.
-
-`int fpclassify (_float-type_ X)'
-     `math.h' (ISO):  *note Floating Point Classes::.
-
-`FPE_DECOVF_TRAP'
-     `signal.h' (BSD):  *note Program Error Signals::.
-
-`FPE_FLTDIV_FAULT'
-     `signal.h' (BSD):  *note Program Error Signals::.
-
-`FPE_FLTDIV_TRAP'
-     `signal.h' (BSD):  *note Program Error Signals::.
-
-`FPE_FLTOVF_FAULT'
-     `signal.h' (BSD):  *note Program Error Signals::.
-
-`FPE_FLTOVF_TRAP'
-     `signal.h' (BSD):  *note Program Error Signals::.
-
-`FPE_FLTUND_FAULT'
-     `signal.h' (BSD):  *note Program Error Signals::.
-
-`FPE_FLTUND_TRAP'
-     `signal.h' (BSD):  *note Program Error Signals::.
-
-`FPE_INTDIV_TRAP'
-     `signal.h' (BSD):  *note Program Error Signals::.
-
-`FPE_INTOVF_TRAP'
-     `signal.h' (BSD):  *note Program Error Signals::.
-
-`size_t __fpending (FILE *STREAM)'
-     `stdio_ext.h' (GNU):  *note Controlling Buffering::.
-
-`FPE_SUBRNG_TRAP'
-     `signal.h' (BSD):  *note Program Error Signals::.
-
-`int FP_ILOGB0'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`int FP_ILOGBNAN'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`fpos64_t'
-     `stdio.h' (Unix98):  *note Portable Positioning::.
-
-`fpos_t'
-     `stdio.h' (ISO):  *note Portable Positioning::.
-
-`int fprintf (FILE *STREAM, const char *TEMPLATE, ...)'
-     `stdio.h' (ISO):  *note Formatted Output Functions::.
-
-`void __fpurge (FILE *STREAM)'
-     `stdio_ext.h' (GNU):  *note Flushing Buffers::.
-
-`int fputc (int C, FILE *STREAM)'
-     `stdio.h' (ISO):  *note Simple Output::.
-
-`int fputc_unlocked (int C, FILE *STREAM)'
-     `stdio.h' (POSIX):  *note Simple Output::.
-
-`int fputs (const char *S, FILE *STREAM)'
-     `stdio.h' (ISO):  *note Simple Output::.
-
-`int fputs_unlocked (const char *S, FILE *STREAM)'
-     `stdio.h' (GNU):  *note Simple Output::.
-
-`wint_t fputwc (wchar_t WC, FILE *STREAM)'
-     `wchar.h' (ISO):  *note Simple Output::.
-
-`wint_t fputwc_unlocked (wchar_t WC, FILE *STREAM)'
-     `wchar.h' (POSIX):  *note Simple Output::.
-
-`int fputws (const wchar_t *WS, FILE *STREAM)'
-     `wchar.h' (ISO):  *note Simple Output::.
-
-`int fputws_unlocked (const wchar_t *WS, FILE *STREAM)'
-     `wchar.h' (GNU):  *note Simple Output::.
-
-`F_RDLCK'
-     `fcntl.h' (POSIX.1):  *note File Locks::.
-
-`size_t fread (void *DATA, size_t SIZE, size_t COUNT, FILE *STREAM)'
-     `stdio.h' (ISO):  *note Block Input/Output::.
-
-`int __freadable (FILE *STREAM)'
-     `stdio_ext.h' (GNU):  *note Opening Streams::.
-
-`int __freading (FILE *STREAM)'
-     `stdio_ext.h' (GNU):  *note Opening Streams::.
-
-`size_t fread_unlocked (void *DATA, size_t SIZE, size_t COUNT, FILE *STREAM)'
-     `stdio.h' (GNU):  *note Block Input/Output::.
-
-`void free (void *PTR)'
-     `malloc.h', `stdlib.h' (ISO):  *note Freeing after Malloc::.
-
-`__free_hook'
-     `malloc.h' (GNU):  *note Hooks for Malloc::.
-
-`FILE * freopen (const char *FILENAME, const char *OPENTYPE, FILE *STREAM)'
-     `stdio.h' (ISO):  *note Opening Streams::.
-
-`FILE * freopen64 (const char *FILENAME, const char *OPENTYPE, FILE *STREAM)'
-     `stdio.h' (Unix98):  *note Opening Streams::.
-
-`double frexp (double VALUE, int *EXPONENT)'
-     `math.h' (ISO):  *note Normalization Functions::.
-
-`float frexpf (float VALUE, int *EXPONENT)'
-     `math.h' (ISO):  *note Normalization Functions::.
-
-`long double frexpl (long double VALUE, int *EXPONENT)'
-     `math.h' (ISO):  *note Normalization Functions::.
-
-`int fscanf (FILE *STREAM, const char *TEMPLATE, ...)'
-     `stdio.h' (ISO):  *note Formatted Input Functions::.
-
-`int fseek (FILE *STREAM, long int OFFSET, int WHENCE)'
-     `stdio.h' (ISO):  *note File Positioning::.
-
-`int fseeko (FILE *STREAM, off_t OFFSET, int WHENCE)'
-     `stdio.h' (Unix98):  *note File Positioning::.
-
-`int fseeko64 (FILE *STREAM, off64_t OFFSET, int WHENCE)'
-     `stdio.h' (Unix98):  *note File Positioning::.
-
-`int F_SETFD'
-     `fcntl.h' (POSIX.1):  *note Descriptor Flags::.
-
-`int F_SETFL'
-     `fcntl.h' (POSIX.1):  *note Getting File Status Flags::.
-
-`int F_SETLK'
-     `fcntl.h' (POSIX.1):  *note File Locks::.
-
-`int F_SETLKW'
-     `fcntl.h' (POSIX.1):  *note File Locks::.
-
-`int __fsetlocking (FILE *STREAM, int TYPE)'
-     `stdio_ext.h' (GNU):  *note Streams and Threads::.
-
-`int F_SETOWN'
-     `fcntl.h' (BSD):  *note Interrupt Input::.
-
-`int fsetpos (FILE *STREAM, const fpos_t *POSITION)'
-     `stdio.h' (ISO):  *note Portable Positioning::.
-
-`int fsetpos64 (FILE *STREAM, const fpos64_t *POSITION)'
-     `stdio.h' (Unix98):  *note Portable Positioning::.
-
-`int fstat (int FILEDES, struct stat *BUF)'
-     `sys/stat.h' (POSIX.1):  *note Reading Attributes::.
-
-`int fstat64 (int FILEDES, struct stat64 *BUF)'
-     `sys/stat.h' (Unix98):  *note Reading Attributes::.
-
-`int fsync (int FILDES)'
-     `unistd.h' (POSIX):  *note Synchronizing I/O::.
-
-`long int ftell (FILE *STREAM)'
-     `stdio.h' (ISO):  *note File Positioning::.
-
-`off_t ftello (FILE *STREAM)'
-     `stdio.h' (Unix98):  *note File Positioning::.
-
-`off64_t ftello64 (FILE *STREAM)'
-     `stdio.h' (Unix98):  *note File Positioning::.
-
-`int ftruncate (int FD, off_t LENGTH)'
-     `unistd.h' (POSIX):  *note File Size::.
-
-`int ftruncate64 (int ID, off64_t LENGTH)'
-     `unistd.h' (Unix98):  *note File Size::.
-
-`int ftrylockfile (FILE *STREAM)'
-     `stdio.h' (POSIX):  *note Streams and Threads::.
-
-`int ftw (const char *FILENAME, __ftw_func_t FUNC, int DESCRIPTORS)'
-     `ftw.h' (SVID):  *note Working with Directory Trees::.
-
-`int ftw64 (const char *FILENAME, __ftw64_func_t FUNC, int DESCRIPTORS)'
-     `ftw.h' (Unix98):  *note Working with Directory Trees::.
-
-`__ftw64_func_t'
-     `ftw.h' (GNU):  *note Working with Directory Trees::.
-
-`__ftw_func_t'
-     `ftw.h' (GNU):  *note Working with Directory Trees::.
-
-`F_UNLCK'
-     `fcntl.h' (POSIX.1):  *note File Locks::.
-
-`void funlockfile (FILE *STREAM)'
-     `stdio.h' (POSIX):  *note Streams and Threads::.
-
-`int futimes (int FD, const struct timeval TVP[2])'
-     `sys/time.h' (BSD):  *note File Times::.
-
-`int fwide (FILE *STREAM, int MODE)'
-     `wchar.h' (ISO):  *note Streams and I18N::.
-
-`int fwprintf (FILE *STREAM, const wchar_t *TEMPLATE, ...)'
-     `wchar.h' (ISO):  *note Formatted Output Functions::.
-
-`int __fwritable (FILE *STREAM)'
-     `stdio_ext.h' (GNU):  *note Opening Streams::.
-
-`size_t fwrite (const void *DATA, size_t SIZE, size_t COUNT, FILE *STREAM)'
-     `stdio.h' (ISO):  *note Block Input/Output::.
-
-`size_t fwrite_unlocked (const void *DATA, size_t SIZE, size_t COUNT, FILE *STREAM)'
-     `stdio.h' (GNU):  *note Block Input/Output::.
-
-`int __fwriting (FILE *STREAM)'
-     `stdio_ext.h' (GNU):  *note Opening Streams::.
-
-`F_WRLCK'
-     `fcntl.h' (POSIX.1):  *note File Locks::.
-
-`int fwscanf (FILE *STREAM, const wchar_t *TEMPLATE, ...)'
-     `wchar.h' (ISO):  *note Formatted Input Functions::.
-
-`double gamma (double X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`float gammaf (float X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`long double gammal (long double X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`void (*__gconv_end_fct) (struct gconv_step *)'
-     `gconv.h' (GNU):  *note glibc iconv Implementation::.
-
-`int (*__gconv_fct) (struct __gconv_step *, struct __gconv_step_data *, const char **, const char *, size_t *, int)'
-     `gconv.h' (GNU):  *note glibc iconv Implementation::.
-
-`int (*__gconv_init_fct) (struct __gconv_step *)'
-     `gconv.h' (GNU):  *note glibc iconv Implementation::.
-
-`char * gcvt (double VALUE, int NDIGIT, char *BUF)'
-     `stdlib.h' (SVID, Unix98):  *note System V Number Conversion::.
-
-`unsigned long int getauxval (unsigned long int TYPE)'
-     `sys/auxv.h' (sys/auxv.h):  *note Auxiliary Vector::.
-
-`long int get_avphys_pages (void)'
-     `sys/sysinfo.h' (GNU):  *note Query Memory Parameters::.
-
-`int getc (FILE *STREAM)'
-     `stdio.h' (ISO):  *note Character Input::.
-
-`int getchar (void)'
-     `stdio.h' (ISO):  *note Character Input::.
-
-`int getchar_unlocked (void)'
-     `stdio.h' (POSIX):  *note Character Input::.
-
-`int getcontext (ucontext_t *UCP)'
-     `ucontext.h' (SVID):  *note System V contexts::.
-
-`int getc_unlocked (FILE *STREAM)'
-     `stdio.h' (POSIX):  *note Character Input::.
-
-`char * get_current_dir_name (void)'
-     `unistd.h' (GNU):  *note Working Directory::.
-
-`char * getcwd (char *BUFFER, size_t SIZE)'
-     `unistd.h' (POSIX.1):  *note Working Directory::.
-
-`struct tm * getdate (const char *STRING)'
-     `time.h' (Unix98):  *note General Time String Parsing::.
-
-`getdate_err'
-     `time.h' (Unix98):  *note General Time String Parsing::.
-
-`int getdate_r (const char *STRING, struct tm *TP)'
-     `time.h' (GNU):  *note General Time String Parsing::.
-
-`ssize_t getdelim (char **LINEPTR, size_t *N, int DELIMITER, FILE *STREAM)'
-     `stdio.h' (GNU):  *note Line Input::.
-
-`int getdomainnname (char *NAME, size_t LENGTH)'
-     `unistd.h' (???):  *note Host Identification::.
-
-`gid_t getegid (void)'
-     `unistd.h' (POSIX.1):  *note Reading Persona::.
-
-`char * getenv (const char *NAME)'
-     `stdlib.h' (ISO):  *note Environment Access::.
-
-`uid_t geteuid (void)'
-     `unistd.h' (POSIX.1):  *note Reading Persona::.
-
-`struct fstab * getfsent (void)'
-     `fstab.h' (BSD):  *note fstab::.
-
-`struct fstab * getfsfile (const char *NAME)'
-     `fstab.h' (BSD):  *note fstab::.
-
-`struct fstab * getfsspec (const char *NAME)'
-     `fstab.h' (BSD):  *note fstab::.
-
-`gid_t getgid (void)'
-     `unistd.h' (POSIX.1):  *note Reading Persona::.
-
-`struct group * getgrent (void)'
-     `grp.h' (SVID, BSD):  *note Scanning All Groups::.
-
-`int getgrent_r (struct group *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct group **RESULT)'
-     `grp.h' (GNU):  *note Scanning All Groups::.
-
-`struct group * getgrgid (gid_t GID)'
-     `grp.h' (POSIX.1):  *note Lookup Group::.
-
-`int getgrgid_r (gid_t GID, struct group *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct group **RESULT)'
-     `grp.h' (POSIX.1c):  *note Lookup Group::.
-
-`struct group * getgrnam (const char *NAME)'
-     `grp.h' (SVID, BSD):  *note Lookup Group::.
-
-`int getgrnam_r (const char *NAME, struct group *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct group **RESULT)'
-     `grp.h' (POSIX.1c):  *note Lookup Group::.
-
-`int getgrouplist (const char *USER, gid_t GROUP, gid_t *GROUPS, int *NGROUPS)'
-     `grp.h' (BSD):  *note Setting Groups::.
-
-`int getgroups (int COUNT, gid_t *GROUPS)'
-     `unistd.h' (POSIX.1):  *note Reading Persona::.
-
-`struct hostent * gethostbyaddr (const void *ADDR, socklen_t LENGTH, int FORMAT)'
-     `netdb.h' (BSD):  *note Host Names::.
-
-`int gethostbyaddr_r (const void *ADDR, socklen_t LENGTH, int FORMAT, struct hostent *restrict RESULT_BUF, char *restrict BUF, size_t BUFLEN, struct hostent **restrict RESULT, int *restrict H_ERRNOP)'
-     `netdb.h' (GNU):  *note Host Names::.
-
-`struct hostent * gethostbyname (const char *NAME)'
-     `netdb.h' (BSD):  *note Host Names::.
-
-`struct hostent * gethostbyname2 (const char *NAME, int AF)'
-     `netdb.h' (IPv6 Basic API):  *note Host Names::.
-
-`int gethostbyname2_r (const char *NAME, int AF, struct hostent *restrict RESULT_BUF, char *restrict BUF, size_t BUFLEN, struct hostent **restrict RESULT, int *restrict H_ERRNOP)'
-     `netdb.h' (GNU):  *note Host Names::.
-
-`int gethostbyname_r (const char *restrict NAME, struct hostent *restrict RESULT_BUF, char *restrict BUF, size_t BUFLEN, struct hostent **restrict RESULT, int *restrict H_ERRNOP)'
-     `netdb.h' (GNU):  *note Host Names::.
-
-`struct hostent * gethostent (void)'
-     `netdb.h' (BSD):  *note Host Names::.
-
-`long int gethostid (void)'
-     `unistd.h' (BSD):  *note Host Identification::.
-
-`int gethostname (char *NAME, size_t SIZE)'
-     `unistd.h' (BSD):  *note Host Identification::.
-
-`int getitimer (int WHICH, struct itimerval *OLD)'
-     `sys/time.h' (BSD):  *note Setting an Alarm::.
-
-`ssize_t getline (char **LINEPTR, size_t *N, FILE *STREAM)'
-     `stdio.h' (GNU):  *note Line Input::.
-
-`int getloadavg (double LOADAVG[], int NELEM)'
-     `stdlib.h' (BSD):  *note Processor Resources::.
-
-`char * getlogin (void)'
-     `unistd.h' (POSIX.1):  *note Who Logged In::.
-
-`struct mntent * getmntent (FILE *STREAM)'
-     `mntent.h' (BSD):  *note mtab::.
-
-`struct mntent * getmntent_r (FILE *STREAM, struct mntent *RESULT, char *BUFFER, int BUFSIZE)'
-     `mntent.h' (BSD):  *note mtab::.
-
-`struct netent * getnetbyaddr (uint32_t NET, int TYPE)'
-     `netdb.h' (BSD):  *note Networks Database::.
-
-`struct netent * getnetbyname (const char *NAME)'
-     `netdb.h' (BSD):  *note Networks Database::.
-
-`struct netent * getnetent (void)'
-     `netdb.h' (BSD):  *note Networks Database::.
-
-`int getnetgrent (char **HOSTP, char **USERP, char **DOMAINP)'
-     `netdb.h' (BSD):  *note Lookup Netgroup::.
-
-`int getnetgrent_r (char **HOSTP, char **USERP, char **DOMAINP, char *BUFFER, size_t BUFLEN)'
-     `netdb.h' (GNU):  *note Lookup Netgroup::.
-
-`int get_nprocs (void)'
-     `sys/sysinfo.h' (GNU):  *note Processor Resources::.
-
-`int get_nprocs_conf (void)'
-     `sys/sysinfo.h' (GNU):  *note Processor Resources::.
-
-`int getopt (int ARGC, char *const *ARGV, const char *OPTIONS)'
-     `unistd.h' (POSIX.2):  *note Using Getopt::.
-
-`int getopt_long (int ARGC, char *const *ARGV, const char *SHORTOPTS, const struct option *LONGOPTS, int *INDEXPTR)'
-     `getopt.h' (GNU):  *note Getopt Long Options::.
-
-`int getopt_long_only (int ARGC, char *const *ARGV, const char *SHORTOPTS, const struct option *LONGOPTS, int *INDEXPTR)'
-     `getopt.h' (GNU):  *note Getopt Long Options::.
-
-`int getpagesize (void)'
-     `unistd.h' (BSD):  *note Query Memory Parameters::.
-
-`char * getpass (const char *PROMPT)'
-     `unistd.h' (BSD):  *note getpass::.
-
-`int getpeername (int SOCKET, struct sockaddr *ADDR, socklen_t *LENGTH-PTR)'
-     `sys/socket.h' (BSD):  *note Who is Connected::.
-
-`int getpgid (pid_t PID)'
-     `unistd.h' (POSIX.1):  *note Process Group Functions::.
-
-`pid_t getpgrp (void)'
-     `unistd.h' (POSIX.1):  *note Process Group Functions::.
-
-`long int get_phys_pages (void)'
-     `sys/sysinfo.h' (GNU):  *note Query Memory Parameters::.
-
-`pid_t getpid (void)'
-     `unistd.h' (POSIX.1):  *note Process Identification::.
-
-`pid_t getppid (void)'
-     `unistd.h' (POSIX.1):  *note Process Identification::.
-
-`int getpriority (int CLASS, int ID)'
-     `sys/resource.h' (BSD,POSIX):  *note Traditional Scheduling
-     Functions::.
-
-`struct protoent * getprotobyname (const char *NAME)'
-     `netdb.h' (BSD):  *note Protocols Database::.
-
-`struct protoent * getprotobynumber (int PROTOCOL)'
-     `netdb.h' (BSD):  *note Protocols Database::.
-
-`struct protoent * getprotoent (void)'
-     `netdb.h' (BSD):  *note Protocols Database::.
-
-`int getpt (void)'
-     `stdlib.h' (GNU):  *note Allocation::.
-
-`struct passwd * getpwent (void)'
-     `pwd.h' (POSIX.1):  *note Scanning All Users::.
-
-`int getpwent_r (struct passwd *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct passwd **RESULT)'
-     `pwd.h' (GNU):  *note Scanning All Users::.
-
-`struct passwd * getpwnam (const char *NAME)'
-     `pwd.h' (POSIX.1):  *note Lookup User::.
-
-`int getpwnam_r (const char *NAME, struct passwd *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct passwd **RESULT)'
-     `pwd.h' (POSIX.1c):  *note Lookup User::.
-
-`struct passwd * getpwuid (uid_t UID)'
-     `pwd.h' (POSIX.1):  *note Lookup User::.
-
-`int getpwuid_r (uid_t UID, struct passwd *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct passwd **RESULT)'
-     `pwd.h' (POSIX.1c):  *note Lookup User::.
-
-`int getrlimit (int RESOURCE, struct rlimit *RLP)'
-     `sys/resource.h' (BSD):  *note Limits on Resources::.
-
-`int getrlimit64 (int RESOURCE, struct rlimit64 *RLP)'
-     `sys/resource.h' (Unix98):  *note Limits on Resources::.
-
-`int getrusage (int PROCESSES, struct rusage *RUSAGE)'
-     `sys/resource.h' (BSD):  *note Resource Usage::.
-
-`char * gets (char *S)'
-     `stdio.h' (ISO):  *note Line Input::.
-
-`struct servent * getservbyname (const char *NAME, const char *PROTO)'
-     `netdb.h' (BSD):  *note Services Database::.
-
-`struct servent * getservbyport (int PORT, const char *PROTO)'
-     `netdb.h' (BSD):  *note Services Database::.
-
-`struct servent * getservent (void)'
-     `netdb.h' (BSD):  *note Services Database::.
-
-`pid_t getsid (pid_t PID)'
-     `unistd.h' (SVID):  *note Process Group Functions::.
-
-`int getsockname (int SOCKET, struct sockaddr *ADDR, socklen_t *LENGTH-PTR)'
-     `sys/socket.h' (BSD):  *note Reading Address::.
-
-`int getsockopt (int SOCKET, int LEVEL, int OPTNAME, void *OPTVAL, socklen_t *OPTLEN-PTR)'
-     `sys/socket.h' (BSD):  *note Socket Option Functions::.
-
-`int getsubopt (char **OPTIONP, char *const *TOKENS, char **VALUEP)'
-     `stdlib.h' (stdlib.h):  *note Suboptions Example: Suboptions.
-
-`char * gettext (const char *MSGID)'
-     `libintl.h' (GNU):  *note Translation with gettext::.
-
-`int gettimeofday (struct timeval *TP, struct timezone *TZP)'
-     `sys/time.h' (BSD):  *note High-Resolution Calendar::.
-
-`uid_t getuid (void)'
-     `unistd.h' (POSIX.1):  *note Reading Persona::.
-
-`mode_t getumask (void)'
-     `sys/stat.h' (GNU):  *note Setting Permissions::.
-
-`struct utmp * getutent (void)'
-     `utmp.h' (SVID):  *note Manipulating the Database::.
-
-`int getutent_r (struct utmp *BUFFER, struct utmp **RESULT)'
-     `utmp.h' (GNU):  *note Manipulating the Database::.
-
-`struct utmp * getutid (const struct utmp *ID)'
-     `utmp.h' (SVID):  *note Manipulating the Database::.
-
-`int getutid_r (const struct utmp *ID, struct utmp *BUFFER, struct utmp **RESULT)'
-     `utmp.h' (GNU):  *note Manipulating the Database::.
-
-`struct utmp * getutline (const struct utmp *LINE)'
-     `utmp.h' (SVID):  *note Manipulating the Database::.
-
-`int getutline_r (const struct utmp *LINE, struct utmp *BUFFER, struct utmp **RESULT)'
-     `utmp.h' (GNU):  *note Manipulating the Database::.
-
-`int getutmp (const struct utmpx *UTMPX, struct utmp *UTMP)'
-     `utmp.h' (GNU):  *note XPG Functions::.
-
-`int getutmpx (const struct utmp *UTMP, struct utmpx *UTMPX)'
-     `utmp.h' (GNU):  *note XPG Functions::.
-
-`struct utmpx * getutxent (void)'
-     `utmpx.h' (XPG4.2):  *note XPG Functions::.
-
-`struct utmpx * getutxid (const struct utmpx *ID)'
-     `utmpx.h' (XPG4.2):  *note XPG Functions::.
-
-`struct utmpx * getutxline (const struct utmpx *LINE)'
-     `utmpx.h' (XPG4.2):  *note XPG Functions::.
-
-`int getw (FILE *STREAM)'
-     `stdio.h' (SVID):  *note Character Input::.
-
-`wint_t getwc (FILE *STREAM)'
-     `wchar.h' (ISO):  *note Character Input::.
-
-`wint_t getwchar (void)'
-     `wchar.h' (ISO):  *note Character Input::.
-
-`wint_t getwchar_unlocked (void)'
-     `wchar.h' (GNU):  *note Character Input::.
-
-`wint_t getwc_unlocked (FILE *STREAM)'
-     `wchar.h' (GNU):  *note Character Input::.
-
-`char * getwd (char *BUFFER)'
-     `unistd.h' (BSD):  *note Working Directory::.
-
-`gid_t'
-     `sys/types.h' (POSIX.1):  *note Reading Persona::.
-
-`int glob (const char *PATTERN, int FLAGS, int (*ERRFUNC) (const char *FILENAME, int ERROR-CODE), glob_t *VECTOR-PTR)'
-     `glob.h' (POSIX.2):  *note Calling Glob::.
-
-`int glob64 (const char *PATTERN, int FLAGS, int (*ERRFUNC) (const char *FILENAME, int ERROR-CODE), glob64_t *VECTOR-PTR)'
-     `glob.h' (GNU):  *note Calling Glob::.
-
-`glob64_t'
-     `glob.h' (GNU):  *note Calling Glob::.
-
-`GLOB_ABORTED'
-     `glob.h' (POSIX.2):  *note Calling Glob::.
-
-`GLOB_ALTDIRFUNC'
-     `glob.h' (GNU):  *note More Flags for Globbing::.
-
-`GLOB_APPEND'
-     `glob.h' (POSIX.2):  *note Flags for Globbing::.
-
-`GLOB_BRACE'
-     `glob.h' (GNU):  *note More Flags for Globbing::.
-
-`GLOB_DOOFFS'
-     `glob.h' (POSIX.2):  *note Flags for Globbing::.
-
-`GLOB_ERR'
-     `glob.h' (POSIX.2):  *note Flags for Globbing::.
-
-`void globfree (glob_t *PGLOB)'
-     `glob.h' (POSIX.2):  *note More Flags for Globbing::.
-
-`void globfree64 (glob64_t *PGLOB)'
-     `glob.h' (GNU):  *note More Flags for Globbing::.
-
-`GLOB_MAGCHAR'
-     `glob.h' (GNU):  *note More Flags for Globbing::.
-
-`GLOB_MARK'
-     `glob.h' (POSIX.2):  *note Flags for Globbing::.
-
-`GLOB_NOCHECK'
-     `glob.h' (POSIX.2):  *note Flags for Globbing::.
-
-`GLOB_NOESCAPE'
-     `glob.h' (POSIX.2):  *note Flags for Globbing::.
-
-`GLOB_NOMAGIC'
-     `glob.h' (GNU):  *note More Flags for Globbing::.
-
-`GLOB_NOMATCH'
-     `glob.h' (POSIX.2):  *note Calling Glob::.
-
-`GLOB_NOSORT'
-     `glob.h' (POSIX.2):  *note Flags for Globbing::.
-
-`GLOB_NOSPACE'
-     `glob.h' (POSIX.2):  *note Calling Glob::.
-
-`GLOB_ONLYDIR'
-     `glob.h' (GNU):  *note More Flags for Globbing::.
-
-`GLOB_PERIOD'
-     `glob.h' (GNU):  *note More Flags for Globbing::.
-
-`glob_t'
-     `glob.h' (POSIX.2):  *note Calling Glob::.
-
-`GLOB_TILDE'
-     `glob.h' (GNU):  *note More Flags for Globbing::.
-
-`GLOB_TILDE_CHECK'
-     `glob.h' (GNU):  *note More Flags for Globbing::.
-
-`struct tm * gmtime (const time_t *TIME)'
-     `time.h' (ISO):  *note Broken-down Time::.
-
-`struct tm * gmtime_r (const time_t *TIME, struct tm *RESULTP)'
-     `time.h' (POSIX.1c):  *note Broken-down Time::.
-
-`_GNU_SOURCE'
-     (GNU):  *note Feature Test Macros::.
-
-`int grantpt (int FILEDES)'
-     `stdlib.h' (SVID, XPG4.2):  *note Allocation::.
-
-`int gsignal (int SIGNUM)'
-     `signal.h' (SVID):  *note Signaling Yourself::.
-
-`int gtty (int FILEDES, struct sgttyb *ATTRIBUTES)'
-     `sgtty.h' (BSD):  *note BSD Terminal Modes::.
-
-`char * hasmntopt (const struct mntent *MNT, const char *OPT)'
-     `mntent.h' (BSD):  *note mtab::.
-
-`int hcreate (size_t NEL)'
-     `search.h' (SVID):  *note Hash Search Function::.
-
-`int hcreate_r (size_t NEL, struct hsearch_data *HTAB)'
-     `search.h' (GNU):  *note Hash Search Function::.
-
-`void hdestroy (void)'
-     `search.h' (SVID):  *note Hash Search Function::.
-
-`void hdestroy_r (struct hsearch_data *HTAB)'
-     `search.h' (GNU):  *note Hash Search Function::.
-
-`HOST_NOT_FOUND'
-     `netdb.h' (BSD):  *note Host Names::.
-
-`ENTRY * hsearch (ENTRY ITEM, ACTION ACTION)'
-     `search.h' (SVID):  *note Hash Search Function::.
-
-`int hsearch_r (ENTRY ITEM, ACTION ACTION, ENTRY **RETVAL, struct hsearch_data *HTAB)'
-     `search.h' (GNU):  *note Hash Search Function::.
-
-`uint32_t htonl (uint32_t HOSTLONG)'
-     `netinet/in.h' (BSD):  *note Byte Order::.
-
-`uint16_t htons (uint16_t HOSTSHORT)'
-     `netinet/in.h' (BSD):  *note Byte Order::.
-
-`double HUGE_VAL'
-     `math.h' (ISO):  *note Math Error Reporting::.
-
-`float HUGE_VALF'
-     `math.h' (ISO):  *note Math Error Reporting::.
-
-`long double HUGE_VALL'
-     `math.h' (ISO):  *note Math Error Reporting::.
-
-`tcflag_t HUPCL'
-     `termios.h' (POSIX.1):  *note Control Modes::.
-
-`double hypot (double X, double Y)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`float hypotf (float X, float Y)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`long double hypotl (long double X, long double Y)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`tcflag_t ICANON'
-     `termios.h' (POSIX.1):  *note Local Modes::.
-
-`size_t iconv (iconv_t CD, char **INBUF, size_t *INBYTESLEFT, char **OUTBUF, size_t *OUTBYTESLEFT)'
-     `iconv.h' (XPG2):  *note Generic Conversion Interface::.
-
-`int iconv_close (iconv_t CD)'
-     `iconv.h' (XPG2):  *note Generic Conversion Interface::.
-
-`iconv_t iconv_open (const char *TOCODE, const char *FROMCODE)'
-     `iconv.h' (XPG2):  *note Generic Conversion Interface::.
-
-`iconv_t'
-     `iconv.h' (XPG2):  *note Generic Conversion Interface::.
-
-`tcflag_t ICRNL'
-     `termios.h' (POSIX.1):  *note Input Modes::.
-
-`tcflag_t IEXTEN'
-     `termios.h' (POSIX.1):  *note Local Modes::.
-
-`void if_freenameindex (struct if_nameindex *PTR)'
-     `net/if.h' (IPv6 basic API):  *note Interface Naming::.
-
-`char * if_indextoname (unsigned int IFINDEX, char *IFNAME)'
-     `net/if.h' (IPv6 basic API):  *note Interface Naming::.
-
-`struct if_nameindex * if_nameindex (void)'
-     `net/if.h' (IPv6 basic API):  *note Interface Naming::.
-
-`unsigned int if_nametoindex (const char *IFNAME)'
-     `net/if.h' (IPv6 basic API):  *note Interface Naming::.
-
-`size_t IFNAMSIZ'
-     `net/if.h' (net/if.h):  *note Interface Naming::.
-
-`int IFTODT (mode_t MODE)'
-     `dirent.h' (BSD):  *note Directory Entries::.
-
-`tcflag_t IGNBRK'
-     `termios.h' (POSIX.1):  *note Input Modes::.
-
-`tcflag_t IGNCR'
-     `termios.h' (POSIX.1):  *note Input Modes::.
-
-`tcflag_t IGNPAR'
-     `termios.h' (POSIX.1):  *note Input Modes::.
-
-`int ilogb (double X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`int ilogbf (float X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`int ilogbl (long double X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`intmax_t imaxabs (intmax_t NUMBER)'
-     `inttypes.h' (ISO):  *note Absolute Value::.
-
-`tcflag_t IMAXBEL'
-     `termios.h' (BSD):  *note Input Modes::.
-
-`imaxdiv_t imaxdiv (intmax_t NUMERATOR, intmax_t DENOMINATOR)'
-     `inttypes.h' (ISO):  *note Integer Division::.
-
-`imaxdiv_t'
-     `inttypes.h' (ISO):  *note Integer Division::.
-
-`struct in6_addr in6addr_any'
-     `netinet/in.h' (IPv6 basic API):  *note Host Address Data Type::.
-
-`struct in6_addr in6addr_loopback'
-     `netinet/in.h' (IPv6 basic API):  *note Host Address Data Type::.
-
-`uint32_t INADDR_ANY'
-     `netinet/in.h' (BSD):  *note Host Address Data Type::.
-
-`uint32_t INADDR_BROADCAST'
-     `netinet/in.h' (BSD):  *note Host Address Data Type::.
-
-`uint32_t INADDR_LOOPBACK'
-     `netinet/in.h' (BSD):  *note Host Address Data Type::.
-
-`uint32_t INADDR_NONE'
-     `netinet/in.h' (BSD):  *note Host Address Data Type::.
-
-`char * index (const char *STRING, int C)'
-     `string.h' (BSD):  *note Search Functions::.
-
-`uint32_t inet_addr (const char *NAME)'
-     `arpa/inet.h' (BSD):  *note Host Address Functions::.
-
-`int inet_aton (const char *NAME, struct in_addr *ADDR)'
-     `arpa/inet.h' (BSD):  *note Host Address Functions::.
-
-`uint32_t inet_lnaof (struct in_addr ADDR)'
-     `arpa/inet.h' (BSD):  *note Host Address Functions::.
-
-`struct in_addr inet_makeaddr (uint32_t NET, uint32_t LOCAL)'
-     `arpa/inet.h' (BSD):  *note Host Address Functions::.
-
-`uint32_t inet_netof (struct in_addr ADDR)'
-     `arpa/inet.h' (BSD):  *note Host Address Functions::.
-
-`uint32_t inet_network (const char *NAME)'
-     `arpa/inet.h' (BSD):  *note Host Address Functions::.
-
-`char * inet_ntoa (struct in_addr ADDR)'
-     `arpa/inet.h' (BSD):  *note Host Address Functions::.
-
-`const char * inet_ntop (int AF, const void *CP, char *BUF, socklen_t LEN)'
-     `arpa/inet.h' (IPv6 basic API):  *note Host Address Functions::.
-
-`int inet_pton (int AF, const char *CP, void *BUF)'
-     `arpa/inet.h' (IPv6 basic API):  *note Host Address Functions::.
-
-`float INFINITY'
-     `math.h' (ISO):  *note Infinity and NaN::.
-
-`int initgroups (const char *USER, gid_t GROUP)'
-     `grp.h' (BSD):  *note Setting Groups::.
-
-`INIT_PROCESS'
-     `utmp.h' (SVID):  *note Manipulating the Database::.
-
-`INIT_PROCESS'
-     `utmpx.h' (XPG4.2):  *note XPG Functions::.
-
-`char * initstate (unsigned int SEED, char *STATE, size_t SIZE)'
-     `stdlib.h' (BSD):  *note BSD Random::.
-
-`int initstate_r (unsigned int SEED, char *restrict STATEBUF, size_t STATELEN, struct random_data *restrict BUF)'
-     `stdlib.h' (GNU):  *note BSD Random::.
-
-`tcflag_t INLCR'
-     `termios.h' (POSIX.1):  *note Input Modes::.
-
-`int innetgr (const char *NETGROUP, const char *HOST, const char *USER, const char *DOMAIN)'
-     `netdb.h' (BSD):  *note Netgroup Membership::.
-
-`ino64_t'
-     `sys/types.h' (Unix98):  *note Attribute Meanings::.
-
-`ino_t'
-     `sys/types.h' (POSIX.1):  *note Attribute Meanings::.
-
-`tcflag_t INPCK'
-     `termios.h' (POSIX.1):  *note Input Modes::.
-
-`INT_MAX'
-     `limits.h' (ISO):  *note Range of Type::.
-
-`INT_MIN'
-     `limits.h' (ISO):  *note Range of Type::.
-
-`int ioctl (int FILEDES, int COMMAND, ...)'
-     `sys/ioctl.h' (BSD):  *note IOCTLs::.
-
-`int _IOFBF'
-     `stdio.h' (ISO):  *note Controlling Buffering::.
-
-`int _IOLBF'
-     `stdio.h' (ISO):  *note Controlling Buffering::.
-
-`int _IONBF'
-     `stdio.h' (ISO):  *note Controlling Buffering::.
-
-`int IPPORT_RESERVED'
-     `netinet/in.h' (BSD):  *note Ports::.
-
-`int IPPORT_USERRESERVED'
-     `netinet/in.h' (BSD):  *note Ports::.
-
-`int isalnum (int C)'
-     `ctype.h' (ISO):  *note Classification of Characters::.
-
-`int isalpha (int C)'
-     `ctype.h' (ISO):  *note Classification of Characters::.
-
-`int isascii (int C)'
-     `ctype.h' (SVID, BSD):  *note Classification of Characters::.
-
-`int isatty (int FILEDES)'
-     `unistd.h' (POSIX.1):  *note Is It a Terminal::.
-
-`int isblank (int C)'
-     `ctype.h' (ISO):  *note Classification of Characters::.
-
-`int iscntrl (int C)'
-     `ctype.h' (ISO):  *note Classification of Characters::.
-
-`int isdigit (int C)'
-     `ctype.h' (ISO):  *note Classification of Characters::.
-
-`int isfinite (_float-type_ X)'
-     `math.h' (ISO):  *note Floating Point Classes::.
-
-`int isgraph (int C)'
-     `ctype.h' (ISO):  *note Classification of Characters::.
-
-`int isgreater (_real-floating_ X, _real-floating_ Y)'
-     `math.h' (ISO):  *note FP Comparison Functions::.
-
-`int isgreaterequal (_real-floating_ X, _real-floating_ Y)'
-     `math.h' (ISO):  *note FP Comparison Functions::.
-
-`tcflag_t ISIG'
-     `termios.h' (POSIX.1):  *note Local Modes::.
-
-`int isinf (double X)'
-     `math.h' (BSD):  *note Floating Point Classes::.
-
-`int isinff (float X)'
-     `math.h' (BSD):  *note Floating Point Classes::.
-
-`int isinfl (long double X)'
-     `math.h' (BSD):  *note Floating Point Classes::.
-
-`int isless (_real-floating_ X, _real-floating_ Y)'
-     `math.h' (ISO):  *note FP Comparison Functions::.
-
-`int islessequal (_real-floating_ X, _real-floating_ Y)'
-     `math.h' (ISO):  *note FP Comparison Functions::.
-
-`int islessgreater (_real-floating_ X, _real-floating_ Y)'
-     `math.h' (ISO):  *note FP Comparison Functions::.
-
-`int islower (int C)'
-     `ctype.h' (ISO):  *note Classification of Characters::.
-
-`int isnan (_float-type_ X)'
-     `math.h' (ISO):  *note Floating Point Classes::.
-
-`int isnan (double X)'
-     `math.h' (BSD):  *note Floating Point Classes::.
-
-`int isnanf (float X)'
-     `math.h' (BSD):  *note Floating Point Classes::.
-
-`int isnanl (long double X)'
-     `math.h' (BSD):  *note Floating Point Classes::.
-
-`int isnormal (_float-type_ X)'
-     `math.h' (ISO):  *note Floating Point Classes::.
-
-`_ISOC99_SOURCE'
-     (GNU):  *note Feature Test Macros::.
-
-`int isprint (int C)'
-     `ctype.h' (ISO):  *note Classification of Characters::.
-
-`int ispunct (int C)'
-     `ctype.h' (ISO):  *note Classification of Characters::.
-
-`int issignaling (_float-type_ X)'
-     `math.h' (GNU):  *note Floating Point Classes::.
-
-`int isspace (int C)'
-     `ctype.h' (ISO):  *note Classification of Characters::.
-
-`tcflag_t ISTRIP'
-     `termios.h' (POSIX.1):  *note Input Modes::.
-
-`int isunordered (_real-floating_ X, _real-floating_ Y)'
-     `math.h' (ISO):  *note FP Comparison Functions::.
-
-`int isupper (int C)'
-     `ctype.h' (ISO):  *note Classification of Characters::.
-
-`int iswalnum (wint_t WC)'
-     `wctype.h' (ISO):  *note Classification of Wide Characters::.
-
-`int iswalpha (wint_t WC)'
-     `wctype.h' (ISO):  *note Classification of Wide Characters::.
-
-`int iswblank (wint_t WC)'
-     `wctype.h' (ISO):  *note Classification of Wide Characters::.
-
-`int iswcntrl (wint_t WC)'
-     `wctype.h' (ISO):  *note Classification of Wide Characters::.
-
-`int iswctype (wint_t WC, wctype_t DESC)'
-     `wctype.h' (ISO):  *note Classification of Wide Characters::.
-
-`int iswdigit (wint_t WC)'
-     `wctype.h' (ISO):  *note Classification of Wide Characters::.
-
-`int iswgraph (wint_t WC)'
-     `wctype.h' (ISO):  *note Classification of Wide Characters::.
-
-`int iswlower (wint_t WC)'
-     `ctype.h' (ISO):  *note Classification of Wide Characters::.
-
-`int iswprint (wint_t WC)'
-     `wctype.h' (ISO):  *note Classification of Wide Characters::.
-
-`int iswpunct (wint_t WC)'
-     `wctype.h' (ISO):  *note Classification of Wide Characters::.
-
-`int iswspace (wint_t WC)'
-     `wctype.h' (ISO):  *note Classification of Wide Characters::.
-
-`int iswupper (wint_t WC)'
-     `wctype.h' (ISO):  *note Classification of Wide Characters::.
-
-`int iswxdigit (wint_t WC)'
-     `wctype.h' (ISO):  *note Classification of Wide Characters::.
-
-`int isxdigit (int C)'
-     `ctype.h' (ISO):  *note Classification of Characters::.
-
-`ITIMER_PROF'
-     `sys/time.h' (BSD):  *note Setting an Alarm::.
-
-`ITIMER_REAL'
-     `sys/time.h' (BSD):  *note Setting an Alarm::.
-
-`ITIMER_VIRTUAL'
-     `sys/time.h' (BSD):  *note Setting an Alarm::.
-
-`tcflag_t IXANY'
-     `termios.h' (BSD):  *note Input Modes::.
-
-`tcflag_t IXOFF'
-     `termios.h' (POSIX.1):  *note Input Modes::.
-
-`tcflag_t IXON'
-     `termios.h' (POSIX.1):  *note Input Modes::.
-
-`double j0 (double X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`float j0f (float X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`long double j0l (long double X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`double j1 (double X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`float j1f (float X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`long double j1l (long double X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`jmp_buf'
-     `setjmp.h' (ISO):  *note Non-Local Details::.
-
-`double jn (int N, double X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`float jnf (int N, float X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`long double jnl (int N, long double X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`long int jrand48 (unsigned short int XSUBI[3])'
-     `stdlib.h' (SVID):  *note SVID Random::.
-
-`int jrand48_r (unsigned short int XSUBI[3], struct drand48_data *BUFFER, long int *RESULT)'
-     `stdlib.h' (GNU):  *note SVID Random::.
-
-`int kill (pid_t PID, int SIGNUM)'
-     `signal.h' (POSIX.1):  *note Signaling Another Process::.
-
-`int killpg (int PGID, int SIGNUM)'
-     `signal.h' (BSD):  *note Signaling Another Process::.
-
-`char * l64a (long int N)'
-     `stdlib.h' (XPG):  *note Encode Binary Data::.
-
-`long int labs (long int NUMBER)'
-     `stdlib.h' (ISO):  *note Absolute Value::.
-
-`LANG'
-     `locale.h' (ISO):  *note Locale Categories::.
-
-`LC_ALL'
-     `locale.h' (ISO):  *note Locale Categories::.
-
-`LC_COLLATE'
-     `locale.h' (ISO):  *note Locale Categories::.
-
-`LC_CTYPE'
-     `locale.h' (ISO):  *note Locale Categories::.
-
-`LC_MESSAGES'
-     `locale.h' (XOPEN):  *note Locale Categories::.
-
-`LC_MONETARY'
-     `locale.h' (ISO):  *note Locale Categories::.
-
-`LC_NUMERIC'
-     `locale.h' (ISO):  *note Locale Categories::.
-
-`void lcong48 (unsigned short int PARAM[7])'
-     `stdlib.h' (SVID):  *note SVID Random::.
-
-`int lcong48_r (unsigned short int PARAM[7], struct drand48_data *BUFFER)'
-     `stdlib.h' (GNU):  *note SVID Random::.
-
-`int L_ctermid'
-     `stdio.h' (POSIX.1):  *note Identifying the Terminal::.
-
-`LC_TIME'
-     `locale.h' (ISO):  *note Locale Categories::.
-
-`int L_cuserid'
-     `stdio.h' (POSIX.1):  *note Who Logged In::.
-
-`double ldexp (double VALUE, int EXPONENT)'
-     `math.h' (ISO):  *note Normalization Functions::.
-
-`float ldexpf (float VALUE, int EXPONENT)'
-     `math.h' (ISO):  *note Normalization Functions::.
-
-`long double ldexpl (long double VALUE, int EXPONENT)'
-     `math.h' (ISO):  *note Normalization Functions::.
-
-`ldiv_t ldiv (long int NUMERATOR, long int DENOMINATOR)'
-     `stdlib.h' (ISO):  *note Integer Division::.
-
-`ldiv_t'
-     `stdlib.h' (ISO):  *note Integer Division::.
-
-`void * lfind (const void *KEY, const void *BASE, size_t *NMEMB, size_t SIZE, comparison_fn_t COMPAR)'
-     `search.h' (SVID):  *note Array Search Function::.
-
-`double lgamma (double X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`float lgammaf (float X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`float lgammaf_r (float X, int *SIGNP)'
-     `math.h' (XPG):  *note Special Functions::.
-
-`long double lgammal (long double X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`long double lgammal_r (long double X, int *SIGNP)'
-     `math.h' (XPG):  *note Special Functions::.
-
-`double lgamma_r (double X, int *SIGNP)'
-     `math.h' (XPG):  *note Special Functions::.
-
-`L_INCR'
-     `sys/file.h' (BSD):  *note File Positioning::.
-
-`int LINE_MAX'
-     `limits.h' (POSIX.2):  *note Utility Limits::.
-
-`int link (const char *OLDNAME, const char *NEWNAME)'
-     `unistd.h' (POSIX.1):  *note Hard Links::.
-
-`int LINK_MAX'
-     `limits.h', `(optional)' (POSIX.1):  *note Limits for Files::.
-
-`int lio_listio (int MODE, struct aiocb *const LIST[], int NENT, struct sigevent *SIG)'
-     `aio.h' (POSIX.1b):  *note Asynchronous Reads/Writes::.
-
-`int lio_listio64 (int MODE, struct aiocb64 *const LIST[], int NENT, struct sigevent *SIG)'
-     `aio.h' (Unix98):  *note Asynchronous Reads/Writes::.
-
-`int listen (int SOCKET, int N)'
-     `sys/socket.h' (BSD):  *note Listening::.
-
-`long long int llabs (long long int NUMBER)'
-     `stdlib.h' (ISO):  *note Absolute Value::.
-
-`lldiv_t lldiv (long long int NUMERATOR, long long int DENOMINATOR)'
-     `stdlib.h' (ISO):  *note Integer Division::.
-
-`lldiv_t'
-     `stdlib.h' (ISO):  *note Integer Division::.
-
-`LLONG_MAX'
-     `limits.h' (ISO):  *note Range of Type::.
-
-`LLONG_MIN'
-     `limits.h' (ISO):  *note Range of Type::.
-
-`long long int llrint (double X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`long long int llrintf (float X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`long long int llrintl (long double X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`long long int llround (double X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`long long int llroundf (float X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`long long int llroundl (long double X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`struct lconv * localeconv (void)'
-     `locale.h' (ISO):  *note The Lame Way to Locale Data::.
-
-`struct tm * localtime (const time_t *TIME)'
-     `time.h' (ISO):  *note Broken-down Time::.
-
-`struct tm * localtime_r (const time_t *TIME, struct tm *RESULTP)'
-     `time.h' (POSIX.1c):  *note Broken-down Time::.
-
-`double log (double X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`double log10 (double X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`float log10f (float X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`long double log10l (long double X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`double log1p (double X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`float log1pf (float X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`long double log1pl (long double X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`double log2 (double X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`float log2f (float X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`long double log2l (long double X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`double logb (double X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`float logbf (float X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`long double logbl (long double X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`float logf (float X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`void login (const struct utmp *ENTRY)'
-     `utmp.h' (BSD):  *note Logging In and Out::.
-
-`LOGIN_PROCESS'
-     `utmp.h' (SVID):  *note Manipulating the Database::.
-
-`LOGIN_PROCESS'
-     `utmpx.h' (XPG4.2):  *note XPG Functions::.
-
-`int login_tty (int FILEDES)'
-     `utmp.h' (BSD):  *note Logging In and Out::.
-
-`long double logl (long double X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`int logout (const char *UT_LINE)'
-     `utmp.h' (BSD):  *note Logging In and Out::.
-
-`void logwtmp (const char *UT_LINE, const char *UT_NAME, const char *UT_HOST)'
-     `utmp.h' (BSD):  *note Logging In and Out::.
-
-`void longjmp (jmp_buf STATE, int VALUE)'
-     `setjmp.h' (ISO):  *note Non-Local Details::.
-
-`LONG_LONG_MAX'
-     `limits.h' (GNU):  *note Range of Type::.
-
-`LONG_LONG_MIN'
-     `limits.h' (GNU):  *note Range of Type::.
-
-`LONG_MAX'
-     `limits.h' (ISO):  *note Range of Type::.
-
-`LONG_MIN'
-     `limits.h' (ISO):  *note Range of Type::.
-
-`long int lrand48 (void)'
-     `stdlib.h' (SVID):  *note SVID Random::.
-
-`int lrand48_r (struct drand48_data *BUFFER, long int *RESULT)'
-     `stdlib.h' (GNU):  *note SVID Random::.
-
-`long int lrint (double X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`long int lrintf (float X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`long int lrintl (long double X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`long int lround (double X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`long int lroundf (float X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`long int lroundl (long double X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`void * lsearch (const void *KEY, void *BASE, size_t *NMEMB, size_t SIZE, comparison_fn_t COMPAR)'
-     `search.h' (SVID):  *note Array Search Function::.
-
-`off_t lseek (int FILEDES, off_t OFFSET, int WHENCE)'
-     `unistd.h' (POSIX.1):  *note File Position Primitive::.
-
-`off64_t lseek64 (int FILEDES, off64_t OFFSET, int WHENCE)'
-     `unistd.h' (Unix98):  *note File Position Primitive::.
-
-`L_SET'
-     `sys/file.h' (BSD):  *note File Positioning::.
-
-`int lstat (const char *FILENAME, struct stat *BUF)'
-     `sys/stat.h' (BSD):  *note Reading Attributes::.
-
-`int lstat64 (const char *FILENAME, struct stat64 *BUF)'
-     `sys/stat.h' (Unix98):  *note Reading Attributes::.
-
-`int L_tmpnam'
-     `stdio.h' (ISO):  *note Temporary Files::.
-
-`int lutimes (const char *FILENAME, const struct timeval TVP[2])'
-     `sys/time.h' (BSD):  *note File Times::.
-
-`L_XTND'
-     `sys/file.h' (BSD):  *note File Positioning::.
-
-`int madvise (void *ADDR, size_t LENGTH, int ADVICE)'
-     `sys/mman.h' (POSIX):  *note Memory-mapped I/O::.
-
-`void makecontext (ucontext_t *UCP, void (*FUNC) (void), int ARGC, ...)'
-     `ucontext.h' (SVID):  *note System V contexts::.
-
-`struct mallinfo mallinfo (void)'
-     `malloc.h' (SVID):  *note Statistics of Malloc::.
-
-`void * malloc (size_t SIZE)'
-     `malloc.h', `stdlib.h' (ISO):  *note Basic Allocation::.
-
-`__malloc_hook'
-     `malloc.h' (GNU):  *note Hooks for Malloc::.
-
-`__malloc_initialize_hook'
-     `malloc.h' (GNU):  *note Hooks for Malloc::.
-
-`int MAX_CANON'
-     `limits.h' (POSIX.1):  *note Limits for Files::.
-
-`int MAX_INPUT'
-     `limits.h' (POSIX.1):  *note Limits for Files::.
-
-`int MAXNAMLEN'
-     `dirent.h' (BSD):  *note Limits for Files::.
-
-`int MAXSYMLINKS'
-     `sys/param.h' (BSD):  *note Symbolic Links::.
-
-`int MB_CUR_MAX'
-     `stdlib.h' (ISO):  *note Selecting the Conversion::.
-
-`int mblen (const char *STRING, size_t SIZE)'
-     `stdlib.h' (ISO):  *note Non-reentrant Character Conversion::.
-
-`int MB_LEN_MAX'
-     `limits.h' (ISO):  *note Selecting the Conversion::.
-
-`size_t mbrlen (const char *restrict S, size_t N, mbstate_t *PS)'
-     `wchar.h' (ISO):  *note Converting a Character::.
-
-`size_t mbrtowc (wchar_t *restrict PWC, const char *restrict S, size_t N, mbstate_t *restrict PS)'
-     `wchar.h' (ISO):  *note Converting a Character::.
-
-`int mbsinit (const mbstate_t *PS)'
-     `wchar.h' (ISO):  *note Keeping the state::.
-
-`size_t mbsnrtowcs (wchar_t *restrict DST, const char **restrict SRC, size_t NMC, size_t LEN, mbstate_t *restrict PS)'
-     `wchar.h' (GNU):  *note Converting Strings::.
-
-`size_t mbsrtowcs (wchar_t *restrict DST, const char **restrict SRC, size_t LEN, mbstate_t *restrict PS)'
-     `wchar.h' (ISO):  *note Converting Strings::.
-
-`mbstate_t'
-     `wchar.h' (ISO):  *note Keeping the state::.
-
-`size_t mbstowcs (wchar_t *WSTRING, const char *STRING, size_t SIZE)'
-     `stdlib.h' (ISO):  *note Non-reentrant String Conversion::.
-
-`int mbtowc (wchar_t *restrict RESULT, const char *restrict STRING, size_t SIZE)'
-     `stdlib.h' (ISO):  *note Non-reentrant Character Conversion::.
-
-`int mcheck (void (*ABORTFN) (enum mcheck_status STATUS))'
-     `mcheck.h' (GNU):  *note Heap Consistency Checking::.
-
-`tcflag_t MDMBUF'
-     `termios.h' (BSD):  *note Control Modes::.
-
-`void * memalign (size_t BOUNDARY, size_t SIZE)'
-     `malloc.h' (BSD):  *note Aligned Memory Blocks::.
-
-`__memalign_hook'
-     `malloc.h' (GNU):  *note Hooks for Malloc::.
-
-`void * memccpy (void *restrict TO, const void *restrict FROM, int C, size_t SIZE)'
-     `string.h' (SVID):  *note Copying and Concatenation::.
-
-`void * memchr (const void *BLOCK, int C, size_t SIZE)'
-     `string.h' (ISO):  *note Search Functions::.
-
-`int memcmp (const void *A1, const void *A2, size_t SIZE)'
-     `string.h' (ISO):  *note String/Array Comparison::.
-
-`void * memcpy (void *restrict TO, const void *restrict FROM, size_t SIZE)'
-     `string.h' (ISO):  *note Copying and Concatenation::.
-
-`void * memfrob (void *MEM, size_t LENGTH)'
-     `string.h' (GNU):  *note Trivial Encryption::.
-
-`void * memmem (const void *HAYSTACK, size_t HAYSTACK-LEN,
-     const void *NEEDLE, size_t NEEDLE-LEN)'
-     `string.h' (GNU):  *note Search Functions::.
-
-`void * memmove (void *TO, const void *FROM, size_t SIZE)'
-     `string.h' (ISO):  *note Copying and Concatenation::.
-
-`void * mempcpy (void *restrict TO, const void *restrict FROM, size_t SIZE)'
-     `string.h' (GNU):  *note Copying and Concatenation::.
-
-`void * memrchr (const void *BLOCK, int C, size_t SIZE)'
-     `string.h' (GNU):  *note Search Functions::.
-
-`void * memset (void *BLOCK, int C, size_t SIZE)'
-     `string.h' (ISO):  *note Copying and Concatenation::.
-
-`int mkdir (const char *FILENAME, mode_t MODE)'
-     `sys/stat.h' (POSIX.1):  *note Creating Directories::.
-
-`char * mkdtemp (char *TEMPLATE)'
-     `stdlib.h' (BSD):  *note Temporary Files::.
-
-`int mkfifo (const char *FILENAME, mode_t MODE)'
-     `sys/stat.h' (POSIX.1):  *note FIFO Special Files::.
-
-`int mknod (const char *FILENAME, mode_t MODE, dev_t DEV)'
-     `sys/stat.h' (BSD):  *note Making Special Files::.
-
-`int mkstemp (char *TEMPLATE)'
-     `stdlib.h' (BSD):  *note Temporary Files::.
-
-`char * mktemp (char *TEMPLATE)'
-     `stdlib.h' (Unix):  *note Temporary Files::.
-
-`time_t mktime (struct tm *BROKENTIME)'
-     `time.h' (ISO):  *note Broken-down Time::.
-
-`int mlock (const void *ADDR, size_t LEN)'
-     `sys/mman.h' (POSIX.1b):  *note Page Lock Functions::.
-
-`int mlockall (int FLAGS)'
-     `sys/mman.h' (POSIX.1b):  *note Page Lock Functions::.
-
-`void * mmap (void *ADDRESS, size_t LENGTH, int PROTECT, int FLAGS, int FILEDES, off_t OFFSET)'
-     `sys/mman.h' (POSIX):  *note Memory-mapped I/O::.
-
-`void * mmap64 (void *ADDRESS, size_t LENGTH, int PROTECT, int FLAGS, int FILEDES, off64_t OFFSET)'
-     `sys/mman.h' (LFS):  *note Memory-mapped I/O::.
-
-`mode_t'
-     `sys/types.h' (POSIX.1):  *note Attribute Meanings::.
-
-`double modf (double VALUE, double *INTEGER-PART)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`float modff (float VALUE, float *INTEGER-PART)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`long double modfl (long double VALUE, long double *INTEGER-PART)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`int mount (const char *SPECIAL_FILE, const char *DIR, const char *FSTYPE, unsigned long int OPTIONS, const void *DATA)'
-     `sys/mount.h' (SVID, BSD):  *note Mount-Unmount-Remount::.
-
-`long int mrand48 (void)'
-     `stdlib.h' (SVID):  *note SVID Random::.
-
-`int mrand48_r (struct drand48_data *BUFFER, long int *RESULT)'
-     `stdlib.h' (GNU):  *note SVID Random::.
-
-`void * mremap (void *ADDRESS, size_t LENGTH, size_t NEW_LENGTH, int FLAG)'
-     `sys/mman.h' (GNU):  *note Memory-mapped I/O::.
-
-`int MSG_DONTROUTE'
-     `sys/socket.h' (BSD):  *note Socket Data Options::.
-
-`int MSG_OOB'
-     `sys/socket.h' (BSD):  *note Socket Data Options::.
-
-`int MSG_PEEK'
-     `sys/socket.h' (BSD):  *note Socket Data Options::.
-
-`int msync (void *ADDRESS, size_t LENGTH, int FLAGS)'
-     `sys/mman.h' (POSIX):  *note Memory-mapped I/O::.
-
-`void mtrace (void)'
-     `mcheck.h' (GNU):  *note Tracing malloc::.
-
-`int munlock (const void *ADDR, size_t LEN)'
-     `sys/mman.h' (POSIX.1b):  *note Page Lock Functions::.
-
-`int munlockall (void)'
-     `sys/mman.h' (POSIX.1b):  *note Page Lock Functions::.
-
-`int munmap (void *ADDR, size_t LENGTH)'
-     `sys/mman.h' (POSIX):  *note Memory-mapped I/O::.
-
-`void muntrace (void)'
-     `mcheck.h' (GNU):  *note Tracing malloc::.
-
-`int NAME_MAX'
-     `limits.h' (POSIX.1):  *note Limits for Files::.
-
-`float NAN'
-     `math.h' (GNU):  *note Infinity and NaN::.
-
-`double nan (const char *TAGP)'
-     `math.h' (ISO):  *note FP Bit Twiddling::.
-
-`float nanf (const char *TAGP)'
-     `math.h' (ISO):  *note FP Bit Twiddling::.
-
-`long double nanl (const char *TAGP)'
-     `math.h' (ISO):  *note FP Bit Twiddling::.
-
-`int nanosleep (const struct timespec *REQUESTED_TIME, struct timespec *REMAINING)'
-     `time.h' (POSIX.1):  *note Sleeping::.
-
-`int NCCS'
-     `termios.h' (POSIX.1):  *note Mode Data Types::.
-
-`double nearbyint (double X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`float nearbyintf (float X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`long double nearbyintl (long double X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`NEW_TIME'
-     `utmp.h' (SVID):  *note Manipulating the Database::.
-
-`NEW_TIME'
-     `utmpx.h' (XPG4.2):  *note XPG Functions::.
-
-`double nextafter (double X, double Y)'
-     `math.h' (ISO):  *note FP Bit Twiddling::.
-
-`float nextafterf (float X, float Y)'
-     `math.h' (ISO):  *note FP Bit Twiddling::.
-
-`long double nextafterl (long double X, long double Y)'
-     `math.h' (ISO):  *note FP Bit Twiddling::.
-
-`double nexttoward (double X, long double Y)'
-     `math.h' (ISO):  *note FP Bit Twiddling::.
-
-`float nexttowardf (float X, long double Y)'
-     `math.h' (ISO):  *note FP Bit Twiddling::.
-
-`long double nexttowardl (long double X, long double Y)'
-     `math.h' (ISO):  *note FP Bit Twiddling::.
-
-`int nftw (const char *FILENAME, __nftw_func_t FUNC, int DESCRIPTORS, int FLAG)'
-     `ftw.h' (XPG4.2):  *note Working with Directory Trees::.
-
-`int nftw64 (const char *FILENAME, __nftw64_func_t FUNC, int DESCRIPTORS, int FLAG)'
-     `ftw.h' (Unix98):  *note Working with Directory Trees::.
-
-`__nftw64_func_t'
-     `ftw.h' (GNU):  *note Working with Directory Trees::.
-
-`__nftw_func_t'
-     `ftw.h' (GNU):  *note Working with Directory Trees::.
-
-`char * ngettext (const char *MSGID1, const char *MSGID2, unsigned long int N)'
-     `libintl.h' (GNU):  *note Advanced gettext functions::.
-
-`int NGROUPS_MAX'
-     `limits.h' (POSIX.1):  *note General Limits::.
-
-`int nice (int INCREMENT)'
-     `unistd.h' (BSD):  *note Traditional Scheduling Functions::.
-
-`nlink_t'
-     `sys/types.h' (POSIX.1):  *note Attribute Meanings::.
-
-`char * nl_langinfo (nl_item ITEM)'
-     `langinfo.h' (XOPEN):  *note The Elegant and Fast Way::.
-
-`NO_ADDRESS'
-     `netdb.h' (BSD):  *note Host Names::.
-
-`tcflag_t NOFLSH'
-     `termios.h' (POSIX.1):  *note Local Modes::.
-
-`tcflag_t NOKERNINFO'
-     `termios.h', `(optional)' (BSD):  *note Local Modes::.
-
-`NO_RECOVERY'
-     `netdb.h' (BSD):  *note Host Names::.
-
-`long int nrand48 (unsigned short int XSUBI[3])'
-     `stdlib.h' (SVID):  *note SVID Random::.
-
-`int nrand48_r (unsigned short int XSUBI[3], struct drand48_data *BUFFER, long int *RESULT)'
-     `stdlib.h' (GNU):  *note SVID Random::.
-
-`int NSIG'
-     `signal.h' (BSD):  *note Standard Signals::.
-
-`uint32_t ntohl (uint32_t NETLONG)'
-     `netinet/in.h' (BSD):  *note Byte Order::.
-
-`uint16_t ntohs (uint16_t NETSHORT)'
-     `netinet/in.h' (BSD):  *note Byte Order::.
-
-`int ntp_adjtime (struct timex *TPTR)'
-     `sys/timex.h' (GNU):  *note High Accuracy Clock::.
-
-`int ntp_gettime (struct ntptimeval *TPTR)'
-     `sys/timex.h' (GNU):  *note High Accuracy Clock::.
-
-`void * NULL'
-     `stddef.h' (ISO):  *note Null Pointer Constant::.
-
-`int O_ACCMODE'
-     `fcntl.h' (POSIX.1):  *note Access Modes::.
-
-`int O_APPEND'
-     `fcntl.h' (POSIX.1):  *note Operating Modes::.
-
-`int O_ASYNC'
-     `fcntl.h' (BSD):  *note Operating Modes::.
-
-`void obstack_1grow (struct obstack *OBSTACK-PTR, char C)'
-     `obstack.h' (GNU):  *note Growing Objects::.
-
-`void obstack_1grow_fast (struct obstack *OBSTACK-PTR, char C)'
-     `obstack.h' (GNU):  *note Extra Fast Growing::.
-
-`int obstack_alignment_mask (struct obstack *OBSTACK-PTR)'
-     `obstack.h' (GNU):  *note Obstacks Data Alignment::.
-
-`void * obstack_alloc (struct obstack *OBSTACK-PTR, int SIZE)'
-     `obstack.h' (GNU):  *note Allocation in an Obstack::.
-
-`obstack_alloc_failed_handler'
-     `obstack.h' (GNU):  *note Preparing for Obstacks::.
-
-`void * obstack_base (struct obstack *OBSTACK-PTR)'
-     `obstack.h' (GNU):  *note Status of an Obstack::.
-
-`void obstack_blank (struct obstack *OBSTACK-PTR, int SIZE)'
-     `obstack.h' (GNU):  *note Growing Objects::.
-
-`void obstack_blank_fast (struct obstack *OBSTACK-PTR, int SIZE)'
-     `obstack.h' (GNU):  *note Extra Fast Growing::.
-
-`int obstack_chunk_size (struct obstack *OBSTACK-PTR)'
-     `obstack.h' (GNU):  *note Obstack Chunks::.
-
-`void * obstack_copy (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)'
-     `obstack.h' (GNU):  *note Allocation in an Obstack::.
-
-`void * obstack_copy0 (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)'
-     `obstack.h' (GNU):  *note Allocation in an Obstack::.
-
-`void * obstack_finish (struct obstack *OBSTACK-PTR)'
-     `obstack.h' (GNU):  *note Growing Objects::.
-
-`void obstack_free (struct obstack *OBSTACK-PTR, void *OBJECT)'
-     `obstack.h' (GNU):  *note Freeing Obstack Objects::.
-
-`void obstack_grow (struct obstack *OBSTACK-PTR, void *DATA, int SIZE)'
-     `obstack.h' (GNU):  *note Growing Objects::.
-
-`void obstack_grow0 (struct obstack *OBSTACK-PTR, void *DATA, int SIZE)'
-     `obstack.h' (GNU):  *note Growing Objects::.
-
-`int obstack_init (struct obstack *OBSTACK-PTR)'
-     `obstack.h' (GNU):  *note Preparing for Obstacks::.
-
-`void obstack_int_grow (struct obstack *OBSTACK-PTR, int DATA)'
-     `obstack.h' (GNU):  *note Growing Objects::.
-
-`void obstack_int_grow_fast (struct obstack *OBSTACK-PTR, int DATA)'
-     `obstack.h' (GNU):  *note Extra Fast Growing::.
-
-`void * obstack_next_free (struct obstack *OBSTACK-PTR)'
-     `obstack.h' (GNU):  *note Status of an Obstack::.
-
-`int obstack_object_size (struct obstack *OBSTACK-PTR)'
-     `obstack.h' (GNU):  *note Growing Objects::.
-
-`int obstack_object_size (struct obstack *OBSTACK-PTR)'
-     `obstack.h' (GNU):  *note Status of an Obstack::.
-
-`int obstack_printf (struct obstack *OBSTACK, const char *TEMPLATE, ...)'
-     `stdio.h' (GNU):  *note Dynamic Output::.
-
-`void obstack_ptr_grow (struct obstack *OBSTACK-PTR, void *DATA)'
-     `obstack.h' (GNU):  *note Growing Objects::.
-
-`void obstack_ptr_grow_fast (struct obstack *OBSTACK-PTR, void *DATA)'
-     `obstack.h' (GNU):  *note Extra Fast Growing::.
-
-`int obstack_room (struct obstack *OBSTACK-PTR)'
-     `obstack.h' (GNU):  *note Extra Fast Growing::.
-
-`int obstack_vprintf (struct obstack *OBSTACK, const char *TEMPLATE, va_list AP)'
-     `stdio.h' (GNU):  *note Variable Arguments Output::.
-
-`int O_CREAT'
-     `fcntl.h' (POSIX.1):  *note Open-time Flags::.
-
-`int O_EXCL'
-     `fcntl.h' (POSIX.1):  *note Open-time Flags::.
-
-`int O_EXEC'
-     `fcntl.h', `(optional)' (GNU):  *note Access Modes::.
-
-`int O_EXLOCK'
-     `fcntl.h', `(optional)' (BSD):  *note Open-time Flags::.
-
-`off64_t'
-     `sys/types.h' (Unix98):  *note File Position Primitive::.
-
-`size_t offsetof (TYPE, MEMBER)'
-     `stddef.h' (ISO):  *note Structure Measurement::.
-
-`off_t'
-     `sys/types.h' (POSIX.1):  *note File Position Primitive::.
-
-`int O_FSYNC'
-     `fcntl.h' (BSD):  *note Operating Modes::.
-
-`int O_IGNORE_CTTY'
-     `fcntl.h', `(optional)' (GNU):  *note Open-time Flags::.
-
-`OLD_TIME'
-     `utmp.h' (SVID):  *note Manipulating the Database::.
-
-`OLD_TIME'
-     `utmpx.h' (XPG4.2):  *note XPG Functions::.
-
-`int O_NDELAY'
-     `fcntl.h' (BSD):  *note Operating Modes::.
-
-`int on_exit (void (*FUNCTION)(int STATUS, void *ARG), void *ARG)'
-     `stdlib.h' (SunOS):  *note Cleanups on Exit::.
-
-`tcflag_t ONLCR'
-     `termios.h' (POSIX.1):  *note Output Modes::.
-
-`int O_NOATIME'
-     `fcntl.h' (GNU):  *note Operating Modes::.
-
-`int O_NOCTTY'
-     `fcntl.h' (POSIX.1):  *note Open-time Flags::.
-
-`tcflag_t ONOEOT'
-     `termios.h', `(optional)' (BSD):  *note Output Modes::.
-
-`int O_NOLINK'
-     `fcntl.h', `(optional)' (GNU):  *note Open-time Flags::.
-
-`int O_NONBLOCK'
-     `fcntl.h' (POSIX.1):  *note Open-time Flags::.
-
-`int O_NONBLOCK'
-     `fcntl.h' (POSIX.1):  *note Operating Modes::.
-
-`int O_NOTRANS'
-     `fcntl.h', `(optional)' (GNU):  *note Open-time Flags::.
-
-`int open (const char *FILENAME, int FLAGS[, mode_t MODE])'
-     `fcntl.h' (POSIX.1):  *note Opening and Closing Files::.
-
-`int open64 (const char *FILENAME, int FLAGS[, mode_t MODE])'
-     `fcntl.h' (Unix98):  *note Opening and Closing Files::.
-
-`DIR * opendir (const char *DIRNAME)'
-     `dirent.h' (POSIX.1):  *note Opening a Directory::.
-
-`void openlog (const char *IDENT, int OPTION, int FACILITY)'
-     `syslog.h' (BSD):  *note openlog::.
-
-`int OPEN_MAX'
-     `limits.h' (POSIX.1):  *note General Limits::.
-
-`FILE * open_memstream (char **PTR, size_t *SIZELOC)'
-     `stdio.h' (GNU):  *note String Streams::.
-
-`int openpty (int *AMASTER, int *ASLAVE, char *NAME, const struct termios *TERMP, const struct winsize *WINP)'
-     `pty.h' (BSD):  *note Pseudo-Terminal Pairs::.
-
-`tcflag_t OPOST'
-     `termios.h' (POSIX.1):  *note Output Modes::.
-
-`char * optarg'
-     `unistd.h' (POSIX.2):  *note Using Getopt::.
-
-`int opterr'
-     `unistd.h' (POSIX.2):  *note Using Getopt::.
-
-`int optind'
-     `unistd.h' (POSIX.2):  *note Using Getopt::.
-
-`OPTION_ALIAS'
-     `argp.h' (GNU):  *note Argp Option Flags::.
-
-`OPTION_ARG_OPTIONAL'
-     `argp.h' (GNU):  *note Argp Option Flags::.
-
-`OPTION_DOC'
-     `argp.h' (GNU):  *note Argp Option Flags::.
-
-`OPTION_HIDDEN'
-     `argp.h' (GNU):  *note Argp Option Flags::.
-
-`OPTION_NO_USAGE'
-     `argp.h' (GNU):  *note Argp Option Flags::.
-
-`int optopt'
-     `unistd.h' (POSIX.2):  *note Using Getopt::.
-
-`int O_RDONLY'
-     `fcntl.h' (POSIX.1):  *note Access Modes::.
-
-`int O_RDWR'
-     `fcntl.h' (POSIX.1):  *note Access Modes::.
-
-`int O_READ'
-     `fcntl.h', `(optional)' (GNU):  *note Access Modes::.
-
-`int O_SHLOCK'
-     `fcntl.h', `(optional)' (BSD):  *note Open-time Flags::.
-
-`int O_SYNC'
-     `fcntl.h' (BSD):  *note Operating Modes::.
-
-`int O_TRUNC'
-     `fcntl.h' (POSIX.1):  *note Open-time Flags::.
-
-`int O_WRITE'
-     `fcntl.h', `(optional)' (GNU):  *note Access Modes::.
-
-`int O_WRONLY'
-     `fcntl.h' (POSIX.1):  *note Access Modes::.
-
-`tcflag_t OXTABS'
-     `termios.h', `(optional)' (BSD):  *note Output Modes::.
-
-`PA_CHAR'
-     `printf.h' (GNU):  *note Parsing a Template String::.
-
-`PA_DOUBLE'
-     `printf.h' (GNU):  *note Parsing a Template String::.
-
-`PA_FLAG_LONG'
-     `printf.h' (GNU):  *note Parsing a Template String::.
-
-`PA_FLAG_LONG_DOUBLE'
-     `printf.h' (GNU):  *note Parsing a Template String::.
-
-`PA_FLAG_LONG_LONG'
-     `printf.h' (GNU):  *note Parsing a Template String::.
-
-`int PA_FLAG_MASK'
-     `printf.h' (GNU):  *note Parsing a Template String::.
-
-`PA_FLAG_PTR'
-     `printf.h' (GNU):  *note Parsing a Template String::.
-
-`PA_FLAG_SHORT'
-     `printf.h' (GNU):  *note Parsing a Template String::.
-
-`PA_FLOAT'
-     `printf.h' (GNU):  *note Parsing a Template String::.
-
-`PA_INT'
-     `printf.h' (GNU):  *note Parsing a Template String::.
-
-`PA_LAST'
-     `printf.h' (GNU):  *note Parsing a Template String::.
-
-`PA_POINTER'
-     `printf.h' (GNU):  *note Parsing a Template String::.
-
-`tcflag_t PARENB'
-     `termios.h' (POSIX.1):  *note Control Modes::.
-
-`tcflag_t PARMRK'
-     `termios.h' (POSIX.1):  *note Input Modes::.
-
-`tcflag_t PARODD'
-     `termios.h' (POSIX.1):  *note Control Modes::.
-
-`size_t parse_printf_format (const char *TEMPLATE, size_t N, int *ARGTYPES)'
-     `printf.h' (GNU):  *note Parsing a Template String::.
-
-`PA_STRING'
-     `printf.h' (GNU):  *note Parsing a Template String::.
-
-`long int pathconf (const char *FILENAME, int PARAMETER)'
-     `unistd.h' (POSIX.1):  *note Pathconf::.
-
-`int PATH_MAX'
-     `limits.h' (POSIX.1):  *note Limits for Files::.
-
-`int pause (void)'
-     `unistd.h' (POSIX.1):  *note Using Pause::.
-
-`_PC_ASYNC_IO'
-     `unistd.h' (POSIX.1):  *note Pathconf::.
-
-`_PC_CHOWN_RESTRICTED'
-     `unistd.h' (POSIX.1):  *note Pathconf::.
-
-`_PC_FILESIZEBITS'
-     `unistd.h' (LFS):  *note Pathconf::.
-
-`_PC_LINK_MAX'
-     `unistd.h' (POSIX.1):  *note Pathconf::.
-
-`int pclose (FILE *STREAM)'
-     `stdio.h' (POSIX.2, SVID, BSD):  *note Pipe to a Subprocess::.
-
-`_PC_MAX_CANON'
-     `unistd.h' (POSIX.1):  *note Pathconf::.
-
-`_PC_MAX_INPUT'
-     `unistd.h' (POSIX.1):  *note Pathconf::.
-
-`_PC_NAME_MAX'
-     `unistd.h' (POSIX.1):  *note Pathconf::.
-
-`_PC_NO_TRUNC'
-     `unistd.h' (POSIX.1):  *note Pathconf::.
-
-`_PC_PATH_MAX'
-     `unistd.h' (POSIX.1):  *note Pathconf::.
-
-`_PC_PIPE_BUF'
-     `unistd.h' (POSIX.1):  *note Pathconf::.
-
-`_PC_PRIO_IO'
-     `unistd.h' (POSIX.1):  *note Pathconf::.
-
-`_PC_REC_INCR_XFER_SIZE'
-     `unistd.h' (POSIX.1):  *note Pathconf::.
-
-`_PC_REC_MAX_XFER_SIZE'
-     `unistd.h' (POSIX.1):  *note Pathconf::.
-
-`_PC_REC_MIN_XFER_SIZE'
-     `unistd.h' (POSIX.1):  *note Pathconf::.
-
-`_PC_REC_XFER_ALIGN'
-     `unistd.h' (POSIX.1):  *note Pathconf::.
-
-`_PC_SYNC_IO'
-     `unistd.h' (POSIX.1):  *note Pathconf::.
-
-`_PC_VDISABLE'
-     `unistd.h' (POSIX.1):  *note Pathconf::.
-
-`tcflag_t PENDIN'
-     `termios.h' (BSD):  *note Local Modes::.
-
-`void perror (const char *MESSAGE)'
-     `stdio.h' (ISO):  *note Error Messages::.
-
-`int PF_FILE'
-     `sys/socket.h' (GNU):  *note Local Namespace Details::.
-
-`int PF_INET'
-     `sys/socket.h' (BSD):  *note Internet Namespace::.
-
-`int PF_INET6'
-     `sys/socket.h' (X/Open):  *note Internet Namespace::.
-
-`int PF_LOCAL'
-     `sys/socket.h' (POSIX):  *note Local Namespace Details::.
-
-`int PF_UNIX'
-     `sys/socket.h' (BSD):  *note Local Namespace Details::.
-
-`pid_t'
-     `sys/types.h' (POSIX.1):  *note Process Identification::.
-
-`int pipe (int FILEDES[2])'
-     `unistd.h' (POSIX.1):  *note Creating a Pipe::.
-
-`int PIPE_BUF'
-     `limits.h' (POSIX.1):  *note Limits for Files::.
-
-`FILE * popen (const char *COMMAND, const char *MODE)'
-     `stdio.h' (POSIX.2, SVID, BSD):  *note Pipe to a Subprocess::.
-
-`_POSIX2_BC_BASE_MAX'
-     `limits.h' (POSIX.2):  *note Utility Minimums::.
-
-`_POSIX2_BC_DIM_MAX'
-     `limits.h' (POSIX.2):  *note Utility Minimums::.
-
-`_POSIX2_BC_SCALE_MAX'
-     `limits.h' (POSIX.2):  *note Utility Minimums::.
-
-`_POSIX2_BC_STRING_MAX'
-     `limits.h' (POSIX.2):  *note Utility Minimums::.
-
-`int _POSIX2_C_DEV'
-     `unistd.h' (POSIX.2):  *note System Options::.
-
-`_POSIX2_COLL_WEIGHTS_MAX'
-     `limits.h' (POSIX.2):  *note Utility Minimums::.
-
-`long int _POSIX2_C_VERSION'
-     `unistd.h' (POSIX.2):  *note Version Supported::.
-
-`_POSIX2_EQUIV_CLASS_MAX'
-     `limits.h' (POSIX.2):  *note Utility Minimums::.
-
-`_POSIX2_EXPR_NEST_MAX'
-     `limits.h' (POSIX.2):  *note Utility Minimums::.
-
-`int _POSIX2_FORT_DEV'
-     `unistd.h' (POSIX.2):  *note System Options::.
-
-`int _POSIX2_FORT_RUN'
-     `unistd.h' (POSIX.2):  *note System Options::.
-
-`_POSIX2_LINE_MAX'
-     `limits.h' (POSIX.2):  *note Utility Minimums::.
-
-`int _POSIX2_LOCALEDEF'
-     `unistd.h' (POSIX.2):  *note System Options::.
-
-`_POSIX2_RE_DUP_MAX'
-     `limits.h' (POSIX.2):  *note Minimums::.
-
-`int _POSIX2_SW_DEV'
-     `unistd.h' (POSIX.2):  *note System Options::.
-
-`_POSIX_AIO_LISTIO_MAX'
-     `limits.h' (POSIX.1):  *note Minimums::.
-
-`_POSIX_AIO_MAX'
-     `limits.h' (POSIX.1):  *note Minimums::.
-
-`_POSIX_ARG_MAX'
-     `limits.h' (POSIX.1):  *note Minimums::.
-
-`_POSIX_CHILD_MAX'
-     `limits.h' (POSIX.1):  *note Minimums::.
-
-`int _POSIX_CHOWN_RESTRICTED'
-     `unistd.h' (POSIX.1):  *note Options for Files::.
-
-`_POSIX_C_SOURCE'
-     (POSIX.2):  *note Feature Test Macros::.
-
-`int _POSIX_JOB_CONTROL'
-     `unistd.h' (POSIX.1):  *note System Options::.
-
-`_POSIX_LINK_MAX'
-     `limits.h' (POSIX.1):  *note File Minimums::.
-
-`_POSIX_MAX_CANON'
-     `limits.h' (POSIX.1):  *note File Minimums::.
-
-`_POSIX_MAX_INPUT'
-     `limits.h' (POSIX.1):  *note File Minimums::.
-
-`int posix_memalign (void **MEMPTR, size_t ALIGNMENT, size_t SIZE)'
-     `stdlib.h' (POSIX):  *note Aligned Memory Blocks::.
-
-`_POSIX_NAME_MAX'
-     `limits.h' (POSIX.1):  *note File Minimums::.
-
-`_POSIX_NGROUPS_MAX'
-     `limits.h' (POSIX.1):  *note Minimums::.
-
-`int _POSIX_NO_TRUNC'
-     `unistd.h' (POSIX.1):  *note Options for Files::.
-
-`_POSIX_OPEN_MAX'
-     `limits.h' (POSIX.1):  *note Minimums::.
-
-`_POSIX_PATH_MAX'
-     `limits.h' (POSIX.1):  *note File Minimums::.
-
-`_POSIX_PIPE_BUF'
-     `limits.h' (POSIX.1):  *note File Minimums::.
-
-`POSIX_REC_INCR_XFER_SIZE'
-     `limits.h' (POSIX.1):  *note File Minimums::.
-
-`POSIX_REC_MAX_XFER_SIZE'
-     `limits.h' (POSIX.1):  *note File Minimums::.
-
-`POSIX_REC_MIN_XFER_SIZE'
-     `limits.h' (POSIX.1):  *note File Minimums::.
-
-`POSIX_REC_XFER_ALIGN'
-     `limits.h' (POSIX.1):  *note File Minimums::.
-
-`int _POSIX_SAVED_IDS'
-     `unistd.h' (POSIX.1):  *note System Options::.
-
-`_POSIX_SOURCE'
-     (POSIX.1):  *note Feature Test Macros::.
-
-`_POSIX_SSIZE_MAX'
-     `limits.h' (POSIX.1):  *note Minimums::.
-
-`_POSIX_STREAM_MAX'
-     `limits.h' (POSIX.1):  *note Minimums::.
-
-`_POSIX_TZNAME_MAX'
-     `limits.h' (POSIX.1):  *note Minimums::.
-
-`unsigned char _POSIX_VDISABLE'
-     `unistd.h' (POSIX.1):  *note Options for Files::.
-
-`long int _POSIX_VERSION'
-     `unistd.h' (POSIX.1):  *note Version Supported::.
-
-`double pow (double BASE, double POWER)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`double pow10 (double X)'
-     `math.h' (GNU):  *note Exponents and Logarithms::.
-
-`float pow10f (float X)'
-     `math.h' (GNU):  *note Exponents and Logarithms::.
-
-`long double pow10l (long double X)'
-     `math.h' (GNU):  *note Exponents and Logarithms::.
-
-`float powf (float BASE, float POWER)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`long double powl (long double BASE, long double POWER)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`ssize_t pread (int FILEDES, void *BUFFER, size_t SIZE, off_t OFFSET)'
-     `unistd.h' (Unix98):  *note I/O Primitives::.
-
-`ssize_t pread64 (int FILEDES, void *BUFFER, size_t SIZE, off64_t OFFSET)'
-     `unistd.h' (Unix98):  *note I/O Primitives::.
-
-`int printf (const char *TEMPLATE, ...)'
-     `stdio.h' (ISO):  *note Formatted Output Functions::.
-
-`printf_arginfo_function'
-     `printf.h' (GNU):  *note Defining the Output Handler::.
-
-`printf_function'
-     `printf.h' (GNU):  *note Defining the Output Handler::.
-
-`int printf_size (FILE *FP, const struct printf_info *INFO, const void *const *ARGS)'
-     `printf.h' (GNU):  *note Predefined Printf Handlers::.
-
-`int printf_size_info (const struct printf_info *INFO, size_t N, int *ARGTYPES)'
-     `printf.h' (GNU):  *note Predefined Printf Handlers::.
-
-`PRIO_MAX'
-     `sys/resource.h' (BSD):  *note Traditional Scheduling Functions::.
-
-`PRIO_MIN'
-     `sys/resource.h' (BSD):  *note Traditional Scheduling Functions::.
-
-`PRIO_PGRP'
-     `sys/resource.h' (BSD):  *note Traditional Scheduling Functions::.
-
-`PRIO_PROCESS'
-     `sys/resource.h' (BSD):  *note Traditional Scheduling Functions::.
-
-`PRIO_USER'
-     `sys/resource.h' (BSD):  *note Traditional Scheduling Functions::.
-
-`char * program_invocation_name'
-     `errno.h' (GNU):  *note Error Messages::.
-
-`char * program_invocation_short_name'
-     `errno.h' (GNU):  *note Error Messages::.
-
-`void psignal (int SIGNUM, const char *MESSAGE)'
-     `signal.h' (BSD):  *note Signal Messages::.
-
-`char * P_tmpdir'
-     `stdio.h' (SVID):  *note Temporary Files::.
-
-`ptrdiff_t'
-     `stddef.h' (ISO):  *note Important Data Types::.
-
-`char * ptsname (int FILEDES)'
-     `stdlib.h' (SVID, XPG4.2):  *note Allocation::.
-
-`int ptsname_r (int FILEDES, char *BUF, size_t LEN)'
-     `stdlib.h' (GNU):  *note Allocation::.
-
-`int putc (int C, FILE *STREAM)'
-     `stdio.h' (ISO):  *note Simple Output::.
-
-`int putchar (int C)'
-     `stdio.h' (ISO):  *note Simple Output::.
-
-`int putchar_unlocked (int C)'
-     `stdio.h' (POSIX):  *note Simple Output::.
-
-`int putc_unlocked (int C, FILE *STREAM)'
-     `stdio.h' (POSIX):  *note Simple Output::.
-
-`int putenv (char *STRING)'
-     `stdlib.h' (SVID):  *note Environment Access::.
-
-`int putpwent (const struct passwd *P, FILE *STREAM)'
-     `pwd.h' (SVID):  *note Writing a User Entry::.
-
-`int puts (const char *S)'
-     `stdio.h' (ISO):  *note Simple Output::.
-
-`struct utmp * pututline (const struct utmp *UTMP)'
-     `utmp.h' (SVID):  *note Manipulating the Database::.
-
-`struct utmpx * pututxline (const struct utmpx *UTMP)'
-     `utmpx.h' (XPG4.2):  *note XPG Functions::.
-
-`int putw (int W, FILE *STREAM)'
-     `stdio.h' (SVID):  *note Simple Output::.
-
-`wint_t putwc (wchar_t WC, FILE *STREAM)'
-     `wchar.h' (ISO):  *note Simple Output::.
-
-`wint_t putwchar (wchar_t WC)'
-     `wchar.h' (ISO):  *note Simple Output::.
-
-`wint_t putwchar_unlocked (wchar_t WC)'
-     `wchar.h' (GNU):  *note Simple Output::.
-
-`wint_t putwc_unlocked (wchar_t WC, FILE *STREAM)'
-     `wchar.h' (GNU):  *note Simple Output::.
-
-`ssize_t pwrite (int FILEDES, const void *BUFFER, size_t SIZE, off_t OFFSET)'
-     `unistd.h' (Unix98):  *note I/O Primitives::.
-
-`ssize_t pwrite64 (int FILEDES, const void *BUFFER, size_t SIZE, off64_t OFFSET)'
-     `unistd.h' (Unix98):  *note I/O Primitives::.
-
-`char * qecvt (long double VALUE, int NDIGIT, int *DECPT, int *NEG)'
-     `stdlib.h' (GNU):  *note System V Number Conversion::.
-
-`int qecvt_r (long double VALUE, int NDIGIT, int *DECPT, int *NEG, char *BUF, size_t LEN)'
-     `stdlib.h' (GNU):  *note System V Number Conversion::.
-
-`char * qfcvt (long double VALUE, int NDIGIT, int *DECPT, int *NEG)'
-     `stdlib.h' (GNU):  *note System V Number Conversion::.
-
-`int qfcvt_r (long double VALUE, int NDIGIT, int *DECPT, int *NEG, char *BUF, size_t LEN)'
-     `stdlib.h' (GNU):  *note System V Number Conversion::.
-
-`char * qgcvt (long double VALUE, int NDIGIT, char *BUF)'
-     `stdlib.h' (GNU):  *note System V Number Conversion::.
-
-`void qsort (void *ARRAY, size_t COUNT, size_t SIZE, comparison_fn_t COMPARE)'
-     `stdlib.h' (ISO):  *note Array Sort Function::.
-
-`int raise (int SIGNUM)'
-     `signal.h' (ISO):  *note Signaling Yourself::.
-
-`int rand (void)'
-     `stdlib.h' (ISO):  *note ISO Random::.
-
-`int RAND_MAX'
-     `stdlib.h' (ISO):  *note ISO Random::.
-
-`long int random (void)'
-     `stdlib.h' (BSD):  *note BSD Random::.
-
-`int random_r (struct random_data *restrict BUF, int32_t *restrict RESULT)'
-     `stdlib.h' (GNU):  *note BSD Random::.
-
-`int rand_r (unsigned int *SEED)'
-     `stdlib.h' (POSIX.1):  *note ISO Random::.
-
-`void * rawmemchr (const void *BLOCK, int C)'
-     `string.h' (GNU):  *note Search Functions::.
-
-`ssize_t read (int FILEDES, void *BUFFER, size_t SIZE)'
-     `unistd.h' (POSIX.1):  *note I/O Primitives::.
-
-`struct dirent * readdir (DIR *DIRSTREAM)'
-     `dirent.h' (POSIX.1):  *note Reading/Closing Directory::.
-
-`struct dirent64 * readdir64 (DIR *DIRSTREAM)'
-     `dirent.h' (LFS):  *note Reading/Closing Directory::.
-
-`int readdir64_r (DIR *DIRSTREAM, struct dirent64 *ENTRY, struct dirent64 **RESULT)'
-     `dirent.h' (LFS):  *note Reading/Closing Directory::.
-
-`int readdir_r (DIR *DIRSTREAM, struct dirent *ENTRY, struct dirent **RESULT)'
-     `dirent.h' (GNU):  *note Reading/Closing Directory::.
-
-`ssize_t readlink (const char *FILENAME, char *BUFFER, size_t SIZE)'
-     `unistd.h' (BSD):  *note Symbolic Links::.
-
-`ssize_t readv (int FILEDES, const struct iovec *VECTOR, int COUNT)'
-     `sys/uio.h' (BSD):  *note Scatter-Gather::.
-
-`void * realloc (void *PTR, size_t NEWSIZE)'
-     `malloc.h', `stdlib.h' (ISO):  *note Changing Block Size::.
-
-`__realloc_hook'
-     `malloc.h' (GNU):  *note Hooks for Malloc::.
-
-`char * realpath (const char *restrict NAME, char *restrict RESOLVED)'
-     `stdlib.h' (XPG):  *note Symbolic Links::.
-
-`ssize_t recv (int SOCKET, void *BUFFER, size_t SIZE, int FLAGS)'
-     `sys/socket.h' (BSD):  *note Receiving Data::.
-
-`ssize_t recvfrom (int SOCKET, void *BUFFER, size_t SIZE, int FLAGS, struct sockaddr *ADDR, socklen_t *LENGTH-PTR)'
-     `sys/socket.h' (BSD):  *note Receiving Datagrams::.
-
-`ssize_t recvmsg (int SOCKET, struct msghdr *MESSAGE, int FLAGS)'
-     `sys/socket.h' (BSD):  *note Receiving Datagrams::.
-
-`int RE_DUP_MAX'
-     `limits.h' (POSIX.2):  *note General Limits::.
-
-`_REENTRANT'
-     (GNU):  *note Feature Test Macros::.
-
-`REG_BADBR'
-     `regex.h' (POSIX.2):  *note POSIX Regexp Compilation::.
-
-`REG_BADPAT'
-     `regex.h' (POSIX.2):  *note POSIX Regexp Compilation::.
-
-`REG_BADRPT'
-     `regex.h' (POSIX.2):  *note POSIX Regexp Compilation::.
-
-`int regcomp (regex_t *restrict COMPILED, const char *restrict PATTERN, int CFLAGS)'
-     `regex.h' (POSIX.2):  *note POSIX Regexp Compilation::.
-
-`REG_EBRACE'
-     `regex.h' (POSIX.2):  *note POSIX Regexp Compilation::.
-
-`REG_EBRACK'
-     `regex.h' (POSIX.2):  *note POSIX Regexp Compilation::.
-
-`REG_ECOLLATE'
-     `regex.h' (POSIX.2):  *note POSIX Regexp Compilation::.
-
-`REG_ECTYPE'
-     `regex.h' (POSIX.2):  *note POSIX Regexp Compilation::.
-
-`REG_EESCAPE'
-     `regex.h' (POSIX.2):  *note POSIX Regexp Compilation::.
-
-`REG_EPAREN'
-     `regex.h' (POSIX.2):  *note POSIX Regexp Compilation::.
-
-`REG_ERANGE'
-     `regex.h' (POSIX.2):  *note POSIX Regexp Compilation::.
-
-`size_t regerror (int ERRCODE, const regex_t *restrict COMPILED, char *restrict BUFFER, size_t LENGTH)'
-     `regex.h' (POSIX.2):  *note Regexp Cleanup::.
-
-`REG_ESPACE'
-     `regex.h' (POSIX.2):  *note Matching POSIX Regexps::.
-
-`REG_ESPACE'
-     `regex.h' (POSIX.2):  *note POSIX Regexp Compilation::.
-
-`REG_ESUBREG'
-     `regex.h' (POSIX.2):  *note POSIX Regexp Compilation::.
-
-`int regexec (const regex_t *restrict COMPILED, const char *restrict STRING, size_t NMATCH, regmatch_t MATCHPTR[restrict], int EFLAGS)'
-     `regex.h' (POSIX.2):  *note Matching POSIX Regexps::.
-
-`regex_t'
-     `regex.h' (POSIX.2):  *note POSIX Regexp Compilation::.
-
-`REG_EXTENDED'
-     `regex.h' (POSIX.2):  *note Flags for POSIX Regexps::.
-
-`void regfree (regex_t *COMPILED)'
-     `regex.h' (POSIX.2):  *note Regexp Cleanup::.
-
-`REG_ICASE'
-     `regex.h' (POSIX.2):  *note Flags for POSIX Regexps::.
-
-`int register_printf_function (int SPEC, printf_function HANDLER-FUNCTION, printf_arginfo_function ARGINFO-FUNCTION)'
-     `printf.h' (GNU):  *note Registering New Conversions::.
-
-`regmatch_t'
-     `regex.h' (POSIX.2):  *note Regexp Subexpressions::.
-
-`REG_NEWLINE'
-     `regex.h' (POSIX.2):  *note Flags for POSIX Regexps::.
-
-`REG_NOMATCH'
-     `regex.h' (POSIX.2):  *note Matching POSIX Regexps::.
-
-`REG_NOSUB'
-     `regex.h' (POSIX.2):  *note Flags for POSIX Regexps::.
-
-`REG_NOTBOL'
-     `regex.h' (POSIX.2):  *note Matching POSIX Regexps::.
-
-`REG_NOTEOL'
-     `regex.h' (POSIX.2):  *note Matching POSIX Regexps::.
-
-`regoff_t'
-     `regex.h' (POSIX.2):  *note Regexp Subexpressions::.
-
-`double remainder (double NUMERATOR, double DENOMINATOR)'
-     `math.h' (BSD):  *note Remainder Functions::.
-
-`float remainderf (float NUMERATOR, float DENOMINATOR)'
-     `math.h' (BSD):  *note Remainder Functions::.
-
-`long double remainderl (long double NUMERATOR, long double DENOMINATOR)'
-     `math.h' (BSD):  *note Remainder Functions::.
-
-`int remove (const char *FILENAME)'
-     `stdio.h' (ISO):  *note Deleting Files::.
-
-`int rename (const char *OLDNAME, const char *NEWNAME)'
-     `stdio.h' (ISO):  *note Renaming Files::.
-
-`void rewind (FILE *STREAM)'
-     `stdio.h' (ISO):  *note File Positioning::.
-
-`void rewinddir (DIR *DIRSTREAM)'
-     `dirent.h' (POSIX.1):  *note Random Access Directory::.
-
-`char * rindex (const char *STRING, int C)'
-     `string.h' (BSD):  *note Search Functions::.
-
-`double rint (double X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`float rintf (float X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`long double rintl (long double X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`rlim_t RLIM_INFINITY'
-     `sys/resource.h' (BSD):  *note Limits on Resources::.
-
-`RLIMIT_AS'
-     `sys/resource.h' (Unix98):  *note Limits on Resources::.
-
-`RLIMIT_CORE'
-     `sys/resource.h' (BSD):  *note Limits on Resources::.
-
-`RLIMIT_CPU'
-     `sys/resource.h' (BSD):  *note Limits on Resources::.
-
-`RLIMIT_DATA'
-     `sys/resource.h' (BSD):  *note Limits on Resources::.
-
-`RLIMIT_FSIZE'
-     `sys/resource.h' (BSD):  *note Limits on Resources::.
-
-`RLIMIT_MEMLOCK'
-     `sys/resource.h' (BSD):  *note Limits on Resources::.
-
-`RLIMIT_NOFILE'
-     `sys/resource.h' (BSD):  *note Limits on Resources::.
-
-`RLIMIT_NPROC'
-     `sys/resource.h' (BSD):  *note Limits on Resources::.
-
-`RLIMIT_RSS'
-     `sys/resource.h' (BSD):  *note Limits on Resources::.
-
-`RLIMIT_STACK'
-     `sys/resource.h' (BSD):  *note Limits on Resources::.
-
-`RLIM_NLIMITS'
-     `sys/resource.h' (BSD):  *note Limits on Resources::.
-
-`int rmdir (const char *FILENAME)'
-     `unistd.h' (POSIX.1):  *note Deleting Files::.
-
-`int R_OK'
-     `unistd.h' (POSIX.1):  *note Testing File Access::.
-
-`double round (double X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`float roundf (float X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`long double roundl (long double X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`int rpmatch (const char *RESPONSE)'
-     `stdlib.h' (stdlib.h):  *note Yes-or-No Questions::.
-
-`RUN_LVL'
-     `utmp.h' (SVID):  *note Manipulating the Database::.
-
-`RUN_LVL'
-     `utmpx.h' (XPG4.2):  *note XPG Functions::.
-
-`RUSAGE_CHILDREN'
-     `sys/resource.h' (BSD):  *note Resource Usage::.
-
-`RUSAGE_SELF'
-     `sys/resource.h' (BSD):  *note Resource Usage::.
-
-`int SA_NOCLDSTOP'
-     `signal.h' (POSIX.1):  *note Flags for Sigaction::.
-
-`int SA_ONSTACK'
-     `signal.h' (BSD):  *note Flags for Sigaction::.
-
-`int SA_RESTART'
-     `signal.h' (BSD):  *note Flags for Sigaction::.
-
-`void *sbrk (ptrdiff_t DELTA)'
-     `unistd.h' (BSD):  *note Resizing the Data Segment::.
-
-`_SC_2_C_DEV'
-     `unistd.h' (POSIX.2):  *note Constants for Sysconf::.
-
-`_SC_2_FORT_DEV'
-     `unistd.h' (POSIX.2):  *note Constants for Sysconf::.
-
-`_SC_2_FORT_RUN'
-     `unistd.h' (POSIX.2):  *note Constants for Sysconf::.
-
-`_SC_2_LOCALEDEF'
-     `unistd.h' (POSIX.2):  *note Constants for Sysconf::.
-
-`_SC_2_SW_DEV'
-     `unistd.h' (POSIX.2):  *note Constants for Sysconf::.
-
-`_SC_2_VERSION'
-     `unistd.h' (POSIX.2):  *note Constants for Sysconf::.
-
-`_SC_AIO_LISTIO_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_AIO_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_AIO_PRIO_DELTA_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`double scalb (double VALUE, double EXPONENT)'
-     `math.h' (BSD):  *note Normalization Functions::.
-
-`float scalbf (float VALUE, float EXPONENT)'
-     `math.h' (BSD):  *note Normalization Functions::.
-
-`long double scalbl (long double VALUE, long double EXPONENT)'
-     `math.h' (BSD):  *note Normalization Functions::.
-
-`double scalbln (double X, long int N)'
-     `math.h' (BSD):  *note Normalization Functions::.
-
-`float scalblnf (float X, long int N)'
-     `math.h' (BSD):  *note Normalization Functions::.
-
-`long double scalblnl (long double X, long int N)'
-     `math.h' (BSD):  *note Normalization Functions::.
-
-`double scalbn (double X, int N)'
-     `math.h' (BSD):  *note Normalization Functions::.
-
-`float scalbnf (float X, int N)'
-     `math.h' (BSD):  *note Normalization Functions::.
-
-`long double scalbnl (long double X, int N)'
-     `math.h' (BSD):  *note Normalization Functions::.
-
-`int scandir (const char *DIR, struct dirent ***NAMELIST, int (*SELECTOR) (const struct dirent *), int (*CMP) (const struct dirent **, const struct dirent **))'
-     `dirent.h' (BSD/SVID):  *note Scanning Directory Content::.
-
-`int scandir64 (const char *DIR, struct dirent64 ***NAMELIST, int (*SELECTOR) (const struct dirent64 *), int (*CMP) (const struct dirent64 **, const struct dirent64 **))'
-     `dirent.h' (GNU):  *note Scanning Directory Content::.
-
-`int scanf (const char *TEMPLATE, ...)'
-     `stdio.h' (ISO):  *note Formatted Input Functions::.
-
-`_SC_ARG_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_ASYNCHRONOUS_IO'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_ATEXIT_MAX'
-     `unistd.h' (GNU):  *note Constants for Sysconf::.
-
-`_SC_AVPHYS_PAGES'
-     `unistd.h' (GNU):  *note Constants for Sysconf::.
-
-`_SC_BC_BASE_MAX'
-     `unistd.h' (POSIX.2):  *note Constants for Sysconf::.
-
-`_SC_BC_DIM_MAX'
-     `unistd.h' (POSIX.2):  *note Constants for Sysconf::.
-
-`_SC_BC_SCALE_MAX'
-     `unistd.h' (POSIX.2):  *note Constants for Sysconf::.
-
-`_SC_BC_STRING_MAX'
-     `unistd.h' (POSIX.2):  *note Constants for Sysconf::.
-
-`_SC_CHAR_BIT'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_CHARCLASS_NAME_MAX'
-     `unistd.h' (GNU):  *note Constants for Sysconf::.
-
-`_SC_CHAR_MAX'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_CHAR_MIN'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_CHILD_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_CLK_TCK'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_COLL_WEIGHTS_MAX'
-     `unistd.h' (POSIX.2):  *note Constants for Sysconf::.
-
-`_SC_DELAYTIMER_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_EQUIV_CLASS_MAX'
-     `unistd.h' (POSIX.2):  *note Constants for Sysconf::.
-
-`_SC_EXPR_NEST_MAX'
-     `unistd.h' (POSIX.2):  *note Constants for Sysconf::.
-
-`_SC_FSYNC'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_GETGR_R_SIZE_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_GETPW_R_SIZE_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`SCHAR_MAX'
-     `limits.h' (ISO):  *note Range of Type::.
-
-`SCHAR_MIN'
-     `limits.h' (ISO):  *note Range of Type::.
-
-`int sched_getaffinity (pid_t PID, size_t CPUSETSIZE, cpu_set_t *CPUSET)'
-     `sched.h' (GNU):  *note CPU Affinity::.
-
-`int sched_getparam (pid_t PID, struct sched_param *PARAM)'
-     `sched.h' (POSIX):  *note Basic Scheduling Functions::.
-
-`int sched_get_priority_max (int POLICY)'
-     `sched.h' (POSIX):  *note Basic Scheduling Functions::.
-
-`int sched_get_priority_min (int POLICY)'
-     `sched.h' (POSIX):  *note Basic Scheduling Functions::.
-
-`int sched_getscheduler (pid_t PID)'
-     `sched.h' (POSIX):  *note Basic Scheduling Functions::.
-
-`int sched_rr_get_interval (pid_t PID, struct timespec *INTERVAL)'
-     `sched.h' (POSIX):  *note Basic Scheduling Functions::.
-
-`int sched_setaffinity (pid_t PID, size_t CPUSETSIZE, const cpu_set_t *CPUSET)'
-     `sched.h' (GNU):  *note CPU Affinity::.
-
-`int sched_setparam (pid_t PID, const struct sched_param *PARAM)'
-     `sched.h' (POSIX):  *note Basic Scheduling Functions::.
-
-`int sched_setscheduler (pid_t PID, int POLICY, const struct sched_param *PARAM)'
-     `sched.h' (POSIX):  *note Basic Scheduling Functions::.
-
-`int sched_yield (void)'
-     `sched.h' (POSIX):  *note Basic Scheduling Functions::.
-
-`_SC_INT_MAX'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_INT_MIN'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_JOB_CONTROL'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_LINE_MAX'
-     `unistd.h' (POSIX.2):  *note Constants for Sysconf::.
-
-`_SC_LOGIN_NAME_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_LONG_BIT'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_MAPPED_FILES'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_MB_LEN_MAX'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_MEMLOCK'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_MEMLOCK_RANGE'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_MEMORY_PROTECTION'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_MESSAGE_PASSING'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_MQ_OPEN_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_MQ_PRIO_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_NGROUPS_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_NL_ARGMAX'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_NL_LANGMAX'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_NL_MSGMAX'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_NL_NMAX'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_NL_SETMAX'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_NL_TEXTMAX'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_NPROCESSORS_CONF'
-     `unistd.h' (GNU):  *note Constants for Sysconf::.
-
-`_SC_NPROCESSORS_ONLN'
-     `unistd.h' (GNU):  *note Constants for Sysconf::.
-
-`_SC_NZERO'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_OPEN_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_PAGESIZE'
-     `unistd.h' (GNU):  *note Constants for Sysconf::.
-
-`_SC_PHYS_PAGES'
-     `unistd.h' (GNU):  *note Constants for Sysconf::.
-
-`_SC_PII'
-     `unistd.h' (POSIX.1g):  *note Constants for Sysconf::.
-
-`_SC_PII_INTERNET'
-     `unistd.h' (POSIX.1g):  *note Constants for Sysconf::.
-
-`_SC_PII_INTERNET_DGRAM'
-     `unistd.h' (POSIX.1g):  *note Constants for Sysconf::.
-
-`_SC_PII_INTERNET_STREAM'
-     `unistd.h' (POSIX.1g):  *note Constants for Sysconf::.
-
-`_SC_PII_OSI'
-     `unistd.h' (POSIX.1g):  *note Constants for Sysconf::.
-
-`_SC_PII_OSI_CLTS'
-     `unistd.h' (POSIX.1g):  *note Constants for Sysconf::.
-
-`_SC_PII_OSI_COTS'
-     `unistd.h' (POSIX.1g):  *note Constants for Sysconf::.
-
-`_SC_PII_OSI_M'
-     `unistd.h' (POSIX.1g):  *note Constants for Sysconf::.
-
-`_SC_PII_SOCKET'
-     `unistd.h' (POSIX.1g):  *note Constants for Sysconf::.
-
-`_SC_PII_XTI'
-     `unistd.h' (POSIX.1g):  *note Constants for Sysconf::.
-
-`_SC_PRIORITIZED_IO'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_PRIORITY_SCHEDULING'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_REALTIME_SIGNALS'
-     `unistdh.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_RTSIG_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_SAVED_IDS'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_SCHAR_MAX'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_SCHAR_MIN'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_SELECT'
-     `unistd.h' (POSIX.1g):  *note Constants for Sysconf::.
-
-`_SC_SEMAPHORES'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_SEM_NSEMS_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_SEM_VALUE_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_SHARED_MEMORY_OBJECTS'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_SHRT_MAX'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_SHRT_MIN'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_SIGQUEUE_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`SC_SSIZE_MAX'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_STREAM_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_SYNCHRONIZED_IO'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_THREAD_ATTR_STACKADDR'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_THREAD_ATTR_STACKSIZE'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_THREAD_DESTRUCTOR_ITERATIONS'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_THREAD_KEYS_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_THREAD_PRIO_INHERIT'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_THREAD_PRIO_PROTECT'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_THREAD_PRIORITY_SCHEDULING'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_THREAD_PROCESS_SHARED'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_THREADS'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_THREAD_SAFE_FUNCTIONS'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_THREAD_STACK_MIN'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_THREAD_THREADS_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_TIMER_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_TIMERS'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_T_IOV_MAX'
-     `unistd.h' (POSIX.1g):  *note Constants for Sysconf::.
-
-`_SC_TTY_NAME_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_TZNAME_MAX'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_UCHAR_MAX'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_UINT_MAX'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_UIO_MAXIOV'
-     `unistd.h' (POSIX.1g):  *note Constants for Sysconf::.
-
-`_SC_ULONG_MAX'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_USHRT_MAX'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_VERSION'
-     `unistd.h' (POSIX.1):  *note Constants for Sysconf::.
-
-`_SC_VERSION'
-     `unistd.h' (POSIX.2):  *note Constants for Sysconf::.
-
-`_SC_WORD_BIT'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_XOPEN_CRYPT'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_XOPEN_ENH_I18N'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_XOPEN_LEGACY'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_XOPEN_REALTIME'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_XOPEN_REALTIME_THREADS'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_XOPEN_SHM'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_XOPEN_UNIX'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_XOPEN_VERSION'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_XOPEN_XCU_VERSION'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_XOPEN_XPG2'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_XOPEN_XPG3'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`_SC_XOPEN_XPG4'
-     `unistd.h' (X/Open):  *note Constants for Sysconf::.
-
-`char * secure_getenv (const char *NAME)'
-     `stdlib.h' (GNU):  *note Environment Access::.
-
-`unsigned short int * seed48 (unsigned short int SEED16V[3])'
-     `stdlib.h' (SVID):  *note SVID Random::.
-
-`int seed48_r (unsigned short int SEED16V[3], struct drand48_data *BUFFER)'
-     `stdlib.h' (GNU):  *note SVID Random::.
-
-`int SEEK_CUR'
-     `stdio.h' (ISO):  *note File Positioning::.
-
-`void seekdir (DIR *DIRSTREAM, long int POS)'
-     `dirent.h' (BSD):  *note Random Access Directory::.
-
-`int SEEK_END'
-     `stdio.h' (ISO):  *note File Positioning::.
-
-`int SEEK_SET'
-     `stdio.h' (ISO):  *note File Positioning::.
-
-`int select (int NFDS, fd_set *READ-FDS, fd_set *WRITE-FDS, fd_set *EXCEPT-FDS, struct timeval *TIMEOUT)'
-     `sys/types.h' (BSD):  *note Waiting for I/O::.
-
-`ssize_t send (int SOCKET, const void *BUFFER, size_t SIZE, int FLAGS)'
-     `sys/socket.h' (BSD):  *note Sending Data::.
-
-`ssize_t sendmsg (int SOCKET, const struct msghdr *MESSAGE, int FLAGS)'
-     `sys/socket.h' (BSD):  *note Receiving Datagrams::.
-
-`ssize_t sendto (int SOCKET, const void *BUFFER, size_t SIZE, int FLAGS, struct sockaddr *ADDR, socklen_t LENGTH)'
-     `sys/socket.h' (BSD):  *note Sending Datagrams::.
-
-`void setbuf (FILE *STREAM, char *BUF)'
-     `stdio.h' (ISO):  *note Controlling Buffering::.
-
-`void setbuffer (FILE *STREAM, char *BUF, size_t SIZE)'
-     `stdio.h' (BSD):  *note Controlling Buffering::.
-
-`int setcontext (const ucontext_t *UCP)'
-     `ucontext.h' (SVID):  *note System V contexts::.
-
-`int setdomainname (const char *NAME, size_t LENGTH)'
-     `unistd.h' (???):  *note Host Identification::.
-
-`int setegid (gid_t NEWGID)'
-     `unistd.h' (POSIX.1):  *note Setting Groups::.
-
-`int setenv (const char *NAME, const char *VALUE, int REPLACE)'
-     `stdlib.h' (BSD):  *note Environment Access::.
-
-`int seteuid (uid_t NEWEUID)'
-     `unistd.h' (POSIX.1):  *note Setting User ID::.
-
-`int setfsent (void)'
-     `fstab.h' (BSD):  *note fstab::.
-
-`int setgid (gid_t NEWGID)'
-     `unistd.h' (POSIX.1):  *note Setting Groups::.
-
-`void setgrent (void)'
-     `grp.h' (SVID, BSD):  *note Scanning All Groups::.
-
-`int setgroups (size_t COUNT, const gid_t *GROUPS)'
-     `grp.h' (BSD):  *note Setting Groups::.
-
-`void sethostent (int STAYOPEN)'
-     `netdb.h' (BSD):  *note Host Names::.
-
-`int sethostid (long int ID)'
-     `unistd.h' (BSD):  *note Host Identification::.
-
-`int sethostname (const char *NAME, size_t LENGTH)'
-     `unistd.h' (BSD):  *note Host Identification::.
-
-`int setitimer (int WHICH, const struct itimerval *NEW, struct itimerval *OLD)'
-     `sys/time.h' (BSD):  *note Setting an Alarm::.
-
-`int setjmp (jmp_buf STATE)'
-     `setjmp.h' (ISO):  *note Non-Local Details::.
-
-`void setkey (const char *KEY)'
-     `crypt.h' (BSD, SVID):  *note DES Encryption::.
-
-`void setkey_r (const char *KEY, struct crypt_data * DATA)'
-     `crypt.h' (GNU):  *note DES Encryption::.
-
-`void setlinebuf (FILE *STREAM)'
-     `stdio.h' (BSD):  *note Controlling Buffering::.
-
-`char * setlocale (int CATEGORY, const char *LOCALE)'
-     `locale.h' (ISO):  *note Setting the Locale::.
-
-`int setlogmask (int MASK)'
-     `syslog.h' (BSD):  *note setlogmask::.
-
-`FILE * setmntent (const char *FILE, const char *MODE)'
-     `mntent.h' (BSD):  *note mtab::.
-
-`void setnetent (int STAYOPEN)'
-     `netdb.h' (BSD):  *note Networks Database::.
-
-`int setnetgrent (const char *NETGROUP)'
-     `netdb.h' (BSD):  *note Lookup Netgroup::.
-
-`int setpgid (pid_t PID, pid_t PGID)'
-     `unistd.h' (POSIX.1):  *note Process Group Functions::.
-
-`int setpgrp (pid_t PID, pid_t PGID)'
-     `unistd.h' (BSD):  *note Process Group Functions::.
-
-`int setpriority (int CLASS, int ID, int NICEVAL)'
-     `sys/resource.h' (BSD,POSIX):  *note Traditional Scheduling
-     Functions::.
-
-`void setprotoent (int STAYOPEN)'
-     `netdb.h' (BSD):  *note Protocols Database::.
-
-`void setpwent (void)'
-     `pwd.h' (SVID, BSD):  *note Scanning All Users::.
-
-`int setregid (gid_t RGID, gid_t EGID)'
-     `unistd.h' (BSD):  *note Setting Groups::.
-
-`int setreuid (uid_t RUID, uid_t EUID)'
-     `unistd.h' (BSD):  *note Setting User ID::.
-
-`int setrlimit (int RESOURCE, const struct rlimit *RLP)'
-     `sys/resource.h' (BSD):  *note Limits on Resources::.
-
-`int setrlimit64 (int RESOURCE, const struct rlimit64 *RLP)'
-     `sys/resource.h' (Unix98):  *note Limits on Resources::.
-
-`void setservent (int STAYOPEN)'
-     `netdb.h' (BSD):  *note Services Database::.
-
-`pid_t setsid (void)'
-     `unistd.h' (POSIX.1):  *note Process Group Functions::.
-
-`int setsockopt (int SOCKET, int LEVEL, int OPTNAME, const void *OPTVAL, socklen_t OPTLEN)'
-     `sys/socket.h' (BSD):  *note Socket Option Functions::.
-
-`char * setstate (char *STATE)'
-     `stdlib.h' (BSD):  *note BSD Random::.
-
-`int setstate_r (char *restrict STATEBUF, struct random_data *restrict BUF)'
-     `stdlib.h' (GNU):  *note BSD Random::.
-
-`int settimeofday (const struct timeval *TP, const struct timezone *TZP)'
-     `sys/time.h' (BSD):  *note High-Resolution Calendar::.
-
-`int setuid (uid_t NEWUID)'
-     `unistd.h' (POSIX.1):  *note Setting User ID::.
-
-`void setutent (void)'
-     `utmp.h' (SVID):  *note Manipulating the Database::.
-
-`void setutxent (void)'
-     `utmpx.h' (XPG4.2):  *note XPG Functions::.
-
-`int setvbuf (FILE *STREAM, char *BUF, int MODE, size_t SIZE)'
-     `stdio.h' (ISO):  *note Controlling Buffering::.
-
-`int shm_open (const char *NAME, int OFLAG, mode_t MODE)'
-     `sys/mman.h' (POSIX):  *note Memory-mapped I/O::.
-
-`SHRT_MAX'
-     `limits.h' (ISO):  *note Range of Type::.
-
-`SHRT_MIN'
-     `limits.h' (ISO):  *note Range of Type::.
-
-`int shutdown (int SOCKET, int HOW)'
-     `sys/socket.h' (BSD):  *note Closing a Socket::.
-
-`S_IEXEC'
-     `sys/stat.h' (BSD):  *note Permission Bits::.
-
-`S_IFBLK'
-     `sys/stat.h' (BSD):  *note Testing File Type::.
-
-`S_IFCHR'
-     `sys/stat.h' (BSD):  *note Testing File Type::.
-
-`S_IFDIR'
-     `sys/stat.h' (BSD):  *note Testing File Type::.
-
-`S_IFIFO'
-     `sys/stat.h' (BSD):  *note Testing File Type::.
-
-`S_IFLNK'
-     `sys/stat.h' (BSD):  *note Testing File Type::.
-
-`int S_IFMT'
-     `sys/stat.h' (BSD):  *note Testing File Type::.
-
-`S_IFREG'
-     `sys/stat.h' (BSD):  *note Testing File Type::.
-
-`S_IFSOCK'
-     `sys/stat.h' (BSD):  *note Testing File Type::.
-
-`int SIGABRT'
-     `signal.h' (ISO):  *note Program Error Signals::.
-
-`int sigaction (int SIGNUM, const struct sigaction *restrict ACTION, struct sigaction *restrict OLD-ACTION)'
-     `signal.h' (POSIX.1):  *note Advanced Signal Handling::.
-
-`int sigaddset (sigset_t *SET, int SIGNUM)'
-     `signal.h' (POSIX.1):  *note Signal Sets::.
-
-`int SIGALRM'
-     `signal.h' (POSIX.1):  *note Alarm Signals::.
-
-`int sigaltstack (const stack_t *restrict STACK, stack_t *restrict OLDSTACK)'
-     `signal.h' (XPG):  *note Signal Stack::.
-
-`sig_atomic_t'
-     `signal.h' (ISO):  *note Atomic Types::.
-
-`SIG_BLOCK'
-     `signal.h' (POSIX.1):  *note Process Signal Mask::.
-
-`int sigblock (int MASK)'
-     `signal.h' (BSD):  *note Blocking in BSD::.
-
-`int SIGBUS'
-     `signal.h' (BSD):  *note Program Error Signals::.
-
-`int SIGCHLD'
-     `signal.h' (POSIX.1):  *note Job Control Signals::.
-
-`int SIGCLD'
-     `signal.h' (SVID):  *note Job Control Signals::.
-
-`int SIGCONT'
-     `signal.h' (POSIX.1):  *note Job Control Signals::.
-
-`int sigdelset (sigset_t *SET, int SIGNUM)'
-     `signal.h' (POSIX.1):  *note Signal Sets::.
-
-`int sigemptyset (sigset_t *SET)'
-     `signal.h' (POSIX.1):  *note Signal Sets::.
-
-`int SIGEMT'
-     `signal.h' (BSD):  *note Program Error Signals::.
-
-`sighandler_t SIG_ERR'
-     `signal.h' (ISO):  *note Basic Signal Handling::.
-
-`int sigfillset (sigset_t *SET)'
-     `signal.h' (POSIX.1):  *note Signal Sets::.
-
-`int SIGFPE'
-     `signal.h' (ISO):  *note Program Error Signals::.
-
-`sighandler_t'
-     `signal.h' (GNU):  *note Basic Signal Handling::.
-
-`int SIGHUP'
-     `signal.h' (POSIX.1):  *note Termination Signals::.
-
-`int SIGILL'
-     `signal.h' (ISO):  *note Program Error Signals::.
-
-`int SIGINFO'
-     `signal.h' (BSD):  *note Miscellaneous Signals::.
-
-`int SIGINT'
-     `signal.h' (ISO):  *note Termination Signals::.
-
-`int siginterrupt (int SIGNUM, int FAILFLAG)'
-     `signal.h' (BSD):  *note BSD Handler::.
-
-`int SIGIO'
-     `signal.h' (BSD):  *note Asynchronous I/O Signals::.
-
-`int SIGIOT'
-     `signal.h' (Unix):  *note Program Error Signals::.
-
-`int sigismember (const sigset_t *SET, int SIGNUM)'
-     `signal.h' (POSIX.1):  *note Signal Sets::.
-
-`sigjmp_buf'
-     `setjmp.h' (POSIX.1):  *note Non-Local Exits and Signals::.
-
-`int SIGKILL'
-     `signal.h' (POSIX.1):  *note Termination Signals::.
-
-`void siglongjmp (sigjmp_buf STATE, int VALUE)'
-     `setjmp.h' (POSIX.1):  *note Non-Local Exits and Signals::.
-
-`int SIGLOST'
-     `signal.h' (GNU):  *note Operation Error Signals::.
-
-`int sigmask (int SIGNUM)'
-     `signal.h' (BSD):  *note Blocking in BSD::.
-
-`sighandler_t signal (int SIGNUM, sighandler_t ACTION)'
-     `signal.h' (ISO):  *note Basic Signal Handling::.
-
-`int signbit (_float-type_ X)'
-     `math.h' (ISO):  *note FP Bit Twiddling::.
-
-`double significand (double X)'
-     `math.h' (BSD):  *note Normalization Functions::.
-
-`float significandf (float X)'
-     `math.h' (BSD):  *note Normalization Functions::.
-
-`long double significandl (long double X)'
-     `math.h' (BSD):  *note Normalization Functions::.
-
-`int sigpause (int MASK)'
-     `signal.h' (BSD):  *note Blocking in BSD::.
-
-`int sigpending (sigset_t *SET)'
-     `signal.h' (POSIX.1):  *note Checking for Pending Signals::.
-
-`int SIGPIPE'
-     `signal.h' (POSIX.1):  *note Operation Error Signals::.
-
-`int SIGPOLL'
-     `signal.h' (SVID):  *note Asynchronous I/O Signals::.
-
-`int sigprocmask (int HOW, const sigset_t *restrict SET, sigset_t *restrict OLDSET)'
-     `signal.h' (POSIX.1):  *note Process Signal Mask::.
-
-`int SIGPROF'
-     `signal.h' (BSD):  *note Alarm Signals::.
-
-`int SIGQUIT'
-     `signal.h' (POSIX.1):  *note Termination Signals::.
-
-`int SIGSEGV'
-     `signal.h' (ISO):  *note Program Error Signals::.
-
-`int sigsetjmp (sigjmp_buf STATE, int SAVESIGS)'
-     `setjmp.h' (POSIX.1):  *note Non-Local Exits and Signals::.
-
-`SIG_SETMASK'
-     `signal.h' (POSIX.1):  *note Process Signal Mask::.
-
-`int sigsetmask (int MASK)'
-     `signal.h' (BSD):  *note Blocking in BSD::.
-
-`sigset_t'
-     `signal.h' (POSIX.1):  *note Signal Sets::.
-
-`int sigstack (struct sigstack *STACK, struct sigstack *OLDSTACK)'
-     `signal.h' (BSD):  *note Signal Stack::.
-
-`int SIGSTOP'
-     `signal.h' (POSIX.1):  *note Job Control Signals::.
-
-`int sigsuspend (const sigset_t *SET)'
-     `signal.h' (POSIX.1):  *note Sigsuspend::.
-
-`int SIGSYS'
-     `signal.h' (Unix):  *note Program Error Signals::.
-
-`int SIGTERM'
-     `signal.h' (ISO):  *note Termination Signals::.
-
-`int SIGTRAP'
-     `signal.h' (BSD):  *note Program Error Signals::.
-
-`int SIGTSTP'
-     `signal.h' (POSIX.1):  *note Job Control Signals::.
-
-`int SIGTTIN'
-     `signal.h' (POSIX.1):  *note Job Control Signals::.
-
-`int SIGTTOU'
-     `signal.h' (POSIX.1):  *note Job Control Signals::.
-
-`SIG_UNBLOCK'
-     `signal.h' (POSIX.1):  *note Process Signal Mask::.
-
-`int SIGURG'
-     `signal.h' (BSD):  *note Asynchronous I/O Signals::.
-
-`int SIGUSR1'
-     `signal.h' (POSIX.1):  *note Miscellaneous Signals::.
-
-`int SIGUSR2'
-     `signal.h' (POSIX.1):  *note Miscellaneous Signals::.
-
-`int sigvec (int SIGNUM, const struct sigvec *ACTION, struct sigvec *OLD-ACTION)'
-     `signal.h' (BSD):  *note BSD Handler::.
-
-`int SIGVTALRM'
-     `signal.h' (BSD):  *note Alarm Signals::.
-
-`int SIGWINCH'
-     `signal.h' (BSD):  *note Miscellaneous Signals::.
-
-`int SIGXCPU'
-     `signal.h' (BSD):  *note Operation Error Signals::.
-
-`int SIGXFSZ'
-     `signal.h' (BSD):  *note Operation Error Signals::.
-
-`double sin (double X)'
-     `math.h' (ISO):  *note Trig Functions::.
-
-`void sincos (double X, double *SINX, double *COSX)'
-     `math.h' (GNU):  *note Trig Functions::.
-
-`void sincosf (float X, float *SINX, float *COSX)'
-     `math.h' (GNU):  *note Trig Functions::.
-
-`void sincosl (long double X, long double *SINX, long double *COSX)'
-     `math.h' (GNU):  *note Trig Functions::.
-
-`float sinf (float X)'
-     `math.h' (ISO):  *note Trig Functions::.
-
-`double sinh (double X)'
-     `math.h' (ISO):  *note Hyperbolic Functions::.
-
-`float sinhf (float X)'
-     `math.h' (ISO):  *note Hyperbolic Functions::.
-
-`long double sinhl (long double X)'
-     `math.h' (ISO):  *note Hyperbolic Functions::.
-
-`long double sinl (long double X)'
-     `math.h' (ISO):  *note Trig Functions::.
-
-`S_IREAD'
-     `sys/stat.h' (BSD):  *note Permission Bits::.
-
-`S_IRGRP'
-     `sys/stat.h' (POSIX.1):  *note Permission Bits::.
-
-`S_IROTH'
-     `sys/stat.h' (POSIX.1):  *note Permission Bits::.
-
-`S_IRUSR'
-     `sys/stat.h' (POSIX.1):  *note Permission Bits::.
-
-`S_IRWXG'
-     `sys/stat.h' (POSIX.1):  *note Permission Bits::.
-
-`S_IRWXO'
-     `sys/stat.h' (POSIX.1):  *note Permission Bits::.
-
-`S_IRWXU'
-     `sys/stat.h' (POSIX.1):  *note Permission Bits::.
-
-`int S_ISBLK (mode_t M)'
-     `sys/stat.h' (POSIX):  *note Testing File Type::.
-
-`int S_ISCHR (mode_t M)'
-     `sys/stat.h' (POSIX):  *note Testing File Type::.
-
-`int S_ISDIR (mode_t M)'
-     `sys/stat.h' (POSIX):  *note Testing File Type::.
-
-`int S_ISFIFO (mode_t M)'
-     `sys/stat.h' (POSIX):  *note Testing File Type::.
-
-`S_ISGID'
-     `sys/stat.h' (POSIX):  *note Permission Bits::.
-
-`int S_ISLNK (mode_t M)'
-     `sys/stat.h' (GNU):  *note Testing File Type::.
-
-`int S_ISREG (mode_t M)'
-     `sys/stat.h' (POSIX):  *note Testing File Type::.
-
-`int S_ISSOCK (mode_t M)'
-     `sys/stat.h' (GNU):  *note Testing File Type::.
-
-`S_ISUID'
-     `sys/stat.h' (POSIX):  *note Permission Bits::.
-
-`S_ISVTX'
-     `sys/stat.h' (BSD):  *note Permission Bits::.
-
-`S_IWGRP'
-     `sys/stat.h' (POSIX.1):  *note Permission Bits::.
-
-`S_IWOTH'
-     `sys/stat.h' (POSIX.1):  *note Permission Bits::.
-
-`S_IWRITE'
-     `sys/stat.h' (BSD):  *note Permission Bits::.
-
-`S_IWUSR'
-     `sys/stat.h' (POSIX.1):  *note Permission Bits::.
-
-`S_IXGRP'
-     `sys/stat.h' (POSIX.1):  *note Permission Bits::.
-
-`S_IXOTH'
-     `sys/stat.h' (POSIX.1):  *note Permission Bits::.
-
-`S_IXUSR'
-     `sys/stat.h' (POSIX.1):  *note Permission Bits::.
-
-`size_t'
-     `stddef.h' (ISO):  *note Important Data Types::.
-
-`unsigned int sleep (unsigned int SECONDS)'
-     `unistd.h' (POSIX.1):  *note Sleeping::.
-
-`int snprintf (char *S, size_t SIZE, const char *TEMPLATE, ...)'
-     `stdio.h' (GNU):  *note Formatted Output Functions::.
-
-`SO_BROADCAST'
-     `sys/socket.h' (BSD):  *note Socket-Level Options::.
-
-`int SOCK_DGRAM'
-     `sys/socket.h' (BSD):  *note Communication Styles::.
-
-`int socket (int NAMESPACE, int STYLE, int PROTOCOL)'
-     `sys/socket.h' (BSD):  *note Creating a Socket::.
-
-`int socketpair (int NAMESPACE, int STYLE, int PROTOCOL, int FILEDES[2])'
-     `sys/socket.h' (BSD):  *note Socket Pairs::.
-
-`int SOCK_RAW'
-     `sys/socket.h' (BSD):  *note Communication Styles::.
-
-`int SOCK_RDM'
-     `sys/socket.h' (BSD):  *note Communication Styles::.
-
-`int SOCK_SEQPACKET'
-     `sys/socket.h' (BSD):  *note Communication Styles::.
-
-`int SOCK_STREAM'
-     `sys/socket.h' (BSD):  *note Communication Styles::.
-
-`SO_DEBUG'
-     `sys/socket.h' (BSD):  *note Socket-Level Options::.
-
-`SO_DONTROUTE'
-     `sys/socket.h' (BSD):  *note Socket-Level Options::.
-
-`SO_ERROR'
-     `sys/socket.h' (BSD):  *note Socket-Level Options::.
-
-`SO_KEEPALIVE'
-     `sys/socket.h' (BSD):  *note Socket-Level Options::.
-
-`SO_LINGER'
-     `sys/socket.h' (BSD):  *note Socket-Level Options::.
-
-`int SOL_SOCKET'
-     `sys/socket.h' (BSD):  *note Socket-Level Options::.
-
-`SO_OOBINLINE'
-     `sys/socket.h' (BSD):  *note Socket-Level Options::.
-
-`SO_RCVBUF'
-     `sys/socket.h' (BSD):  *note Socket-Level Options::.
-
-`SO_REUSEADDR'
-     `sys/socket.h' (BSD):  *note Socket-Level Options::.
-
-`SO_SNDBUF'
-     `sys/socket.h' (BSD):  *note Socket-Level Options::.
-
-`SO_STYLE'
-     `sys/socket.h' (GNU):  *note Socket-Level Options::.
-
-`SO_TYPE'
-     `sys/socket.h' (BSD):  *note Socket-Level Options::.
-
-`speed_t'
-     `termios.h' (POSIX.1):  *note Line Speed::.
-
-`int sprintf (char *S, const char *TEMPLATE, ...)'
-     `stdio.h' (ISO):  *note Formatted Output Functions::.
-
-`double sqrt (double X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`float sqrtf (float X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`long double sqrtl (long double X)'
-     `math.h' (ISO):  *note Exponents and Logarithms::.
-
-`void srand (unsigned int SEED)'
-     `stdlib.h' (ISO):  *note ISO Random::.
-
-`void srand48 (long int SEEDVAL)'
-     `stdlib.h' (SVID):  *note SVID Random::.
-
-`int srand48_r (long int SEEDVAL, struct drand48_data *BUFFER)'
-     `stdlib.h' (GNU):  *note SVID Random::.
-
-`void srandom (unsigned int SEED)'
-     `stdlib.h' (BSD):  *note BSD Random::.
-
-`int srandom_r (unsigned int SEED, struct random_data *BUF)'
-     `stdlib.h' (GNU):  *note BSD Random::.
-
-`int sscanf (const char *S, const char *TEMPLATE, ...)'
-     `stdio.h' (ISO):  *note Formatted Input Functions::.
-
-`sighandler_t ssignal (int SIGNUM, sighandler_t ACTION)'
-     `signal.h' (SVID):  *note Basic Signal Handling::.
-
-`ssize_t SSIZE_MAX'
-     `limits.h' (POSIX.1):  *note General Limits::.
-
-`ssize_t'
-     `unistd.h' (POSIX.1):  *note I/O Primitives::.
-
-`stack_t'
-     `signal.h' (XPG):  *note Signal Stack::.
-
-`int stat (const char *FILENAME, struct stat *BUF)'
-     `sys/stat.h' (POSIX.1):  *note Reading Attributes::.
-
-`int stat64 (const char *FILENAME, struct stat64 *BUF)'
-     `sys/stat.h' (Unix98):  *note Reading Attributes::.
-
-`FILE * stderr'
-     `stdio.h' (ISO):  *note Standard Streams::.
-
-`STDERR_FILENO'
-     `unistd.h' (POSIX.1):  *note Descriptors and Streams::.
-
-`FILE * stdin'
-     `stdio.h' (ISO):  *note Standard Streams::.
-
-`STDIN_FILENO'
-     `unistd.h' (POSIX.1):  *note Descriptors and Streams::.
-
-`FILE * stdout'
-     `stdio.h' (ISO):  *note Standard Streams::.
-
-`STDOUT_FILENO'
-     `unistd.h' (POSIX.1):  *note Descriptors and Streams::.
-
-`int stime (const time_t *NEWTIME)'
-     `time.h' (SVID, XPG):  *note Simple Calendar Time::.
-
-`char * stpcpy (char *restrict TO, const char *restrict FROM)'
-     `string.h' (Unknown origin):  *note Copying and Concatenation::.
-
-`char * stpncpy (char *restrict TO, const char *restrict FROM, size_t SIZE)'
-     `string.h' (GNU):  *note Copying and Concatenation::.
-
-`int strcasecmp (const char *S1, const char *S2)'
-     `string.h' (BSD):  *note String/Array Comparison::.
-
-`char * strcasestr (const char *HAYSTACK, const char *NEEDLE)'
-     `string.h' (GNU):  *note Search Functions::.
-
-`char * strcat (char *restrict TO, const char *restrict FROM)'
-     `string.h' (ISO):  *note Copying and Concatenation::.
-
-`char * strchr (const char *STRING, int C)'
-     `string.h' (ISO):  *note Search Functions::.
-
-`char * strchrnul (const char *STRING, int C)'
-     `string.h' (GNU):  *note Search Functions::.
-
-`int strcmp (const char *S1, const char *S2)'
-     `string.h' (ISO):  *note String/Array Comparison::.
-
-`int strcoll (const char *S1, const char *S2)'
-     `string.h' (ISO):  *note Collation Functions::.
-
-`char * strcpy (char *restrict TO, const char *restrict FROM)'
-     `string.h' (ISO):  *note Copying and Concatenation::.
-
-`size_t strcspn (const char *STRING, const char *STOPSET)'
-     `string.h' (ISO):  *note Search Functions::.
-
-`char * strdup (const char *S)'
-     `string.h' (SVID):  *note Copying and Concatenation::.
-
-`char * strdupa (const char *S)'
-     `string.h' (GNU):  *note Copying and Concatenation::.
-
-`int STREAM_MAX'
-     `limits.h' (POSIX.1):  *note General Limits::.
-
-`char * strerror (int ERRNUM)'
-     `string.h' (ISO):  *note Error Messages::.
-
-`char * strerror_r (int ERRNUM, char *BUF, size_t N)'
-     `string.h' (GNU):  *note Error Messages::.
-
-`char * strfry (char *STRING)'
-     `string.h' (GNU):  *note strfry::.
-
-`size_t strftime (char *S, size_t SIZE, const char *TEMPLATE, const struct tm *BROKENTIME)'
-     `time.h' (ISO):  *note Formatting Calendar Time::.
-
-`size_t strlen (const char *S)'
-     `string.h' (ISO):  *note String Length::.
-
-`int strncasecmp (const char *S1, const char *S2, size_t N)'
-     `string.h' (BSD):  *note String/Array Comparison::.
-
-`char * strncat (char *restrict TO, const char *restrict FROM, size_t SIZE)'
-     `string.h' (ISO):  *note Copying and Concatenation::.
-
-`int strncmp (const char *S1, const char *S2, size_t SIZE)'
-     `string.h' (ISO):  *note String/Array Comparison::.
-
-`char * strncpy (char *restrict TO, const char *restrict FROM, size_t SIZE)'
-     `string.h' (ISO):  *note Copying and Concatenation::.
-
-`char * strndup (const char *S, size_t SIZE)'
-     `string.h' (GNU):  *note Copying and Concatenation::.
-
-`char * strndupa (const char *S, size_t SIZE)'
-     `string.h' (GNU):  *note Copying and Concatenation::.
-
-`size_t strnlen (const char *S, size_t MAXLEN)'
-     `string.h' (GNU):  *note String Length::.
-
-`char * strpbrk (const char *STRING, const char *STOPSET)'
-     `string.h' (ISO):  *note Search Functions::.
-
-`char * strptime (const char *S, const char *FMT, struct tm *TP)'
-     `time.h' (XPG4):  *note Low-Level Time String Parsing::.
-
-`char * strrchr (const char *STRING, int C)'
-     `string.h' (ISO):  *note Search Functions::.
-
-`char * strsep (char **STRING_PTR, const char *DELIMITER)'
-     `string.h' (BSD):  *note Finding Tokens in a String::.
-
-`char * strsignal (int SIGNUM)'
-     `string.h' (GNU):  *note Signal Messages::.
-
-`size_t strspn (const char *STRING, const char *SKIPSET)'
-     `string.h' (ISO):  *note Search Functions::.
-
-`char * strstr (const char *HAYSTACK, const char *NEEDLE)'
-     `string.h' (ISO):  *note Search Functions::.
-
-`double strtod (const char *restrict STRING, char **restrict TAILPTR)'
-     `stdlib.h' (ISO):  *note Parsing of Floats::.
-
-`float strtof (const char *STRING, char **TAILPTR)'
-     `stdlib.h' (ISO):  *note Parsing of Floats::.
-
-`intmax_t strtoimax (const char *restrict STRING, char **restrict TAILPTR, int BASE)'
-     `inttypes.h' (ISO):  *note Parsing of Integers::.
-
-`char * strtok (char *restrict NEWSTRING, const char *restrict DELIMITERS)'
-     `string.h' (ISO):  *note Finding Tokens in a String::.
-
-`char * strtok_r (char *NEWSTRING, const char *DELIMITERS, char **SAVE_PTR)'
-     `string.h' (POSIX):  *note Finding Tokens in a String::.
-
-`long int strtol (const char *restrict STRING, char **restrict TAILPTR, int BASE)'
-     `stdlib.h' (ISO):  *note Parsing of Integers::.
-
-`long double strtold (const char *STRING, char **TAILPTR)'
-     `stdlib.h' (ISO):  *note Parsing of Floats::.
-
-`long long int strtoll (const char *restrict STRING, char **restrict TAILPTR, int BASE)'
-     `stdlib.h' (ISO):  *note Parsing of Integers::.
-
-`long long int strtoq (const char *restrict STRING, char **restrict TAILPTR, int BASE)'
-     `stdlib.h' (BSD):  *note Parsing of Integers::.
-
-`unsigned long int strtoul (const char *retrict STRING, char **restrict TAILPTR, int BASE)'
-     `stdlib.h' (ISO):  *note Parsing of Integers::.
-
-`unsigned long long int strtoull (const char *restrict STRING, char **restrict TAILPTR, int BASE)'
-     `stdlib.h' (ISO):  *note Parsing of Integers::.
-
-`uintmax_t strtoumax (const char *restrict STRING, char **restrict TAILPTR, int BASE)'
-     `inttypes.h' (ISO):  *note Parsing of Integers::.
-
-`unsigned long long int strtouq (const char *restrict STRING, char **restrict TAILPTR, int BASE)'
-     `stdlib.h' (BSD):  *note Parsing of Integers::.
-
-`struct aiocb'
-     `aio.h' (POSIX.1b):  *note Asynchronous I/O::.
-
-`struct aiocb64'
-     `aio.h' (POSIX.1b):  *note Asynchronous I/O::.
-
-`struct aioinit'
-     `aio.h' (GNU):  *note Configuration of AIO::.
-
-`struct argp'
-     `argp.h' (GNU):  *note Argp Parsers::.
-
-`struct argp_child'
-     `argp.h' (GNU):  *note Argp Children::.
-
-`struct argp_option'
-     `argp.h' (GNU):  *note Argp Option Vectors::.
-
-`struct argp_state'
-     `argp.h' (GNU):  *note Argp Parsing State::.
-
-`struct dirent'
-     `dirent.h' (POSIX.1):  *note Directory Entries::.
-
-`struct exit_status'
-     `utmp.h' (SVID):  *note Manipulating the Database::.
-
-`struct flock'
-     `fcntl.h' (POSIX.1):  *note File Locks::.
-
-`struct fstab'
-     `fstab.h' (BSD):  *note fstab::.
-
-`struct FTW'
-     `ftw.h' (XPG4.2):  *note Working with Directory Trees::.
-
-`struct __gconv_step'
-     `gconv.h' (GNU):  *note glibc iconv Implementation::.
-
-`struct __gconv_step_data'
-     `gconv.h' (GNU):  *note glibc iconv Implementation::.
-
-`struct group'
-     `grp.h' (POSIX.1):  *note Group Data Structure::.
-
-`struct hostent'
-     `netdb.h' (BSD):  *note Host Names::.
-
-`struct if_nameindex'
-     `net/if.h' (IPv6 basic API):  *note Interface Naming::.
-
-`struct in6_addr'
-     `netinet/in.h' (IPv6 basic API):  *note Host Address Data Type::.
-
-`struct in_addr'
-     `netinet/in.h' (BSD):  *note Host Address Data Type::.
-
-`struct iovec'
-     `sys/uio.h' (BSD):  *note Scatter-Gather::.
-
-`struct itimerval'
-     `sys/time.h' (BSD):  *note Setting an Alarm::.
-
-`struct lconv'
-     `locale.h' (ISO):  *note The Lame Way to Locale Data::.
-
-`struct linger'
-     `sys/socket.h' (BSD):  *note Socket-Level Options::.
-
-`struct mallinfo'
-     `malloc.h' (GNU):  *note Statistics of Malloc::.
-
-`struct mntent'
-     `mntent.h' (BSD):  *note mtab::.
-
-`struct msghdr'
-     `sys/socket.h' (BSD):  *note Receiving Datagrams::.
-
-`struct netent'
-     `netdb.h' (BSD):  *note Networks Database::.
-
-`struct obstack'
-     `obstack.h' (GNU):  *note Creating Obstacks::.
-
-`struct option'
-     `getopt.h' (GNU):  *note Getopt Long Options::.
-
-`struct passwd'
-     `pwd.h' (POSIX.1):  *note User Data Structure::.
-
-`struct printf_info'
-     `printf.h' (GNU):  *note Conversion Specifier Options::.
-
-`struct protoent'
-     `netdb.h' (BSD):  *note Protocols Database::.
-
-`struct random_data'
-     `stdlib.h' (GNU):  *note BSD Random::.
-
-`struct rlimit'
-     `sys/resource.h' (BSD):  *note Limits on Resources::.
-
-`struct rlimit64'
-     `sys/resource.h' (Unix98):  *note Limits on Resources::.
-
-`struct rusage'
-     `sys/resource.h' (BSD):  *note Resource Usage::.
-
-`struct sched_param'
-     `sched.h' (POSIX):  *note Basic Scheduling Functions::.
-
-`struct servent'
-     `netdb.h' (BSD):  *note Services Database::.
-
-`struct sgttyb'
-     `termios.h' (BSD):  *note BSD Terminal Modes::.
-
-`struct sigaction'
-     `signal.h' (POSIX.1):  *note Advanced Signal Handling::.
-
-`struct sigstack'
-     `signal.h' (BSD):  *note Signal Stack::.
-
-`struct sigvec'
-     `signal.h' (BSD):  *note BSD Handler::.
-
-`struct sockaddr'
-     `sys/socket.h' (BSD):  *note Address Formats::.
-
-`struct sockaddr_in'
-     `netinet/in.h' (BSD):  *note Internet Address Formats::.
-
-`struct sockaddr_un'
-     `sys/un.h' (BSD):  *note Local Namespace Details::.
-
-`struct stat'
-     `sys/stat.h' (POSIX.1):  *note Attribute Meanings::.
-
-`struct stat64'
-     `sys/stat.h' (LFS):  *note Attribute Meanings::.
-
-`struct termios'
-     `termios.h' (POSIX.1):  *note Mode Data Types::.
-
-`struct timespec'
-     `sys/time.h' (POSIX.1):  *note Elapsed Time::.
-
-`struct timeval'
-     `sys/time.h' (BSD):  *note Elapsed Time::.
-
-`struct timezone'
-     `sys/time.h' (BSD):  *note High-Resolution Calendar::.
-
-`struct tm'
-     `time.h' (ISO):  *note Broken-down Time::.
-
-`struct tms'
-     `sys/times.h' (POSIX.1):  *note Processor Time::.
-
-`struct utimbuf'
-     `utime.h' (POSIX.1):  *note File Times::.
-
-`struct utsname'
-     `sys/utsname.h' (POSIX.1):  *note Platform Type::.
-
-`int strverscmp (const char *S1, const char *S2)'
-     `string.h' (GNU):  *note String/Array Comparison::.
-
-`size_t strxfrm (char *restrict TO, const char *restrict FROM, size_t SIZE)'
-     `string.h' (ISO):  *note Collation Functions::.
-
-`int stty (int FILEDES, const struct sgttyb *ATTRIBUTES)'
-     `sgtty.h' (BSD):  *note BSD Terminal Modes::.
-
-`int S_TYPEISMQ (struct stat *S)'
-     `sys/stat.h' (POSIX):  *note Testing File Type::.
-
-`int S_TYPEISSEM (struct stat *S)'
-     `sys/stat.h' (POSIX):  *note Testing File Type::.
-
-`int S_TYPEISSHM (struct stat *S)'
-     `sys/stat.h' (POSIX):  *note Testing File Type::.
-
-`int SUN_LEN (_struct sockaddr_un *_ PTR)'
-     `sys/un.h' (BSD):  *note Local Namespace Details::.
-
-`_SVID_SOURCE'
-     (GNU):  *note Feature Test Macros::.
-
-`int SV_INTERRUPT'
-     `signal.h' (BSD):  *note BSD Handler::.
-
-`int SV_ONSTACK'
-     `signal.h' (BSD):  *note BSD Handler::.
-
-`int SV_RESETHAND'
-     `signal.h' (Sun):  *note BSD Handler::.
-
-`int swapcontext (ucontext_t *restrict OUCP, const ucontext_t *restrict UCP)'
-     `ucontext.h' (SVID):  *note System V contexts::.
-
-`int swprintf (wchar_t *S, size_t SIZE, const wchar_t *TEMPLATE, ...)'
-     `wchar.h' (GNU):  *note Formatted Output Functions::.
-
-`int swscanf (const wchar_t *WS, const wchar_t *TEMPLATE, ...)'
-     `wchar.h' (ISO):  *note Formatted Input Functions::.
-
-`int symlink (const char *OLDNAME, const char *NEWNAME)'
-     `unistd.h' (BSD):  *note Symbolic Links::.
-
-`SYMLINK_MAX'
-     `limits.h' (POSIX.1):  *note File Minimums::.
-
-`void sync (void)'
-     `unistd.h' (X/Open):  *note Synchronizing I/O::.
-
-`long int syscall (long int SYSNO, ...)'
-     `unistd.h' (???):  *note System Calls::.
-
-`long int sysconf (int PARAMETER)'
-     `unistd.h' (POSIX.1):  *note Sysconf Definition::.
-
-`int sysctl (int *NAMES, int NLEN, void *OLDVAL, size_t *OLDLENP, void *NEWVAL, size_t NEWLEN)'
-     `sys/sysctl.h' (BSD):  *note System Parameters::.
-
-`void syslog (int FACILITY_PRIORITY, const char *FORMAT, ...)'
-     `syslog.h' (BSD):  *note syslog; vsyslog::.
-
-`int system (const char *COMMAND)'
-     `stdlib.h' (ISO):  *note Running a Command::.
-
-`sighandler_t sysv_signal (int SIGNUM, sighandler_t ACTION)'
-     `signal.h' (GNU):  *note Basic Signal Handling::.
-
-`double tan (double X)'
-     `math.h' (ISO):  *note Trig Functions::.
-
-`float tanf (float X)'
-     `math.h' (ISO):  *note Trig Functions::.
-
-`double tanh (double X)'
-     `math.h' (ISO):  *note Hyperbolic Functions::.
-
-`float tanhf (float X)'
-     `math.h' (ISO):  *note Hyperbolic Functions::.
-
-`long double tanhl (long double X)'
-     `math.h' (ISO):  *note Hyperbolic Functions::.
-
-`long double tanl (long double X)'
-     `math.h' (ISO):  *note Trig Functions::.
-
-`int tcdrain (int FILEDES)'
-     `termios.h' (POSIX.1):  *note Line Control::.
-
-`tcflag_t'
-     `termios.h' (POSIX.1):  *note Mode Data Types::.
-
-`int tcflow (int FILEDES, int ACTION)'
-     `termios.h' (POSIX.1):  *note Line Control::.
-
-`int tcflush (int FILEDES, int QUEUE)'
-     `termios.h' (POSIX.1):  *note Line Control::.
-
-`int tcgetattr (int FILEDES, struct termios *TERMIOS-P)'
-     `termios.h' (POSIX.1):  *note Mode Functions::.
-
-`pid_t tcgetpgrp (int FILEDES)'
-     `unistd.h' (POSIX.1):  *note Terminal Access Functions::.
-
-`pid_t tcgetsid (int FILDES)'
-     `termios.h' (Unix98):  *note Terminal Access Functions::.
-
-`TCSADRAIN'
-     `termios.h' (POSIX.1):  *note Mode Functions::.
-
-`TCSAFLUSH'
-     `termios.h' (POSIX.1):  *note Mode Functions::.
-
-`TCSANOW'
-     `termios.h' (POSIX.1):  *note Mode Functions::.
-
-`TCSASOFT'
-     `termios.h' (BSD):  *note Mode Functions::.
-
-`int tcsendbreak (int FILEDES, int DURATION)'
-     `termios.h' (POSIX.1):  *note Line Control::.
-
-`int tcsetattr (int FILEDES, int WHEN, const struct termios *TERMIOS-P)'
-     `termios.h' (POSIX.1):  *note Mode Functions::.
-
-`int tcsetpgrp (int FILEDES, pid_t PGID)'
-     `unistd.h' (POSIX.1):  *note Terminal Access Functions::.
-
-`void * tdelete (const void *KEY, void **ROOTP, comparison_fn_t COMPAR)'
-     `search.h' (SVID):  *note Tree Search Function::.
-
-`void tdestroy (void *VROOT, __free_fn_t FREEFCT)'
-     `search.h' (GNU):  *note Tree Search Function::.
-
-`long int telldir (DIR *DIRSTREAM)'
-     `dirent.h' (BSD):  *note Random Access Directory::.
-
-`TEMP_FAILURE_RETRY (EXPRESSION)'
-     `unistd.h' (GNU):  *note Interrupted Primitives::.
-
-`char * tempnam (const char *DIR, const char *PREFIX)'
-     `stdio.h' (SVID):  *note Temporary Files::.
-
-`char * textdomain (const char *DOMAINNAME)'
-     `libintl.h' (GNU):  *note Locating gettext catalog::.
-
-`void * tfind (const void *KEY, void *const *ROOTP, comparison_fn_t COMPAR)'
-     `search.h' (SVID):  *note Tree Search Function::.
-
-`double tgamma (double X)'
-     `math.h' (XPG, ISO):  *note Special Functions::.
-
-`float tgammaf (float X)'
-     `math.h' (XPG, ISO):  *note Special Functions::.
-
-`long double tgammal (long double X)'
-     `math.h' (XPG, ISO):  *note Special Functions::.
-
-`time_t time (time_t *RESULT)'
-     `time.h' (ISO):  *note Simple Calendar Time::.
-
-`time_t timegm (struct tm *BROKENTIME)'
-     `time.h' (???):  *note Broken-down Time::.
-
-`time_t timelocal (struct tm *BROKENTIME)'
-     `time.h' (???):  *note Broken-down Time::.
-
-`clock_t times (struct tms *BUFFER)'
-     `sys/times.h' (POSIX.1):  *note Processor Time::.
-
-`time_t'
-     `time.h' (ISO):  *note Simple Calendar Time::.
-
-`long int timezone'
-     `time.h' (SVID):  *note Time Zone Functions::.
-
-`FILE * tmpfile (void)'
-     `stdio.h' (ISO):  *note Temporary Files::.
-
-`FILE * tmpfile64 (void)'
-     `stdio.h' (Unix98):  *note Temporary Files::.
-
-`int TMP_MAX'
-     `stdio.h' (ISO):  *note Temporary Files::.
-
-`char * tmpnam (char *RESULT)'
-     `stdio.h' (ISO):  *note Temporary Files::.
-
-`char * tmpnam_r (char *RESULT)'
-     `stdio.h' (GNU):  *note Temporary Files::.
-
-`int toascii (int C)'
-     `ctype.h' (SVID, BSD):  *note Case Conversion::.
-
-`int _tolower (int C)'
-     `ctype.h' (SVID):  *note Case Conversion::.
-
-`int tolower (int C)'
-     `ctype.h' (ISO):  *note Case Conversion::.
-
-`tcflag_t TOSTOP'
-     `termios.h' (POSIX.1):  *note Local Modes::.
-
-`int _toupper (int C)'
-     `ctype.h' (SVID):  *note Case Conversion::.
-
-`int toupper (int C)'
-     `ctype.h' (ISO):  *note Case Conversion::.
-
-`wint_t towctrans (wint_t WC, wctrans_t DESC)'
-     `wctype.h' (ISO):  *note Wide Character Case Conversion::.
-
-`wint_t towlower (wint_t WC)'
-     `wctype.h' (ISO):  *note Wide Character Case Conversion::.
-
-`wint_t towupper (wint_t WC)'
-     `wctype.h' (ISO):  *note Wide Character Case Conversion::.
-
-`double trunc (double X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`int truncate (const char *FILENAME, off_t LENGTH)'
-     `unistd.h' (X/Open):  *note File Size::.
-
-`int truncate64 (const char *NAME, off64_t LENGTH)'
-     `unistd.h' (Unix98):  *note File Size::.
-
-`float truncf (float X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`long double truncl (long double X)'
-     `math.h' (ISO):  *note Rounding Functions::.
-
-`TRY_AGAIN'
-     `netdb.h' (BSD):  *note Host Names::.
-
-`void * tsearch (const void *KEY, void **ROOTP, comparison_fn_t COMPAR)'
-     `search.h' (SVID):  *note Tree Search Function::.
-
-`char * ttyname (int FILEDES)'
-     `unistd.h' (POSIX.1):  *note Is It a Terminal::.
-
-`int ttyname_r (int FILEDES, char *BUF, size_t LEN)'
-     `unistd.h' (POSIX.1):  *note Is It a Terminal::.
-
-`void twalk (const void *ROOT, __action_fn_t ACTION)'
-     `search.h' (SVID):  *note Tree Search Function::.
-
-`char * tzname [2]'
-     `time.h' (POSIX.1):  *note Time Zone Functions::.
-
-`int TZNAME_MAX'
-     `limits.h' (POSIX.1):  *note General Limits::.
-
-`void tzset (void)'
-     `time.h' (POSIX.1):  *note Time Zone Functions::.
-
-`UCHAR_MAX'
-     `limits.h' (ISO):  *note Range of Type::.
-
-`ucontext_t'
-     `ucontext.h' (SVID):  *note System V contexts::.
-
-`uid_t'
-     `sys/types.h' (POSIX.1):  *note Reading Persona::.
-
-`UINT_MAX'
-     `limits.h' (ISO):  *note Range of Type::.
-
-`long int ulimit (int CMD, ...)'
-     `ulimit.h' (BSD):  *note Limits on Resources::.
-
-`ULLONG_MAX'
-     `limits.h' (ISO):  *note Range of Type::.
-
-`ULONG_LONG_MAX'
-     `limits.h' (GNU):  *note Range of Type::.
-
-`ULONG_MAX'
-     `limits.h' (ISO):  *note Range of Type::.
-
-`mode_t umask (mode_t MASK)'
-     `sys/stat.h' (POSIX.1):  *note Setting Permissions::.
-
-`int umount (const char *FILE)'
-     `sys/mount.h' (SVID, GNU):  *note Mount-Unmount-Remount::.
-
-`int umount2 (const char *FILE, int FLAGS)'
-     `sys/mount.h' (GNU):  *note Mount-Unmount-Remount::.
-
-`int uname (struct utsname *INFO)'
-     `sys/utsname.h' (POSIX.1):  *note Platform Type::.
-
-`int ungetc (int C, FILE *STREAM)'
-     `stdio.h' (ISO):  *note How Unread::.
-
-`wint_t ungetwc (wint_t WC, FILE *STREAM)'
-     `wchar.h' (ISO):  *note How Unread::.
-
-`union wait'
-     `sys/wait.h' (BSD):  *note BSD Wait Functions::.
-
-`int unlink (const char *FILENAME)'
-     `unistd.h' (POSIX.1):  *note Deleting Files::.
-
-`int unlockpt (int FILEDES)'
-     `stdlib.h' (SVID, XPG4.2):  *note Allocation::.
-
-`int unsetenv (const char *NAME)'
-     `stdlib.h' (BSD):  *note Environment Access::.
-
-`void updwtmp (const char *WTMP_FILE, const struct utmp *UTMP)'
-     `utmp.h' (SVID):  *note Manipulating the Database::.
-
-`USER_PROCESS'
-     `utmp.h' (SVID):  *note Manipulating the Database::.
-
-`USER_PROCESS'
-     `utmpx.h' (XPG4.2):  *note XPG Functions::.
-
-`USHRT_MAX'
-     `limits.h' (ISO):  *note Range of Type::.
-
-`int utime (const char *FILENAME, const struct utimbuf *TIMES)'
-     `utime.h' (POSIX.1):  *note File Times::.
-
-`int utimes (const char *FILENAME, const struct timeval TVP[2])'
-     `sys/time.h' (BSD):  *note File Times::.
-
-`int utmpname (const char *FILE)'
-     `utmp.h' (SVID):  *note Manipulating the Database::.
-
-`int utmpxname (const char *FILE)'
-     `utmpx.h' (XPG4.2):  *note XPG Functions::.
-
-`TYPE va_arg (va_list AP, TYPE)'
-     `stdarg.h' (ISO):  *note Argument Macros::.
-
-`void va_copy (va_list DEST, va_list SRC)'
-     `stdarg.h' (ISO):  *note Argument Macros::.
-
-`void va_end (va_list AP)'
-     `stdarg.h' (ISO):  *note Argument Macros::.
-
-`va_list'
-     `stdarg.h' (ISO):  *note Argument Macros::.
-
-`void * valloc (size_t SIZE)'
-     `malloc.h', `stdlib.h' (BSD):  *note Aligned Memory Blocks::.
-
-`int vasprintf (char **PTR, const char *TEMPLATE, va_list AP)'
-     `stdio.h' (GNU):  *note Variable Arguments Output::.
-
-`void va_start (va_list AP, LAST-REQUIRED)'
-     `stdarg.h' (ISO):  *note Argument Macros::.
-
-`int VDISCARD'
-     `termios.h' (BSD):  *note Other Special::.
-
-`int VDSUSP'
-     `termios.h' (BSD):  *note Signal Characters::.
-
-`int VEOF'
-     `termios.h' (POSIX.1):  *note Editing Characters::.
-
-`int VEOL'
-     `termios.h' (POSIX.1):  *note Editing Characters::.
-
-`int VEOL2'
-     `termios.h' (BSD):  *note Editing Characters::.
-
-`int VERASE'
-     `termios.h' (POSIX.1):  *note Editing Characters::.
-
-`void verr (int STATUS, const char *FORMAT, va_list AP)'
-     `err.h' (BSD):  *note Error Messages::.
-
-`void verrx (int STATUS, const char *FORMAT, va_list AP)'
-     `err.h' (BSD):  *note Error Messages::.
-
-`int versionsort (const void *A, const void *B)'
-     `dirent.h' (GNU):  *note Scanning Directory Content::.
-
-`int versionsort64 (const void *A, const void *B)'
-     `dirent.h' (GNU):  *note Scanning Directory Content::.
-
-`pid_t vfork (void)'
-     `unistd.h' (BSD):  *note Creating a Process::.
-
-`int vfprintf (FILE *STREAM, const char *TEMPLATE, va_list AP)'
-     `stdio.h' (ISO):  *note Variable Arguments Output::.
-
-`int vfscanf (FILE *STREAM, const char *TEMPLATE, va_list AP)'
-     `stdio.h' (ISO):  *note Variable Arguments Input::.
-
-`int vfwprintf (FILE *STREAM, const wchar_t *TEMPLATE, va_list AP)'
-     `wchar.h' (ISO):  *note Variable Arguments Output::.
-
-`int vfwscanf (FILE *STREAM, const wchar_t *TEMPLATE, va_list AP)'
-     `wchar.h' (ISO):  *note Variable Arguments Input::.
-
-`int VINTR'
-     `termios.h' (POSIX.1):  *note Signal Characters::.
-
-`int VKILL'
-     `termios.h' (POSIX.1):  *note Editing Characters::.
-
-`int vlimit (int RESOURCE, int LIMIT)'
-     `sys/vlimit.h' (BSD):  *note Limits on Resources::.
-
-`int VLNEXT'
-     `termios.h' (BSD):  *note Other Special::.
-
-`int VMIN'
-     `termios.h' (POSIX.1):  *note Noncanonical Input::.
-
-`void (*error_print_progname) (void)'
-     `error.h' (GNU):  *note Error Messages::.
-
-`int vprintf (const char *TEMPLATE, va_list AP)'
-     `stdio.h' (ISO):  *note Variable Arguments Output::.
-
-`int VQUIT'
-     `termios.h' (POSIX.1):  *note Signal Characters::.
-
-`int VREPRINT'
-     `termios.h' (BSD):  *note Editing Characters::.
-
-`int vscanf (const char *TEMPLATE, va_list AP)'
-     `stdio.h' (ISO):  *note Variable Arguments Input::.
-
-`int vsnprintf (char *S, size_t SIZE, const char *TEMPLATE, va_list AP)'
-     `stdio.h' (GNU):  *note Variable Arguments Output::.
-
-`int vsprintf (char *S, const char *TEMPLATE, va_list AP)'
-     `stdio.h' (ISO):  *note Variable Arguments Output::.
-
-`int vsscanf (const char *S, const char *TEMPLATE, va_list AP)'
-     `stdio.h' (ISO):  *note Variable Arguments Input::.
-
-`int VSTART'
-     `termios.h' (POSIX.1):  *note Start/Stop Characters::.
-
-`int VSTATUS'
-     `termios.h' (BSD):  *note Other Special::.
-
-`int VSTOP'
-     `termios.h' (POSIX.1):  *note Start/Stop Characters::.
-
-`int VSUSP'
-     `termios.h' (POSIX.1):  *note Signal Characters::.
-
-`int vswprintf (wchar_t *S, size_t SIZE, const wchar_t *TEMPLATE, va_list AP)'
-     `wchar.h' (GNU):  *note Variable Arguments Output::.
-
-`int vswscanf (const wchar_t *S, const wchar_t *TEMPLATE, va_list AP)'
-     `wchar.h' (ISO):  *note Variable Arguments Input::.
-
-`void vsyslog (int FACILITY_PRIORITY, const char *FORMAT, va_list ARGLIST)'
-     `syslog.h' (BSD):  *note syslog; vsyslog::.
-
-`int VTIME'
-     `termios.h' (POSIX.1):  *note Noncanonical Input::.
-
-`int vtimes (struct vtimes *CURRENT, struct vtimes *CHILD)'
-     `sys/vtimes.h' (sys/vtimes.h):  *note Resource Usage::.
-
-`void vwarn (const char *FORMAT, va_list AP)'
-     `err.h' (BSD):  *note Error Messages::.
-
-`void vwarnx (const char *FORMAT, va_list AP)'
-     `err.h' (BSD):  *note Error Messages::.
-
-`int VWERASE'
-     `termios.h' (BSD):  *note Editing Characters::.
-
-`int vwprintf (const wchar_t *TEMPLATE, va_list AP)'
-     `wchar.h' (ISO):  *note Variable Arguments Output::.
-
-`int vwscanf (const wchar_t *TEMPLATE, va_list AP)'
-     `wchar.h' (ISO):  *note Variable Arguments Input::.
-
-`pid_t wait (int *STATUS-PTR)'
-     `sys/wait.h' (POSIX.1):  *note Process Completion::.
-
-`pid_t wait3 (union wait *STATUS-PTR, int OPTIONS, struct rusage *USAGE)'
-     `sys/wait.h' (BSD):  *note BSD Wait Functions::.
-
-`pid_t wait4 (pid_t PID, int *STATUS-PTR, int OPTIONS, struct rusage *USAGE)'
-     `sys/wait.h' (BSD):  *note Process Completion::.
-
-`pid_t waitpid (pid_t PID, int *STATUS-PTR, int OPTIONS)'
-     `sys/wait.h' (POSIX.1):  *note Process Completion::.
-
-`void warn (const char *FORMAT, ...)'
-     `err.h' (BSD):  *note Error Messages::.
-
-`void warnx (const char *FORMAT, ...)'
-     `err.h' (BSD):  *note Error Messages::.
-
-`WCHAR_MAX'
-     `limits.h' (GNU):  *note Range of Type::.
-
-`wint_t WCHAR_MAX'
-     `wchar.h' (ISO):  *note Extended Char Intro::.
-
-`wint_t WCHAR_MIN'
-     `wchar.h' (ISO):  *note Extended Char Intro::.
-
-`wchar_t'
-     `stddef.h' (ISO):  *note Extended Char Intro::.
-
-`int WCOREDUMP (int STATUS)'
-     `sys/wait.h' (BSD):  *note Process Completion Status::.
-
-`wchar_t * wcpcpy (wchar_t *restrict WTO, const wchar_t *restrict WFROM)'
-     `wchar.h' (GNU):  *note Copying and Concatenation::.
-
-`wchar_t * wcpncpy (wchar_t *restrict WTO, const wchar_t *restrict WFROM, size_t SIZE)'
-     `wchar.h' (GNU):  *note Copying and Concatenation::.
-
-`size_t wcrtomb (char *restrict S, wchar_t WC, mbstate_t *restrict PS)'
-     `wchar.h' (ISO):  *note Converting a Character::.
-
-`int wcscasecmp (const wchar_t *WS1, const wchar_t *WS2)'
-     `wchar.h' (GNU):  *note String/Array Comparison::.
-
-`wchar_t * wcscat (wchar_t *restrict WTO, const wchar_t *restrict WFROM)'
-     `wchar.h' (ISO):  *note Copying and Concatenation::.
-
-`wchar_t * wcschr (const wchar_t *WSTRING, int WC)'
-     `wchar.h' (ISO):  *note Search Functions::.
-
-`wchar_t * wcschrnul (const wchar_t *WSTRING, wchar_t WC)'
-     `wchar.h' (GNU):  *note Search Functions::.
-
-`int wcscmp (const wchar_t *WS1, const wchar_t *WS2)'
-     `wchar.h' (ISO):  *note String/Array Comparison::.
-
-`int wcscoll (const wchar_t *WS1, const wchar_t *WS2)'
-     `wchar.h' (ISO):  *note Collation Functions::.
-
-`wchar_t * wcscpy (wchar_t *restrict WTO, const wchar_t *restrict WFROM)'
-     `wchar.h' (ISO):  *note Copying and Concatenation::.
-
-`size_t wcscspn (const wchar_t *WSTRING, const wchar_t *STOPSET)'
-     `wchar.h' (ISO):  *note Search Functions::.
-
-`wchar_t * wcsdup (const wchar_t *WS)'
-     `wchar.h' (GNU):  *note Copying and Concatenation::.
-
-`size_t wcsftime (wchar_t *S, size_t SIZE, const wchar_t *TEMPLATE, const struct tm *BROKENTIME)'
-     `time.h' (ISO/Amend1):  *note Formatting Calendar Time::.
-
-`size_t wcslen (const wchar_t *WS)'
-     `wchar.h' (ISO):  *note String Length::.
-
-`int wcsncasecmp (const wchar_t *WS1, const wchar_t *S2, size_t N)'
-     `wchar.h' (GNU):  *note String/Array Comparison::.
-
-`wchar_t * wcsncat (wchar_t *restrict WTO, const wchar_t *restrict WFROM, size_t SIZE)'
-     `wchar.h' (ISO):  *note Copying and Concatenation::.
-
-`int wcsncmp (const wchar_t *WS1, const wchar_t *WS2, size_t SIZE)'
-     `wchar.h' (ISO):  *note String/Array Comparison::.
-
-`wchar_t * wcsncpy (wchar_t *restrict WTO, const wchar_t *restrict WFROM, size_t SIZE)'
-     `wchar.h' (ISO):  *note Copying and Concatenation::.
-
-`size_t wcsnlen (const wchar_t *WS, size_t MAXLEN)'
-     `wchar.h' (GNU):  *note String Length::.
-
-`size_t wcsnrtombs (char *restrict DST, const wchar_t **restrict SRC, size_t NWC, size_t LEN, mbstate_t *restrict PS)'
-     `wchar.h' (GNU):  *note Converting Strings::.
-
-`wchar_t * wcspbrk (const wchar_t *WSTRING, const wchar_t *STOPSET)'
-     `wchar.h' (ISO):  *note Search Functions::.
-
-`wchar_t * wcsrchr (const wchar_t *WSTRING, wchar_t C)'
-     `wchar.h' (ISO):  *note Search Functions::.
-
-`size_t wcsrtombs (char *restrict DST, const wchar_t **restrict SRC, size_t LEN, mbstate_t *restrict PS)'
-     `wchar.h' (ISO):  *note Converting Strings::.
-
-`size_t wcsspn (const wchar_t *WSTRING, const wchar_t *SKIPSET)'
-     `wchar.h' (ISO):  *note Search Functions::.
-
-`wchar_t * wcsstr (const wchar_t *HAYSTACK, const wchar_t *NEEDLE)'
-     `wchar.h' (ISO):  *note Search Functions::.
-
-`double wcstod (const wchar_t *restrict STRING, wchar_t **restrict TAILPTR)'
-     `wchar.h' (ISO):  *note Parsing of Floats::.
-
-`float wcstof (const wchar_t *STRING, wchar_t **TAILPTR)'
-     `stdlib.h' (ISO):  *note Parsing of Floats::.
-
-`intmax_t wcstoimax (const wchar_t *restrict STRING, wchar_t **restrict TAILPTR, int BASE)'
-     `wchar.h' (ISO):  *note Parsing of Integers::.
-
-`wchar_t * wcstok (wchar_t *NEWSTRING, const wchar_t *DELIMITERS, wchar_t **SAVE_PTR)'
-     `wchar.h' (ISO):  *note Finding Tokens in a String::.
-
-`long int wcstol (const wchar_t *restrict STRING, wchar_t **restrict TAILPTR, int BASE)'
-     `wchar.h' (ISO):  *note Parsing of Integers::.
-
-`long double wcstold (const wchar_t *STRING, wchar_t **TAILPTR)'
-     `stdlib.h' (ISO):  *note Parsing of Floats::.
-
-`long long int wcstoll (const wchar_t *restrict STRING, wchar_t **restrict TAILPTR, int BASE)'
-     `wchar.h' (ISO):  *note Parsing of Integers::.
-
-`size_t wcstombs (char *STRING, const wchar_t *WSTRING, size_t SIZE)'
-     `stdlib.h' (ISO):  *note Non-reentrant String Conversion::.
-
-`long long int wcstoq (const wchar_t *restrict STRING, wchar_t **restrict TAILPTR, int BASE)'
-     `wchar.h' (GNU):  *note Parsing of Integers::.
-
-`unsigned long int wcstoul (const wchar_t *restrict STRING, wchar_t **restrict TAILPTR, int BASE)'
-     `wchar.h' (ISO):  *note Parsing of Integers::.
-
-`unsigned long long int wcstoull (const wchar_t *restrict STRING, wchar_t **restrict TAILPTR, int BASE)'
-     `wchar.h' (ISO):  *note Parsing of Integers::.
-
-`uintmax_t wcstoumax (const wchar_t *restrict STRING, wchar_t **restrict TAILPTR, int BASE)'
-     `wchar.h' (ISO):  *note Parsing of Integers::.
-
-`unsigned long long int wcstouq (const wchar_t *restrict STRING, wchar_t **restrict TAILPTR, int BASE)'
-     `wchar.h' (GNU):  *note Parsing of Integers::.
-
-`wchar_t * wcswcs (const wchar_t *HAYSTACK, const wchar_t *NEEDLE)'
-     `wchar.h' (XPG):  *note Search Functions::.
-
-`size_t wcsxfrm (wchar_t *restrict WTO, const wchar_t *WFROM, size_t SIZE)'
-     `wchar.h' (ISO):  *note Collation Functions::.
-
-`int wctob (wint_t C)'
-     `wchar.h' (ISO):  *note Converting a Character::.
-
-`int wctomb (char *STRING, wchar_t WCHAR)'
-     `stdlib.h' (ISO):  *note Non-reentrant Character Conversion::.
-
-`wctrans_t wctrans (const char *PROPERTY)'
-     `wctype.h' (ISO):  *note Wide Character Case Conversion::.
-
-`wctrans_t'
-     `wctype.h' (ISO):  *note Wide Character Case Conversion::.
-
-`wctype_t wctype (const char *PROPERTY)'
-     `wctype.h' (ISO):  *note Classification of Wide Characters::.
-
-`wctype_t'
-     `wctype.h' (ISO):  *note Classification of Wide Characters::.
-
-`int WEOF'
-     `wchar.h' (ISO):  *note EOF and Errors::.
-
-`wint_t WEOF'
-     `wchar.h' (ISO):  *note Extended Char Intro::.
-
-`int WEXITSTATUS (int STATUS)'
-     `sys/wait.h' (POSIX.1):  *note Process Completion Status::.
-
-`int WIFEXITED (int STATUS)'
-     `sys/wait.h' (POSIX.1):  *note Process Completion Status::.
-
-`int WIFSIGNALED (int STATUS)'
-     `sys/wait.h' (POSIX.1):  *note Process Completion Status::.
-
-`int WIFSTOPPED (int STATUS)'
-     `sys/wait.h' (POSIX.1):  *note Process Completion Status::.
-
-`wint_t'
-     `wchar.h' (ISO):  *note Extended Char Intro::.
-
-`wchar_t * wmemchr (const wchar_t *BLOCK, wchar_t WC, size_t SIZE)'
-     `wchar.h' (ISO):  *note Search Functions::.
-
-`int wmemcmp (const wchar_t *A1, const wchar_t *A2, size_t SIZE)'
-     `wchar.h' (ISO):  *note String/Array Comparison::.
-
-`wchar_t * wmemcpy (wchar_t *restrict WTO, const wchar_t *restrict WFROM, size_t SIZE)'
-     `wchar.h' (ISO):  *note Copying and Concatenation::.
-
-`wchar_t * wmemmove (wchar_t *WTO, const wchar_t *WFROM, size_t SIZE)'
-     `wchar.h' (ISO):  *note Copying and Concatenation::.
-
-`wchar_t * wmempcpy (wchar_t *restrict WTO, const wchar_t *restrict WFROM, size_t SIZE)'
-     `wchar.h' (GNU):  *note Copying and Concatenation::.
-
-`wchar_t * wmemset (wchar_t *BLOCK, wchar_t WC, size_t SIZE)'
-     `wchar.h' (ISO):  *note Copying and Concatenation::.
-
-`int W_OK'
-     `unistd.h' (POSIX.1):  *note Testing File Access::.
-
-`int wordexp (const char *WORDS, wordexp_t *WORD-VECTOR-PTR, int FLAGS)'
-     `wordexp.h' (POSIX.2):  *note Calling Wordexp::.
-
-`wordexp_t'
-     `wordexp.h' (POSIX.2):  *note Calling Wordexp::.
-
-`void wordfree (wordexp_t *WORD-VECTOR-PTR)'
-     `wordexp.h' (POSIX.2):  *note Calling Wordexp::.
-
-`int wprintf (const wchar_t *TEMPLATE, ...)'
-     `wchar.h' (ISO):  *note Formatted Output Functions::.
-
-`WRDE_APPEND'
-     `wordexp.h' (POSIX.2):  *note Flags for Wordexp::.
-
-`WRDE_BADCHAR'
-     `wordexp.h' (POSIX.2):  *note Calling Wordexp::.
-
-`WRDE_BADVAL'
-     `wordexp.h' (POSIX.2):  *note Calling Wordexp::.
-
-`WRDE_CMDSUB'
-     `wordexp.h' (POSIX.2):  *note Calling Wordexp::.
-
-`WRDE_DOOFFS'
-     `wordexp.h' (POSIX.2):  *note Flags for Wordexp::.
-
-`WRDE_NOCMD'
-     `wordexp.h' (POSIX.2):  *note Flags for Wordexp::.
-
-`WRDE_NOSPACE'
-     `wordexp.h' (POSIX.2):  *note Calling Wordexp::.
-
-`WRDE_REUSE'
-     `wordexp.h' (POSIX.2):  *note Flags for Wordexp::.
-
-`WRDE_SHOWERR'
-     `wordexp.h' (POSIX.2):  *note Flags for Wordexp::.
-
-`WRDE_SYNTAX'
-     `wordexp.h' (POSIX.2):  *note Calling Wordexp::.
-
-`WRDE_UNDEF'
-     `wordexp.h' (POSIX.2):  *note Flags for Wordexp::.
-
-`ssize_t write (int FILEDES, const void *BUFFER, size_t SIZE)'
-     `unistd.h' (POSIX.1):  *note I/O Primitives::.
-
-`ssize_t writev (int FILEDES, const struct iovec *VECTOR, int COUNT)'
-     `sys/uio.h' (BSD):  *note Scatter-Gather::.
-
-`int wscanf (const wchar_t *TEMPLATE, ...)'
-     `wchar.h' (ISO):  *note Formatted Input Functions::.
-
-`int WSTOPSIG (int STATUS)'
-     `sys/wait.h' (POSIX.1):  *note Process Completion Status::.
-
-`int WTERMSIG (int STATUS)'
-     `sys/wait.h' (POSIX.1):  *note Process Completion Status::.
-
-`int X_OK'
-     `unistd.h' (POSIX.1):  *note Testing File Access::.
-
-`_XOPEN_SOURCE'
-     (X/Open):  *note Feature Test Macros::.
-
-`_XOPEN_SOURCE_EXTENDED'
-     (X/Open):  *note Feature Test Macros::.
-
-`double y0 (double X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`float y0f (float X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`long double y0l (long double X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`double y1 (double X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`float y1f (float X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`long double y1l (long double X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`double yn (int N, double X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`float ynf (int N, float X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-`long double ynl (int N, long double X)'
-     `math.h' (SVID):  *note Special Functions::.
-
-
-
-File: libc.info,  Node: Installation,  Next: Maintenance,  Prev: Library Summary,  Up: Top
-
-Appendix C Installing the GNU C Library
-***************************************
-
-Before you do anything else, you should read the FAQ at
-`http://sourceware.org/glibc/wiki/FAQ'.  It answers common questions
-and describes problems you may experience with compilation and
-installation.
-
-   Features can be added to the GNU C Library via "add-on" bundles.
-These are separate tar files, which you unpack into the top level of
-the source tree.  Then you give `configure' the `--enable-add-ons'
-option to activate them, and they will be compiled into the library.
-
-   You will need recent versions of several GNU tools: definitely GCC
-and GNU Make, and possibly others.  *Note Tools for Compilation::,
-below.
+These example programs demonstrate the basic usage of argp.
 
 * Menu:
 
-* Configuring and compiling::   How to compile and test GNU libc.
-* Running make install::        How to install it once you've got it
- compiled.
-* Tools for Compilation::       You'll need these first.
-* Linux::                       Specific advice for GNU/Linux systems.
-* Reporting Bugs::              So they'll get fixed.
+* 1: Argp Example 1.            A minimal program using argp.
+* 2: Argp Example 2.            A program using only default options.
+* 3: Argp Example 3.            A simple program with user options.
+* 4: Argp Example 4.            Combining multiple argp parsers.
 
 
-File: libc.info,  Node: Configuring and compiling,  Next: Running make install,  Up: Installation
+File: libc.info,  Node: Argp Example 1,  Next: Argp Example 2,  Up: Argp Examples
 
-C.1 Configuring and compiling the GNU C Library
-===============================================
+25.3.11.1 A Minimal Program Using Argp
+......................................
 
-The GNU C Library cannot be compiled in the source directory.  You must
-build it in a separate build directory.  For example, if you have
-unpacked the GNU C Library sources in `/src/gnu/glibc-VERSION', create
-a directory `/src/gnu/glibc-build' to put the object files in.  This
-allows removing the whole build directory in case an error occurs,
-which is the safest way to get a fresh start and should always be done.
+This is perhaps the smallest program possible that uses argp.  It won't
+do much except give an error messages and exit when there are any
+arguments, and prints a rather pointless message for '--help'.
 
-   From your object directory, run the shell script `configure' located
-at the top level of the source tree.  In the scenario above, you'd type
 
-     $ ../glibc-VERSION/configure ARGS...
+     /* This is (probably) the smallest possible program that
+        uses argp.  It won't do much except give an error
+        messages and exit when there are any arguments, and print
+        a (rather pointless) messages for -help. */
 
-   Please note that even though you're building in a separate build
-directory, the compilation may need to create or modify files and
-directories in the source directory.
+     #include <stdlib.h>
+     #include <argp.h>
 
-`configure' takes many options, but the only one that is usually
-mandatory is `--prefix'.  This option tells `configure' where you want
-the GNU C Library installed.  This defaults to `/usr/local', but the
-normal setting to install as the standard system library is
-`--prefix=/usr' for GNU/Linux systems and `--prefix=' (an empty prefix)
-for GNU/Hurd systems.
-
-   It may also be useful to set the CC and CFLAGS variables in the
-environment when running `configure'.  CC selects the C compiler that
-will be used, and CFLAGS sets optimization options for the compiler.
-
-   The following list describes all of the available options for
-`configure':
-
-`--prefix=DIRECTORY'
-     Install machine-independent data files in subdirectories of
-     `DIRECTORY'.  The default is to install in `/usr/local'.
-
-`--exec-prefix=DIRECTORY'
-     Install the library and other machine-dependent files in
-     subdirectories of `DIRECTORY'.  The default is to the `--prefix'
-     directory if that option is specified, or `/usr/local' otherwise.
-
-`--with-headers=DIRECTORY'
-     Look for kernel header files in DIRECTORY, not `/usr/include'.
-     The GNU C Library needs information from the kernel's header files
-     describing the interface to the kernel.  The GNU C Library will
-     normally look in `/usr/include' for them, but if you specify this
-     option, it will look in DIRECTORY instead.
-
-     This option is primarily of use on a system where the headers in
-     `/usr/include' come from an older version of the GNU C Library.
-     Conflicts can occasionally happen in this case.  You can also use
-     this option if you want to compile the GNU C Library with a newer
-     set of kernel headers than the ones found in `/usr/include'.
-
-`--enable-add-ons[=LIST]'
-     Specify add-on packages to include in the build.  If this option is
-     specified with no list, it enables all the add-on packages it
-     finds in the main source directory; this is the default behavior.
-     You may specify an explicit list of add-ons to use in LIST,
-     separated by spaces or commas (if you use spaces, remember to
-     quote them from the shell).  Each add-on in LIST can be an
-     absolute directory name or can be a directory name relative to the
-     main source directory, or relative to the build directory (that
-     is, the current working directory).  For example,
-     `--enable-add-ons=nptl,../glibc-libidn-VERSION'.
-
-`--enable-kernel=VERSION'
-     This option is currently only useful on GNU/Linux systems.  The
-     VERSION parameter should have the form X.Y.Z and describes the
-     smallest version of the Linux kernel the generated library is
-     expected to support.  The higher the VERSION number is, the less
-     compatibility code is added, and the faster the code gets.
-
-`--with-binutils=DIRECTORY'
-     Use the binutils (assembler and linker) in `DIRECTORY', not the
-     ones the C compiler would default to.  You can use this option if
-     the default binutils on your system cannot deal with all the
-     constructs in the GNU C Library.  In that case, `configure' will
-     detect the problem and suppress these constructs, so that the
-     library will still be usable, but functionality may be lost--for
-     example, you can't build a shared libc with old binutils.
-
-`--without-fp'
-     Use this option if your computer lacks hardware floating-point
-     support and your operating system does not emulate an FPU.
-
-`--disable-shared'
-     Don't build shared libraries even if it is possible.  Not all
-     systems support shared libraries; you need ELF support and
-     (currently) the GNU linker.
-
-`--disable-profile'
-     Don't build libraries with profiling information.  You may want to
-     use this option if you don't plan to do profiling.
-
-`--enable-static-nss'
-     Compile static versions of the NSS (Name Service Switch) libraries.
-     This is not recommended because it defeats the purpose of NSS; a
-     program linked statically with the NSS libraries cannot be
-     dynamically reconfigured to use a different name database.
-
-`--without-tls'
-     By default the C library is built with support for thread-local
-     storage if the used tools support it.  By using `--without-tls'
-     this can be prevented though there generally is no reason since it
-     creates compatibility problems.
-
-`--enable-hardcoded-path-in-tests'
-     By default, dynamic tests are linked to run with the installed C
-     library.  This option hardcodes the newly built C library path in
-     dynamic tests so that they can be invoked directly.
-
-`--enable-lock-elision=yes'
-     Enable lock elision for pthread mutexes by default.
-
-`--enable-pt_chown'
-     The file `pt_chown' is a helper binary for `grantpt' (*note
-     Pseudo-Terminals: Allocation.) that is installed setuid root to
-     fix up pseudo-terminal ownership.  It is not built by default
-     because systems using the Linux kernel are commonly built with the
-     `devpts' filesystem enabled and mounted at `/dev/pts', which
-     manages pseudo-terminal ownership automatically.  By using
-     `--enable-pt_chown', you may build `pt_chown' and install it
-     setuid and owned by `root'.  The use of `pt_chown' introduces
-     additional security risks to the system and you should enable it
-     only if you understand and accept those risks.
-
-`--build=BUILD-SYSTEM'
-`--host=HOST-SYSTEM'
-     These options are for cross-compiling.  If you specify both
-     options and BUILD-SYSTEM is different from HOST-SYSTEM, `configure'
-     will prepare to cross-compile the GNU C Library from BUILD-SYSTEM
-     to be used on HOST-SYSTEM.  You'll probably need the
-     `--with-headers' option too, and you may have to override
-     CONFIGURE's selection of the compiler and/or binutils.
-
-     If you only specify `--host', `configure' will prepare for a
-     native compile but use what you specify instead of guessing what
-     your system is. This is most useful to change the CPU submodel.
-     For example, if `configure' guesses your machine as
-     `i686-pc-linux-gnu' but you want to compile a library for 586es,
-     give `--host=i586-pc-linux-gnu' or just `--host=i586-linux' and add
-     the appropriate compiler flags (`-mcpu=i586' will do the trick) to
-     CFLAGS.
-
-     If you specify just `--build', `configure' will get confused.
-
-`--with-pkgversion=VERSION'
-     Specify a description, possibly including a build number or build
-     date, of the binaries being built, to be included in `--version'
-     output from programs installed with the GNU C Library.  For
-     example, `--with-pkgversion='FooBar GNU/Linux glibc build 123''.
-     The default value is `GNU libc'.
-
-`--with-bugurl=URL'
-     Specify the URL that users should visit if they wish to report a
-     bug, to be included in `--help' output from programs installed with
-     the GNU C Library.  The default value refers to the main
-     bug-reporting information for the GNU C Library.
-
-   To build the library and related programs, type `make'.  This will
-produce a lot of output, some of which may look like errors from `make'
-but isn't.  Look for error messages from `make' containing `***'.
-Those indicate that something is seriously wrong.
-
-   The compilation process can take a long time, depending on the
-configuration and the speed of your machine.  Some complex modules may
-take a very long time to compile, as much as several minutes on slower
-machines.  Do not panic if the compiler appears to hang.
-
-   If you want to run a parallel make, simply pass the `-j' option with
-an appropriate numeric parameter to `make'.  You need a recent GNU
-`make' version, though.
-
-   To build and run test programs which exercise some of the library
-facilities, type `make check'.  If it does not complete successfully,
-do not use the built library, and report a bug after verifying that the
-problem is not already known.  *Note Reporting Bugs::, for instructions
-on reporting bugs.  Note that some of the tests assume they are not
-being run by `root'.  We recommend you compile and test the GNU C
-Library as an unprivileged user.
-
-   Before reporting bugs make sure there is no problem with your system.
-The tests (and later installation) use some pre-existing files of the
-system such as `/etc/passwd', `/etc/nsswitch.conf' and others.  These
-files must all contain correct and sensible content.
-
-   To format the `GNU C Library Reference Manual' for printing, type
-`make dvi'.  You need a working TeX installation to do this.  The
-distribution builds the on-line formatted version of the manual, as
-Info files, as part of the build process.  You can build them manually
-with `make info'.
-
-   The library has a number of special-purpose configuration parameters
-which you can find in `Makeconfig'.  These can be overwritten with the
-file `configparms'.  To change them, create a `configparms' in your
-build directory and add values as appropriate for your system.  The
-file is included and parsed by `make' and has to follow the conventions
-for makefiles.
-
-   It is easy to configure the GNU C Library for cross-compilation by
-setting a few variables in `configparms'.  Set `CC' to the
-cross-compiler for the target you configured the library for; it is
-important to use this same `CC' value when running `configure', like
-this: `CC=TARGET-gcc configure TARGET'.  Set `BUILD_CC' to the compiler
-to use for programs run on the build system as part of compiling the
-library.  You may need to set `AR' to cross-compiling versions of `ar'
-if the native tools are not configured to work with object files for
-the target you configured for.  When cross-compiling the GNU C Library,
-it may be tested using `make check
-test-wrapper="SRCDIR/scripts/cross-test-ssh.sh HOSTNAME"', where SRCDIR
-is the absolute directory name for the main source directory and
-HOSTNAME is the host name of a system that can run the newly built
-binaries of the GNU C Library.  The source and build directories must
-be visible at the same locations on both the build system and HOSTNAME.
-
-   In general, when testing the GNU C Library, `test-wrapper' may be set
-to the name and arguments of any program to run newly built binaries.
-This program must preserve the arguments to the binary being run, its
-working directory, all environment variables set as part of testing and
-the standard input, output and error file descriptors.  If
-`TEST-WRAPPER env' will not work to run a program with environment
-variables set, then `test-wrapper-env' must be set to a program that
-runs a newly built program with environment variable assignments in
-effect, those assignments being specified as `VAR=VALUE' before the
-name of the program to be run.
+     int
+     main (int argc, char **argv)
+     {
+       argp_parse (0, argc, argv, 0, 0, 0);
+       exit (0);
+     }
 
 
-File: libc.info,  Node: Running make install,  Next: Tools for Compilation,  Prev: Configuring and compiling,  Up: Installation
+File: libc.info,  Node: Argp Example 2,  Next: Argp Example 3,  Prev: Argp Example 1,  Up: Argp Examples
 
-C.2 Installing the C Library
-============================
+25.3.11.2 A Program Using Argp with Only Default Options
+........................................................
 
-To install the library and its header files, and the Info files of the
-manual, type `env LANGUAGE=C LC_ALL=C make install'.  This will build
-things, if necessary, before installing them; however, you should still
-compile everything first.  If you are installing the GNU C Library as
-your primary C library, we recommend that you shut the system down to
-single-user mode first, and reboot afterward.  This minimizes the risk
-of breaking things when the library changes out from underneath.
+This program doesn't use any options or arguments, it uses argp to be
+compliant with the GNU standard command line format.
 
-   `make install' will do the entire job of upgrading from a previous
-installation of the GNU C Library version 2.x.  There may sometimes be
-headers left behind from the previous installation, but those are
-generally harmless.  If you want to avoid leaving headers behind you
-can do things in the following order.
+   In addition to giving no arguments and implementing a '--help'
+option, this example has a '--version' option, which will put the given
+documentation string and bug address in the '--help' output, as per GNU
+standards.
 
-   You must first build the library (`make'), optionally check it
-(`make check'), switch the include directories and then install (`make
-install').  The steps must be done in this order.  Not moving the
-directory before install will result in an unusable mixture of header
-files from both libraries, but configuring, building, and checking the
-library requires the ability to compile and run programs against the old
-library.  The new `/usr/include', after switching the include
-directories and before installing the library should contain the Linux
-headers, but nothing else.  If you do this, you will need to restore
-any headers from libraries other than the GNU C Library yourself after
-installing the library.
+   The variable 'argp' contains the argument parser specification.
+Adding fields to this structure is the way most parameters are passed to
+'argp_parse'.  The first three fields are normally used, but they are
+not in this small program.  There are also two global variables that
+argp can use defined here, 'argp_program_version' and
+'argp_program_bug_address'.  They are considered global variables
+because they will almost always be constant for a given program, even if
+they use different argument parsers for various tasks.
 
-   You can install the GNU C Library somewhere other than where you
-configured it to go by setting the `install_root' variable on the
-command line for `make install'.  The value of this variable is
-prepended to all the paths for installation.  This is useful when
-setting up a chroot environment or preparing a binary distribution.
-The directory should be specified with an absolute file name.
 
-   The GNU C Library includes a daemon called `nscd', which you may or
-may not want to run.  `nscd' caches name service lookups; it can
-dramatically improve performance with NIS+, and may help with DNS as
-well.
+     /* This program doesn't use any options or arguments, but uses
+        argp to be compliant with the GNU standard command line
+        format.
 
-   One auxiliary program, `/usr/libexec/pt_chown', is installed setuid
-`root' if the `--enable-pt_chown' configuration option is used.  This
-program is invoked by the `grantpt' function; it sets the permissions
-on a pseudoterminal so it can be used by the calling process.  If you
-are using a Linux kernel with the `devpts' filesystem enabled and
-mounted at `/dev/pts', you don't need this program.
+        In addition to making sure no arguments are given, and
+        implementing a -help option, this example will have a
+        -version option, and will put the given documentation string
+        and bug address in the -help output, as per GNU standards.
 
-   After installation you might want to configure the timezone and
-locale installation of your system.  The GNU C Library comes with a
-locale database which gets configured with `localedef'.  For example, to
-set up a German locale with name `de_DE', simply issue the command
-`localedef -i de_DE -f ISO-8859-1 de_DE'.  To configure all locales
-that are supported by the GNU C Library, you can issue from your build
-directory the command `make localedata/install-locales'.
+        The variable ARGP contains the argument parser specification;
+        adding fields to this structure is the way most parameters are
+        passed to argp_parse (the first three fields are usually used,
+        but not in this small program).  There are also two global
+        variables that argp knows about defined here,
+        ARGP_PROGRAM_VERSION and ARGP_PROGRAM_BUG_ADDRESS (they are
+        global variables because they will almost always be constant
+        for a given program, even if it uses different argument
+        parsers for various tasks). */
 
-   To configure the locally used timezone, set the `TZ' environment
-variable.  The script `tzselect' helps you to select the right value.
-As an example, for Germany, `tzselect' would tell you to use
-`TZ='Europe/Berlin''.  For a system wide installation (the given paths
-are for an installation with `--prefix=/usr'), link the timezone file
-which is in `/usr/share/zoneinfo' to the file `/etc/localtime'.  For
-Germany, you might execute `ln -s /usr/share/zoneinfo/Europe/Berlin
-/etc/localtime'.
+     #include <stdlib.h>
+     #include <argp.h>
+
+     const char *argp_program_version =
+       "argp-ex2 1.0";
+     const char *argp_program_bug_address =
+       "<bug-gnu-utils@gnu.org>";
+
+     /* Program documentation. */
+     static char doc[] =
+       "Argp example #2 -- a pretty minimal program using argp";
+
+     /* Our argument parser.  The 'options', 'parser', and
+        'args_doc' fields are zero because we have neither options or
+        arguments; 'doc' and 'argp_program_bug_address' will be
+        used in the output for '--help', and the '--version'
+        option will print out 'argp_program_version'. */
+     static struct argp argp = { 0, 0, 0, doc };
+
+     int
+     main (int argc, char **argv)
+     {
+       argp_parse (&argp, argc, argv, 0, 0, 0);
+       exit (0);
+     }
 
 
-File: libc.info,  Node: Tools for Compilation,  Next: Linux,  Prev: Running make install,  Up: Installation
+File: libc.info,  Node: Argp Example 3,  Next: Argp Example 4,  Prev: Argp Example 2,  Up: Argp Examples
 
-C.3 Recommended Tools for Compilation
-=====================================
+25.3.11.3 A Program Using Argp with User Options
+................................................
 
-We recommend installing the following GNU tools before attempting to
-build the GNU C Library:
+This program uses the same features as example 2, adding user options
+and arguments.
 
-   * GNU `make' 3.79 or newer
+   We now use the first four fields in 'argp' (*note Argp Parsers::) and
+specify 'parse_opt' as the parser function.  *Note Argp Parser
+Functions::.
 
-     You need the latest version of GNU `make'.  Modifying the GNU C
-     Library to work with other `make' programs would be so difficult
-     that we recommend you port GNU `make' instead.  *Really.*  We
-     recommend GNU `make' version 3.79.  All earlier versions have
-     severe bugs or lack features.
-
-   * GCC 4.4 or newer, GCC 4.6 recommended
-
-     GCC 4.4 or higher is required; as of this writing, GCC 4.6 is the
-     compiler we advise to use to build the GNU C Library.
-
-     You can use whatever compiler you like to compile programs that use
-     the GNU C Library.
-
-     Check the FAQ for any special compiler issues on particular
-     platforms.
-
-   * GNU `binutils' 2.20 or later
-
-     You must use GNU `binutils' (as and ld) to build the GNU C Library.
-     No other assembler or linker has the necessary functionality at the
-     moment.
-
-   * GNU `texinfo' 4.5 or later
-
-     To correctly translate and install the Texinfo documentation you
-     need this version of the `texinfo' package.  Earlier versions do
-     not understand all the tags used in the document, and the
-     installation mechanism for the info files is not present or works
-     differently.
-
-   * GNU `awk' 3.1.2, or higher
-
-     `awk' is used in several places to generate files.  Some `gawk'
-     extensions are used, including the `asorti' function, which was
-     introduced in version 3.1.2 of `gawk'.
-
-   * Perl 5
-
-     Perl is not required, but it is used if present to test the
-     installation.  We may decide to use it elsewhere in the future.
-
-   * GNU `sed' 3.02 or newer
-
-     `Sed' is used in several places to generate files.  Most scripts
-     work with any version of `sed'.  The known exception is the script
-     `po2test.sed' in the `intl' subdirectory which is used to generate
-     `msgs.h' for the test suite.  This script works correctly only
-     with GNU `sed' 3.02.  If you like to run the test suite, you
-     should definitely upgrade `sed'.
+   Note that in this example, 'main' uses a structure to communicate
+with the 'parse_opt' function, a pointer to which it passes in the
+'input' argument to 'argp_parse'.  *Note Argp::.  It is retrieved by
+'parse_opt' through the 'input' field in its 'state' argument.  *Note
+Argp Parsing State::.  Of course, it's also possible to use global
+variables instead, but using a structure like this is somewhat more
+flexible and clean.
 
 
-If you change any of the `configure.ac' files you will also need
+     /* This program uses the same features as example 2, and uses options and
+        arguments.
 
-   * GNU `autoconf' 2.53 or higher
+        We now use the first four fields in ARGP, so here's a description of them:
+          OPTIONS  - A pointer to a vector of struct argp_option (see below)
+          PARSER   - A function to parse a single option, called by argp
+          ARGS_DOC - A string describing how the non-option arguments should look
+          DOC      - A descriptive string about this program; if it contains a
+                      vertical tab character (\v), the part after it will be
+                      printed *following* the options
 
-and if you change any of the message translation files you will need
+        The function PARSER takes the following arguments:
+          KEY  - An integer specifying which option this is (taken
+                  from the KEY field in each struct argp_option), or
+                  a special key specifying something else; the only
+                  special keys we use here are ARGP_KEY_ARG, meaning
+                  a non-option argument, and ARGP_KEY_END, meaning
+                  that all arguments have been parsed
+          ARG  - For an option KEY, the string value of its
+                  argument, or NULL if it has none
+          STATE- A pointer to a struct argp_state, containing
+                  various useful information about the parsing state; used here
+                  are the INPUT field, which reflects the INPUT argument to
+                  argp_parse, and the ARG_NUM field, which is the number of the
+                  current non-option argument being parsed
+        It should return either 0, meaning success, ARGP_ERR_UNKNOWN, meaning the
+        given KEY wasn't recognized, or an errno value indicating some other
+        error.
 
-   * GNU `gettext' 0.10.36 or later
+        Note that in this example, main uses a structure to communicate with the
+        parse_opt function, a pointer to which it passes in the INPUT argument to
+        argp_parse.  Of course, it's also possible to use global variables
+        instead, but this is somewhat more flexible.
 
-You may also need these packages if you upgrade your source tree using
-patches, although we try to avoid this.
+        The OPTIONS field contains a pointer to a vector of struct argp_option's;
+        that structure has the following fields (if you assign your option
+        structures using array initialization like this example, unspecified
+        fields will be defaulted to 0, and need not be specified):
+          NAME   - The name of this option's long option (may be zero)
+          KEY    - The KEY to pass to the PARSER function when parsing this option,
+                    *and* the name of this option's short option, if it is a
+                    printable ascii character
+          ARG    - The name of this option's argument, if any
+          FLAGS  - Flags describing this option; some of them are:
+                      OPTION_ARG_OPTIONAL - The argument to this option is optional
+                      OPTION_ALIAS        - This option is an alias for the
+                                             previous option
+                      OPTION_HIDDEN       - Don't show this option in -help output
+          DOC    - A documentation string for this option, shown in -help output
+
+        An options vector should be terminated by an option with all fields zero. */
+
+     #include <stdlib.h>
+     #include <argp.h>
+
+     const char *argp_program_version =
+       "argp-ex3 1.0";
+     const char *argp_program_bug_address =
+       "<bug-gnu-utils@gnu.org>";
+
+     /* Program documentation. */
+     static char doc[] =
+       "Argp example #3 -- a program with options and arguments using argp";
+
+     /* A description of the arguments we accept. */
+     static char args_doc[] = "ARG1 ARG2";
+
+     /* The options we understand. */
+     static struct argp_option options[] = {
+       {"verbose",  'v', 0,      0,  "Produce verbose output" },
+       {"quiet",    'q', 0,      0,  "Don't produce any output" },
+       {"silent",   's', 0,      OPTION_ALIAS },
+       {"output",   'o', "FILE", 0,
+        "Output to FILE instead of standard output" },
+       { 0 }
+     };
+
+     /* Used by 'main' to communicate with 'parse_opt'. */
+     struct arguments
+     {
+       char *args[2];                /* ARG1 & ARG2 */
+       int silent, verbose;
+       char *output_file;
+     };
+
+     /* Parse a single option. */
+     static error_t
+     parse_opt (int key, char *arg, struct argp_state *state)
+     {
+       /* Get the INPUT argument from 'argp_parse', which we
+          know is a pointer to our arguments structure. */
+       struct arguments *arguments = state->input;
+
+       switch (key)
+         {
+         case 'q': case 's':
+           arguments->silent = 1;
+           break;
+         case 'v':
+           arguments->verbose = 1;
+           break;
+         case 'o':
+           arguments->output_file = arg;
+           break;
+
+         case ARGP_KEY_ARG:
+           if (state->arg_num >= 2)
+             /* Too many arguments. */
+             argp_usage (state);
+
+           arguments->args[state->arg_num] = arg;
+
+           break;
+
+         case ARGP_KEY_END:
+           if (state->arg_num < 2)
+             /* Not enough arguments. */
+             argp_usage (state);
+           break;
+
+         default:
+           return ARGP_ERR_UNKNOWN;
+         }
+       return 0;
+     }
+
+     /* Our argp parser. */
+     static struct argp argp = { options, parse_opt, args_doc, doc };
+
+     int
+     main (int argc, char **argv)
+     {
+       struct arguments arguments;
+
+       /* Default values. */
+       arguments.silent = 0;
+       arguments.verbose = 0;
+       arguments.output_file = "-";
+
+       /* Parse our arguments; every option seen by 'parse_opt' will
+          be reflected in 'arguments'. */
+       argp_parse (&argp, argc, argv, 0, 0, &arguments);
+
+       printf ("ARG1 = %s\nARG2 = %s\nOUTPUT_FILE = %s\n"
+               "VERBOSE = %s\nSILENT = %s\n",
+               arguments.args[0], arguments.args[1],
+               arguments.output_file,
+               arguments.verbose ? "yes" : "no",
+               arguments.silent ? "yes" : "no");
+
+       exit (0);
+     }
 
 
-File: libc.info,  Node: Linux,  Next: Reporting Bugs,  Prev: Tools for Compilation,  Up: Installation
+File: libc.info,  Node: Argp Example 4,  Prev: Argp Example 3,  Up: Argp Examples
 
-C.4 Specific advice for GNU/Linux systems
-=========================================
+25.3.11.4 A Program Using Multiple Combined Argp Parsers
+........................................................
 
-If you are installing the GNU C Library on GNU/Linux systems, you need
-to have the header files from a 2.6.19.1 or newer kernel around for
-reference.  These headers must be installed using `make
-headers_install'; the headers present in the kernel source directory
-are not suitable for direct use by the GNU C Library.  You do not need
-to use that kernel, just have its headers installed where the GNU C
-Library can access them, referred to here as INSTALL-DIRECTORY.  The
-easiest way to do this is to unpack it in a directory such as
-`/usr/src/linux-VERSION'.  In that directory, run `make headers_install
-INSTALL_HDR_PATH=INSTALL-DIRECTORY'.  Finally, configure the GNU C
-Library with the option `--with-headers=INSTALL-DIRECTORY/include'.
-Use the most recent kernel you can get your hands on.  (If you are
-cross-compiling the GNU C Library, you need to specify
-`ARCH=ARCHITECTURE' in the `make headers_install' command, where
-ARCHITECTURE is the architecture name used by the Linux kernel, such as
-`x86' or `powerpc'.)
+This program uses the same features as example 3, but has more options,
+and presents more structure in the '--help' output.  It also illustrates
+how you can 'steal' the remainder of the input arguments past a certain
+point for programs that accept a list of items.  It also illustrates the
+KEY value 'ARGP_KEY_NO_ARGS', which is only given if no non-option
+arguments were supplied to the program.  *Note Argp Special Keys::.
 
-   After installing the GNU C Library, you may need to remove or rename
-directories such as `/usr/include/linux' and `/usr/include/asm', and
-replace them with copies of directories such as `linux' and `asm' from
-`INSTALL-DIRECTORY/include'.  All directories present in
-`INSTALL-DIRECTORY/include' should be copied, except that the GNU C
-Library provides its own version of `/usr/include/scsi'; the files
-provided by the kernel should be copied without replacing those
-provided by the GNU C Library.  The `linux', `asm' and `asm-generic'
-directories are required to compile programs using the GNU C Library;
-the other directories describe interfaces to the kernel but are not
-required if not compiling programs using those interfaces.  You do not
-need to copy kernel headers if you did not specify an alternate kernel
-header source using `--with-headers'.
+   For structuring help output, two features are used: _headers_ and a
+two part option string.  The _headers_ are entries in the options
+vector.  *Note Argp Option Vectors::.  The first four fields are zero.
+The two part documentation string are in the variable 'doc', which
+allows documentation both before and after the options.  *Note Argp
+Parsers::, the two parts of 'doc' are separated by a vertical-tab
+character (''\v'', or ''\013'').  By convention, the documentation
+before the options is a short string stating what the program does, and
+after any options it is longer, describing the behavior in more detail.
+All documentation strings are automatically filled for output, although
+newlines may be included to force a line break at a particular point.
+In addition, documentation strings are passed to the 'gettext' function,
+for possible translation into the current locale.
 
-   The Filesystem Hierarchy Standard for GNU/Linux systems expects some
-components of the GNU C Library installation to be in `/lib' and some
-in `/usr/lib'.  This is handled automatically if you configure the GNU
-C Library with `--prefix=/usr'.  If you set some other prefix or allow
-it to default to `/usr/local', then all the components are installed
-there.
+
+     /* This program uses the same features as example 3, but has more
+        options, and somewhat more structure in the -help output.  It
+        also shows how you can 'steal' the remainder of the input
+        arguments past a certain point, for programs that accept a
+        list of items.  It also shows the special argp KEY value
+        ARGP_KEY_NO_ARGS, which is only given if no non-option
+        arguments were supplied to the program.
+
+        For structuring the help output, two features are used,
+        *headers* which are entries in the options vector with the
+        first four fields being zero, and a two part documentation
+        string (in the variable DOC), which allows documentation both
+        before and after the options; the two parts of DOC are
+        separated by a vertical-tab character ('\v', or '\013').  By
+        convention, the documentation before the options is just a
+        short string saying what the program does, and that afterwards
+        is longer, describing the behavior in more detail.  All
+        documentation strings are automatically filled for output,
+        although newlines may be included to force a line break at a
+        particular point.  All documentation strings are also passed to
+        the 'gettext' function, for possible translation into the
+        current locale. */
+
+     #include <stdlib.h>
+     #include <error.h>
+     #include <argp.h>
+
+     const char *argp_program_version =
+       "argp-ex4 1.0";
+     const char *argp_program_bug_address =
+       "<bug-gnu-utils@prep.ai.mit.edu>";
+
+     /* Program documentation. */
+     static char doc[] =
+       "Argp example #4 -- a program with somewhat more complicated\
+     options\
+     \vThis part of the documentation comes *after* the options;\
+      note that the text is automatically filled, but it's possible\
+      to force a line-break, e.g.\n<-- here.";
+
+     /* A description of the arguments we accept. */
+     static char args_doc[] = "ARG1 [STRING...]";
+
+     /* Keys for options without short-options. */
+     #define OPT_ABORT  1            /* -abort */
+
+     /* The options we understand. */
+     static struct argp_option options[] = {
+       {"verbose",  'v', 0,       0, "Produce verbose output" },
+       {"quiet",    'q', 0,       0, "Don't produce any output" },
+       {"silent",   's', 0,       OPTION_ALIAS },
+       {"output",   'o', "FILE",  0,
+        "Output to FILE instead of standard output" },
+
+       {0,0,0,0, "The following options should be grouped together:" },
+       {"repeat",   'r', "COUNT", OPTION_ARG_OPTIONAL,
+        "Repeat the output COUNT (default 10) times"},
+       {"abort",    OPT_ABORT, 0, 0, "Abort before showing any output"},
+
+       { 0 }
+     };
+
+     /* Used by 'main' to communicate with 'parse_opt'. */
+     struct arguments
+     {
+       char *arg1;                   /* ARG1 */
+       char **strings;               /* [STRING...] */
+       int silent, verbose, abort;   /* '-s', '-v', '--abort' */
+       char *output_file;            /* FILE arg to '--output' */
+       int repeat_count;             /* COUNT arg to '--repeat' */
+     };
+
+     /* Parse a single option. */
+     static error_t
+     parse_opt (int key, char *arg, struct argp_state *state)
+     {
+       /* Get the 'input' argument from 'argp_parse', which we
+          know is a pointer to our arguments structure. */
+       struct arguments *arguments = state->input;
+
+       switch (key)
+         {
+         case 'q': case 's':
+           arguments->silent = 1;
+           break;
+         case 'v':
+           arguments->verbose = 1;
+           break;
+         case 'o':
+           arguments->output_file = arg;
+           break;
+         case 'r':
+           arguments->repeat_count = arg ? atoi (arg) : 10;
+           break;
+         case OPT_ABORT:
+           arguments->abort = 1;
+           break;
+
+         case ARGP_KEY_NO_ARGS:
+           argp_usage (state);
+
+         case ARGP_KEY_ARG:
+           /* Here we know that 'state->arg_num == 0', since we
+              force argument parsing to end before any more arguments can
+              get here. */
+           arguments->arg1 = arg;
+
+           /* Now we consume all the rest of the arguments.
+              'state->next' is the index in 'state->argv' of the
+              next argument to be parsed, which is the first STRING
+              we're interested in, so we can just use
+              '&state->argv[state->next]' as the value for
+              arguments->strings.
+
+              _In addition_, by setting 'state->next' to the end
+              of the arguments, we can force argp to stop parsing here and
+              return. */
+           arguments->strings = &state->argv[state->next];
+           state->next = state->argc;
+
+           break;
+
+         default:
+           return ARGP_ERR_UNKNOWN;
+         }
+       return 0;
+     }
+
+     /* Our argp parser. */
+     static struct argp argp = { options, parse_opt, args_doc, doc };
+
+     int
+     main (int argc, char **argv)
+     {
+       int i, j;
+       struct arguments arguments;
+
+       /* Default values. */
+       arguments.silent = 0;
+       arguments.verbose = 0;
+       arguments.output_file = "-";
+       arguments.repeat_count = 1;
+       arguments.abort = 0;
+
+       /* Parse our arguments; every option seen by 'parse_opt' will be
+          reflected in 'arguments'. */
+       argp_parse (&argp, argc, argv, 0, 0, &arguments);
+
+       if (arguments.abort)
+         error (10, 0, "ABORTED");
+
+       for (i = 0; i < arguments.repeat_count; i++)
+         {
+           printf ("ARG1 = %s\n", arguments.arg1);
+           printf ("STRINGS = ");
+           for (j = 0; arguments.strings[j]; j++)
+             printf (j == 0 ? "%s" : ", %s", arguments.strings[j]);
+           printf ("\n");
+           printf ("OUTPUT_FILE = %s\nVERBOSE = %s\nSILENT = %s\n",
+                   arguments.output_file,
+                   arguments.verbose ? "yes" : "no",
+                   arguments.silent ? "yes" : "no");
+         }
+
+       exit (0);
+     }
 
 
-File: libc.info,  Node: Reporting Bugs,  Prev: Linux,  Up: Installation
+File: libc.info,  Node: Argp User Customization,  Prev: Argp Examples,  Up: Argp
 
-C.5 Reporting Bugs
-==================
+25.3.12 Argp User Customization
+-------------------------------
 
-There are probably bugs in the GNU C Library.  There are certainly
-errors and omissions in this manual.  If you report them, they will get
-fixed.  If you don't, no one will ever know about them and they will
-remain unfixed for all eternity, if not longer.
+The formatting of argp '--help' output may be controlled to some extent
+by a program's users, by setting the 'ARGP_HELP_FMT' environment
+variable to a comma-separated list of tokens.  Whitespace is ignored:
 
-   It is a good idea to verify that the problem has not already been
-reported.  Bugs are documented in two places: The file `BUGS' describes
-a number of well known bugs and the central GNU C Library bug tracking
-system has a WWW interface at `http://sourceware.org/bugzilla/'.  The
-WWW interface gives you access to open and closed reports.  A closed
-report normally includes a patch or a hint on solving the problem.
+'dup-args'
+'no-dup-args'
+     These turn "duplicate-argument-mode" on or off.  In duplicate
+     argument mode, if an option that accepts an argument has multiple
+     names, the argument is shown for each name.  Otherwise, it is only
+     shown for the first long option.  A note is subsequently printed so
+     the user knows that it applies to other names as well.  The default
+     is 'no-dup-args', which is less consistent, but prettier.
 
-   To report a bug, first you must find it.  With any luck, this will
-be the hard part.  Once you've found a bug, make sure it's really a
-bug.  A good way to do this is to see if the GNU C Library behaves the
-same way some other C library does.  If so, probably you are wrong and
-the libraries are right (but not necessarily).  If not, one of the
-libraries is probably wrong.  It might not be the GNU C Library.  Many
-historical Unix C libraries permit things that we don't, such as
-closing a file twice.
+'dup-args-note'
+'no-dup-args-note'
+     These will enable or disable the note informing the user of
+     suppressed option argument duplication.  The default is
+     'dup-args-note'.
 
-   If you think you have found some way in which the GNU C Library does
-not conform to the ISO and POSIX standards (*note Standards and
-Portability::), that is definitely a bug.  Report it!
+'short-opt-col=N'
+     This prints the first short option in column N.  The default is 2.
 
-   Once you're sure you've found a bug, try to narrow it down to the
-smallest test case that reproduces the problem.  In the case of a C
-library, you really only need to narrow it down to one library function
-call, if possible.  This should not be too difficult.
+'long-opt-col=N'
+     This prints the first long option in column N.  The default is 6.
 
-   The final step when you have a simple test case is to report the bug.
-Do this at `http://www.gnu.org/software/libc/bugs.html'.
+'doc-opt-col=N'
+     This prints 'documentation options' (*note Argp Option Flags::) in
+     column N.  The default is 2.
 
-   If you are not sure how a function should behave, and this manual
-doesn't tell you, that's a bug in the manual.  Report that too!  If the
-function's behavior disagrees with the manual, then either the library
-or the manual has a bug, so report the disagreement.  If you find any
-errors or omissions in this manual, please report them to the bug
-database.  If you refer to specific sections of the manual, please
-include the section names for easier identification.
+'opt-doc-col=N'
+     This prints the documentation for options starting in column N.
+     The default is 29.
+
+'header-col=N'
+     This will indent the group headers that document groups of options
+     to column N.  The default is 1.
+
+'usage-indent=N'
+     This will indent continuation lines in 'Usage:' messages to column
+     N.  The default is 12.
+
+'rmargin=N'
+     This will word wrap help output at or before column N.  The default
+     is 79.
 
 
-File: libc.info,  Node: Maintenance,  Next: Platform,  Prev: Installation,  Up: Top
+File: libc.info,  Node: Suboptions,  Next: Suboptions Example,  Prev: Argp,  Up: Parsing Program Arguments
 
-Appendix D Library Maintenance
-******************************
+25.3.12.1 Parsing of Suboptions
+...............................
+
+Having a single level of options is sometimes not enough.  There might
+be too many options which have to be available or a set of options is
+closely related.
+
+   For this case some programs use suboptions.  One of the most
+prominent programs is certainly 'mount'(8).  The '-o' option take one
+argument which itself is a comma separated list of options.  To ease the
+programming of code like this the function 'getsubopt' is available.
+
+ -- Function: int getsubopt (char **OPTIONP, char *const *TOKENS, char
+          **VALUEP)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The OPTIONP parameter must be a pointer to a variable containing
+     the address of the string to process.  When the function returns
+     the reference is updated to point to the next suboption or to the
+     terminating '\0' character if there is no more suboption available.
+
+     The TOKENS parameter references an array of strings containing the
+     known suboptions.  All strings must be '\0' terminated and to mark
+     the end a null pointer must be stored.  When 'getsubopt' finds a
+     possible legal suboption it compares it with all strings available
+     in the TOKENS array and returns the index in the string as the
+     indicator.
+
+     In case the suboption has an associated value introduced by a '='
+     character, a pointer to the value is returned in VALUEP.  The
+     string is '\0' terminated.  If no argument is available VALUEP is
+     set to the null pointer.  By doing this the caller can check
+     whether a necessary value is given or whether no unexpected value
+     is present.
+
+     In case the next suboption in the string is not mentioned in the
+     TOKENS array the starting address of the suboption including a
+     possible value is returned in VALUEP and the return value of the
+     function is '-1'.
+
+
+File: libc.info,  Node: Suboptions Example,  Prev: Suboptions,  Up: Parsing Program Arguments
+
+25.3.13 Parsing of Suboptions Example
+-------------------------------------
+
+The code which might appear in the 'mount'(8) program is a perfect
+example of the use of 'getsubopt':
+
+
+     #include <stdio.h>
+     #include <stdlib.h>
+     #include <unistd.h>
+
+     int do_all;
+     const char *type;
+     int read_size;
+     int write_size;
+     int read_only;
+
+     enum
+     {
+       RO_OPTION = 0,
+       RW_OPTION,
+       READ_SIZE_OPTION,
+       WRITE_SIZE_OPTION,
+       THE_END
+     };
+
+     const char *mount_opts[] =
+     {
+       [RO_OPTION] = "ro",
+       [RW_OPTION] = "rw",
+       [READ_SIZE_OPTION] = "rsize",
+       [WRITE_SIZE_OPTION] = "wsize",
+       [THE_END] = NULL
+     };
+
+     int
+     main (int argc, char **argv)
+     {
+       char *subopts, *value;
+       int opt;
+
+       while ((opt = getopt (argc, argv, "at:o:")) != -1)
+         switch (opt)
+           {
+           case 'a':
+             do_all = 1;
+             break;
+           case 't':
+             type = optarg;
+             break;
+           case 'o':
+             subopts = optarg;
+             while (*subopts != '\0')
+               switch (getsubopt (&subopts, mount_opts, &value))
+                 {
+                 case RO_OPTION:
+                   read_only = 1;
+                   break;
+                 case RW_OPTION:
+                   read_only = 0;
+                   break;
+                 case READ_SIZE_OPTION:
+                   if (value == NULL)
+                     abort ();
+                   read_size = atoi (value);
+                   break;
+                 case WRITE_SIZE_OPTION:
+                   if (value == NULL)
+                     abort ();
+                   write_size = atoi (value);
+                   break;
+                 default:
+                   /* Unknown suboption. */
+                   printf ("Unknown suboption `%s'\n", value);
+                   break;
+                 }
+             break;
+           default:
+             abort ();
+           }
+
+       /* Do the real work. */
+
+       return 0;
+     }
+
+
+File: libc.info,  Node: Environment Variables,  Next: Auxiliary Vector,  Prev: Program Arguments,  Up: Program Basics
+
+25.4 Environment Variables
+==========================
+
+When a program is executed, it receives information about the context in
+which it was invoked in two ways.  The first mechanism uses the ARGV and
+ARGC arguments to its 'main' function, and is discussed in *note Program
+Arguments::.  The second mechanism uses "environment variables" and is
+discussed in this section.
+
+   The ARGV mechanism is typically used to pass command-line arguments
+specific to the particular program being invoked.  The environment, on
+the other hand, keeps track of information that is shared by many
+programs, changes infrequently, and that is less frequently used.
+
+   The environment variables discussed in this section are the same
+environment variables that you set using assignments and the 'export'
+command in the shell.  Programs executed from the shell inherit all of
+the environment variables from the shell.
+
+   Standard environment variables are used for information about the
+user's home directory, terminal type, current locale, and so on; you can
+define additional variables for other purposes.  The set of all
+environment variables that have values is collectively known as the
+"environment".
+
+   Names of environment variables are case-sensitive and must not
+contain the character '='.  System-defined environment variables are
+invariably uppercase.
+
+   The values of environment variables can be anything that can be
+represented as a string.  A value must not contain an embedded null
+character, since this is assumed to terminate the string.
 
 * Menu:
 
-* Source Layout::         How to add new functions or header files
-                             to the GNU C Library.
-* Porting::               How to port the GNU C Library to
-                             a new machine or operating system.
+* Environment Access::          How to get and set the values of
+				 environment variables.
+* Standard Environment::        These environment variables have
+                		 standard interpretations.
 
 
-File: libc.info,  Node: Source Layout,  Next: Porting,  Up: Maintenance
+File: libc.info,  Node: Environment Access,  Next: Standard Environment,  Up: Environment Variables
 
-D.1 Adding New Functions
+25.4.1 Environment Access
+-------------------------
+
+The value of an environment variable can be accessed with the 'getenv'
+function.  This is declared in the header file 'stdlib.h'.
+
+   Libraries should use 'secure_getenv' instead of 'getenv', so that
+they do not accidentally use untrusted environment variables.
+Modifications of environment variables are not allowed in multi-threaded
+programs.  The 'getenv' and 'secure_getenv' functions can be safely used
+in multi-threaded programs.
+
+ -- Function: char * getenv (const char *NAME)
+     Preliminary: | MT-Safe env | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function returns a string that is the value of the environment
+     variable NAME.  You must not modify this string.  In some non-Unix
+     systems not using the GNU C Library, it might be overwritten by
+     subsequent calls to 'getenv' (but not by any other library
+     function).  If the environment variable NAME is not defined, the
+     value is a null pointer.
+
+ -- Function: char * secure_getenv (const char *NAME)
+     Preliminary: | MT-Safe env | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is similar to 'getenv', but it returns a null pointer
+     if the environment is untrusted.  This happens when the program
+     file has SUID or SGID bits set.  General-purpose libraries should
+     always prefer this function over 'getenv' to avoid vulnerabilities
+     if the library is referenced from a SUID/SGID program.
+
+     This function is a GNU extension.
+
+ -- Function: int putenv (char *STRING)
+     Preliminary: | MT-Unsafe const:env | AS-Unsafe heap lock |
+     AC-Unsafe corrupt lock mem | *Note POSIX Safety Concepts::.
+
+     The 'putenv' function adds or removes definitions from the
+     environment.  If the STRING is of the form 'NAME=VALUE', the
+     definition is added to the environment.  Otherwise, the STRING is
+     interpreted as the name of an environment variable, and any
+     definition for this variable in the environment is removed.
+
+     If the function is successful it returns '0'.  Otherwise the return
+     value is nonzero and 'errno' is set to indicate the error.
+
+     The difference to the 'setenv' function is that the exact string
+     given as the parameter STRING is put into the environment.  If the
+     user should change the string after the 'putenv' call this will
+     reflect automatically in the environment.  This also requires that
+     STRING not be an automatic variable whose scope is left before the
+     variable is removed from the environment.  The same applies of
+     course to dynamically allocated variables which are freed later.
+
+     This function is part of the extended Unix interface.  Since it was
+     also available in old SVID libraries you should define either
+     _XOPEN_SOURCE or _SVID_SOURCE before including any header.
+
+ -- Function: int setenv (const char *NAME, const char *VALUE, int
+          REPLACE)
+     Preliminary: | MT-Unsafe const:env | AS-Unsafe heap lock |
+     AC-Unsafe corrupt lock mem | *Note POSIX Safety Concepts::.
+
+     The 'setenv' function can be used to add a new definition to the
+     environment.  The entry with the name NAME is replaced by the value
+     'NAME=VALUE'.  Please note that this is also true if VALUE is the
+     empty string.  To do this a new string is created and the strings
+     NAME and VALUE are copied.  A null pointer for the VALUE parameter
+     is illegal.  If the environment already contains an entry with key
+     NAME the REPLACE parameter controls the action.  If replace is
+     zero, nothing happens.  Otherwise the old entry is replaced by the
+     new one.
+
+     Please note that you cannot remove an entry completely using this
+     function.
+
+     If the function is successful it returns '0'.  Otherwise the
+     environment is unchanged and the return value is '-1' and 'errno'
+     is set.
+
+     This function was originally part of the BSD library but is now
+     part of the Unix standard.
+
+ -- Function: int unsetenv (const char *NAME)
+     Preliminary: | MT-Unsafe const:env | AS-Unsafe lock | AC-Unsafe
+     lock | *Note POSIX Safety Concepts::.
+
+     Using this function one can remove an entry completely from the
+     environment.  If the environment contains an entry with the key
+     NAME this whole entry is removed.  A call to this function is
+     equivalent to a call to 'putenv' when the VALUE part of the string
+     is empty.
+
+     The function return '-1' if NAME is a null pointer, points to an
+     empty string, or points to a string containing a '=' character.  It
+     returns '0' if the call succeeded.
+
+     This function was originally part of the BSD library but is now
+     part of the Unix standard.  The BSD version had no return value,
+     though.
+
+   There is one more function to modify the whole environment.  This
+function is said to be used in the POSIX.9 (POSIX bindings for Fortran
+77) and so one should expect it did made it into POSIX.1.  But this
+never happened.  But we still provide this function as a GNU extension
+to enable writing standard compliant Fortran environments.
+
+ -- Function: int clearenv (void)
+     Preliminary: | MT-Unsafe const:env | AS-Unsafe heap lock |
+     AC-Unsafe lock mem | *Note POSIX Safety Concepts::.
+
+     The 'clearenv' function removes all entries from the environment.
+     Using 'putenv' and 'setenv' new entries can be added again later.
+
+     If the function is successful it returns '0'.  Otherwise the return
+     value is nonzero.
+
+   You can deal directly with the underlying representation of
+environment objects to add more variables to the environment (for
+example, to communicate with another program you are about to execute;
+*note Executing a File::).
+
+ -- Variable: char ** environ
+     The environment is represented as an array of strings.  Each string
+     is of the format 'NAME=VALUE'.  The order in which strings appear
+     in the environment is not significant, but the same NAME must not
+     appear more than once.  The last element of the array is a null
+     pointer.
+
+     This variable is declared in the header file 'unistd.h'.
+
+     If you just want to get the value of an environment variable, use
+     'getenv'.
+
+   Unix systems, and GNU systems, pass the initial value of 'environ' as
+the third argument to 'main'.  *Note Program Arguments::.
+
+
+File: libc.info,  Node: Standard Environment,  Prev: Environment Access,  Up: Environment Variables
+
+25.4.2 Standard Environment Variables
+-------------------------------------
+
+These environment variables have standard meanings.  This doesn't mean
+that they are always present in the environment; but if these variables
+_are_ present, they have these meanings.  You shouldn't try to use these
+environment variable names for some other purpose.
+
+'HOME'
+
+     This is a string representing the user's "home directory", or
+     initial default working directory.
+
+     The user can set 'HOME' to any value.  If you need to make sure to
+     obtain the proper home directory for a particular user, you should
+     not use 'HOME'; instead, look up the user's name in the user
+     database (*note User Database::).
+
+     For most purposes, it is better to use 'HOME', precisely because
+     this lets the user specify the value.
+
+'LOGNAME'
+
+     This is the name that the user used to log in.  Since the value in
+     the environment can be tweaked arbitrarily, this is not a reliable
+     way to identify the user who is running a program; a function like
+     'getlogin' (*note Who Logged In::) is better for that purpose.
+
+     For most purposes, it is better to use 'LOGNAME', precisely because
+     this lets the user specify the value.
+
+'PATH'
+
+     A "path" is a sequence of directory names which is used for
+     searching for a file.  The variable 'PATH' holds a path used for
+     searching for programs to be run.
+
+     The 'execlp' and 'execvp' functions (*note Executing a File::) use
+     this environment variable, as do many shells and other utilities
+     which are implemented in terms of those functions.
+
+     The syntax of a path is a sequence of directory names separated by
+     colons.  An empty string instead of a directory name stands for the
+     current directory (*note Working Directory::).
+
+     A typical value for this environment variable might be a string
+     like:
+
+          :/bin:/etc:/usr/bin:/usr/new/X11:/usr/new:/usr/local/bin
+
+     This means that if the user tries to execute a program named 'foo',
+     the system will look for files named 'foo', '/bin/foo', '/etc/foo',
+     and so on.  The first of these files that exists is the one that is
+     executed.
+
+'TERM'
+
+     This specifies the kind of terminal that is receiving program
+     output.  Some programs can make use of this information to take
+     advantage of special escape sequences or terminal modes supported
+     by particular kinds of terminals.  Many programs which use the
+     termcap library (*note Find: (termcap)Finding a Terminal
+     Description.) use the 'TERM' environment variable, for example.
+
+'TZ'
+
+     This specifies the time zone.  *Note TZ Variable::, for information
+     about the format of this string and how it is used.
+
+'LANG'
+
+     This specifies the default locale to use for attribute categories
+     where neither 'LC_ALL' nor the specific environment variable for
+     that category is set.  *Note Locales::, for more information about
+     locales.
+
+'LC_ALL'
+
+     If this environment variable is set it overrides the selection for
+     all the locales done using the other 'LC_*' environment variables.
+     The value of the other 'LC_*' environment variables is simply
+     ignored in this case.
+
+'LC_COLLATE'
+
+     This specifies what locale to use for string sorting.
+
+'LC_CTYPE'
+
+     This specifies what locale to use for character sets and character
+     classification.
+
+'LC_MESSAGES'
+
+     This specifies what locale to use for printing messages and to
+     parse responses.
+
+'LC_MONETARY'
+
+     This specifies what locale to use for formatting monetary values.
+
+'LC_NUMERIC'
+
+     This specifies what locale to use for formatting numbers.
+
+'LC_TIME'
+
+     This specifies what locale to use for formatting date/time values.
+
+'NLSPATH'
+
+     This specifies the directories in which the 'catopen' function
+     looks for message translation catalogs.
+
+'_POSIX_OPTION_ORDER'
+
+     If this environment variable is defined, it suppresses the usual
+     reordering of command line arguments by 'getopt' and 'argp_parse'.
+     *Note Argument Syntax::.
+
+
+File: libc.info,  Node: Auxiliary Vector,  Next: System Calls,  Prev: Environment Variables,  Up: Program Basics
+
+25.5 Auxiliary Vector
+=====================
+
+When a program is executed, it receives information from the operating
+system about the environment in which it is operating.  The form of this
+information is a table of key-value pairs, where the keys are from the
+set of 'AT_' values in 'elf.h'.  Some of the data is provided by the
+kernel for libc consumption, and may be obtained by ordinary interfaces,
+such as 'sysconf'.  However, on a platform-by-platform basis there may
+be information that is not available any other way.
+
+25.5.1 Definition of 'getauxval'
+--------------------------------
+
+ -- Function: unsigned long int getauxval (unsigned long int TYPE)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is used to inquire about the entries in the auxiliary
+     vector.  The TYPE argument should be one of the 'AT_' symbols
+     defined in 'elf.h'.  If a matching entry is found, the value is
+     returned; if the entry is not found, zero is returned and 'errno'
+     is set to 'ENOENT'.
+
+   For some platforms, the key 'AT_HWCAP' is the easiest way to inquire
+about any instruction set extensions available at runtime.  In this
+case, there will (of necessity) be a platform-specific set of 'HWCAP_'
+values masked together that describe the capabilities of the cpu on
+which the program is being executed.
+
+
+File: libc.info,  Node: System Calls,  Next: Program Termination,  Prev: Auxiliary Vector,  Up: Program Basics
+
+25.6 System Calls
+=================
+
+A system call is a request for service that a program makes of the
+kernel.  The service is generally something that only the kernel has the
+privilege to do, such as doing I/O. Programmers don't normally need to
+be concerned with system calls because there are functions in the GNU C
+Library to do virtually everything that system calls do.  These
+functions work by making system calls themselves.  For example, there is
+a system call that changes the permissions of a file, but you don't need
+to know about it because you can just use the GNU C Library's 'chmod'
+function.
+
+   System calls are sometimes called kernel calls.
+
+   However, there are times when you want to make a system call
+explicitly, and for that, the GNU C Library provides the 'syscall'
+function.  'syscall' is harder to use and less portable than functions
+like 'chmod', but easier and more portable than coding the system call
+in assembler instructions.
+
+   'syscall' is most useful when you are working with a system call
+which is special to your system or is newer than the GNU C Library you
+are using.  'syscall' is implemented in an entirely generic way; the
+function does not know anything about what a particular system call does
+or even if it is valid.
+
+   The description of 'syscall' in this section assumes a certain
+protocol for system calls on the various platforms on which the GNU C
+Library runs.  That protocol is not defined by any strong authority, but
+we won't describe it here either because anyone who is coding 'syscall'
+probably won't accept anything less than kernel and C library source
+code as a specification of the interface between them anyway.
+
+   'syscall' is declared in 'unistd.h'.
+
+ -- Function: long int syscall (long int SYSNO, ...)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'syscall' performs a generic system call.
+
+     SYSNO is the system call number.  Each kind of system call is
+     identified by a number.  Macros for all the possible system call
+     numbers are defined in 'sys/syscall.h'
+
+     The remaining arguments are the arguments for the system call, in
+     order, and their meanings depend on the kind of system call.  Each
+     kind of system call has a definite number of arguments, from zero
+     to five.  If you code more arguments than the system call takes,
+     the extra ones to the right are ignored.
+
+     The return value is the return value from the system call, unless
+     the system call failed.  In that case, 'syscall' returns '-1' and
+     sets 'errno' to an error code that the system call returned.  Note
+     that system calls do not return '-1' when they succeed.
+
+     If you specify an invalid SYSNO, 'syscall' returns '-1' with
+     'errno' = 'ENOSYS'.
+
+     Example:
+
+
+          #include <unistd.h>
+          #include <sys/syscall.h>
+          #include <errno.h>
+
+          ...
+
+          int rc;
+
+          rc = syscall(SYS_chmod, "/etc/passwd", 0444);
+
+          if (rc == -1)
+             fprintf(stderr, "chmod failed, errno = %d\n", errno);
+
+
+     This, if all the compatibility stars are aligned, is equivalent to
+     the following preferable code:
+
+
+          #include <sys/types.h>
+          #include <sys/stat.h>
+          #include <errno.h>
+
+          ...
+
+          int rc;
+
+          rc = chmod("/etc/passwd", 0444);
+          if (rc == -1)
+             fprintf(stderr, "chmod failed, errno = %d\n", errno);
+
+
+
+File: libc.info,  Node: Program Termination,  Prev: System Calls,  Up: Program Basics
+
+25.7 Program Termination
 ========================
 
-The process of building the library is driven by the makefiles, which
-make heavy use of special features of GNU `make'.  The makefiles are
-very complex, and you probably don't want to try to understand them.
-But what they do is fairly straightforward, and only requires that you
-define a few variables in the right places.
+The usual way for a program to terminate is simply for its 'main'
+function to return.  The "exit status value" returned from the 'main'
+function is used to report information back to the process's parent
+process or shell.
 
-   The library sources are divided into subdirectories, grouped by
-topic.
+   A program can also terminate normally by calling the 'exit' function.
 
-   The `string' subdirectory has all the string-manipulation functions,
-`math' has all the mathematical functions, etc.
-
-   Each subdirectory contains a simple makefile, called `Makefile',
-which defines a few `make' variables and then includes the global
-makefile `Rules' with a line like:
-
-     include ../Rules
-
-The basic variables that a subdirectory makefile defines are:
-
-`subdir'
-     The name of the subdirectory, for example `stdio'.  This variable
-     *must* be defined.
-
-`headers'
-     The names of the header files in this section of the library, such
-     as `stdio.h'.
-
-`routines'
-`aux'
-     The names of the modules (source files) in this section of the
-     library.  These should be simple names, such as `strlen' (rather
-     than complete file names, such as `strlen.c').  Use `routines' for
-     modules that define functions in the library, and `aux' for
-     auxiliary modules containing things like data definitions.  But the
-     values of `routines' and `aux' are just concatenated, so there
-     really is no practical difference.
-
-`tests'
-     The names of test programs for this section of the library.  These
-     should be simple names, such as `tester' (rather than complete file
-     names, such as `tester.c').  `make tests' will build and run all
-     the test programs.  If a test program needs input, put the test
-     data in a file called `TEST-PROGRAM.input'; it will be given to
-     the test program on its standard input.  If a test program wants
-     to be run with arguments, put the arguments (all on a single line)
-     in a file called `TEST-PROGRAM.args'.  Test programs should exit
-     with zero status when the test passes, and nonzero status when the
-     test indicates a bug in the library or error in building.
-
-`others'
-     The names of "other" programs associated with this section of the
-     library.  These are programs which are not tests per se, but are
-     other small programs included with the library.  They are built by
-     `make others'.
-
-`install-lib'
-`install-data'
-`install'
-     Files to be installed by `make install'.  Files listed in
-     `install-lib' are installed in the directory specified by `libdir'
-     in `configparms' or `Makeconfig' (*note Installation::).  Files
-     listed in `install-data' are installed in the directory specified
-     by `datadir' in `configparms' or `Makeconfig'.  Files listed in
-     `install' are installed in the directory specified by `bindir' in
-     `configparms' or `Makeconfig'.
-
-`distribute'
-     Other files from this subdirectory which should be put into a
-     distribution tar file.  You need not list here the makefile itself
-     or the source and header files listed in the other standard
-     variables.  Only define `distribute' if there are files used in an
-     unusual way that should go into the distribution.
-
-`generated'
-     Files which are generated by `Makefile' in this subdirectory.
-     These files will be removed by `make clean', and they will never
-     go into a distribution.
-
-`extra-objs'
-     Extra object files which are built by `Makefile' in this
-     subdirectory.  This should be a list of file names like `foo.o';
-     the files will actually be found in whatever directory object
-     files are being built in.  These files will be removed by
-     `make clean'.  This variable is used for secondary object files
-     needed to build `others' or `tests'.
+   In addition, programs can be terminated by signals; this is discussed
+in more detail in *note Signal Handling::.  The 'abort' function causes
+a signal that kills the program.
 
 * Menu:
 
-* Platform: Adding Platform-specific.             Adding platform-specific
-                                         features.
+* Normal Termination::          If a program calls 'exit', a
+                                 process terminates normally.
+* Exit Status::                 The 'exit status' provides information
+                                 about why the process terminated.
+* Cleanups on Exit::            A process can run its own cleanup
+                                 functions upon normal termination.
+* Aborting a Program::          The 'abort' function causes
+                                 abnormal program termination.
+* Termination Internals::       What happens when a process terminates.
 
 
-File: libc.info,  Node: Adding Platform-specific,  Up: Source Layout
+File: libc.info,  Node: Normal Termination,  Next: Exit Status,  Up: Program Termination
 
-D.1.1 Platform-specific types, macros and functions
----------------------------------------------------
+25.7.1 Normal Termination
+-------------------------
 
-It's sometimes necessary to provide nonstandard, platform-specific
-features to developers.  The C library is traditionally the lowest
-library layer, so it makes sense for it to provide these low-level
-features.  However, including these features in the C library may be a
-disadvantage if another package provides them as well as there will be
-two conflicting versions of them.  Also, the features won't be
-available to projects that do not use the GNU C Library but use other
-GNU tools, like GCC.
+A process terminates normally when its program signals it is done by
+calling 'exit'.  Returning from 'main' is equivalent to calling 'exit',
+and the value that 'main' returns is used as the argument to 'exit'.
 
-   The current guidelines are:
-   * If the header file provides features that only make sense on a
-     particular machine architecture and have nothing to do with an
-     operating system, then the features should ultimately be provided
-     as GCC built-in functions.  Until then, the GNU C Library may
-     provide them in the header file.  When the GCC built-in functions
-     become available, those provided in the header file should be made
-     conditionally available prior to the GCC version in which the
-     built-in function was made available.
+ -- Function: void exit (int STATUS)
+     Preliminary: | MT-Unsafe race:exit | AS-Unsafe corrupt | AC-Unsafe
+     corrupt lock | *Note POSIX Safety Concepts::.
 
-   * If the header file provides features that are specific to an
-     operating system, both GCC and the GNU C Library could provide it,
-     but the GNU C Library is preferred as it already has a lot of
-     information about the operating system.
+     The 'exit' function tells the system that the program is done,
+     which causes it to terminate the process.
 
-   * If the header file provides features that are specific to an
-     operating system but used by the GNU C Library, then the GNU C
-     Library should provide them.
+     STATUS is the program's exit status, which becomes part of the
+     process' termination status.  This function does not return.
 
-   The general solution for providing low-level features is to export
-them as follows:
+   Normal termination causes the following actions:
 
-   * A nonstandard, low-level header file that defines macros and inline
-     functions should be called `sys/platform/NAME.h'.
+  1. Functions that were registered with the 'atexit' or 'on_exit'
+     functions are called in the reverse order of their registration.
+     This mechanism allows your application to specify its own "cleanup"
+     actions to be performed at program termination.  Typically, this is
+     used to do things like saving program state information in a file,
+     or unlocking locks in shared data bases.
 
-   * Each header file's name should include the platform name, to avoid
-     users thinking there is anything in common between different the
-     header files for different platforms.  For example, a
-     `sys/platform/ARCH.h' name such as `sys/platform/ppc.h' is better
-     than `sys/platform.h'.
+  2. All open streams are closed, writing out any buffered output data.
+     See *note Closing Streams::.  In addition, temporary files opened
+     with the 'tmpfile' function are removed; see *note Temporary
+     Files::.
 
-   * A platform-specific header file provided by the GNU C Library
-     should coordinate with GCC such that compiler built-in versions of
-     the functions and macros are preferred if available.  This means
-     that user programs will only ever need to include
-     `sys/platform/ARCH.h', keeping the same names of types, macros,
-     and functions for convenience and portability.
-
-   * Each included symbol must have the prefix `__ARCH_', such as
-     `__ppc_get_timebase'.
-
-   The easiest way to provide a header file is to add it to the
-`sysdep_headers' variable.  For example, the combination of
-Linux-specific header files on PowerPC could be provided like this:
-
-     sysdep_headers += sys/platform/ppc.h
-
-   Then ensure that you have added a `sys/platform/ppc.h' header file
-in the machine-specific directory, e.g.,
-`sysdeps/powerpc/sys/platform/ppc.h'.
+  3. '_exit' is called, terminating the program.  *Note Termination
+     Internals::.
 
 
-File: libc.info,  Node: Porting,  Prev: Source Layout,  Up: Maintenance
+File: libc.info,  Node: Exit Status,  Next: Cleanups on Exit,  Prev: Normal Termination,  Up: Program Termination
 
-D.2 Porting the GNU C Library
-=============================
+25.7.2 Exit Status
+------------------
 
-The GNU C Library is written to be easily portable to a variety of
-machines and operating systems.  Machine- and operating system-dependent
-functions are well separated to make it easy to add implementations for
-new machines or operating systems.  This section describes the layout of
-the library source tree and explains the mechanisms used to select
-machine-dependent code to use.
+When a program exits, it can return to the parent process a small amount
+of information about the cause of termination, using the "exit status".
+This is a value between 0 and 255 that the exiting process passes as an
+argument to 'exit'.
 
-   All the machine-dependent and operating system-dependent files in the
-library are in the subdirectory `sysdeps' under the top-level library
-source directory.  This directory contains a hierarchy of
-subdirectories (*note Hierarchy Conventions::).
+   Normally you should use the exit status to report very broad
+information about success or failure.  You can't provide a lot of detail
+about the reasons for the failure, and most parent processes would not
+want much detail anyway.
 
-   Each subdirectory of `sysdeps' contains source files for a
-particular machine or operating system, or for a class of machine or
-operating system (for example, systems by a particular vendor, or all
-machines that use IEEE 754 floating-point format).  A configuration
-specifies an ordered list of these subdirectories.  Each subdirectory
-implicitly appends its parent directory to the list.  For example,
-specifying the list `unix/bsd/vax' is equivalent to specifying the list
-`unix/bsd/vax unix/bsd unix'.  A subdirectory can also specify that it
-implies other subdirectories which are not directly above it in the
-directory hierarchy.  If the file `Implies' exists in a subdirectory,
-it lists other subdirectories of `sysdeps' which are appended to the
-list, appearing after the subdirectory containing the `Implies' file.
-Lines in an `Implies' file that begin with a `#' character are ignored
-as comments.  For example, `unix/bsd/Implies' contains:
-     # BSD has Internet-related things.
-     unix/inet
-   and `unix/Implies' contains:
-     posix
+   There are conventions for what sorts of status values certain
+programs should return.  The most common convention is simply 0 for
+success and 1 for failure.  Programs that perform comparison use a
+different convention: they use status 1 to indicate a mismatch, and
+status 2 to indicate an inability to compare.  Your program should
+follow an existing convention if an existing convention makes sense for
+it.
 
-So the final list is `unix/bsd/vax unix/bsd unix/inet unix posix'.
+   A general convention reserves status values 128 and up for special
+purposes.  In particular, the value 128 is used to indicate failure to
+execute another program in a subprocess.  This convention is not
+universally obeyed, but it is a good idea to follow it in your programs.
 
-   `sysdeps' has a "special" subdirectory called `generic'.  It is
-always implicitly appended to the list of subdirectories, so you
-needn't put it in an `Implies' file, and you should not create any
-subdirectories under it intended to be new specific categories.
-`generic' serves two purposes.  First, the makefiles do not bother to
-look for a system-dependent version of a file that's not in `generic'.
-This means that any system-dependent source file must have an analogue
-in `generic', even if the routines defined by that file are not
-implemented on other platforms.  Second, the `generic' version of a
-system-dependent file is used if the makefiles do not find a version
-specific to the system you're compiling for.
+   *Warning:* Don't try to use the number of errors as the exit status.
+This is actually not very useful; a parent process would generally not
+care how many errors occurred.  Worse than that, it does not work,
+because the status value is truncated to eight bits.  Thus, if the
+program tried to report 256 errors, the parent would receive a report of
+0 errors--that is, success.
 
-   If it is possible to implement the routines in a `generic' file in
-machine-independent C, using only other machine-independent functions in
-the C library, then you should do so.  Otherwise, make them stubs.  A
-"stub" function is a function which cannot be implemented on a
-particular machine or operating system.  Stub functions always return an
-error, and set `errno' to `ENOSYS' (Function not implemented).  *Note
-Error Reporting::.  If you define a stub function, you must place the
-statement `stub_warning(FUNCTION)', where FUNCTION is the name of your
-function, after its definition.  This causes the function to be listed
-in the installed `<gnu/stubs.h>', and makes GNU ld warn when the
-function is used.
+   For the same reason, it does not work to use the value of 'errno' as
+the exit status--these can exceed 255.
 
-   Some rare functions are only useful on specific systems and aren't
-defined at all on others; these do not appear anywhere in the
-system-independent source code or makefiles (including the `generic'
-directory), only in the system-dependent `Makefile' in the specific
-system's subdirectory.
+   *Portability note:* Some non-POSIX systems use different conventions
+for exit status values.  For greater portability, you can use the macros
+'EXIT_SUCCESS' and 'EXIT_FAILURE' for the conventional status value for
+success and failure, respectively.  They are declared in the file
+'stdlib.h'.
 
-   If you come across a file that is in one of the main source
-directories (`string', `stdio', etc.), and you want to write a machine-
-or operating system-dependent version of it, move the file into
-`sysdeps/generic' and write your new implementation in the appropriate
-system-specific subdirectory.  Note that if a file is to be
-system-dependent, it *must not* appear in one of the main source
-directories.
+ -- Macro: int EXIT_SUCCESS
+     This macro can be used with the 'exit' function to indicate
+     successful program completion.
 
-   There are a few special files that may exist in each subdirectory of
-`sysdeps':
+     On POSIX systems, the value of this macro is '0'.  On other
+     systems, the value might be some other (possibly non-constant)
+     integer expression.
 
-`Makefile'
-     A makefile for this machine or operating system, or class of
-     machine or operating system.  This file is included by the library
-     makefile `Makerules', which is used by the top-level makefile and
-     the subdirectory makefiles.  It can change the variables set in the
-     including makefile or add new rules.  It can use GNU `make'
-     conditional directives based on the variable `subdir' (see above)
-     to select different sets of variables and rules for different
-     sections of the library.  It can also set the `make' variable
-     `sysdep-routines', to specify extra modules to be included in the
-     library.  You should use `sysdep-routines' rather than adding
-     modules to `routines' because the latter is used in determining
-     what to distribute for each subdirectory of the main source tree.
+ -- Macro: int EXIT_FAILURE
+     This macro can be used with the 'exit' function to indicate
+     unsuccessful program completion in a general sense.
 
-     Each makefile in a subdirectory in the ordered list of
-     subdirectories to be searched is included in order.  Since several
-     system-dependent makefiles may be included, each should append to
-     `sysdep-routines' rather than simply setting it:
+     On POSIX systems, the value of this macro is '1'.  On other
+     systems, the value might be some other (possibly non-constant)
+     integer expression.  Other nonzero status values also indicate
+     failures.  Certain programs use different nonzero status values to
+     indicate particular kinds of "non-success".  For example, 'diff'
+     uses status value '1' to mean that the files are different, and '2'
+     or more to mean that there was difficulty in opening the files.
 
-          sysdep-routines := $(sysdep-routines) foo bar
-
-`Subdirs'
-     This file contains the names of new whole subdirectories under the
-     top-level library source tree that should be included for this
-     system.  These subdirectories are treated just like the
-     system-independent subdirectories in the library source tree, such
-     as `stdio' and `math'.
-
-     Use this when there are completely new sets of functions and header
-     files that should go into the library for the system this
-     subdirectory of `sysdeps' implements.  For example,
-     `sysdeps/unix/inet/Subdirs' contains `inet'; the `inet' directory
-     contains various network-oriented operations which only make sense
-     to put in the library on systems that support the Internet.
-
-`configure'
-     This file is a shell script fragment to be run at configuration
-     time.  The top-level `configure' script uses the shell `.' command
-     to read the `configure' file in each system-dependent directory
-     chosen, in order.  The `configure' files are often generated from
-     `configure.ac' files using Autoconf.
-
-     A system-dependent `configure' script will usually add things to
-     the shell variables `DEFS' and `config_vars'; see the top-level
-     `configure' script for details.  The script can check for
-     `--with-PACKAGE' options that were passed to the top-level
-     `configure'.  For an option `--with-PACKAGE=VALUE' `configure'
-     sets the shell variable `with_PACKAGE' (with any dashes in PACKAGE
-     converted to underscores) to VALUE; if the option is just
-     `--with-PACKAGE' (no argument), then it sets `with_PACKAGE' to
-     `yes'.
-
-`configure.ac'
-     This file is an Autoconf input fragment to be processed into the
-     file `configure' in this subdirectory.  *Note Introduction:
-     (autoconf.info)Introduction, for a description of Autoconf.  You
-     should write either `configure' or `configure.ac', but not both.
-     The first line of `configure.ac' should invoke the `m4' macro
-     `GLIBC_PROVIDES'.  This macro does several `AC_PROVIDE' calls for
-     Autoconf macros which are used by the top-level `configure'
-     script; without this, those macros might be invoked again
-     unnecessarily by Autoconf.
-
-   That is the general system for how system-dependencies are isolated.
-
-* Menu:
-
-* Hierarchy Conventions::       The layout of the `sysdeps' hierarchy.
-* Porting to Unix::             Porting the library to an average
-                                   Unix-like system.
+   Don't confuse a program's exit status with a process' termination
+status.  There are lots of ways a process can terminate besides having
+its program finish.  In the event that the process termination _is_
+caused by program termination (i.e., 'exit'), though, the program's exit
+status becomes part of the process' termination status.
 
 
-File: libc.info,  Node: Hierarchy Conventions,  Next: Porting to Unix,  Up: Porting
+File: libc.info,  Node: Cleanups on Exit,  Next: Aborting a Program,  Prev: Exit Status,  Up: Program Termination
 
-D.2.1 Layout of the `sysdeps' Directory Hierarchy
--------------------------------------------------
+25.7.3 Cleanups on Exit
+-----------------------
 
-A GNU configuration name has three parts: the CPU type, the
-manufacturer's name, and the operating system.  `configure' uses these
-to pick the list of system-dependent directories to look for.  If the
-`--nfp' option is _not_ passed to `configure', the directory
-`MACHINE/fpu' is also used.  The operating system often has a "base
-operating system"; for example, if the operating system is `Linux', the
-base operating system is `unix/sysv'.  The algorithm used to pick the
-list of directories is simple: `configure' makes a list of the base
-operating system, manufacturer, CPU type, and operating system, in that
-order.  It then concatenates all these together with slashes in
-between, to produce a directory name; for example, the configuration
-`i686-linux-gnu' results in `unix/sysv/linux/i386/i686'.  `configure'
-then tries removing each element of the list in turn, so
-`unix/sysv/linux' and `unix/sysv' are also tried, among others.  Since
-the precise version number of the operating system is often not
-important, and it would be very inconvenient, for example, to have
-identical `irix6.2' and `irix6.3' directories, `configure' tries
-successively less specific operating system names by removing trailing
-suffixes starting with a period.
+Your program can arrange to run its own cleanup functions if normal
+termination happens.  If you are writing a library for use in various
+application programs, then it is unreliable to insist that all
+applications call the library's cleanup functions explicitly before
+exiting.  It is much more robust to make the cleanup invisible to the
+application, by setting up a cleanup function in the library itself
+using 'atexit' or 'on_exit'.
 
-   As an example, here is the complete list of directories that would be
-tried for the configuration `i686-linux-gnu' (with the `crypt' and
-`linuxthreads' add-on):
+ -- Function: int atexit (void (*FUNCTION) (void))
+     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe lock mem |
+     *Note POSIX Safety Concepts::.
 
-     sysdeps/i386/elf
-     crypt/sysdeps/unix
-     linuxthreads/sysdeps/unix/sysv/linux
-     linuxthreads/sysdeps/pthread
-     linuxthreads/sysdeps/unix/sysv
-     linuxthreads/sysdeps/unix
-     linuxthreads/sysdeps/i386/i686
-     linuxthreads/sysdeps/i386
-     linuxthreads/sysdeps/pthread/no-cmpxchg
-     sysdeps/unix/sysv/linux/i386
-     sysdeps/unix/sysv/linux
-     sysdeps/gnu
-     sysdeps/unix/common
-     sysdeps/unix/mman
-     sysdeps/unix/inet
-     sysdeps/unix/sysv/i386/i686
-     sysdeps/unix/sysv/i386
-     sysdeps/unix/sysv
-     sysdeps/unix/i386
-     sysdeps/unix
-     sysdeps/posix
-     sysdeps/i386/i686
-     sysdeps/i386/i486
-     sysdeps/libm-i387/i686
-     sysdeps/i386/fpu
-     sysdeps/libm-i387
-     sysdeps/i386
-     sysdeps/wordsize-32
-     sysdeps/ieee754
-     sysdeps/libm-ieee754
-     sysdeps/generic
+     The 'atexit' function registers the function FUNCTION to be called
+     at normal program termination.  The FUNCTION is called with no
+     arguments.
 
-   Different machine architectures are conventionally subdirectories at
-the top level of the `sysdeps' directory tree.  For example,
-`sysdeps/sparc' and `sysdeps/m68k'.  These contain files specific to
-those machine architectures, but not specific to any particular
-operating system.  There might be subdirectories for specializations of
-those architectures, such as `sysdeps/m68k/68020'. Code which is
-specific to the floating-point coprocessor used with a particular
-machine should go in `sysdeps/MACHINE/fpu'.
+     The return value from 'atexit' is zero on success and nonzero if
+     the function cannot be registered.
 
-   There are a few directories at the top level of the `sysdeps'
-hierarchy that are not for particular machine architectures.
+ -- Function: int on_exit (void (*FUNCTION)(int STATUS, void *ARG), void
+          *ARG)
+     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe lock mem |
+     *Note POSIX Safety Concepts::.
 
-`generic'
-     As described above (*note Porting::), this is the subdirectory
-     that every configuration implicitly uses after all others.
+     This function is a somewhat more powerful variant of 'atexit'.  It
+     accepts two arguments, a function FUNCTION and an arbitrary pointer
+     ARG.  At normal program termination, the FUNCTION is called with
+     two arguments: the STATUS value passed to 'exit', and the ARG.
 
-`ieee754'
-     This directory is for code using the IEEE 754 floating-point
-     format, where the C type `float' is IEEE 754 single-precision
-     format, and `double' is IEEE 754 double-precision format.  Usually
-     this directory is referred to in the `Implies' file in a machine
-     architecture-specific directory, such as `m68k/Implies'.
-
-`libm-ieee754'
-     This directory contains an implementation of a mathematical library
-     usable on platforms which use IEEE 754 conformant floating-point
-     arithmetic.
-
-`libm-i387'
-     This is a special case.  Ideally the code should be in
-     `sysdeps/i386/fpu' but for various reasons it is kept aside.
-
-`posix'
-     This directory contains implementations of things in the library in
-     terms of POSIX.1 functions.  This includes some of the POSIX.1
-     functions themselves.  Of course, POSIX.1 cannot be completely
-     implemented in terms of itself, so a configuration using just
-     `posix' cannot be complete.
-
-`unix'
-     This is the directory for Unix-like things.  *Note Porting to
-     Unix::.  `unix' implies `posix'.  There are some special-purpose
-     subdirectories of `unix':
-
-    `unix/common'
-          This directory is for things common to both BSD and System V
-          release 4.  Both `unix/bsd' and `unix/sysv/sysv4' imply
-          `unix/common'.
-
-    `unix/inet'
-          This directory is for `socket' and related functions on Unix
-          systems.  `unix/inet/Subdirs' enables the `inet' top-level
-          subdirectory.  `unix/common' implies `unix/inet'.
-
-`mach'
-     This is the directory for things based on the Mach microkernel
-     from CMU (including GNU/Hurd systems).  Other basic operating
-     systems (VMS, for example) would have their own directories at the
-     top level of the `sysdeps' hierarchy, parallel to `unix' and
-     `mach'.
-
-
-File: libc.info,  Node: Porting to Unix,  Prev: Hierarchy Conventions,  Up: Porting
-
-D.2.2 Porting the GNU C Library to Unix Systems
------------------------------------------------
-
-Most Unix systems are fundamentally very similar.  There are variations
-between different machines, and variations in what facilities are
-provided by the kernel.  But the interface to the operating system
-facilities is, for the most part, pretty uniform and simple.
-
-   The code for Unix systems is in the directory `unix', at the top
-level of the `sysdeps' hierarchy.  This directory contains
-subdirectories (and subdirectory trees) for various Unix variants.
-
-   The functions which are system calls in most Unix systems are
-implemented in assembly code, which is generated automatically from
-specifications in files named `syscalls.list'.  There are several such
-files, one in `sysdeps/unix' and others in its subdirectories.  Some
-special system calls are implemented in files that are named with a
-suffix of `.S'; for example, `_exit.S'.  Files ending in `.S' are run
-through the C preprocessor before being fed to the assembler.
-
-   These files all use a set of macros that should be defined in
-`sysdep.h'.  The `sysdep.h' file in `sysdeps/unix' partially defines
-them; a `sysdep.h' file in another directory must finish defining them
-for the particular machine and operating system variant.  See
-`sysdeps/unix/sysdep.h' and the machine-specific `sysdep.h'
-implementations to see what these macros are and what they should do.
-
-   The system-specific makefile for the `unix' directory
-(`sysdeps/unix/Makefile') gives rules to generate several files from
-the Unix system you are building the library on (which is assumed to be
-the target system you are building the library _for_).  All the
-generated files are put in the directory where the object files are
-kept; they should not affect the source tree itself.  The files
-generated are `ioctls.h', `errnos.h', `sys/param.h', and `errlist.c'
-(for the `stdio' section of the library).
-
-
-File: libc.info,  Node: Platform,  Next: Contributors,  Prev: Maintenance,  Up: Top
-
-Appendix E Platform-specific facilities
-***************************************
-
-The GNU C Library can provide machine-specific functionality.
-
-* Menu:
-
-* PowerPC::           Facilities Specific to the PowerPC Architecture
-
-
-File: libc.info,  Node: PowerPC,  Up: Platform
-
-E.1 PowerPC-specific Facilities
-===============================
-
-Facilities specific to PowerPC that are not specific to a particular
-operating system are declared in `sys/platform/ppc.h'.
-
- -- Function: uint64_t __ppc_get_timebase (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Read the current value of the Time Base Register.
-
-     The "Time Base Register" is a 64-bit register that stores a
-     monotonically incremented value updated at a system-dependent
-     frequency that may be different from the processor frequency.
-     More information is available in `Power ISA 2.06b - Book II -
-     Section 5.2'.
-
-     `__ppc_get_timebase' uses the processor's time base facility
-     directly without requiring assistance from the operating system,
-     so it is very efficient.
-
- -- Function: uint64_t __ppc_get_timebase_freq (void)
-     Preliminary: | MT-Unsafe init | AS-Unsafe corrupt:init | AC-Unsafe
-     corrupt:init | *Note POSIX Safety Concepts::.
-
-     Read the current frequency at which the Time Base Register is
-     updated.
-
-     This frequency is not related to the processor clock or the bus
-     clock.  It is also possible that this frequency is not constant.
-     More information is available in `Power ISA 2.06b - Book II -
-     Section 5.2'.
-
-   The following functions provide hints about the usage of resources
-that are shared with other processors.  They can be used, for example,
-if a program waiting on a lock intends to divert the shared resources
-to be used by other processors.  More information is available in
-`Power ISA 2.06b - Book II - Section 3.2'.
-
- -- Function: void __ppc_yield (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Provide a hint that performance will probably be improved if
-     shared resources dedicated to the executing processor are released
-     for use by other processors.
-
- -- Function: void __ppc_mdoio (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Provide a hint that performance will probably be improved if
-     shared resources dedicated to the executing processor are released
-     until all outstanding storage accesses to caching-inhibited
-     storage have been completed.
-
- -- Function: void __ppc_mdoom (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Provide a hint that performance will probably be improved if
-     shared resources dedicated to the executing processor are released
-     until all outstanding storage accesses to cacheable storage for
-     which the data is not in the cache have been completed.
-
- -- Function: void __ppc_set_ppr_med (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Set the Program Priority Register to medium value (default).
-
-     The "Program Priority Register" (PPR) is a 64-bit register that
-     controls the program's priority.  By adjusting the PPR value the
-     programmer may improve system throughput by causing the system
-     resources to be used more efficiently, especially in contention
-     situations.  The three unprivileged states available are covered
-     by the functions `__ppc_set_ppr_med' (medium - default),
-     `__ppc_set_ppc_low' (low) and `__ppc_set_ppc_med_low' (medium
-     low).  More information available in `Power ISA 2.06b - Book II -
-     Section 3.1'.
-
- -- Function: void __ppc_set_ppr_low (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Set the Program Priority Register to low value.
-
- -- Function: void __ppc_set_ppr_med_low (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Set the Program Priority Register to medium low value.
-
-
-File: libc.info,  Node: Contributors,  Next: Free Manuals,  Prev: Platform,  Up: Top
-
-Appendix F Contributors to the GNU C Library
-********************************************
-
-The GNU C Library project would like to thank its many contributors.
-Without them the project would not have been nearly as successful as it
-has been.  Any omissions in this list are accidental.  Feel free to
-file a bug in bugzilla if you have been left out or some of your
-contributions are not listed.  Please keep this list in alphabetical
-order.
-
-   * Ryan S. Arnold for his improvements for Linux on PowerPC and his
-     direction as FSF Project Steward for the GNU C Library.
-
-   * Miles Bader for writing the `argp' argument-parsing package, and
-     the `argz'/`envz' interfaces.
-
-   * Jeff Bailey for his maintainership of the HPPA architecture.
-
-   * Petr Baudis for bug fixes and testing.
-
-   * Stephen R. van den Berg for contributing a highly-optimized
-     `strstr' function.
-
-   * Ondrej Bilka for contributing optimized string routines for x64
-     and various fixes.
-
-   * Eric Blake for adding O(n) implementations of `memmem', `strstr'
-     and `strcasestr'.
-
-   * Philip Blundell for the ports to Linux/ARM
-     (`arm-ANYTHING-linuxaout') and ARM standalone
-     (`arm-ANYTHING-none'), as well as for parts of the IPv6 support
-     code.
-
-   * Per Bothner for the implementation of the `libio' library which is
-     used to implement `stdio' functions.
-
-   * Mark Brown for his direction as part of the GNU C Library steering
-     committee.
-
-   * Thomas Bushnell for his contributions to Hurd.
-
-   * Liubov Dmitrieva for optimzed string and math functions on x86-64
-     and x86.
-
-   * Ulrich Drepper for his many contributions in almost all parts of
-     the GNU C Library, including:
-        * internationalization support, including the `locale' and
-          `localedef' utilities.
-
-        * Linux i386/ELF support
-
-        * the `hsearch' and `drand48' families of functions, reentrant
-          `...`_r'' versions of the `random' family; System V shared
-          memory and IPC support code
-
-        * several highly-optimized string functions for iX86 processors
-
-        * many math functions
-
-        * the character conversion functions (`iconv')
-
-        * the `ftw' and `nftw' functions
-
-        * the floating-point printing function used by `printf' and
-          friends and the floating-point reading function used by
-          `scanf', `strtod' and friends
-
-        * the `catgets' support and the entire suite of multi-byte and
-          wide-character support functions (`wctype.h', `wchar.h',
-          etc.).
-
-        * versioning of objects on the symbol level
-
-   * Paul Eggert for the `mktime' function and for his direction as
-     part of the GNU C Library steering committee.
-
-   * Steve Ellcey for various fixes.
-
-   * Tulio Magno Quites Machado Filho for adding a new class of
-     installed headers for low-level platform-specific functionality
-     and one such for PowerPC.
-
-   * Mike Frysinger for his maintaining of the IA64 architecture and for
-     testing and bug fixing.
-
-   * Michael Glad for the DES encryption function `crypt' and related
-     functions.
-
-   * Wolfram Gloger for contributing the memory allocation functions
-     functions `malloc', `realloc' and `free' and related code.
-
-   * Torbjo"rn Granlund for fast implementations of many of the string
-     functions (`memcpy', `strlen', etc.).
-
-   * Michael J. Haertel for writing the merge sort function `qsort' and
-     malloc checking functions like `mcheck'.
-
-   * Bruno Haible for his improvements to the `iconv' and locale
+     This function is included in the GNU C Library only for
+     compatibility for SunOS, and may not be supported by other
      implementations.
 
-   * Richard Henderson for the port to Linux on Alpha
-     (`alpha-ANYTHING-linux').
+   Here's a trivial program that illustrates the use of 'exit' and
+'atexit':
 
-   * David Holsgrove for the port to Linux on MicroBlaze.
 
-   * Daniel Jacobowitz for various fixes and enhancements.
+     #include <stdio.h>
+     #include <stdlib.h>
 
-   * Andreas Jaeger for the port to Linux on x86-64
-     (`x86_64-ANYTHING-linux' and his work on Linux for MIPS
-     (`mips-ANYTHING-linux'), implementing the `ldconfig' program,
-     providing a test suite for the math library and for his direction
-     as part of the GNU C Library steering committee.
+     void
+     bye (void)
+     {
+       puts ("Goodbye, cruel world....");
+     }
 
-   * Aurelien Jarno for various fixes.
+     int
+     main (void)
+     {
+       atexit (bye);
+       exit (EXIT_SUCCESS);
+     }
 
-   * Jakub Jelinek for implementing a number of checking functions and
-     for his direction as part of the GNU C Library steering committee.
-
-   * Geoffrey Keating for the port to Linux on PowerPC
-     (`powerpc-ANYTHING-linux').
-
-   * Brendan Kehoe for contributing the port to the MIPS DECStation
-     running Ultrix 4 (`mips-dec-ultrix4') and the port to the DEC Alpha
-     running OSF/1 (`alpha-dec-osf1').
-
-   * Mark Kettenis for implementing the `utmpx' interface and an utmp
-     daemon, and for a Hesiod NSS module.
-
-   * Andi Kleen for implementing pthreads lock elision with TSX.
-
-   * Kazumoto Kojima for the port of the Mach and Hurd code to the MIPS
-     architecture (`mips-ANYTHING-gnu') and for his work on the SH
-     architecture.
-
-   * Andreas Krebbel for his work on Linux for s390 and s390x.
-
-   * Thorsten Kukuk for providing an implementation for NIS (YP) and
-     NIS+, securelevel 0, 1 and 2 and for the implementation for a
-     caching daemon for NSS (`nscd').
-
-   * Jeff Law for various fixes.
-
-   * Doug Lea for contributing the memory allocation functions
-     functions `malloc', `realloc' and `free' and related code.
-
-   * Chris Leonard for various fixes and enhancements to localedata.
-
-   * Hongjiu Lu for providing the support for a Linux 32-bit runtime
-     environment under x86-64 (x32), for porting to Linux on IA64, for
-     improved string functions, a framework for testing IFUNC
-     implementations, and many bug fixes.
-
-   * Luis Machado for optimized functions on PowerPC.
-
-   * David J. MacKenzie for his contribution to the `getopt' function
-     and writing the `tar.h' header.
-
-   * Greg McGary for adding runtime support for bounds checking.
-
-   * Roland McGrath for writing most of the GNU C Library originally,
-     for his work on the Hurd port, his direction as part of the GNU C
-     Library steering committee and as FSF Project Steward for the GNU
-     C Library, and for many bug fixes and reviewing of contributions.
-
-   * Allan McRae for various fixes.
-
-   * Jason Merrill for the port to the Sequent Symmetry running Dynix
-     version 3 (`i386-sequent-bsd').
-
-   * Chris Metcalf for the port to Linux/Tile (`tilegx-ANYTHING-linux'
-     and `tilepro-ANYTHING-linux').
-
-   * David Miller for contributing the port to Linux/Sparc
-     (`sparc*-ANYTHING-linux').
-
-   * Alan Modra for his improvements for Linux on PowerPC.
-
-   * David Mosberger-Tang for contributing the port to Linux/Alpha
-     (`alpha-ANYTHING-linux').
-
-   * Stephen Moshier for implementing some 128-bit long double format
-     math functions.
-
-   * Stephen Munroe for his port to Linux on PowerPC64
-     (`powerpc64-ANYTHING-linux') and for adding optimized
-     implementations for PowerPC.
-
-   * Joseph S. Myers for numerous bug fixes for the libm functions, for
-     his maintainership of the ARM and MIPS architectures, improving
-     cross-compilation and cross-testing of the GNU C Library, expanded
-     coverage of conformtest, merging the ports/ subdirectory into the
-     GNU C Library main repository and his direction as FSF Project
-     Steward for the GNU C Library.
-
-   * Will Newton for contributing some optimized string functions and
-     pointer encryption support for ARM and various fixes.
-
-   * Carlos O'Donell for his maintainership of the HPPA architecture,
-     for maintaining the GNU C Library web pages and wiki, for his
-     direction as FSF Project Steward for the GNU C Library and various
-     bug fixes.
-
-   * Alexandre Oliva for adding TLS descriptors for LD and GD on x86 and
-     x86-64, for the am33 port, for completing the MIPS n64/n32/o32
-     multilib port, for thread-safety, async-signal safety and
-     async-cancellation safety documentation in the manual, for his
-     direction as FSF Project Maintainer and for various fixes.
-
-   * Paul Pluzhnikov for various fixes.
-
-   * Marek Polacek for various fixes.
-
-   * Siddhesh Poyarekar for various fixes and an implementation of a
-     framework for performance benchmarking of functions.
-
-   * Tom Quinn for contributing the startup code to support SunOS shared
-     libraries and the port to SGI machines running Irix 4
-     (`mips-sgi-irix4').
-
-   * Pravin Satpute for writing sorting rules for some Indian languages.
-
-   * Douglas C. Schmidt for writing the quick sort function used as a
-     fallback by `qsort'.
-
-   * Will Schmidt for optimized string functions on PowerPC.
-
-   * Andreas Schwab for the port to Linux/m68k (`m68k-ANYTHING-linux')
-     and for his direction as part of the GNU C Library steering
-     committee.
-
-   * Martin Schwidefsky for porting to Linux on s390
-     (`s390-ANYTHING-linux') and s390x (`s390x-ANYTHING-linux').
-
-   * Thomas Schwinge for his contribution to Hurd and the SH
-     architecture.
-
-   * Carlos Eduardo Seo for optimized functions on PowerPC.
-
-   * Marcus Shawcroft for contributing the AArch64 port.
-
-   * Franz Sirl for various fixes.
-
-   * Jes Sorensen for porting to Linux on IA64 (`ia64-ANYTHING-linux').
-
-   * Richard Stallman for his contribution to the `getopt' function.
-
-   * Alfred M. Szmidt for various fixes.
-
-   * Ian Lance Taylor for contributing the port to the MIPS DECStation
-     running Ultrix 4 (`mips-dec-ultrix4').
-
-   * Samuel Thibault for improving the Hurd port.
-
-   * Tim Waugh for the implementation of the POSIX.2 `wordexp' function
-     family.
-
-   * Eric Youngdale for implementing versioning of objects on the
-     symbol level.
-
-   * Adhemerval Zanella for optimized functions on PowerPC.
-
-
-   Some code in the GNU C Library comes from other projects and might
-be under a different license:
-
-   * The timezone support code is derived from the public-domain
-     timezone package by Arthur David Olson and his many contributors.
-
-   * Some of the support code for Mach is taken from Mach 3.0 by CMU;
-     the file if_ppp.h is also copyright by CMU, but under a different
-     license; see the file `LICENSES' for the text of the licenses.
-
-   * The random number generation functions `random', `srandom',
-     `setstate' and `initstate', which are also the basis for the
-     `rand' and `srand' functions, were written by Earl T. Cohen for
-     the University of California at Berkeley and are copyrighted by the
-     Regents of the University of California.  They have undergone minor
-     changes to fit into the GNU C Library and to fit the ISO C
-     standard, but the functional code is Berkeley's.
-
-   * The Internet-related code (most of the `inet' subdirectory) and
-     several other miscellaneous functions and header files have been
-     included from 4.4 BSD with little or no modification.  The copying
-     permission notice for this code can be found in the file `LICENSES'
-     in the source distribution.
-
-   * The `getaddrinfo' and `getnameinfo' functions and supporting code
-     were written by Craig Metz; see the file `LICENSES' for details on
-     their licensing.
-
-   * The DNS resolver code is taken directly from BIND 4.9.5, which
-     includes copyrighted code from UC Berkeley and from Digital
-     Equipment Corporation.  See the file `LICENSES' for the text of
-     the DEC license.
-
-   * The code to support Sun RPC is taken verbatim from Sun's
-     RPCSRC-4.0 distribution; see the file `LICENSES' for the text of
-     the license.
-
-   * The math functions are taken from `fdlibm-5.1' by Sun
-     Microsystems, as modified by J.T. Conklin, Ian Lance Taylor,
-     Ulrich Drepper, Andreas Schwab, and Roland McGrath.
-
-   * Many of the IEEE 64-bit double precision math functions (in the
-     `sysdeps/ieee754/dbl-64' subdirectory) come from the IBM Accurate
-     Mathematical Library, contributed by IBM.
-
-   * Many of the IA64 math functions are taken from a collection of
-     "Highly Optimized Mathematical Functions for Itanium" that Intel
-     makes available under a free license; see the file `LICENSES' for
-     details.
-
+When this program is executed, it just prints the message and exits.
 
 
-File: libc.info,  Node: Free Manuals,  Next: Copying,  Prev: Contributors,  Up: Top
+File: libc.info,  Node: Aborting a Program,  Next: Termination Internals,  Prev: Cleanups on Exit,  Up: Program Termination
 
-Appendix G Free Software Needs Free Documentation
-*************************************************
+25.7.4 Aborting a Program
+-------------------------
 
-The biggest deficiency in the free software community today is not in
-the software--it is the lack of good free documentation that we can
-include with the free software.  Many of our most important programs do
-not come with free reference manuals and free introductory texts.
-Documentation is an essential part of any software package; when an
-important free software package does not come with a free manual and a
-free tutorial, that is a major gap.  We have many such gaps today.
+You can abort your program using the 'abort' function.  The prototype
+for this function is in 'stdlib.h'.
 
-   Consider Perl, for instance.  The tutorial manuals that people
-normally use are non-free.  How did this come about?  Because the
-authors of those manuals published them with restrictive terms--no
-copying, no modification, source files not available--which exclude
-them from the free software world.
+ -- Function: void abort (void)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
 
-   That wasn't the first time this sort of thing happened, and it was
-far from the last.  Many times we have heard a GNU user eagerly
-describe a manual that he is writing, his intended contribution to the
-community, only to learn that he had ruined everything by signing a
-publication contract to make it non-free.
+     The 'abort' function causes abnormal program termination.  This
+     does not execute cleanup functions registered with 'atexit' or
+     'on_exit'.
 
-   Free documentation, like free software, is a matter of freedom, not
-price.  The problem with the non-free manual is not that publishers
-charge a price for printed copies--that in itself is fine.  (The Free
-Software Foundation sells printed copies of manuals, too.)  The problem
-is the restrictions on the use of the manual.  Free manuals are
-available in source code form, and give you permission to copy and
-modify.  Non-free manuals do not allow this.
+     This function actually terminates the process by raising a
+     'SIGABRT' signal, and your program can include a handler to
+     intercept this signal; see *note Signal Handling::.
 
-   The criteria of freedom for a free manual are roughly the same as for
-free software.  Redistribution (including the normal kinds of
-commercial redistribution) must be permitted, so that the manual can
-accompany every copy of the program, both on-line and on paper.
+   *Future Change Warning:* Proposed Federal censorship regulations may
+prohibit us from giving you information about the possibility of calling
+this function.  We would be required to say that this is not an
+acceptable way of terminating a program.
 
-   Permission for modification of the technical content is crucial too.
-When people modify the software, adding or changing features, if they
-are conscientious they will change the manual too--so they can provide
-accurate and clear documentation for the modified program.  A manual
-that leaves you no choice but to write a new manual to document a
-changed version of the program is not really available to our community.
+
+File: libc.info,  Node: Termination Internals,  Prev: Aborting a Program,  Up: Program Termination
 
-   Some kinds of limits on the way modification is handled are
-acceptable.  For example, requirements to preserve the original
-author's copyright notice, the distribution terms, or the list of
-authors, are ok.  It is also no problem to require modified versions to
-include notice that they were modified.  Even entire sections that may
-not be deleted or changed are acceptable, as long as they deal with
-nontechnical topics (like this one).  These kinds of restrictions are
-acceptable because they don't obstruct the community's normal use of
-the manual.
+25.7.5 Termination Internals
+----------------------------
 
-   However, it must be possible to modify all the _technical_ content
-of the manual, and then distribute the result in all the usual media,
-through all the usual channels.  Otherwise, the restrictions obstruct
-the use of the manual, it is not free, and we need another manual to
-replace it.
+The '_exit' function is the primitive used for process termination by
+'exit'.  It is declared in the header file 'unistd.h'.
 
-   Please spread the word about this issue.  Our community continues to
-lose manuals to proprietary publishing.  If we spread the word that
-free software needs free reference manuals and free tutorials, perhaps
-the next person who wants to contribute by writing documentation will
-realize, before it is too late, that only free manuals contribute to
-the free software community.
+ -- Function: void _exit (int STATUS)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-   If you are writing documentation, please insist on publishing it
-under the GNU Free Documentation License or another free documentation
-license.  Remember that this decision requires your approval--you don't
-have to let the publisher decide.  Some commercial publishers will use
-a free license if you insist, but they will not propose the option; it
-is up to you to raise the issue and say firmly that this is what you
-want.  If the publisher you are dealing with refuses, please try other
-publishers.  If you're not sure whether a proposed license is free,
-write to <licensing@gnu.org>.
+     The '_exit' function is the primitive for causing a process to
+     terminate with status STATUS.  Calling this function does not
+     execute cleanup functions registered with 'atexit' or 'on_exit'.
 
-   You can encourage commercial publishers to sell more free, copylefted
-manuals and tutorials by buying them, and particularly by buying copies
-from the publishers that paid for their writing or for major
-improvements.  Meanwhile, try to avoid buying non-free documentation at
-all.  Check the distribution terms of a manual before you buy it, and
-insist that whoever seeks your business must respect your freedom.
-Check the history of the book, and try reward the publishers that have
-paid or pay the authors to work on it.
+ -- Function: void _Exit (int STATUS)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-   The Free Software Foundation maintains a list of free documentation
-published by other publishers, at
-`http://www.fsf.org/doc/other-free-books.html'.
+     The '_Exit' function is the ISO C equivalent to '_exit'.  The ISO C
+     committee members were not sure whether the definitions of '_exit'
+     and '_Exit' were compatible so they have not used the POSIX name.
+
+     This function was introduced in ISO C99 and is declared in
+     'stdlib.h'.
+
+   When a process terminates for any reason--either because the program
+terminates, or as a result of a signal--the following things happen:
+
+   * All open file descriptors in the process are closed.  *Note
+     Low-Level I/O::.  Note that streams are not flushed automatically
+     when the process terminates; see *note I/O on Streams::.
+
+   * A process exit status is saved to be reported back to the parent
+     process via 'wait' or 'waitpid'; see *note Process Completion::.
+     If the program exited, this status includes as its low-order 8 bits
+     the program exit status.
+
+   * Any child processes of the process being terminated are assigned a
+     new parent process.  (On most systems, including GNU, this is the
+     'init' process, with process ID 1.)
+
+   * A 'SIGCHLD' signal is sent to the parent process.
+
+   * If the process is a session leader that has a controlling terminal,
+     then a 'SIGHUP' signal is sent to each process in the foreground
+     job, and the controlling terminal is disassociated from that
+     session.  *Note Job Control::.
+
+   * If termination of a process causes a process group to become
+     orphaned, and any member of that process group is stopped, then a
+     'SIGHUP' signal and a 'SIGCONT' signal are sent to each process in
+     the group.  *Note Job Control::.
+
+
+File: libc.info,  Node: Processes,  Next: Job Control,  Prev: Program Basics,  Up: Top
+
+26 Processes
+************
+
+"Processes" are the primitive units for allocation of system resources.
+Each process has its own address space and (usually) one thread of
+control.  A process executes a program; you can have multiple processes
+executing the same program, but each process has its own copy of the
+program within its own address space and executes it independently of
+the other copies.
+
+   Processes are organized hierarchically.  Each process has a "parent
+process" which explicitly arranged to create it.  The processes created
+by a given parent are called its "child processes".  A child inherits
+many of its attributes from the parent process.
+
+   This chapter describes how a program can create, terminate, and
+control child processes.  Actually, there are three distinct operations
+involved: creating a new child process, causing the new process to
+execute a program, and coordinating the completion of the child process
+with the original program.
+
+   The 'system' function provides a simple, portable mechanism for
+running another program; it does all three steps automatically.  If you
+need more control over the details of how this is done, you can use the
+primitive functions to do each step individually instead.
+
+* Menu:
+
+* Running a Command::           The easy way to run another program.
+* Process Creation Concepts::   An overview of the hard way to do it.
+* Process Identification::      How to get the process ID of a process.
+* Creating a Process::          How to fork a child process.
+* Executing a File::            How to make a process execute another program.
+* Process Completion::          How to tell when a child process has completed.
+* Process Completion Status::   How to interpret the status value
+                                 returned from a child process.
+* BSD Wait Functions::  	More functions, for backward compatibility.
+* Process Creation Example::    A complete example program.
+
+
+File: libc.info,  Node: Running a Command,  Next: Process Creation Concepts,  Up: Processes
+
+26.1 Running a Command
+======================
+
+The easy way to run another program is to use the 'system' function.
+This function does all the work of running a subprogram, but it doesn't
+give you much control over the details: you have to wait until the
+subprogram terminates before you can do anything else.
+
+ -- Function: int system (const char *COMMAND)
+     Preliminary: | MT-Safe | AS-Unsafe plugin heap lock | AC-Unsafe
+     lock mem | *Note POSIX Safety Concepts::.
+
+     This function executes COMMAND as a shell command.  In the GNU C
+     Library, it always uses the default shell 'sh' to run the command.
+     In particular, it searches the directories in 'PATH' to find
+     programs to execute.  The return value is '-1' if it wasn't
+     possible to create the shell process, and otherwise is the status
+     of the shell process.  *Note Process Completion::, for details on
+     how this status code can be interpreted.
+
+     If the COMMAND argument is a null pointer, a return value of zero
+     indicates that no command processor is available.
+
+     This function is a cancellation point in multi-threaded programs.
+     This is a problem if the thread allocates some resources (like
+     memory, file descriptors, semaphores or whatever) at the time
+     'system' is called.  If the thread gets canceled these resources
+     stay allocated until the program ends.  To avoid this calls to
+     'system' should be protected using cancellation handlers.
+
+     The 'system' function is declared in the header file 'stdlib.h'.
+
+   *Portability Note:* Some C implementations may not have any notion of
+a command processor that can execute other programs.  You can determine
+whether a command processor exists by executing 'system (NULL)'; if the
+return value is nonzero, a command processor is available.
+
+   The 'popen' and 'pclose' functions (*note Pipe to a Subprocess::) are
+closely related to the 'system' function.  They allow the parent process
+to communicate with the standard input and output channels of the
+command being executed.
+
+
+File: libc.info,  Node: Process Creation Concepts,  Next: Process Identification,  Prev: Running a Command,  Up: Processes
+
+26.2 Process Creation Concepts
+==============================
+
+This section gives an overview of processes and of the steps involved in
+creating a process and making it run another program.
+
+   Each process is named by a "process ID" number.  A unique process ID
+is allocated to each process when it is created.  The "lifetime" of a
+process ends when its termination is reported to its parent process; at
+that time, all of the process resources, including its process ID, are
+freed.
+
+   Processes are created with the 'fork' system call (so the operation
+of creating a new process is sometimes called "forking" a process).  The
+"child process" created by 'fork' is a copy of the original "parent
+process", except that it has its own process ID.
+
+   After forking a child process, both the parent and child processes
+continue to execute normally.  If you want your program to wait for a
+child process to finish executing before continuing, you must do this
+explicitly after the fork operation, by calling 'wait' or 'waitpid'
+(*note Process Completion::).  These functions give you limited
+information about why the child terminated--for example, its exit status
+code.
+
+   A newly forked child process continues to execute the same program as
+its parent process, at the point where the 'fork' call returns.  You can
+use the return value from 'fork' to tell whether the program is running
+in the parent process or the child.
+
+   Having several processes run the same program is only occasionally
+useful.  But the child can execute another program using one of the
+'exec' functions; see *note Executing a File::.  The program that the
+process is executing is called its "process image".  Starting execution
+of a new program causes the process to forget all about its previous
+process image; when the new program exits, the process exits too,
+instead of returning to the previous process image.
+
+
+File: libc.info,  Node: Process Identification,  Next: Creating a Process,  Prev: Process Creation Concepts,  Up: Processes
+
+26.3 Process Identification
+===========================
+
+The 'pid_t' data type represents process IDs.  You can get the process
+ID of a process by calling 'getpid'.  The function 'getppid' returns the
+process ID of the parent of the current process (this is also known as
+the "parent process ID"). Your program should include the header files
+'unistd.h' and 'sys/types.h' to use these functions.
+
+ -- Data Type: pid_t
+     The 'pid_t' data type is a signed integer type which is capable of
+     representing a process ID. In the GNU C Library, this is an 'int'.
+
+ -- Function: pid_t getpid (void)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'getpid' function returns the process ID of the current
+     process.
+
+ -- Function: pid_t getppid (void)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'getppid' function returns the process ID of the parent of the
+     current process.
+
+
+File: libc.info,  Node: Creating a Process,  Next: Executing a File,  Prev: Process Identification,  Up: Processes
+
+26.4 Creating a Process
+=======================
+
+The 'fork' function is the primitive for creating a process.  It is
+declared in the header file 'unistd.h'.
+
+ -- Function: pid_t fork (void)
+     Preliminary: | MT-Safe | AS-Unsafe plugin | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     The 'fork' function creates a new process.
+
+     If the operation is successful, there are then both parent and
+     child processes and both see 'fork' return, but with different
+     values: it returns a value of '0' in the child process and returns
+     the child's process ID in the parent process.
+
+     If process creation failed, 'fork' returns a value of '-1' in the
+     parent process.  The following 'errno' error conditions are defined
+     for 'fork':
+
+     'EAGAIN'
+          There aren't enough system resources to create another
+          process, or the user already has too many processes running.
+          This means exceeding the 'RLIMIT_NPROC' resource limit, which
+          can usually be increased; *note Limits on Resources::.
+
+     'ENOMEM'
+          The process requires more space than the system can supply.
+
+   The specific attributes of the child process that differ from the
+parent process are:
+
+   * The child process has its own unique process ID.
+
+   * The parent process ID of the child process is the process ID of its
+     parent process.
+
+   * The child process gets its own copies of the parent process's open
+     file descriptors.  Subsequently changing attributes of the file
+     descriptors in the parent process won't affect the file descriptors
+     in the child, and vice versa.  *Note Control Operations::.
+     However, the file position associated with each descriptor is
+     shared by both processes; *note File Position::.
+
+   * The elapsed processor times for the child process are set to zero;
+     see *note Processor Time::.
+
+   * The child doesn't inherit file locks set by the parent process.
+     *Note Control Operations::.
+
+   * The child doesn't inherit alarms set by the parent process.  *Note
+     Setting an Alarm::.
+
+   * The set of pending signals (*note Delivery of Signal::) for the
+     child process is cleared.  (The child process inherits its mask of
+     blocked signals and signal actions from the parent process.)
+
+ -- Function: pid_t vfork (void)
+     Preliminary: | MT-Safe | AS-Unsafe plugin | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     The 'vfork' function is similar to 'fork' but on some systems it is
+     more efficient; however, there are restrictions you must follow to
+     use it safely.
+
+     While 'fork' makes a complete copy of the calling process's address
+     space and allows both the parent and child to execute
+     independently, 'vfork' does not make this copy.  Instead, the child
+     process created with 'vfork' shares its parent's address space
+     until it calls '_exit' or one of the 'exec' functions.  In the
+     meantime, the parent process suspends execution.
+
+     You must be very careful not to allow the child process created
+     with 'vfork' to modify any global data or even local variables
+     shared with the parent.  Furthermore, the child process cannot
+     return from (or do a long jump out of) the function that called
+     'vfork'!  This would leave the parent process's control information
+     very confused.  If in doubt, use 'fork' instead.
+
+     Some operating systems don't really implement 'vfork'.  The GNU C
+     Library permits you to use 'vfork' on all systems, but actually
+     executes 'fork' if 'vfork' isn't available.  If you follow the
+     proper precautions for using 'vfork', your program will still work
+     even if the system uses 'fork' instead.
+
+
+File: libc.info,  Node: Executing a File,  Next: Process Completion,  Prev: Creating a Process,  Up: Processes
+
+26.5 Executing a File
+=====================
+
+This section describes the 'exec' family of functions, for executing a
+file as a process image.  You can use these functions to make a child
+process execute a new program after it has been forked.
+
+   To see the effects of 'exec' from the point of view of the called
+program, see *note Program Basics::.
+
+   The functions in this family differ in how you specify the arguments,
+but otherwise they all do the same thing.  They are declared in the
+header file 'unistd.h'.
+
+ -- Function: int execv (const char *FILENAME, char *const ARGV[])
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'execv' function executes the file named by FILENAME as a new
+     process image.
+
+     The ARGV argument is an array of null-terminated strings that is
+     used to provide a value for the 'argv' argument to the 'main'
+     function of the program to be executed.  The last element of this
+     array must be a null pointer.  By convention, the first element of
+     this array is the file name of the program sans directory names.
+     *Note Program Arguments::, for full details on how programs can
+     access these arguments.
+
+     The environment for the new process image is taken from the
+     'environ' variable of the current process image; see *note
+     Environment Variables::, for information about environments.
+
+ -- Function: int execl (const char *FILENAME, const char *ARG0, ...)
+     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
+     POSIX Safety Concepts::.
+
+     This is similar to 'execv', but the ARGV strings are specified
+     individually instead of as an array.  A null pointer must be passed
+     as the last such argument.
+
+ -- Function: int execve (const char *FILENAME, char *const ARGV[], char
+          *const ENV[])
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This is similar to 'execv', but permits you to specify the
+     environment for the new program explicitly as the ENV argument.
+     This should be an array of strings in the same format as for the
+     'environ' variable; see *note Environment Access::.
+
+ -- Function: int execle (const char *FILENAME, const char *ARG0, ...,
+          char *const ENV[])
+     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
+     POSIX Safety Concepts::.
+
+     This is similar to 'execl', but permits you to specify the
+     environment for the new program explicitly.  The environment
+     argument is passed following the null pointer that marks the last
+     ARGV argument, and should be an array of strings in the same format
+     as for the 'environ' variable.
+
+ -- Function: int execvp (const char *FILENAME, char *const ARGV[])
+     Preliminary: | MT-Safe env | AS-Unsafe heap | AC-Unsafe mem | *Note
+     POSIX Safety Concepts::.
+
+     The 'execvp' function is similar to 'execv', except that it
+     searches the directories listed in the 'PATH' environment variable
+     (*note Standard Environment::) to find the full file name of a file
+     from FILENAME if FILENAME does not contain a slash.
+
+     This function is useful for executing system utility programs,
+     because it looks for them in the places that the user has chosen.
+     Shells use it to run the commands that users type.
+
+ -- Function: int execlp (const char *FILENAME, const char *ARG0, ...)
+     Preliminary: | MT-Safe env | AS-Unsafe heap | AC-Unsafe mem | *Note
+     POSIX Safety Concepts::.
+
+     This function is like 'execl', except that it performs the same
+     file name searching as the 'execvp' function.
+
+   The size of the argument list and environment list taken together
+must not be greater than 'ARG_MAX' bytes.  *Note General Limits::.  On
+GNU/Hurd systems, the size (which compares against 'ARG_MAX') includes,
+for each string, the number of characters in the string, plus the size
+of a 'char *', plus one, rounded up to a multiple of the size of a 'char
+*'.  Other systems may have somewhat different rules for counting.
+
+   These functions normally don't return, since execution of a new
+program causes the currently executing program to go away completely.  A
+value of '-1' is returned in the event of a failure.  In addition to the
+usual file name errors (*note File Name Errors::), the following 'errno'
+error conditions are defined for these functions:
+
+'E2BIG'
+     The combined size of the new program's argument list and
+     environment list is larger than 'ARG_MAX' bytes.  GNU/Hurd systems
+     have no specific limit on the argument list size, so this error
+     code cannot result, but you may get 'ENOMEM' instead if the
+     arguments are too big for available memory.
+
+'ENOEXEC'
+     The specified file can't be executed because it isn't in the right
+     format.
+
+'ENOMEM'
+     Executing the specified file requires more storage than is
+     available.
+
+   If execution of the new file succeeds, it updates the access time
+field of the file as if the file had been read.  *Note File Times::, for
+more details about access times of files.
+
+   The point at which the file is closed again is not specified, but is
+at some point before the process exits or before another process image
+is executed.
+
+   Executing a new process image completely changes the contents of
+memory, copying only the argument and environment strings to new
+locations.  But many other attributes of the process are unchanged:
+
+   * The process ID and the parent process ID. *Note Process Creation
+     Concepts::.
+
+   * Session and process group membership.  *Note Concepts of Job
+     Control::.
+
+   * Real user ID and group ID, and supplementary group IDs.  *Note
+     Process Persona::.
+
+   * Pending alarms.  *Note Setting an Alarm::.
+
+   * Current working directory and root directory.  *Note Working
+     Directory::.  On GNU/Hurd systems, the root directory is not copied
+     when executing a setuid program; instead the system default root
+     directory is used for the new program.
+
+   * File mode creation mask.  *Note Setting Permissions::.
+
+   * Process signal mask; see *note Process Signal Mask::.
+
+   * Pending signals; see *note Blocking Signals::.
+
+   * Elapsed processor time associated with the process; see *note
+     Processor Time::.
+
+   If the set-user-ID and set-group-ID mode bits of the process image
+file are set, this affects the effective user ID and effective group ID
+(respectively) of the process.  These concepts are discussed in detail
+in *note Process Persona::.
+
+   Signals that are set to be ignored in the existing process image are
+also set to be ignored in the new process image.  All other signals are
+set to the default action in the new process image.  For more
+information about signals, see *note Signal Handling::.
+
+   File descriptors open in the existing process image remain open in
+the new process image, unless they have the 'FD_CLOEXEC' (close-on-exec)
+flag set.  The files that remain open inherit all attributes of the open
+file description from the existing process image, including file locks.
+File descriptors are discussed in *note Low-Level I/O::.
+
+   Streams, by contrast, cannot survive through 'exec' functions,
+because they are located in the memory of the process itself.  The new
+process image has no streams except those it creates afresh.  Each of
+the streams in the pre-'exec' process image has a descriptor inside it,
+and these descriptors do survive through 'exec' (provided that they do
+not have 'FD_CLOEXEC' set).  The new process image can reconnect these
+to new streams using 'fdopen' (*note Descriptors and Streams::).
+
+
+File: libc.info,  Node: Process Completion,  Next: Process Completion Status,  Prev: Executing a File,  Up: Processes
+
+26.6 Process Completion
+=======================
+
+The functions described in this section are used to wait for a child
+process to terminate or stop, and determine its status.  These functions
+are declared in the header file 'sys/wait.h'.
+
+ -- Function: pid_t waitpid (pid_t PID, int *STATUS-PTR, int OPTIONS)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'waitpid' function is used to request status information from a
+     child process whose process ID is PID.  Normally, the calling
+     process is suspended until the child process makes status
+     information available by terminating.
+
+     Other values for the PID argument have special interpretations.  A
+     value of '-1' or 'WAIT_ANY' requests status information for any
+     child process; a value of '0' or 'WAIT_MYPGRP' requests information
+     for any child process in the same process group as the calling
+     process; and any other negative value - PGID requests information
+     for any child process whose process group ID is PGID.
+
+     If status information for a child process is available immediately,
+     this function returns immediately without waiting.  If more than
+     one eligible child process has status information available, one of
+     them is chosen randomly, and its status is returned immediately.
+     To get the status from the other eligible child processes, you need
+     to call 'waitpid' again.
+
+     The OPTIONS argument is a bit mask.  Its value should be the
+     bitwise OR (that is, the '|' operator) of zero or more of the
+     'WNOHANG' and 'WUNTRACED' flags.  You can use the 'WNOHANG' flag to
+     indicate that the parent process shouldn't wait; and the
+     'WUNTRACED' flag to request status information from stopped
+     processes as well as processes that have terminated.
+
+     The status information from the child process is stored in the
+     object that STATUS-PTR points to, unless STATUS-PTR is a null
+     pointer.
+
+     This function is a cancellation point in multi-threaded programs.
+     This is a problem if the thread allocates some resources (like
+     memory, file descriptors, semaphores or whatever) at the time
+     'waitpid' is called.  If the thread gets canceled these resources
+     stay allocated until the program ends.  To avoid this calls to
+     'waitpid' should be protected using cancellation handlers.
+
+     The return value is normally the process ID of the child process
+     whose status is reported.  If there are child processes but none of
+     them is waiting to be noticed, 'waitpid' will block until one is.
+     However, if the 'WNOHANG' option was specified, 'waitpid' will
+     return zero instead of blocking.
+
+     If a specific PID to wait for was given to 'waitpid', it will
+     ignore all other children (if any).  Therefore if there are
+     children waiting to be noticed but the child whose PID was
+     specified is not one of them, 'waitpid' will block or return zero
+     as described above.
+
+     A value of '-1' is returned in case of error.  The following
+     'errno' error conditions are defined for this function:
+
+     'EINTR'
+          The function was interrupted by delivery of a signal to the
+          calling process.  *Note Interrupted Primitives::.
+
+     'ECHILD'
+          There are no child processes to wait for, or the specified PID
+          is not a child of the calling process.
+
+     'EINVAL'
+          An invalid value was provided for the OPTIONS argument.
+
+   These symbolic constants are defined as values for the PID argument
+to the 'waitpid' function.
+
+'WAIT_ANY'
+
+     This constant macro (whose value is '-1') specifies that 'waitpid'
+     should return status information about any child process.
+
+'WAIT_MYPGRP'
+     This constant (with value '0') specifies that 'waitpid' should
+     return status information about any child process in the same
+     process group as the calling process.
+
+   These symbolic constants are defined as flags for the OPTIONS
+argument to the 'waitpid' function.  You can bitwise-OR the flags
+together to obtain a value to use as the argument.
+
+'WNOHANG'
+
+     This flag specifies that 'waitpid' should return immediately
+     instead of waiting, if there is no child process ready to be
+     noticed.
+
+'WUNTRACED'
+
+     This flag specifies that 'waitpid' should report the status of any
+     child processes that have been stopped as well as those that have
+     terminated.
+
+ -- Function: pid_t wait (int *STATUS-PTR)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This is a simplified version of 'waitpid', and is used to wait
+     until any one child process terminates.  The call:
+
+          wait (&status)
+
+     is exactly equivalent to:
+
+          waitpid (-1, &status, 0)
+
+     This function is a cancellation point in multi-threaded programs.
+     This is a problem if the thread allocates some resources (like
+     memory, file descriptors, semaphores or whatever) at the time
+     'wait' is called.  If the thread gets canceled these resources stay
+     allocated until the program ends.  To avoid this calls to 'wait'
+     should be protected using cancellation handlers.
+
+ -- Function: pid_t wait4 (pid_t PID, int *STATUS-PTR, int OPTIONS,
+          struct rusage *USAGE)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     If USAGE is a null pointer, 'wait4' is equivalent to 'waitpid (PID,
+     STATUS-PTR, OPTIONS)'.
+
+     If USAGE is not null, 'wait4' stores usage figures for the child
+     process in '*RUSAGE' (but only if the child has terminated, not if
+     it has stopped).  *Note Resource Usage::.
+
+     This function is a BSD extension.
+
+   Here's an example of how to use 'waitpid' to get the status from all
+child processes that have terminated, without ever waiting.  This
+function is designed to be a handler for 'SIGCHLD', the signal that
+indicates that at least one child process has terminated.
+
+     void
+     sigchld_handler (int signum)
+     {
+       int pid, status, serrno;
+       serrno = errno;
+       while (1)
+         {
+           pid = waitpid (WAIT_ANY, &status, WNOHANG);
+           if (pid < 0)
+             {
+               perror ("waitpid");
+               break;
+             }
+           if (pid == 0)
+             break;
+           notice_termination (pid, status);
+         }
+       errno = serrno;
+     }
+
+
+File: libc.info,  Node: Process Completion Status,  Next: BSD Wait Functions,  Prev: Process Completion,  Up: Processes
+
+26.7 Process Completion Status
+==============================
+
+If the exit status value (*note Program Termination::) of the child
+process is zero, then the status value reported by 'waitpid' or 'wait'
+is also zero.  You can test for other kinds of information encoded in
+the returned status value using the following macros.  These macros are
+defined in the header file 'sys/wait.h'.
+
+ -- Macro: int WIFEXITED (int STATUS)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This macro returns a nonzero value if the child process terminated
+     normally with 'exit' or '_exit'.
+
+ -- Macro: int WEXITSTATUS (int STATUS)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     If 'WIFEXITED' is true of STATUS, this macro returns the low-order
+     8 bits of the exit status value from the child process.  *Note Exit
+     Status::.
+
+ -- Macro: int WIFSIGNALED (int STATUS)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This macro returns a nonzero value if the child process terminated
+     because it received a signal that was not handled.  *Note Signal
+     Handling::.
+
+ -- Macro: int WTERMSIG (int STATUS)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     If 'WIFSIGNALED' is true of STATUS, this macro returns the signal
+     number of the signal that terminated the child process.
+
+ -- Macro: int WCOREDUMP (int STATUS)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This macro returns a nonzero value if the child process terminated
+     and produced a core dump.
+
+ -- Macro: int WIFSTOPPED (int STATUS)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This macro returns a nonzero value if the child process is stopped.
+
+ -- Macro: int WSTOPSIG (int STATUS)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     If 'WIFSTOPPED' is true of STATUS, this macro returns the signal
+     number of the signal that caused the child process to stop.
+
+
+File: libc.info,  Node: BSD Wait Functions,  Next: Process Creation Example,  Prev: Process Completion Status,  Up: Processes
+
+26.8 BSD Process Wait Functions
+===============================
+
+The GNU C Library also provides these related facilities for
+compatibility with BSD Unix.  BSD uses the 'union wait' data type to
+represent status values rather than an 'int'.  The two representations
+are actually interchangeable; they describe the same bit patterns.  The
+GNU C Library defines macros such as 'WEXITSTATUS' so that they will
+work on either kind of object, and the 'wait' function is defined to
+accept either type of pointer as its STATUS-PTR argument.
+
+   These functions are declared in 'sys/wait.h'.
+
+ -- Data Type: union wait
+     This data type represents program termination status values.  It
+     has the following members:
+
+     'int w_termsig'
+          The value of this member is the same as that of the 'WTERMSIG'
+          macro.
+
+     'int w_coredump'
+          The value of this member is the same as that of the
+          'WCOREDUMP' macro.
+
+     'int w_retcode'
+          The value of this member is the same as that of the
+          'WEXITSTATUS' macro.
+
+     'int w_stopsig'
+          The value of this member is the same as that of the 'WSTOPSIG'
+          macro.
+
+     Instead of accessing these members directly, you should use the
+     equivalent macros.
+
+   The 'wait3' function is the predecessor to 'wait4', which is more
+flexible.  'wait3' is now obsolete.
+
+ -- Function: pid_t wait3 (union wait *STATUS-PTR, int OPTIONS, struct
+          rusage *USAGE)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     If USAGE is a null pointer, 'wait3' is equivalent to 'waitpid (-1,
+     STATUS-PTR, OPTIONS)'.
+
+     If USAGE is not null, 'wait3' stores usage figures for the child
+     process in '*RUSAGE' (but only if the child has terminated, not if
+     it has stopped).  *Note Resource Usage::.
+
+
+File: libc.info,  Node: Process Creation Example,  Prev: BSD Wait Functions,  Up: Processes
+
+26.9 Process Creation Example
+=============================
+
+Here is an example program showing how you might write a function
+similar to the built-in 'system'.  It executes its COMMAND argument
+using the equivalent of 'sh -c COMMAND'.
+
+     #include <stddef.h>
+     #include <stdlib.h>
+     #include <unistd.h>
+     #include <sys/types.h>
+     #include <sys/wait.h>
+
+     /* Execute the command using this shell program.  */
+     #define SHELL "/bin/sh"
+
+     int
+     my_system (const char *command)
+     {
+       int status;
+       pid_t pid;
+
+       pid = fork ();
+       if (pid == 0)
+         {
+           /* This is the child process.  Execute the shell command. */
+           execl (SHELL, SHELL, "-c", command, NULL);
+           _exit (EXIT_FAILURE);
+         }
+       else if (pid < 0)
+         /* The fork failed.  Report failure.  */
+         status = -1;
+       else
+         /* This is the parent process.  Wait for the child to complete.  */
+         if (waitpid (pid, &status, 0) != pid)
+           status = -1;
+       return status;
+     }
+
+   There are a couple of things you should pay attention to in this
+example.
+
+   Remember that the first 'argv' argument supplied to the program
+represents the name of the program being executed.  That is why, in the
+call to 'execl', 'SHELL' is supplied once to name the program to execute
+and a second time to supply a value for 'argv[0]'.
+
+   The 'execl' call in the child process doesn't return if it is
+successful.  If it fails, you must do something to make the child
+process terminate.  Just returning a bad status code with 'return' would
+leave two processes running the original program.  Instead, the right
+behavior is for the child process to report failure to its parent
+process.
+
+   Call '_exit' to accomplish this.  The reason for using '_exit'
+instead of 'exit' is to avoid flushing fully buffered streams such as
+'stdout'.  The buffers of these streams probably contain data that was
+copied from the parent process by the 'fork', data that will be output
+eventually by the parent process.  Calling 'exit' in the child would
+output the data twice.  *Note Termination Internals::.
+
+
+File: libc.info,  Node: Job Control,  Next: Name Service Switch,  Prev: Processes,  Up: Top
+
+27 Job Control
+**************
+
+"Job control" refers to the protocol for allowing a user to move between
+multiple "process groups" (or "jobs") within a single "login session".
+The job control facilities are set up so that appropriate behavior for
+most programs happens automatically and they need not do anything
+special about job control.  So you can probably ignore the material in
+this chapter unless you are writing a shell or login program.
+
+   You need to be familiar with concepts relating to process creation
+(*note Process Creation Concepts::) and signal handling (*note Signal
+Handling::) in order to understand this material presented in this
+chapter.
+
+* Menu:
+
+* Concepts of Job Control::     Jobs can be controlled by a shell.
+* Job Control is Optional::     Not all POSIX systems support job control.
+* Controlling Terminal::        How a process gets its controlling terminal.
+* Access to the Terminal::      How processes share the controlling terminal.
+* Orphaned Process Groups::     Jobs left after the user logs out.
+* Implementing a Shell::        What a shell must do to implement job control.
+* Functions for Job Control::   Functions to control process groups.
+
+
+File: libc.info,  Node: Concepts of Job Control,  Next: Job Control is Optional,  Up: Job Control
+
+27.1 Concepts of Job Control
+============================
+
+The fundamental purpose of an interactive shell is to read commands from
+the user's terminal and create processes to execute the programs
+specified by those commands.  It can do this using the 'fork' (*note
+Creating a Process::) and 'exec' (*note Executing a File::) functions.
+
+   A single command may run just one process--but often one command uses
+several processes.  If you use the '|' operator in a shell command, you
+explicitly request several programs in their own processes.  But even if
+you run just one program, it can use multiple processes internally.  For
+example, a single compilation command such as 'cc -c foo.c' typically
+uses four processes (though normally only two at any given time).  If
+you run 'make', its job is to run other programs in separate processes.
+
+   The processes belonging to a single command are called a "process
+group" or "job".  This is so that you can operate on all of them at
+once.  For example, typing 'C-c' sends the signal 'SIGINT' to terminate
+all the processes in the foreground process group.
+
+   A "session" is a larger group of processes.  Normally all the
+processes that stem from a single login belong to the same session.
+
+   Every process belongs to a process group.  When a process is created,
+it becomes a member of the same process group and session as its parent
+process.  You can put it in another process group using the 'setpgid'
+function, provided the process group belongs to the same session.
+
+   The only way to put a process in a different session is to make it
+the initial process of a new session, or a "session leader", using the
+'setsid' function.  This also puts the session leader into a new process
+group, and you can't move it out of that process group again.
+
+   Usually, new sessions are created by the system login program, and
+the session leader is the process running the user's login shell.
+
+   A shell that supports job control must arrange to control which job
+can use the terminal at any time.  Otherwise there might be multiple
+jobs trying to read from the terminal at once, and confusion about which
+process should receive the input typed by the user.  To prevent this,
+the shell must cooperate with the terminal driver using the protocol
+described in this chapter.
+
+   The shell can give unlimited access to the controlling terminal to
+only one process group at a time.  This is called the "foreground job"
+on that controlling terminal.  Other process groups managed by the shell
+that are executing without such access to the terminal are called
+"background jobs".
+
+   If a background job needs to read from its controlling terminal, it
+is "stopped" by the terminal driver; if the 'TOSTOP' mode is set,
+likewise for writing.  The user can stop a foreground job by typing the
+SUSP character (*note Special Characters::) and a program can stop any
+job by sending it a 'SIGSTOP' signal.  It's the responsibility of the
+shell to notice when jobs stop, to notify the user about them, and to
+provide mechanisms for allowing the user to interactively continue
+stopped jobs and switch jobs between foreground and background.
+
+   *Note Access to the Terminal::, for more information about I/O to the
+controlling terminal,
+
+
+File: libc.info,  Node: Job Control is Optional,  Next: Controlling Terminal,  Prev: Concepts of Job Control,  Up: Job Control
+
+27.2 Job Control is Optional
+============================
+
+Not all operating systems support job control.  GNU systems do support
+job control, but if you are using the GNU C Library on some other
+system, that system may not support job control itself.
+
+   You can use the '_POSIX_JOB_CONTROL' macro to test at compile-time
+whether the system supports job control.  *Note System Options::.
+
+   If job control is not supported, then there can be only one process
+group per session, which behaves as if it were always in the foreground.
+The functions for creating additional process groups simply fail with
+the error code 'ENOSYS'.
+
+   The macros naming the various job control signals (*note Job Control
+Signals::) are defined even if job control is not supported.  However,
+the system never generates these signals, and attempts to send a job
+control signal or examine or specify their actions report errors or do
+nothing.
+
+
+File: libc.info,  Node: Controlling Terminal,  Next: Access to the Terminal,  Prev: Job Control is Optional,  Up: Job Control
+
+27.3 Controlling Terminal of a Process
+======================================
+
+One of the attributes of a process is its controlling terminal.  Child
+processes created with 'fork' inherit the controlling terminal from
+their parent process.  In this way, all the processes in a session
+inherit the controlling terminal from the session leader.  A session
+leader that has control of a terminal is called the "controlling
+process" of that terminal.
+
+   You generally do not need to worry about the exact mechanism used to
+allocate a controlling terminal to a session, since it is done for you
+by the system when you log in.
+
+   An individual process disconnects from its controlling terminal when
+it calls 'setsid' to become the leader of a new session.  *Note Process
+Group Functions::.
+
+
+File: libc.info,  Node: Access to the Terminal,  Next: Orphaned Process Groups,  Prev: Controlling Terminal,  Up: Job Control
+
+27.4 Access to the Controlling Terminal
+=======================================
+
+Processes in the foreground job of a controlling terminal have
+unrestricted access to that terminal; background processes do not.  This
+section describes in more detail what happens when a process in a
+background job tries to access its controlling terminal.
+
+   When a process in a background job tries to read from its controlling
+terminal, the process group is usually sent a 'SIGTTIN' signal.  This
+normally causes all of the processes in that group to stop (unless they
+handle the signal and don't stop themselves).  However, if the reading
+process is ignoring or blocking this signal, then 'read' fails with an
+'EIO' error instead.
+
+   Similarly, when a process in a background job tries to write to its
+controlling terminal, the default behavior is to send a 'SIGTTOU' signal
+to the process group.  However, the behavior is modified by the 'TOSTOP'
+bit of the local modes flags (*note Local Modes::).  If this bit is not
+set (which is the default), then writing to the controlling terminal is
+always permitted without sending a signal.  Writing is also permitted if
+the 'SIGTTOU' signal is being ignored or blocked by the writing process.
+
+   Most other terminal operations that a program can do are treated as
+reading or as writing.  (The description of each operation should say
+which.)
+
+   For more information about the primitive 'read' and 'write'
+functions, see *note I/O Primitives::.
+
+
+File: libc.info,  Node: Orphaned Process Groups,  Next: Implementing a Shell,  Prev: Access to the Terminal,  Up: Job Control
+
+27.5 Orphaned Process Groups
+============================
+
+When a controlling process terminates, its terminal becomes free and a
+new session can be established on it.  (In fact, another user could log
+in on the terminal.)  This could cause a problem if any processes from
+the old session are still trying to use that terminal.
+
+   To prevent problems, process groups that continue running even after
+the session leader has terminated are marked as "orphaned process
+groups".
+
+   When a process group becomes an orphan, its processes are sent a
+'SIGHUP' signal.  Ordinarily, this causes the processes to terminate.
+However, if a program ignores this signal or establishes a handler for
+it (*note Signal Handling::), it can continue running as in the orphan
+process group even after its controlling process terminates; but it
+still cannot access the terminal any more.
+
+
+File: libc.info,  Node: Implementing a Shell,  Next: Functions for Job Control,  Prev: Orphaned Process Groups,  Up: Job Control
+
+27.6 Implementing a Job Control Shell
+=====================================
+
+This section describes what a shell must do to implement job control, by
+presenting an extensive sample program to illustrate the concepts
+involved.
+
+* Menu:
+
+* Data Structures::             Introduction to the sample shell.
+* Initializing the Shell::      What the shell must do to take
+				 responsibility for job control.
+* Launching Jobs::              Creating jobs to execute commands.
+* Foreground and Background::   Putting a job in foreground of background.
+* Stopped and Terminated Jobs::  Reporting job status.
+* Continuing Stopped Jobs::     How to continue a stopped job in
+				 the foreground or background.
+* Missing Pieces::              Other parts of the shell.
+
+
+File: libc.info,  Node: Data Structures,  Next: Initializing the Shell,  Up: Implementing a Shell
+
+27.6.1 Data Structures for the Shell
+------------------------------------
+
+All of the program examples included in this chapter are part of a
+simple shell program.  This section presents data structures and utility
+functions which are used throughout the example.
+
+   The sample shell deals mainly with two data structures.  The 'job'
+type contains information about a job, which is a set of subprocesses
+linked together with pipes.  The 'process' type holds information about
+a single subprocess.  Here are the relevant data structure declarations:
+
+     /* A process is a single process.  */
+     typedef struct process
+     {
+       struct process *next;       /* next process in pipeline */
+       char **argv;                /* for exec */
+       pid_t pid;                  /* process ID */
+       char completed;             /* true if process has completed */
+       char stopped;               /* true if process has stopped */
+       int status;                 /* reported status value */
+     } process;
+
+     /* A job is a pipeline of processes.  */
+     typedef struct job
+     {
+       struct job *next;           /* next active job */
+       char *command;              /* command line, used for messages */
+       process *first_process;     /* list of processes in this job */
+       pid_t pgid;                 /* process group ID */
+       char notified;              /* true if user told about stopped job */
+       struct termios tmodes;      /* saved terminal modes */
+       int stdin, stdout, stderr;  /* standard i/o channels */
+     } job;
+
+     /* The active jobs are linked into a list.  This is its head.   */
+     job *first_job = NULL;
+
+   Here are some utility functions that are used for operating on 'job'
+objects.
+
+     /* Find the active job with the indicated PGID.  */
+     job *
+     find_job (pid_t pgid)
+     {
+       job *j;
+
+       for (j = first_job; j; j = j->next)
+         if (j->pgid == pgid)
+           return j;
+       return NULL;
+     }
+
+     /* Return true if all processes in the job have stopped or completed.  */
+     int
+     job_is_stopped (job *j)
+     {
+       process *p;
+
+       for (p = j->first_process; p; p = p->next)
+         if (!p->completed && !p->stopped)
+           return 0;
+       return 1;
+     }
+
+     /* Return true if all processes in the job have completed.  */
+     int
+     job_is_completed (job *j)
+     {
+       process *p;
+
+       for (p = j->first_process; p; p = p->next)
+         if (!p->completed)
+           return 0;
+       return 1;
+     }
+
+
+File: libc.info,  Node: Initializing the Shell,  Next: Launching Jobs,  Prev: Data Structures,  Up: Implementing a Shell
+
+27.6.2 Initializing the Shell
+-----------------------------
+
+When a shell program that normally performs job control is started, it
+has to be careful in case it has been invoked from another shell that is
+already doing its own job control.
+
+   A subshell that runs interactively has to ensure that it has been
+placed in the foreground by its parent shell before it can enable job
+control itself.  It does this by getting its initial process group ID
+with the 'getpgrp' function, and comparing it to the process group ID of
+the current foreground job associated with its controlling terminal
+(which can be retrieved using the 'tcgetpgrp' function).
+
+   If the subshell is not running as a foreground job, it must stop
+itself by sending a 'SIGTTIN' signal to its own process group.  It may
+not arbitrarily put itself into the foreground; it must wait for the
+user to tell the parent shell to do this.  If the subshell is continued
+again, it should repeat the check and stop itself again if it is still
+not in the foreground.
+
+   Once the subshell has been placed into the foreground by its parent
+shell, it can enable its own job control.  It does this by calling
+'setpgid' to put itself into its own process group, and then calling
+'tcsetpgrp' to place this process group into the foreground.
+
+   When a shell enables job control, it should set itself to ignore all
+the job control stop signals so that it doesn't accidentally stop
+itself.  You can do this by setting the action for all the stop signals
+to 'SIG_IGN'.
+
+   A subshell that runs non-interactively cannot and should not support
+job control.  It must leave all processes it creates in the same process
+group as the shell itself; this allows the non-interactive shell and its
+child processes to be treated as a single job by the parent shell.  This
+is easy to do--just don't use any of the job control primitives--but you
+must remember to make the shell do it.
+
+   Here is the initialization code for the sample shell that shows how
+to do all of this.
+
+     /* Keep track of attributes of the shell.  */
+
+     #include <sys/types.h>
+     #include <termios.h>
+     #include <unistd.h>
+
+     pid_t shell_pgid;
+     struct termios shell_tmodes;
+     int shell_terminal;
+     int shell_is_interactive;
+
+
+     /* Make sure the shell is running interactively as the foreground job
+        before proceeding. */
+
+     void
+     init_shell ()
+     {
+
+       /* See if we are running interactively.  */
+       shell_terminal = STDIN_FILENO;
+       shell_is_interactive = isatty (shell_terminal);
+
+       if (shell_is_interactive)
+         {
+           /* Loop until we are in the foreground.  */
+           while (tcgetpgrp (shell_terminal) != (shell_pgid = getpgrp ()))
+             kill (- shell_pgid, SIGTTIN);
+
+           /* Ignore interactive and job-control signals.  */
+           signal (SIGINT, SIG_IGN);
+           signal (SIGQUIT, SIG_IGN);
+           signal (SIGTSTP, SIG_IGN);
+           signal (SIGTTIN, SIG_IGN);
+           signal (SIGTTOU, SIG_IGN);
+           signal (SIGCHLD, SIG_IGN);
+
+           /* Put ourselves in our own process group.  */
+           shell_pgid = getpid ();
+           if (setpgid (shell_pgid, shell_pgid) < 0)
+             {
+               perror ("Couldn't put the shell in its own process group");
+               exit (1);
+             }
+
+           /* Grab control of the terminal.  */
+           tcsetpgrp (shell_terminal, shell_pgid);
+
+           /* Save default terminal attributes for shell.  */
+           tcgetattr (shell_terminal, &shell_tmodes);
+         }
+     }
+
+
+File: libc.info,  Node: Launching Jobs,  Next: Foreground and Background,  Prev: Initializing the Shell,  Up: Implementing a Shell
+
+27.6.3 Launching Jobs
+---------------------
+
+Once the shell has taken responsibility for performing job control on
+its controlling terminal, it can launch jobs in response to commands
+typed by the user.
+
+   To create the processes in a process group, you use the same 'fork'
+and 'exec' functions described in *note Process Creation Concepts::.
+Since there are multiple child processes involved, though, things are a
+little more complicated and you must be careful to do things in the
+right order.  Otherwise, nasty race conditions can result.
+
+   You have two choices for how to structure the tree of parent-child
+relationships among the processes.  You can either make all the
+processes in the process group be children of the shell process, or you
+can make one process in group be the ancestor of all the other processes
+in that group.  The sample shell program presented in this chapter uses
+the first approach because it makes bookkeeping somewhat simpler.
+
+   As each process is forked, it should put itself in the new process
+group by calling 'setpgid'; see *note Process Group Functions::.  The
+first process in the new group becomes its "process group leader", and
+its process ID becomes the "process group ID" for the group.
+
+   The shell should also call 'setpgid' to put each of its child
+processes into the new process group.  This is because there is a
+potential timing problem: each child process must be put in the process
+group before it begins executing a new program, and the shell depends on
+having all the child processes in the group before it continues
+executing.  If both the child processes and the shell call 'setpgid',
+this ensures that the right things happen no matter which process gets
+to it first.
+
+   If the job is being launched as a foreground job, the new process
+group also needs to be put into the foreground on the controlling
+terminal using 'tcsetpgrp'.  Again, this should be done by the shell as
+well as by each of its child processes, to avoid race conditions.
+
+   The next thing each child process should do is to reset its signal
+actions.
+
+   During initialization, the shell process set itself to ignore job
+control signals; see *note Initializing the Shell::.  As a result, any
+child processes it creates also ignore these signals by inheritance.
+This is definitely undesirable, so each child process should explicitly
+set the actions for these signals back to 'SIG_DFL' just after it is
+forked.
+
+   Since shells follow this convention, applications can assume that
+they inherit the correct handling of these signals from the parent
+process.  But every application has a responsibility not to mess up the
+handling of stop signals.  Applications that disable the normal
+interpretation of the SUSP character should provide some other mechanism
+for the user to stop the job.  When the user invokes this mechanism, the
+program should send a 'SIGTSTP' signal to the process group of the
+process, not just to the process itself.  *Note Signaling Another
+Process::.
+
+   Finally, each child process should call 'exec' in the normal way.
+This is also the point at which redirection of the standard input and
+output channels should be handled.  *Note Duplicating Descriptors::, for
+an explanation of how to do this.
+
+   Here is the function from the sample shell program that is
+responsible for launching a program.  The function is executed by each
+child process immediately after it has been forked by the shell, and
+never returns.
+
+     void
+     launch_process (process *p, pid_t pgid,
+                     int infile, int outfile, int errfile,
+                     int foreground)
+     {
+       pid_t pid;
+
+       if (shell_is_interactive)
+         {
+           /* Put the process into the process group and give the process group
+              the terminal, if appropriate.
+              This has to be done both by the shell and in the individual
+              child processes because of potential race conditions.  */
+           pid = getpid ();
+           if (pgid == 0) pgid = pid;
+           setpgid (pid, pgid);
+           if (foreground)
+             tcsetpgrp (shell_terminal, pgid);
+
+           /* Set the handling for job control signals back to the default.  */
+           signal (SIGINT, SIG_DFL);
+           signal (SIGQUIT, SIG_DFL);
+           signal (SIGTSTP, SIG_DFL);
+           signal (SIGTTIN, SIG_DFL);
+           signal (SIGTTOU, SIG_DFL);
+           signal (SIGCHLD, SIG_DFL);
+         }
+
+       /* Set the standard input/output channels of the new process.  */
+       if (infile != STDIN_FILENO)
+         {
+           dup2 (infile, STDIN_FILENO);
+           close (infile);
+         }
+       if (outfile != STDOUT_FILENO)
+         {
+           dup2 (outfile, STDOUT_FILENO);
+           close (outfile);
+         }
+       if (errfile != STDERR_FILENO)
+         {
+           dup2 (errfile, STDERR_FILENO);
+           close (errfile);
+         }
+
+       /* Exec the new process.  Make sure we exit.  */
+       execvp (p->argv[0], p->argv);
+       perror ("execvp");
+       exit (1);
+     }
+
+   If the shell is not running interactively, this function does not do
+anything with process groups or signals.  Remember that a shell not
+performing job control must keep all of its subprocesses in the same
+process group as the shell itself.
+
+   Next, here is the function that actually launches a complete job.
+After creating the child processes, this function calls some other
+functions to put the newly created job into the foreground or
+background; these are discussed in *note Foreground and Background::.
+
+     void
+     launch_job (job *j, int foreground)
+     {
+       process *p;
+       pid_t pid;
+       int mypipe[2], infile, outfile;
+
+       infile = j->stdin;
+       for (p = j->first_process; p; p = p->next)
+         {
+           /* Set up pipes, if necessary.  */
+           if (p->next)
+             {
+               if (pipe (mypipe) < 0)
+                 {
+                   perror ("pipe");
+                   exit (1);
+                 }
+               outfile = mypipe[1];
+             }
+           else
+             outfile = j->stdout;
+
+           /* Fork the child processes.  */
+           pid = fork ();
+           if (pid == 0)
+             /* This is the child process.  */
+             launch_process (p, j->pgid, infile,
+                             outfile, j->stderr, foreground);
+           else if (pid < 0)
+             {
+               /* The fork failed.  */
+               perror ("fork");
+               exit (1);
+             }
+           else
+             {
+               /* This is the parent process.  */
+               p->pid = pid;
+               if (shell_is_interactive)
+                 {
+                   if (!j->pgid)
+                     j->pgid = pid;
+                   setpgid (pid, j->pgid);
+                 }
+             }
+
+           /* Clean up after pipes.  */
+           if (infile != j->stdin)
+             close (infile);
+           if (outfile != j->stdout)
+             close (outfile);
+           infile = mypipe[0];
+         }
+
+       format_job_info (j, "launched");
+
+       if (!shell_is_interactive)
+         wait_for_job (j);
+       else if (foreground)
+         put_job_in_foreground (j, 0);
+       else
+         put_job_in_background (j, 0);
+     }
+
+
+File: libc.info,  Node: Foreground and Background,  Next: Stopped and Terminated Jobs,  Prev: Launching Jobs,  Up: Implementing a Shell
+
+27.6.4 Foreground and Background
+--------------------------------
+
+Now let's consider what actions must be taken by the shell when it
+launches a job into the foreground, and how this differs from what must
+be done when a background job is launched.
+
+   When a foreground job is launched, the shell must first give it
+access to the controlling terminal by calling 'tcsetpgrp'.  Then, the
+shell should wait for processes in that process group to terminate or
+stop.  This is discussed in more detail in *note Stopped and Terminated
+Jobs::.
+
+   When all of the processes in the group have either completed or
+stopped, the shell should regain control of the terminal for its own
+process group by calling 'tcsetpgrp' again.  Since stop signals caused
+by I/O from a background process or a SUSP character typed by the user
+are sent to the process group, normally all the processes in the job
+stop together.
+
+   The foreground job may have left the terminal in a strange state, so
+the shell should restore its own saved terminal modes before continuing.
+In case the job is merely stopped, the shell should first save the
+current terminal modes so that it can restore them later if the job is
+continued.  The functions for dealing with terminal modes are
+'tcgetattr' and 'tcsetattr'; these are described in *note Terminal
+Modes::.
+
+   Here is the sample shell's function for doing all of this.
+
+     /* Put job J in the foreground.  If CONT is nonzero,
+        restore the saved terminal modes and send the process group a
+        'SIGCONT' signal to wake it up before we block.  */
+
+     void
+     put_job_in_foreground (job *j, int cont)
+     {
+       /* Put the job into the foreground.  */
+       tcsetpgrp (shell_terminal, j->pgid);
+
+       /* Send the job a continue signal, if necessary.  */
+       if (cont)
+         {
+           tcsetattr (shell_terminal, TCSADRAIN, &j->tmodes);
+           if (kill (- j->pgid, SIGCONT) < 0)
+             perror ("kill (SIGCONT)");
+         }
+
+       /* Wait for it to report.  */
+       wait_for_job (j);
+
+       /* Put the shell back in the foreground.  */
+       tcsetpgrp (shell_terminal, shell_pgid);
+
+       /* Restore the shell's terminal modes.  */
+       tcgetattr (shell_terminal, &j->tmodes);
+       tcsetattr (shell_terminal, TCSADRAIN, &shell_tmodes);
+     }
+
+   If the process group is launched as a background job, the shell
+should remain in the foreground itself and continue to read commands
+from the terminal.
+
+   In the sample shell, there is not much that needs to be done to put a
+job into the background.  Here is the function it uses:
+
+     /* Put a job in the background.  If the cont argument is true, send
+        the process group a 'SIGCONT' signal to wake it up.  */
+
+     void
+     put_job_in_background (job *j, int cont)
+     {
+       /* Send the job a continue signal, if necessary.  */
+       if (cont)
+         if (kill (-j->pgid, SIGCONT) < 0)
+           perror ("kill (SIGCONT)");
+     }
+
+
+File: libc.info,  Node: Stopped and Terminated Jobs,  Next: Continuing Stopped Jobs,  Prev: Foreground and Background,  Up: Implementing a Shell
+
+27.6.5 Stopped and Terminated Jobs
+----------------------------------
+
+When a foreground process is launched, the shell must block until all of
+the processes in that job have either terminated or stopped.  It can do
+this by calling the 'waitpid' function; see *note Process Completion::.
+Use the 'WUNTRACED' option so that status is reported for processes that
+stop as well as processes that terminate.
+
+   The shell must also check on the status of background jobs so that it
+can report terminated and stopped jobs to the user; this can be done by
+calling 'waitpid' with the 'WNOHANG' option.  A good place to put a such
+a check for terminated and stopped jobs is just before prompting for a
+new command.
+
+   The shell can also receive asynchronous notification that there is
+status information available for a child process by establishing a
+handler for 'SIGCHLD' signals.  *Note Signal Handling::.
+
+   In the sample shell program, the 'SIGCHLD' signal is normally
+ignored.  This is to avoid reentrancy problems involving the global data
+structures the shell manipulates.  But at specific times when the shell
+is not using these data structures--such as when it is waiting for input
+on the terminal--it makes sense to enable a handler for 'SIGCHLD'.  The
+same function that is used to do the synchronous status checks
+('do_job_notification', in this case) can also be called from within
+this handler.
+
+   Here are the parts of the sample shell program that deal with
+checking the status of jobs and reporting the information to the user.
+
+     /* Store the status of the process PID that was returned by waitpid.
+        Return 0 if all went well, nonzero otherwise.  */
+
+     int
+     mark_process_status (pid_t pid, int status)
+     {
+       job *j;
+       process *p;
+
+       if (pid > 0)
+         {
+           /* Update the record for the process.  */
+           for (j = first_job; j; j = j->next)
+             for (p = j->first_process; p; p = p->next)
+               if (p->pid == pid)
+                 {
+                   p->status = status;
+                   if (WIFSTOPPED (status))
+                     p->stopped = 1;
+                   else
+                     {
+                       p->completed = 1;
+                       if (WIFSIGNALED (status))
+                         fprintf (stderr, "%d: Terminated by signal %d.\n",
+                                  (int) pid, WTERMSIG (p->status));
+                     }
+                   return 0;
+                  }
+           fprintf (stderr, "No child process %d.\n", pid);
+           return -1;
+         }
+       else if (pid == 0 || errno == ECHILD)
+         /* No processes ready to report.  */
+         return -1;
+       else {
+         /* Other weird errors.  */
+         perror ("waitpid");
+         return -1;
+       }
+     }
+
+     /* Check for processes that have status information available,
+        without blocking.  */
+
+     void
+     update_status (void)
+     {
+       int status;
+       pid_t pid;
+
+       do
+         pid = waitpid (WAIT_ANY, &status, WUNTRACED|WNOHANG);
+       while (!mark_process_status (pid, status));
+     }
+
+     /* Check for processes that have status information available,
+        blocking until all processes in the given job have reported.  */
+
+     void
+     wait_for_job (job *j)
+     {
+       int status;
+       pid_t pid;
+
+       do
+         pid = waitpid (WAIT_ANY, &status, WUNTRACED);
+       while (!mark_process_status (pid, status)
+              && !job_is_stopped (j)
+              && !job_is_completed (j));
+     }
+
+     /* Format information about job status for the user to look at.  */
+
+     void
+     format_job_info (job *j, const char *status)
+     {
+       fprintf (stderr, "%ld (%s): %s\n", (long)j->pgid, status, j->command);
+     }
+
+     /* Notify the user about stopped or terminated jobs.
+        Delete terminated jobs from the active job list.  */
+
+     void
+     do_job_notification (void)
+     {
+       job *j, *jlast, *jnext;
+       process *p;
+
+       /* Update status information for child processes.  */
+       update_status ();
+
+       jlast = NULL;
+       for (j = first_job; j; j = jnext)
+         {
+           jnext = j->next;
+
+           /* If all processes have completed, tell the user the job has
+              completed and delete it from the list of active jobs.  */
+           if (job_is_completed (j)) {
+             format_job_info (j, "completed");
+             if (jlast)
+               jlast->next = jnext;
+             else
+               first_job = jnext;
+             free_job (j);
+           }
+
+           /* Notify the user about stopped jobs,
+              marking them so that we won't do this more than once.  */
+           else if (job_is_stopped (j) && !j->notified) {
+             format_job_info (j, "stopped");
+             j->notified = 1;
+             jlast = j;
+           }
+
+           /* Don't say anything about jobs that are still running.  */
+           else
+             jlast = j;
+         }
+     }
+
+
+File: libc.info,  Node: Continuing Stopped Jobs,  Next: Missing Pieces,  Prev: Stopped and Terminated Jobs,  Up: Implementing a Shell
+
+27.6.6 Continuing Stopped Jobs
+------------------------------
+
+The shell can continue a stopped job by sending a 'SIGCONT' signal to
+its process group.  If the job is being continued in the foreground, the
+shell should first invoke 'tcsetpgrp' to give the job access to the
+terminal, and restore the saved terminal settings.  After continuing a
+job in the foreground, the shell should wait for the job to stop or
+complete, as if the job had just been launched in the foreground.
+
+   The sample shell program handles both newly created and continued
+jobs with the same pair of functions, 'put_job_in_foreground' and
+'put_job_in_background'.  The definitions of these functions were given
+in *note Foreground and Background::.  When continuing a stopped job, a
+nonzero value is passed as the CONT argument to ensure that the
+'SIGCONT' signal is sent and the terminal modes reset, as appropriate.
+
+   This leaves only a function for updating the shell's internal
+bookkeeping about the job being continued:
+
+     /* Mark a stopped job J as being running again.  */
+
+     void
+     mark_job_as_running (job *j)
+     {
+       Process *p;
+
+       for (p = j->first_process; p; p = p->next)
+         p->stopped = 0;
+       j->notified = 0;
+     }
+
+     /* Continue the job J.  */
+
+     void
+     continue_job (job *j, int foreground)
+     {
+       mark_job_as_running (j);
+       if (foreground)
+         put_job_in_foreground (j, 1);
+       else
+         put_job_in_background (j, 1);
+     }
+
+
+File: libc.info,  Node: Missing Pieces,  Prev: Continuing Stopped Jobs,  Up: Implementing a Shell
+
+27.6.7 The Missing Pieces
+-------------------------
+
+The code extracts for the sample shell included in this chapter are only
+a part of the entire shell program.  In particular, nothing at all has
+been said about how 'job' and 'program' data structures are allocated
+and initialized.
+
+   Most real shells provide a complex user interface that has support
+for a command language; variables; abbreviations, substitutions, and
+pattern matching on file names; and the like.  All of this is far too
+complicated to explain here!  Instead, we have concentrated on showing
+how to implement the core process creation and job control functions
+that can be called from such a shell.
+
+   Here is a table summarizing the major entry points we have presented:
+
+'void init_shell (void)'
+     Initialize the shell's internal state.  *Note Initializing the
+     Shell::.
+
+'void launch_job (job *J, int FOREGROUND)'
+     Launch the job J as either a foreground or background job.  *Note
+     Launching Jobs::.
+
+'void do_job_notification (void)'
+     Check for and report any jobs that have terminated or stopped.  Can
+     be called synchronously or within a handler for 'SIGCHLD' signals.
+     *Note Stopped and Terminated Jobs::.
+
+'void continue_job (job *J, int FOREGROUND)'
+     Continue the job J.  *Note Continuing Stopped Jobs::.
+
+   Of course, a real shell would also want to provide other functions
+for managing jobs.  For example, it would be useful to have commands to
+list all active jobs or to send a signal (such as 'SIGKILL') to a job.
+
+
+File: libc.info,  Node: Functions for Job Control,  Prev: Implementing a Shell,  Up: Job Control
+
+27.7 Functions for Job Control
+==============================
+
+This section contains detailed descriptions of the functions relating to
+job control.
+
+* Menu:
+
+* Identifying the Terminal::    Determining the controlling terminal's name.
+* Process Group Functions::     Functions for manipulating process groups.
+* Terminal Access Functions::   Functions for controlling terminal access.
+
+
+File: libc.info,  Node: Identifying the Terminal,  Next: Process Group Functions,  Up: Functions for Job Control
+
+27.7.1 Identifying the Controlling Terminal
+-------------------------------------------
+
+You can use the 'ctermid' function to get a file name that you can use
+to open the controlling terminal.  In the GNU C Library, it returns the
+same string all the time: '"/dev/tty"'.  That is a special "magic" file
+name that refers to the controlling terminal of the current process (if
+it has one).  To find the name of the specific terminal device, use
+'ttyname'; *note Is It a Terminal::.
+
+   The function 'ctermid' is declared in the header file 'stdio.h'.
+
+ -- Function: char * ctermid (char *STRING)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'ctermid' function returns a string containing the file name of
+     the controlling terminal for the current process.  If STRING is not
+     a null pointer, it should be an array that can hold at least
+     'L_ctermid' characters; the string is returned in this array.
+     Otherwise, a pointer to a string in a static area is returned,
+     which might get overwritten on subsequent calls to this function.
+
+     An empty string is returned if the file name cannot be determined
+     for any reason.  Even if a file name is returned, access to the
+     file it represents is not guaranteed.
+
+ -- Macro: int L_ctermid
+     The value of this macro is an integer constant expression that
+     represents the size of a string large enough to hold the file name
+     returned by 'ctermid'.
+
+   See also the 'isatty' and 'ttyname' functions, in *note Is It a
+Terminal::.
+
+
+File: libc.info,  Node: Process Group Functions,  Next: Terminal Access Functions,  Prev: Identifying the Terminal,  Up: Functions for Job Control
+
+27.7.2 Process Group Functions
+------------------------------
+
+Here are descriptions of the functions for manipulating process groups.
+Your program should include the header files 'sys/types.h' and
+'unistd.h' to use these functions.
+
+ -- Function: pid_t setsid (void)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'setsid' function creates a new session.  The calling process
+     becomes the session leader, and is put in a new process group whose
+     process group ID is the same as the process ID of that process.
+     There are initially no other processes in the new process group,
+     and no other process groups in the new session.
+
+     This function also makes the calling process have no controlling
+     terminal.
+
+     The 'setsid' function returns the new process group ID of the
+     calling process if successful.  A return value of '-1' indicates an
+     error.  The following 'errno' error conditions are defined for this
+     function:
+
+     'EPERM'
+          The calling process is already a process group leader, or
+          there is already another process group around that has the
+          same process group ID.
+
+ -- Function: pid_t getsid (pid_t PID)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'getsid' function returns the process group ID of the session
+     leader of the specified process.  If a PID is '0', the process
+     group ID of the session leader of the current process is returned.
+
+     In case of error '-1' is returned and 'errno' is set.  The
+     following 'errno' error conditions are defined for this function:
+
+     'ESRCH'
+          There is no process with the given process ID PID.
+     'EPERM'
+          The calling process and the process specified by PID are in
+          different sessions, and the implementation doesn't allow to
+          access the process group ID of the session leader of the
+          process with ID PID from the calling process.
+
+ -- Function: pid_t getpgrp (void)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'getpgrp' function returns the process group ID of the calling
+     process.
+
+ -- Function: int getpgid (pid_t PID)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'getpgid' function returns the process group ID of the process
+     PID.  You can supply a value of '0' for the PID argument to get
+     information about the calling process.
+
+     In case of error '-1' is returned and 'errno' is set.  The
+     following 'errno' error conditions are defined for this function:
+
+     'ESRCH'
+          There is no process with the given process ID PID.  The
+          calling process and the process specified by PID are in
+          different sessions, and the implementation doesn't allow to
+          access the process group ID of the process with ID PID from
+          the calling process.
+
+ -- Function: int setpgid (pid_t PID, pid_t PGID)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'setpgid' function puts the process PID into the process group
+     PGID.  As a special case, either PID or PGID can be zero to
+     indicate the process ID of the calling process.
+
+     This function fails on a system that does not support job control.
+     *Note Job Control is Optional::, for more information.
+
+     If the operation is successful, 'setpgid' returns zero.  Otherwise
+     it returns '-1'.  The following 'errno' error conditions are
+     defined for this function:
+
+     'EACCES'
+          The child process named by PID has executed an 'exec' function
+          since it was forked.
+
+     'EINVAL'
+          The value of the PGID is not valid.
+
+     'ENOSYS'
+          The system doesn't support job control.
+
+     'EPERM'
+          The process indicated by the PID argument is a session leader,
+          or is not in the same session as the calling process, or the
+          value of the PGID argument doesn't match a process group ID in
+          the same session as the calling process.
+
+     'ESRCH'
+          The process indicated by the PID argument is not the calling
+          process or a child of the calling process.
+
+ -- Function: int setpgrp (pid_t PID, pid_t PGID)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This is the BSD Unix name for 'setpgid'.  Both functions do exactly
+     the same thing.
+
+
+File: libc.info,  Node: Terminal Access Functions,  Prev: Process Group Functions,  Up: Functions for Job Control
+
+27.7.3 Functions for Controlling Terminal Access
+------------------------------------------------
+
+These are the functions for reading or setting the foreground process
+group of a terminal.  You should include the header files 'sys/types.h'
+and 'unistd.h' in your application to use these functions.
+
+   Although these functions take a file descriptor argument to specify
+the terminal device, the foreground job is associated with the terminal
+file itself and not a particular open file descriptor.
+
+ -- Function: pid_t tcgetpgrp (int FILEDES)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function returns the process group ID of the foreground
+     process group associated with the terminal open on descriptor
+     FILEDES.
+
+     If there is no foreground process group, the return value is a
+     number greater than '1' that does not match the process group ID of
+     any existing process group.  This can happen if all of the
+     processes in the job that was formerly the foreground job have
+     terminated, and no other job has yet been moved into the
+     foreground.
+
+     In case of an error, a value of '-1' is returned.  The following
+     'errno' error conditions are defined for this function:
+
+     'EBADF'
+          The FILEDES argument is not a valid file descriptor.
+
+     'ENOSYS'
+          The system doesn't support job control.
+
+     'ENOTTY'
+          The terminal file associated with the FILEDES argument isn't
+          the controlling terminal of the calling process.
+
+ -- Function: int tcsetpgrp (int FILEDES, pid_t PGID)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is used to set a terminal's foreground process group
+     ID. The argument FILEDES is a descriptor which specifies the
+     terminal; PGID specifies the process group.  The calling process
+     must be a member of the same session as PGID and must have the same
+     controlling terminal.
+
+     For terminal access purposes, this function is treated as output.
+     If it is called from a background process on its controlling
+     terminal, normally all processes in the process group are sent a
+     'SIGTTOU' signal.  The exception is if the calling process itself
+     is ignoring or blocking 'SIGTTOU' signals, in which case the
+     operation is performed and no signal is sent.
+
+     If successful, 'tcsetpgrp' returns '0'.  A return value of '-1'
+     indicates an error.  The following 'errno' error conditions are
+     defined for this function:
+
+     'EBADF'
+          The FILEDES argument is not a valid file descriptor.
+
+     'EINVAL'
+          The PGID argument is not valid.
+
+     'ENOSYS'
+          The system doesn't support job control.
+
+     'ENOTTY'
+          The FILEDES isn't the controlling terminal of the calling
+          process.
+
+     'EPERM'
+          The PGID isn't a process group in the same session as the
+          calling process.
+
+ -- Function: pid_t tcgetsid (int FILDES)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is used to obtain the process group ID of the session
+     for which the terminal specified by FILDES is the controlling
+     terminal.  If the call is successful the group ID is returned.
+     Otherwise the return value is '(pid_t) -1' and the global variable
+     ERRNO is set to the following value:
+     'EBADF'
+          The FILEDES argument is not a valid file descriptor.
+
+     'ENOTTY'
+          The calling process does not have a controlling terminal, or
+          the file is not the controlling terminal.
+
+
+File: libc.info,  Node: Name Service Switch,  Next: Users and Groups,  Prev: Job Control,  Up: Top
+
+28 System Databases and Name Service Switch
+*******************************************
+
+Various functions in the C Library need to be configured to work
+correctly in the local environment.  Traditionally, this was done by
+using files (e.g., '/etc/passwd'), but other nameservices (like the
+Network Information Service (NIS) and the Domain Name Service (DNS))
+became popular, and were hacked into the C library, usually with a fixed
+search order.
+
+   The GNU C Library contains a cleaner solution of this problem.  It is
+designed after a method used by Sun Microsystems in the C library of
+Solaris 2.  The GNU C Library follows their name and calls this scheme
+"Name Service Switch" (NSS).
+
+   Though the interface might be similar to Sun's version there is no
+common code.  We never saw any source code of Sun's implementation and
+so the internal interface is incompatible.  This also manifests in the
+file names we use as we will see later.
+
+* Menu:
+
+* NSS Basics::                  What is this NSS good for.
+* NSS Configuration File::      Configuring NSS.
+* NSS Module Internals::        How does it work internally.
+* Extending NSS::               What to do to add services or databases.
+
+
+File: libc.info,  Node: NSS Basics,  Next: NSS Configuration File,  Prev: Name Service Switch,  Up: Name Service Switch
+
+28.1 NSS Basics
+===============
+
+The basic idea is to put the implementation of the different services
+offered to access the databases in separate modules.  This has some
+advantages:
+
+  1. Contributors can add new services without adding them to the GNU C
+     Library.
+  2. The modules can be updated separately.
+  3. The C library image is smaller.
+
+   To fulfill the first goal above the ABI of the modules will be
+described below.  For getting the implementation of a new service right
+it is important to understand how the functions in the modules get
+called.  They are in no way designed to be used by the programmer
+directly.  Instead the programmer should only use the documented and
+standardized functions to access the databases.
+
+The databases available in the NSS are
+
+'aliases'
+     Mail aliases
+'ethers'
+     Ethernet numbers,
+'group'
+     Groups of users, *note Group Database::.
+'hosts'
+     Host names and numbers, *note Host Names::.
+'netgroup'
+     Network wide list of host and users, *note Netgroup Database::.
+'networks'
+     Network names and numbers, *note Networks Database::.
+'protocols'
+     Network protocols, *note Protocols Database::.
+'passwd'
+     User passwords, *note User Database::.
+'rpc'
+     Remote procedure call names and numbers,
+'services'
+     Network services, *note Services Database::.
+'shadow'
+     Shadow user passwords,
+
+There will be some more added later ('automount', 'bootparams',
+'netmasks', and 'publickey').
+
+
+File: libc.info,  Node: NSS Configuration File,  Next: NSS Module Internals,  Prev: NSS Basics,  Up: Name Service Switch
+
+28.2 The NSS Configuration File
+===============================
+
+Somehow the NSS code must be told about the wishes of the user.  For
+this reason there is the file '/etc/nsswitch.conf'.  For each database
+this file contain a specification how the lookup process should work.
+The file could look like this:
+
+     # /etc/nsswitch.conf
+     #
+     # Name Service Switch configuration file.
+     #
+
+     passwd:     db files nis
+     shadow:     files
+     group:      db files nis
+
+     hosts:      files nisplus nis dns
+     networks:   nisplus [NOTFOUND=return] files
+
+     ethers:     nisplus [NOTFOUND=return] db files
+     protocols:  nisplus [NOTFOUND=return] db files
+     rpc:        nisplus [NOTFOUND=return] db files
+     services:   nisplus [NOTFOUND=return] db files
+
+   The first column is the database as you can guess from the table
+above.  The rest of the line specifies how the lookup process works.
+Please note that you specify the way it works for each database
+individually.  This cannot be done with the old way of a monolithic
+implementation.
+
+   The configuration specification for each database can contain two
+different items:
+
+   * the service specification like 'files', 'db', or 'nis'.
+   * the reaction on lookup result like '[NOTFOUND=return]'.
+
+* Menu:
+
+* Services in the NSS configuration::  Service names in the NSS configuration.
+* Actions in the NSS configuration::  React appropriately to the lookup result.
+* Notes on NSS Configuration File::  Things to take care about while
+                                     configuring NSS.
+
+
+File: libc.info,  Node: Services in the NSS configuration,  Next: Actions in the NSS configuration,  Prev: NSS Configuration File,  Up: NSS Configuration File
+
+28.2.1 Services in the NSS configuration File
+---------------------------------------------
+
+The above example file mentions five different services: 'files', 'db',
+'dns', 'nis', and 'nisplus'.  This does not mean these services are
+available on all sites and it does also not mean these are all the
+services which will ever be available.
+
+   In fact, these names are simply strings which the NSS code uses to
+find the implicitly addressed functions.  The internal interface will be
+described later.  Visible to the user are the modules which implement an
+individual service.
+
+   Assume the service NAME shall be used for a lookup.  The code for
+this service is implemented in a module called 'libnss_NAME'.  On a
+system supporting shared libraries this is in fact a shared library with
+the name (for example) 'libnss_NAME.so.2'.  The number at the end is the
+currently used version of the interface which will not change
+frequently.  Normally the user should not have to be cognizant of these
+files since they should be placed in a directory where they are found
+automatically.  Only the names of all available services are important.
+
+
+File: libc.info,  Node: Actions in the NSS configuration,  Next: Notes on NSS Configuration File,  Prev: Services in the NSS configuration,  Up: NSS Configuration File
+
+28.2.2 Actions in the NSS configuration
+---------------------------------------
+
+The second item in the specification gives the user much finer control
+on the lookup process.  Action items are placed between two service
+names and are written within brackets.  The general form is
+
+     '[' ( '!'? STATUS '=' ACTION )+ ']'
+
+where
+
+     STATUS => success | notfound | unavail | tryagain
+     ACTION => return | continue
+
+   The case of the keywords is insignificant.  The STATUS values are the
+results of a call to a lookup function of a specific service.  They mean
+
+'success'
+     No error occurred and the wanted entry is returned.  The default
+     action for this is 'return'.
+
+'notfound'
+     The lookup process works ok but the needed value was not found.
+     The default action is 'continue'.
+
+'unavail'
+     The service is permanently unavailable.  This can either mean the
+     needed file is not available, or, for DNS, the server is not
+     available or does not allow queries.  The default action is
+     'continue'.
+
+'tryagain'
+     The service is temporarily unavailable.  This could mean a file is
+     locked or a server currently cannot accept more connections.  The
+     default action is 'continue'.
+
+If we have a line like
+
+     ethers: nisplus [NOTFOUND=return] db files
+
+this is equivalent to
+
+     ethers: nisplus [SUCCESS=return NOTFOUND=return UNAVAIL=continue
+                      TRYAGAIN=continue]
+             db      [SUCCESS=return NOTFOUND=continue UNAVAIL=continue
+                      TRYAGAIN=continue]
+             files
+
+(except that it would have to be written on one line).  The default
+value for the actions are normally what you want, and only need to be
+changed in exceptional cases.
+
+   If the optional '!' is placed before the STATUS this means the
+following action is used for all statuses but STATUS itself.  I.e., '!'
+is negation as in the C language (and others).
+
+   Before we explain the exception which makes this action item
+necessary one more remark: obviously it makes no sense to add another
+action item after the 'files' service.  Since there is no other service
+following the action _always_ is 'return'.
+
+   Now, why is this '[NOTFOUND=return]' action useful?  To understand
+this we should know that the 'nisplus' service is often complete; i.e.,
+if an entry is not available in the NIS+ tables it is not available
+anywhere else.  This is what is expressed by this action item: it is
+useless to examine further services since they will not give us a
+result.
+
+   The situation would be different if the NIS+ service is not available
+because the machine is booting.  In this case the return value of the
+lookup function is not 'notfound' but instead 'unavail'.  And as you can
+see in the complete form above: in this situation the 'db' and 'files'
+services are used.  Neat, isn't it?  The system administrator need not
+pay special care for the time the system is not completely ready to work
+(while booting or shutdown or network problems).
+
+
+File: libc.info,  Node: Notes on NSS Configuration File,  Prev: Actions in the NSS configuration,  Up: NSS Configuration File
+
+28.2.3 Notes on the NSS Configuration File
+------------------------------------------
+
+Finally a few more hints.  The NSS implementation is not completely
+helpless if '/etc/nsswitch.conf' does not exist.  For all supported
+databases there is a default value so it should normally be possible to
+get the system running even if the file is corrupted or missing.
+
+   For the 'hosts' and 'networks' databases the default value is 'dns
+[!UNAVAIL=return] files'.  I.e., the system is prepared for the DNS
+service not to be available but if it is available the answer it returns
+is definitive.
+
+   The 'passwd', 'group', and 'shadow' databases are traditionally
+handled in a special way.  The appropriate files in the '/etc' directory
+are read but if an entry with a name starting with a '+' character is
+found NIS is used.  This kind of lookup remains possible by using the
+special lookup service 'compat' and the default value for the three
+databases above is 'compat [NOTFOUND=return] files'.
+
+   For all other databases the default value is 'nis [NOTFOUND=return]
+files'.  This solution give the best chance to be correct since NIS and
+file based lookup is used.
+
+   A second point is that the user should try to optimize the lookup
+process.  The different service have different response times.  A simple
+file look up on a local file could be fast, but if the file is long and
+the needed entry is near the end of the file this may take quite some
+time.  In this case it might be better to use the 'db' service which
+allows fast local access to large data sets.
+
+   Often the situation is that some global information like NIS must be
+used.  So it is unavoidable to use service entries like 'nis' etc.  But
+one should avoid slow services like this if possible.
+
+
+File: libc.info,  Node: NSS Module Internals,  Next: Extending NSS,  Prev: NSS Configuration File,  Up: Name Service Switch
+
+28.3 NSS Module Internals
+=========================
+
+Now it is time to describe what the modules look like.  The functions
+contained in a module are identified by their names.  I.e., there is no
+jump table or the like.  How this is done is of no interest here; those
+interested in this topic should read about Dynamic Linking.
+
+* Menu:
+
+* NSS Module Names::            Construction of the interface function of
+                                the NSS modules.
+* NSS Modules Interface::       Programming interface in the NSS module
+                                functions.
+
+
+File: libc.info,  Node: NSS Module Names,  Next: NSS Modules Interface,  Prev: NSS Module Internals,  Up: NSS Module Internals
+
+28.3.1 The Naming Scheme of the NSS Modules
+-------------------------------------------
+
+The name of each function consist of various parts:
+
+     _nss_SERVICE_FUNCTION
+
+   SERVICE of course corresponds to the name of the module this function
+is found in.(1)  The FUNCTION part is derived from the interface
+function in the C library itself.  If the user calls the function
+'gethostbyname' and the service used is 'files' the function
+
+            _nss_files_gethostbyname_r
+
+in the module
+
+            libnss_files.so.2
+
+is used.  You see, what is explained above in not the whole truth.  In
+fact the NSS modules only contain reentrant versions of the lookup
+functions.  I.e., if the user would call the 'gethostbyname_r' function
+this also would end in the above function.  For all user interface
+functions the C library maps this call to a call to the reentrant
+function.  For reentrant functions this is trivial since the interface
+is (nearly) the same.  For the non-reentrant version The library keeps
+internal buffers which are used to replace the user supplied buffer.
+
+   I.e., the reentrant functions _can_ have counterparts.  No service
+module is forced to have functions for all databases and all kinds to
+access them.  If a function is not available it is simply treated as if
+the function would return 'unavail' (*note Actions in the NSS
+configuration::).
+
+   The file name 'libnss_files.so.2' would be on a Solaris 2 system
+'nss_files.so.2'.  This is the difference mentioned above.  Sun's NSS
+modules are usable as modules which get indirectly loaded only.
+
+   The NSS modules in the GNU C Library are prepared to be used as
+normal libraries themselves.  This is _not_ true at the moment, though.
+However, the organization of the name space in the modules does not make
+it impossible like it is for Solaris.  Now you can see why the modules
+are still libraries.(2)
+
+   ---------- Footnotes ----------
+
+   (1) Now you might ask why this information is duplicated.  The answer
+is that we want to make it possible to link directly with these shared
+objects.
+
+   (2) There is a second explanation: we were too lazy to change the
+Makefiles to allow the generation of shared objects not starting with
+'lib' but don't tell this to anybody.
+
+
+File: libc.info,  Node: NSS Modules Interface,  Prev: NSS Module Names,  Up: NSS Module Internals
+
+28.3.2 The Interface of the Function in NSS Modules
+---------------------------------------------------
+
+Now we know about the functions contained in the modules.  It is now
+time to describe the types.  When we mentioned the reentrant versions of
+the functions above, this means there are some additional arguments
+(compared with the standard, non-reentrant version).  The prototypes for
+the non-reentrant and reentrant versions of our function above are:
+
+     struct hostent *gethostbyname (const char *name)
+
+     int gethostbyname_r (const char *name, struct hostent *result_buf,
+                          char *buf, size_t buflen, struct hostent **result,
+                          int *h_errnop)
+
+The actual prototype of the function in the NSS modules in this case is
+
+     enum nss_status _nss_files_gethostbyname_r (const char *name,
+                                                 struct hostent *result_buf,
+                                                 char *buf, size_t buflen,
+                                                 int *errnop, int *h_errnop)
+
+   I.e., the interface function is in fact the reentrant function with
+the change of the return value and the omission of the RESULT parameter.
+While the user-level function returns a pointer to the result the
+reentrant function return an 'enum nss_status' value:
+
+'NSS_STATUS_TRYAGAIN'
+     numeric value '-2'
+
+'NSS_STATUS_UNAVAIL'
+     numeric value '-1'
+
+'NSS_STATUS_NOTFOUND'
+     numeric value '0'
+
+'NSS_STATUS_SUCCESS'
+     numeric value '1'
+
+Now you see where the action items of the '/etc/nsswitch.conf' file are
+used.
+
+   If you study the source code you will find there is a fifth value:
+'NSS_STATUS_RETURN'.  This is an internal use only value, used by a few
+functions in places where none of the above value can be used.  If
+necessary the source code should be examined to learn about the details.
+
+   In case the interface function has to return an error it is important
+that the correct error code is stored in '*ERRNOP'.  Some return status
+value have only one associated error code, others have more.
+
+'NSS_STATUS_TRYAGAIN'  'EAGAIN'       One of the functions used ran
+                                      temporarily out of resources or a
+                                      service is currently not
+                                      available.
+                       'ERANGE'       The provided buffer is not large
+                                      enough.  The function should be
+                                      called again with a larger buffer.
+'NSS_STATUS_UNAVAIL'   'ENOENT'       A necessary input file cannot be
+                                      found.
+'NSS_STATUS_NOTFOUND'  'ENOENT'       The requested entry is not
+                                      available.
+
+   These are proposed values.  There can be other error codes and the
+described error codes can have different meaning.  *With one exception:*
+when returning 'NSS_STATUS_TRYAGAIN' the error code 'ERANGE' _must_ mean
+that the user provided buffer is too small.  Everything is non-critical.
+
+   The above function has something special which is missing for almost
+all the other module functions.  There is an argument H_ERRNOP.  This
+points to a variable which will be filled with the error code in case
+the execution of the function fails for some reason.  The reentrant
+function cannot use the global variable H_ERRNO; 'gethostbyname' calls
+'gethostbyname_r' with the last argument set to '&h_errno'.
+
+   The 'getXXXbyYYY' functions are the most important functions in the
+NSS modules.  But there are others which implement the other ways to
+access system databases (say for the password database, there are
+'setpwent', 'getpwent', and 'endpwent').  These will be described in
+more detail later.  Here we give a general way to determine the
+signature of the module function:
+
+   * the return value is 'int';
+   * the name is as explained in *note NSS Module Names::;
+   * the first arguments are identical to the arguments of the
+     non-reentrant function;
+   * the next three arguments are:
+
+     'STRUCT_TYPE *result_buf'
+          pointer to buffer where the result is stored.  'STRUCT_TYPE'
+          is normally a struct which corresponds to the database.
+     'char *buffer'
+          pointer to a buffer where the function can store additional
+          data for the result etc.
+     'size_t buflen'
+          length of the buffer pointed to by BUFFER.
+
+   * possibly a last argument H_ERRNOP, for the host name and network
+     name lookup functions.
+
+This table is correct for all functions but the 'set...ent' and
+'end...ent' functions.
+
+
+File: libc.info,  Node: Extending NSS,  Prev: NSS Module Internals,  Up: Name Service Switch
+
+28.4 Extending NSS
+==================
+
+One of the advantages of NSS mentioned above is that it can be extended
+quite easily.  There are two ways in which the extension can happen:
+adding another database or adding another service.  The former is
+normally done only by the C library developers.  It is here only
+important to remember that adding another database is independent from
+adding another service because a service need not support all databases
+or lookup functions.
+
+   A designer/implementor of a new service is therefore free to choose
+the databases s/he is interested in and leave the rest for later (or
+completely aside).
+
+* Menu:
+
+* Adding another Service to NSS::  What is to do to add a new service.
+* NSS Module Function Internals::  Guidelines for writing new NSS
+                                        service functions.
+
+
+File: libc.info,  Node: Adding another Service to NSS,  Next: NSS Module Function Internals,  Prev: Extending NSS,  Up: Extending NSS
+
+28.4.1 Adding another Service to NSS
+------------------------------------
+
+The sources for a new service need not (and should not) be part of the
+GNU C Library itself.  The developer retains complete control over the
+sources and its development.  The links between the C library and the
+new service module consists solely of the interface functions.
+
+   Each module is designed following a specific interface specification.
+For now the version is 2 (the interface in version 1 was not adequate)
+and this manifests in the version number of the shared library object of
+the NSS modules: they have the extension '.2'.  If the interface changes
+again in an incompatible way, this number will be increased.  Modules
+using the old interface will still be usable.
+
+   Developers of a new service will have to make sure that their module
+is created using the correct interface number.  This means the file
+itself must have the correct name and on ELF systems the "soname"
+(Shared Object Name) must also have this number.  Building a module from
+a bunch of object files on an ELF system using GNU CC could be done like
+this:
+
+     gcc -shared -o libnss_NAME.so.2 -Wl,-soname,libnss_NAME.so.2 OBJECTS
+
+*note Options for Linking: (gcc)Link Options, to learn more about this
+command line.
+
+   To use the new module the library must be able to find it.  This can
+be achieved by using options for the dynamic linker so that it will
+search the directory where the binary is placed.  For an ELF system this
+could be done by adding the wanted directory to the value of
+'LD_LIBRARY_PATH'.
+
+   But this is not always possible since some programs (those which run
+under IDs which do not belong to the user) ignore this variable.
+Therefore the stable version of the module should be placed into a
+directory which is searched by the dynamic linker.  Normally this should
+be the directory '$prefix/lib', where '$prefix' corresponds to the value
+given to configure using the '--prefix' option.  But be careful: this
+should only be done if it is clear the module does not cause any harm.
+System administrators should be careful.
+
+
+File: libc.info,  Node: NSS Module Function Internals,  Prev: Adding another Service to NSS,  Up: Extending NSS
+
+28.4.2 Internals of the NSS Module Functions
+--------------------------------------------
+
+Until now we only provided the syntactic interface for the functions in
+the NSS module.  In fact there is not much more we can say since the
+implementation obviously is different for each function.  But a few
+general rules must be followed by all functions.
+
+   In fact there are four kinds of different functions which may appear
+in the interface.  All derive from the traditional ones for system
+databases.  DB in the following table is normally an abbreviation for
+the database (e.g., it is 'pw' for the password database).
+
+'enum nss_status _nss_DATABASE_setDBent (void)'
+     This function prepares the service for following operations.  For a
+     simple file based lookup this means files could be opened, for
+     other services this function simply is a noop.
+
+     One special case for this function is that it takes an additional
+     argument for some DATABASEs (i.e., the interface is 'int setDBent
+     (int)').  *note Host Names::, which describes the 'sethostent'
+     function.
+
+     The return value should be NSS_STATUS_SUCCESS or according to the
+     table above in case of an error (*note NSS Modules Interface::).
+
+'enum nss_status _nss_DATABASE_endDBent (void)'
+     This function simply closes all files which are still open or
+     removes buffer caches.  If there are no files or buffers to remove
+     this is again a simple noop.
+
+     There normally is no return value different to NSS_STATUS_SUCCESS.
+
+'enum nss_status _nss_DATABASE_getDBent_r (STRUCTURE *result, char *buffer, size_t buflen, int *errnop)'
+     Since this function will be called several times in a row to
+     retrieve one entry after the other it must keep some kind of state.
+     But this also means the functions are not really reentrant.  They
+     are reentrant only in that simultaneous calls to this function will
+     not try to write the retrieved data in the same place (as it would
+     be the case for the non-reentrant functions); instead, it writes to
+     the structure pointed to by the RESULT parameter.  But the calls
+     share a common state and in the case of a file access this means
+     they return neighboring entries in the file.
+
+     The buffer of length BUFLEN pointed to by BUFFER can be used for
+     storing some additional data for the result.  It is _not_
+     guaranteed that the same buffer will be passed for the next call of
+     this function.  Therefore one must not misuse this buffer to save
+     some state information from one call to another.
+
+     Before the function returns the implementation should store the
+     value of the local ERRNO variable in the variable pointed to be
+     ERRNOP.  This is important to guarantee the module working in
+     statically linked programs.
+
+     As explained above this function could also have an additional last
+     argument.  This depends on the database used; it happens only for
+     'host' and 'networks'.
+
+     The function shall return 'NSS_STATUS_SUCCESS' as long as there are
+     more entries.  When the last entry was read it should return
+     'NSS_STATUS_NOTFOUND'.  When the buffer given as an argument is too
+     small for the data to be returned 'NSS_STATUS_TRYAGAIN' should be
+     returned.  When the service was not formerly initialized by a call
+     to '_nss_DATABASE_setDBent' all return value allowed for this
+     function can also be returned here.
+
+'enum nss_status _nss_DATABASE_getDBbyXX_r (PARAMS, STRUCTURE *result, char *buffer, size_t buflen, int *errnop)'
+     This function shall return the entry from the database which is
+     addressed by the PARAMS.  The type and number of these arguments
+     vary.  It must be individually determined by looking to the
+     user-level interface functions.  All arguments given to the
+     non-reentrant version are here described by PARAMS.
+
+     The result must be stored in the structure pointed to by RESULT.
+     If there is additional data to return (say strings, where the
+     RESULT structure only contains pointers) the function must use the
+     BUFFER or length BUFLEN.  There must not be any references to
+     non-constant global data.
+
+     The implementation of this function should honor the STAYOPEN flag
+     set by the 'setDBent' function whenever this makes sense.
+
+     Before the function returns the implementation should store the
+     value of the local ERRNO variable in the variable pointed to be
+     ERRNOP.  This is important to guarantee the module working in
+     statically linked programs.
+
+     Again, this function takes an additional last argument for the
+     'host' and 'networks' database.
+
+     The return value should as always follow the rules given above
+     (*note NSS Modules Interface::).
+
+
+File: libc.info,  Node: Users and Groups,  Next: System Management,  Prev: Name Service Switch,  Up: Top
+
+29 Users and Groups
+*******************
+
+Every user who can log in on the system is identified by a unique number
+called the "user ID". Each process has an effective user ID which says
+which user's access permissions it has.
+
+   Users are classified into "groups" for access control purposes.  Each
+process has one or more "group ID values" which say which groups the
+process can use for access to files.
+
+   The effective user and group IDs of a process collectively form its
+"persona".  This determines which files the process can access.
+Normally, a process inherits its persona from the parent process, but
+under special circumstances a process can change its persona and thus
+change its access permissions.
+
+   Each file in the system also has a user ID and a group ID. Access
+control works by comparing the user and group IDs of the file with those
+of the running process.
+
+   The system keeps a database of all the registered users, and another
+database of all the defined groups.  There are library functions you can
+use to examine these databases.
+
+* Menu:
+
+* User and Group IDs::          Each user has a unique numeric ID;
+				 likewise for groups.
+* Process Persona::             The user IDs and group IDs of a process.
+* Why Change Persona::          Why a program might need to change
+				 its user and/or group IDs.
+* How Change Persona::          Changing the user and group IDs.
+* Reading Persona::             How to examine the user and group IDs.
+
+* Setting User ID::             Functions for setting the user ID.
+* Setting Groups::              Functions for setting the group IDs.
+
+* Enable/Disable Setuid::       Turning setuid access on and off.
+* Setuid Program Example::      The pertinent parts of one sample program.
+* Tips for Setuid::             How to avoid granting unlimited access.
+
+* Who Logged In::               Getting the name of the user who logged in,
+				 or of the real user ID of the current process.
+
+* User Accounting Database::    Keeping information about users and various
+                                 actions in databases.
+
+* User Database::               Functions and data structures for
+                        	 accessing the user database.
+* Group Database::              Functions and data structures for
+                        	 accessing the group database.
+* Database Example::            Example program showing the use of database
+				 inquiry functions.
+* Netgroup Database::           Functions for accessing the netgroup database.
+
+
+File: libc.info,  Node: User and Group IDs,  Next: Process Persona,  Up: Users and Groups
+
+29.1 User and Group IDs
+=======================
+
+Each user account on a computer system is identified by a "user name"
+(or "login name") and "user ID". Normally, each user name has a unique
+user ID, but it is possible for several login names to have the same
+user ID. The user names and corresponding user IDs are stored in a data
+base which you can access as described in *note User Database::.
+
+   Users are classified in "groups".  Each user name belongs to one
+"default group" and may also belong to any number of "supplementary
+groups".  Users who are members of the same group can share resources
+(such as files) that are not accessible to users who are not a member of
+that group.  Each group has a "group name" and "group ID". *Note Group
+Database::, for how to find information about a group ID or group name.
+
+
+File: libc.info,  Node: Process Persona,  Next: Why Change Persona,  Prev: User and Group IDs,  Up: Users and Groups
+
+29.2 The Persona of a Process
+=============================
+
+At any time, each process has an "effective user ID", a "effective group
+ID", and a set of "supplementary group IDs".  These IDs determine the
+privileges of the process.  They are collectively called the "persona"
+of the process, because they determine "who it is" for purposes of
+access control.
+
+   Your login shell starts out with a persona which consists of your
+user ID, your default group ID, and your supplementary group IDs (if you
+are in more than one group).  In normal circumstances, all your other
+processes inherit these values.
+
+   A process also has a "real user ID" which identifies the user who
+created the process, and a "real group ID" which identifies that user's
+default group.  These values do not play a role in access control, so we
+do not consider them part of the persona.  But they are also important.
+
+   Both the real and effective user ID can be changed during the
+lifetime of a process.  *Note Why Change Persona::.
+
+   For details on how a process's effective user ID and group IDs affect
+its permission to access files, see *note Access Permission::.
+
+   The effective user ID of a process also controls permissions for
+sending signals using the 'kill' function.  *Note Signaling Another
+Process::.
+
+   Finally, there are many operations which can only be performed by a
+process whose effective user ID is zero.  A process with this user ID is
+a "privileged process".  Commonly the user name 'root' is associated
+with user ID 0, but there may be other user names with this ID.
+
+
+File: libc.info,  Node: Why Change Persona,  Next: How Change Persona,  Prev: Process Persona,  Up: Users and Groups
+
+29.3 Why Change the Persona of a Process?
+=========================================
+
+The most obvious situation where it is necessary for a process to change
+its user and/or group IDs is the 'login' program.  When 'login' starts
+running, its user ID is 'root'.  Its job is to start a shell whose user
+and group IDs are those of the user who is logging in.  (To accomplish
+this fully, 'login' must set the real user and group IDs as well as its
+persona.  But this is a special case.)
+
+   The more common case of changing persona is when an ordinary user
+program needs access to a resource that wouldn't ordinarily be
+accessible to the user actually running it.
+
+   For example, you may have a file that is controlled by your program
+but that shouldn't be read or modified directly by other users, either
+because it implements some kind of locking protocol, or because you want
+to preserve the integrity or privacy of the information it contains.
+This kind of restricted access can be implemented by having the program
+change its effective user or group ID to match that of the resource.
+
+   Thus, imagine a game program that saves scores in a file.  The game
+program itself needs to be able to update this file no matter who is
+running it, but if users can write the file without going through the
+game, they can give themselves any scores they like.  Some people
+consider this undesirable, or even reprehensible.  It can be prevented
+by creating a new user ID and login name (say, 'games') to own the
+scores file, and make the file writable only by this user.  Then, when
+the game program wants to update this file, it can change its effective
+user ID to be that for 'games'.  In effect, the program must adopt the
+persona of 'games' so it can write the scores file.
+
+
+File: libc.info,  Node: How Change Persona,  Next: Reading Persona,  Prev: Why Change Persona,  Up: Users and Groups
+
+29.4 How an Application Can Change Persona
+==========================================
+
+The ability to change the persona of a process can be a source of
+unintentional privacy violations, or even intentional abuse.  Because of
+the potential for problems, changing persona is restricted to special
+circumstances.
+
+   You can't arbitrarily set your user ID or group ID to anything you
+want; only privileged processes can do that.  Instead, the normal way
+for a program to change its persona is that it has been set up in
+advance to change to a particular user or group.  This is the function
+of the setuid and setgid bits of a file's access mode.  *Note Permission
+Bits::.
+
+   When the setuid bit of an executable file is on, executing that file
+gives the process a third user ID: the "file user ID". This ID is set to
+the owner ID of the file.  The system then changes the effective user ID
+to the file user ID. The real user ID remains as it was.  Likewise, if
+the setgid bit is on, the process is given a "file group ID" equal to
+the group ID of the file, and its effective group ID is changed to the
+file group ID.
+
+   If a process has a file ID (user or group), then it can at any time
+change its effective ID to its real ID and back to its file ID. Programs
+use this feature to relinquish their special privileges except when they
+actually need them.  This makes it less likely that they can be tricked
+into doing something inappropriate with their privileges.
+
+   *Portability Note:* Older systems do not have file IDs.  To determine
+if a system has this feature, you can test the compiler define
+'_POSIX_SAVED_IDS'.  (In the POSIX standard, file IDs are known as saved
+IDs.)
+
+   *Note File Attributes::, for a more general discussion of file modes
+and accessibility.
+
+
+File: libc.info,  Node: Reading Persona,  Next: Setting User ID,  Prev: How Change Persona,  Up: Users and Groups
+
+29.5 Reading the Persona of a Process
+=====================================
+
+Here are detailed descriptions of the functions for reading the user and
+group IDs of a process, both real and effective.  To use these
+facilities, you must include the header files 'sys/types.h' and
+'unistd.h'.
+
+ -- Data Type: uid_t
+     This is an integer data type used to represent user IDs.  In the
+     GNU C Library, this is an alias for 'unsigned int'.
+
+ -- Data Type: gid_t
+     This is an integer data type used to represent group IDs.  In the
+     GNU C Library, this is an alias for 'unsigned int'.
+
+ -- Function: uid_t getuid (void)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'getuid' function returns the real user ID of the process.
+
+ -- Function: gid_t getgid (void)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'getgid' function returns the real group ID of the process.
+
+ -- Function: uid_t geteuid (void)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'geteuid' function returns the effective user ID of the
+     process.
+
+ -- Function: gid_t getegid (void)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'getegid' function returns the effective group ID of the
+     process.
+
+ -- Function: int getgroups (int COUNT, gid_t *GROUPS)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'getgroups' function is used to inquire about the supplementary
+     group IDs of the process.  Up to COUNT of these group IDs are
+     stored in the array GROUPS; the return value from the function is
+     the number of group IDs actually stored.  If COUNT is smaller than
+     the total number of supplementary group IDs, then 'getgroups'
+     returns a value of '-1' and 'errno' is set to 'EINVAL'.
+
+     If COUNT is zero, then 'getgroups' just returns the total number of
+     supplementary group IDs.  On systems that do not support
+     supplementary groups, this will always be zero.
+
+     Here's how to use 'getgroups' to read all the supplementary group
+     IDs:
+
+          gid_t *
+          read_all_groups (void)
+          {
+            int ngroups = getgroups (0, NULL);
+            gid_t *groups
+              = (gid_t *) xmalloc (ngroups * sizeof (gid_t));
+            int val = getgroups (ngroups, groups);
+            if (val < 0)
+              {
+                free (groups);
+                return NULL;
+              }
+            return groups;
+          }
+
+
+File: libc.info,  Node: Setting User ID,  Next: Setting Groups,  Prev: Reading Persona,  Up: Users and Groups
+
+29.6 Setting the User ID
+========================
+
+This section describes the functions for altering the user ID (real
+and/or effective) of a process.  To use these facilities, you must
+include the header files 'sys/types.h' and 'unistd.h'.
+
+ -- Function: int seteuid (uid_t NEWEUID)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     This function sets the effective user ID of a process to NEWEUID,
+     provided that the process is allowed to change its effective user
+     ID. A privileged process (effective user ID zero) can change its
+     effective user ID to any legal value.  An unprivileged process with
+     a file user ID can change its effective user ID to its real user ID
+     or to its file user ID. Otherwise, a process may not change its
+     effective user ID at all.
+
+     The 'seteuid' function returns a value of '0' to indicate
+     successful completion, and a value of '-1' to indicate an error.
+     The following 'errno' error conditions are defined for this
+     function:
+
+     'EINVAL'
+          The value of the NEWEUID argument is invalid.
+
+     'EPERM'
+          The process may not change to the specified ID.
+
+     Older systems (those without the '_POSIX_SAVED_IDS' feature) do not
+     have this function.
+
+ -- Function: int setuid (uid_t NEWUID)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     If the calling process is privileged, this function sets both the
+     real and effective user ID of the process to NEWUID.  It also
+     deletes the file user ID of the process, if any.  NEWUID may be any
+     legal value.  (Once this has been done, there is no way to recover
+     the old effective user ID.)
+
+     If the process is not privileged, and the system supports the
+     '_POSIX_SAVED_IDS' feature, then this function behaves like
+     'seteuid'.
+
+     The return values and error conditions are the same as for
+     'seteuid'.
+
+ -- Function: int setreuid (uid_t RUID, uid_t EUID)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     This function sets the real user ID of the process to RUID and the
+     effective user ID to EUID.  If RUID is '-1', it means not to change
+     the real user ID; likewise if EUID is '-1', it means not to change
+     the effective user ID.
+
+     The 'setreuid' function exists for compatibility with 4.3 BSD Unix,
+     which does not support file IDs.  You can use this function to swap
+     the effective and real user IDs of the process.  (Privileged
+     processes are not limited to this particular usage.)  If file IDs
+     are supported, you should use that feature instead of this
+     function.  *Note Enable/Disable Setuid::.
+
+     The return value is '0' on success and '-1' on failure.  The
+     following 'errno' error conditions are defined for this function:
+
+     'EPERM'
+          The process does not have the appropriate privileges; you do
+          not have permission to change to the specified ID.
+
+
+File: libc.info,  Node: Setting Groups,  Next: Enable/Disable Setuid,  Prev: Setting User ID,  Up: Users and Groups
+
+29.7 Setting the Group IDs
+==========================
+
+This section describes the functions for altering the group IDs (real
+and effective) of a process.  To use these facilities, you must include
+the header files 'sys/types.h' and 'unistd.h'.
+
+ -- Function: int setegid (gid_t NEWGID)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     This function sets the effective group ID of the process to NEWGID,
+     provided that the process is allowed to change its group ID. Just
+     as with 'seteuid', if the process is privileged it may change its
+     effective group ID to any value; if it isn't, but it has a file
+     group ID, then it may change to its real group ID or file group ID;
+     otherwise it may not change its effective group ID.
+
+     Note that a process is only privileged if its effective _user_ ID
+     is zero.  The effective group ID only affects access permissions.
+
+     The return values and error conditions for 'setegid' are the same
+     as those for 'seteuid'.
+
+     This function is only present if '_POSIX_SAVED_IDS' is defined.
+
+ -- Function: int setgid (gid_t NEWGID)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     This function sets both the real and effective group ID of the
+     process to NEWGID, provided that the process is privileged.  It
+     also deletes the file group ID, if any.
+
+     If the process is not privileged, then 'setgid' behaves like
+     'setegid'.
+
+     The return values and error conditions for 'setgid' are the same as
+     those for 'seteuid'.
+
+ -- Function: int setregid (gid_t RGID, gid_t EGID)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     This function sets the real group ID of the process to RGID and the
+     effective group ID to EGID.  If RGID is '-1', it means not to
+     change the real group ID; likewise if EGID is '-1', it means not to
+     change the effective group ID.
+
+     The 'setregid' function is provided for compatibility with 4.3 BSD
+     Unix, which does not support file IDs.  You can use this function
+     to swap the effective and real group IDs of the process.
+     (Privileged processes are not limited to this usage.)  If file IDs
+     are supported, you should use that feature instead of using this
+     function.  *Note Enable/Disable Setuid::.
+
+     The return values and error conditions for 'setregid' are the same
+     as those for 'setreuid'.
+
+   'setuid' and 'setgid' behave differently depending on whether the
+effective user ID at the time is zero.  If it is not zero, they behave
+like 'seteuid' and 'setegid'.  If it is, they change both effective and
+real IDs and delete the file ID. To avoid confusion, we recommend you
+always use 'seteuid' and 'setegid' except when you know the effective
+user ID is zero and your intent is to change the persona permanently.
+This case is rare--most of the programs that need it, such as 'login'
+and 'su', have already been written.
+
+   Note that if your program is setuid to some user other than 'root',
+there is no way to drop privileges permanently.
+
+   The system also lets privileged processes change their supplementary
+group IDs.  To use 'setgroups' or 'initgroups', your programs should
+include the header file 'grp.h'.
+
+ -- Function: int setgroups (size_t COUNT, const gid_t *GROUPS)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     This function sets the process's supplementary group IDs.  It can
+     only be called from privileged processes.  The COUNT argument
+     specifies the number of group IDs in the array GROUPS.
+
+     This function returns '0' if successful and '-1' on error.  The
+     following 'errno' error conditions are defined for this function:
+
+     'EPERM'
+          The calling process is not privileged.
+
+ -- Function: int initgroups (const char *USER, gid_t GROUP)
+     Preliminary: | MT-Safe locale | AS-Unsafe dlopen plugin heap lock |
+     AC-Unsafe corrupt mem fd lock | *Note POSIX Safety Concepts::.
+
+     The 'initgroups' function sets the process's supplementary group
+     IDs to be the normal default for the user name USER.  The group
+     GROUP is automatically included.
+
+     This function works by scanning the group database for all the
+     groups USER belongs to.  It then calls 'setgroups' with the list it
+     has constructed.
+
+     The return values and error conditions are the same as for
+     'setgroups'.
+
+   If you are interested in the groups a particular user belongs to, but
+do not want to change the process's supplementary group IDs, you can use
+'getgrouplist'.  To use 'getgrouplist', your programs should include the
+header file 'grp.h'.
+
+ -- Function: int getgrouplist (const char *USER, gid_t GROUP, gid_t
+          *GROUPS, int *NGROUPS)
+     Preliminary: | MT-Safe locale | AS-Unsafe dlopen plugin heap lock |
+     AC-Unsafe corrupt mem fd lock | *Note POSIX Safety Concepts::.
+
+     The 'getgrouplist' function scans the group database for all the
+     groups USER belongs to.  Up to *NGROUPS group IDs corresponding to
+     these groups are stored in the array GROUPS; the return value from
+     the function is the number of group IDs actually stored.  If
+     *NGROUPS is smaller than the total number of groups found, then
+     'getgrouplist' returns a value of '-1' and stores the actual number
+     of groups in *NGROUPS.  The group GROUP is automatically included
+     in the list of groups returned by 'getgrouplist'.
+
+     Here's how to use 'getgrouplist' to read all supplementary groups
+     for USER:
+
+          gid_t *
+          supplementary_groups (char *user)
+          {
+            int ngroups = 16;
+            gid_t *groups
+              = (gid_t *) xmalloc (ngroups * sizeof (gid_t));
+            struct passwd *pw = getpwnam (user);
+
+            if (pw == NULL)
+              return NULL;
+
+            if (getgrouplist (pw->pw_name, pw->pw_gid, groups, &ngroups) < 0)
+              {
+                groups = xrealloc (ngroups * sizeof (gid_t));
+                getgrouplist (pw->pw_name, pw->pw_gid, groups, &ngroups);
+              }
+            return groups;
+          }
+
+
+File: libc.info,  Node: Enable/Disable Setuid,  Next: Setuid Program Example,  Prev: Setting Groups,  Up: Users and Groups
+
+29.8 Enabling and Disabling Setuid Access
+=========================================
+
+A typical setuid program does not need its special access all of the
+time.  It's a good idea to turn off this access when it isn't needed, so
+it can't possibly give unintended access.
+
+   If the system supports the '_POSIX_SAVED_IDS' feature, you can
+accomplish this with 'seteuid'.  When the game program starts, its real
+user ID is 'jdoe', its effective user ID is 'games', and its saved user
+ID is also 'games'.  The program should record both user ID values once
+at the beginning, like this:
+
+     user_user_id = getuid ();
+     game_user_id = geteuid ();
+
+   Then it can turn off game file access with
+
+     seteuid (user_user_id);
+
+and turn it on with
+
+     seteuid (game_user_id);
+
+Throughout this process, the real user ID remains 'jdoe' and the file
+user ID remains 'games', so the program can always set its effective
+user ID to either one.
+
+   On other systems that don't support file user IDs, you can turn
+setuid access on and off by using 'setreuid' to swap the real and
+effective user IDs of the process, as follows:
+
+     setreuid (geteuid (), getuid ());
+
+This special case is always allowed--it cannot fail.
+
+   Why does this have the effect of toggling the setuid access?  Suppose
+a game program has just started, and its real user ID is 'jdoe' while
+its effective user ID is 'games'.  In this state, the game can write the
+scores file.  If it swaps the two uids, the real becomes 'games' and the
+effective becomes 'jdoe'; now the program has only 'jdoe' access.
+Another swap brings 'games' back to the effective user ID and restores
+access to the scores file.
+
+   In order to handle both kinds of systems, test for the saved user ID
+feature with a preprocessor conditional, like this:
+
+     #ifdef _POSIX_SAVED_IDS
+       seteuid (user_user_id);
+     #else
+       setreuid (geteuid (), getuid ());
+     #endif
+
+
+File: libc.info,  Node: Setuid Program Example,  Next: Tips for Setuid,  Prev: Enable/Disable Setuid,  Up: Users and Groups
+
+29.9 Setuid Program Example
+===========================
+
+Here's an example showing how to set up a program that changes its
+effective user ID.
+
+   This is part of a game program called 'caber-toss' that manipulates a
+file 'scores' that should be writable only by the game program itself.
+The program assumes that its executable file will be installed with the
+setuid bit set and owned by the same user as the 'scores' file.
+Typically, a system administrator will set up an account like 'games'
+for this purpose.
+
+   The executable file is given mode '4755', so that doing an 'ls -l' on
+it produces output like:
+
+     -rwsr-xr-x   1 games    184422 Jul 30 15:17 caber-toss
+
+The setuid bit shows up in the file modes as the 's'.
+
+   The scores file is given mode '644', and doing an 'ls -l' on it
+shows:
+
+     -rw-r--r--  1 games           0 Jul 31 15:33 scores
+
+   Here are the parts of the program that show how to set up the changed
+user ID. This program is conditionalized so that it makes use of the
+file IDs feature if it is supported, and otherwise uses 'setreuid' to
+swap the effective and real user IDs.
+
+     #include <stdio.h>
+     #include <sys/types.h>
+     #include <unistd.h>
+     #include <stdlib.h>
+
+
+     /* Remember the effective and real UIDs. */
+
+     static uid_t euid, ruid;
+
+
+     /* Restore the effective UID to its original value. */
+
+     void
+     do_setuid (void)
+     {
+       int status;
+
+     #ifdef _POSIX_SAVED_IDS
+       status = seteuid (euid);
+     #else
+       status = setreuid (ruid, euid);
+     #endif
+       if (status < 0) {
+         fprintf (stderr, "Couldn't set uid.\n");
+         exit (status);
+         }
+     }
+
+
+     /* Set the effective UID to the real UID. */
+
+     void
+     undo_setuid (void)
+     {
+       int status;
+
+     #ifdef _POSIX_SAVED_IDS
+       status = seteuid (ruid);
+     #else
+       status = setreuid (euid, ruid);
+     #endif
+       if (status < 0) {
+         fprintf (stderr, "Couldn't set uid.\n");
+         exit (status);
+         }
+     }
+
+     /* Main program. */
+
+     int
+     main (void)
+     {
+       /* Remember the real and effective user IDs.  */
+       ruid = getuid ();
+       euid = geteuid ();
+       undo_setuid ();
+
+       /* Do the game and record the score.  */
+       ...
+     }
+
+   Notice how the first thing the 'main' function does is to set the
+effective user ID back to the real user ID. This is so that any other
+file accesses that are performed while the user is playing the game use
+the real user ID for determining permissions.  Only when the program
+needs to open the scores file does it switch back to the file user ID,
+like this:
+
+     /* Record the score. */
+
+     int
+     record_score (int score)
+     {
+       FILE *stream;
+       char *myname;
+
+       /* Open the scores file. */
+       do_setuid ();
+       stream = fopen (SCORES_FILE, "a");
+       undo_setuid ();
+
+       /* Write the score to the file. */
+       if (stream)
+         {
+           myname = cuserid (NULL);
+           if (score < 0)
+             fprintf (stream, "%10s: Couldn't lift the caber.\n", myname);
+           else
+             fprintf (stream, "%10s: %d feet.\n", myname, score);
+           fclose (stream);
+           return 0;
+         }
+       else
+         return -1;
+     }
+
+
+File: libc.info,  Node: Tips for Setuid,  Next: Who Logged In,  Prev: Setuid Program Example,  Up: Users and Groups
+
+29.10 Tips for Writing Setuid Programs
+======================================
+
+It is easy for setuid programs to give the user access that isn't
+intended--in fact, if you want to avoid this, you need to be careful.
+Here are some guidelines for preventing unintended access and minimizing
+its consequences when it does occur:
+
+   * Don't have 'setuid' programs with privileged user IDs such as
+     'root' unless it is absolutely necessary.  If the resource is
+     specific to your particular program, it's better to define a new,
+     nonprivileged user ID or group ID just to manage that resource.
+     It's better if you can write your program to use a special group
+     than a special user.
+
+   * Be cautious about using the 'exec' functions in combination with
+     changing the effective user ID. Don't let users of your program
+     execute arbitrary programs under a changed user ID. Executing a
+     shell is especially bad news.  Less obviously, the 'execlp' and
+     'execvp' functions are a potential risk (since the program they
+     execute depends on the user's 'PATH' environment variable).
+
+     If you must 'exec' another program under a changed ID, specify an
+     absolute file name (*note File Name Resolution::) for the
+     executable, and make sure that the protections on that executable
+     and _all_ containing directories are such that ordinary users
+     cannot replace it with some other program.
+
+     You should also check the arguments passed to the program to make
+     sure they do not have unexpected effects.  Likewise, you should
+     examine the environment variables.  Decide which arguments and
+     variables are safe, and reject all others.
+
+     You should never use 'system' in a privileged program, because it
+     invokes a shell.
+
+   * Only use the user ID controlling the resource in the part of the
+     program that actually uses that resource.  When you're finished
+     with it, restore the effective user ID back to the actual user's
+     user ID. *Note Enable/Disable Setuid::.
+
+   * If the 'setuid' part of your program needs to access other files
+     besides the controlled resource, it should verify that the real
+     user would ordinarily have permission to access those files.  You
+     can use the 'access' function (*note Access Permission::) to check
+     this; it uses the real user and group IDs, rather than the
+     effective IDs.
+
+
+File: libc.info,  Node: Who Logged In,  Next: User Accounting Database,  Prev: Tips for Setuid,  Up: Users and Groups
+
+29.11 Identifying Who Logged In
+===============================
+
+You can use the functions listed in this section to determine the login
+name of the user who is running a process, and the name of the user who
+logged in the current session.  See also the function 'getuid' and
+friends (*note Reading Persona::).  How this information is collected by
+the system and how to control/add/remove information from the background
+storage is described in *note User Accounting Database::.
+
+   The 'getlogin' function is declared in 'unistd.h', while 'cuserid'
+and 'L_cuserid' are declared in 'stdio.h'.
+
+ -- Function: char * getlogin (void)
+     Preliminary: | MT-Unsafe race:getlogin race:utent sig:ALRM timer
+     locale | AS-Unsafe dlopen plugin heap lock | AC-Unsafe corrupt lock
+     fd mem | *Note POSIX Safety Concepts::.
+
+     The 'getlogin' function returns a pointer to a string containing
+     the name of the user logged in on the controlling terminal of the
+     process, or a null pointer if this information cannot be
+     determined.  The string is statically allocated and might be
+     overwritten on subsequent calls to this function or to 'cuserid'.
+
+ -- Function: char * cuserid (char *STRING)
+     Preliminary: | MT-Safe locale | AS-Unsafe dlopen plugin heap lock |
+     AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
+
+     The 'cuserid' function returns a pointer to a string containing a
+     user name associated with the effective ID of the process.  If
+     STRING is not a null pointer, it should be an array that can hold
+     at least 'L_cuserid' characters; the string is returned in this
+     array.  Otherwise, a pointer to a string in a static area is
+     returned.  This string is statically allocated and might be
+     overwritten on subsequent calls to this function or to 'getlogin'.
+
+     The use of this function is deprecated since it is marked to be
+     withdrawn in XPG4.2 and has already been removed from newer
+     revisions of POSIX.1.
+
+ -- Macro: int L_cuserid
+     An integer constant that indicates how long an array you might need
+     to store a user name.
+
+   These functions let your program identify positively the user who is
+running or the user who logged in this session.  (These can differ when
+setuid programs are involved; see *note Process Persona::.)  The user
+cannot do anything to fool these functions.
+
+   For most purposes, it is more useful to use the environment variable
+'LOGNAME' to find out who the user is.  This is more flexible precisely
+because the user can set 'LOGNAME' arbitrarily.  *Note Standard
+Environment::.
+
+
+File: libc.info,  Node: User Accounting Database,  Next: User Database,  Prev: Who Logged In,  Up: Users and Groups
+
+29.12 The User Accounting Database
+==================================
+
+Most Unix-like operating systems keep track of logged in users by
+maintaining a user accounting database.  This user accounting database
+stores for each terminal, who has logged on, at what time, the process
+ID of the user's login shell, etc., etc., but also stores information
+about the run level of the system, the time of the last system reboot,
+and possibly more.
+
+   The user accounting database typically lives in '/etc/utmp',
+'/var/adm/utmp' or '/var/run/utmp'.  However, these files should *never*
+be accessed directly.  For reading information from and writing
+information to the user accounting database, the functions described in
+this section should be used.
+
+* Menu:
+
+* Manipulating the Database::   Scanning and modifying the user
+                                 accounting database.
+* XPG Functions::               A standardized way for doing the same thing.
+* Logging In and Out::          Functions from BSD that modify the user
+                                 accounting database.
+
+
+File: libc.info,  Node: Manipulating the Database,  Next: XPG Functions,  Up: User Accounting Database
+
+29.12.1 Manipulating the User Accounting Database
+-------------------------------------------------
+
+These functions and the corresponding data structures are declared in
+the header file 'utmp.h'.
+
+ -- Data Type: struct exit_status
+     The 'exit_status' data structure is used to hold information about
+     the exit status of processes marked as 'DEAD_PROCESS' in the user
+     accounting database.
+
+     'short int e_termination'
+          The exit status of the process.
+
+     'short int e_exit'
+          The exit status of the process.
+
+ -- Data Type: struct utmp
+     The 'utmp' data structure is used to hold information about entries
+     in the user accounting database.  On GNU systems it has the
+     following members:
+
+     'short int ut_type'
+          Specifies the type of login; one of 'EMPTY', 'RUN_LVL',
+          'BOOT_TIME', 'OLD_TIME', 'NEW_TIME', 'INIT_PROCESS',
+          'LOGIN_PROCESS', 'USER_PROCESS', 'DEAD_PROCESS' or
+          'ACCOUNTING'.
+
+     'pid_t ut_pid'
+          The process ID number of the login process.
+
+     'char ut_line[]'
+          The device name of the tty (without '/dev/').
+
+     'char ut_id[]'
+          The inittab ID of the process.
+
+     'char ut_user[]'
+          The user's login name.
+
+     'char ut_host[]'
+          The name of the host from which the user logged in.
+
+     'struct exit_status ut_exit'
+          The exit status of a process marked as 'DEAD_PROCESS'.
+
+     'long ut_session'
+          The Session ID, used for windowing.
+
+     'struct timeval ut_tv'
+          Time the entry was made.  For entries of type 'OLD_TIME' this
+          is the time when the system clock changed, and for entries of
+          type 'NEW_TIME' this is the time the system clock was set to.
+
+     'int32_t ut_addr_v6[4]'
+          The Internet address of a remote host.
+
+   The 'ut_type', 'ut_pid', 'ut_id', 'ut_tv', and 'ut_host' fields are
+not available on all systems.  Portable applications therefore should be
+prepared for these situations.  To help doing this the 'utmp.h' header
+provides macros '_HAVE_UT_TYPE', '_HAVE_UT_PID', '_HAVE_UT_ID',
+'_HAVE_UT_TV', and '_HAVE_UT_HOST' if the respective field is available.
+The programmer can handle the situations by using '#ifdef' in the
+program code.
+
+   The following macros are defined for use as values for the 'ut_type'
+member of the 'utmp' structure.  The values are integer constants.
+
+'EMPTY'
+     This macro is used to indicate that the entry contains no valid
+     user accounting information.
+
+'RUN_LVL'
+     This macro is used to identify the systems runlevel.
+
+'BOOT_TIME'
+     This macro is used to identify the time of system boot.
+
+'OLD_TIME'
+     This macro is used to identify the time when the system clock
+     changed.
+
+'NEW_TIME'
+     This macro is used to identify the time after the system changed.
+
+'INIT_PROCESS'
+     This macro is used to identify a process spawned by the init
+     process.
+
+'LOGIN_PROCESS'
+     This macro is used to identify the session leader of a logged in
+     user.
+
+'USER_PROCESS'
+     This macro is used to identify a user process.
+
+'DEAD_PROCESS'
+     This macro is used to identify a terminated process.
+
+'ACCOUNTING'
+     ???
+
+   The size of the 'ut_line', 'ut_id', 'ut_user' and 'ut_host' arrays
+can be found using the 'sizeof' operator.
+
+   Many older systems have, instead of an 'ut_tv' member, an 'ut_time'
+member, usually of type 'time_t', for representing the time associated
+with the entry.  Therefore, for backwards compatibility only, 'utmp.h'
+defines 'ut_time' as an alias for 'ut_tv.tv_sec'.
+
+ -- Function: void setutent (void)
+     Preliminary: | MT-Unsafe race:utent | AS-Unsafe lock | AC-Unsafe
+     lock fd | *Note POSIX Safety Concepts::.
+
+     This function opens the user accounting database to begin scanning
+     it.  You can then call 'getutent', 'getutid' or 'getutline' to read
+     entries and 'pututline' to write entries.
+
+     If the database is already open, it resets the input to the
+     beginning of the database.
+
+ -- Function: struct utmp * getutent (void)
+     Preliminary: | MT-Unsafe init race:utent race:utentbuf sig:ALRM
+     timer | AS-Unsafe heap lock | AC-Unsafe lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     The 'getutent' function reads the next entry from the user
+     accounting database.  It returns a pointer to the entry, which is
+     statically allocated and may be overwritten by subsequent calls to
+     'getutent'.  You must copy the contents of the structure if you
+     wish to save the information or you can use the 'getutent_r'
+     function which stores the data in a user-provided buffer.
+
+     A null pointer is returned in case no further entry is available.
+
+ -- Function: void endutent (void)
+     Preliminary: | MT-Unsafe race:utent | AS-Unsafe lock | AC-Unsafe
+     lock fd | *Note POSIX Safety Concepts::.
+
+     This function closes the user accounting database.
+
+ -- Function: struct utmp * getutid (const struct utmp *ID)
+     Preliminary: | MT-Unsafe init race:utent sig:ALRM timer | AS-Unsafe
+     lock heap | AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
+
+     This function searches forward from the current point in the
+     database for an entry that matches ID.  If the 'ut_type' member of
+     the ID structure is one of 'RUN_LVL', 'BOOT_TIME', 'OLD_TIME' or
+     'NEW_TIME' the entries match if the 'ut_type' members are
+     identical.  If the 'ut_type' member of the ID structure is
+     'INIT_PROCESS', 'LOGIN_PROCESS', 'USER_PROCESS' or 'DEAD_PROCESS',
+     the entries match if the 'ut_type' member of the entry read from
+     the database is one of these four, and the 'ut_id' members match.
+     However if the 'ut_id' member of either the ID structure or the
+     entry read from the database is empty it checks if the 'ut_line'
+     members match instead.  If a matching entry is found, 'getutid'
+     returns a pointer to the entry, which is statically allocated, and
+     may be overwritten by a subsequent call to 'getutent', 'getutid' or
+     'getutline'.  You must copy the contents of the structure if you
+     wish to save the information.
+
+     A null pointer is returned in case the end of the database is
+     reached without a match.
+
+     The 'getutid' function may cache the last read entry.  Therefore,
+     if you are using 'getutid' to search for multiple occurrences, it
+     is necessary to zero out the static data after each call.
+     Otherwise 'getutid' could just return a pointer to the same entry
+     over and over again.
+
+ -- Function: struct utmp * getutline (const struct utmp *LINE)
+     Preliminary: | MT-Unsafe init race:utent sig:ALRM timer | AS-Unsafe
+     heap lock | AC-Unsafe lock fd mem | *Note POSIX Safety Concepts::.
+
+     This function searches forward from the current point in the
+     database until it finds an entry whose 'ut_type' value is
+     'LOGIN_PROCESS' or 'USER_PROCESS', and whose 'ut_line' member
+     matches the 'ut_line' member of the LINE structure.  If it finds
+     such an entry, it returns a pointer to the entry which is
+     statically allocated, and may be overwritten by a subsequent call
+     to 'getutent', 'getutid' or 'getutline'.  You must copy the
+     contents of the structure if you wish to save the information.
+
+     A null pointer is returned in case the end of the database is
+     reached without a match.
+
+     The 'getutline' function may cache the last read entry.  Therefore
+     if you are using 'getutline' to search for multiple occurrences, it
+     is necessary to zero out the static data after each call.
+     Otherwise 'getutline' could just return a pointer to the same entry
+     over and over again.
+
+ -- Function: struct utmp * pututline (const struct utmp *UTMP)
+     Preliminary: | MT-Unsafe race:utent sig:ALRM timer | AS-Unsafe lock
+     | AC-Unsafe lock fd | *Note POSIX Safety Concepts::.
+
+     The 'pututline' function inserts the entry '*UTMP' at the
+     appropriate place in the user accounting database.  If it finds
+     that it is not already at the correct place in the database, it
+     uses 'getutid' to search for the position to insert the entry,
+     however this will not modify the static structure returned by
+     'getutent', 'getutid' and 'getutline'.  If this search fails, the
+     entry is appended to the database.
+
+     The 'pututline' function returns a pointer to a copy of the entry
+     inserted in the user accounting database, or a null pointer if the
+     entry could not be added.  The following 'errno' error conditions
+     are defined for this function:
+
+     'EPERM'
+          The process does not have the appropriate privileges; you
+          cannot modify the user accounting database.
+
+   All the 'get*' functions mentioned before store the information they
+return in a static buffer.  This can be a problem in multi-threaded
+programs since the data returned for the request is overwritten by the
+return value data in another thread.  Therefore the GNU C Library
+provides as extensions three more functions which return the data in a
+user-provided buffer.
+
+ -- Function: int getutent_r (struct utmp *BUFFER, struct utmp **RESULT)
+     Preliminary: | MT-Unsafe race:utent sig:ALRM timer | AS-Unsafe lock
+     | AC-Unsafe lock fd | *Note POSIX Safety Concepts::.
+
+     The 'getutent_r' is equivalent to the 'getutent' function.  It
+     returns the next entry from the database.  But instead of storing
+     the information in a static buffer it stores it in the buffer
+     pointed to by the parameter BUFFER.
+
+     If the call was successful, the function returns '0' and the
+     pointer variable pointed to by the parameter RESULT contains a
+     pointer to the buffer which contains the result (this is most
+     probably the same value as BUFFER).  If something went wrong during
+     the execution of 'getutent_r' the function returns '-1'.
+
+     This function is a GNU extension.
+
+ -- Function: int getutid_r (const struct utmp *ID, struct utmp *BUFFER,
+          struct utmp **RESULT)
+     Preliminary: | MT-Unsafe race:utent sig:ALRM timer | AS-Unsafe lock
+     | AC-Unsafe lock fd | *Note POSIX Safety Concepts::.
+
+     This function retrieves just like 'getutid' the next entry matching
+     the information stored in ID.  But the result is stored in the
+     buffer pointed to by the parameter BUFFER.
+
+     If successful the function returns '0' and the pointer variable
+     pointed to by the parameter RESULT contains a pointer to the buffer
+     with the result (probably the same as RESULT.  If not successful
+     the function return '-1'.
+
+     This function is a GNU extension.
+
+ -- Function: int getutline_r (const struct utmp *LINE, struct utmp
+          *BUFFER, struct utmp **RESULT)
+     Preliminary: | MT-Unsafe race:utent sig:ALRM timer | AS-Unsafe lock
+     | AC-Unsafe lock fd | *Note POSIX Safety Concepts::.
+
+     This function retrieves just like 'getutline' the next entry
+     matching the information stored in LINE.  But the result is stored
+     in the buffer pointed to by the parameter BUFFER.
+
+     If successful the function returns '0' and the pointer variable
+     pointed to by the parameter RESULT contains a pointer to the buffer
+     with the result (probably the same as RESULT.  If not successful
+     the function return '-1'.
+
+     This function is a GNU extension.
+
+   In addition to the user accounting database, most systems keep a
+number of similar databases.  For example most systems keep a log file
+with all previous logins (usually in '/etc/wtmp' or '/var/log/wtmp').
+
+   For specifying which database to examine, the following function
+should be used.
+
+ -- Function: int utmpname (const char *FILE)
+     Preliminary: | MT-Unsafe race:utent | AS-Unsafe lock heap |
+     AC-Unsafe lock mem | *Note POSIX Safety Concepts::.
+
+     The 'utmpname' function changes the name of the database to be
+     examined to FILE, and closes any previously opened database.  By
+     default 'getutent', 'getutid', 'getutline' and 'pututline' read
+     from and write to the user accounting database.
+
+     The following macros are defined for use as the FILE argument:
+
+      -- Macro: char * _PATH_UTMP
+          This macro is used to specify the user accounting database.
+
+      -- Macro: char * _PATH_WTMP
+          This macro is used to specify the user accounting log file.
+
+     The 'utmpname' function returns a value of '0' if the new name was
+     successfully stored, and a value of '-1' to indicate an error.
+     Note that 'utmpname' does not try to open the database, and that
+     therefore the return value does not say anything about whether the
+     database can be successfully opened.
+
+   Specially for maintaining log-like databases the GNU C Library
+provides the following function:
+
+ -- Function: void updwtmp (const char *WTMP_FILE, const struct utmp
+          *UTMP)
+     Preliminary: | MT-Unsafe sig:ALRM timer | AS-Unsafe | AC-Unsafe fd
+     | *Note POSIX Safety Concepts::.
+
+     The 'updwtmp' function appends the entry *UTMP to the database
+     specified by WTMP_FILE.  For possible values for the WTMP_FILE
+     argument see the 'utmpname' function.
+
+   *Portability Note:* Although many operating systems provide a subset
+of these functions, they are not standardized.  There are often subtle
+differences in the return types, and there are considerable differences
+between the various definitions of 'struct utmp'.  When programming for
+the GNU C Library, it is probably best to stick with the functions
+described in this section.  If however, you want your program to be
+portable, consider using the XPG functions described in *note XPG
+Functions::, or take a look at the BSD compatible functions in *note
+Logging In and Out::.
+
+
+File: libc.info,  Node: XPG Functions,  Next: Logging In and Out,  Prev: Manipulating the Database,  Up: User Accounting Database
+
+29.12.2 XPG User Accounting Database Functions
+----------------------------------------------
+
+These functions, described in the X/Open Portability Guide, are declared
+in the header file 'utmpx.h'.
+
+ -- Data Type: struct utmpx
+     The 'utmpx' data structure contains at least the following members:
+
+     'short int ut_type'
+          Specifies the type of login; one of 'EMPTY', 'RUN_LVL',
+          'BOOT_TIME', 'OLD_TIME', 'NEW_TIME', 'INIT_PROCESS',
+          'LOGIN_PROCESS', 'USER_PROCESS' or 'DEAD_PROCESS'.
+
+     'pid_t ut_pid'
+          The process ID number of the login process.
+
+     'char ut_line[]'
+          The device name of the tty (without '/dev/').
+
+     'char ut_id[]'
+          The inittab ID of the process.
+
+     'char ut_user[]'
+          The user's login name.
+
+     'struct timeval ut_tv'
+          Time the entry was made.  For entries of type 'OLD_TIME' this
+          is the time when the system clock changed, and for entries of
+          type 'NEW_TIME' this is the time the system clock was set to.
+     In the GNU C Library, 'struct utmpx' is identical to 'struct utmp'
+     except for the fact that including 'utmpx.h' does not make visible
+     the declaration of 'struct exit_status'.
+
+   The following macros are defined for use as values for the 'ut_type'
+member of the 'utmpx' structure.  The values are integer constants and
+are, in the GNU C Library, identical to the definitions in 'utmp.h'.
+
+'EMPTY'
+     This macro is used to indicate that the entry contains no valid
+     user accounting information.
+
+'RUN_LVL'
+     This macro is used to identify the systems runlevel.
+
+'BOOT_TIME'
+     This macro is used to identify the time of system boot.
+
+'OLD_TIME'
+     This macro is used to identify the time when the system clock
+     changed.
+
+'NEW_TIME'
+     This macro is used to identify the time after the system changed.
+
+'INIT_PROCESS'
+     This macro is used to identify a process spawned by the init
+     process.
+
+'LOGIN_PROCESS'
+     This macro is used to identify the session leader of a logged in
+     user.
+
+'USER_PROCESS'
+     This macro is used to identify a user process.
+
+'DEAD_PROCESS'
+     This macro is used to identify a terminated process.
+
+   The size of the 'ut_line', 'ut_id' and 'ut_user' arrays can be found
+using the 'sizeof' operator.
+
+ -- Function: void setutxent (void)
+     Preliminary: | MT-Unsafe race:utent | AS-Unsafe lock | AC-Unsafe
+     lock fd | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'setutent'.  In the GNU C Library it is
+     simply an alias for 'setutent'.
+
+ -- Function: struct utmpx * getutxent (void)
+     Preliminary: | MT-Unsafe init race:utent sig:ALRM timer | AS-Unsafe
+     heap lock | AC-Unsafe lock fd mem | *Note POSIX Safety Concepts::.
+
+     The 'getutxent' function is similar to 'getutent', but returns a
+     pointer to a 'struct utmpx' instead of 'struct utmp'.  In the GNU C
+     Library it simply is an alias for 'getutent'.
+
+ -- Function: void endutxent (void)
+     Preliminary: | MT-Unsafe race:utent | AS-Unsafe lock | AC-Unsafe
+     lock | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'endutent'.  In the GNU C Library it is
+     simply an alias for 'endutent'.
+
+ -- Function: struct utmpx * getutxid (const struct utmpx *ID)
+     Preliminary: | MT-Unsafe init race:utent sig:ALRM timer | AS-Unsafe
+     lock heap | AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'getutid', but uses 'struct utmpx'
+     instead of 'struct utmp'.  In the GNU C Library it is simply an
+     alias for 'getutid'.
+
+ -- Function: struct utmpx * getutxline (const struct utmpx *LINE)
+     Preliminary: | MT-Unsafe init race:utent sig:ALRM timer | AS-Unsafe
+     heap lock | AC-Unsafe lock fd mem | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'getutid', but uses 'struct utmpx'
+     instead of 'struct utmp'.  In the GNU C Library it is simply an
+     alias for 'getutline'.
+
+ -- Function: struct utmpx * pututxline (const struct utmpx *UTMP)
+     Preliminary: | MT-Unsafe race:utent sig:ALRM timer | AS-Unsafe lock
+     | AC-Unsafe lock fd | *Note POSIX Safety Concepts::.
+
+     The 'pututxline' function is functionally identical to 'pututline',
+     but uses 'struct utmpx' instead of 'struct utmp'.  In the GNU C
+     Library, 'pututxline' is simply an alias for 'pututline'.
+
+ -- Function: int utmpxname (const char *FILE)
+     Preliminary: | MT-Unsafe race:utent | AS-Unsafe lock heap |
+     AC-Unsafe lock mem | *Note POSIX Safety Concepts::.
+
+     The 'utmpxname' function is functionally identical to 'utmpname'.
+     In the GNU C Library, 'utmpxname' is simply an alias for
+     'utmpname'.
+
+   You can translate between a traditional 'struct utmp' and an XPG
+'struct utmpx' with the following functions.  In the GNU C Library,
+these functions are merely copies, since the two structures are
+identical.
+
+ -- Function: int getutmp (const struct utmpx *UTMPX, struct utmp *UTMP)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'getutmp' copies the information, insofar as the structures are
+     compatible, from UTMPX to UTMP.
+
+ -- Function: int getutmpx (const struct utmp *UTMP, struct utmpx
+          *UTMPX)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'getutmpx' copies the information, insofar as the structures are
+     compatible, from UTMP to UTMPX.
+
+
+File: libc.info,  Node: Logging In and Out,  Prev: XPG Functions,  Up: User Accounting Database
+
+29.12.3 Logging In and Out
+--------------------------
+
+These functions, derived from BSD, are available in the separate
+'libutil' library, and declared in 'utmp.h'.
+
+   Note that the 'ut_user' member of 'struct utmp' is called 'ut_name'
+in BSD. Therefore, 'ut_name' is defined as an alias for 'ut_user' in
+'utmp.h'.
+
+ -- Function: int login_tty (int FILEDES)
+     Preliminary: | MT-Unsafe race:ttyname | AS-Unsafe heap lock |
+     AC-Unsafe lock fd mem | *Note POSIX Safety Concepts::.
+
+     This function makes FILEDES the controlling terminal of the current
+     process, redirects standard input, standard output and standard
+     error output to this terminal, and closes FILEDES.
+
+     This function returns '0' on successful completion, and '-1' on
+     error.
+
+ -- Function: void login (const struct utmp *ENTRY)
+     Preliminary: | MT-Unsafe race:utent sig:ALRM timer | AS-Unsafe lock
+     heap | AC-Unsafe lock corrupt fd mem | *Note POSIX Safety
+     Concepts::.
+
+     The 'login' functions inserts an entry into the user accounting
+     database.  The 'ut_line' member is set to the name of the terminal
+     on standard input.  If standard input is not a terminal 'login'
+     uses standard output or standard error output to determine the name
+     of the terminal.  If 'struct utmp' has a 'ut_type' member, 'login'
+     sets it to 'USER_PROCESS', and if there is an 'ut_pid' member, it
+     will be set to the process ID of the current process.  The
+     remaining entries are copied from ENTRY.
+
+     A copy of the entry is written to the user accounting log file.
+
+ -- Function: int logout (const char *UT_LINE)
+     Preliminary: | MT-Unsafe race:utent sig:ALRM timer | AS-Unsafe lock
+     heap | AC-Unsafe lock fd mem | *Note POSIX Safety Concepts::.
+
+     This function modifies the user accounting database to indicate
+     that the user on UT_LINE has logged out.
+
+     The 'logout' function returns '1' if the entry was successfully
+     written to the database, or '0' on error.
+
+ -- Function: void logwtmp (const char *UT_LINE, const char *UT_NAME,
+          const char *UT_HOST)
+     Preliminary: | MT-Unsafe sig:ALRM timer | AS-Unsafe | AC-Unsafe fd
+     | *Note POSIX Safety Concepts::.
+
+     The 'logwtmp' function appends an entry to the user accounting log
+     file, for the current time and the information provided in the
+     UT_LINE, UT_NAME and UT_HOST arguments.
+
+   *Portability Note:* The BSD 'struct utmp' only has the 'ut_line',
+'ut_name', 'ut_host' and 'ut_time' members.  Older systems do not even
+have the 'ut_host' member.
+
+
+File: libc.info,  Node: User Database,  Next: Group Database,  Prev: User Accounting Database,  Up: Users and Groups
+
+29.13 User Database
+===================
+
+This section describes how to search and scan the database of registered
+users.  The database itself is kept in the file '/etc/passwd' on most
+systems, but on some systems a special network server gives access to
+it.
+
+* Menu:
+
+* User Data Structure::         What each user record contains.
+* Lookup User::                 How to look for a particular user.
+* Scanning All Users::          Scanning the list of all users, one by one.
+* Writing a User Entry::        How a program can rewrite a user's record.
+
+
+File: libc.info,  Node: User Data Structure,  Next: Lookup User,  Up: User Database
+
+29.13.1 The Data Structure that Describes a User
+------------------------------------------------
+
+The functions and data structures for accessing the system user database
+are declared in the header file 'pwd.h'.
+
+ -- Data Type: struct passwd
+     The 'passwd' data structure is used to hold information about
+     entries in the system user data base.  It has at least the
+     following members:
+
+     'char *pw_name'
+          The user's login name.
+
+     'char *pw_passwd.'
+          The encrypted password string.
+
+     'uid_t pw_uid'
+          The user ID number.
+
+     'gid_t pw_gid'
+          The user's default group ID number.
+
+     'char *pw_gecos'
+          A string typically containing the user's real name, and
+          possibly other information such as a phone number.
+
+     'char *pw_dir'
+          The user's home directory, or initial working directory.  This
+          might be a null pointer, in which case the interpretation is
+          system-dependent.
+
+     'char *pw_shell'
+          The user's default shell, or the initial program run when the
+          user logs in.  This might be a null pointer, indicating that
+          the system default should be used.
+
+
+File: libc.info,  Node: Lookup User,  Next: Scanning All Users,  Prev: User Data Structure,  Up: User Database
+
+29.13.2 Looking Up One User
+---------------------------
+
+You can search the system user database for information about a specific
+user using 'getpwuid' or 'getpwnam'.  These functions are declared in
+'pwd.h'.
+
+ -- Function: struct passwd * getpwuid (uid_t UID)
+     Preliminary: | MT-Unsafe race:pwuid locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     This function returns a pointer to a statically-allocated structure
+     containing information about the user whose user ID is UID.  This
+     structure may be overwritten on subsequent calls to 'getpwuid'.
+
+     A null pointer value indicates there is no user in the data base
+     with user ID UID.
+
+ -- Function: int getpwuid_r (uid_t UID, struct passwd *RESULT_BUF, char
+          *BUFFER, size_t BUFLEN, struct passwd **RESULT)
+     Preliminary: | MT-Safe locale | AS-Unsafe dlopen plugin heap lock |
+     AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'getpwuid' in that it returns
+     information about the user whose user ID is UID.  However, it fills
+     the user supplied structure pointed to by RESULT_BUF with the
+     information instead of using a static buffer.  The first BUFLEN
+     bytes of the additional buffer pointed to by BUFFER are used to
+     contain additional information, normally strings which are pointed
+     to by the elements of the result structure.
+
+     If a user with ID UID is found, the pointer returned in RESULT
+     points to the record which contains the wanted data (i.e., RESULT
+     contains the value RESULT_BUF).  If no user is found or if an error
+     occurred, the pointer returned in RESULT is a null pointer.  The
+     function returns zero or an error code.  If the buffer BUFFER is
+     too small to contain all the needed information, the error code
+     'ERANGE' is returned and ERRNO is set to 'ERANGE'.
+
+ -- Function: struct passwd * getpwnam (const char *NAME)
+     Preliminary: | MT-Unsafe race:pwnam locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     This function returns a pointer to a statically-allocated structure
+     containing information about the user whose user name is NAME.
+     This structure may be overwritten on subsequent calls to
+     'getpwnam'.
+
+     A null pointer return indicates there is no user named NAME.
+
+ -- Function: int getpwnam_r (const char *NAME, struct passwd
+          *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct passwd
+          **RESULT)
+     Preliminary: | MT-Safe locale | AS-Unsafe dlopen plugin heap lock |
+     AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'getpwnam' in that is returns
+     information about the user whose user name is NAME.  However, like
+     'getpwuid_r', it fills the user supplied buffers in RESULT_BUF and
+     BUFFER with the information instead of using a static buffer.
+
+     The return values are the same as for 'getpwuid_r'.
+
+
+File: libc.info,  Node: Scanning All Users,  Next: Writing a User Entry,  Prev: Lookup User,  Up: User Database
+
+29.13.3 Scanning the List of All Users
+--------------------------------------
+
+This section explains how a program can read the list of all users in
+the system, one user at a time.  The functions described here are
+declared in 'pwd.h'.
+
+   You can use the 'fgetpwent' function to read user entries from a
+particular file.
+
+ -- Function: struct passwd * fgetpwent (FILE *STREAM)
+     Preliminary: | MT-Unsafe race:fpwent | AS-Unsafe corrupt lock |
+     AC-Unsafe corrupt lock | *Note POSIX Safety Concepts::.
+
+     This function reads the next user entry from STREAM and returns a
+     pointer to the entry.  The structure is statically allocated and is
+     rewritten on subsequent calls to 'fgetpwent'.  You must copy the
+     contents of the structure if you wish to save the information.
+
+     The stream must correspond to a file in the same format as the
+     standard password database file.
+
+ -- Function: int fgetpwent_r (FILE *STREAM, struct passwd *RESULT_BUF,
+          char *BUFFER, size_t BUFLEN, struct passwd **RESULT)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
+     | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'fgetpwent' in that it reads the next
+     user entry from STREAM.  But the result is returned in the
+     structure pointed to by RESULT_BUF.  The first BUFLEN bytes of the
+     additional buffer pointed to by BUFFER are used to contain
+     additional information, normally strings which are pointed to by
+     the elements of the result structure.
+
+     The stream must correspond to a file in the same format as the
+     standard password database file.
+
+     If the function returns zero RESULT points to the structure with
+     the wanted data (normally this is in RESULT_BUF).  If errors
+     occurred the return value is nonzero and RESULT contains a null
+     pointer.
+
+   The way to scan all the entries in the user database is with
+'setpwent', 'getpwent', and 'endpwent'.
+
+ -- Function: void setpwent (void)
+     Preliminary: | MT-Unsafe race:pwent locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     This function initializes a stream which 'getpwent' and
+     'getpwent_r' use to read the user database.
+
+ -- Function: struct passwd * getpwent (void)
+     Preliminary: | MT-Unsafe race:pwent race:pwentbuf locale |
+     AS-Unsafe dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem |
+     *Note POSIX Safety Concepts::.
+
+     The 'getpwent' function reads the next entry from the stream
+     initialized by 'setpwent'.  It returns a pointer to the entry.  The
+     structure is statically allocated and is rewritten on subsequent
+     calls to 'getpwent'.  You must copy the contents of the structure
+     if you wish to save the information.
+
+     A null pointer is returned when no more entries are available.
+
+ -- Function: int getpwent_r (struct passwd *RESULT_BUF, char *BUFFER,
+          size_t BUFLEN, struct passwd **RESULT)
+     Preliminary: | MT-Unsafe race:pwent locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     This function is similar to 'getpwent' in that it returns the next
+     entry from the stream initialized by 'setpwent'.  Like
+     'fgetpwent_r', it uses the user-supplied buffers in RESULT_BUF and
+     BUFFER to return the information requested.
+
+     The return values are the same as for 'fgetpwent_r'.
+
+ -- Function: void endpwent (void)
+     Preliminary: | MT-Unsafe race:pwent locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     This function closes the internal stream used by 'getpwent' or
+     'getpwent_r'.
+
+
+File: libc.info,  Node: Writing a User Entry,  Prev: Scanning All Users,  Up: User Database
+
+29.13.4 Writing a User Entry
+----------------------------
+
+ -- Function: int putpwent (const struct passwd *P, FILE *STREAM)
+     Preliminary: | MT-Safe locale | AS-Unsafe corrupt | AC-Unsafe lock
+     corrupt | *Note POSIX Safety Concepts::.
+
+     This function writes the user entry '*P' to the stream STREAM, in
+     the format used for the standard user database file.  The return
+     value is zero on success and nonzero on failure.
+
+     This function exists for compatibility with SVID. We recommend that
+     you avoid using it, because it makes sense only on the assumption
+     that the 'struct passwd' structure has no members except the
+     standard ones; on a system which merges the traditional Unix data
+     base with other extended information about users, adding an entry
+     using this function would inevitably leave out much of the
+     important information.
+
+     The group and user ID fields are left empty if the group or user
+     name starts with a - or +.
+
+     The function 'putpwent' is declared in 'pwd.h'.
+
+
+File: libc.info,  Node: Group Database,  Next: Database Example,  Prev: User Database,  Up: Users and Groups
+
+29.14 Group Database
+====================
+
+This section describes how to search and scan the database of registered
+groups.  The database itself is kept in the file '/etc/group' on most
+systems, but on some systems a special network service provides access
+to it.
+
+* Menu:
+
+* Group Data Structure::        What each group record contains.
+* Lookup Group::                How to look for a particular group.
+* Scanning All Groups::         Scanning the list of all groups.
+
+
+File: libc.info,  Node: Group Data Structure,  Next: Lookup Group,  Up: Group Database
+
+29.14.1 The Data Structure for a Group
+--------------------------------------
+
+The functions and data structures for accessing the system group
+database are declared in the header file 'grp.h'.
+
+ -- Data Type: struct group
+     The 'group' structure is used to hold information about an entry in
+     the system group database.  It has at least the following members:
+
+     'char *gr_name'
+          The name of the group.
+
+     'gid_t gr_gid'
+          The group ID of the group.
+
+     'char **gr_mem'
+          A vector of pointers to the names of users in the group.  Each
+          user name is a null-terminated string, and the vector itself
+          is terminated by a null pointer.
+
+
+File: libc.info,  Node: Lookup Group,  Next: Scanning All Groups,  Prev: Group Data Structure,  Up: Group Database
+
+29.14.2 Looking Up One Group
+----------------------------
+
+You can search the group database for information about a specific group
+using 'getgrgid' or 'getgrnam'.  These functions are declared in
+'grp.h'.
+
+ -- Function: struct group * getgrgid (gid_t GID)
+     Preliminary: | MT-Unsafe race:grgid locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     This function returns a pointer to a statically-allocated structure
+     containing information about the group whose group ID is GID.  This
+     structure may be overwritten by subsequent calls to 'getgrgid'.
+
+     A null pointer indicates there is no group with ID GID.
+
+ -- Function: int getgrgid_r (gid_t GID, struct group *RESULT_BUF, char
+          *BUFFER, size_t BUFLEN, struct group **RESULT)
+     Preliminary: | MT-Safe locale | AS-Unsafe dlopen plugin heap lock |
+     AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'getgrgid' in that it returns
+     information about the group whose group ID is GID.  However, it
+     fills the user supplied structure pointed to by RESULT_BUF with the
+     information instead of using a static buffer.  The first BUFLEN
+     bytes of the additional buffer pointed to by BUFFER are used to
+     contain additional information, normally strings which are pointed
+     to by the elements of the result structure.
+
+     If a group with ID GID is found, the pointer returned in RESULT
+     points to the record which contains the wanted data (i.e., RESULT
+     contains the value RESULT_BUF).  If no group is found or if an
+     error occurred, the pointer returned in RESULT is a null pointer.
+     The function returns zero or an error code.  If the buffer BUFFER
+     is too small to contain all the needed information, the error code
+     'ERANGE' is returned and ERRNO is set to 'ERANGE'.
+
+ -- Function: struct group * getgrnam (const char *NAME)
+     Preliminary: | MT-Unsafe race:grnam locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     This function returns a pointer to a statically-allocated structure
+     containing information about the group whose group name is NAME.
+     This structure may be overwritten by subsequent calls to
+     'getgrnam'.
+
+     A null pointer indicates there is no group named NAME.
+
+ -- Function: int getgrnam_r (const char *NAME, struct group
+          *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct group
+          **RESULT)
+     Preliminary: | MT-Safe locale | AS-Unsafe dlopen plugin heap lock |
+     AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'getgrnam' in that is returns
+     information about the group whose group name is NAME.  Like
+     'getgrgid_r', it uses the user supplied buffers in RESULT_BUF and
+     BUFFER, not a static buffer.
+
+     The return values are the same as for 'getgrgid_r' 'ERANGE'.
+
+
+File: libc.info,  Node: Scanning All Groups,  Prev: Lookup Group,  Up: Group Database
+
+29.14.3 Scanning the List of All Groups
+---------------------------------------
+
+This section explains how a program can read the list of all groups in
+the system, one group at a time.  The functions described here are
+declared in 'grp.h'.
+
+   You can use the 'fgetgrent' function to read group entries from a
+particular file.
+
+ -- Function: struct group * fgetgrent (FILE *STREAM)
+     Preliminary: | MT-Unsafe race:fgrent | AS-Unsafe corrupt lock |
+     AC-Unsafe corrupt lock | *Note POSIX Safety Concepts::.
+
+     The 'fgetgrent' function reads the next entry from STREAM.  It
+     returns a pointer to the entry.  The structure is statically
+     allocated and is overwritten on subsequent calls to 'fgetgrent'.
+     You must copy the contents of the structure if you wish to save the
+     information.
+
+     The stream must correspond to a file in the same format as the
+     standard group database file.
+
+ -- Function: int fgetgrent_r (FILE *STREAM, struct group *RESULT_BUF,
+          char *BUFFER, size_t BUFLEN, struct group **RESULT)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
+     | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'fgetgrent' in that it reads the next
+     user entry from STREAM.  But the result is returned in the
+     structure pointed to by RESULT_BUF.  The first BUFLEN bytes of the
+     additional buffer pointed to by BUFFER are used to contain
+     additional information, normally strings which are pointed to by
+     the elements of the result structure.
+
+     This stream must correspond to a file in the same format as the
+     standard group database file.
+
+     If the function returns zero RESULT points to the structure with
+     the wanted data (normally this is in RESULT_BUF).  If errors
+     occurred the return value is non-zero and RESULT contains a null
+     pointer.
+
+   The way to scan all the entries in the group database is with
+'setgrent', 'getgrent', and 'endgrent'.
+
+ -- Function: void setgrent (void)
+     Preliminary: | MT-Unsafe race:grent locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     This function initializes a stream for reading from the group data
+     base.  You use this stream by calling 'getgrent' or 'getgrent_r'.
+
+ -- Function: struct group * getgrent (void)
+     Preliminary: | MT-Unsafe race:grent race:grentbuf locale |
+     AS-Unsafe dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem |
+     *Note POSIX Safety Concepts::.
+
+     The 'getgrent' function reads the next entry from the stream
+     initialized by 'setgrent'.  It returns a pointer to the entry.  The
+     structure is statically allocated and is overwritten on subsequent
+     calls to 'getgrent'.  You must copy the contents of the structure
+     if you wish to save the information.
+
+ -- Function: int getgrent_r (struct group *RESULT_BUF, char *BUFFER,
+          size_t BUFLEN, struct group **RESULT)
+     Preliminary: | MT-Unsafe race:grent locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     This function is similar to 'getgrent' in that it returns the next
+     entry from the stream initialized by 'setgrent'.  Like
+     'fgetgrent_r', it places the result in user-supplied buffers
+     pointed to RESULT_BUF and BUFFER.
+
+     If the function returns zero RESULT contains a pointer to the data
+     (normally equal to RESULT_BUF).  If errors occurred the return
+     value is non-zero and RESULT contains a null pointer.
+
+ -- Function: void endgrent (void)
+     Preliminary: | MT-Unsafe race:grent locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     This function closes the internal stream used by 'getgrent' or
+     'getgrent_r'.
+
+
+File: libc.info,  Node: Database Example,  Next: Netgroup Database,  Prev: Group Database,  Up: Users and Groups
+
+29.15 User and Group Database Example
+=====================================
+
+Here is an example program showing the use of the system database
+inquiry functions.  The program prints some information about the user
+running the program.
+
+
+     #include <grp.h>
+     #include <pwd.h>
+     #include <sys/types.h>
+     #include <unistd.h>
+     #include <stdlib.h>
+
+     int
+     main (void)
+     {
+       uid_t me;
+       struct passwd *my_passwd;
+       struct group *my_group;
+       char **members;
+
+       /* Get information about the user ID. */
+       me = getuid ();
+       my_passwd = getpwuid (me);
+       if (!my_passwd)
+         {
+           printf ("Couldn't find out about user %d.\n", (int) me);
+           exit (EXIT_FAILURE);
+         }
+
+       /* Print the information. */
+       printf ("I am %s.\n", my_passwd->pw_gecos);
+       printf ("My login name is %s.\n", my_passwd->pw_name);
+       printf ("My uid is %d.\n", (int) (my_passwd->pw_uid));
+       printf ("My home directory is %s.\n", my_passwd->pw_dir);
+       printf ("My default shell is %s.\n", my_passwd->pw_shell);
+
+       /* Get information about the default group ID. */
+       my_group = getgrgid (my_passwd->pw_gid);
+       if (!my_group)
+         {
+           printf ("Couldn't find out about group %d.\n",
+                   (int) my_passwd->pw_gid);
+           exit (EXIT_FAILURE);
+         }
+
+       /* Print the information. */
+       printf ("My default group is %s (%d).\n",
+               my_group->gr_name, (int) (my_passwd->pw_gid));
+       printf ("The members of this group are:\n");
+       members = my_group->gr_mem;
+       while (*members)
+         {
+           printf ("  %s\n", *(members));
+           members++;
+         }
+
+       return EXIT_SUCCESS;
+     }
+
+   Here is some output from this program:
+
+     I am Throckmorton Snurd.
+     My login name is snurd.
+     My uid is 31093.
+     My home directory is /home/fsg/snurd.
+     My default shell is /bin/sh.
+     My default group is guest (12).
+     The members of this group are:
+       friedman
+       tami
 
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-11 b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-11
index 1f2b24b..d32b128 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-11
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-11
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-12 b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-12
index 93f2e82..4b0b00b 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-12
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-12
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-13 b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-13
new file mode 100644
index 0000000..fe00c5d
--- /dev/null
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-13
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-14 b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-14
new file mode 100644
index 0000000..fe9a5a1
--- /dev/null
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-14
Binary files differ
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-2 b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-2
index 59b46d8..6a9ecdf 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-2
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-2
@@ -1,7 +1,24 @@
-This is
-/usr/local/google/home/jnewlin/src/uclibc/buildroot/output/build/glibc-2.19/build/manual/libc.info,
-produced by makeinfo version 4.13 from libc.texinfo.
+This is libc.info, produced by makeinfo version 5.2 from libc.texinfo.
 
+This file documents the GNU C Library.
+
+   This is 'The GNU C Library Reference Manual', for version 2.19
+(Buildroot).
+
+   Copyright (C) 1993-2014 Free Software Foundation, Inc.
+
+   Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being "Free Software Needs Free Documentation" and
+"GNU Lesser General Public License", the Front-Cover texts being "A GNU
+Manual", and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled "GNU Free Documentation
+License".
+
+   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
+modify this GNU manual.  Buying copies from the FSF supports it in
+developing GNU and promoting software freedom."
 INFO-DIR-SECTION Software libraries
 START-INFO-DIR-ENTRY
 * Libc: (libc).                 C library.
@@ -1692,25 +1709,1550 @@
 * ynl: (libc)Special Functions.
 END-INFO-DIR-ENTRY
 
-   This file documents the GNU C Library.
+
+File: libc.info,  Node: Obstack Functions,  Next: Growing Objects,  Prev: Freeing Obstack Objects,  Up: Obstacks
 
-   This is `The GNU C Library Reference Manual', for version 2.19
-(Buildroot).
+3.2.4.5 Obstack Functions and Macros
+....................................
 
-   Copyright (C) 1993-2014 Free Software Foundation, Inc.
+The interfaces for using obstacks may be defined either as functions or
+as macros, depending on the compiler.  The obstack facility works with
+all C compilers, including both ISO C and traditional C, but there are
+precautions you must take if you plan to use compilers other than GNU C.
 
-   Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version
-1.3 or any later version published by the Free Software Foundation;
-with the Invariant Sections being "Free Software Needs Free
-Documentation" and "GNU Lesser General Public License", the Front-Cover
-texts being "A GNU Manual", and with the Back-Cover Texts as in (a)
-below.  A copy of the license is included in the section entitled "GNU
-Free Documentation License".
+   If you are using an old-fashioned non-ISO C compiler, all the obstack
+"functions" are actually defined only as macros.  You can call these
+macros like functions, but you cannot use them in any other way (for
+example, you cannot take their address).
 
-   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
-modify this GNU manual.  Buying copies from the FSF supports it in
-developing GNU and promoting software freedom."
+   Calling the macros requires a special precaution: namely, the first
+operand (the obstack pointer) may not contain any side effects, because
+it may be computed more than once.  For example, if you write this:
+
+     obstack_alloc (get_obstack (), 4);
+
+you will find that 'get_obstack' may be called several times.  If you
+use '*obstack_list_ptr++' as the obstack pointer argument, you will get
+very strange results since the incrementation may occur several times.
+
+   In ISO C, each function has both a macro definition and a function
+definition.  The function definition is used if you take the address of
+the function without calling it.  An ordinary call uses the macro
+definition by default, but you can request the function definition
+instead by writing the function name in parentheses, as shown here:
+
+     char *x;
+     void *(*funcp) ();
+     /* Use the macro.  */
+     x = (char *) obstack_alloc (obptr, size);
+     /* Call the function.  */
+     x = (char *) (obstack_alloc) (obptr, size);
+     /* Take the address of the function.  */
+     funcp = obstack_alloc;
+
+This is the same situation that exists in ISO C for the standard library
+functions.  *Note Macro Definitions::.
+
+   *Warning:* When you do use the macros, you must observe the
+precaution of avoiding side effects in the first operand, even in ISO C.
+
+   If you use the GNU C compiler, this precaution is not necessary,
+because various language extensions in GNU C permit defining the macros
+so as to compute each argument only once.
+
+
+File: libc.info,  Node: Growing Objects,  Next: Extra Fast Growing,  Prev: Obstack Functions,  Up: Obstacks
+
+3.2.4.6 Growing Objects
+.......................
+
+Because memory in obstack chunks is used sequentially, it is possible to
+build up an object step by step, adding one or more bytes at a time to
+the end of the object.  With this technique, you do not need to know how
+much data you will put in the object until you come to the end of it.
+We call this the technique of "growing objects".  The special functions
+for adding data to the growing object are described in this section.
+
+   You don't need to do anything special when you start to grow an
+object.  Using one of the functions to add data to the object
+automatically starts it.  However, it is necessary to say explicitly
+when the object is finished.  This is done with the function
+'obstack_finish'.
+
+   The actual address of the object thus built up is not known until the
+object is finished.  Until then, it always remains possible that you
+will add so much data that the object must be copied into a new chunk.
+
+   While the obstack is in use for a growing object, you cannot use it
+for ordinary allocation of another object.  If you try to do so, the
+space already added to the growing object will become part of the other
+object.
+
+ -- Function: void obstack_blank (struct obstack *OBSTACK-PTR, int SIZE)
+     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
+     corrupt mem | *Note POSIX Safety Concepts::.
+
+     The most basic function for adding to a growing object is
+     'obstack_blank', which adds space without initializing it.
+
+ -- Function: void obstack_grow (struct obstack *OBSTACK-PTR, void
+          *DATA, int SIZE)
+     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
+     corrupt mem | *Note POSIX Safety Concepts::.
+
+     To add a block of initialized space, use 'obstack_grow', which is
+     the growing-object analogue of 'obstack_copy'.  It adds SIZE bytes
+     of data to the growing object, copying the contents from DATA.
+
+ -- Function: void obstack_grow0 (struct obstack *OBSTACK-PTR, void
+          *DATA, int SIZE)
+     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
+     corrupt mem | *Note POSIX Safety Concepts::.
+
+     This is the growing-object analogue of 'obstack_copy0'.  It adds
+     SIZE bytes copied from DATA, followed by an additional null
+     character.
+
+ -- Function: void obstack_1grow (struct obstack *OBSTACK-PTR, char C)
+     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
+     corrupt mem | *Note POSIX Safety Concepts::.
+
+     To add one character at a time, use the function 'obstack_1grow'.
+     It adds a single byte containing C to the growing object.
+
+ -- Function: void obstack_ptr_grow (struct obstack *OBSTACK-PTR, void
+          *DATA)
+     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
+     corrupt mem | *Note POSIX Safety Concepts::.
+
+     Adding the value of a pointer one can use the function
+     'obstack_ptr_grow'.  It adds 'sizeof (void *)' bytes containing the
+     value of DATA.
+
+ -- Function: void obstack_int_grow (struct obstack *OBSTACK-PTR, int
+          DATA)
+     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
+     corrupt mem | *Note POSIX Safety Concepts::.
+
+     A single value of type 'int' can be added by using the
+     'obstack_int_grow' function.  It adds 'sizeof (int)' bytes to the
+     growing object and initializes them with the value of DATA.
+
+ -- Function: void * obstack_finish (struct obstack *OBSTACK-PTR)
+     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     When you are finished growing the object, use the function
+     'obstack_finish' to close it off and return its final address.
+
+     Once you have finished the object, the obstack is available for
+     ordinary allocation or for growing another object.
+
+     This function can return a null pointer under the same conditions
+     as 'obstack_alloc' (*note Allocation in an Obstack::).
+
+   When you build an object by growing it, you will probably need to
+know afterward how long it became.  You need not keep track of this as
+you grow the object, because you can find out the length from the
+obstack just before finishing the object with the function
+'obstack_object_size', declared as follows:
+
+ -- Function: int obstack_object_size (struct obstack *OBSTACK-PTR)
+     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Safe | *Note
+     POSIX Safety Concepts::.
+
+     This function returns the current size of the growing object, in
+     bytes.  Remember to call this function _before_ finishing the
+     object.  After it is finished, 'obstack_object_size' will return
+     zero.
+
+   If you have started growing an object and wish to cancel it, you
+should finish it and then free it, like this:
+
+     obstack_free (obstack_ptr, obstack_finish (obstack_ptr));
+
+This has no effect if no object was growing.
+
+   You can use 'obstack_blank' with a negative size argument to make the
+current object smaller.  Just don't try to shrink it beyond zero
+length--there's no telling what will happen if you do that.
+
+
+File: libc.info,  Node: Extra Fast Growing,  Next: Status of an Obstack,  Prev: Growing Objects,  Up: Obstacks
+
+3.2.4.7 Extra Fast Growing Objects
+..................................
+
+The usual functions for growing objects incur overhead for checking
+whether there is room for the new growth in the current chunk.  If you
+are frequently constructing objects in small steps of growth, this
+overhead can be significant.
+
+   You can reduce the overhead by using special "fast growth" functions
+that grow the object without checking.  In order to have a robust
+program, you must do the checking yourself.  If you do this checking in
+the simplest way each time you are about to add data to the object, you
+have not saved anything, because that is what the ordinary growth
+functions do.  But if you can arrange to check less often, or check more
+efficiently, then you make the program faster.
+
+   The function 'obstack_room' returns the amount of room available in
+the current chunk.  It is declared as follows:
+
+ -- Function: int obstack_room (struct obstack *OBSTACK-PTR)
+     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Safe | *Note
+     POSIX Safety Concepts::.
+
+     This returns the number of bytes that can be added safely to the
+     current growing object (or to an object about to be started) in
+     obstack OBSTACK using the fast growth functions.
+
+   While you know there is room, you can use these fast growth functions
+for adding data to a growing object:
+
+ -- Function: void obstack_1grow_fast (struct obstack *OBSTACK-PTR, char
+          C)
+     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Unsafe
+     corrupt mem | *Note POSIX Safety Concepts::.
+
+     The function 'obstack_1grow_fast' adds one byte containing the
+     character C to the growing object in obstack OBSTACK-PTR.
+
+ -- Function: void obstack_ptr_grow_fast (struct obstack *OBSTACK-PTR,
+          void *DATA)
+     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Safe | *Note
+     POSIX Safety Concepts::.
+
+     The function 'obstack_ptr_grow_fast' adds 'sizeof (void *)' bytes
+     containing the value of DATA to the growing object in obstack
+     OBSTACK-PTR.
+
+ -- Function: void obstack_int_grow_fast (struct obstack *OBSTACK-PTR,
+          int DATA)
+     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Safe | *Note
+     POSIX Safety Concepts::.
+
+     The function 'obstack_int_grow_fast' adds 'sizeof (int)' bytes
+     containing the value of DATA to the growing object in obstack
+     OBSTACK-PTR.
+
+ -- Function: void obstack_blank_fast (struct obstack *OBSTACK-PTR, int
+          SIZE)
+     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Safe | *Note
+     POSIX Safety Concepts::.
+
+     The function 'obstack_blank_fast' adds SIZE bytes to the growing
+     object in obstack OBSTACK-PTR without initializing them.
+
+   When you check for space using 'obstack_room' and there is not enough
+room for what you want to add, the fast growth functions are not safe.
+In this case, simply use the corresponding ordinary growth function
+instead.  Very soon this will copy the object to a new chunk; then there
+will be lots of room available again.
+
+   So, each time you use an ordinary growth function, check afterward
+for sufficient space using 'obstack_room'.  Once the object is copied to
+a new chunk, there will be plenty of space again, so the program will
+start using the fast growth functions again.
+
+   Here is an example:
+
+     void
+     add_string (struct obstack *obstack, const char *ptr, int len)
+     {
+       while (len > 0)
+         {
+           int room = obstack_room (obstack);
+           if (room == 0)
+             {
+               /* Not enough room. Add one character slowly,
+                  which may copy to a new chunk and make room.  */
+               obstack_1grow (obstack, *ptr++);
+               len--;
+             }
+           else
+             {
+               if (room > len)
+                 room = len;
+               /* Add fast as much as we have room for. */
+               len -= room;
+               while (room-- > 0)
+                 obstack_1grow_fast (obstack, *ptr++);
+             }
+         }
+     }
+
+
+File: libc.info,  Node: Status of an Obstack,  Next: Obstacks Data Alignment,  Prev: Extra Fast Growing,  Up: Obstacks
+
+3.2.4.8 Status of an Obstack
+............................
+
+Here are functions that provide information on the current status of
+allocation in an obstack.  You can use them to learn about an object
+while still growing it.
+
+ -- Function: void * obstack_base (struct obstack *OBSTACK-PTR)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     This function returns the tentative address of the beginning of the
+     currently growing object in OBSTACK-PTR.  If you finish the object
+     immediately, it will have that address.  If you make it larger
+     first, it may outgrow the current chunk--then its address will
+     change!
+
+     If no object is growing, this value says where the next object you
+     allocate will start (once again assuming it fits in the current
+     chunk).
+
+ -- Function: void * obstack_next_free (struct obstack *OBSTACK-PTR)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     This function returns the address of the first free byte in the
+     current chunk of obstack OBSTACK-PTR.  This is the end of the
+     currently growing object.  If no object is growing,
+     'obstack_next_free' returns the same value as 'obstack_base'.
+
+ -- Function: int obstack_object_size (struct obstack *OBSTACK-PTR)
+     Preliminary: | MT-Safe race:obstack-ptr | AS-Safe | AC-Safe | *Note
+     POSIX Safety Concepts::.
+
+     This function returns the size in bytes of the currently growing
+     object.  This is equivalent to
+
+          obstack_next_free (OBSTACK-PTR) - obstack_base (OBSTACK-PTR)
+
+
+File: libc.info,  Node: Obstacks Data Alignment,  Next: Obstack Chunks,  Prev: Status of an Obstack,  Up: Obstacks
+
+3.2.4.9 Alignment of Data in Obstacks
+.....................................
+
+Each obstack has an "alignment boundary"; each object allocated in the
+obstack automatically starts on an address that is a multiple of the
+specified boundary.  By default, this boundary is aligned so that the
+object can hold any type of data.
+
+   To access an obstack's alignment boundary, use the macro
+'obstack_alignment_mask', whose function prototype looks like this:
+
+ -- Macro: int obstack_alignment_mask (struct obstack *OBSTACK-PTR)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The value is a bit mask; a bit that is 1 indicates that the
+     corresponding bit in the address of an object should be 0.  The
+     mask value should be one less than a power of 2; the effect is that
+     all object addresses are multiples of that power of 2.  The default
+     value of the mask is a value that allows aligned objects to hold
+     any type of data: for example, if its value is 3, any type of data
+     can be stored at locations whose addresses are multiples of 4.  A
+     mask value of 0 means an object can start on any multiple of 1
+     (that is, no alignment is required).
+
+     The expansion of the macro 'obstack_alignment_mask' is an lvalue,
+     so you can alter the mask by assignment.  For example, this
+     statement:
+
+          obstack_alignment_mask (obstack_ptr) = 0;
+
+     has the effect of turning off alignment processing in the specified
+     obstack.
+
+   Note that a change in alignment mask does not take effect until
+_after_ the next time an object is allocated or finished in the obstack.
+If you are not growing an object, you can make the new alignment mask
+take effect immediately by calling 'obstack_finish'.  This will finish a
+zero-length object and then do proper alignment for the next object.
+
+
+File: libc.info,  Node: Obstack Chunks,  Next: Summary of Obstacks,  Prev: Obstacks Data Alignment,  Up: Obstacks
+
+3.2.4.10 Obstack Chunks
+.......................
+
+Obstacks work by allocating space for themselves in large chunks, and
+then parceling out space in the chunks to satisfy your requests.  Chunks
+are normally 4096 bytes long unless you specify a different chunk size.
+The chunk size includes 8 bytes of overhead that are not actually used
+for storing objects.  Regardless of the specified size, longer chunks
+will be allocated when necessary for long objects.
+
+   The obstack library allocates chunks by calling the function
+'obstack_chunk_alloc', which you must define.  When a chunk is no longer
+needed because you have freed all the objects in it, the obstack library
+frees the chunk by calling 'obstack_chunk_free', which you must also
+define.
+
+   These two must be defined (as macros) or declared (as functions) in
+each source file that uses 'obstack_init' (*note Creating Obstacks::).
+Most often they are defined as macros like this:
+
+     #define obstack_chunk_alloc malloc
+     #define obstack_chunk_free free
+
+   Note that these are simple macros (no arguments).  Macro definitions
+with arguments will not work!  It is necessary that
+'obstack_chunk_alloc' or 'obstack_chunk_free', alone, expand into a
+function name if it is not itself a function name.
+
+   If you allocate chunks with 'malloc', the chunk size should be a
+power of 2.  The default chunk size, 4096, was chosen because it is long
+enough to satisfy many typical requests on the obstack yet short enough
+not to waste too much memory in the portion of the last chunk not yet
+used.
+
+ -- Macro: int obstack_chunk_size (struct obstack *OBSTACK-PTR)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This returns the chunk size of the given obstack.
+
+   Since this macro expands to an lvalue, you can specify a new chunk
+size by assigning it a new value.  Doing so does not affect the chunks
+already allocated, but will change the size of chunks allocated for that
+particular obstack in the future.  It is unlikely to be useful to make
+the chunk size smaller, but making it larger might improve efficiency if
+you are allocating many objects whose size is comparable to the chunk
+size.  Here is how to do so cleanly:
+
+     if (obstack_chunk_size (obstack_ptr) < NEW-CHUNK-SIZE)
+       obstack_chunk_size (obstack_ptr) = NEW-CHUNK-SIZE;
+
+
+File: libc.info,  Node: Summary of Obstacks,  Prev: Obstack Chunks,  Up: Obstacks
+
+3.2.4.11 Summary of Obstack Functions
+.....................................
+
+Here is a summary of all the functions associated with obstacks.  Each
+takes the address of an obstack ('struct obstack *') as its first
+argument.
+
+'void obstack_init (struct obstack *OBSTACK-PTR)'
+     Initialize use of an obstack.  *Note Creating Obstacks::.
+
+'void *obstack_alloc (struct obstack *OBSTACK-PTR, int SIZE)'
+     Allocate an object of SIZE uninitialized bytes.  *Note Allocation
+     in an Obstack::.
+
+'void *obstack_copy (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)'
+     Allocate an object of SIZE bytes, with contents copied from
+     ADDRESS.  *Note Allocation in an Obstack::.
+
+'void *obstack_copy0 (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)'
+     Allocate an object of SIZE+1 bytes, with SIZE of them copied from
+     ADDRESS, followed by a null character at the end.  *Note Allocation
+     in an Obstack::.
+
+'void obstack_free (struct obstack *OBSTACK-PTR, void *OBJECT)'
+     Free OBJECT (and everything allocated in the specified obstack more
+     recently than OBJECT).  *Note Freeing Obstack Objects::.
+
+'void obstack_blank (struct obstack *OBSTACK-PTR, int SIZE)'
+     Add SIZE uninitialized bytes to a growing object.  *Note Growing
+     Objects::.
+
+'void obstack_grow (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)'
+     Add SIZE bytes, copied from ADDRESS, to a growing object.  *Note
+     Growing Objects::.
+
+'void obstack_grow0 (struct obstack *OBSTACK-PTR, void *ADDRESS, int SIZE)'
+     Add SIZE bytes, copied from ADDRESS, to a growing object, and then
+     add another byte containing a null character.  *Note Growing
+     Objects::.
+
+'void obstack_1grow (struct obstack *OBSTACK-PTR, char DATA-CHAR)'
+     Add one byte containing DATA-CHAR to a growing object.  *Note
+     Growing Objects::.
+
+'void *obstack_finish (struct obstack *OBSTACK-PTR)'
+     Finalize the object that is growing and return its permanent
+     address.  *Note Growing Objects::.
+
+'int obstack_object_size (struct obstack *OBSTACK-PTR)'
+     Get the current size of the currently growing object.  *Note
+     Growing Objects::.
+
+'void obstack_blank_fast (struct obstack *OBSTACK-PTR, int SIZE)'
+     Add SIZE uninitialized bytes to a growing object without checking
+     that there is enough room.  *Note Extra Fast Growing::.
+
+'void obstack_1grow_fast (struct obstack *OBSTACK-PTR, char DATA-CHAR)'
+     Add one byte containing DATA-CHAR to a growing object without
+     checking that there is enough room.  *Note Extra Fast Growing::.
+
+'int obstack_room (struct obstack *OBSTACK-PTR)'
+     Get the amount of room now available for growing the current
+     object.  *Note Extra Fast Growing::.
+
+'int obstack_alignment_mask (struct obstack *OBSTACK-PTR)'
+     The mask used for aligning the beginning of an object.  This is an
+     lvalue.  *Note Obstacks Data Alignment::.
+
+'int obstack_chunk_size (struct obstack *OBSTACK-PTR)'
+     The size for allocating chunks.  This is an lvalue.  *Note Obstack
+     Chunks::.
+
+'void *obstack_base (struct obstack *OBSTACK-PTR)'
+     Tentative starting address of the currently growing object.  *Note
+     Status of an Obstack::.
+
+'void *obstack_next_free (struct obstack *OBSTACK-PTR)'
+     Address just after the end of the currently growing object.  *Note
+     Status of an Obstack::.
+
+
+File: libc.info,  Node: Variable Size Automatic,  Prev: Obstacks,  Up: Memory Allocation
+
+3.2.5 Automatic Storage with Variable Size
+------------------------------------------
+
+The function 'alloca' supports a kind of half-dynamic allocation in
+which blocks are allocated dynamically but freed automatically.
+
+   Allocating a block with 'alloca' is an explicit action; you can
+allocate as many blocks as you wish, and compute the size at run time.
+But all the blocks are freed when you exit the function that 'alloca'
+was called from, just as if they were automatic variables declared in
+that function.  There is no way to free the space explicitly.
+
+   The prototype for 'alloca' is in 'stdlib.h'.  This function is a BSD
+extension.
+
+ -- Function: void * alloca (size_t SIZE)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The return value of 'alloca' is the address of a block of SIZE
+     bytes of memory, allocated in the stack frame of the calling
+     function.
+
+   Do not use 'alloca' inside the arguments of a function call--you will
+get unpredictable results, because the stack space for the 'alloca'
+would appear on the stack in the middle of the space for the function
+arguments.  An example of what to avoid is 'foo (x, alloca (4), y)'.
+
+* Menu:
+
+* Alloca Example::              Example of using 'alloca'.
+* Advantages of Alloca::        Reasons to use 'alloca'.
+* Disadvantages of Alloca::     Reasons to avoid 'alloca'.
+* GNU C Variable-Size Arrays::  Only in GNU C, here is an alternative
+				 method of allocating dynamically and
+				 freeing automatically.
+
+
+File: libc.info,  Node: Alloca Example,  Next: Advantages of Alloca,  Up: Variable Size Automatic
+
+3.2.5.1 'alloca' Example
+........................
+
+As an example of the use of 'alloca', here is a function that opens a
+file name made from concatenating two argument strings, and returns a
+file descriptor or minus one signifying failure:
+
+     int
+     open2 (char *str1, char *str2, int flags, int mode)
+     {
+       char *name = (char *) alloca (strlen (str1) + strlen (str2) + 1);
+       stpcpy (stpcpy (name, str1), str2);
+       return open (name, flags, mode);
+     }
+
+Here is how you would get the same results with 'malloc' and 'free':
+
+     int
+     open2 (char *str1, char *str2, int flags, int mode)
+     {
+       char *name = (char *) malloc (strlen (str1) + strlen (str2) + 1);
+       int desc;
+       if (name == 0)
+         fatal ("virtual memory exceeded");
+       stpcpy (stpcpy (name, str1), str2);
+       desc = open (name, flags, mode);
+       free (name);
+       return desc;
+     }
+
+   As you can see, it is simpler with 'alloca'.  But 'alloca' has other,
+more important advantages, and some disadvantages.
+
+
+File: libc.info,  Node: Advantages of Alloca,  Next: Disadvantages of Alloca,  Prev: Alloca Example,  Up: Variable Size Automatic
+
+3.2.5.2 Advantages of 'alloca'
+..............................
+
+Here are the reasons why 'alloca' may be preferable to 'malloc':
+
+   * Using 'alloca' wastes very little space and is very fast.  (It is
+     open-coded by the GNU C compiler.)
+
+   * Since 'alloca' does not have separate pools for different sizes of
+     block, space used for any size block can be reused for any other
+     size.  'alloca' does not cause memory fragmentation.
+
+   * Nonlocal exits done with 'longjmp' (*note Non-Local Exits::)
+     automatically free the space allocated with 'alloca' when they exit
+     through the function that called 'alloca'.  This is the most
+     important reason to use 'alloca'.
+
+     To illustrate this, suppose you have a function
+     'open_or_report_error' which returns a descriptor, like 'open', if
+     it succeeds, but does not return to its caller if it fails.  If the
+     file cannot be opened, it prints an error message and jumps out to
+     the command level of your program using 'longjmp'.  Let's change
+     'open2' (*note Alloca Example::) to use this subroutine:
+
+          int
+          open2 (char *str1, char *str2, int flags, int mode)
+          {
+            char *name = (char *) alloca (strlen (str1) + strlen (str2) + 1);
+            stpcpy (stpcpy (name, str1), str2);
+            return open_or_report_error (name, flags, mode);
+          }
+
+     Because of the way 'alloca' works, the memory it allocates is freed
+     even when an error occurs, with no special effort required.
+
+     By contrast, the previous definition of 'open2' (which uses
+     'malloc' and 'free') would develop a memory leak if it were changed
+     in this way.  Even if you are willing to make more changes to fix
+     it, there is no easy way to do so.
+
+
+File: libc.info,  Node: Disadvantages of Alloca,  Next: GNU C Variable-Size Arrays,  Prev: Advantages of Alloca,  Up: Variable Size Automatic
+
+3.2.5.3 Disadvantages of 'alloca'
+.................................
+
+These are the disadvantages of 'alloca' in comparison with 'malloc':
+
+   * If you try to allocate more memory than the machine can provide,
+     you don't get a clean error message.  Instead you get a fatal
+     signal like the one you would get from an infinite recursion;
+     probably a segmentation violation (*note Program Error Signals::).
+
+   * Some non-GNU systems fail to support 'alloca', so it is less
+     portable.  However, a slower emulation of 'alloca' written in C is
+     available for use on systems with this deficiency.
+
+
+File: libc.info,  Node: GNU C Variable-Size Arrays,  Prev: Disadvantages of Alloca,  Up: Variable Size Automatic
+
+3.2.5.4 GNU C Variable-Size Arrays
+..................................
+
+In GNU C, you can replace most uses of 'alloca' with an array of
+variable size.  Here is how 'open2' would look then:
+
+     int open2 (char *str1, char *str2, int flags, int mode)
+     {
+       char name[strlen (str1) + strlen (str2) + 1];
+       stpcpy (stpcpy (name, str1), str2);
+       return open (name, flags, mode);
+     }
+
+   But 'alloca' is not always equivalent to a variable-sized array, for
+several reasons:
+
+   * A variable size array's space is freed at the end of the scope of
+     the name of the array.  The space allocated with 'alloca' remains
+     until the end of the function.
+
+   * It is possible to use 'alloca' within a loop, allocating an
+     additional block on each iteration.  This is impossible with
+     variable-sized arrays.
+
+   *NB:* If you mix use of 'alloca' and variable-sized arrays within one
+function, exiting a scope in which a variable-sized array was declared
+frees all blocks allocated with 'alloca' during the execution of that
+scope.
+
+
+File: libc.info,  Node: Resizing the Data Segment,  Next: Locking Pages,  Prev: Memory Allocation,  Up: Memory
+
+3.3 Resizing the Data Segment
+=============================
+
+The symbols in this section are declared in 'unistd.h'.
+
+   You will not normally use the functions in this section, because the
+functions described in *note Memory Allocation:: are easier to use.
+Those are interfaces to a GNU C Library memory allocator that uses the
+functions below itself.  The functions below are simple interfaces to
+system calls.
+
+ -- Function: int brk (void *ADDR)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'brk' sets the high end of the calling process' data segment to
+     ADDR.
+
+     The address of the end of a segment is defined to be the address of
+     the last byte in the segment plus 1.
+
+     The function has no effect if ADDR is lower than the low end of the
+     data segment.  (This is considered success, by the way).
+
+     The function fails if it would cause the data segment to overlap
+     another segment or exceed the process' data storage limit (*note
+     Limits on Resources::).
+
+     The function is named for a common historical case where data
+     storage and the stack are in the same segment.  Data storage
+     allocation grows upward from the bottom of the segment while the
+     stack grows downward toward it from the top of the segment and the
+     curtain between them is called the "break".
+
+     The return value is zero on success.  On failure, the return value
+     is '-1' and 'errno' is set accordingly.  The following 'errno'
+     values are specific to this function:
+
+     'ENOMEM'
+          The request would cause the data segment to overlap another
+          segment or exceed the process' data storage limit.
+
+ -- Function: void *sbrk (ptrdiff_t DELTA)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is the same as 'brk' except that you specify the new
+     end of the data segment as an offset DELTA from the current end and
+     on success the return value is the address of the resulting end of
+     the data segment instead of zero.
+
+     This means you can use 'sbrk(0)' to find out what the current end
+     of the data segment is.
+
+
+File: libc.info,  Node: Locking Pages,  Prev: Resizing the Data Segment,  Up: Memory
+
+3.4 Locking Pages
+=================
+
+You can tell the system to associate a particular virtual memory page
+with a real page frame and keep it that way -- i.e., cause the page to
+be paged in if it isn't already and mark it so it will never be paged
+out and consequently will never cause a page fault.  This is called
+"locking" a page.
+
+   The functions in this chapter lock and unlock the calling process'
+pages.
+
+* Menu:
+
+* Why Lock Pages::                Reasons to read this section.
+* Locked Memory Details::         Everything you need to know locked
+                                    memory
+* Page Lock Functions::           Here's how to do it.
+
+
+File: libc.info,  Node: Why Lock Pages,  Next: Locked Memory Details,  Up: Locking Pages
+
+3.4.1 Why Lock Pages
+--------------------
+
+Because page faults cause paged out pages to be paged in transparently,
+a process rarely needs to be concerned about locking pages.  However,
+there are two reasons people sometimes are:
+
+   * Speed.  A page fault is transparent only insofar as the process is
+     not sensitive to how long it takes to do a simple memory access.
+     Time-critical processes, especially realtime processes, may not be
+     able to wait or may not be able to tolerate variance in execution
+     speed.
+
+     A process that needs to lock pages for this reason probably also
+     needs priority among other processes for use of the CPU. *Note
+     Priority::.
+
+     In some cases, the programmer knows better than the system's demand
+     paging allocator which pages should remain in real memory to
+     optimize system performance.  In this case, locking pages can help.
+
+   * Privacy.  If you keep secrets in virtual memory and that virtual
+     memory gets paged out, that increases the chance that the secrets
+     will get out.  If a password gets written out to disk swap space,
+     for example, it might still be there long after virtual and real
+     memory have been wiped clean.
+
+   Be aware that when you lock a page, that's one fewer page frame that
+can be used to back other virtual memory (by the same or other
+processes), which can mean more page faults, which means the system runs
+more slowly.  In fact, if you lock enough memory, some programs may not
+be able to run at all for lack of real memory.
+
+
+File: libc.info,  Node: Locked Memory Details,  Next: Page Lock Functions,  Prev: Why Lock Pages,  Up: Locking Pages
+
+3.4.2 Locked Memory Details
+---------------------------
+
+A memory lock is associated with a virtual page, not a real frame.  The
+paging rule is: If a frame backs at least one locked page, don't page it
+out.
+
+   Memory locks do not stack.  I.e., you can't lock a particular page
+twice so that it has to be unlocked twice before it is truly unlocked.
+It is either locked or it isn't.
+
+   A memory lock persists until the process that owns the memory
+explicitly unlocks it.  (But process termination and exec cause the
+virtual memory to cease to exist, which you might say means it isn't
+locked any more).
+
+   Memory locks are not inherited by child processes.  (But note that on
+a modern Unix system, immediately after a fork, the parent's and the
+child's virtual address space are backed by the same real page frames,
+so the child enjoys the parent's locks).  *Note Creating a Process::.
+
+   Because of its ability to impact other processes, only the superuser
+can lock a page.  Any process can unlock its own page.
+
+   The system sets limits on the amount of memory a process can have
+locked and the amount of real memory it can have dedicated to it.  *Note
+Limits on Resources::.
+
+   In Linux, locked pages aren't as locked as you might think.  Two
+virtual pages that are not shared memory can nonetheless be backed by
+the same real frame.  The kernel does this in the name of efficiency
+when it knows both virtual pages contain identical data, and does it
+even if one or both of the virtual pages are locked.
+
+   But when a process modifies one of those pages, the kernel must get
+it a separate frame and fill it with the page's data.  This is known as
+a "copy-on-write page fault".  It takes a small amount of time and in a
+pathological case, getting that frame may require I/O.
+
+   To make sure this doesn't happen to your program, don't just lock the
+pages.  Write to them as well, unless you know you won't write to them
+ever.  And to make sure you have pre-allocated frames for your stack,
+enter a scope that declares a C automatic variable larger than the
+maximum stack size you will need, set it to something, then return from
+its scope.
+
+
+File: libc.info,  Node: Page Lock Functions,  Prev: Locked Memory Details,  Up: Locking Pages
+
+3.4.3 Functions To Lock And Unlock Pages
+----------------------------------------
+
+The symbols in this section are declared in 'sys/mman.h'.  These
+functions are defined by POSIX.1b, but their availability depends on
+your kernel.  If your kernel doesn't allow these functions, they exist
+but always fail.  They _are_ available with a Linux kernel.
+
+   *Portability Note:* POSIX.1b requires that when the 'mlock' and
+'munlock' functions are available, the file 'unistd.h' define the macro
+'_POSIX_MEMLOCK_RANGE' and the file 'limits.h' define the macro
+'PAGESIZE' to be the size of a memory page in bytes.  It requires that
+when the 'mlockall' and 'munlockall' functions are available, the
+'unistd.h' file define the macro '_POSIX_MEMLOCK'.  The GNU C Library
+conforms to this requirement.
+
+ -- Function: int mlock (const void *ADDR, size_t LEN)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'mlock' locks a range of the calling process' virtual pages.
+
+     The range of memory starts at address ADDR and is LEN bytes long.
+     Actually, since you must lock whole pages, it is the range of pages
+     that include any part of the specified range.
+
+     When the function returns successfully, each of those pages is
+     backed by (connected to) a real frame (is resident) and is marked
+     to stay that way.  This means the function may cause page-ins and
+     have to wait for them.
+
+     When the function fails, it does not affect the lock status of any
+     pages.
+
+     The return value is zero if the function succeeds.  Otherwise, it
+     is '-1' and 'errno' is set accordingly.  'errno' values specific to
+     this function are:
+
+     'ENOMEM'
+             * At least some of the specified address range does not
+               exist in the calling process' virtual address space.
+             * The locking would cause the process to exceed its locked
+               page limit.
+
+     'EPERM'
+          The calling process is not superuser.
+
+     'EINVAL'
+          LEN is not positive.
+
+     'ENOSYS'
+          The kernel does not provide 'mlock' capability.
+
+     You can lock _all_ a process' memory with 'mlockall'.  You unlock
+     memory with 'munlock' or 'munlockall'.
+
+     To avoid all page faults in a C program, you have to use
+     'mlockall', because some of the memory a program uses is hidden
+     from the C code, e.g.  the stack and automatic variables, and you
+     wouldn't know what address to tell 'mlock'.
+
+ -- Function: int munlock (const void *ADDR, size_t LEN)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'munlock' unlocks a range of the calling process' virtual pages.
+
+     'munlock' is the inverse of 'mlock' and functions completely
+     analogously to 'mlock', except that there is no 'EPERM' failure.
+
+ -- Function: int mlockall (int FLAGS)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'mlockall' locks all the pages in a process' virtual memory address
+     space, and/or any that are added to it in the future.  This
+     includes the pages of the code, data and stack segment, as well as
+     shared libraries, user space kernel data, shared memory, and memory
+     mapped files.
+
+     FLAGS is a string of single bit flags represented by the following
+     macros.  They tell 'mlockall' which of its functions you want.  All
+     other bits must be zero.
+
+     'MCL_CURRENT'
+          Lock all pages which currently exist in the calling process'
+          virtual address space.
+
+     'MCL_FUTURE'
+          Set a mode such that any pages added to the process' virtual
+          address space in the future will be locked from birth.  This
+          mode does not affect future address spaces owned by the same
+          process so exec, which replaces a process' address space,
+          wipes out 'MCL_FUTURE'.  *Note Executing a File::.
+
+     When the function returns successfully, and you specified
+     'MCL_CURRENT', all of the process' pages are backed by (connected
+     to) real frames (they are resident) and are marked to stay that
+     way.  This means the function may cause page-ins and have to wait
+     for them.
+
+     When the process is in 'MCL_FUTURE' mode because it successfully
+     executed this function and specified 'MCL_CURRENT', any system call
+     by the process that requires space be added to its virtual address
+     space fails with 'errno' = 'ENOMEM' if locking the additional space
+     would cause the process to exceed its locked page limit.  In the
+     case that the address space addition that can't be accommodated is
+     stack expansion, the stack expansion fails and the kernel sends a
+     'SIGSEGV' signal to the process.
+
+     When the function fails, it does not affect the lock status of any
+     pages or the future locking mode.
+
+     The return value is zero if the function succeeds.  Otherwise, it
+     is '-1' and 'errno' is set accordingly.  'errno' values specific to
+     this function are:
+
+     'ENOMEM'
+             * At least some of the specified address range does not
+               exist in the calling process' virtual address space.
+             * The locking would cause the process to exceed its locked
+               page limit.
+
+     'EPERM'
+          The calling process is not superuser.
+
+     'EINVAL'
+          Undefined bits in FLAGS are not zero.
+
+     'ENOSYS'
+          The kernel does not provide 'mlockall' capability.
+
+     You can lock just specific pages with 'mlock'.  You unlock pages
+     with 'munlockall' and 'munlock'.
+
+ -- Function: int munlockall (void)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'munlockall' unlocks every page in the calling process' virtual
+     address space and turn off 'MCL_FUTURE' future locking mode.
+
+     The return value is zero if the function succeeds.  Otherwise, it
+     is '-1' and 'errno' is set accordingly.  The only way this function
+     can fail is for generic reasons that all functions and system calls
+     can fail, so there are no specific 'errno' values.
+
+
+File: libc.info,  Node: Character Handling,  Next: String and Array Utilities,  Prev: Memory,  Up: Top
+
+4 Character Handling
+********************
+
+Programs that work with characters and strings often need to classify a
+character--is it alphabetic, is it a digit, is it whitespace, and so
+on--and perform case conversion operations on characters.  The functions
+in the header file 'ctype.h' are provided for this purpose.
+
+   Since the choice of locale and character set can alter the
+classifications of particular character codes, all of these functions
+are affected by the current locale.  (More precisely, they are affected
+by the locale currently selected for character classification--the
+'LC_CTYPE' category; see *note Locale Categories::.)
+
+   The ISO C standard specifies two different sets of functions.  The
+one set works on 'char' type characters, the other one on 'wchar_t' wide
+characters (*note Extended Char Intro::).
+
+* Menu:
+
+* Classification of Characters::       Testing whether characters are
+			                letters, digits, punctuation, etc.
+
+* Case Conversion::                    Case mapping, and the like.
+* Classification of Wide Characters::  Character class determination for
+                                        wide characters.
+* Using Wide Char Classes::            Notes on using the wide character
+                                        classes.
+* Wide Character Case Conversion::     Mapping of wide characters.
+
+
+File: libc.info,  Node: Classification of Characters,  Next: Case Conversion,  Up: Character Handling
+
+4.1 Classification of Characters
+================================
+
+This section explains the library functions for classifying characters.
+For example, 'isalpha' is the function to test for an alphabetic
+character.  It takes one argument, the character to test, and returns a
+nonzero integer if the character is alphabetic, and zero otherwise.  You
+would use it like this:
+
+     if (isalpha (c))
+       printf ("The character `%c' is alphabetic.\n", c);
+
+   Each of the functions in this section tests for membership in a
+particular class of characters; each has a name starting with 'is'.
+Each of them takes one argument, which is a character to test, and
+returns an 'int' which is treated as a boolean value.  The character
+argument is passed as an 'int', and it may be the constant value 'EOF'
+instead of a real character.
+
+   The attributes of any given character can vary between locales.
+*Note Locales::, for more information on locales.
+
+   These functions are declared in the header file 'ctype.h'.
+
+ -- Function: int islower (int C)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     Returns true if C is a lower-case letter.  The letter need not be
+     from the Latin alphabet, any alphabet representable is valid.
+
+ -- Function: int isupper (int C)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     Returns true if C is an upper-case letter.  The letter need not be
+     from the Latin alphabet, any alphabet representable is valid.
+
+ -- Function: int isalpha (int C)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     Returns true if C is an alphabetic character (a letter).  If
+     'islower' or 'isupper' is true of a character, then 'isalpha' is
+     also true.
+
+     In some locales, there may be additional characters for which
+     'isalpha' is true--letters which are neither upper case nor lower
+     case.  But in the standard '"C"' locale, there are no such
+     additional characters.
+
+ -- Function: int isdigit (int C)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     Returns true if C is a decimal digit ('0' through '9').
+
+ -- Function: int isalnum (int C)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     Returns true if C is an alphanumeric character (a letter or
+     number); in other words, if either 'isalpha' or 'isdigit' is true
+     of a character, then 'isalnum' is also true.
+
+ -- Function: int isxdigit (int C)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     Returns true if C is a hexadecimal digit.  Hexadecimal digits
+     include the normal decimal digits '0' through '9' and the letters
+     'A' through 'F' and 'a' through 'f'.
+
+ -- Function: int ispunct (int C)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     Returns true if C is a punctuation character.  This means any
+     printing character that is not alphanumeric or a space character.
+
+ -- Function: int isspace (int C)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     Returns true if C is a "whitespace" character.  In the standard
+     '"C"' locale, 'isspace' returns true for only the standard
+     whitespace characters:
+
+     '' ''
+          space
+
+     ''\f''
+          formfeed
+
+     ''\n''
+          newline
+
+     ''\r''
+          carriage return
+
+     ''\t''
+          horizontal tab
+
+     ''\v''
+          vertical tab
+
+ -- Function: int isblank (int C)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     Returns true if C is a blank character; that is, a space or a tab.
+     This function was originally a GNU extension, but was added in
+     ISO C99.
+
+ -- Function: int isgraph (int C)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     Returns true if C is a graphic character; that is, a character that
+     has a glyph associated with it.  The whitespace characters are not
+     considered graphic.
+
+ -- Function: int isprint (int C)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     Returns true if C is a printing character.  Printing characters
+     include all the graphic characters, plus the space (' ') character.
+
+ -- Function: int iscntrl (int C)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     Returns true if C is a control character (that is, a character that
+     is not a printing character).
+
+ -- Function: int isascii (int C)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     Returns true if C is a 7-bit 'unsigned char' value that fits into
+     the US/UK ASCII character set.  This function is a BSD extension
+     and is also an SVID extension.
+
+
+File: libc.info,  Node: Case Conversion,  Next: Classification of Wide Characters,  Prev: Classification of Characters,  Up: Character Handling
+
+4.2 Case Conversion
+===================
+
+This section explains the library functions for performing conversions
+such as case mappings on characters.  For example, 'toupper' converts
+any character to upper case if possible.  If the character can't be
+converted, 'toupper' returns it unchanged.
+
+   These functions take one argument of type 'int', which is the
+character to convert, and return the converted character as an 'int'.
+If the conversion is not applicable to the argument given, the argument
+is returned unchanged.
+
+   *Compatibility Note:* In pre-ISO C dialects, instead of returning the
+argument unchanged, these functions may fail when the argument is not
+suitable for the conversion.  Thus for portability, you may need to
+write 'islower(c) ? toupper(c) : c' rather than just 'toupper(c)'.
+
+   These functions are declared in the header file 'ctype.h'.
+
+ -- Function: int tolower (int C)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     If C is an upper-case letter, 'tolower' returns the corresponding
+     lower-case letter.  If C is not an upper-case letter, C is returned
+     unchanged.
+
+ -- Function: int toupper (int C)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     If C is a lower-case letter, 'toupper' returns the corresponding
+     upper-case letter.  Otherwise C is returned unchanged.
+
+ -- Function: int toascii (int C)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function converts C to a 7-bit 'unsigned char' value that fits
+     into the US/UK ASCII character set, by clearing the high-order
+     bits.  This function is a BSD extension and is also an SVID
+     extension.
+
+ -- Function: int _tolower (int C)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This is identical to 'tolower', and is provided for compatibility
+     with the SVID. *Note SVID::.
+
+ -- Function: int _toupper (int C)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This is identical to 'toupper', and is provided for compatibility
+     with the SVID.
+
+
+File: libc.info,  Node: Classification of Wide Characters,  Next: Using Wide Char Classes,  Prev: Case Conversion,  Up: Character Handling
+
+4.3 Character class determination for wide characters
+=====================================================
+
+Amendment 1 to ISO C90 defines functions to classify wide characters.
+Although the original ISO C90 standard already defined the type
+'wchar_t', no functions operating on them were defined.
+
+   The general design of the classification functions for wide
+characters is more general.  It allows extensions to the set of
+available classifications, beyond those which are always available.  The
+POSIX standard specifies how extensions can be made, and this is already
+implemented in the GNU C Library implementation of the 'localedef'
+program.
+
+   The character class functions are normally implemented with bitsets,
+with a bitset per character.  For a given character, the appropriate
+bitset is read from a table and a test is performed as to whether a
+certain bit is set.  Which bit is tested for is determined by the class.
+
+   For the wide character classification functions this is made visible.
+There is a type classification type defined, a function to retrieve this
+value for a given class, and a function to test whether a given
+character is in this class, using the classification value.  On top of
+this the normal character classification functions as used for 'char'
+objects can be defined.
+
+ -- Data type: wctype_t
+     The 'wctype_t' can hold a value which represents a character class.
+     The only defined way to generate such a value is by using the
+     'wctype' function.
+
+     This type is defined in 'wctype.h'.
+
+ -- Function: wctype_t wctype (const char *PROPERTY)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'wctype' returns a value representing a class of wide
+     characters which is identified by the string PROPERTY.  Beside some
+     standard properties each locale can define its own ones.  In case
+     no property with the given name is known for the current locale
+     selected for the 'LC_CTYPE' category, the function returns zero.
+
+     The properties known in every locale are:
+
+     '"alnum"'          '"alpha"'          '"cntrl"'          '"digit"'
+     '"graph"'          '"lower"'          '"print"'          '"punct"'
+     '"space"'          '"upper"'          '"xdigit"'
+
+     This function is declared in 'wctype.h'.
+
+   To test the membership of a character to one of the non-standard
+classes the ISO C standard defines a completely new function.
+
+ -- Function: int iswctype (wint_t WC, wctype_t DESC)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function returns a nonzero value if WC is in the character
+     class specified by DESC.  DESC must previously be returned by a
+     successful call to 'wctype'.
+
+     This function is declared in 'wctype.h'.
+
+   To make it easier to use the commonly-used classification functions,
+they are defined in the C library.  There is no need to use 'wctype' if
+the property string is one of the known character classes.  In some
+situations it is desirable to construct the property strings, and then
+it is important that 'wctype' can also handle the standard classes.
+
+ -- Function: int iswalnum (wint_t WC)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     This function returns a nonzero value if WC is an alphanumeric
+     character (a letter or number); in other words, if either
+     'iswalpha' or 'iswdigit' is true of a character, then 'iswalnum' is
+     also true.
+
+     This function can be implemented using
+
+          iswctype (wc, wctype ("alnum"))
+
+     It is declared in 'wctype.h'.
+
+ -- Function: int iswalpha (wint_t WC)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     Returns true if WC is an alphabetic character (a letter).  If
+     'iswlower' or 'iswupper' is true of a character, then 'iswalpha' is
+     also true.
+
+     In some locales, there may be additional characters for which
+     'iswalpha' is true--letters which are neither upper case nor lower
+     case.  But in the standard '"C"' locale, there are no such
+     additional characters.
+
+     This function can be implemented using
+
+          iswctype (wc, wctype ("alpha"))
+
+     It is declared in 'wctype.h'.
+
+ -- Function: int iswcntrl (wint_t WC)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     Returns true if WC is a control character (that is, a character
+     that is not a printing character).
+
+     This function can be implemented using
+
+          iswctype (wc, wctype ("cntrl"))
+
+     It is declared in 'wctype.h'.
+
+ -- Function: int iswdigit (wint_t WC)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     Returns true if WC is a digit (e.g., '0' through '9').  Please note
+     that this function does not only return a nonzero value for
+     _decimal_ digits, but for all kinds of digits.  A consequence is
+     that code like the following will *not* work unconditionally for
+     wide characters:
+
+          n = 0;
+          while (iswdigit (*wc))
+            {
+              n *= 10;
+              n += *wc++ - L'0';
+            }
+
+     This function can be implemented using
+
+          iswctype (wc, wctype ("digit"))
+
+     It is declared in 'wctype.h'.
+
+ -- Function: int iswgraph (wint_t WC)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     Returns true if WC is a graphic character; that is, a character
+     that has a glyph associated with it.  The whitespace characters are
+     not considered graphic.
+
+     This function can be implemented using
+
+          iswctype (wc, wctype ("graph"))
+
+     It is declared in 'wctype.h'.
+
+ -- Function: int iswlower (wint_t WC)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     Returns true if WC is a lower-case letter.  The letter need not be
+     from the Latin alphabet, any alphabet representable is valid.
+
+     This function can be implemented using
+
+          iswctype (wc, wctype ("lower"))
+
+     It is declared in 'wctype.h'.
+
+ -- Function: int iswprint (wint_t WC)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     Returns true if WC is a printing character.  Printing characters
+     include all the graphic characters, plus the space (' ') character.
+
+     This function can be implemented using
+
+          iswctype (wc, wctype ("print"))
+
+     It is declared in 'wctype.h'.
+
+ -- Function: int iswpunct (wint_t WC)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     Returns true if WC is a punctuation character.  This means any
+     printing character that is not alphanumeric or a space character.
+
+     This function can be implemented using
+
+          iswctype (wc, wctype ("punct"))
+
+     It is declared in 'wctype.h'.
+
+ -- Function: int iswspace (wint_t WC)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     Returns true if WC is a "whitespace" character.  In the standard
+     '"C"' locale, 'iswspace' returns true for only the standard
+     whitespace characters:
+
+     'L' ''
+          space
+
+     'L'\f''
+          formfeed
+
+     'L'\n''
+          newline
+
+     'L'\r''
+          carriage return
+
+     'L'\t''
+          horizontal tab
+
+     'L'\v''
+          vertical tab
+
+     This function can be implemented using
+
+          iswctype (wc, wctype ("space"))
+
+     It is declared in 'wctype.h'.
+
+ -- Function: int iswupper (wint_t WC)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     Returns true if WC is an upper-case letter.  The letter need not be
+     from the Latin alphabet, any alphabet representable is valid.
+
+     This function can be implemented using
+
+          iswctype (wc, wctype ("upper"))
+
+     It is declared in 'wctype.h'.
+
+ -- Function: int iswxdigit (wint_t WC)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     Returns true if WC is a hexadecimal digit.  Hexadecimal digits
+     include the normal decimal digits '0' through '9' and the letters
+     'A' through 'F' and 'a' through 'f'.
+
+     This function can be implemented using
+
+          iswctype (wc, wctype ("xdigit"))
+
+     It is declared in 'wctype.h'.
+
+   The GNU C Library also provides a function which is not defined in
+the ISO C standard but which is available as a version for single byte
+characters as well.
+
+ -- Function: int iswblank (wint_t WC)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     Returns true if WC is a blank character; that is, a space or a tab.
+     This function was originally a GNU extension, but was added in
+     ISO C99.  It is declared in 'wchar.h'.
+
+
+File: libc.info,  Node: Using Wide Char Classes,  Next: Wide Character Case Conversion,  Prev: Classification of Wide Characters,  Up: Character Handling
+
+4.4 Notes on using the wide character classes
+=============================================
+
+The first note is probably not astonishing but still occasionally a
+cause of problems.  The 'iswXXX' functions can be implemented using
+macros and in fact, the GNU C Library does this.  They are still
+available as real functions but when the 'wctype.h' header is included
+the macros will be used.  This is the same as the 'char' type versions
+of these functions.
+
+   The second note covers something new.  It can be best illustrated by
+a (real-world) example.  The first piece of code is an excerpt from the
+original code.  It is truncated a bit but the intention should be clear.
+
+     int
+     is_in_class (int c, const char *class)
+     {
+       if (strcmp (class, "alnum") == 0)
+         return isalnum (c);
+       if (strcmp (class, "alpha") == 0)
+         return isalpha (c);
+       if (strcmp (class, "cntrl") == 0)
+         return iscntrl (c);
+       ...
+       return 0;
+     }
+
+   Now, with the 'wctype' and 'iswctype' you can avoid the 'if'
+cascades, but rewriting the code as follows is wrong:
+
+     int
+     is_in_class (int c, const char *class)
+     {
+       wctype_t desc = wctype (class);
+       return desc ? iswctype ((wint_t) c, desc) : 0;
+     }
+
+   The problem is that it is not guaranteed that the wide character
+representation of a single-byte character can be found using casting.
+In fact, usually this fails miserably.  The correct solution to this
+problem is to write the code as follows:
+
+     int
+     is_in_class (int c, const char *class)
+     {
+       wctype_t desc = wctype (class);
+       return desc ? iswctype (btowc (c), desc) : 0;
+     }
+
+   *Note Converting a Character::, for more information on 'btowc'.
+Note that this change probably does not improve the performance of the
+program a lot since the 'wctype' function still has to make the string
+comparisons.  It gets really interesting if the 'is_in_class' function
+is called more than once for the same class name.  In this case the
+variable DESC could be computed once and reused for all the calls.
+Therefore the above form of the function is probably not the final one.
 
 
 File: libc.info,  Node: Wide Character Case Conversion,  Prev: Using Wide Char Classes,  Up: Character Handling
@@ -1718,81 +3260,81 @@
 4.5 Mapping of wide characters.
 ===============================
 
-The classification functions are also generalized by the ISO C
-standard.  Instead of just allowing the two standard mappings, a locale
-can contain others.  Again, the `localedef' program already supports
-generating such locale data files.
+The classification functions are also generalized by the ISO C standard.
+Instead of just allowing the two standard mappings, a locale can contain
+others.  Again, the 'localedef' program already supports generating such
+locale data files.
 
  -- Data Type: wctrans_t
      This data type is defined as a scalar type which can hold a value
      representing the locale-dependent character mapping.  There is no
      way to construct such a value apart from using the return value of
-     the `wctrans' function.
+     the 'wctrans' function.
 
-     This type is defined in `wctype.h'.
+     This type is defined in 'wctype.h'.
 
  -- Function: wctrans_t wctrans (const char *PROPERTY)
      Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
      Safety Concepts::.
 
-     The `wctrans' function has to be used to find out whether a named
+     The 'wctrans' function has to be used to find out whether a named
      mapping is defined in the current locale selected for the
-     `LC_CTYPE' category.  If the returned value is non-zero, you can
-     use it afterwards in calls to `towctrans'.  If the return value is
+     'LC_CTYPE' category.  If the returned value is non-zero, you can
+     use it afterwards in calls to 'towctrans'.  If the return value is
      zero no such mapping is known in the current locale.
 
      Beside locale-specific mappings there are two mappings which are
      guaranteed to be available in every locale:
 
-     `"tolower"'                        `"toupper"'
+     '"tolower"'                          '"toupper"'
 
-     These functions are declared in `wctype.h'.
+     These functions are declared in 'wctype.h'.
 
  -- Function: wint_t towctrans (wint_t WC, wctrans_t DESC)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     `towctrans' maps the input character WC according to the rules of
+     'towctrans' maps the input character WC according to the rules of
      the mapping for which DESC is a descriptor, and returns the value
-     it finds.  DESC must be obtained by a successful call to `wctrans'.
+     it finds.  DESC must be obtained by a successful call to 'wctrans'.
 
-     This function is declared in `wctype.h'.
+     This function is declared in 'wctype.h'.
 
    For the generally available mappings, the ISO C standard defines
-convenient shortcuts so that it is not necessary to call `wctrans' for
+convenient shortcuts so that it is not necessary to call 'wctrans' for
 them.
 
  -- Function: wint_t towlower (wint_t WC)
      Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
      Safety Concepts::.
 
-     If WC is an upper-case letter, `towlower' returns the corresponding
+     If WC is an upper-case letter, 'towlower' returns the corresponding
      lower-case letter.  If WC is not an upper-case letter, WC is
      returned unchanged.
 
-     `towlower' can be implemented using
+     'towlower' can be implemented using
 
           towctrans (wc, wctrans ("tolower"))
 
-     This function is declared in `wctype.h'.
+     This function is declared in 'wctype.h'.
 
  -- Function: wint_t towupper (wint_t WC)
      Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
      Safety Concepts::.
 
-     If WC is a lower-case letter, `towupper' returns the corresponding
+     If WC is a lower-case letter, 'towupper' returns the corresponding
      upper-case letter.  Otherwise WC is returned unchanged.
 
-     `towupper' can be implemented using
+     'towupper' can be implemented using
 
           towctrans (wc, wctrans ("toupper"))
 
-     This function is declared in `wctype.h'.
+     This function is declared in 'wctype.h'.
 
    The same warnings given in the last section for the use of the wide
 character classification functions apply here.  It is not possible to
-simply cast a `char' type value to a `wint_t' and use it as an argument
-to `towctrans' calls.
+simply cast a 'char' type value to a 'wint_t' and use it as an argument
+to 'towctrans' calls.
 
 
 File: libc.info,  Node: String and Array Utilities,  Next: Character Set Handling,  Prev: Character Handling,  Up: Top
@@ -1804,7 +3346,7 @@
 many programs.  The GNU C Library provides an extensive set of string
 utility functions, including functions for copying, concatenating,
 comparing, and searching strings.  Many of these functions can also
-operate on arbitrary regions of storage; for example, the `memcpy'
+operate on arbitrary regions of storage; for example, the 'memcpy'
 function can be used to copy the contents of any kind of array.
 
    It's fairly common for beginning C programmers to "reinvent the
@@ -1813,7 +3355,7 @@
 since this offers benefits in maintenance, efficiency, and portability.
 
    For instance, you could easily compare one string to another in two
-lines of C code, but if you use the built-in `strcmp' function, you're
+lines of C code, but if you use the built-in 'strcmp' function, you're
 less likely to make a mistake.  And, since these library functions are
 typically highly optimized, your program may run faster too.
 
@@ -1847,8 +3389,8 @@
 and some common pitfalls.  If you are already familiar with this
 material, you can skip this section.
 
-   A "string" is an array of `char' objects.  But string-valued
-variables are usually declared to be pointers of type `char *'.  Such
+   A "string" is an array of 'char' objects.  But string-valued
+variables are usually declared to be pointers of type 'char *'.  Such
 variables do not include space for the text of a string; that has to be
 stored somewhere else--in an array variable, a string constant, or
 dynamically allocated memory (*note Memory Allocation::).  It's up to
@@ -1859,40 +3401,39 @@
 
    "string" normally refers to multibyte character strings as opposed to
 wide character strings.  Wide character strings are arrays of type
-`wchar_t' and as for multibyte character strings usually pointers of
-type `wchar_t *' are used.
+'wchar_t' and as for multibyte character strings usually pointers of
+type 'wchar_t *' are used.
 
-   By convention, a "null character", `'\0'', marks the end of a
-multibyte character string and the "null wide character", `L'\0'',
-marks the end of a wide character string.  For example, in testing to
-see whether the `char *' variable P points to a null character marking
-the end of a string, you can write `!*P' or `*P == '\0''.
+   By convention, a "null character", ''\0'', marks the end of a
+multibyte character string and the "null wide character", 'L'\0'', marks
+the end of a wide character string.  For example, in testing to see
+whether the 'char *' variable P points to a null character marking the
+end of a string, you can write '!*P' or '*P == '\0''.
 
    A null character is quite different conceptually from a null pointer,
-although both are represented by the integer `0'.
+although both are represented by the integer '0'.
 
-   "String literals" appear in C program source as strings of
-characters between double-quote characters (`"') where the initial
-double-quote character is immediately preceded by a capital `L' (ell)
-character (as in `L"foo"').  In ISO C, string literals can also be
-formed by "string concatenation": `"a" "b"' is the same as `"ab"'.  For
-wide character strings one can either use `L"a" L"b"' or `L"a" "b"'.
-Modification of string literals is not allowed by the GNU C compiler,
-because literals are placed in read-only storage.
+   "String literals" appear in C program source as strings of characters
+between double-quote characters ('"') where the initial double-quote
+character is immediately preceded by a capital 'L' (ell) character (as
+in 'L"foo"').  In ISO C, string literals can also be formed by "string
+concatenation": '"a" "b"' is the same as '"ab"'.  For wide character
+strings one can either use 'L"a" L"b"' or 'L"a" "b"'.  Modification of
+string literals is not allowed by the GNU C compiler, because literals
+are placed in read-only storage.
 
-   Character arrays that are declared `const' cannot be modified
-either.  It's generally good style to declare non-modifiable string
-pointers to be of type `const char *', since this often allows the C
-compiler to detect accidental modifications as well as providing some
-amount of documentation about what your program intends to do with the
-string.
+   Character arrays that are declared 'const' cannot be modified either.
+It's generally good style to declare non-modifiable string pointers to
+be of type 'const char *', since this often allows the C compiler to
+detect accidental modifications as well as providing some amount of
+documentation about what your program intends to do with the string.
 
    The amount of memory allocated for the character array may extend
 past the null character that normally marks the end of the string.  In
 this document, the term "allocated size" is always used to refer to the
-total amount of memory allocated for the string, while the term
-"length" refers to the number of characters up to (but not including)
-the terminating null character.  
+total amount of memory allocated for the string, while the term "length"
+refers to the number of characters up to (but not including) the
+terminating null character.
 
    A notorious source of program bugs is trying to put more characters
 in a string than fit in its allocated size.  When writing code that
@@ -1903,19 +3444,18 @@
 allocate an extra byte to hold the null character that marks the end of
 the string.
 
-   Originally strings were sequences of bytes where each byte
-represents a single character.  This is still true today if the strings
-are encoded using a single-byte character encoding.  Things are
-different if the strings are encoded using a multibyte encoding (for
-more information on encodings see *note Extended Char Intro::).  There
-is no difference in the programming interface for these two kind of
-strings; the programmer has to be aware of this and interpret the byte
-sequences accordingly.
+   Originally strings were sequences of bytes where each byte represents
+a single character.  This is still true today if the strings are encoded
+using a single-byte character encoding.  Things are different if the
+strings are encoded using a multibyte encoding (for more information on
+encodings see *note Extended Char Intro::).  There is no difference in
+the programming interface for these two kind of strings; the programmer
+has to be aware of this and interpret the byte sequences accordingly.
 
    But since there is no separate interface taking care of these
 differences the byte-based string functions are sometimes hard to use.
 Since the count parameters of these functions specify bytes a call to
-`strncpy' could cut a multibyte character in the middle and put an
+'strncpy' could cut a multibyte character in the middle and put an
 incomplete (and therefore unusable) byte sequence in the target buffer.
 
    To avoid these problems later versions of the ISO C standard
@@ -1950,46 +3490,46 @@
 arrays of characters and wide characters.
 
    Functions that operate on arbitrary blocks of memory have names
-beginning with `mem' and `wmem' (such as `memcpy' and `wmemcpy') and
+beginning with 'mem' and 'wmem' (such as 'memcpy' and 'wmemcpy') and
 invariably take an argument which specifies the size (in bytes and wide
 characters respectively) of the block of memory to operate on.  The
-array arguments and return values for these functions have type `void
-*' or `wchar_t'.  As a matter of style, the elements of the arrays used
-with the `mem' functions are referred to as "bytes".  You can pass any
-kind of pointer to these functions, and the `sizeof' operator is useful
-in computing the value for the size argument.  Parameters to the `wmem'
-functions must be of type `wchar_t *'.  These functions are not really
+array arguments and return values for these functions have type 'void *'
+or 'wchar_t'.  As a matter of style, the elements of the arrays used
+with the 'mem' functions are referred to as "bytes".  You can pass any
+kind of pointer to these functions, and the 'sizeof' operator is useful
+in computing the value for the size argument.  Parameters to the 'wmem'
+functions must be of type 'wchar_t *'.  These functions are not really
 usable with anything but arrays of this type.
 
    In contrast, functions that operate specifically on strings and wide
-character strings have names beginning with `str' and `wcs'
-respectively (such as `strcpy' and `wcscpy') and look for a null
-character to terminate the string instead of requiring an explicit size
-argument to be passed.  (Some of these functions accept a specified
-maximum length, but they also check for premature termination with a
-null character.)  The array arguments and return values for these
-functions have type `char *' and `wchar_t *' respectively, and the
-array elements are referred to as "characters" and "wide characters".
+character strings have names beginning with 'str' and 'wcs' respectively
+(such as 'strcpy' and 'wcscpy') and look for a null character to
+terminate the string instead of requiring an explicit size argument to
+be passed.  (Some of these functions accept a specified maximum length,
+but they also check for premature termination with a null character.)
+The array arguments and return values for these functions have type
+'char *' and 'wchar_t *' respectively, and the array elements are
+referred to as "characters" and "wide characters".
 
-   In many cases, there are both `mem' and `str'/`wcs' versions of a
+   In many cases, there are both 'mem' and 'str'/'wcs' versions of a
 function.  The one that is more appropriate to use depends on the exact
-situation.  When your program is manipulating arbitrary arrays or
-blocks of storage, then you should always use the `mem' functions.  On
-the other hand, when you are manipulating null-terminated strings it is
-usually more convenient to use the `str'/`wcs' functions, unless you
-already know the length of the string in advance.  The `wmem' functions
+situation.  When your program is manipulating arbitrary arrays or blocks
+of storage, then you should always use the 'mem' functions.  On the
+other hand, when you are manipulating null-terminated strings it is
+usually more convenient to use the 'str'/'wcs' functions, unless you
+already know the length of the string in advance.  The 'wmem' functions
 should be used for wide character arrays with known size.
 
    Some of the memory and string functions take single characters as
-arguments.  Since a value of type `char' is automatically promoted into
-a value of type `int' when used as a parameter, the functions are
-declared with `int' as the type of the parameter in question.  In case
-of the wide character function the situation is similarly: the
-parameter type for a single wide character is `wint_t' and not
-`wchar_t'.  This would for many implementations not be necessary since
-the `wchar_t' is large enough to not be automatically promoted, but
-since the ISO C standard does not require such a choice of types the
-`wint_t' type is used.
+arguments.  Since a value of type 'char' is automatically promoted into
+a value of type 'int' when used as a parameter, the functions are
+declared with 'int' as the type of the parameter in question.  In case
+of the wide character function the situation is similarly: the parameter
+type for a single wide character is 'wint_t' and not 'wchar_t'.  This
+would for many implementations not be necessary since the 'wchar_t' is
+large enough to not be automatically promoted, but since the ISO C
+standard does not require such a choice of types the 'wint_t' type is
+used.
 
 
 File: libc.info,  Node: String Length,  Next: Copying and Concatenation,  Prev: String/Array Conventions,  Up: String and Array Utilities
@@ -1997,14 +3537,14 @@
 5.3 String Length
 =================
 
-You can get the length of a string using the `strlen' function.  This
-function is declared in the header file `string.h'.  
+You can get the length of a string using the 'strlen' function.  This
+function is declared in the header file 'string.h'.
 
  -- Function: size_t strlen (const char *S)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `strlen' function returns the length of the null-terminated
+     The 'strlen' function returns the length of the null-terminated
      string S in bytes.  (In other words, it returns the offset of the
      terminating null character within the array.)
 
@@ -2012,10 +3552,10 @@
           strlen ("hello, world")
               => 12
 
-     When applied to a character array, the `strlen' function returns
-     the length of the string stored there, not its allocated size.
-     You can get the allocated size of the character array that holds a
-     string using the `sizeof' operator:
+     When applied to a character array, the 'strlen' function returns
+     the length of the string stored there, not its allocated size.  You
+     can get the allocated size of the character array that holds a
+     string using the 'sizeof' operator:
 
           char string[32] = "hello, world";
           sizeof (string)
@@ -2023,8 +3563,8 @@
           strlen (string)
               => 12
 
-     But beware, this will not work unless STRING is the character
-     array itself, not a pointer to it.  For example:
+     But beware, this will not work unless STRING is the character array
+     itself, not a pointer to it.  For example:
 
           char string[32] = "hello, world";
           char *ptr = string;
@@ -2033,18 +3573,18 @@
           sizeof (ptr)
               => 4  /* (on a machine with 4 byte pointers) */
 
-     This is an easy mistake to make when you are working with
-     functions that take string arguments; those arguments are always
-     pointers, not arrays.
+     This is an easy mistake to make when you are working with functions
+     that take string arguments; those arguments are always pointers,
+     not arrays.
 
      It must also be noted that for multibyte encoded strings the return
      value does not have to correspond to the number of characters in
      the string.  To get this value the string can be converted to wide
-     characters and `wcslen' can be used or something like the following
+     characters and 'wcslen' can be used or something like the following
      code can be used:
 
-          /* The input is in `string'.
-             The length is expected in `n'.  */
+          /* The input is in 'string'.
+             The length is expected in 'n'.  */
           {
             mbstate_t t;
             char *scopy = string;
@@ -2054,20 +3594,20 @@
             n = mbsrtowcs (NULL, &scopy, strlen (scopy), &t);
           }
 
-     This is cumbersome to do so if the number of characters (as
-     opposed to bytes) is needed often it is better to work with wide
+     This is cumbersome to do so if the number of characters (as opposed
+     to bytes) is needed often it is better to work with wide
      characters.
 
-   The wide character equivalent is declared in `wchar.h'.
+   The wide character equivalent is declared in 'wchar.h'.
 
  -- Function: size_t wcslen (const wchar_t *WS)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `wcslen' function is the wide character equivalent to
-     `strlen'.  The return value is the number of wide characters in the
-     wide character string pointed to by WS (this is also the offset of
-     the terminating null wide character of WS).
+     The 'wcslen' function is the wide character equivalent to 'strlen'.
+     The return value is the number of wide characters in the wide
+     character string pointed to by WS (this is also the offset of the
+     terminating null wide character of WS).
 
      Since there are no multi wide character sequences making up one
      character the return value is not only the offset in the array, it
@@ -2079,9 +3619,9 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `strnlen' function returns the length of the string S in bytes
+     The 'strnlen' function returns the length of the string S in bytes
      if this length is smaller than MAXLEN bytes.  Otherwise it returns
-     MAXLEN.  Therefore this function is equivalent to `(strlen (S) <
+     MAXLEN.  Therefore this function is equivalent to '(strlen (S) <
      MAXLEN ? strlen (S) : MAXLEN)' but it is more efficient and works
      even if the string S is not null-terminated.
 
@@ -2091,16 +3631,16 @@
           strnlen (string, 5)
               => 5
 
-     This function is a GNU extension and is declared in `string.h'.
+     This function is a GNU extension and is declared in 'string.h'.
 
  -- Function: size_t wcsnlen (const wchar_t *WS, size_t MAXLEN)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     `wcsnlen' is the wide character equivalent to `strnlen'.  The
+     'wcsnlen' is the wide character equivalent to 'strnlen'.  The
      MAXLEN parameter specifies the maximum number of wide characters.
 
-     This function is a GNU extension and is declared in `wchar.h'.
+     This function is a GNU extension and is declared in 'wchar.h'.
 
 
 File: libc.info,  Node: Copying and Concatenation,  Next: String/Array Comparison,  Prev: String Length,  Up: String and Array Utilities
@@ -2110,9 +3650,9 @@
 
 You can use the functions described in this section to copy the contents
 of strings and arrays, or to append the contents of one string to
-another.  The `str' and `mem' functions are declared in the header file
-`string.h' while the `wstr' and `wmem' functions are declared in the
-file `wchar.h'.  
+another.  The 'str' and 'mem' functions are declared in the header file
+'string.h' while the 'wstr' and 'wmem' functions are declared in the
+file 'wchar.h'.
 
    A helpful way to remember the ordering of the arguments to the
 functions in this section is that it corresponds to an assignment
@@ -2131,22 +3671,22 @@
 
    All functions that have problems copying between overlapping arrays
 are explicitly identified in this manual.  In addition to functions in
-this section, there are a few others like `sprintf' (*note Formatted
-Output Functions::) and `scanf' (*note Formatted Input Functions::).
+this section, there are a few others like 'sprintf' (*note Formatted
+Output Functions::) and 'scanf' (*note Formatted Input Functions::).
 
  -- Function: void * memcpy (void *restrict TO, const void *restrict
           FROM, size_t SIZE)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `memcpy' function copies SIZE bytes from the object beginning
+     The 'memcpy' function copies SIZE bytes from the object beginning
      at FROM into the object beginning at TO.  The behavior of this
      function is undefined if the two arrays TO and FROM overlap; use
-     `memmove' instead if overlapping is possible.
+     'memmove' instead if overlapping is possible.
 
-     The value returned by `memcpy' is the value of TO.
+     The value returned by 'memcpy' is the value of TO.
 
-     Here is an example of how you might use `memcpy' to copy the
+     Here is an example of how you might use 'memcpy' to copy the
      contents of an array:
 
           struct foo *oldarray, *newarray;
@@ -2159,12 +3699,12 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `wmemcpy' function copies SIZE wide characters from the object
+     The 'wmemcpy' function copies SIZE wide characters from the object
      beginning at WFROM into the object beginning at WTO.  The behavior
      of this function is undefined if the two arrays WTO and WFROM
-     overlap; use `wmemmove' instead if overlapping is possible.
+     overlap; use 'wmemmove' instead if overlapping is possible.
 
-     The following is a possible implementation of `wmemcpy' but there
+     The following is a possible implementation of 'wmemcpy' but there
      are more optimizations possible.
 
           wchar_t *
@@ -2174,7 +3714,7 @@
             return (wchar_t *) memcpy (wto, wfrom, size * sizeof (wchar_t));
           }
 
-     The value returned by `wmemcpy' is the value of WTO.
+     The value returned by 'wmemcpy' is the value of WTO.
 
      This function was introduced in Amendment 1 to ISO C90.
 
@@ -2183,12 +3723,12 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `mempcpy' function is nearly identical to the `memcpy'
-     function.  It copies SIZE bytes from the object beginning at
-     `from' into the object pointed to by TO.  But instead of returning
-     the value of TO it returns a pointer to the byte following the
-     last written byte in the object beginning at TO.  I.e., the value
-     is `((void *) ((char *) TO + SIZE))'.
+     The 'mempcpy' function is nearly identical to the 'memcpy'
+     function.  It copies SIZE bytes from the object beginning at 'from'
+     into the object pointed to by TO.  But instead of returning the
+     value of TO it returns a pointer to the byte following the last
+     written byte in the object beginning at TO.  I.e., the value is
+     '((void *) ((char *) TO + SIZE))'.
 
      This function is useful in situations where a number of objects
      shall be copied to consecutive memory positions.
@@ -2209,17 +3749,17 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `wmempcpy' function is nearly identical to the `wmemcpy'
-     function.  It copies SIZE wide characters from the object
-     beginning at `wfrom' into the object pointed to by WTO.  But
-     instead of returning the value of WTO it returns a pointer to the
-     wide character following the last written wide character in the
-     object beginning at WTO.  I.e., the value is `WTO + SIZE'.
+     The 'wmempcpy' function is nearly identical to the 'wmemcpy'
+     function.  It copies SIZE wide characters from the object beginning
+     at 'wfrom' into the object pointed to by WTO.  But instead of
+     returning the value of WTO it returns a pointer to the wide
+     character following the last written wide character in the object
+     beginning at WTO.  I.e., the value is 'WTO + SIZE'.
 
      This function is useful in situations where a number of objects
      shall be copied to consecutive memory positions.
 
-     The following is a possible implementation of `wmemcpy' but there
+     The following is a possible implementation of 'wmemcpy' but there
      are more optimizations possible.
 
           wchar_t *
@@ -2235,26 +3775,26 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     `memmove' copies the SIZE bytes at FROM into the SIZE bytes at TO,
-     even if those two blocks of space overlap.  In the case of
-     overlap, `memmove' is careful to copy the original values of the
-     bytes in the block at FROM, including those bytes which also
-     belong to the block at TO.
+     'memmove' copies the SIZE bytes at FROM into the SIZE bytes at TO,
+     even if those two blocks of space overlap.  In the case of overlap,
+     'memmove' is careful to copy the original values of the bytes in
+     the block at FROM, including those bytes which also belong to the
+     block at TO.
 
-     The value returned by `memmove' is the value of TO.
+     The value returned by 'memmove' is the value of TO.
 
  -- Function: wchar_t * wmemmove (wchar_t *WTO, const wchar_t *WFROM,
           size_t SIZE)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     `wmemmove' copies the SIZE wide characters at WFROM into the SIZE
+     'wmemmove' copies the SIZE wide characters at WFROM into the SIZE
      wide characters at WTO, even if those two blocks of space overlap.
-     In the case of overlap, `memmove' is careful to copy the original
+     In the case of overlap, 'memmove' is careful to copy the original
      values of the wide characters in the block at WFROM, including
      those wide characters which also belong to the block at WTO.
 
-     The following is a possible implementation of `wmemcpy' but there
+     The following is a possible implementation of 'wmemcpy' but there
      are more optimizations possible.
 
           wchar_t *
@@ -2264,7 +3804,7 @@
             return (wchar_t *) mempcpy (wto, wfrom, size * sizeof (wchar_t));
           }
 
-     The value returned by `wmemmove' is the value of WTO.
+     The value returned by 'wmemmove' is the value of WTO.
 
      This function is a GNU extension.
 
@@ -2275,17 +3815,16 @@
 
      This function copies no more than SIZE bytes from FROM to TO,
      stopping if a byte matching C is found.  The return value is a
-     pointer into TO one byte past where C was copied, or a null
-     pointer if no byte matching C appeared in the first SIZE bytes of
-     FROM.
+     pointer into TO one byte past where C was copied, or a null pointer
+     if no byte matching C appeared in the first SIZE bytes of FROM.
 
  -- Function: void * memset (void *BLOCK, int C, size_t SIZE)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This function copies the value of C (converted to an `unsigned
-     char') into each of the first SIZE bytes of the object beginning
-     at BLOCK.  It returns the value of BLOCK.
+     This function copies the value of C (converted to an 'unsigned
+     char') into each of the first SIZE bytes of the object beginning at
+     BLOCK.  It returns the value of BLOCK.
 
  -- Function: wchar_t * wmemset (wchar_t *BLOCK, wchar_t WC, size_t
           SIZE)
@@ -2302,9 +3841,9 @@
      Concepts::.
 
      This copies characters from the string FROM (up to and including
-     the terminating null character) into the string TO.  Like
-     `memcpy', this function has undefined results if the strings
-     overlap.  The return value is the value of TO.
+     the terminating null character) into the string TO.  Like 'memcpy',
+     this function has undefined results if the strings overlap.  The
+     return value is the value of TO.
 
  -- Function: wchar_t * wcscpy (wchar_t *restrict WTO, const wchar_t
           *restrict WFROM)
@@ -2312,35 +3851,35 @@
      Concepts::.
 
      This copies wide characters from the string WFROM (up to and
-     including the terminating null wide character) into the string
-     WTO.  Like `wmemcpy', this function has undefined results if the
-     strings overlap.  The return value is the value of WTO.
+     including the terminating null wide character) into the string WTO.
+     Like 'wmemcpy', this function has undefined results if the strings
+     overlap.  The return value is the value of WTO.
 
  -- Function: char * strncpy (char *restrict TO, const char *restrict
           FROM, size_t SIZE)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This function is similar to `strcpy' but always copies exactly
-     SIZE characters into TO.
+     This function is similar to 'strcpy' but always copies exactly SIZE
+     characters into TO.
 
-     If the length of FROM is more than SIZE, then `strncpy' copies
-     just the first SIZE characters.  Note that in this case there is
-     no null terminator written into TO.
+     If the length of FROM is more than SIZE, then 'strncpy' copies just
+     the first SIZE characters.  Note that in this case there is no null
+     terminator written into TO.
 
-     If the length of FROM is less than SIZE, then `strncpy' copies all
+     If the length of FROM is less than SIZE, then 'strncpy' copies all
      of FROM, followed by enough null characters to add up to SIZE
      characters in all.  This behavior is rarely useful, but it is
      specified by the ISO C standard.
 
-     The behavior of `strncpy' is undefined if the strings overlap.
+     The behavior of 'strncpy' is undefined if the strings overlap.
 
-     Using `strncpy' as opposed to `strcpy' is a way to avoid bugs
+     Using 'strncpy' as opposed to 'strcpy' is a way to avoid bugs
      relating to writing past the end of the allocated space for TO.
      However, it can also make your program much slower in one common
      case: copying a string which is probably small into a potentially
      large buffer.  In this case, SIZE may be large, and when it is,
-     `strncpy' will waste a considerable amount of time copying null
+     'strncpy' will waste a considerable amount of time copying null
      characters.
 
  -- Function: wchar_t * wcsncpy (wchar_t *restrict WTO, const wchar_t
@@ -2348,26 +3887,26 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This function is similar to `wcscpy' but always copies exactly
-     SIZE wide characters into WTO.
+     This function is similar to 'wcscpy' but always copies exactly SIZE
+     wide characters into WTO.
 
-     If the length of WFROM is more than SIZE, then `wcsncpy' copies
+     If the length of WFROM is more than SIZE, then 'wcsncpy' copies
      just the first SIZE wide characters.  Note that in this case there
      is no null terminator written into WTO.
 
-     If the length of WFROM is less than SIZE, then `wcsncpy' copies
-     all of WFROM, followed by enough null wide characters to add up to
-     SIZE wide characters in all.  This behavior is rarely useful, but
-     it is specified by the ISO C standard.
+     If the length of WFROM is less than SIZE, then 'wcsncpy' copies all
+     of WFROM, followed by enough null wide characters to add up to SIZE
+     wide characters in all.  This behavior is rarely useful, but it is
+     specified by the ISO C standard.
 
-     The behavior of `wcsncpy' is undefined if the strings overlap.
+     The behavior of 'wcsncpy' is undefined if the strings overlap.
 
-     Using `wcsncpy' as opposed to `wcscpy' is a way to avoid bugs
+     Using 'wcsncpy' as opposed to 'wcscpy' is a way to avoid bugs
      relating to writing past the end of the allocated space for WTO.
      However, it can also make your program much slower in one common
      case: copying a string which is probably small into a potentially
      large buffer.  In this case, SIZE may be large, and when it is,
-     `wcsncpy' will waste a considerable amount of time copying null
+     'wcsncpy' will waste a considerable amount of time copying null
      wide characters.
 
  -- Function: char * strdup (const char *S)
@@ -2375,9 +3914,9 @@
      POSIX Safety Concepts::.
 
      This function copies the null-terminated string S into a newly
-     allocated string.  The string is allocated using `malloc'; see
-     *note Unconstrained Allocation::.  If `malloc' cannot allocate
-     space for the new string, `strdup' returns a null pointer.
+     allocated string.  The string is allocated using 'malloc'; see
+     *note Unconstrained Allocation::.  If 'malloc' cannot allocate
+     space for the new string, 'strdup' returns a null pointer.
      Otherwise it returns a pointer to the new string.
 
  -- Function: wchar_t * wcsdup (const wchar_t *WS)
@@ -2386,10 +3925,9 @@
 
      This function copies the null-terminated wide character string WS
      into a newly allocated string.  The string is allocated using
-     `malloc'; see *note Unconstrained Allocation::.  If `malloc'
-     cannot allocate space for the new string, `wcsdup' returns a null
-     pointer.  Otherwise it returns a pointer to the new wide character
-     string.
+     'malloc'; see *note Unconstrained Allocation::.  If 'malloc' cannot
+     allocate space for the new string, 'wcsdup' returns a null pointer.
+     Otherwise it returns a pointer to the new wide character string.
 
      This function is a GNU extension.
 
@@ -2397,29 +3935,29 @@
      Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
      POSIX Safety Concepts::.
 
-     This function is similar to `strdup' but always copies at most
-     SIZE characters into the newly allocated string.
+     This function is similar to 'strdup' but always copies at most SIZE
+     characters into the newly allocated string.
 
-     If the length of S is more than SIZE, then `strndup' copies just
+     If the length of S is more than SIZE, then 'strndup' copies just
      the first SIZE characters and adds a closing null terminator.
      Otherwise all characters are copied and the string is terminated.
 
-     This function is different to `strncpy' in that it always
+     This function is different to 'strncpy' in that it always
      terminates the destination string.
 
-     `strndup' is a GNU extension.
+     'strndup' is a GNU extension.
 
  -- Function: char * stpcpy (char *restrict TO, const char *restrict
           FROM)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This function is like `strcpy', except that it returns a pointer to
+     This function is like 'strcpy', except that it returns a pointer to
      the end of the string TO (that is, the address of the terminating
-     null character `to + strlen (from)') rather than the beginning.
+     null character 'to + strlen (from)') rather than the beginning.
 
-     For example, this program uses `stpcpy' to concatenate `foo' and
-     `bar' to produce `foobar', which it then prints.
+     For example, this program uses 'stpcpy' to concatenate 'foo' and
+     'bar' to produce 'foobar', which it then prints.
 
 
           #include <string.h>
@@ -2441,69 +3979,69 @@
      Perhaps it comes from MS-DOG.
 
      Its behavior is undefined if the strings overlap.  The function is
-     declared in `string.h'.
+     declared in 'string.h'.
 
  -- Function: wchar_t * wcpcpy (wchar_t *restrict WTO, const wchar_t
           *restrict WFROM)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This function is like `wcscpy', except that it returns a pointer to
+     This function is like 'wcscpy', except that it returns a pointer to
      the end of the string WTO (that is, the address of the terminating
-     null character `wto + strlen (wfrom)') rather than the beginning.
+     null character 'wto + strlen (wfrom)') rather than the beginning.
 
      This function is not part of ISO or POSIX but was found useful
      while developing the GNU C Library itself.
 
-     The behavior of `wcpcpy' is undefined if the strings overlap.
+     The behavior of 'wcpcpy' is undefined if the strings overlap.
 
-     `wcpcpy' is a GNU extension and is declared in `wchar.h'.
+     'wcpcpy' is a GNU extension and is declared in 'wchar.h'.
 
  -- Function: char * stpncpy (char *restrict TO, const char *restrict
           FROM, size_t SIZE)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This function is similar to `stpcpy' but copies always exactly
-     SIZE characters into TO.
+     This function is similar to 'stpcpy' but copies always exactly SIZE
+     characters into TO.
 
-     If the length of FROM is more than SIZE, then `stpncpy' copies
-     just the first SIZE characters and returns a pointer to the
-     character directly following the one which was copied last.  Note
-     that in this case there is no null terminator written into TO.
+     If the length of FROM is more than SIZE, then 'stpncpy' copies just
+     the first SIZE characters and returns a pointer to the character
+     directly following the one which was copied last.  Note that in
+     this case there is no null terminator written into TO.
 
-     If the length of FROM is less than SIZE, then `stpncpy' copies all
+     If the length of FROM is less than SIZE, then 'stpncpy' copies all
      of FROM, followed by enough null characters to add up to SIZE
      characters in all.  This behavior is rarely useful, but it is
      implemented to be useful in contexts where this behavior of the
-     `strncpy' is used.  `stpncpy' returns a pointer to the _first_
+     'strncpy' is used.  'stpncpy' returns a pointer to the _first_
      written null character.
 
      This function is not part of ISO or POSIX but was found useful
      while developing the GNU C Library itself.
 
      Its behavior is undefined if the strings overlap.  The function is
-     declared in `string.h'.
+     declared in 'string.h'.
 
  -- Function: wchar_t * wcpncpy (wchar_t *restrict WTO, const wchar_t
           *restrict WFROM, size_t SIZE)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This function is similar to `wcpcpy' but copies always exactly
+     This function is similar to 'wcpcpy' but copies always exactly
      WSIZE characters into WTO.
 
-     If the length of WFROM is more than SIZE, then `wcpncpy' copies
+     If the length of WFROM is more than SIZE, then 'wcpncpy' copies
      just the first SIZE wide characters and returns a pointer to the
      wide character directly following the last non-null wide character
      which was copied last.  Note that in this case there is no null
      terminator written into WTO.
 
-     If the length of WFROM is less than SIZE, then `wcpncpy' copies
-     all of WFROM, followed by enough null characters to add up to SIZE
+     If the length of WFROM is less than SIZE, then 'wcpncpy' copies all
+     of WFROM, followed by enough null characters to add up to SIZE
      characters in all.  This behavior is rarely useful, but it is
      implemented to be useful in contexts where this behavior of the
-     `wcsncpy' is used.  `wcpncpy' returns a pointer to the _first_
+     'wcsncpy' is used.  'wcpncpy' returns a pointer to the _first_
      written null character.
 
      This function is not part of ISO or POSIX but was found useful
@@ -2511,21 +4049,21 @@
 
      Its behavior is undefined if the strings overlap.
 
-     `wcpncpy' is a GNU extension and is declared in `wchar.h'.
+     'wcpncpy' is a GNU extension and is declared in 'wchar.h'.
 
  -- Macro: char * strdupa (const char *S)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This macro is similar to `strdup' but allocates the new string
-     using `alloca' instead of `malloc' (*note Variable Size
+     This macro is similar to 'strdup' but allocates the new string
+     using 'alloca' instead of 'malloc' (*note Variable Size
      Automatic::).  This means of course the returned string has the
-     same limitations as any block of memory allocated using `alloca'.
+     same limitations as any block of memory allocated using 'alloca'.
 
-     For obvious reasons `strdupa' is implemented only as a macro; you
+     For obvious reasons 'strdupa' is implemented only as a macro; you
      cannot get the address of this function.  Despite this limitation
      it is a useful function.  The following code shows a situation
-     where using `malloc' would be a lot more expensive.
+     where using 'malloc' would be a lot more expensive.
 
 
           #include <paths.h>
@@ -2548,9 +4086,9 @@
             return 0;
           }
 
-     Please note that calling `strtok' using PATH directly is invalid.
-     It is also not allowed to call `strdupa' in the argument list of
-     `strtok' since `strdupa' uses `alloca' (*note Variable Size
+     Please note that calling 'strtok' using PATH directly is invalid.
+     It is also not allowed to call 'strdupa' in the argument list of
+     'strtok' since 'strdupa' uses 'alloca' (*note Variable Size
      Automatic::) can interfere with the parameter passing.
 
      This function is only available if GNU CC is used.
@@ -2559,28 +4097,28 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This function is similar to `strndup' but like `strdupa' it
-     allocates the new string using `alloca' *note Variable Size
-     Automatic::.  The same advantages and limitations of `strdupa' are
-     valid for `strndupa', too.
+     This function is similar to 'strndup' but like 'strdupa' it
+     allocates the new string using 'alloca' *note Variable Size
+     Automatic::.  The same advantages and limitations of 'strdupa' are
+     valid for 'strndupa', too.
 
-     This function is implemented only as a macro, just like `strdupa'.
-     Just as `strdupa' this macro also must not be used inside the
+     This function is implemented only as a macro, just like 'strdupa'.
+     Just as 'strdupa' this macro also must not be used inside the
      parameter list in a function call.
 
-     `strndupa' is only available if GNU CC is used.
+     'strndupa' is only available if GNU CC is used.
 
  -- Function: char * strcat (char *restrict TO, const char *restrict
           FROM)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `strcat' function is similar to `strcpy', except that the
-     characters from FROM are concatenated or appended to the end of
-     TO, instead of overwriting it.  That is, the first character from
-     FROM overwrites the null character marking the end of TO.
+     The 'strcat' function is similar to 'strcpy', except that the
+     characters from FROM are concatenated or appended to the end of TO,
+     instead of overwriting it.  That is, the first character from FROM
+     overwrites the null character marking the end of TO.
 
-     An equivalent definition for `strcat' would be:
+     An equivalent definition for 'strcat' would be:
 
           char *
           strcat (char *restrict to, const char *restrict from)
@@ -2596,12 +4134,12 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `wcscat' function is similar to `wcscpy', except that the
+     The 'wcscat' function is similar to 'wcscpy', except that the
      characters from WFROM are concatenated or appended to the end of
      WTO, instead of overwriting it.  That is, the first character from
      WFROM overwrites the null character marking the end of WTO.
 
-     An equivalent definition for `wcscat' would be:
+     An equivalent definition for 'wcscat' would be:
 
           wchar_t *
           wcscat (wchar_t *wto, const wchar_t *wfrom)
@@ -2612,19 +4150,19 @@
 
      This function has undefined results if the strings overlap.
 
-   Programmers using the `strcat' or `wcscat' function (or the
-following `strncat' or `wcsncar' functions for that matter) can easily
-be recognized as lazy and reckless.  In almost all situations the
-lengths of the participating strings are known (it better should be
-since how can one otherwise ensure the allocated size of the buffer is
+   Programmers using the 'strcat' or 'wcscat' function (or the following
+'strncat' or 'wcsncar' functions for that matter) can easily be
+recognized as lazy and reckless.  In almost all situations the lengths
+of the participating strings are known (it better should be since how
+can one otherwise ensure the allocated size of the buffer is
 sufficient?)  Or at least, one could know them if one keeps track of the
 results of the various function calls.  But then it is very inefficient
-to use `strcat'/`wcscat'.  A lot of time is wasted finding the end of
+to use 'strcat'/'wcscat'.  A lot of time is wasted finding the end of
 the destination string so that the actual copying can start.  This is a
 common example:
 
      /* This function concatenates arbitrarily many strings.  The last
-        parameter must be `NULL'.  */
+        parameter must be 'NULL'.  */
      char *
      concat (const char *str, ...)
      {
@@ -2720,31 +4258,31 @@
 
    With a bit more knowledge about the input strings one could fine-tune
 the memory allocation.  The difference we are pointing to here is that
-we don't use `strcat' anymore.  We always keep track of the length of
-the current intermediate result so we can safe us the search for the
-end of the string and use `mempcpy'.  Please note that we also don't
-use `stpcpy' which might seem more natural since we handle with
-strings.  But this is not necessary since we already know the length of
-the string and therefore can use the faster memory copying function.
-The example would work for wide characters the same way.
+we don't use 'strcat' anymore.  We always keep track of the length of
+the current intermediate result so we can safe us the search for the end
+of the string and use 'mempcpy'.  Please note that we also don't use
+'stpcpy' which might seem more natural since we handle with strings.
+But this is not necessary since we already know the length of the string
+and therefore can use the faster memory copying function.  The example
+would work for wide characters the same way.
 
-   Whenever a programmer feels the need to use `strcat' she or he
-should think twice and look through the program whether the code cannot
-be rewritten to take advantage of already calculated results.  Again: it
-is almost always unnecessary to use `strcat'.
+   Whenever a programmer feels the need to use 'strcat' she or he should
+think twice and look through the program whether the code cannot be
+rewritten to take advantage of already calculated results.  Again: it is
+almost always unnecessary to use 'strcat'.
 
  -- Function: char * strncat (char *restrict TO, const char *restrict
           FROM, size_t SIZE)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This function is like `strcat' except that not more than SIZE
+     This function is like 'strcat' except that not more than SIZE
      characters from FROM are appended to the end of TO.  A single null
      character is also always appended to TO, so the total allocated
-     size of TO must be at least `SIZE + 1' bytes longer than its
+     size of TO must be at least 'SIZE + 1' bytes longer than its
      initial length.
 
-     The `strncat' function could be implemented like this:
+     The 'strncat' function could be implemented like this:
 
           char *
           strncat (char *to, const char *from, size_t size)
@@ -2754,20 +4292,20 @@
             return to;
           }
 
-     The behavior of `strncat' is undefined if the strings overlap.
+     The behavior of 'strncat' is undefined if the strings overlap.
 
  -- Function: wchar_t * wcsncat (wchar_t *restrict WTO, const wchar_t
           *restrict WFROM, size_t SIZE)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This function is like `wcscat' except that not more than SIZE
+     This function is like 'wcscat' except that not more than SIZE
      characters from FROM are appended to the end of TO.  A single null
      character is also always appended to TO, so the total allocated
-     size of TO must be at least `SIZE + 1' bytes longer than its
+     size of TO must be at least 'SIZE + 1' bytes longer than its
      initial length.
 
-     The `wcsncat' function could be implemented like this:
+     The 'wcsncat' function could be implemented like this:
 
           wchar_t *
           wcsncat (wchar_t *restrict wto, const wchar_t *restrict wfrom,
@@ -2778,12 +4316,12 @@
             return wto;
           }
 
-     The behavior of `wcsncat' is undefined if the strings overlap.
+     The behavior of 'wcsncat' is undefined if the strings overlap.
 
-   Here is an example showing the use of `strncpy' and `strncat' (the
+   Here is an example showing the use of 'strncpy' and 'strncat' (the
 wide character version is equivalent).  Notice how, in the call to
-`strncat', the SIZE parameter is computed to avoid overflowing the
-character array `buffer'.
+'strncat', the SIZE parameter is computed to avoid overflowing the
+character array 'buffer'.
 
 
      #include <string.h>
@@ -2811,8 +4349,8 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This is a partially obsolete alternative for `memmove', derived
-     from BSD.  Note that it is not quite equivalent to `memmove',
+     This is a partially obsolete alternative for 'memmove', derived
+     from BSD. Note that it is not quite equivalent to 'memmove',
      because the arguments are not in the same order and there is no
      return value.
 
@@ -2820,8 +4358,8 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This is a partially obsolete alternative for `memset', derived from
-     BSD.  Note that it is not as general as `memset', because the only
+     This is a partially obsolete alternative for 'memset', derived from
+     BSD. Note that it is not as general as 'memset', because the only
      value it can store is zero.
 
 
@@ -2838,53 +4376,53 @@
    Unlike most comparison operations in C, the string comparison
 functions return a nonzero value if the strings are _not_ equivalent
 rather than if they are.  The sign of the value indicates the relative
-ordering of the first characters in the strings that are not
-equivalent:  a negative value indicates that the first string is "less"
-than the second, while a positive value indicates that the first string
-is "greater".
+ordering of the first characters in the strings that are not equivalent:
+a negative value indicates that the first string is "less" than the
+second, while a positive value indicates that the first string is
+"greater".
 
    The most common use of these functions is to check only for equality.
-This is canonically done with an expression like `! strcmp (s1, s2)'.
+This is canonically done with an expression like '! strcmp (s1, s2)'.
 
-   All of these functions are declared in the header file `string.h'.  
+   All of these functions are declared in the header file 'string.h'.
 
  -- Function: int memcmp (const void *A1, const void *A2, size_t SIZE)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The function `memcmp' compares the SIZE bytes of memory beginning
+     The function 'memcmp' compares the SIZE bytes of memory beginning
      at A1 against the SIZE bytes of memory beginning at A2.  The value
      returned has the same sign as the difference between the first
-     differing pair of bytes (interpreted as `unsigned char' objects,
-     then promoted to `int').
+     differing pair of bytes (interpreted as 'unsigned char' objects,
+     then promoted to 'int').
 
-     If the contents of the two blocks are equal, `memcmp' returns `0'.
+     If the contents of the two blocks are equal, 'memcmp' returns '0'.
 
  -- Function: int wmemcmp (const wchar_t *A1, const wchar_t *A2, size_t
           SIZE)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The function `wmemcmp' compares the SIZE wide characters beginning
+     The function 'wmemcmp' compares the SIZE wide characters beginning
      at A1 against the SIZE wide characters beginning at A2.  The value
      returned is smaller than or larger than zero depending on whether
      the first differing wide character is A1 is smaller or larger than
      the corresponding character in A2.
 
-     If the contents of the two blocks are equal, `wmemcmp' returns `0'.
+     If the contents of the two blocks are equal, 'wmemcmp' returns '0'.
 
-   On arbitrary arrays, the `memcmp' function is mostly useful for
+   On arbitrary arrays, the 'memcmp' function is mostly useful for
 testing equality.  It usually isn't meaningful to do byte-wise ordering
 comparisons on arrays of things other than bytes.  For example, a
 byte-wise comparison on the bytes that make up floating-point numbers
 isn't likely to tell you anything about the relationship between the
 values of the floating-point numbers.
 
-   `wmemcmp' is really only useful to compare arrays of type `wchar_t'
-since the function looks at `sizeof (wchar_t)' bytes at a time and this
+   'wmemcmp' is really only useful to compare arrays of type 'wchar_t'
+since the function looks at 'sizeof (wchar_t)' bytes at a time and this
 number of bytes is system dependent.
 
-   You should also be careful about using `memcmp' to compare objects
+   You should also be careful about using 'memcmp' to compare objects
 that can contain "holes", such as the padding inserted into structure
 objects to enforce alignment requirements, extra space at the end of
 unions, and extra characters at the ends of strings whose length is less
@@ -2907,75 +4445,75 @@
        };
 
 you are better off writing a specialized comparison function to compare
-`struct foo' objects instead of comparing them with `memcmp'.
+'struct foo' objects instead of comparing them with 'memcmp'.
 
  -- Function: int strcmp (const char *S1, const char *S2)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `strcmp' function compares the string S1 against S2, returning
+     The 'strcmp' function compares the string S1 against S2, returning
      a value that has the same sign as the difference between the first
-     differing pair of characters (interpreted as `unsigned char'
-     objects, then promoted to `int').
+     differing pair of characters (interpreted as 'unsigned char'
+     objects, then promoted to 'int').
 
-     If the two strings are equal, `strcmp' returns `0'.
+     If the two strings are equal, 'strcmp' returns '0'.
 
-     A consequence of the ordering used by `strcmp' is that if S1 is an
+     A consequence of the ordering used by 'strcmp' is that if S1 is an
      initial substring of S2, then S1 is considered to be "less than"
      S2.
 
-     `strcmp' does not take sorting conventions of the language the
+     'strcmp' does not take sorting conventions of the language the
      strings are written in into account.  To get that one has to use
-     `strcoll'.
+     'strcoll'.
 
  -- Function: int wcscmp (const wchar_t *WS1, const wchar_t *WS2)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `wcscmp' function compares the wide character string WS1
+     The 'wcscmp' function compares the wide character string WS1
      against WS2.  The value returned is smaller than or larger than
-     zero depending on whether the first differing wide character is
-     WS1 is smaller or larger than the corresponding character in WS2.
+     zero depending on whether the first differing wide character is WS1
+     is smaller or larger than the corresponding character in WS2.
 
-     If the two strings are equal, `wcscmp' returns `0'.
+     If the two strings are equal, 'wcscmp' returns '0'.
 
-     A consequence of the ordering used by `wcscmp' is that if WS1 is
-     an initial substring of WS2, then WS1 is considered to be "less
-     than" WS2.
+     A consequence of the ordering used by 'wcscmp' is that if WS1 is an
+     initial substring of WS2, then WS1 is considered to be "less than"
+     WS2.
 
-     `wcscmp' does not take sorting conventions of the language the
+     'wcscmp' does not take sorting conventions of the language the
      strings are written in into account.  To get that one has to use
-     `wcscoll'.
+     'wcscoll'.
 
  -- Function: int strcasecmp (const char *S1, const char *S2)
      Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
      Safety Concepts::.
 
-     This function is like `strcmp', except that differences in case are
+     This function is like 'strcmp', except that differences in case are
      ignored.  How uppercase and lowercase characters are related is
-     determined by the currently selected locale.  In the standard `"C"'
+     determined by the currently selected locale.  In the standard '"C"'
      locale the characters A" and a" do not match but in a locale which
      regards these characters as parts of the alphabet they do match.
 
-     `strcasecmp' is derived from BSD.
+     'strcasecmp' is derived from BSD.
 
  -- Function: int wcscasecmp (const wchar_t *WS1, const wchar_t *WS2)
      Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
      Safety Concepts::.
 
-     This function is like `wcscmp', except that differences in case are
+     This function is like 'wcscmp', except that differences in case are
      ignored.  How uppercase and lowercase characters are related is
-     determined by the currently selected locale.  In the standard `"C"'
+     determined by the currently selected locale.  In the standard '"C"'
      locale the characters A" and a" do not match but in a locale which
      regards these characters as parts of the alphabet they do match.
 
-     `wcscasecmp' is a GNU extension.
+     'wcscasecmp' is a GNU extension.
 
  -- Function: int strncmp (const char *S1, const char *S2, size_t SIZE)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This function is the similar to `strcmp', except that no more than
+     This function is the similar to 'strcmp', except that no more than
      SIZE characters are compared.  In other words, if the two strings
      are the same in their first SIZE characters, the return value is
      zero.
@@ -2985,7 +4523,7 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This function is the similar to `wcscmp', except that no more than
+     This function is the similar to 'wcscmp', except that no more than
      SIZE wide characters are compared.  In other words, if the two
      strings are the same in their first SIZE wide characters, the
      return value is zero.
@@ -2994,24 +4532,24 @@
      Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
      Safety Concepts::.
 
-     This function is like `strncmp', except that differences in case
-     are ignored.  Like `strcasecmp', it is locale dependent how
+     This function is like 'strncmp', except that differences in case
+     are ignored.  Like 'strcasecmp', it is locale dependent how
      uppercase and lowercase characters are related.
 
-     `strncasecmp' is a GNU extension.
+     'strncasecmp' is a GNU extension.
 
  -- Function: int wcsncasecmp (const wchar_t *WS1, const wchar_t *S2,
           size_t N)
      Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
      Safety Concepts::.
 
-     This function is like `wcsncmp', except that differences in case
-     are ignored.  Like `wcscasecmp', it is locale dependent how
+     This function is like 'wcsncmp', except that differences in case
+     are ignored.  Like 'wcscasecmp', it is locale dependent how
      uppercase and lowercase characters are related.
 
-     `wcsncasecmp' is a GNU extension.
+     'wcsncasecmp' is a GNU extension.
 
-   Here are some examples showing the use of `strcmp' and `strncmp'
+   Here are some examples showing the use of 'strcmp' and 'strncmp'
 (equivalent examples can be constructed for the wide character
 functions).  These examples assume the use of the ASCII character set.
 (If some other character set--say, EBCDIC--is used instead, then the
@@ -3023,7 +4561,7 @@
      strcmp ("hello", "Hello")
          => 32   /* Comparisons are case-sensitive. */
      strcmp ("hello", "world")
-         => -15  /* The character `'h'' comes before `'w''. */
+         => -15  /* The character ''h'' comes before ''w''. */
      strcmp ("hello", "hello, world")
          => -44  /* Comparing a null character against a comma. */
      strncmp ("hello", "hello, world", 5)
@@ -3035,19 +4573,19 @@
      Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
      Safety Concepts::.
 
-     The `strverscmp' function compares the string S1 against S2,
+     The 'strverscmp' function compares the string S1 against S2,
      considering them as holding indices/version numbers.  The return
-     value follows the same conventions as found in the `strcmp'
-     function.  In fact, if S1 and S2 contain no digits, `strverscmp'
-     behaves like `strcmp'.
+     value follows the same conventions as found in the 'strcmp'
+     function.  In fact, if S1 and S2 contain no digits, 'strverscmp'
+     behaves like 'strcmp'.
 
      Basically, we compare strings normally (character by character),
      until we find a digit in each string - then we enter a special
-     comparison mode, where each sequence of digits is taken as a
-     whole.  If we reach the end of these two parts without noticing a
+     comparison mode, where each sequence of digits is taken as a whole.
+     If we reach the end of these two parts without noticing a
      difference, we return to the standard comparison mode.  There are
      two types of numeric parts: "integral" and "fractional" (those
-     begin with a '0'). The types of the numeric parts affect the way
+     begin with a '0').  The types of the numeric parts affect the way
      we sort them:
 
         * integral/integral: we compare values as you would expect.
@@ -3056,9 +4594,9 @@
           integral one.  Again, no surprise.
 
         * fractional/fractional: the things become a bit more complex.
-          If the common prefix contains only leading zeroes, the
-          longest part is less than the other one; else the comparison
-          behaves normally.
+          If the common prefix contains only leading zeroes, the longest
+          part is less than the other one; else the comparison behaves
+          normally.
 
           strverscmp ("no digit", "no digit")
               => 0    /* same behavior as strcmp. */
@@ -3074,13 +4612,13 @@
      This function is especially useful when dealing with filename
      sorting, because filenames frequently hold indices/version numbers.
 
-     `strverscmp' is a GNU extension.
+     'strverscmp' is a GNU extension.
 
  -- Function: int bcmp (const void *A1, const void *A2, size_t SIZE)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This is an obsolete alias for `memcmp', derived from BSD.
+     This is an obsolete alias for 'memcmp', derived from BSD.
 
 
 File: libc.info,  Node: Collation Functions,  Next: Search Functions,  Prev: String/Array Comparison,  Up: String and Array Utilities
@@ -3092,19 +4630,19 @@
 the strict numeric ordering of character codes.  For example, in Spanish
 most glyphs with diacritical marks such as accents are not considered
 distinct letters for the purposes of collation.  On the other hand, the
-two-character sequence `ll' is treated as a single letter that is
-collated immediately after `l'.
+two-character sequence 'll' is treated as a single letter that is
+collated immediately after 'l'.
 
-   You can use the functions `strcoll' and `strxfrm' (declared in the
-headers file `string.h') and `wcscoll' and `wcsxfrm' (declared in the
-headers file `wchar') to compare strings using a collation ordering
+   You can use the functions 'strcoll' and 'strxfrm' (declared in the
+headers file 'string.h') and 'wcscoll' and 'wcsxfrm' (declared in the
+headers file 'wchar') to compare strings using a collation ordering
 appropriate for the current locale.  The locale used by these functions
 in particular can be specified by setting the locale for the
-`LC_COLLATE' category; see *note Locales::.  
+'LC_COLLATE' category; see *note Locales::.
 
-   In the standard C locale, the collation sequence for `strcoll' is
-the same as that for `strcmp'.  Similarly, `wcscoll' and `wcscmp' are
-the same in this situation.
+   In the standard C locale, the collation sequence for 'strcoll' is the
+same as that for 'strcmp'.  Similarly, 'wcscoll' and 'wcscmp' are the
+same in this situation.
 
    Effectively, the way these functions work is by applying a mapping to
 transform the characters in a string to a byte sequence that represents
@@ -3112,38 +4650,38 @@
 Comparing two such byte sequences in a simple fashion is equivalent to
 comparing the strings with the locale's collating sequence.
 
-   The functions `strcoll' and `wcscoll' perform this translation
-implicitly, in order to do one comparison.  By contrast, `strxfrm' and
-`wcsxfrm' perform the mapping explicitly.  If you are making multiple
+   The functions 'strcoll' and 'wcscoll' perform this translation
+implicitly, in order to do one comparison.  By contrast, 'strxfrm' and
+'wcsxfrm' perform the mapping explicitly.  If you are making multiple
 comparisons using the same string or set of strings, it is likely to be
-more efficient to use `strxfrm' or `wcsxfrm' to transform all the
-strings just once, and subsequently compare the transformed strings
-with `strcmp' or `wcscmp'.
+more efficient to use 'strxfrm' or 'wcsxfrm' to transform all the
+strings just once, and subsequently compare the transformed strings with
+'strcmp' or 'wcscmp'.
 
  -- Function: int strcoll (const char *S1, const char *S2)
      Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
      *Note POSIX Safety Concepts::.
 
-     The `strcoll' function is similar to `strcmp' but uses the
+     The 'strcoll' function is similar to 'strcmp' but uses the
      collating sequence of the current locale for collation (the
-     `LC_COLLATE' locale).
+     'LC_COLLATE' locale).
 
  -- Function: int wcscoll (const wchar_t *WS1, const wchar_t *WS2)
      Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
      *Note POSIX Safety Concepts::.
 
-     The `wcscoll' function is similar to `wcscmp' but uses the
+     The 'wcscoll' function is similar to 'wcscmp' but uses the
      collating sequence of the current locale for collation (the
-     `LC_COLLATE' locale).
+     'LC_COLLATE' locale).
 
-   Here is an example of sorting an array of strings, using `strcoll'
-to compare them.  The actual sort algorithm is not written here; it
-comes from `qsort' (*note Array Sort Function::).  The job of the code
-shown here is to say how to compare the strings while sorting them.
-(Later on in this section, we will show a way to do this more
-efficiently using `strxfrm'.)
+   Here is an example of sorting an array of strings, using 'strcoll' to
+compare them.  The actual sort algorithm is not written here; it comes
+from 'qsort' (*note Array Sort Function::).  The job of the code shown
+here is to say how to compare the strings while sorting them.  (Later on
+in this section, we will show a way to do this more efficiently using
+'strxfrm'.)
 
-     /* This is the comparison function used with `qsort'. */
+     /* This is the comparison function used with 'qsort'. */
 
      int
      compare_elements (const void *v1, const void *v2)
@@ -3160,7 +4698,7 @@
      void
      sort_strings (char **array, int nstrings)
      {
-       /* Sort `temp_array' by comparing the strings. */
+       /* Sort 'temp_array' by comparing the strings. */
        qsort (array, nstrings,
               sizeof (char *), compare_elements);
      }
@@ -3170,7 +4708,7 @@
      Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
      *Note POSIX Safety Concepts::.
 
-     The function `strxfrm' transforms the string FROM using the
+     The function 'strxfrm' transforms the string FROM using the
      collation transformation determined by the locale currently
      selected for collation, and stores the transformed string in the
      array TO.  Up to SIZE characters (including a terminating null
@@ -3184,52 +4722,51 @@
      greater or equal than SIZE, it means that the transformed string
      did not entirely fit in the array TO.  In this case, only as much
      of the string as actually fits was stored.  To get the whole
-     transformed string, call `strxfrm' again with a bigger output
+     transformed string, call 'strxfrm' again with a bigger output
      array.
 
      The transformed string may be longer than the original string, and
      it may also be shorter.
 
      If SIZE is zero, no characters are stored in TO.  In this case,
-     `strxfrm' simply returns the number of characters that would be
-     the length of the transformed string.  This is useful for
-     determining what size the allocated array should be.  It does not
-     matter what TO is if SIZE is zero; TO may even be a null pointer.
+     'strxfrm' simply returns the number of characters that would be the
+     length of the transformed string.  This is useful for determining
+     what size the allocated array should be.  It does not matter what
+     TO is if SIZE is zero; TO may even be a null pointer.
 
  -- Function: size_t wcsxfrm (wchar_t *restrict WTO, const wchar_t
           *WFROM, size_t SIZE)
      Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
      *Note POSIX Safety Concepts::.
 
-     The function `wcsxfrm' transforms wide character string WFROM
-     using the collation transformation determined by the locale
-     currently selected for collation, and stores the transformed
-     string in the array WTO.  Up to SIZE wide characters (including a
-     terminating null character) are stored.
+     The function 'wcsxfrm' transforms wide character string WFROM using
+     the collation transformation determined by the locale currently
+     selected for collation, and stores the transformed string in the
+     array WTO.  Up to SIZE wide characters (including a terminating
+     null character) are stored.
 
-     The behavior is undefined if the strings WTO and WFROM overlap;
-     see *note Copying and Concatenation::.
+     The behavior is undefined if the strings WTO and WFROM overlap; see
+     *note Copying and Concatenation::.
 
      The return value is the length of the entire transformed wide
-     character string.  This value is not affected by the value of
-     SIZE, but if it is greater or equal than SIZE, it means that the
-     transformed wide character string did not entirely fit in the
-     array WTO.  In this case, only as much of the wide character
-     string as actually fits was stored.  To get the whole transformed
-     wide character string, call `wcsxfrm' again with a bigger output
-     array.
+     character string.  This value is not affected by the value of SIZE,
+     but if it is greater or equal than SIZE, it means that the
+     transformed wide character string did not entirely fit in the array
+     WTO.  In this case, only as much of the wide character string as
+     actually fits was stored.  To get the whole transformed wide
+     character string, call 'wcsxfrm' again with a bigger output array.
 
      The transformed wide character string may be longer than the
      original wide character string, and it may also be shorter.
 
      If SIZE is zero, no characters are stored in TO.  In this case,
-     `wcsxfrm' simply returns the number of wide characters that would
+     'wcsxfrm' simply returns the number of wide characters that would
      be the length of the transformed wide character string.  This is
      useful for determining what size the allocated array should be
-     (remember to multiply with `sizeof (wchar_t)').  It does not
-     matter what WTO is if SIZE is zero; WTO may even be a null pointer.
+     (remember to multiply with 'sizeof (wchar_t)').  It does not matter
+     what WTO is if SIZE is zero; WTO may even be a null pointer.
 
-   Here is an example of how you can use `strxfrm' when you plan to do
+   Here is an example of how you can use 'strxfrm' when you plan to do
 many comparisons.  It does the same thing as the previous example, but
 much faster, because it has to transform each string only once, no
 matter how many times it is compared with other strings.  Even the time
@@ -3238,8 +4775,8 @@
 
      struct sorter { char *input; char *transformed; };
 
-     /* This is the comparison function used with `qsort'
-        to sort an array of `struct sorter'. */
+     /* This is the comparison function used with 'qsort'
+        to sort an array of 'struct sorter'. */
 
      int
      compare_elements (const void *v1, const void *v2)
@@ -3259,7 +4796,7 @@
        struct sorter temp_array[nstrings];
        int i;
 
-       /* Set up `temp_array'.  Each element contains
+       /* Set up 'temp_array'.  Each element contains
           one input string and its transformed string. */
        for (i = 0; i < nstrings; i++)
          {
@@ -3272,7 +4809,7 @@
            /* First try a buffer perhaps big enough.  */
            transformed = (char *) xmalloc (length);
 
-           /* Transform `array[i]'.  */
+           /* Transform 'array[i]'.  */
            transformed_length = strxfrm (transformed, array[i], length);
 
            /* If the buffer was not large enough, resize it
@@ -3280,7 +4817,7 @@
            if (transformed_length >= length)
              {
                /* Allocate the needed space. +1 for terminating
-                  `NUL' character.  */
+                  'NUL' character.  */
                transformed = (char *) xrealloc (transformed,
                                                 transformed_length + 1);
 
@@ -3293,7 +4830,7 @@
            temp_array[i].transformed = transformed;
          }
 
-       /* Sort `temp_array' by comparing transformed strings. */
+       /* Sort 'temp_array' by comparing transformed strings. */
        qsort (temp_array, sizeof (struct sorter),
               nstrings, compare_elements);
 
@@ -3314,7 +4851,7 @@
      sort_strings_fast (wchar_t **array, int nstrings)
      {
        ...
-           /* Transform `array[i]'.  */
+           /* Transform 'array[i]'.  */
            transformed_length = wcsxfrm (transformed, array[i], length);
 
            /* If the buffer was not large enough, resize it
@@ -3322,7 +4859,7 @@
            if (transformed_length >= length)
              {
                /* Allocate the needed space. +1 for terminating
-                  `NUL' character.  */
+                  'NUL' character.  */
                transformed = (wchar_t *) xrealloc (transformed,
                                                    (transformed_length + 1)
                                                    * sizeof (wchar_t));
@@ -3334,8 +4871,8 @@
              }
        ...
 
-Note the additional multiplication with `sizeof (wchar_t)' in the
-`realloc' call.
+Note the additional multiplication with 'sizeof (wchar_t)' in the
+'realloc' call.
 
    *Compatibility Note:* The string collation functions are a new
 feature of ISO C90.  Older C dialects have no equivalent feature.  The
@@ -3349,14 +4886,14 @@
 
 This section describes library functions which perform various kinds of
 searching operations on strings and arrays.  These functions are
-declared in the header file `string.h'.  
+declared in the header file 'string.h'.
 
  -- Function: void * memchr (const void *BLOCK, int C, size_t SIZE)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
      This function finds the first occurrence of the byte C (converted
-     to an `unsigned char') in the initial SIZE bytes of the object
+     to an 'unsigned char') in the initial SIZE bytes of the object
      beginning at BLOCK.  The return value is a pointer to the located
      byte, or a null pointer if no match was found.
 
@@ -3374,19 +4911,19 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     Often the `memchr' function is used with the knowledge that the
+     Often the 'memchr' function is used with the knowledge that the
      byte C is available in the memory block specified by the
      parameters.  But this means that the SIZE parameter is not really
      needed and that the tests performed with it at runtime (to check
      whether the end of the block is reached) are not needed.
 
-     The `rawmemchr' function exists for just this situation which is
-     surprisingly frequent.  The interface is similar to `memchr' except
+     The 'rawmemchr' function exists for just this situation which is
+     surprisingly frequent.  The interface is similar to 'memchr' except
      that the SIZE parameter is missing.  The function will look beyond
      the end of the block pointed to by BLOCK in case the programmer
      made an error in assuming that the byte C is present in the block.
-     In this case the result is unspecified.  Otherwise the return
-     value is a pointer to the located byte.
+     In this case the result is unspecified.  Otherwise the return value
+     is a pointer to the located byte.
 
      This function is of special interest when looking for the end of a
      string.  Since all strings are terminated by a null byte a call
@@ -3402,7 +4939,7 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The function `memrchr' is like `memchr', except that it searches
+     The function 'memrchr' is like 'memchr', except that it searches
      backwards from the end of the block defined by BLOCK and SIZE
      (instead of forwards from the front).
 
@@ -3412,10 +4949,10 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `strchr' function finds the first occurrence of the character
-     C (converted to a `char') in the null-terminated string beginning
-     at STRING.  The return value is a pointer to the located
-     character, or a null pointer if no match was found.
+     The 'strchr' function finds the first occurrence of the character C
+     (converted to a 'char') in the null-terminated string beginning at
+     STRING.  The return value is a pointer to the located character, or
+     a null pointer if no match was found.
 
      For example,
           strchr ("hello, world", 'l')
@@ -3428,33 +4965,33 @@
      string by specifying a null character as the value of the C
      argument.
 
-     When `strchr' returns a null pointer, it does not let you know the
+     When 'strchr' returns a null pointer, it does not let you know the
      position of the terminating null character it has found.  If you
      need that information, it is better (but less portable) to use
-     `strchrnul' than to search for it a second time.
+     'strchrnul' than to search for it a second time.
 
  -- Function: wchar_t * wcschr (const wchar_t *WSTRING, int WC)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `wcschr' function finds the first occurrence of the wide
-     character WC in the null-terminated wide character string
-     beginning at WSTRING.  The return value is a pointer to the
-     located wide character, or a null pointer if no match was found.
+     The 'wcschr' function finds the first occurrence of the wide
+     character WC in the null-terminated wide character string beginning
+     at WSTRING.  The return value is a pointer to the located wide
+     character, or a null pointer if no match was found.
 
      The terminating null character is considered to be part of the wide
-     character string, so you can use this function get a pointer to
-     the end of a wide character string by specifying a null wude
-     character as the value of the WC argument.  It would be better
-     (but less portable) to use `wcschrnul' in this case, though.
+     character string, so you can use this function get a pointer to the
+     end of a wide character string by specifying a null wude character
+     as the value of the WC argument.  It would be better (but less
+     portable) to use 'wcschrnul' in this case, though.
 
  -- Function: char * strchrnul (const char *STRING, int C)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     `strchrnul' is the same as `strchr' except that if it does not
-     find the character, it returns a pointer to string's terminating
-     null character rather than a null pointer.
+     'strchrnul' is the same as 'strchr' except that if it does not find
+     the character, it returns a pointer to string's terminating null
+     character rather than a null pointer.
 
      This function is a GNU extension.
 
@@ -3462,37 +4999,36 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     `wcschrnul' is the same as `wcschr' except that if it does not
-     find the wide character, it returns a pointer to wide character
-     string's terminating null wide character rather than a null
-     pointer.
+     'wcschrnul' is the same as 'wcschr' except that if it does not find
+     the wide character, it returns a pointer to wide character string's
+     terminating null wide character rather than a null pointer.
 
      This function is a GNU extension.
 
-   One useful, but unusual, use of the `strchr' function is when one
+   One useful, but unusual, use of the 'strchr' function is when one
 wants to have a pointer pointing to the NUL byte terminating a string.
 This is often written in this way:
 
        s += strlen (s);
 
 This is almost optimal but the addition operation duplicated a bit of
-the work already done in the `strlen' function.  A better solution is
+the work already done in the 'strlen' function.  A better solution is
 this:
 
        s = strchr (s, '\0');
 
-   There is no restriction on the second parameter of `strchr' so it
+   There is no restriction on the second parameter of 'strchr' so it
 could very well also be the NUL character.  Those readers thinking very
-hard about this might now point out that the `strchr' function is more
-expensive than the `strlen' function since we have two abort criteria.
-This is right.  But in the GNU C Library the implementation of `strchr'
-is optimized in a special way so that `strchr' actually is faster.
+hard about this might now point out that the 'strchr' function is more
+expensive than the 'strlen' function since we have two abort criteria.
+This is right.  But in the GNU C Library the implementation of 'strchr'
+is optimized in a special way so that 'strchr' actually is faster.
 
  -- Function: char * strrchr (const char *STRING, int C)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The function `strrchr' is like `strchr', except that it searches
+     The function 'strrchr' is like 'strchr', except that it searches
      backwards from the end of the string STRING (instead of forwards
      from the front).
 
@@ -3504,7 +5040,7 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The function `wcsrchr' is like `wcschr', except that it searches
+     The function 'wcsrchr' is like 'wcschr', except that it searches
      backwards from the end of the string WSTRING (instead of forwards
      from the front).
 
@@ -3512,11 +5048,11 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This is like `strchr', except that it searches HAYSTACK for a
-     substring NEEDLE rather than just a single character.  It returns
-     a pointer into the string HAYSTACK that is the first character of
-     the substring, or a null pointer if no match was found.  If NEEDLE
-     is an empty string, the function returns HAYSTACK.
+     This is like 'strchr', except that it searches HAYSTACK for a
+     substring NEEDLE rather than just a single character.  It returns a
+     pointer into the string HAYSTACK that is the first character of the
+     substring, or a null pointer if no match was found.  If NEEDLE is
+     an empty string, the function returns HAYSTACK.
 
      For example,
           strstr ("hello, world", "l")
@@ -3529,7 +5065,7 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This is like `wcschr', except that it searches HAYSTACK for a
+     This is like 'wcschr', except that it searches HAYSTACK for a
      substring NEEDLE rather than just a single wide character.  It
      returns a pointer into the string HAYSTACK that is the first wide
      character of the substring, or a null pointer if no match was
@@ -3541,17 +5077,17 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     `wcswcs' is a deprecated alias for `wcsstr'.  This is the name
-     originally used in the X/Open Portability Guide before the
-     Amendment 1 to ISO C90 was published.
+     'wcswcs' is a deprecated alias for 'wcsstr'.  This is the name
+     originally used in the X/Open Portability Guide before the Amendment 1
+     to ISO C90 was published.
 
  -- Function: char * strcasestr (const char *HAYSTACK, const char
           *NEEDLE)
      Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
      Safety Concepts::.
 
-     This is like `strstr', except that it ignores case in searching for
-     the substring.   Like `strcasecmp', it is locale dependent how
+     This is like 'strstr', except that it ignores case in searching for
+     the substring.  Like 'strcasecmp', it is locale dependent how
      uppercase and lowercase characters are related.
 
      For example,
@@ -3565,7 +5101,7 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This is like `strstr', but NEEDLE and HAYSTACK are byte arrays
+     This is like 'strstr', but NEEDLE and HAYSTACK are byte arrays
      rather than null-terminated strings.  NEEDLE-LEN is the length of
      NEEDLE and HAYSTACK-LEN is the length of HAYSTACK.
 
@@ -3575,7 +5111,7 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `strspn' ("string span") function returns the length of the
+     The 'strspn' ("string span") function returns the length of the
      initial substring of STRING that consists entirely of characters
      that are members of the set specified by the string SKIPSET.  The
      order of the characters in SKIPSET is not important.
@@ -3595,7 +5131,7 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `wcsspn' ("wide character string span") function returns the
+     The 'wcsspn' ("wide character string span") function returns the
      length of the initial substring of WSTRING that consists entirely
      of wide characters that are members of the set specified by the
      string SKIPSET.  The order of the wide characters in SKIPSET is not
@@ -3605,9 +5141,9 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `strcspn' ("string complement span") function returns the
-     length of the initial substring of STRING that consists entirely
-     of characters that are _not_ members of the set specified by the
+     The 'strcspn' ("string complement span") function returns the
+     length of the initial substring of STRING that consists entirely of
+     characters that are _not_ members of the set specified by the
      string STOPSET.  (In other words, it returns the offset of the
      first character in STRING that is a member of the set STOPSET.)
 
@@ -3626,22 +5162,22 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `wcscspn' ("wide character string complement span") function
+     The 'wcscspn' ("wide character string complement span") function
      returns the length of the initial substring of WSTRING that
      consists entirely of wide characters that are _not_ members of the
      set specified by the string STOPSET.  (In other words, it returns
-     the offset of the first character in STRING that is a member of
-     the set STOPSET.)
+     the offset of the first character in STRING that is a member of the
+     set STOPSET.)
 
  -- Function: char * strpbrk (const char *STRING, const char *STOPSET)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `strpbrk' ("string pointer break") function is related to
-     `strcspn', except that it returns a pointer to the first character
-     in STRING that is a member of the set STOPSET instead of the
-     length of the initial substring.  It returns a null pointer if no
-     such character from STOPSET is found.
+     The 'strpbrk' ("string pointer break") function is related to
+     'strcspn', except that it returns a pointer to the first character
+     in STRING that is a member of the set STOPSET instead of the length
+     of the initial substring.  It returns a null pointer if no such
+     character from STOPSET is found.
 
      For example,
 
@@ -3659,8 +5195,8 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `wcspbrk' ("wide character string pointer break") function is
-     related to `wcscspn', except that it returns a pointer to the first
+     The 'wcspbrk' ("wide character string pointer break") function is
+     related to 'wcscspn', except that it returns a pointer to the first
      wide character in WSTRING that is a member of the set STOPSET
      instead of the length of the initial substring.  It returns a null
      pointer if no such character from STOPSET is found.
@@ -3672,19 +5208,19 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     `index' is another name for `strchr'; they are exactly the same.
-     New code should always use `strchr' since this name is defined in
-     ISO C while `index' is a BSD invention which never was available
-     on System V derived systems.
+     'index' is another name for 'strchr'; they are exactly the same.
+     New code should always use 'strchr' since this name is defined in ISO C
+     while 'index' is a BSD invention which never was available on System V
+     derived systems.
 
  -- Function: char * rindex (const char *STRING, int C)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     `rindex' is another name for `strrchr'; they are exactly the same.
-     New code should always use `strrchr' since this name is defined in
-     ISO C while `rindex' is a BSD invention which never was available
-     on System V derived systems.
+     'rindex' is another name for 'strrchr'; they are exactly the same.
+     New code should always use 'strrchr' since this name is defined in ISO C
+     while 'rindex' is a BSD invention which never was available on System V
+     derived systems.
 
 
 File: libc.info,  Node: Finding Tokens in a String,  Next: strfry,  Prev: Search Functions,  Up: String and Array Utilities
@@ -3694,8 +5230,8 @@
 
 It's fairly common for programs to have a need to do some simple kinds
 of lexical analysis and parsing, such as splitting a command string up
-into tokens.  You can do this with the `strtok' function, declared in
-the header file `string.h'.  
+into tokens.  You can do this with the 'strtok' function, declared in
+the header file 'string.h'.
 
  -- Function: char * strtok (char *restrict NEWSTRING, const char
           *restrict DELIMITERS)
@@ -3703,36 +5239,36 @@
      POSIX Safety Concepts::.
 
      A string can be split into tokens by making a series of calls to
-     the function `strtok'.
+     the function 'strtok'.
 
      The string to be split up is passed as the NEWSTRING argument on
-     the first call only.  The `strtok' function uses this to set up
+     the first call only.  The 'strtok' function uses this to set up
      some internal state information.  Subsequent calls to get
      additional tokens from the same string are indicated by passing a
-     null pointer as the NEWSTRING argument.  Calling `strtok' with
+     null pointer as the NEWSTRING argument.  Calling 'strtok' with
      another non-null NEWSTRING argument reinitializes the state
      information.  It is guaranteed that no other library function ever
-     calls `strtok' behind your back (which would mess up this internal
+     calls 'strtok' behind your back (which would mess up this internal
      state information).
 
      The DELIMITERS argument is a string that specifies a set of
      delimiters that may surround the token being extracted.  All the
-     initial characters that are members of this set are discarded.
-     The first character that is _not_ a member of this set of
-     delimiters marks the beginning of the next token.  The end of the
-     token is found by looking for the next character that is a member
-     of the delimiter set.  This character in the original string
-     NEWSTRING is overwritten by a null character, and the pointer to
-     the beginning of the token in NEWSTRING is returned.
+     initial characters that are members of this set are discarded.  The
+     first character that is _not_ a member of this set of delimiters
+     marks the beginning of the next token.  The end of the token is
+     found by looking for the next character that is a member of the
+     delimiter set.  This character in the original string NEWSTRING is
+     overwritten by a null character, and the pointer to the beginning
+     of the token in NEWSTRING is returned.
 
-     On the next call to `strtok', the searching begins at the next
+     On the next call to 'strtok', the searching begins at the next
      character beyond the one that marked the end of the previous token.
      Note that the set of delimiters DELIMITERS do not have to be the
-     same on every call in a series of calls to `strtok'.
+     same on every call in a series of calls to 'strtok'.
 
      If the end of the string NEWSTRING is reached, or if the remainder
-     of string consists only of delimiter characters, `strtok' returns
-     a null pointer.
+     of string consists only of delimiter characters, 'strtok' returns a
+     null pointer.
 
      Note that "character" is here used in the sense of byte.  In a
      string using a multibyte character encoding (abstract) character
@@ -3746,49 +5282,48 @@
      Concepts::.
 
      A string can be split into tokens by making a series of calls to
-     the function `wcstok'.
+     the function 'wcstok'.
 
      The string to be split up is passed as the NEWSTRING argument on
-     the first call only.  The `wcstok' function uses this to set up
+     the first call only.  The 'wcstok' function uses this to set up
      some internal state information.  Subsequent calls to get
-     additional tokens from the same wide character string are
-     indicated by passing a null pointer as the NEWSTRING argument,
-     which causes the pointer previously stored in SAVE_PTR to be used
-     instead.
+     additional tokens from the same wide character string are indicated
+     by passing a null pointer as the NEWSTRING argument, which causes
+     the pointer previously stored in SAVE_PTR to be used instead.
 
-     The DELIMITERS argument is a wide character string that specifies
-     a set of delimiters that may surround the token being extracted.
-     All the initial wide characters that are members of this set are
-     discarded.  The first wide character that is _not_ a member of
-     this set of delimiters marks the beginning of the next token.  The
-     end of the token is found by looking for the next wide character
-     that is a member of the delimiter set.  This wide character in the
+     The DELIMITERS argument is a wide character string that specifies a
+     set of delimiters that may surround the token being extracted.  All
+     the initial wide characters that are members of this set are
+     discarded.  The first wide character that is _not_ a member of this
+     set of delimiters marks the beginning of the next token.  The end
+     of the token is found by looking for the next wide character that
+     is a member of the delimiter set.  This wide character in the
      original wide character string NEWSTRING is overwritten by a null
      wide character, the pointer past the overwritten wide character is
-     saved in SAVE_PTR, and the pointer to the beginning of the token
-     in NEWSTRING is returned.
+     saved in SAVE_PTR, and the pointer to the beginning of the token in
+     NEWSTRING is returned.
 
-     On the next call to `wcstok', the searching begins at the next
-     wide character beyond the one that marked the end of the previous
-     token.  Note that the set of delimiters DELIMITERS do not have to
-     be the same on every call in a series of calls to `wcstok'.
+     On the next call to 'wcstok', the searching begins at the next wide
+     character beyond the one that marked the end of the previous token.
+     Note that the set of delimiters DELIMITERS do not have to be the
+     same on every call in a series of calls to 'wcstok'.
 
-     If the end of the wide character string NEWSTRING is reached, or
-     if the remainder of string consists only of delimiter wide
-     characters, `wcstok' returns a null pointer.
+     If the end of the wide character string NEWSTRING is reached, or if
+     the remainder of string consists only of delimiter wide characters,
+     'wcstok' returns a null pointer.
 
-   *Warning:* Since `strtok' and `wcstok' alter the string they is
+   *Warning:* Since 'strtok' and 'wcstok' alter the string they is
 parsing, you should always copy the string to a temporary buffer before
-parsing it with `strtok'/`wcstok' (*note Copying and Concatenation::).
-If you allow `strtok' or `wcstok' to modify a string that came from
+parsing it with 'strtok'/'wcstok' (*note Copying and Concatenation::).
+If you allow 'strtok' or 'wcstok' to modify a string that came from
 another part of your program, you are asking for trouble; that string
-might be used for other purposes after `strtok' or `wcstok' has
-modified it, and it would not have the expected value.
+might be used for other purposes after 'strtok' or 'wcstok' has modified
+it, and it would not have the expected value.
 
    The string that you are operating on might even be a constant.  Then
-when `strtok' or `wcstok' tries to modify it, your program will get a
+when 'strtok' or 'wcstok' tries to modify it, your program will get a
 fatal signal for writing in read-only memory.  *Note Program Error
-Signals::.  Even if the operation of `strtok' or `wcstok' would not
+Signals::.  Even if the operation of 'strtok' or 'wcstok' would not
 require a modification of the string (e.g., if there is exactly one
 token) the string can (and in the GNU C Library case will) be modified.
 
@@ -3797,11 +5332,11 @@
 structure, then it is error-prone to modify the data structure
 temporarily.
 
-   The function `strtok' is not reentrant, whereas `wcstok' is.  *Note
+   The function 'strtok' is not reentrant, whereas 'wcstok' is.  *Note
 Nonreentrancy::, for a discussion of where and why reentrancy is
 important.
 
-   Here is a simple example showing the use of `strtok'.
+   Here is a simple example showing the use of 'strtok'.
 
      #include <string.h>
      #include <stddef.h>
@@ -3832,12 +5367,12 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     Just like `strtok', this function splits the string into several
-     tokens which can be accessed by successive calls to `strtok_r'.
-     The difference is that, as in `wcstok', the information about the
+     Just like 'strtok', this function splits the string into several
+     tokens which can be accessed by successive calls to 'strtok_r'.
+     The difference is that, as in 'wcstok', the information about the
      next token is stored in the space pointed to by the third argument,
      SAVE_PTR, which is a pointer to a string pointer.  Calling
-     `strtok_r' with a null pointer for NEWSTRING and leaving SAVE_PTR
+     'strtok_r' with a null pointer for NEWSTRING and leaving SAVE_PTR
      between the calls unchanged does the job without hindering
      reentrancy.
 
@@ -3848,24 +5383,23 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This function has a similar functionality as `strtok_r' with the
+     This function has a similar functionality as 'strtok_r' with the
      NEWSTRING argument replaced by the SAVE_PTR argument.  The
      initialization of the moving pointer has to be done by the user.
-     Successive calls to `strsep' move the pointer along the tokens
-     separated by DELIMITER, returning the address of the next token
-     and updating STRING_PTR to point to the beginning of the next
-     token.
+     Successive calls to 'strsep' move the pointer along the tokens
+     separated by DELIMITER, returning the address of the next token and
+     updating STRING_PTR to point to the beginning of the next token.
 
-     One difference between `strsep' and `strtok_r' is that if the
-     input string contains more than one character from DELIMITER in a
-     row `strsep' returns an empty string for each pair of characters
-     from DELIMITER.  This means that a program normally should test
-     for `strsep' returning an empty string before processing it.
+     One difference between 'strsep' and 'strtok_r' is that if the input
+     string contains more than one character from DELIMITER in a row
+     'strsep' returns an empty string for each pair of characters from
+     DELIMITER.  This means that a program normally should test for
+     'strsep' returning an empty string before processing it.
 
      This function was introduced in 4.3BSD and therefore is widely
      available.
 
-   Here is how the above example looks like when `strsep' is used.
+   Here is how the above example looks like when 'strsep' is used.
 
      #include <string.h>
      #include <stddef.h>
@@ -3897,14 +5431,14 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The GNU version of the `basename' function returns the last
+     The GNU version of the 'basename' function returns the last
      component of the path in FILENAME.  This function is the preferred
      usage, since it does not modify the argument, FILENAME, and
-     respects trailing slashes.  The prototype for `basename' can be
-     found in `string.h'.  Note, this function is overriden by the XPG
-     version, if `libgen.h' is included.
+     respects trailing slashes.  The prototype for 'basename' can be
+     found in 'string.h'.  Note, this function is overriden by the XPG
+     version, if 'libgen.h' is included.
 
-     Example of using GNU `basename':
+     Example of using GNU 'basename':
 
           #include <string.h>
 
@@ -3925,19 +5459,18 @@
      *Portability Note:* This function may produce different results on
      different systems.
 
-
  -- Function: char * basename (const char *PATH)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This is the standard XPG defined `basename'. It is similar in
+     This is the standard XPG defined 'basename'.  It is similar in
      spirit to the GNU version, but may modify the PATH by removing
      trailing '/' characters.  If the PATH is made up entirely of '/'
-     characters, then "/" will be returned.  Also, if PATH is `NULL' or
-     an empty string, then "." is returned.  The prototype for the XPG
-     version can be found in `libgen.h'.
+     characters, then "/" will be returned.  Also, if PATH is 'NULL' or
+     an empty string, then "."  is returned.  The prototype for the XPG
+     version can be found in 'libgen.h'.
 
-     Example of using XPG `basename':
+     Example of using XPG 'basename':
 
           #include <libgen.h>
 
@@ -3963,11 +5496,11 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `dirname' function is the compliment to the XPG version of
-     `basename'.  It returns the parent directory of the file specified
-     by PATH.  If PATH is `NULL', an empty string, or contains no '/'
-     characters, then "." is returned.  The prototype for this function
-     can be found in `libgen.h'.
+     The 'dirname' function is the compliment to the XPG version of
+     'basename'.  It returns the parent directory of the file specified
+     by PATH.  If PATH is 'NULL', an empty string, or contains no '/'
+     characters, then "."  is returned.  The prototype for this function
+     can be found in 'libgen.h'.
 
 
 File: libc.info,  Node: strfry,  Next: Trivial Encryption,  Prev: Finding Tokens in a String,  Up: String and Array Utilities
@@ -3979,24 +5512,23 @@
 I take good data in string form and painlessly turn it into garbage?"
 This is actually a fairly simple task for C programmers who do not use
 the GNU C Library string functions, but for programs based on the GNU C
-Library, the `strfry' function is the preferred method for destroying
+Library, the 'strfry' function is the preferred method for destroying
 string data.
 
-   The prototype for this function is in `string.h'.
+   The prototype for this function is in 'string.h'.
 
  -- Function: char * strfry (char *STRING)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     `strfry' creates a pseudorandom anagram of a string, replacing the
+     'strfry' creates a pseudorandom anagram of a string, replacing the
      input with the anagram in place.  For each position in the string,
-     `strfry' swaps it with a position in the string selected at random
+     'strfry' swaps it with a position in the string selected at random
      (from a uniform distribution).  The two positions may be the same.
 
-     The return value of `strfry' is always STRING.
+     The return value of 'strfry' is always STRING.
 
-     *Portability Note:*  This function is unique to the GNU C Library.
-
+     *Portability Note:* This function is unique to the GNU C Library.
 
 
 File: libc.info,  Node: Trivial Encryption,  Next: Encode Binary Data,  Prev: strfry,  Up: String and Array Utilities
@@ -4004,37 +5536,36 @@
 5.10 Trivial Encryption
 =======================
 
-The `memfrob' function converts an array of data to something
+The 'memfrob' function converts an array of data to something
 unrecognizable and back again.  It is not encryption in its usual sense
 since it is easy for someone to convert the encrypted data back to clear
 text.  The transformation is analogous to Usenet's "Rot13" encryption
 method for obscuring offensive jokes from sensitive eyes and such.
-Unlike Rot13, `memfrob' works on arbitrary binary data, not just text.  
+Unlike Rot13, 'memfrob' works on arbitrary binary data, not just text.
 
    For true encryption, *Note Cryptographic Functions::.
 
-   This function is declared in `string.h'.  
+   This function is declared in 'string.h'.
 
  -- Function: void * memfrob (void *MEM, size_t LENGTH)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     `memfrob' transforms (frobnicates) each byte of the data structure
+     'memfrob' transforms (frobnicates) each byte of the data structure
      at MEM, which is LENGTH bytes long, by bitwise exclusive oring it
      with binary 00101010.  It does the transformation in place and its
      return value is always MEM.
 
-     Note that `memfrob' a second time on the same data structure
+     Note that 'memfrob' a second time on the same data structure
      returns it to its original state.
 
      This is a good function for hiding information from someone who
      doesn't want to see it or doesn't want to see it very much.  To
-     really prevent people from retrieving the information, use
-     stronger encryption such as that described in *Note Cryptographic
+     really prevent people from retrieving the information, use stronger
+     encryption such as that described in *Note Cryptographic
      Functions::.
 
-     *Portability Note:*  This function is unique to the GNU C Library.
-
+     *Portability Note:* This function is unique to the GNU C Library.
 
 
 File: libc.info,  Node: Encode Binary Data,  Next: Argz and Envz Vectors,  Prev: Trivial Encryption,  Up: String and Array Utilities
@@ -4061,13 +5592,13 @@
      *Warning:* Since a static buffer is used this function should not
      be used in multi-threaded programs.  There is no thread-safe
      alternative to this function in the C library.
-     *Compatibility Note:* The XPG standard states that the return
-     value of `l64a' is undefined if N is negative.  In the GNU
-     implementation, `l64a' treats its argument as unsigned, so it will
+     *Compatibility Note:* The XPG standard states that the return value
+     of 'l64a' is undefined if N is negative.  In the GNU
+     implementation, 'l64a' treats its argument as unsigned, so it will
      return a sensible encoding for any nonzero N; however, portable
      programs should not rely on this.
 
-     To encode a large buffer `l64a' must be called in a loop, once for
+     To encode a large buffer 'l64a' must be called in a loop, once for
      each 32-bit word of the buffer.  For example, one could do
      something like this:
 
@@ -4080,10 +5611,10 @@
             char *cp = out, *p;
 
             /* Encode the length. */
-            /* Using `htonl' is necessary so that the data can be
+            /* Using 'htonl' is necessary so that the data can be
                decoded even on machines with different byte order.
-               `l64a' can return a string shorter than 6 bytes, so
-               we pad it with encoding of 0 ('.') at the end by
+               'l64a' can return a string shorter than 6 bytes, so 
+               we pad it with encoding of 0 ('.') at the end by 
                hand. */
 
             p = stpcpy (cp, l64a (htonl (len)));
@@ -4117,8 +5648,7 @@
      It is strange that the library does not provide the complete
      functionality needed but so be it.
 
-
-   To decode data produced with `l64a' the following function should be
+   To decode data produced with 'l64a' the following function should be
 used.
 
  -- Function: long int a64l (const char *STRING)
@@ -4126,28 +5656,28 @@
      Concepts::.
 
      The parameter STRING should contain a string which was produced by
-     a call to `l64a'.  The function processes at least 6 characters of
+     a call to 'l64a'.  The function processes at least 6 characters of
      this string, and decodes the characters it finds according to the
      table below.  It stops decoding when it finds a character not in
-     the table, rather like `atoi'; if you have a buffer which has been
-     broken into lines, you must be careful to skip over the
-     end-of-line characters.
+     the table, rather like 'atoi'; if you have a buffer which has been
+     broken into lines, you must be careful to skip over the end-of-line
+     characters.
 
-     The decoded number is returned as a `long int' value.
+     The decoded number is returned as a 'long int' value.
 
-   The `l64a' and `a64l' functions use a base 64 encoding, in which
-each character of an encoded string represents six bits of an input
-word.  These symbols are used for the base 64 digits:
+   The 'l64a' and 'a64l' functions use a base 64 encoding, in which each
+character of an encoded string represents six bits of an input word.
+These symbols are used for the base 64 digits:
 
         0     1     2     3     4     5     6     7
-0       `.'   `/'   `0'   `1'   `2'   `3'   `4'   `5'
-8       `6'   `7'   `8'   `9'   `A'   `B'   `C'   `D'
-16      `E'   `F'   `G'   `H'   `I'   `J'   `K'   `L'
-24      `M'   `N'   `O'   `P'   `Q'   `R'   `S'   `T'
-32      `U'   `V'   `W'   `X'   `Y'   `Z'   `a'   `b'
-40      `c'   `d'   `e'   `f'   `g'   `h'   `i'   `j'
-48      `k'   `l'   `m'   `n'   `o'   `p'   `q'   `r'
-56      `s'   `t'   `u'   `v'   `w'   `x'   `y'   `z'
+0       '.'   '/'   '0'   '1'   '2'   '3'   '4'   '5'
+8       '6'   '7'   '8'   '9'   'A'   'B'   'C'   'D'
+16      'E'   'F'   'G'   'H'   'I'   'J'   'K'   'L'
+24      'M'   'N'   'O'   'P'   'Q'   'R'   'S'   'T'
+32      'U'   'V'   'W'   'X'   'Y'   'Z'   'a'   'b'
+40      'c'   'd'   'e'   'f'   'g'   'h'   'i'   'j'
+48      'k'   'l'   'm'   'n'   'o'   'p'   'q'   'r'
+56      's'   't'   'u'   'v'   'w'   'x'   'y'   'z'
 
    This encoding scheme is not standard.  There are some other encoding
 methods which are much more widely used (UU encoding, MIME encoding).
@@ -4160,10 +5690,10 @@
 ==========================
 
 "argz vectors" are vectors of strings in a contiguous block of memory,
-each element separated from its neighbors by null-characters (`'\0'').
+each element separated from its neighbors by null-characters (''\0'').
 
-   "Envz vectors" are an extension of argz vectors where each element
-is a name-value pair, separated by a `'='' character (as in a Unix
+   "Envz vectors" are an extension of argz vectors where each element is
+a name-value pair, separated by a ''='' character (as in a Unix
 environment).
 
 * Menu:
@@ -4178,41 +5708,40 @@
 ---------------------
 
 Each argz vector is represented by a pointer to the first element, of
-type `char *', and a size, of type `size_t', both of which can be
-initialized to `0' to represent an empty argz vector.  All argz
+type 'char *', and a size, of type 'size_t', both of which can be
+initialized to '0' to represent an empty argz vector.  All argz
 functions accept either a pointer and a size argument, or pointers to
 them, if they will be modified.
 
-   The argz functions use `malloc'/`realloc' to allocate/grow argz
+   The argz functions use 'malloc'/'realloc' to allocate/grow argz
 vectors, and so any argz vector creating using these functions may be
-freed by using `free'; conversely, any argz function that may grow a
-string expects that string to have been allocated using `malloc' (those
-argz functions that only examine their arguments or modify them in
-place will work on any sort of memory).  *Note Unconstrained
-Allocation::.
+freed by using 'free'; conversely, any argz function that may grow a
+string expects that string to have been allocated using 'malloc' (those
+argz functions that only examine their arguments or modify them in place
+will work on any sort of memory).  *Note Unconstrained Allocation::.
 
    All argz functions that do memory allocation have a return type of
-`error_t', and return `0' for success, and `ENOMEM' if an allocation
+'error_t', and return '0' for success, and 'ENOMEM' if an allocation
 error occurs.
 
-   These functions are declared in the standard include file `argz.h'.
+   These functions are declared in the standard include file 'argz.h'.
 
  -- Function: error_t argz_create (char *const ARGV[], char **ARGZ,
           size_t *ARGZ_LEN)
      Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
      POSIX Safety Concepts::.
 
-     The `argz_create' function converts the Unix-style argument vector
+     The 'argz_create' function converts the Unix-style argument vector
      ARGV (a vector of pointers to normal C strings, terminated by
-     `(char *)0'; *note Program Arguments::) into an argz vector with
+     '(char *)0'; *note Program Arguments::) into an argz vector with
      the same elements, which is returned in ARGZ and ARGZ_LEN.
 
- -- Function: error_t argz_create_sep (const char *STRING, int SEP,
-          char **ARGZ, size_t *ARGZ_LEN)
+ -- Function: error_t argz_create_sep (const char *STRING, int SEP, char
+          **ARGZ, size_t *ARGZ_LEN)
      Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
      POSIX Safety Concepts::.
 
-     The `argz_create_sep' function converts the null-terminated string
+     The 'argz_create_sep' function converts the null-terminated string
      STRING into an argz vector (returned in ARGZ and ARGZ_LEN) by
      splitting it into elements at every occurrence of the character
      SEP.
@@ -4224,68 +5753,68 @@
      Returns the number of elements in the argz vector ARGZ and
      ARGZ_LEN.
 
- -- Function: void argz_extract (const char *ARGZ, size_t ARGZ_LEN,
-          char **ARGV)
+ -- Function: void argz_extract (const char *ARGZ, size_t ARGZ_LEN, char
+          **ARGV)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `argz_extract' function converts the argz vector ARGZ and
+     The 'argz_extract' function converts the argz vector ARGZ and
      ARGZ_LEN into a Unix-style argument vector stored in ARGV, by
-     putting pointers to every element in ARGZ into successive
-     positions in ARGV, followed by a terminator of `0'.  ARGV must be
+     putting pointers to every element in ARGZ into successive positions
+     in ARGV, followed by a terminator of '0'.  ARGV must be
      pre-allocated with enough space to hold all the elements in ARGZ
-     plus the terminating `(char *)0' (`(argz_count (ARGZ, ARGZ_LEN) +
+     plus the terminating '(char *)0' ('(argz_count (ARGZ, ARGZ_LEN) +
      1) * sizeof (char *)' bytes should be enough).  Note that the
      string pointers stored into ARGV point into ARGZ--they are not
-     copies--and so ARGZ must be copied if it will be changed while
-     ARGV is still active.  This function is useful for passing the
-     elements in ARGZ to an exec function (*note Executing a File::).
+     copies--and so ARGZ must be copied if it will be changed while ARGV
+     is still active.  This function is useful for passing the elements
+     in ARGZ to an exec function (*note Executing a File::).
 
  -- Function: void argz_stringify (char *ARGZ, size_t LEN, int SEP)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `argz_stringify' converts ARGZ into a normal string with the
-     elements separated by the character SEP, by replacing each `'\0''
-     inside ARGZ (except the last one, which terminates the string)
-     with SEP.  This is handy for printing ARGZ in a readable manner.
+     The 'argz_stringify' converts ARGZ into a normal string with the
+     elements separated by the character SEP, by replacing each ''\0''
+     inside ARGZ (except the last one, which terminates the string) with
+     SEP.  This is handy for printing ARGZ in a readable manner.
 
  -- Function: error_t argz_add (char **ARGZ, size_t *ARGZ_LEN, const
           char *STR)
      Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
      POSIX Safety Concepts::.
 
-     The `argz_add' function adds the string STR to the end of the argz
-     vector `*ARGZ', and updates `*ARGZ' and `*ARGZ_LEN' accordingly.
+     The 'argz_add' function adds the string STR to the end of the argz
+     vector '*ARGZ', and updates '*ARGZ' and '*ARGZ_LEN' accordingly.
 
- -- Function: error_t argz_add_sep (char **ARGZ, size_t *ARGZ_LEN,
-          const char *STR, int DELIM)
+ -- Function: error_t argz_add_sep (char **ARGZ, size_t *ARGZ_LEN, const
+          char *STR, int DELIM)
      Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
      POSIX Safety Concepts::.
 
-     The `argz_add_sep' function is similar to `argz_add', but STR is
+     The 'argz_add_sep' function is similar to 'argz_add', but STR is
      split into separate elements in the result at occurrences of the
      character DELIM.  This is useful, for instance, for adding the
      components of a Unix search path to an argz vector, by using a
-     value of `':'' for DELIM.
+     value of '':'' for DELIM.
 
  -- Function: error_t argz_append (char **ARGZ, size_t *ARGZ_LEN, const
           char *BUF, size_t BUF_LEN)
      Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
      POSIX Safety Concepts::.
 
-     The `argz_append' function appends BUF_LEN bytes starting at BUF
-     to the argz vector `*ARGZ', reallocating `*ARGZ' to accommodate
-     it, and adding BUF_LEN to `*ARGZ_LEN'.
+     The 'argz_append' function appends BUF_LEN bytes starting at BUF to
+     the argz vector '*ARGZ', reallocating '*ARGZ' to accommodate it,
+     and adding BUF_LEN to '*ARGZ_LEN'.
 
  -- Function: void argz_delete (char **ARGZ, size_t *ARGZ_LEN, char
           *ENTRY)
      Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
      POSIX Safety Concepts::.
 
-     If ENTRY points to the beginning of one of the elements in the
-     argz vector `*ARGZ', the `argz_delete' function will remove this
-     entry and reallocate `*ARGZ', modifying `*ARGZ' and `*ARGZ_LEN'
+     If ENTRY points to the beginning of one of the elements in the argz
+     vector '*ARGZ', the 'argz_delete' function will remove this entry
+     and reallocate '*ARGZ', modifying '*ARGZ' and '*ARGZ_LEN'
      accordingly.  Note that as destructive argz functions usually
      reallocate their argz argument, pointers into argz vectors such as
      ENTRY will then become invalid.
@@ -4295,23 +5824,23 @@
      Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
      POSIX Safety Concepts::.
 
-     The `argz_insert' function inserts the string ENTRY into the argz
-     vector `*ARGZ' at a point just before the existing element pointed
-     to by BEFORE, reallocating `*ARGZ' and updating `*ARGZ' and
-     `*ARGZ_LEN'.  If BEFORE is `0', ENTRY is added to the end instead
-     (as if by `argz_add').  Since the first element is in fact the
-     same as `*ARGZ', passing in `*ARGZ' as the value of BEFORE will
-     result in ENTRY being inserted at the beginning.
+     The 'argz_insert' function inserts the string ENTRY into the argz
+     vector '*ARGZ' at a point just before the existing element pointed
+     to by BEFORE, reallocating '*ARGZ' and updating '*ARGZ' and
+     '*ARGZ_LEN'.  If BEFORE is '0', ENTRY is added to the end instead
+     (as if by 'argz_add').  Since the first element is in fact the same
+     as '*ARGZ', passing in '*ARGZ' as the value of BEFORE will result
+     in ENTRY being inserted at the beginning.
 
- -- Function: char * argz_next (const char *ARGZ, size_t ARGZ_LEN,
-          const char *ENTRY)
+ -- Function: char * argz_next (const char *ARGZ, size_t ARGZ_LEN, const
+          char *ENTRY)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `argz_next' function provides a convenient way of iterating
-     over the elements in the argz vector ARGZ.  It returns a pointer
-     to the next element in ARGZ after the element ENTRY, or `0' if
-     there are no elements following ENTRY.  If ENTRY is `0', the first
+     The 'argz_next' function provides a convenient way of iterating
+     over the elements in the argz vector ARGZ.  It returns a pointer to
+     the next element in ARGZ after the element ENTRY, or '0' if there
+     are no elements following ENTRY.  If ENTRY is '0', the first
      element of ARGZ is returned.
 
      This behavior suggests two styles of iteration:
@@ -4320,8 +5849,8 @@
               while ((entry = argz_next (ARGZ, ARGZ_LEN, entry)))
                 ACTION;
 
-     (the double parentheses are necessary to make some C compilers
-     shut up about what they consider a questionable `while'-test) and:
+     (the double parentheses are necessary to make some C compilers shut
+     up about what they consider a questionable 'while'-test) and:
 
               char *entry;
               for (entry = ARGZ;
@@ -4329,8 +5858,8 @@
                    entry = argz_next (ARGZ, ARGZ_LEN, entry))
                 ACTION;
 
-     Note that the latter depends on ARGZ having a value of `0' if it
-     is empty (rather than a pointer to an empty block of memory); this
+     Note that the latter depends on ARGZ having a value of '0' if it is
+     empty (rather than a pointer to an empty block of memory); this
      invariant is maintained for argz vectors created by the functions
      here.
 
@@ -4341,7 +5870,7 @@
 
      Replace any occurrences of the string STR in ARGZ with WITH,
      reallocating ARGZ as necessary.  If REPLACE_COUNT is non-zero,
-     `*REPLACE_COUNT' will be incremented by number of replacements
+     '*REPLACE_COUNT' will be incremented by number of replacements
      performed.
 
 
@@ -4355,52 +5884,52 @@
 where it makes sense.
 
    Each element in an envz vector is a name-value pair, separated by a
-`'='' character; if multiple `'='' characters are present in an
-element, those after the first are considered part of the value, and
-treated like all other non-`'\0'' characters.
+''='' character; if multiple ''='' characters are present in an element,
+those after the first are considered part of the value, and treated like
+all other non-''\0'' characters.
 
-   If _no_ `'='' characters are present in an element, that element is
+   If _no_ ''='' characters are present in an element, that element is
 considered the name of a "null" entry, as distinct from an entry with an
-empty value: `envz_get' will return `0' if given the name of null
-entry, whereas an entry with an empty value would result in a value of
-`""'; `envz_entry' will still find such entries, however.  Null entries
-can be removed with `envz_strip' function.
+empty value: 'envz_get' will return '0' if given the name of null entry,
+whereas an entry with an empty value would result in a value of '""';
+'envz_entry' will still find such entries, however.  Null entries can be
+removed with 'envz_strip' function.
 
    As with argz functions, envz functions that may allocate memory (and
-thus fail) have a return type of `error_t', and return either `0' or
-`ENOMEM'.
+thus fail) have a return type of 'error_t', and return either '0' or
+'ENOMEM'.
 
-   These functions are declared in the standard include file `envz.h'.
+   These functions are declared in the standard include file 'envz.h'.
 
  -- Function: char * envz_entry (const char *ENVZ, size_t ENVZ_LEN,
           const char *NAME)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `envz_entry' function finds the entry in ENVZ with the name
+     The 'envz_entry' function finds the entry in ENVZ with the name
      NAME, and returns a pointer to the whole entry--that is, the argz
-     element which begins with NAME followed by a `'='' character.  If
-     there is no entry with that name, `0' is returned.
+     element which begins with NAME followed by a ''='' character.  If
+     there is no entry with that name, '0' is returned.
 
  -- Function: char * envz_get (const char *ENVZ, size_t ENVZ_LEN, const
           char *NAME)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `envz_get' function finds the entry in ENVZ with the name NAME
-     (like `envz_entry'), and returns a pointer to the value portion of
-     that entry (following the `'='').  If there is no entry with that
-     name (or only a null entry), `0' is returned.
+     The 'envz_get' function finds the entry in ENVZ with the name NAME
+     (like 'envz_entry'), and returns a pointer to the value portion of
+     that entry (following the ''='').  If there is no entry with that
+     name (or only a null entry), '0' is returned.
 
  -- Function: error_t envz_add (char **ENVZ, size_t *ENVZ_LEN, const
           char *NAME, const char *VALUE)
      Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
      POSIX Safety Concepts::.
 
-     The `envz_add' function adds an entry to `*ENVZ' (updating `*ENVZ'
-     and `*ENVZ_LEN') with the name NAME, and value VALUE.  If an entry
-     with the same name already exists in ENVZ, it is removed first.
-     If VALUE is `0', then the new entry will the special null type of
+     The 'envz_add' function adds an entry to '*ENVZ' (updating '*ENVZ'
+     and '*ENVZ_LEN') with the name NAME, and value VALUE.  If an entry
+     with the same name already exists in ENVZ, it is removed first.  If
+     VALUE is '0', then the new entry will the special null type of
      entry (mentioned above).
 
  -- Function: error_t envz_merge (char **ENVZ, size_t *ENVZ_LEN, const
@@ -4408,8 +5937,8 @@
      Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
      POSIX Safety Concepts::.
 
-     The `envz_merge' function adds each entry in ENVZ2 to ENVZ, as if
-     with `envz_add', updating `*ENVZ' and `*ENVZ_LEN'.  If OVERRIDE is
+     The 'envz_merge' function adds each entry in ENVZ2 to ENVZ, as if
+     with 'envz_add', updating '*ENVZ' and '*ENVZ_LEN'.  If OVERRIDE is
      true, then values in ENVZ2 will supersede those with the same name
      in ENVZ, otherwise not.
 
@@ -4421,8 +5950,8 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `envz_strip' function removes any null entries from ENVZ,
-     updating `*ENVZ' and `*ENVZ_LEN'.
+     The 'envz_strip' function removes any null entries from ENVZ,
+     updating '*ENVZ' and '*ENVZ_LEN'.
 
 
 File: libc.info,  Node: Character Set Handling,  Next: Locales,  Prev: String and Array Utilities,  Up: Top
@@ -4457,9 +5986,9 @@
 
 A variety of solutions is available to overcome the differences between
 character sets with a 1:1 relation between bytes and characters and
-character sets with ratios of 2:1 or 4:1.  The remainder of this
-section gives a few examples to help understand the design decisions
-made while developing the functionality of the C library.
+character sets with ratios of 2:1 or 4:1.  The remainder of this section
+gives a few examples to help understand the design decisions made while
+developing the functionality of the C library.
 
    A distinction we have to make right away is between internal and
 external representation.  "Internal representation" means the
@@ -4475,9 +6004,9 @@
 level decreases with more and larger character sets.
 
    One of the problems to overcome with the internal representation is
-handling text that is externally encoded using different character
-sets.  Assume a program that reads two texts and compares them using
-some metric.  The comparison can be usefully done only if the texts are
+handling text that is externally encoded using different character sets.
+Assume a program that reads two texts and compares them using some
+metric.  The comparison can be usefully done only if the texts are
 internally kept in a common format.
 
    For such a common format (= character set) eight bits are certainly
@@ -4494,7 +6023,7 @@
 16-bit character set; whereas, ISO 10646 was designed to be a 31-bit
 large code space.  The two standards are practically identical.  They
 have the same character repertoire and code table, but Unicode specifies
-added semantics.  At the moment, only characters in the first `0x10000'
+added semantics.  At the moment, only characters in the first '0x10000'
 code positions (the so-called Basic Multilingual Plane, BMP) have been
 assigned, but the assignment of more specialized characters outside this
 16-bit space is already in progress.  A number of encodings have been
@@ -4505,74 +6034,74 @@
 ASCII bytes and non-ASCII characters by sequences of 2-6 non-ASCII
 bytes, and finally UTF-16 is an extension of UCS-2 in which pairs of
 certain UCS-2 words can be used to encode non-BMP characters up to
-`0x10ffff'.
+'0x10ffff'.
 
-   To represent wide characters the `char' type is not suitable.  For
-this reason the ISO C standard introduces a new type that is designed
-to keep one character of a wide character string.  To maintain the
-similarity there is also a type corresponding to `int' for those
+   To represent wide characters the 'char' type is not suitable.  For
+this reason the ISO C standard introduces a new type that is designed to
+keep one character of a wide character string.  To maintain the
+similarity there is also a type corresponding to 'int' for those
 functions that take a single wide character.
 
  -- Data type: wchar_t
      This data type is used as the base type for wide character strings.
      In other words, arrays of objects of this type are the equivalent
-     of `char[]' for multibyte character strings.  The type is defined
-     in `stddef.h'.
+     of 'char[]' for multibyte character strings.  The type is defined
+     in 'stddef.h'.
 
-     The ISO C90 standard, where `wchar_t' was introduced, does not say
+     The ISO C90 standard, where 'wchar_t' was introduced, does not say
      anything specific about the representation.  It only requires that
-     this type is capable of storing all elements of the basic
-     character set.  Therefore it would be legitimate to define
-     `wchar_t' as `char', which might make sense for embedded systems.
+     this type is capable of storing all elements of the basic character
+     set.  Therefore it would be legitimate to define 'wchar_t' as
+     'char', which might make sense for embedded systems.
 
-     But in the GNU C Library `wchar_t' is always 32 bits wide and,
-     therefore, capable of representing all UCS-4 values and,
-     therefore, covering all of ISO 10646.  Some Unix systems define
-     `wchar_t' as a 16-bit type and thereby follow Unicode very
-     strictly.  This definition is perfectly fine with the standard,
-     but it also means that to represent all characters from Unicode
-     and ISO 10646 one has to use UTF-16 surrogate characters, which is
-     in fact a multi-wide-character encoding.  But resorting to
+     But in the GNU C Library 'wchar_t' is always 32 bits wide and,
+     therefore, capable of representing all UCS-4 values and, therefore,
+     covering all of ISO 10646.  Some Unix systems define 'wchar_t' as a
+     16-bit type and thereby follow Unicode very strictly.  This
+     definition is perfectly fine with the standard, but it also means
+     that to represent all characters from Unicode and ISO 10646 one has
+     to use UTF-16 surrogate characters, which is in fact a
+     multi-wide-character encoding.  But resorting to
      multi-wide-character encoding contradicts the purpose of the
-     `wchar_t' type.
+     'wchar_t' type.
 
  -- Data type: wint_t
-     `wint_t' is a data type used for parameters and variables that
-     contain a single wide character.  As the name suggests this type
-     is the equivalent of `int' when using the normal `char' strings.
-     The types `wchar_t' and `wint_t' often have the same
-     representation if their size is 32 bits wide but if `wchar_t' is
-     defined as `char' the type `wint_t' must be defined as `int' due
-     to the parameter promotion.
+     'wint_t' is a data type used for parameters and variables that
+     contain a single wide character.  As the name suggests this type is
+     the equivalent of 'int' when using the normal 'char' strings.  The
+     types 'wchar_t' and 'wint_t' often have the same representation if
+     their size is 32 bits wide but if 'wchar_t' is defined as 'char'
+     the type 'wint_t' must be defined as 'int' due to the parameter
+     promotion.
 
-     This type is defined in `wchar.h' and was introduced in
-     Amendment 1 to ISO C90.
+     This type is defined in 'wchar.h' and was introduced in Amendment 1
+     to ISO C90.
 
-   As there are for the `char' data type macros are available for
+   As there are for the 'char' data type macros are available for
 specifying the minimum and maximum value representable in an object of
-type `wchar_t'.
+type 'wchar_t'.
 
  -- Macro: wint_t WCHAR_MIN
-     The macro `WCHAR_MIN' evaluates to the minimum value representable
-     by an object of type `wint_t'.
+     The macro 'WCHAR_MIN' evaluates to the minimum value representable
+     by an object of type 'wint_t'.
 
      This macro was introduced in Amendment 1 to ISO C90.
 
  -- Macro: wint_t WCHAR_MAX
-     The macro `WCHAR_MAX' evaluates to the maximum value representable
-     by an object of type `wint_t'.
+     The macro 'WCHAR_MAX' evaluates to the maximum value representable
+     by an object of type 'wint_t'.
 
      This macro was introduced in Amendment 1 to ISO C90.
 
-   Another special wide character value is the equivalent to `EOF'.
+   Another special wide character value is the equivalent to 'EOF'.
 
  -- Macro: wint_t WEOF
-     The macro `WEOF' evaluates to a constant expression of type
-     `wint_t' whose value is different from any member of the extended
+     The macro 'WEOF' evaluates to a constant expression of type
+     'wint_t' whose value is different from any member of the extended
      character set.
 
-     `WEOF' need not be the same value as `EOF' and unlike `EOF' it
-     also need _not_ be negative.  In other words, sloppy code like
+     'WEOF' need not be the same value as 'EOF' and unlike 'EOF' it also
+     need _not_ be negative.  In other words, sloppy code like
 
           {
             int c;
@@ -4581,7 +6110,7 @@
               ...
           }
 
-     has to be rewritten to use `WEOF' explicitly when wide characters
+     has to be rewritten to use 'WEOF' explicitly when wide characters
      are used:
 
           {
@@ -4592,18 +6121,17 @@
           }
 
      This macro was introduced in Amendment 1 to ISO C90 and is defined
-     in `wchar.h'.
+     in 'wchar.h'.
 
    These internal representations present problems when it comes to
-storing and transmittal.  Because each single wide character consists
-of more than one byte, they are affected by byte-ordering.  Thus,
-machines with different endianesses would see different values when
-accessing the same data.  This byte ordering concern also applies for
-communication protocols that are all byte-based and therefore require
-that the sender has to decide about splitting the wide character in
-bytes.  A last (but not least important) point is that wide characters
-often require more storage space than a customized byte-oriented
-character set.
+storing and transmittal.  Because each single wide character consists of
+more than one byte, they are affected by byte-ordering.  Thus, machines
+with different endianesses would see different values when accessing the
+same data.  This byte ordering concern also applies for communication
+protocols that are all byte-based and therefore require that the sender
+has to decide about splitting the wide character in bytes.  A last (but
+not least important) point is that wide characters often require more
+storage space than a customized byte-oriented character set.
 
    For all the above reasons, an external encoding that is different
 from the internal encoding is often used if the latter is UCS-2 or
@@ -4613,7 +6141,7 @@
 encoding (information that will not be exhaustively presented
 here-instead, a description of the major groups will suffice).  All of
 the ASCII-based character sets fulfill one requirement: they are
-"filesystem safe."  This means that the character `'/'' is used in the
+"filesystem safe."  This means that the character ''/'' is used in the
 encoding _only_ to represent itself.  Things are a bit different for
 character sets like EBCDIC (Extended Binary Coded Decimal Interchange
 Code, a character set family used by IBM), but if the operating system
@@ -4622,8 +6150,8 @@
 
    * The simplest character sets are single-byte character sets.  There
      can be only up to 256 characters (for 8 bit character sets), which
-     is not sufficient to cover all languages but might be sufficient
-     to handle a specific text.  Handling of a 8 bit character sets is
+     is not sufficient to cover all languages but might be sufficient to
+     handle a specific text.  Handling of a 8 bit character sets is
      simple.  This is not true for other kinds presented later, and
      therefore, the application one uses might require the use of 8 bit
      character sets.
@@ -4656,10 +6184,10 @@
      Here bytes representing characters like the acute accent do not
      produce output themselves: one has to combine them with other
      characters to get the desired result.  For example, the byte
-     sequence `0xc2 0x61' (non-spacing acute accent, followed by
-     lower-case `a') to get the "small a with  acute" character.  To
-     get the acute accent character on its own, one has to write `0xc2
-     0x20' (the non-spacing acute followed by a space).
+     sequence '0xc2 0x61' (non-spacing acute accent, followed by
+     lower-case 'a') to get the "small a with acute" character.  To get
+     the acute accent character on its own, one has to write '0xc2 0x20'
+     (the non-spacing acute followed by a space).
 
      Character sets like ISO 6937 are used in some embedded systems such
      as teletex.
@@ -4672,41 +6200,41 @@
      to six.
 
      There were a few other attempts to encode ISO 10646 such as UTF-7,
-     but UTF-8 is today the only encoding that should be used.  In
-     fact, with any luck UTF-8 will soon be the only external encoding
-     that has to be supported.  It proves to be universally usable and
-     its only disadvantage is that it favors Roman languages by making
-     the byte string representation of other scripts (Cyrillic, Greek,
-     Asian scripts) longer than necessary if using a specific character
-     set for these scripts.  Methods like the Unicode compression
-     scheme can alleviate these problems.
+     but UTF-8 is today the only encoding that should be used.  In fact,
+     with any luck UTF-8 will soon be the only external encoding that
+     has to be supported.  It proves to be universally usable and its
+     only disadvantage is that it favors Roman languages by making the
+     byte string representation of other scripts (Cyrillic, Greek, Asian
+     scripts) longer than necessary if using a specific character set
+     for these scripts.  Methods like the Unicode compression scheme can
+     alleviate these problems.
 
    The question remaining is: how to select the character set or
-encoding to use.  The answer: you cannot decide about it yourself, it
-is decided by the developers of the system or the majority of the
-users.  Since the goal is interoperability one has to use whatever the
-other people one works with use.  If there are no constraints, the
-selection is based on the requirements the expected circle of users
-will have.  In other words, if a project is expected to be used in
-only, say, Russia it is fine to use KOI8-R or a similar character set.
-But if at the same time people from, say, Greece are participating one
-should use a character set that allows all people to collaborate.
+encoding to use.  The answer: you cannot decide about it yourself, it is
+decided by the developers of the system or the majority of the users.
+Since the goal is interoperability one has to use whatever the other
+people one works with use.  If there are no constraints, the selection
+is based on the requirements the expected circle of users will have.  In
+other words, if a project is expected to be used in only, say, Russia it
+is fine to use KOI8-R or a similar character set.  But if at the same
+time people from, say, Greece are participating one should use a
+character set that allows all people to collaborate.
 
    The most widely useful solution seems to be: go with the most general
-character set, namely ISO 10646.  Use UTF-8 as the external encoding
-and problems about users not being able to use their own language
-adequately are a thing of the past.
+character set, namely ISO 10646.  Use UTF-8 as the external encoding and
+problems about users not being able to use their own language adequately
+are a thing of the past.
 
    One final comment about the choice of the wide character
 representation is necessary at this point.  We have said above that the
-natural choice is using Unicode or ISO 10646.  This is not required,
-but at least encouraged, by the ISO C standard.  The standard defines
-at least a macro `__STDC_ISO_10646__' that is only defined on systems
-where the `wchar_t' type encodes ISO 10646 characters.  If this symbol
-is not defined one should avoid making assumptions about the wide
-character representation.  If the programmer uses only the functions
-provided by the C library to handle wide character strings there should
-be no compatibility problems with other systems.
+natural choice is using Unicode or ISO 10646.  This is not required, but
+at least encouraged, by the ISO C standard.  The standard defines at
+least a macro '__STDC_ISO_10646__' that is only defined on systems where
+the 'wchar_t' type encodes ISO 10646 characters.  If this symbol is not
+defined one should avoid making assumptions about the wide character
+representation.  If the programmer uses only the functions provided by
+the C library to handle wide character strings there should be no
+compatibility problems with other systems.
 
 
 File: libc.info,  Node: Charset Function Overview,  Next: Restartable multibyte conversion,  Prev: Extended Char Intro,  Up: Character Set Handling
@@ -4734,31 +6262,31 @@
 6.3 Restartable Multibyte Conversion Functions
 ==============================================
 
-The ISO C standard defines functions to convert strings from a
-multibyte representation to wide character strings.  There are a number
-of peculiarities:
+The ISO C standard defines functions to convert strings from a multibyte
+representation to wide character strings.  There are a number of
+peculiarities:
 
    * The character set assumed for the multibyte encoding is not
      specified as an argument to the functions.  Instead the character
-     set specified by the `LC_CTYPE' category of the current locale is
+     set specified by the 'LC_CTYPE' category of the current locale is
      used; see *note Locale Categories::.
 
    * The functions handling more than one character at a time require
      NUL terminated strings as the argument (i.e., converting blocks of
      text does not work unless one can add a NUL byte at an appropriate
-     place).  The GNU C Library contains some extensions to the
-     standard that allow specifying a size, but basically they also
-     expect terminated strings.
+     place).  The GNU C Library contains some extensions to the standard
+     that allow specifying a size, but basically they also expect
+     terminated strings.
 
    Despite these limitations the ISO C functions can be used in many
 contexts.  In graphical user interfaces, for instance, it is not
 uncommon to have functions that require text to be displayed in a wide
-character string if the text is not simple ASCII.  The text itself might
+character string if the text is not simple ASCII. The text itself might
 come from a file with translations and the user should decide about the
 current locale, which determines the translation and therefore also the
 external encoding used.  In such a situation (and many others) the
 functions described here are perfect.  If more freedom while performing
-the conversion is necessary take a look at the `iconv' functions (*note
+the conversion is necessary take a look at the 'iconv' functions (*note
 Generic Charset Conversion::).
 
 * Menu:
@@ -4777,9 +6305,9 @@
 -------------------------------------------------
 
 We already said above that the currently selected locale for the
-`LC_CTYPE' category decides about the conversion that is performed by
+'LC_CTYPE' category decides about the conversion that is performed by
 the functions we are about to describe.  Each locale uses its own
-character set (given as an argument to `localedef') and this is the one
+character set (given as an argument to 'localedef') and this is the one
 assumed as the external multibyte encoding.  The wide character set is
 always UCS-4 in the GNU C Library.
 
@@ -4790,18 +6318,18 @@
 standard defines two macros that provide this information.
 
  -- Macro: int MB_LEN_MAX
-     `MB_LEN_MAX' specifies the maximum number of bytes in the multibyte
+     'MB_LEN_MAX' specifies the maximum number of bytes in the multibyte
      sequence for a single character in any of the supported locales.
-     It is a compile-time constant and is defined in `limits.h'.  
+     It is a compile-time constant and is defined in 'limits.h'.
 
  -- Macro: int MB_CUR_MAX
-     `MB_CUR_MAX' expands into a positive integer expression that is the
+     'MB_CUR_MAX' expands into a positive integer expression that is the
      maximum number of bytes in a multibyte character in the current
-     locale.  The value is never greater than `MB_LEN_MAX'.  Unlike
-     `MB_LEN_MAX' this macro need not be a compile-time constant, and in
+     locale.  The value is never greater than 'MB_LEN_MAX'.  Unlike
+     'MB_LEN_MAX' this macro need not be a compile-time constant, and in
      the GNU C Library it is not.
 
-     `MB_CUR_MAX' is defined in `stdlib.h'.
+     'MB_CUR_MAX' is defined in 'stdlib.h'.
 
    Two different macros are necessary since strictly ISO C90 compilers
 do not allow variable length array definitions, but still it is
@@ -4823,9 +6351,9 @@
    The code in the inner loop is expected to have always enough bytes in
 the array BUF to convert one multibyte character.  The array BUF has to
 be sized statically since many compilers do not allow a variable size.
-The `fread' call makes sure that `MB_CUR_MAX' bytes are always
-available in BUF.  Note that it isn't a problem if `MB_CUR_MAX' is not
-a compile-time constant.
+The 'fread' call makes sure that 'MB_CUR_MAX' bytes are always available
+in BUF.  Note that it isn't a problem if 'MB_CUR_MAX' is not a
+compile-time constant.
 
 
 File: libc.info,  Node: Keeping the state,  Next: Converting a Character,  Prev: Selecting the Conversion,  Up: Restartable multibyte conversion
@@ -4842,18 +6370,18 @@
 the functions to another.
 
  -- Data type: mbstate_t
-     A variable of type `mbstate_t' can contain all the information
+     A variable of type 'mbstate_t' can contain all the information
      about the "shift state" needed from one call to a conversion
      function to another.
 
-     `mbstate_t' is defined in `wchar.h'.  It was introduced in
-     Amendment 1 to ISO C90.
+     'mbstate_t' is defined in 'wchar.h'.  It was introduced in Amendment 1
+     to ISO C90.
 
-   To use objects of type `mbstate_t' the programmer has to define such
+   To use objects of type 'mbstate_t' the programmer has to define such
 objects (normally as local variables on the stack) and pass a pointer to
 the object to the conversion functions.  This way the conversion
-function can update the object if the current multibyte character set
-is stateful.
+function can update the object if the current multibyte character set is
+stateful.
 
    There is no specific function or initializer to put the state object
 in any specific state.  The rules are that the object should always
@@ -4869,23 +6397,23 @@
 
    When using the conversion functions to generate output it is often
 necessary to test whether the current state corresponds to the initial
-state.  This is necessary, for example, to decide whether to emit
-escape sequences to set the state to the initial state at certain
-sequence points.  Communication protocols often require this.
+state.  This is necessary, for example, to decide whether to emit escape
+sequences to set the state to the initial state at certain sequence
+points.  Communication protocols often require this.
 
  -- Function: int mbsinit (const mbstate_t *PS)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `mbsinit' function determines whether the state object pointed
+     The 'mbsinit' function determines whether the state object pointed
      to by PS is in the initial state.  If PS is a null pointer or the
      object is in the initial state the return value is nonzero.
      Otherwise it is zero.
 
-     `mbsinit' was introduced in Amendment 1 to ISO C90 and is declared
-     in `wchar.h'.
+     'mbsinit' was introduced in Amendment 1 to ISO C90 and is declared
+     in 'wchar.h'.
 
-   Code using `mbsinit' often looks similar to this:
+   Code using 'mbsinit' often looks similar to this:
 
      {
        mbstate_t state;
@@ -4902,14 +6430,14 @@
        ...
      }
 
-   The code to emit the escape sequence to get back to the initial
-state is interesting.  The `wcsrtombs' function can be used to
-determine the necessary output code (*note Converting Strings::).
-Please note that with the GNU C Library it is not necessary to perform
-this extra action for the conversion from multibyte text to wide
-character text since the wide character encoding is not stateful.  But
-there is nothing mentioned in any standard that prohibits making
-`wchar_t' using a stateful encoding.
+   The code to emit the escape sequence to get back to the initial state
+is interesting.  The 'wcsrtombs' function can be used to determine the
+necessary output code (*note Converting Strings::).  Please note that
+with the GNU C Library it is not necessary to perform this extra action
+for the conversion from multibyte text to wide character text since the
+wide character encoding is not stateful.  But there is nothing mentioned
+in any standard that prohibits making 'wchar_t' using a stateful
+encoding.
 
 
 File: libc.info,  Node: Converting a Character,  Next: Converting Strings,  Prev: Keeping the state,  Up: Restartable multibyte conversion
@@ -4930,26 +6458,26 @@
      Preliminary: | MT-Safe | AS-Unsafe corrupt heap lock dlopen |
      AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
 
-     The `btowc' function ("byte to wide character") converts a valid
+     The 'btowc' function ("byte to wide character") converts a valid
      single byte character C in the initial shift state into the wide
      character equivalent using the conversion rules from the currently
-     selected locale of the `LC_CTYPE' category.
+     selected locale of the 'LC_CTYPE' category.
 
-     If `(unsigned char) C' is no valid single byte multibyte character
-     or if C is `EOF', the function returns `WEOF'.
+     If '(unsigned char) C' is no valid single byte multibyte character
+     or if C is 'EOF', the function returns 'WEOF'.
 
      Please note the restriction of C being tested for validity only in
-     the initial shift state.  No `mbstate_t' object is used from which
+     the initial shift state.  No 'mbstate_t' object is used from which
      the state information is taken, and the function also does not use
      any static state.
 
-     The `btowc' function was introduced in Amendment 1 to ISO C90 and
-     is declared in `wchar.h'.
+     The 'btowc' function was introduced in Amendment 1 to ISO C90 and
+     is declared in 'wchar.h'.
 
    Despite the limitation that the single byte value is always
 interpreted in the initial state, this function is actually useful most
 of the time.  Most characters are either entirely single-byte character
-sets or they are extension to ASCII.  But then it is possible to write
+sets or they are extension to ASCII. But then it is possible to write
 code like this (not that this specific example is very useful):
 
      wchar_t *
@@ -4969,12 +6497,12 @@
      }
 
    Why is it necessary to use such a complicated implementation and not
-simply cast `'0' + val % 10' to a wide character?  The answer is that
+simply cast ''0' + val % 10' to a wide character?  The answer is that
 there is no guarantee that one can perform this kind of arithmetic on
-the character of the character set used for `wchar_t' representation.
+the character of the character set used for 'wchar_t' representation.
 In other situations the bytes are not constant at compile time and so
-the compiler cannot do the work.  In situations like this, using
-`btowc' is required.
+the compiler cannot do the work.  In situations like this, using 'btowc'
+is required.
 
 There is also a function for the conversion in the other direction.
 
@@ -4982,14 +6510,14 @@
      Preliminary: | MT-Safe | AS-Unsafe corrupt heap lock dlopen |
      AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
 
-     The `wctob' function ("wide character to byte") takes as the
+     The 'wctob' function ("wide character to byte") takes as the
      parameter a valid wide character.  If the multibyte representation
      for this character in the initial state is exactly one byte long,
-     the return value of this function is this character.  Otherwise
-     the return value is `EOF'.
+     the return value of this function is this character.  Otherwise the
+     return value is 'EOF'.
 
-     `wctob' was introduced in Amendment 1 to ISO C90 and is declared
-     in `wchar.h'.
+     'wctob' was introduced in Amendment 1 to ISO C90 and is declared in
+     'wchar.h'.
 
    There are more general functions to convert single character from
 multibyte representation to wide characters and vice versa.  These
@@ -5002,16 +6530,16 @@
      lock dlopen | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety
      Concepts::.
 
-     The `mbrtowc' function ("multibyte restartable to wide character")
-     converts the next multibyte character in the string pointed to by
-     S into a wide character and stores it in the wide character string
+     The 'mbrtowc' function ("multibyte restartable to wide character")
+     converts the next multibyte character in the string pointed to by S
+     into a wide character and stores it in the wide character string
      pointed to by PWC.  The conversion is performed according to the
-     locale currently selected for the `LC_CTYPE' category.  If the
+     locale currently selected for the 'LC_CTYPE' category.  If the
      conversion for the character set used in the locale requires a
-     state, the multibyte string is interpreted in the state
-     represented by the object pointed to by PS.  If PS is a null
-     pointer, a static, internal state variable used only by the
-     `mbrtowc' function is used.
+     state, the multibyte string is interpreted in the state represented
+     by the object pointed to by PS.  If PS is a null pointer, a static,
+     internal state variable used only by the 'mbrtowc' function is
+     used.
 
      If the next multibyte character corresponds to the NUL wide
      character, the return value of the function is 0 and the state
@@ -5020,26 +6548,26 @@
      number of bytes starting from S that form the multibyte character.
      The conversion state is updated according to the bytes consumed in
      the conversion.  In both cases the wide character (either the
-     `L'\0'' or the one found in the conversion) is stored in the
-     string pointed to by PWC if PWC is not null.
+     'L'\0'' or the one found in the conversion) is stored in the string
+     pointed to by PWC if PWC is not null.
 
      If the first N bytes of the multibyte string possibly form a valid
      multibyte character but there are more than N bytes needed to
-     complete it, the return value of the function is `(size_t) -2' and
-     no value is stored.  Please note that this can happen even if N
-     has a value greater than or equal to `MB_CUR_MAX' since the input
-     might contain redundant shift sequences.
+     complete it, the return value of the function is '(size_t) -2' and
+     no value is stored.  Please note that this can happen even if N has
+     a value greater than or equal to 'MB_CUR_MAX' since the input might
+     contain redundant shift sequences.
 
-     If the first `n' bytes of the multibyte string cannot possibly form
+     If the first 'n' bytes of the multibyte string cannot possibly form
      a valid multibyte character, no value is stored, the global
-     variable `errno' is set to the value `EILSEQ', and the function
-     returns `(size_t) -1'.  The conversion state is afterwards
+     variable 'errno' is set to the value 'EILSEQ', and the function
+     returns '(size_t) -1'.  The conversion state is afterwards
      undefined.
 
-     `mbrtowc' was introduced in Amendment 1 to ISO C90 and is declared
-     in `wchar.h'.
+     'mbrtowc' was introduced in Amendment 1 to ISO C90 and is declared
+     in 'wchar.h'.
 
-   Use of `mbrtowc' is straightforward.  A function that copies a
+   Use of 'mbrtowc' is straightforward.  A function that copies a
 multibyte string into a wide character string while at the same time
 converting all lowercase characters into uppercase could look like this
 (this is not the final version, just an example; it has no error
@@ -5068,37 +6596,35 @@
        return result;
      }
 
-   The use of `mbrtowc' should be clear.  A single wide character is
-stored in `TMP[0]', and the number of consumed bytes is stored in the
-variable NBYTES.  If the conversion is successful, the uppercase
-variant of the wide character is stored in the RESULT array and the
-pointer to the input string and the number of available bytes is
-adjusted.
+   The use of 'mbrtowc' should be clear.  A single wide character is
+stored in 'TMP[0]', and the number of consumed bytes is stored in the
+variable NBYTES.  If the conversion is successful, the uppercase variant
+of the wide character is stored in the RESULT array and the pointer to
+the input string and the number of available bytes is adjusted.
 
-   The only non-obvious thing about `mbrtowc' might be the way memory
-is allocated for the result.  The above code uses the fact that there
-can never be more wide characters in the converted results than there
-are bytes in the multibyte input string.  This method yields a
-pessimistic guess about the size of the result, and if many wide
-character strings have to be constructed this way or if the strings are
-long, the extra memory required to be allocated because the input
-string contains multibyte characters might be significant.  The
-allocated memory block can be resized to the correct size before
-returning it, but a better solution might be to allocate just the right
-amount of space for the result right away.  Unfortunately there is no
-function to compute the length of the wide character string directly
-from the multibyte string.  There is, however, a function that does
-part of the work.
+   The only non-obvious thing about 'mbrtowc' might be the way memory is
+allocated for the result.  The above code uses the fact that there can
+never be more wide characters in the converted results than there are
+bytes in the multibyte input string.  This method yields a pessimistic
+guess about the size of the result, and if many wide character strings
+have to be constructed this way or if the strings are long, the extra
+memory required to be allocated because the input string contains
+multibyte characters might be significant.  The allocated memory block
+can be resized to the correct size before returning it, but a better
+solution might be to allocate just the right amount of space for the
+result right away.  Unfortunately there is no function to compute the
+length of the wide character string directly from the multibyte string.
+There is, however, a function that does part of the work.
 
- -- Function: size_t mbrlen (const char *restrict S, size_t N,
-          mbstate_t *PS)
+ -- Function: size_t mbrlen (const char *restrict S, size_t N, mbstate_t
+          *PS)
      Preliminary: | MT-Unsafe race:mbrlen/!ps | AS-Unsafe corrupt heap
      lock dlopen | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety
      Concepts::.
 
-     The `mbrlen' function ("multibyte restartable length") computes
-     the number of at most N bytes starting at S, which form the next
-     valid and complete multibyte character.
+     The 'mbrlen' function ("multibyte restartable length") computes the
+     number of at most N bytes starting at S, which form the next valid
+     and complete multibyte character.
 
      If the next multibyte character corresponds to the NUL wide
      character, the return value is 0.  If the next N bytes form a valid
@@ -5106,18 +6632,18 @@
      multibyte character byte sequence is returned.
 
      If the first N bytes possibly form a valid multibyte character but
-     the character is incomplete, the return value is `(size_t) -2'.
+     the character is incomplete, the return value is '(size_t) -2'.
      Otherwise the multibyte character sequence is invalid and the
-     return value is `(size_t) -1'.
+     return value is '(size_t) -1'.
 
      The multibyte sequence is interpreted in the state represented by
      the object pointed to by PS.  If PS is a null pointer, a state
-     object local to `mbrlen' is used.
+     object local to 'mbrlen' is used.
 
-     `mbrlen' was introduced in Amendment 1 to ISO C90 and is declared
-     in `wchar.h'.
+     'mbrlen' was introduced in Amendment 1 to ISO C90 and is declared
+     in 'wchar.h'.
 
-   The attentive reader now will note that `mbrlen' can be implemented
+   The attentive reader now will note that 'mbrlen' can be implemented
 as
 
      mbrtowc (NULL, s, n, ps != NULL ? ps : &internal)
@@ -5125,7 +6651,7 @@
    This is true and in fact is mentioned in the official specification.
 How can this function be used to determine the length of the wide
 character string created from a multibyte character string?  It is not
-directly usable, but we can define a function `mbslen' using it:
+directly usable, but we can define a function 'mbslen' using it:
 
      size_t
      mbslen (const char *s)
@@ -5145,14 +6671,14 @@
        return result;
      }
 
-   This function simply calls `mbrlen' for each multibyte character in
-the string and counts the number of function calls.  Please note that
-we here use `MB_LEN_MAX' as the size argument in the `mbrlen' call.
-This is acceptable since a) this value is larger than the length of the
+   This function simply calls 'mbrlen' for each multibyte character in
+the string and counts the number of function calls.  Please note that we
+here use 'MB_LEN_MAX' as the size argument in the 'mbrlen' call.  This
+is acceptable since a) this value is larger than the length of the
 longest multibyte character sequence and b) we know that the string S
 ends with a NUL byte, which cannot be part of any other multibyte
 character sequence but the one representing the NUL wide character.
-Therefore, the `mbrlen' function will never read invalid memory.
+Therefore, the 'mbrlen' function will never read invalid memory.
 
    Now that this function is available (just to make this clear, this
 function is _not_ part of the GNU C Library) we can compute the number
@@ -5161,8 +6687,8 @@
 
      wcs_bytes = (mbslen (s) + 1) * sizeof (wchar_t);
 
-   Please note that the `mbslen' function is quite inefficient.  The
-implementation of `mbstouwcs' with `mbslen' would have to perform the
+   Please note that the 'mbslen' function is quite inefficient.  The
+implementation of 'mbstouwcs' with 'mbslen' would have to perform the
 conversion of the multibyte character input string twice, and this
 conversion might be quite expensive.  So it is necessary to think about
 the consequences of using the easier but imprecise method before doing
@@ -5174,49 +6700,48 @@
      lock dlopen | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety
      Concepts::.
 
-     The `wcrtomb' function ("wide character restartable to multibyte")
+     The 'wcrtomb' function ("wide character restartable to multibyte")
      converts a single wide character into a multibyte string
      corresponding to that wide character.
 
-     If S is a null pointer, the function resets the state stored in
-     the objects pointed to by PS (or the internal `mbstate_t' object)
-     to the initial state.  This can also be achieved by a call like
-     this:
+     If S is a null pointer, the function resets the state stored in the
+     objects pointed to by PS (or the internal 'mbstate_t' object) to
+     the initial state.  This can also be achieved by a call like this:
 
           wcrtombs (temp_buf, L'\0', ps)
 
-     since, if S is a null pointer, `wcrtomb' performs as if it writes
+     since, if S is a null pointer, 'wcrtomb' performs as if it writes
      into an internal buffer, which is guaranteed to be large enough.
 
-     If WC is the NUL wide character, `wcrtomb' emits, if necessary, a
+     If WC is the NUL wide character, 'wcrtomb' emits, if necessary, a
      shift sequence to get the state PS into the initial state followed
      by a single NUL byte, which is stored in the string S.
 
      Otherwise a byte sequence (possibly including shift sequences) is
      written into the string S.  This only happens if WC is a valid wide
-     character (i.e., it has a multibyte representation in the
-     character set selected by locale of the `LC_CTYPE' category).  If
-     WC is no valid wide character, nothing is stored in the strings S,
-     `errno' is set to `EILSEQ', the conversion state in PS is
-     undefined and the return value is `(size_t) -1'.
+     character (i.e., it has a multibyte representation in the character
+     set selected by locale of the 'LC_CTYPE' category).  If WC is no
+     valid wide character, nothing is stored in the strings S, 'errno'
+     is set to 'EILSEQ', the conversion state in PS is undefined and the
+     return value is '(size_t) -1'.
 
      If no error occurred the function returns the number of bytes
      stored in the string S.  This includes all bytes representing shift
      sequences.
 
      One word about the interface of the function: there is no parameter
-     specifying the length of the array S.  Instead the function
-     assumes that there are at least `MB_CUR_MAX' bytes available since
-     this is the maximum length of any byte sequence representing a
-     single character.  So the caller has to make sure that there is
-     enough space available, otherwise buffer overruns can occur.
+     specifying the length of the array S.  Instead the function assumes
+     that there are at least 'MB_CUR_MAX' bytes available since this is
+     the maximum length of any byte sequence representing a single
+     character.  So the caller has to make sure that there is enough
+     space available, otherwise buffer overruns can occur.
 
-     `wcrtomb' was introduced in Amendment 1 to ISO C90 and is declared
-     in `wchar.h'.
+     'wcrtomb' was introduced in Amendment 1 to ISO C90 and is declared
+     in 'wchar.h'.
 
-   Using `wcrtomb' is as easy as using `mbrtowc'.  The following
-example appends a wide character string to a multibyte character string.
-Again, the code is not really useful (or correct), it is simply here to
+   Using 'wcrtomb' is as easy as using 'mbrtowc'.  The following example
+appends a wide character string to a multibyte character string.  Again,
+the code is not really useful (or correct), it is simply here to
 demonstrate the use and some problems.
 
      char *
@@ -5250,20 +6775,19 @@
      }
 
    First the function has to find the end of the string currently in the
-array S.  The `strchr' call does this very efficiently since a
+array S.  The 'strchr' call does this very efficiently since a
 requirement for multibyte character representations is that the NUL byte
 is never used except to represent itself (and in this context, the end
 of the string).
 
    After initializing the state object the loop is entered where the
 first task is to make sure there is enough room in the array S.  We
-abort if there are not at least `MB_CUR_LEN' bytes available.  This is
-not always optimal but we have no other choice.  We might have less
-than `MB_CUR_LEN' bytes available but the next multibyte character
-might also be only one byte long.  At the time the `wcrtomb' call
-returns it is too late to decide whether the buffer was large enough.
-If this solution is unsuitable, there is a very slow but more accurate
-solution.
+abort if there are not at least 'MB_CUR_LEN' bytes available.  This is
+not always optimal but we have no other choice.  We might have less than
+'MB_CUR_LEN' bytes available but the next multibyte character might also
+be only one byte long.  At the time the 'wcrtomb' call returns it is too
+late to decide whether the buffer was large enough.  If this solution is
+unsuitable, there is a very slow but more accurate solution.
 
        ...
        if (len < MB_CUR_LEN)
@@ -5283,14 +6807,14 @@
 
    Here we perform the conversion that might overflow the buffer so that
 we are afterwards in the position to make an exact decision about the
-buffer size.  Please note the `NULL' argument for the destination
-buffer in the new `wcrtomb' call; since we are not interested in the
-converted text at this point, this is a nice way to express this.  The
-most unusual thing about this piece of code certainly is the duplication
-of the conversion state object, but if a change of the state is
-necessary to emit the next multibyte character, we want to have the
-same shift state change performed in the real conversion.  Therefore,
-we have to preserve the initial shift state information.
+buffer size.  Please note the 'NULL' argument for the destination buffer
+in the new 'wcrtomb' call; since we are not interested in the converted
+text at this point, this is a nice way to express this.  The most
+unusual thing about this piece of code certainly is the duplication of
+the conversion state object, but if a change of the state is necessary
+to emit the next multibyte character, we want to have the same shift
+state change performed in the real conversion.  Therefore, we have to
+preserve the initial shift state information.
 
    There are certainly many more and even better solutions to this
 problem.  This example is only provided for educational purposes.
@@ -5304,9 +6828,9 @@
 The functions described in the previous section only convert a single
 character at a time.  Most operations to be performed in real-world
 programs include strings and therefore the ISO C standard also defines
-conversions on entire strings.  However, the defined set of functions
-is quite limited; therefore, the GNU C Library contains a few
-extensions that can help in some important situations.
+conversions on entire strings.  However, the defined set of functions is
+quite limited; therefore, the GNU C Library contains a few extensions
+that can help in some important situations.
 
  -- Function: size_t mbsrtowcs (wchar_t *restrict DST, const char
           **restrict SRC, size_t LEN, mbstate_t *restrict PS)
@@ -5314,12 +6838,12 @@
      heap lock dlopen | AC-Unsafe corrupt lock mem fd | *Note POSIX
      Safety Concepts::.
 
-     The `mbsrtowcs' function ("multibyte string restartable to wide
+     The 'mbsrtowcs' function ("multibyte string restartable to wide
      character string") converts a NUL-terminated multibyte character
-     string at `*SRC' into an equivalent wide character string,
+     string at '*SRC' into an equivalent wide character string,
      including the NUL wide character at the end.  The conversion is
      started using the state information from the object pointed to by
-     PS or from an internal object of `mbsrtowcs' if PS is a null
+     PS or from an internal object of 'mbsrtowcs' if PS is a null
      pointer.  Before returning, the state object is updated to match
      the state after the last converted character.  The state is the
      initial state if the terminating NUL byte is reached and converted.
@@ -5334,59 +6858,59 @@
 
      Another reason for a premature return from the function call is if
      the input string contains an invalid multibyte sequence.  In this
-     case the global variable `errno' is set to `EILSEQ' and the
-     function returns `(size_t) -1'.
+     case the global variable 'errno' is set to 'EILSEQ' and the
+     function returns '(size_t) -1'.
 
      In all other cases the function returns the number of wide
      characters converted during this call.  If DST is not null,
-     `mbsrtowcs' stores in the pointer pointed to by SRC either a null
+     'mbsrtowcs' stores in the pointer pointed to by SRC either a null
      pointer (if the NUL byte in the input string was reached) or the
      address of the byte following the last converted multibyte
      character.
 
-     `mbsrtowcs' was introduced in Amendment 1 to ISO C90 and is
-     declared in `wchar.h'.
+     'mbsrtowcs' was introduced in Amendment 1 to ISO C90 and is
+     declared in 'wchar.h'.
 
-   The definition of the `mbsrtowcs' function has one important
+   The definition of the 'mbsrtowcs' function has one important
 limitation.  The requirement that DST has to be a NUL-terminated string
 provides problems if one wants to convert buffers with text.  A buffer
 is normally no collection of NUL-terminated strings but instead a
 continuous collection of lines, separated by newline characters.  Now
 assume that a function to convert one line from a buffer is needed.
-Since the line is not NUL-terminated, the source pointer cannot
-directly point into the unmodified text buffer.  This means, either one
-inserts the NUL byte at the appropriate place for the time of the
-`mbsrtowcs' function call (which is not doable for a read-only buffer
-or in a multi-threaded application) or one copies the line in an extra
-buffer where it can be terminated by a NUL byte.  Note that it is not
-in general possible to limit the number of characters to convert by
-setting the parameter LEN to any specific value.  Since it is not known
-how many bytes each multibyte character sequence is in length, one can
-only guess.
+Since the line is not NUL-terminated, the source pointer cannot directly
+point into the unmodified text buffer.  This means, either one inserts
+the NUL byte at the appropriate place for the time of the 'mbsrtowcs'
+function call (which is not doable for a read-only buffer or in a
+multi-threaded application) or one copies the line in an extra buffer
+where it can be terminated by a NUL byte.  Note that it is not in
+general possible to limit the number of characters to convert by setting
+the parameter LEN to any specific value.  Since it is not known how many
+bytes each multibyte character sequence is in length, one can only
+guess.
 
    There is still a problem with the method of NUL-terminating a line
 right after the newline character, which could lead to very strange
-results.  As said in the description of the `mbsrtowcs' function above
+results.  As said in the description of the 'mbsrtowcs' function above
 the conversion state is guaranteed to be in the initial shift state
 after processing the NUL byte at the end of the input string.  But this
 NUL byte is not really part of the text (i.e., the conversion state
-after the newline in the original text could be something different
-than the initial shift state and therefore the first character of the
-next line is encoded using this state).  But the state in question is
-never accessible to the user since the conversion stops after the NUL
-byte (which resets the state).  Most stateful character sets in use
-today require that the shift state after a newline be the initial
-state-but this is not a strict guarantee.  Therefore, simply
-NUL-terminating a piece of a running text is not always an adequate
-solution and, therefore, should never be used in generally used code.
+after the newline in the original text could be something different than
+the initial shift state and therefore the first character of the next
+line is encoded using this state).  But the state in question is never
+accessible to the user since the conversion stops after the NUL byte
+(which resets the state).  Most stateful character sets in use today
+require that the shift state after a newline be the initial state-but
+this is not a strict guarantee.  Therefore, simply NUL-terminating a
+piece of a running text is not always an adequate solution and,
+therefore, should never be used in generally used code.
 
    The generic conversion interface (*note Generic Charset Conversion::)
-does not have this limitation (it simply works on buffers, not
-strings), and the GNU C Library contains a set of functions that take
-additional parameters specifying the maximal number of bytes that are
-consumed from the input string.  This way the problem of `mbsrtowcs''s
-example above could be solved by determining the line length and
-passing this length to the function.
+does not have this limitation (it simply works on buffers, not strings),
+and the GNU C Library contains a set of functions that take additional
+parameters specifying the maximal number of bytes that are consumed from
+the input string.  This way the problem of 'mbsrtowcs''s example above
+could be solved by determining the line length and passing this length
+to the function.
 
  -- Function: size_t wcsrtombs (char *restrict DST, const wchar_t
           **restrict SRC, size_t LEN, mbstate_t *restrict PS)
@@ -5394,13 +6918,13 @@
      heap lock dlopen | AC-Unsafe corrupt lock mem fd | *Note POSIX
      Safety Concepts::.
 
-     The `wcsrtombs' function ("wide character string restartable to
+     The 'wcsrtombs' function ("wide character string restartable to
      multibyte string") converts the NUL-terminated wide character
-     string at `*SRC' into an equivalent multibyte character string and
+     string at '*SRC' into an equivalent multibyte character string and
      stores the result in the array pointed to by DST.  The NUL wide
      character is also converted.  The conversion starts in the state
      described in the object pointed to by PS or by a state object
-     locally to `wcsrtombs' in case PS is a null pointer.  If DST is a
+     locally to 'wcsrtombs' in case PS is a null pointer.  If DST is a
      null pointer, the conversion is performed as usual but the result
      is not available.  If all characters of the input string were
      successfully converted and if DST is not a null pointer, the
@@ -5408,31 +6932,31 @@
 
      If one of the wide characters in the input string has no valid
      multibyte character equivalent, the conversion stops early, sets
-     the global variable `errno' to `EILSEQ', and returns `(size_t) -1'.
+     the global variable 'errno' to 'EILSEQ', and returns '(size_t) -1'.
 
-     Another reason for a premature stop is if DST is not a null
-     pointer and the next converted character would require more than
-     LEN bytes in total to the array DST.  In this case (and if DEST is
-     not a null pointer) the pointer pointed to by SRC is assigned a
-     value pointing to the wide character right after the last one
-     successfully converted.
+     Another reason for a premature stop is if DST is not a null pointer
+     and the next converted character would require more than LEN bytes
+     in total to the array DST.  In this case (and if DEST is not a null
+     pointer) the pointer pointed to by SRC is assigned a value pointing
+     to the wide character right after the last one successfully
+     converted.
 
      Except in the case of an encoding error the return value of the
-     `wcsrtombs' function is the number of bytes in all the multibyte
+     'wcsrtombs' function is the number of bytes in all the multibyte
      character sequences stored in DST.  Before returning the state in
-     the object pointed to by PS (or the internal object in case PS is
-     a null pointer) is updated to reflect the state after the last
+     the object pointed to by PS (or the internal object in case PS is a
+     null pointer) is updated to reflect the state after the last
      conversion.  The state is the initial shift state in case the
      terminating NUL wide character was converted.
 
-     The `wcsrtombs' function was introduced in Amendment 1 to ISO C90
-     and is declared in `wchar.h'.
+     The 'wcsrtombs' function was introduced in Amendment 1 to ISO C90
+     and is declared in 'wchar.h'.
 
-   The restriction mentioned above for the `mbsrtowcs' function applies
+   The restriction mentioned above for the 'mbsrtowcs' function applies
 here also.  There is no possibility of directly controlling the number
 of input characters.  One has to place the NUL wide character at the
-correct place or control the consumed input indirectly via the
-available output array size (the LEN parameter).
+correct place or control the consumed input indirectly via the available
+output array size (the LEN parameter).
 
  -- Function: size_t mbsnrtowcs (wchar_t *restrict DST, const char
           **restrict SRC, size_t NMC, size_t LEN, mbstate_t *restrict
@@ -5441,15 +6965,15 @@
      heap lock dlopen | AC-Unsafe corrupt lock mem fd | *Note POSIX
      Safety Concepts::.
 
-     The `mbsnrtowcs' function is very similar to the `mbsrtowcs'
+     The 'mbsnrtowcs' function is very similar to the 'mbsrtowcs'
      function.  All the parameters are the same except for NMC, which is
-     new.  The return value is the same as for `mbsrtowcs'.
+     new.  The return value is the same as for 'mbsrtowcs'.
 
      This new parameter specifies how many bytes at most can be used
-     from the multibyte character string.  In other words, the
-     multibyte character string `*SRC' need not be NUL-terminated.  But
-     if a NUL byte is found within the NMC first bytes of the string,
-     the conversion stops here.
+     from the multibyte character string.  In other words, the multibyte
+     character string '*SRC' need not be NUL-terminated.  But if a NUL
+     byte is found within the NMC first bytes of the string, the
+     conversion stops here.
 
      This function is a GNU extension.  It is meant to work around the
      problems mentioned above.  Now it is possible to convert a buffer
@@ -5483,10 +7007,10 @@
          }
      }
 
-   There is no problem with the state after a call to `mbsnrtowcs'.
+   There is no problem with the state after a call to 'mbsnrtowcs'.
 Since we don't insert characters in the strings that were not in there
-right from the beginning and we use STATE only for the conversion of
-the given buffer, there is no problem with altering the state.
+right from the beginning and we use STATE only for the conversion of the
+given buffer, there is no problem with altering the state.
 
  -- Function: size_t wcsnrtombs (char *restrict DST, const wchar_t
           **restrict SRC, size_t NWC, size_t LEN, mbstate_t *restrict
@@ -5495,17 +7019,17 @@
      heap lock dlopen | AC-Unsafe corrupt lock mem fd | *Note POSIX
      Safety Concepts::.
 
-     The `wcsnrtombs' function implements the conversion from wide
+     The 'wcsnrtombs' function implements the conversion from wide
      character strings to multibyte character strings.  It is similar to
-     `wcsrtombs' but, just like `mbsnrtowcs', it takes an extra
+     'wcsrtombs' but, just like 'mbsnrtowcs', it takes an extra
      parameter, which specifies the length of the input string.
 
-     No more than NWC wide characters from the input string `*SRC' are
+     No more than NWC wide characters from the input string '*SRC' are
      converted.  If the input string contains a NUL wide character in
      the first NWC characters, the conversion stops at this place.
 
-     The `wcsnrtombs' function is a GNU extension and just like
-     `mbsnrtowcs' helps in situations where no NUL-terminated input
+     The 'wcsnrtombs' function is a GNU extension and just like
+     'mbsnrtowcs' helps in situations where no NUL-terminated input
      strings are available.
 
 
@@ -5516,14 +7040,14 @@
 
 The example programs given in the last sections are only brief and do
 not contain all the error checking, etc.  Presented here is a complete
-and documented example.  It features the `mbrtowc' function but it
+and documented example.  It features the 'mbrtowc' function but it
 should be easy to derive versions using the other functions.
 
      int
      file_mbsrtowcs (int input, int output)
      {
-       /* Note the use of `MB_LEN_MAX'.
-          `MB_CUR_MAX' cannot portably be used here.  */
+       /* Note the use of 'MB_LEN_MAX'.
+          'MB_CUR_MAX' cannot portably be used here.  */
        char buffer[BUFSIZ + MB_LEN_MAX];
        mbstate_t state;
        int filled = 0;
@@ -5551,7 +7075,7 @@
            if (nread == 0)
              eof = 1;
 
-           /* `filled' is now the number of bytes in `buffer'. */
+           /* 'filled' is now the number of bytes in 'buffer'. */
            filled += nread;
 
            /* Convert those bytes to wide characters-as many as we can. */
@@ -5590,7 +7114,7 @@
              }
 
            /* If any characters must be carried forward,
-              put them at the beginning of `buffer'. */
+              put them at the beginning of 'buffer'. */
            if (filled > 0)
              memmove (buffer, inp, filled);
          }
@@ -5604,11 +7128,10 @@
 6.4 Non-reentrant Conversion Function
 =====================================
 
-The functions described in the previous chapter are defined in
-Amendment 1 to ISO C90, but the original ISO C90 standard also
-contained functions for character set conversion.  The reason that
-these original functions are not described first is that they are almost
-entirely useless.
+The functions described in the previous chapter are defined in Amendment 1
+to ISO C90, but the original ISO C90 standard also contained functions
+for character set conversion.  The reason that these original functions
+are not described first is that they are almost entirely useless.
 
    The problem is that all the conversion functions described in the
 original ISO C90 use a local state.  Using a local state implies that
@@ -5639,2912 +7162,103 @@
 6.4.1 Non-reentrant Conversion of Single Characters
 ---------------------------------------------------
 
- -- Function: int mbtowc (wchar_t *restrict RESULT, const char
-          *restrict STRING, size_t SIZE)
+ -- Function: int mbtowc (wchar_t *restrict RESULT, const char *restrict
+          STRING, size_t SIZE)
      Preliminary: | MT-Unsafe race | AS-Unsafe corrupt heap lock dlopen
      | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
 
-     The `mbtowc' ("multibyte to wide character") function when called
+     The 'mbtowc' ("multibyte to wide character") function when called
      with non-null STRING converts the first multibyte character
      beginning at STRING to its corresponding wide character code.  It
-     stores the result in `*RESULT'.
+     stores the result in '*RESULT'.
 
-     `mbtowc' never examines more than SIZE bytes.  (The idea is to
+     'mbtowc' never examines more than SIZE bytes.  (The idea is to
      supply for SIZE the number of bytes of data you have in hand.)
 
-     `mbtowc' with non-null STRING distinguishes three possibilities:
+     'mbtowc' with non-null STRING distinguishes three possibilities:
      the first SIZE bytes at STRING start with valid multibyte
      characters, they start with an invalid byte sequence or just part
      of a character, or STRING points to an empty string (a null
      character).
 
-     For a valid multibyte character, `mbtowc' converts it to a wide
-     character and stores that in `*RESULT', and returns the number of
+     For a valid multibyte character, 'mbtowc' converts it to a wide
+     character and stores that in '*RESULT', and returns the number of
      bytes in that character (always at least 1 and never more than
      SIZE).
 
-     For an invalid byte sequence, `mbtowc' returns -1.  For an empty
-     string, it returns 0, also storing `'\0'' in `*RESULT'.
+     For an invalid byte sequence, 'mbtowc' returns -1.  For an empty
+     string, it returns 0, also storing ''\0'' in '*RESULT'.
 
      If the multibyte character code uses shift characters, then
-     `mbtowc' maintains and updates a shift state as it scans.  If you
-     call `mbtowc' with a null pointer for STRING, that initializes the
-     shift state to its standard initial value.  It also returns
-     nonzero if the multibyte character code in use actually has a
-     shift state.  *Note Shift State::.
+     'mbtowc' maintains and updates a shift state as it scans.  If you
+     call 'mbtowc' with a null pointer for STRING, that initializes the
+     shift state to its standard initial value.  It also returns nonzero
+     if the multibyte character code in use actually has a shift state.
+     *Note Shift State::.
 
  -- Function: int wctomb (char *STRING, wchar_t WCHAR)
      Preliminary: | MT-Unsafe race | AS-Unsafe corrupt heap lock dlopen
      | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
 
-     The `wctomb' ("wide character to multibyte") function converts the
+     The 'wctomb' ("wide character to multibyte") function converts the
      wide character code WCHAR to its corresponding multibyte character
      sequence, and stores the result in bytes starting at STRING.  At
-     most `MB_CUR_MAX' characters are stored.
+     most 'MB_CUR_MAX' characters are stored.
 
-     `wctomb' with non-null STRING distinguishes three possibilities
-     for WCHAR: a valid wide character code (one that can be translated
-     to a multibyte character), an invalid code, and `L'\0''.
+     'wctomb' with non-null STRING distinguishes three possibilities for
+     WCHAR: a valid wide character code (one that can be translated to a
+     multibyte character), an invalid code, and 'L'\0''.
 
-     Given a valid code, `wctomb' converts it to a multibyte character,
+     Given a valid code, 'wctomb' converts it to a multibyte character,
      storing the bytes starting at STRING.  Then it returns the number
      of bytes in that character (always at least 1 and never more than
-     `MB_CUR_MAX').
+     'MB_CUR_MAX').
 
-     If WCHAR is an invalid wide character code, `wctomb' returns -1.
-     If WCHAR is `L'\0'', it returns `0', also storing `'\0'' in
-     `*STRING'.
+     If WCHAR is an invalid wide character code, 'wctomb' returns -1.
+     If WCHAR is 'L'\0'', it returns '0', also storing ''\0'' in
+     '*STRING'.
 
      If the multibyte character code uses shift characters, then
-     `wctomb' maintains and updates a shift state as it scans.  If you
-     call `wctomb' with a null pointer for STRING, that initializes the
-     shift state to its standard initial value.  It also returns
-     nonzero if the multibyte character code in use actually has a
-     shift state.  *Note Shift State::.
+     'wctomb' maintains and updates a shift state as it scans.  If you
+     call 'wctomb' with a null pointer for STRING, that initializes the
+     shift state to its standard initial value.  It also returns nonzero
+     if the multibyte character code in use actually has a shift state.
+     *Note Shift State::.
 
      Calling this function with a WCHAR argument of zero when STRING is
      not null has the side-effect of reinitializing the stored shift
-     state _as well as_ storing the multibyte character `'\0'' and
+     state _as well as_ storing the multibyte character ''\0'' and
      returning 0.
 
-   Similar to `mbrlen' there is also a non-reentrant function that
+   Similar to 'mbrlen' there is also a non-reentrant function that
 computes the length of a multibyte character.  It can be defined in
-terms of `mbtowc'.
+terms of 'mbtowc'.
 
  -- Function: int mblen (const char *STRING, size_t SIZE)
      Preliminary: | MT-Unsafe race | AS-Unsafe corrupt heap lock dlopen
      | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
 
-     The `mblen' function with a non-null STRING argument returns the
+     The 'mblen' function with a non-null STRING argument returns the
      number of bytes that make up the multibyte character beginning at
      STRING, never examining more than SIZE bytes.  (The idea is to
      supply for SIZE the number of bytes of data you have in hand.)
 
-     The return value of `mblen' distinguishes three possibilities: the
+     The return value of 'mblen' distinguishes three possibilities: the
      first SIZE bytes at STRING start with valid multibyte characters,
      they start with an invalid byte sequence or just part of a
      character, or STRING points to an empty string (a null character).
 
-     For a valid multibyte character, `mblen' returns the number of
-     bytes in that character (always at least `1' and never more than
-     SIZE).  For an invalid byte sequence, `mblen' returns -1.  For an
+     For a valid multibyte character, 'mblen' returns the number of
+     bytes in that character (always at least '1' and never more than
+     SIZE).  For an invalid byte sequence, 'mblen' returns -1.  For an
      empty string, it returns 0.
 
-     If the multibyte character code uses shift characters, then `mblen'
+     If the multibyte character code uses shift characters, then 'mblen'
      maintains and updates a shift state as it scans.  If you call
-     `mblen' with a null pointer for STRING, that initializes the shift
+     'mblen' with a null pointer for STRING, that initializes the shift
      state to its standard initial value.  It also returns a nonzero
      value if the multibyte character code in use actually has a shift
      state.  *Note Shift State::.
 
-     The function `mblen' is declared in `stdlib.h'.
-
-
-File: libc.info,  Node: Non-reentrant String Conversion,  Next: Shift State,  Prev: Non-reentrant Character Conversion,  Up: Non-reentrant Conversion
-
-6.4.2 Non-reentrant Conversion of Strings
------------------------------------------
-
-For convenience the ISO C90 standard also defines functions to convert
-entire strings instead of single characters.  These functions suffer
-from the same problems as their reentrant counterparts from Amendment 1
-to ISO C90; see *note Converting Strings::.
-
- -- Function: size_t mbstowcs (wchar_t *WSTRING, const char *STRING,
-          size_t SIZE)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt heap lock dlopen |
-     AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
-
-     The `mbstowcs' ("multibyte string to wide character string")
-     function converts the null-terminated string of multibyte
-     characters STRING to an array of wide character codes, storing not
-     more than SIZE wide characters into the array beginning at WSTRING.
-     The terminating null character counts towards the size, so if SIZE
-     is less than the actual number of wide characters resulting from
-     STRING, no terminating null character is stored.
-
-     The conversion of characters from STRING begins in the initial
-     shift state.
-
-     If an invalid multibyte character sequence is found, the `mbstowcs'
-     function returns a value of -1.  Otherwise, it returns the number
-     of wide characters stored in the array WSTRING.  This number does
-     not include the terminating null character, which is present if the
-     number is less than SIZE.
-
-     Here is an example showing how to convert a string of multibyte
-     characters, allocating enough space for the result.
-
-          wchar_t *
-          mbstowcs_alloc (const char *string)
-          {
-            size_t size = strlen (string) + 1;
-            wchar_t *buf = xmalloc (size * sizeof (wchar_t));
-
-            size = mbstowcs (buf, string, size);
-            if (size == (size_t) -1)
-              return NULL;
-            buf = xrealloc (buf, (size + 1) * sizeof (wchar_t));
-            return buf;
-          }
-
-
- -- Function: size_t wcstombs (char *STRING, const wchar_t *WSTRING,
-          size_t SIZE)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt heap lock dlopen |
-     AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
-
-     The `wcstombs' ("wide character string to multibyte string")
-     function converts the null-terminated wide character array WSTRING
-     into a string containing multibyte characters, storing not more
-     than SIZE bytes starting at STRING, followed by a terminating null
-     character if there is room.  The conversion of characters begins in
-     the initial shift state.
-
-     The terminating null character counts towards the size, so if SIZE
-     is less than or equal to the number of bytes needed in WSTRING, no
-     terminating null character is stored.
-
-     If a code that does not correspond to a valid multibyte character
-     is found, the `wcstombs' function returns a value of -1.
-     Otherwise, the return value is the number of bytes stored in the
-     array STRING.  This number does not include the terminating null
-     character, which is present if the number is less than SIZE.
-
-
-File: libc.info,  Node: Shift State,  Prev: Non-reentrant String Conversion,  Up: Non-reentrant Conversion
-
-6.4.3 States in Non-reentrant Functions
----------------------------------------
-
-In some multibyte character codes, the _meaning_ of any particular byte
-sequence is not fixed; it depends on what other sequences have come
-earlier in the same string.  Typically there are just a few sequences
-that can change the meaning of other sequences; these few are called
-"shift sequences" and we say that they set the "shift state" for other
-sequences that follow.
-
-   To illustrate shift state and shift sequences, suppose we decide that
-the sequence `0200' (just one byte) enters Japanese mode, in which
-pairs of bytes in the range from `0240' to `0377' are single
-characters, while `0201' enters Latin-1 mode, in which single bytes in
-the range from `0240' to `0377' are characters, and interpreted
-according to the ISO Latin-1 character set.  This is a multibyte code
-that has two alternative shift states ("Japanese mode" and "Latin-1
-mode"), and two shift sequences that specify particular shift states.
-
-   When the multibyte character code in use has shift states, then
-`mblen', `mbtowc', and `wctomb' must maintain and update the current
-shift state as they scan the string.  To make this work properly, you
-must follow these rules:
-
-   * Before starting to scan a string, call the function with a null
-     pointer for the multibyte character address--for example, `mblen
-     (NULL, 0)'.  This initializes the shift state to its standard
-     initial value.
-
-   * Scan the string one character at a time, in order.  Do not "back
-     up" and rescan characters already scanned, and do not intersperse
-     the processing of different strings.
-
-   Here is an example of using `mblen' following these rules:
-
-     void
-     scan_string (char *s)
-     {
-       int length = strlen (s);
-
-       /* Initialize shift state.  */
-       mblen (NULL, 0);
-
-       while (1)
-         {
-           int thischar = mblen (s, length);
-           /* Deal with end of string and invalid characters.  */
-           if (thischar == 0)
-             break;
-           if (thischar == -1)
-             {
-               error ("invalid multibyte character");
-               break;
-             }
-           /* Advance past this character.  */
-           s += thischar;
-           length -= thischar;
-         }
-     }
-
-   The functions `mblen', `mbtowc' and `wctomb' are not reentrant when
-using a multibyte code that uses a shift state.  However, no other
-library functions call these functions, so you don't have to worry that
-the shift state will be changed mysteriously.
-
-
-File: libc.info,  Node: Generic Charset Conversion,  Prev: Non-reentrant Conversion,  Up: Character Set Handling
-
-6.5 Generic Charset Conversion
-==============================
-
-The conversion functions mentioned so far in this chapter all had in
-common that they operate on character sets that are not directly
-specified by the functions.  The multibyte encoding used is specified by
-the currently selected locale for the `LC_CTYPE' category.  The wide
-character set is fixed by the implementation (in the case of the GNU C
-Library it is always UCS-4 encoded ISO 10646.
-
-   This has of course several problems when it comes to general
-character conversion:
-
-   * For every conversion where neither the source nor the destination
-     character set is the character set of the locale for the `LC_CTYPE'
-     category, one has to change the `LC_CTYPE' locale using
-     `setlocale'.
-
-     Changing the `LC_CTYPE' locale introduces major problems for the
-     rest of the programs since several more functions (e.g., the
-     character classification functions, *note Classification of
-     Characters::) use the `LC_CTYPE' category.
-
-   * Parallel conversions to and from different character sets are not
-     possible since the `LC_CTYPE' selection is global and shared by all
-     threads.
-
-   * If neither the source nor the destination character set is the
-     character set used for `wchar_t' representation, there is at least
-     a two-step process necessary to convert a text using the functions
-     above.  One would have to select the source character set as the
-     multibyte encoding, convert the text into a `wchar_t' text, select
-     the destination character set as the multibyte encoding, and
-     convert the wide character text to the multibyte (= destination)
-     character set.
-
-     Even if this is possible (which is not guaranteed) it is a very
-     tiring work.  Plus it suffers from the other two raised points
-     even more due to the steady changing of the locale.
-
-   The XPG2 standard defines a completely new set of functions, which
-has none of these limitations.  They are not at all coupled to the
-selected locales, and they have no constraints on the character sets
-selected for source and destination.  Only the set of available
-conversions limits them.  The standard does not specify that any
-conversion at all must be available.  Such availability is a measure of
-the quality of the implementation.
-
-   In the following text first the interface to `iconv' and then the
-conversion function, will be described.  Comparisons with other
-implementations will show what obstacles stand in the way of portable
-applications.  Finally, the implementation is described in so far as
-might interest the advanced user who wants to extend conversion
-capabilities.
-
-* Menu:
-
-* Generic Conversion Interface::    Generic Character Set Conversion Interface.
-* iconv Examples::                  A complete `iconv' example.
-* Other iconv Implementations::     Some Details about other `iconv'
-                                     Implementations.
-* glibc iconv Implementation::      The `iconv' Implementation in the GNU C
-                                     library.
-
-
-File: libc.info,  Node: Generic Conversion Interface,  Next: iconv Examples,  Up: Generic Charset Conversion
-
-6.5.1 Generic Character Set Conversion Interface
-------------------------------------------------
-
-This set of functions follows the traditional cycle of using a resource:
-open-use-close.  The interface consists of three functions, each of
-which implements one step.
-
-   Before the interfaces are described it is necessary to introduce a
-data type.  Just like other open-use-close interfaces the functions
-introduced here work using handles and the `iconv.h' header defines a
-special type for the handles used.
-
- -- Data Type: iconv_t
-     This data type is an abstract type defined in `iconv.h'.  The user
-     must not assume anything about the definition of this type; it
-     must be completely opaque.
-
-     Objects of this type can get assigned handles for the conversions
-     using the `iconv' functions.  The objects themselves need not be
-     freed, but the conversions for which the handles stand for have to.
-
-The first step is the function to create a handle.
-
- -- Function: iconv_t iconv_open (const char *TOCODE, const char
-          *FROMCODE)
-     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap lock dlopen
-     | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
-
-     The `iconv_open' function has to be used before starting a
-     conversion.  The two parameters this function takes determine the
-     source and destination character set for the conversion, and if the
-     implementation has the possibility to perform such a conversion,
-     the function returns a handle.
-
-     If the wanted conversion is not available, the `iconv_open'
-     function returns `(iconv_t) -1'. In this case the global variable
-     `errno' can have the following values:
-
-    `EMFILE'
-          The process already has `OPEN_MAX' file descriptors open.
-
-    `ENFILE'
-          The system limit of open file is reached.
-
-    `ENOMEM'
-          Not enough memory to carry out the operation.
-
-    `EINVAL'
-          The conversion from FROMCODE to TOCODE is not supported.
-
-     It is not possible to use the same descriptor in different threads
-     to perform independent conversions.  The data structures associated
-     with the descriptor include information about the conversion state.
-     This must not be messed up by using it in different conversions.
-
-     An `iconv' descriptor is like a file descriptor as for every use a
-     new descriptor must be created.  The descriptor does not stand for
-     all of the conversions from FROMSET to TOSET.
-
-     The GNU C Library implementation of `iconv_open' has one
-     significant extension to other implementations.  To ease the
-     extension of the set of available conversions, the implementation
-     allows storing the necessary files with data and code in an
-     arbitrary number of directories.  How this extension must be
-     written will be explained below (*note glibc iconv
-     Implementation::).  Here it is only important to say that all
-     directories mentioned in the `GCONV_PATH' environment variable are
-     considered only if they contain a file `gconv-modules'.  These
-     directories need not necessarily be created by the system
-     administrator.  In fact, this extension is introduced to help users
-     writing and using their own, new conversions.  Of course, this
-     does not work for security reasons in SUID binaries; in this case
-     only the system directory is considered and this normally is
-     `PREFIX/lib/gconv'.  The `GCONV_PATH' environment variable is
-     examined exactly once at the first call of the `iconv_open'
-     function.  Later modifications of the variable have no effect.
-
-     The `iconv_open' function was introduced early in the X/Open
-     Portability Guide, version 2.  It is supported by all commercial
-     Unices as it is required for the Unix branding.  However, the
-     quality and completeness of the implementation varies widely.  The
-     `iconv_open' function is declared in `iconv.h'.
-
-   The `iconv' implementation can associate large data structure with
-the handle returned by `iconv_open'.  Therefore, it is crucial to free
-all the resources once all conversions are carried out and the
-conversion is not needed anymore.
-
- -- Function: int iconv_close (iconv_t CD)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt heap lock dlopen |
-     AC-Unsafe corrupt lock mem | *Note POSIX Safety Concepts::.
-
-     The `iconv_close' function frees all resources associated with the
-     handle CD, which must have been returned by a successful call to
-     the `iconv_open' function.
-
-     If the function call was successful the return value is 0.
-     Otherwise it is -1 and `errno' is set appropriately.  Defined
-     error are:
-
-    `EBADF'
-          The conversion descriptor is invalid.
-
-     The `iconv_close' function was introduced together with the rest
-     of the `iconv' functions in XPG2 and is declared in `iconv.h'.
-
-   The standard defines only one actual conversion function.  This has,
-therefore, the most general interface: it allows conversion from one
-buffer to another.  Conversion from a file to a buffer, vice versa, or
-even file to file can be implemented on top of it.
-
- -- Function: size_t iconv (iconv_t CD, char **INBUF, size_t
-          *INBYTESLEFT, char **OUTBUF, size_t *OUTBYTESLEFT)
-     Preliminary: | MT-Safe race:cd | AS-Safe | AC-Unsafe corrupt |
-     *Note POSIX Safety Concepts::.
-
-     The `iconv' function converts the text in the input buffer
-     according to the rules associated with the descriptor CD and
-     stores the result in the output buffer.  It is possible to call the
-     function for the same text several times in a row since for
-     stateful character sets the necessary state information is kept in
-     the data structures associated with the descriptor.
-
-     The input buffer is specified by `*INBUF' and it contains
-     `*INBYTESLEFT' bytes.  The extra indirection is necessary for
-     communicating the used input back to the caller (see below).  It is
-     important to note that the buffer pointer is of type `char' and the
-     length is measured in bytes even if the input text is encoded in
-     wide characters.
-
-     The output buffer is specified in a similar way.  `*OUTBUF' points
-     to the beginning of the buffer with at least `*OUTBYTESLEFT' bytes
-     room for the result.  The buffer pointer again is of type `char'
-     and the length is measured in bytes.  If OUTBUF or `*OUTBUF' is a
-     null pointer, the conversion is performed but no output is
-     available.
-
-     If INBUF is a null pointer, the `iconv' function performs the
-     necessary action to put the state of the conversion into the
-     initial state.  This is obviously a no-op for non-stateful
-     encodings, but if the encoding has a state, such a function call
-     might put some byte sequences in the output buffer, which perform
-     the necessary state changes.  The next call with INBUF not being a
-     null pointer then simply goes on from the initial state.  It is
-     important that the programmer never makes any assumption as to
-     whether the conversion has to deal with states.  Even if the input
-     and output character sets are not stateful, the implementation
-     might still have to keep states.  This is due to the
-     implementation chosen for the GNU C Library as it is described
-     below.  Therefore an `iconv' call to reset the state should always
-     be performed if some protocol requires this for the output text.
-
-     The conversion stops for one of three reasons. The first is that
-     all characters from the input buffer are converted.  This actually
-     can mean two things: either all bytes from the input buffer are
-     consumed or there are some bytes at the end of the buffer that
-     possibly can form a complete character but the input is
-     incomplete.  The second reason for a stop is that the output
-     buffer is full.  And the third reason is that the input contains
-     invalid characters.
-
-     In all of these cases the buffer pointers after the last successful
-     conversion, for input and output buffer, are stored in INBUF and
-     OUTBUF, and the available room in each buffer is stored in
-     INBYTESLEFT and OUTBYTESLEFT.
-
-     Since the character sets selected in the `iconv_open' call can be
-     almost arbitrary, there can be situations where the input buffer
-     contains valid characters, which have no identical representation
-     in the output character set.  The behavior in this situation is
-     undefined.  The _current_ behavior of the GNU C Library in this
-     situation is to return with an error immediately.  This certainly
-     is not the most desirable solution; therefore, future versions
-     will provide better ones, but they are not yet finished.
-
-     If all input from the input buffer is successfully converted and
-     stored in the output buffer, the function returns the number of
-     non-reversible conversions performed.  In all other cases the
-     return value is `(size_t) -1' and `errno' is set appropriately.
-     In such cases the value pointed to by INBYTESLEFT is nonzero.
-
-    `EILSEQ'
-          The conversion stopped because of an invalid byte sequence in
-          the input.  After the call, `*INBUF' points at the first byte
-          of the invalid byte sequence.
-
-    `E2BIG'
-          The conversion stopped because it ran out of space in the
-          output buffer.
-
-    `EINVAL'
-          The conversion stopped because of an incomplete byte sequence
-          at the end of the input buffer.
-
-    `EBADF'
-          The CD argument is invalid.
-
-     The `iconv' function was introduced in the XPG2 standard and is
-     declared in the `iconv.h' header.
-
-   The definition of the `iconv' function is quite good overall.  It
-provides quite flexible functionality.  The only problems lie in the
-boundary cases, which are incomplete byte sequences at the end of the
-input buffer and invalid input.  A third problem, which is not really a
-design problem, is the way conversions are selected.  The standard does
-not say anything about the legitimate names, a minimal set of available
-conversions.  We will see how this negatively impacts other
-implementations, as demonstrated below.
-
-
-File: libc.info,  Node: iconv Examples,  Next: Other iconv Implementations,  Prev: Generic Conversion Interface,  Up: Generic Charset Conversion
-
-6.5.2 A complete `iconv' example
---------------------------------
-
-The example below features a solution for a common problem.  Given that
-one knows the internal encoding used by the system for `wchar_t'
-strings, one often is in the position to read text from a file and store
-it in wide character buffers.  One can do this using `mbsrtowcs', but
-then we run into the problems discussed above.
-
-     int
-     file2wcs (int fd, const char *charset, wchar_t *outbuf, size_t avail)
-     {
-       char inbuf[BUFSIZ];
-       size_t insize = 0;
-       char *wrptr = (char *) outbuf;
-       int result = 0;
-       iconv_t cd;
-
-       cd = iconv_open ("WCHAR_T", charset);
-       if (cd == (iconv_t) -1)
-         {
-           /* Something went wrong.  */
-           if (errno == EINVAL)
-             error (0, 0, "conversion from '%s' to wchar_t not available",
-                    charset);
-           else
-             perror ("iconv_open");
-
-           /* Terminate the output string.  */
-           *outbuf = L'\0';
-
-           return -1;
-         }
-
-       while (avail > 0)
-         {
-           size_t nread;
-           size_t nconv;
-           char *inptr = inbuf;
-
-           /* Read more input.  */
-           nread = read (fd, inbuf + insize, sizeof (inbuf) - insize);
-           if (nread == 0)
-             {
-               /* When we come here the file is completely read.
-                  This still could mean there are some unused
-                  characters in the `inbuf'.  Put them back.  */
-               if (lseek (fd, -insize, SEEK_CUR) == -1)
-                 result = -1;
-
-               /* Now write out the byte sequence to get into the
-                  initial state if this is necessary.  */
-               iconv (cd, NULL, NULL, &wrptr, &avail);
-
-               break;
-             }
-           insize += nread;
-
-           /* Do the conversion.  */
-           nconv = iconv (cd, &inptr, &insize, &wrptr, &avail);
-           if (nconv == (size_t) -1)
-             {
-               /* Not everything went right.  It might only be
-                  an unfinished byte sequence at the end of the
-                  buffer.  Or it is a real problem.  */
-               if (errno == EINVAL)
-                 /* This is harmless.  Simply move the unused
-                    bytes to the beginning of the buffer so that
-                    they can be used in the next round.  */
-                 memmove (inbuf, inptr, insize);
-               else
-                 {
-                   /* It is a real problem.  Maybe we ran out of
-                      space in the output buffer or we have invalid
-                      input.  In any case back the file pointer to
-                      the position of the last processed byte.  */
-                   lseek (fd, -insize, SEEK_CUR);
-                   result = -1;
-                   break;
-                 }
-             }
-         }
-
-       /* Terminate the output string.  */
-       if (avail >= sizeof (wchar_t))
-         *((wchar_t *) wrptr) = L'\0';
-
-       if (iconv_close (cd) != 0)
-         perror ("iconv_close");
-
-       return (wchar_t *) wrptr - outbuf;
-     }
-
-   This example shows the most important aspects of using the `iconv'
-functions.  It shows how successive calls to `iconv' can be used to
-convert large amounts of text.  The user does not have to care about
-stateful encodings as the functions take care of everything.
-
-   An interesting point is the case where `iconv' returns an error and
-`errno' is set to `EINVAL'.  This is not really an error in the
-transformation.  It can happen whenever the input character set contains
-byte sequences of more than one byte for some character and texts are
-not processed in one piece.  In this case there is a chance that a
-multibyte sequence is cut.  The caller can then simply read the
-remainder of the takes and feed the offending bytes together with new
-character from the input to `iconv' and continue the work.  The
-internal state kept in the descriptor is _not_ unspecified after such
-an event as is the case with the conversion functions from the ISO C
-standard.
-
-   The example also shows the problem of using wide character strings
-with `iconv'.  As explained in the description of the `iconv' function
-above, the function always takes a pointer to a `char' array and the
-available space is measured in bytes.  In the example, the output
-buffer is a wide character buffer; therefore, we use a local variable
-WRPTR of type `char *', which is used in the `iconv' calls.
-
-   This looks rather innocent but can lead to problems on platforms that
-have tight restriction on alignment.  Therefore the caller of `iconv'
-has to make sure that the pointers passed are suitable for access of
-characters from the appropriate character set.  Since, in the above
-case, the input parameter to the function is a `wchar_t' pointer, this
-is the case (unless the user violates alignment when computing the
-parameter).  But in other situations, especially when writing generic
-functions where one does not know what type of character set one uses
-and, therefore, treats text as a sequence of bytes, it might become
-tricky.
-
-
-File: libc.info,  Node: Other iconv Implementations,  Next: glibc iconv Implementation,  Prev: iconv Examples,  Up: Generic Charset Conversion
-
-6.5.3 Some Details about other `iconv' Implementations
-------------------------------------------------------
-
-This is not really the place to discuss the `iconv' implementation of
-other systems but it is necessary to know a bit about them to write
-portable programs.  The above mentioned problems with the specification
-of the `iconv' functions can lead to portability issues.
-
-   The first thing to notice is that, due to the large number of
-character sets in use, it is certainly not practical to encode the
-conversions directly in the C library.  Therefore, the conversion
-information must come from files outside the C library.  This is
-usually done in one or both of the following ways:
-
-   * The C library contains a set of generic conversion functions that
-     can read the needed conversion tables and other information from
-     data files.  These files get loaded when necessary.
-
-     This solution is problematic as it requires a great deal of effort
-     to apply to all character sets (potentially an infinite set).  The
-     differences in the structure of the different character sets is so
-     large that many different variants of the table-processing
-     functions must be developed.  In addition, the generic nature of
-     these functions make them slower than specifically implemented
-     functions.
-
-   * The C library only contains a framework that can dynamically load
-     object files and execute the conversion functions contained
-     therein.
-
-     This solution provides much more flexibility.  The C library itself
-     contains only very little code and therefore reduces the general
-     memory footprint.  Also, with a documented interface between the C
-     library and the loadable modules it is possible for third parties
-     to extend the set of available conversion modules.  A drawback of
-     this solution is that dynamic loading must be available.
-
-   Some implementations in commercial Unices implement a mixture of
-these possibilities; the majority implement only the second solution.
-Using loadable modules moves the code out of the library itself and
-keeps the door open for extensions and improvements, but this design is
-also limiting on some platforms since not many platforms support dynamic
-loading in statically linked programs.  On platforms without this
-capability it is therefore not possible to use this interface in
-statically linked programs.  The GNU C Library has, on ELF platforms, no
-problems with dynamic loading in these situations; therefore, this
-point is moot.  The danger is that one gets acquainted with this
-situation and forgets about the restrictions on other systems.
-
-   A second thing to know about other `iconv' implementations is that
-the number of available conversions is often very limited.  Some
-implementations provide, in the standard release (not special
-international or developer releases), at most 100 to 200 conversion
-possibilities.  This does not mean 200 different character sets are
-supported; for example, conversions from one character set to a set of
-10 others might count as 10 conversions.  Together with the other
-direction this makes 20 conversion possibilities used up by one
-character set.  One can imagine the thin coverage these platform
-provide.  Some Unix vendors even provide only a handful of conversions,
-which renders them useless for almost all uses.
-
-   This directly leads to a third and probably the most problematic
-point.  The way the `iconv' conversion functions are implemented on all
-known Unix systems and the availability of the conversion functions from
-character set A to B and the conversion from B to C does _not_ imply
-that the conversion from A to C is available.
-
-   This might not seem unreasonable and problematic at first, but it is
-a quite big problem as one will notice shortly after hitting it.  To
-show the problem we assume to write a program that has to convert from
-A to C.  A call like
-
-     cd = iconv_open ("C", "A");
-
-fails according to the assumption above.  But what does the program do
-now?  The conversion is necessary; therefore, simply giving up is not
-an option.
-
-   This is a nuisance.  The `iconv' function should take care of this.
-But how should the program proceed from here on?  If it tries to convert
-to character set B, first the two `iconv_open' calls
-
-     cd1 = iconv_open ("B", "A");
-
-and
-
-     cd2 = iconv_open ("C", "B");
-
-will succeed, but how to find B?
-
-   Unfortunately, the answer is: there is no general solution.  On some
-systems guessing might help.  On those systems most character sets can
-convert to and from UTF-8 encoded ISO 10646 or Unicode text. Beside
-this only some very system-specific methods can help.  Since the
-conversion functions come from loadable modules and these modules must
-be stored somewhere in the filesystem, one _could_ try to find them and
-determine from the available file which conversions are available and
-whether there is an indirect route from A to C.
-
-   This example shows one of the design errors of `iconv' mentioned
-above.  It should at least be possible to determine the list of
-available conversion programmatically so that if `iconv_open' says
-there is no such conversion, one could make sure this also is true for
-indirect routes.
-
-
-File: libc.info,  Node: glibc iconv Implementation,  Prev: Other iconv Implementations,  Up: Generic Charset Conversion
-
-6.5.4 The `iconv' Implementation in the GNU C Library
------------------------------------------------------
-
-After reading about the problems of `iconv' implementations in the last
-section it is certainly good to note that the implementation in the GNU
-C Library has none of the problems mentioned above.  What follows is a
-step-by-step analysis of the points raised above.  The evaluation is
-based on the current state of the development (as of January 1999).
-The development of the `iconv' functions is not complete, but basic
-functionality has solidified.
-
-   The GNU C Library's `iconv' implementation uses shared loadable
-modules to implement the conversions.  A very small number of
-conversions are built into the library itself but these are only rather
-trivial conversions.
-
-   All the benefits of loadable modules are available in the GNU C
-Library implementation.  This is especially appealing since the
-interface is well documented (see below), and it, therefore, is easy to
-write new conversion modules.  The drawback of using loadable objects
-is not a problem in the GNU C Library, at least on ELF systems.  Since
-the library is able to load shared objects even in statically linked
-binaries, static linking need not be forbidden in case one wants to use
-`iconv'.
-
-   The second mentioned problem is the number of supported conversions.
-Currently, the GNU C Library supports more than 150 character sets.  The
-way the implementation is designed the number of supported conversions
-is greater than 22350 (150 times 149).  If any conversion from or to a
-character set is missing, it can be added easily.
-
-   Particularly impressive as it may be, this high number is due to the
-fact that the GNU C Library implementation of `iconv' does not have the
-third problem mentioned above (i.e., whenever there is a conversion
-from a character set A to B and from B to C it is always possible to
-convert from A to C directly).  If the `iconv_open' returns an error
-and sets `errno' to `EINVAL', there is no known way, directly or
-indirectly, to perform the wanted conversion.
-
-   Triangulation is achieved by providing for each character set a
-conversion from and to UCS-4 encoded ISO 10646.  Using ISO 10646 as an
-intermediate representation it is possible to "triangulate" (i.e.,
-convert with an intermediate representation).
-
-   There is no inherent requirement to provide a conversion to
-ISO 10646 for a new character set, and it is also possible to provide
-other conversions where neither source nor destination character set is
-ISO 10646.  The existing set of conversions is simply meant to cover all
-conversions that might be of interest.
-
-   All currently available conversions use the triangulation method
-above, making conversion run unnecessarily slow.  If, for example,
-somebody often needs the conversion from ISO-2022-JP to EUC-JP, a
-quicker solution would involve direct conversion between the two
-character sets, skipping the input to ISO 10646 first.  The two
-character sets of interest are much more similar to each other than to
-ISO 10646.
-
-   In such a situation one easily can write a new conversion and
-provide it as a better alternative.  The GNU C Library `iconv'
-implementation would automatically use the module implementing the
-conversion if it is specified to be more efficient.
-
-6.5.4.1 Format of `gconv-modules' files
-.......................................
-
-All information about the available conversions comes from a file named
-`gconv-modules', which can be found in any of the directories along the
-`GCONV_PATH'.  The `gconv-modules' files are line-oriented text files,
-where each of the lines has one of the following formats:
-
-   * If the first non-whitespace character is a `#' the line contains
-     only comments and is ignored.
-
-   * Lines starting with `alias' define an alias name for a character
-     set.  Two more words are expected on the line.  The first word
-     defines the alias name, and the second defines the original name
-     of the character set.  The effect is that it is possible to use
-     the alias name in the FROMSET or TOSET parameters of `iconv_open'
-     and achieve the same result as when using the real character set
-     name.
-
-     This is quite important as a character set has often many different
-     names.  There is normally an official name but this need not
-     correspond to the most popular name.  Beside this many character
-     sets have special names that are somehow constructed.  For
-     example, all character sets specified by the ISO have an alias of
-     the form `ISO-IR-NNN' where NNN is the registration number.  This
-     allows programs that know about the registration number to
-     construct character set names and use them in `iconv_open' calls.
-     More on the available names and aliases follows below.
-
-   * Lines starting with `module' introduce an available conversion
-     module.  These lines must contain three or four more words.
-
-     The first word specifies the source character set, the second word
-     the destination character set of conversion implemented in this
-     module, and the third word is the name of the loadable module.
-     The filename is constructed by appending the usual shared object
-     suffix (normally `.so') and this file is then supposed to be found
-     in the same directory the `gconv-modules' file is in.  The last
-     word on the line, which is optional, is a numeric value
-     representing the cost of the conversion.  If this word is missing,
-     a cost of 1 is assumed.  The numeric value itself does not matter
-     that much; what counts are the relative values of the sums of
-     costs for all possible conversion paths.  Below is a more precise
-     description of the use of the cost value.
-
-   Returning to the example above where one has written a module to
-directly convert from ISO-2022-JP to EUC-JP and back.  All that has to
-be done is to put the new module, let its name be ISO2022JP-EUCJP.so,
-in a directory and add a file `gconv-modules' with the following
-content in the same directory:
-
-     module  ISO-2022-JP//   EUC-JP//        ISO2022JP-EUCJP    1
-     module  EUC-JP//        ISO-2022-JP//   ISO2022JP-EUCJP    1
-
-   To see why this is sufficient, it is necessary to understand how the
-conversion used by `iconv' (and described in the descriptor) is
-selected.  The approach to this problem is quite simple.
-
-   At the first call of the `iconv_open' function the program reads all
-available `gconv-modules' files and builds up two tables: one
-containing all the known aliases and another that contains the
-information about the conversions and which shared object implements
-them.
-
-6.5.4.2 Finding the conversion path in `iconv'
-..............................................
-
-The set of available conversions form a directed graph with weighted
-edges.  The weights on the edges are the costs specified in the
-`gconv-modules' files.  The `iconv_open' function uses an algorithm
-suitable for search for the best path in such a graph and so constructs
-a list of conversions that must be performed in succession to get the
-transformation from the source to the destination character set.
-
-   Explaining why the above `gconv-modules' files allows the `iconv'
-implementation to resolve the specific ISO-2022-JP to EUC-JP conversion
-module instead of the conversion coming with the library itself is
-straightforward.  Since the latter conversion takes two steps (from
-ISO-2022-JP to ISO 10646 and then from ISO 10646 to EUC-JP), the cost
-is 1+1 = 2.  The above `gconv-modules' file, however, specifies that
-the new conversion modules can perform this conversion with only the
-cost of 1.
-
-   A mysterious item about the `gconv-modules' file above (and also the
-file coming with the GNU C Library) are the names of the character sets
-specified in the `module' lines.  Why do almost all the names end in
-`//'?  And this is not all: the names can actually be regular
-expressions.  At this point in time this mystery should not be
-revealed, unless you have the relevant spell-casting materials: ashes
-from an original DOS 6.2 boot disk burnt in effigy, a crucifix blessed
-by St. Emacs, assorted herbal roots from Central America, sand from
-Cebu, etc.  Sorry!  *The part of the implementation where this is used
-is not yet finished.  For now please simply follow the existing
-examples.  It'll become clearer once it is. -drepper*
-
-   A last remark about the `gconv-modules' is about the names not
-ending with `//'.  A character set named `INTERNAL' is often mentioned.
-From the discussion above and the chosen name it should have become
-clear that this is the name for the representation used in the
-intermediate step of the triangulation.  We have said that this is UCS-4
-but actually that is not quite right.  The UCS-4 specification also
-includes the specification of the byte ordering used.  Since a UCS-4
-value consists of four bytes, a stored value is affected by byte
-ordering.  The internal representation is _not_ the same as UCS-4 in
-case the byte ordering of the processor (or at least the running
-process) is not the same as the one required for UCS-4.  This is done
-for performance reasons as one does not want to perform unnecessary
-byte-swapping operations if one is not interested in actually seeing
-the result in UCS-4.  To avoid trouble with endianness, the internal
-representation consistently is named `INTERNAL' even on big-endian
-systems where the representations are identical.
-
-6.5.4.3 `iconv' module data structures
-......................................
-
-So far this section has described how modules are located and considered
-to be used.  What remains to be described is the interface of the
-modules so that one can write new ones. This section describes the
-interface as it is in use in January 1999.  The interface will change a
-bit in the future but, with luck, only in an upwardly compatible way.
-
-   The definitions necessary to write new modules are publicly available
-in the non-standard header `gconv.h'.  The following text, therefore,
-describes the definitions from this header file.  First, however, it is
-necessary to get an overview.
-
-   From the perspective of the user of `iconv' the interface is quite
-simple: the `iconv_open' function returns a handle that can be used in
-calls to `iconv', and finally the handle is freed with a call to
-`iconv_close'.  The problem is that the handle has to be able to
-represent the possibly long sequences of conversion steps and also the
-state of each conversion since the handle is all that is passed to the
-`iconv' function.  Therefore, the data structures are really the
-elements necessary to understanding the implementation.
-
-   We need two different kinds of data structures.  The first describes
-the conversion and the second describes the state etc.  There are
-really two type definitions like this in `gconv.h'.  
-
- -- Data type: struct __gconv_step
-     This data structure describes one conversion a module can perform.
-     For each function in a loaded module with conversion functions
-     there is exactly one object of this type.  This object is shared
-     by all users of the conversion (i.e., this object does not contain
-     any information corresponding to an actual conversion; it only
-     describes the conversion itself).
-
-    `struct __gconv_loaded_object *__shlib_handle'
-    `const char *__modname'
-    `int __counter'
-          All these elements of the structure are used internally in
-          the C library to coordinate loading and unloading the shared.
-          One must not expect any of the other elements to be available
-          or initialized.
-
-    `const char *__from_name'
-    `const char *__to_name'
-          `__from_name' and `__to_name' contain the names of the source
-          and destination character sets.  They can be used to identify
-          the actual conversion to be carried out since one module
-          might implement conversions for more than one character set
-          and/or direction.
-
-    `gconv_fct __fct'
-    `gconv_init_fct __init_fct'
-    `gconv_end_fct __end_fct'
-          These elements contain pointers to the functions in the
-          loadable module.  The interface will be explained below.
-
-    `int __min_needed_from'
-    `int __max_needed_from'
-    `int __min_needed_to'
-    `int __max_needed_to;'
-          These values have to be supplied in the init function of the
-          module.  The `__min_needed_from' value specifies how many
-          bytes a character of the source character set at least needs.
-          The `__max_needed_from' specifies the maximum value that also
-          includes possible shift sequences.
-
-          The `__min_needed_to' and `__max_needed_to' values serve the
-          same purpose as `__min_needed_from' and `__max_needed_from'
-          but this time for the destination character set.
-
-          It is crucial that these values be accurate since otherwise
-          the conversion functions will have problems or not work at
-          all.
-
-    `int __stateful'
-          This element must also be initialized by the init function.
-          `int __stateful' is nonzero if the source character set is
-          stateful.  Otherwise it is zero.
-
-    `void *__data'
-          This element can be used freely by the conversion functions
-          in the module.  `void *__data' can be used to communicate
-          extra information from one call to another.  `void *__data'
-          need not be initialized if not needed at all.  If `void
-          *__data' element is assigned a pointer to dynamically
-          allocated memory (presumably in the init function) it has to
-          be made sure that the end function deallocates the memory.
-          Otherwise the application will leak memory.
-
-          It is important to be aware that this data structure is
-          shared by all users of this specification conversion and
-          therefore the `__data' element must not contain data specific
-          to one specific use of the conversion function.
-
- -- Data type: struct __gconv_step_data
-     This is the data structure that contains the information specific
-     to each use of the conversion functions.
-
-    `char *__outbuf'
-    `char *__outbufend'
-          These elements specify the output buffer for the conversion
-          step.  The `__outbuf' element points to the beginning of the
-          buffer, and `__outbufend' points to the byte following the
-          last byte in the buffer.  The conversion function must not
-          assume anything about the size of the buffer but it can be
-          safely assumed the there is room for at least one complete
-          character in the output buffer.
-
-          Once the conversion is finished, if the conversion is the
-          last step, the `__outbuf' element must be modified to point
-          after the last byte written into the buffer to signal how
-          much output is available.  If this conversion step is not the
-          last one, the element must not be modified.  The
-          `__outbufend' element must not be modified.
-
-    `int __is_last'
-          This element is nonzero if this conversion step is the last
-          one.  This information is necessary for the recursion.  See
-          the description of the conversion function internals below.
-          This element must never be modified.
-
-    `int __invocation_counter'
-          The conversion function can use this element to see how many
-          calls of the conversion function already happened.  Some
-          character sets require a certain prolog when generating
-          output, and by comparing this value with zero, one can find
-          out whether it is the first call and whether, therefore, the
-          prolog should be emitted.  This element must never be
-          modified.
-
-    `int __internal_use'
-          This element is another one rarely used but needed in certain
-          situations.  It is assigned a nonzero value in case the
-          conversion functions are used to implement `mbsrtowcs' et.al.
-          (i.e., the function is not used directly through the `iconv'
-          interface).
-
-          This sometimes makes a difference as it is expected that the
-          `iconv' functions are used to translate entire texts while the
-          `mbsrtowcs' functions are normally used only to convert single
-          strings and might be used multiple times to convert entire
-          texts.
-
-          But in this situation we would have problem complying with
-          some rules of the character set specification.  Some
-          character sets require a prolog, which must appear exactly
-          once for an entire text.  If a number of `mbsrtowcs' calls
-          are used to convert the text, only the first call must add
-          the prolog.  However, because there is no communication
-          between the different calls of `mbsrtowcs', the conversion
-          functions have no possibility to find this out.  The
-          situation is different for sequences of `iconv' calls since
-          the handle allows access to the needed information.
-
-          The `int __internal_use' element is mostly used together with
-          `__invocation_counter' as follows:
-
-               if (!data->__internal_use
-                    && data->__invocation_counter == 0)
-                 /* Emit prolog.  */
-                 ...
-
-          This element must never be modified.
-
-    `mbstate_t *__statep'
-          The `__statep' element points to an object of type `mbstate_t'
-          (*note Keeping the state::).  The conversion of a stateful
-          character set must use the object pointed to by `__statep' to
-          store information about the conversion state.  The `__statep'
-          element itself must never be modified.
-
-    `mbstate_t __state'
-          This element must _never_ be used directly.  It is only part
-          of this structure to have the needed space allocated.
-
-6.5.4.4 `iconv' module interfaces
-.................................
-
-With the knowledge about the data structures we now can describe the
-conversion function itself.  To understand the interface a bit of
-knowledge is necessary about the functionality in the C library that
-loads the objects with the conversions.
-
-   It is often the case that one conversion is used more than once
-(i.e., there are several `iconv_open' calls for the same set of
-character sets during one program run).  The `mbsrtowcs' et.al.
-functions in the GNU C Library also use the `iconv' functionality, which
-increases the number of uses of the same functions even more.
-
-   Because of this multiple use of conversions, the modules do not get
-loaded exclusively for one conversion.  Instead a module once loaded can
-be used by an arbitrary number of `iconv' or `mbsrtowcs' calls at the
-same time.  The splitting of the information between conversion-
-function-specific information and conversion data makes this possible.
-The last section showed the two data structures used to do this.
-
-   This is of course also reflected in the interface and semantics of
-the functions that the modules must provide.  There are three functions
-that must have the following names:
-
-`gconv_init'
-     The `gconv_init' function initializes the conversion function
-     specific data structure.  This very same object is shared by all
-     conversions that use this conversion and, therefore, no state
-     information about the conversion itself must be stored in here.
-     If a module implements more than one conversion, the `gconv_init'
-     function will be called multiple times.
-
-`gconv_end'
-     The `gconv_end' function is responsible for freeing all resources
-     allocated by the `gconv_init' function.  If there is nothing to do,
-     this function can be missing.  Special care must be taken if the
-     module implements more than one conversion and the `gconv_init'
-     function does not allocate the same resources for all conversions.
-
-`gconv'
-     This is the actual conversion function.  It is called to convert
-     one block of text.  It gets passed the conversion step information
-     initialized by `gconv_init' and the conversion data, specific to
-     this use of the conversion functions.
-
-   There are three data types defined for the three module interface
-functions and these define the interface.
-
- -- Data type: int (*__gconv_init_fct) (struct __gconv_step *)
-     This specifies the interface of the initialization function of the
-     module.  It is called exactly once for each conversion the module
-     implements.
-
-     As explained in the description of the `struct __gconv_step' data
-     structure above the initialization function has to initialize
-     parts of it.
-
-    `__min_needed_from'
-    `__max_needed_from'
-    `__min_needed_to'
-    `__max_needed_to'
-          These elements must be initialized to the exact numbers of
-          the minimum and maximum number of bytes used by one character
-          in the source and destination character sets, respectively.
-          If the characters all have the same size, the minimum and
-          maximum values are the same.
-
-    `__stateful'
-          This element must be initialized to a nonzero value if the
-          source character set is stateful.  Otherwise it must be zero.
-
-     If the initialization function needs to communicate some
-     information to the conversion function, this communication can
-     happen using the `__data' element of the `__gconv_step' structure.
-     But since this data is shared by all the conversions, it must not
-     be modified by the conversion function.  The example below shows
-     how this can be used.
-
-          #define MIN_NEEDED_FROM         1
-          #define MAX_NEEDED_FROM         4
-          #define MIN_NEEDED_TO           4
-          #define MAX_NEEDED_TO           4
-
-          int
-          gconv_init (struct __gconv_step *step)
-          {
-            /* Determine which direction.  */
-            struct iso2022jp_data *new_data;
-            enum direction dir = illegal_dir;
-            enum variant var = illegal_var;
-            int result;
-
-            if (__strcasecmp (step->__from_name, "ISO-2022-JP//") == 0)
-              {
-                dir = from_iso2022jp;
-                var = iso2022jp;
-              }
-            else if (__strcasecmp (step->__to_name, "ISO-2022-JP//") == 0)
-              {
-                dir = to_iso2022jp;
-                var = iso2022jp;
-              }
-            else if (__strcasecmp (step->__from_name, "ISO-2022-JP-2//") == 0)
-              {
-                dir = from_iso2022jp;
-                var = iso2022jp2;
-              }
-            else if (__strcasecmp (step->__to_name, "ISO-2022-JP-2//") == 0)
-              {
-                dir = to_iso2022jp;
-                var = iso2022jp2;
-              }
-
-            result = __GCONV_NOCONV;
-            if (dir != illegal_dir)
-              {
-                new_data = (struct iso2022jp_data *)
-                  malloc (sizeof (struct iso2022jp_data));
-
-                result = __GCONV_NOMEM;
-                if (new_data != NULL)
-                  {
-                    new_data->dir = dir;
-                    new_data->var = var;
-                    step->__data = new_data;
-
-                    if (dir == from_iso2022jp)
-                      {
-                        step->__min_needed_from = MIN_NEEDED_FROM;
-                        step->__max_needed_from = MAX_NEEDED_FROM;
-                        step->__min_needed_to = MIN_NEEDED_TO;
-                        step->__max_needed_to = MAX_NEEDED_TO;
-                      }
-                    else
-                      {
-                        step->__min_needed_from = MIN_NEEDED_TO;
-                        step->__max_needed_from = MAX_NEEDED_TO;
-                        step->__min_needed_to = MIN_NEEDED_FROM;
-                        step->__max_needed_to = MAX_NEEDED_FROM + 2;
-                      }
-
-                    /* Yes, this is a stateful encoding.  */
-                    step->__stateful = 1;
-
-                    result = __GCONV_OK;
-                  }
-              }
-
-            return result;
-          }
-
-     The function first checks which conversion is wanted.  The module
-     from which this function is taken implements four different
-     conversions; which one is selected can be determined by comparing
-     the names.  The comparison should always be done without paying
-     attention to the case.
-
-     Next, a data structure, which contains the necessary information
-     about which conversion is selected, is allocated.  The data
-     structure `struct iso2022jp_data' is locally defined since,
-     outside the module, this data is not used at all.  Please note
-     that if all four conversions this modules supports are requested
-     there are four data blocks.
-
-     One interesting thing is the initialization of the `__min_' and
-     `__max_' elements of the step data object.  A single ISO-2022-JP
-     character can consist of one to four bytes.  Therefore the
-     `MIN_NEEDED_FROM' and `MAX_NEEDED_FROM' macros are defined this
-     way.  The output is always the `INTERNAL' character set (aka
-     UCS-4) and therefore each character consists of exactly four
-     bytes.  For the conversion from `INTERNAL' to ISO-2022-JP we have
-     to take into account that escape sequences might be necessary to
-     switch the character sets.  Therefore the `__max_needed_to'
-     element for this direction gets assigned `MAX_NEEDED_FROM + 2'.
-     This takes into account the two bytes needed for the escape
-     sequences to single the switching.  The asymmetry in the maximum
-     values for the two directions can be explained easily: when
-     reading ISO-2022-JP text, escape sequences can be handled alone
-     (i.e., it is not necessary to process a real character since the
-     effect of the escape sequence can be recorded in the state
-     information).  The situation is different for the other direction.
-     Since it is in general not known which character comes next, one
-     cannot emit escape sequences to change the state in advance.  This
-     means the escape sequences that have to be emitted together with
-     the next character.  Therefore one needs more room than only for
-     the character itself.
-
-     The possible return values of the initialization function are:
-
-    `__GCONV_OK'
-          The initialization succeeded
-
-    `__GCONV_NOCONV'
-          The requested conversion is not supported in the module.
-          This can happen if the `gconv-modules' file has errors.
-
-    `__GCONV_NOMEM'
-          Memory required to store additional information could not be
-          allocated.
-
-   The function called before the module is unloaded is significantly
-easier.  It often has nothing at all to do; in which case it can be left
-out completely.
-
- -- Data type: void (*__gconv_end_fct) (struct gconv_step *)
-     The task of this function is to free all resources allocated in the
-     initialization function.  Therefore only the `__data' element of
-     the object pointed to by the argument is of interest.  Continuing
-     the example from the initialization function, the finalization
-     function looks like this:
-
-          void
-          gconv_end (struct __gconv_step *data)
-          {
-            free (data->__data);
-          }
-
-   The most important function is the conversion function itself, which
-can get quite complicated for complex character sets.  But since this
-is not of interest here, we will only describe a possible skeleton for
-the conversion function.
-
- -- Data type: int (*__gconv_fct) (struct __gconv_step *, struct
-          __gconv_step_data *, const char **, const char *, size_t *,
-          int)
-     The conversion function can be called for two basic reason: to
-     convert text or to reset the state.  From the description of the
-     `iconv' function it can be seen why the flushing mode is
-     necessary.  What mode is selected is determined by the sixth
-     argument, an integer.  This argument being nonzero means that
-     flushing is selected.
-
-     Common to both modes is where the output buffer can be found.  The
-     information about this buffer is stored in the conversion step
-     data.  A pointer to this information is passed as the second
-     argument to this function.  The description of the `struct
-     __gconv_step_data' structure has more information on the
-     conversion step data.
-
-     What has to be done for flushing depends on the source character
-     set.  If the source character set is not stateful, nothing has to
-     be done.  Otherwise the function has to emit a byte sequence to
-     bring the state object into the initial state.  Once this all
-     happened the other conversion modules in the chain of conversions
-     have to get the same chance.  Whether another step follows can be
-     determined from the `__is_last' element of the step data structure
-     to which the first parameter points.
-
-     The more interesting mode is when actual text has to be converted.
-     The first step in this case is to convert as much text as possible
-     from the input buffer and store the result in the output buffer.
-     The start of the input buffer is determined by the third argument,
-     which is a pointer to a pointer variable referencing the beginning
-     of the buffer.  The fourth argument is a pointer to the byte right
-     after the last byte in the buffer.
-
-     The conversion has to be performed according to the current state
-     if the character set is stateful.  The state is stored in an
-     object pointed to by the `__statep' element of the step data
-     (second argument).  Once either the input buffer is empty or the
-     output buffer is full the conversion stops.  At this point, the
-     pointer variable referenced by the third parameter must point to
-     the byte following the last processed byte (i.e., if all of the
-     input is consumed, this pointer and the fourth parameter have the
-     same value).
-
-     What now happens depends on whether this step is the last one.  If
-     it is the last step, the only thing that has to be done is to
-     update the `__outbuf' element of the step data structure to point
-     after the last written byte.  This update gives the caller the
-     information on how much text is available in the output buffer.
-     In addition, the variable pointed to by the fifth parameter, which
-     is of type `size_t', must be incremented by the number of
-     characters (_not bytes_) that were converted in a non-reversible
-     way.  Then, the function can return.
-
-     In case the step is not the last one, the later conversion
-     functions have to get a chance to do their work.  Therefore, the
-     appropriate conversion function has to be called.  The information
-     about the functions is stored in the conversion data structures,
-     passed as the first parameter.  This information and the step data
-     are stored in arrays, so the next element in both cases can be
-     found by simple pointer arithmetic:
-
-          int
-          gconv (struct __gconv_step *step, struct __gconv_step_data *data,
-                 const char **inbuf, const char *inbufend, size_t *written,
-                 int do_flush)
-          {
-            struct __gconv_step *next_step = step + 1;
-            struct __gconv_step_data *next_data = data + 1;
-            ...
-
-     The `next_step' pointer references the next step information and
-     `next_data' the next data record.  The call of the next function
-     therefore will look similar to this:
-
-            next_step->__fct (next_step, next_data, &outerr, outbuf,
-                              written, 0)
-
-     But this is not yet all.  Once the function call returns the
-     conversion function might have some more to do.  If the return
-     value of the function is `__GCONV_EMPTY_INPUT', more room is
-     available in the output buffer.  Unless the input buffer is empty
-     the conversion, functions start all over again and process the
-     rest of the input buffer.  If the return value is not
-     `__GCONV_EMPTY_INPUT', something went wrong and we have to recover
-     from this.
-
-     A requirement for the conversion function is that the input buffer
-     pointer (the third argument) always point to the last character
-     that was put in converted form into the output buffer.  This is
-     trivially true after the conversion performed in the current step,
-     but if the conversion functions deeper downstream stop
-     prematurely, not all characters from the output buffer are
-     consumed and, therefore, the input buffer pointers must be backed
-     off to the right position.
-
-     Correcting the input buffers is easy to do if the input and output
-     character sets have a fixed width for all characters.  In this
-     situation we can compute how many characters are left in the
-     output buffer and, therefore, can correct the input buffer pointer
-     appropriately with a similar computation.  Things are getting
-     tricky if either character set has characters represented with
-     variable length byte sequences, and it gets even more complicated
-     if the conversion has to take care of the state.  In these cases
-     the conversion has to be performed once again, from the known
-     state before the initial conversion (i.e., if necessary the state
-     of the conversion has to be reset and the conversion loop has to be
-     executed again).  The difference now is that it is known how much
-     input must be created, and the conversion can stop before
-     converting the first unused character.  Once this is done the
-     input buffer pointers must be updated again and the function can
-     return.
-
-     One final thing should be mentioned.  If it is necessary for the
-     conversion to know whether it is the first invocation (in case a
-     prolog has to be emitted), the conversion function should
-     increment the `__invocation_counter' element of the step data
-     structure just before returning to the caller.  See the
-     description of the `struct __gconv_step_data' structure above for
-     more information on how this can be used.
-
-     The return value must be one of the following values:
-
-    `__GCONV_EMPTY_INPUT'
-          All input was consumed and there is room left in the output
-          buffer.
-
-    `__GCONV_FULL_OUTPUT'
-          No more room in the output buffer.  In case this is not the
-          last step this value is propagated down from the call of the
-          next conversion function in the chain.
-
-    `__GCONV_INCOMPLETE_INPUT'
-          The input buffer is not entirely empty since it contains an
-          incomplete character sequence.
-
-     The following example provides a framework for a conversion
-     function.  In case a new conversion has to be written the holes in
-     this implementation have to be filled and that is it.
-
-          int
-          gconv (struct __gconv_step *step, struct __gconv_step_data *data,
-                 const char **inbuf, const char *inbufend, size_t *written,
-                 int do_flush)
-          {
-            struct __gconv_step *next_step = step + 1;
-            struct __gconv_step_data *next_data = data + 1;
-            gconv_fct fct = next_step->__fct;
-            int status;
-
-            /* If the function is called with no input this means we have
-               to reset to the initial state.  The possibly partly
-               converted input is dropped.  */
-            if (do_flush)
-              {
-                status = __GCONV_OK;
-
-                /* Possible emit a byte sequence which put the state object
-                   into the initial state.  */
-
-                /* Call the steps down the chain if there are any but only
-                   if we successfully emitted the escape sequence.  */
-                if (status == __GCONV_OK && ! data->__is_last)
-                  status = fct (next_step, next_data, NULL, NULL,
-                                written, 1);
-              }
-            else
-              {
-                /* We preserve the initial values of the pointer variables.  */
-                const char *inptr = *inbuf;
-                char *outbuf = data->__outbuf;
-                char *outend = data->__outbufend;
-                char *outptr;
-
-                do
-                  {
-                    /* Remember the start value for this round.  */
-                    inptr = *inbuf;
-                    /* The outbuf buffer is empty.  */
-                    outptr = outbuf;
-
-                    /* For stateful encodings the state must be safe here.  */
-
-                    /* Run the conversion loop.  `status' is set
-                       appropriately afterwards.  */
-
-                    /* If this is the last step, leave the loop. There is
-                       nothing we can do.  */
-                    if (data->__is_last)
-                      {
-                        /* Store information about how many bytes are
-                           available.  */
-                        data->__outbuf = outbuf;
-
-                       /* If any non-reversible conversions were performed,
-                          add the number to `*written'.  */
-
-                       break;
-                     }
-
-                    /* Write out all output that was produced.  */
-                    if (outbuf > outptr)
-                      {
-                        const char *outerr = data->__outbuf;
-                        int result;
-
-                        result = fct (next_step, next_data, &outerr,
-                                      outbuf, written, 0);
-
-                        if (result != __GCONV_EMPTY_INPUT)
-                          {
-                            if (outerr != outbuf)
-                              {
-                                /* Reset the input buffer pointer.  We
-                                   document here the complex case.  */
-                                size_t nstatus;
-
-                                /* Reload the pointers.  */
-                                *inbuf = inptr;
-                                outbuf = outptr;
-
-                                /* Possibly reset the state.  */
-
-                                /* Redo the conversion, but this time
-                                   the end of the output buffer is at
-                                   `outerr'.  */
-                              }
-
-                            /* Change the status.  */
-                            status = result;
-                          }
-                        else
-                          /* All the output is consumed, we can make
-                              another run if everything was ok.  */
-                          if (status == __GCONV_FULL_OUTPUT)
-                            status = __GCONV_OK;
-                     }
-                  }
-                while (status == __GCONV_OK);
-
-                /* We finished one use of this step.  */
-                ++data->__invocation_counter;
-              }
-
-            return status;
-          }
-
-   This information should be sufficient to write new modules.  Anybody
-doing so should also take a look at the available source code in the
-GNU C Library sources.  It contains many examples of working and
-optimized modules.
-
-
-File: libc.info,  Node: Locales,  Next: Message Translation,  Prev: Character Set Handling,  Up: Top
-
-7 Locales and Internationalization
-**********************************
-
-Different countries and cultures have varying conventions for how to
-communicate.  These conventions range from very simple ones, such as the
-format for representing dates and times, to very complex ones, such as
-the language spoken.
-
-   "Internationalization" of software means programming it to be able
-to adapt to the user's favorite conventions.  In ISO C,
-internationalization works by means of "locales".  Each locale
-specifies a collection of conventions, one convention for each purpose.
-The user chooses a set of conventions by specifying a locale (via
-environment variables).
-
-   All programs inherit the chosen locale as part of their environment.
-Provided the programs are written to obey the choice of locale, they
-will follow the conventions preferred by the user.
-
-* Menu:
-
-* Effects of Locale::           Actions affected by the choice of
-                                 locale.
-* Choosing Locale::             How the user specifies a locale.
-* Locale Categories::           Different purposes for which you can
-                                 select a locale.
-* Setting the Locale::          How a program specifies the locale
-                                 with library functions.
-* Standard Locales::            Locale names available on all systems.
-* Locale Information::          How to access the information for the locale.
-* Formatting Numbers::          A dedicated function to format numbers.
-* Yes-or-No Questions::         Check a Response against the locale.
-
-
-File: libc.info,  Node: Effects of Locale,  Next: Choosing Locale,  Up: Locales
-
-7.1 What Effects a Locale Has
-=============================
-
-Each locale specifies conventions for several purposes, including the
-following:
-
-   * What multibyte character sequences are valid, and how they are
-     interpreted (*note Character Set Handling::).
-
-   * Classification of which characters in the local character set are
-     considered alphabetic, and upper- and lower-case conversion
-     conventions (*note Character Handling::).
-
-   * The collating sequence for the local language and character set
-     (*note Collation Functions::).
-
-   * Formatting of numbers and currency amounts (*note General
-     Numeric::).
-
-   * Formatting of dates and times (*note Formatting Calendar Time::).
-
-   * What language to use for output, including error messages (*note
-     Message Translation::).
-
-   * What language to use for user answers to yes-or-no questions
-     (*note Yes-or-No Questions::).
-
-   * What language to use for more complex user input.  (The C library
-     doesn't yet help you implement this.)
-
-   Some aspects of adapting to the specified locale are handled
-automatically by the library subroutines.  For example, all your program
-needs to do in order to use the collating sequence of the chosen locale
-is to use `strcoll' or `strxfrm' to compare strings.
-
-   Other aspects of locales are beyond the comprehension of the library.
-For example, the library can't automatically translate your program's
-output messages into other languages.  The only way you can support
-output in the user's favorite language is to program this more or less
-by hand.  The C library provides functions to handle translations for
-multiple languages easily.
-
-   This chapter discusses the mechanism by which you can modify the
-current locale.  The effects of the current locale on specific library
-functions are discussed in more detail in the descriptions of those
-functions.
-
-
-File: libc.info,  Node: Choosing Locale,  Next: Locale Categories,  Prev: Effects of Locale,  Up: Locales
-
-7.2 Choosing a Locale
-=====================
-
-The simplest way for the user to choose a locale is to set the
-environment variable `LANG'.  This specifies a single locale to use for
-all purposes.  For example, a user could specify a hypothetical locale
-named `espana-castellano' to use the standard conventions of most of
-Spain.
-
-   The set of locales supported depends on the operating system you are
-using, and so do their names.  We can't make any promises about what
-locales will exist, except for one standard locale called `C' or
-`POSIX'.  Later we will describe how to construct locales.
-
-   A user also has the option of specifying different locales for
-different purposes--in effect, choosing a mixture of multiple locales.
-
-   For example, the user might specify the locale `espana-castellano'
-for most purposes, but specify the locale `usa-english' for currency
-formatting.  This might make sense if the user is a Spanish-speaking
-American, working in Spanish, but representing monetary amounts in US
-dollars.
-
-   Note that both locales `espana-castellano' and `usa-english', like
-all locales, would include conventions for all of the purposes to which
-locales apply.  However, the user can choose to use each locale for a
-particular subset of those purposes.
-
-
-File: libc.info,  Node: Locale Categories,  Next: Setting the Locale,  Prev: Choosing Locale,  Up: Locales
-
-7.3 Categories of Activities that Locales Affect
-================================================
-
-The purposes that locales serve are grouped into "categories", so that
-a user or a program can choose the locale for each category
-independently.  Here is a table of categories; each name is both an
-environment variable that a user can set, and a macro name that you can
-use as an argument to `setlocale'.
-
-`LC_COLLATE'
-     This category applies to collation of strings (functions `strcoll'
-     and `strxfrm'); see *note Collation Functions::.
-
-`LC_CTYPE'
-     This category applies to classification and conversion of
-     characters, and to multibyte and wide characters; see *note
-     Character Handling::, and *note Character Set Handling::.
-
-`LC_MONETARY'
-     This category applies to formatting monetary values; see *note
-     General Numeric::.
-
-`LC_NUMERIC'
-     This category applies to formatting numeric values that are not
-     monetary; see *note General Numeric::.
-
-`LC_TIME'
-     This category applies to formatting date and time values; see
-     *note Formatting Calendar Time::.
-
-`LC_MESSAGES'
-     This category applies to selecting the language used in the user
-     interface for message translation (*note The Uniforum approach::;
-     *note Message catalogs a la X/Open::)  and contains regular
-     expressions for affirmative and negative responses.
-
-`LC_ALL'
-     This is not an environment variable; it is only a macro that you
-     can use with `setlocale' to set a single locale for all purposes.
-     Setting this environment variable overwrites all selections by the
-     other `LC_*' variables or `LANG'.
-
-`LANG'
-     If this environment variable is defined, its value specifies the
-     locale to use for all purposes except as overridden by the
-     variables above.
-
-   When developing the message translation functions it was felt that
-the functionality provided by the variables above is not sufficient.
-For example, it should be possible to specify more than one locale name.
-Take a Swedish user who better speaks German than English, and a program
-whose messages are output in English by default.  It should be possible
-to specify that the first choice of language is Swedish, the second
-German, and if this also fails to use English.  This is possible with
-the variable `LANGUAGE'.  For further description of this GNU extension
-see *note Using gettextized software::.
-
-
-File: libc.info,  Node: Setting the Locale,  Next: Standard Locales,  Prev: Locale Categories,  Up: Locales
-
-7.4 How Programs Set the Locale
-===============================
-
-A C program inherits its locale environment variables when it starts up.
-This happens automatically.  However, these variables do not
-automatically control the locale used by the library functions, because
-ISO C says that all programs start by default in the standard `C'
-locale.  To use the locales specified by the environment, you must call
-`setlocale'.  Call it as follows:
-
-     setlocale (LC_ALL, "");
-
-to select a locale based on the user choice of the appropriate
-environment variables.
-
-   You can also use `setlocale' to specify a particular locale, for
-general use or for a specific category.
-
-   The symbols in this section are defined in the header file
-`locale.h'.
-
- -- Function: char * setlocale (int CATEGORY, const char *LOCALE)
-     Preliminary: | MT-Unsafe const:locale env | AS-Unsafe init lock
-     heap corrupt | AC-Unsafe init corrupt lock mem fd | *Note POSIX
-     Safety Concepts::.
-
-     The function `setlocale' sets the current locale for category
-     CATEGORY to LOCALE.  A list of all the locales the system provides
-     can be created by running
-
-            locale -a
-
-     If CATEGORY is `LC_ALL', this specifies the locale for all
-     purposes.  The other possible values of CATEGORY specify an single
-     purpose (*note Locale Categories::).
-
-     You can also use this function to find out the current locale by
-     passing a null pointer as the LOCALE argument.  In this case,
-     `setlocale' returns a string that is the name of the locale
-     currently selected for category CATEGORY.
-
-     The string returned by `setlocale' can be overwritten by subsequent
-     calls, so you should make a copy of the string (*note Copying and
-     Concatenation::) if you want to save it past any further calls to
-     `setlocale'.  (The standard library is guaranteed never to call
-     `setlocale' itself.)
-
-     You should not modify the string returned by `setlocale'.  It might
-     be the same string that was passed as an argument in a previous
-     call to `setlocale'.  One requirement is that the CATEGORY must be
-     the same in the call the string was returned and the one when the
-     string is passed in as LOCALE parameter.
-
-     When you read the current locale for category `LC_ALL', the value
-     encodes the entire combination of selected locales for all
-     categories.  In this case, the value is not just a single locale
-     name.  In fact, we don't make any promises about what it looks
-     like.  But if you specify the same "locale name" with `LC_ALL' in
-     a subsequent call to `setlocale', it restores the same combination
-     of locale selections.
-
-     To be sure you can use the returned string encoding the currently
-     selected locale at a later time, you must make a copy of the
-     string.  It is not guaranteed that the returned pointer remains
-     valid over time.
-
-     When the LOCALE argument is not a null pointer, the string returned
-     by `setlocale' reflects the newly-modified locale.
-
-     If you specify an empty string for LOCALE, this means to read the
-     appropriate environment variable and use its value to select the
-     locale for CATEGORY.
-
-     If a nonempty string is given for LOCALE, then the locale of that
-     name is used if possible.
-
-     If you specify an invalid locale name, `setlocale' returns a null
-     pointer and leaves the current locale unchanged.
-
-   The path used for finding locale data can be set using the `LOCPATH'
-environment variable. The default path for finding locale data is
-system specific.  It is computed from the value given as the prefix
-while configuring the C library.  This value normally is `/usr' or `/'.
-For the former the complete path is:
-
-     /usr/lib/locale
-
-   Here is an example showing how you might use `setlocale' to
-temporarily switch to a new locale.
-
-     #include <stddef.h>
-     #include <locale.h>
-     #include <stdlib.h>
-     #include <string.h>
-
-     void
-     with_other_locale (char *new_locale,
-                        void (*subroutine) (int),
-                        int argument)
-     {
-       char *old_locale, *saved_locale;
-
-       /* Get the name of the current locale.  */
-       old_locale = setlocale (LC_ALL, NULL);
-
-       /* Copy the name so it won't be clobbered by `setlocale'. */
-       saved_locale = strdup (old_locale);
-       if (saved_locale == NULL)
-         fatal ("Out of memory");
-
-       /* Now change the locale and do some stuff with it. */
-       setlocale (LC_ALL, new_locale);
-       (*subroutine) (argument);
-
-       /* Restore the original locale. */
-       setlocale (LC_ALL, saved_locale);
-       free (saved_locale);
-     }
-
-   *Portability Note:* Some ISO C systems may define additional locale
-categories, and future versions of the library will do so.  For
-portability, assume that any symbol beginning with `LC_' might be
-defined in `locale.h'.
-
-
-File: libc.info,  Node: Standard Locales,  Next: Locale Information,  Prev: Setting the Locale,  Up: Locales
-
-7.5 Standard Locales
-====================
-
-The only locale names you can count on finding on all operating systems
-are these three standard ones:
-
-`"C"'
-     This is the standard C locale.  The attributes and behavior it
-     provides are specified in the ISO C standard.  When your program
-     starts up, it initially uses this locale by default.
-
-`"POSIX"'
-     This is the standard POSIX locale.  Currently, it is an alias for
-     the standard C locale.
-
-`""'
-     The empty name says to select a locale based on environment
-     variables.  *Note Locale Categories::.
-
-   Defining and installing named locales is normally a responsibility of
-the system administrator at your site (or the person who installed the
-GNU C Library).  It is also possible for the user to create private
-locales.  All this will be discussed later when describing the tool to
-do so.
-
-   If your program needs to use something other than the `C' locale, it
-will be more portable if you use whatever locale the user specifies
-with the environment, rather than trying to specify some non-standard
-locale explicitly by name.  Remember, different machines might have
-different sets of locales installed.
-
-
-File: libc.info,  Node: Locale Information,  Next: Formatting Numbers,  Prev: Standard Locales,  Up: Locales
-
-7.6 Accessing Locale Information
-================================
-
-There are several ways to access locale information.  The simplest way
-is to let the C library itself do the work.  Several of the functions
-in this library implicitly access the locale data, and use what
-information is provided by the currently selected locale.  This is how
-the locale model is meant to work normally.
-
-   As an example take the `strftime' function, which is meant to nicely
-format date and time information (*note Formatting Calendar Time::).
-Part of the standard information contained in the `LC_TIME' category is
-the names of the months.  Instead of requiring the programmer to take
-care of providing the translations the `strftime' function does this
-all by itself.  `%A' in the format string is replaced by the
-appropriate weekday name of the locale currently selected by `LC_TIME'.
-This is an easy example, and wherever possible functions do things
-automatically in this way.
-
-   But there are quite often situations when there is simply no function
-to perform the task, or it is simply not possible to do the work
-automatically.  For these cases it is necessary to access the
-information in the locale directly.  To do this the C library provides
-two functions: `localeconv' and `nl_langinfo'.  The former is part of
-ISO C and therefore portable, but has a brain-damaged interface.  The
-second is part of the Unix interface and is portable in as far as the
-system follows the Unix standards.
-
-* Menu:
-
-* The Lame Way to Locale Data::   ISO C's `localeconv'.
-* The Elegant and Fast Way::      X/Open's `nl_langinfo'.
-
-
-File: libc.info,  Node: The Lame Way to Locale Data,  Next: The Elegant and Fast Way,  Up: Locale Information
-
-7.6.1 `localeconv': It is portable but ...
-------------------------------------------
-
-Together with the `setlocale' function the ISO C people invented the
-`localeconv' function.  It is a masterpiece of poor design.  It is
-expensive to use, not extendable, and not generally usable as it
-provides access to only `LC_MONETARY' and `LC_NUMERIC' related
-information.  Nevertheless, if it is applicable to a given situation it
-should be used since it is very portable.  The function `strfmon'
-formats monetary amounts according to the selected locale using this
-information.  
-
- -- Function: struct lconv * localeconv (void)
-     Preliminary: | MT-Unsafe race:localeconv locale | AS-Unsafe |
-     AC-Safe | *Note POSIX Safety Concepts::.
-
-     The `localeconv' function returns a pointer to a structure whose
-     components contain information about how numeric and monetary
-     values should be formatted in the current locale.
-
-     You should not modify the structure or its contents.  The
-     structure might be overwritten by subsequent calls to
-     `localeconv', or by calls to `setlocale', but no other function in
-     the library overwrites this value.
-
- -- Data Type: struct lconv
-     `localeconv''s return value is of this data type.  Its elements are
-     described in the following subsections.
-
-   If a member of the structure `struct lconv' has type `char', and the
-value is `CHAR_MAX', it means that the current locale has no value for
-that parameter.
-
-* Menu:
-
-* General Numeric::             Parameters for formatting numbers and
-                                 currency amounts.
-* Currency Symbol::             How to print the symbol that identifies an
-                                 amount of money (e.g. `$').
-* Sign of Money Amount::        How to print the (positive or negative) sign
-                                 for a monetary amount, if one exists.
-
-
-File: libc.info,  Node: General Numeric,  Next: Currency Symbol,  Up: The Lame Way to Locale Data
-
-7.6.1.1 Generic Numeric Formatting Parameters
-.............................................
-
-These are the standard members of `struct lconv'; there may be others.
-
-`char *decimal_point'
-`char *mon_decimal_point'
-     These are the decimal-point separators used in formatting
-     non-monetary and monetary quantities, respectively.  In the `C'
-     locale, the value of `decimal_point' is `"."', and the value of
-     `mon_decimal_point' is `""'.  
-
-`char *thousands_sep'
-`char *mon_thousands_sep'
-     These are the separators used to delimit groups of digits to the
-     left of the decimal point in formatting non-monetary and monetary
-     quantities, respectively.  In the `C' locale, both members have a
-     value of `""' (the empty string).
-
-`char *grouping'
-`char *mon_grouping'
-     These are strings that specify how to group the digits to the left
-     of the decimal point.  `grouping' applies to non-monetary
-     quantities and `mon_grouping' applies to monetary quantities.  Use
-     either `thousands_sep' or `mon_thousands_sep' to separate the digit
-     groups.  
-
-     Each member of these strings is to be interpreted as an integer
-     value of type `char'.  Successive numbers (from left to right)
-     give the sizes of successive groups (from right to left, starting
-     at the decimal point.)  The last member is either `0', in which
-     case the previous member is used over and over again for all the
-     remaining groups, or `CHAR_MAX', in which case there is no more
-     grouping--or, put another way, any remaining digits form one large
-     group without separators.
-
-     For example, if `grouping' is `"\04\03\02"', the correct grouping
-     for the number `123456787654321' is `12', `34', `56', `78', `765',
-     `4321'.  This uses a group of 4 digits at the end, preceded by a
-     group of 3 digits, preceded by groups of 2 digits (as many as
-     needed).  With a separator of `,', the number would be printed as
-     `12,34,56,78,765,4321'.
-
-     A value of `"\03"' indicates repeated groups of three digits, as
-     normally used in the U.S.
-
-     In the standard `C' locale, both `grouping' and `mon_grouping'
-     have a value of `""'.  This value specifies no grouping at all.
-
-`char int_frac_digits'
-`char frac_digits'
-     These are small integers indicating how many fractional digits (to
-     the right of the decimal point) should be displayed in a monetary
-     value in international and local formats, respectively.  (Most
-     often, both members have the same value.)
-
-     In the standard `C' locale, both of these members have the value
-     `CHAR_MAX', meaning "unspecified".  The ISO standard doesn't say
-     what to do when you find this value; we recommend printing no
-     fractional digits.  (This locale also specifies the empty string
-     for `mon_decimal_point', so printing any fractional digits would be
-     confusing!)
-
-
-File: libc.info,  Node: Currency Symbol,  Next: Sign of Money Amount,  Prev: General Numeric,  Up: The Lame Way to Locale Data
-
-7.6.1.2 Printing the Currency Symbol
-....................................
-
-These members of the `struct lconv' structure specify how to print the
-symbol to identify a monetary value--the international analog of `$'
-for US dollars.
-
-   Each country has two standard currency symbols.  The "local currency
-symbol" is used commonly within the country, while the "international
-currency symbol" is used internationally to refer to that country's
-currency when it is necessary to indicate the country unambiguously.
-
-   For example, many countries use the dollar as their monetary unit,
-and when dealing with international currencies it's important to specify
-that one is dealing with (say) Canadian dollars instead of U.S. dollars
-or Australian dollars.  But when the context is known to be Canada,
-there is no need to make this explicit--dollar amounts are implicitly
-assumed to be in Canadian dollars.
-
-`char *currency_symbol'
-     The local currency symbol for the selected locale.
-
-     In the standard `C' locale, this member has a value of `""' (the
-     empty string), meaning "unspecified".  The ISO standard doesn't
-     say what to do when you find this value; we recommend you simply
-     print the empty string as you would print any other string pointed
-     to by this variable.
-
-`char *int_curr_symbol'
-     The international currency symbol for the selected locale.
-
-     The value of `int_curr_symbol' should normally consist of a
-     three-letter abbreviation determined by the international standard
-     `ISO 4217 Codes for the Representation of Currency and Funds',
-     followed by a one-character separator (often a space).
-
-     In the standard `C' locale, this member has a value of `""' (the
-     empty string), meaning "unspecified".  We recommend you simply
-     print the empty string as you would print any other string pointed
-     to by this variable.
-
-`char p_cs_precedes'
-`char n_cs_precedes'
-`char int_p_cs_precedes'
-`char int_n_cs_precedes'
-     These members are `1' if the `currency_symbol' or
-     `int_curr_symbol' strings should precede the value of a monetary
-     amount, or `0' if the strings should follow the value.  The
-     `p_cs_precedes' and `int_p_cs_precedes' members apply to positive
-     amounts (or zero), and the `n_cs_precedes' and `int_n_cs_precedes'
-     members apply to negative amounts.
-
-     In the standard `C' locale, all of these members have a value of
-     `CHAR_MAX', meaning "unspecified".  The ISO standard doesn't say
-     what to do when you find this value.  We recommend printing the
-     currency symbol before the amount, which is right for most
-     countries.  In other words, treat all nonzero values alike in
-     these members.
-
-     The members with the `int_' prefix apply to the `int_curr_symbol'
-     while the other two apply to `currency_symbol'.
-
-`char p_sep_by_space'
-`char n_sep_by_space'
-`char int_p_sep_by_space'
-`char int_n_sep_by_space'
-     These members are `1' if a space should appear between the
-     `currency_symbol' or `int_curr_symbol' strings and the amount, or
-     `0' if no space should appear.  The `p_sep_by_space' and
-     `int_p_sep_by_space' members apply to positive amounts (or zero),
-     and the `n_sep_by_space' and `int_n_sep_by_space' members apply to
-     negative amounts.
-
-     In the standard `C' locale, all of these members have a value of
-     `CHAR_MAX', meaning "unspecified".  The ISO standard doesn't say
-     what you should do when you find this value; we suggest you treat
-     it as 1 (print a space).  In other words, treat all nonzero values
-     alike in these members.
-
-     The members with the `int_' prefix apply to the `int_curr_symbol'
-     while the other two apply to `currency_symbol'.  There is one
-     specialty with the `int_curr_symbol', though.  Since all legal
-     values contain a space at the end the string one either printf
-     this space (if the currency symbol must appear in front and must
-     be separated) or one has to avoid printing this character at all
-     (especially when at the end of the string).
-
-
-File: libc.info,  Node: Sign of Money Amount,  Prev: Currency Symbol,  Up: The Lame Way to Locale Data
-
-7.6.1.3 Printing the Sign of a Monetary Amount
-..............................................
-
-These members of the `struct lconv' structure specify how to print the
-sign (if any) of a monetary value.
-
-`char *positive_sign'
-`char *negative_sign'
-     These are strings used to indicate positive (or zero) and negative
-     monetary quantities, respectively.
-
-     In the standard `C' locale, both of these members have a value of
-     `""' (the empty string), meaning "unspecified".
-
-     The ISO standard doesn't say what to do when you find this value;
-     we recommend printing `positive_sign' as you find it, even if it is
-     empty.  For a negative value, print `negative_sign' as you find it
-     unless both it and `positive_sign' are empty, in which case print
-     `-' instead.  (Failing to indicate the sign at all seems rather
-     unreasonable.)
-
-`char p_sign_posn'
-`char n_sign_posn'
-`char int_p_sign_posn'
-`char int_n_sign_posn'
-     These members are small integers that indicate how to position the
-     sign for nonnegative and negative monetary quantities,
-     respectively.  (The string used by the sign is what was specified
-     with `positive_sign' or `negative_sign'.)  The possible values are
-     as follows:
-
-    `0'
-          The currency symbol and quantity should be surrounded by
-          parentheses.
-
-    `1'
-          Print the sign string before the quantity and currency symbol.
-
-    `2'
-          Print the sign string after the quantity and currency symbol.
-
-    `3'
-          Print the sign string right before the currency symbol.
-
-    `4'
-          Print the sign string right after the currency symbol.
-
-    `CHAR_MAX'
-          "Unspecified".  Both members have this value in the standard
-          `C' locale.
-
-     The ISO standard doesn't say what you should do when the value is
-     `CHAR_MAX'.  We recommend you print the sign after the currency
-     symbol.
-
-     The members with the `int_' prefix apply to the `int_curr_symbol'
-     while the other two apply to `currency_symbol'.
-
-
-File: libc.info,  Node: The Elegant and Fast Way,  Prev: The Lame Way to Locale Data,  Up: Locale Information
-
-7.6.2 Pinpoint Access to Locale Data
-------------------------------------
-
-When writing the X/Open Portability Guide the authors realized that the
-`localeconv' function is not enough to provide reasonable access to
-locale information.  The information which was meant to be available in
-the locale (as later specified in the POSIX.1 standard) requires more
-ways to access it.  Therefore the `nl_langinfo' function was introduced.
-
- -- Function: char * nl_langinfo (nl_item ITEM)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     The `nl_langinfo' function can be used to access individual
-     elements of the locale categories.  Unlike the `localeconv'
-     function, which returns all the information, `nl_langinfo' lets
-     the caller select what information it requires.  This is very fast
-     and it is not a problem to call this function multiple times.
-
-     A second advantage is that in addition to the numeric and monetary
-     formatting information, information from the `LC_TIME' and
-     `LC_MESSAGES' categories is available.
-
-     The type `nl_type' is defined in `nl_types.h'.  The argument ITEM
-     is a numeric value defined in the header `langinfo.h'.  The X/Open
-     standard defines the following values:
-
-    `CODESET'
-          `nl_langinfo' returns a string with the name of the coded
-          character set used in the selected locale.
-
-    `ABDAY_1'
-    `ABDAY_2'
-    `ABDAY_3'
-    `ABDAY_4'
-    `ABDAY_5'
-    `ABDAY_6'
-    `ABDAY_7'
-          `nl_langinfo' returns the abbreviated weekday name.  `ABDAY_1'
-          corresponds to Sunday.
-
-    `DAY_1'
-    `DAY_2'
-    `DAY_3'
-    `DAY_4'
-    `DAY_5'
-    `DAY_6'
-    `DAY_7'
-          Similar to `ABDAY_1' etc., but here the return value is the
-          unabbreviated weekday name.
-
-    `ABMON_1'
-    `ABMON_2'
-    `ABMON_3'
-    `ABMON_4'
-    `ABMON_5'
-    `ABMON_6'
-    `ABMON_7'
-    `ABMON_8'
-    `ABMON_9'
-    `ABMON_10'
-    `ABMON_11'
-    `ABMON_12'
-          The return value is abbreviated name of the month.  `ABMON_1'
-          corresponds to January.
-
-    `MON_1'
-    `MON_2'
-    `MON_3'
-    `MON_4'
-    `MON_5'
-    `MON_6'
-    `MON_7'
-    `MON_8'
-    `MON_9'
-    `MON_10'
-    `MON_11'
-    `MON_12'
-          Similar to `ABMON_1' etc., but here the month names are not
-          abbreviated.  Here the first value `MON_1' also corresponds
-          to January.
-
-    `AM_STR'
-    `PM_STR'
-          The return values are strings which can be used in the
-          representation of time as an hour from 1 to 12 plus an am/pm
-          specifier.
-
-          Note that in locales which do not use this time representation
-          these strings might be empty, in which case the am/pm format
-          cannot be used at all.
-
-    `D_T_FMT'
-          The return value can be used as a format string for
-          `strftime' to represent time and date in a locale-specific
-          way.
-
-    `D_FMT'
-          The return value can be used as a format string for
-          `strftime' to represent a date in a locale-specific way.
-
-    `T_FMT'
-          The return value can be used as a format string for
-          `strftime' to represent time in a locale-specific way.
-
-    `T_FMT_AMPM'
-          The return value can be used as a format string for
-          `strftime' to represent time in the am/pm format.
-
-          Note that if the am/pm format does not make any sense for the
-          selected locale, the return value might be the same as the
-          one for `T_FMT'.
-
-    `ERA'
-          The return value represents the era used in the current
-          locale.
-
-          Most locales do not define this value.  An example of a
-          locale which does define this value is the Japanese one.  In
-          Japan, the traditional representation of dates includes the
-          name of the era corresponding to the then-emperor's reign.
-
-          Normally it should not be necessary to use this value
-          directly.  Specifying the `E' modifier in their format
-          strings causes the `strftime' functions to use this
-          information.  The format of the returned string is not
-          specified, and therefore you should not assume knowledge of
-          it on different systems.
-
-    `ERA_YEAR'
-          The return value gives the year in the relevant era of the
-          locale.  As for `ERA' it should not be necessary to use this
-          value directly.
-
-    `ERA_D_T_FMT'
-          This return value can be used as a format string for
-          `strftime' to represent dates and times in a locale-specific
-          era-based way.
-
-    `ERA_D_FMT'
-          This return value can be used as a format string for
-          `strftime' to represent a date in a locale-specific era-based
-          way.
-
-    `ERA_T_FMT'
-          This return value can be used as a format string for
-          `strftime' to represent time in a locale-specific era-based
-          way.
-
-    `ALT_DIGITS'
-          The return value is a representation of up to 100 values used
-          to represent the values 0 to 99.  As for `ERA' this value is
-          not intended to be used directly, but instead indirectly
-          through the `strftime' function.  When the modifier `O' is
-          used in a format which would otherwise use numerals to
-          represent hours, minutes, seconds, weekdays, months, or
-          weeks, the appropriate value for the locale is used instead.
-
-    `INT_CURR_SYMBOL'
-          The same as the value returned by `localeconv' in the
-          `int_curr_symbol' element of the `struct lconv'.
-
-    `CURRENCY_SYMBOL'
-    `CRNCYSTR'
-          The same as the value returned by `localeconv' in the
-          `currency_symbol' element of the `struct lconv'.
-
-          `CRNCYSTR' is a deprecated alias still required by Unix98.
-
-    `MON_DECIMAL_POINT'
-          The same as the value returned by `localeconv' in the
-          `mon_decimal_point' element of the `struct lconv'.
-
-    `MON_THOUSANDS_SEP'
-          The same as the value returned by `localeconv' in the
-          `mon_thousands_sep' element of the `struct lconv'.
-
-    `MON_GROUPING'
-          The same as the value returned by `localeconv' in the
-          `mon_grouping' element of the `struct lconv'.
-
-    `POSITIVE_SIGN'
-          The same as the value returned by `localeconv' in the
-          `positive_sign' element of the `struct lconv'.
-
-    `NEGATIVE_SIGN'
-          The same as the value returned by `localeconv' in the
-          `negative_sign' element of the `struct lconv'.
-
-    `INT_FRAC_DIGITS'
-          The same as the value returned by `localeconv' in the
-          `int_frac_digits' element of the `struct lconv'.
-
-    `FRAC_DIGITS'
-          The same as the value returned by `localeconv' in the
-          `frac_digits' element of the `struct lconv'.
-
-    `P_CS_PRECEDES'
-          The same as the value returned by `localeconv' in the
-          `p_cs_precedes' element of the `struct lconv'.
-
-    `P_SEP_BY_SPACE'
-          The same as the value returned by `localeconv' in the
-          `p_sep_by_space' element of the `struct lconv'.
-
-    `N_CS_PRECEDES'
-          The same as the value returned by `localeconv' in the
-          `n_cs_precedes' element of the `struct lconv'.
-
-    `N_SEP_BY_SPACE'
-          The same as the value returned by `localeconv' in the
-          `n_sep_by_space' element of the `struct lconv'.
-
-    `P_SIGN_POSN'
-          The same as the value returned by `localeconv' in the
-          `p_sign_posn' element of the `struct lconv'.
-
-    `N_SIGN_POSN'
-          The same as the value returned by `localeconv' in the
-          `n_sign_posn' element of the `struct lconv'.
-
-    `INT_P_CS_PRECEDES'
-          The same as the value returned by `localeconv' in the
-          `int_p_cs_precedes' element of the `struct lconv'.
-
-    `INT_P_SEP_BY_SPACE'
-          The same as the value returned by `localeconv' in the
-          `int_p_sep_by_space' element of the `struct lconv'.
-
-    `INT_N_CS_PRECEDES'
-          The same as the value returned by `localeconv' in the
-          `int_n_cs_precedes' element of the `struct lconv'.
-
-    `INT_N_SEP_BY_SPACE'
-          The same as the value returned by `localeconv' in the
-          `int_n_sep_by_space' element of the `struct lconv'.
-
-    `INT_P_SIGN_POSN'
-          The same as the value returned by `localeconv' in the
-          `int_p_sign_posn' element of the `struct lconv'.
-
-    `INT_N_SIGN_POSN'
-          The same as the value returned by `localeconv' in the
-          `int_n_sign_posn' element of the `struct lconv'.
-
-    `DECIMAL_POINT'
-    `RADIXCHAR'
-          The same as the value returned by `localeconv' in the
-          `decimal_point' element of the `struct lconv'.
-
-          The name `RADIXCHAR' is a deprecated alias still used in
-          Unix98.
-
-    `THOUSANDS_SEP'
-    `THOUSEP'
-          The same as the value returned by `localeconv' in the
-          `thousands_sep' element of the `struct lconv'.
-
-          The name `THOUSEP' is a deprecated alias still used in Unix98.
-
-    `GROUPING'
-          The same as the value returned by `localeconv' in the
-          `grouping' element of the `struct lconv'.
-
-    `YESEXPR'
-          The return value is a regular expression which can be used
-          with the `regex' function to recognize a positive response to
-          a yes/no question.  The GNU C Library provides the `rpmatch'
-          function for easier handling in applications.
-
-    `NOEXPR'
-          The return value is a regular expression which can be used
-          with the `regex' function to recognize a negative response to
-          a yes/no question.
-
-    `YESSTR'
-          The return value is a locale-specific translation of the
-          positive response to a yes/no question.
-
-          Using this value is deprecated since it is a very special
-          case of message translation, and is better handled by the
-          message translation functions (*note Message Translation::).
-
-          The use of this symbol is deprecated.  Instead message
-          translation should be used.
-
-    `NOSTR'
-          The return value is a locale-specific translation of the
-          negative response to a yes/no question.  What is said for
-          `YESSTR' is also true here.
-
-          The use of this symbol is deprecated.  Instead message
-          translation should be used.
-
-     The file `langinfo.h' defines a lot more symbols but none of them
-     is official.  Using them is not portable, and the format of the
-     return values might change.  Therefore we recommended you not use
-     them.
-
-     Note that the return value for any valid argument can be used for
-     in all situations (with the possible exception of the am/pm time
-     formatting codes).  If the user has not selected any locale for the
-     appropriate category, `nl_langinfo' returns the information from
-     the `"C"' locale.  It is therefore possible to use this function as
-     shown in the example below.
-
-     If the argument ITEM is not valid, a pointer to an empty string is
-     returned.
-
-   An example of `nl_langinfo' usage is a function which has to print a
-given date and time in a locale-specific way.  At first one might think
-that, since `strftime' internally uses the locale information, writing
-something like the following is enough:
-
-     size_t
-     i18n_time_n_data (char *s, size_t len, const struct tm *tp)
-     {
-       return strftime (s, len, "%X %D", tp);
-     }
-
-   The format contains no weekday or month names and therefore is
-internationally usable.  Wrong!  The output produced is something like
-`"hh:mm:ss MM/DD/YY"'.  This format is only recognizable in the USA.
-Other countries use different formats.  Therefore the function should
-be rewritten like this:
-
-     size_t
-     i18n_time_n_data (char *s, size_t len, const struct tm *tp)
-     {
-       return strftime (s, len, nl_langinfo (D_T_FMT), tp);
-     }
-
-   Now it uses the date and time format of the locale selected when the
-program runs.  If the user selects the locale correctly there should
-never be a misunderstanding over the time and date format.
-
-
-File: libc.info,  Node: Formatting Numbers,  Next: Yes-or-No Questions,  Prev: Locale Information,  Up: Locales
-
-7.7 A dedicated function to format numbers
-==========================================
-
-We have seen that the structure returned by `localeconv' as well as the
-values given to `nl_langinfo' allow you to retrieve the various pieces
-of locale-specific information to format numbers and monetary amounts.
-We have also seen that the underlying rules are quite complex.
-
-   Therefore the X/Open standards introduce a function which uses such
-locale information, making it easier for the user to format numbers
-according to these rules.
-
- -- Function: ssize_t strfmon (char *S, size_t MAXSIZE, const char
-          *FORMAT, ...)
-     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
-     *Note POSIX Safety Concepts::.
-
-     The `strfmon' function is similar to the `strftime' function in
-     that it takes a buffer, its size, a format string, and values to
-     write into the buffer as text in a form specified by the format
-     string.  Like `strftime', the function also returns the number of
-     bytes written into the buffer.
-
-     There are two differences: `strfmon' can take more than one
-     argument, and, of course, the format specification is different.
-     Like `strftime', the format string consists of normal text, which
-     is output as is, and format specifiers, which are indicated by a
-     `%'.  Immediately after the `%', you can optionally specify
-     various flags and formatting information before the main
-     formatting character, in a similar way to `printf':
-
-        * Immediately following the `%' there can be one or more of the
-          following flags:
-         `=F'
-               The single byte character F is used for this field as
-               the numeric fill character.  By default this character
-               is a space character.  Filling with this character is
-               only performed if a left precision is specified.  It is
-               not just to fill to the given field width.
-
-         `^'
-               The number is printed without grouping the digits
-               according to the rules of the current locale.  By
-               default grouping is enabled.
-
-         `+', `('
-               At most one of these flags can be used.  They select
-               which format to represent the sign of a currency amount.
-               By default, and if `+' is given, the locale equivalent
-               of +/- is used.  If `(' is given, negative amounts are
-               enclosed in parentheses.  The exact format is determined
-               by the values of the `LC_MONETARY' category of the
-               locale selected at program runtime.
-
-         `!'
-               The output will not contain the currency symbol.
-
-         `-'
-               The output will be formatted left-justified instead of
-               right-justified if it does not fill the entire field
-               width.
-
-     The next part of a specification is an optional field width.  If no
-     width is specified 0 is taken.  During output, the function first
-     determines how much space is required.  If it requires at least as
-     many characters as given by the field width, it is output using as
-     much space as necessary.  Otherwise, it is extended to use the
-     full width by filling with the space character.  The presence or
-     absence of the `-' flag determines the side at which such padding
-     occurs.  If present, the spaces are added at the right making the
-     output left-justified, and vice versa.
-
-     So far the format looks familiar, being similar to the `printf' and
-     `strftime' formats.  However, the next two optional fields
-     introduce something new.  The first one is a `#' character followed
-     by a decimal digit string.  The value of the digit string
-     specifies the number of _digit_ positions to the left of the
-     decimal point (or equivalent).  This does _not_ include the
-     grouping character when the `^' flag is not given.  If the space
-     needed to print the number does not fill the whole width, the
-     field is padded at the left side with the fill character, which
-     can be selected using the `=' flag and by default is a space.  For
-     example, if the field width is selected as 6 and the number is
-     123, the fill character is `*' the result will be `***123'.
-
-     The second optional field starts with a `.' (period) and consists
-     of another decimal digit string.  Its value describes the number of
-     characters printed after the decimal point.  The default is
-     selected from the current locale (`frac_digits',
-     `int_frac_digits', see *note General Numeric::).  If the exact
-     representation needs more digits than given by the field width,
-     the displayed value is rounded.  If the number of fractional
-     digits is selected to be zero, no decimal point is printed.
-
-     As a GNU extension, the `strfmon' implementation in the GNU C
-     Library allows an optional `L' next as a format modifier.  If this
-     modifier is given, the argument is expected to be a `long double'
-     instead of a `double' value.
-
-     Finally, the last component is a format specifier.  There are three
-     specifiers defined:
-
-    `i'
-          Use the locale's rules for formatting an international
-          currency value.
-
-    `n'
-          Use the locale's rules for formatting a national currency
-          value.
-
-    `%'
-          Place a `%' in the output.  There must be no flag, width
-          specifier or modifier given, only `%%' is allowed.
-
-     As for `printf', the function reads the format string from left to
-     right and uses the values passed to the function following the
-     format string.  The values are expected to be either of type
-     `double' or `long double', depending on the presence of the
-     modifier `L'.  The result is stored in the buffer pointed to by S.
-     At most MAXSIZE characters are stored.
-
-     The return value of the function is the number of characters
-     stored in S, including the terminating `NULL' byte.  If the number
-     of characters stored would exceed MAXSIZE, the function returns -1
-     and the content of the buffer S is unspecified.  In this case
-     `errno' is set to `E2BIG'.
-
-   A few examples should make clear how the function works.  It is
-assumed that all the following pieces of code are executed in a program
-which uses the USA locale (`en_US').  The simplest form of the format
-is this:
-
-     strfmon (buf, 100, "@%n@%n@%n@", 123.45, -567.89, 12345.678);
-
-The output produced is
-     "@$123.45@-$567.89@$12,345.68@"
-
-   We can notice several things here.  First, the widths of the output
-numbers are different.  We have not specified a width in the format
-string, and so this is no wonder.  Second, the third number is printed
-using thousands separators.  The thousands separator for the `en_US'
-locale is a comma.  The number is also rounded.  .678 is rounded to .68
-since the format does not specify a precision and the default value in
-the locale is 2.  Finally, note that the national currency symbol is
-printed since `%n' was used, not `i'.  The next example shows how we
-can align the output.
-
-     strfmon (buf, 100, "@%=*11n@%=*11n@%=*11n@", 123.45, -567.89, 12345.678);
-
-The output this time is:
-
-     "@    $123.45@   -$567.89@ $12,345.68@"
-
-   Two things stand out.  Firstly, all fields have the same width
-(eleven characters) since this is the width given in the format and
-since no number required more characters to be printed.  The second
-important point is that the fill character is not used.  This is
-correct since the white space was not used to achieve a precision given
-by a `#' modifier, but instead to fill to the given width.  The
-difference becomes obvious if we now add a width specification.
-
-     strfmon (buf, 100, "@%=*11#5n@%=*11#5n@%=*11#5n@",
-              123.45, -567.89, 12345.678);
-
-The output is
-
-     "@ $***123.45@-$***567.89@ $12,456.68@"
-
-   Here we can see that all the currency symbols are now aligned, and
-that the space between the currency sign and the number is filled with
-the selected fill character.  Note that although the width is selected
-to be 5 and 123.45 has three digits left of the decimal point, the
-space is filled with three asterisks.  This is correct since, as
-explained above, the width does not include the positions used to store
-thousands separators.  One last example should explain the remaining
-functionality.
-
-     strfmon (buf, 100, "@%=0(16#5.3i@%=0(16#5.3i@%=0(16#5.3i@",
-              123.45, -567.89, 12345.678);
-
-This rather complex format string produces the following output:
-
-     "@ USD 000123,450 @(USD 000567.890)@ USD 12,345.678 @"
-
-   The most noticeable change is the alternative way of representing
-negative numbers.  In financial circles this is often done using
-parentheses, and this is what the `(' flag selected.  The fill
-character is now `0'.  Note that this `0' character is not regarded as
-a numeric zero, and therefore the first and second numbers are not
-printed using a thousands separator.  Since we used the format
-specifier `i' instead of `n', the international form of the currency
-symbol is used.  This is a four letter string, in this case `"USD "'.
-The last point is that since the precision right of the decimal point
-is selected to be three, the first and second numbers are printed with
-an extra zero at the end and the third number is printed without
-rounding.
-
-
-File: libc.info,  Node: Yes-or-No Questions,  Prev: Formatting Numbers,  Up: Locales
-
-7.8 Yes-or-No Questions
-=======================
-
-Some non GUI programs ask a yes-or-no question.  If the messages
-(especially the questions) are translated into foreign languages, be
-sure that you localize the answers too.  It would be very bad habit to
-ask a question in one language and request the answer in another, often
-English.
-
-   The GNU C Library contains `rpmatch' to give applications easy
-access to the corresponding locale definitions.
-
- -- Function: int rpmatch (const char *RESPONSE)
-     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap lock dlopen
-     | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
-
-     The function `rpmatch' checks the string in RESPONSE whether or
-     not it is a correct yes-or-no answer and if yes, which one.  The
-     check uses the `YESEXPR' and `NOEXPR' data in the `LC_MESSAGES'
-     category of the currently selected locale.  The return value is as
-     follows:
-
-    `1'
-          The user entered an affirmative answer.
-
-    `0'
-          The user entered a negative answer.
-
-    `-1'
-          The answer matched neither the `YESEXPR' nor the `NOEXPR'
-          regular expression.
-
-     This function is not standardized but available beside in the GNU
-     C Library at least also in the IBM AIX library.
-
-This function would normally be used like this:
-
-       ...
-       /* Use a safe default.  */
-       _Bool doit = false;
-
-       fputs (gettext ("Do you really want to do this? "), stdout);
-       fflush (stdout);
-       /* Prepare the `getline' call.  */
-       line = NULL;
-       len = 0;
-       while (getline (&line, &len, stdin) >= 0)
-         {
-           /* Check the response.  */
-           int res = rpmatch (line);
-           if (res >= 0)
-             {
-               /* We got a definitive answer.  */
-               if (res > 0)
-                 doit = true;
-               break;
-             }
-         }
-       /* Free what `getline' allocated.  */
-       free (line);
-
-   Note that the loop continues until a read error is detected or until
-a definitive (positive or negative) answer is read.
-
-
-File: libc.info,  Node: Message Translation,  Next: Searching and Sorting,  Prev: Locales,  Up: Top
-
-8 Message Translation
-*********************
-
-The program's interface with the user should be designed to ease the
-user's task.  One way to ease the user's task is to use messages in
-whatever language the user prefers.
-
-   Printing messages in different languages can be implemented in
-different ways.  One could add all the different languages in the
-source code and choose among the variants every time a message has to
-be printed.  This is certainly not a good solution since extending the
-set of languages is cumbersome (the code must be changed) and the code
-itself can become really big with dozens of message sets.
-
-   A better solution is to keep the message sets for each language in
-separate files which are loaded at runtime depending on the language
-selection of the user.
-
-   The GNU C Library provides two different sets of functions to support
-message translation.  The problem is that neither of the interfaces is
-officially defined by the POSIX standard.  The `catgets' family of
-functions is defined in the X/Open standard but this is derived from
-industry decisions and therefore not necessarily based on reasonable
-decisions.
-
-   As mentioned above the message catalog handling provides easy
-extendibility by using external data files which contain the message
-translations.  I.e., these files contain for each of the messages used
-in the program a translation for the appropriate language.  So the tasks
-of the message handling functions are
-
-   * locate the external data file with the appropriate translations
-
-   * load the data and make it possible to address the messages
-
-   * map a given key to the translated message
-
-   The two approaches mainly differ in the implementation of this last
-step.  Decisions made in the last step influence the rest of the design.
-
-* Menu:
-
-* Message catalogs a la X/Open::  The `catgets' family of functions.
-* The Uniforum approach::         The `gettext' family of functions.
-
-
-File: libc.info,  Node: Message catalogs a la X/Open,  Next: The Uniforum approach,  Up: Message Translation
-
-8.1 X/Open Message Catalog Handling
-===================================
-
-The `catgets' functions are based on the simple scheme:
-
-     Associate every message to translate in the source code with a
-     unique identifier.  To retrieve a message from a catalog file
-     solely the identifier is used.
-
-   This means for the author of the program that s/he will have to make
-sure the meaning of the identifier in the program code and in the
-message catalogs are always the same.
-
-   Before a message can be translated the catalog file must be located.
-The user of the program must be able to guide the responsible function
-to find whatever catalog the user wants.  This is separated from what
-the programmer had in mind.
-
-   All the types, constants and functions for the `catgets' functions
-are defined/declared in the `nl_types.h' header file.
-
-* Menu:
-
-* The catgets Functions::      The `catgets' function family.
-* The message catalog files::  Format of the message catalog files.
-* The gencat program::         How to generate message catalogs files which
-                                can be used by the functions.
-* Common Usage::               How to use the `catgets' interface.
+     The function 'mblen' is declared in 'stdlib.h'.
 
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-3 b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-3
index 5ef6542..2731853 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-3
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-3
@@ -1,7 +1,24 @@
-This is
-/usr/local/google/home/jnewlin/src/uclibc/buildroot/output/build/glibc-2.19/build/manual/libc.info,
-produced by makeinfo version 4.13 from libc.texinfo.
+This is libc.info, produced by makeinfo version 5.2 from libc.texinfo.
 
+This file documents the GNU C Library.
+
+   This is 'The GNU C Library Reference Manual', for version 2.19
+(Buildroot).
+
+   Copyright (C) 1993-2014 Free Software Foundation, Inc.
+
+   Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being "Free Software Needs Free Documentation" and
+"GNU Lesser General Public License", the Front-Cover texts being "A GNU
+Manual", and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled "GNU Free Documentation
+License".
+
+   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
+modify this GNU manual.  Buying copies from the FSF supports it in
+developing GNU and promoting software freedom."
 INFO-DIR-SECTION Software libraries
 START-INFO-DIR-ENTRY
 * Libc: (libc).                 C library.
@@ -1692,42 +1709,2765 @@
 * ynl: (libc)Special Functions.
 END-INFO-DIR-ENTRY
 
-   This file documents the GNU C Library.
+
+File: libc.info,  Node: Non-reentrant String Conversion,  Next: Shift State,  Prev: Non-reentrant Character Conversion,  Up: Non-reentrant Conversion
 
-   This is `The GNU C Library Reference Manual', for version 2.19
-(Buildroot).
+6.4.2 Non-reentrant Conversion of Strings
+-----------------------------------------
 
-   Copyright (C) 1993-2014 Free Software Foundation, Inc.
+For convenience the ISO C90 standard also defines functions to convert
+entire strings instead of single characters.  These functions suffer
+from the same problems as their reentrant counterparts from Amendment 1
+to ISO C90; see *note Converting Strings::.
 
-   Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version
-1.3 or any later version published by the Free Software Foundation;
-with the Invariant Sections being "Free Software Needs Free
-Documentation" and "GNU Lesser General Public License", the Front-Cover
-texts being "A GNU Manual", and with the Back-Cover Texts as in (a)
-below.  A copy of the license is included in the section entitled "GNU
-Free Documentation License".
+ -- Function: size_t mbstowcs (wchar_t *WSTRING, const char *STRING,
+          size_t SIZE)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt heap lock dlopen |
+     AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
 
-   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
-modify this GNU manual.  Buying copies from the FSF supports it in
-developing GNU and promoting software freedom."
+     The 'mbstowcs' ("multibyte string to wide character string")
+     function converts the null-terminated string of multibyte
+     characters STRING to an array of wide character codes, storing not
+     more than SIZE wide characters into the array beginning at WSTRING.
+     The terminating null character counts towards the size, so if SIZE
+     is less than the actual number of wide characters resulting from
+     STRING, no terminating null character is stored.
+
+     The conversion of characters from STRING begins in the initial
+     shift state.
+
+     If an invalid multibyte character sequence is found, the 'mbstowcs'
+     function returns a value of -1.  Otherwise, it returns the number
+     of wide characters stored in the array WSTRING.  This number does
+     not include the terminating null character, which is present if the
+     number is less than SIZE.
+
+     Here is an example showing how to convert a string of multibyte
+     characters, allocating enough space for the result.
+
+          wchar_t *
+          mbstowcs_alloc (const char *string)
+          {
+            size_t size = strlen (string) + 1;
+            wchar_t *buf = xmalloc (size * sizeof (wchar_t));
+
+            size = mbstowcs (buf, string, size);
+            if (size == (size_t) -1)
+              return NULL;
+            buf = xrealloc (buf, (size + 1) * sizeof (wchar_t));
+            return buf;
+          }
+
+ -- Function: size_t wcstombs (char *STRING, const wchar_t *WSTRING,
+          size_t SIZE)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt heap lock dlopen |
+     AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
+
+     The 'wcstombs' ("wide character string to multibyte string")
+     function converts the null-terminated wide character array WSTRING
+     into a string containing multibyte characters, storing not more
+     than SIZE bytes starting at STRING, followed by a terminating null
+     character if there is room.  The conversion of characters begins in
+     the initial shift state.
+
+     The terminating null character counts towards the size, so if SIZE
+     is less than or equal to the number of bytes needed in WSTRING, no
+     terminating null character is stored.
+
+     If a code that does not correspond to a valid multibyte character
+     is found, the 'wcstombs' function returns a value of -1.
+     Otherwise, the return value is the number of bytes stored in the
+     array STRING.  This number does not include the terminating null
+     character, which is present if the number is less than SIZE.
+
+
+File: libc.info,  Node: Shift State,  Prev: Non-reentrant String Conversion,  Up: Non-reentrant Conversion
+
+6.4.3 States in Non-reentrant Functions
+---------------------------------------
+
+In some multibyte character codes, the _meaning_ of any particular byte
+sequence is not fixed; it depends on what other sequences have come
+earlier in the same string.  Typically there are just a few sequences
+that can change the meaning of other sequences; these few are called
+"shift sequences" and we say that they set the "shift state" for other
+sequences that follow.
+
+   To illustrate shift state and shift sequences, suppose we decide that
+the sequence '0200' (just one byte) enters Japanese mode, in which pairs
+of bytes in the range from '0240' to '0377' are single characters, while
+'0201' enters Latin-1 mode, in which single bytes in the range from
+'0240' to '0377' are characters, and interpreted according to the ISO
+Latin-1 character set.  This is a multibyte code that has two
+alternative shift states ("Japanese mode" and "Latin-1 mode"), and two
+shift sequences that specify particular shift states.
+
+   When the multibyte character code in use has shift states, then
+'mblen', 'mbtowc', and 'wctomb' must maintain and update the current
+shift state as they scan the string.  To make this work properly, you
+must follow these rules:
+
+   * Before starting to scan a string, call the function with a null
+     pointer for the multibyte character address--for example, 'mblen
+     (NULL, 0)'.  This initializes the shift state to its standard
+     initial value.
+
+   * Scan the string one character at a time, in order.  Do not "back
+     up" and rescan characters already scanned, and do not intersperse
+     the processing of different strings.
+
+   Here is an example of using 'mblen' following these rules:
+
+     void
+     scan_string (char *s)
+     {
+       int length = strlen (s);
+
+       /* Initialize shift state.  */
+       mblen (NULL, 0);
+
+       while (1)
+         {
+           int thischar = mblen (s, length);
+           /* Deal with end of string and invalid characters.  */
+           if (thischar == 0)
+             break;
+           if (thischar == -1)
+             {
+               error ("invalid multibyte character");
+               break;
+             }
+           /* Advance past this character.  */
+           s += thischar;
+           length -= thischar;
+         }
+     }
+
+   The functions 'mblen', 'mbtowc' and 'wctomb' are not reentrant when
+using a multibyte code that uses a shift state.  However, no other
+library functions call these functions, so you don't have to worry that
+the shift state will be changed mysteriously.
+
+
+File: libc.info,  Node: Generic Charset Conversion,  Prev: Non-reentrant Conversion,  Up: Character Set Handling
+
+6.5 Generic Charset Conversion
+==============================
+
+The conversion functions mentioned so far in this chapter all had in
+common that they operate on character sets that are not directly
+specified by the functions.  The multibyte encoding used is specified by
+the currently selected locale for the 'LC_CTYPE' category.  The wide
+character set is fixed by the implementation (in the case of the GNU C
+Library it is always UCS-4 encoded ISO 10646.
+
+   This has of course several problems when it comes to general
+character conversion:
+
+   * For every conversion where neither the source nor the destination
+     character set is the character set of the locale for the 'LC_CTYPE'
+     category, one has to change the 'LC_CTYPE' locale using
+     'setlocale'.
+
+     Changing the 'LC_CTYPE' locale introduces major problems for the
+     rest of the programs since several more functions (e.g., the
+     character classification functions, *note Classification of
+     Characters::) use the 'LC_CTYPE' category.
+
+   * Parallel conversions to and from different character sets are not
+     possible since the 'LC_CTYPE' selection is global and shared by all
+     threads.
+
+   * If neither the source nor the destination character set is the
+     character set used for 'wchar_t' representation, there is at least
+     a two-step process necessary to convert a text using the functions
+     above.  One would have to select the source character set as the
+     multibyte encoding, convert the text into a 'wchar_t' text, select
+     the destination character set as the multibyte encoding, and
+     convert the wide character text to the multibyte (= destination)
+     character set.
+
+     Even if this is possible (which is not guaranteed) it is a very
+     tiring work.  Plus it suffers from the other two raised points even
+     more due to the steady changing of the locale.
+
+   The XPG2 standard defines a completely new set of functions, which
+has none of these limitations.  They are not at all coupled to the
+selected locales, and they have no constraints on the character sets
+selected for source and destination.  Only the set of available
+conversions limits them.  The standard does not specify that any
+conversion at all must be available.  Such availability is a measure of
+the quality of the implementation.
+
+   In the following text first the interface to 'iconv' and then the
+conversion function, will be described.  Comparisons with other
+implementations will show what obstacles stand in the way of portable
+applications.  Finally, the implementation is described in so far as
+might interest the advanced user who wants to extend conversion
+capabilities.
+
+* Menu:
+
+* Generic Conversion Interface::    Generic Character Set Conversion Interface.
+* iconv Examples::                  A complete 'iconv' example.
+* Other iconv Implementations::     Some Details about other 'iconv'
+                                     Implementations.
+* glibc iconv Implementation::      The 'iconv' Implementation in the GNU C
+                                     library.
+
+
+File: libc.info,  Node: Generic Conversion Interface,  Next: iconv Examples,  Up: Generic Charset Conversion
+
+6.5.1 Generic Character Set Conversion Interface
+------------------------------------------------
+
+This set of functions follows the traditional cycle of using a resource:
+open-use-close.  The interface consists of three functions, each of
+which implements one step.
+
+   Before the interfaces are described it is necessary to introduce a
+data type.  Just like other open-use-close interfaces the functions
+introduced here work using handles and the 'iconv.h' header defines a
+special type for the handles used.
+
+ -- Data Type: iconv_t
+     This data type is an abstract type defined in 'iconv.h'.  The user
+     must not assume anything about the definition of this type; it must
+     be completely opaque.
+
+     Objects of this type can get assigned handles for the conversions
+     using the 'iconv' functions.  The objects themselves need not be
+     freed, but the conversions for which the handles stand for have to.
+
+The first step is the function to create a handle.
+
+ -- Function: iconv_t iconv_open (const char *TOCODE, const char
+          *FROMCODE)
+     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap lock dlopen
+     | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
+
+     The 'iconv_open' function has to be used before starting a
+     conversion.  The two parameters this function takes determine the
+     source and destination character set for the conversion, and if the
+     implementation has the possibility to perform such a conversion,
+     the function returns a handle.
+
+     If the wanted conversion is not available, the 'iconv_open'
+     function returns '(iconv_t) -1'.  In this case the global variable
+     'errno' can have the following values:
+
+     'EMFILE'
+          The process already has 'OPEN_MAX' file descriptors open.
+     'ENFILE'
+          The system limit of open file is reached.
+     'ENOMEM'
+          Not enough memory to carry out the operation.
+     'EINVAL'
+          The conversion from FROMCODE to TOCODE is not supported.
+
+     It is not possible to use the same descriptor in different threads
+     to perform independent conversions.  The data structures associated
+     with the descriptor include information about the conversion state.
+     This must not be messed up by using it in different conversions.
+
+     An 'iconv' descriptor is like a file descriptor as for every use a
+     new descriptor must be created.  The descriptor does not stand for
+     all of the conversions from FROMSET to TOSET.
+
+     The GNU C Library implementation of 'iconv_open' has one
+     significant extension to other implementations.  To ease the
+     extension of the set of available conversions, the implementation
+     allows storing the necessary files with data and code in an
+     arbitrary number of directories.  How this extension must be
+     written will be explained below (*note glibc iconv
+     Implementation::).  Here it is only important to say that all
+     directories mentioned in the 'GCONV_PATH' environment variable are
+     considered only if they contain a file 'gconv-modules'.  These
+     directories need not necessarily be created by the system
+     administrator.  In fact, this extension is introduced to help users
+     writing and using their own, new conversions.  Of course, this does
+     not work for security reasons in SUID binaries; in this case only
+     the system directory is considered and this normally is
+     'PREFIX/lib/gconv'.  The 'GCONV_PATH' environment variable is
+     examined exactly once at the first call of the 'iconv_open'
+     function.  Later modifications of the variable have no effect.
+
+     The 'iconv_open' function was introduced early in the X/Open
+     Portability Guide, version 2.  It is supported by all commercial
+     Unices as it is required for the Unix branding.  However, the
+     quality and completeness of the implementation varies widely.  The
+     'iconv_open' function is declared in 'iconv.h'.
+
+   The 'iconv' implementation can associate large data structure with
+the handle returned by 'iconv_open'.  Therefore, it is crucial to free
+all the resources once all conversions are carried out and the
+conversion is not needed anymore.
+
+ -- Function: int iconv_close (iconv_t CD)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt heap lock dlopen |
+     AC-Unsafe corrupt lock mem | *Note POSIX Safety Concepts::.
+
+     The 'iconv_close' function frees all resources associated with the
+     handle CD, which must have been returned by a successful call to
+     the 'iconv_open' function.
+
+     If the function call was successful the return value is 0.
+     Otherwise it is -1 and 'errno' is set appropriately.  Defined error
+     are:
+
+     'EBADF'
+          The conversion descriptor is invalid.
+
+     The 'iconv_close' function was introduced together with the rest of
+     the 'iconv' functions in XPG2 and is declared in 'iconv.h'.
+
+   The standard defines only one actual conversion function.  This has,
+therefore, the most general interface: it allows conversion from one
+buffer to another.  Conversion from a file to a buffer, vice versa, or
+even file to file can be implemented on top of it.
+
+ -- Function: size_t iconv (iconv_t CD, char **INBUF, size_t
+          *INBYTESLEFT, char **OUTBUF, size_t *OUTBYTESLEFT)
+     Preliminary: | MT-Safe race:cd | AS-Safe | AC-Unsafe corrupt |
+     *Note POSIX Safety Concepts::.
+
+     The 'iconv' function converts the text in the input buffer
+     according to the rules associated with the descriptor CD and stores
+     the result in the output buffer.  It is possible to call the
+     function for the same text several times in a row since for
+     stateful character sets the necessary state information is kept in
+     the data structures associated with the descriptor.
+
+     The input buffer is specified by '*INBUF' and it contains
+     '*INBYTESLEFT' bytes.  The extra indirection is necessary for
+     communicating the used input back to the caller (see below).  It is
+     important to note that the buffer pointer is of type 'char' and the
+     length is measured in bytes even if the input text is encoded in
+     wide characters.
+
+     The output buffer is specified in a similar way.  '*OUTBUF' points
+     to the beginning of the buffer with at least '*OUTBYTESLEFT' bytes
+     room for the result.  The buffer pointer again is of type 'char'
+     and the length is measured in bytes.  If OUTBUF or '*OUTBUF' is a
+     null pointer, the conversion is performed but no output is
+     available.
+
+     If INBUF is a null pointer, the 'iconv' function performs the
+     necessary action to put the state of the conversion into the
+     initial state.  This is obviously a no-op for non-stateful
+     encodings, but if the encoding has a state, such a function call
+     might put some byte sequences in the output buffer, which perform
+     the necessary state changes.  The next call with INBUF not being a
+     null pointer then simply goes on from the initial state.  It is
+     important that the programmer never makes any assumption as to
+     whether the conversion has to deal with states.  Even if the input
+     and output character sets are not stateful, the implementation
+     might still have to keep states.  This is due to the implementation
+     chosen for the GNU C Library as it is described below.  Therefore
+     an 'iconv' call to reset the state should always be performed if
+     some protocol requires this for the output text.
+
+     The conversion stops for one of three reasons.  The first is that
+     all characters from the input buffer are converted.  This actually
+     can mean two things: either all bytes from the input buffer are
+     consumed or there are some bytes at the end of the buffer that
+     possibly can form a complete character but the input is incomplete.
+     The second reason for a stop is that the output buffer is full.
+     And the third reason is that the input contains invalid characters.
+
+     In all of these cases the buffer pointers after the last successful
+     conversion, for input and output buffer, are stored in INBUF and
+     OUTBUF, and the available room in each buffer is stored in
+     INBYTESLEFT and OUTBYTESLEFT.
+
+     Since the character sets selected in the 'iconv_open' call can be
+     almost arbitrary, there can be situations where the input buffer
+     contains valid characters, which have no identical representation
+     in the output character set.  The behavior in this situation is
+     undefined.  The _current_ behavior of the GNU C Library in this
+     situation is to return with an error immediately.  This certainly
+     is not the most desirable solution; therefore, future versions will
+     provide better ones, but they are not yet finished.
+
+     If all input from the input buffer is successfully converted and
+     stored in the output buffer, the function returns the number of
+     non-reversible conversions performed.  In all other cases the
+     return value is '(size_t) -1' and 'errno' is set appropriately.  In
+     such cases the value pointed to by INBYTESLEFT is nonzero.
+
+     'EILSEQ'
+          The conversion stopped because of an invalid byte sequence in
+          the input.  After the call, '*INBUF' points at the first byte
+          of the invalid byte sequence.
+
+     'E2BIG'
+          The conversion stopped because it ran out of space in the
+          output buffer.
+
+     'EINVAL'
+          The conversion stopped because of an incomplete byte sequence
+          at the end of the input buffer.
+
+     'EBADF'
+          The CD argument is invalid.
+
+     The 'iconv' function was introduced in the XPG2 standard and is
+     declared in the 'iconv.h' header.
+
+   The definition of the 'iconv' function is quite good overall.  It
+provides quite flexible functionality.  The only problems lie in the
+boundary cases, which are incomplete byte sequences at the end of the
+input buffer and invalid input.  A third problem, which is not really a
+design problem, is the way conversions are selected.  The standard does
+not say anything about the legitimate names, a minimal set of available
+conversions.  We will see how this negatively impacts other
+implementations, as demonstrated below.
+
+
+File: libc.info,  Node: iconv Examples,  Next: Other iconv Implementations,  Prev: Generic Conversion Interface,  Up: Generic Charset Conversion
+
+6.5.2 A complete 'iconv' example
+--------------------------------
+
+The example below features a solution for a common problem.  Given that
+one knows the internal encoding used by the system for 'wchar_t'
+strings, one often is in the position to read text from a file and store
+it in wide character buffers.  One can do this using 'mbsrtowcs', but
+then we run into the problems discussed above.
+
+     int
+     file2wcs (int fd, const char *charset, wchar_t *outbuf, size_t avail)
+     {
+       char inbuf[BUFSIZ];
+       size_t insize = 0;
+       char *wrptr = (char *) outbuf;
+       int result = 0;
+       iconv_t cd;
+
+       cd = iconv_open ("WCHAR_T", charset);
+       if (cd == (iconv_t) -1)
+         {
+           /* Something went wrong.  */
+           if (errno == EINVAL)
+             error (0, 0, "conversion from '%s' to wchar_t not available",
+                    charset);
+           else
+             perror ("iconv_open");
+
+           /* Terminate the output string.  */
+           *outbuf = L'\0';
+
+           return -1;
+         }
+
+       while (avail > 0)
+         {
+           size_t nread;
+           size_t nconv;
+           char *inptr = inbuf;
+
+           /* Read more input.  */
+           nread = read (fd, inbuf + insize, sizeof (inbuf) - insize);
+           if (nread == 0)
+             {
+               /* When we come here the file is completely read.
+                  This still could mean there are some unused
+                  characters in the 'inbuf'.  Put them back.  */
+               if (lseek (fd, -insize, SEEK_CUR) == -1)
+                 result = -1;
+
+               /* Now write out the byte sequence to get into the
+                  initial state if this is necessary.  */
+               iconv (cd, NULL, NULL, &wrptr, &avail);
+
+               break;
+             }
+           insize += nread;
+
+           /* Do the conversion.  */
+           nconv = iconv (cd, &inptr, &insize, &wrptr, &avail);
+           if (nconv == (size_t) -1)
+             {
+               /* Not everything went right.  It might only be
+                  an unfinished byte sequence at the end of the
+                  buffer.  Or it is a real problem.  */
+               if (errno == EINVAL)
+                 /* This is harmless.  Simply move the unused
+                    bytes to the beginning of the buffer so that
+                    they can be used in the next round.  */
+                 memmove (inbuf, inptr, insize);
+               else
+                 {
+                   /* It is a real problem.  Maybe we ran out of
+                      space in the output buffer or we have invalid
+                      input.  In any case back the file pointer to
+                      the position of the last processed byte.  */
+                   lseek (fd, -insize, SEEK_CUR);
+                   result = -1;
+                   break;
+                 }
+             }
+         }
+
+       /* Terminate the output string.  */
+       if (avail >= sizeof (wchar_t))
+         *((wchar_t *) wrptr) = L'\0';
+
+       if (iconv_close (cd) != 0)
+         perror ("iconv_close");
+
+       return (wchar_t *) wrptr - outbuf;
+     }
+
+   This example shows the most important aspects of using the 'iconv'
+functions.  It shows how successive calls to 'iconv' can be used to
+convert large amounts of text.  The user does not have to care about
+stateful encodings as the functions take care of everything.
+
+   An interesting point is the case where 'iconv' returns an error and
+'errno' is set to 'EINVAL'.  This is not really an error in the
+transformation.  It can happen whenever the input character set contains
+byte sequences of more than one byte for some character and texts are
+not processed in one piece.  In this case there is a chance that a
+multibyte sequence is cut.  The caller can then simply read the
+remainder of the takes and feed the offending bytes together with new
+character from the input to 'iconv' and continue the work.  The internal
+state kept in the descriptor is _not_ unspecified after such an event as
+is the case with the conversion functions from the ISO C standard.
+
+   The example also shows the problem of using wide character strings
+with 'iconv'.  As explained in the description of the 'iconv' function
+above, the function always takes a pointer to a 'char' array and the
+available space is measured in bytes.  In the example, the output buffer
+is a wide character buffer; therefore, we use a local variable WRPTR of
+type 'char *', which is used in the 'iconv' calls.
+
+   This looks rather innocent but can lead to problems on platforms that
+have tight restriction on alignment.  Therefore the caller of 'iconv'
+has to make sure that the pointers passed are suitable for access of
+characters from the appropriate character set.  Since, in the above
+case, the input parameter to the function is a 'wchar_t' pointer, this
+is the case (unless the user violates alignment when computing the
+parameter).  But in other situations, especially when writing generic
+functions where one does not know what type of character set one uses
+and, therefore, treats text as a sequence of bytes, it might become
+tricky.
+
+
+File: libc.info,  Node: Other iconv Implementations,  Next: glibc iconv Implementation,  Prev: iconv Examples,  Up: Generic Charset Conversion
+
+6.5.3 Some Details about other 'iconv' Implementations
+------------------------------------------------------
+
+This is not really the place to discuss the 'iconv' implementation of
+other systems but it is necessary to know a bit about them to write
+portable programs.  The above mentioned problems with the specification
+of the 'iconv' functions can lead to portability issues.
+
+   The first thing to notice is that, due to the large number of
+character sets in use, it is certainly not practical to encode the
+conversions directly in the C library.  Therefore, the conversion
+information must come from files outside the C library.  This is usually
+done in one or both of the following ways:
+
+   * The C library contains a set of generic conversion functions that
+     can read the needed conversion tables and other information from
+     data files.  These files get loaded when necessary.
+
+     This solution is problematic as it requires a great deal of effort
+     to apply to all character sets (potentially an infinite set).  The
+     differences in the structure of the different character sets is so
+     large that many different variants of the table-processing
+     functions must be developed.  In addition, the generic nature of
+     these functions make them slower than specifically implemented
+     functions.
+
+   * The C library only contains a framework that can dynamically load
+     object files and execute the conversion functions contained
+     therein.
+
+     This solution provides much more flexibility.  The C library itself
+     contains only very little code and therefore reduces the general
+     memory footprint.  Also, with a documented interface between the C
+     library and the loadable modules it is possible for third parties
+     to extend the set of available conversion modules.  A drawback of
+     this solution is that dynamic loading must be available.
+
+   Some implementations in commercial Unices implement a mixture of
+these possibilities; the majority implement only the second solution.
+Using loadable modules moves the code out of the library itself and
+keeps the door open for extensions and improvements, but this design is
+also limiting on some platforms since not many platforms support dynamic
+loading in statically linked programs.  On platforms without this
+capability it is therefore not possible to use this interface in
+statically linked programs.  The GNU C Library has, on ELF platforms, no
+problems with dynamic loading in these situations; therefore, this point
+is moot.  The danger is that one gets acquainted with this situation and
+forgets about the restrictions on other systems.
+
+   A second thing to know about other 'iconv' implementations is that
+the number of available conversions is often very limited.  Some
+implementations provide, in the standard release (not special
+international or developer releases), at most 100 to 200 conversion
+possibilities.  This does not mean 200 different character sets are
+supported; for example, conversions from one character set to a set of
+10 others might count as 10 conversions.  Together with the other
+direction this makes 20 conversion possibilities used up by one
+character set.  One can imagine the thin coverage these platform
+provide.  Some Unix vendors even provide only a handful of conversions,
+which renders them useless for almost all uses.
+
+   This directly leads to a third and probably the most problematic
+point.  The way the 'iconv' conversion functions are implemented on all
+known Unix systems and the availability of the conversion functions from
+character set A to B and the conversion from B to C does _not_ imply
+that the conversion from A to C is available.
+
+   This might not seem unreasonable and problematic at first, but it is
+a quite big problem as one will notice shortly after hitting it.  To
+show the problem we assume to write a program that has to convert from A
+to C.  A call like
+
+     cd = iconv_open ("C", "A");
+
+fails according to the assumption above.  But what does the program do
+now?  The conversion is necessary; therefore, simply giving up is not an
+option.
+
+   This is a nuisance.  The 'iconv' function should take care of this.
+But how should the program proceed from here on?  If it tries to convert
+to character set B, first the two 'iconv_open' calls
+
+     cd1 = iconv_open ("B", "A");
+
+and
+
+     cd2 = iconv_open ("C", "B");
+
+will succeed, but how to find B?
+
+   Unfortunately, the answer is: there is no general solution.  On some
+systems guessing might help.  On those systems most character sets can
+convert to and from UTF-8 encoded ISO 10646 or Unicode text.  Beside
+this only some very system-specific methods can help.  Since the
+conversion functions come from loadable modules and these modules must
+be stored somewhere in the filesystem, one _could_ try to find them and
+determine from the available file which conversions are available and
+whether there is an indirect route from A to C.
+
+   This example shows one of the design errors of 'iconv' mentioned
+above.  It should at least be possible to determine the list of
+available conversion programmatically so that if 'iconv_open' says there
+is no such conversion, one could make sure this also is true for
+indirect routes.
+
+
+File: libc.info,  Node: glibc iconv Implementation,  Prev: Other iconv Implementations,  Up: Generic Charset Conversion
+
+6.5.4 The 'iconv' Implementation in the GNU C Library
+-----------------------------------------------------
+
+After reading about the problems of 'iconv' implementations in the last
+section it is certainly good to note that the implementation in the GNU
+C Library has none of the problems mentioned above.  What follows is a
+step-by-step analysis of the points raised above.  The evaluation is
+based on the current state of the development (as of January 1999).  The
+development of the 'iconv' functions is not complete, but basic
+functionality has solidified.
+
+   The GNU C Library's 'iconv' implementation uses shared loadable
+modules to implement the conversions.  A very small number of
+conversions are built into the library itself but these are only rather
+trivial conversions.
+
+   All the benefits of loadable modules are available in the GNU C
+Library implementation.  This is especially appealing since the
+interface is well documented (see below), and it, therefore, is easy to
+write new conversion modules.  The drawback of using loadable objects is
+not a problem in the GNU C Library, at least on ELF systems.  Since the
+library is able to load shared objects even in statically linked
+binaries, static linking need not be forbidden in case one wants to use
+'iconv'.
+
+   The second mentioned problem is the number of supported conversions.
+Currently, the GNU C Library supports more than 150 character sets.  The
+way the implementation is designed the number of supported conversions
+is greater than 22350 (150 times 149).  If any conversion from or to a
+character set is missing, it can be added easily.
+
+   Particularly impressive as it may be, this high number is due to the
+fact that the GNU C Library implementation of 'iconv' does not have the
+third problem mentioned above (i.e., whenever there is a conversion from
+a character set A to B and from B to C it is always possible to convert
+from A to C directly).  If the 'iconv_open' returns an error and sets
+'errno' to 'EINVAL', there is no known way, directly or indirectly, to
+perform the wanted conversion.
+
+   Triangulation is achieved by providing for each character set a
+conversion from and to UCS-4 encoded ISO 10646.  Using ISO 10646 as an
+intermediate representation it is possible to "triangulate" (i.e.,
+convert with an intermediate representation).
+
+   There is no inherent requirement to provide a conversion to ISO 10646
+for a new character set, and it is also possible to provide other
+conversions where neither source nor destination character set is
+ISO 10646.  The existing set of conversions is simply meant to cover all
+conversions that might be of interest.
+
+   All currently available conversions use the triangulation method
+above, making conversion run unnecessarily slow.  If, for example,
+somebody often needs the conversion from ISO-2022-JP to EUC-JP, a
+quicker solution would involve direct conversion between the two
+character sets, skipping the input to ISO 10646 first.  The two
+character sets of interest are much more similar to each other than to
+ISO 10646.
+
+   In such a situation one easily can write a new conversion and provide
+it as a better alternative.  The GNU C Library 'iconv' implementation
+would automatically use the module implementing the conversion if it is
+specified to be more efficient.
+
+6.5.4.1 Format of 'gconv-modules' files
+.......................................
+
+All information about the available conversions comes from a file named
+'gconv-modules', which can be found in any of the directories along the
+'GCONV_PATH'.  The 'gconv-modules' files are line-oriented text files,
+where each of the lines has one of the following formats:
+
+   * If the first non-whitespace character is a '#' the line contains
+     only comments and is ignored.
+
+   * Lines starting with 'alias' define an alias name for a character
+     set.  Two more words are expected on the line.  The first word
+     defines the alias name, and the second defines the original name of
+     the character set.  The effect is that it is possible to use the
+     alias name in the FROMSET or TOSET parameters of 'iconv_open' and
+     achieve the same result as when using the real character set name.
+
+     This is quite important as a character set has often many different
+     names.  There is normally an official name but this need not
+     correspond to the most popular name.  Beside this many character
+     sets have special names that are somehow constructed.  For example,
+     all character sets specified by the ISO have an alias of the form
+     'ISO-IR-NNN' where NNN is the registration number.  This allows
+     programs that know about the registration number to construct
+     character set names and use them in 'iconv_open' calls.  More on
+     the available names and aliases follows below.
+
+   * Lines starting with 'module' introduce an available conversion
+     module.  These lines must contain three or four more words.
+
+     The first word specifies the source character set, the second word
+     the destination character set of conversion implemented in this
+     module, and the third word is the name of the loadable module.  The
+     filename is constructed by appending the usual shared object suffix
+     (normally '.so') and this file is then supposed to be found in the
+     same directory the 'gconv-modules' file is in.  The last word on
+     the line, which is optional, is a numeric value representing the
+     cost of the conversion.  If this word is missing, a cost of 1 is
+     assumed.  The numeric value itself does not matter that much; what
+     counts are the relative values of the sums of costs for all
+     possible conversion paths.  Below is a more precise description of
+     the use of the cost value.
+
+   Returning to the example above where one has written a module to
+directly convert from ISO-2022-JP to EUC-JP and back.  All that has to
+be done is to put the new module, let its name be ISO2022JP-EUCJP.so, in
+a directory and add a file 'gconv-modules' with the following content in
+the same directory:
+
+     module  ISO-2022-JP//   EUC-JP//        ISO2022JP-EUCJP    1
+     module  EUC-JP//        ISO-2022-JP//   ISO2022JP-EUCJP    1
+
+   To see why this is sufficient, it is necessary to understand how the
+conversion used by 'iconv' (and described in the descriptor) is
+selected.  The approach to this problem is quite simple.
+
+   At the first call of the 'iconv_open' function the program reads all
+available 'gconv-modules' files and builds up two tables: one containing
+all the known aliases and another that contains the information about
+the conversions and which shared object implements them.
+
+6.5.4.2 Finding the conversion path in 'iconv'
+..............................................
+
+The set of available conversions form a directed graph with weighted
+edges.  The weights on the edges are the costs specified in the
+'gconv-modules' files.  The 'iconv_open' function uses an algorithm
+suitable for search for the best path in such a graph and so constructs
+a list of conversions that must be performed in succession to get the
+transformation from the source to the destination character set.
+
+   Explaining why the above 'gconv-modules' files allows the 'iconv'
+implementation to resolve the specific ISO-2022-JP to EUC-JP conversion
+module instead of the conversion coming with the library itself is
+straightforward.  Since the latter conversion takes two steps (from
+ISO-2022-JP to ISO 10646 and then from ISO 10646 to EUC-JP), the cost is
+1+1 = 2.  The above 'gconv-modules' file, however, specifies that the
+new conversion modules can perform this conversion with only the cost of
+1.
+
+   A mysterious item about the 'gconv-modules' file above (and also the
+file coming with the GNU C Library) are the names of the character sets
+specified in the 'module' lines.  Why do almost all the names end in
+'//'?  And this is not all: the names can actually be regular
+expressions.  At this point in time this mystery should not be revealed,
+unless you have the relevant spell-casting materials: ashes from an
+original DOS 6.2 boot disk burnt in effigy, a crucifix blessed by St.
+Emacs, assorted herbal roots from Central America, sand from Cebu, etc.
+Sorry!  *The part of the implementation where this is used is not yet
+finished.  For now please simply follow the existing examples.  It'll
+become clearer once it is.  -drepper*
+
+   A last remark about the 'gconv-modules' is about the names not ending
+with '//'.  A character set named 'INTERNAL' is often mentioned.  From
+the discussion above and the chosen name it should have become clear
+that this is the name for the representation used in the intermediate
+step of the triangulation.  We have said that this is UCS-4 but actually
+that is not quite right.  The UCS-4 specification also includes the
+specification of the byte ordering used.  Since a UCS-4 value consists
+of four bytes, a stored value is affected by byte ordering.  The
+internal representation is _not_ the same as UCS-4 in case the byte
+ordering of the processor (or at least the running process) is not the
+same as the one required for UCS-4.  This is done for performance
+reasons as one does not want to perform unnecessary byte-swapping
+operations if one is not interested in actually seeing the result in
+UCS-4.  To avoid trouble with endianness, the internal representation
+consistently is named 'INTERNAL' even on big-endian systems where the
+representations are identical.
+
+6.5.4.3 'iconv' module data structures
+......................................
+
+So far this section has described how modules are located and considered
+to be used.  What remains to be described is the interface of the
+modules so that one can write new ones.  This section describes the
+interface as it is in use in January 1999.  The interface will change a
+bit in the future but, with luck, only in an upwardly compatible way.
+
+   The definitions necessary to write new modules are publicly available
+in the non-standard header 'gconv.h'.  The following text, therefore,
+describes the definitions from this header file.  First, however, it is
+necessary to get an overview.
+
+   From the perspective of the user of 'iconv' the interface is quite
+simple: the 'iconv_open' function returns a handle that can be used in
+calls to 'iconv', and finally the handle is freed with a call to
+'iconv_close'.  The problem is that the handle has to be able to
+represent the possibly long sequences of conversion steps and also the
+state of each conversion since the handle is all that is passed to the
+'iconv' function.  Therefore, the data structures are really the
+elements necessary to understanding the implementation.
+
+   We need two different kinds of data structures.  The first describes
+the conversion and the second describes the state etc.  There are really
+two type definitions like this in 'gconv.h'.
+
+ -- Data type: struct __gconv_step
+     This data structure describes one conversion a module can perform.
+     For each function in a loaded module with conversion functions
+     there is exactly one object of this type.  This object is shared by
+     all users of the conversion (i.e., this object does not contain any
+     information corresponding to an actual conversion; it only
+     describes the conversion itself).
+
+     'struct __gconv_loaded_object *__shlib_handle'
+     'const char *__modname'
+     'int __counter'
+          All these elements of the structure are used internally in the
+          C library to coordinate loading and unloading the shared.  One
+          must not expect any of the other elements to be available or
+          initialized.
+
+     'const char *__from_name'
+     'const char *__to_name'
+          '__from_name' and '__to_name' contain the names of the source
+          and destination character sets.  They can be used to identify
+          the actual conversion to be carried out since one module might
+          implement conversions for more than one character set and/or
+          direction.
+
+     'gconv_fct __fct'
+     'gconv_init_fct __init_fct'
+     'gconv_end_fct __end_fct'
+          These elements contain pointers to the functions in the
+          loadable module.  The interface will be explained below.
+
+     'int __min_needed_from'
+     'int __max_needed_from'
+     'int __min_needed_to'
+     'int __max_needed_to;'
+          These values have to be supplied in the init function of the
+          module.  The '__min_needed_from' value specifies how many
+          bytes a character of the source character set at least needs.
+          The '__max_needed_from' specifies the maximum value that also
+          includes possible shift sequences.
+
+          The '__min_needed_to' and '__max_needed_to' values serve the
+          same purpose as '__min_needed_from' and '__max_needed_from'
+          but this time for the destination character set.
+
+          It is crucial that these values be accurate since otherwise
+          the conversion functions will have problems or not work at
+          all.
+
+     'int __stateful'
+          This element must also be initialized by the init function.
+          'int __stateful' is nonzero if the source character set is
+          stateful.  Otherwise it is zero.
+
+     'void *__data'
+          This element can be used freely by the conversion functions in
+          the module.  'void *__data' can be used to communicate extra
+          information from one call to another.  'void *__data' need not
+          be initialized if not needed at all.  If 'void *__data'
+          element is assigned a pointer to dynamically allocated memory
+          (presumably in the init function) it has to be made sure that
+          the end function deallocates the memory.  Otherwise the
+          application will leak memory.
+
+          It is important to be aware that this data structure is shared
+          by all users of this specification conversion and therefore
+          the '__data' element must not contain data specific to one
+          specific use of the conversion function.
+
+ -- Data type: struct __gconv_step_data
+     This is the data structure that contains the information specific
+     to each use of the conversion functions.
+
+     'char *__outbuf'
+     'char *__outbufend'
+          These elements specify the output buffer for the conversion
+          step.  The '__outbuf' element points to the beginning of the
+          buffer, and '__outbufend' points to the byte following the
+          last byte in the buffer.  The conversion function must not
+          assume anything about the size of the buffer but it can be
+          safely assumed the there is room for at least one complete
+          character in the output buffer.
+
+          Once the conversion is finished, if the conversion is the last
+          step, the '__outbuf' element must be modified to point after
+          the last byte written into the buffer to signal how much
+          output is available.  If this conversion step is not the last
+          one, the element must not be modified.  The '__outbufend'
+          element must not be modified.
+
+     'int __is_last'
+          This element is nonzero if this conversion step is the last
+          one.  This information is necessary for the recursion.  See
+          the description of the conversion function internals below.
+          This element must never be modified.
+
+     'int __invocation_counter'
+          The conversion function can use this element to see how many
+          calls of the conversion function already happened.  Some
+          character sets require a certain prolog when generating
+          output, and by comparing this value with zero, one can find
+          out whether it is the first call and whether, therefore, the
+          prolog should be emitted.  This element must never be
+          modified.
+
+     'int __internal_use'
+          This element is another one rarely used but needed in certain
+          situations.  It is assigned a nonzero value in case the
+          conversion functions are used to implement 'mbsrtowcs' et.al.
+          (i.e., the function is not used directly through the 'iconv'
+          interface).
+
+          This sometimes makes a difference as it is expected that the
+          'iconv' functions are used to translate entire texts while the
+          'mbsrtowcs' functions are normally used only to convert single
+          strings and might be used multiple times to convert entire
+          texts.
+
+          But in this situation we would have problem complying with
+          some rules of the character set specification.  Some character
+          sets require a prolog, which must appear exactly once for an
+          entire text.  If a number of 'mbsrtowcs' calls are used to
+          convert the text, only the first call must add the prolog.
+          However, because there is no communication between the
+          different calls of 'mbsrtowcs', the conversion functions have
+          no possibility to find this out.  The situation is different
+          for sequences of 'iconv' calls since the handle allows access
+          to the needed information.
+
+          The 'int __internal_use' element is mostly used together with
+          '__invocation_counter' as follows:
+
+               if (!data->__internal_use
+                    && data->__invocation_counter == 0)
+                 /* Emit prolog.  */
+                 ...
+
+          This element must never be modified.
+
+     'mbstate_t *__statep'
+          The '__statep' element points to an object of type 'mbstate_t'
+          (*note Keeping the state::).  The conversion of a stateful
+          character set must use the object pointed to by '__statep' to
+          store information about the conversion state.  The '__statep'
+          element itself must never be modified.
+
+     'mbstate_t __state'
+          This element must _never_ be used directly.  It is only part
+          of this structure to have the needed space allocated.
+
+6.5.4.4 'iconv' module interfaces
+.................................
+
+With the knowledge about the data structures we now can describe the
+conversion function itself.  To understand the interface a bit of
+knowledge is necessary about the functionality in the C library that
+loads the objects with the conversions.
+
+   It is often the case that one conversion is used more than once
+(i.e., there are several 'iconv_open' calls for the same set of
+character sets during one program run).  The 'mbsrtowcs' et.al.
+functions in the GNU C Library also use the 'iconv' functionality, which
+increases the number of uses of the same functions even more.
+
+   Because of this multiple use of conversions, the modules do not get
+loaded exclusively for one conversion.  Instead a module once loaded can
+be used by an arbitrary number of 'iconv' or 'mbsrtowcs' calls at the
+same time.  The splitting of the information between conversion-
+function-specific information and conversion data makes this possible.
+The last section showed the two data structures used to do this.
+
+   This is of course also reflected in the interface and semantics of
+the functions that the modules must provide.  There are three functions
+that must have the following names:
+
+'gconv_init'
+     The 'gconv_init' function initializes the conversion function
+     specific data structure.  This very same object is shared by all
+     conversions that use this conversion and, therefore, no state
+     information about the conversion itself must be stored in here.  If
+     a module implements more than one conversion, the 'gconv_init'
+     function will be called multiple times.
+
+'gconv_end'
+     The 'gconv_end' function is responsible for freeing all resources
+     allocated by the 'gconv_init' function.  If there is nothing to do,
+     this function can be missing.  Special care must be taken if the
+     module implements more than one conversion and the 'gconv_init'
+     function does not allocate the same resources for all conversions.
+
+'gconv'
+     This is the actual conversion function.  It is called to convert
+     one block of text.  It gets passed the conversion step information
+     initialized by 'gconv_init' and the conversion data, specific to
+     this use of the conversion functions.
+
+   There are three data types defined for the three module interface
+functions and these define the interface.
+
+ -- Data type: int (*__gconv_init_fct) (struct __gconv_step *)
+     This specifies the interface of the initialization function of the
+     module.  It is called exactly once for each conversion the module
+     implements.
+
+     As explained in the description of the 'struct __gconv_step' data
+     structure above the initialization function has to initialize parts
+     of it.
+
+     '__min_needed_from'
+     '__max_needed_from'
+     '__min_needed_to'
+     '__max_needed_to'
+          These elements must be initialized to the exact numbers of the
+          minimum and maximum number of bytes used by one character in
+          the source and destination character sets, respectively.  If
+          the characters all have the same size, the minimum and maximum
+          values are the same.
+
+     '__stateful'
+          This element must be initialized to a nonzero value if the
+          source character set is stateful.  Otherwise it must be zero.
+
+     If the initialization function needs to communicate some
+     information to the conversion function, this communication can
+     happen using the '__data' element of the '__gconv_step' structure.
+     But since this data is shared by all the conversions, it must not
+     be modified by the conversion function.  The example below shows
+     how this can be used.
+
+          #define MIN_NEEDED_FROM         1
+          #define MAX_NEEDED_FROM         4
+          #define MIN_NEEDED_TO           4
+          #define MAX_NEEDED_TO           4
+
+          int
+          gconv_init (struct __gconv_step *step)
+          {
+            /* Determine which direction.  */
+            struct iso2022jp_data *new_data;
+            enum direction dir = illegal_dir;
+            enum variant var = illegal_var;
+            int result;
+
+            if (__strcasecmp (step->__from_name, "ISO-2022-JP//") == 0)
+              {
+                dir = from_iso2022jp;
+                var = iso2022jp;
+              }
+            else if (__strcasecmp (step->__to_name, "ISO-2022-JP//") == 0)
+              {
+                dir = to_iso2022jp;
+                var = iso2022jp;
+              }
+            else if (__strcasecmp (step->__from_name, "ISO-2022-JP-2//") == 0)
+              {
+                dir = from_iso2022jp;
+                var = iso2022jp2;
+              }
+            else if (__strcasecmp (step->__to_name, "ISO-2022-JP-2//") == 0)
+              {
+                dir = to_iso2022jp;
+                var = iso2022jp2;
+              }
+
+            result = __GCONV_NOCONV;
+            if (dir != illegal_dir)
+              {
+                new_data = (struct iso2022jp_data *)
+                  malloc (sizeof (struct iso2022jp_data));
+
+                result = __GCONV_NOMEM;
+                if (new_data != NULL)
+                  {
+                    new_data->dir = dir;
+                    new_data->var = var;
+                    step->__data = new_data;
+
+                    if (dir == from_iso2022jp)
+                      {
+                        step->__min_needed_from = MIN_NEEDED_FROM;
+                        step->__max_needed_from = MAX_NEEDED_FROM;
+                        step->__min_needed_to = MIN_NEEDED_TO;
+                        step->__max_needed_to = MAX_NEEDED_TO;
+                      }
+                    else
+                      {
+                        step->__min_needed_from = MIN_NEEDED_TO;
+                        step->__max_needed_from = MAX_NEEDED_TO;
+                        step->__min_needed_to = MIN_NEEDED_FROM;
+                        step->__max_needed_to = MAX_NEEDED_FROM + 2;
+                      }
+
+                    /* Yes, this is a stateful encoding.  */
+                    step->__stateful = 1;
+
+                    result = __GCONV_OK;
+                  }
+              }
+
+            return result;
+          }
+
+     The function first checks which conversion is wanted.  The module
+     from which this function is taken implements four different
+     conversions; which one is selected can be determined by comparing
+     the names.  The comparison should always be done without paying
+     attention to the case.
+
+     Next, a data structure, which contains the necessary information
+     about which conversion is selected, is allocated.  The data
+     structure 'struct iso2022jp_data' is locally defined since, outside
+     the module, this data is not used at all.  Please note that if all
+     four conversions this modules supports are requested there are four
+     data blocks.
+
+     One interesting thing is the initialization of the '__min_' and
+     '__max_' elements of the step data object.  A single ISO-2022-JP
+     character can consist of one to four bytes.  Therefore the
+     'MIN_NEEDED_FROM' and 'MAX_NEEDED_FROM' macros are defined this
+     way.  The output is always the 'INTERNAL' character set (aka UCS-4)
+     and therefore each character consists of exactly four bytes.  For
+     the conversion from 'INTERNAL' to ISO-2022-JP we have to take into
+     account that escape sequences might be necessary to switch the
+     character sets.  Therefore the '__max_needed_to' element for this
+     direction gets assigned 'MAX_NEEDED_FROM + 2'.  This takes into
+     account the two bytes needed for the escape sequences to single the
+     switching.  The asymmetry in the maximum values for the two
+     directions can be explained easily: when reading ISO-2022-JP text,
+     escape sequences can be handled alone (i.e., it is not necessary to
+     process a real character since the effect of the escape sequence
+     can be recorded in the state information).  The situation is
+     different for the other direction.  Since it is in general not
+     known which character comes next, one cannot emit escape sequences
+     to change the state in advance.  This means the escape sequences
+     that have to be emitted together with the next character.
+     Therefore one needs more room than only for the character itself.
+
+     The possible return values of the initialization function are:
+
+     '__GCONV_OK'
+          The initialization succeeded
+     '__GCONV_NOCONV'
+          The requested conversion is not supported in the module.  This
+          can happen if the 'gconv-modules' file has errors.
+     '__GCONV_NOMEM'
+          Memory required to store additional information could not be
+          allocated.
+
+   The function called before the module is unloaded is significantly
+easier.  It often has nothing at all to do; in which case it can be left
+out completely.
+
+ -- Data type: void (*__gconv_end_fct) (struct gconv_step *)
+     The task of this function is to free all resources allocated in the
+     initialization function.  Therefore only the '__data' element of
+     the object pointed to by the argument is of interest.  Continuing
+     the example from the initialization function, the finalization
+     function looks like this:
+
+          void
+          gconv_end (struct __gconv_step *data)
+          {
+            free (data->__data);
+          }
+
+   The most important function is the conversion function itself, which
+can get quite complicated for complex character sets.  But since this is
+not of interest here, we will only describe a possible skeleton for the
+conversion function.
+
+ -- Data type: int (*__gconv_fct) (struct __gconv_step *, struct
+          __gconv_step_data *, const char **, const char *, size_t *,
+          int)
+     The conversion function can be called for two basic reason: to
+     convert text or to reset the state.  From the description of the
+     'iconv' function it can be seen why the flushing mode is necessary.
+     What mode is selected is determined by the sixth argument, an
+     integer.  This argument being nonzero means that flushing is
+     selected.
+
+     Common to both modes is where the output buffer can be found.  The
+     information about this buffer is stored in the conversion step
+     data.  A pointer to this information is passed as the second
+     argument to this function.  The description of the 'struct
+     __gconv_step_data' structure has more information on the conversion
+     step data.
+
+     What has to be done for flushing depends on the source character
+     set.  If the source character set is not stateful, nothing has to
+     be done.  Otherwise the function has to emit a byte sequence to
+     bring the state object into the initial state.  Once this all
+     happened the other conversion modules in the chain of conversions
+     have to get the same chance.  Whether another step follows can be
+     determined from the '__is_last' element of the step data structure
+     to which the first parameter points.
+
+     The more interesting mode is when actual text has to be converted.
+     The first step in this case is to convert as much text as possible
+     from the input buffer and store the result in the output buffer.
+     The start of the input buffer is determined by the third argument,
+     which is a pointer to a pointer variable referencing the beginning
+     of the buffer.  The fourth argument is a pointer to the byte right
+     after the last byte in the buffer.
+
+     The conversion has to be performed according to the current state
+     if the character set is stateful.  The state is stored in an object
+     pointed to by the '__statep' element of the step data (second
+     argument).  Once either the input buffer is empty or the output
+     buffer is full the conversion stops.  At this point, the pointer
+     variable referenced by the third parameter must point to the byte
+     following the last processed byte (i.e., if all of the input is
+     consumed, this pointer and the fourth parameter have the same
+     value).
+
+     What now happens depends on whether this step is the last one.  If
+     it is the last step, the only thing that has to be done is to
+     update the '__outbuf' element of the step data structure to point
+     after the last written byte.  This update gives the caller the
+     information on how much text is available in the output buffer.  In
+     addition, the variable pointed to by the fifth parameter, which is
+     of type 'size_t', must be incremented by the number of characters
+     (_not bytes_) that were converted in a non-reversible way.  Then,
+     the function can return.
+
+     In case the step is not the last one, the later conversion
+     functions have to get a chance to do their work.  Therefore, the
+     appropriate conversion function has to be called.  The information
+     about the functions is stored in the conversion data structures,
+     passed as the first parameter.  This information and the step data
+     are stored in arrays, so the next element in both cases can be
+     found by simple pointer arithmetic:
+
+          int
+          gconv (struct __gconv_step *step, struct __gconv_step_data *data,
+                 const char **inbuf, const char *inbufend, size_t *written,
+                 int do_flush)
+          {
+            struct __gconv_step *next_step = step + 1;
+            struct __gconv_step_data *next_data = data + 1;
+            ...
+
+     The 'next_step' pointer references the next step information and
+     'next_data' the next data record.  The call of the next function
+     therefore will look similar to this:
+
+            next_step->__fct (next_step, next_data, &outerr, outbuf,
+                              written, 0)
+
+     But this is not yet all.  Once the function call returns the
+     conversion function might have some more to do.  If the return
+     value of the function is '__GCONV_EMPTY_INPUT', more room is
+     available in the output buffer.  Unless the input buffer is empty
+     the conversion, functions start all over again and process the rest
+     of the input buffer.  If the return value is not
+     '__GCONV_EMPTY_INPUT', something went wrong and we have to recover
+     from this.
+
+     A requirement for the conversion function is that the input buffer
+     pointer (the third argument) always point to the last character
+     that was put in converted form into the output buffer.  This is
+     trivially true after the conversion performed in the current step,
+     but if the conversion functions deeper downstream stop prematurely,
+     not all characters from the output buffer are consumed and,
+     therefore, the input buffer pointers must be backed off to the
+     right position.
+
+     Correcting the input buffers is easy to do if the input and output
+     character sets have a fixed width for all characters.  In this
+     situation we can compute how many characters are left in the output
+     buffer and, therefore, can correct the input buffer pointer
+     appropriately with a similar computation.  Things are getting
+     tricky if either character set has characters represented with
+     variable length byte sequences, and it gets even more complicated
+     if the conversion has to take care of the state.  In these cases
+     the conversion has to be performed once again, from the known state
+     before the initial conversion (i.e., if necessary the state of the
+     conversion has to be reset and the conversion loop has to be
+     executed again).  The difference now is that it is known how much
+     input must be created, and the conversion can stop before
+     converting the first unused character.  Once this is done the input
+     buffer pointers must be updated again and the function can return.
+
+     One final thing should be mentioned.  If it is necessary for the
+     conversion to know whether it is the first invocation (in case a
+     prolog has to be emitted), the conversion function should increment
+     the '__invocation_counter' element of the step data structure just
+     before returning to the caller.  See the description of the 'struct
+     __gconv_step_data' structure above for more information on how this
+     can be used.
+
+     The return value must be one of the following values:
+
+     '__GCONV_EMPTY_INPUT'
+          All input was consumed and there is room left in the output
+          buffer.
+     '__GCONV_FULL_OUTPUT'
+          No more room in the output buffer.  In case this is not the
+          last step this value is propagated down from the call of the
+          next conversion function in the chain.
+     '__GCONV_INCOMPLETE_INPUT'
+          The input buffer is not entirely empty since it contains an
+          incomplete character sequence.
+
+     The following example provides a framework for a conversion
+     function.  In case a new conversion has to be written the holes in
+     this implementation have to be filled and that is it.
+
+          int
+          gconv (struct __gconv_step *step, struct __gconv_step_data *data,
+                 const char **inbuf, const char *inbufend, size_t *written,
+                 int do_flush)
+          {
+            struct __gconv_step *next_step = step + 1;
+            struct __gconv_step_data *next_data = data + 1;
+            gconv_fct fct = next_step->__fct;
+            int status;
+
+            /* If the function is called with no input this means we have
+               to reset to the initial state.  The possibly partly
+               converted input is dropped.  */
+            if (do_flush)
+              {
+                status = __GCONV_OK;
+
+                /* Possible emit a byte sequence which put the state object
+                   into the initial state.  */
+
+                /* Call the steps down the chain if there are any but only
+                   if we successfully emitted the escape sequence.  */
+                if (status == __GCONV_OK && ! data->__is_last)
+                  status = fct (next_step, next_data, NULL, NULL,
+                                written, 1);
+              }
+            else
+              {
+                /* We preserve the initial values of the pointer variables.  */
+                const char *inptr = *inbuf;
+                char *outbuf = data->__outbuf;
+                char *outend = data->__outbufend;
+                char *outptr;
+
+                do
+                  {
+                    /* Remember the start value for this round.  */
+                    inptr = *inbuf;
+                    /* The outbuf buffer is empty.  */
+                    outptr = outbuf;
+
+                    /* For stateful encodings the state must be safe here.  */
+
+                    /* Run the conversion loop.  'status' is set
+                       appropriately afterwards.  */
+
+                    /* If this is the last step, leave the loop. There is
+                       nothing we can do.  */
+                    if (data->__is_last)
+                      {
+                        /* Store information about how many bytes are
+                           available.  */
+                        data->__outbuf = outbuf;
+
+                       /* If any non-reversible conversions were performed,
+                          add the number to '*written'.  */
+
+                       break;
+                     }
+
+                    /* Write out all output that was produced.  */
+                    if (outbuf > outptr)
+                      {
+                        const char *outerr = data->__outbuf;
+                        int result;
+
+                        result = fct (next_step, next_data, &outerr,
+                                      outbuf, written, 0);
+
+                        if (result != __GCONV_EMPTY_INPUT)
+                          {
+                            if (outerr != outbuf)
+                              {
+                                /* Reset the input buffer pointer.  We
+                                   document here the complex case.  */
+                                size_t nstatus;
+
+                                /* Reload the pointers.  */
+                                *inbuf = inptr;
+                                outbuf = outptr;
+
+                                /* Possibly reset the state.  */
+
+                                /* Redo the conversion, but this time
+                                   the end of the output buffer is at
+                                   'outerr'.  */
+                              }
+
+                            /* Change the status.  */
+                            status = result;
+                          }
+                        else
+                          /* All the output is consumed, we can make
+                              another run if everything was ok.  */
+                          if (status == __GCONV_FULL_OUTPUT)
+                            status = __GCONV_OK;
+                     }
+                  }
+                while (status == __GCONV_OK);
+
+                /* We finished one use of this step.  */
+                ++data->__invocation_counter;
+              }
+
+            return status;
+          }
+
+   This information should be sufficient to write new modules.  Anybody
+doing so should also take a look at the available source code in the GNU
+C Library sources.  It contains many examples of working and optimized
+modules.
+
+
+File: libc.info,  Node: Locales,  Next: Message Translation,  Prev: Character Set Handling,  Up: Top
+
+7 Locales and Internationalization
+**********************************
+
+Different countries and cultures have varying conventions for how to
+communicate.  These conventions range from very simple ones, such as the
+format for representing dates and times, to very complex ones, such as
+the language spoken.
+
+   "Internationalization" of software means programming it to be able to
+adapt to the user's favorite conventions.  In ISO C,
+internationalization works by means of "locales".  Each locale specifies
+a collection of conventions, one convention for each purpose.  The user
+chooses a set of conventions by specifying a locale (via environment
+variables).
+
+   All programs inherit the chosen locale as part of their environment.
+Provided the programs are written to obey the choice of locale, they
+will follow the conventions preferred by the user.
+
+* Menu:
+
+* Effects of Locale::           Actions affected by the choice of
+                                 locale.
+* Choosing Locale::             How the user specifies a locale.
+* Locale Categories::           Different purposes for which you can
+                                 select a locale.
+* Setting the Locale::          How a program specifies the locale
+                                 with library functions.
+* Standard Locales::            Locale names available on all systems.
+* Locale Information::          How to access the information for the locale.
+* Formatting Numbers::          A dedicated function to format numbers.
+* Yes-or-No Questions::         Check a Response against the locale.
+
+
+File: libc.info,  Node: Effects of Locale,  Next: Choosing Locale,  Up: Locales
+
+7.1 What Effects a Locale Has
+=============================
+
+Each locale specifies conventions for several purposes, including the
+following:
+
+   * What multibyte character sequences are valid, and how they are
+     interpreted (*note Character Set Handling::).
+
+   * Classification of which characters in the local character set are
+     considered alphabetic, and upper- and lower-case conversion
+     conventions (*note Character Handling::).
+
+   * The collating sequence for the local language and character set
+     (*note Collation Functions::).
+
+   * Formatting of numbers and currency amounts (*note General
+     Numeric::).
+
+   * Formatting of dates and times (*note Formatting Calendar Time::).
+
+   * What language to use for output, including error messages (*note
+     Message Translation::).
+
+   * What language to use for user answers to yes-or-no questions (*note
+     Yes-or-No Questions::).
+
+   * What language to use for more complex user input.  (The C library
+     doesn't yet help you implement this.)
+
+   Some aspects of adapting to the specified locale are handled
+automatically by the library subroutines.  For example, all your program
+needs to do in order to use the collating sequence of the chosen locale
+is to use 'strcoll' or 'strxfrm' to compare strings.
+
+   Other aspects of locales are beyond the comprehension of the library.
+For example, the library can't automatically translate your program's
+output messages into other languages.  The only way you can support
+output in the user's favorite language is to program this more or less
+by hand.  The C library provides functions to handle translations for
+multiple languages easily.
+
+   This chapter discusses the mechanism by which you can modify the
+current locale.  The effects of the current locale on specific library
+functions are discussed in more detail in the descriptions of those
+functions.
+
+
+File: libc.info,  Node: Choosing Locale,  Next: Locale Categories,  Prev: Effects of Locale,  Up: Locales
+
+7.2 Choosing a Locale
+=====================
+
+The simplest way for the user to choose a locale is to set the
+environment variable 'LANG'.  This specifies a single locale to use for
+all purposes.  For example, a user could specify a hypothetical locale
+named 'espana-castellano' to use the standard conventions of most of
+Spain.
+
+   The set of locales supported depends on the operating system you are
+using, and so do their names.  We can't make any promises about what
+locales will exist, except for one standard locale called 'C' or
+'POSIX'.  Later we will describe how to construct locales.
+
+   A user also has the option of specifying different locales for
+different purposes--in effect, choosing a mixture of multiple locales.
+
+   For example, the user might specify the locale 'espana-castellano'
+for most purposes, but specify the locale 'usa-english' for currency
+formatting.  This might make sense if the user is a Spanish-speaking
+American, working in Spanish, but representing monetary amounts in US
+dollars.
+
+   Note that both locales 'espana-castellano' and 'usa-english', like
+all locales, would include conventions for all of the purposes to which
+locales apply.  However, the user can choose to use each locale for a
+particular subset of those purposes.
+
+
+File: libc.info,  Node: Locale Categories,  Next: Setting the Locale,  Prev: Choosing Locale,  Up: Locales
+
+7.3 Categories of Activities that Locales Affect
+================================================
+
+The purposes that locales serve are grouped into "categories", so that a
+user or a program can choose the locale for each category independently.
+Here is a table of categories; each name is both an environment variable
+that a user can set, and a macro name that you can use as an argument to
+'setlocale'.
+
+'LC_COLLATE'
+     This category applies to collation of strings (functions 'strcoll'
+     and 'strxfrm'); see *note Collation Functions::.
+
+'LC_CTYPE'
+     This category applies to classification and conversion of
+     characters, and to multibyte and wide characters; see *note
+     Character Handling::, and *note Character Set Handling::.
+
+'LC_MONETARY'
+     This category applies to formatting monetary values; see *note
+     General Numeric::.
+
+'LC_NUMERIC'
+     This category applies to formatting numeric values that are not
+     monetary; see *note General Numeric::.
+
+'LC_TIME'
+     This category applies to formatting date and time values; see *note
+     Formatting Calendar Time::.
+
+'LC_MESSAGES'
+     This category applies to selecting the language used in the user
+     interface for message translation (*note The Uniforum approach::;
+     *note Message catalogs a la X/Open::) and contains regular
+     expressions for affirmative and negative responses.
+
+'LC_ALL'
+     This is not an environment variable; it is only a macro that you
+     can use with 'setlocale' to set a single locale for all purposes.
+     Setting this environment variable overwrites all selections by the
+     other 'LC_*' variables or 'LANG'.
+
+'LANG'
+     If this environment variable is defined, its value specifies the
+     locale to use for all purposes except as overridden by the
+     variables above.
+
+   When developing the message translation functions it was felt that
+the functionality provided by the variables above is not sufficient.
+For example, it should be possible to specify more than one locale name.
+Take a Swedish user who better speaks German than English, and a program
+whose messages are output in English by default.  It should be possible
+to specify that the first choice of language is Swedish, the second
+German, and if this also fails to use English.  This is possible with
+the variable 'LANGUAGE'.  For further description of this GNU extension
+see *note Using gettextized software::.
+
+
+File: libc.info,  Node: Setting the Locale,  Next: Standard Locales,  Prev: Locale Categories,  Up: Locales
+
+7.4 How Programs Set the Locale
+===============================
+
+A C program inherits its locale environment variables when it starts up.
+This happens automatically.  However, these variables do not
+automatically control the locale used by the library functions, because ISO C
+says that all programs start by default in the standard 'C' locale.  To
+use the locales specified by the environment, you must call 'setlocale'.
+Call it as follows:
+
+     setlocale (LC_ALL, "");
+
+to select a locale based on the user choice of the appropriate
+environment variables.
+
+   You can also use 'setlocale' to specify a particular locale, for
+general use or for a specific category.
+
+   The symbols in this section are defined in the header file
+'locale.h'.
+
+ -- Function: char * setlocale (int CATEGORY, const char *LOCALE)
+     Preliminary: | MT-Unsafe const:locale env | AS-Unsafe init lock
+     heap corrupt | AC-Unsafe init corrupt lock mem fd | *Note POSIX
+     Safety Concepts::.
+
+     The function 'setlocale' sets the current locale for category
+     CATEGORY to LOCALE.  A list of all the locales the system provides
+     can be created by running
+
+            locale -a
+
+     If CATEGORY is 'LC_ALL', this specifies the locale for all
+     purposes.  The other possible values of CATEGORY specify an single
+     purpose (*note Locale Categories::).
+
+     You can also use this function to find out the current locale by
+     passing a null pointer as the LOCALE argument.  In this case,
+     'setlocale' returns a string that is the name of the locale
+     currently selected for category CATEGORY.
+
+     The string returned by 'setlocale' can be overwritten by subsequent
+     calls, so you should make a copy of the string (*note Copying and
+     Concatenation::) if you want to save it past any further calls to
+     'setlocale'.  (The standard library is guaranteed never to call
+     'setlocale' itself.)
+
+     You should not modify the string returned by 'setlocale'.  It might
+     be the same string that was passed as an argument in a previous
+     call to 'setlocale'.  One requirement is that the CATEGORY must be
+     the same in the call the string was returned and the one when the
+     string is passed in as LOCALE parameter.
+
+     When you read the current locale for category 'LC_ALL', the value
+     encodes the entire combination of selected locales for all
+     categories.  In this case, the value is not just a single locale
+     name.  In fact, we don't make any promises about what it looks
+     like.  But if you specify the same "locale name" with 'LC_ALL' in a
+     subsequent call to 'setlocale', it restores the same combination of
+     locale selections.
+
+     To be sure you can use the returned string encoding the currently
+     selected locale at a later time, you must make a copy of the
+     string.  It is not guaranteed that the returned pointer remains
+     valid over time.
+
+     When the LOCALE argument is not a null pointer, the string returned
+     by 'setlocale' reflects the newly-modified locale.
+
+     If you specify an empty string for LOCALE, this means to read the
+     appropriate environment variable and use its value to select the
+     locale for CATEGORY.
+
+     If a nonempty string is given for LOCALE, then the locale of that
+     name is used if possible.
+
+     If you specify an invalid locale name, 'setlocale' returns a null
+     pointer and leaves the current locale unchanged.
+
+   The path used for finding locale data can be set using the 'LOCPATH'
+environment variable.  The default path for finding locale data is
+system specific.  It is computed from the value given as the prefix
+while configuring the C library.  This value normally is '/usr' or '/'.
+For the former the complete path is:
+
+     /usr/lib/locale
+
+   Here is an example showing how you might use 'setlocale' to
+temporarily switch to a new locale.
+
+     #include <stddef.h>
+     #include <locale.h>
+     #include <stdlib.h>
+     #include <string.h>
+
+     void
+     with_other_locale (char *new_locale,
+                        void (*subroutine) (int),
+                        int argument)
+     {
+       char *old_locale, *saved_locale;
+
+       /* Get the name of the current locale.  */
+       old_locale = setlocale (LC_ALL, NULL);
+
+       /* Copy the name so it won't be clobbered by 'setlocale'. */
+       saved_locale = strdup (old_locale);
+       if (saved_locale == NULL)
+         fatal ("Out of memory");
+
+       /* Now change the locale and do some stuff with it. */
+       setlocale (LC_ALL, new_locale);
+       (*subroutine) (argument);
+
+       /* Restore the original locale. */
+       setlocale (LC_ALL, saved_locale);
+       free (saved_locale);
+     }
+
+   *Portability Note:* Some ISO C systems may define additional locale
+categories, and future versions of the library will do so.  For
+portability, assume that any symbol beginning with 'LC_' might be
+defined in 'locale.h'.
+
+
+File: libc.info,  Node: Standard Locales,  Next: Locale Information,  Prev: Setting the Locale,  Up: Locales
+
+7.5 Standard Locales
+====================
+
+The only locale names you can count on finding on all operating systems
+are these three standard ones:
+
+'"C"'
+     This is the standard C locale.  The attributes and behavior it
+     provides are specified in the ISO C standard.  When your program
+     starts up, it initially uses this locale by default.
+
+'"POSIX"'
+     This is the standard POSIX locale.  Currently, it is an alias for
+     the standard C locale.
+
+'""'
+     The empty name says to select a locale based on environment
+     variables.  *Note Locale Categories::.
+
+   Defining and installing named locales is normally a responsibility of
+the system administrator at your site (or the person who installed the
+GNU C Library).  It is also possible for the user to create private
+locales.  All this will be discussed later when describing the tool to
+do so.
+
+   If your program needs to use something other than the 'C' locale, it
+will be more portable if you use whatever locale the user specifies with
+the environment, rather than trying to specify some non-standard locale
+explicitly by name.  Remember, different machines might have different
+sets of locales installed.
+
+
+File: libc.info,  Node: Locale Information,  Next: Formatting Numbers,  Prev: Standard Locales,  Up: Locales
+
+7.6 Accessing Locale Information
+================================
+
+There are several ways to access locale information.  The simplest way
+is to let the C library itself do the work.  Several of the functions in
+this library implicitly access the locale data, and use what information
+is provided by the currently selected locale.  This is how the locale
+model is meant to work normally.
+
+   As an example take the 'strftime' function, which is meant to nicely
+format date and time information (*note Formatting Calendar Time::).
+Part of the standard information contained in the 'LC_TIME' category is
+the names of the months.  Instead of requiring the programmer to take
+care of providing the translations the 'strftime' function does this all
+by itself.  '%A' in the format string is replaced by the appropriate
+weekday name of the locale currently selected by 'LC_TIME'.  This is an
+easy example, and wherever possible functions do things automatically in
+this way.
+
+   But there are quite often situations when there is simply no function
+to perform the task, or it is simply not possible to do the work
+automatically.  For these cases it is necessary to access the
+information in the locale directly.  To do this the C library provides
+two functions: 'localeconv' and 'nl_langinfo'.  The former is part of ISO C
+and therefore portable, but has a brain-damaged interface.  The second
+is part of the Unix interface and is portable in as far as the system
+follows the Unix standards.
+
+* Menu:
+
+* The Lame Way to Locale Data::   ISO C's 'localeconv'.
+* The Elegant and Fast Way::      X/Open's 'nl_langinfo'.
+
+
+File: libc.info,  Node: The Lame Way to Locale Data,  Next: The Elegant and Fast Way,  Up: Locale Information
+
+7.6.1 'localeconv': It is portable but ...
+------------------------------------------
+
+Together with the 'setlocale' function the ISO C people invented the
+'localeconv' function.  It is a masterpiece of poor design.  It is
+expensive to use, not extendable, and not generally usable as it
+provides access to only 'LC_MONETARY' and 'LC_NUMERIC' related
+information.  Nevertheless, if it is applicable to a given situation it
+should be used since it is very portable.  The function 'strfmon'
+formats monetary amounts according to the selected locale using this
+information.
+
+ -- Function: struct lconv * localeconv (void)
+     Preliminary: | MT-Unsafe race:localeconv locale | AS-Unsafe |
+     AC-Safe | *Note POSIX Safety Concepts::.
+
+     The 'localeconv' function returns a pointer to a structure whose
+     components contain information about how numeric and monetary
+     values should be formatted in the current locale.
+
+     You should not modify the structure or its contents.  The structure
+     might be overwritten by subsequent calls to 'localeconv', or by
+     calls to 'setlocale', but no other function in the library
+     overwrites this value.
+
+ -- Data Type: struct lconv
+     'localeconv''s return value is of this data type.  Its elements are
+     described in the following subsections.
+
+   If a member of the structure 'struct lconv' has type 'char', and the
+value is 'CHAR_MAX', it means that the current locale has no value for
+that parameter.
+
+* Menu:
+
+* General Numeric::             Parameters for formatting numbers and
+                                 currency amounts.
+* Currency Symbol::             How to print the symbol that identifies an
+                                 amount of money (e.g. '$').
+* Sign of Money Amount::        How to print the (positive or negative) sign
+                                 for a monetary amount, if one exists.
+
+
+File: libc.info,  Node: General Numeric,  Next: Currency Symbol,  Up: The Lame Way to Locale Data
+
+7.6.1.1 Generic Numeric Formatting Parameters
+.............................................
+
+These are the standard members of 'struct lconv'; there may be others.
+
+'char *decimal_point'
+'char *mon_decimal_point'
+     These are the decimal-point separators used in formatting
+     non-monetary and monetary quantities, respectively.  In the 'C'
+     locale, the value of 'decimal_point' is '"."', and the value of
+     'mon_decimal_point' is '""'.
+
+'char *thousands_sep'
+'char *mon_thousands_sep'
+     These are the separators used to delimit groups of digits to the
+     left of the decimal point in formatting non-monetary and monetary
+     quantities, respectively.  In the 'C' locale, both members have a
+     value of '""' (the empty string).
+
+'char *grouping'
+'char *mon_grouping'
+     These are strings that specify how to group the digits to the left
+     of the decimal point.  'grouping' applies to non-monetary
+     quantities and 'mon_grouping' applies to monetary quantities.  Use
+     either 'thousands_sep' or 'mon_thousands_sep' to separate the digit
+     groups.
+
+     Each member of these strings is to be interpreted as an integer
+     value of type 'char'.  Successive numbers (from left to right) give
+     the sizes of successive groups (from right to left, starting at the
+     decimal point.)  The last member is either '0', in which case the
+     previous member is used over and over again for all the remaining
+     groups, or 'CHAR_MAX', in which case there is no more grouping--or,
+     put another way, any remaining digits form one large group without
+     separators.
+
+     For example, if 'grouping' is '"\04\03\02"', the correct grouping
+     for the number '123456787654321' is '12', '34', '56', '78', '765',
+     '4321'.  This uses a group of 4 digits at the end, preceded by a
+     group of 3 digits, preceded by groups of 2 digits (as many as
+     needed).  With a separator of ',', the number would be printed as
+     '12,34,56,78,765,4321'.
+
+     A value of '"\03"' indicates repeated groups of three digits, as
+     normally used in the U.S.
+
+     In the standard 'C' locale, both 'grouping' and 'mon_grouping' have
+     a value of '""'.  This value specifies no grouping at all.
+
+'char int_frac_digits'
+'char frac_digits'
+     These are small integers indicating how many fractional digits (to
+     the right of the decimal point) should be displayed in a monetary
+     value in international and local formats, respectively.  (Most
+     often, both members have the same value.)
+
+     In the standard 'C' locale, both of these members have the value
+     'CHAR_MAX', meaning "unspecified".  The ISO standard doesn't say
+     what to do when you find this value; we recommend printing no
+     fractional digits.  (This locale also specifies the empty string
+     for 'mon_decimal_point', so printing any fractional digits would be
+     confusing!)
+
+
+File: libc.info,  Node: Currency Symbol,  Next: Sign of Money Amount,  Prev: General Numeric,  Up: The Lame Way to Locale Data
+
+7.6.1.2 Printing the Currency Symbol
+....................................
+
+These members of the 'struct lconv' structure specify how to print the
+symbol to identify a monetary value--the international analog of '$' for
+US dollars.
+
+   Each country has two standard currency symbols.  The "local currency
+symbol" is used commonly within the country, while the "international
+currency symbol" is used internationally to refer to that country's
+currency when it is necessary to indicate the country unambiguously.
+
+   For example, many countries use the dollar as their monetary unit,
+and when dealing with international currencies it's important to specify
+that one is dealing with (say) Canadian dollars instead of U.S. dollars
+or Australian dollars.  But when the context is known to be Canada,
+there is no need to make this explicit--dollar amounts are implicitly
+assumed to be in Canadian dollars.
+
+'char *currency_symbol'
+     The local currency symbol for the selected locale.
+
+     In the standard 'C' locale, this member has a value of '""' (the
+     empty string), meaning "unspecified".  The ISO standard doesn't say
+     what to do when you find this value; we recommend you simply print
+     the empty string as you would print any other string pointed to by
+     this variable.
+
+'char *int_curr_symbol'
+     The international currency symbol for the selected locale.
+
+     The value of 'int_curr_symbol' should normally consist of a
+     three-letter abbreviation determined by the international standard
+     'ISO 4217 Codes for the Representation of Currency and Funds',
+     followed by a one-character separator (often a space).
+
+     In the standard 'C' locale, this member has a value of '""' (the
+     empty string), meaning "unspecified".  We recommend you simply
+     print the empty string as you would print any other string pointed
+     to by this variable.
+
+'char p_cs_precedes'
+'char n_cs_precedes'
+'char int_p_cs_precedes'
+'char int_n_cs_precedes'
+     These members are '1' if the 'currency_symbol' or 'int_curr_symbol'
+     strings should precede the value of a monetary amount, or '0' if
+     the strings should follow the value.  The 'p_cs_precedes' and
+     'int_p_cs_precedes' members apply to positive amounts (or zero),
+     and the 'n_cs_precedes' and 'int_n_cs_precedes' members apply to
+     negative amounts.
+
+     In the standard 'C' locale, all of these members have a value of
+     'CHAR_MAX', meaning "unspecified".  The ISO standard doesn't say
+     what to do when you find this value.  We recommend printing the
+     currency symbol before the amount, which is right for most
+     countries.  In other words, treat all nonzero values alike in these
+     members.
+
+     The members with the 'int_' prefix apply to the 'int_curr_symbol'
+     while the other two apply to 'currency_symbol'.
+
+'char p_sep_by_space'
+'char n_sep_by_space'
+'char int_p_sep_by_space'
+'char int_n_sep_by_space'
+     These members are '1' if a space should appear between the
+     'currency_symbol' or 'int_curr_symbol' strings and the amount, or
+     '0' if no space should appear.  The 'p_sep_by_space' and
+     'int_p_sep_by_space' members apply to positive amounts (or zero),
+     and the 'n_sep_by_space' and 'int_n_sep_by_space' members apply to
+     negative amounts.
+
+     In the standard 'C' locale, all of these members have a value of
+     'CHAR_MAX', meaning "unspecified".  The ISO standard doesn't say
+     what you should do when you find this value; we suggest you treat
+     it as 1 (print a space).  In other words, treat all nonzero values
+     alike in these members.
+
+     The members with the 'int_' prefix apply to the 'int_curr_symbol'
+     while the other two apply to 'currency_symbol'.  There is one
+     specialty with the 'int_curr_symbol', though.  Since all legal
+     values contain a space at the end the string one either printf this
+     space (if the currency symbol must appear in front and must be
+     separated) or one has to avoid printing this character at all
+     (especially when at the end of the string).
+
+
+File: libc.info,  Node: Sign of Money Amount,  Prev: Currency Symbol,  Up: The Lame Way to Locale Data
+
+7.6.1.3 Printing the Sign of a Monetary Amount
+..............................................
+
+These members of the 'struct lconv' structure specify how to print the
+sign (if any) of a monetary value.
+
+'char *positive_sign'
+'char *negative_sign'
+     These are strings used to indicate positive (or zero) and negative
+     monetary quantities, respectively.
+
+     In the standard 'C' locale, both of these members have a value of
+     '""' (the empty string), meaning "unspecified".
+
+     The ISO standard doesn't say what to do when you find this value;
+     we recommend printing 'positive_sign' as you find it, even if it is
+     empty.  For a negative value, print 'negative_sign' as you find it
+     unless both it and 'positive_sign' are empty, in which case print
+     '-' instead.  (Failing to indicate the sign at all seems rather
+     unreasonable.)
+
+'char p_sign_posn'
+'char n_sign_posn'
+'char int_p_sign_posn'
+'char int_n_sign_posn'
+     These members are small integers that indicate how to position the
+     sign for nonnegative and negative monetary quantities,
+     respectively.  (The string used by the sign is what was specified
+     with 'positive_sign' or 'negative_sign'.)  The possible values are
+     as follows:
+
+     '0'
+          The currency symbol and quantity should be surrounded by
+          parentheses.
+
+     '1'
+          Print the sign string before the quantity and currency symbol.
+
+     '2'
+          Print the sign string after the quantity and currency symbol.
+
+     '3'
+          Print the sign string right before the currency symbol.
+
+     '4'
+          Print the sign string right after the currency symbol.
+
+     'CHAR_MAX'
+          "Unspecified".  Both members have this value in the standard
+          'C' locale.
+
+     The ISO standard doesn't say what you should do when the value is
+     'CHAR_MAX'.  We recommend you print the sign after the currency
+     symbol.
+
+     The members with the 'int_' prefix apply to the 'int_curr_symbol'
+     while the other two apply to 'currency_symbol'.
+
+
+File: libc.info,  Node: The Elegant and Fast Way,  Prev: The Lame Way to Locale Data,  Up: Locale Information
+
+7.6.2 Pinpoint Access to Locale Data
+------------------------------------
+
+When writing the X/Open Portability Guide the authors realized that the
+'localeconv' function is not enough to provide reasonable access to
+locale information.  The information which was meant to be available in
+the locale (as later specified in the POSIX.1 standard) requires more
+ways to access it.  Therefore the 'nl_langinfo' function was introduced.
+
+ -- Function: char * nl_langinfo (nl_item ITEM)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'nl_langinfo' function can be used to access individual
+     elements of the locale categories.  Unlike the 'localeconv'
+     function, which returns all the information, 'nl_langinfo' lets the
+     caller select what information it requires.  This is very fast and
+     it is not a problem to call this function multiple times.
+
+     A second advantage is that in addition to the numeric and monetary
+     formatting information, information from the 'LC_TIME' and
+     'LC_MESSAGES' categories is available.
+
+     The type 'nl_type' is defined in 'nl_types.h'.  The argument ITEM
+     is a numeric value defined in the header 'langinfo.h'.  The X/Open
+     standard defines the following values:
+
+     'CODESET'
+          'nl_langinfo' returns a string with the name of the coded
+          character set used in the selected locale.
+
+     'ABDAY_1'
+     'ABDAY_2'
+     'ABDAY_3'
+     'ABDAY_4'
+     'ABDAY_5'
+     'ABDAY_6'
+     'ABDAY_7'
+          'nl_langinfo' returns the abbreviated weekday name.  'ABDAY_1'
+          corresponds to Sunday.
+     'DAY_1'
+     'DAY_2'
+     'DAY_3'
+     'DAY_4'
+     'DAY_5'
+     'DAY_6'
+     'DAY_7'
+          Similar to 'ABDAY_1' etc., but here the return value is the
+          unabbreviated weekday name.
+     'ABMON_1'
+     'ABMON_2'
+     'ABMON_3'
+     'ABMON_4'
+     'ABMON_5'
+     'ABMON_6'
+     'ABMON_7'
+     'ABMON_8'
+     'ABMON_9'
+     'ABMON_10'
+     'ABMON_11'
+     'ABMON_12'
+          The return value is abbreviated name of the month.  'ABMON_1'
+          corresponds to January.
+     'MON_1'
+     'MON_2'
+     'MON_3'
+     'MON_4'
+     'MON_5'
+     'MON_6'
+     'MON_7'
+     'MON_8'
+     'MON_9'
+     'MON_10'
+     'MON_11'
+     'MON_12'
+          Similar to 'ABMON_1' etc., but here the month names are not
+          abbreviated.  Here the first value 'MON_1' also corresponds to
+          January.
+     'AM_STR'
+     'PM_STR'
+          The return values are strings which can be used in the
+          representation of time as an hour from 1 to 12 plus an am/pm
+          specifier.
+
+          Note that in locales which do not use this time representation
+          these strings might be empty, in which case the am/pm format
+          cannot be used at all.
+     'D_T_FMT'
+          The return value can be used as a format string for 'strftime'
+          to represent time and date in a locale-specific way.
+     'D_FMT'
+          The return value can be used as a format string for 'strftime'
+          to represent a date in a locale-specific way.
+     'T_FMT'
+          The return value can be used as a format string for 'strftime'
+          to represent time in a locale-specific way.
+     'T_FMT_AMPM'
+          The return value can be used as a format string for 'strftime'
+          to represent time in the am/pm format.
+
+          Note that if the am/pm format does not make any sense for the
+          selected locale, the return value might be the same as the one
+          for 'T_FMT'.
+     'ERA'
+          The return value represents the era used in the current
+          locale.
+
+          Most locales do not define this value.  An example of a locale
+          which does define this value is the Japanese one.  In Japan,
+          the traditional representation of dates includes the name of
+          the era corresponding to the then-emperor's reign.
+
+          Normally it should not be necessary to use this value
+          directly.  Specifying the 'E' modifier in their format strings
+          causes the 'strftime' functions to use this information.  The
+          format of the returned string is not specified, and therefore
+          you should not assume knowledge of it on different systems.
+     'ERA_YEAR'
+          The return value gives the year in the relevant era of the
+          locale.  As for 'ERA' it should not be necessary to use this
+          value directly.
+     'ERA_D_T_FMT'
+          This return value can be used as a format string for
+          'strftime' to represent dates and times in a locale-specific
+          era-based way.
+     'ERA_D_FMT'
+          This return value can be used as a format string for
+          'strftime' to represent a date in a locale-specific era-based
+          way.
+     'ERA_T_FMT'
+          This return value can be used as a format string for
+          'strftime' to represent time in a locale-specific era-based
+          way.
+     'ALT_DIGITS'
+          The return value is a representation of up to 100 values used
+          to represent the values 0 to 99.  As for 'ERA' this value is
+          not intended to be used directly, but instead indirectly
+          through the 'strftime' function.  When the modifier 'O' is
+          used in a format which would otherwise use numerals to
+          represent hours, minutes, seconds, weekdays, months, or weeks,
+          the appropriate value for the locale is used instead.
+     'INT_CURR_SYMBOL'
+          The same as the value returned by 'localeconv' in the
+          'int_curr_symbol' element of the 'struct lconv'.
+     'CURRENCY_SYMBOL'
+     'CRNCYSTR'
+          The same as the value returned by 'localeconv' in the
+          'currency_symbol' element of the 'struct lconv'.
+
+          'CRNCYSTR' is a deprecated alias still required by Unix98.
+     'MON_DECIMAL_POINT'
+          The same as the value returned by 'localeconv' in the
+          'mon_decimal_point' element of the 'struct lconv'.
+     'MON_THOUSANDS_SEP'
+          The same as the value returned by 'localeconv' in the
+          'mon_thousands_sep' element of the 'struct lconv'.
+     'MON_GROUPING'
+          The same as the value returned by 'localeconv' in the
+          'mon_grouping' element of the 'struct lconv'.
+     'POSITIVE_SIGN'
+          The same as the value returned by 'localeconv' in the
+          'positive_sign' element of the 'struct lconv'.
+     'NEGATIVE_SIGN'
+          The same as the value returned by 'localeconv' in the
+          'negative_sign' element of the 'struct lconv'.
+     'INT_FRAC_DIGITS'
+          The same as the value returned by 'localeconv' in the
+          'int_frac_digits' element of the 'struct lconv'.
+     'FRAC_DIGITS'
+          The same as the value returned by 'localeconv' in the
+          'frac_digits' element of the 'struct lconv'.
+     'P_CS_PRECEDES'
+          The same as the value returned by 'localeconv' in the
+          'p_cs_precedes' element of the 'struct lconv'.
+     'P_SEP_BY_SPACE'
+          The same as the value returned by 'localeconv' in the
+          'p_sep_by_space' element of the 'struct lconv'.
+     'N_CS_PRECEDES'
+          The same as the value returned by 'localeconv' in the
+          'n_cs_precedes' element of the 'struct lconv'.
+     'N_SEP_BY_SPACE'
+          The same as the value returned by 'localeconv' in the
+          'n_sep_by_space' element of the 'struct lconv'.
+     'P_SIGN_POSN'
+          The same as the value returned by 'localeconv' in the
+          'p_sign_posn' element of the 'struct lconv'.
+     'N_SIGN_POSN'
+          The same as the value returned by 'localeconv' in the
+          'n_sign_posn' element of the 'struct lconv'.
+
+     'INT_P_CS_PRECEDES'
+          The same as the value returned by 'localeconv' in the
+          'int_p_cs_precedes' element of the 'struct lconv'.
+     'INT_P_SEP_BY_SPACE'
+          The same as the value returned by 'localeconv' in the
+          'int_p_sep_by_space' element of the 'struct lconv'.
+     'INT_N_CS_PRECEDES'
+          The same as the value returned by 'localeconv' in the
+          'int_n_cs_precedes' element of the 'struct lconv'.
+     'INT_N_SEP_BY_SPACE'
+          The same as the value returned by 'localeconv' in the
+          'int_n_sep_by_space' element of the 'struct lconv'.
+     'INT_P_SIGN_POSN'
+          The same as the value returned by 'localeconv' in the
+          'int_p_sign_posn' element of the 'struct lconv'.
+     'INT_N_SIGN_POSN'
+          The same as the value returned by 'localeconv' in the
+          'int_n_sign_posn' element of the 'struct lconv'.
+
+     'DECIMAL_POINT'
+     'RADIXCHAR'
+          The same as the value returned by 'localeconv' in the
+          'decimal_point' element of the 'struct lconv'.
+
+          The name 'RADIXCHAR' is a deprecated alias still used in
+          Unix98.
+     'THOUSANDS_SEP'
+     'THOUSEP'
+          The same as the value returned by 'localeconv' in the
+          'thousands_sep' element of the 'struct lconv'.
+
+          The name 'THOUSEP' is a deprecated alias still used in Unix98.
+     'GROUPING'
+          The same as the value returned by 'localeconv' in the
+          'grouping' element of the 'struct lconv'.
+     'YESEXPR'
+          The return value is a regular expression which can be used
+          with the 'regex' function to recognize a positive response to
+          a yes/no question.  The GNU C Library provides the 'rpmatch'
+          function for easier handling in applications.
+     'NOEXPR'
+          The return value is a regular expression which can be used
+          with the 'regex' function to recognize a negative response to
+          a yes/no question.
+     'YESSTR'
+          The return value is a locale-specific translation of the
+          positive response to a yes/no question.
+
+          Using this value is deprecated since it is a very special case
+          of message translation, and is better handled by the message
+          translation functions (*note Message Translation::).
+
+          The use of this symbol is deprecated.  Instead message
+          translation should be used.
+     'NOSTR'
+          The return value is a locale-specific translation of the
+          negative response to a yes/no question.  What is said for
+          'YESSTR' is also true here.
+
+          The use of this symbol is deprecated.  Instead message
+          translation should be used.
+
+     The file 'langinfo.h' defines a lot more symbols but none of them
+     is official.  Using them is not portable, and the format of the
+     return values might change.  Therefore we recommended you not use
+     them.
+
+     Note that the return value for any valid argument can be used for
+     in all situations (with the possible exception of the am/pm time
+     formatting codes).  If the user has not selected any locale for the
+     appropriate category, 'nl_langinfo' returns the information from
+     the '"C"' locale.  It is therefore possible to use this function as
+     shown in the example below.
+
+     If the argument ITEM is not valid, a pointer to an empty string is
+     returned.
+
+   An example of 'nl_langinfo' usage is a function which has to print a
+given date and time in a locale-specific way.  At first one might think
+that, since 'strftime' internally uses the locale information, writing
+something like the following is enough:
+
+     size_t
+     i18n_time_n_data (char *s, size_t len, const struct tm *tp)
+     {
+       return strftime (s, len, "%X %D", tp);
+     }
+
+   The format contains no weekday or month names and therefore is
+internationally usable.  Wrong!  The output produced is something like
+'"hh:mm:ss MM/DD/YY"'.  This format is only recognizable in the USA.
+Other countries use different formats.  Therefore the function should be
+rewritten like this:
+
+     size_t
+     i18n_time_n_data (char *s, size_t len, const struct tm *tp)
+     {
+       return strftime (s, len, nl_langinfo (D_T_FMT), tp);
+     }
+
+   Now it uses the date and time format of the locale selected when the
+program runs.  If the user selects the locale correctly there should
+never be a misunderstanding over the time and date format.
+
+
+File: libc.info,  Node: Formatting Numbers,  Next: Yes-or-No Questions,  Prev: Locale Information,  Up: Locales
+
+7.7 A dedicated function to format numbers
+==========================================
+
+We have seen that the structure returned by 'localeconv' as well as the
+values given to 'nl_langinfo' allow you to retrieve the various pieces
+of locale-specific information to format numbers and monetary amounts.
+We have also seen that the underlying rules are quite complex.
+
+   Therefore the X/Open standards introduce a function which uses such
+locale information, making it easier for the user to format numbers
+according to these rules.
+
+ -- Function: ssize_t strfmon (char *S, size_t MAXSIZE, const char
+          *FORMAT, ...)
+     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
+     *Note POSIX Safety Concepts::.
+
+     The 'strfmon' function is similar to the 'strftime' function in
+     that it takes a buffer, its size, a format string, and values to
+     write into the buffer as text in a form specified by the format
+     string.  Like 'strftime', the function also returns the number of
+     bytes written into the buffer.
+
+     There are two differences: 'strfmon' can take more than one
+     argument, and, of course, the format specification is different.
+     Like 'strftime', the format string consists of normal text, which
+     is output as is, and format specifiers, which are indicated by a
+     '%'.  Immediately after the '%', you can optionally specify various
+     flags and formatting information before the main formatting
+     character, in a similar way to 'printf':
+
+        * Immediately following the '%' there can be one or more of the
+          following flags:
+          '=F'
+               The single byte character F is used for this field as the
+               numeric fill character.  By default this character is a
+               space character.  Filling with this character is only
+               performed if a left precision is specified.  It is not
+               just to fill to the given field width.
+          '^'
+               The number is printed without grouping the digits
+               according to the rules of the current locale.  By default
+               grouping is enabled.
+          '+', '('
+               At most one of these flags can be used.  They select
+               which format to represent the sign of a currency amount.
+               By default, and if '+' is given, the locale equivalent of
+               +/- is used.  If '(' is given, negative amounts are
+               enclosed in parentheses.  The exact format is determined
+               by the values of the 'LC_MONETARY' category of the locale
+               selected at program runtime.
+          '!'
+               The output will not contain the currency symbol.
+          '-'
+               The output will be formatted left-justified instead of
+               right-justified if it does not fill the entire field
+               width.
+
+     The next part of a specification is an optional field width.  If no
+     width is specified 0 is taken.  During output, the function first
+     determines how much space is required.  If it requires at least as
+     many characters as given by the field width, it is output using as
+     much space as necessary.  Otherwise, it is extended to use the full
+     width by filling with the space character.  The presence or absence
+     of the '-' flag determines the side at which such padding occurs.
+     If present, the spaces are added at the right making the output
+     left-justified, and vice versa.
+
+     So far the format looks familiar, being similar to the 'printf' and
+     'strftime' formats.  However, the next two optional fields
+     introduce something new.  The first one is a '#' character followed
+     by a decimal digit string.  The value of the digit string specifies
+     the number of _digit_ positions to the left of the decimal point
+     (or equivalent).  This does _not_ include the grouping character
+     when the '^' flag is not given.  If the space needed to print the
+     number does not fill the whole width, the field is padded at the
+     left side with the fill character, which can be selected using the
+     '=' flag and by default is a space.  For example, if the field
+     width is selected as 6 and the number is 123, the fill character is
+     '*' the result will be '***123'.
+
+     The second optional field starts with a '.' (period) and consists
+     of another decimal digit string.  Its value describes the number of
+     characters printed after the decimal point.  The default is
+     selected from the current locale ('frac_digits', 'int_frac_digits',
+     see *note General Numeric::).  If the exact representation needs
+     more digits than given by the field width, the displayed value is
+     rounded.  If the number of fractional digits is selected to be
+     zero, no decimal point is printed.
+
+     As a GNU extension, the 'strfmon' implementation in the GNU C
+     Library allows an optional 'L' next as a format modifier.  If this
+     modifier is given, the argument is expected to be a 'long double'
+     instead of a 'double' value.
+
+     Finally, the last component is a format specifier.  There are three
+     specifiers defined:
+
+     'i'
+          Use the locale's rules for formatting an international
+          currency value.
+     'n'
+          Use the locale's rules for formatting a national currency
+          value.
+     '%'
+          Place a '%' in the output.  There must be no flag, width
+          specifier or modifier given, only '%%' is allowed.
+
+     As for 'printf', the function reads the format string from left to
+     right and uses the values passed to the function following the
+     format string.  The values are expected to be either of type
+     'double' or 'long double', depending on the presence of the
+     modifier 'L'.  The result is stored in the buffer pointed to by S.
+     At most MAXSIZE characters are stored.
+
+     The return value of the function is the number of characters stored
+     in S, including the terminating 'NULL' byte.  If the number of
+     characters stored would exceed MAXSIZE, the function returns -1 and
+     the content of the buffer S is unspecified.  In this case 'errno'
+     is set to 'E2BIG'.
+
+   A few examples should make clear how the function works.  It is
+assumed that all the following pieces of code are executed in a program
+which uses the USA locale ('en_US').  The simplest form of the format is
+this:
+
+     strfmon (buf, 100, "@%n@%n@%n@", 123.45, -567.89, 12345.678);
+
+The output produced is
+     "@$123.45@-$567.89@$12,345.68@"
+
+   We can notice several things here.  First, the widths of the output
+numbers are different.  We have not specified a width in the format
+string, and so this is no wonder.  Second, the third number is printed
+using thousands separators.  The thousands separator for the 'en_US'
+locale is a comma.  The number is also rounded.  .678 is rounded to .68
+since the format does not specify a precision and the default value in
+the locale is 2.  Finally, note that the national currency symbol is
+printed since '%n' was used, not 'i'.  The next example shows how we can
+align the output.
+
+     strfmon (buf, 100, "@%=*11n@%=*11n@%=*11n@", 123.45, -567.89, 12345.678);
+
+The output this time is:
+
+     "@    $123.45@   -$567.89@ $12,345.68@"
+
+   Two things stand out.  Firstly, all fields have the same width
+(eleven characters) since this is the width given in the format and
+since no number required more characters to be printed.  The second
+important point is that the fill character is not used.  This is correct
+since the white space was not used to achieve a precision given by a '#'
+modifier, but instead to fill to the given width.  The difference
+becomes obvious if we now add a width specification.
+
+     strfmon (buf, 100, "@%=*11#5n@%=*11#5n@%=*11#5n@",
+              123.45, -567.89, 12345.678);
+
+The output is
+
+     "@ $***123.45@-$***567.89@ $12,456.68@"
+
+   Here we can see that all the currency symbols are now aligned, and
+that the space between the currency sign and the number is filled with
+the selected fill character.  Note that although the width is selected
+to be 5 and 123.45 has three digits left of the decimal point, the space
+is filled with three asterisks.  This is correct since, as explained
+above, the width does not include the positions used to store thousands
+separators.  One last example should explain the remaining
+functionality.
+
+     strfmon (buf, 100, "@%=0(16#5.3i@%=0(16#5.3i@%=0(16#5.3i@",
+              123.45, -567.89, 12345.678);
+
+This rather complex format string produces the following output:
+
+     "@ USD 000123,450 @(USD 000567.890)@ USD 12,345.678 @"
+
+   The most noticeable change is the alternative way of representing
+negative numbers.  In financial circles this is often done using
+parentheses, and this is what the '(' flag selected.  The fill character
+is now '0'.  Note that this '0' character is not regarded as a numeric
+zero, and therefore the first and second numbers are not printed using a
+thousands separator.  Since we used the format specifier 'i' instead of
+'n', the international form of the currency symbol is used.  This is a
+four letter string, in this case '"USD "'.  The last point is that since
+the precision right of the decimal point is selected to be three, the
+first and second numbers are printed with an extra zero at the end and
+the third number is printed without rounding.
+
+
+File: libc.info,  Node: Yes-or-No Questions,  Prev: Formatting Numbers,  Up: Locales
+
+7.8 Yes-or-No Questions
+=======================
+
+Some non GUI programs ask a yes-or-no question.  If the messages
+(especially the questions) are translated into foreign languages, be
+sure that you localize the answers too.  It would be very bad habit to
+ask a question in one language and request the answer in another, often
+English.
+
+   The GNU C Library contains 'rpmatch' to give applications easy access
+to the corresponding locale definitions.
+
+ -- Function: int rpmatch (const char *RESPONSE)
+     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap lock dlopen
+     | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
+
+     The function 'rpmatch' checks the string in RESPONSE whether or not
+     it is a correct yes-or-no answer and if yes, which one.  The check
+     uses the 'YESEXPR' and 'NOEXPR' data in the 'LC_MESSAGES' category
+     of the currently selected locale.  The return value is as follows:
+
+     '1'
+          The user entered an affirmative answer.
+
+     '0'
+          The user entered a negative answer.
+
+     '-1'
+          The answer matched neither the 'YESEXPR' nor the 'NOEXPR'
+          regular expression.
+
+     This function is not standardized but available beside in the GNU C
+     Library at least also in the IBM AIX library.
+
+This function would normally be used like this:
+
+       ...
+       /* Use a safe default.  */
+       _Bool doit = false;
+
+       fputs (gettext ("Do you really want to do this? "), stdout);
+       fflush (stdout);
+       /* Prepare the 'getline' call.  */
+       line = NULL;
+       len = 0;
+       while (getline (&line, &len, stdin) >= 0)
+         {
+           /* Check the response.  */
+           int res = rpmatch (line);
+           if (res >= 0)
+             {
+               /* We got a definitive answer.  */
+               if (res > 0)
+                 doit = true;
+               break;
+             }
+         }
+       /* Free what 'getline' allocated.  */
+       free (line);
+
+   Note that the loop continues until a read error is detected or until
+a definitive (positive or negative) answer is read.
+
+
+File: libc.info,  Node: Message Translation,  Next: Searching and Sorting,  Prev: Locales,  Up: Top
+
+8 Message Translation
+*********************
+
+The program's interface with the user should be designed to ease the
+user's task.  One way to ease the user's task is to use messages in
+whatever language the user prefers.
+
+   Printing messages in different languages can be implemented in
+different ways.  One could add all the different languages in the source
+code and choose among the variants every time a message has to be
+printed.  This is certainly not a good solution since extending the set
+of languages is cumbersome (the code must be changed) and the code
+itself can become really big with dozens of message sets.
+
+   A better solution is to keep the message sets for each language in
+separate files which are loaded at runtime depending on the language
+selection of the user.
+
+   The GNU C Library provides two different sets of functions to support
+message translation.  The problem is that neither of the interfaces is
+officially defined by the POSIX standard.  The 'catgets' family of
+functions is defined in the X/Open standard but this is derived from
+industry decisions and therefore not necessarily based on reasonable
+decisions.
+
+   As mentioned above the message catalog handling provides easy
+extendibility by using external data files which contain the message
+translations.  I.e., these files contain for each of the messages used
+in the program a translation for the appropriate language.  So the tasks
+of the message handling functions are
+
+   * locate the external data file with the appropriate translations
+   * load the data and make it possible to address the messages
+   * map a given key to the translated message
+
+   The two approaches mainly differ in the implementation of this last
+step.  Decisions made in the last step influence the rest of the design.
+
+* Menu:
+
+* Message catalogs a la X/Open::  The 'catgets' family of functions.
+* The Uniforum approach::         The 'gettext' family of functions.
+
+
+File: libc.info,  Node: Message catalogs a la X/Open,  Next: The Uniforum approach,  Up: Message Translation
+
+8.1 X/Open Message Catalog Handling
+===================================
+
+The 'catgets' functions are based on the simple scheme:
+
+     Associate every message to translate in the source code with a
+     unique identifier.  To retrieve a message from a catalog file
+     solely the identifier is used.
+
+   This means for the author of the program that s/he will have to make
+sure the meaning of the identifier in the program code and in the
+message catalogs are always the same.
+
+   Before a message can be translated the catalog file must be located.
+The user of the program must be able to guide the responsible function
+to find whatever catalog the user wants.  This is separated from what
+the programmer had in mind.
+
+   All the types, constants and functions for the 'catgets' functions
+are defined/declared in the 'nl_types.h' header file.
+
+* Menu:
+
+* The catgets Functions::      The 'catgets' function family.
+* The message catalog files::  Format of the message catalog files.
+* The gencat program::         How to generate message catalogs files which
+                                can be used by the functions.
+* Common Usage::               How to use the 'catgets' interface.
 
 
 File: libc.info,  Node: The catgets Functions,  Next: The message catalog files,  Up: Message catalogs a la X/Open
 
-8.1.1 The `catgets' function family
+8.1.1 The 'catgets' function family
 -----------------------------------
 
  -- Function: nl_catd catopen (const char *CAT_NAME, int FLAG)
-     Preliminary: | MT-Safe env | AS-Unsafe heap | AC-Unsafe mem |
-     *Note POSIX Safety Concepts::.
+     Preliminary: | MT-Safe env | AS-Unsafe heap | AC-Unsafe mem | *Note
+     POSIX Safety Concepts::.
 
-     The `catopen' function tries to locate the message data file names
-     CAT_NAME and loads it when found.  The return value is of an
-     opaque type and can be used in calls to the other functions to
-     refer to this loaded catalog.
+     The 'catopen' function tries to locate the message data file names
+     CAT_NAME and loads it when found.  The return value is of an opaque
+     type and can be used in calls to the other functions to refer to
+     this loaded catalog.
 
-     The return value is `(nl_catd) -1' in case the function failed and
+     The return value is '(nl_catd) -1' in case the function failed and
      no catalog was loaded.  The global variable ERRNO contains a code
      for the error causing the failure.  But even if the function call
      succeeded this does not mean that all messages can be translated.
@@ -1744,94 +4484,94 @@
      languages and the catalogs for all programs are kept in the same
      place.
 
-     To tell the `catopen' function where the catalog for the program
-     can be found the user can set the environment variable `NLSPATH' to
+     To tell the 'catopen' function where the catalog for the program
+     can be found the user can set the environment variable 'NLSPATH' to
      a value which describes her/his choice.  Since this value must be
      usable for different languages and locales it cannot be a simple
-     string.  Instead it is a format string (similar to `printf''s).
-     An example is
+     string.  Instead it is a format string (similar to 'printf''s).  An
+     example is
 
           /usr/share/locale/%L/%N:/usr/share/locale/%L/LC_MESSAGES/%N
 
      First one can see that more than one directory can be specified
      (with the usual syntax of separating them by colons).  The next
-     things to observe are the format string, `%L' and `%N' in this
-     case.  The `catopen' function knows about several of them and the
+     things to observe are the format string, '%L' and '%N' in this
+     case.  The 'catopen' function knows about several of them and the
      replacement for all of them is of course different.
 
-    `%N'
+     '%N'
           This format element is substituted with the name of the
           catalog file.  This is the value of the CAT_NAME argument
-          given to `catgets'.
+          given to 'catgets'.
 
-    `%L'
+     '%L'
           This format element is substituted with the name of the
           currently selected locale for translating messages.  How this
           is determined is explained below.
 
-    `%l'
-          (This is the lowercase ell.) This format element is
-          substituted with the language element of the locale name.
-          The string describing the selected locale is expected to have
-          the form `LANG[_TERR[.CODESET]]' and this format uses the
-          first part LANG.
+     '%l'
+          (This is the lowercase ell.)  This format element is
+          substituted with the language element of the locale name.  The
+          string describing the selected locale is expected to have the
+          form 'LANG[_TERR[.CODESET]]' and this format uses the first
+          part LANG.
 
-    `%t'
+     '%t'
           This format element is substituted by the territory part TERR
           of the name of the currently selected locale.  See the
           explanation of the format above.
 
-    `%c'
-          This format element is substituted by the codeset part
-          CODESET of the name of the currently selected locale.  See
-          the explanation of the format above.
+     '%c'
+          This format element is substituted by the codeset part CODESET
+          of the name of the currently selected locale.  See the
+          explanation of the format above.
 
-    `%%'
-          Since `%' is used in a meta character there must be a way to
-          express the `%' character in the result itself.  Using `%%'
-          does this just like it works for `printf'.
+     '%%'
+          Since '%' is used in a meta character there must be a way to
+          express the '%' character in the result itself.  Using '%%'
+          does this just like it works for 'printf'.
 
-     Using `NLSPATH' allows arbitrary directories to be searched for
+     Using 'NLSPATH' allows arbitrary directories to be searched for
      message catalogs while still allowing different languages to be
-     used.  If the `NLSPATH' environment variable is not set, the
+     used.  If the 'NLSPATH' environment variable is not set, the
      default value is
 
           PREFIX/share/locale/%L/%N:PREFIX/share/locale/%L/LC_MESSAGES/%N
 
-     where PREFIX is given to `configure' while installing the GNU C
-     Library (this value is in many cases `/usr' or the empty string).
+     where PREFIX is given to 'configure' while installing the GNU C
+     Library (this value is in many cases '/usr' or the empty string).
 
      The remaining problem is to decide which must be used.  The value
      decides about the substitution of the format elements mentioned
      above.  First of all the user can specify a path in the message
      catalog name (i.e., the name contains a slash character).  In this
-     situation the `NLSPATH' environment variable is not used.  The
-     catalog must exist as specified in the program, perhaps relative
-     to the current working directory.  This situation in not desirable
-     and catalogs names never should be written this way.  Beside this,
-     this behavior is not portable to all other platforms providing the
-     `catgets' interface.
+     situation the 'NLSPATH' environment variable is not used.  The
+     catalog must exist as specified in the program, perhaps relative to
+     the current working directory.  This situation in not desirable and
+     catalogs names never should be written this way.  Beside this, this
+     behavior is not portable to all other platforms providing the
+     'catgets' interface.
 
      Otherwise the values of environment variables from the standard
      environment are examined (*note Standard Environment::).  Which
      variables are examined is decided by the FLAG parameter of
-     `catopen'.  If the value is `NL_CAT_LOCALE' (which is defined in
-     `nl_types.h') then the `catopen' function use the name of the
-     locale currently selected for the `LC_MESSAGES' category.
+     'catopen'.  If the value is 'NL_CAT_LOCALE' (which is defined in
+     'nl_types.h') then the 'catopen' function use the name of the
+     locale currently selected for the 'LC_MESSAGES' category.
 
-     If FLAG is zero the `LANG' environment variable is examined.  This
+     If FLAG is zero the 'LANG' environment variable is examined.  This
      is a left-over from the early days where the concept of the locales
      had not even reached the level of POSIX locales.
 
-     The environment variable and the locale name should have a value
-     of the form `LANG[_TERR[.CODESET]]' as explained above.  If no
-     environment variable is set the `"C"' locale is used which
-     prevents any translation.
+     The environment variable and the locale name should have a value of
+     the form 'LANG[_TERR[.CODESET]]' as explained above.  If no
+     environment variable is set the '"C"' locale is used which prevents
+     any translation.
 
      The return value of the function is in any case a valid string.
-     Either it is a translation from a message catalog or it is the
-     same as the STRING parameter.  So a piece of code to decide
-     whether a translation actually happened must look like this:
+     Either it is a translation from a message catalog or it is the same
+     as the STRING parameter.  So a piece of code to decide whether a
+     translation actually happened must look like this:
 
           {
             char *trans = catgets (desc, set, msg, input_string);
@@ -1843,10 +4583,9 @@
 
      When an error occurred the global variable ERRNO is set to
 
-    EBADF
+     EBADF
           The catalog does not exist.
-
-    ENOMSG
+     ENOMSG
           The set/message tuple does not name an existing element in the
           message catalog.
 
@@ -1857,9 +4596,9 @@
      look for the reason why the messages are not translated.
 
    Please note that the currently selected locale does not depend on a
-call to the `setlocale' function.  It is not necessary that the locale
-data files for this locale exist and calling `setlocale' succeeds.  The
-`catopen' function directly reads the values of the environment
+call to the 'setlocale' function.  It is not necessary that the locale
+data files for this locale exist and calling 'setlocale' succeeds.  The
+'catopen' function directly reads the values of the environment
 variables.
 
  -- Function: char * catgets (nl_catd CATALOG_DESC, int SET, int
@@ -1867,9 +4606,9 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The function `catgets' has to be used to access the massage catalog
-     previously opened using the `catopen' function.  The CATALOG_DESC
-     parameter must be a value previously returned by `catopen'.
+     The function 'catgets' has to be used to access the massage catalog
+     previously opened using the 'catopen' function.  The CATALOG_DESC
+     parameter must be a value previously returned by 'catopen'.
 
      The next two parameters, SET and MESSAGE, reflect the internal
      organization of the message catalog files.  This will be explained
@@ -1882,17 +4621,16 @@
 
      Since it is not guaranteed that the message catalog for the
      language selected by the user exists the last parameter STRING
-     helps to handle this case gracefully.  If no matching string can
-     be found STRING is returned.  This means for the programmer that
+     helps to handle this case gracefully.  If no matching string can be
+     found STRING is returned.  This means for the programmer that
 
         * the STRING parameters should contain reasonable text (this
           also helps to understand the program seems otherwise there
           would be no hint on the string which is expected to be
           returned.
-
         * all STRING arguments should be written in the same language.
 
-   It is somewhat uncomfortable to write a program using the `catgets'
+   It is somewhat uncomfortable to write a program using the 'catgets'
 functions if no supporting functionality is available.  Since each
 set/message number tuple must be unique the programmer must keep lists
 of the messages at the same time the code is written.  And the work
@@ -1904,12 +4642,12 @@
      Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe corrupt mem |
      *Note POSIX Safety Concepts::.
 
-     The `catclose' function can be used to free the resources
+     The 'catclose' function can be used to free the resources
      associated with a message catalog which previously was opened by a
-     call to `catopen'.  If the resources can be successfully freed the
-     function returns `0'.  Otherwise it return `-1' and the global
+     call to 'catopen'.  If the resources can be successfully freed the
+     function returns '0'.  Otherwise it return '-1' and the global
      variable ERRNO is set.  Errors can occur if the catalog descriptor
-     CATALOG_DESC is not valid in which case ERRNO is set to `EBADF'.
+     CATALOG_DESC is not valid in which case ERRNO is set to 'EBADF'.
 
 
 File: libc.info,  Node: The message catalog files,  Next: The gencat program,  Prev: The catgets Functions,  Up: Message catalogs a la X/Open
@@ -1919,7 +4657,7 @@
 
 The only reasonable way the translate all the messages of a function and
 store the result in a message catalog file which can be read by the
-`catopen' function is to write all the message text to the translator
+'catopen' function is to write all the message text to the translator
 and let her/him translate them all.  I.e., we must have a file with
 entries which associate the set/message tuple with a specific
 translation.  This file format is specified in the X/Open standard and
@@ -1928,12 +4666,12 @@
    * Lines containing only whitespace characters or empty lines are
      ignored.
 
-   * Lines which contain as the first non-whitespace character a `$'
+   * Lines which contain as the first non-whitespace character a '$'
      followed by a whitespace character are comment and are also
      ignored.
 
    * If a line contains as the first non-whitespace characters the
-     sequence `$set' followed by a whitespace character an additional
+     sequence '$set' followed by a whitespace character an additional
      argument is required to follow.  This argument can either be:
 
         - a number.  In this case the value of this number determines
@@ -1941,8 +4679,8 @@
 
         - an identifier consisting of alphanumeric characters plus the
           underscore character.  In this case the set get automatically
-          a number assigned.  This value is one added to the largest
-          set number which so far appeared.
+          a number assigned.  This value is one added to the largest set
+          number which so far appeared.
 
           How to use the symbolic names is explained in section *note
           Common Usage::.
@@ -1951,9 +4689,8 @@
           following messages are placed in a set with this number.
 
    * If a line contains as the first non-whitespace characters the
-     sequence `$delset' followed by a whitespace character an
-     additional argument is required to follow.  This argument can
-     either be:
+     sequence '$delset' followed by a whitespace character an additional
+     argument is required to follow.  This argument can either be:
 
         - a number.  In this case the value of this number determines
           the set which will be deleted.
@@ -1964,36 +4701,36 @@
           if the name is unknown.
 
      In both cases all messages in the specified set will be removed.
-     They will not appear in the output.  But if this set is later
-     again selected with a `$set' command again messages could be added
-     and these messages will appear in the output.
+     They will not appear in the output.  But if this set is later again
+     selected with a '$set' command again messages could be added and
+     these messages will appear in the output.
 
-   * If a line contains after leading whitespaces the sequence
-     `$quote', the quoting character used for this input file is
-     changed to the first non-whitespace character following the
-     `$quote'.  If no non-whitespace character is present before the
-     line ends quoting is disable.
+   * If a line contains after leading whitespaces the sequence '$quote',
+     the quoting character used for this input file is changed to the
+     first non-whitespace character following the '$quote'.  If no
+     non-whitespace character is present before the line ends quoting is
+     disable.
 
      By default no quoting character is used.  In this mode strings are
      terminated with the first unescaped line break.  If there is a
-     `$quote' sequence present newline need not be escaped.  Instead a
+     '$quote' sequence present newline need not be escaped.  Instead a
      string is terminated with the first unescaped appearance of the
      quote character.
 
      A common usage of this feature would be to set the quote character
-     to `"'.  Then any appearance of the `"' in the strings must be
-     escaped using the backslash (i.e., `\"' must be written).
+     to '"'.  Then any appearance of the '"' in the strings must be
+     escaped using the backslash (i.e., '\"' must be written).
 
    * Any other line must start with a number or an alphanumeric
-     identifier (with the underscore character included).  The
-     following characters (starting after the first whitespace
-     character) will form the string which gets associated with the
-     currently selected set and the message number represented by the
-     number and identifier respectively.
+     identifier (with the underscore character included).  The following
+     characters (starting after the first whitespace character) will
+     form the string which gets associated with the currently selected
+     set and the message number represented by the number and identifier
+     respectively.
 
-     If the start of the line is a number the message number is
-     obvious.  It is an error if the same message number already
-     appeared for this set.
+     If the start of the line is a number the message number is obvious.
+     It is an error if the same message number already appeared for this
+     set.
 
      If the leading token was an identifier the message number gets
      automatically assigned.  The value is the current maximum messages
@@ -2001,13 +4738,13 @@
      already used for a message in this set.  It is OK to reuse the
      identifier for a message in another thread.  How to use the
      symbolic identifiers will be explained below (*note Common
-     Usage::).  There is one limitation with the identifier: it must
-     not be `Set'.  The reason will be explained below.
+     Usage::).  There is one limitation with the identifier: it must not
+     be 'Set'.  The reason will be explained below.
 
      The text of the messages can contain escape characters.  The usual
      bunch of characters known from the ISO C language are recognized
-     (`\n', `\t', `\v', `\b', `\r', `\f', `\\', and `\NNN', where NNN
-     is the octal coding of a character code).
+     ('\n', '\t', '\v', '\b', '\r', '\f', '\\', and '\NNN', where NNN is
+     the octal coding of a character code).
 
    *Important:* The handling of identifiers instead of numbers for the
 set and messages is a GNU extension.  Systems strictly following the
@@ -2026,33 +4763,31 @@
      4000 "The numbers can be arbitrary, they need not start at one."
 
    This small example shows various aspects:
-   * Lines 1 and 9 are comments since they start with `$' followed by a
+   * Lines 1 and 9 are comments since they start with '$' followed by a
      whitespace.
-
-   * The quoting character is set to `"'.  Otherwise the quotes in the
+   * The quoting character is set to '"'.  Otherwise the quotes in the
      message definition would have to be left away and in this case the
-     message with the identifier `two' would loose its leading
+     message with the identifier 'two' would loose its leading
      whitespace.
-
    * Mixing numbered messages with message having symbolic names is no
      problem and the numbering happens automatically.
 
    While this file format is pretty easy it is not the best possible for
-use in a running program.  The `catopen' function would have to parser
+use in a running program.  The 'catopen' function would have to parser
 the file and handle syntactic errors gracefully.  This is not so easy
-and the whole process is pretty slow.  Therefore the `catgets'
-functions expect the data in another more compact and ready-to-use file
-format.  There is a special program `gencat' which is explained in
-detail in the next section.
+and the whole process is pretty slow.  Therefore the 'catgets' functions
+expect the data in another more compact and ready-to-use file format.
+There is a special program 'gencat' which is explained in detail in the
+next section.
 
-   Files in this other format are not human readable.  To be easy to
-use by programs it is a binary file.  But the format is byte order
+   Files in this other format are not human readable.  To be easy to use
+by programs it is a binary file.  But the format is byte order
 independent so translation files can be shared by systems of arbitrary
 architecture (as long as they use the GNU C Library).
 
    Details about the binary file format are not important to know since
-these files are always created by the `gencat' program.  The sources of
-the GNU C Library also provide the sources for the `gencat' program and
+these files are always created by the 'gencat' program.  The sources of
+the GNU C Library also provide the sources for the 'gencat' program and
 so the interested reader can look through these source files to learn
 about the file format.
 
@@ -2062,13 +4797,12 @@
 8.1.3 Generate Message Catalogs files
 -------------------------------------
 
-The `gencat' program is specified in the X/Open standard and the GNU
-implementation follows this specification and so processes all
-correctly formed input files.  Additionally some extension are
-implemented which help to work in a more reasonable way with the
-`catgets' functions.
+The 'gencat' program is specified in the X/Open standard and the GNU
+implementation follows this specification and so processes all correctly
+formed input files.  Additionally some extension are implemented which
+help to work in a more reasonable way with the 'catgets' functions.
 
-   The `gencat' program can be invoked in two ways:
+   The 'gencat' program can be invoked in two ways:
 
      `gencat [OPTION]... [OUTPUT-FILE [INPUT-FILE]...]`
 
@@ -2081,15 +4815,15 @@
 
      `gencat [OPTION]... -o OUTPUT-FILE [INPUT-FILE]...`
 
-   The option `-o' is used to specify the output file and all file
+   The option '-o' is used to specify the output file and all file
 arguments are used as input files.
 
-   Beside this one can use `-' or `/dev/stdin' for INPUT-FILE to denote
-the standard input.  Corresponding one can use `-' and `/dev/stdout'
-for OUTPUT-FILE to denote standard output.  Using `-' as a file name is
+   Beside this one can use '-' or '/dev/stdin' for INPUT-FILE to denote
+the standard input.  Corresponding one can use '-' and '/dev/stdout' for
+OUTPUT-FILE to denote standard output.  Using '-' as a file name is
 allowed in X/Open while using the device names is a GNU extension.
 
-   The `gencat' program works by concatenating all input files and then
+   The 'gencat' program works by concatenating all input files and then
 *merge* the resulting collection of message sets with a possibly
 existing output file.  This is done by removing all messages with
 set/message number tuples matching any of the generated messages from
@@ -2098,49 +4832,46 @@
 remove the output file if it exists.  If the output is written to
 standard output no merging takes place.
 
-The following table shows the options understood by the `gencat'
+The following table shows the options understood by the 'gencat'
 program.  The X/Open standard does not specify any option for the
 program so all of these are GNU extensions.
 
-`-V'
-`--version'
+'-V'
+'--version'
      Print the version information and exit.
-
-`-h'
-`--help'
+'-h'
+'--help'
      Print a usage message listing all available options, then exit
      successfully.
-
-`--new'
+'--new'
      Do never merge the new messages from the input files with the old
-     content of the output files.  The old content of the output file
-     is discarded.
-
-`-H'
-`--header=name'
+     content of the output files.  The old content of the output file is
+     discarded.
+'-H'
+'--header=name'
      This option is used to emit the symbolic names given to sets and
      messages in the input files for use in the program.  Details about
      how to use this are given in the next section.  The NAME parameter
      to this option specifies the name of the output file.  It will
-     contain a number of C preprocessor `#define's to associate a name
+     contain a number of C preprocessor '#define's to associate a name
      with a number.
 
      Please note that the generated file only contains the symbols from
-     the input files.  If the output is merged with the previous
-     content of the output file the possibly existing symbols from the
-     file(s) which generated the old output files are not in the
-     generated header file.
+     the input files.  If the output is merged with the previous content
+     of the output file the possibly existing symbols from the file(s)
+     which generated the old output files are not in the generated
+     header file.
 
 
 File: libc.info,  Node: Common Usage,  Prev: The gencat program,  Up: Message catalogs a la X/Open
 
-8.1.4 How to use the `catgets' interface
+8.1.4 How to use the 'catgets' interface
 ----------------------------------------
 
-The `catgets' functions can be used in two different ways.  By
-following slavishly the X/Open specs and not relying on the extension
-and by using the GNU extensions.  We will take a look at the former
-method first to understand the benefits of extensions.
+The 'catgets' functions can be used in two different ways.  By following
+slavishly the X/Open specs and not relying on the extension and by using
+the GNU extensions.  We will take a look at the former method first to
+understand the benefits of extensions.
 
 8.1.4.1 Not using symbolic names
 ................................
@@ -2152,36 +4883,35 @@
 
      catgets (catdesc, set, msg, "string")
 
-CATGETS is retrieved from a call to `catopen' which is normally done
-once at the program start.  The `"string"' is the string we want to
+CATGETS is retrieved from a call to 'catopen' which is normally done
+once at the program start.  The '"string"' is the string we want to
 translate.  The problems start with the set and message numbers.
 
-   In a bigger program several programmers usually work at the same
-time on the program and so coordinating the number allocation is
-crucial.  Though no two different strings must be indexed by the same
-tuple of numbers it is highly desirable to reuse the numbers for equal
-strings with equal translations (please note that there might be
-strings which are equal in one language but have different translations
-due to difference contexts).
+   In a bigger program several programmers usually work at the same time
+on the program and so coordinating the number allocation is crucial.
+Though no two different strings must be indexed by the same tuple of
+numbers it is highly desirable to reuse the numbers for equal strings
+with equal translations (please note that there might be strings which
+are equal in one language but have different translations due to
+difference contexts).
 
    The allocation process can be relaxed a bit by different set numbers
 for different parts of the program.  So the number of developers who
 have to coordinate the allocation can be reduced.  But still lists must
 be keep track of the allocation and errors can easily happen.  These
-errors cannot be discovered by the compiler or the `catgets' functions.
+errors cannot be discovered by the compiler or the 'catgets' functions.
 Only the user of the program might see wrong messages printed.  In the
 worst cases the messages are so irritating that they cannot be
-recognized as wrong.  Think about the translations for `"true"' and
-`"false"' being exchanged.  This could result in a disaster.
+recognized as wrong.  Think about the translations for '"true"' and
+'"false"' being exchanged.  This could result in a disaster.
 
 8.1.4.2 Using symbolic names
 ............................
 
 The problems mentioned in the last section derive from the fact that:
 
-  1. the numbers are allocated once and due to the possibly frequent
-     use of them it is difficult to change a number later.
-
+  1. the numbers are allocated once and due to the possibly frequent use
+     of them it is difficult to change a number later.
   2. the numbers do not allow to guess anything about the string and
      therefore collisions can easily happen.
 
@@ -2195,7 +4925,7 @@
 before the program sources can be compiled.  In the last section it was
 described how to generate a header containing the mapping of the names.
 E.g., for the example message file given in the last section we could
-call the `gencat' program as follow (assume `ex.msg' contains the
+call the 'gencat' program as follow (assume 'ex.msg' contains the
 sources).
 
      gencat -H ex.h -o ex.cat ex.msg
@@ -2211,7 +4941,7 @@
 mangled to generate unique identifiers and these identifiers get numbers
 assigned.  Reading the source file and knowing about the rules will
 allow to predict the content of the header file (it is deterministic)
-but this is not necessary.  The `gencat' program can take care for
+but this is not necessary.  The 'gencat' program can take care for
 everything.  All the programmer has to do is to put the generated header
 file in the dependency list of the source files of her/his project and
 to add a rules to regenerate the header of any of the input files
@@ -2219,14 +4949,14 @@
 
    One word about the symbol mangling.  Every symbol consists of two
 parts: the name of the message set plus the name of the message or the
-special string `Set'.  So `SetOnetwo' means this macro can be used to
-access the translation with identifier `two' in the message set
-`SetOne'.
+special string 'Set'.  So 'SetOnetwo' means this macro can be used to
+access the translation with identifier 'two' in the message set
+'SetOne'.
 
    The other names denote the names of the message sets.  The special
-string `Set' is used in the place of the message identifier.
+string 'Set' is used in the place of the message identifier.
 
-   If in the code the second string of the set `SetOne' is used the C
+   If in the code the second string of the set 'SetOne' is used the C
 code should look like this:
 
      catgets (catdesc, SetOneSet, SetOnetwo,
@@ -2274,11 +5004,11 @@
 functions will behave reasonable.  They simply will be return a
 translation.
 
-   What remains unspecified here are the constants `SetMainSet' and
-`SetMainHello'.  These are the symbolic names describing the message.
-To get the actual definitions which match the information in the
-catalog file we have to create the message catalog source file and
-process it using the `gencat' program.
+   What remains unspecified here are the constants 'SetMainSet' and
+'SetMainHello'.  These are the symbolic names describing the message.
+To get the actual definitions which match the information in the catalog
+file we have to create the message catalog source file and process it
+using the 'gencat' program.
 
      $ Messages for the famous greeting program.
      $quote "
@@ -2287,7 +5017,7 @@
      Hello "Hallo, Welt!\n"
 
    Now we can start building the program (assume the message catalog
-source file is named `hello.msg' and the program source file `hello.c'):
+source file is named 'hello.msg' and the program source file 'hello.c'):
 
      % gencat -H msgnrs.h -o hello.cat hello.msg
      % cat msgnrs.h
@@ -2301,12 +5031,12 @@
      Hallo, Welt!
      %
 
-   The call of the `gencat' program creates the missing header file
-`msgnrs.h' as well as the message catalog binary.  The former is used
-in the compilation of `hello.c' while the later is placed in a
-directory in which the `catopen' function will try to locate it.
-Please check the `LC_ALL' environment variable and the default path for
-`catopen' presented in the description above.
+   The call of the 'gencat' program creates the missing header file
+'msgnrs.h' as well as the message catalog binary.  The former is used in
+the compilation of 'hello.c' while the later is placed in a directory in
+which the 'catopen' function will try to locate it.  Please check the
+'LC_ALL' environment variable and the default path for 'catopen'
+presented in the description above.
 
 
 File: libc.info,  Node: The Uniforum approach,  Prev: Message catalogs a la X/Open,  Up: Message Translation
@@ -2319,37 +5049,36 @@
 defined but still the interface was used in Sun's operating systems.
 Since this approach fits better in the development process of free
 software it is also used throughout the GNU project and the GNU
-`gettext' package provides support for this outside the GNU C Library.
+'gettext' package provides support for this outside the GNU C Library.
 
-   The code of the `libintl' from GNU `gettext' is the same as the code
-in the GNU C Library.  So the documentation in the GNU `gettext' manual
+   The code of the 'libintl' from GNU 'gettext' is the same as the code
+in the GNU C Library.  So the documentation in the GNU 'gettext' manual
 is also valid for the functionality here.  The following text will
 describe the library functions in detail.  But the numerous helper
 programs are not described in this manual.  Instead people should read
-the GNU `gettext' manual (*note GNU gettext utilities: (gettext)Top.).
+the GNU 'gettext' manual (*note GNU gettext utilities: (gettext)Top.).
 We will only give a short overview.
 
-   Though the `catgets' functions are available by default on more
-systems the `gettext' interface is at least as portable as the former.
-The GNU `gettext' package can be used wherever the functions are not
+   Though the 'catgets' functions are available by default on more
+systems the 'gettext' interface is at least as portable as the former.
+The GNU 'gettext' package can be used wherever the functions are not
 available.
 
 * Menu:
 
-* Message catalogs with gettext::  The `gettext' family of functions.
+* Message catalogs with gettext::  The 'gettext' family of functions.
 * Helper programs for gettext::    Programs to handle message catalogs
-                                    for `gettext'.
+                                    for 'gettext'.
 
 
 File: libc.info,  Node: Message catalogs with gettext,  Next: Helper programs for gettext,  Up: The Uniforum approach
 
-8.2.1 The `gettext' family of functions
+8.2.1 The 'gettext' family of functions
 ---------------------------------------
 
-The paradigms underlying the `gettext' approach to message translations
-is different from that of the `catgets' functions the basic
-functionally is equivalent.  There are functions of the following
-categories:
+The paradigms underlying the 'gettext' approach to message translations
+is different from that of the 'catgets' functions the basic functionally
+is equivalent.  There are functions of the following categories:
 
 * Menu:
 
@@ -2358,10 +5087,10 @@
 * Advanced gettext functions::     Additional functions for more complicated
                                     situations.
 * Charset conversion in gettext::  How to specify the output character set
-                                    `gettext' uses.
-* GUI program problems::           How to use `gettext' in GUI programs.
+                                    'gettext' uses.
+* GUI program problems::           How to use 'gettext' in GUI programs.
 * Using gettextized software::     The possibilities of the user to influence
-                                    the way `gettext' works.
+                                    the way 'gettext' works.
 
 
 File: libc.info,  Node: Translation with gettext,  Next: Locating gettext catalog,  Up: Message catalogs with gettext
@@ -2369,75 +5098,75 @@
 8.2.1.1 What has to be done to translate a message?
 ...................................................
 
-The `gettext' functions have a very simple interface.  The most basic
-function just takes the string which shall be translated as the
-argument and it returns the translation.  This is fundamentally
-different from the `catgets' approach where an extra key is necessary
-and the original string is only used for the error case.
+The 'gettext' functions have a very simple interface.  The most basic
+function just takes the string which shall be translated as the argument
+and it returns the translation.  This is fundamentally different from
+the 'catgets' approach where an extra key is necessary and the original
+string is only used for the error case.
 
    If the string which has to be translated is the only argument this of
 course means the string itself is the key.  I.e., the translation will
 be selected based on the original string.  The message catalogs must
 therefore contain the original strings plus one translation for any such
-string.  The task of the `gettext' function is it to compare the
+string.  The task of the 'gettext' function is it to compare the
 argument string with the available strings in the catalog and return the
 appropriate translation.  Of course this process is optimized so that
 this process is not more expensive than an access using an atomic key
-like in `catgets'.
+like in 'catgets'.
 
-   The `gettext' approach has some advantages but also some
-disadvantages.  Please see the GNU `gettext' manual for a detailed
+   The 'gettext' approach has some advantages but also some
+disadvantages.  Please see the GNU 'gettext' manual for a detailed
 discussion of the pros and cons.
 
-   All the definitions and declarations for `gettext' can be found in
-the `libintl.h' header file.  On systems where these functions are not
+   All the definitions and declarations for 'gettext' can be found in
+the 'libintl.h' header file.  On systems where these functions are not
 part of the C library they can be found in a separate library named
-`libintl.a' (or accordingly different for shared libraries).
+'libintl.a' (or accordingly different for shared libraries).
 
  -- Function: char * gettext (const char *MSGID)
      Preliminary: | MT-Safe env | AS-Unsafe corrupt heap lock dlopen |
      AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
 
-     The `gettext' function searches the currently selected message
+     The 'gettext' function searches the currently selected message
      catalogs for a string which is equal to MSGID.  If there is such a
      string available it is returned.  Otherwise the argument string
      MSGID is returned.
 
-     Please note that although the return value is `char *' the
-     returned string must not be changed.  This broken type results
-     from the history of the function and does not reflect the way the
-     function should be used.
+     Please note that although the return value is 'char *' the returned
+     string must not be changed.  This broken type results from the
+     history of the function and does not reflect the way the function
+     should be used.
 
      Please note that above we wrote "message catalogs" (plural).  This
      is a specialty of the GNU implementation of these functions and we
      will say more about this when we talk about the ways message
      catalogs are selected (*note Locating gettext catalog::).
 
-     The `gettext' function does not modify the value of the global
+     The 'gettext' function does not modify the value of the global
      ERRNO variable.  This is necessary to make it possible to write
      something like
 
             printf (gettext ("Operation failed: %m\n"));
 
-     Here the ERRNO value is used in the `printf' function while
-     processing the `%m' format element and if the `gettext' function
-     would change this value (it is called before `printf' is called)
-     we would get a wrong message.
+     Here the ERRNO value is used in the 'printf' function while
+     processing the '%m' format element and if the 'gettext' function
+     would change this value (it is called before 'printf' is called) we
+     would get a wrong message.
 
      So there is no easy way to detect a missing message catalog beside
      comparing the argument string with the result.  But it is normally
      the task of the user to react on missing catalogs.  The program
-     cannot guess when a message catalog is really necessary since for
-     a user who speaks the language the program was developed in does
-     not need any translation.
+     cannot guess when a message catalog is really necessary since for a
+     user who speaks the language the program was developed in does not
+     need any translation.
 
    The remaining two functions to access the message catalog add some
 functionality to select a message catalog which is not the default one.
 This is important if parts of the program are developed independently.
 Every part can have its own message catalog and all of them can be used
 at the same time.  The C library itself is an example: internally it
-uses the `gettext' functions but since it must not depend on a
-currently selected default message catalog it must specify all ambiguous
+uses the 'gettext' functions but since it must not depend on a currently
+selected default message catalog it must specify all ambiguous
 information.
 
  -- Function: char * dgettext (const char *DOMAINNAME, const char
@@ -2445,14 +5174,14 @@
      Preliminary: | MT-Safe env | AS-Unsafe corrupt heap lock dlopen |
      AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
 
-     The `dgettext' functions acts just like the `gettext' function.
-     It only takes an additional first argument DOMAINNAME which guides
-     the selection of the message catalogs which are searched for the
+     The 'dgettext' functions acts just like the 'gettext' function.  It
+     only takes an additional first argument DOMAINNAME which guides the
+     selection of the message catalogs which are searched for the
      translation.  If the DOMAINNAME parameter is the null pointer the
-     `dgettext' function is exactly equivalent to `gettext' since the
+     'dgettext' function is exactly equivalent to 'gettext' since the
      default value for the domain name is used.
 
-     As for `gettext' the return value type is `char *' which is an
+     As for 'gettext' the return value type is 'char *' which is an
      anachronism.  The returned string must never be modified.
 
  -- Function: char * dcgettext (const char *DOMAINNAME, const char
@@ -2460,14 +5189,14 @@
      Preliminary: | MT-Safe env | AS-Unsafe corrupt heap lock dlopen |
      AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
 
-     The `dcgettext' adds another argument to those which `dgettext'
+     The 'dcgettext' adds another argument to those which 'dgettext'
      takes.  This argument CATEGORY specifies the last piece of
      information needed to localize the message catalog.  I.e., the
      domain name and the locale category exactly specify which message
      catalog has to be used (relative to a given directory, see below).
 
-     The `dgettext' function can be expressed in terms of `dcgettext'
-     by using
+     The 'dgettext' function can be expressed in terms of 'dcgettext' by
+     using
 
           dcgettext (domain, string, LC_MESSAGES)
 
@@ -2476,21 +5205,21 @@
           dgettext (domain, string)
 
      This also shows which values are expected for the third parameter.
-     One has to use the available selectors for the categories
-     available in `locale.h'.  Normally the available values are
-     `LC_CTYPE', `LC_COLLATE', `LC_MESSAGES', `LC_MONETARY',
-     `LC_NUMERIC', and `LC_TIME'.  Please note that `LC_ALL' must not
-     be used and even though the names might suggest this, there is no
-     relation to the environments variables of this name.
+     One has to use the available selectors for the categories available
+     in 'locale.h'.  Normally the available values are 'LC_CTYPE',
+     'LC_COLLATE', 'LC_MESSAGES', 'LC_MONETARY', 'LC_NUMERIC', and
+     'LC_TIME'.  Please note that 'LC_ALL' must not be used and even
+     though the names might suggest this, there is no relation to the
+     environments variables of this name.
 
-     The `dcgettext' function is only implemented for compatibility with
-     other systems which have `gettext' functions.  There is not really
+     The 'dcgettext' function is only implemented for compatibility with
+     other systems which have 'gettext' functions.  There is not really
      any situation where it is necessary (or useful) to use a different
-     value but `LC_MESSAGES' in for the CATEGORY parameter.  We are
+     value but 'LC_MESSAGES' in for the CATEGORY parameter.  We are
      dealing with messages here and any other choice can only be
      irritating.
 
-     As for `gettext' the return value type is `char *' which is an
+     As for 'gettext' the return value type is 'char *' which is an
      anachronism.  The returned string must never be modified.
 
    When using the three functions above in a program it is a frequent
@@ -2498,7 +5227,7 @@
 optimize this case.  Thinking shortly about this one will realize that
 as long as no new message catalog is loaded the translation of a message
 will not change.  This optimization is actually implemented by the
-`gettext', `dgettext' and `dcgettext' functions.
+'gettext', 'dgettext' and 'dcgettext' functions.
 
 
 File: libc.info,  Node: Locating gettext catalog,  Next: Advanced gettext functions,  Prev: Translation with gettext,  Up: Message catalogs with gettext
@@ -2515,7 +5244,7 @@
 the use is easy.
 
    Basically we have two different tasks to perform which can also be
-performed by the `catgets' functions:
+performed by the 'catgets' functions:
 
   1. Locate the set of message catalogs.  There are a number of files
      for different languages and which all belong to the package.
@@ -2531,23 +5260,23 @@
      be able to locate the appropriate file.
 
    This is the functionality required by the specifications for
-`gettext' and this is also what the `catgets' functions are able to do.
+'gettext' and this is also what the 'catgets' functions are able to do.
 But there are some problems unresolved:
 
    * The language to be used can be specified in several different ways.
      There is no generally accepted standard for this and the user
      always expects the program understand what s/he means.  E.g., to
-     select the German translation one could write `de', `german', or
-     `deutsch' and the program should always react the same.
+     select the German translation one could write 'de', 'german', or
+     'deutsch' and the program should always react the same.
 
    * Sometimes the specification of the user is too detailed.  If s/he,
-     e.g., specifies `de_DE.ISO-8859-1' which means German, spoken in
+     e.g., specifies 'de_DE.ISO-8859-1' which means German, spoken in
      Germany, coded using the ISO 8859-1 character set there is the
      possibility that a message catalog matching this exactly is not
-     available.  But there could be a catalog matching `de' and if the
+     available.  But there could be a catalog matching 'de' and if the
      character set used on the machine is always ISO 8859-1 there is no
-     reason why this later message catalog should not be used.  (We
-     call this "message inheritance".)
+     reason why this later message catalog should not be used.  (We call
+     this "message inheritance".)
 
    * If a catalog for a wanted language is not available it is not
      always the second best choice to fall back on the language of the
@@ -2566,30 +5295,30 @@
 simple string which should be unique for each program part with uses a
 separate domain.  It is possible to use in one program arbitrary many
 domains at the same time.  E.g., the GNU C Library itself uses a domain
-named `libc' while the program using the C Library could use a domain
-named `foo'.  The important point is that at any time exactly one
-domain is active.  This is controlled with the following function.
+named 'libc' while the program using the C Library could use a domain
+named 'foo'.  The important point is that at any time exactly one domain
+is active.  This is controlled with the following function.
 
  -- Function: char * textdomain (const char *DOMAINNAME)
-     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem
-     | *Note POSIX Safety Concepts::.
+     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
+     *Note POSIX Safety Concepts::.
 
-     The `textdomain' function sets the default domain, which is used in
-     all future `gettext' calls, to DOMAINNAME.  Please note that
-     `dgettext' and `dcgettext' calls are not influenced if the
+     The 'textdomain' function sets the default domain, which is used in
+     all future 'gettext' calls, to DOMAINNAME.  Please note that
+     'dgettext' and 'dcgettext' calls are not influenced if the
      DOMAINNAME parameter of these functions is not the null pointer.
 
-     Before the first call to `textdomain' the default domain is
-     `messages'.  This is the name specified in the specification of
-     the `gettext' API.  This name is as good as any other name.  No
-     program should ever really use a domain with this name since this
-     can only lead to problems.
+     Before the first call to 'textdomain' the default domain is
+     'messages'.  This is the name specified in the specification of the
+     'gettext' API. This name is as good as any other name.  No program
+     should ever really use a domain with this name since this can only
+     lead to problems.
 
      The function returns the value which is from now on taken as the
      default domain.  If the system went out of memory the returned
-     value is `NULL' and the global variable ERRNO is set to `ENOMEM'.
-     Despite the return value type being `char *' the return string must
-     not be changed.  It is allocated internally by the `textdomain'
+     value is 'NULL' and the global variable ERRNO is set to 'ENOMEM'.
+     Despite the return value type being 'char *' the return string must
+     not be changed.  It is allocated internally by the 'textdomain'
      function.
 
      If the DOMAINNAME parameter is the null pointer no new default
@@ -2597,8 +5326,8 @@
      returned.
 
      If the DOMAINNAME parameter is the empty string the default domain
-     is reset to its initial value, the domain with the name `messages'.
-     This possibility is questionable to use since the domain `messages'
+     is reset to its initial value, the domain with the name 'messages'.
+     This possibility is questionable to use since the domain 'messages'
      really never should be used.
 
  -- Function: char * bindtextdomain (const char *DOMAINNAME, const char
@@ -2606,40 +5335,40 @@
      Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
      POSIX Safety Concepts::.
 
-     The `bindtextdomain' function can be used to specify the directory
+     The 'bindtextdomain' function can be used to specify the directory
      which contains the message catalogs for domain DOMAINNAME for the
      different languages.  To be correct, this is the directory where
      the hierarchy of directories is expected.  Details are explained
      below.
 
      For the programmer it is important to note that the translations
-     which come with the program have be placed in a directory
-     hierarchy starting at, say, `/foo/bar'.  Then the program should
-     make a `bindtextdomain' call to bind the domain for the current
-     program to this directory.  So it is made sure the catalogs are
-     found.  A correctly running program does not depend on the user
-     setting an environment variable.
+     which come with the program have be placed in a directory hierarchy
+     starting at, say, '/foo/bar'.  Then the program should make a
+     'bindtextdomain' call to bind the domain for the current program to
+     this directory.  So it is made sure the catalogs are found.  A
+     correctly running program does not depend on the user setting an
+     environment variable.
 
-     The `bindtextdomain' function can be used several times and if the
+     The 'bindtextdomain' function can be used several times and if the
      DOMAINNAME argument is different the previously bound domains will
      not be overwritten.
 
-     If the program which wish to use `bindtextdomain' at some point of
-     time use the `chdir' function to change the current working
+     If the program which wish to use 'bindtextdomain' at some point of
+     time use the 'chdir' function to change the current working
      directory it is important that the DIRNAME strings ought to be an
      absolute pathname.  Otherwise the addressed directory might vary
      with the time.
 
-     If the DIRNAME parameter is the null pointer `bindtextdomain'
+     If the DIRNAME parameter is the null pointer 'bindtextdomain'
      returns the currently selected directory for the domain with the
      name DOMAINNAME.
 
-     The `bindtextdomain' function returns a pointer to a string
+     The 'bindtextdomain' function returns a pointer to a string
      containing the name of the selected directory name.  The string is
      allocated internally in the function and must not be changed by the
      user.  If the system went out of core during the execution of
-     `bindtextdomain' the return value is `NULL' and the global
-     variable ERRNO is set accordingly.
+     'bindtextdomain' the return value is 'NULL' and the global variable
+     ERRNO is set accordingly.
 
 
 File: libc.info,  Node: Advanced gettext functions,  Next: Charset conversion in gettext,  Prev: Locating gettext catalog,  Up: Message catalogs with gettext
@@ -2647,8 +5376,8 @@
 8.2.1.3 Additional functions for more complicated situations
 ............................................................
 
-The functions of the `gettext' family described so far (and all the
-`catgets' functions as well) have one problem in the real world which
+The functions of the 'gettext' family described so far (and all the
+'catgets' functions as well) have one problem in the real world which
 have been neglected completely in all existing approaches.  What is
 meant here is the handling of plural forms.
 
@@ -2660,7 +5389,7 @@
 
 After the first complaints from people internationalizing the code
 people either completely avoided formulations like this or used strings
-like `"file(s)"'.  Both look unnatural and should be avoided.  First
+like '"file(s)"'.  Both look unnatural and should be avoided.  First
 tries to solve the problem correctly looked like this:
 
         if (n == 1)
@@ -2669,7 +5398,7 @@
           printf ("%d files deleted", n);
 
    But this does not solve the problem.  It helps languages where the
-plural form of a noun is not simply constructed by adding an `s' but
+plural form of a noun is not simply constructed by adding an 's' but
 that is all.  Once again people fell into the trap of believing the
 rules their language is using are universal.  But the handling of plural
 forms differs widely between the language families.  There are two
@@ -2677,9 +5406,9 @@
 
    * The form how plural forms are build differs.  This is a problem
      with language which have many irregularities.  German, for
-     instance, is a drastic case.  Though English and German are part
-     of the same language family (Germanic), the almost regular forming
-     of plural noun forms (appending an `s') is hardly found in German.
+     instance, is a drastic case.  Though English and German are part of
+     the same language family (Germanic), the almost regular forming of
+     plural noun forms (appending an 's') is hardly found in German.
 
    * The number of plural forms differ.  This is somewhat surprising for
      those who only have experiences with Romanic and Germanic languages
@@ -2691,7 +5420,7 @@
    The consequence of this is that application writers should not try to
 solve the problem in their code.  This would be localization since it is
 only usable for certain, hardcoded language environments.  Instead the
-extended `gettext' interface should be used.
+extended 'gettext' interface should be used.
 
    These extra functions are taking instead of the one key string two
 strings and a numerical argument.  The idea behind this is that using
@@ -2699,14 +5428,14 @@
 can select using rules specified by the translator the right plural
 form.  The two string arguments then will be used to provide a return
 value in case no message catalog is found (similar to the normal
-`gettext' behavior).  In this case the rules for Germanic language is
+'gettext' behavior).  In this case the rules for Germanic language is
 used and it is assumed that the first string argument is the singular
 form, the second the plural form.
 
    This has the consequence that programs without language catalogs can
 display the correct strings only if the program itself is written using
 a Germanic language.  This is a limitation but since the GNU C Library
-(as well as the GNU `gettext' package) are written as part of the GNU
+(as well as the GNU 'gettext' package) are written as part of the GNU
 package and the coding standards for the GNU project require program
 being written in English, this solution nevertheless fulfills its
 purpose.
@@ -2716,43 +5445,42 @@
      Preliminary: | MT-Safe env | AS-Unsafe corrupt heap lock dlopen |
      AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
 
-     The `ngettext' function is similar to the `gettext' function as it
-     finds the message catalogs in the same way.  But it takes two
-     extra arguments.  The MSGID1 parameter must contain the singular
-     form of the string to be converted.  It is also used as the key
-     for the search in the catalog.  The MSGID2 parameter is the plural
-     form.  The parameter N is used to determine the plural form.  If no
-     message catalog is found MSGID1 is returned if `n == 1', otherwise
-     `msgid2'.
+     The 'ngettext' function is similar to the 'gettext' function as it
+     finds the message catalogs in the same way.  But it takes two extra
+     arguments.  The MSGID1 parameter must contain the singular form of
+     the string to be converted.  It is also used as the key for the
+     search in the catalog.  The MSGID2 parameter is the plural form.
+     The parameter N is used to determine the plural form.  If no
+     message catalog is found MSGID1 is returned if 'n == 1', otherwise
+     'msgid2'.
 
      An example for the us of this function is:
 
             printf (ngettext ("%d file removed", "%d files removed", n), n);
 
      Please note that the numeric value N has to be passed to the
-     `printf' function as well.  It is not sufficient to pass it only to
-     `ngettext'.
+     'printf' function as well.  It is not sufficient to pass it only to
+     'ngettext'.
 
  -- Function: char * dngettext (const char *DOMAIN, const char *MSGID1,
           const char *MSGID2, unsigned long int N)
      Preliminary: | MT-Safe env | AS-Unsafe corrupt heap lock dlopen |
      AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
 
-     The `dngettext' is similar to the `dgettext' function in the way
+     The 'dngettext' is similar to the 'dgettext' function in the way
      the message catalog is selected.  The difference is that it takes
      two extra parameter to provide the correct plural form.  These two
-     parameters are handled in the same way `ngettext' handles them.
+     parameters are handled in the same way 'ngettext' handles them.
 
- -- Function: char * dcngettext (const char *DOMAIN, const char
-          *MSGID1, const char *MSGID2, unsigned long int N, int
-          CATEGORY)
+ -- Function: char * dcngettext (const char *DOMAIN, const char *MSGID1,
+          const char *MSGID2, unsigned long int N, int CATEGORY)
      Preliminary: | MT-Safe env | AS-Unsafe corrupt heap lock dlopen |
      AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
 
-     The `dcngettext' is similar to the `dcgettext' function in the way
+     The 'dcngettext' is similar to the 'dcgettext' function in the way
      the message catalog is selected.  The difference is that it takes
      two extra parameter to provide the correct plural form.  These two
-     parameters are handled in the same way `ngettext' handles them.
+     parameters are handled in the same way 'ngettext' handles them.
 
 The problem of plural forms
 ...........................
@@ -2769,25 +5497,25 @@
 varies with every language this is the only viable solution except for
 hardcoding the information in the code (which still would require the
 possibility of extensions to not prevent the use of new languages).  The
-details are explained in the GNU `gettext' manual.  Here only a bit of
+details are explained in the GNU 'gettext' manual.  Here only a bit of
 information is provided.
 
    The information about the plural form selection has to be stored in
-the header entry (the one with the empty (`msgid' string).  It looks
+the header entry (the one with the empty ('msgid' string).  It looks
 like this:
 
      Plural-Forms: nplurals=2; plural=n == 1 ? 0 : 1;
 
-   The `nplurals' value must be a decimal number which specifies how
+   The 'nplurals' value must be a decimal number which specifies how
 many different plural forms exist for this language.  The string
-following `plural' is an expression which is using the C language
+following 'plural' is an expression which is using the C language
 syntax.  Exceptions are that no negative number are allowed, numbers
-must be decimal, and the only variable allowed is `n'.  This expression
-will be evaluated whenever one of the functions `ngettext',
-`dngettext', or `dcngettext' is called.  The numeric value passed to
-these functions is then substituted for all uses of the variable `n' in
-the expression.  The resulting value then must be greater or equal to
-zero and smaller than the value given as the value of `nplurals'.
+must be decimal, and the only variable allowed is 'n'.  This expression
+will be evaluated whenever one of the functions 'ngettext', 'dngettext',
+or 'dcngettext' is called.  The numeric value passed to these functions
+is then substituted for all uses of the variable 'n' in the expression.
+The resulting value then must be greater or equal to zero and smaller
+than the value given as the value of 'nplurals'.
 
 The following rules are known at this point.  The language with families
 are listed.  But this does not necessarily mean the information can be
@@ -2803,13 +5531,11 @@
 
      Languages with this property include:
 
-    Finno-Ugric family
+     Finno-Ugric family
           Hungarian
-
-    Asian family
+     Asian family
           Japanese, Korean
-
-    Turkic/Altaic family
+     Turkic/Altaic family
           Turkish
 
 Two forms, singular used for one only
@@ -2823,22 +5549,17 @@
 
      Languages with this property include:
 
-    Germanic family
+     Germanic family
           Danish, Dutch, English, German, Norwegian, Swedish
-
-    Finno-Ugric family
+     Finno-Ugric family
           Estonian, Finnish
-
-    Latin/Greek family
+     Latin/Greek family
           Greek
-
-    Semitic family
+     Semitic family
           Hebrew
-
-    Romance family
+     Romance family
           Italian, Portuguese, Spanish
-
-    Artificial
+     Artificial
           Esperanto
 
 Two forms, singular used for zero and one
@@ -2849,7 +5570,7 @@
 
      Languages with this property include:
 
-    Romanic family
+     Romanic family
           French, Brazilian Portuguese
 
 Three forms, special case for zero
@@ -2859,7 +5580,7 @@
 
      Languages with this property include:
 
-    Baltic family
+     Baltic family
           Latvian
 
 Three forms, special cases for one and two
@@ -2869,7 +5590,7 @@
 
      Languages with this property include:
 
-    Celtic
+     Celtic
           Gaeilge (Irish)
 
 Three forms, special case for numbers ending in 1[2-9]
@@ -2881,7 +5602,7 @@
 
      Languages with this property include:
 
-    Baltic family
+     Baltic family
           Lithuanian
 
 Three forms, special cases for numbers ending in 1 and 2, 3, 4, except those ending in 1[1-4]
@@ -2892,7 +5613,7 @@
 
      Languages with this property include:
 
-    Slavic family
+     Slavic family
           Croatian, Czech, Russian, Ukrainian
 
 Three forms, special cases for 1 and 2, 3, 4
@@ -2903,7 +5624,7 @@
 
      Languages with this property include:
 
-    Slavic family
+     Slavic family
           Slovak
 
 Three forms, special case for one and some numbers ending in 2, 3, or 4
@@ -2915,7 +5636,7 @@
 
      Languages with this property include:
 
-    Slavic family
+     Slavic family
           Polish
 
 Four forms, special case for one and all numbers ending in 02, 03, or 04
@@ -2926,7 +5647,7 @@
 
      Languages with this property include:
 
-    Slavic family
+     Slavic family
           Slovenian
 
    ---------- Footnotes ----------
@@ -2937,62 +5658,62 @@
 
 File: libc.info,  Node: Charset conversion in gettext,  Next: GUI program problems,  Prev: Advanced gettext functions,  Up: Message catalogs with gettext
 
-8.2.1.4 How to specify the output character set `gettext' uses
+8.2.1.4 How to specify the output character set 'gettext' uses
 ..............................................................
 
-`gettext' not only looks up a translation in a message catalog.  It
-also converts the translation on the fly to the desired output character
-set.  This is useful if the user is working in a different character set
-than the translator who created the message catalog, because it avoids
+'gettext' not only looks up a translation in a message catalog.  It also
+converts the translation on the fly to the desired output character set.
+This is useful if the user is working in a different character set than
+the translator who created the message catalog, because it avoids
 distributing variants of message catalogs which differ only in the
 character set.
 
-   The output character set is, by default, the value of `nl_langinfo
-(CODESET)', which depends on the `LC_CTYPE' part of the current locale.
+   The output character set is, by default, the value of 'nl_langinfo
+(CODESET)', which depends on the 'LC_CTYPE' part of the current locale.
 But programs which store strings in a locale independent way (e.g.
-UTF-8) can request that `gettext' and related functions return the
-translations in that encoding, by use of the `bind_textdomain_codeset'
+UTF-8) can request that 'gettext' and related functions return the
+translations in that encoding, by use of the 'bind_textdomain_codeset'
 function.
 
-   Note that the MSGID argument to `gettext' is not subject to
-character set conversion.  Also, when `gettext' does not find a
-translation for MSGID, it returns MSGID unchanged - independently of
-the current output character set.  It is therefore recommended that all
-MSGIDs be US-ASCII strings.
+   Note that the MSGID argument to 'gettext' is not subject to character
+set conversion.  Also, when 'gettext' does not find a translation for
+MSGID, it returns MSGID unchanged - independently of the current output
+character set.  It is therefore recommended that all MSGIDs be US-ASCII
+strings.
 
  -- Function: char * bind_textdomain_codeset (const char *DOMAINNAME,
           const char *CODESET)
      Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
      POSIX Safety Concepts::.
 
-     The `bind_textdomain_codeset' function can be used to specify the
+     The 'bind_textdomain_codeset' function can be used to specify the
      output character set for message catalogs for domain DOMAINNAME.
      The CODESET argument must be a valid codeset name which can be used
-     for the `iconv_open' function, or a null pointer.
+     for the 'iconv_open' function, or a null pointer.
 
      If the CODESET parameter is the null pointer,
-     `bind_textdomain_codeset' returns the currently selected codeset
-     for the domain with the name DOMAINNAME. It returns `NULL' if no
+     'bind_textdomain_codeset' returns the currently selected codeset
+     for the domain with the name DOMAINNAME.  It returns 'NULL' if no
      codeset has yet been selected.
 
-     The `bind_textdomain_codeset' function can be used several times.
-     If used multiple times with the same DOMAINNAME argument, the
-     later call overrides the settings made by the earlier one.
+     The 'bind_textdomain_codeset' function can be used several times.
+     If used multiple times with the same DOMAINNAME argument, the later
+     call overrides the settings made by the earlier one.
 
-     The `bind_textdomain_codeset' function returns a pointer to a
+     The 'bind_textdomain_codeset' function returns a pointer to a
      string containing the name of the selected codeset.  The string is
      allocated internally in the function and must not be changed by the
      user.  If the system went out of core during the execution of
-     `bind_textdomain_codeset', the return value is `NULL' and the
+     'bind_textdomain_codeset', the return value is 'NULL' and the
      global variable ERRNO is set accordingly.
 
 
 File: libc.info,  Node: GUI program problems,  Next: Using gettextized software,  Prev: Charset conversion in gettext,  Up: Message catalogs with gettext
 
-8.2.1.5 How to use `gettext' in GUI programs
+8.2.1.5 How to use 'gettext' in GUI programs
 ............................................
 
-One place where the `gettext' functions, if used normally, have big
+One place where the 'gettext' functions, if used normally, have big
 problems is within programs with graphical user interfaces (GUIs).  The
 problem is that many of the strings which have to be translated are very
 short.  They have to appear in pull-down menus which restricts the
@@ -3002,10 +5723,10 @@
 especially true for the one-word strings which are frequently used in
 GUI programs.
 
-   As a consequence many people say that the `gettext' approach is
-wrong and instead `catgets' should be used which indeed does not have
-this problem.  But there is a very simple and powerful method to handle
-these kind of problems with the `gettext' functions.
+   As a consequence many people say that the 'gettext' approach is wrong
+and instead 'catgets' should be used which indeed does not have this
+problem.  But there is a very simple and powerful method to handle these
+kind of problems with the 'gettext' functions.
 
 As an example consider the following fictional situation.  A GUI program
 has a menu bar with the following entries:
@@ -3018,11 +5739,11 @@
      +----------+ | Connect  |
                   +----------+
 
-   To have the strings `File', `Printer', `Open', `New', `Select', and
-`Connect' translated there has to be at some point in the code a call
-to a function of the `gettext' family.  But in two places the string
-passed into the function would be `Open'.  The translations might not
-be the same and therefore we are in the dilemma described above.
+   To have the strings 'File', 'Printer', 'Open', 'New', 'Select', and
+'Connect' translated there has to be at some point in the code a call to
+a function of the 'gettext' family.  But in two places the string passed
+into the function would be 'Open'.  The translations might not be the
+same and therefore we are in the dilemma described above.
 
    One solution to this problem is to artificially enlengthen the
 strings to make them unambiguous.  But what would the program do if no
@@ -3041,9 +5762,8 @@
      Menu|Printer|Open
      Menu|Printer|Connect
 
-   Now all the strings are different and if now instead of `gettext'
-the following little wrapper function is used, everything works just
-fine:
+   Now all the strings are different and if now instead of 'gettext' the
+following little wrapper function is used, everything works just fine:
 
        char *
        sgettext (const char *msgid)
@@ -3058,16 +5778,16 @@
 translation is available.  This can be done very efficiently by a
 pointer comparison since the return value is the input value.  If there
 is no translation we know that the input string is in the format we used
-for the Menu entries and therefore contains a `|' character.  We simply
-search for the last occurrence of this character and return a pointer
-to the character following it.  That's it!
+for the Menu entries and therefore contains a '|' character.  We simply
+search for the last occurrence of this character and return a pointer to
+the character following it.  That's it!
 
    If one now consistently uses the enlengthened string form and
-replaces the `gettext' calls with calls to `sgettext' (this is normally
+replaces the 'gettext' calls with calls to 'sgettext' (this is normally
 limited to very few places in the GUI implementation) then it is
 possible to produce a program which can be internationalized.
 
-   With advanced compilers (such as GNU C) one can write the `sgettext'
+   With advanced compilers (such as GNU C) one can write the 'sgettext'
 functions as an inline function or as a macro like this:
 
      #define sgettext(msgid) \
@@ -3077,42 +5797,42 @@
             __msgval = strrchr (__msgid, '|') + 1;  \
           __msgval; })
 
-   The other `gettext' functions (`dgettext', `dcgettext' and the
-`ngettext' equivalents) can and should have corresponding functions as
-well which look almost identical, except for the parameters and the
-call to the underlying function.
+   The other 'gettext' functions ('dgettext', 'dcgettext' and the
+'ngettext' equivalents) can and should have corresponding functions as
+well which look almost identical, except for the parameters and the call
+to the underlying function.
 
    Now there is of course the question why such functions do not exist
 in the GNU C Library?  There are two parts of the answer to this
 question.
 
-   * They are easy to write and therefore can be provided by the
-     project they are used in.  This is not an answer by itself and
-     must be seen together with the second part which is:
+   * They are easy to write and therefore can be provided by the project
+     they are used in.  This is not an answer by itself and must be seen
+     together with the second part which is:
 
    * There is no way the C library can contain a version which can work
      everywhere.  The problem is the selection of the character to
      separate the prefix from the actual string in the enlenghtened
-     string.  The examples above used `|' which is a quite good choice
-     because it resembles a notation frequently used in this context
-     and it also is a character not often used in message strings.
+     string.  The examples above used '|' which is a quite good choice
+     because it resembles a notation frequently used in this context and
+     it also is a character not often used in message strings.
 
      But what if the character is used in message strings.  Or if the
      chose character is not available in the character set on the
-     machine one compiles (e.g., `|' is not required to exist for
-     ISO C; this is why the `iso646.h' file exists in ISO C programming
+     machine one compiles (e.g., '|' is not required to exist for ISO C;
+     this is why the 'iso646.h' file exists in ISO C programming
      environments).
 
    There is only one more comment to make left.  The wrapper function
 above require that the translations strings are not enlengthened
-themselves.  This is only logical.  There is no need to disambiguate
-the strings (since they are never used as keys for a search) and one
-also saves quite some memory and disk space by doing this.
+themselves.  This is only logical.  There is no need to disambiguate the
+strings (since they are never used as keys for a search) and one also
+saves quite some memory and disk space by doing this.
 
 
 File: libc.info,  Node: Using gettextized software,  Prev: GUI program problems,  Up: Message catalogs with gettext
 
-8.2.1.6 User influence on `gettext'
+8.2.1.6 User influence on 'gettext'
 ...................................
 
 The last sections described what the programmer can do to
@@ -3120,11 +5840,11 @@
 the user to select the message s/he wants to see.  S/He must understand
 them.
 
-   The POSIX locale model uses the environment variables `LC_COLLATE',
-`LC_CTYPE', `LC_MESSAGES', `LC_MONETARY', `LC_NUMERIC', and `LC_TIME'
-to select the locale which is to be used.  This way the user can
-influence lots of functions.  As we mentioned above the `gettext'
-functions also take advantage of this.
+   The POSIX locale model uses the environment variables 'LC_COLLATE',
+'LC_CTYPE', 'LC_MESSAGES', 'LC_MONETARY', 'LC_NUMERIC', and 'LC_TIME' to
+select the locale which is to be used.  This way the user can influence
+lots of functions.  As we mentioned above the 'gettext' functions also
+take advantage of this.
 
    To understand how this happens it is necessary to take a look at the
 various components of the filename which gets computed to locate a
@@ -3134,67 +5854,64 @@
 
    The default value for DIR_NAME is system specific.  It is computed
 from the value given as the prefix while configuring the C library.
-This value normally is `/usr' or `/'.  For the former the complete
+This value normally is '/usr' or '/'.  For the former the complete
 DIR_NAME is:
 
      /usr/share/locale
 
-   We can use `/usr/share' since the `.mo' files containing the message
+   We can use '/usr/share' since the '.mo' files containing the message
 catalogs are system independent, so all systems can use the same files.
-If the program executed the `bindtextdomain' function for the message
-domain that is currently handled, the `dir_name' component is exactly
+If the program executed the 'bindtextdomain' function for the message
+domain that is currently handled, the 'dir_name' component is exactly
 the value which was given to the function as the second parameter.
-I.e., `bindtextdomain' allows overwriting the only system dependent and
+I.e., 'bindtextdomain' allows overwriting the only system dependent and
 fixed value to make it possible to address files anywhere in the
 filesystem.
 
-   The CATEGORY is the name of the locale category which was selected
-in the program code.  For `gettext' and `dgettext' this is always
-`LC_MESSAGES', for `dcgettext' this is selected by the value of the
+   The CATEGORY is the name of the locale category which was selected in
+the program code.  For 'gettext' and 'dgettext' this is always
+'LC_MESSAGES', for 'dcgettext' this is selected by the value of the
 third parameter.  As said above it should be avoided to ever use a
-category other than `LC_MESSAGES'.
+category other than 'LC_MESSAGES'.
 
    The LOCALE component is computed based on the category used.  Just
-like for the `setlocale' function here comes the user selection into
-the play.  Some environment variables are examined in a fixed order and
-the first environment variable set determines the return value of the
-lookup process.  In detail, for the category `LC_xxx' the following
-variables in this order are examined:
+like for the 'setlocale' function here comes the user selection into the
+play.  Some environment variables are examined in a fixed order and the
+first environment variable set determines the return value of the lookup
+process.  In detail, for the category 'LC_xxx' the following variables
+in this order are examined:
 
-`LANGUAGE'
+'LANGUAGE'
+'LC_ALL'
+'LC_xxx'
+'LANG'
 
-`LC_ALL'
-
-`LC_xxx'
-
-`LANG'
-
-   This looks very familiar.  With the exception of the `LANGUAGE'
-environment variable this is exactly the lookup order the `setlocale'
-function uses.  But why introducing the `LANGUAGE' variable?
+   This looks very familiar.  With the exception of the 'LANGUAGE'
+environment variable this is exactly the lookup order the 'setlocale'
+function uses.  But why introducing the 'LANGUAGE' variable?
 
    The reason is that the syntax of the values these variables can have
-is different to what is expected by the `setlocale' function.  If we
-would set `LC_ALL' to a value following the extended syntax that would
-mean the `setlocale' function will never be able to use the value of
-this variable as well.  An additional variable removes this problem
-plus we can select the language independently of the locale setting
-which sometimes is useful.
+is different to what is expected by the 'setlocale' function.  If we
+would set 'LC_ALL' to a value following the extended syntax that would
+mean the 'setlocale' function will never be able to use the value of
+this variable as well.  An additional variable removes this problem plus
+we can select the language independently of the locale setting which
+sometimes is useful.
 
-   While for the `LC_xxx' variables the value should consist of exactly
-one specification of a locale the `LANGUAGE' variable's value can
-consist of a colon separated list of locale names.  The attentive
-reader will realize that this is the way we manage to implement one of
-our additional demands above: we want to be able to specify an ordered
-list of language.
+   While for the 'LC_xxx' variables the value should consist of exactly
+one specification of a locale the 'LANGUAGE' variable's value can
+consist of a colon separated list of locale names.  The attentive reader
+will realize that this is the way we manage to implement one of our
+additional demands above: we want to be able to specify an ordered list
+of language.
 
    Back to the constructed filename we have only one component missing.
 The DOMAIN_NAME part is the name which was either registered using the
-`textdomain' function or which was given to `dgettext' or `dcgettext'
-as the first parameter.  Now it becomes obvious that a good choice for
-the domain name in the program code is a string which is closely
-related to the program/package name.  E.g., for the GNU C Library the
-domain name is `libc'.
+'textdomain' function or which was given to 'dgettext' or 'dcgettext' as
+the first parameter.  Now it becomes obvious that a good choice for the
+domain name in the program code is a string which is closely related to
+the program/package name.  E.g., for the GNU C Library the domain name
+is 'libc'.
 
 A limit piece of example code should show how the programmer is supposed
 to work:
@@ -3206,34 +5923,34 @@
        puts (gettext ("Hello, world!"));
      }
 
-   At the program start the default domain is `messages', and the
-default locale is "C".  The `setlocale' call sets the locale according
-to the user's environment variables; remember that correct functioning
-of `gettext' relies on the correct setting of the `LC_MESSAGES' locale
-(for looking up the message catalog) and of the `LC_CTYPE' locale (for
-the character set conversion).  The `textdomain' call changes the
-default domain to `test-package'.  The `bindtextdomain' call specifies
-that the message catalogs for the domain `test-package' can be found
-below the directory `/usr/local/share/locale'.
+   At the program start the default domain is 'messages', and the
+default locale is "C". The 'setlocale' call sets the locale according to
+the user's environment variables; remember that correct functioning of
+'gettext' relies on the correct setting of the 'LC_MESSAGES' locale (for
+looking up the message catalog) and of the 'LC_CTYPE' locale (for the
+character set conversion).  The 'textdomain' call changes the default
+domain to 'test-package'.  The 'bindtextdomain' call specifies that the
+message catalogs for the domain 'test-package' can be found below the
+directory '/usr/local/share/locale'.
 
-   If now the user set in her/his environment the variable `LANGUAGE'
-to `de' the `gettext' function will try to use the translations from
-the file
+   If now the user set in her/his environment the variable 'LANGUAGE' to
+'de' the 'gettext' function will try to use the translations from the
+file
 
      /usr/local/share/locale/de/LC_MESSAGES/test-package.mo
 
    From the above descriptions it should be clear which component of
 this filename is determined by which source.
 
-   In the above example we assumed that the `LANGUAGE' environment
-variable to `de'.  This might be an appropriate selection but what
-happens if the user wants to use `LC_ALL' because of the wider
-usability and here the required value is `de_DE.ISO-8859-1'?  We
-already mentioned above that a situation like this is not infrequent.
-E.g., a person might prefer reading a dialect and if this is not
-available fall back on the standard language.
+   In the above example we assumed that the 'LANGUAGE' environment
+variable to 'de'.  This might be an appropriate selection but what
+happens if the user wants to use 'LC_ALL' because of the wider usability
+and here the required value is 'de_DE.ISO-8859-1'?  We already mentioned
+above that a situation like this is not infrequent.  E.g., a person
+might prefer reading a dialect and if this is not available fall back on
+the standard language.
 
-   The `gettext' functions know about situations like this and can
+   The 'gettext' functions know about situations like this and can
 handle them gracefully.  The functions recognize the format of the value
 of the environment variable.  It can split the value is different pieces
 and by leaving out the only or the other part it can construct new
@@ -3242,45 +5959,40 @@
 is one more or less standardized form, originally from the X/Open
 specification:
 
-   `language[_territory[.codeset]][@modifier]'
+   'language[_territory[.codeset]][@modifier]'
 
    Less specific locale names will be stripped of in the order of the
 following list:
 
-  1. `codeset'
+  1. 'codeset'
+  2. 'normalized codeset'
+  3. 'territory'
+  4. 'modifier'
 
-  2. `normalized codeset'
+   The 'language' field will never be dropped for obvious reasons.
 
-  3. `territory'
-
-  4. `modifier'
-
-   The `language' field will never be dropped for obvious reasons.
-
-   The only new thing is the `normalized codeset' entry.  This is
+   The only new thing is the 'normalized codeset' entry.  This is
 another goodie which is introduced to help reducing the chaos which
 derives from the inability of the people to standardize the names of
 character sets.  Instead of ISO-8859-1 one can often see 8859-1, 88591,
-iso8859-1, or iso_8859-1.  The `normalized codeset' value is generated
+iso8859-1, or iso_8859-1.  The 'normalized codeset' value is generated
 from the user-provided character set name by applying the following
 rules:
 
   1. Remove all characters beside numbers and letters.
-
   2. Fold letters to lowercase.
+  3. If the same only contains digits prepend the string '"iso"'.
 
-  3. If the same only contains digits prepend the string `"iso"'.
-
-So all of the above name will be normalized to `iso88591'.  This allows
+So all of the above name will be normalized to 'iso88591'.  This allows
 the program user much more freely choosing the locale name.
 
    Even this extended functionality still does not help to solve the
 problem that completely different names can be used to denote the same
-locale (e.g., `de' and `german').  To be of help in this situation the
-locale implementation and also the `gettext' functions know about
+locale (e.g., 'de' and 'german').  To be of help in this situation the
+locale implementation and also the 'gettext' functions know about
 aliases.
 
-   The file `/usr/share/locale/locale.alias' (replace `/usr' with
+   The file '/usr/share/locale/locale.alias' (replace '/usr' with
 whatever prefix you used for configuring the C library) contains a
 mapping of alternative names to more regular names.  The system manager
 is free to add new entries to fill her/his own needs.  The selected
@@ -3300,36 +6012,36 @@
 
 File: libc.info,  Node: Helper programs for gettext,  Prev: Message catalogs with gettext,  Up: The Uniforum approach
 
-8.2.2 Programs to handle message catalogs for `gettext'
+8.2.2 Programs to handle message catalogs for 'gettext'
 -------------------------------------------------------
 
 The GNU C Library does not contain the source code for the programs to
-handle message catalogs for the `gettext' functions.  As part of the
-GNU project the GNU gettext package contains everything the developer
-needs.  The functionality provided by the tools in this package by far
-exceeds the abilities of the `gencat' program described above for the
-`catgets' functions.
+handle message catalogs for the 'gettext' functions.  As part of the GNU
+project the GNU gettext package contains everything the developer needs.
+The functionality provided by the tools in this package by far exceeds
+the abilities of the 'gencat' program described above for the 'catgets'
+functions.
 
-   There is a program `msgfmt' which is the equivalent program to the
-`gencat' program.  It generates from the human-readable and -editable
+   There is a program 'msgfmt' which is the equivalent program to the
+'gencat' program.  It generates from the human-readable and -editable
 form of the message catalog a binary file which can be used by the
-`gettext' functions.  But there are several more programs available.
+'gettext' functions.  But there are several more programs available.
 
-   The `xgettext' program can be used to automatically extract the
+   The 'xgettext' program can be used to automatically extract the
 translatable messages from a source file.  I.e., the programmer need not
 take care of the translations and the list of messages which have to be
 translated.  S/He will simply wrap the translatable string in calls to
-`gettext' et.al and the rest will be done by `xgettext'.  This program
+'gettext' et.al and the rest will be done by 'xgettext'.  This program
 has a lot of options which help to customize the output or help to
 understand the input better.
 
-   Other programs help to manage the development cycle when new
-messages appear in the source files or when a new translation of the
-messages appears.  Here it should only be noted that using all the
-tools in GNU gettext it is possible to _completely_ automate the
-handling of message catalogs.  Beside marking the translatable strings
-in the source code and generating the translations the developers do
-not have anything to do themselves.
+   Other programs help to manage the development cycle when new messages
+appear in the source files or when a new translation of the messages
+appears.  Here it should only be noted that using all the tools in GNU
+gettext it is possible to _completely_ automate the handling of message
+catalogs.  Beside marking the translatable strings in the source code
+and generating the translations the developers do not have anything to
+do themselves.
 
 
 File: libc.info,  Node: Searching and Sorting,  Next: Pattern Matching,  Prev: Message Translation,  Up: Top
@@ -3348,11 +6060,11 @@
 				 Since the sort and search facilities
                                  are general, you have to specify the
                                  ordering.
-* Array Search Function::       The `bsearch' function.
-* Array Sort Function::         The `qsort' function.
+* Array Search Function::       The 'bsearch' function.
+* Array Sort Function::         The 'qsort' function.
 * Search/Sort Example::         An example program.
-* Hash Search Function::        The `hsearch' function.
-* Tree Search Function::        The `tsearch' function.
+* Hash Search Function::        The 'hsearch' function.
+* Tree Search Function::        The 'tsearch' function.
 
 
 File: libc.info,  Node: Comparison Functions,  Next: Array Search Function,  Up: Searching and Sorting
@@ -3366,13 +6078,12 @@
    To do this, you supply a comparison function to compare two elements
 of the array.  The library will call this function, passing as arguments
 pointers to two array elements to be compared.  Your comparison function
-should return a value the way `strcmp' (*note String/Array
-Comparison::) does: negative if the first argument is "less" than the
-second, zero if they are "equal", and positive if the first argument is
-"greater".
+should return a value the way 'strcmp' (*note String/Array Comparison::)
+does: negative if the first argument is "less" than the second, zero if
+they are "equal", and positive if the first argument is "greater".
 
-   Here is an example of a comparison function which works with an
-array of numbers of type `double':
+   Here is an example of a comparison function which works with an array
+of numbers of type 'double':
 
      int
      compare_doubles (const void *a, const void *b)
@@ -3383,7 +6094,7 @@
        return (*da > *db) - (*da < *db);
      }
 
-   The header file `stdlib.h' defines a name for the data type of
+   The header file 'stdlib.h' defines a name for the data type of
 comparison functions.  This type is a GNU extension.
 
      int comparison_fn_t (const void *, const void *);
@@ -3397,23 +6108,23 @@
 Generally searching for a specific element in an array means that
 potentially all elements must be checked.  The GNU C Library contains
 functions to perform linear search.  The prototypes for the following
-two functions can be found in `search.h'.
+two functions can be found in 'search.h'.
 
  -- Function: void * lfind (const void *KEY, const void *BASE, size_t
           *NMEMB, size_t SIZE, comparison_fn_t COMPAR)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `lfind' function searches in the array with `*NMEMB' elements
+     The 'lfind' function searches in the array with '*NMEMB' elements
      of SIZE bytes pointed to by BASE for an element which matches the
      one pointed to by KEY.  The function pointed to by COMPAR is used
      decide whether two elements match.
 
      The return value is a pointer to the matching element in the array
      starting at BASE if it is found.  If no matching element is
-     available `NULL' is returned.
+     available 'NULL' is returned.
 
-     The mean runtime of this function is `*NMEMB'/2.  This function
+     The mean runtime of this function is '*NMEMB'/2.  This function
      should only be used if elements often get added to or deleted from
      the array in which case it might not be useful to sort the array
      before searching.
@@ -3423,30 +6134,30 @@
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `lsearch' function is similar to the `lfind' function.  It
+     The 'lsearch' function is similar to the 'lfind' function.  It
      searches the given array for an element and returns it if found.
      The difference is that if no matching element is found the
-     `lsearch' function adds the object pointed to by KEY (with a size
+     'lsearch' function adds the object pointed to by KEY (with a size
      of SIZE bytes) at the end of the array and it increments the value
-     of `*NMEMB' to reflect this addition.
+     of '*NMEMB' to reflect this addition.
 
      This means for the caller that if it is not sure that the array
      contains the element one is searching for the memory allocated for
      the array starting at BASE must have room for at least SIZE more
      bytes.  If one is sure the element is in the array it is better to
-     use `lfind' so having more room in the array is always necessary
-     when calling `lsearch'.
+     use 'lfind' so having more room in the array is always necessary
+     when calling 'lsearch'.
 
    To search a sorted array for an element matching the key, use the
-`bsearch' function.  The prototype for this function is in the header
-file `stdlib.h'.  
+'bsearch' function.  The prototype for this function is in the header
+file 'stdlib.h'.
 
- -- Function: void * bsearch (const void *KEY, const void *ARRAY,
-          size_t COUNT, size_t SIZE, comparison_fn_t COMPARE)
+ -- Function: void * bsearch (const void *KEY, const void *ARRAY, size_t
+          COUNT, size_t SIZE, comparison_fn_t COMPARE)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `bsearch' function searches the sorted array ARRAY for an
+     The 'bsearch' function searches the sorted array ARRAY for an
      object that is equivalent to KEY.  The array contains COUNT
      elements, each of which is of size SIZE bytes.
 
@@ -3459,9 +6170,8 @@
      function.
 
      The return value is a pointer to the matching array element, or a
-     null pointer if no match is found.  If the array contains more
-     than one element that matches, the one that is returned is
-     unspecified.
+     null pointer if no match is found.  If the array contains more than
+     one element that matches, the one that is returned is unspecified.
 
      This function derives its name from the fact that it is implemented
      using the binary search algorithm.
@@ -3472,29 +6182,28 @@
 9.3 Array Sort Function
 =======================
 
-To sort an array using an arbitrary comparison function, use the
-`qsort' function.  The prototype for this function is in `stdlib.h'.  
+To sort an array using an arbitrary comparison function, use the 'qsort'
+function.  The prototype for this function is in 'stdlib.h'.
 
  -- Function: void qsort (void *ARRAY, size_t COUNT, size_t SIZE,
           comparison_fn_t COMPARE)
      Preliminary: | MT-Safe | AS-Safe | AC-Unsafe corrupt | *Note POSIX
      Safety Concepts::.
 
-     The QSORT function sorts the array ARRAY.  The array contains
-     COUNT elements, each of which is of size SIZE.
+     The QSORT function sorts the array ARRAY.  The array contains COUNT
+     elements, each of which is of size SIZE.
 
-     The COMPARE function is used to perform the comparison on the
-     array elements.  This function is called with two pointer
-     arguments and should return an integer less than, equal to, or
-     greater than zero corresponding to whether its first argument is
-     considered less than, equal to, or greater than its second
-     argument.
+     The COMPARE function is used to perform the comparison on the array
+     elements.  This function is called with two pointer arguments and
+     should return an integer less than, equal to, or greater than zero
+     corresponding to whether its first argument is considered less
+     than, equal to, or greater than its second argument.
 
      *Warning:* If two objects compare as equal, their order after
      sorting is unpredictable.  That is to say, the sorting is not
      stable.  This can make a difference when the comparison considers
-     only part of the elements.  Two elements with the same sort key
-     may differ in other respects.
+     only part of the elements.  Two elements with the same sort key may
+     differ in other respects.
 
      If you want the effect of a stable sort, you can get this result by
      writing the comparison function so that, lacking other reason
@@ -3503,8 +6212,8 @@
      less efficient, so do it only if necessary.
 
      Here is a simple example of sorting an array of doubles in
-     numerical order, using the comparison function defined above
-     (*note Comparison Functions::):
+     numerical order, using the comparison function defined above (*note
+     Comparison Functions::):
 
           {
             double *array;
@@ -3513,10 +6222,10 @@
             qsort (array, size, sizeof (double), compare_doubles);
           }
 
-     The `qsort' function derives its name from the fact that it was
+     The 'qsort' function derives its name from the fact that it was
      originally implemented using the "quick sort" algorithm.
 
-     The implementation of `qsort' in this library might not be an
+     The implementation of 'qsort' in this library might not be an
      in-place sort and might thereby use an extra amount of memory to
      store the array.
 
@@ -3526,9 +6235,9 @@
 9.4 Searching and Sorting Example
 =================================
 
-Here is an example showing the use of `qsort' and `bsearch' with an
+Here is an example showing the use of 'qsort' and 'bsearch' with an
 array of structures.  The objects in the array are sorted by comparing
-their `name' fields with the `strcmp' function.  Then, we can look up
+their 'name' fields with the 'strcmp' function.  Then, we can look up
 individual objects based on their names.
 
 
@@ -3668,21 +6377,20 @@
 
 File: libc.info,  Node: Hash Search Function,  Next: Tree Search Function,  Prev: Search/Sort Example,  Up: Searching and Sorting
 
-9.5 The `hsearch' function.
+9.5 The 'hsearch' function.
 ===========================
 
 The functions mentioned so far in this chapter are for searching in a
 sorted or unsorted array.  There are other methods to organize
-information which later should be searched.  The costs of insert,
-delete and search differ.  One possible implementation is using hashing
-tables.  The following functions are declared in the header file
-`search.h'.
+information which later should be searched.  The costs of insert, delete
+and search differ.  One possible implementation is using hashing tables.
+The following functions are declared in the header file 'search.h'.
 
  -- Function: int hcreate (size_t NEL)
      Preliminary: | MT-Unsafe race:hsearch | AS-Unsafe heap | AC-Unsafe
      corrupt mem | *Note POSIX Safety Concepts::.
 
-     The `hcreate' function creates a hashing table which can contain at
+     The 'hcreate' function creates a hashing table which can contain at
      least NEL elements.  There is no possibility to grow this table so
      it is necessary to choose the value for NEL wisely.  The method
      used to implement this function might make it necessary to make the
@@ -3696,35 +6404,35 @@
      The weakest aspect of this function is that there can be at most
      one hashing table used through the whole program.  The table is
      allocated in local memory out of control of the programmer.  As an
-     extension the GNU C Library provides an additional set of
-     functions with a reentrant interface which provide a similar
-     interface but which allow to keep arbitrarily many hashing tables.
+     extension the GNU C Library provides an additional set of functions
+     with a reentrant interface which provide a similar interface but
+     which allow to keep arbitrarily many hashing tables.
 
      It is possible to use more than one hashing table in the program
-     run if the former table is first destroyed by a call to `hdestroy'.
+     run if the former table is first destroyed by a call to 'hdestroy'.
 
      The function returns a non-zero value if successful.  If it return
-     zero something went wrong.  This could either mean there is
-     already a hashing table in use or the program runs out of memory.
+     zero something went wrong.  This could either mean there is already
+     a hashing table in use or the program runs out of memory.
 
  -- Function: void hdestroy (void)
      Preliminary: | MT-Unsafe race:hsearch | AS-Unsafe heap | AC-Unsafe
      corrupt mem | *Note POSIX Safety Concepts::.
 
-     The `hdestroy' function can be used to free all the resources
-     allocated in a previous call of `hcreate'.  After a call to this
-     function it is again possible to call `hcreate' and allocate a new
+     The 'hdestroy' function can be used to free all the resources
+     allocated in a previous call of 'hcreate'.  After a call to this
+     function it is again possible to call 'hcreate' and allocate a new
      table with possibly different size.
 
      It is important to remember that the elements contained in the
-     hashing table at the time `hdestroy' is called are _not_ freed by
+     hashing table at the time 'hdestroy' is called are _not_ freed by
      this function.  It is the responsibility of the program code to
      free those strings (if necessary at all).  Freeing all the element
      memory is not possible without extra, separately kept information
      since there is no function to iterate through all available
-     elements in the hashing table.  If it is really necessary to free
-     a table and all elements the programmer has to keep a list of all
-     table elements and before calling `hdestroy' s/he has to free all
+     elements in the hashing table.  If it is really necessary to free a
+     table and all elements the programmer has to keep a list of all
+     table elements and before calling 'hdestroy' s/he has to free all
      element's data using this list.  This is a very unpleasant
      mechanism and it also shows that this kind of hashing tables is
      mainly meant for tables which are created once and used until the
@@ -3736,15 +6444,14 @@
  -- Data type: struct ENTRY
      Both elements of this structure are pointers to zero-terminated
      strings.  This is a limiting restriction of the functionality of
-     the `hsearch' functions.  They can only be used for data sets
-     which use the NUL character always and solely to terminate the
-     records.  It is not possible to handle general binary data.
+     the 'hsearch' functions.  They can only be used for data sets which
+     use the NUL character always and solely to terminate the records.
+     It is not possible to handle general binary data.
 
-    `char *key'
+     'char *key'
           Pointer to a zero-terminated string of characters describing
           the key for the search or the element in the hashing table.
-
-    `char *data'
+     'char *data'
           Pointer to a zero-terminated string of characters describing
           the data.  If the functions will be called only for searching
           an existing entry this element might stay undefined since it
@@ -3754,43 +6461,43 @@
      Preliminary: | MT-Unsafe race:hsearch | AS-Unsafe | AC-Unsafe
      corrupt/action==ENTER | *Note POSIX Safety Concepts::.
 
-     To search in a hashing table created using `hcreate' the `hsearch'
-     function must be used.  This function can perform simple search
-     for an element (if ACTION has the `FIND') or it can alternatively
+     To search in a hashing table created using 'hcreate' the 'hsearch'
+     function must be used.  This function can perform simple search for
+     an element (if ACTION has the 'FIND') or it can alternatively
      insert the key element into the hashing table.  Entries are never
      replaced.
 
-     The key is denoted by a pointer to an object of type `ENTRY'.  For
+     The key is denoted by a pointer to an object of type 'ENTRY'.  For
      locating the corresponding position in the hashing table only the
-     `key' element of the structure is used.
+     'key' element of the structure is used.
 
      If an entry with matching key is found the ACTION parameter is
      irrelevant.  The found entry is returned.  If no matching entry is
-     found and the ACTION parameter has the value `FIND' the function
-     returns a `NULL' pointer.  If no entry is found and the ACTION
-     parameter has the value `ENTER' a new entry is added to the
-     hashing table which is initialized with the parameter ITEM.  A
-     pointer to the newly added entry is returned.
+     found and the ACTION parameter has the value 'FIND' the function
+     returns a 'NULL' pointer.  If no entry is found and the ACTION
+     parameter has the value 'ENTER' a new entry is added to the hashing
+     table which is initialized with the parameter ITEM.  A pointer to
+     the newly added entry is returned.
 
-   As mentioned before the hashing table used by the functions
-described so far is global and there can be at any time at most one
-hashing table in the program.  A solution is to use the following
-functions which are a GNU extension.  All have in common that they
-operate on a hashing table which is described by the content of an
-object of the type `struct hsearch_data'.  This type should be treated
-as opaque, none of its members should be changed directly.
+   As mentioned before the hashing table used by the functions described
+so far is global and there can be at any time at most one hashing table
+in the program.  A solution is to use the following functions which are
+a GNU extension.  All have in common that they operate on a hashing
+table which is described by the content of an object of the type 'struct
+hsearch_data'.  This type should be treated as opaque, none of its
+members should be changed directly.
 
  -- Function: int hcreate_r (size_t NEL, struct hsearch_data *HTAB)
      Preliminary: | MT-Safe race:htab | AS-Unsafe heap | AC-Unsafe
      corrupt mem | *Note POSIX Safety Concepts::.
 
-     The `hcreate_r' function initializes the object pointed to by HTAB
+     The 'hcreate_r' function initializes the object pointed to by HTAB
      to contain a hashing table with at least NEL elements.  So this
-     function is equivalent to the `hcreate' function except that the
+     function is equivalent to the 'hcreate' function except that the
      initialized data structure is controlled by the user.
 
      This allows having more than one hashing table at one time.  The
-     memory necessary for the `struct hsearch_data' object can be
+     memory necessary for the 'struct hsearch_data' object can be
      allocated dynamically.  It must be initialized with zero before
      calling this function.
 
@@ -3802,9 +6509,9 @@
      Preliminary: | MT-Safe race:htab | AS-Unsafe heap | AC-Unsafe
      corrupt mem | *Note POSIX Safety Concepts::.
 
-     The `hdestroy_r' function frees all resources allocated by the
-     `hcreate_r' function for this very same object HTAB.  As for
-     `hdestroy' it is the programs responsibility to free the strings
+     The 'hdestroy_r' function frees all resources allocated by the
+     'hcreate_r' function for this very same object HTAB.  As for
+     'hdestroy' it is the programs responsibility to free the strings
      for the elements of the table.
 
  -- Function: int hsearch_r (ENTRY ITEM, ACTION ACTION, ENTRY **RETVAL,
@@ -3812,13 +6519,13 @@
      Preliminary: | MT-Safe race:htab | AS-Safe | AC-Unsafe
      corrupt/action==ENTER | *Note POSIX Safety Concepts::.
 
-     The `hsearch_r' function is equivalent to `hsearch'.  The meaning
+     The 'hsearch_r' function is equivalent to 'hsearch'.  The meaning
      of the first two arguments is identical.  But instead of operating
      on a single global hashing table the function works on the table
-     described by the object pointed to by HTAB (which is initialized
-     by a call to `hcreate_r').
+     described by the object pointed to by HTAB (which is initialized by
+     a call to 'hcreate_r').
 
-     Another difference to `hcreate' is that the pointer to the found
+     Another difference to 'hcreate' is that the pointer to the found
      entry in the table is not the return value of the functions.  It is
      returned by storing it in a pointer variables pointed to by the
      RETVAL parameter.  The return value of the function is an integer
@@ -3826,53 +6533,52 @@
      zero.  In the latter case the global variable ERRNO signals the
      reason for the failure.
 
-    `ENOMEM'
-          The table is filled and `hsearch_r' was called with a so far
-          unknown key and ACTION set to `ENTER'.
-
-    `ESRCH'
-          The ACTION parameter is `FIND' and no corresponding element
-          is found in the table.
+     'ENOMEM'
+          The table is filled and 'hsearch_r' was called with a so far
+          unknown key and ACTION set to 'ENTER'.
+     'ESRCH'
+          The ACTION parameter is 'FIND' and no corresponding element is
+          found in the table.
 
 
 File: libc.info,  Node: Tree Search Function,  Prev: Hash Search Function,  Up: Searching and Sorting
 
-9.6 The `tsearch' function.
+9.6 The 'tsearch' function.
 ===========================
 
 Another common form to organize data for efficient search is to use
-trees.  The `tsearch' function family provides a nice interface to
+trees.  The 'tsearch' function family provides a nice interface to
 functions to organize possibly large amounts of data by providing a mean
 access time proportional to the logarithm of the number of elements.
 The GNU C Library implementation even guarantees that this bound is
 never exceeded even for input data which cause problems for simple
 binary tree implementations.
 
-   The functions described in the chapter are all described in the
-System V and X/Open specifications and are therefore quite portable.
+   The functions described in the chapter are all described in the System V
+and X/Open specifications and are therefore quite portable.
 
-   In contrast to the `hsearch' functions the `tsearch' functions can
-be used with arbitrary data and not only zero-terminated strings.
+   In contrast to the 'hsearch' functions the 'tsearch' functions can be
+used with arbitrary data and not only zero-terminated strings.
 
-   The `tsearch' functions have the advantage that no function to
-initialize data structures is necessary.  A simple pointer of type
-`void *' initialized to `NULL' is a valid tree and can be extended or
-searched.  The prototypes for these functions can be found in the
-header file `search.h'.
+   The 'tsearch' functions have the advantage that no function to
+initialize data structures is necessary.  A simple pointer of type 'void
+*' initialized to 'NULL' is a valid tree and can be extended or
+searched.  The prototypes for these functions can be found in the header
+file 'search.h'.
 
  -- Function: void * tsearch (const void *KEY, void **ROOTP,
           comparison_fn_t COMPAR)
      Preliminary: | MT-Safe race:rootp | AS-Unsafe heap | AC-Unsafe
      corrupt mem | *Note POSIX Safety Concepts::.
 
-     The `tsearch' function searches in the tree pointed to by `*ROOTP'
+     The 'tsearch' function searches in the tree pointed to by '*ROOTP'
      for an element matching KEY.  The function pointed to by COMPAR is
      used to determine whether two elements match.  *Note Comparison
-     Functions::, for a specification of the functions which can be
-     used for the COMPAR parameter.
+     Functions::, for a specification of the functions which can be used
+     for the COMPAR parameter.
 
-     If the tree does not contain a matching entry the KEY value will
-     be added to the tree.  `tsearch' does not make a copy of the object
+     If the tree does not contain a matching entry the KEY value will be
+     added to the tree.  'tsearch' does not make a copy of the object
      pointed to by KEY (how could it since the size is unknown).
      Instead it adds a reference to this object which means the object
      must be available as long as the tree data structure is used.
@@ -3881,55 +6587,54 @@
      sometimes necessary to change the root node of the tree.  So it
      must not be assumed that the variable pointed to by ROOTP has the
      same value after the call.  This also shows that it is not safe to
-     call the `tsearch' function more than once at the same time using
-     the same tree.  It is no problem to run it more than once at a
-     time on different trees.
+     call the 'tsearch' function more than once at the same time using
+     the same tree.  It is no problem to run it more than once at a time
+     on different trees.
 
      The return value is a pointer to the matching element in the tree.
      If a new element was created the pointer points to the new data
      (which is in fact KEY).  If an entry had to be created and the
-     program ran out of space `NULL' is returned.
+     program ran out of space 'NULL' is returned.
 
  -- Function: void * tfind (const void *KEY, void *const *ROOTP,
           comparison_fn_t COMPAR)
-     Preliminary: | MT-Safe race:rootp | AS-Safe | AC-Safe | *Note
-     POSIX Safety Concepts::.
+     Preliminary: | MT-Safe race:rootp | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
 
-     The `tfind' function is similar to the `tsearch' function.  It
-     locates an element matching the one pointed to by KEY and returns
-     a pointer to this element.  But if no matching element is
-     available no new element is entered (note that the ROOTP parameter
-     points to a constant pointer).  Instead the function returns
-     `NULL'.
+     The 'tfind' function is similar to the 'tsearch' function.  It
+     locates an element matching the one pointed to by KEY and returns a
+     pointer to this element.  But if no matching element is available
+     no new element is entered (note that the ROOTP parameter points to
+     a constant pointer).  Instead the function returns 'NULL'.
 
-   Another advantage of the `tsearch' function in contrast to the
-`hsearch' functions is that there is an easy way to remove elements.
+   Another advantage of the 'tsearch' function in contrast to the
+'hsearch' functions is that there is an easy way to remove elements.
 
  -- Function: void * tdelete (const void *KEY, void **ROOTP,
           comparison_fn_t COMPAR)
      Preliminary: | MT-Safe race:rootp | AS-Unsafe heap | AC-Unsafe
      corrupt mem | *Note POSIX Safety Concepts::.
 
-     To remove a specific element matching KEY from the tree `tdelete'
-     can be used.  It locates the matching element using the same
-     method as `tfind'.  The corresponding element is then removed and
-     a pointer to the parent of the deleted node is returned by the
+     To remove a specific element matching KEY from the tree 'tdelete'
+     can be used.  It locates the matching element using the same method
+     as 'tfind'.  The corresponding element is then removed and a
+     pointer to the parent of the deleted node is returned by the
      function.  If there is no matching entry in the tree nothing can be
-     deleted and the function returns `NULL'.  If the root of the tree
-     is deleted `tdelete' returns some unspecified value not equal to
-     `NULL'.
+     deleted and the function returns 'NULL'.  If the root of the tree
+     is deleted 'tdelete' returns some unspecified value not equal to
+     'NULL'.
 
  -- Function: void tdestroy (void *VROOT, __free_fn_t FREEFCT)
      Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
      POSIX Safety Concepts::.
 
      If the complete search tree has to be removed one can use
-     `tdestroy'.  It frees all resources allocated by the `tsearch'
+     'tdestroy'.  It frees all resources allocated by the 'tsearch'
      function to generate the tree pointed to by VROOT.
 
-     For the data in each tree node the function FREEFCT is called.
-     The pointer to the data is passed as the argument to the function.
-     If no such work is necessary FREEFCT must point to a function doing
+     For the data in each tree node the function FREEFCT is called.  The
+     pointer to the data is passed as the argument to the function.  If
+     no such work is necessary FREEFCT must point to a function doing
      nothing.  It is called in any case.
 
      This function is a GNU extension and not covered by the System V or
@@ -3942,34 +6647,31 @@
      void __action_fn_t (const void *nodep, VISIT value, int level);
 
    The NODEP is the data value of the current node (once given as the
-KEY argument to `tsearch').  LEVEL is a numeric value which corresponds
+KEY argument to 'tsearch').  LEVEL is a numeric value which corresponds
 to the depth of the current node in the tree.  The root node has the
-depth 0 and its children have a depth of 1 and so on.  The `VISIT' type
+depth 0 and its children have a depth of 1 and so on.  The 'VISIT' type
 is an enumeration type.
 
  -- Data Type: VISIT
-     The `VISIT' value indicates the status of the current node in the
+     The 'VISIT' value indicates the status of the current node in the
      tree and how the function is called.  The status of a node is
-     either `leaf' or `internal node'.  For each leaf node the function
+     either 'leaf' or 'internal node'.  For each leaf node the function
      is called exactly once, for each internal node it is called three
      times: before the first child is processed, after the first child
      is processed and after both children are processed.  This makes it
      possible to handle all three methods of tree traversal (or even a
      combination of them).
 
-    `preorder'
+     'preorder'
           The current node is an internal node and the function is
           called before the first child was processed.
-
-    `postorder'
+     'postorder'
           The current node is an internal node and the function is
           called after the first child was processed.
-
-    `endorder'
+     'endorder'
           The current node is an internal node and the function is
           called after the second child was processed.
-
-    `leaf'
+     'leaf'
           The current node is a leaf.
 
  -- Function: void twalk (const void *ROOT, __action_fn_t ACTION)
@@ -3977,19 +6679,19 @@
      Safety Concepts::.
 
      For each node in the tree with a node pointed to by ROOT, the
-     `twalk' function calls the function provided by the parameter
+     'twalk' function calls the function provided by the parameter
      ACTION.  For leaf nodes the function is called exactly once with
-     VALUE set to `leaf'.  For internal nodes the function is called
+     VALUE set to 'leaf'.  For internal nodes the function is called
      three times, setting the VALUE parameter or ACTION to the
      appropriate value.  The LEVEL argument for the ACTION function is
-     computed while descending the tree with increasing the value by
-     one for the descend to a child, starting with the value 0 for the
-     root node.
+     computed while descending the tree with increasing the value by one
+     for the descend to a child, starting with the value 0 for the root
+     node.
 
-     Since the functions used for the ACTION parameter to `twalk' must
-     not modify the tree data, it is safe to run `twalk' in more than
+     Since the functions used for the ACTION parameter to 'twalk' must
+     not modify the tree data, it is safe to run 'twalk' in more than
      one thread at the same time, working on the same tree.  It is also
-     safe to call `tfind' in parallel.  Functions which modify the tree
+     safe to call 'tfind' in parallel.  Functions which modify the tree
      must not be used, otherwise the behavior is undefined.
 
 
@@ -4021,7 +6723,7 @@
 This section describes how to match a wildcard pattern against a
 particular string.  The result is a yes or no answer: does the string
 fit the pattern or not.  The symbols described here are all declared in
-`fnmatch.h'.
+'fnmatch.h'.
 
  -- Function: int fnmatch (const char *PATTERN, const char *STRING, int
           FLAGS)
@@ -4029,84 +6731,84 @@
      | *Note POSIX Safety Concepts::.
 
      This function tests whether the string STRING matches the pattern
-     PATTERN.  It returns `0' if they do match; otherwise, it returns
-     the nonzero value `FNM_NOMATCH'.  The arguments PATTERN and STRING
+     PATTERN.  It returns '0' if they do match; otherwise, it returns
+     the nonzero value 'FNM_NOMATCH'.  The arguments PATTERN and STRING
      are both strings.
 
      The argument FLAGS is a combination of flag bits that alter the
      details of matching.  See below for a list of the defined flags.
 
-     In the GNU C Library, `fnmatch' might sometimes report "errors" by
-     returning nonzero values that are not equal to `FNM_NOMATCH'.
+     In the GNU C Library, 'fnmatch' might sometimes report "errors" by
+     returning nonzero values that are not equal to 'FNM_NOMATCH'.
 
    These are the available flags for the FLAGS argument:
 
-`FNM_FILE_NAME'
-     Treat the `/' character specially, for matching file names.  If
-     this flag is set, wildcard constructs in PATTERN cannot match `/'
-     in STRING.  Thus, the only way to match `/' is with an explicit
-     `/' in PATTERN.
+'FNM_FILE_NAME'
+     Treat the '/' character specially, for matching file names.  If
+     this flag is set, wildcard constructs in PATTERN cannot match '/'
+     in STRING.  Thus, the only way to match '/' is with an explicit '/'
+     in PATTERN.
 
-`FNM_PATHNAME'
-     This is an alias for `FNM_FILE_NAME'; it comes from POSIX.2.  We
+'FNM_PATHNAME'
+     This is an alias for 'FNM_FILE_NAME'; it comes from POSIX.2.  We
      don't recommend this name because we don't use the term "pathname"
      for file names.
 
-`FNM_PERIOD'
-     Treat the `.' character specially if it appears at the beginning of
-     STRING.  If this flag is set, wildcard constructs in PATTERN
-     cannot match `.' as the first character of STRING.
+'FNM_PERIOD'
+     Treat the '.' character specially if it appears at the beginning of
+     STRING.  If this flag is set, wildcard constructs in PATTERN cannot
+     match '.' as the first character of STRING.
 
-     If you set both `FNM_PERIOD' and `FNM_FILE_NAME', then the special
-     treatment applies to `.' following `/' as well as to `.' at the
-     beginning of STRING.  (The shell uses the `FNM_PERIOD' and
-     `FNM_FILE_NAME' flags together for matching file names.)
+     If you set both 'FNM_PERIOD' and 'FNM_FILE_NAME', then the special
+     treatment applies to '.' following '/' as well as to '.' at the
+     beginning of STRING.  (The shell uses the 'FNM_PERIOD' and
+     'FNM_FILE_NAME' flags together for matching file names.)
 
-`FNM_NOESCAPE'
-     Don't treat the `\' character specially in patterns.  Normally,
-     `\' quotes the following character, turning off its special meaning
-     (if any) so that it matches only itself.  When quoting is enabled,
-     the pattern `\?' matches only the string `?', because the question
-     mark in the pattern acts like an ordinary character.
+'FNM_NOESCAPE'
+     Don't treat the '\' character specially in patterns.  Normally, '\'
+     quotes the following character, turning off its special meaning (if
+     any) so that it matches only itself.  When quoting is enabled, the
+     pattern '\?' matches only the string '?', because the question mark
+     in the pattern acts like an ordinary character.
 
-     If you use `FNM_NOESCAPE', then `\' is an ordinary character.
+     If you use 'FNM_NOESCAPE', then '\' is an ordinary character.
 
-`FNM_LEADING_DIR'
-     Ignore a trailing sequence of characters starting with a `/' in
-     STRING; that is to say, test whether STRING starts with a
-     directory name that PATTERN matches.
+'FNM_LEADING_DIR'
+     Ignore a trailing sequence of characters starting with a '/' in
+     STRING; that is to say, test whether STRING starts with a directory
+     name that PATTERN matches.
 
-     If this flag is set, either `foo*' or `foobar' as a pattern would
-     match the string `foobar/frobozz'.
+     If this flag is set, either 'foo*' or 'foobar' as a pattern would
+     match the string 'foobar/frobozz'.
 
-`FNM_CASEFOLD'
+'FNM_CASEFOLD'
      Ignore case in comparing STRING to PATTERN.
 
-`FNM_EXTMATCH'
+'FNM_EXTMATCH'
      Recognize beside the normal patterns also the extended patterns
-     introduced in `ksh'.  The patterns are written in the form
-     explained in the following table where PATTERN-LIST is a `|'
+     introduced in 'ksh'.  The patterns are written in the form
+     explained in the following table where PATTERN-LIST is a '|'
      separated list of patterns.
 
-    `?(PATTERN-LIST)'
+     '?(PATTERN-LIST)'
           The pattern matches if zero or one occurrences of any of the
           patterns in the PATTERN-LIST allow matching the input string.
 
-    `*(PATTERN-LIST)'
+     '*(PATTERN-LIST)'
           The pattern matches if zero or more occurrences of any of the
           patterns in the PATTERN-LIST allow matching the input string.
 
-    `+(PATTERN-LIST)'
+     '+(PATTERN-LIST)'
           The pattern matches if one or more occurrences of any of the
           patterns in the PATTERN-LIST allow matching the input string.
 
-    `@(PATTERN-LIST)'
+     '@(PATTERN-LIST)'
           The pattern matches if exactly one occurrence of any of the
           patterns in the PATTERN-LIST allows matching the input string.
 
-    `!(PATTERN-LIST)'
-          The pattern matches if the input string cannot be matched
-          with any of the patterns in the PATTERN-LIST.
+     '!(PATTERN-LIST)'
+          The pattern matches if the input string cannot be matched with
+          any of the patterns in the PATTERN-LIST.
 
 
 File: libc.info,  Node: Globbing,  Next: Regular Expressions,  Prev: Wildcard Matching,  Up: Pattern Matching
@@ -4118,29 +6820,29 @@
 directory, and making a list of all the matches.  This is called
 "globbing".
 
-   You could do this using `fnmatch', by reading the directory entries
-one by one and testing each one with `fnmatch'.  But that would be slow
+   You could do this using 'fnmatch', by reading the directory entries
+one by one and testing each one with 'fnmatch'.  But that would be slow
 (and complex, since you would have to handle subdirectories by hand).
 
-   The library provides a function `glob' to make this particular use
-of wildcards convenient.  `glob' and the other symbols in this section
-are declared in `glob.h'.
+   The library provides a function 'glob' to make this particular use of
+wildcards convenient.  'glob' and the other symbols in this section are
+declared in 'glob.h'.
 
 * Menu:
 
-* Calling Glob::             Basic use of `glob'.
-* Flags for Globbing::       Flags that enable various options in `glob'.
-* More Flags for Globbing::  GNU specific extensions to `glob'.
+* Calling Glob::             Basic use of 'glob'.
+* Flags for Globbing::       Flags that enable various options in 'glob'.
+* More Flags for Globbing::  GNU specific extensions to 'glob'.
 
 
 File: libc.info,  Node: Calling Glob,  Next: Flags for Globbing,  Up: Globbing
 
-10.2.1 Calling `glob'
+10.2.1 Calling 'glob'
 ---------------------
 
 The result of globbing is a vector of file names (strings).  To return
-this vector, `glob' uses a special data type, `glob_t', which is a
-structure.  You pass `glob' the address of the structure, and it fills
+this vector, 'glob' uses a special data type, 'glob_t', which is a
+structure.  You pass 'glob' the address of the structure, and it fills
 in the structure's fields to tell you about the results.
 
  -- Data Type: glob_t
@@ -4149,83 +6851,81 @@
      GNU implementation contains some more fields which are non-standard
      extensions.
 
-    `gl_pathc'
+     'gl_pathc'
           The number of elements in the vector, excluding the initial
           null entries if the GLOB_DOOFFS flag is used (see gl_offs
           below).
 
-    `gl_pathv'
-          The address of the vector.  This field has type `char **'.
+     'gl_pathv'
+          The address of the vector.  This field has type 'char **'.
 
-    `gl_offs'
+     'gl_offs'
           The offset of the first real element of the vector, from its
-          nominal address in the `gl_pathv' field.  Unlike the other
-          fields, this is always an input to `glob', rather than an
+          nominal address in the 'gl_pathv' field.  Unlike the other
+          fields, this is always an input to 'glob', rather than an
           output from it.
 
           If you use a nonzero offset, then that many elements at the
-          beginning of the vector are left empty.  (The `glob' function
+          beginning of the vector are left empty.  (The 'glob' function
           fills them with null pointers.)
 
-          The `gl_offs' field is meaningful only if you use the
-          `GLOB_DOOFFS' flag.  Otherwise, the offset is always zero
+          The 'gl_offs' field is meaningful only if you use the
+          'GLOB_DOOFFS' flag.  Otherwise, the offset is always zero
           regardless of what is in this field, and the first real
           element comes at the beginning of the vector.
 
-    `gl_closedir'
-          The address of an alternative implementation of the `closedir'
-          function.  It is used if the `GLOB_ALTDIRFUNC' bit is set in
+     'gl_closedir'
+          The address of an alternative implementation of the 'closedir'
+          function.  It is used if the 'GLOB_ALTDIRFUNC' bit is set in
           the flag parameter.  The type of this field is
-          `void (*) (void *)'.
+          'void (*) (void *)'.
 
           This is a GNU extension.
 
-    `gl_readdir'
-          The address of an alternative implementation of the `readdir'
-          function used to read the contents of a directory.  It is
-          used if the `GLOB_ALTDIRFUNC' bit is set in the flag
+     'gl_readdir'
+          The address of an alternative implementation of the 'readdir'
+          function used to read the contents of a directory.  It is used
+          if the 'GLOB_ALTDIRFUNC' bit is set in the flag parameter.
+          The type of this field is 'struct dirent *(*) (void *)'.
+
+          This is a GNU extension.
+
+     'gl_opendir'
+          The address of an alternative implementation of the 'opendir'
+          function.  It is used if the 'GLOB_ALTDIRFUNC' bit is set in
+          the flag parameter.  The type of this field is
+          'void *(*) (const char *)'.
+
+          This is a GNU extension.
+
+     'gl_stat'
+          The address of an alternative implementation of the 'stat'
+          function to get information about an object in the filesystem.
+          It is used if the 'GLOB_ALTDIRFUNC' bit is set in the flag
           parameter.  The type of this field is
-          `struct dirent *(*) (void *)'.
+          'int (*) (const char *, struct stat *)'.
 
           This is a GNU extension.
 
-    `gl_opendir'
-          The address of an alternative implementation of the `opendir'
-          function.  It is used if the `GLOB_ALTDIRFUNC' bit is set in
-          the flag parameter.  The type of this field is
-          `void *(*) (const char *)'.
-
-          This is a GNU extension.
-
-    `gl_stat'
-          The address of an alternative implementation of the `stat'
-          function to get information about an object in the
-          filesystem.  It is used if the `GLOB_ALTDIRFUNC' bit is set
-          in the flag parameter.  The type of this field is
-          `int (*) (const char *, struct stat *)'.
-
-          This is a GNU extension.
-
-    `gl_lstat'
-          The address of an alternative implementation of the `lstat'
+     'gl_lstat'
+          The address of an alternative implementation of the 'lstat'
           function to get information about an object in the
           filesystems, not following symbolic links.  It is used if the
-          `GLOB_ALTDIRFUNC' bit is set in the flag parameter.  The type
-          of this field is `int (*) (const char *, struct stat *)'.
+          'GLOB_ALTDIRFUNC' bit is set in the flag parameter.  The type
+          of this field is 'int (*) (const char *, struct stat *)'.
 
           This is a GNU extension.
 
-    `gl_flags'
-          The flags used when `glob' was called.  In addition,
-          `GLOB_MAGCHAR' might be set.  See *note Flags for Globbing::
+     'gl_flags'
+          The flags used when 'glob' was called.  In addition,
+          'GLOB_MAGCHAR' might be set.  See *note Flags for Globbing::
           for more details.
 
           This is a GNU extension.
 
-   For use in the `glob64' function `glob.h' contains another
-definition for a very similar type.  `glob64_t' differs from `glob_t'
-only in the types of the members `gl_readdir', `gl_stat', and
-`gl_lstat'.
+   For use in the 'glob64' function 'glob.h' contains another definition
+for a very similar type.  'glob64_t' differs from 'glob_t' only in the
+types of the members 'gl_readdir', 'gl_stat', and 'gl_lstat'.
 
  -- Data Type: glob64_t
      This data type holds a pointer to a word vector.  More precisely,
@@ -4233,75 +6933,75 @@
      GNU implementation contains some more fields which are non-standard
      extensions.
 
-    `gl_pathc'
+     'gl_pathc'
           The number of elements in the vector, excluding the initial
           null entries if the GLOB_DOOFFS flag is used (see gl_offs
           below).
 
-    `gl_pathv'
-          The address of the vector.  This field has type `char **'.
+     'gl_pathv'
+          The address of the vector.  This field has type 'char **'.
 
-    `gl_offs'
+     'gl_offs'
           The offset of the first real element of the vector, from its
-          nominal address in the `gl_pathv' field.  Unlike the other
-          fields, this is always an input to `glob', rather than an
+          nominal address in the 'gl_pathv' field.  Unlike the other
+          fields, this is always an input to 'glob', rather than an
           output from it.
 
           If you use a nonzero offset, then that many elements at the
-          beginning of the vector are left empty.  (The `glob' function
+          beginning of the vector are left empty.  (The 'glob' function
           fills them with null pointers.)
 
-          The `gl_offs' field is meaningful only if you use the
-          `GLOB_DOOFFS' flag.  Otherwise, the offset is always zero
+          The 'gl_offs' field is meaningful only if you use the
+          'GLOB_DOOFFS' flag.  Otherwise, the offset is always zero
           regardless of what is in this field, and the first real
           element comes at the beginning of the vector.
 
-    `gl_closedir'
-          The address of an alternative implementation of the `closedir'
-          function.  It is used if the `GLOB_ALTDIRFUNC' bit is set in
+     'gl_closedir'
+          The address of an alternative implementation of the 'closedir'
+          function.  It is used if the 'GLOB_ALTDIRFUNC' bit is set in
           the flag parameter.  The type of this field is
-          `void (*) (void *)'.
+          'void (*) (void *)'.
 
           This is a GNU extension.
 
-    `gl_readdir'
+     'gl_readdir'
           The address of an alternative implementation of the
-          `readdir64' function used to read the contents of a
-          directory.  It is used if the `GLOB_ALTDIRFUNC' bit is set in
+          'readdir64' function used to read the contents of a directory.
+          It is used if the 'GLOB_ALTDIRFUNC' bit is set in the flag
+          parameter.  The type of this field is
+          'struct dirent64 *(*) (void *)'.
+
+          This is a GNU extension.
+
+     'gl_opendir'
+          The address of an alternative implementation of the 'opendir'
+          function.  It is used if the 'GLOB_ALTDIRFUNC' bit is set in
           the flag parameter.  The type of this field is
-          `struct dirent64 *(*) (void *)'.
+          'void *(*) (const char *)'.
 
           This is a GNU extension.
 
-    `gl_opendir'
-          The address of an alternative implementation of the `opendir'
-          function.  It is used if the `GLOB_ALTDIRFUNC' bit is set in
-          the flag parameter.  The type of this field is
-          `void *(*) (const char *)'.
+     'gl_stat'
+          The address of an alternative implementation of the 'stat64'
+          function to get information about an object in the filesystem.
+          It is used if the 'GLOB_ALTDIRFUNC' bit is set in the flag
+          parameter.  The type of this field is
+          'int (*) (const char *, struct stat64 *)'.
 
           This is a GNU extension.
 
-    `gl_stat'
-          The address of an alternative implementation of the `stat64'
-          function to get information about an object in the
-          filesystem.  It is used if the `GLOB_ALTDIRFUNC' bit is set
-          in the flag parameter.  The type of this field is
-          `int (*) (const char *, struct stat64 *)'.
-
-          This is a GNU extension.
-
-    `gl_lstat'
-          The address of an alternative implementation of the `lstat64'
+     'gl_lstat'
+          The address of an alternative implementation of the 'lstat64'
           function to get information about an object in the
           filesystems, not following symbolic links.  It is used if the
-          `GLOB_ALTDIRFUNC' bit is set in the flag parameter.  The type
-          of this field is `int (*) (const char *, struct stat64 *)'.
+          'GLOB_ALTDIRFUNC' bit is set in the flag parameter.  The type
+          of this field is 'int (*) (const char *, struct stat64 *)'.
 
           This is a GNU extension.
 
-    `gl_flags'
-          The flags used when `glob' was called.  In addition,
-          `GLOB_MAGCHAR' might be set.  See *note Flags for Globbing::
+     'gl_flags'
+          The flags used when 'glob' was called.  In addition,
+          'GLOB_MAGCHAR' might be set.  See *note Flags for Globbing::
           for more details.
 
           This is a GNU extension.
@@ -4312,4376 +7012,77 @@
      AS-Unsafe dlopen plugin corrupt heap lock | AC-Unsafe corrupt lock
      fd mem | *Note POSIX Safety Concepts::.
 
-     The function `glob' does globbing using the pattern PATTERN in the
-     current directory.  It puts the result in a newly allocated
-     vector, and stores the size and address of this vector into
-     `*VECTOR-PTR'.  The argument FLAGS is a combination of bit flags;
-     see *note Flags for Globbing::, for details of the flags.
+     The function 'glob' does globbing using the pattern PATTERN in the
+     current directory.  It puts the result in a newly allocated vector,
+     and stores the size and address of this vector into '*VECTOR-PTR'.
+     The argument FLAGS is a combination of bit flags; see *note Flags
+     for Globbing::, for details of the flags.
 
      The result of globbing is a sequence of file names.  The function
-     `glob' allocates a string for each resulting word, then allocates
-     a vector of type `char **' to store the addresses of these
-     strings.  The last element of the vector is a null pointer.  This
-     vector is called the "word vector".
+     'glob' allocates a string for each resulting word, then allocates a
+     vector of type 'char **' to store the addresses of these strings.
+     The last element of the vector is a null pointer.  This vector is
+     called the "word vector".
 
-     To return this vector, `glob' stores both its address and its
+     To return this vector, 'glob' stores both its address and its
      length (number of elements, not counting the terminating null
-     pointer) into `*VECTOR-PTR'.
+     pointer) into '*VECTOR-PTR'.
 
-     Normally, `glob' sorts the file names alphabetically before
-     returning them.  You can turn this off with the flag `GLOB_NOSORT'
+     Normally, 'glob' sorts the file names alphabetically before
+     returning them.  You can turn this off with the flag 'GLOB_NOSORT'
      if you want to get the information as fast as possible.  Usually
-     it's a good idea to let `glob' sort them--if you process the files
+     it's a good idea to let 'glob' sort them--if you process the files
      in alphabetical order, the users will have a feel for the rate of
      progress that your application is making.
 
-     If `glob' succeeds, it returns 0.  Otherwise, it returns one of
+     If 'glob' succeeds, it returns 0.  Otherwise, it returns one of
      these error codes:
 
-    `GLOB_ABORTED'
+     'GLOB_ABORTED'
           There was an error opening a directory, and you used the flag
-          `GLOB_ERR' or your specified ERRFUNC returned a nonzero value.
+          'GLOB_ERR' or your specified ERRFUNC returned a nonzero value.
           *Note Flags for Globbing::, for an explanation of the
-          `GLOB_ERR' flag and ERRFUNC.
+          'GLOB_ERR' flag and ERRFUNC.
 
-    `GLOB_NOMATCH'
+     'GLOB_NOMATCH'
           The pattern didn't match any existing files.  If you use the
-          `GLOB_NOCHECK' flag, then you never get this error code,
-          because that flag tells `glob' to _pretend_ that the pattern
+          'GLOB_NOCHECK' flag, then you never get this error code,
+          because that flag tells 'glob' to _pretend_ that the pattern
           matched at least one file.
 
-    `GLOB_NOSPACE'
+     'GLOB_NOSPACE'
           It was impossible to allocate memory to hold the result.
 
-     In the event of an error, `glob' stores information in
-     `*VECTOR-PTR' about all the matches it has found so far.
+     In the event of an error, 'glob' stores information in
+     '*VECTOR-PTR' about all the matches it has found so far.
 
-     It is important to notice that the `glob' function will not fail if
+     It is important to notice that the 'glob' function will not fail if
      it encounters directories or files which cannot be handled without
-     the LFS interfaces.  The implementation of `glob' is supposed to
+     the LFS interfaces.  The implementation of 'glob' is supposed to
      use these functions internally.  This at least is the assumptions
      made by the Unix standard.  The GNU extension of allowing the user
-     to provide own directory handling and `stat' functions complicates
+     to provide own directory handling and 'stat' functions complicates
      things a bit.  If these callback functions are used and a large
-     file or directory is encountered `glob' _can_ fail.
+     file or directory is encountered 'glob' _can_ fail.
 
- -- Function: int glob64 (const char *PATTERN, int FLAGS, int
-          (*ERRFUNC) (const char *FILENAME, int ERROR-CODE), glob64_t
-          *VECTOR-PTR)
+ -- Function: int glob64 (const char *PATTERN, int FLAGS, int (*ERRFUNC)
+          (const char *FILENAME, int ERROR-CODE), glob64_t *VECTOR-PTR)
      Preliminary: | MT-Unsafe race:utent env sig:ALRM timer locale |
      AS-Unsafe dlopen corrupt heap lock | AC-Unsafe corrupt lock fd mem
      | *Note POSIX Safety Concepts::.
 
-     The `glob64' function was added as part of the Large File Summit
+     The 'glob64' function was added as part of the Large File Summit
      extensions but is not part of the original LFS proposal.  The
      reason for this is simple: it is not necessary.  The necessity for
-     a `glob64' function is added by the extensions of the GNU `glob'
+     a 'glob64' function is added by the extensions of the GNU 'glob'
      implementation which allows the user to provide own directory
-     handling and `stat' functions.  The `readdir' and `stat' functions
-     do depend on the choice of `_FILE_OFFSET_BITS' since the definition
-     of the types `struct dirent' and `struct stat' will change
+     handling and 'stat' functions.  The 'readdir' and 'stat' functions
+     do depend on the choice of '_FILE_OFFSET_BITS' since the definition
+     of the types 'struct dirent' and 'struct stat' will change
      depending on the choice.
 
-     Beside this difference the `glob64' works just like `glob' in all
+     Beside this difference the 'glob64' works just like 'glob' in all
      aspects.
 
      This function is a GNU extension.
 
-
-File: libc.info,  Node: Flags for Globbing,  Next: More Flags for Globbing,  Prev: Calling Glob,  Up: Globbing
-
-10.2.2 Flags for Globbing
--------------------------
-
-This section describes the standard flags that you can specify in the
-FLAGS argument to `glob'.  Choose the flags you want, and combine them
-with the C bitwise OR operator `|'.
-
-   Note that there are *note More Flags for Globbing:: available as GNU
-extensions.
-
-`GLOB_APPEND'
-     Append the words from this expansion to the vector of words
-     produced by previous calls to `glob'.  This way you can
-     effectively expand several words as if they were concatenated with
-     spaces between them.
-
-     In order for appending to work, you must not modify the contents
-     of the word vector structure between calls to `glob'.  And, if you
-     set `GLOB_DOOFFS' in the first call to `glob', you must also set
-     it when you append to the results.
-
-     Note that the pointer stored in `gl_pathv' may no longer be valid
-     after you call `glob' the second time, because `glob' might have
-     relocated the vector.  So always fetch `gl_pathv' from the
-     `glob_t' structure after each `glob' call; *never* save the
-     pointer across calls.
-
-`GLOB_DOOFFS'
-     Leave blank slots at the beginning of the vector of words.  The
-     `gl_offs' field says how many slots to leave.  The blank slots
-     contain null pointers.
-
-`GLOB_ERR'
-     Give up right away and report an error if there is any difficulty
-     reading the directories that must be read in order to expand
-     PATTERN fully.  Such difficulties might include a directory in
-     which you don't have the requisite access.  Normally, `glob' tries
-     its best to keep on going despite any errors, reading whatever
-     directories it can.
-
-     You can exercise even more control than this by specifying an
-     error-handler function ERRFUNC when you call `glob'.  If ERRFUNC
-     is not a null pointer, then `glob' doesn't give up right away when
-     it can't read a directory; instead, it calls ERRFUNC with two
-     arguments, like this:
-
-          (*ERRFUNC) (FILENAME, ERROR-CODE)
-
-     The argument FILENAME is the name of the directory that `glob'
-     couldn't open or couldn't read, and ERROR-CODE is the `errno'
-     value that was reported to `glob'.
-
-     If the error handler function returns nonzero, then `glob' gives up
-     right away.  Otherwise, it continues.
-
-`GLOB_MARK'
-     If the pattern matches the name of a directory, append `/' to the
-     directory's name when returning it.
-
-`GLOB_NOCHECK'
-     If the pattern doesn't match any file names, return the pattern
-     itself as if it were a file name that had been matched.
-     (Normally, when the pattern doesn't match anything, `glob' returns
-     that there were no matches.)
-
-`GLOB_NOESCAPE'
-     Don't treat the `\' character specially in patterns.  Normally,
-     `\' quotes the following character, turning off its special meaning
-     (if any) so that it matches only itself.  When quoting is enabled,
-     the pattern `\?' matches only the string `?', because the question
-     mark in the pattern acts like an ordinary character.
-
-     If you use `GLOB_NOESCAPE', then `\' is an ordinary character.
-
-     `glob' does its work by calling the function `fnmatch' repeatedly.
-     It handles the flag `GLOB_NOESCAPE' by turning on the
-     `FNM_NOESCAPE' flag in calls to `fnmatch'.
-
-`GLOB_NOSORT'
-     Don't sort the file names; return them in no particular order.
-     (In practice, the order will depend on the order of the entries in
-     the directory.)  The only reason _not_ to sort is to save time.
-
-
-File: libc.info,  Node: More Flags for Globbing,  Prev: Flags for Globbing,  Up: Globbing
-
-10.2.3 More Flags for Globbing
-------------------------------
-
-Beside the flags described in the last section, the GNU implementation
-of `glob' allows a few more flags which are also defined in the
-`glob.h' file.  Some of the extensions implement functionality which is
-available in modern shell implementations.
-
-`GLOB_PERIOD'
-     The `.' character (period) is treated special.  It cannot be
-     matched by wildcards.  *Note Wildcard Matching::, `FNM_PERIOD'.
-
-`GLOB_MAGCHAR'
-     The `GLOB_MAGCHAR' value is not to be given to `glob' in the FLAGS
-     parameter.  Instead, `glob' sets this bit in the GL_FLAGS element
-     of the GLOB_T structure provided as the result if the pattern used
-     for matching contains any wildcard character.
-
-`GLOB_ALTDIRFUNC'
-     Instead of the using the using the normal functions for accessing
-     the filesystem the `glob' implementation uses the user-supplied
-     functions specified in the structure pointed to by PGLOB
-     parameter.  For more information about the functions refer to the
-     sections about directory handling see *note Accessing
-     Directories::, and *note Reading Attributes::.
-
-`GLOB_BRACE'
-     If this flag is given the handling of braces in the pattern is
-     changed.  It is now required that braces appear correctly grouped.
-     I.e., for each opening brace there must be a closing one.  Braces
-     can be used recursively.  So it is possible to define one brace
-     expression in another one.  It is important to note that the range
-     of each brace expression is completely contained in the outer
-     brace expression (if there is one).
-
-     The string between the matching braces is separated into single
-     expressions by splitting at `,' (comma) characters.  The commas
-     themselves are discarded.  Please note what we said above about
-     recursive brace expressions.  The commas used to separate the
-     subexpressions must be at the same level.  Commas in brace
-     subexpressions are not matched.  They are used during expansion of
-     the brace expression of the deeper level.  The example below shows
-     this
-
-          glob ("{foo/{,bar,biz},baz}", GLOB_BRACE, NULL, &result)
-
-     is equivalent to the sequence
-
-          glob ("foo/", GLOB_BRACE, NULL, &result)
-          glob ("foo/bar", GLOB_BRACE|GLOB_APPEND, NULL, &result)
-          glob ("foo/biz", GLOB_BRACE|GLOB_APPEND, NULL, &result)
-          glob ("baz", GLOB_BRACE|GLOB_APPEND, NULL, &result)
-
-     if we leave aside error handling.
-
-`GLOB_NOMAGIC'
-     If the pattern contains no wildcard constructs (it is a literal
-     file name), return it as the sole "matching" word, even if no file
-     exists by that name.
-
-`GLOB_TILDE'
-     If this flag is used the character `~' (tilde) is handled special
-     if it appears at the beginning of the pattern.  Instead of being
-     taken verbatim it is used to represent the home directory of a
-     known user.
-
-     If `~' is the only character in pattern or it is followed by a `/'
-     (slash), the home directory of the process owner is substituted.
-     Using `getlogin' and `getpwnam' the information is read from the
-     system databases.  As an example take user `bart' with his home
-     directory at `/home/bart'.  For him a call like
-
-          glob ("~/bin/*", GLOB_TILDE, NULL, &result)
-
-     would return the contents of the directory `/home/bart/bin'.
-     Instead of referring to the own home directory it is also possible
-     to name the home directory of other users.  To do so one has to
-     append the user name after the tilde character.  So the contents
-     of user `homer''s `bin' directory can be retrieved by
-
-          glob ("~homer/bin/*", GLOB_TILDE, NULL, &result)
-
-     If the user name is not valid or the home directory cannot be
-     determined for some reason the pattern is left untouched and
-     itself used as the result.  I.e., if in the last example `home' is
-     not available the tilde expansion yields to `"~homer/bin/*"' and
-     `glob' is not looking for a directory named `~homer'.
-
-     This functionality is equivalent to what is available in C-shells
-     if the `nonomatch' flag is set.
-
-`GLOB_TILDE_CHECK'
-     If this flag is used `glob' behaves like as if `GLOB_TILDE' is
-     given.  The only difference is that if the user name is not
-     available or the home directory cannot be determined for other
-     reasons this leads to an error.  `glob' will return `GLOB_NOMATCH'
-     instead of using the pattern itself as the name.
-
-     This functionality is equivalent to what is available in C-shells
-     if `nonomatch' flag is not set.
-
-`GLOB_ONLYDIR'
-     If this flag is used the globbing function takes this as a *hint*
-     that the caller is only interested in directories matching the
-     pattern.  If the information about the type of the file is easily
-     available non-directories will be rejected but no extra work will
-     be done to determine the information for each file.  I.e., the
-     caller must still be able to filter directories out.
-
-     This functionality is only available with the GNU `glob'
-     implementation.  It is mainly used internally to increase the
-     performance but might be useful for a user as well and therefore is
-     documented here.
-
-   Calling `glob' will in most cases allocate resources which are used
-to represent the result of the function call.  If the same object of
-type `glob_t' is used in multiple call to `glob' the resources are
-freed or reused so that no leaks appear.  But this does not include the
-time when all `glob' calls are done.
-
- -- Function: void globfree (glob_t *PGLOB)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt heap | AC-Unsafe
-     corrupt mem | *Note POSIX Safety Concepts::.
-
-     The `globfree' function frees all resources allocated by previous
-     calls to `glob' associated with the object pointed to by PGLOB.
-     This function should be called whenever the currently used
-     `glob_t' typed object isn't used anymore.
-
- -- Function: void globfree64 (glob64_t *PGLOB)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt lock | AC-Unsafe
-     corrupt lock fd mem | *Note POSIX Safety Concepts::.
-
-     This function is equivalent to `globfree' but it frees records of
-     type `glob64_t' which were allocated by `glob64'.
-
-
-File: libc.info,  Node: Regular Expressions,  Next: Word Expansion,  Prev: Globbing,  Up: Pattern Matching
-
-10.3 Regular Expression Matching
-================================
-
-The GNU C Library supports two interfaces for matching regular
-expressions.  One is the standard POSIX.2 interface, and the other is
-what the GNU C Library has had for many years.
-
-   Both interfaces are declared in the header file `regex.h'.  If you
-define `_POSIX_C_SOURCE', then only the POSIX.2 functions, structures,
-and constants are declared.
-
-* Menu:
-
-* POSIX Regexp Compilation::    Using `regcomp' to prepare to match.
-* Flags for POSIX Regexps::     Syntax variations for `regcomp'.
-* Matching POSIX Regexps::      Using `regexec' to match the compiled
-				   pattern that you get from `regcomp'.
-* Regexp Subexpressions::       Finding which parts of the string were matched.
-* Subexpression Complications:: Find points of which parts were matched.
-* Regexp Cleanup::		Freeing storage; reporting errors.
-
-
-File: libc.info,  Node: POSIX Regexp Compilation,  Next: Flags for POSIX Regexps,  Up: Regular Expressions
-
-10.3.1 POSIX Regular Expression Compilation
--------------------------------------------
-
-Before you can actually match a regular expression, you must "compile"
-it.  This is not true compilation--it produces a special data
-structure, not machine instructions.  But it is like ordinary
-compilation in that its purpose is to enable you to "execute" the
-pattern fast.  (*Note Matching POSIX Regexps::, for how to use the
-compiled regular expression for matching.)
-
-   There is a special data type for compiled regular expressions:
-
- -- Data Type: regex_t
-     This type of object holds a compiled regular expression.  It is
-     actually a structure.  It has just one field that your programs
-     should look at:
-
-    `re_nsub'
-          This field holds the number of parenthetical subexpressions
-          in the regular expression that was compiled.
-
-     There are several other fields, but we don't describe them here,
-     because only the functions in the library should use them.
-
-   After you create a `regex_t' object, you can compile a regular
-expression into it by calling `regcomp'.
-
- -- Function: int regcomp (regex_t *restrict COMPILED, const char
-          *restrict PATTERN, int CFLAGS)
-     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap lock dlopen
-     | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
-
-     The function `regcomp' "compiles" a regular expression into a data
-     structure that you can use with `regexec' to match against a
-     string.  The compiled regular expression format is designed for
-     efficient matching.  `regcomp' stores it into `*COMPILED'.
-
-     It's up to you to allocate an object of type `regex_t' and pass its
-     address to `regcomp'.
-
-     The argument CFLAGS lets you specify various options that control
-     the syntax and semantics of regular expressions.  *Note Flags for
-     POSIX Regexps::.
-
-     If you use the flag `REG_NOSUB', then `regcomp' omits from the
-     compiled regular expression the information necessary to record
-     how subexpressions actually match.  In this case, you might as well
-     pass `0' for the MATCHPTR and NMATCH arguments when you call
-     `regexec'.
-
-     If you don't use `REG_NOSUB', then the compiled regular expression
-     does have the capacity to record how subexpressions match.  Also,
-     `regcomp' tells you how many subexpressions PATTERN has, by
-     storing the number in `COMPILED->re_nsub'.  You can use that value
-     to decide how long an array to allocate to hold information about
-     subexpression matches.
-
-     `regcomp' returns `0' if it succeeds in compiling the regular
-     expression; otherwise, it returns a nonzero error code (see the
-     table below).  You can use `regerror' to produce an error message
-     string describing the reason for a nonzero value; see *note Regexp
-     Cleanup::.
-
-
-   Here are the possible nonzero values that `regcomp' can return:
-
-`REG_BADBR'
-     There was an invalid `\{...\}' construct in the regular
-     expression.  A valid `\{...\}' construct must contain either a
-     single number, or two numbers in increasing order separated by a
-     comma.
-
-`REG_BADPAT'
-     There was a syntax error in the regular expression.
-
-`REG_BADRPT'
-     A repetition operator such as `?' or `*' appeared in a bad
-     position (with no preceding subexpression to act on).
-
-`REG_ECOLLATE'
-     The regular expression referred to an invalid collating element
-     (one not defined in the current locale for string collation).
-     *Note Locale Categories::.
-
-`REG_ECTYPE'
-     The regular expression referred to an invalid character class name.
-
-`REG_EESCAPE'
-     The regular expression ended with `\'.
-
-`REG_ESUBREG'
-     There was an invalid number in the `\DIGIT' construct.
-
-`REG_EBRACK'
-     There were unbalanced square brackets in the regular expression.
-
-`REG_EPAREN'
-     An extended regular expression had unbalanced parentheses, or a
-     basic regular expression had unbalanced `\(' and `\)'.
-
-`REG_EBRACE'
-     The regular expression had unbalanced `\{' and `\}'.
-
-`REG_ERANGE'
-     One of the endpoints in a range expression was invalid.
-
-`REG_ESPACE'
-     `regcomp' ran out of memory.
-
-
-File: libc.info,  Node: Flags for POSIX Regexps,  Next: Matching POSIX Regexps,  Prev: POSIX Regexp Compilation,  Up: Regular Expressions
-
-10.3.2 Flags for POSIX Regular Expressions
-------------------------------------------
-
-These are the bit flags that you can use in the CFLAGS operand when
-compiling a regular expression with `regcomp'.
-
-`REG_EXTENDED'
-     Treat the pattern as an extended regular expression, rather than
-     as a basic regular expression.
-
-`REG_ICASE'
-     Ignore case when matching letters.
-
-`REG_NOSUB'
-     Don't bother storing the contents of the MATCHES-PTR array.
-
-`REG_NEWLINE'
-     Treat a newline in STRING as dividing STRING into multiple lines,
-     so that `$' can match before the newline and `^' can match after.
-     Also, don't permit `.' to match a newline, and don't permit
-     `[^...]' to match a newline.
-
-     Otherwise, newline acts like any other ordinary character.
-
-
-File: libc.info,  Node: Matching POSIX Regexps,  Next: Regexp Subexpressions,  Prev: Flags for POSIX Regexps,  Up: Regular Expressions
-
-10.3.3 Matching a Compiled POSIX Regular Expression
----------------------------------------------------
-
-Once you have compiled a regular expression, as described in *note
-POSIX Regexp Compilation::, you can match it against strings using
-`regexec'.  A match anywhere inside the string counts as success,
-unless the regular expression contains anchor characters (`^' or `$').
-
- -- Function: int regexec (const regex_t *restrict COMPILED, const char
-          *restrict STRING, size_t NMATCH, regmatch_t
-          MATCHPTR[restrict], int EFLAGS)
-     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap lock dlopen
-     | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
-
-     This function tries to match the compiled regular expression
-     `*COMPILED' against STRING.
-
-     `regexec' returns `0' if the regular expression matches;
-     otherwise, it returns a nonzero value.  See the table below for
-     what nonzero values mean.  You can use `regerror' to produce an
-     error message string describing the reason for a nonzero value;
-     see *note Regexp Cleanup::.
-
-     The argument EFLAGS is a word of bit flags that enable various
-     options.
-
-     If you want to get information about what part of STRING actually
-     matched the regular expression or its subexpressions, use the
-     arguments MATCHPTR and NMATCH.  Otherwise, pass `0' for NMATCH,
-     and `NULL' for MATCHPTR.  *Note Regexp Subexpressions::.
-
-   You must match the regular expression with the same set of current
-locales that were in effect when you compiled the regular expression.
-
-   The function `regexec' accepts the following flags in the EFLAGS
-argument:
-
-`REG_NOTBOL'
-     Do not regard the beginning of the specified string as the
-     beginning of a line; more generally, don't make any assumptions
-     about what text might precede it.
-
-`REG_NOTEOL'
-     Do not regard the end of the specified string as the end of a
-     line; more generally, don't make any assumptions about what text
-     might follow it.
-
-   Here are the possible nonzero values that `regexec' can return:
-
-`REG_NOMATCH'
-     The pattern didn't match the string.  This isn't really an error.
-
-`REG_ESPACE'
-     `regexec' ran out of memory.
-
-
-File: libc.info,  Node: Regexp Subexpressions,  Next: Subexpression Complications,  Prev: Matching POSIX Regexps,  Up: Regular Expressions
-
-10.3.4 Match Results with Subexpressions
-----------------------------------------
-
-When `regexec' matches parenthetical subexpressions of PATTERN, it
-records which parts of STRING they match.  It returns that information
-by storing the offsets into an array whose elements are structures of
-type `regmatch_t'.  The first element of the array (index `0') records
-the part of the string that matched the entire regular expression.
-Each other element of the array records the beginning and end of the
-part that matched a single parenthetical subexpression.
-
- -- Data Type: regmatch_t
-     This is the data type of the MATCHARRAY array that you pass to
-     `regexec'.  It contains two structure fields, as follows:
-
-    `rm_so'
-          The offset in STRING of the beginning of a substring.  Add
-          this value to STRING to get the address of that part.
-
-    `rm_eo'
-          The offset in STRING of the end of the substring.
-
- -- Data Type: regoff_t
-     `regoff_t' is an alias for another signed integer type.  The
-     fields of `regmatch_t' have type `regoff_t'.
-
-   The `regmatch_t' elements correspond to subexpressions positionally;
-the first element (index `1') records where the first subexpression
-matched, the second element records the second subexpression, and so
-on.  The order of the subexpressions is the order in which they begin.
-
-   When you call `regexec', you specify how long the MATCHPTR array is,
-with the NMATCH argument.  This tells `regexec' how many elements to
-store.  If the actual regular expression has more than NMATCH
-subexpressions, then you won't get offset information about the rest of
-them.  But this doesn't alter whether the pattern matches a particular
-string or not.
-
-   If you don't want `regexec' to return any information about where
-the subexpressions matched, you can either supply `0' for NMATCH, or
-use the flag `REG_NOSUB' when you compile the pattern with `regcomp'.
-
-
-File: libc.info,  Node: Subexpression Complications,  Next: Regexp Cleanup,  Prev: Regexp Subexpressions,  Up: Regular Expressions
-
-10.3.5 Complications in Subexpression Matching
-----------------------------------------------
-
-Sometimes a subexpression matches a substring of no characters.  This
-happens when `f\(o*\)' matches the string `fum'.  (It really matches
-just the `f'.)  In this case, both of the offsets identify the point in
-the string where the null substring was found.  In this example, the
-offsets are both `1'.
-
-   Sometimes the entire regular expression can match without using some
-of its subexpressions at all--for example, when `ba\(na\)*' matches the
-string `ba', the parenthetical subexpression is not used.  When this
-happens, `regexec' stores `-1' in both fields of the element for that
-subexpression.
-
-   Sometimes matching the entire regular expression can match a
-particular subexpression more than once--for example, when `ba\(na\)*'
-matches the string `bananana', the parenthetical subexpression matches
-three times.  When this happens, `regexec' usually stores the offsets
-of the last part of the string that matched the subexpression.  In the
-case of `bananana', these offsets are `6' and `8'.
-
-   But the last match is not always the one that is chosen.  It's more
-accurate to say that the last _opportunity_ to match is the one that
-takes precedence.  What this means is that when one subexpression
-appears within another, then the results reported for the inner
-subexpression reflect whatever happened on the last match of the outer
-subexpression.  For an example, consider `\(ba\(na\)*s \)*' matching
-the string `bananas bas '.  The last time the inner expression actually
-matches is near the end of the first word.  But it is _considered_
-again in the second word, and fails to match there.  `regexec' reports
-nonuse of the "na" subexpression.
-
-   Another place where this rule applies is when the regular expression
-     \(ba\(na\)*s \|nefer\(ti\)* \)*
-   matches `bananas nefertiti'.  The "na" subexpression does match in
-the first word, but it doesn't match in the second word because the
-other alternative is used there.  Once again, the second repetition of
-the outer subexpression overrides the first, and within that second
-repetition, the "na" subexpression is not used.  So `regexec' reports
-nonuse of the "na" subexpression.
-
-
-File: libc.info,  Node: Regexp Cleanup,  Prev: Subexpression Complications,  Up: Regular Expressions
-
-10.3.6 POSIX Regexp Matching Cleanup
-------------------------------------
-
-When you are finished using a compiled regular expression, you can free
-the storage it uses by calling `regfree'.
-
- -- Function: void regfree (regex_t *COMPILED)
-     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
-     POSIX Safety Concepts::.
-
-     Calling `regfree' frees all the storage that `*COMPILED' points
-     to.  This includes various internal fields of the `regex_t'
-     structure that aren't documented in this manual.
-
-     `regfree' does not free the object `*COMPILED' itself.
-
-   You should always free the space in a `regex_t' structure with
-`regfree' before using the structure to compile another regular
-expression.
-
-   When `regcomp' or `regexec' reports an error, you can use the
-function `regerror' to turn it into an error message string.
-
- -- Function: size_t regerror (int ERRCODE, const regex_t *restrict
-          COMPILED, char *restrict BUFFER, size_t LENGTH)
-     Preliminary: | MT-Safe env | AS-Unsafe corrupt heap lock dlopen |
-     AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
-
-     This function produces an error message string for the error code
-     ERRCODE, and stores the string in LENGTH bytes of memory starting
-     at BUFFER.  For the COMPILED argument, supply the same compiled
-     regular expression structure that `regcomp' or `regexec' was
-     working with when it got the error.  Alternatively, you can supply
-     `NULL' for COMPILED; you will still get a meaningful error
-     message, but it might not be as detailed.
-
-     If the error message can't fit in LENGTH bytes (including a
-     terminating null character), then `regerror' truncates it.  The
-     string that `regerror' stores is always null-terminated even if it
-     has been truncated.
-
-     The return value of `regerror' is the minimum length needed to
-     store the entire error message.  If this is less than LENGTH, then
-     the error message was not truncated, and you can use it.
-     Otherwise, you should call `regerror' again with a larger buffer.
-
-     Here is a function which uses `regerror', but always dynamically
-     allocates a buffer for the error message:
-
-          char *get_regerror (int errcode, regex_t *compiled)
-          {
-            size_t length = regerror (errcode, compiled, NULL, 0);
-            char *buffer = xmalloc (length);
-            (void) regerror (errcode, compiled, buffer, length);
-            return buffer;
-          }
-
-
-File: libc.info,  Node: Word Expansion,  Prev: Regular Expressions,  Up: Pattern Matching
-
-10.4 Shell-Style Word Expansion
-===============================
-
-"Word expansion" means the process of splitting a string into "words"
-and substituting for variables, commands, and wildcards just as the
-shell does.
-
-   For example, when you write `ls -l foo.c', this string is split into
-three separate words--`ls', `-l' and `foo.c'.  This is the most basic
-function of word expansion.
-
-   When you write `ls *.c', this can become many words, because the
-word `*.c' can be replaced with any number of file names.  This is
-called "wildcard expansion", and it is also a part of word expansion.
-
-   When you use `echo $PATH' to print your path, you are taking
-advantage of "variable substitution", which is also part of word
-expansion.
-
-   Ordinary programs can perform word expansion just like the shell by
-calling the library function `wordexp'.
-
-* Menu:
-
-* Expansion Stages::            What word expansion does to a string.
-* Calling Wordexp::             How to call `wordexp'.
-* Flags for Wordexp::           Options you can enable in `wordexp'.
-* Wordexp Example::             A sample program that does word expansion.
-* Tilde Expansion::             Details of how tilde expansion works.
-* Variable Substitution::       Different types of variable substitution.
-
-
-File: libc.info,  Node: Expansion Stages,  Next: Calling Wordexp,  Up: Word Expansion
-
-10.4.1 The Stages of Word Expansion
------------------------------------
-
-When word expansion is applied to a sequence of words, it performs the
-following transformations in the order shown here:
-
-  1. "Tilde expansion": Replacement of `~foo' with the name of the home
-     directory of `foo'.
-
-  2. Next, three different transformations are applied in the same step,
-     from left to right:
-
-        * "Variable substitution": Environment variables are
-          substituted for references such as `$foo'.
-
-        * "Command substitution": Constructs such as ``cat foo`' and
-          the equivalent `$(cat foo)' are replaced with the output from
-          the inner command.
-
-        * "Arithmetic expansion": Constructs such as `$(($x-1))' are
-          replaced with the result of the arithmetic computation.
-
-  3. "Field splitting": subdivision of the text into "words".
-
-  4. "Wildcard expansion": The replacement of a construct such as `*.c'
-     with a list of `.c' file names.  Wildcard expansion applies to an
-     entire word at a time, and replaces that word with 0 or more file
-     names that are themselves words.
-
-  5. "Quote removal": The deletion of string-quotes, now that they have
-     done their job by inhibiting the above transformations when
-     appropriate.
-
-   For the details of these transformations, and how to write the
-constructs that use them, see `The BASH Manual' (to appear).
-
-
-File: libc.info,  Node: Calling Wordexp,  Next: Flags for Wordexp,  Prev: Expansion Stages,  Up: Word Expansion
-
-10.4.2 Calling `wordexp'
-------------------------
-
-All the functions, constants and data types for word expansion are
-declared in the header file `wordexp.h'.
-
-   Word expansion produces a vector of words (strings).  To return this
-vector, `wordexp' uses a special data type, `wordexp_t', which is a
-structure.  You pass `wordexp' the address of the structure, and it
-fills in the structure's fields to tell you about the results.
-
- -- Data Type: wordexp_t
-     This data type holds a pointer to a word vector.  More precisely,
-     it records both the address of the word vector and its size.
-
-    `we_wordc'
-          The number of elements in the vector.
-
-    `we_wordv'
-          The address of the vector.  This field has type `char **'.
-
-    `we_offs'
-          The offset of the first real element of the vector, from its
-          nominal address in the `we_wordv' field.  Unlike the other
-          fields, this is always an input to `wordexp', rather than an
-          output from it.
-
-          If you use a nonzero offset, then that many elements at the
-          beginning of the vector are left empty.  (The `wordexp'
-          function fills them with null pointers.)
-
-          The `we_offs' field is meaningful only if you use the
-          `WRDE_DOOFFS' flag.  Otherwise, the offset is always zero
-          regardless of what is in this field, and the first real
-          element comes at the beginning of the vector.
-
- -- Function: int wordexp (const char *WORDS, wordexp_t
-          *WORD-VECTOR-PTR, int FLAGS)
-     Preliminary: | MT-Unsafe race:utent const:env env sig:ALRM timer
-     locale | AS-Unsafe dlopen plugin i18n heap corrupt lock |
-     AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
-
-     Perform word expansion on the string WORDS, putting the result in
-     a newly allocated vector, and store the size and address of this
-     vector into `*WORD-VECTOR-PTR'.  The argument FLAGS is a
-     combination of bit flags; see *note Flags for Wordexp::, for
-     details of the flags.
-
-     You shouldn't use any of the characters `|&;<>' in the string
-     WORDS unless they are quoted; likewise for newline.  If you use
-     these characters unquoted, you will get the `WRDE_BADCHAR' error
-     code.  Don't use parentheses or braces unless they are quoted or
-     part of a word expansion construct.  If you use quotation
-     characters `'"`', they should come in pairs that balance.
-
-     The results of word expansion are a sequence of words.  The
-     function `wordexp' allocates a string for each resulting word, then
-     allocates a vector of type `char **' to store the addresses of
-     these strings.  The last element of the vector is a null pointer.
-     This vector is called the "word vector".
-
-     To return this vector, `wordexp' stores both its address and its
-     length (number of elements, not counting the terminating null
-     pointer) into `*WORD-VECTOR-PTR'.
-
-     If `wordexp' succeeds, it returns 0.  Otherwise, it returns one of
-     these error codes:
-
-    `WRDE_BADCHAR'
-          The input string WORDS contains an unquoted invalid character
-          such as `|'.
-
-    `WRDE_BADVAL'
-          The input string refers to an undefined shell variable, and
-          you used the flag `WRDE_UNDEF' to forbid such references.
-
-    `WRDE_CMDSUB'
-          The input string uses command substitution, and you used the
-          flag `WRDE_NOCMD' to forbid command substitution.
-
-    `WRDE_NOSPACE'
-          It was impossible to allocate memory to hold the result.  In
-          this case, `wordexp' can store part of the results--as much
-          as it could allocate room for.
-
-    `WRDE_SYNTAX'
-          There was a syntax error in the input string.  For example,
-          an unmatched quoting character is a syntax error.
-
- -- Function: void wordfree (wordexp_t *WORD-VECTOR-PTR)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt heap | AC-Unsafe
-     corrupt mem | *Note POSIX Safety Concepts::.
-
-     Free the storage used for the word-strings and vector that
-     `*WORD-VECTOR-PTR' points to.  This does not free the structure
-     `*WORD-VECTOR-PTR' itself--only the other data it points to.
-
-
-File: libc.info,  Node: Flags for Wordexp,  Next: Wordexp Example,  Prev: Calling Wordexp,  Up: Word Expansion
-
-10.4.3 Flags for Word Expansion
--------------------------------
-
-This section describes the flags that you can specify in the FLAGS
-argument to `wordexp'.  Choose the flags you want, and combine them
-with the C operator `|'.
-
-`WRDE_APPEND'
-     Append the words from this expansion to the vector of words
-     produced by previous calls to `wordexp'.  This way you can
-     effectively expand several words as if they were concatenated with
-     spaces between them.
-
-     In order for appending to work, you must not modify the contents
-     of the word vector structure between calls to `wordexp'.  And, if
-     you set `WRDE_DOOFFS' in the first call to `wordexp', you must also
-     set it when you append to the results.
-
-`WRDE_DOOFFS'
-     Leave blank slots at the beginning of the vector of words.  The
-     `we_offs' field says how many slots to leave.  The blank slots
-     contain null pointers.
-
-`WRDE_NOCMD'
-     Don't do command substitution; if the input requests command
-     substitution, report an error.
-
-`WRDE_REUSE'
-     Reuse a word vector made by a previous call to `wordexp'.  Instead
-     of allocating a new vector of words, this call to `wordexp' will
-     use the vector that already exists (making it larger if necessary).
-
-     Note that the vector may move, so it is not safe to save an old
-     pointer and use it again after calling `wordexp'.  You must fetch
-     `we_pathv' anew after each call.
-
-`WRDE_SHOWERR'
-     Do show any error messages printed by commands run by command
-     substitution.  More precisely, allow these commands to inherit the
-     standard error output stream of the current process.  By default,
-     `wordexp' gives these commands a standard error stream that
-     discards all output.
-
-`WRDE_UNDEF'
-     If the input refers to a shell variable that is not defined,
-     report an error.
-
-
-File: libc.info,  Node: Wordexp Example,  Next: Tilde Expansion,  Prev: Flags for Wordexp,  Up: Word Expansion
-
-10.4.4 `wordexp' Example
-------------------------
-
-Here is an example of using `wordexp' to expand several strings and use
-the results to run a shell command.  It also shows the use of
-`WRDE_APPEND' to concatenate the expansions and of `wordfree' to free
-the space allocated by `wordexp'.
-
-     int
-     expand_and_execute (const char *program, const char **options)
-     {
-       wordexp_t result;
-       pid_t pid
-       int status, i;
-
-       /* Expand the string for the program to run.  */
-       switch (wordexp (program, &result, 0))
-         {
-         case 0:			/* Successful.  */
-           break;
-         case WRDE_NOSPACE:
-           /* If the error was `WRDE_NOSPACE',
-              then perhaps part of the result was allocated.  */
-           wordfree (&result);
-         default:                    /* Some other error.  */
-           return -1;
-         }
-
-       /* Expand the strings specified for the arguments.  */
-       for (i = 0; options[i] != NULL; i++)
-         {
-           if (wordexp (options[i], &result, WRDE_APPEND))
-             {
-               wordfree (&result);
-               return -1;
-             }
-         }
-
-       pid = fork ();
-       if (pid == 0)
-         {
-           /* This is the child process.  Execute the command. */
-           execv (result.we_wordv[0], result.we_wordv);
-           exit (EXIT_FAILURE);
-         }
-       else if (pid < 0)
-         /* The fork failed.  Report failure.  */
-         status = -1;
-       else
-         /* This is the parent process.  Wait for the child to complete.  */
-         if (waitpid (pid, &status, 0) != pid)
-           status = -1;
-
-       wordfree (&result);
-       return status;
-     }
-
-
-File: libc.info,  Node: Tilde Expansion,  Next: Variable Substitution,  Prev: Wordexp Example,  Up: Word Expansion
-
-10.4.5 Details of Tilde Expansion
----------------------------------
-
-It's a standard part of shell syntax that you can use `~' at the
-beginning of a file name to stand for your own home directory.  You can
-use `~USER' to stand for USER's home directory.
-
-   "Tilde expansion" is the process of converting these abbreviations
-to the directory names that they stand for.
-
-   Tilde expansion applies to the `~' plus all following characters up
-to whitespace or a slash.  It takes place only at the beginning of a
-word, and only if none of the characters to be transformed is quoted in
-any way.
-
-   Plain `~' uses the value of the environment variable `HOME' as the
-proper home directory name.  `~' followed by a user name uses
-`getpwname' to look up that user in the user database, and uses
-whatever directory is recorded there.  Thus, `~' followed by your own
-name can give different results from plain `~', if the value of `HOME'
-is not really your home directory.
-
-
-File: libc.info,  Node: Variable Substitution,  Prev: Tilde Expansion,  Up: Word Expansion
-
-10.4.6 Details of Variable Substitution
----------------------------------------
-
-Part of ordinary shell syntax is the use of `$VARIABLE' to substitute
-the value of a shell variable into a command.  This is called "variable
-substitution", and it is one part of doing word expansion.
-
-   There are two basic ways you can write a variable reference for
-substitution:
-
-`${VARIABLE}'
-     If you write braces around the variable name, then it is completely
-     unambiguous where the variable name ends.  You can concatenate
-     additional letters onto the end of the variable value by writing
-     them immediately after the close brace.  For example, `${foo}s'
-     expands into `tractors'.
-
-`$VARIABLE'
-     If you do not put braces around the variable name, then the
-     variable name consists of all the alphanumeric characters and
-     underscores that follow the `$'.  The next punctuation character
-     ends the variable name.  Thus, `$foo-bar' refers to the variable
-     `foo' and expands into `tractor-bar'.
-
-   When you use braces, you can also use various constructs to modify
-the value that is substituted, or test it in various ways.
-
-`${VARIABLE:-DEFAULT}'
-     Substitute the value of VARIABLE, but if that is empty or
-     undefined, use DEFAULT instead.
-
-`${VARIABLE:=DEFAULT}'
-     Substitute the value of VARIABLE, but if that is empty or
-     undefined, use DEFAULT instead and set the variable to DEFAULT.
-
-`${VARIABLE:?MESSAGE}'
-     If VARIABLE is defined and not empty, substitute its value.
-
-     Otherwise, print MESSAGE as an error message on the standard error
-     stream, and consider word expansion a failure.
-
-`${VARIABLE:+REPLACEMENT}'
-     Substitute REPLACEMENT, but only if VARIABLE is defined and
-     nonempty.  Otherwise, substitute nothing for this construct.
-
-`${#VARIABLE}'
-     Substitute a numeral which expresses in base ten the number of
-     characters in the value of VARIABLE.  `${#foo}' stands for `7',
-     because `tractor' is seven characters.
-
-   These variants of variable substitution let you remove part of the
-variable's value before substituting it.  The PREFIX and SUFFIX are not
-mere strings; they are wildcard patterns, just like the patterns that
-you use to match multiple file names.  But in this context, they match
-against parts of the variable value rather than against file names.
-
-`${VARIABLE%%SUFFIX}'
-     Substitute the value of VARIABLE, but first discard from that
-     variable any portion at the end that matches the pattern SUFFIX.
-
-     If there is more than one alternative for how to match against
-     SUFFIX, this construct uses the longest possible match.
-
-     Thus, `${foo%%r*}' substitutes `t', because the largest match for
-     `r*' at the end of `tractor' is `ractor'.
-
-`${VARIABLE%SUFFIX}'
-     Substitute the value of VARIABLE, but first discard from that
-     variable any portion at the end that matches the pattern SUFFIX.
-
-     If there is more than one alternative for how to match against
-     SUFFIX, this construct uses the shortest possible alternative.
-
-     Thus, `${foo%r*}' substitutes `tracto', because the shortest match
-     for `r*' at the end of `tractor' is just `r'.
-
-`${VARIABLE##PREFIX}'
-     Substitute the value of VARIABLE, but first discard from that
-     variable any portion at the beginning that matches the pattern
-     PREFIX.
-
-     If there is more than one alternative for how to match against
-     PREFIX, this construct uses the longest possible match.
-
-     Thus, `${foo##*t}' substitutes `or', because the largest match for
-     `*t' at the beginning of `tractor' is `tract'.
-
-`${VARIABLE#PREFIX}'
-     Substitute the value of VARIABLE, but first discard from that
-     variable any portion at the beginning that matches the pattern
-     PREFIX.
-
-     If there is more than one alternative for how to match against
-     PREFIX, this construct uses the shortest possible alternative.
-
-     Thus, `${foo#*t}' substitutes `ractor', because the shortest match
-     for `*t' at the beginning of `tractor' is just `t'.
-
-
-
-File: libc.info,  Node: I/O Overview,  Next: I/O on Streams,  Prev: Pattern Matching,  Up: Top
-
-11 Input/Output Overview
-************************
-
-Most programs need to do either input (reading data) or output (writing
-data), or most frequently both, in order to do anything useful.  The
-GNU C Library provides such a large selection of input and output
-functions that the hardest part is often deciding which function is most
-appropriate!
-
-   This chapter introduces concepts and terminology relating to input
-and output.  Other chapters relating to the GNU I/O facilities are:
-
-   * *note I/O on Streams::, which covers the high-level functions that
-     operate on streams, including formatted input and output.
-
-   * *note Low-Level I/O::, which covers the basic I/O and control
-     functions on file descriptors.
-
-   * *note File System Interface::, which covers functions for
-     operating on directories and for manipulating file attributes such
-     as access modes and ownership.
-
-   * *note Pipes and FIFOs::, which includes information on the basic
-     interprocess communication facilities.
-
-   * *note Sockets::, which covers a more complicated interprocess
-     communication facility with support for networking.
-
-   * *note Low-Level Terminal Interface::, which covers functions for
-     changing how input and output to terminals or other serial devices
-     are processed.
-
-* Menu:
-
-* I/O Concepts::       Some basic information and terminology.
-* File Names::         How to refer to a file.
-
-
-File: libc.info,  Node: I/O Concepts,  Next: File Names,  Up: I/O Overview
-
-11.1 Input/Output Concepts
-==========================
-
-Before you can read or write the contents of a file, you must establish
-a connection or communications channel to the file.  This process is
-called "opening" the file.  You can open a file for reading, writing,
-or both.  
-
-   The connection to an open file is represented either as a stream or
-as a file descriptor.  You pass this as an argument to the functions
-that do the actual read or write operations, to tell them which file to
-operate on.  Certain functions expect streams, and others are designed
-to operate on file descriptors.
-
-   When you have finished reading to or writing from the file, you can
-terminate the connection by "closing" the file.  Once you have closed a
-stream or file descriptor, you cannot do any more input or output
-operations on it.
-
-* Menu:
-
-* Streams and File Descriptors::    The GNU C Library provides two ways
-			             to access the contents of files.
-* File Position::                   The number of bytes from the
-                                     beginning of the file.
-
-
-File: libc.info,  Node: Streams and File Descriptors,  Next: File Position,  Up: I/O Concepts
-
-11.1.1 Streams and File Descriptors
------------------------------------
-
-When you want to do input or output to a file, you have a choice of two
-basic mechanisms for representing the connection between your program
-and the file: file descriptors and streams.  File descriptors are
-represented as objects of type `int', while streams are represented as
-`FILE *' objects.
-
-   File descriptors provide a primitive, low-level interface to input
-and output operations.  Both file descriptors and streams can represent
-a connection to a device (such as a terminal), or a pipe or socket for
-communicating with another process, as well as a normal file.  But, if
-you want to do control operations that are specific to a particular kind
-of device, you must use a file descriptor; there are no facilities to
-use streams in this way.  You must also use file descriptors if your
-program needs to do input or output in special modes, such as
-nonblocking (or polled) input (*note File Status Flags::).
-
-   Streams provide a higher-level interface, layered on top of the
-primitive file descriptor facilities.  The stream interface treats all
-kinds of files pretty much alike--the sole exception being the three
-styles of buffering that you can choose (*note Stream Buffering::).
-
-   The main advantage of using the stream interface is that the set of
-functions for performing actual input and output operations (as opposed
-to control operations) on streams is much richer and more powerful than
-the corresponding facilities for file descriptors.  The file descriptor
-interface provides only simple functions for transferring blocks of
-characters, but the stream interface also provides powerful formatted
-input and output functions (`printf' and `scanf') as well as functions
-for character- and line-oriented input and output.
-
-   Since streams are implemented in terms of file descriptors, you can
-extract the file descriptor from a stream and perform low-level
-operations directly on the file descriptor.  You can also initially open
-a connection as a file descriptor and then make a stream associated with
-that file descriptor.
-
-   In general, you should stick with using streams rather than file
-descriptors, unless there is some specific operation you want to do that
-can only be done on a file descriptor.  If you are a beginning
-programmer and aren't sure what functions to use, we suggest that you
-concentrate on the formatted input functions (*note Formatted Input::)
-and formatted output functions (*note Formatted Output::).
-
-   If you are concerned about portability of your programs to systems
-other than GNU, you should also be aware that file descriptors are not
-as portable as streams.  You can expect any system running ISO C to
-support streams, but non-GNU systems may not support file descriptors at
-all, or may only implement a subset of the GNU functions that operate on
-file descriptors.  Most of the file descriptor functions in the GNU C
-Library are included in the POSIX.1 standard, however.
-
-
-File: libc.info,  Node: File Position,  Prev: Streams and File Descriptors,  Up: I/O Concepts
-
-11.1.2 File Position
---------------------
-
-One of the attributes of an open file is its "file position" that keeps
-track of where in the file the next character is to be read or written.
-On GNU systems, and all POSIX.1 systems, the file position is simply an
-integer representing the number of bytes from the beginning of the file.
-
-   The file position is normally set to the beginning of the file when
-it is opened, and each time a character is read or written, the file
-position is incremented.  In other words, access to the file is normally
-"sequential".  
-
-   Ordinary files permit read or write operations at any position within
-the file.  Some other kinds of files may also permit this.  Files which
-do permit this are sometimes referred to as "random-access" files.  You
-can change the file position using the `fseek' function on a stream
-(*note File Positioning::) or the `lseek' function on a file descriptor
-(*note I/O Primitives::).  If you try to change the file position on a
-file that doesn't support random access, you get the `ESPIPE' error.  
-
-   Streams and descriptors that are opened for "append access" are
-treated specially for output: output to such files is _always_ appended
-sequentially to the _end_ of the file, regardless of the file position.
-However, the file position is still used to control where in the file
-reading is done.  
-
-   If you think about it, you'll realize that several programs can read
-a given file at the same time.  In order for each program to be able to
-read the file at its own pace, each program must have its own file
-pointer, which is not affected by anything the other programs do.
-
-   In fact, each opening of a file creates a separate file position.
-Thus, if you open a file twice even in the same program, you get two
-streams or descriptors with independent file positions.
-
-   By contrast, if you open a descriptor and then duplicate it to get
-another descriptor, these two descriptors share the same file position:
-changing the file position of one descriptor will affect the other.
-
-
-File: libc.info,  Node: File Names,  Prev: I/O Concepts,  Up: I/O Overview
-
-11.2 File Names
-===============
-
-In order to open a connection to a file, or to perform other operations
-such as deleting a file, you need some way to refer to the file.  Nearly
-all files have names that are strings--even files which are actually
-devices such as tape drives or terminals.  These strings are called
-"file names".  You specify the file name to say which file you want to
-open or operate on.
-
-   This section describes the conventions for file names and how the
-operating system works with them.  
-
-* Menu:
-
-* Directories::                 Directories contain entries for files.
-* File Name Resolution::        A file name specifies how to look up a file.
-* File Name Errors::            Error conditions relating to file names.
-* File Name Portability::       File name portability and syntax issues.
-
-
-File: libc.info,  Node: Directories,  Next: File Name Resolution,  Up: File Names
-
-11.2.1 Directories
-------------------
-
-In order to understand the syntax of file names, you need to understand
-how the file system is organized into a hierarchy of directories.
-
-   A "directory" is a file that contains information to associate other
-files with names; these associations are called "links" or "directory
-entries".  Sometimes, people speak of "files in a directory", but in
-reality, a directory only contains pointers to files, not the files
-themselves.
-
-   The name of a file contained in a directory entry is called a "file
-name component".  In general, a file name consists of a sequence of one
-or more such components, separated by the slash character (`/').  A
-file name which is just one component names a file with respect to its
-directory.  A file name with multiple components names a directory, and
-then a file in that directory, and so on.
-
-   Some other documents, such as the POSIX standard, use the term
-"pathname" for what we call a file name, and either "filename" or
-"pathname component" for what this manual calls a file name component.
-We don't use this terminology because a "path" is something completely
-different (a list of directories to search), and we think that
-"pathname" used for something else will confuse users.  We always use
-"file name" and "file name component" (or sometimes just "component",
-where the context is obvious) in GNU documentation.  Some macros use
-the POSIX terminology in their names, such as `PATH_MAX'.  These macros
-are defined by the POSIX standard, so we cannot change their names.
-
-   You can find more detailed information about operations on
-directories in *note File System Interface::.
-
-
-File: libc.info,  Node: File Name Resolution,  Next: File Name Errors,  Prev: Directories,  Up: File Names
-
-11.2.2 File Name Resolution
----------------------------
-
-A file name consists of file name components separated by slash (`/')
-characters.  On the systems that the GNU C Library supports, multiple
-successive `/' characters are equivalent to a single `/' character.
-
-   The process of determining what file a file name refers to is called
-"file name resolution".  This is performed by examining the components
-that make up a file name in left-to-right order, and locating each
-successive component in the directory named by the previous component.
-Of course, each of the files that are referenced as directories must
-actually exist, be directories instead of regular files, and have the
-appropriate permissions to be accessible by the process; otherwise the
-file name resolution fails.
-
-   If a file name begins with a `/', the first component in the file
-name is located in the "root directory" of the process (usually all
-processes on the system have the same root directory).  Such a file name
-is called an "absolute file name".
-
-   Otherwise, the first component in the file name is located in the
-current working directory (*note Working Directory::).  This kind of
-file name is called a "relative file name".
-
-   The file name components `.' ("dot") and `..' ("dot-dot") have
-special meanings.  Every directory has entries for these file name
-components.  The file name component `.' refers to the directory
-itself, while the file name component `..' refers to its "parent
-directory" (the directory that contains the link for the directory in
-question).  As a special case, `..' in the root directory refers to the
-root directory itself, since it has no parent; thus `/..' is the same
-as `/'.
-
-   Here are some examples of file names:
-
-`/a'
-     The file named `a', in the root directory.
-
-`/a/b'
-     The file named `b', in the directory named `a' in the root
-     directory.
-
-`a'
-     The file named `a', in the current working directory.
-
-`/a/./b'
-     This is the same as `/a/b'.
-
-`./a'
-     The file named `a', in the current working directory.
-
-`../a'
-     The file named `a', in the parent directory of the current working
-     directory.
-
-   A file name that names a directory may optionally end in a `/'.  You
-can specify a file name of `/' to refer to the root directory, but the
-empty string is not a meaningful file name.  If you want to refer to
-the current working directory, use a file name of `.' or `./'.
-
-   Unlike some other operating systems, GNU systems don't have any
-built-in support for file types (or extensions) or file versions as part
-of its file name syntax.  Many programs and utilities use conventions
-for file names--for example, files containing C source code usually
-have names suffixed with `.c'--but there is nothing in the file system
-itself that enforces this kind of convention.
-
-
-File: libc.info,  Node: File Name Errors,  Next: File Name Portability,  Prev: File Name Resolution,  Up: File Names
-
-11.2.3 File Name Errors
------------------------
-
-Functions that accept file name arguments usually detect these `errno'
-error conditions relating to the file name syntax or trouble finding
-the named file.  These errors are referred to throughout this manual as
-the "usual file name errors".
-
-`EACCES'
-     The process does not have search permission for a directory
-     component of the file name.
-
-`ENAMETOOLONG'
-     This error is used when either the total length of a file name is
-     greater than `PATH_MAX', or when an individual file name component
-     has a length greater than `NAME_MAX'.  *Note Limits for Files::.
-
-     On GNU/Hurd systems, there is no imposed limit on overall file name
-     length, but some file systems may place limits on the length of a
-     component.
-
-`ENOENT'
-     This error is reported when a file referenced as a directory
-     component in the file name doesn't exist, or when a component is a
-     symbolic link whose target file does not exist.  *Note Symbolic
-     Links::.
-
-`ENOTDIR'
-     A file that is referenced as a directory component in the file name
-     exists, but it isn't a directory.
-
-`ELOOP'
-     Too many symbolic links were resolved while trying to look up the
-     file name.  The system has an arbitrary limit on the number of
-     symbolic links that may be resolved in looking up a single file
-     name, as a primitive way to detect loops.  *Note Symbolic Links::.
-
-
-File: libc.info,  Node: File Name Portability,  Prev: File Name Errors,  Up: File Names
-
-11.2.4 Portability of File Names
---------------------------------
-
-The rules for the syntax of file names discussed in *note File Names::,
-are the rules normally used by GNU systems and by other POSIX systems.
-However, other operating systems may use other conventions.
-
-   There are two reasons why it can be important for you to be aware of
-file name portability issues:
-
-   * If your program makes assumptions about file name syntax, or
-     contains embedded literal file name strings, it is more difficult
-     to get it to run under other operating systems that use different
-     syntax conventions.
-
-   * Even if you are not concerned about running your program on
-     machines that run other operating systems, it may still be
-     possible to access files that use different naming conventions.
-     For example, you may be able to access file systems on another
-     computer running a different operating system over a network, or
-     read and write disks in formats used by other operating systems.
-
-   The ISO C standard says very little about file name syntax, only that
-file names are strings.  In addition to varying restrictions on the
-length of file names and what characters can validly appear in a file
-name, different operating systems use different conventions and syntax
-for concepts such as structured directories and file types or
-extensions.  Some concepts such as file versions might be supported in
-some operating systems and not by others.
-
-   The POSIX.1 standard allows implementations to put additional
-restrictions on file name syntax, concerning what characters are
-permitted in file names and on the length of file name and file name
-component strings.  However, on GNU systems, any character except the
-null character is permitted in a file name string, and on GNU/Hurd
-systems there are no limits on the length of file name strings.
-
-
-File: libc.info,  Node: I/O on Streams,  Next: Low-Level I/O,  Prev: I/O Overview,  Up: Top
-
-12 Input/Output on Streams
-**************************
-
-This chapter describes the functions for creating streams and performing
-input and output operations on them.  As discussed in *note I/O
-Overview::, a stream is a fairly abstract, high-level concept
-representing a communications channel to a file, device, or process.
-
-* Menu:
-
-* Streams::                     About the data type representing a stream.
-* Standard Streams::            Streams to the standard input and output
-				 devices are created for you.
-* Opening Streams::             How to create a stream to talk to a file.
-* Closing Streams::             Close a stream when you are finished with it.
-* Streams and Threads::         Issues with streams in threaded programs.
-* Streams and I18N::            Streams in internationalized applications.
-* Simple Output::               Unformatted output by characters and lines.
-* Character Input::             Unformatted input by characters and words.
-* Line Input::                  Reading a line or a record from a stream.
-* Unreading::                   Peeking ahead/pushing back input just read.
-* Block Input/Output::          Input and output operations on blocks of data.
-* Formatted Output::            `printf' and related functions.
-* Customizing Printf::          You can define new conversion specifiers for
-				 `printf' and friends.
-* Formatted Input::             `scanf' and related functions.
-* EOF and Errors::              How you can tell if an I/O error happens.
-* Error Recovery::		What you can do about errors.
-* Binary Streams::              Some systems distinguish between text files
-				 and binary files.
-* File Positioning::            About random-access streams.
-* Portable Positioning::        Random access on peculiar ISO C systems.
-* Stream Buffering::            How to control buffering of streams.
-* Other Kinds of Streams::      Streams that do not necessarily correspond
-				 to an open file.
-* Formatted Messages::          Print strictly formatted messages.
-
-
-File: libc.info,  Node: Streams,  Next: Standard Streams,  Up: I/O on Streams
-
-12.1 Streams
-============
-
-For historical reasons, the type of the C data structure that represents
-a stream is called `FILE' rather than "stream".  Since most of the
-library functions deal with objects of type `FILE *', sometimes the
-term "file pointer" is also used to mean "stream".  This leads to
-unfortunate confusion over terminology in many books on C.  This
-manual, however, is careful to use the terms "file" and "stream" only
-in the technical sense.  
-
-   The `FILE' type is declared in the header file `stdio.h'.
-
- -- Data Type: FILE
-     This is the data type used to represent stream objects.  A `FILE'
-     object holds all of the internal state information about the
-     connection to the associated file, including such things as the
-     file position indicator and buffering information.  Each stream
-     also has error and end-of-file status indicators that can be
-     tested with the `ferror' and `feof' functions; see *note EOF and
-     Errors::.
-
-   `FILE' objects are allocated and managed internally by the
-input/output library functions.  Don't try to create your own objects of
-type `FILE'; let the library do it.  Your programs should deal only
-with pointers to these objects (that is, `FILE *' values) rather than
-the objects themselves.
-
-
-File: libc.info,  Node: Standard Streams,  Next: Opening Streams,  Prev: Streams,  Up: I/O on Streams
-
-12.2 Standard Streams
-=====================
-
-When the `main' function of your program is invoked, it already has
-three predefined streams open and available for use.  These represent
-the "standard" input and output channels that have been established for
-the process.
-
-   These streams are declared in the header file `stdio.h'.  
-
- -- Variable: FILE * stdin
-     The "standard input" stream, which is the normal source of input
-     for the program.
-   
- -- Variable: FILE * stdout
-     The "standard output" stream, which is used for normal output from
-     the program.
-   
- -- Variable: FILE * stderr
-     The "standard error" stream, which is used for error messages and
-     diagnostics issued by the program.
-   
-   On GNU systems, you can specify what files or processes correspond to
-these streams using the pipe and redirection facilities provided by the
-shell.  (The primitives shells use to implement these facilities are
-described in *note File System Interface::.)  Most other operating
-systems provide similar mechanisms, but the details of how to use them
-can vary.
-
-   In the GNU C Library, `stdin', `stdout', and `stderr' are normal
-variables which you can set just like any others.  For example, to
-redirect the standard output to a file, you could do:
-
-     fclose (stdout);
-     stdout = fopen ("standard-output-file", "w");
-
-   Note however, that in other systems `stdin', `stdout', and `stderr'
-are macros that you cannot assign to in the normal way.  But you can
-use `freopen' to get the effect of closing one and reopening it.  *Note
-Opening Streams::.
-
-   The three streams `stdin', `stdout', and `stderr' are not unoriented
-at program start (*note Streams and I18N::).
-
-
-File: libc.info,  Node: Opening Streams,  Next: Closing Streams,  Prev: Standard Streams,  Up: I/O on Streams
-
-12.3 Opening Streams
-====================
-
-Opening a file with the `fopen' function creates a new stream and
-establishes a connection between the stream and a file.  This may
-involve creating a new file.
-
-   Everything described in this section is declared in the header file
-`stdio.h'.
-
- -- Function: FILE * fopen (const char *FILENAME, const char *OPENTYPE)
-     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe mem fd
-     lock | *Note POSIX Safety Concepts::.
-
-     The `fopen' function opens a stream for I/O to the file FILENAME,
-     and returns a pointer to the stream.
-
-     The OPENTYPE argument is a string that controls how the file is
-     opened and specifies attributes of the resulting stream.  It must
-     begin with one of the following sequences of characters:
-
-    `r'
-          Open an existing file for reading only.
-
-    `w'
-          Open the file for writing only.  If the file already exists,
-          it is truncated to zero length.  Otherwise a new file is
-          created.
-
-    `a'
-          Open a file for append access; that is, writing at the end of
-          file only.  If the file already exists, its initial contents
-          are unchanged and output to the stream is appended to the end
-          of the file.  Otherwise, a new, empty file is created.
-
-    `r+'
-          Open an existing file for both reading and writing.  The
-          initial contents of the file are unchanged and the initial
-          file position is at the beginning of the file.
-
-    `w+'
-          Open a file for both reading and writing.  If the file
-          already exists, it is truncated to zero length.  Otherwise, a
-          new file is created.
-
-    `a+'
-          Open or create file for both reading and appending.  If the
-          file exists, its initial contents are unchanged.  Otherwise,
-          a new file is created.  The initial file position for reading
-          is at the beginning of the file, but output is always
-          appended to the end of the file.
-
-     As you can see, `+' requests a stream that can do both input and
-     output.  When using such a stream, you must call `fflush' (*note
-     Stream Buffering::) or a file positioning function such as `fseek'
-     (*note File Positioning::) when switching from reading to writing
-     or vice versa.  Otherwise, internal buffers might not be emptied
-     properly.
-
-     Additional characters may appear after these to specify flags for
-     the call.  Always put the mode (`r', `w+', etc.) first; that is
-     the only part you are guaranteed will be understood by all systems.
-
-     The GNU C Library defines additional characters for use in
-     OPENTYPE:
-
-    `c'
-          The file is opened with cancellation in the I/O functions
-          disabled.
-
-    `e'
-          The underlying file descriptor will be closed if you use any
-          of the `exec...' functions (*note Executing a File::).  (This
-          is equivalent to having set `FD_CLOEXEC' on that descriptor.
-          *Note Descriptor Flags::.)
-
-    `m'
-          The file is opened and accessed using `mmap'.  This is only
-          supported with files opened for reading.
-
-    `x'
-          Insist on creating a new file--if a file FILENAME already
-          exists, `fopen' fails rather than opening it.  If you use `x'
-          you are guaranteed that you will not clobber an existing
-          file.  This is equivalent to the `O_EXCL' option to the
-          `open' function (*note Opening and Closing Files::).
-
-          The `x' modifier is part of ISO C11.
-
-     The character `b' in OPENTYPE has a standard meaning; it requests
-     a binary stream rather than a text stream.  But this makes no
-     difference in POSIX systems (including GNU systems).  If both `+'
-     and `b' are specified, they can appear in either order.  *Note
-     Binary Streams::.
-
-     If the OPENTYPE string contains the sequence `,ccs=STRING' then
-     STRING is taken as the name of a coded character set and `fopen'
-     will mark the stream as wide-oriented with appropriate conversion
-     functions in place to convert from and to the character set
-     STRING.  Any other stream is opened initially unoriented and the
-     orientation is decided with the first file operation.  If the
-     first operation is a wide character operation, the stream is not
-     only marked as wide-oriented, also the conversion functions to
-     convert to the coded character set used for the current locale are
-     loaded.  This will not change anymore from this point on even if
-     the locale selected for the `LC_CTYPE' category is changed.
-
-     Any other characters in OPENTYPE are simply ignored.  They may be
-     meaningful in other systems.
-
-     If the open fails, `fopen' returns a null pointer.
-
-     When the sources are compiling with `_FILE_OFFSET_BITS == 64' on a
-     32 bit machine this function is in fact `fopen64' since the LFS
-     interface replaces transparently the old interface.
-
-   You can have multiple streams (or file descriptors) pointing to the
-same file open at the same time.  If you do only input, this works
-straightforwardly, but you must be careful if any output streams are
-included.  *Note Stream/Descriptor Precautions::.  This is equally true
-whether the streams are in one program (not usual) or in several
-programs (which can easily happen).  It may be advantageous to use the
-file locking facilities to avoid simultaneous access.  *Note File
-Locks::.
-
- -- Function: FILE * fopen64 (const char *FILENAME, const char
-          *OPENTYPE)
-     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe mem fd
-     lock | *Note POSIX Safety Concepts::.
-
-     This function is similar to `fopen' but the stream it returns a
-     pointer for is opened using `open64'.  Therefore this stream can be
-     used even on files larger than 2^31 bytes on 32 bit machines.
-
-     Please note that the return type is still `FILE *'.  There is no
-     special `FILE' type for the LFS interface.
-
-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32
-     bits machine this function is available under the name `fopen' and
-     so transparently replaces the old interface.
-
- -- Macro: int FOPEN_MAX
-     The value of this macro is an integer constant expression that
-     represents the minimum number of streams that the implementation
-     guarantees can be open simultaneously.  You might be able to open
-     more than this many streams, but that is not guaranteed.  The
-     value of this constant is at least eight, which includes the three
-     standard streams `stdin', `stdout', and `stderr'.  In POSIX.1
-     systems this value is determined by the `OPEN_MAX' parameter;
-     *note General Limits::.  In BSD and GNU, it is controlled by the
-     `RLIMIT_NOFILE' resource limit; *note Limits on Resources::.
-
- -- Function: FILE * freopen (const char *FILENAME, const char
-          *OPENTYPE, FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt fd
-     | *Note POSIX Safety Concepts::.
-
-     This function is like a combination of `fclose' and `fopen'.  It
-     first closes the stream referred to by STREAM, ignoring any errors
-     that are detected in the process.  (Because errors are ignored,
-     you should not use `freopen' on an output stream if you have
-     actually done any output using the stream.)  Then the file named by
-     FILENAME is opened with mode OPENTYPE as for `fopen', and
-     associated with the same stream object STREAM.
-
-     If the operation fails, a null pointer is returned; otherwise,
-     `freopen' returns STREAM.
-
-     `freopen' has traditionally been used to connect a standard stream
-     such as `stdin' with a file of your own choice.  This is useful in
-     programs in which use of a standard stream for certain purposes is
-     hard-coded.  In the GNU C Library, you can simply close the
-     standard streams and open new ones with `fopen'.  But other
-     systems lack this ability, so using `freopen' is more portable.
-
-     When the sources are compiling with `_FILE_OFFSET_BITS == 64' on a
-     32 bit machine this function is in fact `freopen64' since the LFS
-     interface replaces transparently the old interface.
-
- -- Function: FILE * freopen64 (const char *FILENAME, const char
-          *OPENTYPE, FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt fd
-     | *Note POSIX Safety Concepts::.
-
-     This function is similar to `freopen'.  The only difference is that
-     on 32 bit machine the stream returned is able to read beyond the
-     2^31 bytes limits imposed by the normal interface.  It should be
-     noted that the stream pointed to by STREAM need not be opened
-     using `fopen64' or `freopen64' since its mode is not important for
-     this function.
-
-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32
-     bits machine this function is available under the name `freopen'
-     and so transparently replaces the old interface.
-
-   In some situations it is useful to know whether a given stream is
-available for reading or writing.  This information is normally not
-available and would have to be remembered separately.  Solaris
-introduced a few functions to get this information from the stream
-descriptor and these functions are also available in the GNU C Library.
-
- -- Function: int __freadable (FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `__freadable' function determines whether the stream STREAM
-     was opened to allow reading.  In this case the return value is
-     nonzero.  For write-only streams the function returns zero.
-
-     This function is declared in `stdio_ext.h'.
-
- -- Function: int __fwritable (FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `__fwritable' function determines whether the stream STREAM
-     was opened to allow writing.  In this case the return value is
-     nonzero.  For read-only streams the function returns zero.
-
-     This function is declared in `stdio_ext.h'.
-
-   For slightly different kind of problems there are two more functions.
-They provide even finer-grained information.
-
- -- Function: int __freading (FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `__freading' function determines whether the stream STREAM was
-     last read from or whether it is opened read-only.  In this case
-     the return value is nonzero, otherwise it is zero.  Determining
-     whether a stream opened for reading and writing was last used for
-     writing allows to draw conclusions about the content about the
-     buffer, among other things.
-
-     This function is declared in `stdio_ext.h'.
-
- -- Function: int __fwriting (FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `__fwriting' function determines whether the stream STREAM was
-     last written to or whether it is opened write-only.  In this case
-     the return value is nonzero, otherwise it is zero.
-
-     This function is declared in `stdio_ext.h'.
-
-
-File: libc.info,  Node: Closing Streams,  Next: Streams and Threads,  Prev: Opening Streams,  Up: I/O on Streams
-
-12.4 Closing Streams
-====================
-
-When a stream is closed with `fclose', the connection between the
-stream and the file is canceled.  After you have closed a stream, you
-cannot perform any additional operations on it.
-
- -- Function: int fclose (FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe lock mem
-     fd | *Note POSIX Safety Concepts::.
-
-     This function causes STREAM to be closed and the connection to the
-     corresponding file to be broken.  Any buffered output is written
-     and any buffered input is discarded.  The `fclose' function returns
-     a value of `0' if the file was closed successfully, and `EOF' if
-     an error was detected.
-
-     It is important to check for errors when you call `fclose' to close
-     an output stream, because real, everyday errors can be detected at
-     this time.  For example, when `fclose' writes the remaining
-     buffered output, it might get an error because the disk is full.
-     Even if you know the buffer is empty, errors can still occur when
-     closing a file if you are using NFS.
-
-     The function `fclose' is declared in `stdio.h'.
-
-   To close all streams currently available the GNU C Library provides
-another function.
-
- -- Function: int fcloseall (void)
-     Preliminary: | MT-Unsafe race:streams | AS-Unsafe | AC-Safe |
-     *Note POSIX Safety Concepts::.
-
-     This function causes all open streams of the process to be closed
-     and the connection to corresponding files to be broken.  All
-     buffered data is written and any buffered input is discarded.  The
-     `fcloseall' function returns a value of `0' if all the files were
-     closed successfully, and `EOF' if an error was detected.
-
-     This function should be used only in special situations, e.g.,
-     when an error occurred and the program must be aborted.  Normally
-     each single stream should be closed separately so that problems
-     with individual streams can be identified.  It is also problematic
-     since the standard streams (*note Standard Streams::) will also be
-     closed.
-
-     The function `fcloseall' is declared in `stdio.h'.
-
-   If the `main' function to your program returns, or if you call the
-`exit' function (*note Normal Termination::), all open streams are
-automatically closed properly.  If your program terminates in any other
-manner, such as by calling the `abort' function (*note Aborting a
-Program::) or from a fatal signal (*note Signal Handling::), open
-streams might not be closed properly.  Buffered output might not be
-flushed and files may be incomplete.  For more information on buffering
-of streams, see *note Stream Buffering::.
-
-
-File: libc.info,  Node: Streams and Threads,  Next: Streams and I18N,  Prev: Closing Streams,  Up: I/O on Streams
-
-12.5 Streams and Threads
-========================
-
-Streams can be used in multi-threaded applications in the same way they
-are used in single-threaded applications.  But the programmer must be
-aware of the possible complications.  It is important to know about
-these also if the program one writes never use threads since the design
-and implementation of many stream functions is heavily influenced by the
-requirements added by multi-threaded programming.
-
-   The POSIX standard requires that by default the stream operations are
-atomic.  I.e., issuing two stream operations for the same stream in two
-threads at the same time will cause the operations to be executed as if
-they were issued sequentially.  The buffer operations performed while
-reading or writing are protected from other uses of the same stream.  To
-do this each stream has an internal lock object which has to be
-(implicitly) acquired before any work can be done.
-
-   But there are situations where this is not enough and there are also
-situations where this is not wanted.  The implicit locking is not enough
-if the program requires more than one stream function call to happen
-atomically.  One example would be if an output line a program wants to
-generate is created by several function calls.  The functions by
-themselves would ensure only atomicity of their own operation, but not
-atomicity over all the function calls.  For this it is necessary to
-perform the stream locking in the application code.
-
- -- Function: void flockfile (FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Unsafe lock | *Note POSIX
-     Safety Concepts::.
-
-     The `flockfile' function acquires the internal locking object
-     associated with the stream STREAM.  This ensures that no other
-     thread can explicitly through `flockfile'/`ftrylockfile' or
-     implicit through a call of a stream function lock the stream.  The
-     thread will block until the lock is acquired.  An explicit call to
-     `funlockfile' has to be used to release the lock.
-
- -- Function: int ftrylockfile (FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Unsafe lock | *Note POSIX
-     Safety Concepts::.
-
-     The `ftrylockfile' function tries to acquire the internal locking
-     object associated with the stream STREAM just like `flockfile'.
-     But unlike `flockfile' this function does not block if the lock is
-     not available.  `ftrylockfile' returns zero if the lock was
-     successfully acquired.  Otherwise the stream is locked by another
-     thread.
-
- -- Function: void funlockfile (FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Unsafe lock | *Note POSIX
-     Safety Concepts::.
-
-     The `funlockfile' function releases the internal locking object of
-     the stream STREAM. The stream must have been locked before by a
-     call to `flockfile' or a successful call of `ftrylockfile'.  The
-     implicit locking performed by the stream operations do not count.
-     The `funlockfile' function does not return an error status and the
-     behavior of a call for a stream which is not locked by the current
-     thread is undefined.
-
-   The following example shows how the functions above can be used to
-generate an output line atomically even in multi-threaded applications
-(yes, the same job could be done with one `fprintf' call but it is
-sometimes not possible):
-
-     FILE *fp;
-     {
-        ...
-        flockfile (fp);
-        fputs ("This is test number ", fp);
-        fprintf (fp, "%d\n", test);
-        funlockfile (fp)
-     }
-
-   Without the explicit locking it would be possible for another thread
-to use the stream FP after the `fputs' call return and before `fprintf'
-was called with the result that the number does not follow the word
-`number'.
-
-   From this description it might already be clear that the locking
-objects in streams are no simple mutexes.  Since locking the same
-stream twice in the same thread is allowed the locking objects must be
-equivalent to recursive mutexes.  These mutexes keep track of the owner
-and the number of times the lock is acquired.  The same number of
-`funlockfile' calls by the same threads is necessary to unlock the
-stream completely.  For instance:
-
-     void
-     foo (FILE *fp)
-     {
-       ftrylockfile (fp);
-       fputs ("in foo\n", fp);
-       /* This is very wrong!!!  */
-       funlockfile (fp);
-     }
-
-   It is important here that the `funlockfile' function is only called
-if the `ftrylockfile' function succeeded in locking the stream.  It is
-therefore always wrong to ignore the result of `ftrylockfile'.  And it
-makes no sense since otherwise one would use `flockfile'.  The result
-of code like that above is that either `funlockfile' tries to free a
-stream that hasn't been locked by the current thread or it frees the
-stream prematurely.  The code should look like this:
-
-     void
-     foo (FILE *fp)
-     {
-       if (ftrylockfile (fp) == 0)
-         {
-           fputs ("in foo\n", fp);
-           funlockfile (fp);
-         }
-     }
-
-   Now that we covered why it is necessary to have these locking it is
-necessary to talk about situations when locking is unwanted and what can
-be done.  The locking operations (explicit or implicit) don't come for
-free.  Even if a lock is not taken the cost is not zero.  The operations
-which have to be performed require memory operations that are safe in
-multi-processor environments.  With the many local caches involved in
-such systems this is quite costly.  So it is best to avoid the locking
-completely if it is not needed - because the code in question is never
-used in a context where two or more threads may use a stream at a time.
-This can be determined most of the time for application code; for
-library code which can be used in many contexts one should default to be
-conservative and use locking.
-
-   There are two basic mechanisms to avoid locking.  The first is to use
-the `_unlocked' variants of the stream operations.  The POSIX standard
-defines quite a few of those and the GNU C Library adds a few more.
-These variants of the functions behave just like the functions with the
-name without the suffix except that they do not lock the stream.  Using
-these functions is very desirable since they are potentially much
-faster.  This is not only because the locking operation itself is
-avoided.  More importantly, functions like `putc' and `getc' are very
-simple and traditionally (before the introduction of threads) were
-implemented as macros which are very fast if the buffer is not empty.
-With the addition of locking requirements these functions are no longer
-implemented as macros since they would expand to too much code.  But
-these macros are still available with the same functionality under the
-new names `putc_unlocked' and `getc_unlocked'.  This possibly huge
-difference of speed also suggests the use of the `_unlocked' functions
-even if locking is required.  The difference is that the locking then
-has to be performed in the program:
-
-     void
-     foo (FILE *fp, char *buf)
-     {
-       flockfile (fp);
-       while (*buf != '/')
-         putc_unlocked (*buf++, fp);
-       funlockfile (fp);
-     }
-
-   If in this example the `putc' function would be used and the
-explicit locking would be missing the `putc' function would have to
-acquire the lock in every call, potentially many times depending on when
-the loop terminates.  Writing it the way illustrated above allows the
-`putc_unlocked' macro to be used which means no locking and direct
-manipulation of the buffer of the stream.
-
-   A second way to avoid locking is by using a non-standard function
-which was introduced in Solaris and is available in the GNU C Library
-as well.
-
- -- Function: int __fsetlocking (FILE *STREAM, int TYPE)
-     Preliminary: | MT-Safe race:stream | AS-Unsafe lock | AC-Safe |
-     *Note POSIX Safety Concepts::.
-
-     The `__fsetlocking' function can be used to select whether the
-     stream operations will implicitly acquire the locking object of the
-     stream STREAM.  By default this is done but it can be disabled and
-     reinstated using this function.  There are three values defined
-     for the TYPE parameter.
-
-    `FSETLOCKING_INTERNAL'
-          The stream `stream' will from now on use the default internal
-          locking.  Every stream operation with exception of the
-          `_unlocked' variants will implicitly lock the stream.
-
-    `FSETLOCKING_BYCALLER'
-          After the `__fsetlocking' function returns the user is
-          responsible for locking the stream.  None of the stream
-          operations will implicitly do this anymore until the state is
-          set back to `FSETLOCKING_INTERNAL'.
-
-    `FSETLOCKING_QUERY'
-          `__fsetlocking' only queries the current locking state of the
-          stream.  The return value will be `FSETLOCKING_INTERNAL' or
-          `FSETLOCKING_BYCALLER' depending on the state.
-
-     The return value of `__fsetlocking' is either
-     `FSETLOCKING_INTERNAL' or `FSETLOCKING_BYCALLER' depending on the
-     state of the stream before the call.
-
-     This function and the values for the TYPE parameter are declared
-     in `stdio_ext.h'.
-
-   This function is especially useful when program code has to be used
-which is written without knowledge about the `_unlocked' functions (or
-if the programmer was too lazy to use them).
-
-
-File: libc.info,  Node: Streams and I18N,  Next: Simple Output,  Prev: Streams and Threads,  Up: I/O on Streams
-
-12.6 Streams in Internationalized Applications
-==============================================
-
-ISO C90 introduced the new type `wchar_t' to allow handling larger
-character sets.  What was missing was a possibility to output strings
-of `wchar_t' directly.  One had to convert them into multibyte strings
-using `mbstowcs' (there was no `mbsrtowcs' yet) and then use the normal
-stream functions.  While this is doable it is very cumbersome since
-performing the conversions is not trivial and greatly increases program
-complexity and size.
-
-   The Unix standard early on (I think in XPG4.2) introduced two
-additional format specifiers for the `printf' and `scanf' families of
-functions.  Printing and reading of single wide characters was made
-possible using the `%C' specifier and wide character strings can be
-handled with `%S'.  These modifiers behave just like `%c' and `%s' only
-that they expect the corresponding argument to have the wide character
-type and that the wide character and string are transformed into/from
-multibyte strings before being used.
-
-   This was a beginning but it is still not good enough.  Not always is
-it desirable to use `printf' and `scanf'.  The other, smaller and
-faster functions cannot handle wide characters.  Second, it is not
-possible to have a format string for `printf' and `scanf' consisting of
-wide characters.  The result is that format strings would have to be
-generated if they have to contain non-basic characters.
-
-   In the Amendment 1 to ISO C90 a whole new set of functions was added
-to solve the problem.  Most of the stream functions got a counterpart
-which take a wide character or wide character string instead of a
-character or string respectively.  The new functions operate on the
-same streams (like `stdout').  This is different from the model of the
-C++ runtime library where separate streams for wide and normal I/O are
-used.
-
-   Being able to use the same stream for wide and normal operations
-comes with a restriction: a stream can be used either for wide
-operations or for normal operations.  Once it is decided there is no
-way back.  Only a call to `freopen' or `freopen64' can reset the
-"orientation".  The orientation can be decided in three ways:
-
-   * If any of the normal character functions is used (this includes the
-     `fread' and `fwrite' functions) the stream is marked as not wide
-     oriented.
-
-   * If any of the wide character functions is used the stream is
-     marked as wide oriented.
-
-   * The `fwide' function can be used to set the orientation either way.
-
-   It is important to never mix the use of wide and not wide operations
-on a stream.  There are no diagnostics issued.  The application behavior
-will simply be strange or the application will simply crash.  The
-`fwide' function can help avoiding this.
-
- -- Function: int fwide (FILE *STREAM, int MODE)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock |
-     *Note POSIX Safety Concepts::.
-
-     The `fwide' function can be used to set and query the state of the
-     orientation of the stream STREAM.  If the MODE parameter has a
-     positive value the streams get wide oriented, for negative values
-     narrow oriented.  It is not possible to overwrite previous
-     orientations with `fwide'.  I.e., if the stream STREAM was already
-     oriented before the call nothing is done.
-
-     If MODE is zero the current orientation state is queried and
-     nothing is changed.
-
-     The `fwide' function returns a negative value, zero, or a positive
-     value if the stream is narrow, not at all, or wide oriented
-     respectively.
-
-     This function was introduced in Amendment 1 to ISO C90 and is
-     declared in `wchar.h'.
-
-   It is generally a good idea to orient a stream as early as possible.
-This can prevent surprise especially for the standard streams `stdin',
-`stdout', and `stderr'.  If some library function in some situations
-uses one of these streams and this use orients the stream in a
-different way the rest of the application expects it one might end up
-with hard to reproduce errors.  Remember that no errors are signal if
-the streams are used incorrectly.  Leaving a stream unoriented after
-creation is normally only necessary for library functions which create
-streams which can be used in different contexts.
-
-   When writing code which uses streams and which can be used in
-different contexts it is important to query the orientation of the
-stream before using it (unless the rules of the library interface
-demand a specific orientation).  The following little, silly function
-illustrates this.
-
-     void
-     print_f (FILE *fp)
-     {
-       if (fwide (fp, 0) > 0)
-         /* Positive return value means wide orientation.  */
-         fputwc (L'f', fp);
-       else
-         fputc ('f', fp);
-     }
-
-   Note that in this case the function `print_f' decides about the
-orientation of the stream if it was unoriented before (will not happen
-if the advise above is followed).
-
-   The encoding used for the `wchar_t' values is unspecified and the
-user must not make any assumptions about it.  For I/O of `wchar_t'
-values this means that it is impossible to write these values directly
-to the stream.  This is not what follows from the ISO C locale model
-either.  What happens instead is that the bytes read from or written to
-the underlying media are first converted into the internal encoding
-chosen by the implementation for `wchar_t'.  The external encoding is
-determined by the `LC_CTYPE' category of the current locale or by the
-`ccs' part of the mode specification given to `fopen', `fopen64',
-`freopen', or `freopen64'.  How and when the conversion happens is
-unspecified and it happens invisible to the user.
-
-   Since a stream is created in the unoriented state it has at that
-point no conversion associated with it.  The conversion which will be
-used is determined by the `LC_CTYPE' category selected at the time the
-stream is oriented.  If the locales are changed at the runtime this
-might produce surprising results unless one pays attention.  This is
-just another good reason to orient the stream explicitly as soon as
-possible, perhaps with a call to `fwide'.
-
-
-File: libc.info,  Node: Simple Output,  Next: Character Input,  Prev: Streams and I18N,  Up: I/O on Streams
-
-12.7 Simple Output by Characters or Lines
-=========================================
-
-This section describes functions for performing character- and
-line-oriented output.
-
-   These narrow streams functions are declared in the header file
-`stdio.h' and the wide stream functions in `wchar.h'.  
-
- -- Function: int fputc (int C, FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
-     | *Note POSIX Safety Concepts::.
-
-     The `fputc' function converts the character C to type `unsigned
-     char', and writes it to the stream STREAM.  `EOF' is returned if a
-     write error occurs; otherwise the character C is returned.
-
- -- Function: wint_t fputwc (wchar_t WC, FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
-     | *Note POSIX Safety Concepts::.
-
-     The `fputwc' function writes the wide character WC to the stream
-     STREAM.  `WEOF' is returned if a write error occurs; otherwise the
-     character WC is returned.
-
- -- Function: int fputc_unlocked (int C, FILE *STREAM)
-     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `fputc_unlocked' function is equivalent to the `fputc'
-     function except that it does not implicitly lock the stream.
-
- -- Function: wint_t fputwc_unlocked (wchar_t WC, FILE *STREAM)
-     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `fputwc_unlocked' function is equivalent to the `fputwc'
-     function except that it does not implicitly lock the stream.
-
-     This function is a GNU extension.
-
- -- Function: int putc (int C, FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
-     | *Note POSIX Safety Concepts::.
-
-     This is just like `fputc', except that most systems implement it as
-     a macro, making it faster.  One consequence is that it may
-     evaluate the STREAM argument more than once, which is an exception
-     to the general rule for macros.  `putc' is usually the best
-     function to use for writing a single character.
-
- -- Function: wint_t putwc (wchar_t WC, FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
-     | *Note POSIX Safety Concepts::.
-
-     This is just like `fputwc', except that it can be implement as a
-     macro, making it faster.  One consequence is that it may evaluate
-     the STREAM argument more than once, which is an exception to the
-     general rule for macros.  `putwc' is usually the best function to
-     use for writing a single wide character.
-
- -- Function: int putc_unlocked (int C, FILE *STREAM)
-     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `putc_unlocked' function is equivalent to the `putc' function
-     except that it does not implicitly lock the stream.
-
- -- Function: wint_t putwc_unlocked (wchar_t WC, FILE *STREAM)
-     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `putwc_unlocked' function is equivalent to the `putwc'
-     function except that it does not implicitly lock the stream.
-
-     This function is a GNU extension.
-
- -- Function: int putchar (int C)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
-     | *Note POSIX Safety Concepts::.
-
-     The `putchar' function is equivalent to `putc' with `stdout' as
-     the value of the STREAM argument.
-
- -- Function: wint_t putwchar (wchar_t WC)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
-     | *Note POSIX Safety Concepts::.
-
-     The `putwchar' function is equivalent to `putwc' with `stdout' as
-     the value of the STREAM argument.
-
- -- Function: int putchar_unlocked (int C)
-     Preliminary: | MT-Unsafe race:stdout | AS-Unsafe corrupt |
-     AC-Unsafe corrupt | *Note POSIX Safety Concepts::.
-
-     The `putchar_unlocked' function is equivalent to the `putchar'
-     function except that it does not implicitly lock the stream.
-
- -- Function: wint_t putwchar_unlocked (wchar_t WC)
-     Preliminary: | MT-Unsafe race:stdout | AS-Unsafe corrupt |
-     AC-Unsafe corrupt | *Note POSIX Safety Concepts::.
-
-     The `putwchar_unlocked' function is equivalent to the `putwchar'
-     function except that it does not implicitly lock the stream.
-
-     This function is a GNU extension.
-
- -- Function: int fputs (const char *S, FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
-     | *Note POSIX Safety Concepts::.
-
-     The function `fputs' writes the string S to the stream STREAM.
-     The terminating null character is not written.  This function does
-     _not_ add a newline character, either.  It outputs only the
-     characters in the string.
-
-     This function returns `EOF' if a write error occurs, and otherwise
-     a non-negative value.
-
-     For example:
-
-          fputs ("Are ", stdout);
-          fputs ("you ", stdout);
-          fputs ("hungry?\n", stdout);
-
-     outputs the text `Are you hungry?' followed by a newline.
-
- -- Function: int fputws (const wchar_t *WS, FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
-     | *Note POSIX Safety Concepts::.
-
-     The function `fputws' writes the wide character string WS to the
-     stream STREAM.  The terminating null character is not written.
-     This function does _not_ add a newline character, either.  It
-     outputs only the characters in the string.
-
-     This function returns `WEOF' if a write error occurs, and otherwise
-     a non-negative value.
-
- -- Function: int fputs_unlocked (const char *S, FILE *STREAM)
-     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `fputs_unlocked' function is equivalent to the `fputs'
-     function except that it does not implicitly lock the stream.
-
-     This function is a GNU extension.
-
- -- Function: int fputws_unlocked (const wchar_t *WS, FILE *STREAM)
-     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `fputws_unlocked' function is equivalent to the `fputws'
-     function except that it does not implicitly lock the stream.
-
-     This function is a GNU extension.
-
- -- Function: int puts (const char *S)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     The `puts' function writes the string S to the stream `stdout'
-     followed by a newline.  The terminating null character of the
-     string is not written.  (Note that `fputs' does _not_ write a
-     newline as this function does.)
-
-     `puts' is the most convenient function for printing simple
-     messages.  For example:
-
-          puts ("This is a message.");
-
-     outputs the text `This is a message.' followed by a newline.
-
- -- Function: int putw (int W, FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     This function writes the word W (that is, an `int') to STREAM.  It
-     is provided for compatibility with SVID, but we recommend you use
-     `fwrite' instead (*note Block Input/Output::).
-
-
-File: libc.info,  Node: Character Input,  Next: Line Input,  Prev: Simple Output,  Up: I/O on Streams
-
-12.8 Character Input
-====================
-
-This section describes functions for performing character-oriented
-input.  These narrow streams functions are declared in the header file
-`stdio.h' and the wide character functions are declared in `wchar.h'.  
-
-   These functions return an `int' or `wint_t' value (for narrow and
-wide stream functions respectively) that is either a character of
-input, or the special value `EOF'/`WEOF' (usually -1).  For the narrow
-stream functions it is important to store the result of these functions
-in a variable of type `int' instead of `char', even when you plan to
-use it only as a character.  Storing `EOF' in a `char' variable
-truncates its value to the size of a character, so that it is no longer
-distinguishable from the valid character `(char) -1'.  So always use an
-`int' for the result of `getc' and friends, and check for `EOF' after
-the call; once you've verified that the result is not `EOF', you can be
-sure that it will fit in a `char' variable without loss of information.
-
- -- Function: int fgetc (FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     This function reads the next character as an `unsigned char' from
-     the stream STREAM and returns its value, converted to an `int'.
-     If an end-of-file condition or read error occurs, `EOF' is
-     returned instead.
-
- -- Function: wint_t fgetwc (FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     This function reads the next wide character from the stream STREAM
-     and returns its value.  If an end-of-file condition or read error
-     occurs, `WEOF' is returned instead.
-
- -- Function: int fgetc_unlocked (FILE *STREAM)
-     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `fgetc_unlocked' function is equivalent to the `fgetc'
-     function except that it does not implicitly lock the stream.
-
- -- Function: wint_t fgetwc_unlocked (FILE *STREAM)
-     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `fgetwc_unlocked' function is equivalent to the `fgetwc'
-     function except that it does not implicitly lock the stream.
-
-     This function is a GNU extension.
-
- -- Function: int getc (FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     This is just like `fgetc', except that it is permissible (and
-     typical) for it to be implemented as a macro that evaluates the
-     STREAM argument more than once.  `getc' is often highly optimized,
-     so it is usually the best function to use to read a single
-     character.
-
- -- Function: wint_t getwc (FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     This is just like `fgetwc', except that it is permissible for it to
-     be implemented as a macro that evaluates the STREAM argument more
-     than once.  `getwc' can be highly optimized, so it is usually the
-     best function to use to read a single wide character.
-
- -- Function: int getc_unlocked (FILE *STREAM)
-     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `getc_unlocked' function is equivalent to the `getc' function
-     except that it does not implicitly lock the stream.
-
- -- Function: wint_t getwc_unlocked (FILE *STREAM)
-     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `getwc_unlocked' function is equivalent to the `getwc'
-     function except that it does not implicitly lock the stream.
-
-     This function is a GNU extension.
-
- -- Function: int getchar (void)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     The `getchar' function is equivalent to `getc' with `stdin' as the
-     value of the STREAM argument.
-
- -- Function: wint_t getwchar (void)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     The `getwchar' function is equivalent to `getwc' with `stdin' as
-     the value of the STREAM argument.
-
- -- Function: int getchar_unlocked (void)
-     Preliminary: | MT-Unsafe race:stdin | AS-Unsafe corrupt |
-     AC-Unsafe corrupt | *Note POSIX Safety Concepts::.
-
-     The `getchar_unlocked' function is equivalent to the `getchar'
-     function except that it does not implicitly lock the stream.
-
- -- Function: wint_t getwchar_unlocked (void)
-     Preliminary: | MT-Unsafe race:stdin | AS-Unsafe corrupt |
-     AC-Unsafe corrupt | *Note POSIX Safety Concepts::.
-
-     The `getwchar_unlocked' function is equivalent to the `getwchar'
-     function except that it does not implicitly lock the stream.
-
-     This function is a GNU extension.
-
-   Here is an example of a function that does input using `fgetc'.  It
-would work just as well using `getc' instead, or using `getchar ()'
-instead of `fgetc (stdin)'.  The code would also work the same for the
-wide character stream functions.
-
-     int
-     y_or_n_p (const char *question)
-     {
-       fputs (question, stdout);
-       while (1)
-         {
-           int c, answer;
-           /* Write a space to separate answer from question. */
-           fputc (' ', stdout);
-           /* Read the first character of the line.
-     	 This should be the answer character, but might not be. */
-           c = tolower (fgetc (stdin));
-           answer = c;
-           /* Discard rest of input line. */
-           while (c != '\n' && c != EOF)
-     	c = fgetc (stdin);
-           /* Obey the answer if it was valid. */
-           if (answer == 'y')
-     	return 1;
-           if (answer == 'n')
-     	return 0;
-           /* Answer was invalid: ask for valid answer. */
-           fputs ("Please answer y or n:", stdout);
-         }
-     }
-
- -- Function: int getw (FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     This function reads a word (that is, an `int') from STREAM.  It's
-     provided for compatibility with SVID.  We recommend you use
-     `fread' instead (*note Block Input/Output::).  Unlike `getc', any
-     `int' value could be a valid result.  `getw' returns `EOF' when it
-     encounters end-of-file or an error, but there is no way to
-     distinguish this from an input word with value -1.
-
-
-File: libc.info,  Node: Line Input,  Next: Unreading,  Prev: Character Input,  Up: I/O on Streams
-
-12.9 Line-Oriented Input
-========================
-
-Since many programs interpret input on the basis of lines, it is
-convenient to have functions to read a line of text from a stream.
-
-   Standard C has functions to do this, but they aren't very safe: null
-characters and even (for `gets') long lines can confuse them.  So the
-GNU C Library provides the nonstandard `getline' function that makes it
-easy to read lines reliably.
-
-   Another GNU extension, `getdelim', generalizes `getline'.  It reads
-a delimited record, defined as everything through the next occurrence
-of a specified delimiter character.
-
-   All these functions are declared in `stdio.h'.
-
- -- Function: ssize_t getline (char **LINEPTR, size_t *N, FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt heap | AC-Unsafe lock
-     corrupt mem | *Note POSIX Safety Concepts::.
-
-     This function reads an entire line from STREAM, storing the text
-     (including the newline and a terminating null character) in a
-     buffer and storing the buffer address in `*LINEPTR'.
-
-     Before calling `getline', you should place in `*LINEPTR' the
-     address of a buffer `*N' bytes long, allocated with `malloc'.  If
-     this buffer is long enough to hold the line, `getline' stores the
-     line in this buffer.  Otherwise, `getline' makes the buffer bigger
-     using `realloc', storing the new buffer address back in `*LINEPTR'
-     and the increased size back in `*N'.  *Note Unconstrained
-     Allocation::.
-
-     If you set `*LINEPTR' to a null pointer, and `*N' to zero, before
-     the call, then `getline' allocates the initial buffer for you by
-     calling `malloc'.
-
-     In either case, when `getline' returns,  `*LINEPTR' is a `char *'
-     which points to the text of the line.
-
-     When `getline' is successful, it returns the number of characters
-     read (including the newline, but not including the terminating
-     null).  This value enables you to distinguish null characters that
-     are part of the line from the null character inserted as a
-     terminator.
-
-     This function is a GNU extension, but it is the recommended way to
-     read lines from a stream.  The alternative standard functions are
-     unreliable.
-
-     If an error occurs or end of file is reached without any bytes
-     read, `getline' returns `-1'.
-
- -- Function: ssize_t getdelim (char **LINEPTR, size_t *N, int
-          DELIMITER, FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt heap | AC-Unsafe lock
-     corrupt mem | *Note POSIX Safety Concepts::.
-
-     This function is like `getline' except that the character which
-     tells it to stop reading is not necessarily newline.  The argument
-     DELIMITER specifies the delimiter character; `getdelim' keeps
-     reading until it sees that character (or end of file).
-
-     The text is stored in LINEPTR, including the delimiter character
-     and a terminating null.  Like `getline', `getdelim' makes LINEPTR
-     bigger if it isn't big enough.
-
-     `getline' is in fact implemented in terms of `getdelim', just like
-     this:
-
-          ssize_t
-          getline (char **lineptr, size_t *n, FILE *stream)
-          {
-            return getdelim (lineptr, n, '\n', stream);
-          }
-
- -- Function: char * fgets (char *S, int COUNT, FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     The `fgets' function reads characters from the stream STREAM up to
-     and including a newline character and stores them in the string S,
-     adding a null character to mark the end of the string.  You must
-     supply COUNT characters worth of space in S, but the number of
-     characters read is at most COUNT - 1.  The extra character space
-     is used to hold the null character at the end of the string.
-
-     If the system is already at end of file when you call `fgets', then
-     the contents of the array S are unchanged and a null pointer is
-     returned.  A null pointer is also returned if a read error occurs.
-     Otherwise, the return value is the pointer S.
-
-     *Warning:*  If the input data has a null character, you can't tell.
-     So don't use `fgets' unless you know the data cannot contain a
-     null.  Don't use it to read files edited by the user because, if
-     the user inserts a null character, you should either handle it
-     properly or print a clear error message.  We recommend using
-     `getline' instead of `fgets'.
-
- -- Function: wchar_t * fgetws (wchar_t *WS, int COUNT, FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     The `fgetws' function reads wide characters from the stream STREAM
-     up to and including a newline character and stores them in the
-     string WS, adding a null wide character to mark the end of the
-     string.  You must supply COUNT wide characters worth of space in
-     WS, but the number of characters read is at most COUNT - 1.  The
-     extra character space is used to hold the null wide character at
-     the end of the string.
-
-     If the system is already at end of file when you call `fgetws',
-     then the contents of the array WS are unchanged and a null pointer
-     is returned.  A null pointer is also returned if a read error
-     occurs.  Otherwise, the return value is the pointer WS.
-
-     *Warning:* If the input data has a null wide character (which are
-     null bytes in the input stream), you can't tell.  So don't use
-     `fgetws' unless you know the data cannot contain a null.  Don't use
-     it to read files edited by the user because, if the user inserts a
-     null character, you should either handle it properly or print a
-     clear error message.
-
- -- Function: char * fgets_unlocked (char *S, int COUNT, FILE *STREAM)
-     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `fgets_unlocked' function is equivalent to the `fgets'
-     function except that it does not implicitly lock the stream.
-
-     This function is a GNU extension.
-
- -- Function: wchar_t * fgetws_unlocked (wchar_t *WS, int COUNT, FILE
-          *STREAM)
-     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `fgetws_unlocked' function is equivalent to the `fgetws'
-     function except that it does not implicitly lock the stream.
-
-     This function is a GNU extension.
-
- -- Deprecated function: char * gets (char *S)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     The function `gets' reads characters from the stream `stdin' up to
-     the next newline character, and stores them in the string S.  The
-     newline character is discarded (note that this differs from the
-     behavior of `fgets', which copies the newline character into the
-     string).  If `gets' encounters a read error or end-of-file, it
-     returns a null pointer; otherwise it returns S.
-
-     *Warning:* The `gets' function is *very dangerous* because it
-     provides no protection against overflowing the string S.  The GNU
-     C Library includes it for compatibility only.  You should *always*
-     use `fgets' or `getline' instead.  To remind you of this, the
-     linker (if using GNU `ld') will issue a warning whenever you use
-     `gets'.
-
-
-File: libc.info,  Node: Unreading,  Next: Block Input/Output,  Prev: Line Input,  Up: I/O on Streams
-
-12.10 Unreading
-===============
-
-In parser programs it is often useful to examine the next character in
-the input stream without removing it from the stream.  This is called
-"peeking ahead" at the input because your program gets a glimpse of the
-input it will read next.
-
-   Using stream I/O, you can peek ahead at input by first reading it and
-then "unreading" it (also called  "pushing it back" on the stream).
-Unreading a character makes it available to be input again from the
-stream, by  the next call to `fgetc' or other input function on that
-stream.
-
-* Menu:
-
-* Unreading Idea::              An explanation of unreading with pictures.
-* How Unread::                  How to call `ungetc' to do unreading.
-
-
-File: libc.info,  Node: Unreading Idea,  Next: How Unread,  Up: Unreading
-
-12.10.1 What Unreading Means
-----------------------------
-
-Here is a pictorial explanation of unreading.  Suppose you have a
-stream reading a file that contains just six characters, the letters
-`foobar'.  Suppose you have read three characters so far.  The
-situation looks like this:
-
-     f  o  o  b  a  r
-     	 ^
-
-so the next input character will be `b'.
-
-   If instead of reading `b' you unread the letter `o', you get a
-situation like this:
-
-     f  o  o  b  a  r
-     	 |
-           o--
-           ^
-
-so that the next input characters will be `o' and `b'.
-
-   If you unread `9' instead of `o', you get this situation:
-
-     f  o  o  b  a  r
-     	 |
-           9--
-           ^
-
-so that the next input characters will be `9' and `b'.
-
-
-File: libc.info,  Node: How Unread,  Prev: Unreading Idea,  Up: Unreading
-
-12.10.2 Using `ungetc' To Do Unreading
---------------------------------------
-
-The function to unread a character is called `ungetc', because it
-reverses the action of `getc'.
-
- -- Function: int ungetc (int C, FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     The `ungetc' function pushes back the character C onto the input
-     stream STREAM.  So the next input from STREAM will read C before
-     anything else.
-
-     If C is `EOF', `ungetc' does nothing and just returns `EOF'.  This
-     lets you call `ungetc' with the return value of `getc' without
-     needing to check for an error from `getc'.
-
-     The character that you push back doesn't have to be the same as
-     the last character that was actually read from the stream.  In
-     fact, it isn't necessary to actually read any characters from the
-     stream before unreading them with `ungetc'!  But that is a strange
-     way to write a program; usually `ungetc' is used only to unread a
-     character that was just read from the same stream.  The GNU C
-     Library supports this even on files opened in binary mode, but
-     other systems might not.
-
-     The GNU C Library only supports one character of pushback--in other
-     words, it does not work to call `ungetc' twice without doing input
-     in between.  Other systems might let you push back multiple
-     characters; then reading from the stream retrieves the characters
-     in the reverse order that they were pushed.
-
-     Pushing back characters doesn't alter the file; only the internal
-     buffering for the stream is affected.  If a file positioning
-     function (such as `fseek', `fseeko' or `rewind'; *note File
-     Positioning::) is called, any pending pushed-back characters are
-     discarded.
-
-     Unreading a character on a stream that is at end of file clears the
-     end-of-file indicator for the stream, because it makes the
-     character of input available.  After you read that character,
-     trying to read again will encounter end of file.
-
- -- Function: wint_t ungetwc (wint_t WC, FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     The `ungetwc' function behaves just like `ungetc' just that it
-     pushes back a wide character.
-
-   Here is an example showing the use of `getc' and `ungetc' to skip
-over whitespace characters.  When this function reaches a
-non-whitespace character, it unreads that character to be seen again on
-the next read operation on the stream.
-
-     #include <stdio.h>
-     #include <ctype.h>
-
-     void
-     skip_whitespace (FILE *stream)
-     {
-       int c;
-       do
-         /* No need to check for `EOF' because it is not
-            `isspace', and `ungetc' ignores `EOF'.  */
-         c = getc (stream);
-       while (isspace (c));
-       ungetc (c, stream);
-     }
-
-
-File: libc.info,  Node: Block Input/Output,  Next: Formatted Output,  Prev: Unreading,  Up: I/O on Streams
-
-12.11 Block Input/Output
-========================
-
-This section describes how to do input and output operations on blocks
-of data.  You can use these functions to read and write binary data, as
-well as to read and write text in fixed-size blocks instead of by
-characters or lines.  
-
-   Binary files are typically used to read and write blocks of data in
-the same format as is used to represent the data in a running program.
-In other words, arbitrary blocks of memory--not just character or string
-objects--can be written to a binary file, and meaningfully read in
-again by the same program.
-
-   Storing data in binary form is often considerably more efficient than
-using the formatted I/O functions.  Also, for floating-point numbers,
-the binary form avoids possible loss of precision in the conversion
-process.  On the other hand, binary files can't be examined or modified
-easily using many standard file utilities (such as text editors), and
-are not portable between different implementations of the language, or
-different kinds of computers.
-
-   These functions are declared in `stdio.h'.  
-
- -- Function: size_t fread (void *DATA, size_t SIZE, size_t COUNT, FILE
-          *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     This function reads up to COUNT objects of size SIZE into the
-     array DATA, from the stream STREAM.  It returns the number of
-     objects actually read, which might be less than COUNT if a read
-     error occurs or the end of the file is reached.  This function
-     returns a value of zero (and doesn't read anything) if either SIZE
-     or COUNT is zero.
-
-     If `fread' encounters end of file in the middle of an object, it
-     returns the number of complete objects read, and discards the
-     partial object.  Therefore, the stream remains at the actual end
-     of the file.
-
- -- Function: size_t fread_unlocked (void *DATA, size_t SIZE, size_t
-          COUNT, FILE *STREAM)
-     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `fread_unlocked' function is equivalent to the `fread'
-     function except that it does not implicitly lock the stream.
-
-     This function is a GNU extension.
-
- -- Function: size_t fwrite (const void *DATA, size_t SIZE, size_t
-          COUNT, FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     This function writes up to COUNT objects of size SIZE from the
-     array DATA, to the stream STREAM.  The return value is normally
-     COUNT, if the call succeeds.  Any other value indicates some sort
-     of error, such as running out of space.
-
- -- Function: size_t fwrite_unlocked (const void *DATA, size_t SIZE,
-          size_t COUNT, FILE *STREAM)
-     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `fwrite_unlocked' function is equivalent to the `fwrite'
-     function except that it does not implicitly lock the stream.
-
-     This function is a GNU extension.
-
-
-File: libc.info,  Node: Formatted Output,  Next: Customizing Printf,  Prev: Block Input/Output,  Up: I/O on Streams
-
-12.12 Formatted Output
-======================
-
-The functions described in this section (`printf' and related
-functions) provide a convenient way to perform formatted output.  You
-call `printf' with a "format string" or "template string" that
-specifies how to format the values of the remaining arguments.
-
-   Unless your program is a filter that specifically performs line- or
-character-oriented processing, using `printf' or one of the other
-related functions described in this section is usually the easiest and
-most concise way to perform output.  These functions are especially
-useful for printing error messages, tables of data, and the like.
-
-* Menu:
-
-* Formatted Output Basics::     Some examples to get you started.
-* Output Conversion Syntax::    General syntax of conversion
-				 specifications.
-* Table of Output Conversions:: Summary of output conversions and
-				 what they do.
-* Integer Conversions::         Details about formatting of integers.
-* Floating-Point Conversions::  Details about formatting of
-				 floating-point numbers.
-* Other Output Conversions::    Details about formatting of strings,
-				 characters, pointers, and the like.
-* Formatted Output Functions::  Descriptions of the actual functions.
-* Dynamic Output::		Functions that allocate memory for the output.
-* Variable Arguments Output::   `vprintf' and friends.
-* Parsing a Template String::   What kinds of args does a given template
-				 call for?
-* Example of Parsing::          Sample program using `parse_printf_format'.
-
-
-File: libc.info,  Node: Formatted Output Basics,  Next: Output Conversion Syntax,  Up: Formatted Output
-
-12.12.1 Formatted Output Basics
--------------------------------
-
-The `printf' function can be used to print any number of arguments.
-The template string argument you supply in a call provides information
-not only about the number of additional arguments, but also about their
-types and what style should be used for printing them.
-
-   Ordinary characters in the template string are simply written to the
-output stream as-is, while "conversion specifications" introduced by a
-`%' character in the template cause subsequent arguments to be
-formatted and written to the output stream.  For example, 
-
-     int pct = 37;
-     char filename[] = "foo.txt";
-     printf ("Processing of `%s' is %d%% finished.\nPlease be patient.\n",
-     	filename, pct);
-
-produces output like
-
-     Processing of `foo.txt' is 37% finished.
-     Please be patient.
-
-   This example shows the use of the `%d' conversion to specify that an
-`int' argument should be printed in decimal notation, the `%s'
-conversion to specify printing of a string argument, and the `%%'
-conversion to print a literal `%' character.
-
-   There are also conversions for printing an integer argument as an
-unsigned value in octal, decimal, or hexadecimal radix (`%o', `%u', or
-`%x', respectively); or as a character value (`%c').
-
-   Floating-point numbers can be printed in normal, fixed-point notation
-using the `%f' conversion or in exponential notation using the `%e'
-conversion.  The `%g' conversion uses either `%e' or `%f' format,
-depending on what is more appropriate for the magnitude of the
-particular number.
-
-   You can control formatting more precisely by writing "modifiers"
-between the `%' and the character that indicates which conversion to
-apply.  These slightly alter the ordinary behavior of the conversion.
-For example, most conversion specifications permit you to specify a
-minimum field width and a flag indicating whether you want the result
-left- or right-justified within the field.
-
-   The specific flags and modifiers that are permitted and their
-interpretation vary depending on the particular conversion.  They're all
-described in more detail in the following sections.  Don't worry if this
-all seems excessively complicated at first; you can almost always get
-reasonable free-format output without using any of the modifiers at all.
-The modifiers are mostly used to make the output look "prettier" in
-tables.
-
-
-File: libc.info,  Node: Output Conversion Syntax,  Next: Table of Output Conversions,  Prev: Formatted Output Basics,  Up: Formatted Output
-
-12.12.2 Output Conversion Syntax
---------------------------------
-
-This section provides details about the precise syntax of conversion
-specifications that can appear in a `printf' template string.
-
-   Characters in the template string that are not part of a conversion
-specification are printed as-is to the output stream.  Multibyte
-character sequences (*note Character Set Handling::) are permitted in a
-template string.
-
-   The conversion specifications in a `printf' template string have the
-general form:
-
-     % [ PARAM-NO $] FLAGS WIDTH [ . PRECISION ] TYPE CONVERSION
-
-or
-
-     % [ PARAM-NO $] FLAGS WIDTH . * [ PARAM-NO $] TYPE CONVERSION
-
-   For example, in the conversion specifier `%-10.8ld', the `-' is a
-flag, `10' specifies the field width, the precision is `8', the letter
-`l' is a type modifier, and `d' specifies the conversion style.  (This
-particular type specifier says to print a `long int' argument in
-decimal notation, with a minimum of 8 digits left-justified in a field
-at least 10 characters wide.)
-
-   In more detail, output conversion specifications consist of an
-initial `%' character followed in sequence by:
-
-   * An optional specification of the parameter used for this format.
-     Normally the parameters to the `printf' function are assigned to
-     the formats in the order of appearance in the format string.  But
-     in some situations (such as message translation) this is not
-     desirable and this extension allows an explicit parameter to be
-     specified.
-
-     The PARAM-NO parts of the format must be integers in the range of
-     1 to the maximum number of arguments present to the function call.
-     Some implementations limit this number to a certainly upper bound.
-     The exact limit can be retrieved by the following constant.
-
-      -- Macro: NL_ARGMAX
-          The value of `NL_ARGMAX' is the maximum value allowed for the
-          specification of a positional parameter in a `printf' call.
-          The actual value in effect at runtime can be retrieved by
-          using `sysconf' using the `_SC_NL_ARGMAX' parameter *note
-          Sysconf Definition::.
-
-          Some system have a quite low limit such as 9 for System V
-          systems.  The GNU C Library has no real limit.
-
-     If any of the formats has a specification for the parameter
-     position all of them in the format string shall have one.
-     Otherwise the behavior is undefined.
-
-   * Zero or more "flag characters" that modify the normal behavior of
-     the conversion specification.  
-
-   * An optional decimal integer specifying the "minimum field width".
-     If the normal conversion produces fewer characters than this, the
-     field is padded with spaces to the specified width.  This is a
-     _minimum_ value; if the normal conversion produces more characters
-     than this, the field is _not_ truncated.  Normally, the output is
-     right-justified within the field.  
-
-     You can also specify a field width of `*'.  This means that the
-     next argument in the argument list (before the actual value to be
-     printed) is used as the field width.  The value must be an `int'.
-     If the value is negative, this means to set the `-' flag (see
-     below) and to use the absolute value as the field width.
-
-   * An optional "precision" to specify the number of digits to be
-     written for the numeric conversions.  If the precision is
-     specified, it consists of a period (`.') followed optionally by a
-     decimal integer (which defaults to zero if omitted).  
-
-     You can also specify a precision of `*'.  This means that the next
-     argument in the argument list (before the actual value to be
-     printed) is used as the precision.  The value must be an `int',
-     and is ignored if it is negative.  If you specify `*' for both the
-     field width and precision, the field width argument precedes the
-     precision argument.  Other C library versions may not recognize
-     this syntax.
-
-   * An optional "type modifier character", which is used to specify the
-     data type of the corresponding argument if it differs from the
-     default type.  (For example, the integer conversions assume a type
-     of `int', but you can specify `h', `l', or `L' for other integer
-     types.)  
-
-   * A character that specifies the conversion to be applied.
-
-   The exact options that are permitted and how they are interpreted
-vary between the different conversion specifiers.  See the descriptions
-of the individual conversions for information about the particular
-options that they use.
-
-   With the `-Wformat' option, the GNU C compiler checks calls to
-`printf' and related functions.  It examines the format string and
-verifies that the correct number and types of arguments are supplied.
-There is also a GNU C syntax to tell the compiler that a function you
-write uses a `printf'-style format string.  *Note Declaring Attributes
-of Functions: (gcc.info)Function Attributes, for more information.
-
-
-File: libc.info,  Node: Table of Output Conversions,  Next: Integer Conversions,  Prev: Output Conversion Syntax,  Up: Formatted Output
-
-12.12.3 Table of Output Conversions
------------------------------------
-
-Here is a table summarizing what all the different conversions do:
-
-`%d', `%i'
-     Print an integer as a signed decimal number.  *Note Integer
-     Conversions::, for details.  `%d' and `%i' are synonymous for
-     output, but are different when used with `scanf' for input (*note
-     Table of Input Conversions::).
-
-`%o'
-     Print an integer as an unsigned octal number.  *Note Integer
-     Conversions::, for details.
-
-`%u'
-     Print an integer as an unsigned decimal number.  *Note Integer
-     Conversions::, for details.
-
-`%x', `%X'
-     Print an integer as an unsigned hexadecimal number.  `%x' uses
-     lower-case letters and `%X' uses upper-case.  *Note Integer
-     Conversions::, for details.
-
-`%f'
-     Print a floating-point number in normal (fixed-point) notation.
-     *Note Floating-Point Conversions::, for details.
-
-`%e', `%E'
-     Print a floating-point number in exponential notation.  `%e' uses
-     lower-case letters and `%E' uses upper-case.  *Note Floating-Point
-     Conversions::, for details.
-
-`%g', `%G'
-     Print a floating-point number in either normal or exponential
-     notation, whichever is more appropriate for its magnitude.  `%g'
-     uses lower-case letters and `%G' uses upper-case.  *Note
-     Floating-Point Conversions::, for details.
-
-`%a', `%A'
-     Print a floating-point number in a hexadecimal fractional notation
-     which the exponent to base 2 represented in decimal digits.  `%a'
-     uses lower-case letters and `%A' uses upper-case.  *Note
-     Floating-Point Conversions::, for details.
-
-`%c'
-     Print a single character.  *Note Other Output Conversions::.
-
-`%C'
-     This is an alias for `%lc' which is supported for compatibility
-     with the Unix standard.
-
-`%s'
-     Print a string.  *Note Other Output Conversions::.
-
-`%S'
-     This is an alias for `%ls' which is supported for compatibility
-     with the Unix standard.
-
-`%p'
-     Print the value of a pointer.  *Note Other Output Conversions::.
-
-`%n'
-     Get the number of characters printed so far.  *Note Other Output
-     Conversions::.  Note that this conversion specification never
-     produces any output.
-
-`%m'
-     Print the string corresponding to the value of `errno'.  (This is
-     a GNU extension.)  *Note Other Output Conversions::.
-
-`%%'
-     Print a literal `%' character.  *Note Other Output Conversions::.
-
-   If the syntax of a conversion specification is invalid, unpredictable
-things will happen, so don't do this.  If there aren't enough function
-arguments provided to supply values for all the conversion
-specifications in the template string, or if the arguments are not of
-the correct types, the results are unpredictable.  If you supply more
-arguments than conversion specifications, the extra argument values are
-simply ignored; this is sometimes useful.
-
-
-File: libc.info,  Node: Integer Conversions,  Next: Floating-Point Conversions,  Prev: Table of Output Conversions,  Up: Formatted Output
-
-12.12.4 Integer Conversions
----------------------------
-
-This section describes the options for the `%d', `%i', `%o', `%u',
-`%x', and `%X' conversion specifications.  These conversions print
-integers in various formats.
-
-   The `%d' and `%i' conversion specifications both print an `int'
-argument as a signed decimal number; while `%o', `%u', and `%x' print
-the argument as an unsigned octal, decimal, or hexadecimal number
-(respectively).  The `%X' conversion specification is just like `%x'
-except that it uses the characters `ABCDEF' as digits instead of
-`abcdef'.
-
-   The following flags are meaningful:
-
-`-'
-     Left-justify the result in the field (instead of the normal
-     right-justification).
-
-`+'
-     For the signed `%d' and `%i' conversions, print a plus sign if the
-     value is positive.
-
-` '
-     For the signed `%d' and `%i' conversions, if the result doesn't
-     start with a plus or minus sign, prefix it with a space character
-     instead.  Since the `+' flag ensures that the result includes a
-     sign, this flag is ignored if you supply both of them.
-
-`#'
-     For the `%o' conversion, this forces the leading digit to be `0',
-     as if by increasing the precision.  For `%x' or `%X', this
-     prefixes a leading `0x' or `0X' (respectively) to the result.
-     This doesn't do anything useful for the `%d', `%i', or `%u'
-     conversions.  Using this flag produces output which can be parsed
-     by the `strtoul' function (*note Parsing of Integers::) and
-     `scanf' with the `%i' conversion (*note Numeric Input
-     Conversions::).
-
-`''
-     Separate the digits into groups as specified by the locale
-     specified for the `LC_NUMERIC' category; *note General Numeric::.
-     This flag is a GNU extension.
-
-`0'
-     Pad the field with zeros instead of spaces.  The zeros are placed
-     after any indication of sign or base.  This flag is ignored if the
-     `-' flag is also specified, or if a precision is specified.
-
-   If a precision is supplied, it specifies the minimum number of
-digits to appear; leading zeros are produced if necessary.  If you
-don't specify a precision, the number is printed with as many digits as
-it needs.  If you convert a value of zero with an explicit precision of
-zero, then no characters at all are produced.
-
-   Without a type modifier, the corresponding argument is treated as an
-`int' (for the signed conversions `%i' and `%d') or `unsigned int' (for
-the unsigned conversions `%o', `%u', `%x', and `%X').  Recall that
-since `printf' and friends are variadic, any `char' and `short'
-arguments are automatically converted to `int' by the default argument
-promotions.  For arguments of other integer types, you can use these
-modifiers:
-
-`hh'
-     Specifies that the argument is a `signed char' or `unsigned char',
-     as appropriate.  A `char' argument is converted to an `int' or
-     `unsigned int' by the default argument promotions anyway, but the
-     `h' modifier says to convert it back to a `char' again.
-
-     This modifier was introduced in ISO C99.
-
-`h'
-     Specifies that the argument is a `short int' or `unsigned short
-     int', as appropriate.  A `short' argument is converted to an `int'
-     or `unsigned int' by the default argument promotions anyway, but
-     the `h' modifier says to convert it back to a `short' again.
-
-`j'
-     Specifies that the argument is a `intmax_t' or `uintmax_t', as
-     appropriate.
-
-     This modifier was introduced in ISO C99.
-
-`l'
-     Specifies that the argument is a `long int' or `unsigned long
-     int', as appropriate.  Two `l' characters is like the `L'
-     modifier, below.
-
-     If used with `%c' or `%s' the corresponding parameter is
-     considered as a wide character or wide character string
-     respectively.  This use of `l' was introduced in Amendment 1 to
-     ISO C90.
-
-`L'
-`ll'
-`q'
-     Specifies that the argument is a `long long int'.  (This type is
-     an extension supported by the GNU C compiler.  On systems that
-     don't support extra-long integers, this is the same as `long int'.)
-
-     The `q' modifier is another name for the same thing, which comes
-     from 4.4 BSD; a `long long int' is sometimes called a "quad" `int'.
-
-`t'
-     Specifies that the argument is a `ptrdiff_t'.
-
-     This modifier was introduced in ISO C99.
-
-`z'
-`Z'
-     Specifies that the argument is a `size_t'.
-
-     `z' was introduced in ISO C99.  `Z' is a GNU extension predating
-     this addition and should not be used in new code.
-
-   Here is an example.  Using the template string:
-
-     "|%5d|%-5d|%+5d|%+-5d|% 5d|%05d|%5.0d|%5.2d|%d|\n"
-
-to print numbers using the different options for the `%d' conversion
-gives results like:
-
-     |    0|0    |   +0|+0   |    0|00000|     |   00|0|
-     |    1|1    |   +1|+1   |    1|00001|    1|   01|1|
-     |   -1|-1   |   -1|-1   |   -1|-0001|   -1|  -01|-1|
-     |100000|100000|+100000|+100000| 100000|100000|100000|100000|100000|
-
-   In particular, notice what happens in the last case where the number
-is too large to fit in the minimum field width specified.
-
-   Here are some more examples showing how unsigned integers print under
-various format options, using the template string:
-
-     "|%5u|%5o|%5x|%5X|%#5o|%#5x|%#5X|%#10.8x|\n"
-
-     |    0|    0|    0|    0|    0|    0|    0|  00000000|
-     |    1|    1|    1|    1|   01|  0x1|  0X1|0x00000001|
-     |100000|303240|186a0|186A0|0303240|0x186a0|0X186A0|0x000186a0|
-
-
-File: libc.info,  Node: Floating-Point Conversions,  Next: Other Output Conversions,  Prev: Integer Conversions,  Up: Formatted Output
-
-12.12.5 Floating-Point Conversions
-----------------------------------
-
-This section discusses the conversion specifications for floating-point
-numbers: the `%f', `%e', `%E', `%g', and `%G' conversions.
-
-   The `%f' conversion prints its argument in fixed-point notation,
-producing output of the form [`-']DDD`.'DDD, where the number of digits
-following the decimal point is controlled by the precision you specify.
-
-   The `%e' conversion prints its argument in exponential notation,
-producing output of the form [`-']D`.'DDD`e'[`+'|`-']DD.  Again, the
-number of digits following the decimal point is controlled by the
-precision.  The exponent always contains at least two digits.  The `%E'
-conversion is similar but the exponent is marked with the letter `E'
-instead of `e'.
-
-   The `%g' and `%G' conversions print the argument in the style of
-`%e' or `%E' (respectively) if the exponent would be less than -4 or
-greater than or equal to the precision; otherwise they use the `%f'
-style.  A precision of `0', is taken as 1.  Trailing zeros are removed
-from the fractional portion of the result and a decimal-point character
-appears only if it is followed by a digit.
-
-   The `%a' and `%A' conversions are meant for representing
-floating-point numbers exactly in textual form so that they can be
-exchanged as texts between different programs and/or machines.  The
-numbers are represented is the form [`-']`0x'H`.'HHH`p'[`+'|`-']DD.  At
-the left of the decimal-point character exactly one digit is print.
-This character is only `0' if the number is denormalized.  Otherwise
-the value is unspecified; it is implementation dependent how many bits
-are used.  The number of hexadecimal digits on the right side of the
-decimal-point character is equal to the precision.  If the precision is
-zero it is determined to be large enough to provide an exact
-representation of the number (or it is large enough to distinguish two
-adjacent values if the `FLT_RADIX' is not a power of 2, *note Floating
-Point Parameters::).  For the `%a' conversion lower-case characters are
-used to represent the hexadecimal number and the prefix and exponent
-sign are printed as `0x' and `p' respectively.  Otherwise upper-case
-characters are used and `0X' and `P' are used for the representation of
-prefix and exponent string.  The exponent to the base of two is printed
-as a decimal number using at least one digit but at most as many digits
-as necessary to represent the value exactly.
-
-   If the value to be printed represents infinity or a NaN, the output
-is [`-']`inf' or `nan' respectively if the conversion specifier is
-`%a', `%e', `%f', or `%g' and it is [`-']`INF' or `NAN' respectively if
-the conversion is `%A', `%E', or `%G'.
-
-   The following flags can be used to modify the behavior:
-
-`-'
-     Left-justify the result in the field.  Normally the result is
-     right-justified.
-
-`+'
-     Always include a plus or minus sign in the result.
-
-` '
-     If the result doesn't start with a plus or minus sign, prefix it
-     with a space instead.  Since the `+' flag ensures that the result
-     includes a sign, this flag is ignored if you supply both of them.
-
-`#'
-     Specifies that the result should always include a decimal point,
-     even if no digits follow it.  For the `%g' and `%G' conversions,
-     this also forces trailing zeros after the decimal point to be left
-     in place where they would otherwise be removed.
-
-`''
-     Separate the digits of the integer part of the result into groups
-     as specified by the locale specified for the `LC_NUMERIC' category;
-     *note General Numeric::.  This flag is a GNU extension.
-
-`0'
-     Pad the field with zeros instead of spaces; the zeros are placed
-     after any sign.  This flag is ignored if the `-' flag is also
-     specified.
-
-   The precision specifies how many digits follow the decimal-point
-character for the `%f', `%e', and `%E' conversions.  For these
-conversions, the default precision is `6'.  If the precision is
-explicitly `0', this suppresses the decimal point character entirely.
-For the `%g' and `%G' conversions, the precision specifies how many
-significant digits to print.  Significant digits are the first digit
-before the decimal point, and all the digits after it.  If the
-precision is `0' or not specified for `%g' or `%G', it is treated like
-a value of `1'.  If the value being printed cannot be expressed
-accurately in the specified number of digits, the value is rounded to
-the nearest number that fits.
-
-   Without a type modifier, the floating-point conversions use an
-argument of type `double'.  (By the default argument promotions, any
-`float' arguments are automatically converted to `double'.)  The
-following type modifier is supported:
-
-`L'
-     An uppercase `L' specifies that the argument is a `long double'.
-
-   Here are some examples showing how numbers print using the various
-floating-point conversions.  All of the numbers were printed using this
-template string:
-
-     "|%13.4a|%13.4f|%13.4e|%13.4g|\n"
-
-   Here is the output:
-
-     |  0x0.0000p+0|       0.0000|   0.0000e+00|            0|
-     |  0x1.0000p-1|       0.5000|   5.0000e-01|          0.5|
-     |  0x1.0000p+0|       1.0000|   1.0000e+00|            1|
-     | -0x1.0000p+0|      -1.0000|  -1.0000e+00|           -1|
-     |  0x1.9000p+6|     100.0000|   1.0000e+02|          100|
-     |  0x1.f400p+9|    1000.0000|   1.0000e+03|         1000|
-     | 0x1.3880p+13|   10000.0000|   1.0000e+04|        1e+04|
-     | 0x1.81c8p+13|   12345.0000|   1.2345e+04|    1.234e+04|
-     | 0x1.86a0p+16|  100000.0000|   1.0000e+05|        1e+05|
-     | 0x1.e240p+16|  123456.0000|   1.2346e+05|    1.235e+05|
-
-   Notice how the `%g' conversion drops trailing zeros.
-
-
-File: libc.info,  Node: Other Output Conversions,  Next: Formatted Output Functions,  Prev: Floating-Point Conversions,  Up: Formatted Output
-
-12.12.6 Other Output Conversions
---------------------------------
-
-This section describes miscellaneous conversions for `printf'.
-
-   The `%c' conversion prints a single character.  In case there is no
-`l' modifier the `int' argument is first converted to an `unsigned
-char'.  Then, if used in a wide stream function, the character is
-converted into the corresponding wide character.  The `-' flag can be
-used to specify left-justification in the field, but no other flags are
-defined, and no precision or type modifier can be given.  For example:
-
-     printf ("%c%c%c%c%c", 'h', 'e', 'l', 'l', 'o');
-
-prints `hello'.
-
-   If there is a `l' modifier present the argument is expected to be of
-type `wint_t'.  If used in a multibyte function the wide character is
-converted into a multibyte character before being added to the output.
-In this case more than one output byte can be produced.
-
-   The `%s' conversion prints a string.  If no `l' modifier is present
-the corresponding argument must be of type `char *' (or `const char
-*').  If used in a wide stream function the string is first converted
-in a wide character string.  A precision can be specified to indicate
-the maximum number of characters to write; otherwise characters in the
-string up to but not including the terminating null character are
-written to the output stream.  The `-' flag can be used to specify
-left-justification in the field, but no other flags or type modifiers
-are defined for this conversion.  For example:
-
-     printf ("%3s%-6s", "no", "where");
-
-prints ` nowhere '.
-
-   If there is a `l' modifier present the argument is expected to be of
-type `wchar_t' (or `const wchar_t *').
-
-   If you accidentally pass a null pointer as the argument for a `%s'
-conversion, the GNU C Library prints it as `(null)'.  We think this is
-more useful than crashing.  But it's not good practice to pass a null
-argument intentionally.
-
-   The `%m' conversion prints the string corresponding to the error
-code in `errno'.  *Note Error Messages::.  Thus:
-
-     fprintf (stderr, "can't open `%s': %m\n", filename);
-
-is equivalent to:
-
-     fprintf (stderr, "can't open `%s': %s\n", filename, strerror (errno));
-
-The `%m' conversion is a GNU C Library extension.
-
-   The `%p' conversion prints a pointer value.  The corresponding
-argument must be of type `void *'.  In practice, you can use any type
-of pointer.
-
-   In the GNU C Library, non-null pointers are printed as unsigned
-integers, as if a `%#x' conversion were used.  Null pointers print as
-`(nil)'.  (Pointers might print differently in other systems.)
-
-   For example:
-
-     printf ("%p", "testing");
-
-prints `0x' followed by a hexadecimal number--the address of the string
-constant `"testing"'.  It does not print the word `testing'.
-
-   You can supply the `-' flag with the `%p' conversion to specify
-left-justification, but no other flags, precision, or type modifiers
-are defined.
-
-   The `%n' conversion is unlike any of the other output conversions.
-It uses an argument which must be a pointer to an `int', but instead of
-printing anything it stores the number of characters printed so far by
-this call at that location.  The `h' and `l' type modifiers are
-permitted to specify that the argument is of type `short int *' or
-`long int *' instead of `int *', but no flags, field width, or
-precision are permitted.
-
-   For example,
-
-     int nchar;
-     printf ("%d %s%n\n", 3, "bears", &nchar);
-
-prints:
-
-     3 bears
-
-and sets `nchar' to `7', because `3 bears' is seven characters.
-
-   The `%%' conversion prints a literal `%' character.  This conversion
-doesn't use an argument, and no flags, field width, precision, or type
-modifiers are permitted.
-
-
-File: libc.info,  Node: Formatted Output Functions,  Next: Dynamic Output,  Prev: Other Output Conversions,  Up: Formatted Output
-
-12.12.7 Formatted Output Functions
-----------------------------------
-
-This section describes how to call `printf' and related functions.
-Prototypes for these functions are in the header file `stdio.h'.
-Because these functions take a variable number of arguments, you _must_
-declare prototypes for them before using them.  Of course, the easiest
-way to make sure you have all the right prototypes is to just include
-`stdio.h'.  
-
- -- Function: int printf (const char *TEMPLATE, ...)
-     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
-     mem lock corrupt | *Note POSIX Safety Concepts::.
-
-     The `printf' function prints the optional arguments under the
-     control of the template string TEMPLATE to the stream `stdout'.
-     It returns the number of characters printed, or a negative value
-     if there was an output error.
-
- -- Function: int wprintf (const wchar_t *TEMPLATE, ...)
-     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
-     mem lock corrupt | *Note POSIX Safety Concepts::.
-
-     The `wprintf' function prints the optional arguments under the
-     control of the wide template string TEMPLATE to the stream
-     `stdout'.  It returns the number of wide characters printed, or a
-     negative value if there was an output error.
-
- -- Function: int fprintf (FILE *STREAM, const char *TEMPLATE, ...)
-     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
-     mem lock corrupt | *Note POSIX Safety Concepts::.
-
-     This function is just like `printf', except that the output is
-     written to the stream STREAM instead of `stdout'.
-
- -- Function: int fwprintf (FILE *STREAM, const wchar_t *TEMPLATE, ...)
-     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
-     mem lock corrupt | *Note POSIX Safety Concepts::.
-
-     This function is just like `wprintf', except that the output is
-     written to the stream STREAM instead of `stdout'.
-
- -- Function: int sprintf (char *S, const char *TEMPLATE, ...)
-     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
-     *Note POSIX Safety Concepts::.
-
-     This is like `printf', except that the output is stored in the
-     character array S instead of written to a stream.  A null
-     character is written to mark the end of the string.
-
-     The `sprintf' function returns the number of characters stored in
-     the array S, not including the terminating null character.
-
-     The behavior of this function is undefined if copying takes place
-     between objects that overlap--for example, if S is also given as
-     an argument to be printed under control of the `%s' conversion.
-     *Note Copying and Concatenation::.
-
-     *Warning:* The `sprintf' function can be *dangerous* because it
-     can potentially output more characters than can fit in the
-     allocation size of the string S.  Remember that the field width
-     given in a conversion specification is only a _minimum_ value.
-
-     To avoid this problem, you can use `snprintf' or `asprintf',
-     described below.
-
- -- Function: int swprintf (wchar_t *S, size_t SIZE, const wchar_t
-          *TEMPLATE, ...)
-     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
-     *Note POSIX Safety Concepts::.
-
-     This is like `wprintf', except that the output is stored in the
-     wide character array WS instead of written to a stream.  A null
-     wide character is written to mark the end of the string.  The SIZE
-     argument specifies the maximum number of characters to produce.
-     The trailing null character is counted towards this limit, so you
-     should allocate at least SIZE wide characters for the string WS.
-
-     The return value is the number of characters generated for the
-     given input, excluding the trailing null.  If not all output fits
-     into the provided buffer a negative value is returned.  You should
-     try again with a bigger output string.  _Note:_ this is different
-     from how `snprintf' handles this situation.
-
-     Note that the corresponding narrow stream function takes fewer
-     parameters.  `swprintf' in fact corresponds to the `snprintf'
-     function.  Since the `sprintf' function can be dangerous and should
-     be avoided the ISO C committee refused to make the same mistake
-     again and decided to not define a function exactly corresponding to
-     `sprintf'.
-
- -- Function: int snprintf (char *S, size_t SIZE, const char *TEMPLATE,
-          ...)
-     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
-     *Note POSIX Safety Concepts::.
-
-     The `snprintf' function is similar to `sprintf', except that the
-     SIZE argument specifies the maximum number of characters to
-     produce.  The trailing null character is counted towards this
-     limit, so you should allocate at least SIZE characters for the
-     string S.  If SIZE is zero, nothing, not even the null byte, shall
-     be written and S may be a null pointer.
-
-     The return value is the number of characters which would be
-     generated for the given input, excluding the trailing null.  If
-     this value is greater or equal to SIZE, not all characters from
-     the result have been stored in S.  You should try again with a
-     bigger output string.  Here is an example of doing this:
-
-          /* Construct a message describing the value of a variable
-             whose name is NAME and whose value is VALUE. */
-          char *
-          make_message (char *name, char *value)
-          {
-            /* Guess we need no more than 100 chars of space. */
-            int size = 100;
-            char *buffer = (char *) xmalloc (size);
-            int nchars;
-            if (buffer == NULL)
-              return NULL;
-
-           /* Try to print in the allocated space. */
-            nchars = snprintf (buffer, size, "value of %s is %s",
-          		     name, value);
-            if (nchars >= size)
-              {
-                /* Reallocate buffer now that we know
-          	 how much space is needed. */
-                size = nchars + 1;
-                buffer = (char *) xrealloc (buffer, size);
-
-                if (buffer != NULL)
-          	/* Try again. */
-          	snprintf (buffer, size, "value of %s is %s",
-          		  name, value);
-              }
-            /* The last call worked, return the string. */
-            return buffer;
-          }
-
-     In practice, it is often easier just to use `asprintf', below.
-
-     *Attention:* In versions of the GNU C Library prior to 2.1 the
-     return value is the number of characters stored, not including the
-     terminating null; unless there was not enough space in S to store
-     the result in which case `-1' is returned.  This was changed in
-     order to comply with the ISO C99 standard.
-
-
-File: libc.info,  Node: Dynamic Output,  Next: Variable Arguments Output,  Prev: Formatted Output Functions,  Up: Formatted Output
-
-12.12.8 Dynamically Allocating Formatted Output
------------------------------------------------
-
-The functions in this section do formatted output and place the results
-in dynamically allocated memory.
-
- -- Function: int asprintf (char **PTR, const char *TEMPLATE, ...)
-     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
-     *Note POSIX Safety Concepts::.
-
-     This function is similar to `sprintf', except that it dynamically
-     allocates a string (as with `malloc'; *note Unconstrained
-     Allocation::) to hold the output, instead of putting the output in
-     a buffer you allocate in advance.  The PTR argument should be the
-     address of a `char *' object, and a successful call to `asprintf'
-     stores a pointer to the newly allocated string at that location.
-
-     The return value is the number of characters allocated for the
-     buffer, or less than zero if an error occurred. Usually this means
-     that the buffer could not be allocated.
-
-     Here is how to use `asprintf' to get the same result as the
-     `snprintf' example, but more easily:
-
-          /* Construct a message describing the value of a variable
-             whose name is NAME and whose value is VALUE. */
-          char *
-          make_message (char *name, char *value)
-          {
-            char *result;
-            if (asprintf (&result, "value of %s is %s", name, value) < 0)
-              return NULL;
-            return result;
-          }
-
- -- Function: int obstack_printf (struct obstack *OBSTACK, const char
-          *TEMPLATE, ...)
-     Preliminary: | MT-Safe race:obstack locale | AS-Unsafe corrupt heap
-     | AC-Unsafe corrupt mem | *Note POSIX Safety Concepts::.
-
-     This function is similar to `asprintf', except that it uses the
-     obstack OBSTACK to allocate the space.  *Note Obstacks::.
-
-     The characters are written onto the end of the current object.  To
-     get at them, you must finish the object with `obstack_finish'
-     (*note Growing Objects::).
-
-
-File: libc.info,  Node: Variable Arguments Output,  Next: Parsing a Template String,  Prev: Dynamic Output,  Up: Formatted Output
-
-12.12.9 Variable Arguments Output Functions
--------------------------------------------
-
-The functions `vprintf' and friends are provided so that you can define
-your own variadic `printf'-like functions that make use of the same
-internals as the built-in formatted output functions.
-
-   The most natural way to define such functions would be to use a
-language construct to say, "Call `printf' and pass this template plus
-all of my arguments after the first five."  But there is no way to do
-this in C, and it would be hard to provide a way, since at the C
-language level there is no way to tell how many arguments your function
-received.
-
-   Since that method is impossible, we provide alternative functions,
-the `vprintf' series, which lets you pass a `va_list' to describe "all
-of my arguments after the first five."
-
-   When it is sufficient to define a macro rather than a real function,
-the GNU C compiler provides a way to do this much more easily with
-macros.  For example:
-
-     #define myprintf(a, b, c, d, e, rest...) \
-     	    printf (mytemplate , ## rest)
-
-*Note Variadic Macros: (cpp)Variadic Macros, for details.  But this is
-limited to macros, and does not apply to real functions at all.
-
-   Before calling `vprintf' or the other functions listed in this
-section, you _must_ call `va_start' (*note Variadic Functions::) to
-initialize a pointer to the variable arguments.  Then you can call
-`va_arg' to fetch the arguments that you want to handle yourself.  This
-advances the pointer past those arguments.
-
-   Once your `va_list' pointer is pointing at the argument of your
-choice, you are ready to call `vprintf'.  That argument and all
-subsequent arguments that were passed to your function are used by
-`vprintf' along with the template that you specified separately.
-
-   In some other systems, the `va_list' pointer may become invalid
-after the call to `vprintf', so you must not use `va_arg' after you
-call `vprintf'.  Instead, you should call `va_end' to retire the
-pointer from service.  However, you can safely call `va_start' on
-another pointer variable and begin fetching the arguments again through
-that pointer.  Calling `vprintf' does not destroy the argument list of
-your function, merely the particular pointer that you passed to it.
-
-   GNU C does not have such restrictions.  You can safely continue to
-fetch arguments from a `va_list' pointer after passing it to `vprintf',
-and `va_end' is a no-op.  (Note, however, that subsequent `va_arg'
-calls will fetch the same arguments which `vprintf' previously used.)
-
-   Prototypes for these functions are declared in `stdio.h'.  
-
- -- Function: int vprintf (const char *TEMPLATE, va_list AP)
-     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
-     mem lock corrupt | *Note POSIX Safety Concepts::.
-
-     This function is similar to `printf' except that, instead of taking
-     a variable number of arguments directly, it takes an argument list
-     pointer AP.
-
- -- Function: int vwprintf (const wchar_t *TEMPLATE, va_list AP)
-     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
-     mem lock corrupt | *Note POSIX Safety Concepts::.
-
-     This function is similar to `wprintf' except that, instead of
-     taking a variable number of arguments directly, it takes an
-     argument list pointer AP.
-
- -- Function: int vfprintf (FILE *STREAM, const char *TEMPLATE, va_list
-          AP)
-     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
-     mem lock corrupt | *Note POSIX Safety Concepts::.
-
-     This is the equivalent of `fprintf' with the variable argument list
-     specified directly as for `vprintf'.
-
- -- Function: int vfwprintf (FILE *STREAM, const wchar_t *TEMPLATE,
-          va_list AP)
-     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
-     mem lock corrupt | *Note POSIX Safety Concepts::.
-
-     This is the equivalent of `fwprintf' with the variable argument
-     list specified directly as for `vwprintf'.
-
- -- Function: int vsprintf (char *S, const char *TEMPLATE, va_list AP)
-     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
-     *Note POSIX Safety Concepts::.
-
-     This is the equivalent of `sprintf' with the variable argument list
-     specified directly as for `vprintf'.
-
- -- Function: int vswprintf (wchar_t *S, size_t SIZE, const wchar_t
-          *TEMPLATE, va_list AP)
-     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
-     *Note POSIX Safety Concepts::.
-
-     This is the equivalent of `swprintf' with the variable argument
-     list specified directly as for `vwprintf'.
-
- -- Function: int vsnprintf (char *S, size_t SIZE, const char
-          *TEMPLATE, va_list AP)
-     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
-     *Note POSIX Safety Concepts::.
-
-     This is the equivalent of `snprintf' with the variable argument
-     list specified directly as for `vprintf'.
-
- -- Function: int vasprintf (char **PTR, const char *TEMPLATE, va_list
-          AP)
-     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
-     *Note POSIX Safety Concepts::.
-
-     The `vasprintf' function is the equivalent of `asprintf' with the
-     variable argument list specified directly as for `vprintf'.
-
- -- Function: int obstack_vprintf (struct obstack *OBSTACK, const char
-          *TEMPLATE, va_list AP)
-     Preliminary: | MT-Safe race:obstack locale | AS-Unsafe corrupt heap
-     | AC-Unsafe corrupt mem | *Note POSIX Safety Concepts::.
-
-     The `obstack_vprintf' function is the equivalent of
-     `obstack_printf' with the variable argument list specified directly
-     as for `vprintf'.
-
-   Here's an example showing how you might use `vfprintf'.  This is a
-function that prints error messages to the stream `stderr', along with
-a prefix indicating the name of the program (*note Error Messages::,
-for a description of `program_invocation_short_name').
-
-     #include <stdio.h>
-     #include <stdarg.h>
-
-     void
-     eprintf (const char *template, ...)
-     {
-       va_list ap;
-       extern char *program_invocation_short_name;
-
-       fprintf (stderr, "%s: ", program_invocation_short_name);
-       va_start (ap, template);
-       vfprintf (stderr, template, ap);
-       va_end (ap);
-     }
-
-You could call `eprintf' like this:
-
-     eprintf ("file `%s' does not exist\n", filename);
-
-   In GNU C, there is a special construct you can use to let the
-compiler know that a function uses a `printf'-style format string.
-Then it can check the number and types of arguments in each call to the
-function, and warn you when they do not match the format string.  For
-example, take this declaration of `eprintf':
-
-     void eprintf (const char *template, ...)
-     	__attribute__ ((format (printf, 1, 2)));
-
-This tells the compiler that `eprintf' uses a format string like
-`printf' (as opposed to `scanf'; *note Formatted Input::); the format
-string appears as the first argument; and the arguments to satisfy the
-format begin with the second.  *Note Declaring Attributes of Functions:
-(gcc.info)Function Attributes, for more information.
-
-
-File: libc.info,  Node: Parsing a Template String,  Next: Example of Parsing,  Prev: Variable Arguments Output,  Up: Formatted Output
-
-12.12.10 Parsing a Template String
-----------------------------------
-
-You can use the function `parse_printf_format' to obtain information
-about the number and types of arguments that are expected by a given
-template string.  This function permits interpreters that provide
-interfaces to `printf' to avoid passing along invalid arguments from
-the user's program, which could cause a crash.
-
-   All the symbols described in this section are declared in the header
-file `printf.h'.
-
- -- Function: size_t parse_printf_format (const char *TEMPLATE, size_t
-          N, int *ARGTYPES)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     This function returns information about the number and types of
-     arguments expected by the `printf' template string TEMPLATE.  The
-     information is stored in the array ARGTYPES; each element of this
-     array describes one argument.  This information is encoded using
-     the various `PA_' macros, listed below.
-
-     The argument N specifies the number of elements in the array
-     ARGTYPES.  This is the maximum number of elements that
-     `parse_printf_format' will try to write.
-
-     `parse_printf_format' returns the total number of arguments
-     required by TEMPLATE.  If this number is greater than N, then the
-     information returned describes only the first N arguments.  If you
-     want information about additional arguments, allocate a bigger
-     array and call `parse_printf_format' again.
-
-   The argument types are encoded as a combination of a basic type and
-modifier flag bits.
-
- -- Macro: int PA_FLAG_MASK
-     This macro is a bitmask for the type modifier flag bits.  You can
-     write the expression `(argtypes[i] & PA_FLAG_MASK)' to extract
-     just the flag bits for an argument, or `(argtypes[i] &
-     ~PA_FLAG_MASK)' to extract just the basic type code.
-
-   Here are symbolic constants that represent the basic types; they
-stand for integer values.
-
-`PA_INT'
-     This specifies that the base type is `int'.
-
-`PA_CHAR'
-     This specifies that the base type is `int', cast to `char'.
-
-`PA_STRING'
-     This specifies that the base type is `char *', a null-terminated
-     string.
-
-`PA_POINTER'
-     This specifies that the base type is `void *', an arbitrary
-     pointer.
-
-`PA_FLOAT'
-     This specifies that the base type is `float'.
-
-`PA_DOUBLE'
-     This specifies that the base type is `double'.
-
-`PA_LAST'
-     You can define additional base types for your own programs as
-     offsets from `PA_LAST'.  For example, if you have data types `foo'
-     and `bar' with their own specialized `printf' conversions, you
-     could define encodings for these types as:
-
-          #define PA_FOO  PA_LAST
-          #define PA_BAR  (PA_LAST + 1)
-
-   Here are the flag bits that modify a basic type.  They are combined
-with the code for the basic type using inclusive-or.
-
-`PA_FLAG_PTR'
-     If this bit is set, it indicates that the encoded type is a
-     pointer to the base type, rather than an immediate value.  For
-     example, `PA_INT|PA_FLAG_PTR' represents the type `int *'.
-
-`PA_FLAG_SHORT'
-     If this bit is set, it indicates that the base type is modified
-     with `short'.  (This corresponds to the `h' type modifier.)
-
-`PA_FLAG_LONG'
-     If this bit is set, it indicates that the base type is modified
-     with `long'.  (This corresponds to the `l' type modifier.)
-
-`PA_FLAG_LONG_LONG'
-     If this bit is set, it indicates that the base type is modified
-     with `long long'.  (This corresponds to the `L' type modifier.)
-
-`PA_FLAG_LONG_DOUBLE'
-     This is a synonym for `PA_FLAG_LONG_LONG', used by convention with
-     a base type of `PA_DOUBLE' to indicate a type of `long double'.
-
-   For an example of using these facilities, see *note Example of
-Parsing::.
-
-
-File: libc.info,  Node: Example of Parsing,  Prev: Parsing a Template String,  Up: Formatted Output
-
-12.12.11 Example of Parsing a Template String
----------------------------------------------
-
-Here is an example of decoding argument types for a format string.  We
-assume this is part of an interpreter which contains arguments of type
-`NUMBER', `CHAR', `STRING' and `STRUCTURE' (and perhaps others which
-are not valid here).
-
-     /* Test whether the NARGS specified objects
-        in the vector ARGS are valid
-        for the format string FORMAT:
-        if so, return 1.
-        If not, return 0 after printing an error message.  */
-
-     int
-     validate_args (char *format, int nargs, OBJECT *args)
-     {
-       int *argtypes;
-       int nwanted;
-
-       /* Get the information about the arguments.
-          Each conversion specification must be at least two characters
-          long, so there cannot be more specifications than half the
-          length of the string.  */
-
-       argtypes = (int *) alloca (strlen (format) / 2 * sizeof (int));
-       nwanted = parse_printf_format (string, nelts, argtypes);
-
-       /* Check the number of arguments.  */
-       if (nwanted > nargs)
-         {
-           error ("too few arguments (at least %d required)", nwanted);
-           return 0;
-         }
-
-       /* Check the C type wanted for each argument
-          and see if the object given is suitable.  */
-       for (i = 0; i < nwanted; i++)
-         {
-           int wanted;
-
-           if (argtypes[i] & PA_FLAG_PTR)
-     	wanted = STRUCTURE;
-           else
-     	switch (argtypes[i] & ~PA_FLAG_MASK)
-     	  {
-     	  case PA_INT:
-     	  case PA_FLOAT:
-     	  case PA_DOUBLE:
-     	    wanted = NUMBER;
-     	    break;
-     	  case PA_CHAR:
-     	    wanted = CHAR;
-     	    break;
-     	  case PA_STRING:
-     	    wanted = STRING;
-     	    break;
-     	  case PA_POINTER:
-     	    wanted = STRUCTURE;
-     	    break;
-     	  }
-           if (TYPE (args[i]) != wanted)
-     	{
-     	  error ("type mismatch for arg number %d", i);
-     	  return 0;
-     	}
-         }
-       return 1;
-     }
-
-
-File: libc.info,  Node: Customizing Printf,  Next: Formatted Input,  Prev: Formatted Output,  Up: I/O on Streams
-
-12.13 Customizing `printf'
-==========================
-
-The GNU C Library lets you define your own custom conversion specifiers
-for `printf' template strings, to teach `printf' clever ways to print
-the important data structures of your program.
-
-   The way you do this is by registering the conversion with the
-function `register_printf_function'; see *note Registering New
-Conversions::.  One of the arguments you pass to this function is a
-pointer to a handler function that produces the actual output; see
-*note Defining the Output Handler::, for information on how to write
-this function.
-
-   You can also install a function that just returns information about
-the number and type of arguments expected by the conversion specifier.
-*Note Parsing a Template String::, for information about this.
-
-   The facilities of this section are declared in the header file
-`printf.h'.
-
-* Menu:
-
-* Registering New Conversions::         Using `register_printf_function'
-					 to register a new output conversion.
-* Conversion Specifier Options::        The handler must be able to get
-					 the options specified in the
-					 template when it is called.
-* Defining the Output Handler::         Defining the handler and arginfo
-					 functions that are passed as arguments
-					 to `register_printf_function'.
-* Printf Extension Example::            How to define a `printf'
-					 handler function.
-* Predefined Printf Handlers::          Predefined `printf' handlers.
-
-   *Portability Note:* The ability to extend the syntax of `printf'
-template strings is a GNU extension.  ISO standard C has nothing
-similar.
-
-
-File: libc.info,  Node: Registering New Conversions,  Next: Conversion Specifier Options,  Up: Customizing Printf
-
-12.13.1 Registering New Conversions
------------------------------------
-
-The function to register a new output conversion is
-`register_printf_function', declared in `printf.h'.  
-
- -- Function: int register_printf_function (int SPEC, printf_function
-          HANDLER-FUNCTION, printf_arginfo_function ARGINFO-FUNCTION)
-     Preliminary: | MT-Unsafe const:printfext | AS-Unsafe heap lock |
-     AC-Unsafe mem lock | *Note POSIX Safety Concepts::.
-
-     This function defines the conversion specifier character SPEC.
-     Thus, if SPEC is `'Y'', it defines the conversion `%Y'.  You can
-     redefine the built-in conversions like `%s', but flag characters
-     like `#' and type modifiers like `l' can never be used as
-     conversions; calling `register_printf_function' for those
-     characters has no effect.  It is advisable not to use lowercase
-     letters, since the ISO C standard warns that additional lowercase
-     letters may be standardized in future editions of the standard.
-
-     The HANDLER-FUNCTION is the function called by `printf' and
-     friends when this conversion appears in a template string.  *Note
-     Defining the Output Handler::, for information about how to define
-     a function to pass as this argument.  If you specify a null
-     pointer, any existing handler function for SPEC is removed.
-
-     The ARGINFO-FUNCTION is the function called by
-     `parse_printf_format' when this conversion appears in a template
-     string.  *Note Parsing a Template String::, for information about
-     this.
-
-     *Attention:* In the GNU C Library versions before 2.0 the
-     ARGINFO-FUNCTION function did not need to be installed unless the
-     user used the `parse_printf_format' function.  This has changed.
-     Now a call to any of the `printf' functions will call this
-     function when this format specifier appears in the format string.
-
-     The return value is `0' on success, and `-1' on failure (which
-     occurs if SPEC is out of range).
-
-     You can redefine the standard output conversions, but this is
-     probably not a good idea because of the potential for confusion.
-     Library routines written by other people could break if you do
-     this.
-
-
-File: libc.info,  Node: Conversion Specifier Options,  Next: Defining the Output Handler,  Prev: Registering New Conversions,  Up: Customizing Printf
-
-12.13.2 Conversion Specifier Options
-------------------------------------
-
-If you define a meaning for `%A', what if the template contains `%+23A'
-or `%-#A'?  To implement a sensible meaning for these, the handler when
-called needs to be able to get the options specified in the template.
-
-   Both the HANDLER-FUNCTION and ARGINFO-FUNCTION accept an argument
-that points to a `struct printf_info', which contains information about
-the options appearing in an instance of the conversion specifier.  This
-data type is declared in the header file `printf.h'.  
-
- -- Type: struct printf_info
-     This structure is used to pass information about the options
-     appearing in an instance of a conversion specifier in a `printf'
-     template string to the handler and arginfo functions for that
-     specifier.  It contains the following members:
-
-    `int prec'
-          This is the precision specified.  The value is `-1' if no
-          precision was specified.  If the precision was given as `*',
-          the `printf_info' structure passed to the handler function
-          contains the actual value retrieved from the argument list.
-          But the structure passed to the arginfo function contains a
-          value of `INT_MIN', since the actual value is not known.
-
-    `int width'
-          This is the minimum field width specified.  The value is `0'
-          if no width was specified.  If the field width was given as
-          `*', the `printf_info' structure passed to the handler
-          function contains the actual value retrieved from the
-          argument list.  But the structure passed to the arginfo
-          function contains a value of `INT_MIN', since the actual
-          value is not known.
-
-    `wchar_t spec'
-          This is the conversion specifier character specified.  It's
-          stored in the structure so that you can register the same
-          handler function for multiple characters, but still have a
-          way to tell them apart when the handler function is called.
-
-    `unsigned int is_long_double'
-          This is a boolean that is true if the `L', `ll', or `q' type
-          modifier was specified.  For integer conversions, this
-          indicates `long long int', as opposed to `long double' for
-          floating point conversions.
-
-    `unsigned int is_char'
-          This is a boolean that is true if the `hh' type modifier was
-          specified.
-
-    `unsigned int is_short'
-          This is a boolean that is true if the `h' type modifier was
-          specified.
-
-    `unsigned int is_long'
-          This is a boolean that is true if the `l' type modifier was
-          specified.
-
-    `unsigned int alt'
-          This is a boolean that is true if the `#' flag was specified.
-
-    `unsigned int space'
-          This is a boolean that is true if the ` ' flag was specified.
-
-    `unsigned int left'
-          This is a boolean that is true if the `-' flag was specified.
-
-    `unsigned int showsign'
-          This is a boolean that is true if the `+' flag was specified.
-
-    `unsigned int group'
-          This is a boolean that is true if the `'' flag was specified.
-
-    `unsigned int extra'
-          This flag has a special meaning depending on the context.  It
-          could be used freely by the user-defined handlers but when
-          called from the `printf' function this variable always
-          contains the value `0'.
-
-    `unsigned int wide'
-          This flag is set if the stream is wide oriented.
-
-    `wchar_t pad'
-          This is the character to use for padding the output to the
-          minimum field width.  The value is `'0'' if the `0' flag was
-          specified, and `' '' otherwise.
-
-
-File: libc.info,  Node: Defining the Output Handler,  Next: Printf Extension Example,  Prev: Conversion Specifier Options,  Up: Customizing Printf
-
-12.13.3 Defining the Output Handler
------------------------------------
-
-Now let's look at how to define the handler and arginfo functions which
-are passed as arguments to `register_printf_function'.
-
-   *Compatibility Note:* The interface changed in the GNU C Library
-version 2.0.  Previously the third argument was of type `va_list *'.
-
-   You should define your handler functions with a prototype like:
-
-     int FUNCTION (FILE *stream, const struct printf_info *info,
-     		    const void *const *args)
-
-   The STREAM argument passed to the handler function is the stream to
-which it should write output.
-
-   The INFO argument is a pointer to a structure that contains
-information about the various options that were included with the
-conversion in the template string.  You should not modify this structure
-inside your handler function.  *Note Conversion Specifier Options::, for
-a description of this data structure.
-
-   The ARGS is a vector of pointers to the arguments data.  The number
-of arguments was determined by calling the argument information
-function provided by the user.
-
-   Your handler function should return a value just like `printf' does:
-it should return the number of characters it has written, or a negative
-value to indicate an error.
-
- -- Data Type: printf_function
-     This is the data type that a handler function should have.
-
-   If you are going to use `parse_printf_format' in your application,
-you must also define a function to pass as the ARGINFO-FUNCTION
-argument for each new conversion you install with
-`register_printf_function'.
-
-   You have to define these functions with a prototype like:
-
-     int FUNCTION (const struct printf_info *info,
-     		    size_t n, int *argtypes)
-
-   The return value from the function should be the number of arguments
-the conversion expects.  The function should also fill in no more than
-N elements of the ARGTYPES array with information about the types of
-each of these arguments.  This information is encoded using the various
-`PA_' macros.  (You will notice that this is the same calling
-convention `parse_printf_format' itself uses.)
-
- -- Data Type: printf_arginfo_function
-     This type is used to describe functions that return information
-     about the number and type of arguments used by a conversion
-     specifier.
-
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-4 b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-4
index 5a9214e..eb1ea51 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-4
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-4
@@ -1,7 +1,24 @@
-This is
-/usr/local/google/home/jnewlin/src/uclibc/buildroot/output/build/glibc-2.19/build/manual/libc.info,
-produced by makeinfo version 4.13 from libc.texinfo.
+This is libc.info, produced by makeinfo version 5.2 from libc.texinfo.
 
+This file documents the GNU C Library.
+
+   This is 'The GNU C Library Reference Manual', for version 2.19
+(Buildroot).
+
+   Copyright (C) 1993-2014 Free Software Foundation, Inc.
+
+   Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being "Free Software Needs Free Documentation" and
+"GNU Lesser General Public License", the Front-Cover texts being "A GNU
+Manual", and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled "GNU Free Documentation
+License".
+
+   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
+modify this GNU manual.  Buying copies from the FSF supports it in
+developing GNU and promoting software freedom."
 INFO-DIR-SECTION Software libraries
 START-INFO-DIR-ENTRY
 * Libc: (libc).                 C library.
@@ -1692,37 +1709,4305 @@
 * ynl: (libc)Special Functions.
 END-INFO-DIR-ENTRY
 
-   This file documents the GNU C Library.
+
+File: libc.info,  Node: Flags for Globbing,  Next: More Flags for Globbing,  Prev: Calling Glob,  Up: Globbing
 
-   This is `The GNU C Library Reference Manual', for version 2.19
-(Buildroot).
+10.2.2 Flags for Globbing
+-------------------------
 
-   Copyright (C) 1993-2014 Free Software Foundation, Inc.
+This section describes the standard flags that you can specify in the
+FLAGS argument to 'glob'.  Choose the flags you want, and combine them
+with the C bitwise OR operator '|'.
 
-   Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version
-1.3 or any later version published by the Free Software Foundation;
-with the Invariant Sections being "Free Software Needs Free
-Documentation" and "GNU Lesser General Public License", the Front-Cover
-texts being "A GNU Manual", and with the Back-Cover Texts as in (a)
-below.  A copy of the license is included in the section entitled "GNU
-Free Documentation License".
+   Note that there are *note More Flags for Globbing:: available as GNU
+extensions.
 
-   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
-modify this GNU manual.  Buying copies from the FSF supports it in
-developing GNU and promoting software freedom."
+'GLOB_APPEND'
+     Append the words from this expansion to the vector of words
+     produced by previous calls to 'glob'.  This way you can effectively
+     expand several words as if they were concatenated with spaces
+     between them.
+
+     In order for appending to work, you must not modify the contents of
+     the word vector structure between calls to 'glob'.  And, if you set
+     'GLOB_DOOFFS' in the first call to 'glob', you must also set it
+     when you append to the results.
+
+     Note that the pointer stored in 'gl_pathv' may no longer be valid
+     after you call 'glob' the second time, because 'glob' might have
+     relocated the vector.  So always fetch 'gl_pathv' from the 'glob_t'
+     structure after each 'glob' call; *never* save the pointer across
+     calls.
+
+'GLOB_DOOFFS'
+     Leave blank slots at the beginning of the vector of words.  The
+     'gl_offs' field says how many slots to leave.  The blank slots
+     contain null pointers.
+
+'GLOB_ERR'
+     Give up right away and report an error if there is any difficulty
+     reading the directories that must be read in order to expand
+     PATTERN fully.  Such difficulties might include a directory in
+     which you don't have the requisite access.  Normally, 'glob' tries
+     its best to keep on going despite any errors, reading whatever
+     directories it can.
+
+     You can exercise even more control than this by specifying an
+     error-handler function ERRFUNC when you call 'glob'.  If ERRFUNC is
+     not a null pointer, then 'glob' doesn't give up right away when it
+     can't read a directory; instead, it calls ERRFUNC with two
+     arguments, like this:
+
+          (*ERRFUNC) (FILENAME, ERROR-CODE)
+
+     The argument FILENAME is the name of the directory that 'glob'
+     couldn't open or couldn't read, and ERROR-CODE is the 'errno' value
+     that was reported to 'glob'.
+
+     If the error handler function returns nonzero, then 'glob' gives up
+     right away.  Otherwise, it continues.
+
+'GLOB_MARK'
+     If the pattern matches the name of a directory, append '/' to the
+     directory's name when returning it.
+
+'GLOB_NOCHECK'
+     If the pattern doesn't match any file names, return the pattern
+     itself as if it were a file name that had been matched.  (Normally,
+     when the pattern doesn't match anything, 'glob' returns that there
+     were no matches.)
+
+'GLOB_NOESCAPE'
+     Don't treat the '\' character specially in patterns.  Normally, '\'
+     quotes the following character, turning off its special meaning (if
+     any) so that it matches only itself.  When quoting is enabled, the
+     pattern '\?' matches only the string '?', because the question mark
+     in the pattern acts like an ordinary character.
+
+     If you use 'GLOB_NOESCAPE', then '\' is an ordinary character.
+
+     'glob' does its work by calling the function 'fnmatch' repeatedly.
+     It handles the flag 'GLOB_NOESCAPE' by turning on the
+     'FNM_NOESCAPE' flag in calls to 'fnmatch'.
+
+'GLOB_NOSORT'
+     Don't sort the file names; return them in no particular order.  (In
+     practice, the order will depend on the order of the entries in the
+     directory.)  The only reason _not_ to sort is to save time.
+
+
+File: libc.info,  Node: More Flags for Globbing,  Prev: Flags for Globbing,  Up: Globbing
+
+10.2.3 More Flags for Globbing
+------------------------------
+
+Beside the flags described in the last section, the GNU implementation
+of 'glob' allows a few more flags which are also defined in the 'glob.h'
+file.  Some of the extensions implement functionality which is available
+in modern shell implementations.
+
+'GLOB_PERIOD'
+     The '.' character (period) is treated special.  It cannot be
+     matched by wildcards.  *Note Wildcard Matching::, 'FNM_PERIOD'.
+
+'GLOB_MAGCHAR'
+     The 'GLOB_MAGCHAR' value is not to be given to 'glob' in the FLAGS
+     parameter.  Instead, 'glob' sets this bit in the GL_FLAGS element
+     of the GLOB_T structure provided as the result if the pattern used
+     for matching contains any wildcard character.
+
+'GLOB_ALTDIRFUNC'
+     Instead of the using the using the normal functions for accessing
+     the filesystem the 'glob' implementation uses the user-supplied
+     functions specified in the structure pointed to by PGLOB parameter.
+     For more information about the functions refer to the sections
+     about directory handling see *note Accessing Directories::, and
+     *note Reading Attributes::.
+
+'GLOB_BRACE'
+     If this flag is given the handling of braces in the pattern is
+     changed.  It is now required that braces appear correctly grouped.
+     I.e., for each opening brace there must be a closing one.  Braces
+     can be used recursively.  So it is possible to define one brace
+     expression in another one.  It is important to note that the range
+     of each brace expression is completely contained in the outer brace
+     expression (if there is one).
+
+     The string between the matching braces is separated into single
+     expressions by splitting at ',' (comma) characters.  The commas
+     themselves are discarded.  Please note what we said above about
+     recursive brace expressions.  The commas used to separate the
+     subexpressions must be at the same level.  Commas in brace
+     subexpressions are not matched.  They are used during expansion of
+     the brace expression of the deeper level.  The example below shows
+     this
+
+          glob ("{foo/{,bar,biz},baz}", GLOB_BRACE, NULL, &result)
+
+     is equivalent to the sequence
+
+          glob ("foo/", GLOB_BRACE, NULL, &result)
+          glob ("foo/bar", GLOB_BRACE|GLOB_APPEND, NULL, &result)
+          glob ("foo/biz", GLOB_BRACE|GLOB_APPEND, NULL, &result)
+          glob ("baz", GLOB_BRACE|GLOB_APPEND, NULL, &result)
+
+     if we leave aside error handling.
+
+'GLOB_NOMAGIC'
+     If the pattern contains no wildcard constructs (it is a literal
+     file name), return it as the sole "matching" word, even if no file
+     exists by that name.
+
+'GLOB_TILDE'
+     If this flag is used the character '~' (tilde) is handled special
+     if it appears at the beginning of the pattern.  Instead of being
+     taken verbatim it is used to represent the home directory of a
+     known user.
+
+     If '~' is the only character in pattern or it is followed by a '/'
+     (slash), the home directory of the process owner is substituted.
+     Using 'getlogin' and 'getpwnam' the information is read from the
+     system databases.  As an example take user 'bart' with his home
+     directory at '/home/bart'.  For him a call like
+
+          glob ("~/bin/*", GLOB_TILDE, NULL, &result)
+
+     would return the contents of the directory '/home/bart/bin'.
+     Instead of referring to the own home directory it is also possible
+     to name the home directory of other users.  To do so one has to
+     append the user name after the tilde character.  So the contents of
+     user 'homer''s 'bin' directory can be retrieved by
+
+          glob ("~homer/bin/*", GLOB_TILDE, NULL, &result)
+
+     If the user name is not valid or the home directory cannot be
+     determined for some reason the pattern is left untouched and itself
+     used as the result.  I.e., if in the last example 'home' is not
+     available the tilde expansion yields to '"~homer/bin/*"' and 'glob'
+     is not looking for a directory named '~homer'.
+
+     This functionality is equivalent to what is available in C-shells
+     if the 'nonomatch' flag is set.
+
+'GLOB_TILDE_CHECK'
+     If this flag is used 'glob' behaves like as if 'GLOB_TILDE' is
+     given.  The only difference is that if the user name is not
+     available or the home directory cannot be determined for other
+     reasons this leads to an error.  'glob' will return 'GLOB_NOMATCH'
+     instead of using the pattern itself as the name.
+
+     This functionality is equivalent to what is available in C-shells
+     if 'nonomatch' flag is not set.
+
+'GLOB_ONLYDIR'
+     If this flag is used the globbing function takes this as a *hint*
+     that the caller is only interested in directories matching the
+     pattern.  If the information about the type of the file is easily
+     available non-directories will be rejected but no extra work will
+     be done to determine the information for each file.  I.e., the
+     caller must still be able to filter directories out.
+
+     This functionality is only available with the GNU 'glob'
+     implementation.  It is mainly used internally to increase the
+     performance but might be useful for a user as well and therefore is
+     documented here.
+
+   Calling 'glob' will in most cases allocate resources which are used
+to represent the result of the function call.  If the same object of
+type 'glob_t' is used in multiple call to 'glob' the resources are freed
+or reused so that no leaks appear.  But this does not include the time
+when all 'glob' calls are done.
+
+ -- Function: void globfree (glob_t *PGLOB)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt heap | AC-Unsafe corrupt
+     mem | *Note POSIX Safety Concepts::.
+
+     The 'globfree' function frees all resources allocated by previous
+     calls to 'glob' associated with the object pointed to by PGLOB.
+     This function should be called whenever the currently used 'glob_t'
+     typed object isn't used anymore.
+
+ -- Function: void globfree64 (glob64_t *PGLOB)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt lock | AC-Unsafe corrupt
+     lock fd mem | *Note POSIX Safety Concepts::.
+
+     This function is equivalent to 'globfree' but it frees records of
+     type 'glob64_t' which were allocated by 'glob64'.
+
+
+File: libc.info,  Node: Regular Expressions,  Next: Word Expansion,  Prev: Globbing,  Up: Pattern Matching
+
+10.3 Regular Expression Matching
+================================
+
+The GNU C Library supports two interfaces for matching regular
+expressions.  One is the standard POSIX.2 interface, and the other is
+what the GNU C Library has had for many years.
+
+   Both interfaces are declared in the header file 'regex.h'.  If you
+define '_POSIX_C_SOURCE', then only the POSIX.2 functions, structures,
+and constants are declared.
+
+* Menu:
+
+* POSIX Regexp Compilation::    Using 'regcomp' to prepare to match.
+* Flags for POSIX Regexps::     Syntax variations for 'regcomp'.
+* Matching POSIX Regexps::      Using 'regexec' to match the compiled
+				   pattern that you get from 'regcomp'.
+* Regexp Subexpressions::       Finding which parts of the string were matched.
+* Subexpression Complications:: Find points of which parts were matched.
+* Regexp Cleanup::		Freeing storage; reporting errors.
+
+
+File: libc.info,  Node: POSIX Regexp Compilation,  Next: Flags for POSIX Regexps,  Up: Regular Expressions
+
+10.3.1 POSIX Regular Expression Compilation
+-------------------------------------------
+
+Before you can actually match a regular expression, you must "compile"
+it.  This is not true compilation--it produces a special data structure,
+not machine instructions.  But it is like ordinary compilation in that
+its purpose is to enable you to "execute" the pattern fast.  (*Note
+Matching POSIX Regexps::, for how to use the compiled regular expression
+for matching.)
+
+   There is a special data type for compiled regular expressions:
+
+ -- Data Type: regex_t
+     This type of object holds a compiled regular expression.  It is
+     actually a structure.  It has just one field that your programs
+     should look at:
+
+     're_nsub'
+          This field holds the number of parenthetical subexpressions in
+          the regular expression that was compiled.
+
+     There are several other fields, but we don't describe them here,
+     because only the functions in the library should use them.
+
+   After you create a 'regex_t' object, you can compile a regular
+expression into it by calling 'regcomp'.
+
+ -- Function: int regcomp (regex_t *restrict COMPILED, const char
+          *restrict PATTERN, int CFLAGS)
+     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap lock dlopen
+     | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
+
+     The function 'regcomp' "compiles" a regular expression into a data
+     structure that you can use with 'regexec' to match against a
+     string.  The compiled regular expression format is designed for
+     efficient matching.  'regcomp' stores it into '*COMPILED'.
+
+     It's up to you to allocate an object of type 'regex_t' and pass its
+     address to 'regcomp'.
+
+     The argument CFLAGS lets you specify various options that control
+     the syntax and semantics of regular expressions.  *Note Flags for
+     POSIX Regexps::.
+
+     If you use the flag 'REG_NOSUB', then 'regcomp' omits from the
+     compiled regular expression the information necessary to record how
+     subexpressions actually match.  In this case, you might as well
+     pass '0' for the MATCHPTR and NMATCH arguments when you call
+     'regexec'.
+
+     If you don't use 'REG_NOSUB', then the compiled regular expression
+     does have the capacity to record how subexpressions match.  Also,
+     'regcomp' tells you how many subexpressions PATTERN has, by storing
+     the number in 'COMPILED->re_nsub'.  You can use that value to
+     decide how long an array to allocate to hold information about
+     subexpression matches.
+
+     'regcomp' returns '0' if it succeeds in compiling the regular
+     expression; otherwise, it returns a nonzero error code (see the
+     table below).  You can use 'regerror' to produce an error message
+     string describing the reason for a nonzero value; see *note Regexp
+     Cleanup::.
+
+   Here are the possible nonzero values that 'regcomp' can return:
+
+'REG_BADBR'
+     There was an invalid '\{...\}' construct in the regular expression.
+     A valid '\{...\}' construct must contain either a single number, or
+     two numbers in increasing order separated by a comma.
+
+'REG_BADPAT'
+     There was a syntax error in the regular expression.
+
+'REG_BADRPT'
+     A repetition operator such as '?' or '*' appeared in a bad position
+     (with no preceding subexpression to act on).
+
+'REG_ECOLLATE'
+     The regular expression referred to an invalid collating element
+     (one not defined in the current locale for string collation).
+     *Note Locale Categories::.
+
+'REG_ECTYPE'
+     The regular expression referred to an invalid character class name.
+
+'REG_EESCAPE'
+     The regular expression ended with '\'.
+
+'REG_ESUBREG'
+     There was an invalid number in the '\DIGIT' construct.
+
+'REG_EBRACK'
+     There were unbalanced square brackets in the regular expression.
+
+'REG_EPAREN'
+     An extended regular expression had unbalanced parentheses, or a
+     basic regular expression had unbalanced '\(' and '\)'.
+
+'REG_EBRACE'
+     The regular expression had unbalanced '\{' and '\}'.
+
+'REG_ERANGE'
+     One of the endpoints in a range expression was invalid.
+
+'REG_ESPACE'
+     'regcomp' ran out of memory.
+
+
+File: libc.info,  Node: Flags for POSIX Regexps,  Next: Matching POSIX Regexps,  Prev: POSIX Regexp Compilation,  Up: Regular Expressions
+
+10.3.2 Flags for POSIX Regular Expressions
+------------------------------------------
+
+These are the bit flags that you can use in the CFLAGS operand when
+compiling a regular expression with 'regcomp'.
+
+'REG_EXTENDED'
+     Treat the pattern as an extended regular expression, rather than as
+     a basic regular expression.
+
+'REG_ICASE'
+     Ignore case when matching letters.
+
+'REG_NOSUB'
+     Don't bother storing the contents of the MATCHES-PTR array.
+
+'REG_NEWLINE'
+     Treat a newline in STRING as dividing STRING into multiple lines,
+     so that '$' can match before the newline and '^' can match after.
+     Also, don't permit '.' to match a newline, and don't permit
+     '[^...]' to match a newline.
+
+     Otherwise, newline acts like any other ordinary character.
+
+
+File: libc.info,  Node: Matching POSIX Regexps,  Next: Regexp Subexpressions,  Prev: Flags for POSIX Regexps,  Up: Regular Expressions
+
+10.3.3 Matching a Compiled POSIX Regular Expression
+---------------------------------------------------
+
+Once you have compiled a regular expression, as described in *note POSIX
+Regexp Compilation::, you can match it against strings using 'regexec'.
+A match anywhere inside the string counts as success, unless the regular
+expression contains anchor characters ('^' or '$').
+
+ -- Function: int regexec (const regex_t *restrict COMPILED, const char
+          *restrict STRING, size_t NMATCH, regmatch_t
+          MATCHPTR[restrict], int EFLAGS)
+     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap lock dlopen
+     | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
+
+     This function tries to match the compiled regular expression
+     '*COMPILED' against STRING.
+
+     'regexec' returns '0' if the regular expression matches; otherwise,
+     it returns a nonzero value.  See the table below for what nonzero
+     values mean.  You can use 'regerror' to produce an error message
+     string describing the reason for a nonzero value; see *note Regexp
+     Cleanup::.
+
+     The argument EFLAGS is a word of bit flags that enable various
+     options.
+
+     If you want to get information about what part of STRING actually
+     matched the regular expression or its subexpressions, use the
+     arguments MATCHPTR and NMATCH.  Otherwise, pass '0' for NMATCH, and
+     'NULL' for MATCHPTR.  *Note Regexp Subexpressions::.
+
+   You must match the regular expression with the same set of current
+locales that were in effect when you compiled the regular expression.
+
+   The function 'regexec' accepts the following flags in the EFLAGS
+argument:
+
+'REG_NOTBOL'
+     Do not regard the beginning of the specified string as the
+     beginning of a line; more generally, don't make any assumptions
+     about what text might precede it.
+
+'REG_NOTEOL'
+     Do not regard the end of the specified string as the end of a line;
+     more generally, don't make any assumptions about what text might
+     follow it.
+
+   Here are the possible nonzero values that 'regexec' can return:
+
+'REG_NOMATCH'
+     The pattern didn't match the string.  This isn't really an error.
+
+'REG_ESPACE'
+     'regexec' ran out of memory.
+
+
+File: libc.info,  Node: Regexp Subexpressions,  Next: Subexpression Complications,  Prev: Matching POSIX Regexps,  Up: Regular Expressions
+
+10.3.4 Match Results with Subexpressions
+----------------------------------------
+
+When 'regexec' matches parenthetical subexpressions of PATTERN, it
+records which parts of STRING they match.  It returns that information
+by storing the offsets into an array whose elements are structures of
+type 'regmatch_t'.  The first element of the array (index '0') records
+the part of the string that matched the entire regular expression.  Each
+other element of the array records the beginning and end of the part
+that matched a single parenthetical subexpression.
+
+ -- Data Type: regmatch_t
+     This is the data type of the MATCHARRAY array that you pass to
+     'regexec'.  It contains two structure fields, as follows:
+
+     'rm_so'
+          The offset in STRING of the beginning of a substring.  Add
+          this value to STRING to get the address of that part.
+
+     'rm_eo'
+          The offset in STRING of the end of the substring.
+
+ -- Data Type: regoff_t
+     'regoff_t' is an alias for another signed integer type.  The fields
+     of 'regmatch_t' have type 'regoff_t'.
+
+   The 'regmatch_t' elements correspond to subexpressions positionally;
+the first element (index '1') records where the first subexpression
+matched, the second element records the second subexpression, and so on.
+The order of the subexpressions is the order in which they begin.
+
+   When you call 'regexec', you specify how long the MATCHPTR array is,
+with the NMATCH argument.  This tells 'regexec' how many elements to
+store.  If the actual regular expression has more than NMATCH
+subexpressions, then you won't get offset information about the rest of
+them.  But this doesn't alter whether the pattern matches a particular
+string or not.
+
+   If you don't want 'regexec' to return any information about where the
+subexpressions matched, you can either supply '0' for NMATCH, or use the
+flag 'REG_NOSUB' when you compile the pattern with 'regcomp'.
+
+
+File: libc.info,  Node: Subexpression Complications,  Next: Regexp Cleanup,  Prev: Regexp Subexpressions,  Up: Regular Expressions
+
+10.3.5 Complications in Subexpression Matching
+----------------------------------------------
+
+Sometimes a subexpression matches a substring of no characters.  This
+happens when 'f\(o*\)' matches the string 'fum'.  (It really matches
+just the 'f'.)  In this case, both of the offsets identify the point in
+the string where the null substring was found.  In this example, the
+offsets are both '1'.
+
+   Sometimes the entire regular expression can match without using some
+of its subexpressions at all--for example, when 'ba\(na\)*' matches the
+string 'ba', the parenthetical subexpression is not used.  When this
+happens, 'regexec' stores '-1' in both fields of the element for that
+subexpression.
+
+   Sometimes matching the entire regular expression can match a
+particular subexpression more than once--for example, when 'ba\(na\)*'
+matches the string 'bananana', the parenthetical subexpression matches
+three times.  When this happens, 'regexec' usually stores the offsets of
+the last part of the string that matched the subexpression.  In the case
+of 'bananana', these offsets are '6' and '8'.
+
+   But the last match is not always the one that is chosen.  It's more
+accurate to say that the last _opportunity_ to match is the one that
+takes precedence.  What this means is that when one subexpression
+appears within another, then the results reported for the inner
+subexpression reflect whatever happened on the last match of the outer
+subexpression.  For an example, consider '\(ba\(na\)*s \)*' matching the
+string 'bananas bas '.  The last time the inner expression actually
+matches is near the end of the first word.  But it is _considered_ again
+in the second word, and fails to match there.  'regexec' reports nonuse
+of the "na" subexpression.
+
+   Another place where this rule applies is when the regular expression
+     \(ba\(na\)*s \|nefer\(ti\)* \)*
+matches 'bananas nefertiti'.  The "na" subexpression does match in the
+first word, but it doesn't match in the second word because the other
+alternative is used there.  Once again, the second repetition of the
+outer subexpression overrides the first, and within that second
+repetition, the "na" subexpression is not used.  So 'regexec' reports
+nonuse of the "na" subexpression.
+
+
+File: libc.info,  Node: Regexp Cleanup,  Prev: Subexpression Complications,  Up: Regular Expressions
+
+10.3.6 POSIX Regexp Matching Cleanup
+------------------------------------
+
+When you are finished using a compiled regular expression, you can free
+the storage it uses by calling 'regfree'.
+
+ -- Function: void regfree (regex_t *COMPILED)
+     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
+     POSIX Safety Concepts::.
+
+     Calling 'regfree' frees all the storage that '*COMPILED' points to.
+     This includes various internal fields of the 'regex_t' structure
+     that aren't documented in this manual.
+
+     'regfree' does not free the object '*COMPILED' itself.
+
+   You should always free the space in a 'regex_t' structure with
+'regfree' before using the structure to compile another regular
+expression.
+
+   When 'regcomp' or 'regexec' reports an error, you can use the
+function 'regerror' to turn it into an error message string.
+
+ -- Function: size_t regerror (int ERRCODE, const regex_t *restrict
+          COMPILED, char *restrict BUFFER, size_t LENGTH)
+     Preliminary: | MT-Safe env | AS-Unsafe corrupt heap lock dlopen |
+     AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
+
+     This function produces an error message string for the error code
+     ERRCODE, and stores the string in LENGTH bytes of memory starting
+     at BUFFER.  For the COMPILED argument, supply the same compiled
+     regular expression structure that 'regcomp' or 'regexec' was
+     working with when it got the error.  Alternatively, you can supply
+     'NULL' for COMPILED; you will still get a meaningful error message,
+     but it might not be as detailed.
+
+     If the error message can't fit in LENGTH bytes (including a
+     terminating null character), then 'regerror' truncates it.  The
+     string that 'regerror' stores is always null-terminated even if it
+     has been truncated.
+
+     The return value of 'regerror' is the minimum length needed to
+     store the entire error message.  If this is less than LENGTH, then
+     the error message was not truncated, and you can use it.
+     Otherwise, you should call 'regerror' again with a larger buffer.
+
+     Here is a function which uses 'regerror', but always dynamically
+     allocates a buffer for the error message:
+
+          char *get_regerror (int errcode, regex_t *compiled)
+          {
+            size_t length = regerror (errcode, compiled, NULL, 0);
+            char *buffer = xmalloc (length);
+            (void) regerror (errcode, compiled, buffer, length);
+            return buffer;
+          }
+
+
+File: libc.info,  Node: Word Expansion,  Prev: Regular Expressions,  Up: Pattern Matching
+
+10.4 Shell-Style Word Expansion
+===============================
+
+"Word expansion" means the process of splitting a string into "words"
+and substituting for variables, commands, and wildcards just as the
+shell does.
+
+   For example, when you write 'ls -l foo.c', this string is split into
+three separate words--'ls', '-l' and 'foo.c'.  This is the most basic
+function of word expansion.
+
+   When you write 'ls *.c', this can become many words, because the word
+'*.c' can be replaced with any number of file names.  This is called
+"wildcard expansion", and it is also a part of word expansion.
+
+   When you use 'echo $PATH' to print your path, you are taking
+advantage of "variable substitution", which is also part of word
+expansion.
+
+   Ordinary programs can perform word expansion just like the shell by
+calling the library function 'wordexp'.
+
+* Menu:
+
+* Expansion Stages::            What word expansion does to a string.
+* Calling Wordexp::             How to call 'wordexp'.
+* Flags for Wordexp::           Options you can enable in 'wordexp'.
+* Wordexp Example::             A sample program that does word expansion.
+* Tilde Expansion::             Details of how tilde expansion works.
+* Variable Substitution::       Different types of variable substitution.
+
+
+File: libc.info,  Node: Expansion Stages,  Next: Calling Wordexp,  Up: Word Expansion
+
+10.4.1 The Stages of Word Expansion
+-----------------------------------
+
+When word expansion is applied to a sequence of words, it performs the
+following transformations in the order shown here:
+
+  1. "Tilde expansion": Replacement of '~foo' with the name of the home
+     directory of 'foo'.
+
+  2. Next, three different transformations are applied in the same step,
+     from left to right:
+
+        * "Variable substitution": Environment variables are substituted
+          for references such as '$foo'.
+
+        * "Command substitution": Constructs such as '`cat foo`' and the
+          equivalent '$(cat foo)' are replaced with the output from the
+          inner command.
+
+        * "Arithmetic expansion": Constructs such as '$(($x-1))' are
+          replaced with the result of the arithmetic computation.
+
+  3. "Field splitting": subdivision of the text into "words".
+
+  4. "Wildcard expansion": The replacement of a construct such as '*.c'
+     with a list of '.c' file names.  Wildcard expansion applies to an
+     entire word at a time, and replaces that word with 0 or more file
+     names that are themselves words.
+
+  5. "Quote removal": The deletion of string-quotes, now that they have
+     done their job by inhibiting the above transformations when
+     appropriate.
+
+   For the details of these transformations, and how to write the
+constructs that use them, see 'The BASH Manual' (to appear).
+
+
+File: libc.info,  Node: Calling Wordexp,  Next: Flags for Wordexp,  Prev: Expansion Stages,  Up: Word Expansion
+
+10.4.2 Calling 'wordexp'
+------------------------
+
+All the functions, constants and data types for word expansion are
+declared in the header file 'wordexp.h'.
+
+   Word expansion produces a vector of words (strings).  To return this
+vector, 'wordexp' uses a special data type, 'wordexp_t', which is a
+structure.  You pass 'wordexp' the address of the structure, and it
+fills in the structure's fields to tell you about the results.
+
+ -- Data Type: wordexp_t
+     This data type holds a pointer to a word vector.  More precisely,
+     it records both the address of the word vector and its size.
+
+     'we_wordc'
+          The number of elements in the vector.
+
+     'we_wordv'
+          The address of the vector.  This field has type 'char **'.
+
+     'we_offs'
+          The offset of the first real element of the vector, from its
+          nominal address in the 'we_wordv' field.  Unlike the other
+          fields, this is always an input to 'wordexp', rather than an
+          output from it.
+
+          If you use a nonzero offset, then that many elements at the
+          beginning of the vector are left empty.  (The 'wordexp'
+          function fills them with null pointers.)
+
+          The 'we_offs' field is meaningful only if you use the
+          'WRDE_DOOFFS' flag.  Otherwise, the offset is always zero
+          regardless of what is in this field, and the first real
+          element comes at the beginning of the vector.
+
+ -- Function: int wordexp (const char *WORDS, wordexp_t
+          *WORD-VECTOR-PTR, int FLAGS)
+     Preliminary: | MT-Unsafe race:utent const:env env sig:ALRM timer
+     locale | AS-Unsafe dlopen plugin i18n heap corrupt lock | AC-Unsafe
+     corrupt lock fd mem | *Note POSIX Safety Concepts::.
+
+     Perform word expansion on the string WORDS, putting the result in a
+     newly allocated vector, and store the size and address of this
+     vector into '*WORD-VECTOR-PTR'.  The argument FLAGS is a
+     combination of bit flags; see *note Flags for Wordexp::, for
+     details of the flags.
+
+     You shouldn't use any of the characters '|&;<>' in the string WORDS
+     unless they are quoted; likewise for newline.  If you use these
+     characters unquoted, you will get the 'WRDE_BADCHAR' error code.
+     Don't use parentheses or braces unless they are quoted or part of a
+     word expansion construct.  If you use quotation characters ''"`',
+     they should come in pairs that balance.
+
+     The results of word expansion are a sequence of words.  The
+     function 'wordexp' allocates a string for each resulting word, then
+     allocates a vector of type 'char **' to store the addresses of
+     these strings.  The last element of the vector is a null pointer.
+     This vector is called the "word vector".
+
+     To return this vector, 'wordexp' stores both its address and its
+     length (number of elements, not counting the terminating null
+     pointer) into '*WORD-VECTOR-PTR'.
+
+     If 'wordexp' succeeds, it returns 0.  Otherwise, it returns one of
+     these error codes:
+
+     'WRDE_BADCHAR'
+          The input string WORDS contains an unquoted invalid character
+          such as '|'.
+
+     'WRDE_BADVAL'
+          The input string refers to an undefined shell variable, and
+          you used the flag 'WRDE_UNDEF' to forbid such references.
+
+     'WRDE_CMDSUB'
+          The input string uses command substitution, and you used the
+          flag 'WRDE_NOCMD' to forbid command substitution.
+
+     'WRDE_NOSPACE'
+          It was impossible to allocate memory to hold the result.  In
+          this case, 'wordexp' can store part of the results--as much as
+          it could allocate room for.
+
+     'WRDE_SYNTAX'
+          There was a syntax error in the input string.  For example, an
+          unmatched quoting character is a syntax error.
+
+ -- Function: void wordfree (wordexp_t *WORD-VECTOR-PTR)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt heap | AC-Unsafe corrupt
+     mem | *Note POSIX Safety Concepts::.
+
+     Free the storage used for the word-strings and vector that
+     '*WORD-VECTOR-PTR' points to.  This does not free the structure
+     '*WORD-VECTOR-PTR' itself--only the other data it points to.
+
+
+File: libc.info,  Node: Flags for Wordexp,  Next: Wordexp Example,  Prev: Calling Wordexp,  Up: Word Expansion
+
+10.4.3 Flags for Word Expansion
+-------------------------------
+
+This section describes the flags that you can specify in the FLAGS
+argument to 'wordexp'.  Choose the flags you want, and combine them with
+the C operator '|'.
+
+'WRDE_APPEND'
+     Append the words from this expansion to the vector of words
+     produced by previous calls to 'wordexp'.  This way you can
+     effectively expand several words as if they were concatenated with
+     spaces between them.
+
+     In order for appending to work, you must not modify the contents of
+     the word vector structure between calls to 'wordexp'.  And, if you
+     set 'WRDE_DOOFFS' in the first call to 'wordexp', you must also set
+     it when you append to the results.
+
+'WRDE_DOOFFS'
+     Leave blank slots at the beginning of the vector of words.  The
+     'we_offs' field says how many slots to leave.  The blank slots
+     contain null pointers.
+
+'WRDE_NOCMD'
+     Don't do command substitution; if the input requests command
+     substitution, report an error.
+
+'WRDE_REUSE'
+     Reuse a word vector made by a previous call to 'wordexp'.  Instead
+     of allocating a new vector of words, this call to 'wordexp' will
+     use the vector that already exists (making it larger if necessary).
+
+     Note that the vector may move, so it is not safe to save an old
+     pointer and use it again after calling 'wordexp'.  You must fetch
+     'we_pathv' anew after each call.
+
+'WRDE_SHOWERR'
+     Do show any error messages printed by commands run by command
+     substitution.  More precisely, allow these commands to inherit the
+     standard error output stream of the current process.  By default,
+     'wordexp' gives these commands a standard error stream that
+     discards all output.
+
+'WRDE_UNDEF'
+     If the input refers to a shell variable that is not defined, report
+     an error.
+
+
+File: libc.info,  Node: Wordexp Example,  Next: Tilde Expansion,  Prev: Flags for Wordexp,  Up: Word Expansion
+
+10.4.4 'wordexp' Example
+------------------------
+
+Here is an example of using 'wordexp' to expand several strings and use
+the results to run a shell command.  It also shows the use of
+'WRDE_APPEND' to concatenate the expansions and of 'wordfree' to free
+the space allocated by 'wordexp'.
+
+     int
+     expand_and_execute (const char *program, const char **options)
+     {
+       wordexp_t result;
+       pid_t pid
+       int status, i;
+
+       /* Expand the string for the program to run.  */
+       switch (wordexp (program, &result, 0))
+         {
+         case 0:			/* Successful.  */
+           break;
+         case WRDE_NOSPACE:
+           /* If the error was 'WRDE_NOSPACE',
+              then perhaps part of the result was allocated.  */
+           wordfree (&result);
+         default:                    /* Some other error.  */
+           return -1;
+         }
+
+       /* Expand the strings specified for the arguments.  */
+       for (i = 0; options[i] != NULL; i++)
+         {
+           if (wordexp (options[i], &result, WRDE_APPEND))
+             {
+               wordfree (&result);
+               return -1;
+             }
+         }
+
+       pid = fork ();
+       if (pid == 0)
+         {
+           /* This is the child process.  Execute the command. */
+           execv (result.we_wordv[0], result.we_wordv);
+           exit (EXIT_FAILURE);
+         }
+       else if (pid < 0)
+         /* The fork failed.  Report failure.  */
+         status = -1;
+       else
+         /* This is the parent process.  Wait for the child to complete.  */
+         if (waitpid (pid, &status, 0) != pid)
+           status = -1;
+
+       wordfree (&result);
+       return status;
+     }
+
+
+File: libc.info,  Node: Tilde Expansion,  Next: Variable Substitution,  Prev: Wordexp Example,  Up: Word Expansion
+
+10.4.5 Details of Tilde Expansion
+---------------------------------
+
+It's a standard part of shell syntax that you can use '~' at the
+beginning of a file name to stand for your own home directory.  You can
+use '~USER' to stand for USER's home directory.
+
+   "Tilde expansion" is the process of converting these abbreviations to
+the directory names that they stand for.
+
+   Tilde expansion applies to the '~' plus all following characters up
+to whitespace or a slash.  It takes place only at the beginning of a
+word, and only if none of the characters to be transformed is quoted in
+any way.
+
+   Plain '~' uses the value of the environment variable 'HOME' as the
+proper home directory name.  '~' followed by a user name uses
+'getpwname' to look up that user in the user database, and uses whatever
+directory is recorded there.  Thus, '~' followed by your own name can
+give different results from plain '~', if the value of 'HOME' is not
+really your home directory.
+
+
+File: libc.info,  Node: Variable Substitution,  Prev: Tilde Expansion,  Up: Word Expansion
+
+10.4.6 Details of Variable Substitution
+---------------------------------------
+
+Part of ordinary shell syntax is the use of '$VARIABLE' to substitute
+the value of a shell variable into a command.  This is called "variable
+substitution", and it is one part of doing word expansion.
+
+   There are two basic ways you can write a variable reference for
+substitution:
+
+'${VARIABLE}'
+     If you write braces around the variable name, then it is completely
+     unambiguous where the variable name ends.  You can concatenate
+     additional letters onto the end of the variable value by writing
+     them immediately after the close brace.  For example, '${foo}s'
+     expands into 'tractors'.
+
+'$VARIABLE'
+     If you do not put braces around the variable name, then the
+     variable name consists of all the alphanumeric characters and
+     underscores that follow the '$'.  The next punctuation character
+     ends the variable name.  Thus, '$foo-bar' refers to the variable
+     'foo' and expands into 'tractor-bar'.
+
+   When you use braces, you can also use various constructs to modify
+the value that is substituted, or test it in various ways.
+
+'${VARIABLE:-DEFAULT}'
+     Substitute the value of VARIABLE, but if that is empty or
+     undefined, use DEFAULT instead.
+
+'${VARIABLE:=DEFAULT}'
+     Substitute the value of VARIABLE, but if that is empty or
+     undefined, use DEFAULT instead and set the variable to DEFAULT.
+
+'${VARIABLE:?MESSAGE}'
+     If VARIABLE is defined and not empty, substitute its value.
+
+     Otherwise, print MESSAGE as an error message on the standard error
+     stream, and consider word expansion a failure.
+
+'${VARIABLE:+REPLACEMENT}'
+     Substitute REPLACEMENT, but only if VARIABLE is defined and
+     nonempty.  Otherwise, substitute nothing for this construct.
+
+'${#VARIABLE}'
+     Substitute a numeral which expresses in base ten the number of
+     characters in the value of VARIABLE.  '${#foo}' stands for '7',
+     because 'tractor' is seven characters.
+
+   These variants of variable substitution let you remove part of the
+variable's value before substituting it.  The PREFIX and SUFFIX are not
+mere strings; they are wildcard patterns, just like the patterns that
+you use to match multiple file names.  But in this context, they match
+against parts of the variable value rather than against file names.
+
+'${VARIABLE%%SUFFIX}'
+     Substitute the value of VARIABLE, but first discard from that
+     variable any portion at the end that matches the pattern SUFFIX.
+
+     If there is more than one alternative for how to match against
+     SUFFIX, this construct uses the longest possible match.
+
+     Thus, '${foo%%r*}' substitutes 't', because the largest match for
+     'r*' at the end of 'tractor' is 'ractor'.
+
+'${VARIABLE%SUFFIX}'
+     Substitute the value of VARIABLE, but first discard from that
+     variable any portion at the end that matches the pattern SUFFIX.
+
+     If there is more than one alternative for how to match against
+     SUFFIX, this construct uses the shortest possible alternative.
+
+     Thus, '${foo%r*}' substitutes 'tracto', because the shortest match
+     for 'r*' at the end of 'tractor' is just 'r'.
+
+'${VARIABLE##PREFIX}'
+     Substitute the value of VARIABLE, but first discard from that
+     variable any portion at the beginning that matches the pattern
+     PREFIX.
+
+     If there is more than one alternative for how to match against
+     PREFIX, this construct uses the longest possible match.
+
+     Thus, '${foo##*t}' substitutes 'or', because the largest match for
+     '*t' at the beginning of 'tractor' is 'tract'.
+
+'${VARIABLE#PREFIX}'
+     Substitute the value of VARIABLE, but first discard from that
+     variable any portion at the beginning that matches the pattern
+     PREFIX.
+
+     If there is more than one alternative for how to match against
+     PREFIX, this construct uses the shortest possible alternative.
+
+     Thus, '${foo#*t}' substitutes 'ractor', because the shortest match
+     for '*t' at the beginning of 'tractor' is just 't'.
+
+
+File: libc.info,  Node: I/O Overview,  Next: I/O on Streams,  Prev: Pattern Matching,  Up: Top
+
+11 Input/Output Overview
+************************
+
+Most programs need to do either input (reading data) or output (writing
+data), or most frequently both, in order to do anything useful.  The GNU
+C Library provides such a large selection of input and output functions
+that the hardest part is often deciding which function is most
+appropriate!
+
+   This chapter introduces concepts and terminology relating to input
+and output.  Other chapters relating to the GNU I/O facilities are:
+
+   * *note I/O on Streams::, which covers the high-level functions that
+     operate on streams, including formatted input and output.
+
+   * *note Low-Level I/O::, which covers the basic I/O and control
+     functions on file descriptors.
+
+   * *note File System Interface::, which covers functions for operating
+     on directories and for manipulating file attributes such as access
+     modes and ownership.
+
+   * *note Pipes and FIFOs::, which includes information on the basic
+     interprocess communication facilities.
+
+   * *note Sockets::, which covers a more complicated interprocess
+     communication facility with support for networking.
+
+   * *note Low-Level Terminal Interface::, which covers functions for
+     changing how input and output to terminals or other serial devices
+     are processed.
+
+* Menu:
+
+* I/O Concepts::       Some basic information and terminology.
+* File Names::         How to refer to a file.
+
+
+File: libc.info,  Node: I/O Concepts,  Next: File Names,  Up: I/O Overview
+
+11.1 Input/Output Concepts
+==========================
+
+Before you can read or write the contents of a file, you must establish
+a connection or communications channel to the file.  This process is
+called "opening" the file.  You can open a file for reading, writing, or
+both.
+
+   The connection to an open file is represented either as a stream or
+as a file descriptor.  You pass this as an argument to the functions
+that do the actual read or write operations, to tell them which file to
+operate on.  Certain functions expect streams, and others are designed
+to operate on file descriptors.
+
+   When you have finished reading to or writing from the file, you can
+terminate the connection by "closing" the file.  Once you have closed a
+stream or file descriptor, you cannot do any more input or output
+operations on it.
+
+* Menu:
+
+* Streams and File Descriptors::    The GNU C Library provides two ways
+			             to access the contents of files.
+* File Position::                   The number of bytes from the
+                                     beginning of the file.
+
+
+File: libc.info,  Node: Streams and File Descriptors,  Next: File Position,  Up: I/O Concepts
+
+11.1.1 Streams and File Descriptors
+-----------------------------------
+
+When you want to do input or output to a file, you have a choice of two
+basic mechanisms for representing the connection between your program
+and the file: file descriptors and streams.  File descriptors are
+represented as objects of type 'int', while streams are represented as
+'FILE *' objects.
+
+   File descriptors provide a primitive, low-level interface to input
+and output operations.  Both file descriptors and streams can represent
+a connection to a device (such as a terminal), or a pipe or socket for
+communicating with another process, as well as a normal file.  But, if
+you want to do control operations that are specific to a particular kind
+of device, you must use a file descriptor; there are no facilities to
+use streams in this way.  You must also use file descriptors if your
+program needs to do input or output in special modes, such as
+nonblocking (or polled) input (*note File Status Flags::).
+
+   Streams provide a higher-level interface, layered on top of the
+primitive file descriptor facilities.  The stream interface treats all
+kinds of files pretty much alike--the sole exception being the three
+styles of buffering that you can choose (*note Stream Buffering::).
+
+   The main advantage of using the stream interface is that the set of
+functions for performing actual input and output operations (as opposed
+to control operations) on streams is much richer and more powerful than
+the corresponding facilities for file descriptors.  The file descriptor
+interface provides only simple functions for transferring blocks of
+characters, but the stream interface also provides powerful formatted
+input and output functions ('printf' and 'scanf') as well as functions
+for character- and line-oriented input and output.
+
+   Since streams are implemented in terms of file descriptors, you can
+extract the file descriptor from a stream and perform low-level
+operations directly on the file descriptor.  You can also initially open
+a connection as a file descriptor and then make a stream associated with
+that file descriptor.
+
+   In general, you should stick with using streams rather than file
+descriptors, unless there is some specific operation you want to do that
+can only be done on a file descriptor.  If you are a beginning
+programmer and aren't sure what functions to use, we suggest that you
+concentrate on the formatted input functions (*note Formatted Input::)
+and formatted output functions (*note Formatted Output::).
+
+   If you are concerned about portability of your programs to systems
+other than GNU, you should also be aware that file descriptors are not
+as portable as streams.  You can expect any system running ISO C to
+support streams, but non-GNU systems may not support file descriptors at
+all, or may only implement a subset of the GNU functions that operate on
+file descriptors.  Most of the file descriptor functions in the GNU C
+Library are included in the POSIX.1 standard, however.
+
+
+File: libc.info,  Node: File Position,  Prev: Streams and File Descriptors,  Up: I/O Concepts
+
+11.1.2 File Position
+--------------------
+
+One of the attributes of an open file is its "file position" that keeps
+track of where in the file the next character is to be read or written.
+On GNU systems, and all POSIX.1 systems, the file position is simply an
+integer representing the number of bytes from the beginning of the file.
+
+   The file position is normally set to the beginning of the file when
+it is opened, and each time a character is read or written, the file
+position is incremented.  In other words, access to the file is normally
+"sequential".
+
+   Ordinary files permit read or write operations at any position within
+the file.  Some other kinds of files may also permit this.  Files which
+do permit this are sometimes referred to as "random-access" files.  You
+can change the file position using the 'fseek' function on a stream
+(*note File Positioning::) or the 'lseek' function on a file descriptor
+(*note I/O Primitives::).  If you try to change the file position on a
+file that doesn't support random access, you get the 'ESPIPE' error.
+
+   Streams and descriptors that are opened for "append access" are
+treated specially for output: output to such files is _always_ appended
+sequentially to the _end_ of the file, regardless of the file position.
+However, the file position is still used to control where in the file
+reading is done.
+
+   If you think about it, you'll realize that several programs can read
+a given file at the same time.  In order for each program to be able to
+read the file at its own pace, each program must have its own file
+pointer, which is not affected by anything the other programs do.
+
+   In fact, each opening of a file creates a separate file position.
+Thus, if you open a file twice even in the same program, you get two
+streams or descriptors with independent file positions.
+
+   By contrast, if you open a descriptor and then duplicate it to get
+another descriptor, these two descriptors share the same file position:
+changing the file position of one descriptor will affect the other.
+
+
+File: libc.info,  Node: File Names,  Prev: I/O Concepts,  Up: I/O Overview
+
+11.2 File Names
+===============
+
+In order to open a connection to a file, or to perform other operations
+such as deleting a file, you need some way to refer to the file.  Nearly
+all files have names that are strings--even files which are actually
+devices such as tape drives or terminals.  These strings are called
+"file names".  You specify the file name to say which file you want to
+open or operate on.
+
+   This section describes the conventions for file names and how the
+operating system works with them.
+
+* Menu:
+
+* Directories::                 Directories contain entries for files.
+* File Name Resolution::        A file name specifies how to look up a file.
+* File Name Errors::            Error conditions relating to file names.
+* File Name Portability::       File name portability and syntax issues.
+
+
+File: libc.info,  Node: Directories,  Next: File Name Resolution,  Up: File Names
+
+11.2.1 Directories
+------------------
+
+In order to understand the syntax of file names, you need to understand
+how the file system is organized into a hierarchy of directories.
+
+   A "directory" is a file that contains information to associate other
+files with names; these associations are called "links" or "directory
+entries".  Sometimes, people speak of "files in a directory", but in
+reality, a directory only contains pointers to files, not the files
+themselves.
+
+   The name of a file contained in a directory entry is called a "file
+name component".  In general, a file name consists of a sequence of one
+or more such components, separated by the slash character ('/').  A file
+name which is just one component names a file with respect to its
+directory.  A file name with multiple components names a directory, and
+then a file in that directory, and so on.
+
+   Some other documents, such as the POSIX standard, use the term
+"pathname" for what we call a file name, and either "filename" or
+"pathname component" for what this manual calls a file name component.
+We don't use this terminology because a "path" is something completely
+different (a list of directories to search), and we think that
+"pathname" used for something else will confuse users.  We always use
+"file name" and "file name component" (or sometimes just "component",
+where the context is obvious) in GNU documentation.  Some macros use the
+POSIX terminology in their names, such as 'PATH_MAX'.  These macros are
+defined by the POSIX standard, so we cannot change their names.
+
+   You can find more detailed information about operations on
+directories in *note File System Interface::.
+
+
+File: libc.info,  Node: File Name Resolution,  Next: File Name Errors,  Prev: Directories,  Up: File Names
+
+11.2.2 File Name Resolution
+---------------------------
+
+A file name consists of file name components separated by slash ('/')
+characters.  On the systems that the GNU C Library supports, multiple
+successive '/' characters are equivalent to a single '/' character.
+
+   The process of determining what file a file name refers to is called
+"file name resolution".  This is performed by examining the components
+that make up a file name in left-to-right order, and locating each
+successive component in the directory named by the previous component.
+Of course, each of the files that are referenced as directories must
+actually exist, be directories instead of regular files, and have the
+appropriate permissions to be accessible by the process; otherwise the
+file name resolution fails.
+
+   If a file name begins with a '/', the first component in the file
+name is located in the "root directory" of the process (usually all
+processes on the system have the same root directory).  Such a file name
+is called an "absolute file name".
+
+   Otherwise, the first component in the file name is located in the
+current working directory (*note Working Directory::).  This kind of
+file name is called a "relative file name".
+
+   The file name components '.' ("dot") and '..' ("dot-dot") have
+special meanings.  Every directory has entries for these file name
+components.  The file name component '.' refers to the directory itself,
+while the file name component '..' refers to its "parent directory" (the
+directory that contains the link for the directory in question).  As a
+special case, '..' in the root directory refers to the root directory
+itself, since it has no parent; thus '/..' is the same as '/'.
+
+   Here are some examples of file names:
+
+'/a'
+     The file named 'a', in the root directory.
+
+'/a/b'
+     The file named 'b', in the directory named 'a' in the root
+     directory.
+
+'a'
+     The file named 'a', in the current working directory.
+
+'/a/./b'
+     This is the same as '/a/b'.
+
+'./a'
+     The file named 'a', in the current working directory.
+
+'../a'
+     The file named 'a', in the parent directory of the current working
+     directory.
+
+   A file name that names a directory may optionally end in a '/'.  You
+can specify a file name of '/' to refer to the root directory, but the
+empty string is not a meaningful file name.  If you want to refer to the
+current working directory, use a file name of '.' or './'.
+
+   Unlike some other operating systems, GNU systems don't have any
+built-in support for file types (or extensions) or file versions as part
+of its file name syntax.  Many programs and utilities use conventions
+for file names--for example, files containing C source code usually have
+names suffixed with '.c'--but there is nothing in the file system itself
+that enforces this kind of convention.
+
+
+File: libc.info,  Node: File Name Errors,  Next: File Name Portability,  Prev: File Name Resolution,  Up: File Names
+
+11.2.3 File Name Errors
+-----------------------
+
+Functions that accept file name arguments usually detect these 'errno'
+error conditions relating to the file name syntax or trouble finding the
+named file.  These errors are referred to throughout this manual as the
+"usual file name errors".
+
+'EACCES'
+     The process does not have search permission for a directory
+     component of the file name.
+
+'ENAMETOOLONG'
+     This error is used when either the total length of a file name is
+     greater than 'PATH_MAX', or when an individual file name component
+     has a length greater than 'NAME_MAX'.  *Note Limits for Files::.
+
+     On GNU/Hurd systems, there is no imposed limit on overall file name
+     length, but some file systems may place limits on the length of a
+     component.
+
+'ENOENT'
+     This error is reported when a file referenced as a directory
+     component in the file name doesn't exist, or when a component is a
+     symbolic link whose target file does not exist.  *Note Symbolic
+     Links::.
+
+'ENOTDIR'
+     A file that is referenced as a directory component in the file name
+     exists, but it isn't a directory.
+
+'ELOOP'
+     Too many symbolic links were resolved while trying to look up the
+     file name.  The system has an arbitrary limit on the number of
+     symbolic links that may be resolved in looking up a single file
+     name, as a primitive way to detect loops.  *Note Symbolic Links::.
+
+
+File: libc.info,  Node: File Name Portability,  Prev: File Name Errors,  Up: File Names
+
+11.2.4 Portability of File Names
+--------------------------------
+
+The rules for the syntax of file names discussed in *note File Names::,
+are the rules normally used by GNU systems and by other POSIX systems.
+However, other operating systems may use other conventions.
+
+   There are two reasons why it can be important for you to be aware of
+file name portability issues:
+
+   * If your program makes assumptions about file name syntax, or
+     contains embedded literal file name strings, it is more difficult
+     to get it to run under other operating systems that use different
+     syntax conventions.
+
+   * Even if you are not concerned about running your program on
+     machines that run other operating systems, it may still be possible
+     to access files that use different naming conventions.  For
+     example, you may be able to access file systems on another computer
+     running a different operating system over a network, or read and
+     write disks in formats used by other operating systems.
+
+   The ISO C standard says very little about file name syntax, only that
+file names are strings.  In addition to varying restrictions on the
+length of file names and what characters can validly appear in a file
+name, different operating systems use different conventions and syntax
+for concepts such as structured directories and file types or
+extensions.  Some concepts such as file versions might be supported in
+some operating systems and not by others.
+
+   The POSIX.1 standard allows implementations to put additional
+restrictions on file name syntax, concerning what characters are
+permitted in file names and on the length of file name and file name
+component strings.  However, on GNU systems, any character except the
+null character is permitted in a file name string, and on GNU/Hurd
+systems there are no limits on the length of file name strings.
+
+
+File: libc.info,  Node: I/O on Streams,  Next: Low-Level I/O,  Prev: I/O Overview,  Up: Top
+
+12 Input/Output on Streams
+**************************
+
+This chapter describes the functions for creating streams and performing
+input and output operations on them.  As discussed in *note I/O
+Overview::, a stream is a fairly abstract, high-level concept
+representing a communications channel to a file, device, or process.
+
+* Menu:
+
+* Streams::                     About the data type representing a stream.
+* Standard Streams::            Streams to the standard input and output
+				 devices are created for you.
+* Opening Streams::             How to create a stream to talk to a file.
+* Closing Streams::             Close a stream when you are finished with it.
+* Streams and Threads::         Issues with streams in threaded programs.
+* Streams and I18N::            Streams in internationalized applications.
+* Simple Output::               Unformatted output by characters and lines.
+* Character Input::             Unformatted input by characters and words.
+* Line Input::                  Reading a line or a record from a stream.
+* Unreading::                   Peeking ahead/pushing back input just read.
+* Block Input/Output::          Input and output operations on blocks of data.
+* Formatted Output::            'printf' and related functions.
+* Customizing Printf::          You can define new conversion specifiers for
+				 'printf' and friends.
+* Formatted Input::             'scanf' and related functions.
+* EOF and Errors::              How you can tell if an I/O error happens.
+* Error Recovery::		What you can do about errors.
+* Binary Streams::              Some systems distinguish between text files
+				 and binary files.
+* File Positioning::            About random-access streams.
+* Portable Positioning::        Random access on peculiar ISO C systems.
+* Stream Buffering::            How to control buffering of streams.
+* Other Kinds of Streams::      Streams that do not necessarily correspond
+				 to an open file.
+* Formatted Messages::          Print strictly formatted messages.
+
+
+File: libc.info,  Node: Streams,  Next: Standard Streams,  Up: I/O on Streams
+
+12.1 Streams
+============
+
+For historical reasons, the type of the C data structure that represents
+a stream is called 'FILE' rather than "stream".  Since most of the
+library functions deal with objects of type 'FILE *', sometimes the term
+"file pointer" is also used to mean "stream".  This leads to unfortunate
+confusion over terminology in many books on C. This manual, however, is
+careful to use the terms "file" and "stream" only in the technical
+sense.
+
+   The 'FILE' type is declared in the header file 'stdio.h'.
+
+ -- Data Type: FILE
+     This is the data type used to represent stream objects.  A 'FILE'
+     object holds all of the internal state information about the
+     connection to the associated file, including such things as the
+     file position indicator and buffering information.  Each stream
+     also has error and end-of-file status indicators that can be tested
+     with the 'ferror' and 'feof' functions; see *note EOF and Errors::.
+
+   'FILE' objects are allocated and managed internally by the
+input/output library functions.  Don't try to create your own objects of
+type 'FILE'; let the library do it.  Your programs should deal only with
+pointers to these objects (that is, 'FILE *' values) rather than the
+objects themselves.
+
+
+File: libc.info,  Node: Standard Streams,  Next: Opening Streams,  Prev: Streams,  Up: I/O on Streams
+
+12.2 Standard Streams
+=====================
+
+When the 'main' function of your program is invoked, it already has
+three predefined streams open and available for use.  These represent
+the "standard" input and output channels that have been established for
+the process.
+
+   These streams are declared in the header file 'stdio.h'.
+
+ -- Variable: FILE * stdin
+     The "standard input" stream, which is the normal source of input
+     for the program.
+
+ -- Variable: FILE * stdout
+     The "standard output" stream, which is used for normal output from
+     the program.
+
+ -- Variable: FILE * stderr
+     The "standard error" stream, which is used for error messages and
+     diagnostics issued by the program.
+
+   On GNU systems, you can specify what files or processes correspond to
+these streams using the pipe and redirection facilities provided by the
+shell.  (The primitives shells use to implement these facilities are
+described in *note File System Interface::.)  Most other operating
+systems provide similar mechanisms, but the details of how to use them
+can vary.
+
+   In the GNU C Library, 'stdin', 'stdout', and 'stderr' are normal
+variables which you can set just like any others.  For example, to
+redirect the standard output to a file, you could do:
+
+     fclose (stdout);
+     stdout = fopen ("standard-output-file", "w");
+
+   Note however, that in other systems 'stdin', 'stdout', and 'stderr'
+are macros that you cannot assign to in the normal way.  But you can use
+'freopen' to get the effect of closing one and reopening it.  *Note
+Opening Streams::.
+
+   The three streams 'stdin', 'stdout', and 'stderr' are not unoriented
+at program start (*note Streams and I18N::).
+
+
+File: libc.info,  Node: Opening Streams,  Next: Closing Streams,  Prev: Standard Streams,  Up: I/O on Streams
+
+12.3 Opening Streams
+====================
+
+Opening a file with the 'fopen' function creates a new stream and
+establishes a connection between the stream and a file.  This may
+involve creating a new file.
+
+   Everything described in this section is declared in the header file
+'stdio.h'.
+
+ -- Function: FILE * fopen (const char *FILENAME, const char *OPENTYPE)
+     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe mem fd
+     lock | *Note POSIX Safety Concepts::.
+
+     The 'fopen' function opens a stream for I/O to the file FILENAME,
+     and returns a pointer to the stream.
+
+     The OPENTYPE argument is a string that controls how the file is
+     opened and specifies attributes of the resulting stream.  It must
+     begin with one of the following sequences of characters:
+
+     'r'
+          Open an existing file for reading only.
+
+     'w'
+          Open the file for writing only.  If the file already exists,
+          it is truncated to zero length.  Otherwise a new file is
+          created.
+
+     'a'
+          Open a file for append access; that is, writing at the end of
+          file only.  If the file already exists, its initial contents
+          are unchanged and output to the stream is appended to the end
+          of the file.  Otherwise, a new, empty file is created.
+
+     'r+'
+          Open an existing file for both reading and writing.  The
+          initial contents of the file are unchanged and the initial
+          file position is at the beginning of the file.
+
+     'w+'
+          Open a file for both reading and writing.  If the file already
+          exists, it is truncated to zero length.  Otherwise, a new file
+          is created.
+
+     'a+'
+          Open or create file for both reading and appending.  If the
+          file exists, its initial contents are unchanged.  Otherwise, a
+          new file is created.  The initial file position for reading is
+          at the beginning of the file, but output is always appended to
+          the end of the file.
+
+     As you can see, '+' requests a stream that can do both input and
+     output.  When using such a stream, you must call 'fflush' (*note
+     Stream Buffering::) or a file positioning function such as 'fseek'
+     (*note File Positioning::) when switching from reading to writing
+     or vice versa.  Otherwise, internal buffers might not be emptied
+     properly.
+
+     Additional characters may appear after these to specify flags for
+     the call.  Always put the mode ('r', 'w+', etc.)  first; that is
+     the only part you are guaranteed will be understood by all systems.
+
+     The GNU C Library defines additional characters for use in
+     OPENTYPE:
+
+     'c'
+          The file is opened with cancellation in the I/O functions
+          disabled.
+
+     'e'
+          The underlying file descriptor will be closed if you use any
+          of the 'exec...' functions (*note Executing a File::).  (This
+          is equivalent to having set 'FD_CLOEXEC' on that descriptor.
+          *Note Descriptor Flags::.)
+
+     'm'
+          The file is opened and accessed using 'mmap'.  This is only
+          supported with files opened for reading.
+
+     'x'
+          Insist on creating a new file--if a file FILENAME already
+          exists, 'fopen' fails rather than opening it.  If you use 'x'
+          you are guaranteed that you will not clobber an existing file.
+          This is equivalent to the 'O_EXCL' option to the 'open'
+          function (*note Opening and Closing Files::).
+
+          The 'x' modifier is part of ISO C11.
+
+     The character 'b' in OPENTYPE has a standard meaning; it requests a
+     binary stream rather than a text stream.  But this makes no
+     difference in POSIX systems (including GNU systems).  If both '+'
+     and 'b' are specified, they can appear in either order.  *Note
+     Binary Streams::.
+
+     If the OPENTYPE string contains the sequence ',ccs=STRING' then
+     STRING is taken as the name of a coded character set and 'fopen'
+     will mark the stream as wide-oriented with appropriate conversion
+     functions in place to convert from and to the character set STRING.
+     Any other stream is opened initially unoriented and the orientation
+     is decided with the first file operation.  If the first operation
+     is a wide character operation, the stream is not only marked as
+     wide-oriented, also the conversion functions to convert to the
+     coded character set used for the current locale are loaded.  This
+     will not change anymore from this point on even if the locale
+     selected for the 'LC_CTYPE' category is changed.
+
+     Any other characters in OPENTYPE are simply ignored.  They may be
+     meaningful in other systems.
+
+     If the open fails, 'fopen' returns a null pointer.
+
+     When the sources are compiling with '_FILE_OFFSET_BITS == 64' on a
+     32 bit machine this function is in fact 'fopen64' since the LFS
+     interface replaces transparently the old interface.
+
+   You can have multiple streams (or file descriptors) pointing to the
+same file open at the same time.  If you do only input, this works
+straightforwardly, but you must be careful if any output streams are
+included.  *Note Stream/Descriptor Precautions::.  This is equally true
+whether the streams are in one program (not usual) or in several
+programs (which can easily happen).  It may be advantageous to use the
+file locking facilities to avoid simultaneous access.  *Note File
+Locks::.
+
+ -- Function: FILE * fopen64 (const char *FILENAME, const char
+          *OPENTYPE)
+     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe mem fd
+     lock | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'fopen' but the stream it returns a
+     pointer for is opened using 'open64'.  Therefore this stream can be
+     used even on files larger than 2^31 bytes on 32 bit machines.
+
+     Please note that the return type is still 'FILE *'.  There is no
+     special 'FILE' type for the LFS interface.
+
+     If the sources are compiled with '_FILE_OFFSET_BITS == 64' on a 32
+     bits machine this function is available under the name 'fopen' and
+     so transparently replaces the old interface.
+
+ -- Macro: int FOPEN_MAX
+     The value of this macro is an integer constant expression that
+     represents the minimum number of streams that the implementation
+     guarantees can be open simultaneously.  You might be able to open
+     more than this many streams, but that is not guaranteed.  The value
+     of this constant is at least eight, which includes the three
+     standard streams 'stdin', 'stdout', and 'stderr'.  In POSIX.1
+     systems this value is determined by the 'OPEN_MAX' parameter; *note
+     General Limits::.  In BSD and GNU, it is controlled by the
+     'RLIMIT_NOFILE' resource limit; *note Limits on Resources::.
+
+ -- Function: FILE * freopen (const char *FILENAME, const char
+          *OPENTYPE, FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt fd |
+     *Note POSIX Safety Concepts::.
+
+     This function is like a combination of 'fclose' and 'fopen'.  It
+     first closes the stream referred to by STREAM, ignoring any errors
+     that are detected in the process.  (Because errors are ignored, you
+     should not use 'freopen' on an output stream if you have actually
+     done any output using the stream.)  Then the file named by FILENAME
+     is opened with mode OPENTYPE as for 'fopen', and associated with
+     the same stream object STREAM.
+
+     If the operation fails, a null pointer is returned; otherwise,
+     'freopen' returns STREAM.
+
+     'freopen' has traditionally been used to connect a standard stream
+     such as 'stdin' with a file of your own choice.  This is useful in
+     programs in which use of a standard stream for certain purposes is
+     hard-coded.  In the GNU C Library, you can simply close the
+     standard streams and open new ones with 'fopen'.  But other systems
+     lack this ability, so using 'freopen' is more portable.
+
+     When the sources are compiling with '_FILE_OFFSET_BITS == 64' on a
+     32 bit machine this function is in fact 'freopen64' since the LFS
+     interface replaces transparently the old interface.
+
+ -- Function: FILE * freopen64 (const char *FILENAME, const char
+          *OPENTYPE, FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt fd |
+     *Note POSIX Safety Concepts::.
+
+     This function is similar to 'freopen'.  The only difference is that
+     on 32 bit machine the stream returned is able to read beyond the
+     2^31 bytes limits imposed by the normal interface.  It should be
+     noted that the stream pointed to by STREAM need not be opened using
+     'fopen64' or 'freopen64' since its mode is not important for this
+     function.
+
+     If the sources are compiled with '_FILE_OFFSET_BITS == 64' on a 32
+     bits machine this function is available under the name 'freopen'
+     and so transparently replaces the old interface.
+
+   In some situations it is useful to know whether a given stream is
+available for reading or writing.  This information is normally not
+available and would have to be remembered separately.  Solaris
+introduced a few functions to get this information from the stream
+descriptor and these functions are also available in the GNU C Library.
+
+ -- Function: int __freadable (FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The '__freadable' function determines whether the stream STREAM was
+     opened to allow reading.  In this case the return value is nonzero.
+     For write-only streams the function returns zero.
+
+     This function is declared in 'stdio_ext.h'.
+
+ -- Function: int __fwritable (FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The '__fwritable' function determines whether the stream STREAM was
+     opened to allow writing.  In this case the return value is nonzero.
+     For read-only streams the function returns zero.
+
+     This function is declared in 'stdio_ext.h'.
+
+   For slightly different kind of problems there are two more functions.
+They provide even finer-grained information.
+
+ -- Function: int __freading (FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The '__freading' function determines whether the stream STREAM was
+     last read from or whether it is opened read-only.  In this case the
+     return value is nonzero, otherwise it is zero.  Determining whether
+     a stream opened for reading and writing was last used for writing
+     allows to draw conclusions about the content about the buffer,
+     among other things.
+
+     This function is declared in 'stdio_ext.h'.
+
+ -- Function: int __fwriting (FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The '__fwriting' function determines whether the stream STREAM was
+     last written to or whether it is opened write-only.  In this case
+     the return value is nonzero, otherwise it is zero.
+
+     This function is declared in 'stdio_ext.h'.
+
+
+File: libc.info,  Node: Closing Streams,  Next: Streams and Threads,  Prev: Opening Streams,  Up: I/O on Streams
+
+12.4 Closing Streams
+====================
+
+When a stream is closed with 'fclose', the connection between the stream
+and the file is canceled.  After you have closed a stream, you cannot
+perform any additional operations on it.
+
+ -- Function: int fclose (FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe lock mem
+     fd | *Note POSIX Safety Concepts::.
+
+     This function causes STREAM to be closed and the connection to the
+     corresponding file to be broken.  Any buffered output is written
+     and any buffered input is discarded.  The 'fclose' function returns
+     a value of '0' if the file was closed successfully, and 'EOF' if an
+     error was detected.
+
+     It is important to check for errors when you call 'fclose' to close
+     an output stream, because real, everyday errors can be detected at
+     this time.  For example, when 'fclose' writes the remaining
+     buffered output, it might get an error because the disk is full.
+     Even if you know the buffer is empty, errors can still occur when
+     closing a file if you are using NFS.
+
+     The function 'fclose' is declared in 'stdio.h'.
+
+   To close all streams currently available the GNU C Library provides
+another function.
+
+ -- Function: int fcloseall (void)
+     Preliminary: | MT-Unsafe race:streams | AS-Unsafe | AC-Safe | *Note
+     POSIX Safety Concepts::.
+
+     This function causes all open streams of the process to be closed
+     and the connection to corresponding files to be broken.  All
+     buffered data is written and any buffered input is discarded.  The
+     'fcloseall' function returns a value of '0' if all the files were
+     closed successfully, and 'EOF' if an error was detected.
+
+     This function should be used only in special situations, e.g., when
+     an error occurred and the program must be aborted.  Normally each
+     single stream should be closed separately so that problems with
+     individual streams can be identified.  It is also problematic since
+     the standard streams (*note Standard Streams::) will also be
+     closed.
+
+     The function 'fcloseall' is declared in 'stdio.h'.
+
+   If the 'main' function to your program returns, or if you call the
+'exit' function (*note Normal Termination::), all open streams are
+automatically closed properly.  If your program terminates in any other
+manner, such as by calling the 'abort' function (*note Aborting a
+Program::) or from a fatal signal (*note Signal Handling::), open
+streams might not be closed properly.  Buffered output might not be
+flushed and files may be incomplete.  For more information on buffering
+of streams, see *note Stream Buffering::.
+
+
+File: libc.info,  Node: Streams and Threads,  Next: Streams and I18N,  Prev: Closing Streams,  Up: I/O on Streams
+
+12.5 Streams and Threads
+========================
+
+Streams can be used in multi-threaded applications in the same way they
+are used in single-threaded applications.  But the programmer must be
+aware of the possible complications.  It is important to know about
+these also if the program one writes never use threads since the design
+and implementation of many stream functions is heavily influenced by the
+requirements added by multi-threaded programming.
+
+   The POSIX standard requires that by default the stream operations are
+atomic.  I.e., issuing two stream operations for the same stream in two
+threads at the same time will cause the operations to be executed as if
+they were issued sequentially.  The buffer operations performed while
+reading or writing are protected from other uses of the same stream.  To
+do this each stream has an internal lock object which has to be
+(implicitly) acquired before any work can be done.
+
+   But there are situations where this is not enough and there are also
+situations where this is not wanted.  The implicit locking is not enough
+if the program requires more than one stream function call to happen
+atomically.  One example would be if an output line a program wants to
+generate is created by several function calls.  The functions by
+themselves would ensure only atomicity of their own operation, but not
+atomicity over all the function calls.  For this it is necessary to
+perform the stream locking in the application code.
+
+ -- Function: void flockfile (FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Unsafe lock | *Note POSIX
+     Safety Concepts::.
+
+     The 'flockfile' function acquires the internal locking object
+     associated with the stream STREAM.  This ensures that no other
+     thread can explicitly through 'flockfile'/'ftrylockfile' or
+     implicit through a call of a stream function lock the stream.  The
+     thread will block until the lock is acquired.  An explicit call to
+     'funlockfile' has to be used to release the lock.
+
+ -- Function: int ftrylockfile (FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Unsafe lock | *Note POSIX
+     Safety Concepts::.
+
+     The 'ftrylockfile' function tries to acquire the internal locking
+     object associated with the stream STREAM just like 'flockfile'.
+     But unlike 'flockfile' this function does not block if the lock is
+     not available.  'ftrylockfile' returns zero if the lock was
+     successfully acquired.  Otherwise the stream is locked by another
+     thread.
+
+ -- Function: void funlockfile (FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Unsafe lock | *Note POSIX
+     Safety Concepts::.
+
+     The 'funlockfile' function releases the internal locking object of
+     the stream STREAM.  The stream must have been locked before by a
+     call to 'flockfile' or a successful call of 'ftrylockfile'.  The
+     implicit locking performed by the stream operations do not count.
+     The 'funlockfile' function does not return an error status and the
+     behavior of a call for a stream which is not locked by the current
+     thread is undefined.
+
+   The following example shows how the functions above can be used to
+generate an output line atomically even in multi-threaded applications
+(yes, the same job could be done with one 'fprintf' call but it is
+sometimes not possible):
+
+     FILE *fp;
+     {
+        ...
+        flockfile (fp);
+        fputs ("This is test number ", fp);
+        fprintf (fp, "%d\n", test);
+        funlockfile (fp)
+     }
+
+   Without the explicit locking it would be possible for another thread
+to use the stream FP after the 'fputs' call return and before 'fprintf'
+was called with the result that the number does not follow the word
+'number'.
+
+   From this description it might already be clear that the locking
+objects in streams are no simple mutexes.  Since locking the same stream
+twice in the same thread is allowed the locking objects must be
+equivalent to recursive mutexes.  These mutexes keep track of the owner
+and the number of times the lock is acquired.  The same number of
+'funlockfile' calls by the same threads is necessary to unlock the
+stream completely.  For instance:
+
+     void
+     foo (FILE *fp)
+     {
+       ftrylockfile (fp);
+       fputs ("in foo\n", fp);
+       /* This is very wrong!!!  */
+       funlockfile (fp);
+     }
+
+   It is important here that the 'funlockfile' function is only called
+if the 'ftrylockfile' function succeeded in locking the stream.  It is
+therefore always wrong to ignore the result of 'ftrylockfile'.  And it
+makes no sense since otherwise one would use 'flockfile'.  The result of
+code like that above is that either 'funlockfile' tries to free a stream
+that hasn't been locked by the current thread or it frees the stream
+prematurely.  The code should look like this:
+
+     void
+     foo (FILE *fp)
+     {
+       if (ftrylockfile (fp) == 0)
+         {
+           fputs ("in foo\n", fp);
+           funlockfile (fp);
+         }
+     }
+
+   Now that we covered why it is necessary to have these locking it is
+necessary to talk about situations when locking is unwanted and what can
+be done.  The locking operations (explicit or implicit) don't come for
+free.  Even if a lock is not taken the cost is not zero.  The operations
+which have to be performed require memory operations that are safe in
+multi-processor environments.  With the many local caches involved in
+such systems this is quite costly.  So it is best to avoid the locking
+completely if it is not needed - because the code in question is never
+used in a context where two or more threads may use a stream at a time.
+This can be determined most of the time for application code; for
+library code which can be used in many contexts one should default to be
+conservative and use locking.
+
+   There are two basic mechanisms to avoid locking.  The first is to use
+the '_unlocked' variants of the stream operations.  The POSIX standard
+defines quite a few of those and the GNU C Library adds a few more.
+These variants of the functions behave just like the functions with the
+name without the suffix except that they do not lock the stream.  Using
+these functions is very desirable since they are potentially much
+faster.  This is not only because the locking operation itself is
+avoided.  More importantly, functions like 'putc' and 'getc' are very
+simple and traditionally (before the introduction of threads) were
+implemented as macros which are very fast if the buffer is not empty.
+With the addition of locking requirements these functions are no longer
+implemented as macros since they would expand to too much code.  But
+these macros are still available with the same functionality under the
+new names 'putc_unlocked' and 'getc_unlocked'.  This possibly huge
+difference of speed also suggests the use of the '_unlocked' functions
+even if locking is required.  The difference is that the locking then
+has to be performed in the program:
+
+     void
+     foo (FILE *fp, char *buf)
+     {
+       flockfile (fp);
+       while (*buf != '/')
+         putc_unlocked (*buf++, fp);
+       funlockfile (fp);
+     }
+
+   If in this example the 'putc' function would be used and the explicit
+locking would be missing the 'putc' function would have to acquire the
+lock in every call, potentially many times depending on when the loop
+terminates.  Writing it the way illustrated above allows the
+'putc_unlocked' macro to be used which means no locking and direct
+manipulation of the buffer of the stream.
+
+   A second way to avoid locking is by using a non-standard function
+which was introduced in Solaris and is available in the GNU C Library as
+well.
+
+ -- Function: int __fsetlocking (FILE *STREAM, int TYPE)
+     Preliminary: | MT-Safe race:stream | AS-Unsafe lock | AC-Safe |
+     *Note POSIX Safety Concepts::.
+
+     The '__fsetlocking' function can be used to select whether the
+     stream operations will implicitly acquire the locking object of the
+     stream STREAM.  By default this is done but it can be disabled and
+     reinstated using this function.  There are three values defined for
+     the TYPE parameter.
+
+     'FSETLOCKING_INTERNAL'
+          The stream 'stream' will from now on use the default internal
+          locking.  Every stream operation with exception of the
+          '_unlocked' variants will implicitly lock the stream.
+
+     'FSETLOCKING_BYCALLER'
+          After the '__fsetlocking' function returns the user is
+          responsible for locking the stream.  None of the stream
+          operations will implicitly do this anymore until the state is
+          set back to 'FSETLOCKING_INTERNAL'.
+
+     'FSETLOCKING_QUERY'
+          '__fsetlocking' only queries the current locking state of the
+          stream.  The return value will be 'FSETLOCKING_INTERNAL' or
+          'FSETLOCKING_BYCALLER' depending on the state.
+
+     The return value of '__fsetlocking' is either
+     'FSETLOCKING_INTERNAL' or 'FSETLOCKING_BYCALLER' depending on the
+     state of the stream before the call.
+
+     This function and the values for the TYPE parameter are declared in
+     'stdio_ext.h'.
+
+   This function is especially useful when program code has to be used
+which is written without knowledge about the '_unlocked' functions (or
+if the programmer was too lazy to use them).
+
+
+File: libc.info,  Node: Streams and I18N,  Next: Simple Output,  Prev: Streams and Threads,  Up: I/O on Streams
+
+12.6 Streams in Internationalized Applications
+==============================================
+
+ISO C90 introduced the new type 'wchar_t' to allow handling larger
+character sets.  What was missing was a possibility to output strings of
+'wchar_t' directly.  One had to convert them into multibyte strings
+using 'mbstowcs' (there was no 'mbsrtowcs' yet) and then use the normal
+stream functions.  While this is doable it is very cumbersome since
+performing the conversions is not trivial and greatly increases program
+complexity and size.
+
+   The Unix standard early on (I think in XPG4.2) introduced two
+additional format specifiers for the 'printf' and 'scanf' families of
+functions.  Printing and reading of single wide characters was made
+possible using the '%C' specifier and wide character strings can be
+handled with '%S'.  These modifiers behave just like '%c' and '%s' only
+that they expect the corresponding argument to have the wide character
+type and that the wide character and string are transformed into/from
+multibyte strings before being used.
+
+   This was a beginning but it is still not good enough.  Not always is
+it desirable to use 'printf' and 'scanf'.  The other, smaller and faster
+functions cannot handle wide characters.  Second, it is not possible to
+have a format string for 'printf' and 'scanf' consisting of wide
+characters.  The result is that format strings would have to be
+generated if they have to contain non-basic characters.
+
+   In the Amendment 1 to ISO C90 a whole new set of functions was added
+to solve the problem.  Most of the stream functions got a counterpart
+which take a wide character or wide character string instead of a
+character or string respectively.  The new functions operate on the same
+streams (like 'stdout').  This is different from the model of the C++
+runtime library where separate streams for wide and normal I/O are used.
+
+   Being able to use the same stream for wide and normal operations
+comes with a restriction: a stream can be used either for wide
+operations or for normal operations.  Once it is decided there is no way
+back.  Only a call to 'freopen' or 'freopen64' can reset the
+"orientation".  The orientation can be decided in three ways:
+
+   * If any of the normal character functions is used (this includes the
+     'fread' and 'fwrite' functions) the stream is marked as not wide
+     oriented.
+
+   * If any of the wide character functions is used the stream is marked
+     as wide oriented.
+
+   * The 'fwide' function can be used to set the orientation either way.
+
+   It is important to never mix the use of wide and not wide operations
+on a stream.  There are no diagnostics issued.  The application behavior
+will simply be strange or the application will simply crash.  The
+'fwide' function can help avoiding this.
+
+ -- Function: int fwide (FILE *STREAM, int MODE)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     The 'fwide' function can be used to set and query the state of the
+     orientation of the stream STREAM.  If the MODE parameter has a
+     positive value the streams get wide oriented, for negative values
+     narrow oriented.  It is not possible to overwrite previous
+     orientations with 'fwide'.  I.e., if the stream STREAM was already
+     oriented before the call nothing is done.
+
+     If MODE is zero the current orientation state is queried and
+     nothing is changed.
+
+     The 'fwide' function returns a negative value, zero, or a positive
+     value if the stream is narrow, not at all, or wide oriented
+     respectively.
+
+     This function was introduced in Amendment 1 to ISO C90 and is
+     declared in 'wchar.h'.
+
+   It is generally a good idea to orient a stream as early as possible.
+This can prevent surprise especially for the standard streams 'stdin',
+'stdout', and 'stderr'.  If some library function in some situations
+uses one of these streams and this use orients the stream in a different
+way the rest of the application expects it one might end up with hard to
+reproduce errors.  Remember that no errors are signal if the streams are
+used incorrectly.  Leaving a stream unoriented after creation is
+normally only necessary for library functions which create streams which
+can be used in different contexts.
+
+   When writing code which uses streams and which can be used in
+different contexts it is important to query the orientation of the
+stream before using it (unless the rules of the library interface demand
+a specific orientation).  The following little, silly function
+illustrates this.
+
+     void
+     print_f (FILE *fp)
+     {
+       if (fwide (fp, 0) > 0)
+         /* Positive return value means wide orientation.  */
+         fputwc (L'f', fp);
+       else
+         fputc ('f', fp);
+     }
+
+   Note that in this case the function 'print_f' decides about the
+orientation of the stream if it was unoriented before (will not happen
+if the advise above is followed).
+
+   The encoding used for the 'wchar_t' values is unspecified and the
+user must not make any assumptions about it.  For I/O of 'wchar_t'
+values this means that it is impossible to write these values directly
+to the stream.  This is not what follows from the ISO C locale model
+either.  What happens instead is that the bytes read from or written to
+the underlying media are first converted into the internal encoding
+chosen by the implementation for 'wchar_t'.  The external encoding is
+determined by the 'LC_CTYPE' category of the current locale or by the
+'ccs' part of the mode specification given to 'fopen', 'fopen64',
+'freopen', or 'freopen64'.  How and when the conversion happens is
+unspecified and it happens invisible to the user.
+
+   Since a stream is created in the unoriented state it has at that
+point no conversion associated with it.  The conversion which will be
+used is determined by the 'LC_CTYPE' category selected at the time the
+stream is oriented.  If the locales are changed at the runtime this
+might produce surprising results unless one pays attention.  This is
+just another good reason to orient the stream explicitly as soon as
+possible, perhaps with a call to 'fwide'.
+
+
+File: libc.info,  Node: Simple Output,  Next: Character Input,  Prev: Streams and I18N,  Up: I/O on Streams
+
+12.7 Simple Output by Characters or Lines
+=========================================
+
+This section describes functions for performing character- and
+line-oriented output.
+
+   These narrow streams functions are declared in the header file
+'stdio.h' and the wide stream functions in 'wchar.h'.
+
+ -- Function: int fputc (int C, FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
+     | *Note POSIX Safety Concepts::.
+
+     The 'fputc' function converts the character C to type 'unsigned
+     char', and writes it to the stream STREAM.  'EOF' is returned if a
+     write error occurs; otherwise the character C is returned.
+
+ -- Function: wint_t fputwc (wchar_t WC, FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
+     | *Note POSIX Safety Concepts::.
+
+     The 'fputwc' function writes the wide character WC to the stream
+     STREAM.  'WEOF' is returned if a write error occurs; otherwise the
+     character WC is returned.
+
+ -- Function: int fputc_unlocked (int C, FILE *STREAM)
+     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'fputc_unlocked' function is equivalent to the 'fputc' function
+     except that it does not implicitly lock the stream.
+
+ -- Function: wint_t fputwc_unlocked (wchar_t WC, FILE *STREAM)
+     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'fputwc_unlocked' function is equivalent to the 'fputwc'
+     function except that it does not implicitly lock the stream.
+
+     This function is a GNU extension.
+
+ -- Function: int putc (int C, FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
+     | *Note POSIX Safety Concepts::.
+
+     This is just like 'fputc', except that most systems implement it as
+     a macro, making it faster.  One consequence is that it may evaluate
+     the STREAM argument more than once, which is an exception to the
+     general rule for macros.  'putc' is usually the best function to
+     use for writing a single character.
+
+ -- Function: wint_t putwc (wchar_t WC, FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
+     | *Note POSIX Safety Concepts::.
+
+     This is just like 'fputwc', except that it can be implement as a
+     macro, making it faster.  One consequence is that it may evaluate
+     the STREAM argument more than once, which is an exception to the
+     general rule for macros.  'putwc' is usually the best function to
+     use for writing a single wide character.
+
+ -- Function: int putc_unlocked (int C, FILE *STREAM)
+     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'putc_unlocked' function is equivalent to the 'putc' function
+     except that it does not implicitly lock the stream.
+
+ -- Function: wint_t putwc_unlocked (wchar_t WC, FILE *STREAM)
+     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'putwc_unlocked' function is equivalent to the 'putwc' function
+     except that it does not implicitly lock the stream.
+
+     This function is a GNU extension.
+
+ -- Function: int putchar (int C)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
+     | *Note POSIX Safety Concepts::.
+
+     The 'putchar' function is equivalent to 'putc' with 'stdout' as the
+     value of the STREAM argument.
+
+ -- Function: wint_t putwchar (wchar_t WC)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
+     | *Note POSIX Safety Concepts::.
+
+     The 'putwchar' function is equivalent to 'putwc' with 'stdout' as
+     the value of the STREAM argument.
+
+ -- Function: int putchar_unlocked (int C)
+     Preliminary: | MT-Unsafe race:stdout | AS-Unsafe corrupt |
+     AC-Unsafe corrupt | *Note POSIX Safety Concepts::.
+
+     The 'putchar_unlocked' function is equivalent to the 'putchar'
+     function except that it does not implicitly lock the stream.
+
+ -- Function: wint_t putwchar_unlocked (wchar_t WC)
+     Preliminary: | MT-Unsafe race:stdout | AS-Unsafe corrupt |
+     AC-Unsafe corrupt | *Note POSIX Safety Concepts::.
+
+     The 'putwchar_unlocked' function is equivalent to the 'putwchar'
+     function except that it does not implicitly lock the stream.
+
+     This function is a GNU extension.
+
+ -- Function: int fputs (const char *S, FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
+     | *Note POSIX Safety Concepts::.
+
+     The function 'fputs' writes the string S to the stream STREAM.  The
+     terminating null character is not written.  This function does
+     _not_ add a newline character, either.  It outputs only the
+     characters in the string.
+
+     This function returns 'EOF' if a write error occurs, and otherwise
+     a non-negative value.
+
+     For example:
+
+          fputs ("Are ", stdout);
+          fputs ("you ", stdout);
+          fputs ("hungry?\n", stdout);
+
+     outputs the text 'Are you hungry?' followed by a newline.
+
+ -- Function: int fputws (const wchar_t *WS, FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
+     | *Note POSIX Safety Concepts::.
+
+     The function 'fputws' writes the wide character string WS to the
+     stream STREAM.  The terminating null character is not written.
+     This function does _not_ add a newline character, either.  It
+     outputs only the characters in the string.
+
+     This function returns 'WEOF' if a write error occurs, and otherwise
+     a non-negative value.
+
+ -- Function: int fputs_unlocked (const char *S, FILE *STREAM)
+     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'fputs_unlocked' function is equivalent to the 'fputs' function
+     except that it does not implicitly lock the stream.
+
+     This function is a GNU extension.
+
+ -- Function: int fputws_unlocked (const wchar_t *WS, FILE *STREAM)
+     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'fputws_unlocked' function is equivalent to the 'fputws'
+     function except that it does not implicitly lock the stream.
+
+     This function is a GNU extension.
+
+ -- Function: int puts (const char *S)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     The 'puts' function writes the string S to the stream 'stdout'
+     followed by a newline.  The terminating null character of the
+     string is not written.  (Note that 'fputs' does _not_ write a
+     newline as this function does.)
+
+     'puts' is the most convenient function for printing simple
+     messages.  For example:
+
+          puts ("This is a message.");
+
+     outputs the text 'This is a message.' followed by a newline.
+
+ -- Function: int putw (int W, FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     This function writes the word W (that is, an 'int') to STREAM.  It
+     is provided for compatibility with SVID, but we recommend you use
+     'fwrite' instead (*note Block Input/Output::).
+
+
+File: libc.info,  Node: Character Input,  Next: Line Input,  Prev: Simple Output,  Up: I/O on Streams
+
+12.8 Character Input
+====================
+
+This section describes functions for performing character-oriented
+input.  These narrow streams functions are declared in the header file
+'stdio.h' and the wide character functions are declared in 'wchar.h'.
+
+   These functions return an 'int' or 'wint_t' value (for narrow and
+wide stream functions respectively) that is either a character of input,
+or the special value 'EOF'/'WEOF' (usually -1).  For the narrow stream
+functions it is important to store the result of these functions in a
+variable of type 'int' instead of 'char', even when you plan to use it
+only as a character.  Storing 'EOF' in a 'char' variable truncates its
+value to the size of a character, so that it is no longer
+distinguishable from the valid character '(char) -1'.  So always use an
+'int' for the result of 'getc' and friends, and check for 'EOF' after
+the call; once you've verified that the result is not 'EOF', you can be
+sure that it will fit in a 'char' variable without loss of information.
+
+ -- Function: int fgetc (FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     This function reads the next character as an 'unsigned char' from
+     the stream STREAM and returns its value, converted to an 'int'.  If
+     an end-of-file condition or read error occurs, 'EOF' is returned
+     instead.
+
+ -- Function: wint_t fgetwc (FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     This function reads the next wide character from the stream STREAM
+     and returns its value.  If an end-of-file condition or read error
+     occurs, 'WEOF' is returned instead.
+
+ -- Function: int fgetc_unlocked (FILE *STREAM)
+     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'fgetc_unlocked' function is equivalent to the 'fgetc' function
+     except that it does not implicitly lock the stream.
+
+ -- Function: wint_t fgetwc_unlocked (FILE *STREAM)
+     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'fgetwc_unlocked' function is equivalent to the 'fgetwc'
+     function except that it does not implicitly lock the stream.
+
+     This function is a GNU extension.
+
+ -- Function: int getc (FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     This is just like 'fgetc', except that it is permissible (and
+     typical) for it to be implemented as a macro that evaluates the
+     STREAM argument more than once.  'getc' is often highly optimized,
+     so it is usually the best function to use to read a single
+     character.
+
+ -- Function: wint_t getwc (FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     This is just like 'fgetwc', except that it is permissible for it to
+     be implemented as a macro that evaluates the STREAM argument more
+     than once.  'getwc' can be highly optimized, so it is usually the
+     best function to use to read a single wide character.
+
+ -- Function: int getc_unlocked (FILE *STREAM)
+     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'getc_unlocked' function is equivalent to the 'getc' function
+     except that it does not implicitly lock the stream.
+
+ -- Function: wint_t getwc_unlocked (FILE *STREAM)
+     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'getwc_unlocked' function is equivalent to the 'getwc' function
+     except that it does not implicitly lock the stream.
+
+     This function is a GNU extension.
+
+ -- Function: int getchar (void)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     The 'getchar' function is equivalent to 'getc' with 'stdin' as the
+     value of the STREAM argument.
+
+ -- Function: wint_t getwchar (void)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     The 'getwchar' function is equivalent to 'getwc' with 'stdin' as
+     the value of the STREAM argument.
+
+ -- Function: int getchar_unlocked (void)
+     Preliminary: | MT-Unsafe race:stdin | AS-Unsafe corrupt | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'getchar_unlocked' function is equivalent to the 'getchar'
+     function except that it does not implicitly lock the stream.
+
+ -- Function: wint_t getwchar_unlocked (void)
+     Preliminary: | MT-Unsafe race:stdin | AS-Unsafe corrupt | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'getwchar_unlocked' function is equivalent to the 'getwchar'
+     function except that it does not implicitly lock the stream.
+
+     This function is a GNU extension.
+
+   Here is an example of a function that does input using 'fgetc'.  It
+would work just as well using 'getc' instead, or using 'getchar ()'
+instead of 'fgetc (stdin)'.  The code would also work the same for the
+wide character stream functions.
+
+     int
+     y_or_n_p (const char *question)
+     {
+       fputs (question, stdout);
+       while (1)
+         {
+           int c, answer;
+           /* Write a space to separate answer from question. */
+           fputc (' ', stdout);
+           /* Read the first character of the line.
+	      This should be the answer character, but might not be. */
+           c = tolower (fgetc (stdin));
+           answer = c;
+           /* Discard rest of input line. */
+           while (c != '\n' && c != EOF)
+     	c = fgetc (stdin);
+           /* Obey the answer if it was valid. */
+           if (answer == 'y')
+     	return 1;
+           if (answer == 'n')
+     	return 0;
+           /* Answer was invalid: ask for valid answer. */
+           fputs ("Please answer y or n:", stdout);
+         }
+     }
+
+ -- Function: int getw (FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     This function reads a word (that is, an 'int') from STREAM.  It's
+     provided for compatibility with SVID. We recommend you use 'fread'
+     instead (*note Block Input/Output::).  Unlike 'getc', any 'int'
+     value could be a valid result.  'getw' returns 'EOF' when it
+     encounters end-of-file or an error, but there is no way to
+     distinguish this from an input word with value -1.
+
+
+File: libc.info,  Node: Line Input,  Next: Unreading,  Prev: Character Input,  Up: I/O on Streams
+
+12.9 Line-Oriented Input
+========================
+
+Since many programs interpret input on the basis of lines, it is
+convenient to have functions to read a line of text from a stream.
+
+   Standard C has functions to do this, but they aren't very safe: null
+characters and even (for 'gets') long lines can confuse them.  So the
+GNU C Library provides the nonstandard 'getline' function that makes it
+easy to read lines reliably.
+
+   Another GNU extension, 'getdelim', generalizes 'getline'.  It reads a
+delimited record, defined as everything through the next occurrence of a
+specified delimiter character.
+
+   All these functions are declared in 'stdio.h'.
+
+ -- Function: ssize_t getline (char **LINEPTR, size_t *N, FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt heap | AC-Unsafe lock
+     corrupt mem | *Note POSIX Safety Concepts::.
+
+     This function reads an entire line from STREAM, storing the text
+     (including the newline and a terminating null character) in a
+     buffer and storing the buffer address in '*LINEPTR'.
+
+     Before calling 'getline', you should place in '*LINEPTR' the
+     address of a buffer '*N' bytes long, allocated with 'malloc'.  If
+     this buffer is long enough to hold the line, 'getline' stores the
+     line in this buffer.  Otherwise, 'getline' makes the buffer bigger
+     using 'realloc', storing the new buffer address back in '*LINEPTR'
+     and the increased size back in '*N'.  *Note Unconstrained
+     Allocation::.
+
+     If you set '*LINEPTR' to a null pointer, and '*N' to zero, before
+     the call, then 'getline' allocates the initial buffer for you by
+     calling 'malloc'.
+
+     In either case, when 'getline' returns, '*LINEPTR' is a 'char *'
+     which points to the text of the line.
+
+     When 'getline' is successful, it returns the number of characters
+     read (including the newline, but not including the terminating
+     null).  This value enables you to distinguish null characters that
+     are part of the line from the null character inserted as a
+     terminator.
+
+     This function is a GNU extension, but it is the recommended way to
+     read lines from a stream.  The alternative standard functions are
+     unreliable.
+
+     If an error occurs or end of file is reached without any bytes
+     read, 'getline' returns '-1'.
+
+ -- Function: ssize_t getdelim (char **LINEPTR, size_t *N, int
+          DELIMITER, FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt heap | AC-Unsafe lock
+     corrupt mem | *Note POSIX Safety Concepts::.
+
+     This function is like 'getline' except that the character which
+     tells it to stop reading is not necessarily newline.  The argument
+     DELIMITER specifies the delimiter character; 'getdelim' keeps
+     reading until it sees that character (or end of file).
+
+     The text is stored in LINEPTR, including the delimiter character
+     and a terminating null.  Like 'getline', 'getdelim' makes LINEPTR
+     bigger if it isn't big enough.
+
+     'getline' is in fact implemented in terms of 'getdelim', just like
+     this:
+
+          ssize_t
+          getline (char **lineptr, size_t *n, FILE *stream)
+          {
+            return getdelim (lineptr, n, '\n', stream);
+          }
+
+ -- Function: char * fgets (char *S, int COUNT, FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     The 'fgets' function reads characters from the stream STREAM up to
+     and including a newline character and stores them in the string S,
+     adding a null character to mark the end of the string.  You must
+     supply COUNT characters worth of space in S, but the number of
+     characters read is at most COUNT - 1.  The extra character space is
+     used to hold the null character at the end of the string.
+
+     If the system is already at end of file when you call 'fgets', then
+     the contents of the array S are unchanged and a null pointer is
+     returned.  A null pointer is also returned if a read error occurs.
+     Otherwise, the return value is the pointer S.
+
+     *Warning:* If the input data has a null character, you can't tell.
+     So don't use 'fgets' unless you know the data cannot contain a
+     null.  Don't use it to read files edited by the user because, if
+     the user inserts a null character, you should either handle it
+     properly or print a clear error message.  We recommend using
+     'getline' instead of 'fgets'.
+
+ -- Function: wchar_t * fgetws (wchar_t *WS, int COUNT, FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     The 'fgetws' function reads wide characters from the stream STREAM
+     up to and including a newline character and stores them in the
+     string WS, adding a null wide character to mark the end of the
+     string.  You must supply COUNT wide characters worth of space in
+     WS, but the number of characters read is at most COUNT - 1.  The
+     extra character space is used to hold the null wide character at
+     the end of the string.
+
+     If the system is already at end of file when you call 'fgetws',
+     then the contents of the array WS are unchanged and a null pointer
+     is returned.  A null pointer is also returned if a read error
+     occurs.  Otherwise, the return value is the pointer WS.
+
+     *Warning:* If the input data has a null wide character (which are
+     null bytes in the input stream), you can't tell.  So don't use
+     'fgetws' unless you know the data cannot contain a null.  Don't use
+     it to read files edited by the user because, if the user inserts a
+     null character, you should either handle it properly or print a
+     clear error message.
+
+ -- Function: char * fgets_unlocked (char *S, int COUNT, FILE *STREAM)
+     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'fgets_unlocked' function is equivalent to the 'fgets' function
+     except that it does not implicitly lock the stream.
+
+     This function is a GNU extension.
+
+ -- Function: wchar_t * fgetws_unlocked (wchar_t *WS, int COUNT, FILE
+          *STREAM)
+     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'fgetws_unlocked' function is equivalent to the 'fgetws'
+     function except that it does not implicitly lock the stream.
+
+     This function is a GNU extension.
+
+ -- Deprecated function: char * gets (char *S)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     The function 'gets' reads characters from the stream 'stdin' up to
+     the next newline character, and stores them in the string S.  The
+     newline character is discarded (note that this differs from the
+     behavior of 'fgets', which copies the newline character into the
+     string).  If 'gets' encounters a read error or end-of-file, it
+     returns a null pointer; otherwise it returns S.
+
+     *Warning:* The 'gets' function is *very dangerous* because it
+     provides no protection against overflowing the string S.  The GNU C
+     Library includes it for compatibility only.  You should *always*
+     use 'fgets' or 'getline' instead.  To remind you of this, the
+     linker (if using GNU 'ld') will issue a warning whenever you use
+     'gets'.
+
+
+File: libc.info,  Node: Unreading,  Next: Block Input/Output,  Prev: Line Input,  Up: I/O on Streams
+
+12.10 Unreading
+===============
+
+In parser programs it is often useful to examine the next character in
+the input stream without removing it from the stream.  This is called
+"peeking ahead" at the input because your program gets a glimpse of the
+input it will read next.
+
+   Using stream I/O, you can peek ahead at input by first reading it and
+then "unreading" it (also called "pushing it back" on the stream).
+Unreading a character makes it available to be input again from the
+stream, by the next call to 'fgetc' or other input function on that
+stream.
+
+* Menu:
+
+* Unreading Idea::              An explanation of unreading with pictures.
+* How Unread::                  How to call 'ungetc' to do unreading.
+
+
+File: libc.info,  Node: Unreading Idea,  Next: How Unread,  Up: Unreading
+
+12.10.1 What Unreading Means
+----------------------------
+
+Here is a pictorial explanation of unreading.  Suppose you have a stream
+reading a file that contains just six characters, the letters 'foobar'.
+Suppose you have read three characters so far.  The situation looks like
+this:
+
+     f  o  o  b  a  r
+     	 ^
+
+so the next input character will be 'b'.
+
+   If instead of reading 'b' you unread the letter 'o', you get a
+situation like this:
+
+     f  o  o  b  a  r
+     	 |
+           o--
+           ^
+
+so that the next input characters will be 'o' and 'b'.
+
+   If you unread '9' instead of 'o', you get this situation:
+
+     f  o  o  b  a  r
+     	 |
+           9--
+           ^
+
+so that the next input characters will be '9' and 'b'.
+
+
+File: libc.info,  Node: How Unread,  Prev: Unreading Idea,  Up: Unreading
+
+12.10.2 Using 'ungetc' To Do Unreading
+--------------------------------------
+
+The function to unread a character is called 'ungetc', because it
+reverses the action of 'getc'.
+
+ -- Function: int ungetc (int C, FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     The 'ungetc' function pushes back the character C onto the input
+     stream STREAM.  So the next input from STREAM will read C before
+     anything else.
+
+     If C is 'EOF', 'ungetc' does nothing and just returns 'EOF'.  This
+     lets you call 'ungetc' with the return value of 'getc' without
+     needing to check for an error from 'getc'.
+
+     The character that you push back doesn't have to be the same as the
+     last character that was actually read from the stream.  In fact, it
+     isn't necessary to actually read any characters from the stream
+     before unreading them with 'ungetc'!  But that is a strange way to
+     write a program; usually 'ungetc' is used only to unread a
+     character that was just read from the same stream.  The GNU C
+     Library supports this even on files opened in binary mode, but
+     other systems might not.
+
+     The GNU C Library only supports one character of pushback--in other
+     words, it does not work to call 'ungetc' twice without doing input
+     in between.  Other systems might let you push back multiple
+     characters; then reading from the stream retrieves the characters
+     in the reverse order that they were pushed.
+
+     Pushing back characters doesn't alter the file; only the internal
+     buffering for the stream is affected.  If a file positioning
+     function (such as 'fseek', 'fseeko' or 'rewind'; *note File
+     Positioning::) is called, any pending pushed-back characters are
+     discarded.
+
+     Unreading a character on a stream that is at end of file clears the
+     end-of-file indicator for the stream, because it makes the
+     character of input available.  After you read that character,
+     trying to read again will encounter end of file.
+
+ -- Function: wint_t ungetwc (wint_t WC, FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     The 'ungetwc' function behaves just like 'ungetc' just that it
+     pushes back a wide character.
+
+   Here is an example showing the use of 'getc' and 'ungetc' to skip
+over whitespace characters.  When this function reaches a non-whitespace
+character, it unreads that character to be seen again on the next read
+operation on the stream.
+
+     #include <stdio.h>
+     #include <ctype.h>
+
+     void
+     skip_whitespace (FILE *stream)
+     {
+       int c;
+       do
+         /* No need to check for 'EOF' because it is not
+            'isspace', and 'ungetc' ignores 'EOF'.  */
+         c = getc (stream);
+       while (isspace (c));
+       ungetc (c, stream);
+     }
+
+
+File: libc.info,  Node: Block Input/Output,  Next: Formatted Output,  Prev: Unreading,  Up: I/O on Streams
+
+12.11 Block Input/Output
+========================
+
+This section describes how to do input and output operations on blocks
+of data.  You can use these functions to read and write binary data, as
+well as to read and write text in fixed-size blocks instead of by
+characters or lines.
+
+   Binary files are typically used to read and write blocks of data in
+the same format as is used to represent the data in a running program.
+In other words, arbitrary blocks of memory--not just character or string
+objects--can be written to a binary file, and meaningfully read in again
+by the same program.
+
+   Storing data in binary form is often considerably more efficient than
+using the formatted I/O functions.  Also, for floating-point numbers,
+the binary form avoids possible loss of precision in the conversion
+process.  On the other hand, binary files can't be examined or modified
+easily using many standard file utilities (such as text editors), and
+are not portable between different implementations of the language, or
+different kinds of computers.
+
+   These functions are declared in 'stdio.h'.
+
+ -- Function: size_t fread (void *DATA, size_t SIZE, size_t COUNT, FILE
+          *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     This function reads up to COUNT objects of size SIZE into the array
+     DATA, from the stream STREAM.  It returns the number of objects
+     actually read, which might be less than COUNT if a read error
+     occurs or the end of the file is reached.  This function returns a
+     value of zero (and doesn't read anything) if either SIZE or COUNT
+     is zero.
+
+     If 'fread' encounters end of file in the middle of an object, it
+     returns the number of complete objects read, and discards the
+     partial object.  Therefore, the stream remains at the actual end of
+     the file.
+
+ -- Function: size_t fread_unlocked (void *DATA, size_t SIZE, size_t
+          COUNT, FILE *STREAM)
+     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'fread_unlocked' function is equivalent to the 'fread' function
+     except that it does not implicitly lock the stream.
+
+     This function is a GNU extension.
+
+ -- Function: size_t fwrite (const void *DATA, size_t SIZE, size_t
+          COUNT, FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     This function writes up to COUNT objects of size SIZE from the
+     array DATA, to the stream STREAM.  The return value is normally
+     COUNT, if the call succeeds.  Any other value indicates some sort
+     of error, such as running out of space.
+
+ -- Function: size_t fwrite_unlocked (const void *DATA, size_t SIZE,
+          size_t COUNT, FILE *STREAM)
+     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'fwrite_unlocked' function is equivalent to the 'fwrite'
+     function except that it does not implicitly lock the stream.
+
+     This function is a GNU extension.
+
+
+File: libc.info,  Node: Formatted Output,  Next: Customizing Printf,  Prev: Block Input/Output,  Up: I/O on Streams
+
+12.12 Formatted Output
+======================
+
+The functions described in this section ('printf' and related functions)
+provide a convenient way to perform formatted output.  You call 'printf'
+with a "format string" or "template string" that specifies how to format
+the values of the remaining arguments.
+
+   Unless your program is a filter that specifically performs line- or
+character-oriented processing, using 'printf' or one of the other
+related functions described in this section is usually the easiest and
+most concise way to perform output.  These functions are especially
+useful for printing error messages, tables of data, and the like.
+
+* Menu:
+
+* Formatted Output Basics::     Some examples to get you started.
+* Output Conversion Syntax::    General syntax of conversion
+				 specifications.
+* Table of Output Conversions:: Summary of output conversions and
+				 what they do.
+* Integer Conversions::         Details about formatting of integers.
+* Floating-Point Conversions::  Details about formatting of
+				 floating-point numbers.
+* Other Output Conversions::    Details about formatting of strings,
+				 characters, pointers, and the like.
+* Formatted Output Functions::  Descriptions of the actual functions.
+* Dynamic Output::		Functions that allocate memory for the output.
+* Variable Arguments Output::   'vprintf' and friends.
+* Parsing a Template String::   What kinds of args does a given template
+				 call for?
+* Example of Parsing::          Sample program using 'parse_printf_format'.
+
+
+File: libc.info,  Node: Formatted Output Basics,  Next: Output Conversion Syntax,  Up: Formatted Output
+
+12.12.1 Formatted Output Basics
+-------------------------------
+
+The 'printf' function can be used to print any number of arguments.  The
+template string argument you supply in a call provides information not
+only about the number of additional arguments, but also about their
+types and what style should be used for printing them.
+
+   Ordinary characters in the template string are simply written to the
+output stream as-is, while "conversion specifications" introduced by a
+'%' character in the template cause subsequent arguments to be formatted
+and written to the output stream.  For example,
+
+     int pct = 37;
+     char filename[] = "foo.txt";
+     printf ("Processing of `%s' is %d%% finished.\nPlease be patient.\n",
+     	filename, pct);
+
+produces output like
+
+     Processing of `foo.txt' is 37% finished.
+     Please be patient.
+
+   This example shows the use of the '%d' conversion to specify that an
+'int' argument should be printed in decimal notation, the '%s'
+conversion to specify printing of a string argument, and the '%%'
+conversion to print a literal '%' character.
+
+   There are also conversions for printing an integer argument as an
+unsigned value in octal, decimal, or hexadecimal radix ('%o', '%u', or
+'%x', respectively); or as a character value ('%c').
+
+   Floating-point numbers can be printed in normal, fixed-point notation
+using the '%f' conversion or in exponential notation using the '%e'
+conversion.  The '%g' conversion uses either '%e' or '%f' format,
+depending on what is more appropriate for the magnitude of the
+particular number.
+
+   You can control formatting more precisely by writing "modifiers"
+between the '%' and the character that indicates which conversion to
+apply.  These slightly alter the ordinary behavior of the conversion.
+For example, most conversion specifications permit you to specify a
+minimum field width and a flag indicating whether you want the result
+left- or right-justified within the field.
+
+   The specific flags and modifiers that are permitted and their
+interpretation vary depending on the particular conversion.  They're all
+described in more detail in the following sections.  Don't worry if this
+all seems excessively complicated at first; you can almost always get
+reasonable free-format output without using any of the modifiers at all.
+The modifiers are mostly used to make the output look "prettier" in
+tables.
+
+
+File: libc.info,  Node: Output Conversion Syntax,  Next: Table of Output Conversions,  Prev: Formatted Output Basics,  Up: Formatted Output
+
+12.12.2 Output Conversion Syntax
+--------------------------------
+
+This section provides details about the precise syntax of conversion
+specifications that can appear in a 'printf' template string.
+
+   Characters in the template string that are not part of a conversion
+specification are printed as-is to the output stream.  Multibyte
+character sequences (*note Character Set Handling::) are permitted in a
+template string.
+
+   The conversion specifications in a 'printf' template string have the
+general form:
+
+     % [ PARAM-NO $] FLAGS WIDTH [ . PRECISION ] TYPE CONVERSION
+
+or
+
+     % [ PARAM-NO $] FLAGS WIDTH . * [ PARAM-NO $] TYPE CONVERSION
+
+   For example, in the conversion specifier '%-10.8ld', the '-' is a
+flag, '10' specifies the field width, the precision is '8', the letter
+'l' is a type modifier, and 'd' specifies the conversion style.  (This
+particular type specifier says to print a 'long int' argument in decimal
+notation, with a minimum of 8 digits left-justified in a field at least
+10 characters wide.)
+
+   In more detail, output conversion specifications consist of an
+initial '%' character followed in sequence by:
+
+   * An optional specification of the parameter used for this format.
+     Normally the parameters to the 'printf' function are assigned to
+     the formats in the order of appearance in the format string.  But
+     in some situations (such as message translation) this is not
+     desirable and this extension allows an explicit parameter to be
+     specified.
+
+     The PARAM-NO parts of the format must be integers in the range of 1
+     to the maximum number of arguments present to the function call.
+     Some implementations limit this number to a certainly upper bound.
+     The exact limit can be retrieved by the following constant.
+
+      -- Macro: NL_ARGMAX
+          The value of 'NL_ARGMAX' is the maximum value allowed for the
+          specification of a positional parameter in a 'printf' call.
+          The actual value in effect at runtime can be retrieved by
+          using 'sysconf' using the '_SC_NL_ARGMAX' parameter *note
+          Sysconf Definition::.
+
+          Some system have a quite low limit such as 9 for System V
+          systems.  The GNU C Library has no real limit.
+
+     If any of the formats has a specification for the parameter
+     position all of them in the format string shall have one.
+     Otherwise the behavior is undefined.
+
+   * Zero or more "flag characters" that modify the normal behavior of
+     the conversion specification.
+
+   * An optional decimal integer specifying the "minimum field width".
+     If the normal conversion produces fewer characters than this, the
+     field is padded with spaces to the specified width.  This is a
+     _minimum_ value; if the normal conversion produces more characters
+     than this, the field is _not_ truncated.  Normally, the output is
+     right-justified within the field.
+
+     You can also specify a field width of '*'.  This means that the
+     next argument in the argument list (before the actual value to be
+     printed) is used as the field width.  The value must be an 'int'.
+     If the value is negative, this means to set the '-' flag (see
+     below) and to use the absolute value as the field width.
+
+   * An optional "precision" to specify the number of digits to be
+     written for the numeric conversions.  If the precision is
+     specified, it consists of a period ('.') followed optionally by a
+     decimal integer (which defaults to zero if omitted).
+
+     You can also specify a precision of '*'.  This means that the next
+     argument in the argument list (before the actual value to be
+     printed) is used as the precision.  The value must be an 'int', and
+     is ignored if it is negative.  If you specify '*' for both the
+     field width and precision, the field width argument precedes the
+     precision argument.  Other C library versions may not recognize
+     this syntax.
+
+   * An optional "type modifier character", which is used to specify the
+     data type of the corresponding argument if it differs from the
+     default type.  (For example, the integer conversions assume a type
+     of 'int', but you can specify 'h', 'l', or 'L' for other integer
+     types.)
+
+   * A character that specifies the conversion to be applied.
+
+   The exact options that are permitted and how they are interpreted
+vary between the different conversion specifiers.  See the descriptions
+of the individual conversions for information about the particular
+options that they use.
+
+   With the '-Wformat' option, the GNU C compiler checks calls to
+'printf' and related functions.  It examines the format string and
+verifies that the correct number and types of arguments are supplied.
+There is also a GNU C syntax to tell the compiler that a function you
+write uses a 'printf'-style format string.  *Note Declaring Attributes
+of Functions: (gcc.info)Function Attributes, for more information.
+
+
+File: libc.info,  Node: Table of Output Conversions,  Next: Integer Conversions,  Prev: Output Conversion Syntax,  Up: Formatted Output
+
+12.12.3 Table of Output Conversions
+-----------------------------------
+
+Here is a table summarizing what all the different conversions do:
+
+'%d', '%i'
+     Print an integer as a signed decimal number.  *Note Integer
+     Conversions::, for details.  '%d' and '%i' are synonymous for
+     output, but are different when used with 'scanf' for input (*note
+     Table of Input Conversions::).
+
+'%o'
+     Print an integer as an unsigned octal number.  *Note Integer
+     Conversions::, for details.
+
+'%u'
+     Print an integer as an unsigned decimal number.  *Note Integer
+     Conversions::, for details.
+
+'%x', '%X'
+     Print an integer as an unsigned hexadecimal number.  '%x' uses
+     lower-case letters and '%X' uses upper-case.  *Note Integer
+     Conversions::, for details.
+
+'%f'
+     Print a floating-point number in normal (fixed-point) notation.
+     *Note Floating-Point Conversions::, for details.
+
+'%e', '%E'
+     Print a floating-point number in exponential notation.  '%e' uses
+     lower-case letters and '%E' uses upper-case.  *Note Floating-Point
+     Conversions::, for details.
+
+'%g', '%G'
+     Print a floating-point number in either normal or exponential
+     notation, whichever is more appropriate for its magnitude.  '%g'
+     uses lower-case letters and '%G' uses upper-case.  *Note
+     Floating-Point Conversions::, for details.
+
+'%a', '%A'
+     Print a floating-point number in a hexadecimal fractional notation
+     which the exponent to base 2 represented in decimal digits.  '%a'
+     uses lower-case letters and '%A' uses upper-case.  *Note
+     Floating-Point Conversions::, for details.
+
+'%c'
+     Print a single character.  *Note Other Output Conversions::.
+
+'%C'
+     This is an alias for '%lc' which is supported for compatibility
+     with the Unix standard.
+
+'%s'
+     Print a string.  *Note Other Output Conversions::.
+
+'%S'
+     This is an alias for '%ls' which is supported for compatibility
+     with the Unix standard.
+
+'%p'
+     Print the value of a pointer.  *Note Other Output Conversions::.
+
+'%n'
+     Get the number of characters printed so far.  *Note Other Output
+     Conversions::.  Note that this conversion specification never
+     produces any output.
+
+'%m'
+     Print the string corresponding to the value of 'errno'.  (This is a
+     GNU extension.)  *Note Other Output Conversions::.
+
+'%%'
+     Print a literal '%' character.  *Note Other Output Conversions::.
+
+   If the syntax of a conversion specification is invalid, unpredictable
+things will happen, so don't do this.  If there aren't enough function
+arguments provided to supply values for all the conversion
+specifications in the template string, or if the arguments are not of
+the correct types, the results are unpredictable.  If you supply more
+arguments than conversion specifications, the extra argument values are
+simply ignored; this is sometimes useful.
+
+
+File: libc.info,  Node: Integer Conversions,  Next: Floating-Point Conversions,  Prev: Table of Output Conversions,  Up: Formatted Output
+
+12.12.4 Integer Conversions
+---------------------------
+
+This section describes the options for the '%d', '%i', '%o', '%u', '%x',
+and '%X' conversion specifications.  These conversions print integers in
+various formats.
+
+   The '%d' and '%i' conversion specifications both print an 'int'
+argument as a signed decimal number; while '%o', '%u', and '%x' print
+the argument as an unsigned octal, decimal, or hexadecimal number
+(respectively).  The '%X' conversion specification is just like '%x'
+except that it uses the characters 'ABCDEF' as digits instead of
+'abcdef'.
+
+   The following flags are meaningful:
+
+'-'
+     Left-justify the result in the field (instead of the normal
+     right-justification).
+
+'+'
+     For the signed '%d' and '%i' conversions, print a plus sign if the
+     value is positive.
+
+' '
+     For the signed '%d' and '%i' conversions, if the result doesn't
+     start with a plus or minus sign, prefix it with a space character
+     instead.  Since the '+' flag ensures that the result includes a
+     sign, this flag is ignored if you supply both of them.
+
+'#'
+     For the '%o' conversion, this forces the leading digit to be '0',
+     as if by increasing the precision.  For '%x' or '%X', this prefixes
+     a leading '0x' or '0X' (respectively) to the result.  This doesn't
+     do anything useful for the '%d', '%i', or '%u' conversions.  Using
+     this flag produces output which can be parsed by the 'strtoul'
+     function (*note Parsing of Integers::) and 'scanf' with the '%i'
+     conversion (*note Numeric Input Conversions::).
+
+'''
+     Separate the digits into groups as specified by the locale
+     specified for the 'LC_NUMERIC' category; *note General Numeric::.
+     This flag is a GNU extension.
+
+'0'
+     Pad the field with zeros instead of spaces.  The zeros are placed
+     after any indication of sign or base.  This flag is ignored if the
+     '-' flag is also specified, or if a precision is specified.
+
+   If a precision is supplied, it specifies the minimum number of digits
+to appear; leading zeros are produced if necessary.  If you don't
+specify a precision, the number is printed with as many digits as it
+needs.  If you convert a value of zero with an explicit precision of
+zero, then no characters at all are produced.
+
+   Without a type modifier, the corresponding argument is treated as an
+'int' (for the signed conversions '%i' and '%d') or 'unsigned int' (for
+the unsigned conversions '%o', '%u', '%x', and '%X').  Recall that since
+'printf' and friends are variadic, any 'char' and 'short' arguments are
+automatically converted to 'int' by the default argument promotions.
+For arguments of other integer types, you can use these modifiers:
+
+'hh'
+     Specifies that the argument is a 'signed char' or 'unsigned char',
+     as appropriate.  A 'char' argument is converted to an 'int' or
+     'unsigned int' by the default argument promotions anyway, but the
+     'h' modifier says to convert it back to a 'char' again.
+
+     This modifier was introduced in ISO C99.
+
+'h'
+     Specifies that the argument is a 'short int' or 'unsigned short
+     int', as appropriate.  A 'short' argument is converted to an 'int'
+     or 'unsigned int' by the default argument promotions anyway, but
+     the 'h' modifier says to convert it back to a 'short' again.
+
+'j'
+     Specifies that the argument is a 'intmax_t' or 'uintmax_t', as
+     appropriate.
+
+     This modifier was introduced in ISO C99.
+
+'l'
+     Specifies that the argument is a 'long int' or 'unsigned long int',
+     as appropriate.  Two 'l' characters is like the 'L' modifier,
+     below.
+
+     If used with '%c' or '%s' the corresponding parameter is considered
+     as a wide character or wide character string respectively.  This
+     use of 'l' was introduced in Amendment 1 to ISO C90.
+
+'L'
+'ll'
+'q'
+     Specifies that the argument is a 'long long int'.  (This type is an
+     extension supported by the GNU C compiler.  On systems that don't
+     support extra-long integers, this is the same as 'long int'.)
+
+     The 'q' modifier is another name for the same thing, which comes
+     from 4.4 BSD; a 'long long int' is sometimes called a "quad" 'int'.
+
+'t'
+     Specifies that the argument is a 'ptrdiff_t'.
+
+     This modifier was introduced in ISO C99.
+
+'z'
+'Z'
+     Specifies that the argument is a 'size_t'.
+
+     'z' was introduced in ISO C99.  'Z' is a GNU extension predating
+     this addition and should not be used in new code.
+
+   Here is an example.  Using the template string:
+
+     "|%5d|%-5d|%+5d|%+-5d|% 5d|%05d|%5.0d|%5.2d|%d|\n"
+
+to print numbers using the different options for the '%d' conversion
+gives results like:
+
+     |    0|0    |   +0|+0   |    0|00000|     |   00|0|
+     |    1|1    |   +1|+1   |    1|00001|    1|   01|1|
+     |   -1|-1   |   -1|-1   |   -1|-0001|   -1|  -01|-1|
+     |100000|100000|+100000|+100000| 100000|100000|100000|100000|100000|
+
+   In particular, notice what happens in the last case where the number
+is too large to fit in the minimum field width specified.
+
+   Here are some more examples showing how unsigned integers print under
+various format options, using the template string:
+
+     "|%5u|%5o|%5x|%5X|%#5o|%#5x|%#5X|%#10.8x|\n"
+
+     |    0|    0|    0|    0|    0|    0|    0|  00000000|
+     |    1|    1|    1|    1|   01|  0x1|  0X1|0x00000001|
+     |100000|303240|186a0|186A0|0303240|0x186a0|0X186A0|0x000186a0|
+
+
+File: libc.info,  Node: Floating-Point Conversions,  Next: Other Output Conversions,  Prev: Integer Conversions,  Up: Formatted Output
+
+12.12.5 Floating-Point Conversions
+----------------------------------
+
+This section discusses the conversion specifications for floating-point
+numbers: the '%f', '%e', '%E', '%g', and '%G' conversions.
+
+   The '%f' conversion prints its argument in fixed-point notation,
+producing output of the form ['-']DDD'.'DDD, where the number of digits
+following the decimal point is controlled by the precision you specify.
+
+   The '%e' conversion prints its argument in exponential notation,
+producing output of the form ['-']D'.'DDD'e'['+'|'-']DD.  Again, the
+number of digits following the decimal point is controlled by the
+precision.  The exponent always contains at least two digits.  The '%E'
+conversion is similar but the exponent is marked with the letter 'E'
+instead of 'e'.
+
+   The '%g' and '%G' conversions print the argument in the style of '%e'
+or '%E' (respectively) if the exponent would be less than -4 or greater
+than or equal to the precision; otherwise they use the '%f' style.  A
+precision of '0', is taken as 1.  Trailing zeros are removed from the
+fractional portion of the result and a decimal-point character appears
+only if it is followed by a digit.
+
+   The '%a' and '%A' conversions are meant for representing
+floating-point numbers exactly in textual form so that they can be
+exchanged as texts between different programs and/or machines.  The
+numbers are represented is the form ['-']'0x'H'.'HHH'p'['+'|'-']DD.  At
+the left of the decimal-point character exactly one digit is print.
+This character is only '0' if the number is denormalized.  Otherwise the
+value is unspecified; it is implementation dependent how many bits are
+used.  The number of hexadecimal digits on the right side of the
+decimal-point character is equal to the precision.  If the precision is
+zero it is determined to be large enough to provide an exact
+representation of the number (or it is large enough to distinguish two
+adjacent values if the 'FLT_RADIX' is not a power of 2, *note Floating
+Point Parameters::).  For the '%a' conversion lower-case characters are
+used to represent the hexadecimal number and the prefix and exponent
+sign are printed as '0x' and 'p' respectively.  Otherwise upper-case
+characters are used and '0X' and 'P' are used for the representation of
+prefix and exponent string.  The exponent to the base of two is printed
+as a decimal number using at least one digit but at most as many digits
+as necessary to represent the value exactly.
+
+   If the value to be printed represents infinity or a NaN, the output
+is ['-']'inf' or 'nan' respectively if the conversion specifier is '%a',
+'%e', '%f', or '%g' and it is ['-']'INF' or 'NAN' respectively if the
+conversion is '%A', '%E', or '%G'.
+
+   The following flags can be used to modify the behavior:
+
+'-'
+     Left-justify the result in the field.  Normally the result is
+     right-justified.
+
+'+'
+     Always include a plus or minus sign in the result.
+
+' '
+     If the result doesn't start with a plus or minus sign, prefix it
+     with a space instead.  Since the '+' flag ensures that the result
+     includes a sign, this flag is ignored if you supply both of them.
+
+'#'
+     Specifies that the result should always include a decimal point,
+     even if no digits follow it.  For the '%g' and '%G' conversions,
+     this also forces trailing zeros after the decimal point to be left
+     in place where they would otherwise be removed.
+
+'''
+     Separate the digits of the integer part of the result into groups
+     as specified by the locale specified for the 'LC_NUMERIC' category;
+     *note General Numeric::.  This flag is a GNU extension.
+
+'0'
+     Pad the field with zeros instead of spaces; the zeros are placed
+     after any sign.  This flag is ignored if the '-' flag is also
+     specified.
+
+   The precision specifies how many digits follow the decimal-point
+character for the '%f', '%e', and '%E' conversions.  For these
+conversions, the default precision is '6'.  If the precision is
+explicitly '0', this suppresses the decimal point character entirely.
+For the '%g' and '%G' conversions, the precision specifies how many
+significant digits to print.  Significant digits are the first digit
+before the decimal point, and all the digits after it.  If the precision
+is '0' or not specified for '%g' or '%G', it is treated like a value of
+'1'.  If the value being printed cannot be expressed accurately in the
+specified number of digits, the value is rounded to the nearest number
+that fits.
+
+   Without a type modifier, the floating-point conversions use an
+argument of type 'double'.  (By the default argument promotions, any
+'float' arguments are automatically converted to 'double'.)  The
+following type modifier is supported:
+
+'L'
+     An uppercase 'L' specifies that the argument is a 'long double'.
+
+   Here are some examples showing how numbers print using the various
+floating-point conversions.  All of the numbers were printed using this
+template string:
+
+     "|%13.4a|%13.4f|%13.4e|%13.4g|\n"
+
+   Here is the output:
+
+     |  0x0.0000p+0|       0.0000|   0.0000e+00|            0|
+     |  0x1.0000p-1|       0.5000|   5.0000e-01|          0.5|
+     |  0x1.0000p+0|       1.0000|   1.0000e+00|            1|
+     | -0x1.0000p+0|      -1.0000|  -1.0000e+00|           -1|
+     |  0x1.9000p+6|     100.0000|   1.0000e+02|          100|
+     |  0x1.f400p+9|    1000.0000|   1.0000e+03|         1000|
+     | 0x1.3880p+13|   10000.0000|   1.0000e+04|        1e+04|
+     | 0x1.81c8p+13|   12345.0000|   1.2345e+04|    1.234e+04|
+     | 0x1.86a0p+16|  100000.0000|   1.0000e+05|        1e+05|
+     | 0x1.e240p+16|  123456.0000|   1.2346e+05|    1.235e+05|
+
+   Notice how the '%g' conversion drops trailing zeros.
+
+
+File: libc.info,  Node: Other Output Conversions,  Next: Formatted Output Functions,  Prev: Floating-Point Conversions,  Up: Formatted Output
+
+12.12.6 Other Output Conversions
+--------------------------------
+
+This section describes miscellaneous conversions for 'printf'.
+
+   The '%c' conversion prints a single character.  In case there is no
+'l' modifier the 'int' argument is first converted to an 'unsigned
+char'.  Then, if used in a wide stream function, the character is
+converted into the corresponding wide character.  The '-' flag can be
+used to specify left-justification in the field, but no other flags are
+defined, and no precision or type modifier can be given.  For example:
+
+     printf ("%c%c%c%c%c", 'h', 'e', 'l', 'l', 'o');
+
+prints 'hello'.
+
+   If there is a 'l' modifier present the argument is expected to be of
+type 'wint_t'.  If used in a multibyte function the wide character is
+converted into a multibyte character before being added to the output.
+In this case more than one output byte can be produced.
+
+   The '%s' conversion prints a string.  If no 'l' modifier is present
+the corresponding argument must be of type 'char *' (or 'const char *').
+If used in a wide stream function the string is first converted in a
+wide character string.  A precision can be specified to indicate the
+maximum number of characters to write; otherwise characters in the
+string up to but not including the terminating null character are
+written to the output stream.  The '-' flag can be used to specify
+left-justification in the field, but no other flags or type modifiers
+are defined for this conversion.  For example:
+
+     printf ("%3s%-6s", "no", "where");
+
+prints ' nowhere '.
+
+   If there is a 'l' modifier present the argument is expected to be of
+type 'wchar_t' (or 'const wchar_t *').
+
+   If you accidentally pass a null pointer as the argument for a '%s'
+conversion, the GNU C Library prints it as '(null)'.  We think this is
+more useful than crashing.  But it's not good practice to pass a null
+argument intentionally.
+
+   The '%m' conversion prints the string corresponding to the error code
+in 'errno'.  *Note Error Messages::.  Thus:
+
+     fprintf (stderr, "can't open `%s': %m\n", filename);
+
+is equivalent to:
+
+     fprintf (stderr, "can't open `%s': %s\n", filename, strerror (errno));
+
+The '%m' conversion is a GNU C Library extension.
+
+   The '%p' conversion prints a pointer value.  The corresponding
+argument must be of type 'void *'.  In practice, you can use any type of
+pointer.
+
+   In the GNU C Library, non-null pointers are printed as unsigned
+integers, as if a '%#x' conversion were used.  Null pointers print as
+'(nil)'.  (Pointers might print differently in other systems.)
+
+   For example:
+
+     printf ("%p", "testing");
+
+prints '0x' followed by a hexadecimal number--the address of the string
+constant '"testing"'.  It does not print the word 'testing'.
+
+   You can supply the '-' flag with the '%p' conversion to specify
+left-justification, but no other flags, precision, or type modifiers are
+defined.
+
+   The '%n' conversion is unlike any of the other output conversions.
+It uses an argument which must be a pointer to an 'int', but instead of
+printing anything it stores the number of characters printed so far by
+this call at that location.  The 'h' and 'l' type modifiers are
+permitted to specify that the argument is of type 'short int *' or 'long
+int *' instead of 'int *', but no flags, field width, or precision are
+permitted.
+
+   For example,
+
+     int nchar;
+     printf ("%d %s%n\n", 3, "bears", &nchar);
+
+prints:
+
+     3 bears
+
+and sets 'nchar' to '7', because '3 bears' is seven characters.
+
+   The '%%' conversion prints a literal '%' character.  This conversion
+doesn't use an argument, and no flags, field width, precision, or type
+modifiers are permitted.
+
+
+File: libc.info,  Node: Formatted Output Functions,  Next: Dynamic Output,  Prev: Other Output Conversions,  Up: Formatted Output
+
+12.12.7 Formatted Output Functions
+----------------------------------
+
+This section describes how to call 'printf' and related functions.
+Prototypes for these functions are in the header file 'stdio.h'.
+Because these functions take a variable number of arguments, you _must_
+declare prototypes for them before using them.  Of course, the easiest
+way to make sure you have all the right prototypes is to just include
+'stdio.h'.
+
+ -- Function: int printf (const char *TEMPLATE, ...)
+     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
+     mem lock corrupt | *Note POSIX Safety Concepts::.
+
+     The 'printf' function prints the optional arguments under the
+     control of the template string TEMPLATE to the stream 'stdout'.  It
+     returns the number of characters printed, or a negative value if
+     there was an output error.
+
+ -- Function: int wprintf (const wchar_t *TEMPLATE, ...)
+     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
+     mem lock corrupt | *Note POSIX Safety Concepts::.
+
+     The 'wprintf' function prints the optional arguments under the
+     control of the wide template string TEMPLATE to the stream
+     'stdout'.  It returns the number of wide characters printed, or a
+     negative value if there was an output error.
+
+ -- Function: int fprintf (FILE *STREAM, const char *TEMPLATE, ...)
+     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
+     mem lock corrupt | *Note POSIX Safety Concepts::.
+
+     This function is just like 'printf', except that the output is
+     written to the stream STREAM instead of 'stdout'.
+
+ -- Function: int fwprintf (FILE *STREAM, const wchar_t *TEMPLATE, ...)
+     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
+     mem lock corrupt | *Note POSIX Safety Concepts::.
+
+     This function is just like 'wprintf', except that the output is
+     written to the stream STREAM instead of 'stdout'.
+
+ -- Function: int sprintf (char *S, const char *TEMPLATE, ...)
+     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
+     *Note POSIX Safety Concepts::.
+
+     This is like 'printf', except that the output is stored in the
+     character array S instead of written to a stream.  A null character
+     is written to mark the end of the string.
+
+     The 'sprintf' function returns the number of characters stored in
+     the array S, not including the terminating null character.
+
+     The behavior of this function is undefined if copying takes place
+     between objects that overlap--for example, if S is also given as an
+     argument to be printed under control of the '%s' conversion.  *Note
+     Copying and Concatenation::.
+
+     *Warning:* The 'sprintf' function can be *dangerous* because it can
+     potentially output more characters than can fit in the allocation
+     size of the string S.  Remember that the field width given in a
+     conversion specification is only a _minimum_ value.
+
+     To avoid this problem, you can use 'snprintf' or 'asprintf',
+     described below.
+
+ -- Function: int swprintf (wchar_t *S, size_t SIZE, const wchar_t
+          *TEMPLATE, ...)
+     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
+     *Note POSIX Safety Concepts::.
+
+     This is like 'wprintf', except that the output is stored in the
+     wide character array WS instead of written to a stream.  A null
+     wide character is written to mark the end of the string.  The SIZE
+     argument specifies the maximum number of characters to produce.
+     The trailing null character is counted towards this limit, so you
+     should allocate at least SIZE wide characters for the string WS.
+
+     The return value is the number of characters generated for the
+     given input, excluding the trailing null.  If not all output fits
+     into the provided buffer a negative value is returned.  You should
+     try again with a bigger output string.  _Note:_ this is different
+     from how 'snprintf' handles this situation.
+
+     Note that the corresponding narrow stream function takes fewer
+     parameters.  'swprintf' in fact corresponds to the 'snprintf'
+     function.  Since the 'sprintf' function can be dangerous and should
+     be avoided the ISO C committee refused to make the same mistake
+     again and decided to not define a function exactly corresponding to
+     'sprintf'.
+
+ -- Function: int snprintf (char *S, size_t SIZE, const char *TEMPLATE,
+          ...)
+     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
+     *Note POSIX Safety Concepts::.
+
+     The 'snprintf' function is similar to 'sprintf', except that the
+     SIZE argument specifies the maximum number of characters to
+     produce.  The trailing null character is counted towards this
+     limit, so you should allocate at least SIZE characters for the
+     string S.  If SIZE is zero, nothing, not even the null byte, shall
+     be written and S may be a null pointer.
+
+     The return value is the number of characters which would be
+     generated for the given input, excluding the trailing null.  If
+     this value is greater or equal to SIZE, not all characters from the
+     result have been stored in S.  You should try again with a bigger
+     output string.  Here is an example of doing this:
+
+          /* Construct a message describing the value of a variable
+             whose name is NAME and whose value is VALUE. */
+          char *
+          make_message (char *name, char *value)
+          {
+            /* Guess we need no more than 100 chars of space. */
+            int size = 100;
+            char *buffer = (char *) xmalloc (size);
+            int nchars;
+            if (buffer == NULL)
+              return NULL;
+
+           /* Try to print in the allocated space. */
+            nchars = snprintf (buffer, size, "value of %s is %s",
+          		     name, value);
+            if (nchars >= size)
+              {
+                /* Reallocate buffer now that we know
+          	 how much space is needed. */
+                size = nchars + 1;
+                buffer = (char *) xrealloc (buffer, size);
+
+                if (buffer != NULL)
+          	/* Try again. */
+          	snprintf (buffer, size, "value of %s is %s",
+          		  name, value);
+              }
+            /* The last call worked, return the string. */
+            return buffer;
+          }
+
+     In practice, it is often easier just to use 'asprintf', below.
+
+     *Attention:* In versions of the GNU C Library prior to 2.1 the
+     return value is the number of characters stored, not including the
+     terminating null; unless there was not enough space in S to store
+     the result in which case '-1' is returned.  This was changed in
+     order to comply with the ISO C99 standard.
+
+
+File: libc.info,  Node: Dynamic Output,  Next: Variable Arguments Output,  Prev: Formatted Output Functions,  Up: Formatted Output
+
+12.12.8 Dynamically Allocating Formatted Output
+-----------------------------------------------
+
+The functions in this section do formatted output and place the results
+in dynamically allocated memory.
+
+ -- Function: int asprintf (char **PTR, const char *TEMPLATE, ...)
+     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
+     *Note POSIX Safety Concepts::.
+
+     This function is similar to 'sprintf', except that it dynamically
+     allocates a string (as with 'malloc'; *note Unconstrained
+     Allocation::) to hold the output, instead of putting the output in
+     a buffer you allocate in advance.  The PTR argument should be the
+     address of a 'char *' object, and a successful call to 'asprintf'
+     stores a pointer to the newly allocated string at that location.
+
+     The return value is the number of characters allocated for the
+     buffer, or less than zero if an error occurred.  Usually this means
+     that the buffer could not be allocated.
+
+     Here is how to use 'asprintf' to get the same result as the
+     'snprintf' example, but more easily:
+
+          /* Construct a message describing the value of a variable
+             whose name is NAME and whose value is VALUE. */
+          char *
+          make_message (char *name, char *value)
+          {
+            char *result;
+            if (asprintf (&result, "value of %s is %s", name, value) < 0)
+              return NULL;
+            return result;
+          }
+
+ -- Function: int obstack_printf (struct obstack *OBSTACK, const char
+          *TEMPLATE, ...)
+     Preliminary: | MT-Safe race:obstack locale | AS-Unsafe corrupt heap
+     | AC-Unsafe corrupt mem | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'asprintf', except that it uses the
+     obstack OBSTACK to allocate the space.  *Note Obstacks::.
+
+     The characters are written onto the end of the current object.  To
+     get at them, you must finish the object with 'obstack_finish'
+     (*note Growing Objects::).
+
+
+File: libc.info,  Node: Variable Arguments Output,  Next: Parsing a Template String,  Prev: Dynamic Output,  Up: Formatted Output
+
+12.12.9 Variable Arguments Output Functions
+-------------------------------------------
+
+The functions 'vprintf' and friends are provided so that you can define
+your own variadic 'printf'-like functions that make use of the same
+internals as the built-in formatted output functions.
+
+   The most natural way to define such functions would be to use a
+language construct to say, "Call 'printf' and pass this template plus
+all of my arguments after the first five."  But there is no way to do
+this in C, and it would be hard to provide a way, since at the C
+language level there is no way to tell how many arguments your function
+received.
+
+   Since that method is impossible, we provide alternative functions,
+the 'vprintf' series, which lets you pass a 'va_list' to describe "all
+of my arguments after the first five."
+
+   When it is sufficient to define a macro rather than a real function,
+the GNU C compiler provides a way to do this much more easily with
+macros.  For example:
+
+     #define myprintf(a, b, c, d, e, rest...) \
+     	    printf (mytemplate , ## rest)
+
+*Note (cpp)Variadic Macros::, for details.  But this is limited to
+macros, and does not apply to real functions at all.
+
+   Before calling 'vprintf' or the other functions listed in this
+section, you _must_ call 'va_start' (*note Variadic Functions::) to
+initialize a pointer to the variable arguments.  Then you can call
+'va_arg' to fetch the arguments that you want to handle yourself.  This
+advances the pointer past those arguments.
+
+   Once your 'va_list' pointer is pointing at the argument of your
+choice, you are ready to call 'vprintf'.  That argument and all
+subsequent arguments that were passed to your function are used by
+'vprintf' along with the template that you specified separately.
+
+   In some other systems, the 'va_list' pointer may become invalid after
+the call to 'vprintf', so you must not use 'va_arg' after you call
+'vprintf'.  Instead, you should call 'va_end' to retire the pointer from
+service.  However, you can safely call 'va_start' on another pointer
+variable and begin fetching the arguments again through that pointer.
+Calling 'vprintf' does not destroy the argument list of your function,
+merely the particular pointer that you passed to it.
+
+   GNU C does not have such restrictions.  You can safely continue to
+fetch arguments from a 'va_list' pointer after passing it to 'vprintf',
+and 'va_end' is a no-op.  (Note, however, that subsequent 'va_arg' calls
+will fetch the same arguments which 'vprintf' previously used.)
+
+   Prototypes for these functions are declared in 'stdio.h'.
+
+ -- Function: int vprintf (const char *TEMPLATE, va_list AP)
+     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
+     mem lock corrupt | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'printf' except that, instead of taking
+     a variable number of arguments directly, it takes an argument list
+     pointer AP.
+
+ -- Function: int vwprintf (const wchar_t *TEMPLATE, va_list AP)
+     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
+     mem lock corrupt | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'wprintf' except that, instead of
+     taking a variable number of arguments directly, it takes an
+     argument list pointer AP.
+
+ -- Function: int vfprintf (FILE *STREAM, const char *TEMPLATE, va_list
+          AP)
+     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
+     mem lock corrupt | *Note POSIX Safety Concepts::.
+
+     This is the equivalent of 'fprintf' with the variable argument list
+     specified directly as for 'vprintf'.
+
+ -- Function: int vfwprintf (FILE *STREAM, const wchar_t *TEMPLATE,
+          va_list AP)
+     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
+     mem lock corrupt | *Note POSIX Safety Concepts::.
+
+     This is the equivalent of 'fwprintf' with the variable argument
+     list specified directly as for 'vwprintf'.
+
+ -- Function: int vsprintf (char *S, const char *TEMPLATE, va_list AP)
+     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
+     *Note POSIX Safety Concepts::.
+
+     This is the equivalent of 'sprintf' with the variable argument list
+     specified directly as for 'vprintf'.
+
+ -- Function: int vswprintf (wchar_t *S, size_t SIZE, const wchar_t
+          *TEMPLATE, va_list AP)
+     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
+     *Note POSIX Safety Concepts::.
+
+     This is the equivalent of 'swprintf' with the variable argument
+     list specified directly as for 'vwprintf'.
+
+ -- Function: int vsnprintf (char *S, size_t SIZE, const char *TEMPLATE,
+          va_list AP)
+     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
+     *Note POSIX Safety Concepts::.
+
+     This is the equivalent of 'snprintf' with the variable argument
+     list specified directly as for 'vprintf'.
+
+ -- Function: int vasprintf (char **PTR, const char *TEMPLATE, va_list
+          AP)
+     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
+     *Note POSIX Safety Concepts::.
+
+     The 'vasprintf' function is the equivalent of 'asprintf' with the
+     variable argument list specified directly as for 'vprintf'.
+
+ -- Function: int obstack_vprintf (struct obstack *OBSTACK, const char
+          *TEMPLATE, va_list AP)
+     Preliminary: | MT-Safe race:obstack locale | AS-Unsafe corrupt heap
+     | AC-Unsafe corrupt mem | *Note POSIX Safety Concepts::.
+
+     The 'obstack_vprintf' function is the equivalent of
+     'obstack_printf' with the variable argument list specified directly
+     as for 'vprintf'.
+
+   Here's an example showing how you might use 'vfprintf'.  This is a
+function that prints error messages to the stream 'stderr', along with a
+prefix indicating the name of the program (*note Error Messages::, for a
+description of 'program_invocation_short_name').
+
+     #include <stdio.h>
+     #include <stdarg.h>
+
+     void
+     eprintf (const char *template, ...)
+     {
+       va_list ap;
+       extern char *program_invocation_short_name;
+
+       fprintf (stderr, "%s: ", program_invocation_short_name);
+       va_start (ap, template);
+       vfprintf (stderr, template, ap);
+       va_end (ap);
+     }
+
+You could call 'eprintf' like this:
+
+     eprintf ("file `%s' does not exist\n", filename);
+
+   In GNU C, there is a special construct you can use to let the
+compiler know that a function uses a 'printf'-style format string.  Then
+it can check the number and types of arguments in each call to the
+function, and warn you when they do not match the format string.  For
+example, take this declaration of 'eprintf':
+
+     void eprintf (const char *template, ...)
+     	__attribute__ ((format (printf, 1, 2)));
+
+This tells the compiler that 'eprintf' uses a format string like
+'printf' (as opposed to 'scanf'; *note Formatted Input::); the format
+string appears as the first argument; and the arguments to satisfy the
+format begin with the second.  *Note Declaring Attributes of Functions:
+(gcc.info)Function Attributes, for more information.
+
+
+File: libc.info,  Node: Parsing a Template String,  Next: Example of Parsing,  Prev: Variable Arguments Output,  Up: Formatted Output
+
+12.12.10 Parsing a Template String
+----------------------------------
+
+You can use the function 'parse_printf_format' to obtain information
+about the number and types of arguments that are expected by a given
+template string.  This function permits interpreters that provide
+interfaces to 'printf' to avoid passing along invalid arguments from the
+user's program, which could cause a crash.
+
+   All the symbols described in this section are declared in the header
+file 'printf.h'.
+
+ -- Function: size_t parse_printf_format (const char *TEMPLATE, size_t
+          N, int *ARGTYPES)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     This function returns information about the number and types of
+     arguments expected by the 'printf' template string TEMPLATE.  The
+     information is stored in the array ARGTYPES; each element of this
+     array describes one argument.  This information is encoded using
+     the various 'PA_' macros, listed below.
+
+     The argument N specifies the number of elements in the array
+     ARGTYPES.  This is the maximum number of elements that
+     'parse_printf_format' will try to write.
+
+     'parse_printf_format' returns the total number of arguments
+     required by TEMPLATE.  If this number is greater than N, then the
+     information returned describes only the first N arguments.  If you
+     want information about additional arguments, allocate a bigger
+     array and call 'parse_printf_format' again.
+
+   The argument types are encoded as a combination of a basic type and
+modifier flag bits.
+
+ -- Macro: int PA_FLAG_MASK
+     This macro is a bitmask for the type modifier flag bits.  You can
+     write the expression '(argtypes[i] & PA_FLAG_MASK)' to extract just
+     the flag bits for an argument, or '(argtypes[i] & ~PA_FLAG_MASK)'
+     to extract just the basic type code.
+
+   Here are symbolic constants that represent the basic types; they
+stand for integer values.
+
+'PA_INT'
+     This specifies that the base type is 'int'.
+
+'PA_CHAR'
+     This specifies that the base type is 'int', cast to 'char'.
+
+'PA_STRING'
+     This specifies that the base type is 'char *', a null-terminated
+     string.
+
+'PA_POINTER'
+     This specifies that the base type is 'void *', an arbitrary
+     pointer.
+
+'PA_FLOAT'
+     This specifies that the base type is 'float'.
+
+'PA_DOUBLE'
+     This specifies that the base type is 'double'.
+
+'PA_LAST'
+     You can define additional base types for your own programs as
+     offsets from 'PA_LAST'.  For example, if you have data types 'foo'
+     and 'bar' with their own specialized 'printf' conversions, you
+     could define encodings for these types as:
+
+          #define PA_FOO  PA_LAST
+          #define PA_BAR  (PA_LAST + 1)
+
+   Here are the flag bits that modify a basic type.  They are combined
+with the code for the basic type using inclusive-or.
+
+'PA_FLAG_PTR'
+     If this bit is set, it indicates that the encoded type is a pointer
+     to the base type, rather than an immediate value.  For example,
+     'PA_INT|PA_FLAG_PTR' represents the type 'int *'.
+
+'PA_FLAG_SHORT'
+     If this bit is set, it indicates that the base type is modified
+     with 'short'.  (This corresponds to the 'h' type modifier.)
+
+'PA_FLAG_LONG'
+     If this bit is set, it indicates that the base type is modified
+     with 'long'.  (This corresponds to the 'l' type modifier.)
+
+'PA_FLAG_LONG_LONG'
+     If this bit is set, it indicates that the base type is modified
+     with 'long long'.  (This corresponds to the 'L' type modifier.)
+
+'PA_FLAG_LONG_DOUBLE'
+     This is a synonym for 'PA_FLAG_LONG_LONG', used by convention with
+     a base type of 'PA_DOUBLE' to indicate a type of 'long double'.
+
+   For an example of using these facilities, see *note Example of
+Parsing::.
+
+
+File: libc.info,  Node: Example of Parsing,  Prev: Parsing a Template String,  Up: Formatted Output
+
+12.12.11 Example of Parsing a Template String
+---------------------------------------------
+
+Here is an example of decoding argument types for a format string.  We
+assume this is part of an interpreter which contains arguments of type
+'NUMBER', 'CHAR', 'STRING' and 'STRUCTURE' (and perhaps others which are
+not valid here).
+
+     /* Test whether the NARGS specified objects
+        in the vector ARGS are valid
+        for the format string FORMAT:
+        if so, return 1.
+        If not, return 0 after printing an error message.  */
+
+     int
+     validate_args (char *format, int nargs, OBJECT *args)
+     {
+       int *argtypes;
+       int nwanted;
+
+       /* Get the information about the arguments.
+          Each conversion specification must be at least two characters
+          long, so there cannot be more specifications than half the
+          length of the string.  */
+
+       argtypes = (int *) alloca (strlen (format) / 2 * sizeof (int));
+       nwanted = parse_printf_format (string, nelts, argtypes);
+
+       /* Check the number of arguments.  */
+       if (nwanted > nargs)
+         {
+           error ("too few arguments (at least %d required)", nwanted);
+           return 0;
+         }
+
+       /* Check the C type wanted for each argument
+          and see if the object given is suitable.  */
+       for (i = 0; i < nwanted; i++)
+         {
+           int wanted;
+
+           if (argtypes[i] & PA_FLAG_PTR)
+     	wanted = STRUCTURE;
+           else
+     	switch (argtypes[i] & ~PA_FLAG_MASK)
+	       {
+     	  case PA_INT:
+     	  case PA_FLOAT:
+     	  case PA_DOUBLE:
+     	    wanted = NUMBER;
+     	    break;
+     	  case PA_CHAR:
+     	    wanted = CHAR;
+     	    break;
+     	  case PA_STRING:
+     	    wanted = STRING;
+     	    break;
+     	  case PA_POINTER:
+     	    wanted = STRUCTURE;
+     	    break;
+	       }
+           if (TYPE (args[i]) != wanted)
+	     {
+     	  error ("type mismatch for arg number %d", i);
+     	  return 0;
+	     }
+         }
+       return 1;
+     }
+
+
+File: libc.info,  Node: Customizing Printf,  Next: Formatted Input,  Prev: Formatted Output,  Up: I/O on Streams
+
+12.13 Customizing 'printf'
+==========================
+
+The GNU C Library lets you define your own custom conversion specifiers
+for 'printf' template strings, to teach 'printf' clever ways to print
+the important data structures of your program.
+
+   The way you do this is by registering the conversion with the
+function 'register_printf_function'; see *note Registering New
+Conversions::.  One of the arguments you pass to this function is a
+pointer to a handler function that produces the actual output; see *note
+Defining the Output Handler::, for information on how to write this
+function.
+
+   You can also install a function that just returns information about
+the number and type of arguments expected by the conversion specifier.
+*Note Parsing a Template String::, for information about this.
+
+   The facilities of this section are declared in the header file
+'printf.h'.
+
+* Menu:
+
+* Registering New Conversions::         Using 'register_printf_function'
+					 to register a new output conversion.
+* Conversion Specifier Options::        The handler must be able to get
+					 the options specified in the
+					 template when it is called.
+* Defining the Output Handler::         Defining the handler and arginfo
+					 functions that are passed as arguments
+					 to 'register_printf_function'.
+* Printf Extension Example::            How to define a 'printf'
+					 handler function.
+* Predefined Printf Handlers::          Predefined 'printf' handlers.
+
+   *Portability Note:* The ability to extend the syntax of 'printf'
+template strings is a GNU extension.  ISO standard C has nothing
+similar.
+
+
+File: libc.info,  Node: Registering New Conversions,  Next: Conversion Specifier Options,  Up: Customizing Printf
+
+12.13.1 Registering New Conversions
+-----------------------------------
+
+The function to register a new output conversion is
+'register_printf_function', declared in 'printf.h'.
+
+ -- Function: int register_printf_function (int SPEC, printf_function
+          HANDLER-FUNCTION, printf_arginfo_function ARGINFO-FUNCTION)
+     Preliminary: | MT-Unsafe const:printfext | AS-Unsafe heap lock |
+     AC-Unsafe mem lock | *Note POSIX Safety Concepts::.
+
+     This function defines the conversion specifier character SPEC.
+     Thus, if SPEC is ''Y'', it defines the conversion '%Y'.  You can
+     redefine the built-in conversions like '%s', but flag characters
+     like '#' and type modifiers like 'l' can never be used as
+     conversions; calling 'register_printf_function' for those
+     characters has no effect.  It is advisable not to use lowercase
+     letters, since the ISO C standard warns that additional lowercase
+     letters may be standardized in future editions of the standard.
+
+     The HANDLER-FUNCTION is the function called by 'printf' and friends
+     when this conversion appears in a template string.  *Note Defining
+     the Output Handler::, for information about how to define a
+     function to pass as this argument.  If you specify a null pointer,
+     any existing handler function for SPEC is removed.
+
+     The ARGINFO-FUNCTION is the function called by
+     'parse_printf_format' when this conversion appears in a template
+     string.  *Note Parsing a Template String::, for information about
+     this.
+
+     *Attention:* In the GNU C Library versions before 2.0 the
+     ARGINFO-FUNCTION function did not need to be installed unless the
+     user used the 'parse_printf_format' function.  This has changed.
+     Now a call to any of the 'printf' functions will call this function
+     when this format specifier appears in the format string.
+
+     The return value is '0' on success, and '-1' on failure (which
+     occurs if SPEC is out of range).
+
+     You can redefine the standard output conversions, but this is
+     probably not a good idea because of the potential for confusion.
+     Library routines written by other people could break if you do
+     this.
+
+
+File: libc.info,  Node: Conversion Specifier Options,  Next: Defining the Output Handler,  Prev: Registering New Conversions,  Up: Customizing Printf
+
+12.13.2 Conversion Specifier Options
+------------------------------------
+
+If you define a meaning for '%A', what if the template contains '%+23A'
+or '%-#A'?  To implement a sensible meaning for these, the handler when
+called needs to be able to get the options specified in the template.
+
+   Both the HANDLER-FUNCTION and ARGINFO-FUNCTION accept an argument
+that points to a 'struct printf_info', which contains information about
+the options appearing in an instance of the conversion specifier.  This
+data type is declared in the header file 'printf.h'.
+
+ -- Type: struct printf_info
+     This structure is used to pass information about the options
+     appearing in an instance of a conversion specifier in a 'printf'
+     template string to the handler and arginfo functions for that
+     specifier.  It contains the following members:
+
+     'int prec'
+          This is the precision specified.  The value is '-1' if no
+          precision was specified.  If the precision was given as '*',
+          the 'printf_info' structure passed to the handler function
+          contains the actual value retrieved from the argument list.
+          But the structure passed to the arginfo function contains a
+          value of 'INT_MIN', since the actual value is not known.
+
+     'int width'
+          This is the minimum field width specified.  The value is '0'
+          if no width was specified.  If the field width was given as
+          '*', the 'printf_info' structure passed to the handler
+          function contains the actual value retrieved from the argument
+          list.  But the structure passed to the arginfo function
+          contains a value of 'INT_MIN', since the actual value is not
+          known.
+
+     'wchar_t spec'
+          This is the conversion specifier character specified.  It's
+          stored in the structure so that you can register the same
+          handler function for multiple characters, but still have a way
+          to tell them apart when the handler function is called.
+
+     'unsigned int is_long_double'
+          This is a boolean that is true if the 'L', 'll', or 'q' type
+          modifier was specified.  For integer conversions, this
+          indicates 'long long int', as opposed to 'long double' for
+          floating point conversions.
+
+     'unsigned int is_char'
+          This is a boolean that is true if the 'hh' type modifier was
+          specified.
+
+     'unsigned int is_short'
+          This is a boolean that is true if the 'h' type modifier was
+          specified.
+
+     'unsigned int is_long'
+          This is a boolean that is true if the 'l' type modifier was
+          specified.
+
+     'unsigned int alt'
+          This is a boolean that is true if the '#' flag was specified.
+
+     'unsigned int space'
+          This is a boolean that is true if the ' ' flag was specified.
+
+     'unsigned int left'
+          This is a boolean that is true if the '-' flag was specified.
+
+     'unsigned int showsign'
+          This is a boolean that is true if the '+' flag was specified.
+
+     'unsigned int group'
+          This is a boolean that is true if the ''' flag was specified.
+
+     'unsigned int extra'
+          This flag has a special meaning depending on the context.  It
+          could be used freely by the user-defined handlers but when
+          called from the 'printf' function this variable always
+          contains the value '0'.
+
+     'unsigned int wide'
+          This flag is set if the stream is wide oriented.
+
+     'wchar_t pad'
+          This is the character to use for padding the output to the
+          minimum field width.  The value is ''0'' if the '0' flag was
+          specified, and '' '' otherwise.
+
+
+File: libc.info,  Node: Defining the Output Handler,  Next: Printf Extension Example,  Prev: Conversion Specifier Options,  Up: Customizing Printf
+
+12.13.3 Defining the Output Handler
+-----------------------------------
+
+Now let's look at how to define the handler and arginfo functions which
+are passed as arguments to 'register_printf_function'.
+
+   *Compatibility Note:* The interface changed in the GNU C Library
+version 2.0.  Previously the third argument was of type 'va_list *'.
+
+   You should define your handler functions with a prototype like:
+
+     int FUNCTION (FILE *stream, const struct printf_info *info,
+     		    const void *const *args)
+
+   The STREAM argument passed to the handler function is the stream to
+which it should write output.
+
+   The INFO argument is a pointer to a structure that contains
+information about the various options that were included with the
+conversion in the template string.  You should not modify this structure
+inside your handler function.  *Note Conversion Specifier Options::, for
+a description of this data structure.
+
+   The ARGS is a vector of pointers to the arguments data.  The number
+of arguments was determined by calling the argument information function
+provided by the user.
+
+   Your handler function should return a value just like 'printf' does:
+it should return the number of characters it has written, or a negative
+value to indicate an error.
+
+ -- Data Type: printf_function
+     This is the data type that a handler function should have.
+
+   If you are going to use 'parse_printf_format' in your application,
+you must also define a function to pass as the ARGINFO-FUNCTION argument
+for each new conversion you install with 'register_printf_function'.
+
+   You have to define these functions with a prototype like:
+
+     int FUNCTION (const struct printf_info *info,
+     		    size_t n, int *argtypes)
+
+   The return value from the function should be the number of arguments
+the conversion expects.  The function should also fill in no more than N
+elements of the ARGTYPES array with information about the types of each
+of these arguments.  This information is encoded using the various 'PA_'
+macros.  (You will notice that this is the same calling convention
+'parse_printf_format' itself uses.)
+
+ -- Data Type: printf_arginfo_function
+     This type is used to describe functions that return information
+     about the number and type of arguments used by a conversion
+     specifier.
 
 
 File: libc.info,  Node: Printf Extension Example,  Next: Predefined Printf Handlers,  Prev: Defining the Output Handler,  Up: Customizing Printf
 
-12.13.4 `printf' Extension Example
+12.13.4 'printf' Extension Example
 ----------------------------------
 
-Here is an example showing how to define a `printf' handler function.
-This program defines a data structure called a `Widget' and defines the
-`%W' conversion to print information about `Widget *' arguments,
+Here is an example showing how to define a 'printf' handler function.
+This program defines a data structure called a 'Widget' and defines the
+'%W' conversion to print information about 'Widget *' arguments,
 including the pointer value and the name stored in the data structure.
-The `%W' conversion supports the minimum field width and
+The '%W' conversion supports the minimum field width and
 left-justification options, but ignores everything else.
 
 
@@ -1801,19 +6086,19 @@
 
 File: libc.info,  Node: Predefined Printf Handlers,  Prev: Printf Extension Example,  Up: Customizing Printf
 
-12.13.5 Predefined `printf' Handlers
+12.13.5 Predefined 'printf' Handlers
 ------------------------------------
 
 The GNU C Library also contains a concrete and useful application of the
-`printf' handler extension.  There are two functions available which
+'printf' handler extension.  There are two functions available which
 implement a special way to print floating-point numbers.
 
- -- Function: int printf_size (FILE *FP, const struct printf_info
-          *INFO, const void *const *ARGS)
+ -- Function: int printf_size (FILE *FP, const struct printf_info *INFO,
+          const void *const *ARGS)
      Preliminary: | MT-Safe race:fp locale | AS-Unsafe corrupt heap |
      AC-Unsafe mem corrupt | *Note POSIX Safety Concepts::.
 
-     Print a given floating point number as for the format `%f' except
+     Print a given floating point number as for the format '%f' except
      that there is a postfix character indicating the divisor for the
      number to make this less than 1000.  There are two possible
      divisors: powers of 1024 or powers of 1000.  Which one is used
@@ -1836,9 +6121,9 @@
      y     2^80          yotta   Y       10^24
 
      The default precision is 3, i.e., 1024 is printed with a lower-case
-     format character as if it were `%.3fk' and will yield `1.000k'.
+     format character as if it were '%.3fk' and will yield '1.000k'.
 
-   Due to the requirements of `register_printf_function' we must also
+   Due to the requirements of 'register_printf_function' we must also
 provide the function which returns information about the arguments.
 
  -- Function: int printf_size_info (const struct printf_info *INFO,
@@ -1847,7 +6132,7 @@
      Concepts::.
 
      This function will return in ARGTYPES the information about the
-     used parameters in the way the `vfprintf' implementation expects
+     used parameters in the way the 'vfprintf' implementation expects
      it.  The format always takes one argument.
 
    To use these functions both functions must be registered with a call
@@ -1856,17 +6141,17 @@
      register_printf_function ('B', printf_size, printf_size_info);
 
    Here we register the functions to print numbers as powers of 1000
-since the format character `'B'' is an upper-case character.  If we
-would additionally use `'b'' in a line like
+since the format character ''B'' is an upper-case character.  If we
+would additionally use ''b'' in a line like
 
      register_printf_function ('b', printf_size, printf_size_info);
 
 we could also print using a power of 1024.  Please note that all that is
-different in these two lines is the format specifier.  The
-`printf_size' function knows about the difference between lower and
-upper case format specifiers.
+different in these two lines is the format specifier.  The 'printf_size'
+function knows about the difference between lower and upper case format
+specifiers.
 
-   The use of `'B'' and `'b'' is no coincidence.  Rather it is the
+   The use of ''B'' and ''b'' is no coincidence.  Rather it is the
 preferred way to use this functionality since it is available on some
 other systems which also use format specifiers.
 
@@ -1876,11 +6161,10 @@
 12.14 Formatted Input
 =====================
 
-The functions described in this section (`scanf' and related functions)
-provide facilities for formatted input analogous to the formatted
-output facilities.  These functions provide a mechanism for reading
-arbitrary values under the control of a "format string" or "template
-string".
+The functions described in this section ('scanf' and related functions)
+provide facilities for formatted input analogous to the formatted output
+facilities.  These functions provide a mechanism for reading arbitrary
+values under the control of a "format string" or "template string".
 
 * Menu:
 
@@ -1889,10 +6173,10 @@
 * Table of Input Conversions::  Summary of input conversions and what they do.
 * Numeric Input Conversions::   Details of conversions for reading numbers.
 * String Input Conversions::    Details of conversions for reading strings.
-* Dynamic String Input::	String conversions that `malloc' the buffer.
+* Dynamic String Input::	String conversions that 'malloc' the buffer.
 * Other Input Conversions::     Details of miscellaneous other conversions.
 * Formatted Input Functions::   Descriptions of the actual functions.
-* Variable Arguments Input::    `vscanf' and friends.
+* Variable Arguments Input::    'vscanf' and friends.
 
 
 File: libc.info,  Node: Formatted Input Basics,  Next: Input Conversion Syntax,  Up: Formatted Input
@@ -1900,37 +6184,37 @@
 12.14.1 Formatted Input Basics
 ------------------------------
 
-Calls to `scanf' are superficially similar to calls to `printf' in that
+Calls to 'scanf' are superficially similar to calls to 'printf' in that
 arbitrary arguments are read under the control of a template string.
 While the syntax of the conversion specifications in the template is
-very similar to that for `printf', the interpretation of the template
-is oriented more towards free-format input and simple pattern matching,
-rather than fixed-field formatting.  For example, most `scanf'
+very similar to that for 'printf', the interpretation of the template is
+oriented more towards free-format input and simple pattern matching,
+rather than fixed-field formatting.  For example, most 'scanf'
 conversions skip over any amount of "white space" (including spaces,
 tabs, and newlines) in the input file, and there is no concept of
 precision for the numeric input conversions as there is for the
-corresponding output conversions.  Ordinarily, non-whitespace
-characters in the template are expected to match characters in the
-input stream exactly, but a matching failure is distinct from an input
-error on the stream.  
+corresponding output conversions.  Ordinarily, non-whitespace characters
+in the template are expected to match characters in the input stream
+exactly, but a matching failure is distinct from an input error on the
+stream.
 
-   Another area of difference between `scanf' and `printf' is that you
+   Another area of difference between 'scanf' and 'printf' is that you
 must remember to supply pointers rather than immediate values as the
-optional arguments to `scanf'; the values that are read are stored in
+optional arguments to 'scanf'; the values that are read are stored in
 the objects that the pointers point to.  Even experienced programmers
 tend to forget this occasionally, so if your program is getting strange
-errors that seem to be related to `scanf', you might want to
+errors that seem to be related to 'scanf', you might want to
 double-check this.
 
-   When a "matching failure" occurs, `scanf' returns immediately,
+   When a "matching failure" occurs, 'scanf' returns immediately,
 leaving the first non-matching character as the next character to be
-read from the stream.  The normal return value from `scanf' is the
+read from the stream.  The normal return value from 'scanf' is the
 number of values that were assigned, so you can use this to determine if
-a matching error happened before all the expected values were read.  
+a matching error happened before all the expected values were read.
 
-   The `scanf' function is typically used for things like reading in
-the contents of tables.  For example, here is a function that uses
-`scanf' to initialize an array of `double':
+   The 'scanf' function is typically used for things like reading in the
+contents of tables.  For example, here is a function that uses 'scanf'
+to initialize an array of 'double':
 
      void
      readarray (double *array, int n)
@@ -1949,8 +6233,8 @@
    If you are trying to read input that doesn't match a single, fixed
 pattern, you may be better off using a tool such as Flex to generate a
 lexical scanner, or Bison to generate a parser, rather than using
-`scanf'.  For more information about these tools, see *note Top:
-(flex.info)Top, and *note Top: (bison.info)Top.
+'scanf'.  For more information about these tools, see *note
+(flex.info)Top::, and *note (bison.info)Top::.
 
 
 File: libc.info,  Node: Input Conversion Syntax,  Next: Table of Input Conversions,  Prev: Formatted Input Basics,  Up: Formatted Input
@@ -1958,38 +6242,38 @@
 12.14.2 Input Conversion Syntax
 -------------------------------
 
-A `scanf' template string is a string that contains ordinary multibyte
+A 'scanf' template string is a string that contains ordinary multibyte
 characters interspersed with conversion specifications that start with
-`%'.
+'%'.
 
-   Any whitespace character (as defined by the `isspace' function;
-*note Classification of Characters::) in the template causes any number
-of whitespace characters in the input stream to be read and discarded.
-The whitespace characters that are matched need not be exactly the same
+   Any whitespace character (as defined by the 'isspace' function; *note
+Classification of Characters::) in the template causes any number of
+whitespace characters in the input stream to be read and discarded.  The
+whitespace characters that are matched need not be exactly the same
 whitespace characters that appear in the template string.  For example,
-write ` , ' in the template to recognize a comma with optional
+write ' , ' in the template to recognize a comma with optional
 whitespace before and after.
 
    Other characters in the template string that are not part of
 conversion specifications must match characters in the input stream
 exactly; if this is not the case, a matching failure occurs.
 
-   The conversion specifications in a `scanf' template string have the
+   The conversion specifications in a 'scanf' template string have the
 general form:
 
      % FLAGS WIDTH TYPE CONVERSION
 
    In more detail, an input conversion specification consists of an
-initial `%' character followed in sequence by:
+initial '%' character followed in sequence by:
 
-   * An optional "flag character" `*', which says to ignore the text
-     read for this specification.  When `scanf' finds a conversion
+   * An optional "flag character" '*', which says to ignore the text
+     read for this specification.  When 'scanf' finds a conversion
      specification that uses this flag, it reads input as directed by
      the rest of the conversion specification, but it discards this
      input, does not use a pointer argument, and does not increment the
-     count of successful assignments.  
+     count of successful assignments.
 
-   * An optional flag character `a' (valid with string conversions only)
+   * An optional flag character 'a' (valid with string conversions only)
      which requests allocation of a buffer long enough to store the
      string in.  (This is a GNU extension.)  *Note Dynamic String
      Input::.
@@ -1998,16 +6282,16 @@
      width".  Reading of characters from the input stream stops either
      when this maximum is reached or when a non-matching character is
      found, whichever happens first.  Most conversions discard initial
-     whitespace characters (those that don't are explicitly
-     documented), and these discarded characters don't count towards
-     the maximum field width.  String input conversions store a null
-     character to mark the end of the input; the maximum field width
-     does not include this terminator.  
+     whitespace characters (those that don't are explicitly documented),
+     and these discarded characters don't count towards the maximum
+     field width.  String input conversions store a null character to
+     mark the end of the input; the maximum field width does not include
+     this terminator.
 
    * An optional "type modifier character".  For example, you can
-     specify a type modifier of `l' with integer conversions such as
-     `%d' to specify that the argument is a pointer to a `long int'
-     rather than a pointer to an `int'.  
+     specify a type modifier of 'l' with integer conversions such as
+     '%d' to specify that the argument is a pointer to a 'long int'
+     rather than a pointer to an 'int'.
 
    * A character that specifies the conversion to be applied.
 
@@ -2016,12 +6300,12 @@
 of the individual conversions for information about the particular
 options that they allow.
 
-   With the `-Wformat' option, the GNU C compiler checks calls to
-`scanf' and related functions.  It examines the format string and
+   With the '-Wformat' option, the GNU C compiler checks calls to
+'scanf' and related functions.  It examines the format string and
 verifies that the correct number and types of arguments are supplied.
 There is also a GNU C syntax to tell the compiler that a function you
-write uses a `scanf'-style format string.  *Note Declaring Attributes
-of Functions: (gcc.info)Function Attributes, for more information.
+write uses a 'scanf'-style format string.  *Note Declaring Attributes of
+Functions: (gcc.info)Function Attributes, for more information.
 
 
 File: libc.info,  Node: Table of Input Conversions,  Next: Numeric Input Conversions,  Prev: Input Conversion Syntax,  Up: Formatted Input
@@ -2031,89 +6315,90 @@
 
 Here is a table that summarizes the various conversion specifications:
 
-`%d'
+'%d'
      Matches an optionally signed integer written in decimal.  *Note
      Numeric Input Conversions::.
 
-`%i'
-     Matches an optionally signed integer in any of the formats that
-     the C language defines for specifying an integer constant.  *Note
+'%i'
+     Matches an optionally signed integer in any of the formats that the
+     C language defines for specifying an integer constant.  *Note
      Numeric Input Conversions::.
 
-`%o'
+'%o'
      Matches an unsigned integer written in octal radix.  *Note Numeric
      Input Conversions::.
 
-`%u'
+'%u'
      Matches an unsigned integer written in decimal radix.  *Note
      Numeric Input Conversions::.
 
-`%x', `%X'
+'%x', '%X'
      Matches an unsigned integer written in hexadecimal radix.  *Note
      Numeric Input Conversions::.
 
-`%e', `%f', `%g', `%E', `%G'
+'%e', '%f', '%g', '%E', '%G'
      Matches an optionally signed floating-point number.  *Note Numeric
      Input Conversions::.
 
-`%s'
+'%s'
+
      Matches a string containing only non-whitespace characters.  *Note
-     String Input Conversions::.  The presence of the `l' modifier
+     String Input Conversions::.  The presence of the 'l' modifier
      determines whether the output is stored as a wide character string
-     or a multibyte string.  If `%s' is used in a wide character
+     or a multibyte string.  If '%s' is used in a wide character
      function the string is converted as with multiple calls to
-     `wcrtomb' into a multibyte string.  This means that the buffer
-     must provide room for `MB_CUR_MAX' bytes for each wide character
-     read.  In case `%ls' is used in a multibyte function the result is
-     converted into wide characters as with multiple calls of `mbrtowc'
+     'wcrtomb' into a multibyte string.  This means that the buffer must
+     provide room for 'MB_CUR_MAX' bytes for each wide character read.
+     In case '%ls' is used in a multibyte function the result is
+     converted into wide characters as with multiple calls of 'mbrtowc'
      before being stored in the user provided buffer.
 
-`%S'
-     This is an alias for `%ls' which is supported for compatibility
+'%S'
+     This is an alias for '%ls' which is supported for compatibility
      with the Unix standard.
 
-`%['
+'%['
      Matches a string of characters that belong to a specified set.
-     *Note String Input Conversions::.  The presence of the `l' modifier
+     *Note String Input Conversions::.  The presence of the 'l' modifier
      determines whether the output is stored as a wide character string
-     or a multibyte string.  If `%[' is used in a wide character
+     or a multibyte string.  If '%[' is used in a wide character
      function the string is converted as with multiple calls to
-     `wcrtomb' into a multibyte string.  This means that the buffer
-     must provide room for `MB_CUR_MAX' bytes for each wide character
-     read.  In case `%l[' is used in a multibyte function the result is
-     converted into wide characters as with multiple calls of `mbrtowc'
+     'wcrtomb' into a multibyte string.  This means that the buffer must
+     provide room for 'MB_CUR_MAX' bytes for each wide character read.
+     In case '%l[' is used in a multibyte function the result is
+     converted into wide characters as with multiple calls of 'mbrtowc'
      before being stored in the user provided buffer.
 
-`%c'
+'%c'
      Matches a string of one or more characters; the number of
      characters read is controlled by the maximum field width given for
      the conversion.  *Note String Input Conversions::.
 
-     If the `%c' is used in a wide stream function the read value is
+     If the '%c' is used in a wide stream function the read value is
      converted from a wide character to the corresponding multibyte
-     character before storing it.  Note that this conversion can
-     produce more than one byte of output and therefore the provided
-     buffer be large enough for up to `MB_CUR_MAX' bytes for each
-     character.  If `%lc' is used in a multibyte function the input is
-     treated as a multibyte sequence (and not bytes) and the result is
-     converted as with calls to `mbrtowc'.
+     character before storing it.  Note that this conversion can produce
+     more than one byte of output and therefore the provided buffer be
+     large enough for up to 'MB_CUR_MAX' bytes for each character.  If
+     '%lc' is used in a multibyte function the input is treated as a
+     multibyte sequence (and not bytes) and the result is converted as
+     with calls to 'mbrtowc'.
 
-`%C'
-     This is an alias for `%lc' which is supported for compatibility
+'%C'
+     This is an alias for '%lc' which is supported for compatibility
      with the Unix standard.
 
-`%p'
+'%p'
      Matches a pointer value in the same implementation-defined format
-     used by the `%p' output conversion for `printf'.  *Note Other
-     Input Conversions::.
+     used by the '%p' output conversion for 'printf'.  *Note Other Input
+     Conversions::.
 
-`%n'
+'%n'
      This conversion doesn't read any characters; it records the number
      of characters read so far by this call.  *Note Other Input
      Conversions::.
 
-`%%'
-     This matches a literal `%' character in the input stream.  No
+'%%'
+     This matches a literal '%' character in the input stream.  No
      corresponding argument is used.  *Note Other Input Conversions::.
 
    If the syntax of a conversion specification is invalid, the behavior
@@ -2129,113 +6414,113 @@
 12.14.4 Numeric Input Conversions
 ---------------------------------
 
-This section describes the `scanf' conversions for reading numeric
+This section describes the 'scanf' conversions for reading numeric
 values.
 
-   The `%d' conversion matches an optionally signed integer in decimal
+   The '%d' conversion matches an optionally signed integer in decimal
 radix.  The syntax that is recognized is the same as that for the
-`strtol' function (*note Parsing of Integers::) with the value `10' for
+'strtol' function (*note Parsing of Integers::) with the value '10' for
 the BASE argument.
 
-   The `%i' conversion matches an optionally signed integer in any of
+   The '%i' conversion matches an optionally signed integer in any of
 the formats that the C language defines for specifying an integer
 constant.  The syntax that is recognized is the same as that for the
-`strtol' function (*note Parsing of Integers::) with the value `0' for
-the BASE argument.  (You can print integers in this syntax with
-`printf' by using the `#' flag character with the `%x', `%o', or `%d'
-conversion.  *Note Integer Conversions::.)
+'strtol' function (*note Parsing of Integers::) with the value '0' for
+the BASE argument.  (You can print integers in this syntax with 'printf'
+by using the '#' flag character with the '%x', '%o', or '%d' conversion.
+*Note Integer Conversions::.)
 
-   For example, any of the strings `10', `0xa', or `012' could be read
-in as integers under the `%i' conversion.  Each of these specifies a
-number with decimal value `10'.
+   For example, any of the strings '10', '0xa', or '012' could be read
+in as integers under the '%i' conversion.  Each of these specifies a
+number with decimal value '10'.
 
-   The `%o', `%u', and `%x' conversions match unsigned integers in
+   The '%o', '%u', and '%x' conversions match unsigned integers in
 octal, decimal, and hexadecimal radices, respectively.  The syntax that
-is recognized is the same as that for the `strtoul' function (*note
-Parsing of Integers::) with the appropriate value (`8', `10', or `16')
+is recognized is the same as that for the 'strtoul' function (*note
+Parsing of Integers::) with the appropriate value ('8', '10', or '16')
 for the BASE argument.
 
-   The `%X' conversion is identical to the `%x' conversion.  They both
+   The '%X' conversion is identical to the '%x' conversion.  They both
 permit either uppercase or lowercase letters to be used as digits.
 
-   The default type of the corresponding argument for the `%d' and `%i'
-conversions is `int *', and `unsigned int *' for the other integer
+   The default type of the corresponding argument for the '%d' and '%i'
+conversions is 'int *', and 'unsigned int *' for the other integer
 conversions.  You can use the following type modifiers to specify other
 sizes of integer:
 
-`hh'
-     Specifies that the argument is a `signed char *' or `unsigned char
+'hh'
+     Specifies that the argument is a 'signed char *' or 'unsigned char
      *'.
 
      This modifier was introduced in ISO C99.
 
-`h'
-     Specifies that the argument is a `short int *' or `unsigned short
+'h'
+     Specifies that the argument is a 'short int *' or 'unsigned short
      int *'.
 
-`j'
-     Specifies that the argument is a `intmax_t *' or `uintmax_t *'.
+'j'
+     Specifies that the argument is a 'intmax_t *' or 'uintmax_t *'.
 
      This modifier was introduced in ISO C99.
 
-`l'
-     Specifies that the argument is a `long int *' or `unsigned long
-     int *'.  Two `l' characters is like the `L' modifier, below.
+'l'
+     Specifies that the argument is a 'long int *' or 'unsigned long int
+     *'.  Two 'l' characters is like the 'L' modifier, below.
 
-     If used with `%c' or `%s' the corresponding parameter is
-     considered as a pointer to a wide character or wide character
-     string respectively.  This use of `l' was introduced in
-     Amendment 1 to ISO C90.
+     If used with '%c' or '%s' the corresponding parameter is considered
+     as a pointer to a wide character or wide character string
+     respectively.  This use of 'l' was introduced in Amendment 1 to
+     ISO C90.
 
-`ll'
-`L'
-`q'
-     Specifies that the argument is a `long long int *' or `unsigned
-     long long int *'.  (The `long long' type is an extension supported
+'ll'
+'L'
+'q'
+     Specifies that the argument is a 'long long int *' or 'unsigned
+     long long int *'.  (The 'long long' type is an extension supported
      by the GNU C compiler.  For systems that don't provide extra-long
-     integers, this is the same as `long int'.)
+     integers, this is the same as 'long int'.)
 
-     The `q' modifier is another name for the same thing, which comes
-     from 4.4 BSD; a `long long int' is sometimes called a "quad" `int'.
+     The 'q' modifier is another name for the same thing, which comes
+     from 4.4 BSD; a 'long long int' is sometimes called a "quad" 'int'.
 
-`t'
-     Specifies that the argument is a `ptrdiff_t *'.
+'t'
+     Specifies that the argument is a 'ptrdiff_t *'.
 
      This modifier was introduced in ISO C99.
 
-`z'
-     Specifies that the argument is a `size_t *'.
+'z'
+     Specifies that the argument is a 'size_t *'.
 
      This modifier was introduced in ISO C99.
 
-   All of the `%e', `%f', `%g', `%E', and `%G' input conversions are
+   All of the '%e', '%f', '%g', '%E', and '%G' input conversions are
 interchangeable.  They all match an optionally signed floating point
-number, in the same syntax as for the `strtod' function (*note Parsing
+number, in the same syntax as for the 'strtod' function (*note Parsing
 of Floats::).
 
    For the floating-point input conversions, the default argument type
-is `float *'.  (This is different from the corresponding output
-conversions, where the default type is `double'; remember that `float'
-arguments to `printf' are converted to `double' by the default argument
-promotions, but `float *' arguments are not promoted to `double *'.)
+is 'float *'.  (This is different from the corresponding output
+conversions, where the default type is 'double'; remember that 'float'
+arguments to 'printf' are converted to 'double' by the default argument
+promotions, but 'float *' arguments are not promoted to 'double *'.)
 You can specify other sizes of float using these type modifiers:
 
-`l'
-     Specifies that the argument is of type `double *'.
+'l'
+     Specifies that the argument is of type 'double *'.
 
-`L'
-     Specifies that the argument is of type `long double *'.
+'L'
+     Specifies that the argument is of type 'long double *'.
 
    For all the above number parsing formats there is an additional
-optional flag `''.  When this flag is given the `scanf' function
-expects the number represented in the input string to be formatted
-according to the grouping rules of the currently selected locale (*note
-General Numeric::).
+optional flag '''.  When this flag is given the 'scanf' function expects
+the number represented in the input string to be formatted according to
+the grouping rules of the currently selected locale (*note General
+Numeric::).
 
-   If the `"C"' or `"POSIX"' locale is selected there is no difference.
+   If the '"C"' or '"POSIX"' locale is selected there is no difference.
 But for a locale which specifies values for the appropriate fields in
-the locale the input must have the correct form in the input.
-Otherwise the longest prefix with a correct form is processed.
+the locale the input must have the correct form in the input.  Otherwise
+the longest prefix with a correct form is processed.
 
 
 File: libc.info,  Node: String Input Conversions,  Next: Dynamic String Input,  Prev: Numeric Input Conversions,  Up: Formatted Input
@@ -2243,45 +6528,45 @@
 12.14.5 String Input Conversions
 --------------------------------
 
-This section describes the `scanf' input conversions for reading string
-and character values: `%s', `%S', `%[', `%c', and `%C'.
+This section describes the 'scanf' input conversions for reading string
+and character values: '%s', '%S', '%[', '%c', and '%C'.
 
    You have two options for how to receive the input from these
 conversions:
 
    * Provide a buffer to store it in.  This is the default.  You should
-     provide an argument of type `char *' or `wchar_t *' (the latter of
-     the `l' modifier is present).
+     provide an argument of type 'char *' or 'wchar_t *' (the latter of
+     the 'l' modifier is present).
 
      *Warning:* To make a robust program, you must make sure that the
      input (plus its terminating null) cannot possibly exceed the size
      of the buffer you provide.  In general, the only way to do this is
      to specify a maximum field width one less than the buffer size.
-     *If you provide the buffer, always specify a maximum field width
-     to prevent overflow.*
+     *If you provide the buffer, always specify a maximum field width to
+     prevent overflow.*
 
-   * Ask `scanf' to allocate a big enough buffer, by specifying the `a'
+   * Ask 'scanf' to allocate a big enough buffer, by specifying the 'a'
      flag character.  This is a GNU extension.  You should provide an
-     argument of type `char **' for the buffer address to be stored in.
+     argument of type 'char **' for the buffer address to be stored in.
      *Note Dynamic String Input::.
 
-   The `%c' conversion is the simplest: it matches a fixed number of
+   The '%c' conversion is the simplest: it matches a fixed number of
 characters, always.  The maximum field width says how many characters to
 read; if you don't specify the maximum, the default is 1.  This
 conversion doesn't append a null character to the end of the text it
 reads.  It also does not skip over initial whitespace characters.  It
 reads precisely the next N characters, and fails if it cannot get that
-many.  Since there is always a maximum field width with `%c' (whether
+many.  Since there is always a maximum field width with '%c' (whether
 specified, or 1 by default), you can always prevent overflow by making
 the buffer long enough.
 
-   If the format is `%lc' or `%C' the function stores wide characters
+   If the format is '%lc' or '%C' the function stores wide characters
 which are converted using the conversion determined at the time the
 stream was opened from the external byte stream.  The number of bytes
-read from the medium is limited by `MB_CUR_LEN * N' but at most N wide
+read from the medium is limited by 'MB_CUR_LEN * N' but at most N wide
 character get stored in the output string.
 
-   The `%s' conversion matches a string of non-whitespace characters.
+   The '%s' conversion matches a string of non-whitespace characters.
 It skips and discards initial whitespace, but stops when it encounters
 more whitespace after having read something.  It stores a null character
 at the end of the text that it reads.
@@ -2290,72 +6575,72 @@
 
       hello, world
 
-with the conversion `%10c' produces `" hello, wo"', but reading the
-same input with the conversion `%10s' produces `"hello,"'.
+with the conversion '%10c' produces '" hello, wo"', but reading the same
+input with the conversion '%10s' produces '"hello,"'.
 
-   *Warning:* If you do not specify a field width for `%s', then the
+   *Warning:* If you do not specify a field width for '%s', then the
 number of characters read is limited only by where the next whitespace
 character appears.  This almost certainly means that invalid input can
 make your program crash--which is a bug.
 
-   The `%ls' and `%S' format are handled just like `%s' except that the
-external byte sequence is converted using the conversion associated
-with the stream to wide characters with their own encoding.  A width or
+   The '%ls' and '%S' format are handled just like '%s' except that the
+external byte sequence is converted using the conversion associated with
+the stream to wide characters with their own encoding.  A width or
 precision specified with the format do not directly determine how many
 bytes are read from the stream since they measure wide characters.  But
 an upper limit can be computed by multiplying the value of the width or
-precision by `MB_CUR_MAX'.
+precision by 'MB_CUR_MAX'.
 
    To read in characters that belong to an arbitrary set of your choice,
-use the `%[' conversion.  You specify the set between the `[' character
-and a following `]' character, using the same syntax used in regular
+use the '%[' conversion.  You specify the set between the '[' character
+and a following ']' character, using the same syntax used in regular
 expressions for explicit sets of characters.  As special cases:
 
-   * A literal `]' character can be specified as the first character of
+   * A literal ']' character can be specified as the first character of
      the set.
 
-   * An embedded `-' character (that is, one that is not the first or
+   * An embedded '-' character (that is, one that is not the first or
      last character of the set) is used to specify a range of
      characters.
 
-   * If a caret character `^' immediately follows the initial `[', then
+   * If a caret character '^' immediately follows the initial '[', then
      the set of allowed input characters is the everything _except_ the
      characters listed.
 
-   The `%[' conversion does not skip over initial whitespace characters.
+   The '%[' conversion does not skip over initial whitespace characters.
 
    Note that the "character class" syntax available in character sets
-that appear inside regular expressions (such as `[:alpha:]') is _not_
-available in the `%[' conversion.
+that appear inside regular expressions (such as '[:alpha:]') is _not_
+available in the '%[' conversion.
 
-   Here are some examples of `%[' conversions and what they mean:
+   Here are some examples of '%[' conversions and what they mean:
 
-`%25[1234567890]'
+'%25[1234567890]'
      Matches a string of up to 25 digits.
 
-`%25[][]'
+'%25[][]'
      Matches a string of up to 25 square brackets.
 
-`%25[^ \f\n\r\t\v]'
+'%25[^ \f\n\r\t\v]'
      Matches a string up to 25 characters long that doesn't contain any
      of the standard whitespace characters.  This is slightly different
-     from `%s', because if the input begins with a whitespace character,
-     `%[' reports a matching failure while `%s' simply discards the
+     from '%s', because if the input begins with a whitespace character,
+     '%[' reports a matching failure while '%s' simply discards the
      initial whitespace.
 
-`%25[a-z]'
+'%25[a-z]'
      Matches up to 25 lowercase characters.
 
-   As for `%c' and `%s' the `%[' format is also modified to produce
-wide characters if the `l' modifier is present.  All what is said about
-`%ls' above is true for `%l['.
+   As for '%c' and '%s' the '%[' format is also modified to produce wide
+characters if the 'l' modifier is present.  All what is said about '%ls'
+above is true for '%l['.
 
-   One more reminder: the `%s' and `%[' conversions are *dangerous* if
-you don't specify a maximum width or use the `a' flag, because input
-too long would overflow whatever buffer you have provided for it.  No
-matter how long your buffer is, a user could supply input that is
-longer.  A well-written program reports invalid input with a
-comprehensible error message, not with a crash.
+   One more reminder: the '%s' and '%[' conversions are *dangerous* if
+you don't specify a maximum width or use the 'a' flag, because input too
+long would overflow whatever buffer you have provided for it.  No matter
+how long your buffer is, a user could supply input that is longer.  A
+well-written program reports invalid input with a comprehensible error
+message, not with a crash.
 
 
 File: libc.info,  Node: Dynamic String Input,  Next: Other Input Conversions,  Prev: String Input Conversions,  Up: Formatted Input
@@ -2365,18 +6650,18 @@
 
 A GNU extension to formatted input lets you safely read a string with no
 maximum size.  Using this feature, you don't supply a buffer; instead,
-`scanf' allocates a buffer big enough to hold the data and gives you
-its address.  To use this feature, write `a' as a flag character, as in
-`%as' or `%a[0-9a-z]'.
+'scanf' allocates a buffer big enough to hold the data and gives you its
+address.  To use this feature, write 'a' as a flag character, as in
+'%as' or '%a[0-9a-z]'.
 
    The pointer argument you supply for where to store the input should
-have type `char **'.  The `scanf' function allocates a buffer and
-stores its address in the word that the argument points to.  You should
-free the buffer with `free' when you no longer need it.
+have type 'char **'.  The 'scanf' function allocates a buffer and stores
+its address in the word that the argument points to.  You should free
+the buffer with 'free' when you no longer need it.
 
-   Here is an example of using the `a' flag with the `%[...]'
-conversion specification to read a "variable assignment" of the form
-`VARIABLE = VALUE'.
+   Here is an example of using the 'a' flag with the '%[...]' conversion
+specification to read a "variable assignment" of the form 'VARIABLE =
+VALUE'.
 
      {
        char *variable, *value;
@@ -2399,30 +6684,29 @@
 
 This section describes the miscellaneous input conversions.
 
-   The `%p' conversion is used to read a pointer value.  It recognizes
-the same syntax used by the `%p' output conversion for `printf' (*note
+   The '%p' conversion is used to read a pointer value.  It recognizes
+the same syntax used by the '%p' output conversion for 'printf' (*note
 Other Output Conversions::); that is, a hexadecimal number just as the
-`%x' conversion accepts.  The corresponding argument should be of type
-`void **'; that is, the address of a place to store a pointer.
+'%x' conversion accepts.  The corresponding argument should be of type
+'void **'; that is, the address of a place to store a pointer.
 
    The resulting pointer value is not guaranteed to be valid if it was
 not originally written during the same program execution that reads it
 in.
 
-   The `%n' conversion produces the number of characters read so far by
-this call.  The corresponding argument should be of type `int *'.  This
-conversion works in the same way as the `%n' conversion for `printf';
+   The '%n' conversion produces the number of characters read so far by
+this call.  The corresponding argument should be of type 'int *'.  This
+conversion works in the same way as the '%n' conversion for 'printf';
 see *note Other Output Conversions::, for an example.
 
-   The `%n' conversion is the only mechanism for determining the
-success of literal matches or conversions with suppressed assignments.
-If the `%n' follows the locus of a matching failure, then no value is
-stored for it since `scanf' returns before processing the `%n'.  If you
-store `-1' in that argument slot before calling `scanf', the presence
-of `-1' after `scanf' indicates an error occurred before the `%n' was
-reached.
+   The '%n' conversion is the only mechanism for determining the success
+of literal matches or conversions with suppressed assignments.  If the
+'%n' follows the locus of a matching failure, then no value is stored
+for it since 'scanf' returns before processing the '%n'.  If you store
+'-1' in that argument slot before calling 'scanf', the presence of '-1'
+after 'scanf' indicates an error occurred before the '%n' was reached.
 
-   Finally, the `%%' conversion matches a literal `%' character in the
+   Finally, the '%%' conversion matches a literal '%' character in the
 input stream, without using an argument.  This conversion does not
 permit any flags, field width, or type modifier to be specified.
 
@@ -2433,13 +6717,13 @@
 ---------------------------------
 
 Here are the descriptions of the functions for performing formatted
-input.  Prototypes for these functions are in the header file `stdio.h'.  
+input.  Prototypes for these functions are in the header file 'stdio.h'.
 
  -- Function: int scanf (const char *TEMPLATE, ...)
      Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
      mem lock corrupt | *Note POSIX Safety Concepts::.
 
-     The `scanf' function reads formatted input from the stream `stdin'
+     The 'scanf' function reads formatted input from the stream 'stdin'
      under the control of the template string TEMPLATE.  The optional
      arguments are pointers to the places which receive the resulting
      values.
@@ -2447,62 +6731,62 @@
      The return value is normally the number of successful assignments.
      If an end-of-file condition is detected before any matches are
      performed, including matches against whitespace and literal
-     characters in the template, then `EOF' is returned.
+     characters in the template, then 'EOF' is returned.
 
  -- Function: int wscanf (const wchar_t *TEMPLATE, ...)
      Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
      mem lock corrupt | *Note POSIX Safety Concepts::.
 
-     The `wscanf' function reads formatted input from the stream
-     `stdin' under the control of the template string TEMPLATE.  The
-     optional arguments are pointers to the places which receive the
-     resulting values.
+     The 'wscanf' function reads formatted input from the stream 'stdin'
+     under the control of the template string TEMPLATE.  The optional
+     arguments are pointers to the places which receive the resulting
+     values.
 
      The return value is normally the number of successful assignments.
      If an end-of-file condition is detected before any matches are
      performed, including matches against whitespace and literal
-     characters in the template, then `WEOF' is returned.
+     characters in the template, then 'WEOF' is returned.
 
  -- Function: int fscanf (FILE *STREAM, const char *TEMPLATE, ...)
      Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
      mem lock corrupt | *Note POSIX Safety Concepts::.
 
-     This function is just like `scanf', except that the input is read
-     from the stream STREAM instead of `stdin'.
+     This function is just like 'scanf', except that the input is read
+     from the stream STREAM instead of 'stdin'.
 
  -- Function: int fwscanf (FILE *STREAM, const wchar_t *TEMPLATE, ...)
      Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
      mem lock corrupt | *Note POSIX Safety Concepts::.
 
-     This function is just like `wscanf', except that the input is read
-     from the stream STREAM instead of `stdin'.
+     This function is just like 'wscanf', except that the input is read
+     from the stream STREAM instead of 'stdin'.
 
  -- Function: int sscanf (const char *S, const char *TEMPLATE, ...)
      Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
      *Note POSIX Safety Concepts::.
 
-     This is like `scanf', except that the characters are taken from the
+     This is like 'scanf', except that the characters are taken from the
      null-terminated string S instead of from a stream.  Reaching the
      end of the string is treated as an end-of-file condition.
 
      The behavior of this function is undefined if copying takes place
-     between objects that overlap--for example, if S is also given as
-     an argument to receive a string read under control of the `%s',
-     `%S', or `%[' conversion.
+     between objects that overlap--for example, if S is also given as an
+     argument to receive a string read under control of the '%s', '%S',
+     or '%[' conversion.
 
  -- Function: int swscanf (const wchar_t *WS, const wchar_t *TEMPLATE,
           ...)
      Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
      *Note POSIX Safety Concepts::.
 
-     This is like `wscanf', except that the characters are taken from
+     This is like 'wscanf', except that the characters are taken from
      the null-terminated string WS instead of from a stream.  Reaching
      the end of the string is treated as an end-of-file condition.
 
      The behavior of this function is undefined if copying takes place
      between objects that overlap--for example, if WS is also given as
-     an argument to receive a string read under control of the `%s',
-     `%S', or `%[' conversion.
+     an argument to receive a string read under control of the '%s',
+     '%S', or '%[' conversion.
 
 
 File: libc.info,  Node: Variable Arguments Input,  Prev: Formatted Input Functions,  Up: Formatted Input
@@ -2510,10 +6794,10 @@
 12.14.9 Variable Arguments Input Functions
 ------------------------------------------
 
-The functions `vscanf' and friends are provided so that you can define
-your own variadic `scanf'-like functions that make use of the same
+The functions 'vscanf' and friends are provided so that you can define
+your own variadic 'scanf'-like functions that make use of the same
 internals as the built-in formatted output functions.  These functions
-are analogous to the `vprintf' series of output functions.  *Note
+are analogous to the 'vprintf' series of output functions.  *Note
 Variable Arguments Output::, for important information on how to use
 them.
 
@@ -2524,56 +6808,56 @@
      Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
      mem lock corrupt | *Note POSIX Safety Concepts::.
 
-     This function is similar to `scanf', but instead of taking a
+     This function is similar to 'scanf', but instead of taking a
      variable number of arguments directly, it takes an argument list
-     pointer AP of type `va_list' (*note Variadic Functions::).
+     pointer AP of type 'va_list' (*note Variadic Functions::).
 
  -- Function: int vwscanf (const wchar_t *TEMPLATE, va_list AP)
      Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
      mem lock corrupt | *Note POSIX Safety Concepts::.
 
-     This function is similar to `wscanf', but instead of taking a
+     This function is similar to 'wscanf', but instead of taking a
      variable number of arguments directly, it takes an argument list
-     pointer AP of type `va_list' (*note Variadic Functions::).
+     pointer AP of type 'va_list' (*note Variadic Functions::).
 
  -- Function: int vfscanf (FILE *STREAM, const char *TEMPLATE, va_list
           AP)
      Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
      mem lock corrupt | *Note POSIX Safety Concepts::.
 
-     This is the equivalent of `fscanf' with the variable argument list
-     specified directly as for `vscanf'.
+     This is the equivalent of 'fscanf' with the variable argument list
+     specified directly as for 'vscanf'.
 
  -- Function: int vfwscanf (FILE *STREAM, const wchar_t *TEMPLATE,
           va_list AP)
      Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
      mem lock corrupt | *Note POSIX Safety Concepts::.
 
-     This is the equivalent of `fwscanf' with the variable argument list
-     specified directly as for `vwscanf'.
+     This is the equivalent of 'fwscanf' with the variable argument list
+     specified directly as for 'vwscanf'.
 
  -- Function: int vsscanf (const char *S, const char *TEMPLATE, va_list
           AP)
      Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
      *Note POSIX Safety Concepts::.
 
-     This is the equivalent of `sscanf' with the variable argument list
-     specified directly as for `vscanf'.
+     This is the equivalent of 'sscanf' with the variable argument list
+     specified directly as for 'vscanf'.
 
  -- Function: int vswscanf (const wchar_t *S, const wchar_t *TEMPLATE,
           va_list AP)
      Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
      *Note POSIX Safety Concepts::.
 
-     This is the equivalent of `swscanf' with the variable argument list
-     specified directly as for `vwscanf'.
+     This is the equivalent of 'swscanf' with the variable argument list
+     specified directly as for 'vwscanf'.
 
    In GNU C, there is a special construct you can use to let the
-compiler know that a function uses a `scanf'-style format string.  Then
+compiler know that a function uses a 'scanf'-style format string.  Then
 it can check the number and types of arguments in each call to the
 function, and warn you when they do not match the format string.  For
-details, see *note Declaring Attributes of Functions:
-(gcc.info)Function Attributes.
+details, see *note Declaring Attributes of Functions: (gcc.info)Function
+Attributes.
 
 
 File: libc.info,  Node: EOF and Errors,  Next: Error Recovery,  Prev: Formatted Input,  Up: I/O on Streams
@@ -2582,79 +6866,78 @@
 ============================
 
 Many of the functions described in this chapter return the value of the
-macro `EOF' to indicate unsuccessful completion of the operation.
-Since `EOF' is used to report both end of file and random errors, it's
-often better to use the `feof' function to check explicitly for end of
-file and `ferror' to check for errors.  These functions check
-indicators that are part of the internal state of the stream object,
-indicators set if the appropriate condition was detected by a previous
-I/O operation on that stream.
+macro 'EOF' to indicate unsuccessful completion of the operation.  Since
+'EOF' is used to report both end of file and random errors, it's often
+better to use the 'feof' function to check explicitly for end of file
+and 'ferror' to check for errors.  These functions check indicators that
+are part of the internal state of the stream object, indicators set if
+the appropriate condition was detected by a previous I/O operation on
+that stream.
 
  -- Macro: int EOF
      This macro is an integer value that is returned by a number of
      narrow stream functions to indicate an end-of-file condition, or
-     some other error situation.  With the GNU C Library, `EOF' is
-     `-1'.  In other libraries, its value may be some other negative
-     number.
+     some other error situation.  With the GNU C Library, 'EOF' is '-1'.
+     In other libraries, its value may be some other negative number.
 
-     This symbol is declared in `stdio.h'.
+     This symbol is declared in 'stdio.h'.
 
  -- Macro: int WEOF
      This macro is an integer value that is returned by a number of wide
      stream functions to indicate an end-of-file condition, or some
-     other error situation.  With the GNU C Library, `WEOF' is `-1'.  In
+     other error situation.  With the GNU C Library, 'WEOF' is '-1'.  In
      other libraries, its value may be some other negative number.
 
-     This symbol is declared in `wchar.h'.
+     This symbol is declared in 'wchar.h'.
 
  -- Function: int feof (FILE *STREAM)
      Preliminary: | MT-Safe | AS-Safe | AC-Unsafe lock | *Note POSIX
      Safety Concepts::.
 
-     The `feof' function returns nonzero if and only if the end-of-file
+     The 'feof' function returns nonzero if and only if the end-of-file
      indicator for the stream STREAM is set.
 
-     This symbol is declared in `stdio.h'.
+     This symbol is declared in 'stdio.h'.
 
  -- Function: int feof_unlocked (FILE *STREAM)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `feof_unlocked' function is equivalent to the `feof' function
+     The 'feof_unlocked' function is equivalent to the 'feof' function
      except that it does not implicitly lock the stream.
 
      This function is a GNU extension.
 
-     This symbol is declared in `stdio.h'.
+     This symbol is declared in 'stdio.h'.
 
  -- Function: int ferror (FILE *STREAM)
      Preliminary: | MT-Safe | AS-Safe | AC-Unsafe lock | *Note POSIX
      Safety Concepts::.
 
-     The `ferror' function returns nonzero if and only if the error
+     The 'ferror' function returns nonzero if and only if the error
      indicator for the stream STREAM is set, indicating that an error
      has occurred on a previous operation on the stream.
 
-     This symbol is declared in `stdio.h'.
+     This symbol is declared in 'stdio.h'.
 
  -- Function: int ferror_unlocked (FILE *STREAM)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `ferror_unlocked' function is equivalent to the `ferror'
+     The 'ferror_unlocked' function is equivalent to the 'ferror'
      function except that it does not implicitly lock the stream.
 
      This function is a GNU extension.
 
-     This symbol is declared in `stdio.h'.
+     This symbol is declared in 'stdio.h'.
 
    In addition to setting the error indicator associated with the
-stream, the functions that operate on streams also set `errno' in the
+stream, the functions that operate on streams also set 'errno' in the
 same way as the corresponding low-level functions that operate on file
 descriptors.  For example, all of the functions that perform output to a
-stream--such as `fputc', `printf', and `fflush'--are implemented in
-terms of `write', and all of the `errno' error conditions defined for
-`write' are meaningful for these functions.  For more information about
+stream--such as 'fputc', 'printf', and 'fflush'--are implemented in
+terms of 'write', and all of the 'errno' error conditions defined for
+'write' are meaningful for these functions.  For more information about
 the descriptor-level I/O functions, see *note Low-Level I/O::.
 
 
@@ -2663,7 +6946,7 @@
 12.16 Recovering from errors
 ============================
 
-You may explicitly clear the error and EOF flags with the `clearerr'
+You may explicitly clear the error and EOF flags with the 'clearerr'
 function.
 
  -- Function: void clearerr (FILE *STREAM)
@@ -2680,7 +6963,7 @@
      Preliminary: | MT-Safe race:stream | AS-Safe | AC-Safe | *Note
      POSIX Safety Concepts::.
 
-     The `clearerr_unlocked' function is equivalent to the `clearerr'
+     The 'clearerr_unlocked' function is equivalent to the 'clearerr'
      function except that it does not implicitly lock the stream.
 
      This function is a GNU extension.
@@ -2691,19 +6974,19 @@
 file, while some buffered data may have been discarded.  Merely retrying
 can thus cause lost or repeated data.
 
-   A failed read may leave the file pointer in an inappropriate
-position for a second try.  In both cases, you should seek to a known
-position before retrying.
+   A failed read may leave the file pointer in an inappropriate position
+for a second try.  In both cases, you should seek to a known position
+before retrying.
 
    Most errors that can happen are not recoverable -- a second try will
 always fail again in the same way.  So usually it is best to give up and
 report the error to the user, rather than install complicated recovery
 logic.
 
-   One important exception is `EINTR' (*note Interrupted Primitives::).
+   One important exception is 'EINTR' (*note Interrupted Primitives::).
 Many stream I/O implementations will treat it as an ordinary error,
 which can be quite inconvenient.  You can avoid this hassle by
-installing all signals with the `SA_RESTART' flag.
+installing all signals with the 'SA_RESTART' flag.
 
    For similar reasons, setting nonblocking I/O on a stream's file
 descriptor is not usually advisable.
@@ -2723,17 +7006,17 @@
 
    When you open a stream, you can specify either a "text stream" or a
 "binary stream".  You indicate that you want a binary stream by
-specifying the `b' modifier in the OPENTYPE argument to `fopen'; see
-*note Opening Streams::.  Without this option, `fopen' opens the file
-as a text stream.
+specifying the 'b' modifier in the OPENTYPE argument to 'fopen'; see
+*note Opening Streams::.  Without this option, 'fopen' opens the file as
+a text stream.
 
    Text and binary streams differ in several ways:
 
    * The data read from a text stream is divided into "lines" which are
-     terminated by newline (`'\n'') characters, while a binary stream is
+     terminated by newline (''\n'') characters, while a binary stream is
      simply a long series of characters.  A text stream might on some
      systems fail to handle lines more than 254 characters long
-     (including the terminating newline character).  
+     (including the terminating newline character).
 
    * On some systems, text files can contain only printing characters,
      horizontal tab characters, and newlines, and so text streams may
@@ -2780,7 +7063,7 @@
 
    You can use the functions in this section to examine or modify the
 file position indicator associated with a stream.  The symbols listed
-below are declared in the header file `stdio.h'.  
+below are declared in the header file 'stdio.h'.
 
  -- Function: long int ftell (FILE *STREAM)
      Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
@@ -2791,63 +7074,63 @@
 
      This function can fail if the stream doesn't support file
      positioning, or if the file position can't be represented in a
-     `long int', and possibly for other reasons as well.  If a failure
-     occurs, a value of `-1' is returned.
+     'long int', and possibly for other reasons as well.  If a failure
+     occurs, a value of '-1' is returned.
 
  -- Function: off_t ftello (FILE *STREAM)
      Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
      | *Note POSIX Safety Concepts::.
 
-     The `ftello' function is similar to `ftell', except that it
-     returns a value of type `off_t'.  Systems which support this type
-     use it to describe all file positions, unlike the POSIX
-     specification which uses a long int.  The two are not necessarily
-     the same size.  Therefore, using ftell can lead to problems if the
-     implementation is written on top of a POSIX compliant low-level
-     I/O implementation, and using `ftello' is preferable whenever it
-     is available.
+     The 'ftello' function is similar to 'ftell', except that it returns
+     a value of type 'off_t'.  Systems which support this type use it to
+     describe all file positions, unlike the POSIX specification which
+     uses a long int.  The two are not necessarily the same size.
+     Therefore, using ftell can lead to problems if the implementation
+     is written on top of a POSIX compliant low-level I/O
+     implementation, and using 'ftello' is preferable whenever it is
+     available.
 
-     If this function fails it returns `(off_t) -1'.  This can happen
+     If this function fails it returns '(off_t) -1'.  This can happen
      due to missing support for file positioning or internal errors.
      Otherwise the return value is the current file position.
 
      The function is an extension defined in the Unix Single
      Specification version 2.
 
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
-     32 bit system this function is in fact `ftello64'.  I.e., the LFS
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' on a
+     32 bit system this function is in fact 'ftello64'.  I.e., the LFS
      interface transparently replaces the old interface.
 
  -- Function: off64_t ftello64 (FILE *STREAM)
      Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
      | *Note POSIX Safety Concepts::.
 
-     This function is similar to `ftello' with the only difference that
-     the return value is of type `off64_t'.  This also requires that the
-     stream STREAM was opened using either `fopen64', `freopen64', or
-     `tmpfile64' since otherwise the underlying file operations to
+     This function is similar to 'ftello' with the only difference that
+     the return value is of type 'off64_t'.  This also requires that the
+     stream STREAM was opened using either 'fopen64', 'freopen64', or
+     'tmpfile64' since otherwise the underlying file operations to
      position the file pointer beyond the 2^31 bytes limit might fail.
 
-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32
-     bits machine this function is available under the name `ftello'
-     and so transparently replaces the old interface.
+     If the sources are compiled with '_FILE_OFFSET_BITS == 64' on a 32
+     bits machine this function is available under the name 'ftello' and
+     so transparently replaces the old interface.
 
  -- Function: int fseek (FILE *STREAM, long int OFFSET, int WHENCE)
      Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
      | *Note POSIX Safety Concepts::.
 
-     The `fseek' function is used to change the file position of the
+     The 'fseek' function is used to change the file position of the
      stream STREAM.  The value of WHENCE must be one of the constants
-     `SEEK_SET', `SEEK_CUR', or `SEEK_END', to indicate whether the
+     'SEEK_SET', 'SEEK_CUR', or 'SEEK_END', to indicate whether the
      OFFSET is relative to the beginning of the file, the current file
      position, or the end of the file, respectively.
 
      This function returns a value of zero if the operation was
      successful, and a nonzero value to indicate failure.  A successful
      call also clears the end-of-file indicator of STREAM and discards
-     any characters that were "pushed back" by the use of `ungetc'.
+     any characters that were "pushed back" by the use of 'ungetc'.
 
-     `fseek' either flushes any buffered output before setting the file
+     'fseek' either flushes any buffered output before setting the file
      position or else remembers it so it will be written later in its
      proper place in the file.
 
@@ -2855,5919 +7138,82 @@
      Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
      | *Note POSIX Safety Concepts::.
 
-     This function is similar to `fseek' but it corrects a problem with
-     `fseek' in a system with POSIX types.  Using a value of type `long
-     int' for the offset is not compatible with POSIX.  `fseeko' uses
-     the correct type `off_t' for the OFFSET parameter.
+     This function is similar to 'fseek' but it corrects a problem with
+     'fseek' in a system with POSIX types.  Using a value of type 'long
+     int' for the offset is not compatible with POSIX. 'fseeko' uses the
+     correct type 'off_t' for the OFFSET parameter.
 
-     For this reason it is a good idea to prefer `ftello' whenever it is
+     For this reason it is a good idea to prefer 'ftello' whenever it is
      available since its functionality is (if different at all) closer
      the underlying definition.
 
-     The functionality and return value is the same as for `fseek'.
+     The functionality and return value is the same as for 'fseek'.
 
      The function is an extension defined in the Unix Single
      Specification version 2.
 
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
-     32 bit system this function is in fact `fseeko64'.  I.e., the LFS
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' on a
+     32 bit system this function is in fact 'fseeko64'.  I.e., the LFS
      interface transparently replaces the old interface.
 
  -- Function: int fseeko64 (FILE *STREAM, off64_t OFFSET, int WHENCE)
      Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
      | *Note POSIX Safety Concepts::.
 
-     This function is similar to `fseeko' with the only difference that
-     the OFFSET parameter is of type `off64_t'.  This also requires
-     that the stream STREAM was opened using either `fopen64',
-     `freopen64', or `tmpfile64' since otherwise the underlying file
-     operations to position the file pointer beyond the 2^31 bytes
-     limit might fail.
+     This function is similar to 'fseeko' with the only difference that
+     the OFFSET parameter is of type 'off64_t'.  This also requires that
+     the stream STREAM was opened using either 'fopen64', 'freopen64',
+     or 'tmpfile64' since otherwise the underlying file operations to
+     position the file pointer beyond the 2^31 bytes limit might fail.
 
-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32
-     bits machine this function is available under the name `fseeko'
-     and so transparently replaces the old interface.
+     If the sources are compiled with '_FILE_OFFSET_BITS == 64' on a 32
+     bits machine this function is available under the name 'fseeko' and
+     so transparently replaces the old interface.
 
-   *Portability Note:* In non-POSIX systems, `ftell', `ftello', `fseek'
-and `fseeko' might work reliably only on binary streams.  *Note Binary
+   *Portability Note:* In non-POSIX systems, 'ftell', 'ftello', 'fseek'
+and 'fseeko' might work reliably only on binary streams.  *Note Binary
 Streams::.
 
    The following symbolic constants are defined for use as the WHENCE
-argument to `fseek'.  They are also used with the `lseek' function
+argument to 'fseek'.  They are also used with the 'lseek' function
 (*note I/O Primitives::) and to specify offsets for file locks (*note
 Control Operations::).
 
  -- Macro: int SEEK_SET
-     This is an integer constant which, when used as the WHENCE
-     argument to the `fseek' or `fseeko' function, specifies that the
-     offset provided is relative to the beginning of the file.
+     This is an integer constant which, when used as the WHENCE argument
+     to the 'fseek' or 'fseeko' function, specifies that the offset
+     provided is relative to the beginning of the file.
 
  -- Macro: int SEEK_CUR
-     This is an integer constant which, when used as the WHENCE
-     argument to the `fseek' or `fseeko' function, specifies that the
-     offset provided is relative to the current file position.
+     This is an integer constant which, when used as the WHENCE argument
+     to the 'fseek' or 'fseeko' function, specifies that the offset
+     provided is relative to the current file position.
 
  -- Macro: int SEEK_END
-     This is an integer constant which, when used as the WHENCE
-     argument to the `fseek' or `fseeko' function, specifies that the
-     offset provided is relative to the end of the file.
+     This is an integer constant which, when used as the WHENCE argument
+     to the 'fseek' or 'fseeko' function, specifies that the offset
+     provided is relative to the end of the file.
 
  -- Function: void rewind (FILE *STREAM)
      Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
      | *Note POSIX Safety Concepts::.
 
-     The `rewind' function positions the stream STREAM at the beginning
-     of the file.  It is equivalent to calling `fseek' or `fseeko' on
-     the STREAM with an OFFSET argument of `0L' and a WHENCE argument
-     of `SEEK_SET', except that the return value is discarded and the
-     error indicator for the stream is reset.
+     The 'rewind' function positions the stream STREAM at the beginning
+     of the file.  It is equivalent to calling 'fseek' or 'fseeko' on
+     the STREAM with an OFFSET argument of '0L' and a WHENCE argument of
+     'SEEK_SET', except that the return value is discarded and the error
+     indicator for the stream is reset.
 
-   These three aliases for the `SEEK_...' constants exist for the sake
+   These three aliases for the 'SEEK_...' constants exist for the sake
 of compatibility with older BSD systems.  They are defined in two
-different header files: `fcntl.h' and `sys/file.h'.
+different header files: 'fcntl.h' and 'sys/file.h'.
 
-`L_SET'
-     An alias for `SEEK_SET'.
+'L_SET'
+     An alias for 'SEEK_SET'.
 
-`L_INCR'
-     An alias for `SEEK_CUR'.
+'L_INCR'
+     An alias for 'SEEK_CUR'.
 
-`L_XTND'
-     An alias for `SEEK_END'.
-
-
-File: libc.info,  Node: Portable Positioning,  Next: Stream Buffering,  Prev: File Positioning,  Up: I/O on Streams
-
-12.19 Portable File-Position Functions
-======================================
-
-On GNU systems, the file position is truly a character count.  You can
-specify any character count value as an argument to `fseek' or `fseeko'
-and get reliable results for any random access file.  However, some
-ISO C systems do not represent file positions in this way.
-
-   On some systems where text streams truly differ from binary streams,
-it is impossible to represent the file position of a text stream as a
-count of characters from the beginning of the file.  For example, the
-file position on some systems must encode both a record offset within
-the file, and a character offset within the record.
-
-   As a consequence, if you want your programs to be portable to these
-systems, you must observe certain rules:
-
-   * The value returned from `ftell' on a text stream has no predictable
-     relationship to the number of characters you have read so far.
-     The only thing you can rely on is that you can use it subsequently
-     as the OFFSET argument to `fseek' or `fseeko' to move back to the
-     same file position.
-
-   * In a call to `fseek' or `fseeko' on a text stream, either the
-     OFFSET must be zero, or WHENCE must be `SEEK_SET' and the OFFSET
-     must be the result of an earlier call to `ftell' on the same
-     stream.
-
-   * The value of the file position indicator of a text stream is
-     undefined while there are characters that have been pushed back
-     with `ungetc' that haven't been read or discarded.  *Note
-     Unreading::.
-
-   But even if you observe these rules, you may still have trouble for
-long files, because `ftell' and `fseek' use a `long int' value to
-represent the file position.  This type may not have room to encode all
-the file positions in a large file.  Using the `ftello' and `fseeko'
-functions might help here since the `off_t' type is expected to be able
-to hold all file position values but this still does not help to handle
-additional information which must be associated with a file position.
-
-   So if you do want to support systems with peculiar encodings for the
-file positions, it is better to use the functions `fgetpos' and
-`fsetpos' instead.  These functions represent the file position using
-the data type `fpos_t', whose internal representation varies from
-system to system.
-
-   These symbols are declared in the header file `stdio.h'.  
-
- -- Data Type: fpos_t
-     This is the type of an object that can encode information about the
-     file position of a stream, for use by the functions `fgetpos' and
-     `fsetpos'.
-
-     In the GNU C Library, `fpos_t' is an opaque data structure that
-     contains internal data to represent file offset and conversion
-     state information.  In other systems, it might have a different
-     internal representation.
-
-     When compiling with `_FILE_OFFSET_BITS == 64' on a 32 bit machine
-     this type is in fact equivalent to `fpos64_t' since the LFS
-     interface transparently replaces the old interface.
-
- -- Data Type: fpos64_t
-     This is the type of an object that can encode information about the
-     file position of a stream, for use by the functions `fgetpos64' and
-     `fsetpos64'.
-
-     In the GNU C Library, `fpos64_t' is an opaque data structure that
-     contains internal data to represent file offset and conversion
-     state information.  In other systems, it might have a different
-     internal representation.
-
- -- Function: int fgetpos (FILE *STREAM, fpos_t *POSITION)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     This function stores the value of the file position indicator for
-     the stream STREAM in the `fpos_t' object pointed to by POSITION.
-     If successful, `fgetpos' returns zero; otherwise it returns a
-     nonzero value and stores an implementation-defined positive value
-     in `errno'.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
-     32 bit system the function is in fact `fgetpos64'.  I.e., the LFS
-     interface transparently replaces the old interface.
-
- -- Function: int fgetpos64 (FILE *STREAM, fpos64_t *POSITION)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     This function is similar to `fgetpos' but the file position is
-     returned in a variable of type `fpos64_t' to which POSITION points.
-
-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32
-     bits machine this function is available under the name `fgetpos'
-     and so transparently replaces the old interface.
-
- -- Function: int fsetpos (FILE *STREAM, const fpos_t *POSITION)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     This function sets the file position indicator for the stream
-     STREAM to the position POSITION, which must have been set by a
-     previous call to `fgetpos' on the same stream.  If successful,
-     `fsetpos' clears the end-of-file indicator on the stream, discards
-     any characters that were "pushed back" by the use of `ungetc', and
-     returns a value of zero.  Otherwise, `fsetpos' returns a nonzero
-     value and stores an implementation-defined positive value in
-     `errno'.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
-     32 bit system the function is in fact `fsetpos64'.  I.e., the LFS
-     interface transparently replaces the old interface.
-
- -- Function: int fsetpos64 (FILE *STREAM, const fpos64_t *POSITION)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     This function is similar to `fsetpos' but the file position used
-     for positioning is provided in a variable of type `fpos64_t' to
-     which POSITION points.
-
-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32
-     bits machine this function is available under the name `fsetpos'
-     and so transparently replaces the old interface.
-
-
-File: libc.info,  Node: Stream Buffering,  Next: Other Kinds of Streams,  Prev: Portable Positioning,  Up: I/O on Streams
-
-12.20 Stream Buffering
-======================
-
-Characters that are written to a stream are normally accumulated and
-transmitted asynchronously to the file in a block, instead of appearing
-as soon as they are output by the application program.  Similarly,
-streams often retrieve input from the host environment in blocks rather
-than on a character-by-character basis.  This is called "buffering".
-
-   If you are writing programs that do interactive input and output
-using streams, you need to understand how buffering works when you
-design the user interface to your program.  Otherwise, you might find
-that output (such as progress or prompt messages) doesn't appear when
-you intended it to, or displays some other unexpected behavior.
-
-   This section deals only with controlling when characters are
-transmitted between the stream and the file or device, and _not_ with
-how things like echoing, flow control, and the like are handled on
-specific classes of devices.  For information on common control
-operations on terminal devices, see *note Low-Level Terminal
-Interface::.
-
-   You can bypass the stream buffering facilities altogether by using
-the low-level input and output functions that operate on file
-descriptors instead.  *Note Low-Level I/O::.
-
-* Menu:
-
-* Buffering Concepts::          Terminology is defined here.
-* Flushing Buffers::            How to ensure that output buffers are flushed.
-* Controlling Buffering::       How to specify what kind of buffering to use.
-
-
-File: libc.info,  Node: Buffering Concepts,  Next: Flushing Buffers,  Up: Stream Buffering
-
-12.20.1 Buffering Concepts
---------------------------
-
-There are three different kinds of buffering strategies:
-
-   * Characters written to or read from an "unbuffered" stream are
-     transmitted individually to or from the file as soon as possible.  
-
-   * Characters written to a "line buffered" stream are transmitted to
-     the file in blocks when a newline character is encountered.  
-
-   * Characters written to or read from a "fully buffered" stream are
-     transmitted to or from the file in blocks of arbitrary size.  
-
-   Newly opened streams are normally fully buffered, with one
-exception: a stream connected to an interactive device such as a
-terminal is initially line buffered.  *Note Controlling Buffering::,
-for information on how to select a different kind of buffering.
-Usually the automatic selection gives you the most convenient kind of
-buffering for the file or device you open.
-
-   The use of line buffering for interactive devices implies that output
-messages ending in a newline will appear immediately--which is usually
-what you want.  Output that doesn't end in a newline might or might not
-show up immediately, so if you want them to appear immediately, you
-should flush buffered output explicitly with `fflush', as described in
-*note Flushing Buffers::.
-
-
-File: libc.info,  Node: Flushing Buffers,  Next: Controlling Buffering,  Prev: Buffering Concepts,  Up: Stream Buffering
-
-12.20.2 Flushing Buffers
-------------------------
-
-"Flushing" output on a buffered stream means transmitting all
-accumulated characters to the file.  There are many circumstances when
-buffered output on a stream is flushed automatically:
-
-   * When you try to do output and the output buffer is full.
-
-   * When the stream is closed.  *Note Closing Streams::.
-
-   * When the program terminates by calling `exit'.  *Note Normal
-     Termination::.
-
-   * When a newline is written, if the stream is line buffered.
-
-   * Whenever an input operation on _any_ stream actually reads data
-     from its file.
-
-   If you want to flush the buffered output at another time, call
-`fflush', which is declared in the header file `stdio.h'.  
-
- -- Function: int fflush (FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     This function causes any buffered output on STREAM to be delivered
-     to the file.  If STREAM is a null pointer, then `fflush' causes
-     buffered output on _all_ open output streams to be flushed.
-
-     This function returns `EOF' if a write error occurs, or zero
-     otherwise.
-
- -- Function: int fflush_unlocked (FILE *STREAM)
-     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `fflush_unlocked' function is equivalent to the `fflush'
-     function except that it does not implicitly lock the stream.
-
-   The `fflush' function can be used to flush all streams currently
-opened.  While this is useful in some situations it does often more than
-necessary since it might be done in situations when terminal input is
-required and the program wants to be sure that all output is visible on
-the terminal.  But this means that only line buffered streams have to be
-flushed.  Solaris introduced a function especially for this.  It was
-always available in the GNU C Library in some form but never officially
-exported.
-
- -- Function: void _flushlbf (void)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     The `_flushlbf' function flushes all line buffered streams
-     currently opened.
-
-     This function is declared in the `stdio_ext.h' header.
-
-   *Compatibility Note:* Some brain-damaged operating systems have been
-known to be so thoroughly fixated on line-oriented input and output
-that flushing a line buffered stream causes a newline to be written!
-Fortunately, this "feature" seems to be becoming less common.  You do
-not need to worry about this with the GNU C Library.
-
-   In some situations it might be useful to not flush the output pending
-for a stream but instead simply forget it.  If transmission is costly
-and the output is not needed anymore this is valid reasoning.  In this
-situation a non-standard function introduced in Solaris and available in
-the GNU C Library can be used.
-
- -- Function: void __fpurge (FILE *STREAM)
-     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `__fpurge' function causes the buffer of the stream STREAM to
-     be emptied.  If the stream is currently in read mode all input in
-     the buffer is lost.  If the stream is in output mode the buffered
-     output is not written to the device (or whatever other underlying
-     storage) and the buffer the cleared.
-
-     This function is declared in `stdio_ext.h'.
-
-
-File: libc.info,  Node: Controlling Buffering,  Prev: Flushing Buffers,  Up: Stream Buffering
-
-12.20.3 Controlling Which Kind of Buffering
--------------------------------------------
-
-After opening a stream (but before any other operations have been
-performed on it), you can explicitly specify what kind of buffering you
-want it to have using the `setvbuf' function.  
-
-   The facilities listed in this section are declared in the header
-file `stdio.h'.  
-
- -- Function: int setvbuf (FILE *STREAM, char *BUF, int MODE, size_t
-          SIZE)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     This function is used to specify that the stream STREAM should
-     have the buffering mode MODE, which can be either `_IOFBF' (for
-     full buffering), `_IOLBF' (for line buffering), or `_IONBF' (for
-     unbuffered input/output).
-
-     If you specify a null pointer as the BUF argument, then `setvbuf'
-     allocates a buffer itself using `malloc'.  This buffer will be
-     freed when you close the stream.
-
-     Otherwise, BUF should be a character array that can hold at least
-     SIZE characters.  You should not free the space for this array as
-     long as the stream remains open and this array remains its buffer.
-     You should usually either allocate it statically, or `malloc'
-     (*note Unconstrained Allocation::) the buffer.  Using an automatic
-     array is not a good idea unless you close the file before exiting
-     the block that declares the array.
-
-     While the array remains a stream buffer, the stream I/O functions
-     will use the buffer for their internal purposes.  You shouldn't
-     try to access the values in the array directly while the stream is
-     using it for buffering.
-
-     The `setvbuf' function returns zero on success, or a nonzero value
-     if the value of MODE is not valid or if the request could not be
-     honored.
-
- -- Macro: int _IOFBF
-     The value of this macro is an integer constant expression that can
-     be used as the MODE argument to the `setvbuf' function to specify
-     that the stream should be fully buffered.
-
- -- Macro: int _IOLBF
-     The value of this macro is an integer constant expression that can
-     be used as the MODE argument to the `setvbuf' function to specify
-     that the stream should be line buffered.
-
- -- Macro: int _IONBF
-     The value of this macro is an integer constant expression that can
-     be used as the MODE argument to the `setvbuf' function to specify
-     that the stream should be unbuffered.
-
- -- Macro: int BUFSIZ
-     The value of this macro is an integer constant expression that is
-     good to use for the SIZE argument to `setvbuf'.  This value is
-     guaranteed to be at least `256'.
-
-     The value of `BUFSIZ' is chosen on each system so as to make stream
-     I/O efficient.  So it is a good idea to use `BUFSIZ' as the size
-     for the buffer when you call `setvbuf'.
-
-     Actually, you can get an even better value to use for the buffer
-     size by means of the `fstat' system call: it is found in the
-     `st_blksize' field of the file attributes.  *Note Attribute
-     Meanings::.
-
-     Sometimes people also use `BUFSIZ' as the allocation size of
-     buffers used for related purposes, such as strings used to receive
-     a line of input with `fgets' (*note Character Input::).  There is
-     no particular reason to use `BUFSIZ' for this instead of any other
-     integer, except that it might lead to doing I/O in chunks of an
-     efficient size.
-
- -- Function: void setbuf (FILE *STREAM, char *BUF)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     If BUF is a null pointer, the effect of this function is
-     equivalent to calling `setvbuf' with a MODE argument of `_IONBF'.
-     Otherwise, it is equivalent to calling `setvbuf' with BUF, and a
-     MODE of `_IOFBF' and a SIZE argument of `BUFSIZ'.
-
-     The `setbuf' function is provided for compatibility with old code;
-     use `setvbuf' in all new programs.
-
- -- Function: void setbuffer (FILE *STREAM, char *BUF, size_t SIZE)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     If BUF is a null pointer, this function makes STREAM unbuffered.
-     Otherwise, it makes STREAM fully buffered using BUF as the buffer.
-     The SIZE argument specifies the length of BUF.
-
-     This function is provided for compatibility with old BSD code.  Use
-     `setvbuf' instead.
-
- -- Function: void setlinebuf (FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     This function makes STREAM be line buffered, and allocates the
-     buffer for you.
-
-     This function is provided for compatibility with old BSD code.  Use
-     `setvbuf' instead.
-
-   It is possible to query whether a given stream is line buffered or
-not using a non-standard function introduced in Solaris and available in
-the GNU C Library.
-
- -- Function: int __flbf (FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `__flbf' function will return a nonzero value in case the
-     stream STREAM is line buffered.  Otherwise the return value is
-     zero.
-
-     This function is declared in the `stdio_ext.h' header.
-
-   Two more extensions allow to determine the size of the buffer and how
-much of it is used.  These functions were also introduced in Solaris.
-
- -- Function: size_t __fbufsize (FILE *STREAM)
-     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Safe |
-     *Note POSIX Safety Concepts::.
-
-     The `__fbufsize' function return the size of the buffer in the
-     stream STREAM.  This value can be used to optimize the use of the
-     stream.
-
-     This function is declared in the `stdio_ext.h' header.
-
- -- Function: size_t __fpending (FILE *STREAM)
-     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Safe |
-     *Note POSIX Safety Concepts::.
-
-     The `__fpending' function returns the number of bytes currently in
-     the output buffer.  For wide-oriented stream the measuring unit is
-     wide characters.  This function should not be used on buffers in
-     read mode or opened read-only.
-
-     This function is declared in the `stdio_ext.h' header.
-
-
-File: libc.info,  Node: Other Kinds of Streams,  Next: Formatted Messages,  Prev: Stream Buffering,  Up: I/O on Streams
-
-12.21 Other Kinds of Streams
-============================
-
-The GNU C Library provides ways for you to define additional kinds of
-streams that do not necessarily correspond to an open file.
-
-   One such type of stream takes input from or writes output to a
-string.  These kinds of streams are used internally to implement the
-`sprintf' and `sscanf' functions.  You can also create such a stream
-explicitly, using the functions described in *note String Streams::.
-
-   More generally, you can define streams that do input/output to
-arbitrary objects using functions supplied by your program.  This
-protocol is discussed in *note Custom Streams::.
-
-   *Portability Note:* The facilities described in this section are
-specific to GNU.  Other systems or C implementations might or might not
-provide equivalent functionality.
-
-* Menu:
-
-* String Streams::              Streams that get data from or put data in
-				 a string or memory buffer.
-* Custom Streams::              Defining your own streams with an arbitrary
-				 input data source and/or output data sink.
-
-
-File: libc.info,  Node: String Streams,  Next: Custom Streams,  Up: Other Kinds of Streams
-
-12.21.1 String Streams
-----------------------
-
-The `fmemopen' and `open_memstream' functions allow you to do I/O to a
-string or memory buffer.  These facilities are declared in `stdio.h'.  
-
- -- Function: FILE * fmemopen (void *BUF, size_t SIZE, const char
-          *OPENTYPE)
-     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe mem lock
-     | *Note POSIX Safety Concepts::.
-
-     This function opens a stream that allows the access specified by
-     the OPENTYPE argument, that reads from or writes to the buffer
-     specified by the argument BUF.  This array must be at least SIZE
-     bytes long.
-
-     If you specify a null pointer as the BUF argument, `fmemopen'
-     dynamically allocates an array SIZE bytes long (as with `malloc';
-     *note Unconstrained Allocation::).  This is really only useful if
-     you are going to write things to the buffer and then read them back
-     in again, because you have no way of actually getting a pointer to
-     the buffer (for this, try `open_memstream', below).  The buffer is
-     freed when the stream is closed.
-
-     The argument OPENTYPE is the same as in `fopen' (*note Opening
-     Streams::).  If the OPENTYPE specifies append mode, then the
-     initial file position is set to the first null character in the
-     buffer.  Otherwise the initial file position is at the beginning
-     of the buffer.
-
-     When a stream open for writing is flushed or closed, a null
-     character (zero byte) is written at the end of the buffer if it
-     fits.  You should add an extra byte to the SIZE argument to
-     account for this.  Attempts to write more than SIZE bytes to the
-     buffer result in an error.
-
-     For a stream open for reading, null characters (zero bytes) in the
-     buffer do not count as "end of file".  Read operations indicate
-     end of file only when the file position advances past SIZE bytes.
-     So, if you want to read characters from a null-terminated string,
-     you should supply the length of the string as the SIZE argument.
-
-   Here is an example of using `fmemopen' to create a stream for
-reading from a string:
-
-
-     #include <stdio.h>
-
-     static char buffer[] = "foobar";
-
-     int
-     main (void)
-     {
-       int ch;
-       FILE *stream;
-
-       stream = fmemopen (buffer, strlen (buffer), "r");
-       while ((ch = fgetc (stream)) != EOF)
-         printf ("Got %c\n", ch);
-       fclose (stream);
-
-       return 0;
-     }
-
-   This program produces the following output:
-
-     Got f
-     Got o
-     Got o
-     Got b
-     Got a
-     Got r
-
- -- Function: FILE * open_memstream (char **PTR, size_t *SIZELOC)
-     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
-     POSIX Safety Concepts::.
-
-     This function opens a stream for writing to a buffer.  The buffer
-     is allocated dynamically and grown as necessary, using `malloc'.
-     After you've closed the stream, this buffer is your responsibility
-     to clean up using `free' or `realloc'.  *Note Unconstrained
-     Allocation::.
-
-     When the stream is closed with `fclose' or flushed with `fflush',
-     the locations PTR and SIZELOC are updated to contain the pointer
-     to the buffer and its size.  The values thus stored remain valid
-     only as long as no further output on the stream takes place.  If
-     you do more output, you must flush the stream again to store new
-     values before you use them again.
-
-     A null character is written at the end of the buffer.  This null
-     character is _not_ included in the size value stored at SIZELOC.
-
-     You can move the stream's file position with `fseek' or `fseeko'
-     (*note File Positioning::).  Moving the file position past the end
-     of the data already written fills the intervening space with
-     zeroes.
-
-   Here is an example of using `open_memstream':
-
-
-     #include <stdio.h>
-
-     int
-     main (void)
-     {
-       char *bp;
-       size_t size;
-       FILE *stream;
-
-       stream = open_memstream (&bp, &size);
-       fprintf (stream, "hello");
-       fflush (stream);
-       printf ("buf = `%s', size = %d\n", bp, size);
-       fprintf (stream, ", world");
-       fclose (stream);
-       printf ("buf = `%s', size = %d\n", bp, size);
-
-       return 0;
-     }
-
-   This program produces the following output:
-
-     buf = `hello', size = 5
-     buf = `hello, world', size = 12
-
-
-File: libc.info,  Node: Custom Streams,  Prev: String Streams,  Up: Other Kinds of Streams
-
-12.21.2 Programming Your Own Custom Streams
--------------------------------------------
-
-This section describes how you can make a stream that gets input from an
-arbitrary data source or writes output to an arbitrary data sink
-programmed by you.  We call these "custom streams".  The functions and
-types described here are all GNU extensions.
-
-* Menu:
-
-* Streams and Cookies::         The "cookie" records where to fetch or
-				 store data that is read or written.
-* Hook Functions::              How you should define the four "hook
-				 functions" that a custom stream needs.
-
-
-File: libc.info,  Node: Streams and Cookies,  Next: Hook Functions,  Up: Custom Streams
-
-12.21.2.1 Custom Streams and Cookies
-....................................
-
-Inside every custom stream is a special object called the "cookie".
-This is an object supplied by you which records where to fetch or store
-the data read or written.  It is up to you to define a data type to use
-for the cookie.  The stream functions in the library never refer
-directly to its contents, and they don't even know what the type is;
-they record its address with type `void *'.
-
-   To implement a custom stream, you must specify _how_ to fetch or
-store the data in the specified place.  You do this by defining "hook
-functions" to read, write, change "file position", and close the
-stream.  All four of these functions will be passed the stream's cookie
-so they can tell where to fetch or store the data.  The library
-functions don't know what's inside the cookie, but your functions will
-know.
-
-   When you create a custom stream, you must specify the cookie pointer,
-and also the four hook functions stored in a structure of type
-`cookie_io_functions_t'.
-
-   These facilities are declared in `stdio.h'.  
-
- -- Data Type: cookie_io_functions_t
-     This is a structure type that holds the functions that define the
-     communications protocol between the stream and its cookie.  It has
-     the following members:
-
-    `cookie_read_function_t *read'
-          This is the function that reads data from the cookie.  If the
-          value is a null pointer instead of a function, then read
-          operations on this stream always return `EOF'.
-
-    `cookie_write_function_t *write'
-          This is the function that writes data to the cookie.  If the
-          value is a null pointer instead of a function, then data
-          written to the stream is discarded.
-
-    `cookie_seek_function_t *seek'
-          This is the function that performs the equivalent of file
-          positioning on the cookie.  If the value is a null pointer
-          instead of a function, calls to `fseek' or `fseeko' on this
-          stream can only seek to locations within the buffer; any
-          attempt to seek outside the buffer will return an `ESPIPE'
-          error.
-
-    `cookie_close_function_t *close'
-          This function performs any appropriate cleanup on the cookie
-          when closing the stream.  If the value is a null pointer
-          instead of a function, nothing special is done to close the
-          cookie when the stream is closed.
-
- -- Function: FILE * fopencookie (void *COOKIE, const char *OPENTYPE,
-          cookie_io_functions_t IO-FUNCTIONS)
-     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe mem lock
-     | *Note POSIX Safety Concepts::.
-
-     This function actually creates the stream for communicating with
-     the COOKIE using the functions in the IO-FUNCTIONS argument.  The
-     OPENTYPE argument is interpreted as for `fopen'; see *note Opening
-     Streams::.  (But note that the "truncate on open" option is
-     ignored.)  The new stream is fully buffered.
-
-     The `fopencookie' function returns the newly created stream, or a
-     null pointer in case of an error.
-
-
-File: libc.info,  Node: Hook Functions,  Prev: Streams and Cookies,  Up: Custom Streams
-
-12.21.2.2 Custom Stream Hook Functions
-......................................
-
-Here are more details on how you should define the four hook functions
-that a custom stream needs.
-
-   You should define the function to read data from the cookie as:
-
-     ssize_t READER (void *COOKIE, char *BUFFER, size_t SIZE)
-
-   This is very similar to the `read' function; see *note I/O
-Primitives::.  Your function should transfer up to SIZE bytes into the
-BUFFER, and return the number of bytes read, or zero to indicate
-end-of-file.  You can return a value of `-1' to indicate an error.
-
-   You should define the function to write data to the cookie as:
-
-     ssize_t WRITER (void *COOKIE, const char *BUFFER, size_t SIZE)
-
-   This is very similar to the `write' function; see *note I/O
-Primitives::.  Your function should transfer up to SIZE bytes from the
-buffer, and return the number of bytes written.  You can return a value
-of `0' to indicate an error.  You must not return any negative value.
-
-   You should define the function to perform seek operations on the
-cookie as:
-
-     int SEEKER (void *COOKIE, off64_t *POSITION, int WHENCE)
-
-   For this function, the POSITION and WHENCE arguments are interpreted
-as for `fgetpos'; see *note Portable Positioning::.
-
-   After doing the seek operation, your function should store the
-resulting file position relative to the beginning of the file in
-POSITION.  Your function should return a value of `0' on success and
-`-1' to indicate an error.
-
-   You should define the function to do cleanup operations on the cookie
-appropriate for closing the stream as:
-
-     int CLEANER (void *COOKIE)
-
-   Your function should return `-1' to indicate an error, and `0'
-otherwise.
-
- -- Data Type: cookie_read_function
-     This is the data type that the read function for a custom stream
-     should have.  If you declare the function as shown above, this is
-     the type it will have.
-
- -- Data Type: cookie_write_function
-     The data type of the write function for a custom stream.
-
- -- Data Type: cookie_seek_function
-     The data type of the seek function for a custom stream.
-
- -- Data Type: cookie_close_function
-     The data type of the close function for a custom stream.
-
-
-File: libc.info,  Node: Formatted Messages,  Prev: Other Kinds of Streams,  Up: I/O on Streams
-
-12.22 Formatted Messages
-========================
-
-On systems which are based on System V messages of programs (especially
-the system tools) are printed in a strict form using the `fmtmsg'
-function.  The uniformity sometimes helps the user to interpret messages
-and the strictness tests of the `fmtmsg' function ensure that the
-programmer follows some minimal requirements.
-
-* Menu:
-
-* Printing Formatted Messages::   The `fmtmsg' function.
-* Adding Severity Classes::       Add more severity classes.
-* Example::                       How to use `fmtmsg' and `addseverity'.
-
-
-File: libc.info,  Node: Printing Formatted Messages,  Next: Adding Severity Classes,  Up: Formatted Messages
-
-12.22.1 Printing Formatted Messages
------------------------------------
-
-Messages can be printed to standard error and/or to the console.  To
-select the destination the programmer can use the following two values,
-bitwise OR combined if wanted, for the CLASSIFICATION parameter of
-`fmtmsg':
-
-`MM_PRINT'
-     Display the message in standard error.
-
-`MM_CONSOLE'
-     Display the message on the system console.
-
-   The erroneous piece of the system can be signalled by exactly one of
-the following values which also is bitwise ORed with the CLASSIFICATION
-parameter to `fmtmsg':
-
-`MM_HARD'
-     The source of the condition is some hardware.
-
-`MM_SOFT'
-     The source of the condition is some software.
-
-`MM_FIRM'
-     The source of the condition is some firmware.
-
-   A third component of the CLASSIFICATION parameter to `fmtmsg' can
-describe the part of the system which detects the problem.  This is
-done by using exactly one of the following values:
-
-`MM_APPL'
-     The erroneous condition is detected by the application.
-
-`MM_UTIL'
-     The erroneous condition is detected by a utility.
-
-`MM_OPSYS'
-     The erroneous condition is detected by the operating system.
-
-   A last component of CLASSIFICATION can signal the results of this
-message.  Exactly one of the following values can be used:
-
-`MM_RECOVER'
-     It is a recoverable error.
-
-`MM_NRECOV'
-     It is a non-recoverable error.
-
- -- Function: int fmtmsg (long int CLASSIFICATION, const char *LABEL,
-          int SEVERITY, const char *TEXT, const char *ACTION, const
-          char *TAG)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     Display a message described by its parameters on the device(s)
-     specified in the CLASSIFICATION parameter.  The LABEL parameter
-     identifies the source of the message.  The string should consist
-     of two colon separated parts where the first part has not more
-     than 10 and the second part not more than 14 characters.  The TEXT
-     parameter describes the condition of the error, the ACTION
-     parameter possible steps to recover from the error and the TAG
-     parameter is a reference to the online documentation where more
-     information can be found.  It should contain the LABEL value and a
-     unique identification number.
-
-     Each of the parameters can be a special value which means this
-     value is to be omitted.  The symbolic names for these values are:
-
-    `MM_NULLLBL'
-          Ignore LABEL parameter.
-
-    `MM_NULLSEV'
-          Ignore SEVERITY parameter.
-
-    `MM_NULLMC'
-          Ignore CLASSIFICATION parameter.  This implies that nothing is
-          actually printed.
-
-    `MM_NULLTXT'
-          Ignore TEXT parameter.
-
-    `MM_NULLACT'
-          Ignore ACTION parameter.
-
-    `MM_NULLTAG'
-          Ignore TAG parameter.
-
-     There is another way certain fields can be omitted from the output
-     to standard error.  This is described below in the description of
-     environment variables influencing the behavior.
-
-     The SEVERITY parameter can have one of the values in the following
-     table: 
-
-    `MM_NOSEV'
-          Nothing is printed, this value is the same as `MM_NULLSEV'.
-
-    `MM_HALT'
-          This value is printed as `HALT'.
-
-    `MM_ERROR'
-          This value is printed as `ERROR'.
-
-    `MM_WARNING'
-          This value is printed as `WARNING'.
-
-    `MM_INFO'
-          This value is printed as `INFO'.
-
-     The numeric value of these five macros are between `0' and `4'.
-     Using the environment variable `SEV_LEVEL' or using the
-     `addseverity' function one can add more severity levels with their
-     corresponding string to print.  This is described below (*note
-     Adding Severity Classes::).
-
-     If no parameter is ignored the output looks like this:
-
-          LABEL: SEVERITY-STRING: TEXT
-          TO FIX: ACTION TAG
-
-     The colons, new line characters and the `TO FIX' string are
-     inserted if necessary, i.e., if the corresponding parameter is not
-     ignored.
-
-     This function is specified in the X/Open Portability Guide.  It is
-     also available on all systems derived from System V.
-
-     The function returns the value `MM_OK' if no error occurred.  If
-     only the printing to standard error failed, it returns `MM_NOMSG'.
-     If printing to the console fails, it returns `MM_NOCON'.  If
-     nothing is printed `MM_NOTOK' is returned.  Among situations where
-     all outputs fail this last value is also returned if a parameter
-     value is incorrect.
-
-   There are two environment variables which influence the behavior of
-`fmtmsg'.  The first is `MSGVERB'.  It is used to control the output
-actually happening on standard error (_not_ the console output).  Each
-of the five fields can explicitly be enabled.  To do this the user has
-to put the `MSGVERB' variable with a format like the following in the
-environment before calling the `fmtmsg' function the first time:
-
-     MSGVERB=KEYWORD[:KEYWORD[:...]]
-
-   Valid KEYWORDs are `label', `severity', `text', `action', and `tag'.
-If the environment variable is not given or is the empty string, a not
-supported keyword is given or the value is somehow else invalid, no
-part of the message is masked out.
-
-   The second environment variable which influences the behavior of
-`fmtmsg' is `SEV_LEVEL'.  This variable and the change in the behavior
-of `fmtmsg' is not specified in the X/Open Portability Guide.  It is
-available in System V systems, though.  It can be used to introduce new
-severity levels.  By default, only the five severity levels described
-above are available.  Any other numeric value would make `fmtmsg' print
-nothing.
-
-   If the user puts `SEV_LEVEL' with a format like
-
-     SEV_LEVEL=[DESCRIPTION[:DESCRIPTION[:...]]]
-
-in the environment of the process before the first call to `fmtmsg',
-where DESCRIPTION has a value of the form
-
-     SEVERITY-KEYWORD,LEVEL,PRINTSTRING
-
-   The SEVERITY-KEYWORD part is not used by `fmtmsg' but it has to be
-present.  The LEVEL part is a string representation of a number.  The
-numeric value must be a number greater than 4.  This value must be used
-in the SEVERITY parameter of `fmtmsg' to select this class.  It is not
-possible to overwrite any of the predefined classes.  The PRINTSTRING
-is the string printed when a message of this class is processed by
-`fmtmsg' (see above, `fmtsmg' does not print the numeric value but
-instead the string representation).
-
-
-File: libc.info,  Node: Adding Severity Classes,  Next: Example,  Prev: Printing Formatted Messages,  Up: Formatted Messages
-
-12.22.2 Adding Severity Classes
--------------------------------
-
-There is another possibility to introduce severity classes besides using
-the environment variable `SEV_LEVEL'.  This simplifies the task of
-introducing new classes in a running program.  One could use the
-`setenv' or `putenv' function to set the environment variable, but this
-is toilsome.
-
- -- Function: int addseverity (int SEVERITY, const char *STRING)
-     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe lock mem
-     | *Note POSIX Safety Concepts::.
-
-     This function allows the introduction of new severity classes
-     which can be addressed by the SEVERITY parameter of the `fmtmsg'
-     function.  The SEVERITY parameter of `addseverity' must match the
-     value for the parameter with the same name of `fmtmsg', and STRING
-     is the string printed in the actual messages instead of the numeric
-     value.
-
-     If STRING is `NULL' the severity class with the numeric value
-     according to SEVERITY is removed.
-
-     It is not possible to overwrite or remove one of the default
-     severity classes.  All calls to `addseverity' with SEVERITY set to
-     one of the values for the default classes will fail.
-
-     The return value is `MM_OK' if the task was successfully performed.
-     If the return value is `MM_NOTOK' something went wrong.  This could
-     mean that no more memory is available or a class is not available
-     when it has to be removed.
-
-     This function is not specified in the X/Open Portability Guide
-     although the `fmtsmg' function is.  It is available on System V
-     systems.
-
-
-File: libc.info,  Node: Example,  Prev: Adding Severity Classes,  Up: Formatted Messages
-
-12.22.3 How to use `fmtmsg' and `addseverity'
----------------------------------------------
-
-Here is a simple example program to illustrate the use of the both
-functions described in this section.
-
-
-     #include <fmtmsg.h>
-
-     int
-     main (void)
-     {
-       addseverity (5, "NOTE2");
-       fmtmsg (MM_PRINT, "only1field", MM_INFO, "text2", "action2", "tag2");
-       fmtmsg (MM_PRINT, "UX:cat", 5, "invalid syntax", "refer to manual",
-               "UX:cat:001");
-       fmtmsg (MM_PRINT, "label:foo", 6, "text", "action", "tag");
-       return 0;
-     }
-
-   The second call to `fmtmsg' illustrates a use of this function as it
-usually occurs on System V systems, which heavily use this function.
-It seems worthwhile to give a short explanation here of how this system
-works on System V.  The value of the LABEL field (`UX:cat') says that
-the error occurred in the Unix program `cat'.  The explanation of the
-error follows and the value for the ACTION parameter is `"refer to
-manual"'.  One could be more specific here, if necessary.  The TAG
-field contains, as proposed above, the value of the string given for
-the LABEL parameter, and additionally a unique ID (`001' in this case).
-For a GNU environment this string could contain a reference to the
-corresponding node in the Info page for the program.
-
-Running this program without specifying the `MSGVERB' and `SEV_LEVEL'
-function produces the following output:
-
-     UX:cat: NOTE2: invalid syntax
-     TO FIX: refer to manual UX:cat:001
-
-   We see the different fields of the message and how the extra glue
-(the colons and the `TO FIX' string) are printed.  But only one of the
-three calls to `fmtmsg' produced output.  The first call does not print
-anything because the LABEL parameter is not in the correct form.  The
-string must contain two fields, separated by a colon (*note Printing
-Formatted Messages::).  The third `fmtmsg' call produced no output
-since the class with the numeric value `6' is not defined.  Although a
-class with numeric value `5' is also not defined by default, the call
-to `addseverity' introduces it and the second call to `fmtmsg' produces
-the above output.
-
-   When we change the environment of the program to contain
-`SEV_LEVEL=XXX,6,NOTE' when running it we get a different result:
-
-     UX:cat: NOTE2: invalid syntax
-     TO FIX: refer to manual UX:cat:001
-     label:foo: NOTE: text
-     TO FIX: action tag
-
-   Now the third call to `fmtmsg' produced some output and we see how
-the string `NOTE' from the environment variable appears in the message.
-
-   Now we can reduce the output by specifying which fields we are
-interested in.  If we additionally set the environment variable
-`MSGVERB' to the value `severity:label:action' we get the following
-output:
-
-     UX:cat: NOTE2
-     TO FIX: refer to manual
-     label:foo: NOTE
-     TO FIX: action
-
-I.e., the output produced by the TEXT and the TAG parameters to
-`fmtmsg' vanished.  Please also note that now there is no colon after
-the `NOTE' and `NOTE2' strings in the output.  This is not necessary
-since there is no more output on this line because the text is missing.
-
-
-File: libc.info,  Node: Low-Level I/O,  Next: File System Interface,  Prev: I/O on Streams,  Up: Top
-
-13 Low-Level Input/Output
-*************************
-
-This chapter describes functions for performing low-level input/output
-operations on file descriptors.  These functions include the primitives
-for the higher-level I/O functions described in *note I/O on Streams::,
-as well as functions for performing low-level control operations for
-which there are no equivalents on streams.
-
-   Stream-level I/O is more flexible and usually more convenient;
-therefore, programmers generally use the descriptor-level functions only
-when necessary.  These are some of the usual reasons:
-
-   * For reading binary files in large chunks.
-
-   * For reading an entire file into core before parsing it.
-
-   * To perform operations other than data transfer, which can only be
-     done with a descriptor.  (You can use `fileno' to get the
-     descriptor corresponding to a stream.)
-
-   * To pass descriptors to a child process.  (The child can create its
-     own stream to use a descriptor that it inherits, but cannot
-     inherit a stream directly.)
-
-* Menu:
-
-* Opening and Closing Files::           How to open and close file
-                                         descriptors.
-* I/O Primitives::                      Reading and writing data.
-* File Position Primitive::             Setting a descriptor's file
-                                         position.
-* Descriptors and Streams::             Converting descriptor to stream
-                                         or vice-versa.
-* Stream/Descriptor Precautions::       Precautions needed if you use both
-                                         descriptors and streams.
-* Scatter-Gather::                      Fast I/O to discontinuous buffers.
-* Memory-mapped I/O::                   Using files like memory.
-* Waiting for I/O::                     How to check for input or output
-					 on multiple file descriptors.
-* Synchronizing I/O::                   Making sure all I/O actions completed.
-* Asynchronous I/O::                    Perform I/O in parallel.
-* Control Operations::                  Various other operations on file
-					 descriptors.
-* Duplicating Descriptors::             Fcntl commands for duplicating
-                                         file descriptors.
-* Descriptor Flags::                    Fcntl commands for manipulating
-                                         flags associated with file
-                                         descriptors.
-* File Status Flags::                   Fcntl commands for manipulating
-                                         flags associated with open files.
-* File Locks::                          Fcntl commands for implementing
-                                         file locking.
-* Interrupt Input::                     Getting an asynchronous signal when
-                                         input arrives.
-* IOCTLs::                              Generic I/O Control operations.
-
-
-File: libc.info,  Node: Opening and Closing Files,  Next: I/O Primitives,  Up: Low-Level I/O
-
-13.1 Opening and Closing Files
-==============================
-
-This section describes the primitives for opening and closing files
-using file descriptors.  The `open' and `creat' functions are declared
-in the header file `fcntl.h', while `close' is declared in `unistd.h'.  
-
- -- Function: int open (const char *FILENAME, int FLAGS[, mode_t MODE])
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
-     Concepts::.
-
-     The `open' function creates and returns a new file descriptor for
-     the file named by FILENAME.  Initially, the file position
-     indicator for the file is at the beginning of the file.  The
-     argument MODE (*note Permission Bits::) is used only when a file is
-     created, but it doesn't hurt to supply the argument in any case.
-
-     The FLAGS argument controls how the file is to be opened.  This is
-     a bit mask; you create the value by the bitwise OR of the
-     appropriate parameters (using the `|' operator in C).  *Note File
-     Status Flags::, for the parameters available.
-
-     The normal return value from `open' is a non-negative integer file
-     descriptor.  In the case of an error, a value of -1 is returned
-     instead.  In addition to the usual file name errors (*note File
-     Name Errors::), the following `errno' error conditions are defined
-     for this function:
-
-    `EACCES'
-          The file exists but is not readable/writable as requested by
-          the FLAGS argument, the file does not exist and the directory
-          is unwritable so it cannot be created.
-
-    `EEXIST'
-          Both `O_CREAT' and `O_EXCL' are set, and the named file
-          already exists.
-
-    `EINTR'
-          The `open' operation was interrupted by a signal.  *Note
-          Interrupted Primitives::.
-
-    `EISDIR'
-          The FLAGS argument specified write access, and the file is a
-          directory.
-
-    `EMFILE'
-          The process has too many files open.  The maximum number of
-          file descriptors is controlled by the `RLIMIT_NOFILE'
-          resource limit; *note Limits on Resources::.
-
-    `ENFILE'
-          The entire system, or perhaps the file system which contains
-          the directory, cannot support any additional open files at
-          the moment.  (This problem cannot happen on GNU/Hurd systems.)
-
-    `ENOENT'
-          The named file does not exist, and `O_CREAT' is not specified.
-
-    `ENOSPC'
-          The directory or file system that would contain the new file
-          cannot be extended, because there is no disk space left.
-
-    `ENXIO'
-          `O_NONBLOCK' and `O_WRONLY' are both set in the FLAGS
-          argument, the file named by FILENAME is a FIFO (*note Pipes
-          and FIFOs::), and no process has the file open for reading.
-
-    `EROFS'
-          The file resides on a read-only file system and any of
-          `O_WRONLY', `O_RDWR', and `O_TRUNC' are set in the FLAGS
-          argument, or `O_CREAT' is set and the file does not already
-          exist.
-
-     If on a 32 bit machine the sources are translated with
-     `_FILE_OFFSET_BITS == 64' the function `open' returns a file
-     descriptor opened in the large file mode which enables the file
-     handling functions to use files up to 2^63 bytes in size and
-     offset from -2^63 to 2^63.  This happens transparently for the user
-     since all of the lowlevel file handling functions are equally
-     replaced.
-
-     This function is a cancellation point in multi-threaded programs.
-     This is a problem if the thread allocates some resources (like
-     memory, file descriptors, semaphores or whatever) at the time
-     `open' is called.  If the thread gets canceled these resources
-     stay allocated until the program ends.  To avoid this calls to
-     `open' should be protected using cancellation handlers.
-
-     The `open' function is the underlying primitive for the `fopen'
-     and `freopen' functions, that create streams.
-
- -- Function: int open64 (const char *FILENAME, int FLAGS[, mode_t
-          MODE])
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
-     Concepts::.
-
-     This function is similar to `open'.  It returns a file descriptor
-     which can be used to access the file named by FILENAME.  The only
-     difference is that on 32 bit systems the file is opened in the
-     large file mode.  I.e., file length and file offsets can exceed 31
-     bits.
-
-     When the sources are translated with `_FILE_OFFSET_BITS == 64' this
-     function is actually available under the name `open'.  I.e., the
-     new, extended API using 64 bit file sizes and offsets transparently
-     replaces the old API.
-
- -- Obsolete function: int creat (const char *FILENAME, mode_t MODE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
-     Concepts::.
-
-     This function is obsolete.  The call:
-
-          creat (FILENAME, MODE)
-
-     is equivalent to:
-
-          open (FILENAME, O_WRONLY | O_CREAT | O_TRUNC, MODE)
-
-     If on a 32 bit machine the sources are translated with
-     `_FILE_OFFSET_BITS == 64' the function `creat' returns a file
-     descriptor opened in the large file mode which enables the file
-     handling functions to use files up to 2^63 in size and offset from
-     -2^63 to 2^63.  This happens transparently for the user since all
-     of the lowlevel file handling functions are equally replaced.
-
- -- Obsolete function: int creat64 (const char *FILENAME, mode_t MODE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
-     Concepts::.
-
-     This function is similar to `creat'.  It returns a file descriptor
-     which can be used to access the file named by FILENAME.  The only
-     the difference is that on 32 bit systems the file is opened in the
-     large file mode.  I.e., file length and file offsets can exceed 31
-     bits.
-
-     To use this file descriptor one must not use the normal operations
-     but instead the counterparts named `*64', e.g., `read64'.
-
-     When the sources are translated with `_FILE_OFFSET_BITS == 64' this
-     function is actually available under the name `open'.  I.e., the
-     new, extended API using 64 bit file sizes and offsets transparently
-     replaces the old API.
-
- -- Function: int close (int FILEDES)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
-     Concepts::.
-
-     The function `close' closes the file descriptor FILEDES.  Closing
-     a file has the following consequences:
-
-        * The file descriptor is deallocated.
-
-        * Any record locks owned by the process on the file are
-          unlocked.
-
-        * When all file descriptors associated with a pipe or FIFO have
-          been closed, any unread data is discarded.
-
-     This function is a cancellation point in multi-threaded programs.
-     This is a problem if the thread allocates some resources (like
-     memory, file descriptors, semaphores or whatever) at the time
-     `close' is called.  If the thread gets canceled these resources
-     stay allocated until the program ends.  To avoid this, calls to
-     `close' should be protected using cancellation handlers.
-
-     The normal return value from `close' is 0; a value of -1 is
-     returned in case of failure.  The following `errno' error
-     conditions are defined for this function:
-
-    `EBADF'
-          The FILEDES argument is not a valid file descriptor.
-
-    `EINTR'
-          The `close' call was interrupted by a signal.  *Note
-          Interrupted Primitives::.  Here is an example of how to
-          handle `EINTR' properly:
-
-               TEMP_FAILURE_RETRY (close (desc));
-
-    `ENOSPC'
-    `EIO'
-    `EDQUOT'
-          When the file is accessed by NFS, these errors from `write'
-          can sometimes not be detected until `close'.  *Note I/O
-          Primitives::, for details on their meaning.
-
-     Please note that there is _no_ separate `close64' function.  This
-     is not necessary since this function does not determine nor depend
-     on the mode of the file.  The kernel which performs the `close'
-     operation knows which mode the descriptor is used for and can
-     handle this situation.
-
-   To close a stream, call `fclose' (*note Closing Streams::) instead
-of trying to close its underlying file descriptor with `close'.  This
-flushes any buffered output and updates the stream object to indicate
-that it is closed.
-
-
-File: libc.info,  Node: I/O Primitives,  Next: File Position Primitive,  Prev: Opening and Closing Files,  Up: Low-Level I/O
-
-13.2 Input and Output Primitives
-================================
-
-This section describes the functions for performing primitive input and
-output operations on file descriptors: `read', `write', and `lseek'.
-These functions are declared in the header file `unistd.h'.  
-
- -- Data Type: ssize_t
-     This data type is used to represent the sizes of blocks that can be
-     read or written in a single operation.  It is similar to `size_t',
-     but must be a signed type.
-
- -- Function: ssize_t read (int FILEDES, void *BUFFER, size_t SIZE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `read' function reads up to SIZE bytes from the file with
-     descriptor FILEDES, storing the results in the BUFFER.  (This is
-     not necessarily a character string, and no terminating null
-     character is added.)
-
-     The return value is the number of bytes actually read.  This might
-     be less than SIZE; for example, if there aren't that many bytes
-     left in the file or if there aren't that many bytes immediately
-     available.  The exact behavior depends on what kind of file it is.
-     Note that reading less than SIZE bytes is not an error.
-
-     A value of zero indicates end-of-file (except if the value of the
-     SIZE argument is also zero).  This is not considered an error.  If
-     you keep calling `read' while at end-of-file, it will keep
-     returning zero and doing nothing else.
-
-     If `read' returns at least one character, there is no way you can
-     tell whether end-of-file was reached.  But if you did reach the
-     end, the next read will return zero.
-
-     In case of an error, `read' returns -1.  The following `errno'
-     error conditions are defined for this function:
-
-    `EAGAIN'
-          Normally, when no input is immediately available, `read'
-          waits for some input.  But if the `O_NONBLOCK' flag is set
-          for the file (*note File Status Flags::), `read' returns
-          immediately without reading any data, and reports this error.
-
-          *Compatibility Note:* Most versions of BSD Unix use a
-          different error code for this: `EWOULDBLOCK'.  In the GNU C
-          Library, `EWOULDBLOCK' is an alias for `EAGAIN', so it
-          doesn't matter which name you use.
-
-          On some systems, reading a large amount of data from a
-          character special file can also fail with `EAGAIN' if the
-          kernel cannot find enough physical memory to lock down the
-          user's pages.  This is limited to devices that transfer with
-          direct memory access into the user's memory, which means it
-          does not include terminals, since they always use separate
-          buffers inside the kernel.  This problem never happens on
-          GNU/Hurd systems.
-
-          Any condition that could result in `EAGAIN' can instead
-          result in a successful `read' which returns fewer bytes than
-          requested.  Calling `read' again immediately would result in
-          `EAGAIN'.
-
-    `EBADF'
-          The FILEDES argument is not a valid file descriptor, or is
-          not open for reading.
-
-    `EINTR'
-          `read' was interrupted by a signal while it was waiting for
-          input.  *Note Interrupted Primitives::.  A signal will not
-          necessary cause `read' to return `EINTR'; it may instead
-          result in a successful `read' which returns fewer bytes than
-          requested.
-
-    `EIO'
-          For many devices, and for disk files, this error code
-          indicates a hardware error.
-
-          `EIO' also occurs when a background process tries to read
-          from the controlling terminal, and the normal action of
-          stopping the process by sending it a `SIGTTIN' signal isn't
-          working.  This might happen if the signal is being blocked or
-          ignored, or because the process group is orphaned.  *Note Job
-          Control::, for more information about job control, and *note
-          Signal Handling::, for information about signals.
-
-    `EINVAL'
-          In some systems, when reading from a character or block
-          device, position and size offsets must be aligned to a
-          particular block size.  This error indicates that the offsets
-          were not properly aligned.
-
-     Please note that there is no function named `read64'.  This is not
-     necessary since this function does not directly modify or handle
-     the possibly wide file offset.  Since the kernel handles this state
-     internally, the `read' function can be used for all cases.
-
-     This function is a cancellation point in multi-threaded programs.
-     This is a problem if the thread allocates some resources (like
-     memory, file descriptors, semaphores or whatever) at the time
-     `read' is called.  If the thread gets canceled these resources
-     stay allocated until the program ends.  To avoid this, calls to
-     `read' should be protected using cancellation handlers.
-
-     The `read' function is the underlying primitive for all of the
-     functions that read from streams, such as `fgetc'.
-
- -- Function: ssize_t pread (int FILEDES, void *BUFFER, size_t SIZE,
-          off_t OFFSET)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `pread' function is similar to the `read' function.  The first
-     three arguments are identical, and the return values and error
-     codes also correspond.
-
-     The difference is the fourth argument and its handling.  The data
-     block is not read from the current position of the file descriptor
-     `filedes'.  Instead the data is read from the file starting at
-     position OFFSET.  The position of the file descriptor itself is
-     not affected by the operation.  The value is the same as before
-     the call.
-
-     When the source file is compiled with `_FILE_OFFSET_BITS == 64' the
-     `pread' function is in fact `pread64' and the type `off_t' has 64
-     bits, which makes it possible to handle files up to 2^63 bytes in
-     length.
-
-     The return value of `pread' describes the number of bytes read.
-     In the error case it returns -1 like `read' does and the error
-     codes are also the same, with these additions:
-
-    `EINVAL'
-          The value given for OFFSET is negative and therefore illegal.
-
-    `ESPIPE'
-          The file descriptor FILEDES is associate with a pipe or a
-          FIFO and this device does not allow positioning of the file
-          pointer.
-
-     The function is an extension defined in the Unix Single
-     Specification version 2.
-
- -- Function: ssize_t pread64 (int FILEDES, void *BUFFER, size_t SIZE,
-          off64_t OFFSET)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is similar to the `pread' function.  The difference
-     is that the OFFSET parameter is of type `off64_t' instead of
-     `off_t' which makes it possible on 32 bit machines to address
-     files larger than 2^31 bytes and up to 2^63 bytes.  The file
-     descriptor `filedes' must be opened using `open64' since otherwise
-     the large offsets possible with `off64_t' will lead to errors with
-     a descriptor in small file mode.
-
-     When the source file is compiled with `_FILE_OFFSET_BITS == 64' on
-     a 32 bit machine this function is actually available under the name
-     `pread' and so transparently replaces the 32 bit interface.
-
- -- Function: ssize_t write (int FILEDES, const void *BUFFER, size_t
-          SIZE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `write' function writes up to SIZE bytes from BUFFER to the
-     file with descriptor FILEDES.  The data in BUFFER is not
-     necessarily a character string and a null character is output like
-     any other character.
-
-     The return value is the number of bytes actually written.  This
-     may be SIZE, but can always be smaller.  Your program should
-     always call `write' in a loop, iterating until all the data is
-     written.
-
-     Once `write' returns, the data is enqueued to be written and can be
-     read back right away, but it is not necessarily written out to
-     permanent storage immediately.  You can use `fsync' when you need
-     to be sure your data has been permanently stored before
-     continuing.  (It is more efficient for the system to batch up
-     consecutive writes and do them all at once when convenient.
-     Normally they will always be written to disk within a minute or
-     less.)  Modern systems provide another function `fdatasync' which
-     guarantees integrity only for the file data and is therefore
-     faster.  You can use the `O_FSYNC' open mode to make `write' always
-     store the data to disk before returning; *note Operating Modes::.
-
-     In the case of an error, `write' returns -1.  The following
-     `errno' error conditions are defined for this function:
-
-    `EAGAIN'
-          Normally, `write' blocks until the write operation is
-          complete.  But if the `O_NONBLOCK' flag is set for the file
-          (*note Control Operations::), it returns immediately without
-          writing any data and reports this error.  An example of a
-          situation that might cause the process to block on output is
-          writing to a terminal device that supports flow control,
-          where output has been suspended by receipt of a STOP
-          character.
-
-          *Compatibility Note:* Most versions of BSD Unix use a
-          different error code for this: `EWOULDBLOCK'.  In the GNU C
-          Library, `EWOULDBLOCK' is an alias for `EAGAIN', so it
-          doesn't matter which name you use.
-
-          On some systems, writing a large amount of data from a
-          character special file can also fail with `EAGAIN' if the
-          kernel cannot find enough physical memory to lock down the
-          user's pages.  This is limited to devices that transfer with
-          direct memory access into the user's memory, which means it
-          does not include terminals, since they always use separate
-          buffers inside the kernel.  This problem does not arise on
-          GNU/Hurd systems.
-
-    `EBADF'
-          The FILEDES argument is not a valid file descriptor, or is
-          not open for writing.
-
-    `EFBIG'
-          The size of the file would become larger than the
-          implementation can support.
-
-    `EINTR'
-          The `write' operation was interrupted by a signal while it was
-          blocked waiting for completion.  A signal will not
-          necessarily cause `write' to return `EINTR'; it may instead
-          result in a successful `write' which writes fewer bytes than
-          requested.  *Note Interrupted Primitives::.
-
-    `EIO'
-          For many devices, and for disk files, this error code
-          indicates a hardware error.
-
-    `ENOSPC'
-          The device containing the file is full.
-
-    `EPIPE'
-          This error is returned when you try to write to a pipe or
-          FIFO that isn't open for reading by any process.  When this
-          happens, a `SIGPIPE' signal is also sent to the process; see
-          *note Signal Handling::.
-
-    `EINVAL'
-          In some systems, when writing to a character or block device,
-          position and size offsets must be aligned to a particular
-          block size.  This error indicates that the offsets were not
-          properly aligned.
-
-     Unless you have arranged to prevent `EINTR' failures, you should
-     check `errno' after each failing call to `write', and if the error
-     was `EINTR', you should simply repeat the call.  *Note Interrupted
-     Primitives::.  The easy way to do this is with the macro
-     `TEMP_FAILURE_RETRY', as follows:
-
-          nbytes = TEMP_FAILURE_RETRY (write (desc, buffer, count));
-
-     Please note that there is no function named `write64'.  This is not
-     necessary since this function does not directly modify or handle
-     the possibly wide file offset.  Since the kernel handles this state
-     internally the `write' function can be used for all cases.
-
-     This function is a cancellation point in multi-threaded programs.
-     This is a problem if the thread allocates some resources (like
-     memory, file descriptors, semaphores or whatever) at the time
-     `write' is called.  If the thread gets canceled these resources
-     stay allocated until the program ends.  To avoid this, calls to
-     `write' should be protected using cancellation handlers.
-
-     The `write' function is the underlying primitive for all of the
-     functions that write to streams, such as `fputc'.
-
- -- Function: ssize_t pwrite (int FILEDES, const void *BUFFER, size_t
-          SIZE, off_t OFFSET)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `pwrite' function is similar to the `write' function.  The
-     first three arguments are identical, and the return values and
-     error codes also correspond.
-
-     The difference is the fourth argument and its handling.  The data
-     block is not written to the current position of the file descriptor
-     `filedes'.  Instead the data is written to the file starting at
-     position OFFSET.  The position of the file descriptor itself is
-     not affected by the operation.  The value is the same as before
-     the call.
-
-     When the source file is compiled with `_FILE_OFFSET_BITS == 64' the
-     `pwrite' function is in fact `pwrite64' and the type `off_t' has
-     64 bits, which makes it possible to handle files up to 2^63 bytes
-     in length.
-
-     The return value of `pwrite' describes the number of written bytes.
-     In the error case it returns -1 like `write' does and the error
-     codes are also the same, with these additions:
-
-    `EINVAL'
-          The value given for OFFSET is negative and therefore illegal.
-
-    `ESPIPE'
-          The file descriptor FILEDES is associated with a pipe or a
-          FIFO and this device does not allow positioning of the file
-          pointer.
-
-     The function is an extension defined in the Unix Single
-     Specification version 2.
-
- -- Function: ssize_t pwrite64 (int FILEDES, const void *BUFFER, size_t
-          SIZE, off64_t OFFSET)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is similar to the `pwrite' function.  The difference
-     is that the OFFSET parameter is of type `off64_t' instead of
-     `off_t' which makes it possible on 32 bit machines to address
-     files larger than 2^31 bytes and up to 2^63 bytes.  The file
-     descriptor `filedes' must be opened using `open64' since otherwise
-     the large offsets possible with `off64_t' will lead to errors with
-     a descriptor in small file mode.
-
-     When the source file is compiled using `_FILE_OFFSET_BITS == 64'
-     on a 32 bit machine this function is actually available under the
-     name `pwrite' and so transparently replaces the 32 bit interface.
-
-
-File: libc.info,  Node: File Position Primitive,  Next: Descriptors and Streams,  Prev: I/O Primitives,  Up: Low-Level I/O
-
-13.3 Setting the File Position of a Descriptor
-==============================================
-
-Just as you can set the file position of a stream with `fseek', you can
-set the file position of a descriptor with `lseek'.  This specifies the
-position in the file for the next `read' or `write' operation.  *Note
-File Positioning::, for more information on the file position and what
-it means.
-
-   To read the current file position value from a descriptor, use
-`lseek (DESC, 0, SEEK_CUR)'.
-
- -- Function: off_t lseek (int FILEDES, off_t OFFSET, int WHENCE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `lseek' function is used to change the file position of the
-     file with descriptor FILEDES.
-
-     The WHENCE argument specifies how the OFFSET should be
-     interpreted, in the same way as for the `fseek' function, and it
-     must be one of the symbolic constants `SEEK_SET', `SEEK_CUR', or
-     `SEEK_END'.
-
-    `SEEK_SET'
-          Specifies that OFFSET is a count of characters from the
-          beginning of the file.
-
-    `SEEK_CUR'
-          Specifies that OFFSET is a count of characters from the
-          current file position.  This count may be positive or
-          negative.
-
-    `SEEK_END'
-          Specifies that OFFSET is a count of characters from the end of
-          the file.  A negative count specifies a position within the
-          current extent of the file; a positive count specifies a
-          position past the current end.  If you set the position past
-          the current end, and actually write data, you will extend the
-          file with zeros up to that position.
-
-     The return value from `lseek' is normally the resulting file
-     position, measured in bytes from the beginning of the file.  You
-     can use this feature together with `SEEK_CUR' to read the current
-     file position.
-
-     If you want to append to the file, setting the file position to the
-     current end of file with `SEEK_END' is not sufficient.  Another
-     process may write more data after you seek but before you write,
-     extending the file so the position you write onto clobbers their
-     data.  Instead, use the `O_APPEND' operating mode; *note Operating
-     Modes::.
-
-     You can set the file position past the current end of the file.
-     This does not by itself make the file longer; `lseek' never
-     changes the file.  But subsequent output at that position will
-     extend the file.  Characters between the previous end of file and
-     the new position are filled with zeros.  Extending the file in
-     this way can create a "hole": the blocks of zeros are not actually
-     allocated on disk, so the file takes up less space than it appears
-     to; it is then called a "sparse file".  
-
-     If the file position cannot be changed, or the operation is in
-     some way invalid, `lseek' returns a value of -1.  The following
-     `errno' error conditions are defined for this function:
-
-    `EBADF'
-          The FILEDES is not a valid file descriptor.
-
-    `EINVAL'
-          The WHENCE argument value is not valid, or the resulting file
-          offset is not valid.  A file offset is invalid.
-
-    `ESPIPE'
-          The FILEDES corresponds to an object that cannot be
-          positioned, such as a pipe, FIFO or terminal device.
-          (POSIX.1 specifies this error only for pipes and FIFOs, but
-          on GNU systems, you always get `ESPIPE' if the object is not
-          seekable.)
-
-     When the source file is compiled with `_FILE_OFFSET_BITS == 64' the
-     `lseek' function is in fact `lseek64' and the type `off_t' has 64
-     bits which makes it possible to handle files up to 2^63 bytes in
-     length.
-
-     This function is a cancellation point in multi-threaded programs.
-     This is a problem if the thread allocates some resources (like
-     memory, file descriptors, semaphores or whatever) at the time
-     `lseek' is called.  If the thread gets canceled these resources
-     stay allocated until the program ends.  To avoid this calls to
-     `lseek' should be protected using cancellation handlers.
-
-     The `lseek' function is the underlying primitive for the `fseek',
-     `fseeko', `ftell', `ftello' and `rewind' functions, which operate
-     on streams instead of file descriptors.
-
- -- Function: off64_t lseek64 (int FILEDES, off64_t OFFSET, int WHENCE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is similar to the `lseek' function.  The difference
-     is that the OFFSET parameter is of type `off64_t' instead of
-     `off_t' which makes it possible on 32 bit machines to address
-     files larger than 2^31 bytes and up to 2^63 bytes.  The file
-     descriptor `filedes' must be opened using `open64' since otherwise
-     the large offsets possible with `off64_t' will lead to errors with
-     a descriptor in small file mode.
-
-     When the source file is compiled with `_FILE_OFFSET_BITS == 64' on
-     a 32 bits machine this function is actually available under the
-     name `lseek' and so transparently replaces the 32 bit interface.
-
-   You can have multiple descriptors for the same file if you open the
-file more than once, or if you duplicate a descriptor with `dup'.
-Descriptors that come from separate calls to `open' have independent
-file positions; using `lseek' on one descriptor has no effect on the
-other.  For example,
-
-     {
-       int d1, d2;
-       char buf[4];
-       d1 = open ("foo", O_RDONLY);
-       d2 = open ("foo", O_RDONLY);
-       lseek (d1, 1024, SEEK_SET);
-       read (d2, buf, 4);
-     }
-
-will read the first four characters of the file `foo'.  (The
-error-checking code necessary for a real program has been omitted here
-for brevity.)
-
-   By contrast, descriptors made by duplication share a common file
-position with the original descriptor that was duplicated.  Anything
-which alters the file position of one of the duplicates, including
-reading or writing data, affects all of them alike.  Thus, for example,
-
-     {
-       int d1, d2, d3;
-       char buf1[4], buf2[4];
-       d1 = open ("foo", O_RDONLY);
-       d2 = dup (d1);
-       d3 = dup (d2);
-       lseek (d3, 1024, SEEK_SET);
-       read (d1, buf1, 4);
-       read (d2, buf2, 4);
-     }
-
-will read four characters starting with the 1024'th character of `foo',
-and then four more characters starting with the 1028'th character.
-
- -- Data Type: off_t
-     This is a signed integer type used to represent file sizes.  In
-     the GNU C Library, this type is no narrower than `int'.
-
-     If the source is compiled with `_FILE_OFFSET_BITS == 64' this type
-     is transparently replaced by `off64_t'.
-
- -- Data Type: off64_t
-     This type is used similar to `off_t'.  The difference is that even
-     on 32 bit machines, where the `off_t' type would have 32 bits,
-     `off64_t' has 64 bits and so is able to address files up to 2^63
-     bytes in length.
-
-     When compiling with `_FILE_OFFSET_BITS == 64' this type is
-     available under the name `off_t'.
-
-   These aliases for the `SEEK_...' constants exist for the sake of
-compatibility with older BSD systems.  They are defined in two
-different header files: `fcntl.h' and `sys/file.h'.
-
-`L_SET'
-     An alias for `SEEK_SET'.
-
-`L_INCR'
-     An alias for `SEEK_CUR'.
-
-`L_XTND'
-     An alias for `SEEK_END'.
-
-
-File: libc.info,  Node: Descriptors and Streams,  Next: Stream/Descriptor Precautions,  Prev: File Position Primitive,  Up: Low-Level I/O
-
-13.4 Descriptors and Streams
-============================
-
-Given an open file descriptor, you can create a stream for it with the
-`fdopen' function.  You can get the underlying file descriptor for an
-existing stream with the `fileno' function.  These functions are
-declared in the header file `stdio.h'.  
-
- -- Function: FILE * fdopen (int FILEDES, const char *OPENTYPE)
-     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe mem lock
-     | *Note POSIX Safety Concepts::.
-
-     The `fdopen' function returns a new stream for the file descriptor
-     FILEDES.
-
-     The OPENTYPE argument is interpreted in the same way as for the
-     `fopen' function (*note Opening Streams::), except that the `b'
-     option is not permitted; this is because GNU systems make no
-     distinction between text and binary files.  Also, `"w"' and `"w+"'
-     do not cause truncation of the file; these have an effect only
-     when opening a file, and in this case the file has already been
-     opened.  You must make sure that the OPENTYPE argument matches the
-     actual mode of the open file descriptor.
-
-     The return value is the new stream.  If the stream cannot be
-     created (for example, if the modes for the file indicated by the
-     file descriptor do not permit the access specified by the OPENTYPE
-     argument), a null pointer is returned instead.
-
-     In some other systems, `fdopen' may fail to detect that the modes
-     for file descriptor do not permit the access specified by
-     `opentype'.  The GNU C Library always checks for this.
-
-   For an example showing the use of the `fdopen' function, see *note
-Creating a Pipe::.
-
- -- Function: int fileno (FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function returns the file descriptor associated with the
-     stream STREAM.  If an error is detected (for example, if the STREAM
-     is not valid) or if STREAM does not do I/O to a file, `fileno'
-     returns -1.
-
- -- Function: int fileno_unlocked (FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `fileno_unlocked' function is equivalent to the `fileno'
-     function except that it does not implicitly lock the stream if the
-     state is `FSETLOCKING_INTERNAL'.
-
-     This function is a GNU extension.
-
-   There are also symbolic constants defined in `unistd.h' for the file
-descriptors belonging to the standard streams `stdin', `stdout', and
-`stderr'; see *note Standard Streams::.  
-
-`STDIN_FILENO'
-     This macro has value `0', which is the file descriptor for
-     standard input.  
-
-`STDOUT_FILENO'
-     This macro has value `1', which is the file descriptor for
-     standard output.  
-
-`STDERR_FILENO'
-     This macro has value `2', which is the file descriptor for
-     standard error output.
-   
-
-File: libc.info,  Node: Stream/Descriptor Precautions,  Next: Scatter-Gather,  Prev: Descriptors and Streams,  Up: Low-Level I/O
-
-13.5 Dangers of Mixing Streams and Descriptors
-==============================================
-
-You can have multiple file descriptors and streams (let's call both
-streams and descriptors "channels" for short) connected to the same
-file, but you must take care to avoid confusion between channels.  There
-are two cases to consider: "linked" channels that share a single file
-position value, and "independent" channels that have their own file
-positions.
-
-   It's best to use just one channel in your program for actual data
-transfer to any given file, except when all the access is for input.
-For example, if you open a pipe (something you can only do at the file
-descriptor level), either do all I/O with the descriptor, or construct a
-stream from the descriptor with `fdopen' and then do all I/O with the
-stream.
-
-* Menu:
-
-* Linked Channels::	   Dealing with channels sharing a file position.
-* Independent Channels::   Dealing with separately opened, unlinked channels.
-* Cleaning Streams::	   Cleaning a stream makes it safe to use
-                            another channel.
-
-
-File: libc.info,  Node: Linked Channels,  Next: Independent Channels,  Up: Stream/Descriptor Precautions
-
-13.5.1 Linked Channels
-----------------------
-
-Channels that come from a single opening share the same file position;
-we call them "linked" channels.  Linked channels result when you make a
-stream from a descriptor using `fdopen', when you get a descriptor from
-a stream with `fileno', when you copy a descriptor with `dup' or
-`dup2', and when descriptors are inherited during `fork'.  For files
-that don't support random access, such as terminals and pipes, _all_
-channels are effectively linked.  On random-access files, all
-append-type output streams are effectively linked to each other.
-
-   If you have been using a stream for I/O (or have just opened the
-stream), and you want to do I/O using another channel (either a stream
-or a descriptor) that is linked to it, you must first "clean up" the
-stream that you have been using.  *Note Cleaning Streams::.
-
-   Terminating a process, or executing a new program in the process,
-destroys all the streams in the process.  If descriptors linked to these
-streams persist in other processes, their file positions become
-undefined as a result.  To prevent this, you must clean up the streams
-before destroying them.
-
-
-File: libc.info,  Node: Independent Channels,  Next: Cleaning Streams,  Prev: Linked Channels,  Up: Stream/Descriptor Precautions
-
-13.5.2 Independent Channels
----------------------------
-
-When you open channels (streams or descriptors) separately on a seekable
-file, each channel has its own file position.  These are called
-"independent channels".
-
-   The system handles each channel independently.  Most of the time,
-this is quite predictable and natural (especially for input): each
-channel can read or write sequentially at its own place in the file.
-However, if some of the channels are streams, you must take these
-precautions:
-
-   * You should clean an output stream after use, before doing anything
-     else that might read or write from the same part of the file.
-
-   * You should clean an input stream before reading data that may have
-     been modified using an independent channel.  Otherwise, you might
-     read obsolete data that had been in the stream's buffer.
-
-   If you do output to one channel at the end of the file, this will
-certainly leave the other independent channels positioned somewhere
-before the new end.  You cannot reliably set their file positions to the
-new end of file before writing, because the file can always be extended
-by another process between when you set the file position and when you
-write the data.  Instead, use an append-type descriptor or stream; they
-always output at the current end of the file.  In order to make the
-end-of-file position accurate, you must clean the output channel you
-were using, if it is a stream.
-
-   It's impossible for two channels to have separate file pointers for a
-file that doesn't support random access.  Thus, channels for reading or
-writing such files are always linked, never independent.  Append-type
-channels are also always linked.  For these channels, follow the rules
-for linked channels; see *note Linked Channels::.
-
-
-File: libc.info,  Node: Cleaning Streams,  Prev: Independent Channels,  Up: Stream/Descriptor Precautions
-
-13.5.3 Cleaning Streams
------------------------
-
-You can use `fflush' to clean a stream in most cases.
-
-   You can skip the `fflush' if you know the stream is already clean.
-A stream is clean whenever its buffer is empty.  For example, an
-unbuffered stream is always clean.  An input stream that is at
-end-of-file is clean.  A line-buffered stream is clean when the last
-character output was a newline.  However, a just-opened input stream
-might not be clean, as its input buffer might not be empty.
-
-   There is one case in which cleaning a stream is impossible on most
-systems.  This is when the stream is doing input from a file that is not
-random-access.  Such streams typically read ahead, and when the file is
-not random access, there is no way to give back the excess data already
-read.  When an input stream reads from a random-access file, `fflush'
-does clean the stream, but leaves the file pointer at an unpredictable
-place; you must set the file pointer before doing any further I/O.
-
-   Closing an output-only stream also does `fflush', so this is a valid
-way of cleaning an output stream.
-
-   You need not clean a stream before using its descriptor for control
-operations such as setting terminal modes; these operations don't affect
-the file position and are not affected by it.  You can use any
-descriptor for these operations, and all channels are affected
-simultaneously.  However, text already "output" to a stream but still
-buffered by the stream will be subject to the new terminal modes when
-subsequently flushed.  To make sure "past" output is covered by the
-terminal settings that were in effect at the time, flush the output
-streams for that terminal before setting the modes.  *Note Terminal
-Modes::.
-
-
-File: libc.info,  Node: Scatter-Gather,  Next: Memory-mapped I/O,  Prev: Stream/Descriptor Precautions,  Up: Low-Level I/O
-
-13.6 Fast Scatter-Gather I/O
-============================
-
-Some applications may need to read or write data to multiple buffers,
-which are separated in memory.  Although this can be done easily enough
-with multiple calls to `read' and `write', it is inefficient because
-there is overhead associated with each kernel call.
-
-   Instead, many platforms provide special high-speed primitives to
-perform these "scatter-gather" operations in a single kernel call.  The
-GNU C Library will provide an emulation on any system that lacks these
-primitives, so they are not a portability threat.  They are defined in
-`sys/uio.h'.
-
-   These functions are controlled with arrays of `iovec' structures,
-which describe the location and size of each buffer.
-
- -- Data Type: struct iovec
-     The `iovec' structure describes a buffer. It contains two fields:
-
-    `void *iov_base'
-          Contains the address of a buffer.
-
-    `size_t iov_len'
-          Contains the length of the buffer.
-
-
- -- Function: ssize_t readv (int FILEDES, const struct iovec *VECTOR,
-          int COUNT)
-     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
-     POSIX Safety Concepts::.
-
-     The `readv' function reads data from FILEDES and scatters it into
-     the buffers described in VECTOR, which is taken to be COUNT
-     structures long.  As each buffer is filled, data is sent to the
-     next.
-
-     Note that `readv' is not guaranteed to fill all the buffers.  It
-     may stop at any point, for the same reasons `read' would.
-
-     The return value is a count of bytes (_not_ buffers) read, 0
-     indicating end-of-file, or -1 indicating an error.  The possible
-     errors are the same as in `read'.
-
-
- -- Function: ssize_t writev (int FILEDES, const struct iovec *VECTOR,
-          int COUNT)
-     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
-     POSIX Safety Concepts::.
-
-     The `writev' function gathers data from the buffers described in
-     VECTOR, which is taken to be COUNT structures long, and writes
-     them to `filedes'.  As each buffer is written, it moves on to the
-     next.
-
-     Like `readv', `writev' may stop midstream under the same
-     conditions `write' would.
-
-     The return value is a count of bytes written, or -1 indicating an
-     error.  The possible errors are the same as in `write'.
-
-
-   Note that if the buffers are small (under about 1kB), high-level
-streams may be easier to use than these functions.  However, `readv' and
-`writev' are more efficient when the individual buffers themselves (as
-opposed to the total output), are large.  In that case, a high-level
-stream would not be able to cache the data effectively.
-
-
-File: libc.info,  Node: Memory-mapped I/O,  Next: Waiting for I/O,  Prev: Scatter-Gather,  Up: Low-Level I/O
-
-13.7 Memory-mapped I/O
-======================
-
-On modern operating systems, it is possible to "mmap" (pronounced
-"em-map") a file to a region of memory.  When this is done, the file can
-be accessed just like an array in the program.
-
-   This is more efficient than `read' or `write', as only the regions
-of the file that a program actually accesses are loaded.  Accesses to
-not-yet-loaded parts of the mmapped region are handled in the same way
-as swapped out pages.
-
-   Since mmapped pages can be stored back to their file when physical
-memory is low, it is possible to mmap files orders of magnitude larger
-than both the physical memory _and_ swap space.  The only limit is
-address space.  The theoretical limit is 4GB on a 32-bit machine -
-however, the actual limit will be smaller since some areas will be
-reserved for other purposes.  If the LFS interface is used the file size
-on 32-bit systems is not limited to 2GB (offsets are signed which
-reduces the addressable area of 4GB by half); the full 64-bit are
-available.
-
-   Memory mapping only works on entire pages of memory.  Thus, addresses
-for mapping must be page-aligned, and length values will be rounded up.
-To determine the size of a page the machine uses one should use
-
-     size_t page_size = (size_t) sysconf (_SC_PAGESIZE);
-
-These functions are declared in `sys/mman.h'.
-
- -- Function: void * mmap (void *ADDRESS, size_t LENGTH, int PROTECT,
-          int FLAGS, int FILEDES, off_t OFFSET)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `mmap' function creates a new mapping, connected to bytes
-     (OFFSET) to (OFFSET + LENGTH - 1) in the file open on FILEDES.  A
-     new reference for the file specified by FILEDES is created, which
-     is not removed by closing the file.
-
-     ADDRESS gives a preferred starting address for the mapping.
-     `NULL' expresses no preference. Any previous mapping at that
-     address is automatically removed. The address you give may still be
-     changed, unless you use the `MAP_FIXED' flag.
-
-     PROTECT contains flags that control what kind of access is
-     permitted.  They include `PROT_READ', `PROT_WRITE', and
-     `PROT_EXEC', which permit reading, writing, and execution,
-     respectively.  Inappropriate access will cause a segfault (*note
-     Program Error Signals::).
-
-     Note that most hardware designs cannot support write permission
-     without read permission, and many do not distinguish read and
-     execute permission.  Thus, you may receive wider permissions than
-     you ask for, and mappings of write-only files may be denied even
-     if you do not use `PROT_READ'.
-
-     FLAGS contains flags that control the nature of the map.  One of
-     `MAP_SHARED' or `MAP_PRIVATE' must be specified.
-
-     They include:
-
-    `MAP_PRIVATE'
-          This specifies that writes to the region should never be
-          written back to the attached file.  Instead, a copy is made
-          for the process, and the region will be swapped normally if
-          memory runs low.  No other process will see the changes.
-
-          Since private mappings effectively revert to ordinary memory
-          when written to, you must have enough virtual memory for a
-          copy of the entire mmapped region if you use this mode with
-          `PROT_WRITE'.
-
-    `MAP_SHARED'
-          This specifies that writes to the region will be written back
-          to the file.  Changes made will be shared immediately with
-          other processes mmaping the same file.
-
-          Note that actual writing may take place at any time.  You
-          need to use `msync', described below, if it is important that
-          other processes using conventional I/O get a consistent view
-          of the file.
-
-    `MAP_FIXED'
-          This forces the system to use the exact mapping address
-          specified in ADDRESS and fail if it can't.
-
-    `MAP_ANONYMOUS'
-    `MAP_ANON'
-          This flag tells the system to create an anonymous mapping,
-          not connected to a file.  FILEDES and OFF are ignored, and
-          the region is initialized with zeros.
-
-          Anonymous maps are used as the basic primitive to extend the
-          heap on some systems.  They are also useful to share data
-          between multiple tasks without creating a file.
-
-          On some systems using private anonymous mmaps is more
-          efficient than using `malloc' for large blocks.  This is not
-          an issue with the GNU C Library, as the included `malloc'
-          automatically uses `mmap' where appropriate.
-
-
-     `mmap' returns the address of the new mapping, or `MAP_FAILED' for
-     an error.
-
-     Possible errors include:
-
-    `EINVAL'
-          Either ADDRESS was unusable, or inconsistent FLAGS were given.
-
-    `EACCES'
-          FILEDES was not open for the type of access specified in
-          PROTECT.
-
-    `ENOMEM'
-          Either there is not enough memory for the operation, or the
-          process is out of address space.
-
-    `ENODEV'
-          This file is of a type that doesn't support mapping.
-
-    `ENOEXEC'
-          The file is on a filesystem that doesn't support mapping.
-
-
-
- -- Function: void * mmap64 (void *ADDRESS, size_t LENGTH, int PROTECT,
-          int FLAGS, int FILEDES, off64_t OFFSET)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `mmap64' function is equivalent to the `mmap' function but the
-     OFFSET parameter is of type `off64_t'.  On 32-bit systems this
-     allows the file associated with the FILEDES descriptor to be
-     larger than 2GB.  FILEDES must be a descriptor returned from a
-     call to `open64' or `fopen64' and `freopen64' where the descriptor
-     is retrieved with `fileno'.
-
-     When the sources are translated with `_FILE_OFFSET_BITS == 64' this
-     function is actually available under the name `mmap'.  I.e., the
-     new, extended API using 64 bit file sizes and offsets transparently
-     replaces the old API.
-
- -- Function: int munmap (void *ADDR, size_t LENGTH)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `munmap' removes any memory maps from (ADDR) to (ADDR + LENGTH).
-     LENGTH should be the length of the mapping.
-
-     It is safe to unmap multiple mappings in one command, or include
-     unmapped space in the range.  It is also possible to unmap only
-     part of an existing mapping.  However, only entire pages can be
-     removed.  If LENGTH is not an even number of pages, it will be
-     rounded up.
-
-     It returns 0 for success and -1 for an error.
-
-     One error is possible:
-
-    `EINVAL'
-          The memory range given was outside the user mmap range or
-          wasn't page aligned.
-
-
-
- -- Function: int msync (void *ADDRESS, size_t LENGTH, int FLAGS)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     When using shared mappings, the kernel can write the file at any
-     time before the mapping is removed.  To be certain data has
-     actually been written to the file and will be accessible to
-     non-memory-mapped I/O, it is necessary to use this function.
-
-     It operates on the region ADDRESS to (ADDRESS + LENGTH).  It may
-     be used on part of a mapping or multiple mappings, however the
-     region given should not contain any unmapped space.
-
-     FLAGS can contain some options:
-
-    `MS_SYNC'
-          This flag makes sure the data is actually written _to disk_.
-          Normally `msync' only makes sure that accesses to a file with
-          conventional I/O reflect the recent changes.
-
-    `MS_ASYNC'
-          This tells `msync' to begin the synchronization, but not to
-          wait for it to complete.
-
-
-     `msync' returns 0 for success and -1 for error.  Errors include:
-
-    `EINVAL'
-          An invalid region was given, or the FLAGS were invalid.
-
-    `EFAULT'
-          There is no existing mapping in at least part of the given
-          region.
-
-
-
- -- Function: void * mremap (void *ADDRESS, size_t LENGTH, size_t
-          NEW_LENGTH, int FLAG)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function can be used to change the size of an existing memory
-     area. ADDRESS and LENGTH must cover a region entirely mapped in
-     the same `mmap' statement. A new mapping with the same
-     characteristics will be returned with the length NEW_LENGTH.
-
-     One option is possible, `MREMAP_MAYMOVE'. If it is given in FLAGS,
-     the system may remove the existing mapping and create a new one of
-     the desired length in another location.
-
-     The address of the resulting mapping is returned, or -1. Possible
-     error codes include:
-
-    `EFAULT'
-          There is no existing mapping in at least part of the original
-          region, or the region covers two or more distinct mappings.
-
-    `EINVAL'
-          The address given is misaligned or inappropriate.
-
-    `EAGAIN'
-          The region has pages locked, and if extended it would exceed
-          the process's resource limit for locked pages.  *Note Limits
-          on Resources::.
-
-    `ENOMEM'
-          The region is private writable, and insufficient virtual
-          memory is available to extend it.  Also, this error will
-          occur if `MREMAP_MAYMOVE' is not given and the extension
-          would collide with another mapped region.
-
-
-   This function is only available on a few systems.  Except for
-performing optional optimizations one should not rely on this function.
-
-   Not all file descriptors may be mapped.  Sockets, pipes, and most
-devices only allow sequential access and do not fit into the mapping
-abstraction.  In addition, some regular files may not be mmapable, and
-older kernels may not support mapping at all.  Thus, programs using
-`mmap' should have a fallback method to use should it fail. *Note Mmap:
-(standards)Mmap.
-
- -- Function: int madvise (void *ADDR, size_t LENGTH, int ADVICE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function can be used to provide the system with ADVICE about
-     the intended usage patterns of the memory region starting at ADDR
-     and extending LENGTH bytes.
-
-     The valid BSD values for ADVICE are:
-
-    `MADV_NORMAL'
-          The region should receive no further special treatment.
-
-    `MADV_RANDOM'
-          The region will be accessed via random page references. The
-          kernel should page-in the minimal number of pages for each
-          page fault.
-
-    `MADV_SEQUENTIAL'
-          The region will be accessed via sequential page references.
-          This may cause the kernel to aggressively read-ahead,
-          expecting further sequential references after any page fault
-          within this region.
-
-    `MADV_WILLNEED'
-          The region will be needed.  The pages within this region may
-          be pre-faulted in by the kernel.
-
-    `MADV_DONTNEED'
-          The region is no longer needed.  The kernel may free these
-          pages, causing any changes to the pages to be lost, as well
-          as swapped out pages to be discarded.
-
-
-     The POSIX names are slightly different, but with the same meanings:
-
-    `POSIX_MADV_NORMAL'
-          This corresponds with BSD's `MADV_NORMAL'.
-
-    `POSIX_MADV_RANDOM'
-          This corresponds with BSD's `MADV_RANDOM'.
-
-    `POSIX_MADV_SEQUENTIAL'
-          This corresponds with BSD's `MADV_SEQUENTIAL'.
-
-    `POSIX_MADV_WILLNEED'
-          This corresponds with BSD's `MADV_WILLNEED'.
-
-    `POSIX_MADV_DONTNEED'
-          This corresponds with BSD's `MADV_DONTNEED'.
-
-
-     `madvise' returns 0 for success and -1 for error.  Errors include:
-    `EINVAL'
-          An invalid region was given, or the ADVICE was invalid.
-
-    `EFAULT'
-          There is no existing mapping in at least part of the given
-          region.
-
-
- -- Function: int shm_open (const char *NAME, int OFLAG, mode_t MODE)
-     Preliminary: | MT-Safe locale | AS-Unsafe init heap lock |
-     AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
-
-     This function returns a file descriptor that can be used to
-     allocate shared memory via mmap. Unrelated processes can use same
-     NAME to create or open existing shared memory objects.
-
-     A NAME argument specifies the shared memory object to be opened.
-     In the GNU C Library it must be a string smaller than `NAME_MAX'
-     bytes starting with an optional slash but containing no other
-     slashes.
-
-     The semantics of OFLAG and MODE arguments is same as in `open'.
-
-     `shm_open' returns the file descriptor on success or -1 on error.
-     On failure `errno' is set.
-
- -- Function: int shm_unlink (const char *NAME)
-     Preliminary: | MT-Safe locale | AS-Unsafe init heap lock |
-     AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
-
-     This function is inverse of `shm_open' and removes the object with
-     the given NAME previously created by `shm_open'.
-
-     `shm_unlink' returns 0 on success or -1 on error.  On failure
-     `errno' is set.
-
-
-File: libc.info,  Node: Waiting for I/O,  Next: Synchronizing I/O,  Prev: Memory-mapped I/O,  Up: Low-Level I/O
-
-13.8 Waiting for Input or Output
-================================
-
-Sometimes a program needs to accept input on multiple input channels
-whenever input arrives.  For example, some workstations may have devices
-such as a digitizing tablet, function button box, or dial box that are
-connected via normal asynchronous serial interfaces; good user interface
-style requires responding immediately to input on any device.  Another
-example is a program that acts as a server to several other processes
-via pipes or sockets.
-
-   You cannot normally use `read' for this purpose, because this blocks
-the program until input is available on one particular file descriptor;
-input on other channels won't wake it up.  You could set nonblocking
-mode and poll each file descriptor in turn, but this is very
-inefficient.
-
-   A better solution is to use the `select' function.  This blocks the
-program until input or output is ready on a specified set of file
-descriptors, or until a timer expires, whichever comes first.  This
-facility is declared in the header file `sys/types.h'.  
-
-   In the case of a server socket (*note Listening::), we say that
-"input" is available when there are pending connections that could be
-accepted (*note Accepting Connections::).  `accept' for server sockets
-blocks and interacts with `select' just as `read' does for normal input.
-
-   The file descriptor sets for the `select' function are specified as
-`fd_set' objects.  Here is the description of the data type and some
-macros for manipulating these objects.
-
- -- Data Type: fd_set
-     The `fd_set' data type represents file descriptor sets for the
-     `select' function.  It is actually a bit array.
-
- -- Macro: int FD_SETSIZE
-     The value of this macro is the maximum number of file descriptors
-     that a `fd_set' object can hold information about.  On systems
-     with a fixed maximum number, `FD_SETSIZE' is at least that number.
-     On some systems, including GNU, there is no absolute limit on the
-     number of descriptors open, but this macro still has a constant
-     value which controls the number of bits in an `fd_set'; if you get
-     a file descriptor with a value as high as `FD_SETSIZE', you cannot
-     put that descriptor into an `fd_set'.
-
- -- Macro: void FD_ZERO (fd_set *SET)
-     Preliminary: | MT-Safe race:set | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     This macro initializes the file descriptor set SET to be the empty
-     set.
-
- -- Macro: void FD_SET (int FILEDES, fd_set *SET)
-     Preliminary: | MT-Safe race:set | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     This macro adds FILEDES to the file descriptor set SET.
-
-     The FILEDES parameter must not have side effects since it is
-     evaluated more than once.
-
- -- Macro: void FD_CLR (int FILEDES, fd_set *SET)
-     Preliminary: | MT-Safe race:set | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     This macro removes FILEDES from the file descriptor set SET.
-
-     The FILEDES parameter must not have side effects since it is
-     evaluated more than once.
-
- -- Macro: int FD_ISSET (int FILEDES, const fd_set *SET)
-     Preliminary: | MT-Safe race:set | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     This macro returns a nonzero value (true) if FILEDES is a member
-     of the file descriptor set SET, and zero (false) otherwise.
-
-     The FILEDES parameter must not have side effects since it is
-     evaluated more than once.
-
-   Next, here is the description of the `select' function itself.
-
- -- Function: int select (int NFDS, fd_set *READ-FDS, fd_set
-          *WRITE-FDS, fd_set *EXCEPT-FDS, struct timeval *TIMEOUT)
-     Preliminary: | MT-Safe race:read-fds race:write-fds race:except-fds
-     | AS-Safe | AC-Safe | *Note POSIX Safety Concepts::.
-
-     The `select' function blocks the calling process until there is
-     activity on any of the specified sets of file descriptors, or
-     until the timeout period has expired.
-
-     The file descriptors specified by the READ-FDS argument are
-     checked to see if they are ready for reading; the WRITE-FDS file
-     descriptors are checked to see if they are ready for writing; and
-     the EXCEPT-FDS file descriptors are checked for exceptional
-     conditions.  You can pass a null pointer for any of these
-     arguments if you are not interested in checking for that kind of
-     condition.
-
-     A file descriptor is considered ready for reading if a `read' call
-     will not block.  This usually includes the read offset being at
-     the end of the file or there is an error to report.  A server
-     socket is considered ready for reading if there is a pending
-     connection which can be accepted with `accept'; *note Accepting
-     Connections::.  A client socket is ready for writing when its
-     connection is fully established; *note Connecting::.
-
-     "Exceptional conditions" does not mean errors--errors are reported
-     immediately when an erroneous system call is executed, and do not
-     constitute a state of the descriptor.  Rather, they include
-     conditions such as the presence of an urgent message on a socket.
-     (*Note Sockets::, for information on urgent messages.)
-
-     The `select' function checks only the first NFDS file descriptors.
-     The usual thing is to pass `FD_SETSIZE' as the value of this
-     argument.
-
-     The TIMEOUT specifies the maximum time to wait.  If you pass a
-     null pointer for this argument, it means to block indefinitely
-     until one of the file descriptors is ready.  Otherwise, you should
-     provide the time in `struct timeval' format; see *note
-     High-Resolution Calendar::.  Specify zero as the time (a `struct
-     timeval' containing all zeros) if you want to find out which
-     descriptors are ready without waiting if none are ready.
-
-     The normal return value from `select' is the total number of ready
-     file descriptors in all of the sets.  Each of the argument sets is
-     overwritten with information about the descriptors that are ready
-     for the corresponding operation.  Thus, to see if a particular
-     descriptor DESC has input, use `FD_ISSET (DESC, READ-FDS)' after
-     `select' returns.
-
-     If `select' returns because the timeout period expires, it returns
-     a value of zero.
-
-     Any signal will cause `select' to return immediately.  So if your
-     program uses signals, you can't rely on `select' to keep waiting
-     for the full time specified.  If you want to be sure of waiting
-     for a particular amount of time, you must check for `EINTR' and
-     repeat the `select' with a newly calculated timeout based on the
-     current time.  See the example below.  See also *note Interrupted
-     Primitives::.
-
-     If an error occurs, `select' returns `-1' and does not modify the
-     argument file descriptor sets.  The following `errno' error
-     conditions are defined for this function:
-
-    `EBADF'
-          One of the file descriptor sets specified an invalid file
-          descriptor.
-
-    `EINTR'
-          The operation was interrupted by a signal.  *Note Interrupted
-          Primitives::.
-
-    `EINVAL'
-          The TIMEOUT argument is invalid; one of the components is
-          negative or too large.
-
-   *Portability Note:*  The `select' function is a BSD Unix feature.
-
-   Here is an example showing how you can use `select' to establish a
-timeout period for reading from a file descriptor.  The `input_timeout'
-function blocks the calling process until input is available on the
-file descriptor, or until the timeout period expires.
-
-
-     #include <errno.h>
-     #include <stdio.h>
-     #include <unistd.h>
-     #include <sys/types.h>
-     #include <sys/time.h>
-
-     int
-     input_timeout (int filedes, unsigned int seconds)
-     {
-       fd_set set;
-       struct timeval timeout;
-
-       /* Initialize the file descriptor set. */
-       FD_ZERO (&set);
-       FD_SET (filedes, &set);
-
-       /* Initialize the timeout data structure. */
-       timeout.tv_sec = seconds;
-       timeout.tv_usec = 0;
-
-       /* `select' returns 0 if timeout, 1 if input available, -1 if error. */
-       return TEMP_FAILURE_RETRY (select (FD_SETSIZE,
-                                          &set, NULL, NULL,
-                                          &timeout));
-     }
-
-     int
-     main (void)
-     {
-       fprintf (stderr, "select returned %d.\n",
-                input_timeout (STDIN_FILENO, 5));
-       return 0;
-     }
-
-   There is another example showing the use of `select' to multiplex
-input from multiple sockets in *note Server Example::.
-
-
-File: libc.info,  Node: Synchronizing I/O,  Next: Asynchronous I/O,  Prev: Waiting for I/O,  Up: Low-Level I/O
-
-13.9 Synchronizing I/O operations
-=================================
-
-In most modern operating systems, the normal I/O operations are not
-executed synchronously.  I.e., even if a `write' system call returns,
-this does not mean the data is actually written to the media, e.g., the
-disk.
-
-   In situations where synchronization points are necessary, you can use
-special functions which ensure that all operations finish before they
-return.
-
- -- Function: void sync (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     A call to this function will not return as long as there is data
-     which has not been written to the device.  All dirty buffers in
-     the kernel will be written and so an overall consistent system can
-     be achieved (if no other process in parallel writes data).
-
-     A prototype for `sync' can be found in `unistd.h'.
-
-   Programs more often want to ensure that data written to a given file
-is committed, rather than all data in the system.  For this, `sync' is
-overkill.
-
- -- Function: int fsync (int FILDES)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `fsync' function can be used to make sure all data associated
-     with the open file FILDES is written to the device associated with
-     the descriptor.  The function call does not return unless all
-     actions have finished.
-
-     A prototype for `fsync' can be found in `unistd.h'.
-
-     This function is a cancellation point in multi-threaded programs.
-     This is a problem if the thread allocates some resources (like
-     memory, file descriptors, semaphores or whatever) at the time
-     `fsync' is called.  If the thread gets canceled these resources
-     stay allocated until the program ends.  To avoid this, calls to
-     `fsync' should be protected using cancellation handlers.
-
-     The return value of the function is zero if no error occurred.
-     Otherwise it is -1 and the global variable ERRNO is set to the
-     following values:
-    `EBADF'
-          The descriptor FILDES is not valid.
-
-    `EINVAL'
-          No synchronization is possible since the system does not
-          implement this.
-
-   Sometimes it is not even necessary to write all data associated with
-a file descriptor.  E.g., in database files which do not change in size
-it is enough to write all the file content data to the device.
-Meta-information, like the modification time etc., are not that
-important and leaving such information uncommitted does not prevent a
-successful recovering of the file in case of a problem.
-
- -- Function: int fdatasync (int FILDES)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     When a call to the `fdatasync' function returns, it is ensured
-     that all of the file data is written to the device.  For all
-     pending I/O operations, the parts guaranteeing data integrity
-     finished.
-
-     Not all systems implement the `fdatasync' operation.  On systems
-     missing this functionality `fdatasync' is emulated by a call to
-     `fsync' since the performed actions are a superset of those
-     required by `fdatasync'.
-
-     The prototype for `fdatasync' is in `unistd.h'.
-
-     The return value of the function is zero if no error occurred.
-     Otherwise it is -1 and the global variable ERRNO is set to the
-     following values:
-    `EBADF'
-          The descriptor FILDES is not valid.
-
-    `EINVAL'
-          No synchronization is possible since the system does not
-          implement this.
-
-
-File: libc.info,  Node: Asynchronous I/O,  Next: Control Operations,  Prev: Synchronizing I/O,  Up: Low-Level I/O
-
-13.10 Perform I/O Operations in Parallel
-========================================
-
-The POSIX.1b standard defines a new set of I/O operations which can
-significantly reduce the time an application spends waiting at I/O.  The
-new functions allow a program to initiate one or more I/O operations and
-then immediately resume normal work while the I/O operations are
-executed in parallel.  This functionality is available if the
-`unistd.h' file defines the symbol `_POSIX_ASYNCHRONOUS_IO'.
-
-   These functions are part of the library with realtime functions named
-`librt'.  They are not actually part of the `libc' binary.  The
-implementation of these functions can be done using support in the
-kernel (if available) or using an implementation based on threads at
-userlevel.  In the latter case it might be necessary to link
-applications with the thread library `libpthread' in addition to
-`librt'.
-
-   All AIO operations operate on files which were opened previously.
-There might be arbitrarily many operations running for one file.  The
-asynchronous I/O operations are controlled using a data structure named
-`struct aiocb' ("AIO control block").  It is defined in `aio.h' as
-follows.
-
- -- Data Type: struct aiocb
-     The POSIX.1b standard mandates that the `struct aiocb' structure
-     contains at least the members described in the following table.
-     There might be more elements which are used by the implementation,
-     but depending upon these elements is not portable and is highly
-     deprecated.
-
-    `int aio_fildes'
-          This element specifies the file descriptor to be used for the
-          operation.  It must be a legal descriptor, otherwise the
-          operation will fail.
-
-          The device on which the file is opened must allow the seek
-          operation.  I.e., it is not possible to use any of the AIO
-          operations on devices like terminals where an `lseek' call
-          would lead to an error.
-
-    `off_t aio_offset'
-          This element specifies the offset in the file at which the
-          operation (input or output) is performed.  Since the
-          operations are carried out in arbitrary order and more than
-          one operation for one file descriptor can be started, one
-          cannot expect a current read/write position of the file
-          descriptor.
-
-    `volatile void *aio_buf'
-          This is a pointer to the buffer with the data to be written
-          or the place where the read data is stored.
-
-    `size_t aio_nbytes'
-          This element specifies the length of the buffer pointed to by
-          `aio_buf'.
-
-    `int aio_reqprio'
-          If the platform has defined `_POSIX_PRIORITIZED_IO' and
-          `_POSIX_PRIORITY_SCHEDULING', the AIO requests are processed
-          based on the current scheduling priority.  The `aio_reqprio'
-          element can then be used to lower the priority of the AIO
-          operation.
-
-    `struct sigevent aio_sigevent'
-          This element specifies how the calling process is notified
-          once the operation terminates.  If the `sigev_notify' element
-          is `SIGEV_NONE', no notification is sent.  If it is
-          `SIGEV_SIGNAL', the signal determined by `sigev_signo' is
-          sent.  Otherwise, `sigev_notify' must be `SIGEV_THREAD'.  In
-          this case, a thread is created which starts executing the
-          function pointed to by `sigev_notify_function'.
-
-    `int aio_lio_opcode'
-          This element is only used by the `lio_listio' and
-          `lio_listio64' functions.  Since these functions allow an
-          arbitrary number of operations to start at once, and each
-          operation can be input or output (or nothing), the
-          information must be stored in the control block.  The
-          possible values are:
-
-         `LIO_READ'
-               Start a read operation.  Read from the file at position
-               `aio_offset' and store the next `aio_nbytes' bytes in the
-               buffer pointed to by `aio_buf'.
-
-         `LIO_WRITE'
-               Start a write operation.  Write `aio_nbytes' bytes
-               starting at `aio_buf' into the file starting at position
-               `aio_offset'.
-
-         `LIO_NOP'
-               Do nothing for this control block.  This value is useful
-               sometimes when an array of `struct aiocb' values
-               contains holes, i.e., some of the values must not be
-               handled although the whole array is presented to the
-               `lio_listio' function.
-
-     When the sources are compiled using `_FILE_OFFSET_BITS == 64' on a
-     32 bit machine, this type is in fact `struct aiocb64', since the
-     LFS interface transparently replaces the `struct aiocb' definition.
-
-   For use with the AIO functions defined in the LFS, there is a
-similar type defined which replaces the types of the appropriate
-members with larger types but otherwise is equivalent to `struct
-aiocb'.  Particularly, all member names are the same.
-
- -- Data Type: struct aiocb64
-    `int aio_fildes'
-          This element specifies the file descriptor which is used for
-          the operation.  It must be a legal descriptor since otherwise
-          the operation fails for obvious reasons.
-
-          The device on which the file is opened must allow the seek
-          operation.  I.e., it is not possible to use any of the AIO
-          operations on devices like terminals where an `lseek' call
-          would lead to an error.
-
-    `off64_t aio_offset'
-          This element specifies at which offset in the file the
-          operation (input or output) is performed.  Since the
-          operation are carried in arbitrary order and more than one
-          operation for one file descriptor can be started, one cannot
-          expect a current read/write position of the file descriptor.
-
-    `volatile void *aio_buf'
-          This is a pointer to the buffer with the data to be written
-          or the place where the read data is stored.
-
-    `size_t aio_nbytes'
-          This element specifies the length of the buffer pointed to by
-          `aio_buf'.
-
-    `int aio_reqprio'
-          If for the platform `_POSIX_PRIORITIZED_IO' and
-          `_POSIX_PRIORITY_SCHEDULING' are defined the AIO requests are
-          processed based on the current scheduling priority.  The
-          `aio_reqprio' element can then be used to lower the priority
-          of the AIO operation.
-
-    `struct sigevent aio_sigevent'
-          This element specifies how the calling process is notified
-          once the operation terminates.  If the `sigev_notify',
-          element is `SIGEV_NONE' no notification is sent.  If it is
-          `SIGEV_SIGNAL', the signal determined by `sigev_signo' is
-          sent.  Otherwise, `sigev_notify' must be `SIGEV_THREAD' in
-          which case a thread which starts executing the function
-          pointed to by `sigev_notify_function'.
-
-    `int aio_lio_opcode'
-          This element is only used by the `lio_listio' and
-          `[lio_listio64' functions.  Since these functions allow an
-          arbitrary number of operations to start at once, and since
-          each operation can be input or output (or nothing), the
-          information must be stored in the control block.  See the
-          description of `struct aiocb' for a description of the
-          possible values.
-
-     When the sources are compiled using `_FILE_OFFSET_BITS == 64' on a
-     32 bit machine, this type is available under the name `struct
-     aiocb64', since the LFS transparently replaces the old interface.
-
-* Menu:
-
-* Asynchronous Reads/Writes::    Asynchronous Read and Write Operations.
-* Status of AIO Operations::     Getting the Status of AIO Operations.
-* Synchronizing AIO Operations:: Getting into a consistent state.
-* Cancel AIO Operations::        Cancellation of AIO Operations.
-* Configuration of AIO::         How to optimize the AIO implementation.
-
-
-File: libc.info,  Node: Asynchronous Reads/Writes,  Next: Status of AIO Operations,  Up: Asynchronous I/O
-
-13.10.1 Asynchronous Read and Write Operations
-----------------------------------------------
-
- -- Function: int aio_read (struct aiocb *AIOCBP)
-     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem
-     | *Note POSIX Safety Concepts::.
-
-     This function initiates an asynchronous read operation.  It
-     immediately returns after the operation was enqueued or when an
-     error was encountered.
-
-     The first `aiocbp->aio_nbytes' bytes of the file for which
-     `aiocbp->aio_fildes' is a descriptor are written to the buffer
-     starting at `aiocbp->aio_buf'.  Reading starts at the absolute
-     position `aiocbp->aio_offset' in the file.
-
-     If prioritized I/O is supported by the platform the
-     `aiocbp->aio_reqprio' value is used to adjust the priority before
-     the request is actually enqueued.
-
-     The calling process is notified about the termination of the read
-     request according to the `aiocbp->aio_sigevent' value.
-
-     When `aio_read' returns, the return value is zero if no error
-     occurred that can be found before the process is enqueued.  If
-     such an early error is found, the function returns -1 and sets
-     `errno' to one of the following values:
-
-    `EAGAIN'
-          The request was not enqueued due to (temporarily) exceeded
-          resource limitations.
-
-    `ENOSYS'
-          The `aio_read' function is not implemented.
-
-    `EBADF'
-          The `aiocbp->aio_fildes' descriptor is not valid.  This
-          condition need not be recognized before enqueueing the
-          request and so this error might also be signaled
-          asynchronously.
-
-    `EINVAL'
-          The `aiocbp->aio_offset' or `aiocbp->aio_reqpiro' value is
-          invalid.  This condition need not be recognized before
-          enqueueing the request and so this error might also be
-          signaled asynchronously.
-
-     If `aio_read' returns zero, the current status of the request can
-     be queried using `aio_error' and `aio_return' functions.  As long
-     as the value returned by `aio_error' is `EINPROGRESS' the
-     operation has not yet completed.  If `aio_error' returns zero, the
-     operation successfully terminated, otherwise the value is to be
-     interpreted as an error code.  If the function terminated, the
-     result of the operation can be obtained using a call to
-     `aio_return'.  The returned value is the same as an equivalent
-     call to `read' would have returned.  Possible error codes returned
-     by `aio_error' are:
-
-    `EBADF'
-          The `aiocbp->aio_fildes' descriptor is not valid.
-
-    `ECANCELED'
-          The operation was canceled before the operation was finished
-          (*note Cancel AIO Operations::)
-
-    `EINVAL'
-          The `aiocbp->aio_offset' value is invalid.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
-     function is in fact `aio_read64' since the LFS interface
-     transparently replaces the normal implementation.
-
- -- Function: int aio_read64 (struct aiocb64 *AIOCBP)
-     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem
-     | *Note POSIX Safety Concepts::.
-
-     This function is similar to the `aio_read' function.  The only
-     difference is that on 32 bit machines, the file descriptor should
-     be opened in the large file mode.  Internally, `aio_read64' uses
-     functionality equivalent to `lseek64' (*note File Position
-     Primitive::) to position the file descriptor correctly for the
-     reading, as opposed to `lseek' functionality used in `aio_read'.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64', this
-     function is available under the name `aio_read' and so
-     transparently replaces the interface for small files on 32 bit
-     machines.
-
-   To write data asynchronously to a file, there exists an equivalent
-pair of functions with a very similar interface.
-
- -- Function: int aio_write (struct aiocb *AIOCBP)
-     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem
-     | *Note POSIX Safety Concepts::.
-
-     This function initiates an asynchronous write operation.  The
-     function call immediately returns after the operation was enqueued
-     or if before this happens an error was encountered.
-
-     The first `aiocbp->aio_nbytes' bytes from the buffer starting at
-     `aiocbp->aio_buf' are written to the file for which
-     `aiocbp->aio_fildes' is a descriptor, starting at the absolute
-     position `aiocbp->aio_offset' in the file.
-
-     If prioritized I/O is supported by the platform, the
-     `aiocbp->aio_reqprio' value is used to adjust the priority before
-     the request is actually enqueued.
-
-     The calling process is notified about the termination of the read
-     request according to the `aiocbp->aio_sigevent' value.
-
-     When `aio_write' returns, the return value is zero if no error
-     occurred that can be found before the process is enqueued.  If
-     such an early error is found the function returns -1 and sets
-     `errno' to one of the following values.
-
-    `EAGAIN'
-          The request was not enqueued due to (temporarily) exceeded
-          resource limitations.
-
-    `ENOSYS'
-          The `aio_write' function is not implemented.
-
-    `EBADF'
-          The `aiocbp->aio_fildes' descriptor is not valid.  This
-          condition may not be recognized before enqueueing the
-          request, and so this error might also be signaled
-          asynchronously.
-
-    `EINVAL'
-          The `aiocbp->aio_offset' or `aiocbp->aio_reqprio' value is
-          invalid.  This condition may not be recognized before
-          enqueueing the request and so this error might also be
-          signaled asynchronously.
-
-     In the case `aio_write' returns zero, the current status of the
-     request can be queried using `aio_error' and `aio_return'
-     functions.  As long as the value returned by `aio_error' is
-     `EINPROGRESS' the operation has not yet completed.  If `aio_error'
-     returns zero, the operation successfully terminated, otherwise the
-     value is to be interpreted as an error code.  If the function
-     terminated, the result of the operation can be get using a call to
-     `aio_return'.  The returned value is the same as an equivalent
-     call to `read' would have returned.  Possible error codes returned
-     by `aio_error' are:
-
-    `EBADF'
-          The `aiocbp->aio_fildes' descriptor is not valid.
-
-    `ECANCELED'
-          The operation was canceled before the operation was finished.
-          (*note Cancel AIO Operations::)
-
-    `EINVAL'
-          The `aiocbp->aio_offset' value is invalid.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64', this
-     function is in fact `aio_write64' since the LFS interface
-     transparently replaces the normal implementation.
-
- -- Function: int aio_write64 (struct aiocb64 *AIOCBP)
-     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem
-     | *Note POSIX Safety Concepts::.
-
-     This function is similar to the `aio_write' function.  The only
-     difference is that on 32 bit machines the file descriptor should
-     be opened in the large file mode.  Internally `aio_write64' uses
-     functionality equivalent to `lseek64' (*note File Position
-     Primitive::) to position the file descriptor correctly for the
-     writing, as opposed to `lseek' functionality used in `aio_write'.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64', this
-     function is available under the name `aio_write' and so
-     transparently replaces the interface for small files on 32 bit
-     machines.
-
-   Besides these functions with the more or less traditional interface,
-POSIX.1b also defines a function which can initiate more than one
-operation at a time, and which can handle freely mixed read and write
-operations.  It is therefore similar to a combination of `readv' and
-`writev'.
-
- -- Function: int lio_listio (int MODE, struct aiocb *const LIST[], int
-          NENT, struct sigevent *SIG)
-     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem
-     | *Note POSIX Safety Concepts::.
-
-     The `lio_listio' function can be used to enqueue an arbitrary
-     number of read and write requests at one time.  The requests can
-     all be meant for the same file, all for different files or every
-     solution in between.
-
-     `lio_listio' gets the NENT requests from the array pointed to by
-     LIST.  The operation to be performed is determined by the
-     `aio_lio_opcode' member in each element of LIST.  If this field is
-     `LIO_READ' a read operation is enqueued, similar to a call of
-     `aio_read' for this element of the array (except that the way the
-     termination is signalled is different, as we will see below).  If
-     the `aio_lio_opcode' member is `LIO_WRITE' a write operation is
-     enqueued.  Otherwise the `aio_lio_opcode' must be `LIO_NOP' in
-     which case this element of LIST is simply ignored.  This
-     "operation" is useful in situations where one has a fixed array of
-     `struct aiocb' elements from which only a few need to be handled at
-     a time.  Another situation is where the `lio_listio' call was
-     canceled before all requests are processed (*note Cancel AIO
-     Operations::) and the remaining requests have to be reissued.
-
-     The other members of each element of the array pointed to by
-     `list' must have values suitable for the operation as described in
-     the documentation for `aio_read' and `aio_write' above.
-
-     The MODE argument determines how `lio_listio' behaves after having
-     enqueued all the requests.  If MODE is `LIO_WAIT' it waits until
-     all requests terminated.  Otherwise MODE must be `LIO_NOWAIT' and
-     in this case the function returns immediately after having
-     enqueued all the requests.  In this case the caller gets a
-     notification of the termination of all requests according to the
-     SIG parameter.  If SIG is `NULL' no notification is send.
-     Otherwise a signal is sent or a thread is started, just as
-     described in the description for `aio_read' or `aio_write'.
-
-     If MODE is `LIO_WAIT', the return value of `lio_listio' is 0 when
-     all requests completed successfully.  Otherwise the function
-     return -1 and `errno' is set accordingly.  To find out which
-     request or requests failed one has to use the `aio_error' function
-     on all the elements of the array LIST.
-
-     In case MODE is `LIO_NOWAIT', the function returns 0 if all
-     requests were enqueued correctly.  The current state of the
-     requests can be found using `aio_error' and `aio_return' as
-     described above.  If `lio_listio' returns -1 in this mode, the
-     global variable `errno' is set accordingly.  If a request did not
-     yet terminate, a call to `aio_error' returns `EINPROGRESS'.  If
-     the value is different, the request is finished and the error
-     value (or 0) is returned and the result of the operation can be
-     retrieved using `aio_return'.
-
-     Possible values for `errno' are:
-
-    `EAGAIN'
-          The resources necessary to queue all the requests are not
-          available at the moment.  The error status for each element
-          of LIST must be checked to determine which request failed.
-
-          Another reason could be that the system wide limit of AIO
-          requests is exceeded.  This cannot be the case for the
-          implementation on GNU systems since no arbitrary limits exist.
-
-    `EINVAL'
-          The MODE parameter is invalid or NENT is larger than
-          `AIO_LISTIO_MAX'.
-
-    `EIO'
-          One or more of the request's I/O operations failed.  The
-          error status of each request should be checked to determine
-          which one failed.
-
-    `ENOSYS'
-          The `lio_listio' function is not supported.
-
-     If the MODE parameter is `LIO_NOWAIT' and the caller cancels a
-     request, the error status for this request returned by `aio_error'
-     is `ECANCELED'.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64', this
-     function is in fact `lio_listio64' since the LFS interface
-     transparently replaces the normal implementation.
-
- -- Function: int lio_listio64 (int MODE, struct aiocb64 *const LIST[],
-          int NENT, struct sigevent *SIG)
-     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem
-     | *Note POSIX Safety Concepts::.
-
-     This function is similar to the `lio_listio' function.  The only
-     difference is that on 32 bit machines, the file descriptor should
-     be opened in the large file mode.  Internally, `lio_listio64' uses
-     functionality equivalent to `lseek64' (*note File Position
-     Primitive::) to position the file descriptor correctly for the
-     reading or writing, as opposed to `lseek' functionality used in
-     `lio_listio'.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64', this
-     function is available under the name `lio_listio' and so
-     transparently replaces the interface for small files on 32 bit
-     machines.
-
-
-File: libc.info,  Node: Status of AIO Operations,  Next: Synchronizing AIO Operations,  Prev: Asynchronous Reads/Writes,  Up: Asynchronous I/O
-
-13.10.2 Getting the Status of AIO Operations
---------------------------------------------
-
-As already described in the documentation of the functions in the last
-section, it must be possible to get information about the status of an
-I/O request.  When the operation is performed truly asynchronously (as
-with `aio_read' and `aio_write' and with `lio_listio' when the mode is
-`LIO_NOWAIT'), one sometimes needs to know whether a specific request
-already terminated and if so, what the result was.  The following two
-functions allow you to get this kind of information.
-
- -- Function: int aio_error (const struct aiocb *AIOCBP)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function determines the error state of the request described
-     by the `struct aiocb' variable pointed to by AIOCBP.  If the
-     request has not yet terminated the value returned is always
-     `EINPROGRESS'.  Once the request has terminated the value
-     `aio_error' returns is either 0 if the request completed
-     successfully or it returns the value which would be stored in the
-     `errno' variable if the request would have been done using `read',
-     `write', or `fsync'.
-
-     The function can return `ENOSYS' if it is not implemented.  It
-     could also return `EINVAL' if the AIOCBP parameter does not refer
-     to an asynchronous operation whose return status is not yet known.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
-     function is in fact `aio_error64' since the LFS interface
-     transparently replaces the normal implementation.
-
- -- Function: int aio_error64 (const struct aiocb64 *AIOCBP)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is similar to `aio_error' with the only difference
-     that the argument is a reference to a variable of type `struct
-     aiocb64'.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
-     function is available under the name `aio_error' and so
-     transparently replaces the interface for small files on 32 bit
-     machines.
-
- -- Function: ssize_t aio_return (struct aiocb *AIOCBP)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function can be used to retrieve the return status of the
-     operation carried out by the request described in the variable
-     pointed to by AIOCBP.  As long as the error status of this request
-     as returned by `aio_error' is `EINPROGRESS' the return of this
-     function is undefined.
-
-     Once the request is finished this function can be used exactly
-     once to retrieve the return value.  Following calls might lead to
-     undefined behavior.  The return value itself is the value which
-     would have been returned by the `read', `write', or `fsync' call.
-
-     The function can return `ENOSYS' if it is not implemented.  It
-     could also return `EINVAL' if the AIOCBP parameter does not refer
-     to an asynchronous operation whose return status is not yet known.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
-     function is in fact `aio_return64' since the LFS interface
-     transparently replaces the normal implementation.
-
- -- Function: ssize_t aio_return64 (struct aiocb64 *AIOCBP)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is similar to `aio_return' with the only difference
-     that the argument is a reference to a variable of type `struct
-     aiocb64'.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
-     function is available under the name `aio_return' and so
-     transparently replaces the interface for small files on 32 bit
-     machines.
-
-
-File: libc.info,  Node: Synchronizing AIO Operations,  Next: Cancel AIO Operations,  Prev: Status of AIO Operations,  Up: Asynchronous I/O
-
-13.10.3 Getting into a Consistent State
----------------------------------------
-
-When dealing with asynchronous operations it is sometimes necessary to
-get into a consistent state.  This would mean for AIO that one wants to
-know whether a certain request or a group of request were processed.
-This could be done by waiting for the notification sent by the system
-after the operation terminated, but this sometimes would mean wasting
-resources (mainly computation time).  Instead POSIX.1b defines two
-functions which will help with most kinds of consistency.
-
-   The `aio_fsync' and `aio_fsync64' functions are only available if
-the symbol `_POSIX_SYNCHRONIZED_IO' is defined in `unistd.h'.
-
- -- Function: int aio_fsync (int OP, struct aiocb *AIOCBP)
-     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem
-     | *Note POSIX Safety Concepts::.
-
-     Calling this function forces all I/O operations operating queued
-     at the time of the function call operating on the file descriptor
-     `aiocbp->aio_fildes' into the synchronized I/O completion state
-     (*note Synchronizing I/O::).  The `aio_fsync' function returns
-     immediately but the notification through the method described in
-     `aiocbp->aio_sigevent' will happen only after all requests for this
-     file descriptor have terminated and the file is synchronized.
-     This also means that requests for this very same file descriptor
-     which are queued after the synchronization request are not
-     affected.
-
-     If OP is `O_DSYNC' the synchronization happens as with a call to
-     `fdatasync'.  Otherwise OP should be `O_SYNC' and the
-     synchronization happens as with `fsync'.
-
-     As long as the synchronization has not happened, a call to
-     `aio_error' with the reference to the object pointed to by AIOCBP
-     returns `EINPROGRESS'.  Once the synchronization is done
-     `aio_error' return 0 if the synchronization was not successful.
-     Otherwise the value returned is the value to which the `fsync' or
-     `fdatasync' function would have set the `errno' variable.  In this
-     case nothing can be assumed about the consistency for the data
-     written to this file descriptor.
-
-     The return value of this function is 0 if the request was
-     successfully enqueued.  Otherwise the return value is -1 and
-     `errno' is set to one of the following values:
-
-    `EAGAIN'
-          The request could not be enqueued due to temporary lack of
-          resources.
-
-    `EBADF'
-          The file descriptor `AIOCBP->aio_fildes' is not valid.
-
-    `EINVAL'
-          The implementation does not support I/O synchronization or
-          the OP parameter is other than `O_DSYNC' and `O_SYNC'.
-
-    `ENOSYS'
-          This function is not implemented.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
-     function is in fact `aio_fsync64' since the LFS interface
-     transparently replaces the normal implementation.
-
- -- Function: int aio_fsync64 (int OP, struct aiocb64 *AIOCBP)
-     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem
-     | *Note POSIX Safety Concepts::.
-
-     This function is similar to `aio_fsync' with the only difference
-     that the argument is a reference to a variable of type `struct
-     aiocb64'.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
-     function is available under the name `aio_fsync' and so
-     transparently replaces the interface for small files on 32 bit
-     machines.
-
-   Another method of synchronization is to wait until one or more
-requests of a specific set terminated.  This could be achieved by the
-`aio_*' functions to notify the initiating process about the
-termination but in some situations this is not the ideal solution.  In
-a program which constantly updates clients somehow connected to the
-server it is not always the best solution to go round robin since some
-connections might be slow.  On the other hand letting the `aio_*'
-function notify the caller might also be not the best solution since
-whenever the process works on preparing data for on client it makes no
-sense to be interrupted by a notification since the new client will not
-be handled before the current client is served.  For situations like
-this `aio_suspend' should be used.
-
- -- Function: int aio_suspend (const struct aiocb *const LIST[], int
-          NENT, const struct timespec *TIMEOUT)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     When calling this function, the calling thread is suspended until
-     at least one of the requests pointed to by the NENT elements of the
-     array LIST has completed.  If any of the requests has already
-     completed at the time `aio_suspend' is called, the function returns
-     immediately.  Whether a request has terminated or not is
-     determined by comparing the error status of the request with
-     `EINPROGRESS'.  If an element of LIST is `NULL', the entry is
-     simply ignored.
-
-     If no request has finished, the calling process is suspended.  If
-     TIMEOUT is `NULL', the process is not woken until a request has
-     finished.  If TIMEOUT is not `NULL', the process remains suspended
-     at least as long as specified in TIMEOUT.  In this case,
-     `aio_suspend' returns with an error.
-
-     The return value of the function is 0 if one or more requests from
-     the LIST have terminated.  Otherwise the function returns -1 and
-     `errno' is set to one of the following values:
-
-    `EAGAIN'
-          None of the requests from the LIST completed in the time
-          specified by TIMEOUT.
-
-    `EINTR'
-          A signal interrupted the `aio_suspend' function.  This signal
-          might also be sent by the AIO implementation while signalling
-          the termination of one of the requests.
-
-    `ENOSYS'
-          The `aio_suspend' function is not implemented.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
-     function is in fact `aio_suspend64' since the LFS interface
-     transparently replaces the normal implementation.
-
- -- Function: int aio_suspend64 (const struct aiocb64 *const LIST[],
-          int NENT, const struct timespec *TIMEOUT)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     This function is similar to `aio_suspend' with the only difference
-     that the argument is a reference to a variable of type `struct
-     aiocb64'.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
-     function is available under the name `aio_suspend' and so
-     transparently replaces the interface for small files on 32 bit
-     machines.
-
-
-File: libc.info,  Node: Cancel AIO Operations,  Next: Configuration of AIO,  Prev: Synchronizing AIO Operations,  Up: Asynchronous I/O
-
-13.10.4 Cancellation of AIO Operations
---------------------------------------
-
-When one or more requests are asynchronously processed, it might be
-useful in some situations to cancel a selected operation, e.g., if it
-becomes obvious that the written data is no longer accurate and would
-have to be overwritten soon.  As an example, assume an application,
-which writes data in files in a situation where new incoming data would
-have to be written in a file which will be updated by an enqueued
-request.  The POSIX AIO implementation provides such a function, but
-this function is not capable of forcing the cancellation of the
-request.  It is up to the implementation to decide whether it is
-possible to cancel the operation or not.  Therefore using this function
-is merely a hint.
-
- -- Function: int aio_cancel (int FILDES, struct aiocb *AIOCBP)
-     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem
-     | *Note POSIX Safety Concepts::.
-
-     The `aio_cancel' function can be used to cancel one or more
-     outstanding requests.  If the AIOCBP parameter is `NULL', the
-     function tries to cancel all of the outstanding requests which
-     would process the file descriptor FILDES (i.e., whose `aio_fildes'
-     member is FILDES).  If AIOCBP is not `NULL', `aio_cancel' attempts
-     to cancel the specific request pointed to by AIOCBP.
-
-     For requests which were successfully canceled, the normal
-     notification about the termination of the request should take
-     place.  I.e., depending on the `struct sigevent' object which
-     controls this, nothing happens, a signal is sent or a thread is
-     started.  If the request cannot be canceled, it terminates the
-     usual way after performing the operation.
-
-     After a request is successfully canceled, a call to `aio_error'
-     with a reference to this request as the parameter will return
-     `ECANCELED' and a call to `aio_return' will return -1.  If the
-     request wasn't canceled and is still running the error status is
-     still `EINPROGRESS'.
-
-     The return value of the function is `AIO_CANCELED' if there were
-     requests which haven't terminated and which were successfully
-     canceled.  If there is one or more requests left which couldn't be
-     canceled, the return value is `AIO_NOTCANCELED'.  In this case
-     `aio_error' must be used to find out which of the, perhaps
-     multiple, requests (in AIOCBP is `NULL') weren't successfully
-     canceled.  If all requests already terminated at the time
-     `aio_cancel' is called the return value is `AIO_ALLDONE'.
-
-     If an error occurred during the execution of `aio_cancel' the
-     function returns -1 and sets `errno' to one of the following
-     values.
-
-    `EBADF'
-          The file descriptor FILDES is not valid.
-
-    `ENOSYS'
-          `aio_cancel' is not implemented.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64', this
-     function is in fact `aio_cancel64' since the LFS interface
-     transparently replaces the normal implementation.
-
- -- Function: int aio_cancel64 (int FILDES, struct aiocb64 *AIOCBP)
-     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem
-     | *Note POSIX Safety Concepts::.
-
-     This function is similar to `aio_cancel' with the only difference
-     that the argument is a reference to a variable of type `struct
-     aiocb64'.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64', this
-     function is available under the name `aio_cancel' and so
-     transparently replaces the interface for small files on 32 bit
-     machines.
-
-
-File: libc.info,  Node: Configuration of AIO,  Prev: Cancel AIO Operations,  Up: Asynchronous I/O
-
-13.10.5 How to optimize the AIO implementation
-----------------------------------------------
-
-The POSIX standard does not specify how the AIO functions are
-implemented.  They could be system calls, but it is also possible to
-emulate them at userlevel.
-
-   At the point of this writing, the available implementation is a
-userlevel implementation which uses threads for handling the enqueued
-requests.  While this implementation requires making some decisions
-about limitations, hard limitations are something which is best avoided
-in the GNU C Library.  Therefore, the GNU C Library provides a means
-for tuning the AIO implementation according to the individual use.
-
- -- Data Type: struct aioinit
-     This data type is used to pass the configuration or tunable
-     parameters to the implementation.  The program has to initialize
-     the members of this struct and pass it to the implementation using
-     the `aio_init' function.
-
-    `int aio_threads'
-          This member specifies the maximal number of threads which may
-          be used at any one time.
-
-    `int aio_num'
-          This number provides an estimate on the maximal number of
-          simultaneously enqueued requests.
-
-    `int aio_locks'
-          Unused.
-
-    `int aio_usedba'
-          Unused.
-
-    `int aio_debug'
-          Unused.
-
-    `int aio_numusers'
-          Unused.
-
-    `int aio_reserved[2]'
-          Unused.
-
- -- Function: void aio_init (const struct aioinit *INIT)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     This function must be called before any other AIO function.
-     Calling it is completely voluntary, as it is only meant to help
-     the AIO implementation perform better.
-
-     Before calling the `aio_init', function the members of a variable
-     of type `struct aioinit' must be initialized.  Then a reference to
-     this variable is passed as the parameter to `aio_init' which itself
-     may or may not pay attention to the hints.
-
-     The function has no return value and no error cases are defined.
-     It is a extension which follows a proposal from the SGI
-     implementation in Irix 6.  It is not covered by POSIX.1b or Unix98.
-
-
-File: libc.info,  Node: Control Operations,  Next: Duplicating Descriptors,  Prev: Asynchronous I/O,  Up: Low-Level I/O
-
-13.11 Control Operations on Files
-=================================
-
-This section describes how you can perform various other operations on
-file descriptors, such as inquiring about or setting flags describing
-the status of the file descriptor, manipulating record locks, and the
-like.  All of these operations are performed by the function `fcntl'.
-
-   The second argument to the `fcntl' function is a command that
-specifies which operation to perform.  The function and macros that name
-various flags that are used with it are declared in the header file
-`fcntl.h'.  Many of these flags are also used by the `open' function;
-see *note Opening and Closing Files::.  
-
- -- Function: int fcntl (int FILEDES, int COMMAND, ...)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `fcntl' function performs the operation specified by COMMAND
-     on the file descriptor FILEDES.  Some commands require additional
-     arguments to be supplied.  These additional arguments and the
-     return value and error conditions are given in the detailed
-     descriptions of the individual commands.
-
-     Briefly, here is a list of what the various commands are.
-
-    `F_DUPFD'
-          Duplicate the file descriptor (return another file descriptor
-          pointing to the same open file).  *Note Duplicating
-          Descriptors::.
-
-    `F_GETFD'
-          Get flags associated with the file descriptor.  *Note
-          Descriptor Flags::.
-
-    `F_SETFD'
-          Set flags associated with the file descriptor.  *Note
-          Descriptor Flags::.
-
-    `F_GETFL'
-          Get flags associated with the open file.  *Note File Status
-          Flags::.
-
-    `F_SETFL'
-          Set flags associated with the open file.  *Note File Status
-          Flags::.
-
-    `F_GETLK'
-          Get a file lock.  *Note File Locks::.
-
-    `F_SETLK'
-          Set or clear a file lock.  *Note File Locks::.
-
-    `F_SETLKW'
-          Like `F_SETLK', but wait for completion.  *Note File Locks::.
-
-    `F_GETOWN'
-          Get process or process group ID to receive `SIGIO' signals.
-          *Note Interrupt Input::.
-
-    `F_SETOWN'
-          Set process or process group ID to receive `SIGIO' signals.
-          *Note Interrupt Input::.
-
-     This function is a cancellation point in multi-threaded programs.
-     This is a problem if the thread allocates some resources (like
-     memory, file descriptors, semaphores or whatever) at the time
-     `fcntl' is called.  If the thread gets canceled these resources
-     stay allocated until the program ends.  To avoid this calls to
-     `fcntl' should be protected using cancellation handlers.
-
-
-File: libc.info,  Node: Duplicating Descriptors,  Next: Descriptor Flags,  Prev: Control Operations,  Up: Low-Level I/O
-
-13.12 Duplicating Descriptors
-=============================
-
-You can "duplicate" a file descriptor, or allocate another file
-descriptor that refers to the same open file as the original.  Duplicate
-descriptors share one file position and one set of file status flags
-(*note File Status Flags::), but each has its own set of file descriptor
-flags (*note Descriptor Flags::).
-
-   The major use of duplicating a file descriptor is to implement
-"redirection" of input or output:  that is, to change the file or pipe
-that a particular file descriptor corresponds to.
-
-   You can perform this operation using the `fcntl' function with the
-`F_DUPFD' command, but there are also convenient functions `dup' and
-`dup2' for duplicating descriptors.
-
-   The `fcntl' function and flags are declared in `fcntl.h', while
-prototypes for `dup' and `dup2' are in the header file `unistd.h'.
-
- -- Function: int dup (int OLD)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function copies descriptor OLD to the first available
-     descriptor number (the first number not currently open).  It is
-     equivalent to `fcntl (OLD, F_DUPFD, 0)'.
-
- -- Function: int dup2 (int OLD, int NEW)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function copies the descriptor OLD to descriptor number NEW.
-
-     If OLD is an invalid descriptor, then `dup2' does nothing; it does
-     not close NEW.  Otherwise, the new duplicate of OLD replaces any
-     previous meaning of descriptor NEW, as if NEW were closed first.
-
-     If OLD and NEW are different numbers, and OLD is a valid
-     descriptor number, then `dup2' is equivalent to:
-
-          close (NEW);
-          fcntl (OLD, F_DUPFD, NEW)
-
-     However, `dup2' does this atomically; there is no instant in the
-     middle of calling `dup2' at which NEW is closed and not yet a
-     duplicate of OLD.
-
- -- Macro: int F_DUPFD
-     This macro is used as the COMMAND argument to `fcntl', to copy the
-     file descriptor given as the first argument.
-
-     The form of the call in this case is:
-
-          fcntl (OLD, F_DUPFD, NEXT-FILEDES)
-
-     The NEXT-FILEDES argument is of type `int' and specifies that the
-     file descriptor returned should be the next available one greater
-     than or equal to this value.
-
-     The return value from `fcntl' with this command is normally the
-     value of the new file descriptor.  A return value of -1 indicates
-     an error.  The following `errno' error conditions are defined for
-     this command:
-
-    `EBADF'
-          The OLD argument is invalid.
-
-    `EINVAL'
-          The NEXT-FILEDES argument is invalid.
-
-    `EMFILE'
-          There are no more file descriptors available--your program is
-          already using the maximum.  In BSD and GNU, the maximum is
-          controlled by a resource limit that can be changed; *note
-          Limits on Resources::, for more information about the
-          `RLIMIT_NOFILE' limit.
-
-     `ENFILE' is not a possible error code for `dup2' because `dup2'
-     does not create a new opening of a file; duplicate descriptors do
-     not count toward the limit which `ENFILE' indicates.  `EMFILE' is
-     possible because it refers to the limit on distinct descriptor
-     numbers in use in one process.
-
-   Here is an example showing how to use `dup2' to do redirection.
-Typically, redirection of the standard streams (like `stdin') is done
-by a shell or shell-like program before calling one of the `exec'
-functions (*note Executing a File::) to execute a new program in a
-child process.  When the new program is executed, it creates and
-initializes the standard streams to point to the corresponding file
-descriptors, before its `main' function is invoked.
-
-   So, to redirect standard input to a file, the shell could do
-something like:
-
-     pid = fork ();
-     if (pid == 0)
-       {
-         char *filename;
-         char *program;
-         int file;
-         ...
-         file = TEMP_FAILURE_RETRY (open (filename, O_RDONLY));
-         dup2 (file, STDIN_FILENO);
-         TEMP_FAILURE_RETRY (close (file));
-         execv (program, NULL);
-       }
-
-   There is also a more detailed example showing how to implement
-redirection in the context of a pipeline of processes in *note
-Launching Jobs::.
-
-
-File: libc.info,  Node: Descriptor Flags,  Next: File Status Flags,  Prev: Duplicating Descriptors,  Up: Low-Level I/O
-
-13.13 File Descriptor Flags
-===========================
-
-"File descriptor flags" are miscellaneous attributes of a file
-descriptor.  These flags are associated with particular file
-descriptors, so that if you have created duplicate file descriptors
-from a single opening of a file, each descriptor has its own set of
-flags.
-
-   Currently there is just one file descriptor flag: `FD_CLOEXEC',
-which causes the descriptor to be closed if you use any of the
-`exec...' functions (*note Executing a File::).
-
-   The symbols in this section are defined in the header file `fcntl.h'.  
-
- -- Macro: int F_GETFD
-     This macro is used as the COMMAND argument to `fcntl', to specify
-     that it should return the file descriptor flags associated with
-     the FILEDES argument.
-
-     The normal return value from `fcntl' with this command is a
-     nonnegative number which can be interpreted as the bitwise OR of
-     the individual flags (except that currently there is only one flag
-     to use).
-
-     In case of an error, `fcntl' returns -1.  The following `errno'
-     error conditions are defined for this command:
-
-    `EBADF'
-          The FILEDES argument is invalid.
-
- -- Macro: int F_SETFD
-     This macro is used as the COMMAND argument to `fcntl', to specify
-     that it should set the file descriptor flags associated with the
-     FILEDES argument.  This requires a third `int' argument to specify
-     the new flags, so the form of the call is:
-
-          fcntl (FILEDES, F_SETFD, NEW-FLAGS)
-
-     The normal return value from `fcntl' with this command is an
-     unspecified value other than -1, which indicates an error.  The
-     flags and error conditions are the same as for the `F_GETFD'
-     command.
-
-   The following macro is defined for use as a file descriptor flag with
-the `fcntl' function.  The value is an integer constant usable as a bit
-mask value.
-
- -- Macro: int FD_CLOEXEC
-     This flag specifies that the file descriptor should be closed when
-     an `exec' function is invoked; see *note Executing a File::.  When
-     a file descriptor is allocated (as with `open' or `dup'), this bit
-     is initially cleared on the new file descriptor, meaning that
-     descriptor will survive into the new program after `exec'.
-
-   If you want to modify the file descriptor flags, you should get the
-current flags with `F_GETFD' and modify the value.  Don't assume that
-the flags listed here are the only ones that are implemented; your
-program may be run years from now and more flags may exist then.  For
-example, here is a function to set or clear the flag `FD_CLOEXEC'
-without altering any other flags:
-
-     /* Set the `FD_CLOEXEC' flag of DESC if VALUE is nonzero,
-        or clear the flag if VALUE is 0.
-        Return 0 on success, or -1 on error with `errno' set. */
-
-     int
-     set_cloexec_flag (int desc, int value)
-     {
-       int oldflags = fcntl (desc, F_GETFD, 0);
-       /* If reading the flags failed, return error indication now. */
-       if (oldflags < 0)
-         return oldflags;
-       /* Set just the flag we want to set. */
-       if (value != 0)
-         oldflags |= FD_CLOEXEC;
-       else
-         oldflags &= ~FD_CLOEXEC;
-       /* Store modified flag word in the descriptor. */
-       return fcntl (desc, F_SETFD, oldflags);
-     }
-
-
-File: libc.info,  Node: File Status Flags,  Next: File Locks,  Prev: Descriptor Flags,  Up: Low-Level I/O
-
-13.14 File Status Flags
-=======================
-
-"File status flags" are used to specify attributes of the opening of a
-file.  Unlike the file descriptor flags discussed in *note Descriptor
-Flags::, the file status flags are shared by duplicated file descriptors
-resulting from a single opening of the file.  The file status flags are
-specified with the FLAGS argument to `open'; *note Opening and Closing
-Files::.
-
-   File status flags fall into three categories, which are described in
-the following sections.
-
-   * *note Access Modes::, specify what type of access is allowed to the
-     file: reading, writing, or both.  They are set by `open' and are
-     returned by `fcntl', but cannot be changed.
-
-   * *note Open-time Flags::, control details of what `open' will do.
-     These flags are not preserved after the `open' call.
-
-   * *note Operating Modes::, affect how operations such as `read' and
-     `write' are done.  They are set by `open', and can be fetched or
-     changed with `fcntl'.
-
-   The symbols in this section are defined in the header file `fcntl.h'.  
-
-* Menu:
-
-* Access Modes::                Whether the descriptor can read or write.
-* Open-time Flags::             Details of `open'.
-* Operating Modes::             Special modes to control I/O operations.
-* Getting File Status Flags::   Fetching and changing these flags.
-
-
-File: libc.info,  Node: Access Modes,  Next: Open-time Flags,  Up: File Status Flags
-
-13.14.1 File Access Modes
--------------------------
-
-The file access modes allow a file descriptor to be used for reading,
-writing, or both.  (On GNU/Hurd systems, they can also allow none of
-these, and allow execution of the file as a program.)  The access modes
-are chosen when the file is opened, and never change.
-
- -- Macro: int O_RDONLY
-     Open the file for read access.
-
- -- Macro: int O_WRONLY
-     Open the file for write access.
-
- -- Macro: int O_RDWR
-     Open the file for both reading and writing.
-
-   On GNU/Hurd systems (and not on other systems), `O_RDONLY' and
-`O_WRONLY' are independent bits that can be bitwise-ORed together, and
-it is valid for either bit to be set or clear.  This means that
-`O_RDWR' is the same as `O_RDONLY|O_WRONLY'.  A file access mode of
-zero is permissible; it allows no operations that do input or output to
-the file, but does allow other operations such as `fchmod'.  On
-GNU/Hurd systems, since "read-only" or "write-only" is a misnomer,
-`fcntl.h' defines additional names for the file access modes.  These
-names are preferred when writing GNU-specific code.  But most programs
-will want to be portable to other POSIX.1 systems and should use the
-POSIX.1 names above instead.
-
- -- Macro: int O_READ
-     Open the file for reading.  Same as `O_RDONLY'; only defined on
-     GNU.
-
- -- Macro: int O_WRITE
-     Open the file for writing.  Same as `O_WRONLY'; only defined on
-     GNU.
-
- -- Macro: int O_EXEC
-     Open the file for executing.  Only defined on GNU.
-
-   To determine the file access mode with `fcntl', you must extract the
-access mode bits from the retrieved file status flags.  On GNU/Hurd
-systems, you can just test the `O_READ' and `O_WRITE' bits in the flags
-word.  But in other POSIX.1 systems, reading and writing access modes
-are not stored as distinct bit flags.  The portable way to extract the
-file access mode bits is with `O_ACCMODE'.
-
- -- Macro: int O_ACCMODE
-     This macro stands for a mask that can be bitwise-ANDed with the
-     file status flag value to produce a value representing the file
-     access mode.  The mode will be `O_RDONLY', `O_WRONLY', or `O_RDWR'.
-     (On GNU/Hurd systems it could also be zero, and it never includes
-     the `O_EXEC' bit.)
-
-
-File: libc.info,  Node: Open-time Flags,  Next: Operating Modes,  Prev: Access Modes,  Up: File Status Flags
-
-13.14.2 Open-time Flags
------------------------
-
-The open-time flags specify options affecting how `open' will behave.
-These options are not preserved once the file is open.  The exception to
-this is `O_NONBLOCK', which is also an I/O operating mode and so it
-_is_ saved.  *Note Opening and Closing Files::, for how to call `open'.
-
-   There are two sorts of options specified by open-time flags.
-
-   * "File name translation flags" affect how `open' looks up the file
-     name to locate the file, and whether the file can be created.  
-
-   * "Open-time action flags" specify extra operations that `open' will
-     perform on the file once it is open.  
-
-   Here are the file name translation flags.
-
- -- Macro: int O_CREAT
-     If set, the file will be created if it doesn't already exist.  
-
- -- Macro: int O_EXCL
-     If both `O_CREAT' and `O_EXCL' are set, then `open' fails if the
-     specified file already exists.  This is guaranteed to never
-     clobber an existing file.
-
- -- Macro: int O_NONBLOCK
-     This prevents `open' from blocking for a "long time" to open the
-     file.  This is only meaningful for some kinds of files, usually
-     devices such as serial ports; when it is not meaningful, it is
-     harmless and ignored.  Often opening a port to a modem blocks
-     until the modem reports carrier detection; if `O_NONBLOCK' is
-     specified, `open' will return immediately without a carrier.
-
-     Note that the `O_NONBLOCK' flag is overloaded as both an I/O
-     operating mode and a file name translation flag.  This means that
-     specifying `O_NONBLOCK' in `open' also sets nonblocking I/O mode;
-     *note Operating Modes::.  To open the file without blocking but do
-     normal I/O that blocks, you must call `open' with `O_NONBLOCK' set
-     and then call `fcntl' to turn the bit off.
-
- -- Macro: int O_NOCTTY
-     If the named file is a terminal device, don't make it the
-     controlling terminal for the process.  *Note Job Control::, for
-     information about what it means to be the controlling terminal.
-
-     On GNU/Hurd systems and 4.4 BSD, opening a file never makes it the
-     controlling terminal and `O_NOCTTY' is zero.  However, GNU/Linux
-     systems and some other systems use a nonzero value for `O_NOCTTY'
-     and set the controlling terminal when you open a file that is a
-     terminal device; so to be portable, use `O_NOCTTY' when it is
-     important to avoid this.  
-
-   The following three file name translation flags exist only on
-GNU/Hurd systems.
-
- -- Macro: int O_IGNORE_CTTY
-     Do not recognize the named file as the controlling terminal, even
-     if it refers to the process's existing controlling terminal
-     device.  Operations on the new file descriptor will never induce
-     job control signals.  *Note Job Control::.
-
- -- Macro: int O_NOLINK
-     If the named file is a symbolic link, open the link itself instead
-     of the file it refers to.  (`fstat' on the new file descriptor will
-     return the information returned by `lstat' on the link's name.)  
-
- -- Macro: int O_NOTRANS
-     If the named file is specially translated, do not invoke the
-     translator.  Open the bare file the translator itself sees.
-
-   The open-time action flags tell `open' to do additional operations
-which are not really related to opening the file.  The reason to do them
-as part of `open' instead of in separate calls is that `open' can do
-them atomically.
-
- -- Macro: int O_TRUNC
-     Truncate the file to zero length.  This option is only useful for
-     regular files, not special files such as directories or FIFOs.
-     POSIX.1 requires that you open the file for writing to use
-     `O_TRUNC'.  In BSD and GNU you must have permission to write the
-     file to truncate it, but you need not open for write access.
-
-     This is the only open-time action flag specified by POSIX.1.
-     There is no good reason for truncation to be done by `open',
-     instead of by calling `ftruncate' afterwards.  The `O_TRUNC' flag
-     existed in Unix before `ftruncate' was invented, and is retained
-     for backward compatibility.
-
-   The remaining operating modes are BSD extensions.  They exist only
-on some systems.  On other systems, these macros are not defined.
-
- -- Macro: int O_SHLOCK
-     Acquire a shared lock on the file, as with `flock'.  *Note File
-     Locks::.
-
-     If `O_CREAT' is specified, the locking is done atomically when
-     creating the file.  You are guaranteed that no other process will
-     get the lock on the new file first.
-
- -- Macro: int O_EXLOCK
-     Acquire an exclusive lock on the file, as with `flock'.  *Note
-     File Locks::.  This is atomic like `O_SHLOCK'.
-
-
-File: libc.info,  Node: Operating Modes,  Next: Getting File Status Flags,  Prev: Open-time Flags,  Up: File Status Flags
-
-13.14.3 I/O Operating Modes
----------------------------
-
-The operating modes affect how input and output operations using a file
-descriptor work.  These flags are set by `open' and can be fetched and
-changed with `fcntl'.
-
- -- Macro: int O_APPEND
-     The bit that enables append mode for the file.  If set, then all
-     `write' operations write the data at the end of the file, extending
-     it, regardless of the current file position.  This is the only
-     reliable way to append to a file.  In append mode, you are
-     guaranteed that the data you write will always go to the current
-     end of the file, regardless of other processes writing to the
-     file.  Conversely, if you simply set the file position to the end
-     of file and write, then another process can extend the file after
-     you set the file position but before you write, resulting in your
-     data appearing someplace before the real end of file.
-
- -- Macro: int O_NONBLOCK
-     The bit that enables nonblocking mode for the file.  If this bit
-     is set, `read' requests on the file can return immediately with a
-     failure status if there is no input immediately available, instead
-     of blocking.  Likewise, `write' requests can also return
-     immediately with a failure status if the output can't be written
-     immediately.
-
-     Note that the `O_NONBLOCK' flag is overloaded as both an I/O
-     operating mode and a file name translation flag; *note Open-time
-     Flags::.
-
- -- Macro: int O_NDELAY
-     This is an obsolete name for `O_NONBLOCK', provided for
-     compatibility with BSD.  It is not defined by the POSIX.1 standard.
-
-   The remaining operating modes are BSD and GNU extensions.  They
-exist only on some systems.  On other systems, these macros are not
-defined.
-
- -- Macro: int O_ASYNC
-     The bit that enables asynchronous input mode.  If set, then `SIGIO'
-     signals will be generated when input is available.  *Note
-     Interrupt Input::.
-
-     Asynchronous input mode is a BSD feature.
-
- -- Macro: int O_FSYNC
-     The bit that enables synchronous writing for the file.  If set,
-     each `write' call will make sure the data is reliably stored on
-     disk before returning.  Synchronous writing is a BSD feature.
-
- -- Macro: int O_SYNC
-     This is another name for `O_FSYNC'.  They have the same value.
-
- -- Macro: int O_NOATIME
-     If this bit is set, `read' will not update the access time of the
-     file.  *Note File Times::.  This is used by programs that do
-     backups, so that backing a file up does not count as reading it.
-     Only the owner of the file or the superuser may use this bit.
-
-     This is a GNU extension.
-
-
-File: libc.info,  Node: Getting File Status Flags,  Prev: Operating Modes,  Up: File Status Flags
-
-13.14.4 Getting and Setting File Status Flags
----------------------------------------------
-
-The `fcntl' function can fetch or change file status flags.
-
- -- Macro: int F_GETFL
-     This macro is used as the COMMAND argument to `fcntl', to read the
-     file status flags for the open file with descriptor FILEDES.
-
-     The normal return value from `fcntl' with this command is a
-     nonnegative number which can be interpreted as the bitwise OR of
-     the individual flags.  Since the file access modes are not
-     single-bit values, you can mask off other bits in the returned
-     flags with `O_ACCMODE' to compare them.
-
-     In case of an error, `fcntl' returns -1.  The following `errno'
-     error conditions are defined for this command:
-
-    `EBADF'
-          The FILEDES argument is invalid.
-
- -- Macro: int F_SETFL
-     This macro is used as the COMMAND argument to `fcntl', to set the
-     file status flags for the open file corresponding to the FILEDES
-     argument.  This command requires a third `int' argument to specify
-     the new flags, so the call looks like this:
-
-          fcntl (FILEDES, F_SETFL, NEW-FLAGS)
-
-     You can't change the access mode for the file in this way; that is,
-     whether the file descriptor was opened for reading or writing.
-
-     The normal return value from `fcntl' with this command is an
-     unspecified value other than -1, which indicates an error.  The
-     error conditions are the same as for the `F_GETFL' command.
-
-   If you want to modify the file status flags, you should get the
-current flags with `F_GETFL' and modify the value.  Don't assume that
-the flags listed here are the only ones that are implemented; your
-program may be run years from now and more flags may exist then.  For
-example, here is a function to set or clear the flag `O_NONBLOCK'
-without altering any other flags:
-
-     /* Set the `O_NONBLOCK' flag of DESC if VALUE is nonzero,
-        or clear the flag if VALUE is 0.
-        Return 0 on success, or -1 on error with `errno' set. */
-
-     int
-     set_nonblock_flag (int desc, int value)
-     {
-       int oldflags = fcntl (desc, F_GETFL, 0);
-       /* If reading the flags failed, return error indication now. */
-       if (oldflags == -1)
-         return -1;
-       /* Set just the flag we want to set. */
-       if (value != 0)
-         oldflags |= O_NONBLOCK;
-       else
-         oldflags &= ~O_NONBLOCK;
-       /* Store modified flag word in the descriptor. */
-       return fcntl (desc, F_SETFL, oldflags);
-     }
-
-
-File: libc.info,  Node: File Locks,  Next: Interrupt Input,  Prev: File Status Flags,  Up: Low-Level I/O
-
-13.15 File Locks
-================
-
-The remaining `fcntl' commands are used to support "record locking",
-which permits multiple cooperating programs to prevent each other from
-simultaneously accessing parts of a file in error-prone ways.
-
-   An "exclusive" or "write" lock gives a process exclusive access for
-writing to the specified part of the file.  While a write lock is in
-place, no other process can lock that part of the file.
-
-   A "shared" or "read" lock prohibits any other process from
-requesting a write lock on the specified part of the file.  However,
-other processes can request read locks.
-
-   The `read' and `write' functions do not actually check to see
-whether there are any locks in place.  If you want to implement a
-locking protocol for a file shared by multiple processes, your
-application must do explicit `fcntl' calls to request and clear locks
-at the appropriate points.
-
-   Locks are associated with processes.  A process can only have one
-kind of lock set for each byte of a given file.  When any file
-descriptor for that file is closed by the process, all of the locks
-that process holds on that file are released, even if the locks were
-made using other descriptors that remain open.  Likewise, locks are
-released when a process exits, and are not inherited by child processes
-created using `fork' (*note Creating a Process::).
-
-   When making a lock, use a `struct flock' to specify what kind of
-lock and where.  This data type and the associated macros for the
-`fcntl' function are declared in the header file `fcntl.h'.  
-
- -- Data Type: struct flock
-     This structure is used with the `fcntl' function to describe a file
-     lock.  It has these members:
-
-    `short int l_type'
-          Specifies the type of the lock; one of `F_RDLCK', `F_WRLCK',
-          or `F_UNLCK'.
-
-    `short int l_whence'
-          This corresponds to the WHENCE argument to `fseek' or
-          `lseek', and specifies what the offset is relative to.  Its
-          value can be one of `SEEK_SET', `SEEK_CUR', or `SEEK_END'.
-
-    `off_t l_start'
-          This specifies the offset of the start of the region to which
-          the lock applies, and is given in bytes relative to the point
-          specified by `l_whence' member.
-
-    `off_t l_len'
-          This specifies the length of the region to be locked.  A
-          value of `0' is treated specially; it means the region
-          extends to the end of the file.
-
-    `pid_t l_pid'
-          This field is the process ID (*note Process Creation
-          Concepts::) of the process holding the lock.  It is filled in
-          by calling `fcntl' with the `F_GETLK' command, but is ignored
-          when making a lock.
-
- -- Macro: int F_GETLK
-     This macro is used as the COMMAND argument to `fcntl', to specify
-     that it should get information about a lock.  This command
-     requires a third argument of type `struct flock *' to be passed to
-     `fcntl', so that the form of the call is:
-
-          fcntl (FILEDES, F_GETLK, LOCKP)
-
-     If there is a lock already in place that would block the lock
-     described by the LOCKP argument, information about that lock
-     overwrites `*LOCKP'.  Existing locks are not reported if they are
-     compatible with making a new lock as specified.  Thus, you should
-     specify a lock type of `F_WRLCK' if you want to find out about both
-     read and write locks, or `F_RDLCK' if you want to find out about
-     write locks only.
-
-     There might be more than one lock affecting the region specified
-     by the LOCKP argument, but `fcntl' only returns information about
-     one of them.  The `l_whence' member of the LOCKP structure is set
-     to `SEEK_SET' and the `l_start' and `l_len' fields set to identify
-     the locked region.
-
-     If no lock applies, the only change to the LOCKP structure is to
-     update the `l_type' to a value of `F_UNLCK'.
-
-     The normal return value from `fcntl' with this command is an
-     unspecified value other than -1, which is reserved to indicate an
-     error.  The following `errno' error conditions are defined for
-     this command:
-
-    `EBADF'
-          The FILEDES argument is invalid.
-
-    `EINVAL'
-          Either the LOCKP argument doesn't specify valid lock
-          information, or the file associated with FILEDES doesn't
-          support locks.
-
- -- Macro: int F_SETLK
-     This macro is used as the COMMAND argument to `fcntl', to specify
-     that it should set or clear a lock.  This command requires a third
-     argument of type `struct flock *' to be passed to `fcntl', so that
-     the form of the call is:
-
-          fcntl (FILEDES, F_SETLK, LOCKP)
-
-     If the process already has a lock on any part of the region, the
-     old lock on that part is replaced with the new lock.  You can
-     remove a lock by specifying a lock type of `F_UNLCK'.
-
-     If the lock cannot be set, `fcntl' returns immediately with a value
-     of -1.  This function does not block waiting for other processes
-     to release locks.  If `fcntl' succeeds, it return a value other
-     than -1.
-
-     The following `errno' error conditions are defined for this
-     function:
-
-    `EAGAIN'
-    `EACCES'
-          The lock cannot be set because it is blocked by an existing
-          lock on the file.  Some systems use `EAGAIN' in this case,
-          and other systems use `EACCES'; your program should treat
-          them alike, after `F_SETLK'.  (GNU/Linux and GNU/Hurd systems
-          always use `EAGAIN'.)
-
-    `EBADF'
-          Either: the FILEDES argument is invalid; you requested a read
-          lock but the FILEDES is not open for read access; or, you
-          requested a write lock but the FILEDES is not open for write
-          access.
-
-    `EINVAL'
-          Either the LOCKP argument doesn't specify valid lock
-          information, or the file associated with FILEDES doesn't
-          support locks.
-
-    `ENOLCK'
-          The system has run out of file lock resources; there are
-          already too many file locks in place.
-
-          Well-designed file systems never report this error, because
-          they have no limitation on the number of locks.  However, you
-          must still take account of the possibility of this error, as
-          it could result from network access to a file system on
-          another machine.
-
- -- Macro: int F_SETLKW
-     This macro is used as the COMMAND argument to `fcntl', to specify
-     that it should set or clear a lock.  It is just like the `F_SETLK'
-     command, but causes the process to block (or wait) until the
-     request can be specified.
-
-     This command requires a third argument of type `struct flock *', as
-     for the `F_SETLK' command.
-
-     The `fcntl' return values and errors are the same as for the
-     `F_SETLK' command, but these additional `errno' error conditions
-     are defined for this command:
-
-    `EINTR'
-          The function was interrupted by a signal while it was waiting.
-          *Note Interrupted Primitives::.
-
-    `EDEADLK'
-          The specified region is being locked by another process.  But
-          that process is waiting to lock a region which the current
-          process has locked, so waiting for the lock would result in
-          deadlock.  The system does not guarantee that it will detect
-          all such conditions, but it lets you know if it notices one.
-
-   The following macros are defined for use as values for the `l_type'
-member of the `flock' structure.  The values are integer constants.
-
-`F_RDLCK'
-     This macro is used to specify a read (or shared) lock.
-
-`F_WRLCK'
-     This macro is used to specify a write (or exclusive) lock.
-
-`F_UNLCK'
-     This macro is used to specify that the region is unlocked.
-
-   As an example of a situation where file locking is useful, consider a
-program that can be run simultaneously by several different users, that
-logs status information to a common file.  One example of such a program
-might be a game that uses a file to keep track of high scores.  Another
-example might be a program that records usage or accounting information
-for billing purposes.
-
-   Having multiple copies of the program simultaneously writing to the
-file could cause the contents of the file to become mixed up.  But you
-can prevent this kind of problem by setting a write lock on the file
-before actually writing to the file.
-
-   If the program also needs to read the file and wants to make sure
-that the contents of the file are in a consistent state, then it can
-also use a read lock.  While the read lock is set, no other process can
-lock that part of the file for writing.
-
-   Remember that file locks are only a _voluntary_ protocol for
-controlling access to a file.  There is still potential for access to
-the file by programs that don't use the lock protocol.
-
-
-File: libc.info,  Node: Interrupt Input,  Next: IOCTLs,  Prev: File Locks,  Up: Low-Level I/O
-
-13.16 Interrupt-Driven Input
-============================
-
-If you set the `O_ASYNC' status flag on a file descriptor (*note File
-Status Flags::), a `SIGIO' signal is sent whenever input or output
-becomes possible on that file descriptor.  The process or process group
-to receive the signal can be selected by using the `F_SETOWN' command
-to the `fcntl' function.  If the file descriptor is a socket, this also
-selects the recipient of `SIGURG' signals that are delivered when
-out-of-band data arrives on that socket; see *note Out-of-Band Data::.
-(`SIGURG' is sent in any situation where `select' would report the
-socket as having an "exceptional condition".  *Note Waiting for I/O::.)
-
-   If the file descriptor corresponds to a terminal device, then `SIGIO'
-signals are sent to the foreground process group of the terminal.
-*Note Job Control::.
-
-   The symbols in this section are defined in the header file `fcntl.h'.
-
- -- Macro: int F_GETOWN
-     This macro is used as the COMMAND argument to `fcntl', to specify
-     that it should get information about the process or process group
-     to which `SIGIO' signals are sent.  (For a terminal, this is
-     actually the foreground process group ID, which you can get using
-     `tcgetpgrp'; see *note Terminal Access Functions::.)
-
-     The return value is interpreted as a process ID; if negative, its
-     absolute value is the process group ID.
-
-     The following `errno' error condition is defined for this command:
-
-    `EBADF'
-          The FILEDES argument is invalid.
-
- -- Macro: int F_SETOWN
-     This macro is used as the COMMAND argument to `fcntl', to specify
-     that it should set the process or process group to which `SIGIO'
-     signals are sent.  This command requires a third argument of type
-     `pid_t' to be passed to `fcntl', so that the form of the call is:
-
-          fcntl (FILEDES, F_SETOWN, PID)
-
-     The PID argument should be a process ID.  You can also pass a
-     negative number whose absolute value is a process group ID.
-
-     The return value from `fcntl' with this command is -1 in case of
-     error and some other value if successful.  The following `errno'
-     error conditions are defined for this command:
-
-    `EBADF'
-          The FILEDES argument is invalid.
-
-    `ESRCH'
-          There is no process or process group corresponding to PID.
-
-
-File: libc.info,  Node: IOCTLs,  Prev: Interrupt Input,  Up: Low-Level I/O
-
-13.17 Generic I/O Control operations
-====================================
-
-GNU systems can handle most input/output operations on many different
-devices and objects in terms of a few file primitives - `read', `write'
-and `lseek'.  However, most devices also have a few peculiar operations
-which do not fit into this model. Such as:
-
-   * Changing the character font used on a terminal.
-
-   * Telling a magnetic tape system to rewind or fast forward.  (Since
-     they cannot move in byte increments, `lseek' is inapplicable).
-
-   * Ejecting a disk from a drive.
-
-   * Playing an audio track from a CD-ROM drive.
-
-   * Maintaining routing tables for a network.
-
-
-   Although some such objects such as sockets and terminals (1) have
-special functions of their own, it would not be practical to create
-functions for all these cases.
-
-   Instead these minor operations, known as "IOCTL"s, are assigned code
-numbers and multiplexed through the `ioctl' function, defined in
-`sys/ioctl.h'.  The code numbers themselves are defined in many
-different headers.
-
- -- Function: int ioctl (int FILEDES, int COMMAND, ...)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `ioctl' function performs the generic I/O operation COMMAND on
-     FILEDES.
-
-     A third argument is usually present, either a single number or a
-     pointer to a structure.  The meaning of this argument, the
-     returned value, and any error codes depends upon the command used.
-     Often -1 is returned for a failure.
-
-
-   On some systems, IOCTLs used by different devices share the same
-numbers.  Thus, although use of an inappropriate IOCTL _usually_ only
-produces an error, you should not attempt to use device-specific IOCTLs
-on an unknown device.
-
-   Most IOCTLs are OS-specific and/or only used in special system
-utilities, and are thus beyond the scope of this document.  For an
-example of the use of an IOCTL, see *note Out-of-Band Data::.
-
-   ---------- Footnotes ----------
-
-   (1) Actually, the terminal-specific functions are implemented with
-IOCTLs on many platforms.
-
-
-File: libc.info,  Node: File System Interface,  Next: Pipes and FIFOs,  Prev: Low-Level I/O,  Up: Top
-
-14 File System Interface
-************************
-
-This chapter describes the GNU C Library's functions for manipulating
-files.  Unlike the input and output functions (*note I/O on Streams::;
-*note Low-Level I/O::), these functions are concerned with operating on
-the files themselves rather than on their contents.
-
-   Among the facilities described in this chapter are functions for
-examining or modifying directories, functions for renaming and deleting
-files, and functions for examining and setting file attributes such as
-access permissions and modification times.
-
-* Menu:
-
-* Working Directory::           This is used to resolve relative
-				 file names.
-* Accessing Directories::       Finding out what files a directory
-				 contains.
-* Working with Directory Trees:: Apply actions to all files or a selectable
-                                 subset of a directory hierarchy.
-* Hard Links::                  Adding alternate names to a file.
-* Symbolic Links::              A file that ``points to'' a file name.
-* Deleting Files::              How to delete a file, and what that means.
-* Renaming Files::              Changing a file's name.
-* Creating Directories::        A system call just for creating a directory.
-* File Attributes::             Attributes of individual files.
-* Making Special Files::        How to create special files.
-* Temporary Files::             Naming and creating temporary files.
-
-
-File: libc.info,  Node: Working Directory,  Next: Accessing Directories,  Up: File System Interface
-
-14.1 Working Directory
-======================
-
-Each process has associated with it a directory, called its "current
-working directory" or simply "working directory", that is used in the
-resolution of relative file names (*note File Name Resolution::).
-
-   When you log in and begin a new session, your working directory is
-initially set to the home directory associated with your login account
-in the system user database.  You can find any user's home directory
-using the `getpwuid' or `getpwnam' functions; see *note User Database::.
-
-   Users can change the working directory using shell commands like
-`cd'.  The functions described in this section are the primitives used
-by those commands and by other programs for examining and changing the
-working directory.  
-
-   Prototypes for these functions are declared in the header file
-`unistd.h'.  
-
- -- Function: char * getcwd (char *BUFFER, size_t SIZE)
-     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
-     POSIX Safety Concepts::.
-
-     The `getcwd' function returns an absolute file name representing
-     the current working directory, storing it in the character array
-     BUFFER that you provide.  The SIZE argument is how you tell the
-     system the allocation size of BUFFER.
-
-     The GNU C Library version of this function also permits you to
-     specify a null pointer for the BUFFER argument.  Then `getcwd'
-     allocates a buffer automatically, as with `malloc' (*note
-     Unconstrained Allocation::).  If the SIZE is greater than zero,
-     then the buffer is that large; otherwise, the buffer is as large
-     as necessary to hold the result.
-
-     The return value is BUFFER on success and a null pointer on
-     failure.  The following `errno' error conditions are defined for
-     this function:
-
-    `EINVAL'
-          The SIZE argument is zero and BUFFER is not a null pointer.
-
-    `ERANGE'
-          The SIZE argument is less than the length of the working
-          directory name.  You need to allocate a bigger array and try
-          again.
-
-    `EACCES'
-          Permission to read or search a component of the file name was
-          denied.
-
-   You could implement the behavior of GNU's `getcwd (NULL, 0)' using
-only the standard behavior of `getcwd':
-
-     char *
-     gnu_getcwd ()
-     {
-       size_t size = 100;
-
-       while (1)
-         {
-           char *buffer = (char *) xmalloc (size);
-           if (getcwd (buffer, size) == buffer)
-             return buffer;
-           free (buffer);
-           if (errno != ERANGE)
-             return 0;
-           size *= 2;
-         }
-     }
-
-*Note Malloc Examples::, for information about `xmalloc', which is not
-a library function but is a customary name used in most GNU software.
-
- -- Deprecated Function: char * getwd (char *BUFFER)
-     Preliminary: | MT-Safe | AS-Unsafe heap i18n | AC-Unsafe mem fd |
-     *Note POSIX Safety Concepts::.
-
-     This is similar to `getcwd', but has no way to specify the size of
-     the buffer.  The GNU C Library provides `getwd' only for backwards
-     compatibility with BSD.
-
-     The BUFFER argument should be a pointer to an array at least
-     `PATH_MAX' bytes long (*note Limits for Files::).  On GNU/Hurd
-     systems there is no limit to the size of a file name, so this is
-     not necessarily enough space to contain the directory name.  That
-     is why this function is deprecated.
-
- -- Function: char * get_current_dir_name (void)
-     Preliminary: | MT-Safe env | AS-Unsafe heap | AC-Unsafe mem fd |
-     *Note POSIX Safety Concepts::.
-
-     This `get_current_dir_name' function is basically equivalent to
-     `getcwd (NULL, 0)'.  The only difference is that the value of the
-     `PWD' variable is returned if this value is correct.  This is a
-     subtle difference which is visible if the path described by the
-     `PWD' value is using one or more symbol links in which case the
-     value returned by `getcwd' can resolve the symbol links and
-     therefore yield a different result.
-
-     This function is a GNU extension.
-
- -- Function: int chdir (const char *FILENAME)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is used to set the process's working directory to
-     FILENAME.
-
-     The normal, successful return value from `chdir' is `0'.  A value
-     of `-1' is returned to indicate an error.  The `errno' error
-     conditions defined for this function are the usual file name
-     syntax errors (*note File Name Errors::), plus `ENOTDIR' if the
-     file FILENAME is not a directory.
-
- -- Function: int fchdir (int FILEDES)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is used to set the process's working directory to
-     directory associated with the file descriptor FILEDES.
-
-     The normal, successful return value from `fchdir' is `0'.  A value
-     of `-1' is returned to indicate an error.  The following `errno'
-     error conditions are defined for this function:
-
-    `EACCES'
-          Read permission is denied for the directory named by
-          `dirname'.
-
-    `EBADF'
-          The FILEDES argument is not a valid file descriptor.
-
-    `ENOTDIR'
-          The file descriptor FILEDES is not associated with a
-          directory.
-
-    `EINTR'
-          The function call was interrupt by a signal.
-
-    `EIO'
-          An I/O error occurred.
-
-
-File: libc.info,  Node: Accessing Directories,  Next: Working with Directory Trees,  Prev: Working Directory,  Up: File System Interface
-
-14.2 Accessing Directories
-==========================
-
-The facilities described in this section let you read the contents of a
-directory file.  This is useful if you want your program to list all the
-files in a directory, perhaps as part of a menu.
-
-   The `opendir' function opens a "directory stream" whose elements are
-directory entries.  Alternatively `fdopendir' can be used which can
-have advantages if the program needs to have more control over the way
-the directory is opened for reading.  This allows, for instance, to
-pass the `O_NOATIME' flag to `open'.
-
-   You use the `readdir' function on the directory stream to retrieve
-these entries, represented as `struct dirent' objects.  The name of the
-file for each entry is stored in the `d_name' member of this structure.
-There are obvious parallels here to the stream facilities for ordinary
-files, described in *note I/O on Streams::.
-
-* Menu:
-
-* Directory Entries::           Format of one directory entry.
-* Opening a Directory::         How to open a directory stream.
-* Reading/Closing Directory::   How to read directory entries from the stream.
-* Simple Directory Lister::     A very simple directory listing program.
-* Random Access Directory::     Rereading part of the directory
-                                 already read with the same stream.
-* Scanning Directory Content::  Get entries for user selected subset of
-                                 contents in given directory.
-* Simple Directory Lister Mark II::  Revised version of the program.
-
-
-File: libc.info,  Node: Directory Entries,  Next: Opening a Directory,  Up: Accessing Directories
-
-14.2.1 Format of a Directory Entry
-----------------------------------
-
-This section describes what you find in a single directory entry, as you
-might obtain it from a directory stream.  All the symbols are declared
-in the header file `dirent.h'.
-
- -- Data Type: struct dirent
-     This is a structure type used to return information about directory
-     entries.  It contains the following fields:
-
-    `char d_name[]'
-          This is the null-terminated file name component.  This is the
-          only field you can count on in all POSIX systems.
-
-    `ino_t d_fileno'
-          This is the file serial number.  For BSD compatibility, you
-          can also refer to this member as `d_ino'.  On GNU/Linux and
-          GNU/Hurd systems and most POSIX systems, for most files this
-          the same as the `st_ino' member that `stat' will return for
-          the file.  *Note File Attributes::.
-
-    `unsigned char d_namlen'
-          This is the length of the file name, not including the
-          terminating null character.  Its type is `unsigned char'
-          because that is the integer type of the appropriate size.
-          This member is a BSD extension.  The symbol
-          `_DIRENT_HAVE_D_NAMLEN' is defined if this member is
-          available.
-
-    `unsigned char d_type'
-          This is the type of the file, possibly unknown.  The
-          following constants are defined for its value:
-
-         `DT_UNKNOWN'
-               The type is unknown.  Only some filesystems have full
-               support to return the type of the file, others might
-               always return this value.
-
-         `DT_REG'
-               A regular file.
-
-         `DT_DIR'
-               A directory.
-
-         `DT_FIFO'
-               A named pipe, or FIFO.  *Note FIFO Special Files::.
-
-         `DT_SOCK'
-               A local-domain socket.
-
-         `DT_CHR'
-               A character device.
-
-         `DT_BLK'
-               A block device.
-
-         `DT_LNK'
-               A symbolic link.
-
-          This member is a BSD extension.  The symbol
-          `_DIRENT_HAVE_D_TYPE' is defined if this member is available.
-          On systems where it is used, it corresponds to the file type
-          bits in the `st_mode' member of `struct stat'.  If the value
-          cannot be determine the member value is DT_UNKNOWN.  These
-          two macros convert between `d_type' values and `st_mode'
-          values:
-
-           -- Function: int IFTODT (mode_t MODE)
-               Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX
-               Safety Concepts::.
-
-               This returns the `d_type' value corresponding to MODE.
-
-           -- Function: mode_t DTTOIF (int DTYPE)
-               Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX
-               Safety Concepts::.
-
-               This returns the `st_mode' value corresponding to DTYPE.
-
-     This structure may contain additional members in the future.  Their
-     availability is always announced in the compilation environment by
-     a macro names `_DIRENT_HAVE_D_XXX' where XXX is replaced by the
-     name of the new member.  For instance, the member `d_reclen'
-     available on some systems is announced through the macro
-     `_DIRENT_HAVE_D_RECLEN'.
-
-     When a file has multiple names, each name has its own directory
-     entry.  The only way you can tell that the directory entries
-     belong to a single file is that they have the same value for the
-     `d_fileno' field.
-
-     File attributes such as size, modification times etc., are part of
-     the file itself, not of any particular directory entry.  *Note
-     File Attributes::.
-
-
-File: libc.info,  Node: Opening a Directory,  Next: Reading/Closing Directory,  Prev: Directory Entries,  Up: Accessing Directories
-
-14.2.2 Opening a Directory Stream
----------------------------------
-
-This section describes how to open a directory stream.  All the symbols
-are declared in the header file `dirent.h'.
-
- -- Data Type: DIR
-     The `DIR' data type represents a directory stream.
-
-   You shouldn't ever allocate objects of the `struct dirent' or `DIR'
-data types, since the directory access functions do that for you.
-Instead, you refer to these objects using the pointers returned by the
-following functions.
-
- -- Function: DIR * opendir (const char *DIRNAME)
-     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
-     POSIX Safety Concepts::.
-
-     The `opendir' function opens and returns a directory stream for
-     reading the directory whose file name is DIRNAME.  The stream has
-     type `DIR *'.
-
-     If unsuccessful, `opendir' returns a null pointer.  In addition to
-     the usual file name errors (*note File Name Errors::), the
-     following `errno' error conditions are defined for this function:
-
-    `EACCES'
-          Read permission is denied for the directory named by
-          `dirname'.
-
-    `EMFILE'
-          The process has too many files open.
-
-    `ENFILE'
-          The entire system, or perhaps the file system which contains
-          the directory, cannot support any additional open files at
-          the moment.  (This problem cannot happen on GNU/Hurd systems.)
-
-    `ENOMEM'
-          Not enough memory available.
-
-     The `DIR' type is typically implemented using a file descriptor,
-     and the `opendir' function in terms of the `open' function.  *Note
-     Low-Level I/O::.  Directory streams and the underlying file
-     descriptors are closed on `exec' (*note Executing a File::).
-
-   The directory which is opened for reading by `opendir' is identified
-by the name.  In some situations this is not sufficient.  Or the way
-`opendir' implicitly creates a file descriptor for the directory is not
-the way a program might want it.  In these cases an alternative
-interface can be used.
-
- -- Function: DIR * fdopendir (int FD)
-     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
-     POSIX Safety Concepts::.
-
-     The `fdopendir' function works just like `opendir' but instead of
-     taking a file name and opening a file descriptor for the directory
-     the caller is required to provide a file descriptor.  This file
-     descriptor is then used in subsequent uses of the returned
-     directory stream object.
-
-     The caller must make sure the file descriptor is associated with a
-     directory and it allows reading.
-
-     If the `fdopendir' call returns successfully the file descriptor
-     is now under the control of the system.  It can be used in the same
-     way the descriptor implicitly created by `opendir' can be used but
-     the program must not close the descriptor.
-
-     In case the function is unsuccessful it returns a null pointer and
-     the file descriptor remains to be usable by the program.  The
-     following `errno' error conditions are defined for this function:
-
-    `EBADF'
-          The file descriptor is not valid.
-
-    `ENOTDIR'
-          The file descriptor is not associated with a directory.
-
-    `EINVAL'
-          The descriptor does not allow reading the directory content.
-
-    `ENOMEM'
-          Not enough memory available.
-
-   In some situations it can be desirable to get hold of the file
-descriptor which is created by the `opendir' call.  For instance, to
-switch the current working directory to the directory just read the
-`fchdir' function could be used.  Historically the `DIR' type was
-exposed and programs could access the fields.  This does not happen in
-the GNU C Library.  Instead a separate function is provided to allow
-access.
-
- -- Function: int dirfd (DIR *DIRSTREAM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The function `dirfd' returns the file descriptor associated with
-     the directory stream DIRSTREAM.  This descriptor can be used until
-     the directory is closed with `closedir'.  If the directory stream
-     implementation is not using file descriptors the return value is
-     `-1'.
-
-
-File: libc.info,  Node: Reading/Closing Directory,  Next: Simple Directory Lister,  Prev: Opening a Directory,  Up: Accessing Directories
-
-14.2.3 Reading and Closing a Directory Stream
----------------------------------------------
-
-This section describes how to read directory entries from a directory
-stream, and how to close the stream when you are done with it.  All the
-symbols are declared in the header file `dirent.h'.
-
- -- Function: struct dirent * readdir (DIR *DIRSTREAM)
-     Preliminary: | MT-Unsafe race:dirstream | AS-Unsafe lock |
-     AC-Unsafe lock | *Note POSIX Safety Concepts::.
-
-     This function reads the next entry from the directory.  It normally
-     returns a pointer to a structure containing information about the
-     file.  This structure is associated with the DIRSTREAM handle and
-     can be rewritten by a subsequent call.
-
-     *Portability Note:* On some systems `readdir' may not return
-     entries for `.' and `..', even though these are always valid file
-     names in any directory.  *Note File Name Resolution::.
-
-     If there are no more entries in the directory or an error is
-     detected, `readdir' returns a null pointer.  The following `errno'
-     error conditions are defined for this function:
-
-    `EBADF'
-          The DIRSTREAM argument is not valid.
-
-     To distinguish between an end-of-directory condition or an error,
-     you must set `errno' to zero before calling `readdir'.  To avoid
-     entering an infinite loop, you should stop reading from the
-     directory after the first error.
-
-     In POSIX.1-2008, `readdir' is not thread-safe.  In the GNU C
-     Library implementation, it is safe to call `readdir' concurrently
-     on different DIRSTREAMs, but multiple threads accessing the same
-     DIRSTREAM result in undefined behavior.  `readdir_r' is a fully
-     thread-safe alternative, but suffers from poor portability (see
-     below).  It is recommended that you use `readdir', with external
-     locking if multiple threads access the same DIRSTREAM.
-
- -- Function: int readdir_r (DIR *DIRSTREAM, struct dirent *ENTRY,
-          struct dirent **RESULT)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     This function is a version of `readdir' which performs internal
-     locking.  Like `readdir' it returns the next entry from the
-     directory.  To prevent conflicts between simultaneously running
-     threads the result is stored inside the ENTRY object.
-
-     *Portability Note:* It is recommended to use `readdir' instead of
-     `readdir_r' for the following reasons:
-
-        * On systems which do not define `NAME_MAX', it may not be
-          possible to use `readdir_r' safely because the caller does
-          not specify the length of the buffer for the directory entry.
-
-        * On some systems, `readdir_r' cannot read directory entries
-          with very long names.  If such a name is encountered, the GNU
-          C Library implementation of `readdir_r' returns with an error
-          code of `ENAMETOOLONG' after the final directory entry has
-          been read.  On other systems, `readdir_r' may return
-          successfully, but the `d_name' member may not be
-          NUL-terminated or may be truncated.
-
-        * POSIX-1.2008 does not guarantee that `readdir' is thread-safe,
-          even when access to the same DIRSTREAM is serialized.  But in
-          current implementations (including the GNU C Library), it is
-          safe to call `readdir' concurrently on different DIRSTREAMs,
-          so there is no need to use `readdir_r' in most multi-threaded
-          programs.  In the rare case that multiple threads need to
-          read from the same DIRSTREAM, it is still better to use
-          `readdir' and external synchronization.
-
-        * It is expected that future versions of POSIX will obsolete
-          `readdir_r' and mandate the level of thread safety for
-          `readdir' which is provided by the GNU C Library and other
-          implementations today.
-
-     Normally `readdir_r' returns zero and sets `*RESULT' to ENTRY.  If
-     there are no more entries in the directory or an error is
-     detected, `readdir_r' sets `*RESULT' to a null pointer and returns
-     a nonzero error code, also stored in `errno', as described for
-     `readdir'.
-
-     It is also important to look at the definition of the `struct
-     dirent' type.  Simply passing a pointer to an object of this type
-     for the second parameter of `readdir_r' might not be enough.  Some
-     systems don't define the `d_name' element sufficiently long.  In
-     this case the user has to provide additional space.  There must be
-     room for at least `NAME_MAX + 1' characters in the `d_name' array.
-     Code to call `readdir_r' could look like this:
-
-            union
-            {
-              struct dirent d;
-              char b[offsetof (struct dirent, d_name) + NAME_MAX + 1];
-            } u;
-
-            if (readdir_r (dir, &u.d, &res) == 0)
-              ...
-
-   To support large filesystems on 32-bit machines there are LFS
-variants of the last two functions.
-
- -- Function: struct dirent64 * readdir64 (DIR *DIRSTREAM)
-     Preliminary: | MT-Unsafe race:dirstream | AS-Unsafe lock |
-     AC-Unsafe lock | *Note POSIX Safety Concepts::.
-
-     The `readdir64' function is just like the `readdir' function
-     except that it returns a pointer to a record of type `struct
-     dirent64'.  Some of the members of this data type (notably `d_ino')
-     might have a different size to allow large filesystems.
-
-     In all other aspects this function is equivalent to `readdir'.
-
- -- Function: int readdir64_r (DIR *DIRSTREAM, struct dirent64 *ENTRY,
-          struct dirent64 **RESULT)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     The `readdir64_r' function is equivalent to the `readdir_r'
-     function except that it takes parameters of base type `struct
-     dirent64' instead of `struct dirent' in the second and third
-     position.  The same precautions mentioned in the documentation of
-     `readdir_r' also apply here.
-
- -- Function: int closedir (DIR *DIRSTREAM)
-     Preliminary: | MT-Safe | AS-Unsafe heap lock/hurd | AC-Unsafe mem
-     fd lock/hurd | *Note POSIX Safety Concepts::.
-
-     This function closes the directory stream DIRSTREAM.  It returns
-     `0' on success and `-1' on failure.
-
-     The following `errno' error conditions are defined for this
-     function:
-
-    `EBADF'
-          The DIRSTREAM argument is not valid.
-
-
-File: libc.info,  Node: Simple Directory Lister,  Next: Random Access Directory,  Prev: Reading/Closing Directory,  Up: Accessing Directories
-
-14.2.4 Simple Program to List a Directory
------------------------------------------
-
-Here's a simple program that prints the names of the files in the
-current working directory:
-
-
-     #include <stdio.h>
-     #include <sys/types.h>
-     #include <dirent.h>
-
-     int
-     main (void)
-     {
-       DIR *dp;
-       struct dirent *ep;
-
-       dp = opendir ("./");
-       if (dp != NULL)
-         {
-           while (ep = readdir (dp))
-             puts (ep->d_name);
-           (void) closedir (dp);
-         }
-       else
-         perror ("Couldn't open the directory");
-
-       return 0;
-     }
-
-   The order in which files appear in a directory tends to be fairly
-random.  A more useful program would sort the entries (perhaps by
-alphabetizing them) before printing them; see *note Scanning Directory
-Content::, and *note Array Sort Function::.
-
-
-File: libc.info,  Node: Random Access Directory,  Next: Scanning Directory Content,  Prev: Simple Directory Lister,  Up: Accessing Directories
-
-14.2.5 Random Access in a Directory Stream
-------------------------------------------
-
-This section describes how to reread parts of a directory that you have
-already read from an open directory stream.  All the symbols are
-declared in the header file `dirent.h'.
-
- -- Function: void rewinddir (DIR *DIRSTREAM)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     The `rewinddir' function is used to reinitialize the directory
-     stream DIRSTREAM, so that if you call `readdir' it returns
-     information about the first entry in the directory again.  This
-     function also notices if files have been added or removed to the
-     directory since it was opened with `opendir'.  (Entries for these
-     files might or might not be returned by `readdir' if they were
-     added or removed since you last called `opendir' or `rewinddir'.)
-
- -- Function: long int telldir (DIR *DIRSTREAM)
-     Preliminary: | MT-Safe | AS-Unsafe heap/bsd lock/bsd | AC-Unsafe
-     mem/bsd lock/bsd | *Note POSIX Safety Concepts::.
-
-     The `telldir' function returns the file position of the directory
-     stream DIRSTREAM.  You can use this value with `seekdir' to
-     restore the directory stream to that position.
-
- -- Function: void seekdir (DIR *DIRSTREAM, long int POS)
-     Preliminary: | MT-Safe | AS-Unsafe heap/bsd lock/bsd | AC-Unsafe
-     mem/bsd lock/bsd | *Note POSIX Safety Concepts::.
-
-     The `seekdir' function sets the file position of the directory
-     stream DIRSTREAM to POS.  The value POS must be the result of a
-     previous call to `telldir' on this particular stream; closing and
-     reopening the directory can invalidate values returned by
-     `telldir'.
-
-
-File: libc.info,  Node: Scanning Directory Content,  Next: Simple Directory Lister Mark II,  Prev: Random Access Directory,  Up: Accessing Directories
-
-14.2.6 Scanning the Content of a Directory
-------------------------------------------
-
-A higher-level interface to the directory handling functions is the
-`scandir' function.  With its help one can select a subset of the
-entries in a directory, possibly sort them and get a list of names as
-the result.
-
- -- Function: int scandir (const char *DIR, struct dirent ***NAMELIST,
-          int (*SELECTOR) (const struct dirent *), int (*CMP) (const
-          struct dirent **, const struct dirent **))
-     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
-     POSIX Safety Concepts::.
-
-     The `scandir' function scans the contents of the directory selected
-     by DIR.  The result in *NAMELIST is an array of pointers to
-     structure of type `struct dirent' which describe all selected
-     directory entries and which is allocated using `malloc'.  Instead
-     of always getting all directory entries returned, the user supplied
-     function SELECTOR can be used to decide which entries are in the
-     result.  Only the entries for which SELECTOR returns a non-zero
-     value are selected.
-
-     Finally the entries in *NAMELIST are sorted using the
-     user-supplied function CMP.  The arguments passed to the CMP
-     function are of type `struct dirent **', therefore one cannot
-     directly use the `strcmp' or `strcoll' functions; instead see the
-     functions `alphasort' and `versionsort' below.
-
-     The return value of the function is the number of entries placed in
-     *NAMELIST.  If it is `-1' an error occurred (either the directory
-     could not be opened for reading or the malloc call failed) and the
-     global variable `errno' contains more information on the error.
-
-   As described above the fourth argument to the `scandir' function
-must be a pointer to a sorting function.  For the convenience of the
-programmer the GNU C Library contains implementations of functions which
-are very helpful for this purpose.
-
- -- Function: int alphasort (const void *A, const void *B)
-     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
-     *Note POSIX Safety Concepts::.
-
-     The `alphasort' function behaves like the `strcoll' function
-     (*note String/Array Comparison::).  The difference is that the
-     arguments are not string pointers but instead they are of type
-     `struct dirent **'.
-
-     The return value of `alphasort' is less than, equal to, or greater
-     than zero depending on the order of the two entries A and B.
-
- -- Function: int versionsort (const void *A, const void *B)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     The `versionsort' function is like `alphasort' except that it uses
-     the `strverscmp' function internally.
-
-   If the filesystem supports large files we cannot use the `scandir'
-anymore since the `dirent' structure might not able to contain all the
-information.  The LFS provides the new type `struct dirent64'.  To use
-this we need a new function.
-
- -- Function: int scandir64 (const char *DIR, struct dirent64
-          ***NAMELIST, int (*SELECTOR) (const struct dirent64 *), int
-          (*CMP) (const struct dirent64 **, const struct dirent64 **))
-     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
-     POSIX Safety Concepts::.
-
-     The `scandir64' function works like the `scandir' function except
-     that the directory entries it returns are described by elements of
-     type `struct dirent64'.  The function pointed to by SELECTOR is
-     again used to select the desired entries, except that SELECTOR now
-     must point to a function which takes a `struct dirent64 *'
-     parameter.
-
-     Similarly the CMP function should expect its two arguments to be
-     of type `struct dirent64 **'.
-
-   As CMP is now a function of a different type, the functions
-`alphasort' and `versionsort' cannot be supplied for that argument.
-Instead we provide the two replacement functions below.
-
- -- Function: int alphasort64 (const void *A, const void *B)
-     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
-     *Note POSIX Safety Concepts::.
-
-     The `alphasort64' function behaves like the `strcoll' function
-     (*note String/Array Comparison::).  The difference is that the
-     arguments are not string pointers but instead they are of type
-     `struct dirent64 **'.
-
-     Return value of `alphasort64' is less than, equal to, or greater
-     than zero depending on the order of the two entries A and B.
-
- -- Function: int versionsort64 (const void *A, const void *B)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     The `versionsort64' function is like `alphasort64', excepted that
-     it uses the `strverscmp' function internally.
-
-   It is important not to mix the use of `scandir' and the 64-bit
-comparison functions or vice versa.  There are systems on which this
-works but on others it will fail miserably.
-
-
-File: libc.info,  Node: Simple Directory Lister Mark II,  Prev: Scanning Directory Content,  Up: Accessing Directories
-
-14.2.7 Simple Program to List a Directory, Mark II
---------------------------------------------------
-
-Here is a revised version of the directory lister found above (*note
-Simple Directory Lister::).  Using the `scandir' function we can avoid
-the functions which work directly with the directory contents.  After
-the call the returned entries are available for direct use.
-
-
-     #include <stdio.h>
-     #include <dirent.h>
-
-     static int
-     one (const struct dirent *unused)
-     {
-       return 1;
-     }
-
-     int
-     main (void)
-     {
-       struct dirent **eps;
-       int n;
-
-       n = scandir ("./", &eps, one, alphasort);
-       if (n >= 0)
-         {
-           int cnt;
-           for (cnt = 0; cnt < n; ++cnt)
-             puts (eps[cnt]->d_name);
-         }
-       else
-         perror ("Couldn't open the directory");
-
-       return 0;
-     }
-
-   Note the simple selector function in this example.  Since we want to
-see all directory entries we always return `1'.
-
-
-File: libc.info,  Node: Working with Directory Trees,  Next: Hard Links,  Prev: Accessing Directories,  Up: File System Interface
-
-14.3 Working with Directory Trees
-=================================
-
-The functions described so far for handling the files in a directory
-have allowed you to either retrieve the information bit by bit, or to
-process all the files as a group (see `scandir').  Sometimes it is
-useful to process whole hierarchies of directories and their contained
-files.  The X/Open specification defines two functions to do this.  The
-simpler form is derived from an early definition in System V systems
-and therefore this function is available on SVID-derived systems.  The
-prototypes and required definitions can be found in the `ftw.h' header.
-
-   There are four functions in this family: `ftw', `nftw' and their
-64-bit counterparts `ftw64' and `nftw64'.  These functions take as one
-of their arguments a pointer to a callback function of the appropriate
-type.
-
- -- Data Type: __ftw_func_t
-          int (*) (const char *, const struct stat *, int)
-
-     The type of callback functions given to the `ftw' function.  The
-     first parameter points to the file name, the second parameter to an
-     object of type `struct stat' which is filled in for the file named
-     in the first parameter.
-
-     The last parameter is a flag giving more information about the
-     current file.  It can have the following values:
-
-    `FTW_F'
-          The item is either a normal file or a file which does not fit
-          into one of the following categories.  This could be special
-          files, sockets etc.
-
-    `FTW_D'
-          The item is a directory.
-
-    `FTW_NS'
-          The `stat' call failed and so the information pointed to by
-          the second paramater is invalid.
-
-    `FTW_DNR'
-          The item is a directory which cannot be read.
-
-    `FTW_SL'
-          The item is a symbolic link.  Since symbolic links are
-          normally followed seeing this value in a `ftw' callback
-          function means the referenced file does not exist.  The
-          situation for `nftw' is different.
-
-          This value is only available if the program is compiled with
-          `_BSD_SOURCE' or `_XOPEN_EXTENDED' defined before including
-          the first header.  The original SVID systems do not have
-          symbolic links.
-
-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' this
-     type is in fact `__ftw64_func_t' since this mode changes `struct
-     stat' to be `struct stat64'.
-
-   For the LFS interface and for use in the function `ftw64', the
-header `ftw.h' defines another function type.
-
- -- Data Type: __ftw64_func_t
-          int (*) (const char *, const struct stat64 *, int)
-
-     This type is used just like `__ftw_func_t' for the callback
-     function, but this time is called from `ftw64'.  The second
-     parameter to the function is a pointer to a variable of type
-     `struct stat64' which is able to represent the larger values.
-
- -- Data Type: __nftw_func_t
-          int (*) (const char *, const struct stat *, int, struct FTW *)
-
-     The first three arguments are the same as for the `__ftw_func_t'
-     type.  However for the third argument some additional values are
-     defined to allow finer differentiation:
-    `FTW_DP'
-          The current item is a directory and all subdirectories have
-          already been visited and reported.  This flag is returned
-          instead of `FTW_D' if the `FTW_DEPTH' flag is passed to
-          `nftw' (see below).
-
-    `FTW_SLN'
-          The current item is a stale symbolic link.  The file it
-          points to does not exist.
-
-     The last parameter of the callback function is a pointer to a
-     structure with some extra information as described below.
-
-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' this
-     type is in fact `__nftw64_func_t' since this mode changes `struct
-     stat' to be `struct stat64'.
-
-   For the LFS interface there is also a variant of this data type
-available which has to be used with the `nftw64' function.
-
- -- Data Type: __nftw64_func_t
-          int (*) (const char *, const struct stat64 *, int, struct FTW *)
-
-     This type is used just like `__nftw_func_t' for the callback
-     function, but this time is called from `nftw64'.  The second
-     parameter to the function is this time a pointer to a variable of
-     type `struct stat64' which is able to represent the larger values.
-
- -- Data Type: struct FTW
-     The information contained in this structure helps in interpreting
-     the name parameter and gives some information about the current
-     state of the traversal of the directory hierarchy.
-
-    `int base'
-          The value is the offset into the string passed in the first
-          parameter to the callback function of the beginning of the
-          file name.  The rest of the string is the path of the file.
-          This information is especially important if the `FTW_CHDIR'
-          flag was set in calling `nftw' since then the current
-          directory is the one the current item is found in.
-
-    `int level'
-          Whilst processing, the code tracks how many directories down
-          it has gone to find the current file.  This nesting level
-          starts at 0 for files in the initial directory (or is zero
-          for the initial file if a file was passed).
-
- -- Function: int ftw (const char *FILENAME, __ftw_func_t FUNC, int
-          DESCRIPTORS)
-     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
-     POSIX Safety Concepts::.
-
-     The `ftw' function calls the callback function given in the
-     parameter FUNC for every item which is found in the directory
-     specified by FILENAME and all directories below.  The function
-     follows symbolic links if necessary but does not process an item
-     twice.  If FILENAME is not a directory then it itself is the only
-     object returned to the callback function.
-
-     The file name passed to the callback function is constructed by
-     taking the FILENAME parameter and appending the names of all passed
-     directories and then the local file name.  So the callback
-     function can use this parameter to access the file.  `ftw' also
-     calls `stat' for the file and passes that information on to the
-     callback function.  If this `stat' call was not successful the
-     failure is indicated by setting the third argument of the callback
-     function to `FTW_NS'.  Otherwise it is set according to the
-     description given in the account of `__ftw_func_t' above.
-
-     The callback function is expected to return 0 to indicate that no
-     error occurred and that processing should continue.  If an error
-     occurred in the callback function or it wants `ftw' to return
-     immediately, the callback function can return a value other than
-     0.  This is the only correct way to stop the function.  The
-     program must not use `setjmp' or similar techniques to continue
-     from another place.  This would leave resources allocated by the
-     `ftw' function unfreed.
-
-     The DESCRIPTORS parameter to `ftw' specifies how many file
-     descriptors it is allowed to consume.  The function runs faster
-     the more descriptors it can use.  For each level in the directory
-     hierarchy at most one descriptor is used, but for very deep ones
-     any limit on open file descriptors for the process or the system
-     may be exceeded.  Moreover, file descriptor limits in a
-     multi-threaded program apply to all the threads as a group, and
-     therefore it is a good idea to supply a reasonable limit to the
-     number of open descriptors.
-
-     The return value of the `ftw' function is 0 if all callback
-     function calls returned 0 and all actions performed by the `ftw'
-     succeeded.  If a function call failed (other than calling `stat'
-     on an item) the function returns -1.  If a callback function
-     returns a value other than 0 this value is returned as the return
-     value of `ftw'.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
-     32-bit system this function is in fact `ftw64', i.e., the LFS
-     interface transparently replaces the old interface.
-
- -- Function: int ftw64 (const char *FILENAME, __ftw64_func_t FUNC, int
-          DESCRIPTORS)
-     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
-     POSIX Safety Concepts::.
-
-     This function is similar to `ftw' but it can work on filesystems
-     with large files.  File information is reported using a variable
-     of type `struct stat64' which is passed by reference to the
-     callback function.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
-     32-bit system this function is available under the name `ftw' and
-     transparently replaces the old implementation.
-
- -- Function: int nftw (const char *FILENAME, __nftw_func_t FUNC, int
-          DESCRIPTORS, int FLAG)
-     Preliminary: | MT-Safe cwd | AS-Unsafe heap | AC-Unsafe mem fd cwd
-     | *Note POSIX Safety Concepts::.
-
-     The `nftw' function works like the `ftw' functions.  They call the
-     callback function FUNC for all items found in the directory
-     FILENAME and below.  At most DESCRIPTORS file descriptors are
-     consumed during the `nftw' call.
-
-     One difference is that the callback function is of a different
-     type.  It is of type `struct FTW *' and provides the callback
-     function with the extra information described above.
-
-     A second difference is that `nftw' takes a fourth argument, which
-     is 0 or a bitwise-OR combination of any of the following values.
-
-    `FTW_PHYS'
-          While traversing the directory symbolic links are not
-          followed.  Instead symbolic links are reported using the
-          `FTW_SL' value for the type parameter to the callback
-          function.  If the file referenced by a symbolic link does not
-          exist `FTW_SLN' is returned instead.
-
-    `FTW_MOUNT'
-          The callback function is only called for items which are on
-          the same mounted filesystem as the directory given by the
-          FILENAME parameter to `nftw'.
-
-    `FTW_CHDIR'
-          If this flag is given the current working directory is
-          changed to the directory of the reported object before the
-          callback function is called.  When `ntfw' finally returns the
-          current directory is restored to its original value.
-
-    `FTW_DEPTH'
-          If this option is specified then all subdirectories and files
-          within them are processed before processing the top directory
-          itself (depth-first processing).  This also means the type
-          flag given to the callback function is `FTW_DP' and not
-          `FTW_D'.
-
-    `FTW_ACTIONRETVAL'
-          If this option is specified then return values from callbacks
-          are handled differently.  If the callback returns
-          `FTW_CONTINUE', walking continues normally.  `FTW_STOP' means
-          walking stops and `FTW_STOP' is returned to the caller.  If
-          `FTW_SKIP_SUBTREE' is returned by the callback with `FTW_D'
-          argument, the subtree is skipped and walking continues with
-          next sibling of the directory.  If `FTW_SKIP_SIBLINGS' is
-          returned by the callback, all siblings of the current entry
-          are skipped and walking continues in its parent.  No other
-          return values should be returned from the callbacks if this
-          option is set.  This option is a GNU extension.
-
-     The return value is computed in the same way as for `ftw'.  `nftw'
-     returns 0 if no failures occurred and all callback functions
-     returned 0.  In case of internal errors, such as memory problems,
-     the return value is -1 and ERRNO is set accordingly.  If the
-     return value of a callback invocation was non-zero then that value
-     is returned.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
-     32-bit system this function is in fact `nftw64', i.e., the LFS
-     interface transparently replaces the old interface.
-
- -- Function: int nftw64 (const char *FILENAME, __nftw64_func_t FUNC,
-          int DESCRIPTORS, int FLAG)
-     Preliminary: | MT-Safe cwd | AS-Unsafe heap | AC-Unsafe mem fd cwd
-     | *Note POSIX Safety Concepts::.
-
-     This function is similar to `nftw' but it can work on filesystems
-     with large files.  File information is reported using a variable
-     of type `struct stat64' which is passed by reference to the
-     callback function.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
-     32-bit system this function is available under the name `nftw' and
-     transparently replaces the old implementation.
-
-
-File: libc.info,  Node: Hard Links,  Next: Symbolic Links,  Prev: Working with Directory Trees,  Up: File System Interface
-
-14.4 Hard Links
-===============
-
-In POSIX systems, one file can have many names at the same time.  All of
-the names are equally real, and no one of them is preferred to the
-others.
-
-   To add a name to a file, use the `link' function.  (The new name is
-also called a "hard link" to the file.)  Creating a new link to a file
-does not copy the contents of the file; it simply makes a new name by
-which the file can be known, in addition to the file's existing name or
-names.
-
-   One file can have names in several directories, so the organization
-of the file system is not a strict hierarchy or tree.
-
-   In most implementations, it is not possible to have hard links to the
-same file in multiple file systems.  `link' reports an error if you try
-to make a hard link to the file from another file system when this
-cannot be done.
-
-   The prototype for the `link' function is declared in the header file
-`unistd.h'.  
-
- -- Function: int link (const char *OLDNAME, const char *NEWNAME)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `link' function makes a new link to the existing file named by
-     OLDNAME, under the new name NEWNAME.
-
-     This function returns a value of `0' if it is successful and `-1'
-     on failure.  In addition to the usual file name errors (*note File
-     Name Errors::) for both OLDNAME and NEWNAME, the following `errno'
-     error conditions are defined for this function:
-
-    `EACCES'
-          You are not allowed to write to the directory in which the
-          new link is to be written.
-
-    `EEXIST'
-          There is already a file named NEWNAME.  If you want to replace
-          this link with a new link, you must remove the old link
-          explicitly first.
-
-    `EMLINK'
-          There are already too many links to the file named by OLDNAME.
-          (The maximum number of links to a file is `LINK_MAX'; see
-          *note Limits for Files::.)
-
-    `ENOENT'
-          The file named by OLDNAME doesn't exist.  You can't make a
-          link to a file that doesn't exist.
-
-    `ENOSPC'
-          The directory or file system that would contain the new link
-          is full and cannot be extended.
-
-    `EPERM'
-          On GNU/Linux and GNU/Hurd systems and some others, you cannot
-          make links to directories.  Many systems allow only
-          privileged users to do so.  This error is used to report the
-          problem.
-
-    `EROFS'
-          The directory containing the new link can't be modified
-          because it's on a read-only file system.
-
-    `EXDEV'
-          The directory specified in NEWNAME is on a different file
-          system than the existing file.
-
-    `EIO'
-          A hardware error occurred while trying to read or write the
-          to filesystem.
-
-
-File: libc.info,  Node: Symbolic Links,  Next: Deleting Files,  Prev: Hard Links,  Up: File System Interface
-
-14.5 Symbolic Links
-===================
-
-GNU systems support "soft links" or "symbolic links".  This is a kind
-of "file" that is essentially a pointer to another file name.  Unlike
-hard links, symbolic links can be made to directories or across file
-systems with no restrictions.  You can also make a symbolic link to a
-name which is not the name of any file.  (Opening this link will fail
-until a file by that name is created.)  Likewise, if the symbolic link
-points to an existing file which is later deleted, the symbolic link
-continues to point to the same file name even though the name no longer
-names any file.
-
-   The reason symbolic links work the way they do is that special things
-happen when you try to open the link.  The `open' function realizes you
-have specified the name of a link, reads the file name contained in the
-link, and opens that file name instead.  The `stat' function likewise
-operates on the file that the symbolic link points to, instead of on
-the link itself.
-
-   By contrast, other operations such as deleting or renaming the file
-operate on the link itself.  The functions `readlink' and `lstat' also
-refrain from following symbolic links, because their purpose is to
-obtain information about the link.  `link', the function that makes a
-hard link, does too.  It makes a hard link to the symbolic link, which
-one rarely wants.
-
-   Some systems have for some functions operating on files have a limit
-on how many symbolic links are followed when resolving a path name.  The
-limit if it exists is published in the `sys/param.h' header file.
-
- -- Macro: int MAXSYMLINKS
-     The macro `MAXSYMLINKS' specifies how many symlinks some function
-     will follow before returning `ELOOP'.  Not all functions behave the
-     same and this value is not the same a that returned for
-     `_SC_SYMLOOP' by `sysconf'.  In fact, the `sysconf' result can
-     indicate that there is no fixed limit although `MAXSYMLINKS'
-     exists and has a finite value.
-
-   Prototypes for most of the functions listed in this section are in
-`unistd.h'.  
-
- -- Function: int symlink (const char *OLDNAME, const char *NEWNAME)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `symlink' function makes a symbolic link to OLDNAME named
-     NEWNAME.
-
-     The normal return value from `symlink' is `0'.  A return value of
-     `-1' indicates an error.  In addition to the usual file name
-     syntax errors (*note File Name Errors::), the following `errno'
-     error conditions are defined for this function:
-
-    `EEXIST'
-          There is already an existing file named NEWNAME.
-
-    `EROFS'
-          The file NEWNAME would exist on a read-only file system.
-
-    `ENOSPC'
-          The directory or file system cannot be extended to make the
-          new link.
-
-    `EIO'
-          A hardware error occurred while reading or writing data on
-          the disk.
-
-
- -- Function: ssize_t readlink (const char *FILENAME, char *BUFFER,
-          size_t SIZE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `readlink' function gets the value of the symbolic link
-     FILENAME.  The file name that the link points to is copied into
-     BUFFER.  This file name string is _not_ null-terminated;
-     `readlink' normally returns the number of characters copied.  The
-     SIZE argument specifies the maximum number of characters to copy,
-     usually the allocation size of BUFFER.
-
-     If the return value equals SIZE, you cannot tell whether or not
-     there was room to return the entire name.  So make a bigger buffer
-     and call `readlink' again.  Here is an example:
-
-          char *
-          readlink_malloc (const char *filename)
-          {
-            int size = 100;
-            char *buffer = NULL;
-
-            while (1)
-              {
-                buffer = (char *) xrealloc (buffer, size);
-                int nchars = readlink (filename, buffer, size);
-                if (nchars < 0)
-                  {
-                    free (buffer);
-                    return NULL;
-                  }
-                if (nchars < size)
-                  return buffer;
-                size *= 2;
-              }
-          }
-
-     A value of `-1' is returned in case of error.  In addition to the
-     usual file name errors (*note File Name Errors::), the following
-     `errno' error conditions are defined for this function:
-
-    `EINVAL'
-          The named file is not a symbolic link.
-
-    `EIO'
-          A hardware error occurred while reading or writing data on
-          the disk.
-
-   In some situations it is desirable to resolve all the symbolic links
-to get the real name of a file where no prefix names a symbolic link
-which is followed and no filename in the path is `.' or `..'.  This is
-for instance desirable if files have to be compare in which case
-different names can refer to the same inode.
-
- -- Function: char * canonicalize_file_name (const char *NAME)
-     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
-     POSIX Safety Concepts::.
-
-     The `canonicalize_file_name' function returns the absolute name of
-     the file named by NAME which contains no `.', `..' components nor
-     any repeated path separators (`/') or symlinks.  The result is
-     passed back as the return value of the function in a block of
-     memory allocated with `malloc'.  If the result is not used anymore
-     the memory should be freed with a call to `free'.
-
-     If any of the path components is missing the function returns a
-     NULL pointer.  This is also what is returned if the length of the
-     path reaches or exceeds `PATH_MAX' characters.  In any case
-     `errno' is set accordingly.
-
-    `ENAMETOOLONG'
-          The resulting path is too long.  This error only occurs on
-          systems which have a limit on the file name length.
-
-    `EACCES'
-          At least one of the path components is not readable.
-
-    `ENOENT'
-          The input file name is empty.
-
-    `ENOENT'
-          At least one of the path components does not exist.
-
-    `ELOOP'
-          More than `MAXSYMLINKS' many symlinks have been followed.
-
-     This function is a GNU extension and is declared in `stdlib.h'.
-
-   The Unix standard includes a similar function which differs from
-`canonicalize_file_name' in that the user has to provide the buffer
-where the result is placed in.
-
- -- Function: char * realpath (const char *restrict NAME, char
-          *restrict RESOLVED)
-     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
-     POSIX Safety Concepts::.
-
-     A call to `realpath' where the RESOLVED parameter is `NULL'
-     behaves exactly like `canonicalize_file_name'.  The function
-     allocates a buffer for the file name and returns a pointer to it.
-     If RESOLVED is not `NULL' it points to a buffer into which the
-     result is copied.  It is the callers responsibility to allocate a
-     buffer which is large enough.  On systems which define `PATH_MAX'
-     this means the buffer must be large enough for a pathname of this
-     size.  For systems without limitations on the pathname length the
-     requirement cannot be met and programs should not call `realpath'
-     with anything but `NULL' for the second parameter.
-
-     One other difference is that the buffer RESOLVED (if nonzero) will
-     contain the part of the path component which does not exist or is
-     not readable if the function returns `NULL' and `errno' is set to
-     `EACCES' or `ENOENT'.
-
-     This function is declared in `stdlib.h'.
-
-   The advantage of using this function is that it is more widely
-available.  The drawback is that it reports failures for long path on
-systems which have no limits on the file name length.
+'L_XTND'
+     An alias for 'SEEK_END'.
 
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-5 b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-5
index 962899a..17f648d 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-5
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-5
@@ -1,7 +1,24 @@
-This is
-/usr/local/google/home/jnewlin/src/uclibc/buildroot/output/build/glibc-2.19/build/manual/libc.info,
-produced by makeinfo version 4.13 from libc.texinfo.
+This is libc.info, produced by makeinfo version 5.2 from libc.texinfo.
 
+This file documents the GNU C Library.
+
+   This is 'The GNU C Library Reference Manual', for version 2.19
+(Buildroot).
+
+   Copyright (C) 1993-2014 Free Software Foundation, Inc.
+
+   Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being "Free Software Needs Free Documentation" and
+"GNU Lesser General Public License", the Front-Cover texts being "A GNU
+Manual", and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled "GNU Free Documentation
+License".
+
+   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
+modify this GNU manual.  Buying copies from the FSF supports it in
+developing GNU and promoting software freedom."
 INFO-DIR-SECTION Software libraries
 START-INFO-DIR-ENTRY
 * Libc: (libc).                 C library.
@@ -1692,7436 +1709,5499 @@
 * ynl: (libc)Special Functions.
 END-INFO-DIR-ENTRY
 
-   This file documents the GNU C Library.
+
+File: libc.info,  Node: Portable Positioning,  Next: Stream Buffering,  Prev: File Positioning,  Up: I/O on Streams
 
-   This is `The GNU C Library Reference Manual', for version 2.19
-(Buildroot).
+12.19 Portable File-Position Functions
+======================================
 
-   Copyright (C) 1993-2014 Free Software Foundation, Inc.
+On GNU systems, the file position is truly a character count.  You can
+specify any character count value as an argument to 'fseek' or 'fseeko'
+and get reliable results for any random access file.  However, some ISO C
+systems do not represent file positions in this way.
 
-   Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version
-1.3 or any later version published by the Free Software Foundation;
-with the Invariant Sections being "Free Software Needs Free
-Documentation" and "GNU Lesser General Public License", the Front-Cover
-texts being "A GNU Manual", and with the Back-Cover Texts as in (a)
-below.  A copy of the license is included in the section entitled "GNU
-Free Documentation License".
+   On some systems where text streams truly differ from binary streams,
+it is impossible to represent the file position of a text stream as a
+count of characters from the beginning of the file.  For example, the
+file position on some systems must encode both a record offset within
+the file, and a character offset within the record.
 
-   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
-modify this GNU manual.  Buying copies from the FSF supports it in
-developing GNU and promoting software freedom."
+   As a consequence, if you want your programs to be portable to these
+systems, you must observe certain rules:
+
+   * The value returned from 'ftell' on a text stream has no predictable
+     relationship to the number of characters you have read so far.  The
+     only thing you can rely on is that you can use it subsequently as
+     the OFFSET argument to 'fseek' or 'fseeko' to move back to the same
+     file position.
+
+   * In a call to 'fseek' or 'fseeko' on a text stream, either the
+     OFFSET must be zero, or WHENCE must be 'SEEK_SET' and the OFFSET
+     must be the result of an earlier call to 'ftell' on the same
+     stream.
+
+   * The value of the file position indicator of a text stream is
+     undefined while there are characters that have been pushed back
+     with 'ungetc' that haven't been read or discarded.  *Note
+     Unreading::.
+
+   But even if you observe these rules, you may still have trouble for
+long files, because 'ftell' and 'fseek' use a 'long int' value to
+represent the file position.  This type may not have room to encode all
+the file positions in a large file.  Using the 'ftello' and 'fseeko'
+functions might help here since the 'off_t' type is expected to be able
+to hold all file position values but this still does not help to handle
+additional information which must be associated with a file position.
+
+   So if you do want to support systems with peculiar encodings for the
+file positions, it is better to use the functions 'fgetpos' and
+'fsetpos' instead.  These functions represent the file position using
+the data type 'fpos_t', whose internal representation varies from system
+to system.
+
+   These symbols are declared in the header file 'stdio.h'.
+
+ -- Data Type: fpos_t
+     This is the type of an object that can encode information about the
+     file position of a stream, for use by the functions 'fgetpos' and
+     'fsetpos'.
+
+     In the GNU C Library, 'fpos_t' is an opaque data structure that
+     contains internal data to represent file offset and conversion
+     state information.  In other systems, it might have a different
+     internal representation.
+
+     When compiling with '_FILE_OFFSET_BITS == 64' on a 32 bit machine
+     this type is in fact equivalent to 'fpos64_t' since the LFS
+     interface transparently replaces the old interface.
+
+ -- Data Type: fpos64_t
+     This is the type of an object that can encode information about the
+     file position of a stream, for use by the functions 'fgetpos64' and
+     'fsetpos64'.
+
+     In the GNU C Library, 'fpos64_t' is an opaque data structure that
+     contains internal data to represent file offset and conversion
+     state information.  In other systems, it might have a different
+     internal representation.
+
+ -- Function: int fgetpos (FILE *STREAM, fpos_t *POSITION)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     This function stores the value of the file position indicator for
+     the stream STREAM in the 'fpos_t' object pointed to by POSITION.
+     If successful, 'fgetpos' returns zero; otherwise it returns a
+     nonzero value and stores an implementation-defined positive value
+     in 'errno'.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' on a
+     32 bit system the function is in fact 'fgetpos64'.  I.e., the LFS
+     interface transparently replaces the old interface.
+
+ -- Function: int fgetpos64 (FILE *STREAM, fpos64_t *POSITION)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'fgetpos' but the file position is
+     returned in a variable of type 'fpos64_t' to which POSITION points.
+
+     If the sources are compiled with '_FILE_OFFSET_BITS == 64' on a 32
+     bits machine this function is available under the name 'fgetpos'
+     and so transparently replaces the old interface.
+
+ -- Function: int fsetpos (FILE *STREAM, const fpos_t *POSITION)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     This function sets the file position indicator for the stream
+     STREAM to the position POSITION, which must have been set by a
+     previous call to 'fgetpos' on the same stream.  If successful,
+     'fsetpos' clears the end-of-file indicator on the stream, discards
+     any characters that were "pushed back" by the use of 'ungetc', and
+     returns a value of zero.  Otherwise, 'fsetpos' returns a nonzero
+     value and stores an implementation-defined positive value in
+     'errno'.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' on a
+     32 bit system the function is in fact 'fsetpos64'.  I.e., the LFS
+     interface transparently replaces the old interface.
+
+ -- Function: int fsetpos64 (FILE *STREAM, const fpos64_t *POSITION)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'fsetpos' but the file position used
+     for positioning is provided in a variable of type 'fpos64_t' to
+     which POSITION points.
+
+     If the sources are compiled with '_FILE_OFFSET_BITS == 64' on a 32
+     bits machine this function is available under the name 'fsetpos'
+     and so transparently replaces the old interface.
 
 
-File: libc.info,  Node: Deleting Files,  Next: Renaming Files,  Prev: Symbolic Links,  Up: File System Interface
+File: libc.info,  Node: Stream Buffering,  Next: Other Kinds of Streams,  Prev: Portable Positioning,  Up: I/O on Streams
 
-14.6 Deleting Files
-===================
+12.20 Stream Buffering
+======================
 
-You can delete a file with `unlink' or `remove'.
+Characters that are written to a stream are normally accumulated and
+transmitted asynchronously to the file in a block, instead of appearing
+as soon as they are output by the application program.  Similarly,
+streams often retrieve input from the host environment in blocks rather
+than on a character-by-character basis.  This is called "buffering".
 
-   Deletion actually deletes a file name.  If this is the file's only
-name, then the file is deleted as well.  If the file has other
-remaining names (*note Hard Links::), it remains accessible under those
-names.
+   If you are writing programs that do interactive input and output
+using streams, you need to understand how buffering works when you
+design the user interface to your program.  Otherwise, you might find
+that output (such as progress or prompt messages) doesn't appear when
+you intended it to, or displays some other unexpected behavior.
 
- -- Function: int unlink (const char *FILENAME)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
+   This section deals only with controlling when characters are
+transmitted between the stream and the file or device, and _not_ with
+how things like echoing, flow control, and the like are handled on
+specific classes of devices.  For information on common control
+operations on terminal devices, see *note Low-Level Terminal
+Interface::.
 
-     The `unlink' function deletes the file name FILENAME.  If this is
-     a file's sole name, the file itself is also deleted.  (Actually,
-     if any process has the file open when this happens, deletion is
-     postponed until all processes have closed the file.)
-
-     The function `unlink' is declared in the header file `unistd.h'.
-
-     This function returns `0' on successful completion, and `-1' on
-     error.  In addition to the usual file name errors (*note File Name
-     Errors::), the following `errno' error conditions are defined for
-     this function:
-
-    `EACCES'
-          Write permission is denied for the directory from which the
-          file is to be removed, or the directory has the sticky bit
-          set and you do not own the file.
-
-    `EBUSY'
-          This error indicates that the file is being used by the
-          system in such a way that it can't be unlinked.  For example,
-          you might see this error if the file name specifies the root
-          directory or a mount point for a file system.
-
-    `ENOENT'
-          The file name to be deleted doesn't exist.
-
-    `EPERM'
-          On some systems `unlink' cannot be used to delete the name of
-          a directory, or at least can only be used this way by a
-          privileged user.  To avoid such problems, use `rmdir' to
-          delete directories.  (On GNU/Linux and GNU/Hurd systems
-          `unlink' can never delete the name of a directory.)
-
-    `EROFS'
-          The directory containing the file name to be deleted is on a
-          read-only file system and can't be modified.
-
- -- Function: int rmdir (const char *FILENAME)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `rmdir' function deletes a directory.  The directory must be
-     empty before it can be removed; in other words, it can only contain
-     entries for `.' and `..'.
-
-     In most other respects, `rmdir' behaves like `unlink'.  There are
-     two additional `errno' error conditions defined for `rmdir':
-
-    `ENOTEMPTY'
-    `EEXIST'
-          The directory to be deleted is not empty.
-
-     These two error codes are synonymous; some systems use one, and
-     some use the other.  GNU/Linux and GNU/Hurd systems always use
-     `ENOTEMPTY'.
-
-     The prototype for this function is declared in the header file
-     `unistd.h'.  
-
- -- Function: int remove (const char *FILENAME)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This is the ISO C function to remove a file.  It works like
-     `unlink' for files and like `rmdir' for directories.  `remove' is
-     declared in `stdio.h'.  
-
-
-File: libc.info,  Node: Renaming Files,  Next: Creating Directories,  Prev: Deleting Files,  Up: File System Interface
-
-14.7 Renaming Files
-===================
-
-The `rename' function is used to change a file's name.
-
- -- Function: int rename (const char *OLDNAME, const char *NEWNAME)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `rename' function renames the file OLDNAME to NEWNAME.  The
-     file formerly accessible under the name OLDNAME is afterwards
-     accessible as NEWNAME instead.  (If the file had any other names
-     aside from OLDNAME, it continues to have those names.)
-
-     The directory containing the name NEWNAME must be on the same file
-     system as the directory containing the name OLDNAME.
-
-     One special case for `rename' is when OLDNAME and NEWNAME are two
-     names for the same file.  The consistent way to handle this case
-     is to delete OLDNAME.  However, in this case POSIX requires that
-     `rename' do nothing and report success--which is inconsistent.  We
-     don't know what your operating system will do.
-
-     If OLDNAME is not a directory, then any existing file named
-     NEWNAME is removed during the renaming operation.  However, if
-     NEWNAME is the name of a directory, `rename' fails in this case.
-
-     If OLDNAME is a directory, then either NEWNAME must not exist or
-     it must name a directory that is empty.  In the latter case, the
-     existing directory named NEWNAME is deleted first.  The name
-     NEWNAME must not specify a subdirectory of the directory `oldname'
-     which is being renamed.
-
-     One useful feature of `rename' is that the meaning of NEWNAME
-     changes "atomically" from any previously existing file by that
-     name to its new meaning (i.e., the file that was called OLDNAME).
-     There is no instant at which NEWNAME is non-existent "in between"
-     the old meaning and the new meaning.  If there is a system crash
-     during the operation, it is possible for both names to still
-     exist; but NEWNAME will always be intact if it exists at all.
-
-     If `rename' fails, it returns `-1'.  In addition to the usual file
-     name errors (*note File Name Errors::), the following `errno'
-     error conditions are defined for this function:
-
-    `EACCES'
-          One of the directories containing NEWNAME or OLDNAME refuses
-          write permission; or NEWNAME and OLDNAME are directories and
-          write permission is refused for one of them.
-
-    `EBUSY'
-          A directory named by OLDNAME or NEWNAME is being used by the
-          system in a way that prevents the renaming from working.
-          This includes directories that are mount points for
-          filesystems, and directories that are the current working
-          directories of processes.
-
-    `ENOTEMPTY'
-    `EEXIST'
-          The directory NEWNAME isn't empty.  GNU/Linux and GNU/Hurd
-          systems always return `ENOTEMPTY' for this, but some other
-          systems return `EEXIST'.
-
-    `EINVAL'
-          OLDNAME is a directory that contains NEWNAME.
-
-    `EISDIR'
-          NEWNAME is a directory but the OLDNAME isn't.
-
-    `EMLINK'
-          The parent directory of NEWNAME would have too many links
-          (entries).
-
-    `ENOENT'
-          The file OLDNAME doesn't exist.
-
-    `ENOSPC'
-          The directory that would contain NEWNAME has no room for
-          another entry, and there is no space left in the file system
-          to expand it.
-
-    `EROFS'
-          The operation would involve writing to a directory on a
-          read-only file system.
-
-    `EXDEV'
-          The two file names NEWNAME and OLDNAME are on different file
-          systems.
-
-
-File: libc.info,  Node: Creating Directories,  Next: File Attributes,  Prev: Renaming Files,  Up: File System Interface
-
-14.8 Creating Directories
-=========================
-
-Directories are created with the `mkdir' function.  (There is also a
-shell command `mkdir' which does the same thing.)
-
- -- Function: int mkdir (const char *FILENAME, mode_t MODE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `mkdir' function creates a new, empty directory with name
-     FILENAME.
-
-     The argument MODE specifies the file permissions for the new
-     directory file.  *Note Permission Bits::, for more information
-     about this.
-
-     A return value of `0' indicates successful completion, and `-1'
-     indicates failure.  In addition to the usual file name syntax
-     errors (*note File Name Errors::), the following `errno' error
-     conditions are defined for this function:
-
-    `EACCES'
-          Write permission is denied for the parent directory in which
-          the new directory is to be added.
-
-    `EEXIST'
-          A file named FILENAME already exists.
-
-    `EMLINK'
-          The parent directory has too many links (entries).
-
-          Well-designed file systems never report this error, because
-          they permit more links than your disk could possibly hold.
-          However, you must still take account of the possibility of
-          this error, as it could result from network access to a file
-          system on another machine.
-
-    `ENOSPC'
-          The file system doesn't have enough room to create the new
-          directory.
-
-    `EROFS'
-          The parent directory of the directory being created is on a
-          read-only file system and cannot be modified.
-
-     To use this function, your program should include the header file
-     `sys/stat.h'.  
-
-
-File: libc.info,  Node: File Attributes,  Next: Making Special Files,  Prev: Creating Directories,  Up: File System Interface
-
-14.9 File Attributes
-====================
-
-When you issue an `ls -l' shell command on a file, it gives you
-information about the size of the file, who owns it, when it was last
-modified, etc.  These are called the "file attributes", and are
-associated with the file itself and not a particular one of its names.
-
-   This section contains information about how you can inquire about and
-modify the attributes of a file.
+   You can bypass the stream buffering facilities altogether by using
+the low-level input and output functions that operate on file
+descriptors instead.  *Note Low-Level I/O::.
 
 * Menu:
 
-* Attribute Meanings::          The names of the file attributes,
-                                 and what their values mean.
-* Reading Attributes::          How to read the attributes of a file.
-* Testing File Type::           Distinguishing ordinary files,
-                                 directories, links...
-* File Owner::                  How ownership for new files is determined,
-			         and how to change it.
-* Permission Bits::             How information about a file's access
-                                 mode is stored.
-* Access Permission::           How the system decides who can access a file.
-* Setting Permissions::         How permissions for new files are assigned,
-			         and how to change them.
-* Testing File Access::         How to find out if your process can
-                                 access a file.
-* File Times::                  About the time attributes of a file.
-* File Size::			Manually changing the size of a file.
+* Buffering Concepts::          Terminology is defined here.
+* Flushing Buffers::            How to ensure that output buffers are flushed.
+* Controlling Buffering::       How to specify what kind of buffering to use.
 
 
-File: libc.info,  Node: Attribute Meanings,  Next: Reading Attributes,  Up: File Attributes
+File: libc.info,  Node: Buffering Concepts,  Next: Flushing Buffers,  Up: Stream Buffering
 
-14.9.1 The meaning of the File Attributes
------------------------------------------
+12.20.1 Buffering Concepts
+--------------------------
 
-When you read the attributes of a file, they come back in a structure
-called `struct stat'.  This section describes the names of the
-attributes, their data types, and what they mean.  For the functions to
-read the attributes of a file, see *note Reading Attributes::.
+There are three different kinds of buffering strategies:
 
-   The header file `sys/stat.h' declares all the symbols defined in
-this section.  
+   * Characters written to or read from an "unbuffered" stream are
+     transmitted individually to or from the file as soon as possible.
 
- -- Data Type: struct stat
-     The `stat' structure type is used to return information about the
-     attributes of a file.  It contains at least the following members:
+   * Characters written to a "line buffered" stream are transmitted to
+     the file in blocks when a newline character is encountered.
 
-    `mode_t st_mode'
-          Specifies the mode of the file.  This includes file type
-          information (*note Testing File Type::) and the file
-          permission bits (*note Permission Bits::).
+   * Characters written to or read from a "fully buffered" stream are
+     transmitted to or from the file in blocks of arbitrary size.
 
-    `ino_t st_ino'
-          The file serial number, which distinguishes this file from
-          all other files on the same device.
+   Newly opened streams are normally fully buffered, with one exception:
+a stream connected to an interactive device such as a terminal is
+initially line buffered.  *Note Controlling Buffering::, for information
+on how to select a different kind of buffering.  Usually the automatic
+selection gives you the most convenient kind of buffering for the file
+or device you open.
 
-    `dev_t st_dev'
-          Identifies the device containing the file.  The `st_ino' and
-          `st_dev', taken together, uniquely identify the file.  The
-          `st_dev' value is not necessarily consistent across reboots or
-          system crashes, however.
-
-    `nlink_t st_nlink'
-          The number of hard links to the file.  This count keeps track
-          of how many directories have entries for this file.  If the
-          count is ever decremented to zero, then the file itself is
-          discarded as soon as no process still holds it open.
-          Symbolic links are not counted in the total.
-
-    `uid_t st_uid'
-          The user ID of the file's owner.  *Note File Owner::.
-
-    `gid_t st_gid'
-          The group ID of the file.  *Note File Owner::.
-
-    `off_t st_size'
-          This specifies the size of a regular file in bytes.  For
-          files that are really devices this field isn't usually
-          meaningful.  For symbolic links this specifies the length of
-          the file name the link refers to.
-
-    `time_t st_atime'
-          This is the last access time for the file.  *Note File
-          Times::.
-
-    `unsigned long int st_atime_usec'
-          This is the fractional part of the last access time for the
-          file.  *Note File Times::.
-
-    `time_t st_mtime'
-          This is the time of the last modification to the contents of
-          the file.  *Note File Times::.
-
-    `unsigned long int st_mtime_usec'
-          This is the fractional part of the time of the last
-          modification to the contents of the file.  *Note File Times::.
-
-    `time_t st_ctime'
-          This is the time of the last modification to the attributes
-          of the file.  *Note File Times::.
-
-    `unsigned long int st_ctime_usec'
-          This is the fractional part of the time of the last
-          modification to the attributes of the file.  *Note File
-          Times::.
-
-    `blkcnt_t st_blocks'
-          This is the amount of disk space that the file occupies,
-          measured in units of 512-byte blocks.
-
-          The number of disk blocks is not strictly proportional to the
-          size of the file, for two reasons: the file system may use
-          some blocks for internal record keeping; and the file may be
-          sparse--it may have "holes" which contain zeros but do not
-          actually take up space on the disk.
-
-          You can tell (approximately) whether a file is sparse by
-          comparing this value with `st_size', like this:
-
-               (st.st_blocks * 512 < st.st_size)
-
-          This test is not perfect because a file that is just slightly
-          sparse might not be detected as sparse at all.  For practical
-          applications, this is not a problem.
-
-    `unsigned int st_blksize'
-          The optimal block size for reading of writing this file, in
-          bytes.  You might use this size for allocating the buffer
-          space for reading of writing the file.  (This is unrelated to
-          `st_blocks'.)
-
-   The extensions for the Large File Support (LFS) require, even on
-32-bit machines, types which can handle file sizes up to 2^63.
-Therefore a new definition of `struct stat' is necessary.
-
- -- Data Type: struct stat64
-     The members of this type are the same and have the same names as
-     those in `struct stat'.  The only difference is that the members
-     `st_ino', `st_size', and `st_blocks' have a different type to
-     support larger values.
-
-    `mode_t st_mode'
-          Specifies the mode of the file.  This includes file type
-          information (*note Testing File Type::) and the file
-          permission bits (*note Permission Bits::).
-
-    `ino64_t st_ino'
-          The file serial number, which distinguishes this file from
-          all other files on the same device.
-
-    `dev_t st_dev'
-          Identifies the device containing the file.  The `st_ino' and
-          `st_dev', taken together, uniquely identify the file.  The
-          `st_dev' value is not necessarily consistent across reboots or
-          system crashes, however.
-
-    `nlink_t st_nlink'
-          The number of hard links to the file.  This count keeps track
-          of how many directories have entries for this file.  If the
-          count is ever decremented to zero, then the file itself is
-          discarded as soon as no process still holds it open.
-          Symbolic links are not counted in the total.
-
-    `uid_t st_uid'
-          The user ID of the file's owner.  *Note File Owner::.
-
-    `gid_t st_gid'
-          The group ID of the file.  *Note File Owner::.
-
-    `off64_t st_size'
-          This specifies the size of a regular file in bytes.  For
-          files that are really devices this field isn't usually
-          meaningful.  For symbolic links this specifies the length of
-          the file name the link refers to.
-
-    `time_t st_atime'
-          This is the last access time for the file.  *Note File
-          Times::.
-
-    `unsigned long int st_atime_usec'
-          This is the fractional part of the last access time for the
-          file.  *Note File Times::.
-
-    `time_t st_mtime'
-          This is the time of the last modification to the contents of
-          the file.  *Note File Times::.
-
-    `unsigned long int st_mtime_usec'
-          This is the fractional part of the time of the last
-          modification to the contents of the file.  *Note File Times::.
-
-    `time_t st_ctime'
-          This is the time of the last modification to the attributes
-          of the file.  *Note File Times::.
-
-    `unsigned long int st_ctime_usec'
-          This is the fractional part of the time of the last
-          modification to the attributes of the file.  *Note File
-          Times::.
-
-    `blkcnt64_t st_blocks'
-          This is the amount of disk space that the file occupies,
-          measured in units of 512-byte blocks.
-
-    `unsigned int st_blksize'
-          The optimal block size for reading of writing this file, in
-          bytes.  You might use this size for allocating the buffer
-          space for reading of writing the file.  (This is unrelated to
-          `st_blocks'.)
-
-   Some of the file attributes have special data type names which exist
-specifically for those attributes.  (They are all aliases for well-known
-integer types that you know and love.)  These typedef names are defined
-in the header file `sys/types.h' as well as in `sys/stat.h'.  Here is a
-list of them.
-
- -- Data Type: mode_t
-     This is an integer data type used to represent file modes.  In the
-     GNU C Library, this is an unsigned type no narrower than `unsigned
-     int'.
-
- -- Data Type: ino_t
-     This is an unsigned integer type used to represent file serial
-     numbers.  (In Unix jargon, these are sometimes called "inode
-     numbers".)  In the GNU C Library, this type is no narrower than
-     `unsigned int'.
-
-     If the source is compiled with `_FILE_OFFSET_BITS == 64' this type
-     is transparently replaced by `ino64_t'.
-
- -- Data Type: ino64_t
-     This is an unsigned integer type used to represent file serial
-     numbers for the use in LFS.  In the GNU C Library, this type is no
-     narrower than `unsigned int'.
-
-     When compiling with `_FILE_OFFSET_BITS == 64' this type is
-     available under the name `ino_t'.
-
- -- Data Type: dev_t
-     This is an arithmetic data type used to represent file device
-     numbers.  In the GNU C Library, this is an integer type no
-     narrower than `int'.
-
- -- Data Type: nlink_t
-     This is an integer type used to represent file link counts.
-
- -- Data Type: blkcnt_t
-     This is a signed integer type used to represent block counts.  In
-     the GNU C Library, this type is no narrower than `int'.
-
-     If the source is compiled with `_FILE_OFFSET_BITS == 64' this type
-     is transparently replaced by `blkcnt64_t'.
-
- -- Data Type: blkcnt64_t
-     This is a signed integer type used to represent block counts for
-     the use in LFS.  In the GNU C Library, this type is no narrower
-     than `int'.
-
-     When compiling with `_FILE_OFFSET_BITS == 64' this type is
-     available under the name `blkcnt_t'.
+   The use of line buffering for interactive devices implies that output
+messages ending in a newline will appear immediately--which is usually
+what you want.  Output that doesn't end in a newline might or might not
+show up immediately, so if you want them to appear immediately, you
+should flush buffered output explicitly with 'fflush', as described in
+*note Flushing Buffers::.
 
 
-File: libc.info,  Node: Reading Attributes,  Next: Testing File Type,  Prev: Attribute Meanings,  Up: File Attributes
+File: libc.info,  Node: Flushing Buffers,  Next: Controlling Buffering,  Prev: Buffering Concepts,  Up: Stream Buffering
 
-14.9.2 Reading the Attributes of a File
----------------------------------------
+12.20.2 Flushing Buffers
+------------------------
 
-To examine the attributes of files, use the functions `stat', `fstat'
-and `lstat'.  They return the attribute information in a `struct stat'
-object.  All three functions are declared in the header file
-`sys/stat.h'.
+"Flushing" output on a buffered stream means transmitting all
+accumulated characters to the file.  There are many circumstances when
+buffered output on a stream is flushed automatically:
 
- -- Function: int stat (const char *FILENAME, struct stat *BUF)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
+   * When you try to do output and the output buffer is full.
 
-     The `stat' function returns information about the attributes of the
-     file named by FILENAME in the structure pointed to by BUF.
+   * When the stream is closed.  *Note Closing Streams::.
 
-     If FILENAME is the name of a symbolic link, the attributes you get
-     describe the file that the link points to.  If the link points to a
-     nonexistent file name, then `stat' fails reporting a nonexistent
-     file.
+   * When the program terminates by calling 'exit'.  *Note Normal
+     Termination::.
 
-     The return value is `0' if the operation is successful, or `-1' on
-     failure.  In addition to the usual file name errors (*note File
-     Name Errors::, the following `errno' error conditions are defined
-     for this function:
+   * When a newline is written, if the stream is line buffered.
 
-    `ENOENT'
-          The file named by FILENAME doesn't exist.
+   * Whenever an input operation on _any_ stream actually reads data
+     from its file.
 
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
-     function is in fact `stat64' since the LFS interface transparently
-     replaces the normal implementation.
+   If you want to flush the buffered output at another time, call
+'fflush', which is declared in the header file 'stdio.h'.
 
- -- Function: int stat64 (const char *FILENAME, struct stat64 *BUF)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
+ -- Function: int fflush (FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
 
-     This function is similar to `stat' but it is also able to work on
-     files larger than 2^31 bytes on 32-bit systems.  To be able to do
-     this the result is stored in a variable of type `struct stat64' to
-     which BUF must point.
+     This function causes any buffered output on STREAM to be delivered
+     to the file.  If STREAM is a null pointer, then 'fflush' causes
+     buffered output on _all_ open output streams to be flushed.
 
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
-     function is available under the name `stat' and so transparently
-     replaces the interface for small files on 32-bit machines.
+     This function returns 'EOF' if a write error occurs, or zero
+     otherwise.
 
- -- Function: int fstat (int FILEDES, struct stat *BUF)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
+ -- Function: int fflush_unlocked (FILE *STREAM)
+     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
 
-     The `fstat' function is like `stat', except that it takes an open
-     file descriptor as an argument instead of a file name.  *Note
-     Low-Level I/O::.
+     The 'fflush_unlocked' function is equivalent to the 'fflush'
+     function except that it does not implicitly lock the stream.
 
-     Like `stat', `fstat' returns `0' on success and `-1' on failure.
-     The following `errno' error conditions are defined for `fstat':
+   The 'fflush' function can be used to flush all streams currently
+opened.  While this is useful in some situations it does often more than
+necessary since it might be done in situations when terminal input is
+required and the program wants to be sure that all output is visible on
+the terminal.  But this means that only line buffered streams have to be
+flushed.  Solaris introduced a function especially for this.  It was
+always available in the GNU C Library in some form but never officially
+exported.
 
-    `EBADF'
-          The FILEDES argument is not a valid file descriptor.
+ -- Function: void _flushlbf (void)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
 
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
-     function is in fact `fstat64' since the LFS interface transparently
-     replaces the normal implementation.
+     The '_flushlbf' function flushes all line buffered streams
+     currently opened.
 
- -- Function: int fstat64 (int FILEDES, struct stat64 *BUF)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
+     This function is declared in the 'stdio_ext.h' header.
 
-     This function is similar to `fstat' but is able to work on large
-     files on 32-bit platforms.  For large files the file descriptor
-     FILEDES should be obtained by `open64' or `creat64'.  The BUF
-     pointer points to a variable of type `struct stat64' which is able
-     to represent the larger values.
+   *Compatibility Note:* Some brain-damaged operating systems have been
+known to be so thoroughly fixated on line-oriented input and output that
+flushing a line buffered stream causes a newline to be written!
+Fortunately, this "feature" seems to be becoming less common.  You do
+not need to worry about this with the GNU C Library.
 
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
-     function is available under the name `fstat' and so transparently
-     replaces the interface for small files on 32-bit machines.
+   In some situations it might be useful to not flush the output pending
+for a stream but instead simply forget it.  If transmission is costly
+and the output is not needed anymore this is valid reasoning.  In this
+situation a non-standard function introduced in Solaris and available in
+the GNU C Library can be used.
 
- -- Function: int lstat (const char *FILENAME, struct stat *BUF)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
+ -- Function: void __fpurge (FILE *STREAM)
+     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
 
-     The `lstat' function is like `stat', except that it does not
-     follow symbolic links.  If FILENAME is the name of a symbolic
-     link, `lstat' returns information about the link itself; otherwise
-     `lstat' works like `stat'.  *Note Symbolic Links::.
+     The '__fpurge' function causes the buffer of the stream STREAM to
+     be emptied.  If the stream is currently in read mode all input in
+     the buffer is lost.  If the stream is in output mode the buffered
+     output is not written to the device (or whatever other underlying
+     storage) and the buffer the cleared.
 
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
-     function is in fact `lstat64' since the LFS interface transparently
-     replaces the normal implementation.
-
- -- Function: int lstat64 (const char *FILENAME, struct stat64 *BUF)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is similar to `lstat' but it is also able to work on
-     files larger than 2^31 bytes on 32-bit systems.  To be able to do
-     this the result is stored in a variable of type `struct stat64' to
-     which BUF must point.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' this
-     function is available under the name `lstat' and so transparently
-     replaces the interface for small files on 32-bit machines.
+     This function is declared in 'stdio_ext.h'.
 
 
-File: libc.info,  Node: Testing File Type,  Next: File Owner,  Prev: Reading Attributes,  Up: File Attributes
+File: libc.info,  Node: Controlling Buffering,  Prev: Flushing Buffers,  Up: Stream Buffering
 
-14.9.3 Testing the Type of a File
----------------------------------
-
-The "file mode", stored in the `st_mode' field of the file attributes,
-contains two kinds of information: the file type code, and the access
-permission bits.  This section discusses only the type code, which you
-can use to tell whether the file is a directory, socket, symbolic link,
-and so on.  For details about access permissions see *note Permission
-Bits::.
-
-   There are two ways you can access the file type information in a file
-mode.  Firstly, for each file type there is a "predicate macro" which
-examines a given file mode and returns whether it is of that type or
-not.  Secondly, you can mask out the rest of the file mode to leave
-just the file type code, and compare this against constants for each of
-the supported file types.
-
-   All of the symbols listed in this section are defined in the header
-file `sys/stat.h'.  
-
-   The following predicate macros test the type of a file, given the
-value M which is the `st_mode' field returned by `stat' on that file:
-
- -- Macro: int S_ISDIR (mode_t M)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro returns non-zero if the file is a directory.
-
- -- Macro: int S_ISCHR (mode_t M)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro returns non-zero if the file is a character special
-     file (a device like a terminal).
-
- -- Macro: int S_ISBLK (mode_t M)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro returns non-zero if the file is a block special file (a
-     device like a disk).
-
- -- Macro: int S_ISREG (mode_t M)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro returns non-zero if the file is a regular file.
-
- -- Macro: int S_ISFIFO (mode_t M)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro returns non-zero if the file is a FIFO special file, or
-     a pipe.  *Note Pipes and FIFOs::.
-
- -- Macro: int S_ISLNK (mode_t M)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro returns non-zero if the file is a symbolic link.  *Note
-     Symbolic Links::.
-
- -- Macro: int S_ISSOCK (mode_t M)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro returns non-zero if the file is a socket.  *Note
-     Sockets::.
-
-   An alternate non-POSIX method of testing the file type is supported
-for compatibility with BSD.  The mode can be bitwise AND-ed with
-`S_IFMT' to extract the file type code, and compared to the appropriate
-constant.  For example,
-
-     S_ISCHR (MODE)
-
-is equivalent to:
-
-     ((MODE & S_IFMT) == S_IFCHR)
-
- -- Macro: int S_IFMT
-     This is a bit mask used to extract the file type code from a mode
-     value.
-
-   These are the symbolic names for the different file type codes:
-
-`S_IFDIR'
-     This is the file type constant of a directory file.
-
-`S_IFCHR'
-     This is the file type constant of a character-oriented device file.
-
-`S_IFBLK'
-     This is the file type constant of a block-oriented device file.
-
-`S_IFREG'
-     This is the file type constant of a regular file.
-
-`S_IFLNK'
-     This is the file type constant of a symbolic link.
-
-`S_IFSOCK'
-     This is the file type constant of a socket.
-
-`S_IFIFO'
-     This is the file type constant of a FIFO or pipe.
-
-   The POSIX.1b standard introduced a few more objects which possibly
-can be implemented as object in the filesystem.  These are message
-queues, semaphores, and shared memory objects.  To allow
-differentiating these objects from other files the POSIX standard
-introduces three new test macros.  But unlike the other macros it does
-not take the value of the `st_mode' field as the parameter.  Instead
-they expect a pointer to the whole `struct stat' structure.
-
- -- Macro: int S_TYPEISMQ (struct stat *S)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     If the system implement POSIX message queues as distinct objects
-     and the file is a message queue object, this macro returns a
-     non-zero value.  In all other cases the result is zero.
-
- -- Macro: int S_TYPEISSEM (struct stat *S)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     If the system implement POSIX semaphores as distinct objects and
-     the file is a semaphore object, this macro returns a non-zero
-     value.  In all other cases the result is zero.
-
- -- Macro: int S_TYPEISSHM (struct stat *S)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     If the system implement POSIX shared memory objects as distinct
-     objects and the file is a shared memory object, this macro returns
-     a non-zero value.  In all other cases the result is zero.
-
-
-File: libc.info,  Node: File Owner,  Next: Permission Bits,  Prev: Testing File Type,  Up: File Attributes
-
-14.9.4 File Owner
------------------
-
-Every file has an "owner" which is one of the registered user names
-defined on the system.  Each file also has a "group" which is one of
-the defined groups.  The file owner can often be useful for showing you
-who edited the file (especially when you edit with GNU Emacs), but its
-main purpose is for access control.
-
-   The file owner and group play a role in determining access because
-the file has one set of access permission bits for the owner, another
-set that applies to users who belong to the file's group, and a third
-set of bits that applies to everyone else.  *Note Access Permission::,
-for the details of how access is decided based on this data.
-
-   When a file is created, its owner is set to the effective user ID of
-the process that creates it (*note Process Persona::).  The file's
-group ID may be set to either the effective group ID of the process, or
-the group ID of the directory that contains the file, depending on the
-system where the file is stored.  When you access a remote file system,
-it behaves according to its own rules, not according to the system your
-program is running on.  Thus, your program must be prepared to encounter
-either kind of behavior no matter what kind of system you run it on.
-
-   You can change the owner and/or group owner of an existing file using
-the `chown' function.  This is the primitive for the `chown' and
-`chgrp' shell commands.
-
-   The prototype for this function is declared in `unistd.h'.
-
- -- Function: int chown (const char *FILENAME, uid_t OWNER, gid_t GROUP)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `chown' function changes the owner of the file FILENAME to
-     OWNER, and its group owner to GROUP.
-
-     Changing the owner of the file on certain systems clears the
-     set-user-ID and set-group-ID permission bits.  (This is because
-     those bits may not be appropriate for the new owner.)  Other file
-     permission bits are not changed.
-
-     The return value is `0' on success and `-1' on failure.  In
-     addition to the usual file name errors (*note File Name Errors::),
-     the following `errno' error conditions are defined for this
-     function:
-
-    `EPERM'
-          This process lacks permission to make the requested change.
-
-          Only privileged users or the file's owner can change the
-          file's group.  On most file systems, only privileged users
-          can change the file owner; some file systems allow you to
-          change the owner if you are currently the owner.  When you
-          access a remote file system, the behavior you encounter is
-          determined by the system that actually holds the file, not by
-          the system your program is running on.
-
-          *Note Options for Files::, for information about the
-          `_POSIX_CHOWN_RESTRICTED' macro.
-
-    `EROFS'
-          The file is on a read-only file system.
-
- -- Function: int fchown (int FILEDES, uid_t OWNER, gid_t GROUP)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This is like `chown', except that it changes the owner of the open
-     file with descriptor FILEDES.
-
-     The return value from `fchown' is `0' on success and `-1' on
-     failure.  The following `errno' error codes are defined for this
-     function:
-
-    `EBADF'
-          The FILEDES argument is not a valid file descriptor.
-
-    `EINVAL'
-          The FILEDES argument corresponds to a pipe or socket, not an
-          ordinary file.
-
-    `EPERM'
-          This process lacks permission to make the requested change.
-          For details see `chmod' above.
-
-    `EROFS'
-          The file resides on a read-only file system.
-
-
-File: libc.info,  Node: Permission Bits,  Next: Access Permission,  Prev: File Owner,  Up: File Attributes
-
-14.9.5 The Mode Bits for Access Permission
-------------------------------------------
-
-The "file mode", stored in the `st_mode' field of the file attributes,
-contains two kinds of information: the file type code, and the access
-permission bits.  This section discusses only the access permission
-bits, which control who can read or write the file.  *Note Testing File
-Type::, for information about the file type code.
-
-   All of the symbols listed in this section are defined in the header
-file `sys/stat.h'.  
-
-   These symbolic constants are defined for the file mode bits that
-control access permission for the file:
-
-`S_IRUSR'
-`S_IREAD'
-     Read permission bit for the owner of the file.  On many systems
-     this bit is 0400.  `S_IREAD' is an obsolete synonym provided for
-     BSD compatibility.
-
-`S_IWUSR'
-`S_IWRITE'
-     Write permission bit for the owner of the file.  Usually 0200.
-     `S_IWRITE' is an obsolete synonym provided for BSD compatibility.
-
-`S_IXUSR'
-`S_IEXEC'
-     Execute (for ordinary files) or search (for directories)
-     permission bit for the owner of the file.  Usually 0100.
-     `S_IEXEC' is an obsolete synonym provided for BSD compatibility.
-
-`S_IRWXU'
-     This is equivalent to `(S_IRUSR | S_IWUSR | S_IXUSR)'.
-
-`S_IRGRP'
-     Read permission bit for the group owner of the file.  Usually 040.
-
-`S_IWGRP'
-     Write permission bit for the group owner of the file.  Usually 020.
-
-`S_IXGRP'
-     Execute or search permission bit for the group owner of the file.
-     Usually 010.
-
-`S_IRWXG'
-     This is equivalent to `(S_IRGRP | S_IWGRP | S_IXGRP)'.
-
-`S_IROTH'
-     Read permission bit for other users.  Usually 04.
-
-`S_IWOTH'
-     Write permission bit for other users.  Usually 02.
-
-`S_IXOTH'
-     Execute or search permission bit for other users.  Usually 01.
-
-`S_IRWXO'
-     This is equivalent to `(S_IROTH | S_IWOTH | S_IXOTH)'.
-
-`S_ISUID'
-     This is the set-user-ID on execute bit, usually 04000.  *Note How
-     Change Persona::.
-
-`S_ISGID'
-     This is the set-group-ID on execute bit, usually 02000.  *Note How
-     Change Persona::.
-
-`S_ISVTX'
-     This is the "sticky" bit, usually 01000.
-
-     For a directory it gives permission to delete a file in that
-     directory only if you own that file.  Ordinarily, a user can
-     either delete all the files in a directory or cannot delete any of
-     them (based on whether the user has write permission for the
-     directory).  The same restriction applies--you must have both
-     write permission for the directory and own the file you want to
-     delete.  The one exception is that the owner of the directory can
-     delete any file in the directory, no matter who owns it (provided
-     the owner has given himself write permission for the directory).
-     This is commonly used for the `/tmp' directory, where anyone may
-     create files but not delete files created by other users.
-
-     Originally the sticky bit on an executable file modified the
-     swapping policies of the system.  Normally, when a program
-     terminated, its pages in core were immediately freed and reused.
-     If the sticky bit was set on the executable file, the system kept
-     the pages in core for a while as if the program were still
-     running.  This was advantageous for a program likely to be run
-     many times in succession.  This usage is obsolete in modern
-     systems.  When a program terminates, its pages always remain in
-     core as long as there is no shortage of memory in the system.
-     When the program is next run, its pages will still be in core if
-     no shortage arose since the last run.
-
-     On some modern systems where the sticky bit has no useful meaning
-     for an executable file, you cannot set the bit at all for a
-     non-directory.  If you try, `chmod' fails with `EFTYPE'; *note
-     Setting Permissions::.
-
-     Some systems (particularly SunOS) have yet another use for the
-     sticky bit.  If the sticky bit is set on a file that is _not_
-     executable, it means the opposite: never cache the pages of this
-     file at all.  The main use of this is for the files on an NFS
-     server machine which are used as the swap area of diskless client
-     machines.  The idea is that the pages of the file will be cached
-     in the client's memory, so it is a waste of the server's memory to
-     cache them a second time.  With this usage the sticky bit also
-     implies that the filesystem may fail to record the file's
-     modification time onto disk reliably (the idea being that no-one
-     cares for a swap file).
-
-     This bit is only available on BSD systems (and those derived from
-     them).  Therefore one has to use the `_BSD_SOURCE' feature select
-     macro to get the definition (*note Feature Test Macros::).
-
-   The actual bit values of the symbols are listed in the table above
-so you can decode file mode values when debugging your programs.  These
-bit values are correct for most systems, but they are not guaranteed.
-
-   *Warning:* Writing explicit numbers for file permissions is bad
-practice.  Not only is it not portable, it also requires everyone who
-reads your program to remember what the bits mean.  To make your program
-clean use the symbolic names.
-
-
-File: libc.info,  Node: Access Permission,  Next: Setting Permissions,  Prev: Permission Bits,  Up: File Attributes
-
-14.9.6 How Your Access to a File is Decided
+12.20.3 Controlling Which Kind of Buffering
 -------------------------------------------
 
-Recall that the operating system normally decides access permission for
-a file based on the effective user and group IDs of the process and its
-supplementary group IDs, together with the file's owner, group and
-permission bits.  These concepts are discussed in detail in *note
-Process Persona::.
+After opening a stream (but before any other operations have been
+performed on it), you can explicitly specify what kind of buffering you
+want it to have using the 'setvbuf' function.
 
-   If the effective user ID of the process matches the owner user ID of
-the file, then permissions for read, write, and execute/search are
-controlled by the corresponding "user" (or "owner") bits.  Likewise, if
-any of the effective group ID or supplementary group IDs of the process
-matches the group owner ID of the file, then permissions are controlled
-by the "group" bits.  Otherwise, permissions are controlled by the
-"other" bits.
+   The facilities listed in this section are declared in the header file
+'stdio.h'.
 
-   Privileged users, like `root', can access any file regardless of its
-permission bits.  As a special case, for a file to be executable even
-by a privileged user, at least one of its execute bits must be set.
+ -- Function: int setvbuf (FILE *STREAM, char *BUF, int MODE, size_t
+          SIZE)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     This function is used to specify that the stream STREAM should have
+     the buffering mode MODE, which can be either '_IOFBF' (for full
+     buffering), '_IOLBF' (for line buffering), or '_IONBF' (for
+     unbuffered input/output).
+
+     If you specify a null pointer as the BUF argument, then 'setvbuf'
+     allocates a buffer itself using 'malloc'.  This buffer will be
+     freed when you close the stream.
+
+     Otherwise, BUF should be a character array that can hold at least
+     SIZE characters.  You should not free the space for this array as
+     long as the stream remains open and this array remains its buffer.
+     You should usually either allocate it statically, or 'malloc'
+     (*note Unconstrained Allocation::) the buffer.  Using an automatic
+     array is not a good idea unless you close the file before exiting
+     the block that declares the array.
+
+     While the array remains a stream buffer, the stream I/O functions
+     will use the buffer for their internal purposes.  You shouldn't try
+     to access the values in the array directly while the stream is
+     using it for buffering.
+
+     The 'setvbuf' function returns zero on success, or a nonzero value
+     if the value of MODE is not valid or if the request could not be
+     honored.
+
+ -- Macro: int _IOFBF
+     The value of this macro is an integer constant expression that can
+     be used as the MODE argument to the 'setvbuf' function to specify
+     that the stream should be fully buffered.
+
+ -- Macro: int _IOLBF
+     The value of this macro is an integer constant expression that can
+     be used as the MODE argument to the 'setvbuf' function to specify
+     that the stream should be line buffered.
+
+ -- Macro: int _IONBF
+     The value of this macro is an integer constant expression that can
+     be used as the MODE argument to the 'setvbuf' function to specify
+     that the stream should be unbuffered.
+
+ -- Macro: int BUFSIZ
+     The value of this macro is an integer constant expression that is
+     good to use for the SIZE argument to 'setvbuf'.  This value is
+     guaranteed to be at least '256'.
+
+     The value of 'BUFSIZ' is chosen on each system so as to make stream
+     I/O efficient.  So it is a good idea to use 'BUFSIZ' as the size
+     for the buffer when you call 'setvbuf'.
+
+     Actually, you can get an even better value to use for the buffer
+     size by means of the 'fstat' system call: it is found in the
+     'st_blksize' field of the file attributes.  *Note Attribute
+     Meanings::.
+
+     Sometimes people also use 'BUFSIZ' as the allocation size of
+     buffers used for related purposes, such as strings used to receive
+     a line of input with 'fgets' (*note Character Input::).  There is
+     no particular reason to use 'BUFSIZ' for this instead of any other
+     integer, except that it might lead to doing I/O in chunks of an
+     efficient size.
+
+ -- Function: void setbuf (FILE *STREAM, char *BUF)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     If BUF is a null pointer, the effect of this function is equivalent
+     to calling 'setvbuf' with a MODE argument of '_IONBF'.  Otherwise,
+     it is equivalent to calling 'setvbuf' with BUF, and a MODE of
+     '_IOFBF' and a SIZE argument of 'BUFSIZ'.
+
+     The 'setbuf' function is provided for compatibility with old code;
+     use 'setvbuf' in all new programs.
+
+ -- Function: void setbuffer (FILE *STREAM, char *BUF, size_t SIZE)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     If BUF is a null pointer, this function makes STREAM unbuffered.
+     Otherwise, it makes STREAM fully buffered using BUF as the buffer.
+     The SIZE argument specifies the length of BUF.
+
+     This function is provided for compatibility with old BSD code.  Use
+     'setvbuf' instead.
+
+ -- Function: void setlinebuf (FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
+     | *Note POSIX Safety Concepts::.
+
+     This function makes STREAM be line buffered, and allocates the
+     buffer for you.
+
+     This function is provided for compatibility with old BSD code.  Use
+     'setvbuf' instead.
+
+   It is possible to query whether a given stream is line buffered or
+not using a non-standard function introduced in Solaris and available in
+the GNU C Library.
+
+ -- Function: int __flbf (FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The '__flbf' function will return a nonzero value in case the
+     stream STREAM is line buffered.  Otherwise the return value is
+     zero.
+
+     This function is declared in the 'stdio_ext.h' header.
+
+   Two more extensions allow to determine the size of the buffer and how
+much of it is used.  These functions were also introduced in Solaris.
+
+ -- Function: size_t __fbufsize (FILE *STREAM)
+     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Safe |
+     *Note POSIX Safety Concepts::.
+
+     The '__fbufsize' function return the size of the buffer in the
+     stream STREAM.  This value can be used to optimize the use of the
+     stream.
+
+     This function is declared in the 'stdio_ext.h' header.
+
+ -- Function: size_t __fpending (FILE *STREAM)
+     Preliminary: | MT-Safe race:stream | AS-Unsafe corrupt | AC-Safe |
+     *Note POSIX Safety Concepts::.
+
+     The '__fpending' function returns the number of bytes currently in
+     the output buffer.  For wide-oriented stream the measuring unit is
+     wide characters.  This function should not be used on buffers in
+     read mode or opened read-only.
+
+     This function is declared in the 'stdio_ext.h' header.
 
 
-File: libc.info,  Node: Setting Permissions,  Next: Testing File Access,  Prev: Access Permission,  Up: File Attributes
+File: libc.info,  Node: Other Kinds of Streams,  Next: Formatted Messages,  Prev: Stream Buffering,  Up: I/O on Streams
 
-14.9.7 Assigning File Permissions
----------------------------------
+12.21 Other Kinds of Streams
+============================
 
-The primitive functions for creating files (for example, `open' or
-`mkdir') take a MODE argument, which specifies the file permissions to
-give the newly created file.  This mode is modified by the process's
-"file creation mask", or "umask", before it is used.
+The GNU C Library provides ways for you to define additional kinds of
+streams that do not necessarily correspond to an open file.
 
-   The bits that are set in the file creation mask identify permissions
-that are always to be disabled for newly created files.  For example, if
-you set all the "other" access bits in the mask, then newly created
-files are not accessible at all to processes in the "other" category,
-even if the MODE argument passed to the create function would permit
-such access.  In other words, the file creation mask is the complement
-of the ordinary access permissions you want to grant.
+   One such type of stream takes input from or writes output to a
+string.  These kinds of streams are used internally to implement the
+'sprintf' and 'sscanf' functions.  You can also create such a stream
+explicitly, using the functions described in *note String Streams::.
 
-   Programs that create files typically specify a MODE argument that
-includes all the permissions that make sense for the particular file.
-For an ordinary file, this is typically read and write permission for
-all classes of users.  These permissions are then restricted as
-specified by the individual user's own file creation mask.
+   More generally, you can define streams that do input/output to
+arbitrary objects using functions supplied by your program.  This
+protocol is discussed in *note Custom Streams::.
 
-   To change the permission of an existing file given its name, call
-`chmod'.  This function uses the specified permission bits and ignores
-the file creation mask.
+   *Portability Note:* The facilities described in this section are
+specific to GNU. Other systems or C implementations might or might not
+provide equivalent functionality.
 
-   In normal use, the file creation mask is initialized by the user's
-login shell (using the `umask' shell command), and inherited by all
-subprocesses.  Application programs normally don't need to worry about
-the file creation mask.  It will automatically do what it is supposed to
-do.
+* Menu:
 
-   When your program needs to create a file and bypass the umask for its
-access permissions, the easiest way to do this is to use `fchmod' after
-opening the file, rather than changing the umask.  In fact, changing
-the umask is usually done only by shells.  They use the `umask'
-function.
-
-   The functions in this section are declared in `sys/stat.h'.  
-
- -- Function: mode_t umask (mode_t MASK)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `umask' function sets the file creation mask of the current
-     process to MASK, and returns the previous value of the file
-     creation mask.
-
-     Here is an example showing how to read the mask with `umask'
-     without changing it permanently:
-
-          mode_t
-          read_umask (void)
-          {
-            mode_t mask = umask (0);
-            umask (mask);
-            return mask;
-          }
-
-     However, on GNU/Hurd systems it is better to use `getumask' if you
-     just want to read the mask value, because it is reentrant.
-
- -- Function: mode_t getumask (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Return the current value of the file creation mask for the current
-     process.  This function is a GNU extension and is only available on
-     GNU/Hurd systems.
-
- -- Function: int chmod (const char *FILENAME, mode_t MODE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `chmod' function sets the access permission bits for the file
-     named by FILENAME to MODE.
-
-     If FILENAME is a symbolic link, `chmod' changes the permissions of
-     the file pointed to by the link, not those of the link itself.
-
-     This function returns `0' if successful and `-1' if not.  In
-     addition to the usual file name errors (*note File Name Errors::),
-     the following `errno' error conditions are defined for this
-     function:
-
-    `ENOENT'
-          The named file doesn't exist.
-
-    `EPERM'
-          This process does not have permission to change the access
-          permissions of this file.  Only the file's owner (as judged
-          by the effective user ID of the process) or a privileged user
-          can change them.
-
-    `EROFS'
-          The file resides on a read-only file system.
-
-    `EFTYPE'
-          MODE has the `S_ISVTX' bit (the "sticky bit") set, and the
-          named file is not a directory.  Some systems do not allow
-          setting the sticky bit on non-directory files, and some do
-          (and only some of those assign a useful meaning to the bit
-          for non-directory files).
-
-          You only get `EFTYPE' on systems where the sticky bit has no
-          useful meaning for non-directory files, so it is always safe
-          to just clear the bit in MODE and call `chmod' again.  *Note
-          Permission Bits::, for full details on the sticky bit.
-
- -- Function: int fchmod (int FILEDES, mode_t MODE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This is like `chmod', except that it changes the permissions of the
-     currently open file given by FILEDES.
-
-     The return value from `fchmod' is `0' on success and `-1' on
-     failure.  The following `errno' error codes are defined for this
-     function:
-
-    `EBADF'
-          The FILEDES argument is not a valid file descriptor.
-
-    `EINVAL'
-          The FILEDES argument corresponds to a pipe or socket, or
-          something else that doesn't really have access permissions.
-
-    `EPERM'
-          This process does not have permission to change the access
-          permissions of this file.  Only the file's owner (as judged
-          by the effective user ID of the process) or a privileged user
-          can change them.
-
-    `EROFS'
-          The file resides on a read-only file system.
+* String Streams::              Streams that get data from or put data in
+				 a string or memory buffer.
+* Custom Streams::              Defining your own streams with an arbitrary
+				 input data source and/or output data sink.
 
 
-File: libc.info,  Node: Testing File Access,  Next: File Times,  Prev: Setting Permissions,  Up: File Attributes
+File: libc.info,  Node: String Streams,  Next: Custom Streams,  Up: Other Kinds of Streams
 
-14.9.8 Testing Permission to Access a File
-------------------------------------------
+12.21.1 String Streams
+----------------------
 
-In some situations it is desirable to allow programs to access files or
-devices even if this is not possible with the permissions granted to the
-user.  One possible solution is to set the setuid-bit of the program
-file.  If such a program is started the _effective_ user ID of the
-process is changed to that of the owner of the program file.  So to
-allow write access to files like `/etc/passwd', which normally can be
-written only by the super-user, the modifying program will have to be
-owned by `root' and the setuid-bit must be set.
+The 'fmemopen' and 'open_memstream' functions allow you to do I/O to a
+string or memory buffer.  These facilities are declared in 'stdio.h'.
 
-   But beside the files the program is intended to change the user
-should not be allowed to access any file to which s/he would not have
-access anyway.  The program therefore must explicitly check whether _the
-user_ would have the necessary access to a file, before it reads or
-writes the file.
+ -- Function: FILE * fmemopen (void *BUF, size_t SIZE, const char
+          *OPENTYPE)
+     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe mem lock |
+     *Note POSIX Safety Concepts::.
 
-   To do this, use the function `access', which checks for access
-permission based on the process's _real_ user ID rather than the
-effective user ID.  (The setuid feature does not alter the real user ID,
-so it reflects the user who actually ran the program.)
+     This function opens a stream that allows the access specified by
+     the OPENTYPE argument, that reads from or writes to the buffer
+     specified by the argument BUF.  This array must be at least SIZE
+     bytes long.
 
-   There is another way you could check this access, which is easy to
-describe, but very hard to use.  This is to examine the file mode bits
-and mimic the system's own access computation.  This method is
-undesirable because many systems have additional access control
-features; your program cannot portably mimic them, and you would not
-want to try to keep track of the diverse features that different systems
-have.  Using `access' is simple and automatically does whatever is
-appropriate for the system you are using.
+     If you specify a null pointer as the BUF argument, 'fmemopen'
+     dynamically allocates an array SIZE bytes long (as with 'malloc';
+     *note Unconstrained Allocation::).  This is really only useful if
+     you are going to write things to the buffer and then read them back
+     in again, because you have no way of actually getting a pointer to
+     the buffer (for this, try 'open_memstream', below).  The buffer is
+     freed when the stream is closed.
 
-   `access' is _only_ only appropriate to use in setuid programs.  A
-non-setuid program will always use the effective ID rather than the
-real ID.
+     The argument OPENTYPE is the same as in 'fopen' (*note Opening
+     Streams::).  If the OPENTYPE specifies append mode, then the
+     initial file position is set to the first null character in the
+     buffer.  Otherwise the initial file position is at the beginning of
+     the buffer.
 
-   The symbols in this section are declared in `unistd.h'.
+     When a stream open for writing is flushed or closed, a null
+     character (zero byte) is written at the end of the buffer if it
+     fits.  You should add an extra byte to the SIZE argument to account
+     for this.  Attempts to write more than SIZE bytes to the buffer
+     result in an error.
 
- -- Function: int access (const char *FILENAME, int HOW)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
+     For a stream open for reading, null characters (zero bytes) in the
+     buffer do not count as "end of file".  Read operations indicate end
+     of file only when the file position advances past SIZE bytes.  So,
+     if you want to read characters from a null-terminated string, you
+     should supply the length of the string as the SIZE argument.
 
-     The `access' function checks to see whether the file named by
-     FILENAME can be accessed in the way specified by the HOW argument.
-     The HOW argument either can be the bitwise OR of the flags `R_OK',
-     `W_OK', `X_OK', or the existence test `F_OK'.
+   Here is an example of using 'fmemopen' to create a stream for reading
+from a string:
 
-     This function uses the _real_ user and group IDs of the calling
-     process, rather than the _effective_ IDs, to check for access
-     permission.  As a result, if you use the function from a `setuid'
-     or `setgid' program (*note How Change Persona::), it gives
-     information relative to the user who actually ran the program.
 
-     The return value is `0' if the access is permitted, and `-1'
-     otherwise.  (In other words, treated as a predicate function,
-     `access' returns true if the requested access is _denied_.)
+     #include <stdio.h>
 
-     In addition to the usual file name errors (*note File Name
-     Errors::), the following `errno' error conditions are defined for
-     this function:
-
-    `EACCES'
-          The access specified by HOW is denied.
-
-    `ENOENT'
-          The file doesn't exist.
-
-    `EROFS'
-          Write permission was requested for a file on a read-only file
-          system.
-
-   These macros are defined in the header file `unistd.h' for use as
-the HOW argument to the `access' function.  The values are integer
-constants.  
-
- -- Macro: int R_OK
-     Flag meaning test for read permission.
-
- -- Macro: int W_OK
-     Flag meaning test for write permission.
-
- -- Macro: int X_OK
-     Flag meaning test for execute/search permission.
-
- -- Macro: int F_OK
-     Flag meaning test for existence of the file.
-
-
-File: libc.info,  Node: File Times,  Next: File Size,  Prev: Testing File Access,  Up: File Attributes
-
-14.9.9 File Times
------------------
-
-Each file has three time stamps associated with it:  its access time,
-its modification time, and its attribute modification time.  These
-correspond to the `st_atime', `st_mtime', and `st_ctime' members of the
-`stat' structure; see *note File Attributes::.
-
-   All of these times are represented in calendar time format, as
-`time_t' objects.  This data type is defined in `time.h'.  For more
-information about representation and manipulation of time values, see
-*note Calendar Time::.  
-
-   Reading from a file updates its access time attribute, and writing
-updates its modification time.  When a file is created, all three time
-stamps for that file are set to the current time.  In addition, the
-attribute change time and modification time fields of the directory that
-contains the new entry are updated.
-
-   Adding a new name for a file with the `link' function updates the
-attribute change time field of the file being linked, and both the
-attribute change time and modification time fields of the directory
-containing the new name.  These same fields are affected if a file name
-is deleted with `unlink', `remove' or `rmdir'.  Renaming a file with
-`rename' affects only the attribute change time and modification time
-fields of the two parent directories involved, and not the times for
-the file being renamed.
-
-   Changing the attributes of a file (for example, with `chmod')
-updates its attribute change time field.
-
-   You can also change some of the time stamps of a file explicitly
-using the `utime' function--all except the attribute change time.  You
-need to include the header file `utime.h' to use this facility.  
-
- -- Data Type: struct utimbuf
-     The `utimbuf' structure is used with the `utime' function to
-     specify new access and modification times for a file.  It contains
-     the following members:
-
-    `time_t actime'
-          This is the access time for the file.
-
-    `time_t modtime'
-          This is the modification time for the file.
-
- -- Function: int utime (const char *FILENAME, const struct utimbuf
-          *TIMES)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is used to modify the file times associated with the
-     file named FILENAME.
-
-     If TIMES is a null pointer, then the access and modification times
-     of the file are set to the current time.  Otherwise, they are set
-     to the values from the `actime' and `modtime' members
-     (respectively) of the `utimbuf' structure pointed to by TIMES.
-
-     The attribute modification time for the file is set to the current
-     time in either case (since changing the time stamps is itself a
-     modification of the file attributes).
-
-     The `utime' function returns `0' if successful and `-1' on
-     failure.  In addition to the usual file name errors (*note File
-     Name Errors::), the following `errno' error conditions are defined
-     for this function:
-
-    `EACCES'
-          There is a permission problem in the case where a null
-          pointer was passed as the TIMES argument.  In order to update
-          the time stamp on the file, you must either be the owner of
-          the file, have write permission for the file, or be a
-          privileged user.
-
-    `ENOENT'
-          The file doesn't exist.
-
-    `EPERM'
-          If the TIMES argument is not a null pointer, you must either
-          be the owner of the file or be a privileged user.
-
-    `EROFS'
-          The file lives on a read-only file system.
-
-   Each of the three time stamps has a corresponding microsecond part,
-which extends its resolution.  These fields are called `st_atime_usec',
-`st_mtime_usec', and `st_ctime_usec'; each has a value between 0 and
-999,999, which indicates the time in microseconds.  They correspond to
-the `tv_usec' field of a `timeval' structure; see *note High-Resolution
-Calendar::.
-
-   The `utimes' function is like `utime', but also lets you specify the
-fractional part of the file times.  The prototype for this function is
-in the header file `sys/time.h'.  
-
- -- Function: int utimes (const char *FILENAME, const struct timeval
-          TVP[2])
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function sets the file access and modification times of the
-     file FILENAME.  The new file access time is specified by `TVP[0]',
-     and the new modification time by `TVP[1]'.  Similar to `utime', if
-     TVP is a null pointer then the access and modification times of
-     the file are set to the current time.  This function comes from
-     BSD.
-
-     The return values and error conditions are the same as for the
-     `utime' function.
-
- -- Function: int lutimes (const char *FILENAME, const struct timeval
-          TVP[2])
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is like `utimes', except that it does not follow
-     symbolic links.  If FILENAME is the name of a symbolic link,
-     `lutimes' sets the file access and modification times of the
-     symbolic link special file itself (as seen by `lstat'; *note
-     Symbolic Links::) while `utimes' sets the file access and
-     modification times of the file the symbolic link refers to.  This
-     function comes from FreeBSD, and is not available on all platforms
-     (if not available, it will fail with `ENOSYS').
-
-     The return values and error conditions are the same as for the
-     `utime' function.
-
- -- Function: int futimes (int FD, const struct timeval TVP[2])
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is like `utimes', except that it takes an open file
-     descriptor as an argument instead of a file name.  *Note Low-Level
-     I/O::.  This function comes from FreeBSD, and is not available on
-     all platforms (if not available, it will fail with `ENOSYS').
-
-     Like `utimes', `futimes' returns `0' on success and `-1' on
-     failure.  The following `errno' error conditions are defined for
-     `futimes':
-
-    `EACCES'
-          There is a permission problem in the case where a null
-          pointer was passed as the TIMES argument.  In order to update
-          the time stamp on the file, you must either be the owner of
-          the file, have write permission for the file, or be a
-          privileged user.
-
-    `EBADF'
-          The FILEDES argument is not a valid file descriptor.
-
-    `EPERM'
-          If the TIMES argument is not a null pointer, you must either
-          be the owner of the file or be a privileged user.
-
-    `EROFS'
-          The file lives on a read-only file system.
-
-
-File: libc.info,  Node: File Size,  Prev: File Times,  Up: File Attributes
-
-14.9.10 File Size
------------------
-
-Normally file sizes are maintained automatically.  A file begins with a
-size of 0 and is automatically extended when data is written past its
-end.  It is also possible to empty a file completely by an `open' or
-`fopen' call.
-
-   However, sometimes it is necessary to _reduce_ the size of a file.
-This can be done with the `truncate' and `ftruncate' functions.  They
-were introduced in BSD Unix.  `ftruncate' was later added to POSIX.1.
-
-   Some systems allow you to extend a file (creating holes) with these
-functions.  This is useful when using memory-mapped I/O (*note
-Memory-mapped I/O::), where files are not automatically extended.
-However, it is not portable but must be implemented if `mmap' allows
-mapping of files (i.e., `_POSIX_MAPPED_FILES' is defined).
-
-   Using these functions on anything other than a regular file gives
-_undefined_ results.  On many systems, such a call will appear to
-succeed, without actually accomplishing anything.
-
- -- Function: int truncate (const char *FILENAME, off_t LENGTH)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `truncate' function changes the size of FILENAME to LENGTH.
-     If LENGTH is shorter than the previous length, data at the end
-     will be lost.  The file must be writable by the user to perform
-     this operation.
-
-     If LENGTH is longer, holes will be added to the end.  However, some
-     systems do not support this feature and will leave the file
-     unchanged.
-
-     When the source file is compiled with `_FILE_OFFSET_BITS == 64' the
-     `truncate' function is in fact `truncate64' and the type `off_t'
-     has 64 bits which makes it possible to handle files up to 2^63
-     bytes in length.
-
-     The return value is 0 for success, or -1 for an error.  In
-     addition to the usual file name errors, the following errors may
-     occur:
-
-    `EACCES'
-          The file is a directory or not writable.
-
-    `EINVAL'
-          LENGTH is negative.
-
-    `EFBIG'
-          The operation would extend the file beyond the limits of the
-          operating system.
-
-    `EIO'
-          A hardware I/O error occurred.
-
-    `EPERM'
-          The file is "append-only" or "immutable".
-
-    `EINTR'
-          The operation was interrupted by a signal.
-
-
-
- -- Function: int truncate64 (const char *NAME, off64_t LENGTH)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is similar to the `truncate' function.  The
-     difference is that the LENGTH argument is 64 bits wide even on 32
-     bits machines, which allows the handling of files with sizes up to
-     2^63 bytes.
-
-     When the source file is compiled with `_FILE_OFFSET_BITS == 64' on
-     a 32 bits machine this function is actually available under the
-     name `truncate' and so transparently replaces the 32 bits
-     interface.
-
- -- Function: int ftruncate (int FD, off_t LENGTH)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This is like `truncate', but it works on a file descriptor FD for
-     an opened file instead of a file name to identify the object.  The
-     file must be opened for writing to successfully carry out the
-     operation.
-
-     The POSIX standard leaves it implementation defined what happens
-     if the specified new LENGTH of the file is bigger than the
-     original size.  The `ftruncate' function might simply leave the
-     file alone and do nothing or it can increase the size to the
-     desired size.  In this later case the extended area should be
-     zero-filled.  So using `ftruncate' is no reliable way to increase
-     the file size but if it is possible it is probably the fastest
-     way.  The function also operates on POSIX shared memory segments
-     if these are implemented by the system.
-
-     `ftruncate' is especially useful in combination with `mmap'.
-     Since the mapped region must have a fixed size one cannot enlarge
-     the file by writing something beyond the last mapped page.
-     Instead one has to enlarge the file itself and then remap the file
-     with the new size.  The example below shows how this works.
-
-     When the source file is compiled with `_FILE_OFFSET_BITS == 64' the
-     `ftruncate' function is in fact `ftruncate64' and the type `off_t'
-     has 64 bits which makes it possible to handle files up to 2^63
-     bytes in length.
-
-     The return value is 0 for success, or -1 for an error.  The
-     following errors may occur:
-
-    `EBADF'
-          FD does not correspond to an open file.
-
-    `EACCES'
-          FD is a directory or not open for writing.
-
-    `EINVAL'
-          LENGTH is negative.
-
-    `EFBIG'
-          The operation would extend the file beyond the limits of the
-          operating system.
-
-    `EIO'
-          A hardware I/O error occurred.
-
-    `EPERM'
-          The file is "append-only" or "immutable".
-
-    `EINTR'
-          The operation was interrupted by a signal.
-
-
-
- -- Function: int ftruncate64 (int ID, off64_t LENGTH)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is similar to the `ftruncate' function.  The
-     difference is that the LENGTH argument is 64 bits wide even on 32
-     bits machines which allows the handling of files with sizes up to
-     2^63 bytes.
-
-     When the source file is compiled with `_FILE_OFFSET_BITS == 64' on
-     a 32 bits machine this function is actually available under the
-     name `ftruncate' and so transparently replaces the 32 bits
-     interface.
-
-   As announced here is a little example of how to use `ftruncate' in
-combination with `mmap':
-
-     int fd;
-     void *start;
-     size_t len;
+     static char buffer[] = "foobar";
 
      int
-     add (off_t at, void *block, size_t size)
+     main (void)
      {
-       if (at + size > len)
-         {
-           /* Resize the file and remap.  */
-           size_t ps = sysconf (_SC_PAGESIZE);
-           size_t ns = (at + size + ps - 1) & ~(ps - 1);
-           void *np;
-           if (ftruncate (fd, ns) < 0)
-             return -1;
-           np = mmap (NULL, ns, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
-           if (np == MAP_FAILED)
-             return -1;
-           start = np;
-           len = ns;
-         }
-       memcpy ((char *) start + at, block, size);
+       int ch;
+       FILE *stream;
+
+       stream = fmemopen (buffer, strlen (buffer), "r");
+       while ((ch = fgetc (stream)) != EOF)
+         printf ("Got %c\n", ch);
+       fclose (stream);
+
        return 0;
      }
 
-   The function `add' writes a block of memory at an arbitrary position
-in the file.  If the current size of the file is too small it is
-extended.  Note the it is extended by a round number of pages.  This is
-a requirement of `mmap'.  The program has to keep track of the real
-size, and when it has finished a final `ftruncate' call should set the
-real size of the file.
+   This program produces the following output:
 
-
-File: libc.info,  Node: Making Special Files,  Next: Temporary Files,  Prev: File Attributes,  Up: File System Interface
+     Got f
+     Got o
+     Got o
+     Got b
+     Got a
+     Got r
 
-14.10 Making Special Files
-==========================
-
-The `mknod' function is the primitive for making special files, such as
-files that correspond to devices.  The GNU C Library includes this
-function for compatibility with BSD.
-
-   The prototype for `mknod' is declared in `sys/stat.h'.  
-
- -- Function: int mknod (const char *FILENAME, mode_t MODE, dev_t DEV)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `mknod' function makes a special file with name FILENAME.  The
-     MODE specifies the mode of the file, and may include the various
-     special file bits, such as `S_IFCHR' (for a character special file)
-     or `S_IFBLK' (for a block special file).  *Note Testing File
-     Type::.
-
-     The DEV argument specifies which device the special file refers to.
-     Its exact interpretation depends on the kind of special file being
-     created.
-
-     The return value is `0' on success and `-1' on error.  In addition
-     to the usual file name errors (*note File Name Errors::), the
-     following `errno' error conditions are defined for this function:
-
-    `EPERM'
-          The calling process is not privileged.  Only the superuser
-          can create special files.
-
-    `ENOSPC'
-          The directory or file system that would contain the new file
-          is full and cannot be extended.
-
-    `EROFS'
-          The directory containing the new file can't be modified
-          because it's on a read-only file system.
-
-    `EEXIST'
-          There is already a file named FILENAME.  If you want to
-          replace this file, you must remove the old file explicitly
-          first.
-
-
-File: libc.info,  Node: Temporary Files,  Prev: Making Special Files,  Up: File System Interface
-
-14.11 Temporary Files
-=====================
-
-If you need to use a temporary file in your program, you can use the
-`tmpfile' function to open it.  Or you can use the `tmpnam' (better:
-`tmpnam_r') function to provide a name for a temporary file and then
-you can open it in the usual way with `fopen'.
-
-   The `tempnam' function is like `tmpnam' but lets you choose what
-directory temporary files will go in, and something about what their
-file names will look like.  Important for multi-threaded programs is
-that `tempnam' is reentrant, while `tmpnam' is not since it returns a
-pointer to a static buffer.
-
-   These facilities are declared in the header file `stdio.h'.  
-
- -- Function: FILE * tmpfile (void)
-     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe mem fd
-     lock | *Note POSIX Safety Concepts::.
-
-     This function creates a temporary binary file for update mode, as
-     if by calling `fopen' with mode `"wb+"'.  The file is deleted
-     automatically when it is closed or when the program terminates.
-     (On some other ISO C systems the file may fail to be deleted if
-     the program terminates abnormally).
-
-     This function is reentrant.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
-     32-bit system this function is in fact `tmpfile64', i.e., the LFS
-     interface transparently replaces the old interface.
-
- -- Function: FILE * tmpfile64 (void)
-     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe mem fd
-     lock | *Note POSIX Safety Concepts::.
-
-     This function is similar to `tmpfile', but the stream it returns a
-     pointer to was opened using `tmpfile64'.  Therefore this stream can
-     be used for files larger than 2^31 bytes on 32-bit machines.
-
-     Please note that the return type is still `FILE *'.  There is no
-     special `FILE' type for the LFS interface.
-
-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a 32
-     bits machine this function is available under the name `tmpfile'
-     and so transparently replaces the old interface.
-
- -- Function: char * tmpnam (char *RESULT)
-     Preliminary: | MT-Unsafe race:tmpnam/!result | AS-Unsafe | AC-Safe
-     | *Note POSIX Safety Concepts::.
-
-     This function constructs and returns a valid file name that does
-     not refer to any existing file.  If the RESULT argument is a null
-     pointer, the return value is a pointer to an internal static
-     string, which might be modified by subsequent calls and therefore
-     makes this function non-reentrant.  Otherwise, the RESULT argument
-     should be a pointer to an array of at least `L_tmpnam' characters,
-     and the result is written into that array.
-
-     It is possible for `tmpnam' to fail if you call it too many times
-     without removing previously-created files.  This is because the
-     limited length of the temporary file names gives room for only a
-     finite number of different names.  If `tmpnam' fails it returns a
-     null pointer.
-
-     *Warning:* Between the time the pathname is constructed and the
-     file is created another process might have created a file with the
-     same name using `tmpnam', leading to a possible security hole.  The
-     implementation generates names which can hardly be predicted, but
-     when opening the file you should use the `O_EXCL' flag.  Using
-     `tmpfile' or `mkstemp' is a safe way to avoid this problem.
-
- -- Function: char * tmpnam_r (char *RESULT)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is nearly identical to the `tmpnam' function, except
-     that if RESULT is a null pointer it returns a null pointer.
-
-     This guarantees reentrancy because the non-reentrant situation of
-     `tmpnam' cannot happen here.
-
-     *Warning*: This function has the same security problems as
-     `tmpnam'.
-
- -- Macro: int L_tmpnam
-     The value of this macro is an integer constant expression that
-     represents the minimum size of a string large enough to hold a
-     file name generated by the `tmpnam' function.
-
- -- Macro: int TMP_MAX
-     The macro `TMP_MAX' is a lower bound for how many temporary names
-     you can create with `tmpnam'.  You can rely on being able to call
-     `tmpnam' at least this many times before it might fail saying you
-     have made too many temporary file names.
-
-     With the GNU C Library, you can create a very large number of
-     temporary file names.  If you actually created the files, you
-     would probably run out of disk space before you ran out of names.
-     Some other systems have a fixed, small limit on the number of
-     temporary files.  The limit is never less than `25'.
-
- -- Function: char * tempnam (const char *DIR, const char *PREFIX)
-     Preliminary: | MT-Safe env | AS-Unsafe heap | AC-Unsafe mem |
-     *Note POSIX Safety Concepts::.
-
-     This function generates a unique temporary file name.  If PREFIX
-     is not a null pointer, up to five characters of this string are
-     used as a prefix for the file name.  The return value is a string
-     newly allocated with `malloc', so you should release its storage
-     with `free' when it is no longer needed.
-
-     Because the string is dynamically allocated this function is
-     reentrant.
-
-     The directory prefix for the temporary file name is determined by
-     testing each of the following in sequence.  The directory must
-     exist and be writable.
-
-        * The environment variable `TMPDIR', if it is defined.  For
-          security reasons this only happens if the program is not SUID
-          or SGID enabled.
-
-        * The DIR argument, if it is not a null pointer.
-
-        * The value of the `P_tmpdir' macro.
-
-        * The directory `/tmp'.
-
-     This function is defined for SVID compatibility.
-
-     *Warning:* Between the time the pathname is constructed and the
-     file is created another process might have created a file with the
-     same name using `tempnam', leading to a possible security hole.
-     The implementation generates names which can hardly be predicted,
-     but when opening the file you should use the `O_EXCL' flag.  Using
-     `tmpfile' or `mkstemp' is a safe way to avoid this problem.
-   
- -- SVID Macro: char * P_tmpdir
-     This macro is the name of the default directory for temporary
-     files.
-
-   Older Unix systems did not have the functions just described.
-Instead they used `mktemp' and `mkstemp'.  Both of these functions work
-by modifying a file name template string you pass.  The last six
-characters of this string must be `XXXXXX'.  These six `X's are
-replaced with six characters which make the whole string a unique file
-name.  Usually the template string is something like
-`/tmp/PREFIXXXXXXX', and each program uses a unique PREFIX.
-
-   *NB:* Because `mktemp' and `mkstemp' modify the template string, you
-_must not_ pass string constants to them.  String constants are
-normally in read-only storage, so your program would crash when
-`mktemp' or `mkstemp' tried to modify the string.  These functions are
-declared in the header file `stdlib.h'.  
-
- -- Function: char * mktemp (char *TEMPLATE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `mktemp' function generates a unique file name by modifying
-     TEMPLATE as described above.  If successful, it returns TEMPLATE
-     as modified.  If `mktemp' cannot find a unique file name, it makes
-     TEMPLATE an empty string and returns that.  If TEMPLATE does not
-     end with `XXXXXX', `mktemp' returns a null pointer.
-
-     *Warning:* Between the time the pathname is constructed and the
-     file is created another process might have created a file with the
-     same name using `mktemp', leading to a possible security hole.  The
-     implementation generates names which can hardly be predicted, but
-     when opening the file you should use the `O_EXCL' flag.  Using
-     `mkstemp' is a safe way to avoid this problem.
-
- -- Function: int mkstemp (char *TEMPLATE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
-     Concepts::.
-
-     The `mkstemp' function generates a unique file name just as
-     `mktemp' does, but it also opens the file for you with `open'
-     (*note Opening and Closing Files::).  If successful, it modifies
-     TEMPLATE in place and returns a file descriptor for that file open
-     for reading and writing.  If `mkstemp' cannot create a
-     uniquely-named file, it returns `-1'.  If TEMPLATE does not end
-     with `XXXXXX', `mkstemp' returns `-1' and does not modify TEMPLATE.
-
-     The file is opened using mode `0600'.  If the file is meant to be
-     used by other users this mode must be changed explicitly.
-
-   Unlike `mktemp', `mkstemp' is actually guaranteed to create a unique
-file that cannot possibly clash with any other program trying to create
-a temporary file.  This is because it works by calling `open' with the
-`O_EXCL' flag, which says you want to create a new file and get an
-error if the file already exists.
-
- -- Function: char * mkdtemp (char *TEMPLATE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `mkdtemp' function creates a directory with a unique name.  If
-     it succeeds, it overwrites TEMPLATE with the name of the
-     directory, and returns TEMPLATE.  As with `mktemp' and `mkstemp',
-     TEMPLATE should be a string ending with `XXXXXX'.
-
-     If `mkdtemp' cannot create an uniquely named directory, it returns
-     `NULL' and sets ERRNO appropriately.  If TEMPLATE does not end
-     with `XXXXXX', `mkdtemp' returns `NULL' and does not modify
-     TEMPLATE.  ERRNO will be set to `EINVAL' in this case.
-
-     The directory is created using mode `0700'.
-
-   The directory created by `mkdtemp' cannot clash with temporary files
-or directories created by other users.  This is because directory
-creation always works like `open' with `O_EXCL'.  *Note Creating
-Directories::.
-
-   The `mkdtemp' function comes from OpenBSD.
-
-
-File: libc.info,  Node: Pipes and FIFOs,  Next: Sockets,  Prev: File System Interface,  Up: Top
-
-15 Pipes and FIFOs
-******************
-
-A "pipe" is a mechanism for interprocess communication; data written to
-the pipe by one process can be read by another process.  The data is
-handled in a first-in, first-out (FIFO) order.  The pipe has no name; it
-is created for one use and both ends must be inherited from the single
-process which created the pipe.
-
-   A "FIFO special file" is similar to a pipe, but instead of being an
-anonymous, temporary connection, a FIFO has a name or names like any
-other file.  Processes open the FIFO by name in order to communicate
-through it.
-
-   A pipe or FIFO has to be open at both ends simultaneously.  If you
-read from a pipe or FIFO file that doesn't have any processes writing
-to it (perhaps because they have all closed the file, or exited), the
-read returns end-of-file.  Writing to a pipe or FIFO that doesn't have a
-reading process is treated as an error condition; it generates a
-`SIGPIPE' signal, and fails with error code `EPIPE' if the signal is
-handled or blocked.
-
-   Neither pipes nor FIFO special files allow file positioning.  Both
-reading and writing operations happen sequentially; reading from the
-beginning of the file and writing at the end.
-
-* Menu:
-
-* Creating a Pipe::             Making a pipe with the `pipe' function.
-* Pipe to a Subprocess::        Using a pipe to communicate with a
-				 child process.
-* FIFO Special Files::          Making a FIFO special file.
-* Pipe Atomicity::		When pipe (or FIFO) I/O is atomic.
-
-
-File: libc.info,  Node: Creating a Pipe,  Next: Pipe to a Subprocess,  Up: Pipes and FIFOs
-
-15.1 Creating a Pipe
-====================
-
-The primitive for creating a pipe is the `pipe' function.  This creates
-both the reading and writing ends of the pipe.  It is not very useful
-for a single process to use a pipe to talk to itself.  In typical use,
-a process creates a pipe just before it forks one or more child
-processes (*note Creating a Process::).  The pipe is then used for
-communication either between the parent or child processes, or between
-two sibling processes.
-
-   The `pipe' function is declared in the header file `unistd.h'.  
-
- -- Function: int pipe (int FILEDES[2])
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
-     Concepts::.
-
-     The `pipe' function creates a pipe and puts the file descriptors
-     for the reading and writing ends of the pipe (respectively) into
-     `FILEDES[0]' and `FILEDES[1]'.
-
-     An easy way to remember that the input end comes first is that file
-     descriptor `0' is standard input, and file descriptor `1' is
-     standard output.
-
-     If successful, `pipe' returns a value of `0'.  On failure, `-1' is
-     returned.  The following `errno' error conditions are defined for
-     this function:
-
-    `EMFILE'
-          The process has too many files open.
-
-    `ENFILE'
-          There are too many open files in the entire system.  *Note
-          Error Codes::, for more information about `ENFILE'.  This
-          error never occurs on GNU/Hurd systems.
-
-   Here is an example of a simple program that creates a pipe.  This
-program uses the `fork' function (*note Creating a Process::) to create
-a child process.  The parent process writes data to the pipe, which is
-read by the child process.
-
-
-     #include <sys/types.h>
-     #include <unistd.h>
-     #include <stdio.h>
-     #include <stdlib.h>
-
-     /* Read characters from the pipe and echo them to `stdout'. */
-
-     void
-     read_from_pipe (int file)
-     {
-       FILE *stream;
-       int c;
-       stream = fdopen (file, "r");
-       while ((c = fgetc (stream)) != EOF)
-         putchar (c);
-       fclose (stream);
-     }
-
-     /* Write some random text to the pipe. */
-
-     void
-     write_to_pipe (int file)
-     {
-       FILE *stream;
-       stream = fdopen (file, "w");
-       fprintf (stream, "hello, world!\n");
-       fprintf (stream, "goodbye, world!\n");
-       fclose (stream);
-     }
-
-     int
-     main (void)
-     {
-       pid_t pid;
-       int mypipe[2];
-
-       /* Create the pipe. */
-       if (pipe (mypipe))
-         {
-           fprintf (stderr, "Pipe failed.\n");
-           return EXIT_FAILURE;
-         }
-
-       /* Create the child process. */
-       pid = fork ();
-       if (pid == (pid_t) 0)
-         {
-           /* This is the child process.
-              Close other end first. */
-           close (mypipe[1]);
-           read_from_pipe (mypipe[0]);
-           return EXIT_SUCCESS;
-         }
-       else if (pid < (pid_t) 0)
-         {
-           /* The fork failed. */
-           fprintf (stderr, "Fork failed.\n");
-           return EXIT_FAILURE;
-         }
-       else
-         {
-           /* This is the parent process.
-              Close other end first. */
-           close (mypipe[0]);
-           write_to_pipe (mypipe[1]);
-           return EXIT_SUCCESS;
-         }
-     }
-
-
-File: libc.info,  Node: Pipe to a Subprocess,  Next: FIFO Special Files,  Prev: Creating a Pipe,  Up: Pipes and FIFOs
-
-15.2 Pipe to a Subprocess
-=========================
-
-A common use of pipes is to send data to or receive data from a program
-being run as a subprocess.  One way of doing this is by using a
-combination of `pipe' (to create the pipe), `fork' (to create the
-subprocess), `dup2' (to force the subprocess to use the pipe as its
-standard input or output channel), and `exec' (to execute the new
-program).  Or, you can use `popen' and `pclose'.
-
-   The advantage of using `popen' and `pclose' is that the interface is
-much simpler and easier to use.  But it doesn't offer as much
-flexibility as using the low-level functions directly.
-
- -- Function: FILE * popen (const char *COMMAND, const char *MODE)
-     Preliminary: | MT-Safe | AS-Unsafe heap corrupt | AC-Unsafe
-     corrupt lock fd mem | *Note POSIX Safety Concepts::.
-
-     The `popen' function is closely related to the `system' function;
-     see *note Running a Command::.  It executes the shell command
-     COMMAND as a subprocess.  However, instead of waiting for the
-     command to complete, it creates a pipe to the subprocess and
-     returns a stream that corresponds to that pipe.
-
-     If you specify a MODE argument of `"r"', you can read from the
-     stream to retrieve data from the standard output channel of the
-     subprocess.  The subprocess inherits its standard input channel
-     from the parent process.
-
-     Similarly, if you specify a MODE argument of `"w"', you can write
-     to the stream to send data to the standard input channel of the
-     subprocess.  The subprocess inherits its standard output channel
-     from the parent process.
-
-     In the event of an error `popen' returns a null pointer.  This
-     might happen if the pipe or stream cannot be created, if the
-     subprocess cannot be forked, or if the program cannot be executed.
-
- -- Function: int pclose (FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe heap plugin corrupt lock |
-     AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
-
-     The `pclose' function is used to close a stream created by `popen'.
-     It waits for the child process to terminate and returns its status
-     value, as for the `system' function.
-
-   Here is an example showing how to use `popen' and `pclose' to filter
-output through another program, in this case the paging program `more'.
-
-
-     #include <stdio.h>
-     #include <stdlib.h>
-
-     void
-     write_data (FILE * stream)
-     {
-       int i;
-       for (i = 0; i < 100; i++)
-         fprintf (stream, "%d\n", i);
-       if (ferror (stream))
-         {
-           fprintf (stderr, "Output to stream failed.\n");
-           exit (EXIT_FAILURE);
-         }
-     }
-
-     int
-     main (void)
-     {
-       FILE *output;
-
-       output = popen ("more", "w");
-       if (!output)
-         {
-           fprintf (stderr,
-                    "incorrect parameters or too many files.\n");
-           return EXIT_FAILURE;
-         }
-       write_data (output);
-       if (pclose (output) != 0)
-         {
-           fprintf (stderr,
-                    "Could not run more or other error.\n");
-         }
-       return EXIT_SUCCESS;
-     }
-
-
-File: libc.info,  Node: FIFO Special Files,  Next: Pipe Atomicity,  Prev: Pipe to a Subprocess,  Up: Pipes and FIFOs
-
-15.3 FIFO Special Files
-=======================
-
-A FIFO special file is similar to a pipe, except that it is created in a
-different way.  Instead of being an anonymous communications channel, a
-FIFO special file is entered into the file system by calling `mkfifo'.
-
-   Once you have created a FIFO special file in this way, any process
-can open it for reading or writing, in the same way as an ordinary file.
-However, it has to be open at both ends simultaneously before you can
-proceed to do any input or output operations on it.  Opening a FIFO for
-reading normally blocks until some other process opens the same FIFO for
-writing, and vice versa.
-
-   The `mkfifo' function is declared in the header file `sys/stat.h'.  
-
- -- Function: int mkfifo (const char *FILENAME, mode_t MODE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `mkfifo' function makes a FIFO special file with name
-     FILENAME.  The MODE argument is used to set the file's
-     permissions; see *note Setting Permissions::.
-
-     The normal, successful return value from `mkfifo' is `0'.  In the
-     case of an error, `-1' is returned.  In addition to the usual file
-     name errors (*note File Name Errors::), the following `errno'
-     error conditions are defined for this function:
-
-    `EEXIST'
-          The named file already exists.
-
-    `ENOSPC'
-          The directory or file system cannot be extended.
-
-    `EROFS'
-          The directory that would contain the file resides on a
-          read-only file system.
-
-
-File: libc.info,  Node: Pipe Atomicity,  Prev: FIFO Special Files,  Up: Pipes and FIFOs
-
-15.4 Atomicity of Pipe I/O
-==========================
-
-Reading or writing pipe data is "atomic" if the size of data written is
-not greater than `PIPE_BUF'.  This means that the data transfer seems
-to be an instantaneous unit, in that nothing else in the system can
-observe a state in which it is partially complete.  Atomic I/O may not
-begin right away (it may need to wait for buffer space or for data),
-but once it does begin it finishes immediately.
-
-   Reading or writing a larger amount of data may not be atomic; for
-example, output data from other processes sharing the descriptor may be
-interspersed.  Also, once `PIPE_BUF' characters have been written,
-further writes will block until some characters are read.
-
-   *Note Limits for Files::, for information about the `PIPE_BUF'
-parameter.
-
-
-File: libc.info,  Node: Sockets,  Next: Low-Level Terminal Interface,  Prev: Pipes and FIFOs,  Up: Top
-
-16 Sockets
-**********
-
-This chapter describes the GNU facilities for interprocess
-communication using sockets.
-
-   A "socket" is a generalized interprocess communication channel.
-Like a pipe, a socket is represented as a file descriptor.  Unlike pipes
-sockets support communication between unrelated processes, and even
-between processes running on different machines that communicate over a
-network.  Sockets are the primary means of communicating with other
-machines; `telnet', `rlogin', `ftp', `talk' and the other familiar
-network programs use sockets.
-
-   Not all operating systems support sockets.  In the GNU C Library, the
-header file `sys/socket.h' exists regardless of the operating system,
-and the socket functions always exist, but if the system does not
-really support sockets these functions always fail.
-
-   *Incomplete:* We do not currently document the facilities for
-broadcast messages or for configuring Internet interfaces.  The
-reentrant functions and some newer functions that are related to IPv6
-aren't documented either so far.
-
-* Menu:
-
-* Socket Concepts::	Basic concepts you need to know about.
-* Communication Styles::Stream communication, datagrams and other styles.
-* Socket Addresses::	How socket names (``addresses'') work.
-* Interface Naming::	Identifying specific network interfaces.
-* Local Namespace::	Details about the local namespace.
-* Internet Namespace::	Details about the Internet namespace.
-* Misc Namespaces::	Other namespaces not documented fully here.
-* Open/Close Sockets::  Creating sockets and destroying them.
-* Connections::		Operations on sockets with connection state.
-* Datagrams::		Operations on datagram sockets.
-* Inetd::		Inetd is a daemon that starts servers on request.
-			   The most convenient way to write a server
-			   is to make it work with Inetd.
-* Socket Options::	Miscellaneous low-level socket options.
-* Networks Database::   Accessing the database of network names.
-
-
-File: libc.info,  Node: Socket Concepts,  Next: Communication Styles,  Up: Sockets
-
-16.1 Socket Concepts
-====================
-
-When you create a socket, you must specify the style of communication
-you want to use and the type of protocol that should implement it.  The
-"communication style" of a socket defines the user-level semantics of
-sending and receiving data on the socket.  Choosing a communication
-style specifies the answers to questions such as these:
-
-   * *What are the units of data transmission?*  Some communication
-     styles regard the data as a sequence of bytes with no larger
-     structure; others group the bytes into records (which are known in
-     this context as "packets").
-
-   * *Can data be lost during normal operation?*  Some communication
-     styles guarantee that all the data sent arrives in the order it was
-     sent (barring system or network crashes); other styles occasionally
-     lose data as a normal part of operation, and may sometimes deliver
-     packets more than once or in the wrong order.
-
-     Designing a program to use unreliable communication styles usually
-     involves taking precautions to detect lost or misordered packets
-     and to retransmit data as needed.
-
-   * *Is communication entirely with one partner?*  Some communication
-     styles are like a telephone call--you make a "connection" with one
-     remote socket and then exchange data freely.  Other styles are
-     like mailing letters--you specify a destination address for each
-     message you send.
-
-   You must also choose a "namespace" for naming the socket.  A socket
-name ("address") is meaningful only in the context of a particular
-namespace.  In fact, even the data type to use for a socket name may
-depend on the namespace.  Namespaces are also called "domains", but we
-avoid that word as it can be confused with other usage of the same
-term.  Each namespace has a symbolic name that starts with `PF_'.  A
-corresponding symbolic name starting with `AF_' designates the address
-format for that namespace.
-
-   Finally you must choose the "protocol" to carry out the
-communication.  The protocol determines what low-level mechanism is used
-to transmit and receive data.  Each protocol is valid for a particular
-namespace and communication style; a namespace is sometimes called a
-"protocol family" because of this, which is why the namespace names
-start with `PF_'.
-
-   The rules of a protocol apply to the data passing between two
-programs, perhaps on different computers; most of these rules are
-handled by the operating system and you need not know about them.  What
-you do need to know about protocols is this:
-
-   * In order to have communication between two sockets, they must
-     specify the _same_ protocol.
-
-   * Each protocol is meaningful with particular style/namespace
-     combinations and cannot be used with inappropriate combinations.
-     For example, the TCP protocol fits only the byte stream style of
-     communication and the Internet namespace.
-
-   * For each combination of style and namespace there is a "default
-     protocol", which you can request by specifying 0 as the protocol
-     number.  And that's what you should normally do--use the default.
-
-   Throughout the following description at various places
-variables/parameters to denote sizes are required.  And here the trouble
-starts.  In the first implementations the type of these variables was
-simply `int'.  On most machines at that time an `int' was 32 bits wide,
-which created a _de facto_ standard requiring 32-bit variables.  This
-is important since references to variables of this type are passed to
-the kernel.
-
-   Then the POSIX people came and unified the interface with the words
-"all size values are of type `size_t'".  On 64-bit machines `size_t' is
-64 bits wide, so pointers to variables were no longer possible.
-
-   The Unix98 specification provides a solution by introducing a type
-`socklen_t'.  This type is used in all of the cases that POSIX changed
-to use `size_t'.  The only requirement of this type is that it be an
-unsigned type of at least 32 bits.  Therefore, implementations which
-require that references to 32-bit variables be passed can be as happy
-as implementations which use 64-bit values.
-
-
-File: libc.info,  Node: Communication Styles,  Next: Socket Addresses,  Prev: Socket Concepts,  Up: Sockets
-
-16.2 Communication Styles
-=========================
-
-The GNU C Library includes support for several different kinds of
-sockets, each with different characteristics.  This section describes
-the supported socket types.  The symbolic constants listed here are
-defined in `sys/socket.h'.  
-
- -- Macro: int SOCK_STREAM
-     The `SOCK_STREAM' style is like a pipe (*note Pipes and FIFOs::).
-     It operates over a connection with a particular remote socket and
-     transmits data reliably as a stream of bytes.
-
-     Use of this style is covered in detail in *note Connections::.
-
- -- Macro: int SOCK_DGRAM
-     The `SOCK_DGRAM' style is used for sending individually-addressed
-     packets unreliably.  It is the diametrical opposite of
-     `SOCK_STREAM'.
-
-     Each time you write data to a socket of this kind, that data
-     becomes one packet.  Since `SOCK_DGRAM' sockets do not have
-     connections, you must specify the recipient address with each
-     packet.
-
-     The only guarantee that the system makes about your requests to
-     transmit data is that it will try its best to deliver each packet
-     you send.  It may succeed with the sixth packet after failing with
-     the fourth and fifth packets; the seventh packet may arrive before
-     the sixth, and may arrive a second time after the sixth.
-
-     The typical use for `SOCK_DGRAM' is in situations where it is
-     acceptable to simply re-send a packet if no response is seen in a
-     reasonable amount of time.
-
-     *Note Datagrams::, for detailed information about how to use
-     datagram sockets.
-
- -- Macro: int SOCK_RAW
-     This style provides access to low-level network protocols and
-     interfaces.  Ordinary user programs usually have no need to use
-     this style.
-
-
-File: libc.info,  Node: Socket Addresses,  Next: Interface Naming,  Prev: Communication Styles,  Up: Sockets
-
-16.3 Socket Addresses
-=====================
-
-The name of a socket is normally called an "address".  The functions
-and symbols for dealing with socket addresses were named
-inconsistently, sometimes using the term "name" and sometimes using
-"address".  You can regard these terms as synonymous where sockets are
-concerned.
-
-   A socket newly created with the `socket' function has no address.
-Other processes can find it for communication only if you give it an
-address.  We call this "binding" the address to the socket, and the way
-to do it is with the `bind' function.
-
-   You need be concerned with the address of a socket if other processes
-are to find it and start communicating with it.  You can specify an
-address for other sockets, but this is usually pointless; the first time
-you send data from a socket, or use it to initiate a connection, the
-system assigns an address automatically if you have not specified one.
-
-   Occasionally a client needs to specify an address because the server
-discriminates based on address; for example, the rsh and rlogin
-protocols look at the client's socket address and only bypass password
-checking if it is less than `IPPORT_RESERVED' (*note Ports::).
-
-   The details of socket addresses vary depending on what namespace you
-are using.  *Note Local Namespace::, or *note Internet Namespace::, for
-specific information.
-
-   Regardless of the namespace, you use the same functions `bind' and
-`getsockname' to set and examine a socket's address.  These functions
-use a phony data type, `struct sockaddr *', to accept the address.  In
-practice, the address lives in a structure of some other data type
-appropriate to the address format you are using, but you cast its
-address to `struct sockaddr *' when you pass it to `bind'.
-
-* Menu:
-
-* Address Formats::		About `struct sockaddr'.
-* Setting Address::		Binding an address to a socket.
-* Reading Address::		Reading the address of a socket.
-
-
-File: libc.info,  Node: Address Formats,  Next: Setting Address,  Up: Socket Addresses
-
-16.3.1 Address Formats
-----------------------
-
-The functions `bind' and `getsockname' use the generic data type
-`struct sockaddr *' to represent a pointer to a socket address.  You
-can't use this data type effectively to interpret an address or
-construct one; for that, you must use the proper data type for the
-socket's namespace.
-
-   Thus, the usual practice is to construct an address of the proper
-namespace-specific type, then cast a pointer to `struct sockaddr *'
-when you call `bind' or `getsockname'.
-
-   The one piece of information that you can get from the `struct
-sockaddr' data type is the "address format designator".  This tells you
-which data type to use to understand the address fully.
-
-   The symbols in this section are defined in the header file
-`sys/socket.h'.
-
- -- Data Type: struct sockaddr
-     The `struct sockaddr' type itself has the following members:
-
-    `short int sa_family'
-          This is the code for the address format of this address.  It
-          identifies the format of the data which follows.
-
-    `char sa_data[14]'
-          This is the actual socket address data, which is
-          format-dependent.  Its length also depends on the format, and
-          may well be more than 14.  The length 14 of `sa_data' is
-          essentially arbitrary.
-
-   Each address format has a symbolic name which starts with `AF_'.
-Each of them corresponds to a `PF_' symbol which designates the
-corresponding namespace.  Here is a list of address format names:
-
-`AF_LOCAL'
-     This designates the address format that goes with the local
-     namespace.  (`PF_LOCAL' is the name of that namespace.)  *Note
-     Local Namespace Details::, for information about this address
-     format.
-
-`AF_UNIX'
-     This is a synonym for `AF_LOCAL'.  Although `AF_LOCAL' is mandated
-     by POSIX.1g, `AF_UNIX' is portable to more systems.  `AF_UNIX' was
-     the traditional name stemming from BSD, so even most POSIX systems
-     support it.  It is also the name of choice in the Unix98
-     specification. (The same is true for `PF_UNIX' vs. `PF_LOCAL').
-
-`AF_FILE'
-     This is another synonym for `AF_LOCAL', for compatibility.
-     (`PF_FILE' is likewise a synonym for `PF_LOCAL'.)
-
-`AF_INET'
-     This designates the address format that goes with the Internet
-     namespace.  (`PF_INET' is the name of that namespace.)  *Note
-     Internet Address Formats::.
-
-`AF_INET6'
-     This is similar to `AF_INET', but refers to the IPv6 protocol.
-     (`PF_INET6' is the name of the corresponding namespace.)
-
-`AF_UNSPEC'
-     This designates no particular address format.  It is used only in
-     rare cases, such as to clear out the default destination address
-     of a "connected" datagram socket.  *Note Sending Datagrams::.
-
-     The corresponding namespace designator symbol `PF_UNSPEC' exists
-     for completeness, but there is no reason to use it in a program.
-
-   `sys/socket.h' defines symbols starting with `AF_' for many
-different kinds of networks, most or all of which are not actually
-implemented.  We will document those that really work as we receive
-information about how to use them.
-
-
-File: libc.info,  Node: Setting Address,  Next: Reading Address,  Prev: Address Formats,  Up: Socket Addresses
-
-16.3.2 Setting the Address of a Socket
---------------------------------------
-
-Use the `bind' function to assign an address to a socket.  The
-prototype for `bind' is in the header file `sys/socket.h'.  For
-examples of use, see *note Local Socket Example::, or see *note Inet
-Example::.
-
- -- Function: int bind (int SOCKET, struct sockaddr *ADDR, socklen_t
-          LENGTH)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `bind' function assigns an address to the socket SOCKET.  The
-     ADDR and LENGTH arguments specify the address; the detailed format
-     of the address depends on the namespace.  The first part of the
-     address is always the format designator, which specifies a
-     namespace, and says that the address is in the format of that
-     namespace.
-
-     The return value is `0' on success and `-1' on failure.  The
-     following `errno' error conditions are defined for this function:
-
-    `EBADF'
-          The SOCKET argument is not a valid file descriptor.
-
-    `ENOTSOCK'
-          The descriptor SOCKET is not a socket.
-
-    `EADDRNOTAVAIL'
-          The specified address is not available on this machine.
-
-    `EADDRINUSE'
-          Some other socket is already using the specified address.
-
-    `EINVAL'
-          The socket SOCKET already has an address.
-
-    `EACCES'
-          You do not have permission to access the requested address.
-          (In the Internet domain, only the super-user is allowed to
-          specify a port number in the range 0 through
-          `IPPORT_RESERVED' minus one; see *note Ports::.)
-
-     Additional conditions may be possible depending on the particular
-     namespace of the socket.
-
-
-File: libc.info,  Node: Reading Address,  Prev: Setting Address,  Up: Socket Addresses
-
-16.3.3 Reading the Address of a Socket
---------------------------------------
-
-Use the function `getsockname' to examine the address of an Internet
-socket.  The prototype for this function is in the header file
-`sys/socket.h'.
-
- -- Function: int getsockname (int SOCKET, struct sockaddr *ADDR,
-          socklen_t *LENGTH-PTR)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe mem/hurd | *Note POSIX
-     Safety Concepts::.
-
-     The `getsockname' function returns information about the address
-     of the socket SOCKET in the locations specified by the ADDR and
-     LENGTH-PTR arguments.  Note that the LENGTH-PTR is a pointer; you
-     should initialize it to be the allocation size of ADDR, and on
-     return it contains the actual size of the address data.
-
-     The format of the address data depends on the socket namespace.
-     The length of the information is usually fixed for a given
-     namespace, so normally you can know exactly how much space is
-     needed and can provide that much.  The usual practice is to
-     allocate a place for the value using the proper data type for the
-     socket's namespace, then cast its address to `struct sockaddr *'
-     to pass it to `getsockname'.
-
-     The return value is `0' on success and `-1' on error.  The
-     following `errno' error conditions are defined for this function:
-
-    `EBADF'
-          The SOCKET argument is not a valid file descriptor.
-
-    `ENOTSOCK'
-          The descriptor SOCKET is not a socket.
-
-    `ENOBUFS'
-          There are not enough internal buffers available for the
-          operation.
-
-   You can't read the address of a socket in the file namespace.  This
-is consistent with the rest of the system; in general, there's no way to
-find a file's name from a descriptor for that file.
-
-
-File: libc.info,  Node: Interface Naming,  Next: Local Namespace,  Prev: Socket Addresses,  Up: Sockets
-
-16.4 Interface Naming
-=====================
-
-Each network interface has a name.  This usually consists of a few
-letters that relate to the type of interface, which may be followed by a
-number if there is more than one interface of that type.  Examples
-might be `lo' (the loopback interface) and `eth0' (the first Ethernet
-interface).
-
-   Although such names are convenient for humans, it would be clumsy to
-have to use them whenever a program needs to refer to an interface.  In
-such situations an interface is referred to by its "index", which is an
-arbitrarily-assigned small positive integer.
-
-   The following functions, constants and data types are declared in the
-header file `net/if.h'.
-
- -- Constant: size_t IFNAMSIZ
-     This constant defines the maximum buffer size needed to hold an
-     interface name, including its terminating zero byte.
-
- -- Function: unsigned int if_nametoindex (const char *IFNAME)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock fd |
-     *Note POSIX Safety Concepts::.
-
-     This function yields the interface index corresponding to a
-     particular name.  If no interface exists with the name given, it
-     returns 0.
-
- -- Function: char * if_indextoname (unsigned int IFINDEX, char *IFNAME)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock fd |
-     *Note POSIX Safety Concepts::.
-
-     This function maps an interface index to its corresponding name.
-     The returned name is placed in the buffer pointed to by `ifname',
-     which must be at least `IFNAMSIZ' bytes in length.  If the index
-     was invalid, the function's return value is a null pointer,
-     otherwise it is `ifname'.
-
- -- Data Type: struct if_nameindex
-     This data type is used to hold the information about a single
-     interface.  It has the following members:
-
-    `unsigned int if_index;'
-          This is the interface index.
-
-    `char *if_name'
-          This is the null-terminated index name.
-
-
- -- Function: struct if_nameindex * if_nameindex (void)
-     Preliminary: | MT-Safe | AS-Unsafe heap lock/hurd | AC-Unsafe
-     lock/hurd fd mem | *Note POSIX Safety Concepts::.
-
-     This function returns an array of `if_nameindex' structures, one
-     for every interface that is present.  The end of the list is
-     indicated by a structure with an interface of 0 and a null name
-     pointer.  If an error occurs, this function returns a null pointer.
-
-     The returned structure must be freed with `if_freenameindex' after
-     use.
-
- -- Function: void if_freenameindex (struct if_nameindex *PTR)
+ -- Function: FILE * open_memstream (char **PTR, size_t *SIZELOC)
      Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
      POSIX Safety Concepts::.
 
-     This function frees the structure returned by an earlier call to
-     `if_nameindex'.
+     This function opens a stream for writing to a buffer.  The buffer
+     is allocated dynamically and grown as necessary, using 'malloc'.
+     After you've closed the stream, this buffer is your responsibility
+     to clean up using 'free' or 'realloc'.  *Note Unconstrained
+     Allocation::.
 
-
-File: libc.info,  Node: Local Namespace,  Next: Internet Namespace,  Prev: Interface Naming,  Up: Sockets
+     When the stream is closed with 'fclose' or flushed with 'fflush',
+     the locations PTR and SIZELOC are updated to contain the pointer to
+     the buffer and its size.  The values thus stored remain valid only
+     as long as no further output on the stream takes place.  If you do
+     more output, you must flush the stream again to store new values
+     before you use them again.
 
-16.5 The Local Namespace
-========================
+     A null character is written at the end of the buffer.  This null
+     character is _not_ included in the size value stored at SIZELOC.
 
-This section describes the details of the local namespace, whose
-symbolic name (required when you create a socket) is `PF_LOCAL'.  The
-local namespace is also known as "Unix domain sockets".  Another name
-is file namespace since socket addresses are normally implemented as
-file names.
+     You can move the stream's file position with 'fseek' or 'fseeko'
+     (*note File Positioning::).  Moving the file position past the end
+     of the data already written fills the intervening space with
+     zeroes.
 
-* Menu:
-
-* Concepts: Local Namespace Concepts. What you need to understand.
-* Details: Local Namespace Details.   Address format, symbolic names, etc.
-* Example: Local Socket Example.      Example of creating a socket.
-
-
-File: libc.info,  Node: Local Namespace Concepts,  Next: Local Namespace Details,  Up: Local Namespace
-
-16.5.1 Local Namespace Concepts
--------------------------------
-
-In the local namespace socket addresses are file names.  You can specify
-any file name you want as the address of the socket, but you must have
-write permission on the directory containing it.  It's common to put
-these files in the `/tmp' directory.
-
-   One peculiarity of the local namespace is that the name is only used
-when opening the connection; once open the address is not meaningful and
-may not exist.
-
-   Another peculiarity is that you cannot connect to such a socket from
-another machine-not even if the other machine shares the file system
-which contains the name of the socket.  You can see the socket in a
-directory listing, but connecting to it never succeeds.  Some programs
-take advantage of this, such as by asking the client to send its own
-process ID, and using the process IDs to distinguish between clients.
-However, we recommend you not use this method in protocols you design,
-as we might someday permit connections from other machines that mount
-the same file systems.  Instead, send each new client an identifying
-number if you want it to have one.
-
-   After you close a socket in the local namespace, you should delete
-the file name from the file system.  Use `unlink' or `remove' to do
-this; see *note Deleting Files::.
-
-   The local namespace supports just one protocol for any communication
-style; it is protocol number `0'.
-
-
-File: libc.info,  Node: Local Namespace Details,  Next: Local Socket Example,  Prev: Local Namespace Concepts,  Up: Local Namespace
-
-16.5.2 Details of Local Namespace
----------------------------------
-
-To create a socket in the local namespace, use the constant `PF_LOCAL'
-as the NAMESPACE argument to `socket' or `socketpair'.  This constant
-is defined in `sys/socket.h'.
-
- -- Macro: int PF_LOCAL
-     This designates the local namespace, in which socket addresses are
-     local names, and its associated family of protocols.  `PF_Local'
-     is the macro used by Posix.1g.
-
- -- Macro: int PF_UNIX
-     This is a synonym for `PF_LOCAL', for compatibility's sake.
-
- -- Macro: int PF_FILE
-     This is a synonym for `PF_LOCAL', for compatibility's sake.
-
-   The structure for specifying socket names in the local namespace is
-defined in the header file `sys/un.h': 
-
- -- Data Type: struct sockaddr_un
-     This structure is used to specify local namespace socket
-     addresses.  It has the following members:
-
-    `short int sun_family'
-          This identifies the address family or format of the socket
-          address.  You should store the value `AF_LOCAL' to designate
-          the local namespace.  *Note Socket Addresses::.
-
-    `char sun_path[108]'
-          This is the file name to use.
-
-          *Incomplete:*  Why is 108 a magic number?  RMS suggests making
-          this a zero-length array and tweaking the following example
-          to use `alloca' to allocate an appropriate amount of storage
-          based on the length of the filename.
-
-   You should compute the LENGTH parameter for a socket address in the
-local namespace as the sum of the size of the `sun_family' component
-and the string length (_not_ the allocation size!) of the file name
-string.  This can be done using the macro `SUN_LEN':
-
- -- Macro: int SUN_LEN (_struct sockaddr_un *_ PTR)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The macro computes the length of socket address in the local
-     namespace.
-
-
-File: libc.info,  Node: Local Socket Example,  Prev: Local Namespace Details,  Up: Local Namespace
-
-16.5.3 Example of Local-Namespace Sockets
------------------------------------------
-
-Here is an example showing how to create and name a socket in the local
-namespace.
+   Here is an example of using 'open_memstream':
 
 
-     #include <stddef.h>
      #include <stdio.h>
-     #include <errno.h>
-     #include <stdlib.h>
-     #include <string.h>
-     #include <sys/socket.h>
-     #include <sys/un.h>
 
      int
-     make_named_socket (const char *filename)
+     main (void)
      {
-       struct sockaddr_un name;
-       int sock;
+       char *bp;
        size_t size;
+       FILE *stream;
 
-       /* Create the socket. */
-       sock = socket (PF_LOCAL, SOCK_DGRAM, 0);
-       if (sock < 0)
-         {
-           perror ("socket");
-           exit (EXIT_FAILURE);
-         }
+       stream = open_memstream (&bp, &size);
+       fprintf (stream, "hello");
+       fflush (stream);
+       printf ("buf = `%s', size = %d\n", bp, size);
+       fprintf (stream, ", world");
+       fclose (stream);
+       printf ("buf = `%s', size = %d\n", bp, size);
 
-       /* Bind a name to the socket. */
-       name.sun_family = AF_LOCAL;
-       strncpy (name.sun_path, filename, sizeof (name.sun_path));
-       name.sun_path[sizeof (name.sun_path) - 1] = '\0';
-
-       /* The size of the address is
-          the offset of the start of the filename,
-          plus its length (not including the terminating null byte).
-          Alternatively you can just do:
-          size = SUN_LEN (&name);
-      */
-       size = (offsetof (struct sockaddr_un, sun_path)
-               + strlen (name.sun_path));
-
-       if (bind (sock, (struct sockaddr *) &name, size) < 0)
-         {
-           perror ("bind");
-           exit (EXIT_FAILURE);
-         }
-
-       return sock;
+       return 0;
      }
 
+   This program produces the following output:
+
+     buf = `hello', size = 5
+     buf = `hello, world', size = 12
+
 
-File: libc.info,  Node: Internet Namespace,  Next: Misc Namespaces,  Prev: Local Namespace,  Up: Sockets
+File: libc.info,  Node: Custom Streams,  Prev: String Streams,  Up: Other Kinds of Streams
 
-16.6 The Internet Namespace
-===========================
+12.21.2 Programming Your Own Custom Streams
+-------------------------------------------
 
-This section describes the details of the protocols and socket naming
-conventions used in the Internet namespace.
-
-   Originally the Internet namespace used only IP version 4 (IPv4).
-With the growing number of hosts on the Internet, a new protocol with a
-larger address space was necessary: IP version 6 (IPv6).  IPv6
-introduces 128-bit addresses (IPv4 has 32-bit addresses) and other
-features, and will eventually replace IPv4.
-
-   To create a socket in the IPv4 Internet namespace, use the symbolic
-name `PF_INET' of this namespace as the NAMESPACE argument to `socket'
-or `socketpair'.  For IPv6 addresses you need the macro `PF_INET6'.
-These macros are defined in `sys/socket.h'.  
-
- -- Macro: int PF_INET
-     This designates the IPv4 Internet namespace and associated family
-     of protocols.
-
- -- Macro: int PF_INET6
-     This designates the IPv6 Internet namespace and associated family
-     of protocols.
-
-   A socket address for the Internet namespace includes the following
-components:
-
-   * The address of the machine you want to connect to.  Internet
-     addresses can be specified in several ways; these are discussed in
-     *note Internet Address Formats::, *note Host Addresses:: and *note
-     Host Names::.
-
-   * A port number for that machine.  *Note Ports::.
-
-   You must ensure that the address and port number are represented in a
-canonical format called "network byte order".  *Note Byte Order::, for
-information about this.
+This section describes how you can make a stream that gets input from an
+arbitrary data source or writes output to an arbitrary data sink
+programmed by you.  We call these "custom streams".  The functions and
+types described here are all GNU extensions.
 
 * Menu:
 
-* Internet Address Formats::    How socket addresses are specified in the
-                                 Internet namespace.
-* Host Addresses::	        All about host addresses of Internet host.
-* Ports::			Internet port numbers.
-* Services Database::           Ports may have symbolic names.
-* Byte Order::		        Different hosts may use different byte
-                                 ordering conventions; you need to
-                                 canonicalize host address and port number.
-* Protocols Database::		Referring to protocols by name.
-* Inet Example::	        Putting it all together.
+* Streams and Cookies::         The "cookie" records where to fetch or
+				 store data that is read or written.
+* Hook Functions::              How you should define the four "hook
+				 functions" that a custom stream needs.
 
 
-File: libc.info,  Node: Internet Address Formats,  Next: Host Addresses,  Up: Internet Namespace
+File: libc.info,  Node: Streams and Cookies,  Next: Hook Functions,  Up: Custom Streams
 
-16.6.1 Internet Socket Address Formats
---------------------------------------
+12.21.2.1 Custom Streams and Cookies
+....................................
 
-In the Internet namespace, for both IPv4 (`AF_INET') and IPv6
-(`AF_INET6'), a socket address consists of a host address and a port on
-that host.  In addition, the protocol you choose serves effectively as
-a part of the address because local port numbers are meaningful only
-within a particular protocol.
+Inside every custom stream is a special object called the "cookie".
+This is an object supplied by you which records where to fetch or store
+the data read or written.  It is up to you to define a data type to use
+for the cookie.  The stream functions in the library never refer
+directly to its contents, and they don't even know what the type is;
+they record its address with type 'void *'.
 
-   The data types for representing socket addresses in the Internet
-namespace are defined in the header file `netinet/in.h'.  
+   To implement a custom stream, you must specify _how_ to fetch or
+store the data in the specified place.  You do this by defining "hook
+functions" to read, write, change "file position", and close the stream.
+All four of these functions will be passed the stream's cookie so they
+can tell where to fetch or store the data.  The library functions don't
+know what's inside the cookie, but your functions will know.
 
- -- Data Type: struct sockaddr_in
-     This is the data type used to represent socket addresses in the
-     Internet namespace.  It has the following members:
+   When you create a custom stream, you must specify the cookie pointer,
+and also the four hook functions stored in a structure of type
+'cookie_io_functions_t'.
 
-    `sa_family_t sin_family'
-          This identifies the address family or format of the socket
-          address.  You should store the value `AF_INET' in this member.
-          *Note Socket Addresses::.
+   These facilities are declared in 'stdio.h'.
 
-    `struct in_addr sin_addr'
-          This is the Internet address of the host machine.  *Note Host
-          Addresses::, and *note Host Names::, for how to get a value
-          to store here.
+ -- Data Type: cookie_io_functions_t
+     This is a structure type that holds the functions that define the
+     communications protocol between the stream and its cookie.  It has
+     the following members:
 
-    `unsigned short int sin_port'
-          This is the port number.  *Note Ports::.
+     'cookie_read_function_t *read'
+          This is the function that reads data from the cookie.  If the
+          value is a null pointer instead of a function, then read
+          operations on this stream always return 'EOF'.
 
-   When you call `bind' or `getsockname', you should specify `sizeof
-(struct sockaddr_in)' as the LENGTH parameter if you are using an IPv4
-Internet namespace socket address.
+     'cookie_write_function_t *write'
+          This is the function that writes data to the cookie.  If the
+          value is a null pointer instead of a function, then data
+          written to the stream is discarded.
 
- -- Data Type: struct sockaddr_in6
-     This is the data type used to represent socket addresses in the
-     IPv6 namespace.  It has the following members:
+     'cookie_seek_function_t *seek'
+          This is the function that performs the equivalent of file
+          positioning on the cookie.  If the value is a null pointer
+          instead of a function, calls to 'fseek' or 'fseeko' on this
+          stream can only seek to locations within the buffer; any
+          attempt to seek outside the buffer will return an 'ESPIPE'
+          error.
 
-    `sa_family_t sin6_family'
-          This identifies the address family or format of the socket
-          address.  You should store the value of `AF_INET6' in this
-          member.  *Note Socket Addresses::.
+     'cookie_close_function_t *close'
+          This function performs any appropriate cleanup on the cookie
+          when closing the stream.  If the value is a null pointer
+          instead of a function, nothing special is done to close the
+          cookie when the stream is closed.
 
-    `struct in6_addr sin6_addr'
-          This is the IPv6 address of the host machine.  *Note Host
-          Addresses::, and *note Host Names::, for how to get a value
-          to store here.
-
-    `uint32_t sin6_flowinfo'
-          This is a currently unimplemented field.
-
-    `uint16_t sin6_port'
-          This is the port number.  *Note Ports::.
-
-
-
-File: libc.info,  Node: Host Addresses,  Next: Ports,  Prev: Internet Address Formats,  Up: Internet Namespace
-
-16.6.2 Host Addresses
----------------------
-
-Each computer on the Internet has one or more "Internet addresses",
-numbers which identify that computer among all those on the Internet.
-Users typically write IPv4 numeric host addresses as sequences of four
-numbers, separated by periods, as in `128.52.46.32', and IPv6 numeric
-host addresses as sequences of up to eight numbers separated by colons,
-as in `5f03:1200:836f:c100::1'.
-
-   Each computer also has one or more "host names", which are strings
-of words separated by periods, as in `www.gnu.org'.
-
-   Programs that let the user specify a host typically accept both
-numeric addresses and host names.  To open a connection a program needs
-a numeric address, and so must convert a host name to the numeric
-address it stands for.
-
-* Menu:
-
-* Abstract Host Addresses::	What a host number consists of.
-* Data type: Host Address Data Type.	Data type for a host number.
-* Functions: Host Address Functions.	Functions to operate on them.
-* Names: Host Names.		Translating host names to host numbers.
-
-
-File: libc.info,  Node: Abstract Host Addresses,  Next: Host Address Data Type,  Up: Host Addresses
-
-16.6.2.1 Internet Host Addresses
-................................
-
-Each computer on the Internet has one or more Internet addresses,
-numbers which identify that computer among all those on the Internet.
-
-An IPv4 Internet host address is a number containing four bytes of data.
-Historically these are divided into two parts, a "network number" and a
-"local network address number" within that network.  In the mid-1990s
-classless addresses were introduced which changed this behavior.  Since
-some functions implicitly expect the old definitions, we first describe
-the class-based network and will then describe classless addresses.
-IPv6 uses only classless addresses and therefore the following
-paragraphs don't apply.
-
-   The class-based IPv4 network number consists of the first one, two or
-three bytes; the rest of the bytes are the local address.
-
-   IPv4 network numbers are registered with the Network Information
-Center (NIC), and are divided into three classes--A, B and C.  The local
-network address numbers of individual machines are registered with the
-administrator of the particular network.
-
-   Class A networks have single-byte numbers in the range 0 to 127.
-There are only a small number of Class A networks, but they can each
-support a very large number of hosts.  Medium-sized Class B networks
-have two-byte network numbers, with the first byte in the range 128 to
-191.  Class C networks are the smallest; they have three-byte network
-numbers, with the first byte in the range 192-255.  Thus, the first 1,
-2, or 3 bytes of an Internet address specify a network.  The remaining
-bytes of the Internet address specify the address within that network.
-
-   The Class A network 0 is reserved for broadcast to all networks.  In
-addition, the host number 0 within each network is reserved for
-broadcast to all hosts in that network.  These uses are obsolete now
-but for compatibility reasons you shouldn't use network 0 and host
-number 0.
-
-   The Class A network 127 is reserved for loopback; you can always use
-the Internet address `127.0.0.1' to refer to the host machine.
-
-   Since a single machine can be a member of multiple networks, it can
-have multiple Internet host addresses.  However, there is never
-supposed to be more than one machine with the same host address.
-
-   There are four forms of the "standard numbers-and-dots notation" for
-Internet addresses:
-
-`A.B.C.D'
-     This specifies all four bytes of the address individually and is
-     the commonly used representation.
-
-`A.B.C'
-     The last part of the address, C, is interpreted as a 2-byte
-     quantity.  This is useful for specifying host addresses in a Class
-     B network with network address number `A.B'.
-
-`A.B'
-     The last part of the address, B, is interpreted as a 3-byte
-     quantity.  This is useful for specifying host addresses in a Class
-     A network with network address number A.
-
-`A'
-     If only one part is given, this corresponds directly to the host
-     address number.
-
-   Within each part of the address, the usual C conventions for
-specifying the radix apply.  In other words, a leading `0x' or `0X'
-implies hexadecimal radix; a leading `0' implies octal; and otherwise
-decimal radix is assumed.
-
-Classless Addresses
-...................
-
-IPv4 addresses (and IPv6 addresses also) are now considered classless;
-the distinction between classes A, B and C can be ignored.  Instead an
-IPv4 host address consists of a 32-bit address and a 32-bit mask.  The
-mask contains set bits for the network part and cleared bits for the
-host part.  The network part is contiguous from the left, with the
-remaining bits representing the host.  As a consequence, the netmask can
-simply be specified as the number of set bits.  Classes A, B and C are
-just special cases of this general rule.  For example, class A addresses
-have a netmask of `255.0.0.0' or a prefix length of 8.
-
-   Classless IPv4 network addresses are written in numbers-and-dots
-notation with the prefix length appended and a slash as separator.  For
-example the class A network 10 is written as `10.0.0.0/8'.
-
-IPv6 Addresses
-..............
-
-IPv6 addresses contain 128 bits (IPv4 has 32 bits) of data.  A host
-address is usually written as eight 16-bit hexadecimal numbers that are
-separated by colons.  Two colons are used to abbreviate strings of
-consecutive zeros.  For example, the IPv6 loopback address
-`0:0:0:0:0:0:0:1' can just be written as `::1'.
-
-
-File: libc.info,  Node: Host Address Data Type,  Next: Host Address Functions,  Prev: Abstract Host Addresses,  Up: Host Addresses
-
-16.6.2.2 Host Address Data Type
-...............................
-
-IPv4 Internet host addresses are represented in some contexts as
-integers (type `uint32_t').  In other contexts, the integer is packaged
-inside a structure of type `struct in_addr'.  It would be better if the
-usage were made consistent, but it is not hard to extract the integer
-from the structure or put the integer into a structure.
-
-   You will find older code that uses `unsigned long int' for IPv4
-Internet host addresses instead of `uint32_t' or `struct in_addr'.
-Historically `unsigned long int' was a 32-bit number but with 64-bit
-machines this has changed.  Using `unsigned long int' might break the
-code if it is used on machines where this type doesn't have 32 bits.
-`uint32_t' is specified by Unix98 and guaranteed to have 32 bits.
-
-   IPv6 Internet host addresses have 128 bits and are packaged inside a
-structure of type `struct in6_addr'.
-
-   The following basic definitions for Internet addresses are declared
-in the header file `netinet/in.h': 
-
- -- Data Type: struct in_addr
-     This data type is used in certain contexts to contain an IPv4
-     Internet host address.  It has just one field, named `s_addr',
-     which records the host address number as an `uint32_t'.
-
- -- Macro: uint32_t INADDR_LOOPBACK
-     You can use this constant to stand for "the address of this
-     machine," instead of finding its actual address.  It is the IPv4
-     Internet address `127.0.0.1', which is usually called `localhost'.
-     This special constant saves you the trouble of looking up the
-     address of your own machine.  Also, the system usually implements
-     `INADDR_LOOPBACK' specially, avoiding any network traffic for the
-     case of one machine talking to itself.
-
- -- Macro: uint32_t INADDR_ANY
-     You can use this constant to stand for "any incoming address" when
-     binding to an address.  *Note Setting Address::.  This is the usual
-     address to give in the `sin_addr' member of `struct sockaddr_in'
-     when you want to accept Internet connections.
-
- -- Macro: uint32_t INADDR_BROADCAST
-     This constant is the address you use to send a broadcast message.
-
- -- Macro: uint32_t INADDR_NONE
-     This constant is returned by some functions to indicate an error.
-
- -- Data Type: struct in6_addr
-     This data type is used to store an IPv6 address.  It stores 128
-     bits of data, which can be accessed (via a union) in a variety of
-     ways.
-
- -- Constant: struct in6_addr in6addr_loopback
-     This constant is the IPv6 address `::1', the loopback address.  See
-     above for a description of what this means.  The macro
-     `IN6ADDR_LOOPBACK_INIT' is provided to allow you to initialize your
-     own variables to this value.
-
- -- Constant: struct in6_addr in6addr_any
-     This constant is the IPv6 address `::', the unspecified address.
-     See above for a description of what this means.  The macro
-     `IN6ADDR_ANY_INIT' is provided to allow you to initialize your own
-     variables to this value.
-
-
-File: libc.info,  Node: Host Address Functions,  Next: Host Names,  Prev: Host Address Data Type,  Up: Host Addresses
-
-16.6.2.3 Host Address Functions
-...............................
-
-These additional functions for manipulating Internet addresses are
-declared in the header file `arpa/inet.h'.  They represent Internet
-addresses in network byte order, and network numbers and
-local-address-within-network numbers in host byte order.  *Note Byte
-Order::, for an explanation of network and host byte order.
-
- -- Function: int inet_aton (const char *NAME, struct in_addr *ADDR)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     This function converts the IPv4 Internet host address NAME from
-     the standard numbers-and-dots notation into binary data and stores
-     it in the `struct in_addr' that ADDR points to.  `inet_aton'
-     returns nonzero if the address is valid, zero if not.
-
- -- Function: uint32_t inet_addr (const char *NAME)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     This function converts the IPv4 Internet host address NAME from the
-     standard numbers-and-dots notation into binary data.  If the input
-     is not valid, `inet_addr' returns `INADDR_NONE'.  This is an
-     obsolete interface to `inet_aton', described immediately above. It
-     is obsolete because `INADDR_NONE' is a valid address
-     (255.255.255.255), and `inet_aton' provides a cleaner way to
-     indicate error return.
-
- -- Function: uint32_t inet_network (const char *NAME)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     This function extracts the network number from the address NAME,
-     given in the standard numbers-and-dots notation. The returned
-     address is in host order. If the input is not valid,
-     `inet_network' returns `-1'.
-
-     The function works only with traditional IPv4 class A, B and C
-     network types.  It doesn't work with classless addresses and
-     shouldn't be used anymore.
-
- -- Function: char * inet_ntoa (struct in_addr ADDR)
-     Preliminary: | MT-Safe locale | AS-Unsafe race | AC-Safe | *Note
-     POSIX Safety Concepts::.
-
-     This function converts the IPv4 Internet host address ADDR to a
-     string in the standard numbers-and-dots notation.  The return
-     value is a pointer into a statically-allocated buffer.  Subsequent
-     calls will overwrite the same buffer, so you should copy the
-     string if you need to save it.
-
-     In multi-threaded programs each thread has an own
-     statically-allocated buffer.  But still subsequent calls of
-     `inet_ntoa' in the same thread will overwrite the result of the
-     last call.
-
-     Instead of `inet_ntoa' the newer function `inet_ntop' which is
-     described below should be used since it handles both IPv4 and IPv6
-     addresses.
-
- -- Function: struct in_addr inet_makeaddr (uint32_t NET, uint32_t
-          LOCAL)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function makes an IPv4 Internet host address by combining the
-     network number NET with the local-address-within-network number
-     LOCAL.
-
- -- Function: uint32_t inet_lnaof (struct in_addr ADDR)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function returns the local-address-within-network part of the
-     Internet host address ADDR.
-
-     The function works only with traditional IPv4 class A, B and C
-     network types.  It doesn't work with classless addresses and
-     shouldn't be used anymore.
-
- -- Function: uint32_t inet_netof (struct in_addr ADDR)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function returns the network number part of the Internet host
-     address ADDR.
-
-     The function works only with traditional IPv4 class A, B and C
-     network types.  It doesn't work with classless addresses and
-     shouldn't be used anymore.
-
- -- Function: int inet_pton (int AF, const char *CP, void *BUF)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     This function converts an Internet address (either IPv4 or IPv6)
-     from presentation (textual) to network (binary) format.  AF should
-     be either `AF_INET' or `AF_INET6', as appropriate for the type of
-     address being converted.  CP is a pointer to the input string, and
-     BUF is a pointer to a buffer for the result.  It is the caller's
-     responsibility to make sure the buffer is large enough.
-
- -- Function: const char * inet_ntop (int AF, const void *CP, char
-          *BUF, socklen_t LEN)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     This function converts an Internet address (either IPv4 or IPv6)
-     from network (binary) to presentation (textual) form.  AF should be
-     either `AF_INET' or `AF_INET6', as appropriate.  CP is a pointer
-     to the address to be converted.  BUF should be a pointer to a
-     buffer to hold the result, and LEN is the length of this buffer.
-     The return value from the function will be this buffer address.
-
-
-File: libc.info,  Node: Host Names,  Prev: Host Address Functions,  Up: Host Addresses
-
-16.6.2.4 Host Names
-...................
-
-Besides the standard numbers-and-dots notation for Internet addresses,
-you can also refer to a host by a symbolic name.  The advantage of a
-symbolic name is that it is usually easier to remember.  For example,
-the machine with Internet address `158.121.106.19' is also known as
-`alpha.gnu.org'; and other machines in the `gnu.org' domain can refer
-to it simply as `alpha'.
-
-   Internally, the system uses a database to keep track of the mapping
-between host names and host numbers.  This database is usually either
-the file `/etc/hosts' or an equivalent provided by a name server.  The
-functions and other symbols for accessing this database are declared in
-`netdb.h'.  They are BSD features, defined unconditionally if you
-include `netdb.h'.
-
- -- Data Type: struct hostent
-     This data type is used to represent an entry in the hosts
-     database.  It has the following members:
-
-    `char *h_name'
-          This is the "official" name of the host.
-
-    `char **h_aliases'
-          These are alternative names for the host, represented as a
-          null-terminated vector of strings.
-
-    `int h_addrtype'
-          This is the host address type; in practice, its value is
-          always either `AF_INET' or `AF_INET6', with the latter being
-          used for IPv6 hosts.  In principle other kinds of addresses
-          could be represented in the database as well as Internet
-          addresses; if this were done, you might find a value in this
-          field other than `AF_INET' or `AF_INET6'.  *Note Socket
-          Addresses::.
-
-    `int h_length'
-          This is the length, in bytes, of each address.
-
-    `char **h_addr_list'
-          This is the vector of addresses for the host.  (Recall that
-          the host might be connected to multiple networks and have
-          different addresses on each one.)  The vector is terminated
-          by a null pointer.
-
-    `char *h_addr'
-          This is a synonym for `h_addr_list[0]'; in other words, it is
-          the first host address.
-
-   As far as the host database is concerned, each address is just a
-block of memory `h_length' bytes long.  But in other contexts there is
-an implicit assumption that you can convert IPv4 addresses to a `struct
-in_addr' or an `uint32_t'.  Host addresses in a `struct hostent'
-structure are always given in network byte order; see *note Byte
-Order::.
-
-   You can use `gethostbyname', `gethostbyname2' or `gethostbyaddr' to
-search the hosts database for information about a particular host.  The
-information is returned in a statically-allocated structure; you must
-copy the information if you need to save it across calls.  You can also
-use `getaddrinfo' and `getnameinfo' to obtain this information.
-
- -- Function: struct hostent * gethostbyname (const char *NAME)
-     Preliminary: | MT-Unsafe race:hostbyname env locale | AS-Unsafe
-     dlopen plugin corrupt heap lock | AC-Unsafe lock corrupt mem fd |
+ -- Function: FILE * fopencookie (void *COOKIE, const char *OPENTYPE,
+          cookie_io_functions_t IO-FUNCTIONS)
+     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe mem lock |
      *Note POSIX Safety Concepts::.
 
-     The `gethostbyname' function returns information about the host
-     named NAME.  If the lookup fails, it returns a null pointer.
+     This function actually creates the stream for communicating with
+     the COOKIE using the functions in the IO-FUNCTIONS argument.  The
+     OPENTYPE argument is interpreted as for 'fopen'; see *note Opening
+     Streams::.  (But note that the "truncate on open" option is
+     ignored.)  The new stream is fully buffered.
 
- -- Function: struct hostent * gethostbyname2 (const char *NAME, int AF)
-     Preliminary: | MT-Unsafe race:hostbyname2 env locale | AS-Unsafe
-     dlopen plugin corrupt heap lock | AC-Unsafe lock corrupt mem fd |
-     *Note POSIX Safety Concepts::.
-
-     The `gethostbyname2' function is like `gethostbyname', but allows
-     the caller to specify the desired address family (e.g.  `AF_INET'
-     or `AF_INET6') of the result.
-
- -- Function: struct hostent * gethostbyaddr (const void *ADDR,
-          socklen_t LENGTH, int FORMAT)
-     Preliminary: | MT-Unsafe race:hostbyaddr env locale | AS-Unsafe
-     dlopen plugin corrupt heap lock | AC-Unsafe lock corrupt mem fd |
-     *Note POSIX Safety Concepts::.
-
-     The `gethostbyaddr' function returns information about the host
-     with Internet address ADDR.  The parameter ADDR is not really a
-     pointer to char - it can be a pointer to an IPv4 or an IPv6
-     address. The LENGTH argument is the size (in bytes) of the address
-     at ADDR.  FORMAT specifies the address format; for an IPv4
-     Internet address, specify a value of `AF_INET'; for an IPv6
-     Internet address, use `AF_INET6'.
-
-     If the lookup fails, `gethostbyaddr' returns a null pointer.
-
-   If the name lookup by `gethostbyname' or `gethostbyaddr' fails, you
-can find out the reason by looking at the value of the variable
-`h_errno'.  (It would be cleaner design for these functions to set
-`errno', but use of `h_errno' is compatible with other systems.)
-
-   Here are the error codes that you may find in `h_errno':
-
-`HOST_NOT_FOUND'
-     No such host is known in the database.
-
-`TRY_AGAIN'
-     This condition happens when the name server could not be
-     contacted.  If you try again later, you may succeed then.
-
-`NO_RECOVERY'
-     A non-recoverable error occurred.
-
-`NO_ADDRESS'
-     The host database contains an entry for the name, but it doesn't
-     have an associated Internet address.
-
-   The lookup functions above all have one in common: they are not
-reentrant and therefore unusable in multi-threaded applications.
-Therefore provides the GNU C Library a new set of functions which can be
-used in this context.
-
- -- Function: int gethostbyname_r (const char *restrict NAME, struct
-          hostent *restrict RESULT_BUF, char *restrict BUF, size_t
-          BUFLEN, struct hostent **restrict RESULT, int *restrict
-          H_ERRNOP)
-     Preliminary: | MT-Safe env locale | AS-Unsafe dlopen plugin
-     corrupt heap lock | AC-Unsafe lock corrupt mem fd | *Note POSIX
-     Safety Concepts::.
-
-     The `gethostbyname_r' function returns information about the host
-     named NAME.  The caller must pass a pointer to an object of type
-     `struct hostent' in the RESULT_BUF parameter.  In addition the
-     function may need extra buffer space and the caller must pass an
-     pointer and the size of the buffer in the BUF and BUFLEN
-     parameters.
-
-     A pointer to the buffer, in which the result is stored, is
-     available in `*RESULT' after the function call successfully
-     returned. The buffer passed as the BUF parameter can be freed only
-     once the caller has finished with the result hostent struct, or
-     has copied it including all the other memory that it points to. If
-     an error occurs or if no entry is found, the pointer `*RESULT' is
-     a null pointer. Success is signalled by a zero return value.  If
-     the function failed the return value is an error number.  In
-     addition to the errors defined for `gethostbyname' it can also be
-     `ERANGE'. In this case the call should be repeated with a larger
-     buffer. Additional error information is not stored in the global
-     variable `h_errno' but instead in the object pointed to by
-     H_ERRNOP.
-
-     Here's a small example:
-          struct hostent *
-          gethostname (char *host)
-          {
-            struct hostent *hostbuf, *hp;
-            size_t hstbuflen;
-            char *tmphstbuf;
-            int res;
-            int herr;
-
-            hostbuf = malloc (sizeof (struct hostent));
-            hstbuflen = 1024;
-            tmphstbuf = malloc (hstbuflen);
-
-            while ((res = gethostbyname_r (host, hostbuf, tmphstbuf, hstbuflen,
-                                           &hp, &herr)) == ERANGE)
-              {
-                /* Enlarge the buffer.  */
-                hstbuflen *= 2;
-                tmphstbuf = realloc (tmphstbuf, hstbuflen);
-              }
-
-            free (tmphstbuf);
-            /*  Check for errors.  */
-            if (res || hp == NULL)
-              return NULL;
-            return hp;
-          }
-
- -- Function: int gethostbyname2_r (const char *NAME, int AF, struct
-          hostent *restrict RESULT_BUF, char *restrict BUF, size_t
-          BUFLEN, struct hostent **restrict RESULT, int *restrict
-          H_ERRNOP)
-     Preliminary: | MT-Safe env locale | AS-Unsafe dlopen plugin
-     corrupt heap lock | AC-Unsafe lock corrupt mem fd | *Note POSIX
-     Safety Concepts::.
-
-     The `gethostbyname2_r' function is like `gethostbyname_r', but
-     allows the caller to specify the desired address family (e.g.
-     `AF_INET' or `AF_INET6') for the result.
-
- -- Function: int gethostbyaddr_r (const void *ADDR, socklen_t LENGTH,
-          int FORMAT, struct hostent *restrict RESULT_BUF, char
-          *restrict BUF, size_t BUFLEN, struct hostent **restrict
-          RESULT, int *restrict H_ERRNOP)
-     Preliminary: | MT-Safe env locale | AS-Unsafe dlopen plugin
-     corrupt heap lock | AC-Unsafe lock corrupt mem fd | *Note POSIX
-     Safety Concepts::.
-
-     The `gethostbyaddr_r' function returns information about the host
-     with Internet address ADDR.  The parameter ADDR is not really a
-     pointer to char - it can be a pointer to an IPv4 or an IPv6
-     address. The LENGTH argument is the size (in bytes) of the address
-     at ADDR.  FORMAT specifies the address format; for an IPv4
-     Internet address, specify a value of `AF_INET'; for an IPv6
-     Internet address, use `AF_INET6'.
-
-     Similar to the `gethostbyname_r' function, the caller must provide
-     buffers for the result and memory used internally.  In case of
-     success the function returns zero.  Otherwise the value is an
-     error number where `ERANGE' has the special meaning that the
-     caller-provided buffer is too small.
-
-   You can also scan the entire hosts database one entry at a time using
-`sethostent', `gethostent' and `endhostent'.  Be careful when using
-these functions because they are not reentrant.
-
- -- Function: void sethostent (int STAYOPEN)
-     Preliminary: | MT-Unsafe race:hostent env locale | AS-Unsafe
-     dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note
-     POSIX Safety Concepts::.
-
-     This function opens the hosts database to begin scanning it.  You
-     can then call `gethostent' to read the entries.
-
-     If the STAYOPEN argument is nonzero, this sets a flag so that
-     subsequent calls to `gethostbyname' or `gethostbyaddr' will not
-     close the database (as they usually would).  This makes for more
-     efficiency if you call those functions several times, by avoiding
-     reopening the database for each call.
-
- -- Function: struct hostent * gethostent (void)
-     Preliminary: | MT-Unsafe race:hostent race:hostentbuf env locale |
-     AS-Unsafe dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem
-     | *Note POSIX Safety Concepts::.
-
-     This function returns the next entry in the hosts database.  It
-     returns a null pointer if there are no more entries.
-
- -- Function: void endhostent (void)
-     Preliminary: | MT-Unsafe race:hostent env locale | AS-Unsafe
-     dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note
-     POSIX Safety Concepts::.
-
-     This function closes the hosts database.
+     The 'fopencookie' function returns the newly created stream, or a
+     null pointer in case of an error.
 
 
-File: libc.info,  Node: Ports,  Next: Services Database,  Prev: Host Addresses,  Up: Internet Namespace
+File: libc.info,  Node: Hook Functions,  Prev: Streams and Cookies,  Up: Custom Streams
 
-16.6.3 Internet Ports
----------------------
-
-A socket address in the Internet namespace consists of a machine's
-Internet address plus a "port number" which distinguishes the sockets
-on a given machine (for a given protocol).  Port numbers range from 0
-to 65,535.
-
-   Port numbers less than `IPPORT_RESERVED' are reserved for standard
-servers, such as `finger' and `telnet'.  There is a database that keeps
-track of these, and you can use the `getservbyname' function to map a
-service name onto a port number; see *note Services Database::.
-
-   If you write a server that is not one of the standard ones defined in
-the database, you must choose a port number for it.  Use a number
-greater than `IPPORT_USERRESERVED'; such numbers are reserved for
-servers and won't ever be generated automatically by the system.
-Avoiding conflicts with servers being run by other users is up to you.
-
-   When you use a socket without specifying its address, the system
-generates a port number for it.  This number is between
-`IPPORT_RESERVED' and `IPPORT_USERRESERVED'.
-
-   On the Internet, it is actually legitimate to have two different
-sockets with the same port number, as long as they never both try to
-communicate with the same socket address (host address plus port
-number).  You shouldn't duplicate a port number except in special
-circumstances where a higher-level protocol requires it.  Normally, the
-system won't let you do it; `bind' normally insists on distinct port
-numbers.  To reuse a port number, you must set the socket option
-`SO_REUSEADDR'.  *Note Socket-Level Options::.
-
-   These macros are defined in the header file `netinet/in.h'.
-
- -- Macro: int IPPORT_RESERVED
-     Port numbers less than `IPPORT_RESERVED' are reserved for
-     superuser use.
-
- -- Macro: int IPPORT_USERRESERVED
-     Port numbers greater than or equal to `IPPORT_USERRESERVED' are
-     reserved for explicit use; they will never be allocated
-     automatically.
-
-
-File: libc.info,  Node: Services Database,  Next: Byte Order,  Prev: Ports,  Up: Internet Namespace
-
-16.6.4 The Services Database
-----------------------------
-
-The database that keeps track of "well-known" services is usually
-either the file `/etc/services' or an equivalent from a name server.
-You can use these utilities, declared in `netdb.h', to access the
-services database.  
-
- -- Data Type: struct servent
-     This data type holds information about entries from the services
-     database.  It has the following members:
-
-    `char *s_name'
-          This is the "official" name of the service.
-
-    `char **s_aliases'
-          These are alternate names for the service, represented as an
-          array of strings.  A null pointer terminates the array.
-
-    `int s_port'
-          This is the port number for the service.  Port numbers are
-          given in network byte order; see *note Byte Order::.
-
-    `char *s_proto'
-          This is the name of the protocol to use with this service.
-          *Note Protocols Database::.
-
-   To get information about a particular service, use the
-`getservbyname' or `getservbyport' functions.  The information is
-returned in a statically-allocated structure; you must copy the
-information if you need to save it across calls.
-
- -- Function: struct servent * getservbyname (const char *NAME, const
-          char *PROTO)
-     Preliminary: | MT-Unsafe race:servbyname locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
-     Safety Concepts::.
-
-     The `getservbyname' function returns information about the service
-     named NAME using protocol PROTO.  If it can't find such a service,
-     it returns a null pointer.
-
-     This function is useful for servers as well as for clients; servers
-     use it to determine which port they should listen on (*note
-     Listening::).
-
- -- Function: struct servent * getservbyport (int PORT, const char
-          *PROTO)
-     Preliminary: | MT-Unsafe race:servbyport locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
-     Safety Concepts::.
-
-     The `getservbyport' function returns information about the service
-     at port PORT using protocol PROTO.  If it can't find such a
-     service, it returns a null pointer.
-
-You can also scan the services database using `setservent',
-`getservent' and `endservent'.  Be careful when using these functions
-because they are not reentrant.
-
- -- Function: void setservent (int STAYOPEN)
-     Preliminary: | MT-Unsafe race:servent locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
-     Safety Concepts::.
-
-     This function opens the services database to begin scanning it.
-
-     If the STAYOPEN argument is nonzero, this sets a flag so that
-     subsequent calls to `getservbyname' or `getservbyport' will not
-     close the database (as they usually would).  This makes for more
-     efficiency if you call those functions several times, by avoiding
-     reopening the database for each call.
-
- -- Function: struct servent * getservent (void)
-     Preliminary: | MT-Unsafe race:servent race:serventbuf locale |
-     AS-Unsafe dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem
-     | *Note POSIX Safety Concepts::.
-
-     This function returns the next entry in the services database.  If
-     there are no more entries, it returns a null pointer.
-
- -- Function: void endservent (void)
-     Preliminary: | MT-Unsafe race:servent locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
-     Safety Concepts::.
-
-     This function closes the services database.
-
-
-File: libc.info,  Node: Byte Order,  Next: Protocols Database,  Prev: Services Database,  Up: Internet Namespace
-
-16.6.5 Byte Order Conversion
-----------------------------
-
-Different kinds of computers use different conventions for the ordering
-of bytes within a word.  Some computers put the most significant byte
-within a word first (this is called "big-endian" order), and others put
-it last ("little-endian" order).
-
-   So that machines with different byte order conventions can
-communicate, the Internet protocols specify a canonical byte order
-convention for data transmitted over the network.  This is known as
-"network byte order".
-
-   When establishing an Internet socket connection, you must make sure
-that the data in the `sin_port' and `sin_addr' members of the
-`sockaddr_in' structure are represented in network byte order.  If you
-are encoding integer data in the messages sent through the socket, you
-should convert this to network byte order too.  If you don't do this,
-your program may fail when running on or talking to other kinds of
-machines.
-
-   If you use `getservbyname' and `gethostbyname' or `inet_addr' to get
-the port number and host address, the values are already in network
-byte order, and you can copy them directly into the `sockaddr_in'
-structure.
-
-   Otherwise, you have to convert the values explicitly.  Use `htons'
-and `ntohs' to convert values for the `sin_port' member.  Use `htonl'
-and `ntohl' to convert IPv4 addresses for the `sin_addr' member.
-(Remember, `struct in_addr' is equivalent to `uint32_t'.)  These
-functions are declared in `netinet/in.h'.  
-
- -- Function: uint16_t htons (uint16_t HOSTSHORT)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function converts the `uint16_t' integer HOSTSHORT from host
-     byte order to network byte order.
-
- -- Function: uint16_t ntohs (uint16_t NETSHORT)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function converts the `uint16_t' integer NETSHORT from
-     network byte order to host byte order.
-
- -- Function: uint32_t htonl (uint32_t HOSTLONG)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function converts the `uint32_t' integer HOSTLONG from host
-     byte order to network byte order.
-
-     This is used for IPv4 Internet addresses.
-
- -- Function: uint32_t ntohl (uint32_t NETLONG)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function converts the `uint32_t' integer NETLONG from network
-     byte order to host byte order.
-
-     This is used for IPv4 Internet addresses.
-
-
-File: libc.info,  Node: Protocols Database,  Next: Inet Example,  Prev: Byte Order,  Up: Internet Namespace
-
-16.6.6 Protocols Database
--------------------------
-
-The communications protocol used with a socket controls low-level
-details of how data are exchanged.  For example, the protocol implements
-things like checksums to detect errors in transmissions, and routing
-instructions for messages.  Normal user programs have little reason to
-mess with these details directly.
-
-   The default communications protocol for the Internet namespace
-depends on the communication style.  For stream communication, the
-default is TCP ("transmission control protocol").  For datagram
-communication, the default is UDP ("user datagram protocol").  For
-reliable datagram communication, the default is RDP ("reliable datagram
-protocol").  You should nearly always use the default.
-
-   Internet protocols are generally specified by a name instead of a
-number.  The network protocols that a host knows about are stored in a
-database.  This is usually either derived from the file
-`/etc/protocols', or it may be an equivalent provided by a name server.
-You look up the protocol number associated with a named protocol in the
-database using the `getprotobyname' function.
-
-   Here are detailed descriptions of the utilities for accessing the
-protocols database.  These are declared in `netdb.h'.  
-
- -- Data Type: struct protoent
-     This data type is used to represent entries in the network
-     protocols database.  It has the following members:
-
-    `char *p_name'
-          This is the official name of the protocol.
-
-    `char **p_aliases'
-          These are alternate names for the protocol, specified as an
-          array of strings.  The last element of the array is a null
-          pointer.
-
-    `int p_proto'
-          This is the protocol number (in host byte order); use this
-          member as the PROTOCOL argument to `socket'.
-
-   You can use `getprotobyname' and `getprotobynumber' to search the
-protocols database for a specific protocol.  The information is
-returned in a statically-allocated structure; you must copy the
-information if you need to save it across calls.
-
- -- Function: struct protoent * getprotobyname (const char *NAME)
-     Preliminary: | MT-Unsafe race:protobyname locale | AS-Unsafe
-     dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note
-     POSIX Safety Concepts::.
-
-     The `getprotobyname' function returns information about the
-     network protocol named NAME.  If there is no such protocol, it
-     returns a null pointer.
-
- -- Function: struct protoent * getprotobynumber (int PROTOCOL)
-     Preliminary: | MT-Unsafe race:protobynumber locale | AS-Unsafe
-     dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note
-     POSIX Safety Concepts::.
-
-     The `getprotobynumber' function returns information about the
-     network protocol with number PROTOCOL.  If there is no such
-     protocol, it returns a null pointer.
-
-   You can also scan the whole protocols database one protocol at a
-time by using `setprotoent', `getprotoent' and `endprotoent'.  Be
-careful when using these functions because they are not reentrant.
-
- -- Function: void setprotoent (int STAYOPEN)
-     Preliminary: | MT-Unsafe race:protoent locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
-     Safety Concepts::.
-
-     This function opens the protocols database to begin scanning it.
-
-     If the STAYOPEN argument is nonzero, this sets a flag so that
-     subsequent calls to `getprotobyname' or `getprotobynumber' will
-     not close the database (as they usually would).  This makes for
-     more efficiency if you call those functions several times, by
-     avoiding reopening the database for each call.
-
- -- Function: struct protoent * getprotoent (void)
-     Preliminary: | MT-Unsafe race:protoent race:protoentbuf locale |
-     AS-Unsafe dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem
-     | *Note POSIX Safety Concepts::.
-
-     This function returns the next entry in the protocols database.  It
-     returns a null pointer if there are no more entries.
-
- -- Function: void endprotoent (void)
-     Preliminary: | MT-Unsafe race:protoent locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
-     Safety Concepts::.
-
-     This function closes the protocols database.
-
-
-File: libc.info,  Node: Inet Example,  Prev: Protocols Database,  Up: Internet Namespace
-
-16.6.7 Internet Socket Example
-------------------------------
-
-Here is an example showing how to create and name a socket in the
-Internet namespace.  The newly created socket exists on the machine that
-the program is running on.  Rather than finding and using the machine's
-Internet address, this example specifies `INADDR_ANY' as the host
-address; the system replaces that with the machine's actual address.
-
-
-     #include <stdio.h>
-     #include <stdlib.h>
-     #include <sys/socket.h>
-     #include <netinet/in.h>
-
-     int
-     make_socket (uint16_t port)
-     {
-       int sock;
-       struct sockaddr_in name;
-
-       /* Create the socket. */
-       sock = socket (PF_INET, SOCK_STREAM, 0);
-       if (sock < 0)
-         {
-           perror ("socket");
-           exit (EXIT_FAILURE);
-         }
-
-       /* Give the socket a name. */
-       name.sin_family = AF_INET;
-       name.sin_port = htons (port);
-       name.sin_addr.s_addr = htonl (INADDR_ANY);
-       if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0)
-         {
-           perror ("bind");
-           exit (EXIT_FAILURE);
-         }
-
-       return sock;
-     }
-
-   Here is another example, showing how you can fill in a `sockaddr_in'
-structure, given a host name string and a port number:
-
-
-     #include <stdio.h>
-     #include <stdlib.h>
-     #include <sys/socket.h>
-     #include <netinet/in.h>
-     #include <netdb.h>
-
-     void
-     init_sockaddr (struct sockaddr_in *name,
-                    const char *hostname,
-                    uint16_t port)
-     {
-       struct hostent *hostinfo;
-
-       name->sin_family = AF_INET;
-       name->sin_port = htons (port);
-       hostinfo = gethostbyname (hostname);
-       if (hostinfo == NULL)
-         {
-           fprintf (stderr, "Unknown host %s.\n", hostname);
-           exit (EXIT_FAILURE);
-         }
-       name->sin_addr = *(struct in_addr *) hostinfo->h_addr;
-     }
-
-
-File: libc.info,  Node: Misc Namespaces,  Next: Open/Close Sockets,  Prev: Internet Namespace,  Up: Sockets
-
-16.7 Other Namespaces
-=====================
-
-Certain other namespaces and associated protocol families are supported
-but not documented yet because they are not often used.  `PF_NS' refers
-to the Xerox Network Software protocols.  `PF_ISO' stands for Open
-Systems Interconnect.  `PF_CCITT' refers to protocols from CCITT.
-`socket.h' defines these symbols and others naming protocols not
-actually implemented.
-
-   `PF_IMPLINK' is used for communicating between hosts and Internet
-Message Processors.  For information on this and `PF_ROUTE', an
-occasionally-used local area routing protocol, see the GNU Hurd Manual
-(to appear in the future).
-
-
-File: libc.info,  Node: Open/Close Sockets,  Next: Connections,  Prev: Misc Namespaces,  Up: Sockets
-
-16.8 Opening and Closing Sockets
-================================
-
-This section describes the actual library functions for opening and
-closing sockets.  The same functions work for all namespaces and
-connection styles.
-
-* Menu:
-
-* Creating a Socket::           How to open a socket.
-* Closing a Socket::            How to close a socket.
-* Socket Pairs::                These are created like pipes.
-
-
-File: libc.info,  Node: Creating a Socket,  Next: Closing a Socket,  Up: Open/Close Sockets
-
-16.8.1 Creating a Socket
-------------------------
-
-The primitive for creating a socket is the `socket' function, declared
-in `sys/socket.h'.  
-
- -- Function: int socket (int NAMESPACE, int STYLE, int PROTOCOL)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
-     Concepts::.
-
-     This function creates a socket and specifies communication style
-     STYLE, which should be one of the socket styles listed in *note
-     Communication Styles::.  The NAMESPACE argument specifies the
-     namespace; it must be `PF_LOCAL' (*note Local Namespace::) or
-     `PF_INET' (*note Internet Namespace::).  PROTOCOL designates the
-     specific protocol (*note Socket Concepts::); zero is usually right
-     for PROTOCOL.
-
-     The return value from `socket' is the file descriptor for the new
-     socket, or `-1' in case of error.  The following `errno' error
-     conditions are defined for this function:
-
-    `EPROTONOSUPPORT'
-          The PROTOCOL or STYLE is not supported by the NAMESPACE
-          specified.
-
-    `EMFILE'
-          The process already has too many file descriptors open.
-
-    `ENFILE'
-          The system already has too many file descriptors open.
-
-    `EACCES'
-          The process does not have the privilege to create a socket of
-          the specified STYLE or PROTOCOL.
-
-    `ENOBUFS'
-          The system ran out of internal buffer space.
-
-     The file descriptor returned by the `socket' function supports both
-     read and write operations.  However, like pipes, sockets do not
-     support file positioning operations.
-
-   For examples of how to call the `socket' function, see *note Local
-Socket Example::, or *note Inet Example::.
-
-
-File: libc.info,  Node: Closing a Socket,  Next: Socket Pairs,  Prev: Creating a Socket,  Up: Open/Close Sockets
-
-16.8.2 Closing a Socket
------------------------
-
-When you have finished using a socket, you can simply close its file
-descriptor with `close'; see *note Opening and Closing Files::.  If
-there is still data waiting to be transmitted over the connection,
-normally `close' tries to complete this transmission.  You can control
-this behavior using the `SO_LINGER' socket option to specify a timeout
-period; see *note Socket Options::.
-
-   You can also shut down only reception or transmission on a
-connection by calling `shutdown', which is declared in `sys/socket.h'.
-
- -- Function: int shutdown (int SOCKET, int HOW)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `shutdown' function shuts down the connection of socket
-     SOCKET.  The argument HOW specifies what action to perform:
-
-    `0'
-          Stop receiving data for this socket.  If further data arrives,
-          reject it.
-
-    `1'
-          Stop trying to transmit data from this socket.  Discard any
-          data waiting to be sent.  Stop looking for acknowledgement of
-          data already sent; don't retransmit it if it is lost.
-
-    `2'
-          Stop both reception and transmission.
-
-     The return value is `0' on success and `-1' on failure.  The
-     following `errno' error conditions are defined for this function:
-
-    `EBADF'
-          SOCKET is not a valid file descriptor.
-
-    `ENOTSOCK'
-          SOCKET is not a socket.
-
-    `ENOTCONN'
-          SOCKET is not connected.
-
-
-File: libc.info,  Node: Socket Pairs,  Prev: Closing a Socket,  Up: Open/Close Sockets
-
-16.8.3 Socket Pairs
--------------------
-
-A "socket pair" consists of a pair of connected (but unnamed) sockets.
-It is very similar to a pipe and is used in much the same way.  Socket
-pairs are created with the `socketpair' function, declared in
-`sys/socket.h'.  A socket pair is much like a pipe; the main difference
-is that the socket pair is bidirectional, whereas the pipe has one
-input-only end and one output-only end (*note Pipes and FIFOs::).
-
- -- Function: int socketpair (int NAMESPACE, int STYLE, int PROTOCOL,
-          int FILEDES[2])
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
-     Concepts::.
-
-     This function creates a socket pair, returning the file
-     descriptors in `FILEDES[0]' and `FILEDES[1]'.  The socket pair is
-     a full-duplex communications channel, so that both reading and
-     writing may be performed at either end.
-
-     The NAMESPACE, STYLE and PROTOCOL arguments are interpreted as for
-     the `socket' function.  STYLE should be one of the communication
-     styles listed in *note Communication Styles::.  The NAMESPACE
-     argument specifies the namespace, which must be `AF_LOCAL' (*note
-     Local Namespace::); PROTOCOL specifies the communications
-     protocol, but zero is the only meaningful value.
-
-     If STYLE specifies a connectionless communication style, then the
-     two sockets you get are not _connected_, strictly speaking, but
-     each of them knows the other as the default destination address,
-     so they can send packets to each other.
-
-     The `socketpair' function returns `0' on success and `-1' on
-     failure.  The following `errno' error conditions are defined for
-     this function:
-
-    `EMFILE'
-          The process has too many file descriptors open.
-
-    `EAFNOSUPPORT'
-          The specified namespace is not supported.
-
-    `EPROTONOSUPPORT'
-          The specified protocol is not supported.
-
-    `EOPNOTSUPP'
-          The specified protocol does not support the creation of
-          socket pairs.
-
-
-File: libc.info,  Node: Connections,  Next: Datagrams,  Prev: Open/Close Sockets,  Up: Sockets
-
-16.9 Using Sockets with Connections
-===================================
-
-The most common communication styles involve making a connection to a
-particular other socket, and then exchanging data with that socket over
-and over.  Making a connection is asymmetric; one side (the "client")
-acts to request a connection, while the other side (the "server") makes
-a socket and waits for the connection request.
-
-* Menu:
-
-* Connecting::    	     What the client program must do.
-* Listening::		     How a server program waits for requests.
-* Accepting Connections::    What the server does when it gets a request.
-* Who is Connected::	     Getting the address of the
-				other side of a connection.
-* Transferring Data::        How to send and receive data.
-* Byte Stream Example::	     An example program: a client for communicating
-			      over a byte stream socket in the Internet namespace.
-* Server Example::	     A corresponding server program.
-* Out-of-Band Data::         This is an advanced feature.
-
-
-File: libc.info,  Node: Connecting,  Next: Listening,  Up: Connections
-
-16.9.1 Making a Connection
---------------------------
-
-In making a connection, the client makes a connection while the server
-waits for and accepts the connection.  Here we discuss what the client
-program must do with the `connect' function, which is declared in
-`sys/socket.h'.
-
- -- Function: int connect (int SOCKET, struct sockaddr *ADDR, socklen_t
-          LENGTH)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `connect' function initiates a connection from the socket with
-     file descriptor SOCKET to the socket whose address is specified by
-     the ADDR and LENGTH arguments.  (This socket is typically on
-     another machine, and it must be already set up as a server.)
-     *Note Socket Addresses::, for information about how these
-     arguments are interpreted.
-
-     Normally, `connect' waits until the server responds to the request
-     before it returns.  You can set nonblocking mode on the socket
-     SOCKET to make `connect' return immediately without waiting for
-     the response.  *Note File Status Flags::, for information about
-     nonblocking mode.
-
-     The normal return value from `connect' is `0'.  If an error
-     occurs, `connect' returns `-1'.  The following `errno' error
-     conditions are defined for this function:
-
-    `EBADF'
-          The socket SOCKET is not a valid file descriptor.
-
-    `ENOTSOCK'
-          File descriptor SOCKET is not a socket.
-
-    `EADDRNOTAVAIL'
-          The specified address is not available on the remote machine.
-
-    `EAFNOSUPPORT'
-          The namespace of the ADDR is not supported by this socket.
-
-    `EISCONN'
-          The socket SOCKET is already connected.
-
-    `ETIMEDOUT'
-          The attempt to establish the connection timed out.
-
-    `ECONNREFUSED'
-          The server has actively refused to establish the connection.
-
-    `ENETUNREACH'
-          The network of the given ADDR isn't reachable from this host.
-
-    `EADDRINUSE'
-          The socket address of the given ADDR is already in use.
-
-    `EINPROGRESS'
-          The socket SOCKET is non-blocking and the connection could
-          not be established immediately.  You can determine when the
-          connection is completely established with `select'; *note
-          Waiting for I/O::.  Another `connect' call on the same
-          socket, before the connection is completely established, will
-          fail with `EALREADY'.
-
-    `EALREADY'
-          The socket SOCKET is non-blocking and already has a pending
-          connection in progress (see `EINPROGRESS' above).
-
-     This function is defined as a cancellation point in multi-threaded
-     programs, so one has to be prepared for this and make sure that
-     allocated resources (like memory, files descriptors, semaphores or
-     whatever) are freed even if the thread is canceled.
-
-
-File: libc.info,  Node: Listening,  Next: Accepting Connections,  Prev: Connecting,  Up: Connections
-
-16.9.2 Listening for Connections
---------------------------------
-
-Now let us consider what the server process must do to accept
-connections on a socket.  First it must use the `listen' function to
-enable connection requests on the socket, and then accept each incoming
-connection with a call to `accept' (*note Accepting Connections::).
-Once connection requests are enabled on a server socket, the `select'
-function reports when the socket has a connection ready to be accepted
-(*note Waiting for I/O::).
-
-   The `listen' function is not allowed for sockets using
-connectionless communication styles.
-
-   You can write a network server that does not even start running
-until a connection to it is requested.  *Note Inetd Servers::.
-
-   In the Internet namespace, there are no special protection mechanisms
-for controlling access to a port; any process on any machine can make a
-connection to your server.  If you want to restrict access to your
-server, make it examine the addresses associated with connection
-requests or implement some other handshaking or identification protocol.
-
-   In the local namespace, the ordinary file protection bits control
-who has access to connect to the socket.
-
- -- Function: int listen (int SOCKET, int N)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
-     Concepts::.
-
-     The `listen' function enables the socket SOCKET to accept
-     connections, thus making it a server socket.
-
-     The argument N specifies the length of the queue for pending
-     connections.  When the queue fills, new clients attempting to
-     connect fail with `ECONNREFUSED' until the server calls `accept' to
-     accept a connection from the queue.
-
-     The `listen' function returns `0' on success and `-1' on failure.
-     The following `errno' error conditions are defined for this
-     function:
-
-    `EBADF'
-          The argument SOCKET is not a valid file descriptor.
-
-    `ENOTSOCK'
-          The argument SOCKET is not a socket.
-
-    `EOPNOTSUPP'
-          The socket SOCKET does not support this operation.
-
-
-File: libc.info,  Node: Accepting Connections,  Next: Who is Connected,  Prev: Listening,  Up: Connections
-
-16.9.3 Accepting Connections
-----------------------------
-
-When a server receives a connection request, it can complete the
-connection by accepting the request.  Use the function `accept' to do
-this.
-
-   A socket that has been established as a server can accept connection
-requests from multiple clients.  The server's original socket _does not
-become part of the connection_; instead, `accept' makes a new socket
-which participates in the connection.  `accept' returns the descriptor
-for this socket.  The server's original socket remains available for
-listening for further connection requests.
-
-   The number of pending connection requests on a server socket is
-finite.  If connection requests arrive from clients faster than the
-server can act upon them, the queue can fill up and additional requests
-are refused with an `ECONNREFUSED' error.  You can specify the maximum
-length of this queue as an argument to the `listen' function, although
-the system may also impose its own internal limit on the length of this
-queue.
-
- -- Function: int accept (int SOCKET, struct sockaddr *ADDR, socklen_t
-          *LENGTH_PTR)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
-     Concepts::.
-
-     This function is used to accept a connection request on the server
-     socket SOCKET.
-
-     The `accept' function waits if there are no connections pending,
-     unless the socket SOCKET has nonblocking mode set.  (You can use
-     `select' to wait for a pending connection, with a nonblocking
-     socket.)  *Note File Status Flags::, for information about
-     nonblocking mode.
-
-     The ADDR and LENGTH-PTR arguments are used to return information
-     about the name of the client socket that initiated the connection.
-     *Note Socket Addresses::, for information about the format of the
-     information.
-
-     Accepting a connection does not make SOCKET part of the
-     connection.  Instead, it creates a new socket which becomes
-     connected.  The normal return value of `accept' is the file
-     descriptor for the new socket.
-
-     After `accept', the original socket SOCKET remains open and
-     unconnected, and continues listening until you close it.  You can
-     accept further connections with SOCKET by calling `accept' again.
-
-     If an error occurs, `accept' returns `-1'.  The following `errno'
-     error conditions are defined for this function:
-
-    `EBADF'
-          The SOCKET argument is not a valid file descriptor.
-
-    `ENOTSOCK'
-          The descriptor SOCKET argument is not a socket.
-
-    `EOPNOTSUPP'
-          The descriptor SOCKET does not support this operation.
-
-    `EWOULDBLOCK'
-          SOCKET has nonblocking mode set, and there are no pending
-          connections immediately available.
-
-     This function is defined as a cancellation point in multi-threaded
-     programs, so one has to be prepared for this and make sure that
-     allocated resources (like memory, files descriptors, semaphores or
-     whatever) are freed even if the thread is canceled.
-
-   The `accept' function is not allowed for sockets using
-connectionless communication styles.
-
-
-File: libc.info,  Node: Who is Connected,  Next: Transferring Data,  Prev: Accepting Connections,  Up: Connections
-
-16.9.4 Who is Connected to Me?
-------------------------------
-
- -- Function: int getpeername (int SOCKET, struct sockaddr *ADDR,
-          socklen_t *LENGTH-PTR)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `getpeername' function returns the address of the socket that
-     SOCKET is connected to; it stores the address in the memory space
-     specified by ADDR and LENGTH-PTR.  It stores the length of the
-     address in `*LENGTH-PTR'.
-
-     *Note Socket Addresses::, for information about the format of the
-     address.  In some operating systems, `getpeername' works only for
-     sockets in the Internet domain.
-
-     The return value is `0' on success and `-1' on error.  The
-     following `errno' error conditions are defined for this function:
-
-    `EBADF'
-          The argument SOCKET is not a valid file descriptor.
-
-    `ENOTSOCK'
-          The descriptor SOCKET is not a socket.
-
-    `ENOTCONN'
-          The socket SOCKET is not connected.
-
-    `ENOBUFS'
-          There are not enough internal buffers available.
-
-
-File: libc.info,  Node: Transferring Data,  Next: Byte Stream Example,  Prev: Who is Connected,  Up: Connections
-
-16.9.5 Transferring Data
-------------------------
-
-Once a socket has been connected to a peer, you can use the ordinary
-`read' and `write' operations (*note I/O Primitives::) to transfer
-data.  A socket is a two-way communications channel, so read and write
-operations can be performed at either end.
-
-   There are also some I/O modes that are specific to socket operations.
-In order to specify these modes, you must use the `recv' and `send'
-functions instead of the more generic `read' and `write' functions.
-The `recv' and `send' functions take an additional argument which you
-can use to specify various flags to control special I/O modes.  For
-example, you can specify the `MSG_OOB' flag to read or write
-out-of-band data, the `MSG_PEEK' flag to peek at input, or the
-`MSG_DONTROUTE' flag to control inclusion of routing information on
-output.
-
-* Menu:
-
-* Sending Data::		Sending data with `send'.
-* Receiving Data::		Reading data with `recv'.
-* Socket Data Options::		Using `send' and `recv'.
-
-
-File: libc.info,  Node: Sending Data,  Next: Receiving Data,  Up: Transferring Data
-
-16.9.5.1 Sending Data
-.....................
-
-The `send' function is declared in the header file `sys/socket.h'.  If
-your FLAGS argument is zero, you can just as well use `write' instead
-of `send'; see *note I/O Primitives::.  If the socket was connected but
-the connection has broken, you get a `SIGPIPE' signal for any use of
-`send' or `write' (*note Miscellaneous Signals::).
-
- -- Function: ssize_t send (int SOCKET, const void *BUFFER, size_t
-          SIZE, int FLAGS)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `send' function is like `write', but with the additional flags
-     FLAGS.  The possible values of FLAGS are described in *note Socket
-     Data Options::.
-
-     This function returns the number of bytes transmitted, or `-1' on
-     failure.  If the socket is nonblocking, then `send' (like `write')
-     can return after sending just part of the data.  *Note File Status
-     Flags::, for information about nonblocking mode.
-
-     Note, however, that a successful return value merely indicates that
-     the message has been sent without error, not necessarily that it
-     has been received without error.
-
-     The following `errno' error conditions are defined for this
-     function:
-
-    `EBADF'
-          The SOCKET argument is not a valid file descriptor.
-
-    `EINTR'
-          The operation was interrupted by a signal before any data was
-          sent.  *Note Interrupted Primitives::.
-
-    `ENOTSOCK'
-          The descriptor SOCKET is not a socket.
-
-    `EMSGSIZE'
-          The socket type requires that the message be sent atomically,
-          but the message is too large for this to be possible.
-
-    `EWOULDBLOCK'
-          Nonblocking mode has been set on the socket, and the write
-          operation would block.  (Normally `send' blocks until the
-          operation can be completed.)
-
-    `ENOBUFS'
-          There is not enough internal buffer space available.
-
-    `ENOTCONN'
-          You never connected this socket.
-
-    `EPIPE'
-          This socket was connected but the connection is now broken.
-          In this case, `send' generates a `SIGPIPE' signal first; if
-          that signal is ignored or blocked, or if its handler returns,
-          then `send' fails with `EPIPE'.
-
-     This function is defined as a cancellation point in multi-threaded
-     programs, so one has to be prepared for this and make sure that
-     allocated resources (like memory, files descriptors, semaphores or
-     whatever) are freed even if the thread is canceled.
-
-
-File: libc.info,  Node: Receiving Data,  Next: Socket Data Options,  Prev: Sending Data,  Up: Transferring Data
-
-16.9.5.2 Receiving Data
-.......................
-
-The `recv' function is declared in the header file `sys/socket.h'.  If
-your FLAGS argument is zero, you can just as well use `read' instead of
-`recv'; see *note I/O Primitives::.
-
- -- Function: ssize_t recv (int SOCKET, void *BUFFER, size_t SIZE, int
-          FLAGS)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `recv' function is like `read', but with the additional flags
-     FLAGS.  The possible values of FLAGS are described in *note Socket
-     Data Options::.
-
-     If nonblocking mode is set for SOCKET, and no data are available to
-     be read, `recv' fails immediately rather than waiting.  *Note File
-     Status Flags::, for information about nonblocking mode.
-
-     This function returns the number of bytes received, or `-1' on
-     failure.  The following `errno' error conditions are defined for
-     this function:
-
-    `EBADF'
-          The SOCKET argument is not a valid file descriptor.
-
-    `ENOTSOCK'
-          The descriptor SOCKET is not a socket.
-
-    `EWOULDBLOCK'
-          Nonblocking mode has been set on the socket, and the read
-          operation would block.  (Normally, `recv' blocks until there
-          is input available to be read.)
-
-    `EINTR'
-          The operation was interrupted by a signal before any data was
-          read.  *Note Interrupted Primitives::.
-
-    `ENOTCONN'
-          You never connected this socket.
-
-     This function is defined as a cancellation point in multi-threaded
-     programs, so one has to be prepared for this and make sure that
-     allocated resources (like memory, files descriptors, semaphores or
-     whatever) are freed even if the thread is canceled.
-
-
-File: libc.info,  Node: Socket Data Options,  Prev: Receiving Data,  Up: Transferring Data
-
-16.9.5.3 Socket Data Options
-............................
-
-The FLAGS argument to `send' and `recv' is a bit mask.  You can
-bitwise-OR the values of the following macros together to obtain a
-value for this argument.  All are defined in the header file
-`sys/socket.h'.
-
- -- Macro: int MSG_OOB
-     Send or receive out-of-band data.  *Note Out-of-Band Data::.
-
- -- Macro: int MSG_PEEK
-     Look at the data but don't remove it from the input queue.  This is
-     only meaningful with input functions such as `recv', not with
-     `send'.
-
- -- Macro: int MSG_DONTROUTE
-     Don't include routing information in the message.  This is only
-     meaningful with output operations, and is usually only of interest
-     for diagnostic or routing programs.  We don't try to explain it
-     here.
-
-
-File: libc.info,  Node: Byte Stream Example,  Next: Server Example,  Prev: Transferring Data,  Up: Connections
-
-16.9.6 Byte Stream Socket Example
----------------------------------
-
-Here is an example client program that makes a connection for a byte
-stream socket in the Internet namespace.  It doesn't do anything
-particularly interesting once it has connected to the server; it just
-sends a text string to the server and exits.
-
-   This program uses `init_sockaddr' to set up the socket address; see
-*note Inet Example::.
-
-
-     #include <stdio.h>
-     #include <errno.h>
-     #include <stdlib.h>
-     #include <unistd.h>
-     #include <sys/types.h>
-     #include <sys/socket.h>
-     #include <netinet/in.h>
-     #include <netdb.h>
-
-     #define PORT            5555
-     #define MESSAGE         "Yow!!! Are we having fun yet?!?"
-     #define SERVERHOST      "www.gnu.org"
-
-     void
-     write_to_server (int filedes)
-     {
-       int nbytes;
-
-       nbytes = write (filedes, MESSAGE, strlen (MESSAGE) + 1);
-       if (nbytes < 0)
-         {
-           perror ("write");
-           exit (EXIT_FAILURE);
-         }
-     }
-
-
-     int
-     main (void)
-     {
-       extern void init_sockaddr (struct sockaddr_in *name,
-                                  const char *hostname,
-                                  uint16_t port);
-       int sock;
-       struct sockaddr_in servername;
-
-       /* Create the socket. */
-       sock = socket (PF_INET, SOCK_STREAM, 0);
-       if (sock < 0)
-         {
-           perror ("socket (client)");
-           exit (EXIT_FAILURE);
-         }
-
-       /* Connect to the server. */
-       init_sockaddr (&servername, SERVERHOST, PORT);
-       if (0 > connect (sock,
-                        (struct sockaddr *) &servername,
-                        sizeof (servername)))
-         {
-           perror ("connect (client)");
-           exit (EXIT_FAILURE);
-         }
-
-       /* Send data to the server. */
-       write_to_server (sock);
-       close (sock);
-       exit (EXIT_SUCCESS);
-     }
-
-
-File: libc.info,  Node: Server Example,  Next: Out-of-Band Data,  Prev: Byte Stream Example,  Up: Connections
-
-16.9.7 Byte Stream Connection Server Example
---------------------------------------------
-
-The server end is much more complicated.  Since we want to allow
-multiple clients to be connected to the server at the same time, it
-would be incorrect to wait for input from a single client by simply
-calling `read' or `recv'.  Instead, the right thing to do is to use
-`select' (*note Waiting for I/O::) to wait for input on all of the open
-sockets.  This also allows the server to deal with additional
-connection requests.
-
-   This particular server doesn't do anything interesting once it has
-gotten a message from a client.  It does close the socket for that
-client when it detects an end-of-file condition (resulting from the
-client shutting down its end of the connection).
-
-   This program uses `make_socket' to set up the socket address; see
-*note Inet Example::.
-
-
-     #include <stdio.h>
-     #include <errno.h>
-     #include <stdlib.h>
-     #include <unistd.h>
-     #include <sys/types.h>
-     #include <sys/socket.h>
-     #include <netinet/in.h>
-     #include <netdb.h>
-
-     #define PORT    5555
-     #define MAXMSG  512
-
-     int
-     read_from_client (int filedes)
-     {
-       char buffer[MAXMSG];
-       int nbytes;
-
-       nbytes = read (filedes, buffer, MAXMSG);
-       if (nbytes < 0)
-         {
-           /* Read error. */
-           perror ("read");
-           exit (EXIT_FAILURE);
-         }
-       else if (nbytes == 0)
-         /* End-of-file. */
-         return -1;
-       else
-         {
-           /* Data read. */
-           fprintf (stderr, "Server: got message: `%s'\n", buffer);
-           return 0;
-         }
-     }
-
-     int
-     main (void)
-     {
-       extern int make_socket (uint16_t port);
-       int sock;
-       fd_set active_fd_set, read_fd_set;
-       int i;
-       struct sockaddr_in clientname;
-       size_t size;
-
-       /* Create the socket and set it up to accept connections. */
-       sock = make_socket (PORT);
-       if (listen (sock, 1) < 0)
-         {
-           perror ("listen");
-           exit (EXIT_FAILURE);
-         }
-
-       /* Initialize the set of active sockets. */
-       FD_ZERO (&active_fd_set);
-       FD_SET (sock, &active_fd_set);
-
-       while (1)
-         {
-           /* Block until input arrives on one or more active sockets. */
-           read_fd_set = active_fd_set;
-           if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0)
-             {
-               perror ("select");
-               exit (EXIT_FAILURE);
-             }
-
-           /* Service all the sockets with input pending. */
-           for (i = 0; i < FD_SETSIZE; ++i)
-             if (FD_ISSET (i, &read_fd_set))
-               {
-                 if (i == sock)
-                   {
-                     /* Connection request on original socket. */
-                     int new;
-                     size = sizeof (clientname);
-                     new = accept (sock,
-                                   (struct sockaddr *) &clientname,
-                                   &size);
-                     if (new < 0)
-                       {
-                         perror ("accept");
-                         exit (EXIT_FAILURE);
-                       }
-                     fprintf (stderr,
-                              "Server: connect from host %s, port %hd.\n",
-                              inet_ntoa (clientname.sin_addr),
-                              ntohs (clientname.sin_port));
-                     FD_SET (new, &active_fd_set);
-                   }
-                 else
-                   {
-                     /* Data arriving on an already-connected socket. */
-                     if (read_from_client (i) < 0)
-                       {
-                         close (i);
-                         FD_CLR (i, &active_fd_set);
-                       }
-                   }
-               }
-         }
-     }
-
-
-File: libc.info,  Node: Out-of-Band Data,  Prev: Server Example,  Up: Connections
-
-16.9.8 Out-of-Band Data
------------------------
-
-Streams with connections permit "out-of-band" data that is delivered
-with higher priority than ordinary data.  Typically the reason for
-sending out-of-band data is to send notice of an exceptional condition.
-To send out-of-band data use `send', specifying the flag `MSG_OOB'
-(*note Sending Data::).
-
-   Out-of-band data are received with higher priority because the
-receiving process need not read it in sequence; to read the next
-available out-of-band data, use `recv' with the `MSG_OOB' flag (*note
-Receiving Data::).  Ordinary read operations do not read out-of-band
-data; they read only ordinary data.
-
-   When a socket finds that out-of-band data are on their way, it sends
-a `SIGURG' signal to the owner process or process group of the socket.
-You can specify the owner using the `F_SETOWN' command to the `fcntl'
-function; see *note Interrupt Input::.  You must also establish a
-handler for this signal, as described in *note Signal Handling::, in
-order to take appropriate action such as reading the out-of-band data.
-
-   Alternatively, you can test for pending out-of-band data, or wait
-until there is out-of-band data, using the `select' function; it can
-wait for an exceptional condition on the socket.  *Note Waiting for
-I/O::, for more information about `select'.
-
-   Notification of out-of-band data (whether with `SIGURG' or with
-`select') indicates that out-of-band data are on the way; the data may
-not actually arrive until later.  If you try to read the out-of-band
-data before it arrives, `recv' fails with an `EWOULDBLOCK' error.
-
-   Sending out-of-band data automatically places a "mark" in the stream
-of ordinary data, showing where in the sequence the out-of-band data
-"would have been".  This is useful when the meaning of out-of-band data
-is "cancel everything sent so far".  Here is how you can test, in the
-receiving process, whether any ordinary data was sent before the mark:
-
-     success = ioctl (socket, SIOCATMARK, &atmark);
-
-   The `integer' variable ATMARK is set to a nonzero value if the
-socket's read pointer has reached the "mark".
-
-   Here's a function to discard any ordinary data preceding the
-out-of-band mark:
-
-     int
-     discard_until_mark (int socket)
-     {
-       while (1)
-         {
-           /* This is not an arbitrary limit; any size will do.  */
-           char buffer[1024];
-           int atmark, success;
-
-           /* If we have reached the mark, return.  */
-           success = ioctl (socket, SIOCATMARK, &atmark);
-           if (success < 0)
-             perror ("ioctl");
-           if (result)
-             return;
-
-           /* Otherwise, read a bunch of ordinary data and discard it.
-              This is guaranteed not to read past the mark
-              if it starts before the mark.  */
-           success = read (socket, buffer, sizeof buffer);
-           if (success < 0)
-             perror ("read");
-         }
-     }
-
-   If you don't want to discard the ordinary data preceding the mark,
-you may need to read some of it anyway, to make room in internal system
-buffers for the out-of-band data.  If you try to read out-of-band data
-and get an `EWOULDBLOCK' error, try reading some ordinary data (saving
-it so that you can use it when you want it) and see if that makes room.
-Here is an example:
-
-     struct buffer
-     {
-       char *buf;
-       int size;
-       struct buffer *next;
-     };
-
-     /* Read the out-of-band data from SOCKET and return it
-        as a `struct buffer', which records the address of the data
-        and its size.
-
-        It may be necessary to read some ordinary data
-        in order to make room for the out-of-band data.
-        If so, the ordinary data are saved as a chain of buffers
-        found in the `next' field of the value.  */
-
-     struct buffer *
-     read_oob (int socket)
-     {
-       struct buffer *tail = 0;
-       struct buffer *list = 0;
-
-       while (1)
-         {
-           /* This is an arbitrary limit.
-              Does anyone know how to do this without a limit?  */
-     #define BUF_SZ 1024
-           char *buf = (char *) xmalloc (BUF_SZ);
-           int success;
-           int atmark;
-
-           /* Try again to read the out-of-band data.  */
-           success = recv (socket, buf, BUF_SZ, MSG_OOB);
-           if (success >= 0)
-             {
-               /* We got it, so return it.  */
-               struct buffer *link
-                 = (struct buffer *) xmalloc (sizeof (struct buffer));
-               link->buf = buf;
-               link->size = success;
-               link->next = list;
-               return link;
-             }
-
-           /* If we fail, see if we are at the mark.  */
-           success = ioctl (socket, SIOCATMARK, &atmark);
-           if (success < 0)
-             perror ("ioctl");
-           if (atmark)
-             {
-               /* At the mark; skipping past more ordinary data cannot help.
-                  So just wait a while.  */
-               sleep (1);
-               continue;
-             }
-
-           /* Otherwise, read a bunch of ordinary data and save it.
-              This is guaranteed not to read past the mark
-              if it starts before the mark.  */
-           success = read (socket, buf, BUF_SZ);
-           if (success < 0)
-             perror ("read");
-
-           /* Save this data in the buffer list.  */
-           {
-             struct buffer *link
-               = (struct buffer *) xmalloc (sizeof (struct buffer));
-             link->buf = buf;
-             link->size = success;
-
-             /* Add the new link to the end of the list.  */
-             if (tail)
-               tail->next = link;
-             else
-               list = link;
-             tail = link;
-           }
-         }
-     }
-
-
-File: libc.info,  Node: Datagrams,  Next: Inetd,  Prev: Connections,  Up: Sockets
-
-16.10 Datagram Socket Operations
-================================
-
-This section describes how to use communication styles that don't use
-connections (styles `SOCK_DGRAM' and `SOCK_RDM').  Using these styles,
-you group data into packets and each packet is an independent
-communication.  You specify the destination for each packet
-individually.
-
-   Datagram packets are like letters: you send each one independently
-with its own destination address, and they may arrive in the wrong
-order or not at all.
-
-   The `listen' and `accept' functions are not allowed for sockets
-using connectionless communication styles.
-
-* Menu:
-
-* Sending Datagrams::    Sending packets on a datagram socket.
-* Receiving Datagrams::  Receiving packets on a datagram socket.
-* Datagram Example::     An example program: packets sent over a
-                           datagram socket in the local namespace.
-* Example Receiver::	 Another program, that receives those packets.
-
-
-File: libc.info,  Node: Sending Datagrams,  Next: Receiving Datagrams,  Up: Datagrams
-
-16.10.1 Sending Datagrams
--------------------------
-
-The normal way of sending data on a datagram socket is by using the
-`sendto' function, declared in `sys/socket.h'.
-
-   You can call `connect' on a datagram socket, but this only specifies
-a default destination for further data transmission on the socket.
-When a socket has a default destination you can use `send' (*note
-Sending Data::) or even `write' (*note I/O Primitives::) to send a
-packet there.  You can cancel the default destination by calling
-`connect' using an address format of `AF_UNSPEC' in the ADDR argument.
-*Note Connecting::, for more information about the `connect' function.
-
- -- Function: ssize_t sendto (int SOCKET, const void *BUFFER, size_t
-          SIZE, int FLAGS, struct sockaddr *ADDR, socklen_t LENGTH)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `sendto' function transmits the data in the BUFFER through the
-     socket SOCKET to the destination address specified by the ADDR and
-     LENGTH arguments.  The SIZE argument specifies the number of bytes
-     to be transmitted.
-
-     The FLAGS are interpreted the same way as for `send'; see *note
-     Socket Data Options::.
-
-     The return value and error conditions are also the same as for
-     `send', but you cannot rely on the system to detect errors and
-     report them; the most common error is that the packet is lost or
-     there is no-one at the specified address to receive it, and the
-     operating system on your machine usually does not know this.
-
-     It is also possible for one call to `sendto' to report an error
-     owing to a problem related to a previous call.
-
-     This function is defined as a cancellation point in multi-threaded
-     programs, so one has to be prepared for this and make sure that
-     allocated resources (like memory, files descriptors, semaphores or
-     whatever) are freed even if the thread is canceled.
-
-
-File: libc.info,  Node: Receiving Datagrams,  Next: Datagram Example,  Prev: Sending Datagrams,  Up: Datagrams
-
-16.10.2 Receiving Datagrams
----------------------------
-
-The `recvfrom' function reads a packet from a datagram socket and also
-tells you where it was sent from.  This function is declared in
-`sys/socket.h'.
-
- -- Function: ssize_t recvfrom (int SOCKET, void *BUFFER, size_t SIZE,
-          int FLAGS, struct sockaddr *ADDR, socklen_t *LENGTH-PTR)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `recvfrom' function reads one packet from the socket SOCKET
-     into the buffer BUFFER.  The SIZE argument specifies the maximum
-     number of bytes to be read.
-
-     If the packet is longer than SIZE bytes, then you get the first
-     SIZE bytes of the packet and the rest of the packet is lost.
-     There's no way to read the rest of the packet.  Thus, when you use
-     a packet protocol, you must always know how long a packet to
-     expect.
-
-     The ADDR and LENGTH-PTR arguments are used to return the address
-     where the packet came from.  *Note Socket Addresses::.  For a
-     socket in the local domain the address information won't be
-     meaningful, since you can't read the address of such a socket
-     (*note Local Namespace::).  You can specify a null pointer as the
-     ADDR argument if you are not interested in this information.
-
-     The FLAGS are interpreted the same way as for `recv' (*note Socket
-     Data Options::).  The return value and error conditions are also
-     the same as for `recv'.
-
-     This function is defined as a cancellation point in multi-threaded
-     programs, so one has to be prepared for this and make sure that
-     allocated resources (like memory, files descriptors, semaphores or
-     whatever) are freed even if the thread is canceled.
-
-   You can use plain `recv' (*note Receiving Data::) instead of
-`recvfrom' if you don't need to find out who sent the packet (either
-because you know where it should come from or because you treat all
-possible senders alike).  Even `read' can be used if you don't want to
-specify FLAGS (*note I/O Primitives::).
-
-
-File: libc.info,  Node: Datagram Example,  Next: Example Receiver,  Prev: Receiving Datagrams,  Up: Datagrams
-
-16.10.3 Datagram Socket Example
--------------------------------
-
-Here is a set of example programs that send messages over a datagram
-stream in the local namespace.  Both the client and server programs use
-the `make_named_socket' function that was presented in *note Local
-Socket Example::, to create and name their sockets.
-
-   First, here is the server program.  It sits in a loop waiting for
-messages to arrive, bouncing each message back to the sender.
-Obviously this isn't a particularly useful program, but it does show
-the general ideas involved.
-
-
-     #include <stdio.h>
-     #include <errno.h>
-     #include <stdlib.h>
-     #include <sys/socket.h>
-     #include <sys/un.h>
-
-     #define SERVER  "/tmp/serversocket"
-     #define MAXMSG  512
-
-     int
-     main (void)
-     {
-       int sock;
-       char message[MAXMSG];
-       struct sockaddr_un name;
-       size_t size;
-       int nbytes;
-
-       /* Remove the filename first, it's ok if the call fails */
-       unlink (SERVER);
-
-       /* Make the socket, then loop endlessly. */
-       sock = make_named_socket (SERVER);
-       while (1)
-         {
-           /* Wait for a datagram. */
-           size = sizeof (name);
-           nbytes = recvfrom (sock, message, MAXMSG, 0,
-                              (struct sockaddr *) & name, &size);
-           if (nbytes < 0)
-             {
-               perror ("recfrom (server)");
-               exit (EXIT_FAILURE);
-             }
-
-           /* Give a diagnostic message. */
-           fprintf (stderr, "Server: got message: %s\n", message);
-
-           /* Bounce the message back to the sender. */
-           nbytes = sendto (sock, message, nbytes, 0,
-                            (struct sockaddr *) & name, size);
-           if (nbytes < 0)
-             {
-               perror ("sendto (server)");
-               exit (EXIT_FAILURE);
-             }
-         }
-     }
-
-
-File: libc.info,  Node: Example Receiver,  Prev: Datagram Example,  Up: Datagrams
-
-16.10.4 Example of Reading Datagrams
-------------------------------------
-
-Here is the client program corresponding to the server above.
-
-   It sends a datagram to the server and then waits for a reply.  Notice
-that the socket for the client (as well as for the server) in this
-example has to be given a name.  This is so that the server can direct
-a message back to the client.  Since the socket has no associated
-connection state, the only way the server can do this is by referencing
-the name of the client.
-
-
-     #include <stdio.h>
-     #include <errno.h>
-     #include <unistd.h>
-     #include <stdlib.h>
-     #include <sys/socket.h>
-     #include <sys/un.h>
-
-     #define SERVER  "/tmp/serversocket"
-     #define CLIENT  "/tmp/mysocket"
-     #define MAXMSG  512
-     #define MESSAGE "Yow!!! Are we having fun yet?!?"
-
-     int
-     main (void)
-     {
-       extern int make_named_socket (const char *name);
-       int sock;
-       char message[MAXMSG];
-       struct sockaddr_un name;
-       size_t size;
-       int nbytes;
-
-       /* Make the socket. */
-       sock = make_named_socket (CLIENT);
-
-       /* Initialize the server socket address. */
-       name.sun_family = AF_LOCAL;
-       strcpy (name.sun_path, SERVER);
-       size = strlen (name.sun_path) + sizeof (name.sun_family);
-
-       /* Send the datagram. */
-       nbytes = sendto (sock, MESSAGE, strlen (MESSAGE) + 1, 0,
-                        (struct sockaddr *) & name, size);
-       if (nbytes < 0)
-         {
-           perror ("sendto (client)");
-           exit (EXIT_FAILURE);
-         }
-
-       /* Wait for a reply. */
-       nbytes = recvfrom (sock, message, MAXMSG, 0, NULL, 0);
-       if (nbytes < 0)
-         {
-           perror ("recfrom (client)");
-           exit (EXIT_FAILURE);
-         }
-
-       /* Print a diagnostic message. */
-       fprintf (stderr, "Client: got message: %s\n", message);
-
-       /* Clean up. */
-       remove (CLIENT);
-       close (sock);
-     }
-
-   Keep in mind that datagram socket communications are unreliable.  In
-this example, the client program waits indefinitely if the message
-never reaches the server or if the server's response never comes back.
-It's up to the user running the program to kill and restart it if
-desired.  A more automatic solution could be to use `select' (*note
-Waiting for I/O::) to establish a timeout period for the reply, and in
-case of timeout either re-send the message or shut down the socket and
-exit.
-
-
-File: libc.info,  Node: Inetd,  Next: Socket Options,  Prev: Datagrams,  Up: Sockets
-
-16.11 The `inetd' Daemon
-========================
-
-We've explained above how to write a server program that does its own
-listening.  Such a server must already be running in order for anyone
-to connect to it.
-
-   Another way to provide a service on an Internet port is to let the
-daemon program `inetd' do the listening.  `inetd' is a program that
-runs all the time and waits (using `select') for messages on a
-specified set of ports.  When it receives a message, it accepts the
-connection (if the socket style calls for connections) and then forks a
-child process to run the corresponding server program.  You specify the
-ports and their programs in the file `/etc/inetd.conf'.
-
-* Menu:
-
-* Inetd Servers::
-* Configuring Inetd::
-
-
-File: libc.info,  Node: Inetd Servers,  Next: Configuring Inetd,  Up: Inetd
-
-16.11.1 `inetd' Servers
------------------------
-
-Writing a server program to be run by `inetd' is very simple.  Each time
-someone requests a connection to the appropriate port, a new server
-process starts.  The connection already exists at this time; the socket
-is available as the standard input descriptor and as the standard
-output descriptor (descriptors 0 and 1) in the server process.  Thus
-the server program can begin reading and writing data right away.
-Often the program needs only the ordinary I/O facilities; in fact, a
-general-purpose filter program that knows nothing about sockets can
-work as a byte stream server run by `inetd'.
-
-   You can also use `inetd' for servers that use connectionless
-communication styles.  For these servers, `inetd' does not try to accept
-a connection since no connection is possible.  It just starts the
-server program, which can read the incoming datagram packet from
-descriptor 0.  The server program can handle one request and then exit,
-or you can choose to write it to keep reading more requests until no
-more arrive, and then exit.  You must specify which of these two
-techniques the server uses when you configure `inetd'.
-
-
-File: libc.info,  Node: Configuring Inetd,  Prev: Inetd Servers,  Up: Inetd
-
-16.11.2 Configuring `inetd'
----------------------------
-
-The file `/etc/inetd.conf' tells `inetd' which ports to listen to and
-what server programs to run for them.  Normally each entry in the file
-is one line, but you can split it onto multiple lines provided all but
-the first line of the entry start with whitespace.  Lines that start
-with `#' are comments.
-
-   Here are two standard entries in `/etc/inetd.conf':
-
-     ftp	stream	tcp	nowait	root	/libexec/ftpd	ftpd
-     talk	dgram	udp	wait	root	/libexec/talkd	talkd
-
-   An entry has this format:
-
-     SERVICE STYLE PROTOCOL WAIT USERNAME PROGRAM ARGUMENTS
-
-   The SERVICE field says which service this program provides.  It
-should be the name of a service defined in `/etc/services'.  `inetd'
-uses SERVICE to decide which port to listen on for this entry.
-
-   The fields STYLE and PROTOCOL specify the communication style and
-the protocol to use for the listening socket.  The style should be the
-name of a communication style, converted to lower case and with `SOCK_'
-deleted--for example, `stream' or `dgram'.  PROTOCOL should be one of
-the protocols listed in `/etc/protocols'.  The typical protocol names
-are `tcp' for byte stream connections and `udp' for unreliable
-datagrams.
-
-   The WAIT field should be either `wait' or `nowait'.  Use `wait' if
-STYLE is a connectionless style and the server, once started, handles
-multiple requests as they come in.  Use `nowait' if `inetd' should
-start a new process for each message or request that comes in.  If
-STYLE uses connections, then WAIT *must* be `nowait'.
-
-   USER is the user name that the server should run as.  `inetd' runs
-as root, so it can set the user ID of its children arbitrarily.  It's
-best to avoid using `root' for USER if you can; but some servers, such
-as Telnet and FTP, read a username and password themselves.  These
-servers need to be root initially so they can log in as commanded by
-the data coming over the network.
-
-   PROGRAM together with ARGUMENTS specifies the command to run to
-start the server.  PROGRAM should be an absolute file name specifying
-the executable file to run.  ARGUMENTS consists of any number of
-whitespace-separated words, which become the command-line arguments of
-PROGRAM.  The first word in ARGUMENTS is argument zero, which should by
-convention be the program name itself (sans directories).
-
-   If you edit `/etc/inetd.conf', you can tell `inetd' to reread the
-file and obey its new contents by sending the `inetd' process the
-`SIGHUP' signal.  You'll have to use `ps' to determine the process ID
-of the `inetd' process as it is not fixed.
-
-
-File: libc.info,  Node: Socket Options,  Next: Networks Database,  Prev: Inetd,  Up: Sockets
-
-16.12 Socket Options
-====================
-
-This section describes how to read or set various options that modify
-the behavior of sockets and their underlying communications protocols.
-
-   When you are manipulating a socket option, you must specify which
-"level" the option pertains to.  This describes whether the option
-applies to the socket interface, or to a lower-level communications
-protocol interface.
-
-* Menu:
-
-* Socket Option Functions::     The basic functions for setting and getting
-                                 socket options.
-* Socket-Level Options::        Details of the options at the socket level.
-
-
-File: libc.info,  Node: Socket Option Functions,  Next: Socket-Level Options,  Up: Socket Options
-
-16.12.1 Socket Option Functions
--------------------------------
-
-Here are the functions for examining and modifying socket options.
-They are declared in `sys/socket.h'.
-
- -- Function: int getsockopt (int SOCKET, int LEVEL, int OPTNAME, void
-          *OPTVAL, socklen_t *OPTLEN-PTR)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `getsockopt' function gets information about the value of
-     option OPTNAME at level LEVEL for socket SOCKET.
-
-     The option value is stored in a buffer that OPTVAL points to.
-     Before the call, you should supply in `*OPTLEN-PTR' the size of
-     this buffer; on return, it contains the number of bytes of
-     information actually stored in the buffer.
-
-     Most options interpret the OPTVAL buffer as a single `int' value.
-
-     The actual return value of `getsockopt' is `0' on success and `-1'
-     on failure.  The following `errno' error conditions are defined:
-
-    `EBADF'
-          The SOCKET argument is not a valid file descriptor.
-
-    `ENOTSOCK'
-          The descriptor SOCKET is not a socket.
-
-    `ENOPROTOOPT'
-          The OPTNAME doesn't make sense for the given LEVEL.
-
- -- Function: int setsockopt (int SOCKET, int LEVEL, int OPTNAME, const
-          void *OPTVAL, socklen_t OPTLEN)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is used to set the socket option OPTNAME at level
-     LEVEL for socket SOCKET.  The value of the option is passed in the
-     buffer OPTVAL of size OPTLEN.
-
-     The return value and error codes for `setsockopt' are the same as
-     for `getsockopt'.
-
-
-
-File: libc.info,  Node: Socket-Level Options,  Prev: Socket Option Functions,  Up: Socket Options
-
-16.12.2 Socket-Level Options
-----------------------------
-
- -- Constant: int SOL_SOCKET
-     Use this constant as the LEVEL argument to `getsockopt' or
-     `setsockopt' to manipulate the socket-level options described in
-     this section.
-
-Here is a table of socket-level option names; all are defined in the
-header file `sys/socket.h'.
-
-`SO_DEBUG'
-     This option toggles recording of debugging information in the
-     underlying protocol modules.  The value has type `int'; a nonzero
-     value means "yes".
-
-`SO_REUSEADDR'
-     This option controls whether `bind' (*note Setting Address::)
-     should permit reuse of local addresses for this socket.  If you
-     enable this option, you can actually have two sockets with the
-     same Internet port number; but the system won't allow you to use
-     the two identically-named sockets in a way that would confuse the
-     Internet.  The reason for this option is that some higher-level
-     Internet protocols, including FTP, require you to keep reusing the
-     same port number.
-
-     The value has type `int'; a nonzero value means "yes".
-
-`SO_KEEPALIVE'
-     This option controls whether the underlying protocol should
-     periodically transmit messages on a connected socket.  If the peer
-     fails to respond to these messages, the connection is considered
-     broken.  The value has type `int'; a nonzero value means "yes".
-
-`SO_DONTROUTE'
-     This option controls whether outgoing messages bypass the normal
-     message routing facilities.  If set, messages are sent directly to
-     the network interface instead.  The value has type `int'; a nonzero
-     value means "yes".
-
-`SO_LINGER'
-     This option specifies what should happen when the socket of a type
-     that promises reliable delivery still has untransmitted messages
-     when it is closed; see *note Closing a Socket::.  The value has
-     type `struct linger'.
-
-      -- Data Type: struct linger
-          This structure type has the following members:
-
-         `int l_onoff'
-               This field is interpreted as a boolean.  If nonzero,
-               `close' blocks until the data are transmitted or the
-               timeout period has expired.
-
-         `int l_linger'
-               This specifies the timeout period, in seconds.
-
-`SO_BROADCAST'
-     This option controls whether datagrams may be broadcast from the
-     socket.  The value has type `int'; a nonzero value means "yes".
-
-`SO_OOBINLINE'
-     If this option is set, out-of-band data received on the socket is
-     placed in the normal input queue.  This permits it to be read using
-     `read' or `recv' without specifying the `MSG_OOB' flag.  *Note
-     Out-of-Band Data::.  The value has type `int'; a nonzero value
-     means "yes".
-
-`SO_SNDBUF'
-     This option gets or sets the size of the output buffer.  The value
-     is a `size_t', which is the size in bytes.
-
-`SO_RCVBUF'
-     This option gets or sets the size of the input buffer.  The value
-     is a `size_t', which is the size in bytes.
-
-`SO_STYLE'
-`SO_TYPE'
-     This option can be used with `getsockopt' only.  It is used to get
-     the socket's communication style.  `SO_TYPE' is the historical
-     name, and `SO_STYLE' is the preferred name in GNU.  The value has
-     type `int' and its value designates a communication style; see
-     *note Communication Styles::.
-
-`SO_ERROR'
-     This option can be used with `getsockopt' only.  It is used to
-     reset the error status of the socket.  The value is an `int',
-     which represents the previous error status.
-
-
-File: libc.info,  Node: Networks Database,  Prev: Socket Options,  Up: Sockets
-
-16.13 Networks Database
-=======================
-
-Many systems come with a database that records a list of networks known
-to the system developer.  This is usually kept either in the file
-`/etc/networks' or in an equivalent from a name server.  This data base
-is useful for routing programs such as `route', but it is not useful
-for programs that simply communicate over the network.  We provide
-functions to access this database, which are declared in `netdb.h'.
-
- -- Data Type: struct netent
-     This data type is used to represent information about entries in
-     the networks database.  It has the following members:
-
-    `char *n_name'
-          This is the "official" name of the network.
-
-    `char **n_aliases'
-          These are alternative names for the network, represented as a
-          vector of strings.  A null pointer terminates the array.
-
-    `int n_addrtype'
-          This is the type of the network number; this is always equal
-          to `AF_INET' for Internet networks.
-
-    `unsigned long int n_net'
-          This is the network number.  Network numbers are returned in
-          host byte order; see *note Byte Order::.
-
-   Use the `getnetbyname' or `getnetbyaddr' functions to search the
-networks database for information about a specific network.  The
-information is returned in a statically-allocated structure; you must
-copy the information if you need to save it.
-
- -- Function: struct netent * getnetbyname (const char *NAME)
-     Preliminary: | MT-Unsafe race:netbyname env locale | AS-Unsafe
-     dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note
-     POSIX Safety Concepts::.
-
-     The `getnetbyname' function returns information about the network
-     named NAME.  It returns a null pointer if there is no such network.
-
- -- Function: struct netent * getnetbyaddr (uint32_t NET, int TYPE)
-     Preliminary: | MT-Unsafe race:netbyaddr locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
-     Safety Concepts::.
-
-     The `getnetbyaddr' function returns information about the network
-     of type TYPE with number NET.  You should specify a value of
-     `AF_INET' for the TYPE argument for Internet networks.
-
-     `getnetbyaddr' returns a null pointer if there is no such network.
-
-   You can also scan the networks database using `setnetent',
-`getnetent' and `endnetent'.  Be careful when using these functions
-because they are not reentrant.
-
- -- Function: void setnetent (int STAYOPEN)
-     Preliminary: | MT-Unsafe race:netent env locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
-     Safety Concepts::.
-
-     This function opens and rewinds the networks database.
-
-     If the STAYOPEN argument is nonzero, this sets a flag so that
-     subsequent calls to `getnetbyname' or `getnetbyaddr' will not
-     close the database (as they usually would).  This makes for more
-     efficiency if you call those functions several times, by avoiding
-     reopening the database for each call.
-
- -- Function: struct netent * getnetent (void)
-     Preliminary: | MT-Unsafe race:netent race:netentbuf env locale |
-     AS-Unsafe dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem
-     | *Note POSIX Safety Concepts::.
-
-     This function returns the next entry in the networks database.  It
-     returns a null pointer if there are no more entries.
-
- -- Function: void endnetent (void)
-     Preliminary: | MT-Unsafe race:netent env locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
-     Safety Concepts::.
-
-     This function closes the networks database.
-
-
-File: libc.info,  Node: Low-Level Terminal Interface,  Next: Syslog,  Prev: Sockets,  Up: Top
-
-17 Low-Level Terminal Interface
-*******************************
-
-This chapter describes functions that are specific to terminal devices.
-You can use these functions to do things like turn off input echoing;
-set serial line characteristics such as line speed and flow control; and
-change which characters are used for end-of-file, command-line editing,
-sending signals, and similar control functions.
-
-   Most of the functions in this chapter operate on file descriptors.
-*Note Low-Level I/O::, for more information about what a file
-descriptor is and how to open a file descriptor for a terminal device.
-
-* Menu:
-
-* Is It a Terminal::            How to determine if a file is a terminal
-			         device, and what its name is.
-* I/O Queues::                  About flow control and typeahead.
-* Canonical or Not::            Two basic styles of input processing.
-* Terminal Modes::              How to examine and modify flags controlling
-			         details of terminal I/O: echoing,
-                                 signals, editing.  Posix.
-* BSD Terminal Modes::          BSD compatible terminal mode setting
-* Line Control::                Sending break sequences, clearing
-                                 terminal buffers ...
-* Noncanon Example::            How to read single characters without echo.
-* Pseudo-Terminals::            How to open a pseudo-terminal.
-
-
-File: libc.info,  Node: Is It a Terminal,  Next: I/O Queues,  Up: Low-Level Terminal Interface
-
-17.1 Identifying Terminals
-==========================
-
-The functions described in this chapter only work on files that
-correspond to terminal devices.  You can find out whether a file
-descriptor is associated with a terminal by using the `isatty' function.
-
-   Prototypes for the functions in this section are declared in the
-header file `unistd.h'.
-
- -- Function: int isatty (int FILEDES)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function returns `1' if FILEDES is a file descriptor
-     associated with an open terminal device, and 0 otherwise.
-
-   If a file descriptor is associated with a terminal, you can get its
-associated file name using the `ttyname' function.  See also the
-`ctermid' function, described in *note Identifying the Terminal::.
-
- -- Function: char * ttyname (int FILEDES)
-     Preliminary: | MT-Unsafe race:ttyname | AS-Unsafe heap lock |
-     AC-Unsafe lock fd mem | *Note POSIX Safety Concepts::.
-
-     If the file descriptor FILEDES is associated with a terminal
-     device, the `ttyname' function returns a pointer to a
-     statically-allocated, null-terminated string containing the file
-     name of the terminal file.  The value is a null pointer if the
-     file descriptor isn't associated with a terminal, or the file name
-     cannot be determined.
-
- -- Function: int ttyname_r (int FILEDES, char *BUF, size_t LEN)
-     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
-     POSIX Safety Concepts::.
-
-     The `ttyname_r' function is similar to the `ttyname' function
-     except that it places its result into the user-specified buffer
-     starting at BUF with length LEN.
-
-     The normal return value from `ttyname_r' is 0.  Otherwise an error
-     number is returned to indicate the error.  The following `errno'
-     error conditions are defined for this function:
-
-    `EBADF'
-          The FILEDES argument is not a valid file descriptor.
-
-    `ENOTTY'
-          The FILEDES is not associated with a terminal.
-
-    `ERANGE'
-          The buffer length LEN is too small to store the string to be
-          returned.
-
-
-File: libc.info,  Node: I/O Queues,  Next: Canonical or Not,  Prev: Is It a Terminal,  Up: Low-Level Terminal Interface
-
-17.2 I/O Queues
-===============
-
-Many of the remaining functions in this section refer to the input and
-output queues of a terminal device.  These queues implement a form of
-buffering _within the kernel_ independent of the buffering implemented
-by I/O streams (*note I/O on Streams::).
-
-   The "terminal input queue" is also sometimes referred to as its
-"typeahead buffer".  It holds the characters that have been received
-from the terminal but not yet read by any process.
-
-   The size of the input queue is described by the `MAX_INPUT' and
-`_POSIX_MAX_INPUT' parameters; see *note Limits for Files::.  You are
-guaranteed a queue size of at least `MAX_INPUT', but the queue might be
-larger, and might even dynamically change size.  If input flow control
-is enabled by setting the `IXOFF' input mode bit (*note Input Modes::),
-the terminal driver transmits STOP and START characters to the terminal
-when necessary to prevent the queue from overflowing.  Otherwise, input
-may be lost if it comes in too fast from the terminal.  In canonical
-mode, all input stays in the queue until a newline character is
-received, so the terminal input queue can fill up when you type a very
-long line.  *Note Canonical or Not::.
-
-   The "terminal output queue" is like the input queue, but for output;
-it contains characters that have been written by processes, but not yet
-transmitted to the terminal.  If output flow control is enabled by
-setting the `IXON' input mode bit (*note Input Modes::), the terminal
-driver obeys START and STOP characters sent by the terminal to stop and
-restart transmission of output.
-
-   "Clearing" the terminal input queue means discarding any characters
-that have been received but not yet read.  Similarly, clearing the
-terminal output queue means discarding any characters that have been
-written but not yet transmitted.
-
-
-File: libc.info,  Node: Canonical or Not,  Next: Terminal Modes,  Prev: I/O Queues,  Up: Low-Level Terminal Interface
-
-17.3 Two Styles of Input: Canonical or Not
-==========================================
-
-POSIX systems support two basic modes of input: canonical and
-noncanonical.
-
-   In "canonical input processing" mode, terminal input is processed in
-lines terminated by newline (`'\n''), EOF, or EOL characters.  No input
-can be read until an entire line has been typed by the user, and the
-`read' function (*note I/O Primitives::) returns at most a single line
-of input, no matter how many bytes are requested.
-
-   In canonical input mode, the operating system provides input editing
-facilities: some characters are interpreted specially to perform editing
-operations within the current line of text, such as ERASE and KILL.
-*Note Editing Characters::.
-
-   The constants `_POSIX_MAX_CANON' and `MAX_CANON' parameterize the
-maximum number of bytes which may appear in a single line of canonical
-input.  *Note Limits for Files::.  You are guaranteed a maximum line
-length of at least `MAX_CANON' bytes, but the maximum might be larger,
-and might even dynamically change size.
-
-   In "noncanonical input processing" mode, characters are not grouped
-into lines, and ERASE and KILL processing is not performed.  The
-granularity with which bytes are read in noncanonical input mode is
-controlled by the MIN and TIME settings.  *Note Noncanonical Input::.
-
-   Most programs use canonical input mode, because this gives the user a
-way to edit input line by line.  The usual reason to use noncanonical
-mode is when the program accepts single-character commands or provides
-its own editing facilities.
-
-   The choice of canonical or noncanonical input is controlled by the
-`ICANON' flag in the `c_lflag' member of `struct termios'.  *Note Local
-Modes::.
-
-
-File: libc.info,  Node: Terminal Modes,  Next: BSD Terminal Modes,  Prev: Canonical or Not,  Up: Low-Level Terminal Interface
-
-17.4 Terminal Modes
-===================
-
-This section describes the various terminal attributes that control how
-input and output are done.  The functions, data structures, and symbolic
-constants are all declared in the header file `termios.h'.
-
-   Don't confuse terminal attributes with file attributes.  A device
-special file which is associated with a terminal has file attributes as
-described in *note File Attributes::.  These are unrelated to the
-attributes of the terminal device itself, which are discussed in this
-section.
-
-* Menu:
-
-* Mode Data Types::             The data type `struct termios' and
-                                 related types.
-* Mode Functions::              Functions to read and set the terminal
-                                 attributes.
-* Setting Modes::               The right way to set terminal attributes
-                                 reliably.
-* Input Modes::                 Flags controlling low-level input handling.
-* Output Modes::                Flags controlling low-level output handling.
-* Control Modes::               Flags controlling serial port behavior.
-* Local Modes::                 Flags controlling high-level input handling.
-* Line Speed::                  How to read and set the terminal line speed.
-* Special Characters::          Characters that have special effects,
-			         and how to change them.
-* Noncanonical Input::          Controlling how long to wait for input.
-
-
-File: libc.info,  Node: Mode Data Types,  Next: Mode Functions,  Up: Terminal Modes
-
-17.4.1 Terminal Mode Data Types
--------------------------------
-
-The entire collection of attributes of a terminal is stored in a
-structure of type `struct termios'.  This structure is used with the
-functions `tcgetattr' and `tcsetattr' to read and set the attributes.
-
- -- Data Type: struct termios
-     Structure that records all the I/O attributes of a terminal.  The
-     structure includes at least the following members:
-
-    `tcflag_t c_iflag'
-          A bit mask specifying flags for input modes; see *note Input
-          Modes::.
-
-    `tcflag_t c_oflag'
-          A bit mask specifying flags for output modes; see *note
-          Output Modes::.
-
-    `tcflag_t c_cflag'
-          A bit mask specifying flags for control modes; see *note
-          Control Modes::.
-
-    `tcflag_t c_lflag'
-          A bit mask specifying flags for local modes; see *note Local
-          Modes::.
-
-    `cc_t c_cc[NCCS]'
-          An array specifying which characters are associated with
-          various control functions; see *note Special Characters::.
-
-     The `struct termios' structure also contains members which encode
-     input and output transmission speeds, but the representation is
-     not specified.  *Note Line Speed::, for how to examine and store
-     the speed values.
-
-   The following sections describe the details of the members of the
-`struct termios' structure.
-
- -- Data Type: tcflag_t
-     This is an unsigned integer type used to represent the various bit
-     masks for terminal flags.
-
- -- Data Type: cc_t
-     This is an unsigned integer type used to represent characters
-     associated with various terminal control functions.
-
- -- Macro: int NCCS
-     The value of this macro is the number of elements in the `c_cc'
-     array.
-
-
-File: libc.info,  Node: Mode Functions,  Next: Setting Modes,  Prev: Mode Data Types,  Up: Terminal Modes
-
-17.4.2 Terminal Mode Functions
-------------------------------
-
- -- Function: int tcgetattr (int FILEDES, struct termios *TERMIOS-P)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is used to examine the attributes of the terminal
-     device with file descriptor FILEDES.  The attributes are returned
-     in the structure that TERMIOS-P points to.
-
-     If successful, `tcgetattr' returns 0.  A return value of -1
-     indicates an error.  The following `errno' error conditions are
-     defined for this function:
-
-    `EBADF'
-          The FILEDES argument is not a valid file descriptor.
-
-    `ENOTTY'
-          The FILEDES is not associated with a terminal.
-
- -- Function: int tcsetattr (int FILEDES, int WHEN, const struct
-          termios *TERMIOS-P)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function sets the attributes of the terminal device with file
-     descriptor FILEDES.  The new attributes are taken from the
-     structure that TERMIOS-P points to.
-
-     The WHEN argument specifies how to deal with input and output
-     already queued.  It can be one of the following values:
-
-    `TCSANOW'
-          Make the change immediately.
-
-    `TCSADRAIN'
-          Make the change after waiting until all queued output has
-          been written.  You should usually use this option when
-          changing parameters that affect output.
-
-    `TCSAFLUSH'
-          This is like `TCSADRAIN', but also discards any queued input.
-
-    `TCSASOFT'
-          This is a flag bit that you can add to any of the above
-          alternatives.  Its meaning is to inhibit alteration of the
-          state of the terminal hardware.  It is a BSD extension; it is
-          only supported on BSD systems and GNU/Hurd systems.
-
-          Using `TCSASOFT' is exactly the same as setting the `CIGNORE'
-          bit in the `c_cflag' member of the structure TERMIOS-P points
-          to.  *Note Control Modes::, for a description of `CIGNORE'.
-
-     If this function is called from a background process on its
-     controlling terminal, normally all processes in the process group
-     are sent a `SIGTTOU' signal, in the same way as if the process
-     were trying to write to the terminal.  The exception is if the
-     calling process itself is ignoring or blocking `SIGTTOU' signals,
-     in which case the operation is performed and no signal is sent.
-     *Note Job Control::.
-
-     If successful, `tcsetattr' returns 0.  A return value of -1
-     indicates an error.  The following `errno' error conditions are
-     defined for this function:
-
-    `EBADF'
-          The FILEDES argument is not a valid file descriptor.
-
-    `ENOTTY'
-          The FILEDES is not associated with a terminal.
-
-    `EINVAL'
-          Either the value of the `when' argument is not valid, or
-          there is something wrong with the data in the TERMIOS-P
-          argument.
-
-Although `tcgetattr' and `tcsetattr' specify the terminal device with a
-file descriptor, the attributes are those of the terminal device itself
-and not of the file descriptor.  This means that the effects of
-changing terminal attributes are persistent; if another process opens
-the terminal file later on, it will see the changed attributes even
-though it doesn't have anything to do with the open file descriptor you
-originally specified in changing the attributes.
-
-   Similarly, if a single process has multiple or duplicated file
-descriptors for the same terminal device, changing the terminal
-attributes affects input and output to all of these file descriptors.
-This means, for example, that you can't open one file descriptor or
-stream to read from a terminal in the normal line-buffered, echoed
-mode; and simultaneously have another file descriptor for the same
-terminal that you use to read from it in single-character, non-echoed
-mode.  Instead, you have to explicitly switch the terminal back and
-forth between the two modes.
-
-
-File: libc.info,  Node: Setting Modes,  Next: Input Modes,  Prev: Mode Functions,  Up: Terminal Modes
-
-17.4.3 Setting Terminal Modes Properly
---------------------------------------
-
-When you set terminal modes, you should call `tcgetattr' first to get
-the current modes of the particular terminal device, modify only those
-modes that you are really interested in, and store the result with
-`tcsetattr'.
-
-   It's a bad idea to simply initialize a `struct termios' structure to
-a chosen set of attributes and pass it directly to `tcsetattr'.  Your
-program may be run years from now, on systems that support members not
-documented in this manual.  The way to avoid setting these members to
-unreasonable values is to avoid changing them.
-
-   What's more, different terminal devices may require different mode
-settings in order to function properly.  So you should avoid blindly
-copying attributes from one terminal device to another.
-
-   When a member contains a collection of independent flags, as the
-`c_iflag', `c_oflag' and `c_cflag' members do, even setting the entire
-member is a bad idea, because particular operating systems have their
-own flags.  Instead, you should start with the current value of the
-member and alter only the flags whose values matter in your program,
-leaving any other flags unchanged.
-
-   Here is an example of how to set one flag (`ISTRIP') in the `struct
-termios' structure while properly preserving all the other data in the
-structure:
-
-     int
-     set_istrip (int desc, int value)
-     {
-       struct termios settings;
-       int result;
-
-       result = tcgetattr (desc, &settings);
-       if (result < 0)
-         {
-           perror ("error in tcgetattr");
-           return 0;
-         }
-       settings.c_iflag &= ~ISTRIP;
-       if (value)
-         settings.c_iflag |= ISTRIP;
-       result = tcsetattr (desc, TCSANOW, &settings);
-       if (result < 0)
-         {
-           perror ("error in tcsetattr");
-           return 0;
-        }
-       return 1;
-     }
-
-
-File: libc.info,  Node: Input Modes,  Next: Output Modes,  Prev: Setting Modes,  Up: Terminal Modes
-
-17.4.4 Input Modes
-------------------
-
-This section describes the terminal attribute flags that control fairly
-low-level aspects of input processing: handling of parity errors, break
-signals, flow control, and <RET> and <LFD> characters.
-
-   All of these flags are bits in the `c_iflag' member of the `struct
-termios' structure.  The member is an integer, and you change flags
-using the operators `&', `|' and `^'.  Don't try to specify the entire
-value for `c_iflag'--instead, change only specific flags and leave the
-rest untouched (*note Setting Modes::).
-
- -- Macro: tcflag_t INPCK
-     If this bit is set, input parity checking is enabled.  If it is
-     not set, no checking at all is done for parity errors on input; the
-     characters are simply passed through to the application.
-
-     Parity checking on input processing is independent of whether
-     parity detection and generation on the underlying terminal
-     hardware is enabled; see *note Control Modes::.  For example, you
-     could clear the `INPCK' input mode flag and set the `PARENB'
-     control mode flag to ignore parity errors on input, but still
-     generate parity on output.
-
-     If this bit is set, what happens when a parity error is detected
-     depends on whether the `IGNPAR' or `PARMRK' bits are set.  If
-     neither of these bits are set, a byte with a parity error is
-     passed to the application as a `'\0'' character.
-
- -- Macro: tcflag_t IGNPAR
-     If this bit is set, any byte with a framing or parity error is
-     ignored.  This is only useful if `INPCK' is also set.
-
- -- Macro: tcflag_t PARMRK
-     If this bit is set, input bytes with parity or framing errors are
-     marked when passed to the program.  This bit is meaningful only
-     when `INPCK' is set and `IGNPAR' is not set.
-
-     The way erroneous bytes are marked is with two preceding bytes,
-     `377' and `0'.  Thus, the program actually reads three bytes for
-     one erroneous byte received from the terminal.
-
-     If a valid byte has the value `0377', and `ISTRIP' (see below) is
-     not set, the program might confuse it with the prefix that marks a
-     parity error.  So a valid byte `0377' is passed to the program as
-     two bytes, `0377' `0377', in this case.
-
- -- Macro: tcflag_t ISTRIP
-     If this bit is set, valid input bytes are stripped to seven bits;
-     otherwise, all eight bits are available for programs to read.
-
- -- Macro: tcflag_t IGNBRK
-     If this bit is set, break conditions are ignored.
-
-     A "break condition" is defined in the context of asynchronous
-     serial data transmission as a series of zero-value bits longer
-     than a single byte.
-
- -- Macro: tcflag_t BRKINT
-     If this bit is set and `IGNBRK' is not set, a break condition
-     clears the terminal input and output queues and raises a `SIGINT'
-     signal for the foreground process group associated with the
-     terminal.
-
-     If neither `BRKINT' nor `IGNBRK' are set, a break condition is
-     passed to the application as a single `'\0'' character if `PARMRK'
-     is not set, or otherwise as a three-character sequence `'\377'',
-     `'\0'', `'\0''.
-
- -- Macro: tcflag_t IGNCR
-     If this bit is set, carriage return characters (`'\r'') are
-     discarded on input.  Discarding carriage return may be useful on
-     terminals that send both carriage return and linefeed when you
-     type the <RET> key.
-
- -- Macro: tcflag_t ICRNL
-     If this bit is set and `IGNCR' is not set, carriage return
-     characters (`'\r'') received as input are passed to the
-     application as newline characters (`'\n'').
-
- -- Macro: tcflag_t INLCR
-     If this bit is set, newline characters (`'\n'') received as input
-     are passed to the application as carriage return characters
-     (`'\r'').
-
- -- Macro: tcflag_t IXOFF
-     If this bit is set, start/stop control on input is enabled.  In
-     other words, the computer sends STOP and START characters as
-     necessary to prevent input from coming in faster than programs are
-     reading it.  The idea is that the actual terminal hardware that is
-     generating the input data responds to a STOP character by
-     suspending transmission, and to a START character by resuming
-     transmission.  *Note Start/Stop Characters::.
-
- -- Macro: tcflag_t IXON
-     If this bit is set, start/stop control on output is enabled.  In
-     other words, if the computer receives a STOP character, it
-     suspends output until a START character is received.  In this
-     case, the STOP and START characters are never passed to the
-     application program.  If this bit is not set, then START and STOP
-     can be read as ordinary characters.  *Note Start/Stop Characters::.
-
- -- Macro: tcflag_t IXANY
-     If this bit is set, any input character restarts output when
-     output has been suspended with the STOP character.  Otherwise,
-     only the START character restarts output.
-
-     This is a BSD extension; it exists only on BSD systems and
-     GNU/Linux and GNU/Hurd systems.
-
- -- Macro: tcflag_t IMAXBEL
-     If this bit is set, then filling up the terminal input buffer
-     sends a BEL character (code `007') to the terminal to ring the
-     bell.
-
-     This is a BSD extension.
-
-
-File: libc.info,  Node: Output Modes,  Next: Control Modes,  Prev: Input Modes,  Up: Terminal Modes
-
-17.4.5 Output Modes
--------------------
-
-This section describes the terminal flags and fields that control how
-output characters are translated and padded for display.  All of these
-are contained in the `c_oflag' member of the `struct termios' structure.
-
-   The `c_oflag' member itself is an integer, and you change the flags
-and fields using the operators `&', `|', and `^'.  Don't try to specify
-the entire value for `c_oflag'--instead, change only specific flags and
-leave the rest untouched (*note Setting Modes::).
-
- -- Macro: tcflag_t OPOST
-     If this bit is set, output data is processed in some unspecified
-     way so that it is displayed appropriately on the terminal device.
-     This typically includes mapping newline characters (`'\n'') onto
-     carriage return and linefeed pairs.
-
-     If this bit isn't set, the characters are transmitted as-is.
-
-   The following three bits are effective only if `OPOST' is set.
-
- -- Macro: tcflag_t ONLCR
-     If this bit is set, convert the newline character on output into a
-     pair of characters, carriage return followed by linefeed.
-
- -- Macro: tcflag_t OXTABS
-     If this bit is set, convert tab characters on output into the
-     appropriate number of spaces to emulate a tab stop every eight
-     columns.  This bit exists only on BSD systems and GNU/Hurd
-     systems; on GNU/Linux systems it is available as `XTABS'.
-
- -- Macro: tcflag_t ONOEOT
-     If this bit is set, discard `C-d' characters (code `004') on
-     output.  These characters cause many dial-up terminals to
-     disconnect.  This bit exists only on BSD systems and GNU/Hurd
-     systems.
-
-
-File: libc.info,  Node: Control Modes,  Next: Local Modes,  Prev: Output Modes,  Up: Terminal Modes
-
-17.4.6 Control Modes
---------------------
-
-This section describes the terminal flags and fields that control
-parameters usually associated with asynchronous serial data
-transmission.  These flags may not make sense for other kinds of
-terminal ports (such as a network connection pseudo-terminal).  All of
-these are contained in the `c_cflag' member of the `struct termios'
-structure.
-
-   The `c_cflag' member itself is an integer, and you change the flags
-and fields using the operators `&', `|', and `^'.  Don't try to specify
-the entire value for `c_cflag'--instead, change only specific flags and
-leave the rest untouched (*note Setting Modes::).
-
- -- Macro: tcflag_t CLOCAL
-     If this bit is set, it indicates that the terminal is connected
-     "locally" and that the modem status lines (such as carrier detect)
-     should be ignored.  
-
-     On many systems if this bit is not set and you call `open' without
-     the `O_NONBLOCK' flag set, `open' blocks until a modem connection
-     is established.
-
-     If this bit is not set and a modem disconnect is detected, a
-     `SIGHUP' signal is sent to the controlling process group for the
-     terminal (if it has one).  Normally, this causes the process to
-     exit; see *note Signal Handling::.  Reading from the terminal
-     after a disconnect causes an end-of-file condition, and writing
-     causes an `EIO' error to be returned.  The terminal device must be
-     closed and reopened to clear the condition.  
-
- -- Macro: tcflag_t HUPCL
-     If this bit is set, a modem disconnect is generated when all
-     processes that have the terminal device open have either closed
-     the file or exited.
-
- -- Macro: tcflag_t CREAD
-     If this bit is set, input can be read from the terminal.
-     Otherwise, input is discarded when it arrives.
-
- -- Macro: tcflag_t CSTOPB
-     If this bit is set, two stop bits are used.  Otherwise, only one
-     stop bit is used.
-
- -- Macro: tcflag_t PARENB
-     If this bit is set, generation and detection of a parity bit are
-     enabled.  *Note Input Modes::, for information on how input parity
-     errors are handled.
-
-     If this bit is not set, no parity bit is added to output
-     characters, and input characters are not checked for correct
-     parity.
-
- -- Macro: tcflag_t PARODD
-     This bit is only useful if `PARENB' is set.  If `PARODD' is set,
-     odd parity is used, otherwise even parity is used.
-
-   The control mode flags also includes a field for the number of bits
-per character.  You can use the `CSIZE' macro as a mask to extract the
-value, like this: `settings.c_cflag & CSIZE'.
-
- -- Macro: tcflag_t CSIZE
-     This is a mask for the number of bits per character.
-
- -- Macro: tcflag_t CS5
-     This specifies five bits per byte.
-
- -- Macro: tcflag_t CS6
-     This specifies six bits per byte.
-
- -- Macro: tcflag_t CS7
-     This specifies seven bits per byte.
-
- -- Macro: tcflag_t CS8
-     This specifies eight bits per byte.
-
-   The following four bits are BSD extensions; these exist only on BSD
-systems and GNU/Hurd systems.
-
- -- Macro: tcflag_t CCTS_OFLOW
-     If this bit is set, enable flow control of output based on the CTS
-     wire (RS232 protocol).
-
- -- Macro: tcflag_t CRTS_IFLOW
-     If this bit is set, enable flow control of input based on the RTS
-     wire (RS232 protocol).
-
- -- Macro: tcflag_t MDMBUF
-     If this bit is set, enable carrier-based flow control of output.
-
- -- Macro: tcflag_t CIGNORE
-     If this bit is set, it says to ignore the control modes and line
-     speed values entirely.  This is only meaningful in a call to
-     `tcsetattr'.
-
-     The `c_cflag' member and the line speed values returned by
-     `cfgetispeed' and `cfgetospeed' will be unaffected by the call.
-     `CIGNORE' is useful if you want to set all the software modes in
-     the other members, but leave the hardware details in `c_cflag'
-     unchanged.  (This is how the `TCSASOFT' flag to `tcsettattr'
-     works.)
-
-     This bit is never set in the structure filled in by `tcgetattr'.
-
-
-File: libc.info,  Node: Local Modes,  Next: Line Speed,  Prev: Control Modes,  Up: Terminal Modes
-
-17.4.7 Local Modes
-------------------
-
-This section describes the flags for the `c_lflag' member of the
-`struct termios' structure.  These flags generally control higher-level
-aspects of input processing than the input modes flags described in
-*note Input Modes::, such as echoing, signals, and the choice of
-canonical or noncanonical input.
-
-   The `c_lflag' member itself is an integer, and you change the flags
-and fields using the operators `&', `|', and `^'.  Don't try to specify
-the entire value for `c_lflag'--instead, change only specific flags and
-leave the rest untouched (*note Setting Modes::).
-
- -- Macro: tcflag_t ICANON
-     This bit, if set, enables canonical input processing mode.
-     Otherwise, input is processed in noncanonical mode.  *Note
-     Canonical or Not::.
-
- -- Macro: tcflag_t ECHO
-     If this bit is set, echoing of input characters back to the
-     terminal is enabled.  
-
- -- Macro: tcflag_t ECHOE
-     If this bit is set, echoing indicates erasure of input with the
-     ERASE character by erasing the last character in the current line
-     from the screen.  Otherwise, the character erased is re-echoed to
-     show what has happened (suitable for a printing terminal).
-
-     This bit only controls the display behavior; the `ICANON' bit by
-     itself controls actual recognition of the ERASE character and
-     erasure of input, without which `ECHOE' is simply irrelevant.
-
- -- Macro: tcflag_t ECHOPRT
-     This bit is like `ECHOE', enables display of the ERASE character in
-     a way that is geared to a hardcopy terminal.  When you type the
-     ERASE character, a `\' character is printed followed by the first
-     character erased.  Typing the ERASE character again just prints
-     the next character erased.  Then, the next time you type a normal
-     character, a `/' character is printed before the character echoes.
-
-     This is a BSD extension, and exists only in BSD systems and
-     GNU/Linux and GNU/Hurd systems.
-
- -- Macro: tcflag_t ECHOK
-     This bit enables special display of the KILL character by moving
-     to a new line after echoing the KILL character normally.  The
-     behavior of `ECHOKE' (below) is nicer to look at.
-
-     If this bit is not set, the KILL character echoes just as it would
-     if it were not the KILL character.  Then it is up to the user to
-     remember that the KILL character has erased the preceding input;
-     there is no indication of this on the screen.
-
-     This bit only controls the display behavior; the `ICANON' bit by
-     itself controls actual recognition of the KILL character and
-     erasure of input, without which `ECHOK' is simply irrelevant.
-
- -- Macro: tcflag_t ECHOKE
-     This bit is similar to `ECHOK'.  It enables special display of the
-     KILL character by erasing on the screen the entire line that has
-     been killed.  This is a BSD extension, and exists only in BSD
-     systems and GNU/Linux and GNU/Hurd systems.
-
- -- Macro: tcflag_t ECHONL
-     If this bit is set and the `ICANON' bit is also set, then the
-     newline (`'\n'') character is echoed even if the `ECHO' bit is not
-     set.
-
- -- Macro: tcflag_t ECHOCTL
-     If this bit is set and the `ECHO' bit is also set, echo control
-     characters with `^' followed by the corresponding text character.
-     Thus, control-A echoes as `^A'.  This is usually the preferred mode
-     for interactive input, because echoing a control character back to
-     the terminal could have some undesired effect on the terminal.
-
-     This is a BSD extension, and exists only in BSD systems and
-     GNU/Linux and GNU/Hurd systems.
-
- -- Macro: tcflag_t ISIG
-     This bit controls whether the INTR, QUIT, and SUSP characters are
-     recognized.  The functions associated with these characters are
-     performed if and only if this bit is set.  Being in canonical or
-     noncanonical input mode has no affect on the interpretation of
-     these characters.
-
-     You should use caution when disabling recognition of these
-     characters.  Programs that cannot be interrupted interactively are
-     very user-unfriendly.  If you clear this bit, your program should
-     provide some alternate interface that allows the user to
-     interactively send the signals associated with these characters,
-     or to escape from the program.  
-
-     *Note Signal Characters::.
-
- -- Macro: tcflag_t IEXTEN
-     POSIX.1 gives `IEXTEN' implementation-defined meaning, so you
-     cannot rely on this interpretation on all systems.
-
-     On BSD systems and GNU/Linux and GNU/Hurd systems, it enables the
-     LNEXT and DISCARD characters.  *Note Other Special::.
-
- -- Macro: tcflag_t NOFLSH
-     Normally, the INTR, QUIT, and SUSP characters cause input and
-     output queues for the terminal to be cleared.  If this bit is set,
-     the queues are not cleared.
-
- -- Macro: tcflag_t TOSTOP
-     If this bit is set and the system supports job control, then
-     `SIGTTOU' signals are generated by background processes that
-     attempt to write to the terminal.  *Note Access to the Terminal::.
-
-   The following bits are BSD extensions; they exist only on BSD systems
-and GNU/Hurd systems.
-
- -- Macro: tcflag_t ALTWERASE
-     This bit determines how far the WERASE character should erase.  The
-     WERASE character erases back to the beginning of a word; the
-     question is, where do words begin?
-
-     If this bit is clear, then the beginning of a word is a
-     nonwhitespace character following a whitespace character.  If the
-     bit is set, then the beginning of a word is an alphanumeric
-     character or underscore following a character which is none of
-     those.
-
-     *Note Editing Characters::, for more information about the WERASE
-     character.
-
- -- Macro: tcflag_t FLUSHO
-     This is the bit that toggles when the user types the DISCARD
-     character.  While this bit is set, all output is discarded.  *Note
-     Other Special::.
-
- -- Macro: tcflag_t NOKERNINFO
-     Setting this bit disables handling of the STATUS character.  *Note
-     Other Special::.
-
- -- Macro: tcflag_t PENDIN
-     If this bit is set, it indicates that there is a line of input that
-     needs to be reprinted.  Typing the REPRINT character sets this
-     bit; the bit remains set until reprinting is finished.  *Note
-     Editing Characters::.
-
-
-File: libc.info,  Node: Line Speed,  Next: Special Characters,  Prev: Local Modes,  Up: Terminal Modes
-
-17.4.8 Line Speed
------------------
-
-The terminal line speed tells the computer how fast to read and write
-data on the terminal.
-
-   If the terminal is connected to a real serial line, the terminal
-speed you specify actually controls the line--if it doesn't match the
-terminal's own idea of the speed, communication does not work.  Real
-serial ports accept only certain standard speeds.  Also, particular
-hardware may not support even all the standard speeds.  Specifying a
-speed of zero hangs up a dialup connection and turns off modem control
-signals.
-
-   If the terminal is not a real serial line (for example, if it is a
-network connection), then the line speed won't really affect data
-transmission speed, but some programs will use it to determine the
-amount of padding needed.  It's best to specify a line speed value that
-matches the actual speed of the actual terminal, but you can safely
-experiment with different values to vary the amount of padding.
-
-   There are actually two line speeds for each terminal, one for input
-and one for output.  You can set them independently, but most often
-terminals use the same speed for both directions.
-
-   The speed values are stored in the `struct termios' structure, but
-don't try to access them in the `struct termios' structure directly.
-Instead, you should use the following functions to read and store them:
-
- -- Function: speed_t cfgetospeed (const struct termios *TERMIOS-P)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function returns the output line speed stored in the structure
-     `*TERMIOS-P'.
-
- -- Function: speed_t cfgetispeed (const struct termios *TERMIOS-P)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function returns the input line speed stored in the structure
-     `*TERMIOS-P'.
-
- -- Function: int cfsetospeed (struct termios *TERMIOS-P, speed_t SPEED)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function stores SPEED in `*TERMIOS-P' as the output speed.
-     The normal return value is 0; a value of -1 indicates an error.
-     If SPEED is not a speed, `cfsetospeed' returns -1.
-
- -- Function: int cfsetispeed (struct termios *TERMIOS-P, speed_t SPEED)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function stores SPEED in `*TERMIOS-P' as the input speed.
-     The normal return value is 0; a value of -1 indicates an error.
-     If SPEED is not a speed, `cfsetospeed' returns -1.
-
- -- Function: int cfsetspeed (struct termios *TERMIOS-P, speed_t SPEED)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function stores SPEED in `*TERMIOS-P' as both the input and
-     output speeds.  The normal return value is 0; a value of -1
-     indicates an error.  If SPEED is not a speed, `cfsetspeed' returns
-     -1.  This function is an extension in 4.4 BSD.
-
- -- Data Type: speed_t
-     The `speed_t' type is an unsigned integer data type used to
-     represent line speeds.
-
-   The functions `cfsetospeed' and `cfsetispeed' report errors only for
-speed values that the system simply cannot handle.  If you specify a
-speed value that is basically acceptable, then those functions will
-succeed.  But they do not check that a particular hardware device can
-actually support the specified speeds--in fact, they don't know which
-device you plan to set the speed for.  If you use `tcsetattr' to set
-the speed of a particular device to a value that it cannot handle,
-`tcsetattr' returns -1.
-
-   *Portability note:* In the GNU C Library, the functions above accept
-speeds measured in bits per second as input, and return speed values
-measured in bits per second.  Other libraries require speeds to be
-indicated by special codes.  For POSIX.1 portability, you must use one
-of the following symbols to represent the speed; their precise numeric
-values are system-dependent, but each name has a fixed meaning: `B110'
-stands for 110 bps, `B300' for 300 bps, and so on.  There is no
-portable way to represent any speed but these, but these are the only
-speeds that typical serial lines can support.
-
-     B0  B50  B75  B110  B134  B150  B200
-     B300  B600  B1200  B1800  B2400  B4800
-     B9600  B19200  B38400  B57600  B115200
-     B230400  B460800
-
-   BSD defines two additional speed symbols as aliases: `EXTA' is an
-alias for `B19200' and `EXTB' is an alias for `B38400'.  These aliases
-are obsolete.
-
-
-File: libc.info,  Node: Special Characters,  Next: Noncanonical Input,  Prev: Line Speed,  Up: Terminal Modes
-
-17.4.9 Special Characters
--------------------------
-
-In canonical input, the terminal driver recognizes a number of special
-characters which perform various control functions.  These include the
-ERASE character (usually <DEL>) for editing input, and other editing
-characters.  The INTR character (normally `C-c') for sending a `SIGINT'
-signal, and other signal-raising characters, may be available in either
-canonical or noncanonical input mode.  All these characters are
-described in this section.
-
-   The particular characters used are specified in the `c_cc' member of
-the `struct termios' structure.  This member is an array; each element
-specifies the character for a particular role.  Each element has a
-symbolic constant that stands for the index of that element--for
-example, `VINTR' is the index of the element that specifies the INTR
-character, so storing `'='' in `TERMIOS.c_cc[VINTR]' specifies `=' as
-the INTR character.
-
-   On some systems, you can disable a particular special character
-function by specifying the value `_POSIX_VDISABLE' for that role.  This
-value is unequal to any possible character code.  *Note Options for
-Files::, for more information about how to tell whether the operating
-system you are using supports `_POSIX_VDISABLE'.
-
-* Menu:
-
-* Editing Characters::          Special characters that terminate lines and
-                                  delete text, and other editing functions.
-* Signal Characters::           Special characters that send or raise signals
-                                  to or for certain classes of processes.
-* Start/Stop Characters::       Special characters that suspend or resume
-                                  suspended output.
-* Other Special::		Other special characters for BSD systems:
-				  they can discard output, and print status.
-
-
-File: libc.info,  Node: Editing Characters,  Next: Signal Characters,  Up: Special Characters
-
-17.4.9.1 Characters for Input Editing
-.....................................
-
-These special characters are active only in canonical input mode.
-*Note Canonical or Not::.
-
- -- Macro: int VEOF
-     This is the subscript for the EOF character in the special control
-     character array.  `TERMIOS.c_cc[VEOF]' holds the character itself.
-
-     The EOF character is recognized only in canonical input mode.  It
-     acts as a line terminator in the same way as a newline character,
-     but if the EOF character is typed at the beginning of a line it
-     causes `read' to return a byte count of zero, indicating
-     end-of-file.  The EOF character itself is discarded.
-
-     Usually, the EOF character is `C-d'.
-
- -- Macro: int VEOL
-     This is the subscript for the EOL character in the special control
-     character array.  `TERMIOS.c_cc[VEOL]' holds the character itself.
-
-     The EOL character is recognized only in canonical input mode.  It
-     acts as a line terminator, just like a newline character.  The EOL
-     character is not discarded; it is read as the last character in
-     the input line.
-
-     You don't need to use the EOL character to make <RET> end a line.
-     Just set the ICRNL flag.  In fact, this is the default state of
-     affairs.
-
- -- Macro: int VEOL2
-     This is the subscript for the EOL2 character in the special control
-     character array.  `TERMIOS.c_cc[VEOL2]' holds the character itself.
-
-     The EOL2 character works just like the EOL character (see above),
-     but it can be a different character.  Thus, you can specify two
-     characters to terminate an input line, by setting EOL to one of
-     them and EOL2 to the other.
-
-     The EOL2 character is a BSD extension; it exists only on BSD
-     systems and GNU/Linux and GNU/Hurd systems.
-
- -- Macro: int VERASE
-     This is the subscript for the ERASE character in the special
-     control character array.  `TERMIOS.c_cc[VERASE]' holds the
-     character itself.
-
-     The ERASE character is recognized only in canonical input mode.
-     When the user types the erase character, the previous character
-     typed is discarded.  (If the terminal generates multibyte
-     character sequences, this may cause more than one byte of input to
-     be discarded.)  This cannot be used to erase past the beginning of
-     the current line of text.  The ERASE character itself is discarded.
-
-     Usually, the ERASE character is <DEL>.
-
- -- Macro: int VWERASE
-     This is the subscript for the WERASE character in the special
-     control character array.  `TERMIOS.c_cc[VWERASE]' holds the
-     character itself.
-
-     The WERASE character is recognized only in canonical mode.  It
-     erases an entire word of prior input, and any whitespace after it;
-     whitespace characters before the word are not erased.
-
-     The definition of a "word" depends on the setting of the
-     `ALTWERASE' mode; *note Local Modes::.
-
-     If the `ALTWERASE' mode is not set, a word is defined as a sequence
-     of any characters except space or tab.
-
-     If the `ALTWERASE' mode is set, a word is defined as a sequence of
-     characters containing only letters, numbers, and underscores,
-     optionally followed by one character that is not a letter, number,
-     or underscore.
-
-     The WERASE character is usually `C-w'.
-
-     This is a BSD extension.
-
- -- Macro: int VKILL
-     This is the subscript for the KILL character in the special control
-     character array.  `TERMIOS.c_cc[VKILL]' holds the character itself.
-
-     The KILL character is recognized only in canonical input mode.
-     When the user types the kill character, the entire contents of the
-     current line of input are discarded.  The kill character itself is
-     discarded too.
-
-     The KILL character is usually `C-u'.
-
- -- Macro: int VREPRINT
-     This is the subscript for the REPRINT character in the special
-     control character array.  `TERMIOS.c_cc[VREPRINT]' holds the
-     character itself.
-
-     The REPRINT character is recognized only in canonical mode.  It
-     reprints the current input line.  If some asynchronous output has
-     come while you are typing, this lets you see the line you are
-     typing clearly again.
-
-     The REPRINT character is usually `C-r'.
-
-     This is a BSD extension.
-
-
-File: libc.info,  Node: Signal Characters,  Next: Start/Stop Characters,  Prev: Editing Characters,  Up: Special Characters
-
-17.4.9.2 Characters that Cause Signals
+12.21.2.2 Custom Stream Hook Functions
 ......................................
 
-These special characters may be active in either canonical or
-noncanonical input mode, but only when the `ISIG' flag is set (*note
-Local Modes::).
+Here are more details on how you should define the four hook functions
+that a custom stream needs.
 
- -- Macro: int VINTR
-     This is the subscript for the INTR character in the special control
-     character array.  `TERMIOS.c_cc[VINTR]' holds the character itself.
+   You should define the function to read data from the cookie as:
 
-     The INTR (interrupt) character raises a `SIGINT' signal for all
-     processes in the foreground job associated with the terminal.  The
-     INTR character itself is then discarded.  *Note Signal Handling::,
-     for more information about signals.
+     ssize_t READER (void *COOKIE, char *BUFFER, size_t SIZE)
 
-     Typically, the INTR character is `C-c'.
+   This is very similar to the 'read' function; see *note I/O
+Primitives::.  Your function should transfer up to SIZE bytes into the
+BUFFER, and return the number of bytes read, or zero to indicate
+end-of-file.  You can return a value of '-1' to indicate an error.
 
- -- Macro: int VQUIT
-     This is the subscript for the QUIT character in the special control
-     character array.  `TERMIOS.c_cc[VQUIT]' holds the character itself.
+   You should define the function to write data to the cookie as:
 
-     The QUIT character raises a `SIGQUIT' signal for all processes in
-     the foreground job associated with the terminal.  The QUIT
-     character itself is then discarded.  *Note Signal Handling::, for
-     more information about signals.
+     ssize_t WRITER (void *COOKIE, const char *BUFFER, size_t SIZE)
 
-     Typically, the QUIT character is `C-\'.
+   This is very similar to the 'write' function; see *note I/O
+Primitives::.  Your function should transfer up to SIZE bytes from the
+buffer, and return the number of bytes written.  You can return a value
+of '0' to indicate an error.  You must not return any negative value.
 
- -- Macro: int VSUSP
-     This is the subscript for the SUSP character in the special control
-     character array.  `TERMIOS.c_cc[VSUSP]' holds the character itself.
+   You should define the function to perform seek operations on the
+cookie as:
 
-     The SUSP (suspend) character is recognized only if the
-     implementation supports job control (*note Job Control::).  It
-     causes a `SIGTSTP' signal to be sent to all processes in the
-     foreground job associated with the terminal.  The SUSP character
-     itself is then discarded.  *Note Signal Handling::, for more
-     information about signals.
+     int SEEKER (void *COOKIE, off64_t *POSITION, int WHENCE)
 
-     Typically, the SUSP character is `C-z'.
+   For this function, the POSITION and WHENCE arguments are interpreted
+as for 'fgetpos'; see *note Portable Positioning::.
 
-   Few applications disable the normal interpretation of the SUSP
-character.  If your program does this, it should provide some other
-mechanism for the user to stop the job.  When the user invokes this
-mechanism, the program should send a `SIGTSTP' signal to the process
-group of the process, not just to the process itself.  *Note Signaling
-Another Process::.
+   After doing the seek operation, your function should store the
+resulting file position relative to the beginning of the file in
+POSITION.  Your function should return a value of '0' on success and
+'-1' to indicate an error.
 
- -- Macro: int VDSUSP
-     This is the subscript for the DSUSP character in the special
-     control character array.  `TERMIOS.c_cc[VDSUSP]' holds the
-     character itself.
+   You should define the function to do cleanup operations on the cookie
+appropriate for closing the stream as:
 
-     The DSUSP (suspend) character is recognized only if the
-     implementation supports job control (*note Job Control::).  It
-     sends a `SIGTSTP' signal, like the SUSP character, but not right
-     away--only when the program tries to read it as input.  Not all
-     systems with job control support DSUSP; only BSD-compatible
-     systems (including GNU/Hurd systems).
+     int CLEANER (void *COOKIE)
 
-     *Note Signal Handling::, for more information about signals.
+   Your function should return '-1' to indicate an error, and '0'
+otherwise.
 
-     Typically, the DSUSP character is `C-y'.
+ -- Data Type: cookie_read_function
+     This is the data type that the read function for a custom stream
+     should have.  If you declare the function as shown above, this is
+     the type it will have.
+
+ -- Data Type: cookie_write_function
+     The data type of the write function for a custom stream.
+
+ -- Data Type: cookie_seek_function
+     The data type of the seek function for a custom stream.
+
+ -- Data Type: cookie_close_function
+     The data type of the close function for a custom stream.
 
 
-File: libc.info,  Node: Start/Stop Characters,  Next: Other Special,  Prev: Signal Characters,  Up: Special Characters
+File: libc.info,  Node: Formatted Messages,  Prev: Other Kinds of Streams,  Up: I/O on Streams
 
-17.4.9.3 Special Characters for Flow Control
-............................................
+12.22 Formatted Messages
+========================
 
-These special characters may be active in either canonical or
-noncanonical input mode, but their use is controlled by the flags
-`IXON' and `IXOFF' (*note Input Modes::).
+On systems which are based on System V messages of programs (especially
+the system tools) are printed in a strict form using the 'fmtmsg'
+function.  The uniformity sometimes helps the user to interpret messages
+and the strictness tests of the 'fmtmsg' function ensure that the
+programmer follows some minimal requirements.
 
- -- Macro: int VSTART
-     This is the subscript for the START character in the special
-     control character array.  `TERMIOS.c_cc[VSTART]' holds the
-     character itself.
+* Menu:
 
-     The START character is used to support the `IXON' and `IXOFF'
-     input modes.  If `IXON' is set, receiving a START character resumes
-     suspended output; the START character itself is discarded.  If
-     `IXANY' is set, receiving any character at all resumes suspended
-     output; the resuming character is not discarded unless it is the
-     START character.  `IXOFF' is set, the system may also transmit
-     START characters to the terminal.
-
-     The usual value for the START character is `C-q'.  You may not be
-     able to change this value--the hardware may insist on using `C-q'
-     regardless of what you specify.
-
- -- Macro: int VSTOP
-     This is the subscript for the STOP character in the special control
-     character array.  `TERMIOS.c_cc[VSTOP]' holds the character itself.
-
-     The STOP character is used to support the `IXON' and `IXOFF' input
-     modes.  If `IXON' is set, receiving a STOP character causes output
-     to be suspended; the STOP character itself is discarded.  If
-     `IXOFF' is set, the system may also transmit STOP characters to the
-     terminal, to prevent the input queue from overflowing.
-
-     The usual value for the STOP character is `C-s'.  You may not be
-     able to change this value--the hardware may insist on using `C-s'
-     regardless of what you specify.
+* Printing Formatted Messages::   The 'fmtmsg' function.
+* Adding Severity Classes::       Add more severity classes.
+* Example::                       How to use 'fmtmsg' and 'addseverity'.
 
 
-File: libc.info,  Node: Other Special,  Prev: Start/Stop Characters,  Up: Special Characters
+File: libc.info,  Node: Printing Formatted Messages,  Next: Adding Severity Classes,  Up: Formatted Messages
 
-17.4.9.4 Other Special Characters
-.................................
+12.22.1 Printing Formatted Messages
+-----------------------------------
 
- -- Macro: int VLNEXT
-     This is the subscript for the LNEXT character in the special
-     control character array.  `TERMIOS.c_cc[VLNEXT]' holds the
-     character itself.
+Messages can be printed to standard error and/or to the console.  To
+select the destination the programmer can use the following two values,
+bitwise OR combined if wanted, for the CLASSIFICATION parameter of
+'fmtmsg':
 
-     The LNEXT character is recognized only when `IEXTEN' is set, but in
-     both canonical and noncanonical mode.  It disables any special
-     significance of the next character the user types.  Even if the
-     character would normally perform some editing function or generate
-     a signal, it is read as a plain character.  This is the analogue
-     of the `C-q' command in Emacs.  "LNEXT" stands for "literal next."
+'MM_PRINT'
+     Display the message in standard error.
+'MM_CONSOLE'
+     Display the message on the system console.
 
-     The LNEXT character is usually `C-v'.
+   The erroneous piece of the system can be signalled by exactly one of
+the following values which also is bitwise ORed with the CLASSIFICATION
+parameter to 'fmtmsg':
 
-     This character is available on BSD systems and GNU/Linux and
-     GNU/Hurd systems.
+'MM_HARD'
+     The source of the condition is some hardware.
+'MM_SOFT'
+     The source of the condition is some software.
+'MM_FIRM'
+     The source of the condition is some firmware.
 
- -- Macro: int VDISCARD
-     This is the subscript for the DISCARD character in the special
-     control character array.  `TERMIOS.c_cc[VDISCARD]' holds the
-     character itself.
+   A third component of the CLASSIFICATION parameter to 'fmtmsg' can
+describe the part of the system which detects the problem.  This is done
+by using exactly one of the following values:
 
-     The DISCARD character is recognized only when `IEXTEN' is set, but
-     in both canonical and noncanonical mode.  Its effect is to toggle
-     the discard-output flag.  When this flag is set, all program
-     output is discarded.  Setting the flag also discards all output
-     currently in the output buffer.  Typing any other character resets
-     the flag.
+'MM_APPL'
+     The erroneous condition is detected by the application.
+'MM_UTIL'
+     The erroneous condition is detected by a utility.
+'MM_OPSYS'
+     The erroneous condition is detected by the operating system.
 
-     This character is available on BSD systems and GNU/Linux and
-     GNU/Hurd systems.
+   A last component of CLASSIFICATION can signal the results of this
+message.  Exactly one of the following values can be used:
 
- -- Macro: int VSTATUS
-     This is the subscript for the STATUS character in the special
-     control character array.  `TERMIOS.c_cc[VSTATUS]' holds the
-     character itself.
+'MM_RECOVER'
+     It is a recoverable error.
+'MM_NRECOV'
+     It is a non-recoverable error.
 
-     The STATUS character's effect is to print out a status message
-     about how the current process is running.
+ -- Function: int fmtmsg (long int CLASSIFICATION, const char *LABEL,
+          int SEVERITY, const char *TEXT, const char *ACTION, const char
+          *TAG)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Safe | *Note POSIX
+     Safety Concepts::.
 
-     The STATUS character is recognized only in canonical mode, and
-     only if `NOKERNINFO' is not set.
+     Display a message described by its parameters on the device(s)
+     specified in the CLASSIFICATION parameter.  The LABEL parameter
+     identifies the source of the message.  The string should consist of
+     two colon separated parts where the first part has not more than 10
+     and the second part not more than 14 characters.  The TEXT
+     parameter describes the condition of the error, the ACTION
+     parameter possible steps to recover from the error and the TAG
+     parameter is a reference to the online documentation where more
+     information can be found.  It should contain the LABEL value and a
+     unique identification number.
 
-     This character is available only on BSD systems and GNU/Hurd
+     Each of the parameters can be a special value which means this
+     value is to be omitted.  The symbolic names for these values are:
+
+     'MM_NULLLBL'
+          Ignore LABEL parameter.
+     'MM_NULLSEV'
+          Ignore SEVERITY parameter.
+     'MM_NULLMC'
+          Ignore CLASSIFICATION parameter.  This implies that nothing is
+          actually printed.
+     'MM_NULLTXT'
+          Ignore TEXT parameter.
+     'MM_NULLACT'
+          Ignore ACTION parameter.
+     'MM_NULLTAG'
+          Ignore TAG parameter.
+
+     There is another way certain fields can be omitted from the output
+     to standard error.  This is described below in the description of
+     environment variables influencing the behavior.
+
+     The SEVERITY parameter can have one of the values in the following
+     table:
+
+     'MM_NOSEV'
+          Nothing is printed, this value is the same as 'MM_NULLSEV'.
+     'MM_HALT'
+          This value is printed as 'HALT'.
+     'MM_ERROR'
+          This value is printed as 'ERROR'.
+     'MM_WARNING'
+          This value is printed as 'WARNING'.
+     'MM_INFO'
+          This value is printed as 'INFO'.
+
+     The numeric value of these five macros are between '0' and '4'.
+     Using the environment variable 'SEV_LEVEL' or using the
+     'addseverity' function one can add more severity levels with their
+     corresponding string to print.  This is described below (*note
+     Adding Severity Classes::).
+
+     If no parameter is ignored the output looks like this:
+
+          LABEL: SEVERITY-STRING: TEXT
+          TO FIX: ACTION TAG
+
+     The colons, new line characters and the 'TO FIX' string are
+     inserted if necessary, i.e., if the corresponding parameter is not
+     ignored.
+
+     This function is specified in the X/Open Portability Guide.  It is
+     also available on all systems derived from System V.
+
+     The function returns the value 'MM_OK' if no error occurred.  If
+     only the printing to standard error failed, it returns 'MM_NOMSG'.
+     If printing to the console fails, it returns 'MM_NOCON'.  If
+     nothing is printed 'MM_NOTOK' is returned.  Among situations where
+     all outputs fail this last value is also returned if a parameter
+     value is incorrect.
+
+   There are two environment variables which influence the behavior of
+'fmtmsg'.  The first is 'MSGVERB'.  It is used to control the output
+actually happening on standard error (_not_ the console output).  Each
+of the five fields can explicitly be enabled.  To do this the user has
+to put the 'MSGVERB' variable with a format like the following in the
+environment before calling the 'fmtmsg' function the first time:
+
+     MSGVERB=KEYWORD[:KEYWORD[:...]]
+
+   Valid KEYWORDs are 'label', 'severity', 'text', 'action', and 'tag'.
+If the environment variable is not given or is the empty string, a not
+supported keyword is given or the value is somehow else invalid, no part
+of the message is masked out.
+
+   The second environment variable which influences the behavior of
+'fmtmsg' is 'SEV_LEVEL'.  This variable and the change in the behavior
+of 'fmtmsg' is not specified in the X/Open Portability Guide.  It is
+available in System V systems, though.  It can be used to introduce new
+severity levels.  By default, only the five severity levels described
+above are available.  Any other numeric value would make 'fmtmsg' print
+nothing.
+
+   If the user puts 'SEV_LEVEL' with a format like
+
+     SEV_LEVEL=[DESCRIPTION[:DESCRIPTION[:...]]]
+
+in the environment of the process before the first call to 'fmtmsg',
+where DESCRIPTION has a value of the form
+
+     SEVERITY-KEYWORD,LEVEL,PRINTSTRING
+
+   The SEVERITY-KEYWORD part is not used by 'fmtmsg' but it has to be
+present.  The LEVEL part is a string representation of a number.  The
+numeric value must be a number greater than 4.  This value must be used
+in the SEVERITY parameter of 'fmtmsg' to select this class.  It is not
+possible to overwrite any of the predefined classes.  The PRINTSTRING is
+the string printed when a message of this class is processed by 'fmtmsg'
+(see above, 'fmtsmg' does not print the numeric value but instead the
+string representation).
+
+
+File: libc.info,  Node: Adding Severity Classes,  Next: Example,  Prev: Printing Formatted Messages,  Up: Formatted Messages
+
+12.22.2 Adding Severity Classes
+-------------------------------
+
+There is another possibility to introduce severity classes besides using
+the environment variable 'SEV_LEVEL'.  This simplifies the task of
+introducing new classes in a running program.  One could use the
+'setenv' or 'putenv' function to set the environment variable, but this
+is toilsome.
+
+ -- Function: int addseverity (int SEVERITY, const char *STRING)
+     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe lock mem |
+     *Note POSIX Safety Concepts::.
+
+     This function allows the introduction of new severity classes which
+     can be addressed by the SEVERITY parameter of the 'fmtmsg'
+     function.  The SEVERITY parameter of 'addseverity' must match the
+     value for the parameter with the same name of 'fmtmsg', and STRING
+     is the string printed in the actual messages instead of the numeric
+     value.
+
+     If STRING is 'NULL' the severity class with the numeric value
+     according to SEVERITY is removed.
+
+     It is not possible to overwrite or remove one of the default
+     severity classes.  All calls to 'addseverity' with SEVERITY set to
+     one of the values for the default classes will fail.
+
+     The return value is 'MM_OK' if the task was successfully performed.
+     If the return value is 'MM_NOTOK' something went wrong.  This could
+     mean that no more memory is available or a class is not available
+     when it has to be removed.
+
+     This function is not specified in the X/Open Portability Guide
+     although the 'fmtsmg' function is.  It is available on System V
      systems.
 
 
-File: libc.info,  Node: Noncanonical Input,  Prev: Special Characters,  Up: Terminal Modes
+File: libc.info,  Node: Example,  Prev: Adding Severity Classes,  Up: Formatted Messages
 
-17.4.10 Noncanonical Input
---------------------------
+12.22.3 How to use 'fmtmsg' and 'addseverity'
+---------------------------------------------
 
-In noncanonical input mode, the special editing characters such as
-ERASE and KILL are ignored.  The system facilities for the user to edit
-input are disabled in noncanonical mode, so that all input characters
-(unless they are special for signal or flow-control purposes) are passed
-to the application program exactly as typed.  It is up to the
-application program to give the user ways to edit the input, if
-appropriate.
+Here is a simple example program to illustrate the use of the both
+functions described in this section.
 
-   Noncanonical mode offers special parameters called MIN and TIME for
-controlling whether and how long to wait for input to be available.  You
-can even use them to avoid ever waiting--to return immediately with
-whatever input is available, or with no input.
 
-   The MIN and TIME are stored in elements of the `c_cc' array, which
-is a member of the `struct termios' structure.  Each element of this
-array has a particular role, and each element has a symbolic constant
-that stands for the index of that element.  `VMIN' and `VMAX' are the
-names for the indices in the array of the MIN and TIME slots.
+     #include <fmtmsg.h>
 
- -- Macro: int VMIN
-     This is the subscript for the MIN slot in the `c_cc' array.  Thus,
-     `TERMIOS.c_cc[VMIN]' is the value itself.
+     int
+     main (void)
+     {
+       addseverity (5, "NOTE2");
+       fmtmsg (MM_PRINT, "only1field", MM_INFO, "text2", "action2", "tag2");
+       fmtmsg (MM_PRINT, "UX:cat", 5, "invalid syntax", "refer to manual",
+               "UX:cat:001");
+       fmtmsg (MM_PRINT, "label:foo", 6, "text", "action", "tag");
+       return 0;
+     }
 
-     The MIN slot is only meaningful in noncanonical input mode; it
-     specifies the minimum number of bytes that must be available in the
-     input queue in order for `read' to return.
+   The second call to 'fmtmsg' illustrates a use of this function as it
+usually occurs on System V systems, which heavily use this function.  It
+seems worthwhile to give a short explanation here of how this system
+works on System V. The value of the LABEL field ('UX:cat') says that the
+error occurred in the Unix program 'cat'.  The explanation of the error
+follows and the value for the ACTION parameter is '"refer to manual"'.
+One could be more specific here, if necessary.  The TAG field contains,
+as proposed above, the value of the string given for the LABEL
+parameter, and additionally a unique ID ('001' in this case).  For a GNU
+environment this string could contain a reference to the corresponding
+node in the Info page for the program.
 
- -- Macro: int VTIME
-     This is the subscript for the TIME slot in the `c_cc' array.  Thus,
-     `TERMIOS.c_cc[VTIME]' is the value itself.
+Running this program without specifying the 'MSGVERB' and 'SEV_LEVEL'
+function produces the following output:
 
-     The TIME slot is only meaningful in noncanonical input mode; it
-     specifies how long to wait for input before returning, in units of
-     0.1 seconds.
+     UX:cat: NOTE2: invalid syntax
+     TO FIX: refer to manual UX:cat:001
 
-   The MIN and TIME values interact to determine the criterion for when
-`read' should return; their precise meanings depend on which of them
-are nonzero.  There are four possible cases:
+   We see the different fields of the message and how the extra glue
+(the colons and the 'TO FIX' string) are printed.  But only one of the
+three calls to 'fmtmsg' produced output.  The first call does not print
+anything because the LABEL parameter is not in the correct form.  The
+string must contain two fields, separated by a colon (*note Printing
+Formatted Messages::).  The third 'fmtmsg' call produced no output since
+the class with the numeric value '6' is not defined.  Although a class
+with numeric value '5' is also not defined by default, the call to
+'addseverity' introduces it and the second call to 'fmtmsg' produces the
+above output.
 
-   * Both TIME and MIN are nonzero.
+   When we change the environment of the program to contain
+'SEV_LEVEL=XXX,6,NOTE' when running it we get a different result:
 
-     In this case, TIME specifies how long to wait after each input
-     character to see if more input arrives.  After the first character
-     received, `read' keeps waiting until either MIN bytes have arrived
-     in all, or TIME elapses with no further input.
+     UX:cat: NOTE2: invalid syntax
+     TO FIX: refer to manual UX:cat:001
+     label:foo: NOTE: text
+     TO FIX: action tag
 
-     `read' always blocks until the first character arrives, even if
-     TIME elapses first.  `read' can return more than MIN characters if
-     more than MIN happen to be in the queue.
+   Now the third call to 'fmtmsg' produced some output and we see how
+the string 'NOTE' from the environment variable appears in the message.
 
-   * Both MIN and TIME are zero.
+   Now we can reduce the output by specifying which fields we are
+interested in.  If we additionally set the environment variable
+'MSGVERB' to the value 'severity:label:action' we get the following
+output:
 
-     In this case, `read' always returns immediately with as many
-     characters as are available in the queue, up to the number
-     requested.  If no input is immediately available, `read' returns a
-     value of zero.
+     UX:cat: NOTE2
+     TO FIX: refer to manual
+     label:foo: NOTE
+     TO FIX: action
 
-   * MIN is zero but TIME has a nonzero value.
-
-     In this case, `read' waits for time TIME for input to become
-     available; the availability of a single byte is enough to satisfy
-     the read request and cause `read' to return.  When it returns, it
-     returns as many characters as are available, up to the number
-     requested.  If no input is available before the timer expires,
-     `read' returns a value of zero.
-
-   * TIME is zero but MIN has a nonzero value.
-
-     In this case, `read' waits until at least MIN bytes are available
-     in the queue.  At that time, `read' returns as many characters as
-     are available, up to the number requested.  `read' can return more
-     than MIN characters if more than MIN happen to be in the queue.
-
-   What happens if MIN is 50 and you ask to read just 10 bytes?
-Normally, `read' waits until there are 50 bytes in the buffer (or, more
-generally, the wait condition described above is satisfied), and then
-reads 10 of them, leaving the other 40 buffered in the operating system
-for a subsequent call to `read'.
-
-   *Portability note:* On some systems, the MIN and TIME slots are
-actually the same as the EOF and EOL slots.  This causes no serious
-problem because the MIN and TIME slots are used only in noncanonical
-input and the EOF and EOL slots are used only in canonical input, but it
-isn't very clean.  The GNU C Library allocates separate slots for these
-uses.
-
- -- Function: void cfmakeraw (struct termios *TERMIOS-P)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function provides an easy way to set up `*TERMIOS-P' for what
-     has traditionally been called "raw mode" in BSD.  This uses
-     noncanonical input, and turns off most processing to give an
-     unmodified channel to the terminal.
-
-     It does exactly this:
-            TERMIOS-P->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
-                                          |INLCR|IGNCR|ICRNL|IXON);
-            TERMIOS-P->c_oflag &= ~OPOST;
-            TERMIOS-P->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
-            TERMIOS-P->c_cflag &= ~(CSIZE|PARENB);
-            TERMIOS-P->c_cflag |= CS8;
+I.e., the output produced by the TEXT and the TAG parameters to 'fmtmsg'
+vanished.  Please also note that now there is no colon after the 'NOTE'
+and 'NOTE2' strings in the output.  This is not necessary since there is
+no more output on this line because the text is missing.
 
 
-File: libc.info,  Node: BSD Terminal Modes,  Next: Line Control,  Prev: Terminal Modes,  Up: Low-Level Terminal Interface
+File: libc.info,  Node: Low-Level I/O,  Next: File System Interface,  Prev: I/O on Streams,  Up: Top
 
-17.5 BSD Terminal Modes
-=======================
+13 Low-Level Input/Output
+*************************
 
-The usual way to get and set terminal modes is with the functions
-described in *note Terminal Modes::.  However, on some systems you can
-use the BSD-derived functions in this section to do some of the same
-thing.  On many systems, these functions do not exist.  Even with the
-GNU C Library, the functions simply fail with `errno' = `ENOSYS' with
-many kernels, including Linux.
+This chapter describes functions for performing low-level input/output
+operations on file descriptors.  These functions include the primitives
+for the higher-level I/O functions described in *note I/O on Streams::,
+as well as functions for performing low-level control operations for
+which there are no equivalents on streams.
 
-   The symbols used in this section are declared in `sgtty.h'.
+   Stream-level I/O is more flexible and usually more convenient;
+therefore, programmers generally use the descriptor-level functions only
+when necessary.  These are some of the usual reasons:
 
- -- Data Type: struct sgttyb
-     This structure is an input or output parameter list for `gtty' and
-     `stty'.
+   * For reading binary files in large chunks.
 
-    `char sg_ispeed'
-          Line speed for input
+   * For reading an entire file into core before parsing it.
 
-    `char sg_ospeed'
-          Line speed for output
+   * To perform operations other than data transfer, which can only be
+     done with a descriptor.  (You can use 'fileno' to get the
+     descriptor corresponding to a stream.)
 
-    `char sg_erase'
-          Erase character
+   * To pass descriptors to a child process.  (The child can create its
+     own stream to use a descriptor that it inherits, but cannot inherit
+     a stream directly.)
 
-    `char sg_kill'
-          Kill character
+* Menu:
 
-    `int sg_flags'
-          Various flags
-
- -- Function: int gtty (int FILEDES, struct sgttyb *ATTRIBUTES)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function gets the attributes of a terminal.
-
-     `gtty' sets *ATTRIBUTES to describe the terminal attributes of the
-     terminal which is open with file descriptor FILEDES.
-
- -- Function: int stty (int FILEDES, const struct sgttyb *ATTRIBUTES)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function sets the attributes of a terminal.
-
-     `stty' sets the terminal attributes of the terminal which is open
-     with file descriptor FILEDES to those described by *FILEDES.
+* Opening and Closing Files::           How to open and close file
+                                         descriptors.
+* I/O Primitives::                      Reading and writing data.
+* File Position Primitive::             Setting a descriptor's file
+                                         position.
+* Descriptors and Streams::             Converting descriptor to stream
+                                         or vice-versa.
+* Stream/Descriptor Precautions::       Precautions needed if you use both
+                                         descriptors and streams.
+* Scatter-Gather::                      Fast I/O to discontinuous buffers.
+* Memory-mapped I/O::                   Using files like memory.
+* Waiting for I/O::                     How to check for input or output
+					 on multiple file descriptors.
+* Synchronizing I/O::                   Making sure all I/O actions completed.
+* Asynchronous I/O::                    Perform I/O in parallel.
+* Control Operations::                  Various other operations on file
+					 descriptors.
+* Duplicating Descriptors::             Fcntl commands for duplicating
+                                         file descriptors.
+* Descriptor Flags::                    Fcntl commands for manipulating
+                                         flags associated with file
+                                         descriptors.
+* File Status Flags::                   Fcntl commands for manipulating
+                                         flags associated with open files.
+* File Locks::                          Fcntl commands for implementing
+                                         file locking.
+* Interrupt Input::                     Getting an asynchronous signal when
+                                         input arrives.
+* IOCTLs::                              Generic I/O Control operations.
 
 
-File: libc.info,  Node: Line Control,  Next: Noncanon Example,  Prev: BSD Terminal Modes,  Up: Low-Level Terminal Interface
+File: libc.info,  Node: Opening and Closing Files,  Next: I/O Primitives,  Up: Low-Level I/O
 
-17.6 Line Control Functions
-===========================
+13.1 Opening and Closing Files
+==============================
 
-These functions perform miscellaneous control actions on terminal
-devices.  As regards terminal access, they are treated like doing
-output: if any of these functions is used by a background process on its
-controlling terminal, normally all processes in the process group are
-sent a `SIGTTOU' signal.  The exception is if the calling process
-itself is ignoring or blocking `SIGTTOU' signals, in which case the
-operation is performed and no signal is sent.  *Note Job Control::.
+This section describes the primitives for opening and closing files
+using file descriptors.  The 'open' and 'creat' functions are declared
+in the header file 'fcntl.h', while 'close' is declared in 'unistd.h'.
 
- -- Function: int tcsendbreak (int FILEDES, int DURATION)
-     Preliminary: | MT-Unsafe race:tcattr(filedes)/bsd | AS-Unsafe |
-     AC-Unsafe corrupt/bsd | *Note POSIX Safety Concepts::.
-
-     This function generates a break condition by transmitting a stream
-     of zero bits on the terminal associated with the file descriptor
-     FILEDES.  The duration of the break is controlled by the DURATION
-     argument.  If zero, the duration is between 0.25 and 0.5 seconds.
-     The meaning of a nonzero value depends on the operating system.
-
-     This function does nothing if the terminal is not an asynchronous
-     serial data port.
-
-     The return value is normally zero.  In the event of an error, a
-     value of -1 is returned.  The following `errno' error conditions
-     are defined for this function:
-
-    `EBADF'
-          The FILEDES is not a valid file descriptor.
-
-    `ENOTTY'
-          The FILEDES is not associated with a terminal device.
-
- -- Function: int tcdrain (int FILEDES)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+ -- Function: int open (const char *FILENAME, int FLAGS[, mode_t MODE])
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
      Concepts::.
 
-     The `tcdrain' function waits until all queued output to the
-     terminal FILEDES has been transmitted.
+     The 'open' function creates and returns a new file descriptor for
+     the file named by FILENAME.  Initially, the file position indicator
+     for the file is at the beginning of the file.  The argument MODE
+     (*note Permission Bits::) is used only when a file is created, but
+     it doesn't hurt to supply the argument in any case.
+
+     The FLAGS argument controls how the file is to be opened.  This is
+     a bit mask; you create the value by the bitwise OR of the
+     appropriate parameters (using the '|' operator in C). *Note File
+     Status Flags::, for the parameters available.
+
+     The normal return value from 'open' is a non-negative integer file
+     descriptor.  In the case of an error, a value of -1 is returned
+     instead.  In addition to the usual file name errors (*note File
+     Name Errors::), the following 'errno' error conditions are defined
+     for this function:
+
+     'EACCES'
+          The file exists but is not readable/writable as requested by
+          the FLAGS argument, the file does not exist and the directory
+          is unwritable so it cannot be created.
+
+     'EEXIST'
+          Both 'O_CREAT' and 'O_EXCL' are set, and the named file
+          already exists.
+
+     'EINTR'
+          The 'open' operation was interrupted by a signal.  *Note
+          Interrupted Primitives::.
+
+     'EISDIR'
+          The FLAGS argument specified write access, and the file is a
+          directory.
+
+     'EMFILE'
+          The process has too many files open.  The maximum number of
+          file descriptors is controlled by the 'RLIMIT_NOFILE' resource
+          limit; *note Limits on Resources::.
+
+     'ENFILE'
+          The entire system, or perhaps the file system which contains
+          the directory, cannot support any additional open files at the
+          moment.  (This problem cannot happen on GNU/Hurd systems.)
+
+     'ENOENT'
+          The named file does not exist, and 'O_CREAT' is not specified.
+
+     'ENOSPC'
+          The directory or file system that would contain the new file
+          cannot be extended, because there is no disk space left.
+
+     'ENXIO'
+          'O_NONBLOCK' and 'O_WRONLY' are both set in the FLAGS
+          argument, the file named by FILENAME is a FIFO (*note Pipes
+          and FIFOs::), and no process has the file open for reading.
+
+     'EROFS'
+          The file resides on a read-only file system and any of
+          'O_WRONLY', 'O_RDWR', and 'O_TRUNC' are set in the FLAGS
+          argument, or 'O_CREAT' is set and the file does not already
+          exist.
+
+     If on a 32 bit machine the sources are translated with
+     '_FILE_OFFSET_BITS == 64' the function 'open' returns a file
+     descriptor opened in the large file mode which enables the file
+     handling functions to use files up to 2^63 bytes in size and offset
+     from -2^63 to 2^63.  This happens transparently for the user since
+     all of the lowlevel file handling functions are equally replaced.
 
      This function is a cancellation point in multi-threaded programs.
      This is a problem if the thread allocates some resources (like
      memory, file descriptors, semaphores or whatever) at the time
-     `tcdrain' is called.  If the thread gets canceled these resources
-     stay allocated until the program ends.  To avoid this calls to
-     `tcdrain' should be protected using cancellation handlers.
+     'open' is called.  If the thread gets canceled these resources stay
+     allocated until the program ends.  To avoid this calls to 'open'
+     should be protected using cancellation handlers.
 
-     The return value is normally zero.  In the event of an error, a
-     value of -1 is returned.  The following `errno' error conditions
-     are defined for this function:
+     The 'open' function is the underlying primitive for the 'fopen' and
+     'freopen' functions, that create streams.
 
-    `EBADF'
-          The FILEDES is not a valid file descriptor.
+ -- Function: int open64 (const char *FILENAME, int FLAGS[, mode_t
+          MODE])
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
+     Concepts::.
 
-    `ENOTTY'
-          The FILEDES is not associated with a terminal device.
+     This function is similar to 'open'.  It returns a file descriptor
+     which can be used to access the file named by FILENAME.  The only
+     difference is that on 32 bit systems the file is opened in the
+     large file mode.  I.e., file length and file offsets can exceed 31
+     bits.
 
-    `EINTR'
-          The operation was interrupted by delivery of a signal.  *Note
-          Interrupted Primitives::.
+     When the sources are translated with '_FILE_OFFSET_BITS == 64' this
+     function is actually available under the name 'open'.  I.e., the
+     new, extended API using 64 bit file sizes and offsets transparently
+     replaces the old API.
 
- -- Function: int tcflush (int FILEDES, int QUEUE)
+ -- Obsolete function: int creat (const char *FILENAME, mode_t MODE)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
+     Concepts::.
+
+     This function is obsolete.  The call:
+
+          creat (FILENAME, MODE)
+
+     is equivalent to:
+
+          open (FILENAME, O_WRONLY | O_CREAT | O_TRUNC, MODE)
+
+     If on a 32 bit machine the sources are translated with
+     '_FILE_OFFSET_BITS == 64' the function 'creat' returns a file
+     descriptor opened in the large file mode which enables the file
+     handling functions to use files up to 2^63 in size and offset from
+     -2^63 to 2^63.  This happens transparently for the user since all
+     of the lowlevel file handling functions are equally replaced.
+
+ -- Obsolete function: int creat64 (const char *FILENAME, mode_t MODE)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
+     Concepts::.
+
+     This function is similar to 'creat'.  It returns a file descriptor
+     which can be used to access the file named by FILENAME.  The only
+     the difference is that on 32 bit systems the file is opened in the
+     large file mode.  I.e., file length and file offsets can exceed 31
+     bits.
+
+     To use this file descriptor one must not use the normal operations
+     but instead the counterparts named '*64', e.g., 'read64'.
+
+     When the sources are translated with '_FILE_OFFSET_BITS == 64' this
+     function is actually available under the name 'open'.  I.e., the
+     new, extended API using 64 bit file sizes and offsets transparently
+     replaces the old API.
+
+ -- Function: int close (int FILEDES)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
+     Concepts::.
+
+     The function 'close' closes the file descriptor FILEDES.  Closing a
+     file has the following consequences:
+
+        * The file descriptor is deallocated.
+
+        * Any record locks owned by the process on the file are
+          unlocked.
+
+        * When all file descriptors associated with a pipe or FIFO have
+          been closed, any unread data is discarded.
+
+     This function is a cancellation point in multi-threaded programs.
+     This is a problem if the thread allocates some resources (like
+     memory, file descriptors, semaphores or whatever) at the time
+     'close' is called.  If the thread gets canceled these resources
+     stay allocated until the program ends.  To avoid this, calls to
+     'close' should be protected using cancellation handlers.
+
+     The normal return value from 'close' is 0; a value of -1 is
+     returned in case of failure.  The following 'errno' error
+     conditions are defined for this function:
+
+     'EBADF'
+          The FILEDES argument is not a valid file descriptor.
+
+     'EINTR'
+          The 'close' call was interrupted by a signal.  *Note
+          Interrupted Primitives::.  Here is an example of how to handle
+          'EINTR' properly:
+
+               TEMP_FAILURE_RETRY (close (desc));
+
+     'ENOSPC'
+     'EIO'
+     'EDQUOT'
+          When the file is accessed by NFS, these errors from 'write'
+          can sometimes not be detected until 'close'.  *Note I/O
+          Primitives::, for details on their meaning.
+
+     Please note that there is _no_ separate 'close64' function.  This
+     is not necessary since this function does not determine nor depend
+     on the mode of the file.  The kernel which performs the 'close'
+     operation knows which mode the descriptor is used for and can
+     handle this situation.
+
+   To close a stream, call 'fclose' (*note Closing Streams::) instead of
+trying to close its underlying file descriptor with 'close'.  This
+flushes any buffered output and updates the stream object to indicate
+that it is closed.
+
+
+File: libc.info,  Node: I/O Primitives,  Next: File Position Primitive,  Prev: Opening and Closing Files,  Up: Low-Level I/O
+
+13.2 Input and Output Primitives
+================================
+
+This section describes the functions for performing primitive input and
+output operations on file descriptors: 'read', 'write', and 'lseek'.
+These functions are declared in the header file 'unistd.h'.
+
+ -- Data Type: ssize_t
+     This data type is used to represent the sizes of blocks that can be
+     read or written in a single operation.  It is similar to 'size_t',
+     but must be a signed type.
+
+ -- Function: ssize_t read (int FILEDES, void *BUFFER, size_t SIZE)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `tcflush' function is used to clear the input and/or output
-     queues associated with the terminal file FILEDES.  The QUEUE
-     argument specifies which queue(s) to clear, and can be one of the
-     following values:
+     The 'read' function reads up to SIZE bytes from the file with
+     descriptor FILEDES, storing the results in the BUFFER.  (This is
+     not necessarily a character string, and no terminating null
+     character is added.)
 
-    `TCIFLUSH'
-          Clear any input data received, but not yet read.
+     The return value is the number of bytes actually read.  This might
+     be less than SIZE; for example, if there aren't that many bytes
+     left in the file or if there aren't that many bytes immediately
+     available.  The exact behavior depends on what kind of file it is.
+     Note that reading less than SIZE bytes is not an error.
 
-    `TCOFLUSH'
-          Clear any output data written, but not yet transmitted.
+     A value of zero indicates end-of-file (except if the value of the
+     SIZE argument is also zero).  This is not considered an error.  If
+     you keep calling 'read' while at end-of-file, it will keep
+     returning zero and doing nothing else.
 
-    `TCIOFLUSH'
-          Clear both queued input and output.
+     If 'read' returns at least one character, there is no way you can
+     tell whether end-of-file was reached.  But if you did reach the
+     end, the next read will return zero.
 
-     The return value is normally zero.  In the event of an error, a
-     value of -1 is returned.  The following `errno' error conditions
-     are defined for this function:
+     In case of an error, 'read' returns -1.  The following 'errno'
+     error conditions are defined for this function:
 
-    `EBADF'
-          The FILEDES is not a valid file descriptor.
+     'EAGAIN'
+          Normally, when no input is immediately available, 'read' waits
+          for some input.  But if the 'O_NONBLOCK' flag is set for the
+          file (*note File Status Flags::), 'read' returns immediately
+          without reading any data, and reports this error.
 
-    `ENOTTY'
-          The FILEDES is not associated with a terminal device.
+          *Compatibility Note:* Most versions of BSD Unix use a
+          different error code for this: 'EWOULDBLOCK'.  In the GNU C
+          Library, 'EWOULDBLOCK' is an alias for 'EAGAIN', so it doesn't
+          matter which name you use.
 
-    `EINVAL'
-          A bad value was supplied as the QUEUE argument.
+          On some systems, reading a large amount of data from a
+          character special file can also fail with 'EAGAIN' if the
+          kernel cannot find enough physical memory to lock down the
+          user's pages.  This is limited to devices that transfer with
+          direct memory access into the user's memory, which means it
+          does not include terminals, since they always use separate
+          buffers inside the kernel.  This problem never happens on
+          GNU/Hurd systems.
 
-     It is unfortunate that this function is named `tcflush', because
-     the term "flush" is normally used for quite another
-     operation--waiting until all output is transmitted--and using it
-     for discarding input or output would be confusing.  Unfortunately,
-     the name `tcflush' comes from POSIX and we cannot change it.
+          Any condition that could result in 'EAGAIN' can instead result
+          in a successful 'read' which returns fewer bytes than
+          requested.  Calling 'read' again immediately would result in
+          'EAGAIN'.
 
- -- Function: int tcflow (int FILEDES, int ACTION)
-     Preliminary: | MT-Unsafe race:tcattr(filedes)/bsd | AS-Unsafe |
-     AC-Safe | *Note POSIX Safety Concepts::.
+     'EBADF'
+          The FILEDES argument is not a valid file descriptor, or is not
+          open for reading.
 
-     The `tcflow' function is used to perform operations relating to
-     XON/XOFF flow control on the terminal file specified by FILEDES.
+     'EINTR'
+          'read' was interrupted by a signal while it was waiting for
+          input.  *Note Interrupted Primitives::.  A signal will not
+          necessary cause 'read' to return 'EINTR'; it may instead
+          result in a successful 'read' which returns fewer bytes than
+          requested.
 
-     The ACTION argument specifies what operation to perform, and can
-     be one of the following values:
+     'EIO'
+          For many devices, and for disk files, this error code
+          indicates a hardware error.
 
-    `TCOOFF'
-          Suspend transmission of output.
+          'EIO' also occurs when a background process tries to read from
+          the controlling terminal, and the normal action of stopping
+          the process by sending it a 'SIGTTIN' signal isn't working.
+          This might happen if the signal is being blocked or ignored,
+          or because the process group is orphaned.  *Note Job
+          Control::, for more information about job control, and *note
+          Signal Handling::, for information about signals.
 
-    `TCOON'
-          Restart transmission of output.
+     'EINVAL'
+          In some systems, when reading from a character or block
+          device, position and size offsets must be aligned to a
+          particular block size.  This error indicates that the offsets
+          were not properly aligned.
 
-    `TCIOFF'
-          Transmit a STOP character.
+     Please note that there is no function named 'read64'.  This is not
+     necessary since this function does not directly modify or handle
+     the possibly wide file offset.  Since the kernel handles this state
+     internally, the 'read' function can be used for all cases.
 
-    `TCION'
-          Transmit a START character.
+     This function is a cancellation point in multi-threaded programs.
+     This is a problem if the thread allocates some resources (like
+     memory, file descriptors, semaphores or whatever) at the time
+     'read' is called.  If the thread gets canceled these resources stay
+     allocated until the program ends.  To avoid this, calls to 'read'
+     should be protected using cancellation handlers.
 
-     For more information about the STOP and START characters, see
-     *note Special Characters::.
+     The 'read' function is the underlying primitive for all of the
+     functions that read from streams, such as 'fgetc'.
 
-     The return value is normally zero.  In the event of an error, a
-     value of -1 is returned.  The following `errno' error conditions
-     are defined for this function:
+ -- Function: ssize_t pread (int FILEDES, void *BUFFER, size_t SIZE,
+          off_t OFFSET)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-    `EBADF'
-          The FILEDES is not a valid file descriptor.
+     The 'pread' function is similar to the 'read' function.  The first
+     three arguments are identical, and the return values and error
+     codes also correspond.
 
-    `ENOTTY'
-          The FILEDES is not associated with a terminal device.
+     The difference is the fourth argument and its handling.  The data
+     block is not read from the current position of the file descriptor
+     'filedes'.  Instead the data is read from the file starting at
+     position OFFSET.  The position of the file descriptor itself is not
+     affected by the operation.  The value is the same as before the
+     call.
 
-    `EINVAL'
-          A bad value was supplied as the ACTION argument.
+     When the source file is compiled with '_FILE_OFFSET_BITS == 64' the
+     'pread' function is in fact 'pread64' and the type 'off_t' has 64
+     bits, which makes it possible to handle files up to 2^63 bytes in
+     length.
+
+     The return value of 'pread' describes the number of bytes read.  In
+     the error case it returns -1 like 'read' does and the error codes
+     are also the same, with these additions:
+
+     'EINVAL'
+          The value given for OFFSET is negative and therefore illegal.
+
+     'ESPIPE'
+          The file descriptor FILEDES is associate with a pipe or a FIFO
+          and this device does not allow positioning of the file
+          pointer.
+
+     The function is an extension defined in the Unix Single
+     Specification version 2.
+
+ -- Function: ssize_t pread64 (int FILEDES, void *BUFFER, size_t SIZE,
+          off64_t OFFSET)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is similar to the 'pread' function.  The difference
+     is that the OFFSET parameter is of type 'off64_t' instead of
+     'off_t' which makes it possible on 32 bit machines to address files
+     larger than 2^31 bytes and up to 2^63 bytes.  The file descriptor
+     'filedes' must be opened using 'open64' since otherwise the large
+     offsets possible with 'off64_t' will lead to errors with a
+     descriptor in small file mode.
+
+     When the source file is compiled with '_FILE_OFFSET_BITS == 64' on
+     a 32 bit machine this function is actually available under the name
+     'pread' and so transparently replaces the 32 bit interface.
+
+ -- Function: ssize_t write (int FILEDES, const void *BUFFER, size_t
+          SIZE)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'write' function writes up to SIZE bytes from BUFFER to the
+     file with descriptor FILEDES.  The data in BUFFER is not
+     necessarily a character string and a null character is output like
+     any other character.
+
+     The return value is the number of bytes actually written.  This may
+     be SIZE, but can always be smaller.  Your program should always
+     call 'write' in a loop, iterating until all the data is written.
+
+     Once 'write' returns, the data is enqueued to be written and can be
+     read back right away, but it is not necessarily written out to
+     permanent storage immediately.  You can use 'fsync' when you need
+     to be sure your data has been permanently stored before continuing.
+     (It is more efficient for the system to batch up consecutive writes
+     and do them all at once when convenient.  Normally they will always
+     be written to disk within a minute or less.)  Modern systems
+     provide another function 'fdatasync' which guarantees integrity
+     only for the file data and is therefore faster.  You can use the
+     'O_FSYNC' open mode to make 'write' always store the data to disk
+     before returning; *note Operating Modes::.
+
+     In the case of an error, 'write' returns -1.  The following 'errno'
+     error conditions are defined for this function:
+
+     'EAGAIN'
+          Normally, 'write' blocks until the write operation is
+          complete.  But if the 'O_NONBLOCK' flag is set for the file
+          (*note Control Operations::), it returns immediately without
+          writing any data and reports this error.  An example of a
+          situation that might cause the process to block on output is
+          writing to a terminal device that supports flow control, where
+          output has been suspended by receipt of a STOP character.
+
+          *Compatibility Note:* Most versions of BSD Unix use a
+          different error code for this: 'EWOULDBLOCK'.  In the GNU C
+          Library, 'EWOULDBLOCK' is an alias for 'EAGAIN', so it doesn't
+          matter which name you use.
+
+          On some systems, writing a large amount of data from a
+          character special file can also fail with 'EAGAIN' if the
+          kernel cannot find enough physical memory to lock down the
+          user's pages.  This is limited to devices that transfer with
+          direct memory access into the user's memory, which means it
+          does not include terminals, since they always use separate
+          buffers inside the kernel.  This problem does not arise on
+          GNU/Hurd systems.
+
+     'EBADF'
+          The FILEDES argument is not a valid file descriptor, or is not
+          open for writing.
+
+     'EFBIG'
+          The size of the file would become larger than the
+          implementation can support.
+
+     'EINTR'
+          The 'write' operation was interrupted by a signal while it was
+          blocked waiting for completion.  A signal will not necessarily
+          cause 'write' to return 'EINTR'; it may instead result in a
+          successful 'write' which writes fewer bytes than requested.
+          *Note Interrupted Primitives::.
+
+     'EIO'
+          For many devices, and for disk files, this error code
+          indicates a hardware error.
+
+     'ENOSPC'
+          The device containing the file is full.
+
+     'EPIPE'
+          This error is returned when you try to write to a pipe or FIFO
+          that isn't open for reading by any process.  When this
+          happens, a 'SIGPIPE' signal is also sent to the process; see
+          *note Signal Handling::.
+
+     'EINVAL'
+          In some systems, when writing to a character or block device,
+          position and size offsets must be aligned to a particular
+          block size.  This error indicates that the offsets were not
+          properly aligned.
+
+     Unless you have arranged to prevent 'EINTR' failures, you should
+     check 'errno' after each failing call to 'write', and if the error
+     was 'EINTR', you should simply repeat the call.  *Note Interrupted
+     Primitives::.  The easy way to do this is with the macro
+     'TEMP_FAILURE_RETRY', as follows:
+
+          nbytes = TEMP_FAILURE_RETRY (write (desc, buffer, count));
+
+     Please note that there is no function named 'write64'.  This is not
+     necessary since this function does not directly modify or handle
+     the possibly wide file offset.  Since the kernel handles this state
+     internally the 'write' function can be used for all cases.
+
+     This function is a cancellation point in multi-threaded programs.
+     This is a problem if the thread allocates some resources (like
+     memory, file descriptors, semaphores or whatever) at the time
+     'write' is called.  If the thread gets canceled these resources
+     stay allocated until the program ends.  To avoid this, calls to
+     'write' should be protected using cancellation handlers.
+
+     The 'write' function is the underlying primitive for all of the
+     functions that write to streams, such as 'fputc'.
+
+ -- Function: ssize_t pwrite (int FILEDES, const void *BUFFER, size_t
+          SIZE, off_t OFFSET)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'pwrite' function is similar to the 'write' function.  The
+     first three arguments are identical, and the return values and
+     error codes also correspond.
+
+     The difference is the fourth argument and its handling.  The data
+     block is not written to the current position of the file descriptor
+     'filedes'.  Instead the data is written to the file starting at
+     position OFFSET.  The position of the file descriptor itself is not
+     affected by the operation.  The value is the same as before the
+     call.
+
+     When the source file is compiled with '_FILE_OFFSET_BITS == 64' the
+     'pwrite' function is in fact 'pwrite64' and the type 'off_t' has 64
+     bits, which makes it possible to handle files up to 2^63 bytes in
+     length.
+
+     The return value of 'pwrite' describes the number of written bytes.
+     In the error case it returns -1 like 'write' does and the error
+     codes are also the same, with these additions:
+
+     'EINVAL'
+          The value given for OFFSET is negative and therefore illegal.
+
+     'ESPIPE'
+          The file descriptor FILEDES is associated with a pipe or a
+          FIFO and this device does not allow positioning of the file
+          pointer.
+
+     The function is an extension defined in the Unix Single
+     Specification version 2.
+
+ -- Function: ssize_t pwrite64 (int FILEDES, const void *BUFFER, size_t
+          SIZE, off64_t OFFSET)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is similar to the 'pwrite' function.  The difference
+     is that the OFFSET parameter is of type 'off64_t' instead of
+     'off_t' which makes it possible on 32 bit machines to address files
+     larger than 2^31 bytes and up to 2^63 bytes.  The file descriptor
+     'filedes' must be opened using 'open64' since otherwise the large
+     offsets possible with 'off64_t' will lead to errors with a
+     descriptor in small file mode.
+
+     When the source file is compiled using '_FILE_OFFSET_BITS == 64' on
+     a 32 bit machine this function is actually available under the name
+     'pwrite' and so transparently replaces the 32 bit interface.
 
 
-File: libc.info,  Node: Noncanon Example,  Next: Pseudo-Terminals,  Prev: Line Control,  Up: Low-Level Terminal Interface
+File: libc.info,  Node: File Position Primitive,  Next: Descriptors and Streams,  Prev: I/O Primitives,  Up: Low-Level I/O
 
-17.7 Noncanonical Mode Example
-==============================
+13.3 Setting the File Position of a Descriptor
+==============================================
 
-Here is an example program that shows how you can set up a terminal
-device to read single characters in noncanonical input mode, without
-echo.
+Just as you can set the file position of a stream with 'fseek', you can
+set the file position of a descriptor with 'lseek'.  This specifies the
+position in the file for the next 'read' or 'write' operation.  *Note
+File Positioning::, for more information on the file position and what
+it means.
 
+   To read the current file position value from a descriptor, use 'lseek
+(DESC, 0, SEEK_CUR)'.
 
-     #include <unistd.h>
-     #include <stdio.h>
-     #include <stdlib.h>
-     #include <termios.h>
+ -- Function: off_t lseek (int FILEDES, off_t OFFSET, int WHENCE)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-     /* Use this variable to remember original terminal attributes. */
+     The 'lseek' function is used to change the file position of the
+     file with descriptor FILEDES.
 
-     struct termios saved_attributes;
+     The WHENCE argument specifies how the OFFSET should be interpreted,
+     in the same way as for the 'fseek' function, and it must be one of
+     the symbolic constants 'SEEK_SET', 'SEEK_CUR', or 'SEEK_END'.
 
-     void
-     reset_input_mode (void)
+     'SEEK_SET'
+          Specifies that OFFSET is a count of characters from the
+          beginning of the file.
+
+     'SEEK_CUR'
+          Specifies that OFFSET is a count of characters from the
+          current file position.  This count may be positive or
+          negative.
+
+     'SEEK_END'
+          Specifies that OFFSET is a count of characters from the end of
+          the file.  A negative count specifies a position within the
+          current extent of the file; a positive count specifies a
+          position past the current end.  If you set the position past
+          the current end, and actually write data, you will extend the
+          file with zeros up to that position.
+
+     The return value from 'lseek' is normally the resulting file
+     position, measured in bytes from the beginning of the file.  You
+     can use this feature together with 'SEEK_CUR' to read the current
+     file position.
+
+     If you want to append to the file, setting the file position to the
+     current end of file with 'SEEK_END' is not sufficient.  Another
+     process may write more data after you seek but before you write,
+     extending the file so the position you write onto clobbers their
+     data.  Instead, use the 'O_APPEND' operating mode; *note Operating
+     Modes::.
+
+     You can set the file position past the current end of the file.
+     This does not by itself make the file longer; 'lseek' never changes
+     the file.  But subsequent output at that position will extend the
+     file.  Characters between the previous end of file and the new
+     position are filled with zeros.  Extending the file in this way can
+     create a "hole": the blocks of zeros are not actually allocated on
+     disk, so the file takes up less space than it appears to; it is
+     then called a "sparse file".
+
+     If the file position cannot be changed, or the operation is in some
+     way invalid, 'lseek' returns a value of -1.  The following 'errno'
+     error conditions are defined for this function:
+
+     'EBADF'
+          The FILEDES is not a valid file descriptor.
+
+     'EINVAL'
+          The WHENCE argument value is not valid, or the resulting file
+          offset is not valid.  A file offset is invalid.
+
+     'ESPIPE'
+          The FILEDES corresponds to an object that cannot be
+          positioned, such as a pipe, FIFO or terminal device.  (POSIX.1
+          specifies this error only for pipes and FIFOs, but on GNU
+          systems, you always get 'ESPIPE' if the object is not
+          seekable.)
+
+     When the source file is compiled with '_FILE_OFFSET_BITS == 64' the
+     'lseek' function is in fact 'lseek64' and the type 'off_t' has 64
+     bits which makes it possible to handle files up to 2^63 bytes in
+     length.
+
+     This function is a cancellation point in multi-threaded programs.
+     This is a problem if the thread allocates some resources (like
+     memory, file descriptors, semaphores or whatever) at the time
+     'lseek' is called.  If the thread gets canceled these resources
+     stay allocated until the program ends.  To avoid this calls to
+     'lseek' should be protected using cancellation handlers.
+
+     The 'lseek' function is the underlying primitive for the 'fseek',
+     'fseeko', 'ftell', 'ftello' and 'rewind' functions, which operate
+     on streams instead of file descriptors.
+
+ -- Function: off64_t lseek64 (int FILEDES, off64_t OFFSET, int WHENCE)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is similar to the 'lseek' function.  The difference
+     is that the OFFSET parameter is of type 'off64_t' instead of
+     'off_t' which makes it possible on 32 bit machines to address files
+     larger than 2^31 bytes and up to 2^63 bytes.  The file descriptor
+     'filedes' must be opened using 'open64' since otherwise the large
+     offsets possible with 'off64_t' will lead to errors with a
+     descriptor in small file mode.
+
+     When the source file is compiled with '_FILE_OFFSET_BITS == 64' on
+     a 32 bits machine this function is actually available under the
+     name 'lseek' and so transparently replaces the 32 bit interface.
+
+   You can have multiple descriptors for the same file if you open the
+file more than once, or if you duplicate a descriptor with 'dup'.
+Descriptors that come from separate calls to 'open' have independent
+file positions; using 'lseek' on one descriptor has no effect on the
+other.  For example,
+
      {
-       tcsetattr (STDIN_FILENO, TCSANOW, &saved_attributes);
+       int d1, d2;
+       char buf[4];
+       d1 = open ("foo", O_RDONLY);
+       d2 = open ("foo", O_RDONLY);
+       lseek (d1, 1024, SEEK_SET);
+       read (d2, buf, 4);
      }
 
-     void
-     set_input_mode (void)
+will read the first four characters of the file 'foo'.  (The
+error-checking code necessary for a real program has been omitted here
+for brevity.)
+
+   By contrast, descriptors made by duplication share a common file
+position with the original descriptor that was duplicated.  Anything
+which alters the file position of one of the duplicates, including
+reading or writing data, affects all of them alike.  Thus, for example,
+
      {
-       struct termios tattr;
-       char *name;
+       int d1, d2, d3;
+       char buf1[4], buf2[4];
+       d1 = open ("foo", O_RDONLY);
+       d2 = dup (d1);
+       d3 = dup (d2);
+       lseek (d3, 1024, SEEK_SET);
+       read (d1, buf1, 4);
+       read (d2, buf2, 4);
+     }
 
-       /* Make sure stdin is a terminal. */
-       if (!isatty (STDIN_FILENO))
-         {
-           fprintf (stderr, "Not a terminal.\n");
-           exit (EXIT_FAILURE);
-         }
+will read four characters starting with the 1024'th character of 'foo',
+and then four more characters starting with the 1028'th character.
 
-       /* Save the terminal attributes so we can restore them later. */
-       tcgetattr (STDIN_FILENO, &saved_attributes);
-       atexit (reset_input_mode);
+ -- Data Type: off_t
+     This is a signed integer type used to represent file sizes.  In the
+     GNU C Library, this type is no narrower than 'int'.
 
-       /* Set the funny terminal modes. */
-       tcgetattr (STDIN_FILENO, &tattr);
-       tattr.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */
-       tattr.c_cc[VMIN] = 1;
-       tattr.c_cc[VTIME] = 0;
-       tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr);
+     If the source is compiled with '_FILE_OFFSET_BITS == 64' this type
+     is transparently replaced by 'off64_t'.
+
+ -- Data Type: off64_t
+     This type is used similar to 'off_t'.  The difference is that even
+     on 32 bit machines, where the 'off_t' type would have 32 bits,
+     'off64_t' has 64 bits and so is able to address files up to 2^63
+     bytes in length.
+
+     When compiling with '_FILE_OFFSET_BITS == 64' this type is
+     available under the name 'off_t'.
+
+   These aliases for the 'SEEK_...' constants exist for the sake of
+compatibility with older BSD systems.  They are defined in two different
+header files: 'fcntl.h' and 'sys/file.h'.
+
+'L_SET'
+     An alias for 'SEEK_SET'.
+
+'L_INCR'
+     An alias for 'SEEK_CUR'.
+
+'L_XTND'
+     An alias for 'SEEK_END'.
+
+
+File: libc.info,  Node: Descriptors and Streams,  Next: Stream/Descriptor Precautions,  Prev: File Position Primitive,  Up: Low-Level I/O
+
+13.4 Descriptors and Streams
+============================
+
+Given an open file descriptor, you can create a stream for it with the
+'fdopen' function.  You can get the underlying file descriptor for an
+existing stream with the 'fileno' function.  These functions are
+declared in the header file 'stdio.h'.
+
+ -- Function: FILE * fdopen (int FILEDES, const char *OPENTYPE)
+     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe mem lock |
+     *Note POSIX Safety Concepts::.
+
+     The 'fdopen' function returns a new stream for the file descriptor
+     FILEDES.
+
+     The OPENTYPE argument is interpreted in the same way as for the
+     'fopen' function (*note Opening Streams::), except that the 'b'
+     option is not permitted; this is because GNU systems make no
+     distinction between text and binary files.  Also, '"w"' and '"w+"'
+     do not cause truncation of the file; these have an effect only when
+     opening a file, and in this case the file has already been opened.
+     You must make sure that the OPENTYPE argument matches the actual
+     mode of the open file descriptor.
+
+     The return value is the new stream.  If the stream cannot be
+     created (for example, if the modes for the file indicated by the
+     file descriptor do not permit the access specified by the OPENTYPE
+     argument), a null pointer is returned instead.
+
+     In some other systems, 'fdopen' may fail to detect that the modes
+     for file descriptor do not permit the access specified by
+     'opentype'.  The GNU C Library always checks for this.
+
+   For an example showing the use of the 'fdopen' function, see *note
+Creating a Pipe::.
+
+ -- Function: int fileno (FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function returns the file descriptor associated with the
+     stream STREAM.  If an error is detected (for example, if the STREAM
+     is not valid) or if STREAM does not do I/O to a file, 'fileno'
+     returns -1.
+
+ -- Function: int fileno_unlocked (FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'fileno_unlocked' function is equivalent to the 'fileno'
+     function except that it does not implicitly lock the stream if the
+     state is 'FSETLOCKING_INTERNAL'.
+
+     This function is a GNU extension.
+
+   There are also symbolic constants defined in 'unistd.h' for the file
+descriptors belonging to the standard streams 'stdin', 'stdout', and
+'stderr'; see *note Standard Streams::.
+
+'STDIN_FILENO'
+     This macro has value '0', which is the file descriptor for standard
+     input.
+
+'STDOUT_FILENO'
+     This macro has value '1', which is the file descriptor for standard
+     output.
+
+'STDERR_FILENO'
+     This macro has value '2', which is the file descriptor for standard
+     error output.
+
+
+File: libc.info,  Node: Stream/Descriptor Precautions,  Next: Scatter-Gather,  Prev: Descriptors and Streams,  Up: Low-Level I/O
+
+13.5 Dangers of Mixing Streams and Descriptors
+==============================================
+
+You can have multiple file descriptors and streams (let's call both
+streams and descriptors "channels" for short) connected to the same
+file, but you must take care to avoid confusion between channels.  There
+are two cases to consider: "linked" channels that share a single file
+position value, and "independent" channels that have their own file
+positions.
+
+   It's best to use just one channel in your program for actual data
+transfer to any given file, except when all the access is for input.
+For example, if you open a pipe (something you can only do at the file
+descriptor level), either do all I/O with the descriptor, or construct a
+stream from the descriptor with 'fdopen' and then do all I/O with the
+stream.
+
+* Menu:
+
+* Linked Channels::	   Dealing with channels sharing a file position.
+* Independent Channels::   Dealing with separately opened, unlinked channels.
+* Cleaning Streams::	   Cleaning a stream makes it safe to use
+                            another channel.
+
+
+File: libc.info,  Node: Linked Channels,  Next: Independent Channels,  Up: Stream/Descriptor Precautions
+
+13.5.1 Linked Channels
+----------------------
+
+Channels that come from a single opening share the same file position;
+we call them "linked" channels.  Linked channels result when you make a
+stream from a descriptor using 'fdopen', when you get a descriptor from
+a stream with 'fileno', when you copy a descriptor with 'dup' or 'dup2',
+and when descriptors are inherited during 'fork'.  For files that don't
+support random access, such as terminals and pipes, _all_ channels are
+effectively linked.  On random-access files, all append-type output
+streams are effectively linked to each other.
+
+   If you have been using a stream for I/O (or have just opened the
+stream), and you want to do I/O using another channel (either a stream
+or a descriptor) that is linked to it, you must first "clean up" the
+stream that you have been using.  *Note Cleaning Streams::.
+
+   Terminating a process, or executing a new program in the process,
+destroys all the streams in the process.  If descriptors linked to these
+streams persist in other processes, their file positions become
+undefined as a result.  To prevent this, you must clean up the streams
+before destroying them.
+
+
+File: libc.info,  Node: Independent Channels,  Next: Cleaning Streams,  Prev: Linked Channels,  Up: Stream/Descriptor Precautions
+
+13.5.2 Independent Channels
+---------------------------
+
+When you open channels (streams or descriptors) separately on a seekable
+file, each channel has its own file position.  These are called
+"independent channels".
+
+   The system handles each channel independently.  Most of the time,
+this is quite predictable and natural (especially for input): each
+channel can read or write sequentially at its own place in the file.
+However, if some of the channels are streams, you must take these
+precautions:
+
+   * You should clean an output stream after use, before doing anything
+     else that might read or write from the same part of the file.
+
+   * You should clean an input stream before reading data that may have
+     been modified using an independent channel.  Otherwise, you might
+     read obsolete data that had been in the stream's buffer.
+
+   If you do output to one channel at the end of the file, this will
+certainly leave the other independent channels positioned somewhere
+before the new end.  You cannot reliably set their file positions to the
+new end of file before writing, because the file can always be extended
+by another process between when you set the file position and when you
+write the data.  Instead, use an append-type descriptor or stream; they
+always output at the current end of the file.  In order to make the
+end-of-file position accurate, you must clean the output channel you
+were using, if it is a stream.
+
+   It's impossible for two channels to have separate file pointers for a
+file that doesn't support random access.  Thus, channels for reading or
+writing such files are always linked, never independent.  Append-type
+channels are also always linked.  For these channels, follow the rules
+for linked channels; see *note Linked Channels::.
+
+
+File: libc.info,  Node: Cleaning Streams,  Prev: Independent Channels,  Up: Stream/Descriptor Precautions
+
+13.5.3 Cleaning Streams
+-----------------------
+
+You can use 'fflush' to clean a stream in most cases.
+
+   You can skip the 'fflush' if you know the stream is already clean.  A
+stream is clean whenever its buffer is empty.  For example, an
+unbuffered stream is always clean.  An input stream that is at
+end-of-file is clean.  A line-buffered stream is clean when the last
+character output was a newline.  However, a just-opened input stream
+might not be clean, as its input buffer might not be empty.
+
+   There is one case in which cleaning a stream is impossible on most
+systems.  This is when the stream is doing input from a file that is not
+random-access.  Such streams typically read ahead, and when the file is
+not random access, there is no way to give back the excess data already
+read.  When an input stream reads from a random-access file, 'fflush'
+does clean the stream, but leaves the file pointer at an unpredictable
+place; you must set the file pointer before doing any further I/O.
+
+   Closing an output-only stream also does 'fflush', so this is a valid
+way of cleaning an output stream.
+
+   You need not clean a stream before using its descriptor for control
+operations such as setting terminal modes; these operations don't affect
+the file position and are not affected by it.  You can use any
+descriptor for these operations, and all channels are affected
+simultaneously.  However, text already "output" to a stream but still
+buffered by the stream will be subject to the new terminal modes when
+subsequently flushed.  To make sure "past" output is covered by the
+terminal settings that were in effect at the time, flush the output
+streams for that terminal before setting the modes.  *Note Terminal
+Modes::.
+
+
+File: libc.info,  Node: Scatter-Gather,  Next: Memory-mapped I/O,  Prev: Stream/Descriptor Precautions,  Up: Low-Level I/O
+
+13.6 Fast Scatter-Gather I/O
+============================
+
+Some applications may need to read or write data to multiple buffers,
+which are separated in memory.  Although this can be done easily enough
+with multiple calls to 'read' and 'write', it is inefficient because
+there is overhead associated with each kernel call.
+
+   Instead, many platforms provide special high-speed primitives to
+perform these "scatter-gather" operations in a single kernel call.  The
+GNU C Library will provide an emulation on any system that lacks these
+primitives, so they are not a portability threat.  They are defined in
+'sys/uio.h'.
+
+   These functions are controlled with arrays of 'iovec' structures,
+which describe the location and size of each buffer.
+
+ -- Data Type: struct iovec
+
+     The 'iovec' structure describes a buffer.  It contains two fields:
+
+     'void *iov_base'
+          Contains the address of a buffer.
+
+     'size_t iov_len'
+          Contains the length of the buffer.
+
+ -- Function: ssize_t readv (int FILEDES, const struct iovec *VECTOR,
+          int COUNT)
+     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
+     POSIX Safety Concepts::.
+
+     The 'readv' function reads data from FILEDES and scatters it into
+     the buffers described in VECTOR, which is taken to be COUNT
+     structures long.  As each buffer is filled, data is sent to the
+     next.
+
+     Note that 'readv' is not guaranteed to fill all the buffers.  It
+     may stop at any point, for the same reasons 'read' would.
+
+     The return value is a count of bytes (_not_ buffers) read, 0
+     indicating end-of-file, or -1 indicating an error.  The possible
+     errors are the same as in 'read'.
+
+ -- Function: ssize_t writev (int FILEDES, const struct iovec *VECTOR,
+          int COUNT)
+     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
+     POSIX Safety Concepts::.
+
+     The 'writev' function gathers data from the buffers described in
+     VECTOR, which is taken to be COUNT structures long, and writes them
+     to 'filedes'.  As each buffer is written, it moves on to the next.
+
+     Like 'readv', 'writev' may stop midstream under the same conditions
+     'write' would.
+
+     The return value is a count of bytes written, or -1 indicating an
+     error.  The possible errors are the same as in 'write'.
+
+   Note that if the buffers are small (under about 1kB), high-level
+streams may be easier to use than these functions.  However, 'readv' and
+'writev' are more efficient when the individual buffers themselves (as
+opposed to the total output), are large.  In that case, a high-level
+stream would not be able to cache the data effectively.
+
+
+File: libc.info,  Node: Memory-mapped I/O,  Next: Waiting for I/O,  Prev: Scatter-Gather,  Up: Low-Level I/O
+
+13.7 Memory-mapped I/O
+======================
+
+On modern operating systems, it is possible to "mmap" (pronounced
+"em-map") a file to a region of memory.  When this is done, the file can
+be accessed just like an array in the program.
+
+   This is more efficient than 'read' or 'write', as only the regions of
+the file that a program actually accesses are loaded.  Accesses to
+not-yet-loaded parts of the mmapped region are handled in the same way
+as swapped out pages.
+
+   Since mmapped pages can be stored back to their file when physical
+memory is low, it is possible to mmap files orders of magnitude larger
+than both the physical memory _and_ swap space.  The only limit is
+address space.  The theoretical limit is 4GB on a 32-bit machine -
+however, the actual limit will be smaller since some areas will be
+reserved for other purposes.  If the LFS interface is used the file size
+on 32-bit systems is not limited to 2GB (offsets are signed which
+reduces the addressable area of 4GB by half); the full 64-bit are
+available.
+
+   Memory mapping only works on entire pages of memory.  Thus, addresses
+for mapping must be page-aligned, and length values will be rounded up.
+To determine the size of a page the machine uses one should use
+
+     size_t page_size = (size_t) sysconf (_SC_PAGESIZE);
+
+These functions are declared in 'sys/mman.h'.
+
+ -- Function: void * mmap (void *ADDRESS, size_t LENGTH, int PROTECT,
+          int FLAGS, int FILEDES, off_t OFFSET)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'mmap' function creates a new mapping, connected to bytes
+     (OFFSET) to (OFFSET + LENGTH - 1) in the file open on FILEDES.  A
+     new reference for the file specified by FILEDES is created, which
+     is not removed by closing the file.
+
+     ADDRESS gives a preferred starting address for the mapping.  'NULL'
+     expresses no preference.  Any previous mapping at that address is
+     automatically removed.  The address you give may still be changed,
+     unless you use the 'MAP_FIXED' flag.
+
+     PROTECT contains flags that control what kind of access is
+     permitted.  They include 'PROT_READ', 'PROT_WRITE', and
+     'PROT_EXEC', which permit reading, writing, and execution,
+     respectively.  Inappropriate access will cause a segfault (*note
+     Program Error Signals::).
+
+     Note that most hardware designs cannot support write permission
+     without read permission, and many do not distinguish read and
+     execute permission.  Thus, you may receive wider permissions than
+     you ask for, and mappings of write-only files may be denied even if
+     you do not use 'PROT_READ'.
+
+     FLAGS contains flags that control the nature of the map.  One of
+     'MAP_SHARED' or 'MAP_PRIVATE' must be specified.
+
+     They include:
+
+     'MAP_PRIVATE'
+          This specifies that writes to the region should never be
+          written back to the attached file.  Instead, a copy is made
+          for the process, and the region will be swapped normally if
+          memory runs low.  No other process will see the changes.
+
+          Since private mappings effectively revert to ordinary memory
+          when written to, you must have enough virtual memory for a
+          copy of the entire mmapped region if you use this mode with
+          'PROT_WRITE'.
+
+     'MAP_SHARED'
+          This specifies that writes to the region will be written back
+          to the file.  Changes made will be shared immediately with
+          other processes mmaping the same file.
+
+          Note that actual writing may take place at any time.  You need
+          to use 'msync', described below, if it is important that other
+          processes using conventional I/O get a consistent view of the
+          file.
+
+     'MAP_FIXED'
+          This forces the system to use the exact mapping address
+          specified in ADDRESS and fail if it can't.
+
+     'MAP_ANONYMOUS'
+     'MAP_ANON'
+          This flag tells the system to create an anonymous mapping, not
+          connected to a file.  FILEDES and OFF are ignored, and the
+          region is initialized with zeros.
+
+          Anonymous maps are used as the basic primitive to extend the
+          heap on some systems.  They are also useful to share data
+          between multiple tasks without creating a file.
+
+          On some systems using private anonymous mmaps is more
+          efficient than using 'malloc' for large blocks.  This is not
+          an issue with the GNU C Library, as the included 'malloc'
+          automatically uses 'mmap' where appropriate.
+
+     'mmap' returns the address of the new mapping, or 'MAP_FAILED' for
+     an error.
+
+     Possible errors include:
+
+     'EINVAL'
+
+          Either ADDRESS was unusable, or inconsistent FLAGS were given.
+
+     'EACCES'
+
+          FILEDES was not open for the type of access specified in
+          PROTECT.
+
+     'ENOMEM'
+
+          Either there is not enough memory for the operation, or the
+          process is out of address space.
+
+     'ENODEV'
+
+          This file is of a type that doesn't support mapping.
+
+     'ENOEXEC'
+
+          The file is on a filesystem that doesn't support mapping.
+
+ -- Function: void * mmap64 (void *ADDRESS, size_t LENGTH, int PROTECT,
+          int FLAGS, int FILEDES, off64_t OFFSET)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'mmap64' function is equivalent to the 'mmap' function but the
+     OFFSET parameter is of type 'off64_t'.  On 32-bit systems this
+     allows the file associated with the FILEDES descriptor to be larger
+     than 2GB. FILEDES must be a descriptor returned from a call to
+     'open64' or 'fopen64' and 'freopen64' where the descriptor is
+     retrieved with 'fileno'.
+
+     When the sources are translated with '_FILE_OFFSET_BITS == 64' this
+     function is actually available under the name 'mmap'.  I.e., the
+     new, extended API using 64 bit file sizes and offsets transparently
+     replaces the old API.
+
+ -- Function: int munmap (void *ADDR, size_t LENGTH)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'munmap' removes any memory maps from (ADDR) to (ADDR + LENGTH).
+     LENGTH should be the length of the mapping.
+
+     It is safe to unmap multiple mappings in one command, or include
+     unmapped space in the range.  It is also possible to unmap only
+     part of an existing mapping.  However, only entire pages can be
+     removed.  If LENGTH is not an even number of pages, it will be
+     rounded up.
+
+     It returns 0 for success and -1 for an error.
+
+     One error is possible:
+
+     'EINVAL'
+          The memory range given was outside the user mmap range or
+          wasn't page aligned.
+
+ -- Function: int msync (void *ADDRESS, size_t LENGTH, int FLAGS)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     When using shared mappings, the kernel can write the file at any
+     time before the mapping is removed.  To be certain data has
+     actually been written to the file and will be accessible to
+     non-memory-mapped I/O, it is necessary to use this function.
+
+     It operates on the region ADDRESS to (ADDRESS + LENGTH).  It may be
+     used on part of a mapping or multiple mappings, however the region
+     given should not contain any unmapped space.
+
+     FLAGS can contain some options:
+
+     'MS_SYNC'
+
+          This flag makes sure the data is actually written _to disk_.
+          Normally 'msync' only makes sure that accesses to a file with
+          conventional I/O reflect the recent changes.
+
+     'MS_ASYNC'
+
+          This tells 'msync' to begin the synchronization, but not to
+          wait for it to complete.
+
+     'msync' returns 0 for success and -1 for error.  Errors include:
+
+     'EINVAL'
+          An invalid region was given, or the FLAGS were invalid.
+
+     'EFAULT'
+          There is no existing mapping in at least part of the given
+          region.
+
+ -- Function: void * mremap (void *ADDRESS, size_t LENGTH, size_t
+          NEW_LENGTH, int FLAG)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function can be used to change the size of an existing memory
+     area.  ADDRESS and LENGTH must cover a region entirely mapped in
+     the same 'mmap' statement.  A new mapping with the same
+     characteristics will be returned with the length NEW_LENGTH.
+
+     One option is possible, 'MREMAP_MAYMOVE'.  If it is given in FLAGS,
+     the system may remove the existing mapping and create a new one of
+     the desired length in another location.
+
+     The address of the resulting mapping is returned, or -1.  Possible
+     error codes include:
+
+     'EFAULT'
+          There is no existing mapping in at least part of the original
+          region, or the region covers two or more distinct mappings.
+
+     'EINVAL'
+          The address given is misaligned or inappropriate.
+
+     'EAGAIN'
+          The region has pages locked, and if extended it would exceed
+          the process's resource limit for locked pages.  *Note Limits
+          on Resources::.
+
+     'ENOMEM'
+          The region is private writable, and insufficient virtual
+          memory is available to extend it.  Also, this error will occur
+          if 'MREMAP_MAYMOVE' is not given and the extension would
+          collide with another mapped region.
+
+   This function is only available on a few systems.  Except for
+performing optional optimizations one should not rely on this function.
+
+   Not all file descriptors may be mapped.  Sockets, pipes, and most
+devices only allow sequential access and do not fit into the mapping
+abstraction.  In addition, some regular files may not be mmapable, and
+older kernels may not support mapping at all.  Thus, programs using
+'mmap' should have a fallback method to use should it fail.  *Note
+(standards)Mmap::.
+
+ -- Function: int madvise (void *ADDR, size_t LENGTH, int ADVICE)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function can be used to provide the system with ADVICE about
+     the intended usage patterns of the memory region starting at ADDR
+     and extending LENGTH bytes.
+
+     The valid BSD values for ADVICE are:
+
+     'MADV_NORMAL'
+          The region should receive no further special treatment.
+
+     'MADV_RANDOM'
+          The region will be accessed via random page references.  The
+          kernel should page-in the minimal number of pages for each
+          page fault.
+
+     'MADV_SEQUENTIAL'
+          The region will be accessed via sequential page references.
+          This may cause the kernel to aggressively read-ahead,
+          expecting further sequential references after any page fault
+          within this region.
+
+     'MADV_WILLNEED'
+          The region will be needed.  The pages within this region may
+          be pre-faulted in by the kernel.
+
+     'MADV_DONTNEED'
+          The region is no longer needed.  The kernel may free these
+          pages, causing any changes to the pages to be lost, as well as
+          swapped out pages to be discarded.
+
+     The POSIX names are slightly different, but with the same meanings:
+
+     'POSIX_MADV_NORMAL'
+          This corresponds with BSD's 'MADV_NORMAL'.
+
+     'POSIX_MADV_RANDOM'
+          This corresponds with BSD's 'MADV_RANDOM'.
+
+     'POSIX_MADV_SEQUENTIAL'
+          This corresponds with BSD's 'MADV_SEQUENTIAL'.
+
+     'POSIX_MADV_WILLNEED'
+          This corresponds with BSD's 'MADV_WILLNEED'.
+
+     'POSIX_MADV_DONTNEED'
+          This corresponds with BSD's 'MADV_DONTNEED'.
+
+     'madvise' returns 0 for success and -1 for error.  Errors include:
+
+     'EINVAL'
+          An invalid region was given, or the ADVICE was invalid.
+
+     'EFAULT'
+          There is no existing mapping in at least part of the given
+          region.
+
+ -- Function: int shm_open (const char *NAME, int OFLAG, mode_t MODE)
+     Preliminary: | MT-Safe locale | AS-Unsafe init heap lock |
+     AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
+
+     This function returns a file descriptor that can be used to
+     allocate shared memory via mmap.  Unrelated processes can use same
+     NAME to create or open existing shared memory objects.
+
+     A NAME argument specifies the shared memory object to be opened.
+     In the GNU C Library it must be a string smaller than 'NAME_MAX'
+     bytes starting with an optional slash but containing no other
+     slashes.
+
+     The semantics of OFLAG and MODE arguments is same as in 'open'.
+
+     'shm_open' returns the file descriptor on success or -1 on error.
+     On failure 'errno' is set.
+
+ -- Function: int shm_unlink (const char *NAME)
+     Preliminary: | MT-Safe locale | AS-Unsafe init heap lock |
+     AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
+
+     This function is inverse of 'shm_open' and removes the object with
+     the given NAME previously created by 'shm_open'.
+
+     'shm_unlink' returns 0 on success or -1 on error.  On failure
+     'errno' is set.
+
+
+File: libc.info,  Node: Waiting for I/O,  Next: Synchronizing I/O,  Prev: Memory-mapped I/O,  Up: Low-Level I/O
+
+13.8 Waiting for Input or Output
+================================
+
+Sometimes a program needs to accept input on multiple input channels
+whenever input arrives.  For example, some workstations may have devices
+such as a digitizing tablet, function button box, or dial box that are
+connected via normal asynchronous serial interfaces; good user interface
+style requires responding immediately to input on any device.  Another
+example is a program that acts as a server to several other processes
+via pipes or sockets.
+
+   You cannot normally use 'read' for this purpose, because this blocks
+the program until input is available on one particular file descriptor;
+input on other channels won't wake it up.  You could set nonblocking
+mode and poll each file descriptor in turn, but this is very
+inefficient.
+
+   A better solution is to use the 'select' function.  This blocks the
+program until input or output is ready on a specified set of file
+descriptors, or until a timer expires, whichever comes first.  This
+facility is declared in the header file 'sys/types.h'.
+
+   In the case of a server socket (*note Listening::), we say that
+"input" is available when there are pending connections that could be
+accepted (*note Accepting Connections::).  'accept' for server sockets
+blocks and interacts with 'select' just as 'read' does for normal input.
+
+   The file descriptor sets for the 'select' function are specified as
+'fd_set' objects.  Here is the description of the data type and some
+macros for manipulating these objects.
+
+ -- Data Type: fd_set
+     The 'fd_set' data type represents file descriptor sets for the
+     'select' function.  It is actually a bit array.
+
+ -- Macro: int FD_SETSIZE
+     The value of this macro is the maximum number of file descriptors
+     that a 'fd_set' object can hold information about.  On systems with
+     a fixed maximum number, 'FD_SETSIZE' is at least that number.  On
+     some systems, including GNU, there is no absolute limit on the
+     number of descriptors open, but this macro still has a constant
+     value which controls the number of bits in an 'fd_set'; if you get
+     a file descriptor with a value as high as 'FD_SETSIZE', you cannot
+     put that descriptor into an 'fd_set'.
+
+ -- Macro: void FD_ZERO (fd_set *SET)
+     Preliminary: | MT-Safe race:set | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     This macro initializes the file descriptor set SET to be the empty
+     set.
+
+ -- Macro: void FD_SET (int FILEDES, fd_set *SET)
+     Preliminary: | MT-Safe race:set | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     This macro adds FILEDES to the file descriptor set SET.
+
+     The FILEDES parameter must not have side effects since it is
+     evaluated more than once.
+
+ -- Macro: void FD_CLR (int FILEDES, fd_set *SET)
+     Preliminary: | MT-Safe race:set | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     This macro removes FILEDES from the file descriptor set SET.
+
+     The FILEDES parameter must not have side effects since it is
+     evaluated more than once.
+
+ -- Macro: int FD_ISSET (int FILEDES, const fd_set *SET)
+     Preliminary: | MT-Safe race:set | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     This macro returns a nonzero value (true) if FILEDES is a member of
+     the file descriptor set SET, and zero (false) otherwise.
+
+     The FILEDES parameter must not have side effects since it is
+     evaluated more than once.
+
+   Next, here is the description of the 'select' function itself.
+
+ -- Function: int select (int NFDS, fd_set *READ-FDS, fd_set *WRITE-FDS,
+          fd_set *EXCEPT-FDS, struct timeval *TIMEOUT)
+     Preliminary: | MT-Safe race:read-fds race:write-fds race:except-fds
+     | AS-Safe | AC-Safe | *Note POSIX Safety Concepts::.
+
+     The 'select' function blocks the calling process until there is
+     activity on any of the specified sets of file descriptors, or until
+     the timeout period has expired.
+
+     The file descriptors specified by the READ-FDS argument are checked
+     to see if they are ready for reading; the WRITE-FDS file
+     descriptors are checked to see if they are ready for writing; and
+     the EXCEPT-FDS file descriptors are checked for exceptional
+     conditions.  You can pass a null pointer for any of these arguments
+     if you are not interested in checking for that kind of condition.
+
+     A file descriptor is considered ready for reading if a 'read' call
+     will not block.  This usually includes the read offset being at the
+     end of the file or there is an error to report.  A server socket is
+     considered ready for reading if there is a pending connection which
+     can be accepted with 'accept'; *note Accepting Connections::.  A
+     client socket is ready for writing when its connection is fully
+     established; *note Connecting::.
+
+     "Exceptional conditions" does not mean errors--errors are reported
+     immediately when an erroneous system call is executed, and do not
+     constitute a state of the descriptor.  Rather, they include
+     conditions such as the presence of an urgent message on a socket.
+     (*Note Sockets::, for information on urgent messages.)
+
+     The 'select' function checks only the first NFDS file descriptors.
+     The usual thing is to pass 'FD_SETSIZE' as the value of this
+     argument.
+
+     The TIMEOUT specifies the maximum time to wait.  If you pass a null
+     pointer for this argument, it means to block indefinitely until one
+     of the file descriptors is ready.  Otherwise, you should provide
+     the time in 'struct timeval' format; see *note High-Resolution
+     Calendar::.  Specify zero as the time (a 'struct timeval'
+     containing all zeros) if you want to find out which descriptors are
+     ready without waiting if none are ready.
+
+     The normal return value from 'select' is the total number of ready
+     file descriptors in all of the sets.  Each of the argument sets is
+     overwritten with information about the descriptors that are ready
+     for the corresponding operation.  Thus, to see if a particular
+     descriptor DESC has input, use 'FD_ISSET (DESC, READ-FDS)' after
+     'select' returns.
+
+     If 'select' returns because the timeout period expires, it returns
+     a value of zero.
+
+     Any signal will cause 'select' to return immediately.  So if your
+     program uses signals, you can't rely on 'select' to keep waiting
+     for the full time specified.  If you want to be sure of waiting for
+     a particular amount of time, you must check for 'EINTR' and repeat
+     the 'select' with a newly calculated timeout based on the current
+     time.  See the example below.  See also *note Interrupted
+     Primitives::.
+
+     If an error occurs, 'select' returns '-1' and does not modify the
+     argument file descriptor sets.  The following 'errno' error
+     conditions are defined for this function:
+
+     'EBADF'
+          One of the file descriptor sets specified an invalid file
+          descriptor.
+
+     'EINTR'
+          The operation was interrupted by a signal.  *Note Interrupted
+          Primitives::.
+
+     'EINVAL'
+          The TIMEOUT argument is invalid; one of the components is
+          negative or too large.
+
+   *Portability Note:* The 'select' function is a BSD Unix feature.
+
+   Here is an example showing how you can use 'select' to establish a
+timeout period for reading from a file descriptor.  The 'input_timeout'
+function blocks the calling process until input is available on the file
+descriptor, or until the timeout period expires.
+
+
+     #include <errno.h>
+     #include <stdio.h>
+     #include <unistd.h>
+     #include <sys/types.h>
+     #include <sys/time.h>
+
+     int
+     input_timeout (int filedes, unsigned int seconds)
+     {
+       fd_set set;
+       struct timeval timeout;
+
+       /* Initialize the file descriptor set. */
+       FD_ZERO (&set);
+       FD_SET (filedes, &set);
+
+       /* Initialize the timeout data structure. */
+       timeout.tv_sec = seconds;
+       timeout.tv_usec = 0;
+
+       /* 'select' returns 0 if timeout, 1 if input available, -1 if error. */
+       return TEMP_FAILURE_RETRY (select (FD_SETSIZE,
+                                          &set, NULL, NULL,
+                                          &timeout));
      }
 
      int
      main (void)
      {
-       char c;
-
-       set_input_mode ();
-
-       while (1)
-         {
-           read (STDIN_FILENO, &c, 1);
-           if (c == '\004')          /* `C-d' */
-             break;
-           else
-             putchar (c);
-         }
-
-       return EXIT_SUCCESS;
-     }
-
-   This program is careful to restore the original terminal modes before
-exiting or terminating with a signal.  It uses the `atexit' function
-(*note Cleanups on Exit::) to make sure this is done by `exit'.
-
-   The shell is supposed to take care of resetting the terminal modes
-when a process is stopped or continued; see *note Job Control::.  But
-some existing shells do not actually do this, so you may wish to
-establish handlers for job control signals that reset terminal modes.
-The above example does so.
-
-
-File: libc.info,  Node: Pseudo-Terminals,  Prev: Noncanon Example,  Up: Low-Level Terminal Interface
-
-17.8 Pseudo-Terminals
-=====================
-
-A "pseudo-terminal" is a special interprocess communication channel
-that acts like a terminal.  One end of the channel is called the
-"master" side or "master pseudo-terminal device", the other side is
-called the "slave" side.  Data written to the master side is received
-by the slave side as if it was the result of a user typing at an
-ordinary terminal, and data written to the slave side is sent to the
-master side as if it was written on an ordinary terminal.
-
-   Pseudo terminals are the way programs like `xterm' and `emacs'
-implement their terminal emulation functionality.
-
-* Menu:
-
-* Allocation::             Allocating a pseudo terminal.
-* Pseudo-Terminal Pairs::  How to open both sides of a
-                            pseudo-terminal in a single operation.
-
-
-File: libc.info,  Node: Allocation,  Next: Pseudo-Terminal Pairs,  Up: Pseudo-Terminals
-
-17.8.1 Allocating Pseudo-Terminals
-----------------------------------
-
-This subsection describes functions for allocating a pseudo-terminal,
-and for making this pseudo-terminal available for actual use.  These
-functions are declared in the header file `stdlib.h'.
-
- -- Function: int getpt (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
-     Concepts::.
-
-     The `getpt' function returns a new file descriptor for the next
-     available master pseudo-terminal.  The normal return value from
-     `getpt' is a non-negative integer file descriptor.  In the case of
-     an error, a value of -1 is returned instead.  The following
-     `errno' conditions are defined for this function:
-
-    `ENOENT'
-          There are no free master pseudo-terminals available.
-
-     This function is a GNU extension.
-
- -- Function: int grantpt (int FILEDES)
-     Preliminary: | MT-Safe locale | AS-Unsafe dlopen plugin heap lock
-     | AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
-
-     The `grantpt' function changes the ownership and access permission
-     of the slave pseudo-terminal device corresponding to the master
-     pseudo-terminal device associated with the file descriptor
-     FILEDES.  The owner is set from the real user ID of the calling
-     process (*note Process Persona::), and the group is set to a
-     special group (typically "tty") or from the real group ID of the
-     calling process.  The access permission is set such that the file
-     is both readable and writable by the owner and only writable by
-     the group.
-
-     On some systems this function is implemented by invoking a special
-     `setuid' root program (*note How Change Persona::).  As a
-     consequence, installing a signal handler for the `SIGCHLD' signal
-     (*note Job Control Signals::) may interfere with a call to
-     `grantpt'.
-
-     The normal return value from `grantpt' is 0; a value of -1 is
-     returned in case of failure.  The following `errno' error
-     conditions are defined for this function:
-
-    `EBADF'
-          The FILEDES argument is not a valid file descriptor.
-
-    `EINVAL'
-          The FILEDES argument is not associated with a master
-          pseudo-terminal device.
-
-    `EACCES'
-          The slave pseudo-terminal device corresponding to the master
-          associated with FILEDES could not be accessed.
-
-
- -- Function: int unlockpt (int FILEDES)
-     Preliminary: | MT-Safe | AS-Unsafe heap/bsd | AC-Unsafe mem fd |
-     *Note POSIX Safety Concepts::.
-
-     The `unlockpt' function unlocks the slave pseudo-terminal device
-     corresponding to the master pseudo-terminal device associated with
-     the file descriptor FILEDES.  On many systems, the slave can only
-     be opened after unlocking, so portable applications should always
-     call `unlockpt' before trying to open the slave.
-
-     The normal return value from `unlockpt' is 0; a value of -1 is
-     returned in case of failure.  The following `errno' error
-     conditions are defined for this function:
-
-    `EBADF'
-          The FILEDES argument is not a valid file descriptor.
-
-    `EINVAL'
-          The FILEDES argument is not associated with a master
-          pseudo-terminal device.
-
- -- Function: char * ptsname (int FILEDES)
-     Preliminary: | MT-Unsafe race:ptsname | AS-Unsafe heap/bsd |
-     AC-Unsafe mem fd | *Note POSIX Safety Concepts::.
-
-     If the file descriptor FILEDES is associated with a master
-     pseudo-terminal device, the `ptsname' function returns a pointer
-     to a statically-allocated, null-terminated string containing the
-     file name of the associated slave pseudo-terminal file.  This
-     string might be overwritten by subsequent calls to `ptsname'.
-
- -- Function: int ptsname_r (int FILEDES, char *BUF, size_t LEN)
-     Preliminary: | MT-Safe | AS-Unsafe heap/bsd | AC-Unsafe mem fd |
-     *Note POSIX Safety Concepts::.
-
-     The `ptsname_r' function is similar to the `ptsname' function
-     except that it places its result into the user-specified buffer
-     starting at BUF with length LEN.
-
-     This function is a GNU extension.
-
-   *Portability Note:* On System V derived systems, the file returned
-by the `ptsname' and `ptsname_r' functions may be STREAMS-based, and
-therefore require additional processing after opening before it
-actually behaves as a pseudo terminal.
-
-   Typical usage of these functions is illustrated by the following
-example:
-     int
-     open_pty_pair (int *amaster, int *aslave)
-     {
-       int master, slave;
-       char *name;
-
-       master = getpt ();
-       if (master < 0)
-         return 0;
-
-       if (grantpt (master) < 0 || unlockpt (master) < 0)
-         goto close_master;
-       name = ptsname (master);
-       if (name == NULL)
-         goto close_master;
-
-       slave = open (name, O_RDWR);
-       if (slave == -1)
-         goto close_master;
-
-       if (isastream (slave))
-         {
-           if (ioctl (slave, I_PUSH, "ptem") < 0
-               || ioctl (slave, I_PUSH, "ldterm") < 0)
-             goto close_slave;
-         }
-
-       *amaster = master;
-       *aslave = slave;
-       return 1;
-
-     close_slave:
-       close (slave);
-
-     close_master:
-       close (master);
+       fprintf (stderr, "select returned %d.\n",
+                input_timeout (STDIN_FILENO, 5));
        return 0;
      }
 
-
-File: libc.info,  Node: Pseudo-Terminal Pairs,  Prev: Allocation,  Up: Pseudo-Terminals
-
-17.8.2 Opening a Pseudo-Terminal Pair
--------------------------------------
-
-These functions, derived from BSD, are available in the separate
-`libutil' library, and declared in `pty.h'.
-
- -- Function: int openpty (int *AMASTER, int *ASLAVE, char *NAME, const
-          struct termios *TERMP, const struct winsize *WINP)
-     Preliminary: | MT-Safe locale | AS-Unsafe dlopen plugin heap lock
-     | AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
-
-     This function allocates and opens a pseudo-terminal pair,
-     returning the file descriptor for the master in *AMASTER, and the
-     file descriptor for the slave in *ASLAVE.  If the argument NAME is
-     not a null pointer, the file name of the slave pseudo-terminal
-     device is stored in `*name'.  If TERMP is not a null pointer, the
-     terminal attributes of the slave are set to the ones specified in
-     the structure that TERMP points to (*note Terminal Modes::).
-     Likewise, if the WINP is not a null pointer, the screen size of
-     the slave is set to the values specified in the structure that
-     WINP points to.
-
-     The normal return value from `openpty' is 0; a value of -1 is
-     returned in case of failure.  The following `errno' conditions are
-     defined for this function:
-
-    `ENOENT'
-          There are no free pseudo-terminal pairs available.
-
-     *Warning:* Using the `openpty' function with NAME not set to
-     `NULL' is *very dangerous* because it provides no protection
-     against overflowing the string NAME.  You should use the `ttyname'
-     function on the file descriptor returned in *SLAVE to find out the
-     file name of the slave pseudo-terminal device instead.
-
- -- Function: int forkpty (int *AMASTER, char *NAME, const struct
-          termios *TERMP, const struct winsize *WINP)
-     Preliminary: | MT-Safe locale | AS-Unsafe dlopen plugin heap lock
-     | AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
-
-     This function is similar to the `openpty' function, but in
-     addition, forks a new process (*note Creating a Process::) and
-     makes the newly opened slave pseudo-terminal device the
-     controlling terminal (*note Controlling Terminal::) for the child
-     process.
-
-     If the operation is successful, there are then both parent and
-     child processes and both see `forkpty' return, but with different
-     values: it returns a value of 0 in the child process and returns
-     the child's process ID in the parent process.
-
-     If the allocation of a pseudo-terminal pair or the process creation
-     failed, `forkpty' returns a value of -1 in the parent process.
-
-     *Warning:* The `forkpty' function has the same problems with
-     respect to the NAME argument as `openpty'.
+   There is another example showing the use of 'select' to multiplex
+input from multiple sockets in *note Server Example::.
 
 
-File: libc.info,  Node: Syslog,  Next: Mathematics,  Prev: Low-Level Terminal Interface,  Up: Top
+File: libc.info,  Node: Synchronizing I/O,  Next: Asynchronous I/O,  Prev: Waiting for I/O,  Up: Low-Level I/O
 
-18 Syslog
-*********
+13.9 Synchronizing I/O operations
+=================================
 
-This chapter describes facilities for issuing and logging messages of
-system administration interest.  This chapter has nothing to do with
-programs issuing messages to their own users or keeping private logs
-(One would typically do that with the facilities described in *note I/O
-on Streams::).
+In most modern operating systems, the normal I/O operations are not
+executed synchronously.  I.e., even if a 'write' system call returns,
+this does not mean the data is actually written to the media, e.g., the
+disk.
 
-   Most systems have a facility called "Syslog" that allows programs to
-submit messages of interest to system administrators and can be
-configured to pass these messages on in various ways, such as printing
-on the console, mailing to a particular person, or recording in a log
-file for future reference.
+   In situations where synchronization points are necessary, you can use
+special functions which ensure that all operations finish before they
+return.
 
-   A program uses the facilities in this chapter to submit such
-messages.
+ -- Function: void sync (void)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     A call to this function will not return as long as there is data
+     which has not been written to the device.  All dirty buffers in the
+     kernel will be written and so an overall consistent system can be
+     achieved (if no other process in parallel writes data).
+
+     A prototype for 'sync' can be found in 'unistd.h'.
+
+   Programs more often want to ensure that data written to a given file
+is committed, rather than all data in the system.  For this, 'sync' is
+overkill.
+
+ -- Function: int fsync (int FILDES)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'fsync' function can be used to make sure all data associated
+     with the open file FILDES is written to the device associated with
+     the descriptor.  The function call does not return unless all
+     actions have finished.
+
+     A prototype for 'fsync' can be found in 'unistd.h'.
+
+     This function is a cancellation point in multi-threaded programs.
+     This is a problem if the thread allocates some resources (like
+     memory, file descriptors, semaphores or whatever) at the time
+     'fsync' is called.  If the thread gets canceled these resources
+     stay allocated until the program ends.  To avoid this, calls to
+     'fsync' should be protected using cancellation handlers.
+
+     The return value of the function is zero if no error occurred.
+     Otherwise it is -1 and the global variable ERRNO is set to the
+     following values:
+     'EBADF'
+          The descriptor FILDES is not valid.
+
+     'EINVAL'
+          No synchronization is possible since the system does not
+          implement this.
+
+   Sometimes it is not even necessary to write all data associated with
+a file descriptor.  E.g., in database files which do not change in size
+it is enough to write all the file content data to the device.
+Meta-information, like the modification time etc., are not that
+important and leaving such information uncommitted does not prevent a
+successful recovering of the file in case of a problem.
+
+ -- Function: int fdatasync (int FILDES)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     When a call to the 'fdatasync' function returns, it is ensured that
+     all of the file data is written to the device.  For all pending I/O
+     operations, the parts guaranteeing data integrity finished.
+
+     Not all systems implement the 'fdatasync' operation.  On systems
+     missing this functionality 'fdatasync' is emulated by a call to
+     'fsync' since the performed actions are a superset of those
+     required by 'fdatasync'.
+
+     The prototype for 'fdatasync' is in 'unistd.h'.
+
+     The return value of the function is zero if no error occurred.
+     Otherwise it is -1 and the global variable ERRNO is set to the
+     following values:
+     'EBADF'
+          The descriptor FILDES is not valid.
+
+     'EINVAL'
+          No synchronization is possible since the system does not
+          implement this.
+
+
+File: libc.info,  Node: Asynchronous I/O,  Next: Control Operations,  Prev: Synchronizing I/O,  Up: Low-Level I/O
+
+13.10 Perform I/O Operations in Parallel
+========================================
+
+The POSIX.1b standard defines a new set of I/O operations which can
+significantly reduce the time an application spends waiting at I/O. The
+new functions allow a program to initiate one or more I/O operations and
+then immediately resume normal work while the I/O operations are
+executed in parallel.  This functionality is available if the 'unistd.h'
+file defines the symbol '_POSIX_ASYNCHRONOUS_IO'.
+
+   These functions are part of the library with realtime functions named
+'librt'.  They are not actually part of the 'libc' binary.  The
+implementation of these functions can be done using support in the
+kernel (if available) or using an implementation based on threads at
+userlevel.  In the latter case it might be necessary to link
+applications with the thread library 'libpthread' in addition to
+'librt'.
+
+   All AIO operations operate on files which were opened previously.
+There might be arbitrarily many operations running for one file.  The
+asynchronous I/O operations are controlled using a data structure named
+'struct aiocb' ("AIO control block").  It is defined in 'aio.h' as
+follows.
+
+ -- Data Type: struct aiocb
+     The POSIX.1b standard mandates that the 'struct aiocb' structure
+     contains at least the members described in the following table.
+     There might be more elements which are used by the implementation,
+     but depending upon these elements is not portable and is highly
+     deprecated.
+
+     'int aio_fildes'
+          This element specifies the file descriptor to be used for the
+          operation.  It must be a legal descriptor, otherwise the
+          operation will fail.
+
+          The device on which the file is opened must allow the seek
+          operation.  I.e., it is not possible to use any of the AIO
+          operations on devices like terminals where an 'lseek' call
+          would lead to an error.
+
+     'off_t aio_offset'
+          This element specifies the offset in the file at which the
+          operation (input or output) is performed.  Since the
+          operations are carried out in arbitrary order and more than
+          one operation for one file descriptor can be started, one
+          cannot expect a current read/write position of the file
+          descriptor.
+
+     'volatile void *aio_buf'
+          This is a pointer to the buffer with the data to be written or
+          the place where the read data is stored.
+
+     'size_t aio_nbytes'
+          This element specifies the length of the buffer pointed to by
+          'aio_buf'.
+
+     'int aio_reqprio'
+          If the platform has defined '_POSIX_PRIORITIZED_IO' and
+          '_POSIX_PRIORITY_SCHEDULING', the AIO requests are processed
+          based on the current scheduling priority.  The 'aio_reqprio'
+          element can then be used to lower the priority of the AIO
+          operation.
+
+     'struct sigevent aio_sigevent'
+          This element specifies how the calling process is notified
+          once the operation terminates.  If the 'sigev_notify' element
+          is 'SIGEV_NONE', no notification is sent.  If it is
+          'SIGEV_SIGNAL', the signal determined by 'sigev_signo' is
+          sent.  Otherwise, 'sigev_notify' must be 'SIGEV_THREAD'.  In
+          this case, a thread is created which starts executing the
+          function pointed to by 'sigev_notify_function'.
+
+     'int aio_lio_opcode'
+          This element is only used by the 'lio_listio' and
+          'lio_listio64' functions.  Since these functions allow an
+          arbitrary number of operations to start at once, and each
+          operation can be input or output (or nothing), the information
+          must be stored in the control block.  The possible values are:
+
+          'LIO_READ'
+               Start a read operation.  Read from the file at position
+               'aio_offset' and store the next 'aio_nbytes' bytes in the
+               buffer pointed to by 'aio_buf'.
+
+          'LIO_WRITE'
+               Start a write operation.  Write 'aio_nbytes' bytes
+               starting at 'aio_buf' into the file starting at position
+               'aio_offset'.
+
+          'LIO_NOP'
+               Do nothing for this control block.  This value is useful
+               sometimes when an array of 'struct aiocb' values contains
+               holes, i.e., some of the values must not be handled
+               although the whole array is presented to the 'lio_listio'
+               function.
+
+     When the sources are compiled using '_FILE_OFFSET_BITS == 64' on a
+     32 bit machine, this type is in fact 'struct aiocb64', since the
+     LFS interface transparently replaces the 'struct aiocb' definition.
+
+   For use with the AIO functions defined in the LFS, there is a similar
+type defined which replaces the types of the appropriate members with
+larger types but otherwise is equivalent to 'struct aiocb'.
+Particularly, all member names are the same.
+
+ -- Data Type: struct aiocb64
+     'int aio_fildes'
+          This element specifies the file descriptor which is used for
+          the operation.  It must be a legal descriptor since otherwise
+          the operation fails for obvious reasons.
+
+          The device on which the file is opened must allow the seek
+          operation.  I.e., it is not possible to use any of the AIO
+          operations on devices like terminals where an 'lseek' call
+          would lead to an error.
+
+     'off64_t aio_offset'
+          This element specifies at which offset in the file the
+          operation (input or output) is performed.  Since the operation
+          are carried in arbitrary order and more than one operation for
+          one file descriptor can be started, one cannot expect a
+          current read/write position of the file descriptor.
+
+     'volatile void *aio_buf'
+          This is a pointer to the buffer with the data to be written or
+          the place where the read data is stored.
+
+     'size_t aio_nbytes'
+          This element specifies the length of the buffer pointed to by
+          'aio_buf'.
+
+     'int aio_reqprio'
+          If for the platform '_POSIX_PRIORITIZED_IO' and
+          '_POSIX_PRIORITY_SCHEDULING' are defined the AIO requests are
+          processed based on the current scheduling priority.  The
+          'aio_reqprio' element can then be used to lower the priority
+          of the AIO operation.
+
+     'struct sigevent aio_sigevent'
+          This element specifies how the calling process is notified
+          once the operation terminates.  If the 'sigev_notify', element
+          is 'SIGEV_NONE' no notification is sent.  If it is
+          'SIGEV_SIGNAL', the signal determined by 'sigev_signo' is
+          sent.  Otherwise, 'sigev_notify' must be 'SIGEV_THREAD' in
+          which case a thread which starts executing the function
+          pointed to by 'sigev_notify_function'.
+
+     'int aio_lio_opcode'
+          This element is only used by the 'lio_listio' and
+          '[lio_listio64' functions.  Since these functions allow an
+          arbitrary number of operations to start at once, and since
+          each operation can be input or output (or nothing), the
+          information must be stored in the control block.  See the
+          description of 'struct aiocb' for a description of the
+          possible values.
+
+     When the sources are compiled using '_FILE_OFFSET_BITS == 64' on a
+     32 bit machine, this type is available under the name 'struct
+     aiocb64', since the LFS transparently replaces the old interface.
 
 * Menu:
 
-* Overview of Syslog::           Overview of a system's Syslog facility
-* Submitting Syslog Messages::   Functions to submit messages to Syslog
+* Asynchronous Reads/Writes::    Asynchronous Read and Write Operations.
+* Status of AIO Operations::     Getting the Status of AIO Operations.
+* Synchronizing AIO Operations:: Getting into a consistent state.
+* Cancel AIO Operations::        Cancellation of AIO Operations.
+* Configuration of AIO::         How to optimize the AIO implementation.
 
 
-File: libc.info,  Node: Overview of Syslog,  Next: Submitting Syslog Messages,  Up: Syslog
+File: libc.info,  Node: Asynchronous Reads/Writes,  Next: Status of AIO Operations,  Up: Asynchronous I/O
 
-18.1 Overview of Syslog
+13.10.1 Asynchronous Read and Write Operations
+----------------------------------------------
+
+ -- Function: int aio_read (struct aiocb *AIOCBP)
+     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
+     *Note POSIX Safety Concepts::.
+
+     This function initiates an asynchronous read operation.  It
+     immediately returns after the operation was enqueued or when an
+     error was encountered.
+
+     The first 'aiocbp->aio_nbytes' bytes of the file for which
+     'aiocbp->aio_fildes' is a descriptor are written to the buffer
+     starting at 'aiocbp->aio_buf'.  Reading starts at the absolute
+     position 'aiocbp->aio_offset' in the file.
+
+     If prioritized I/O is supported by the platform the
+     'aiocbp->aio_reqprio' value is used to adjust the priority before
+     the request is actually enqueued.
+
+     The calling process is notified about the termination of the read
+     request according to the 'aiocbp->aio_sigevent' value.
+
+     When 'aio_read' returns, the return value is zero if no error
+     occurred that can be found before the process is enqueued.  If such
+     an early error is found, the function returns -1 and sets 'errno'
+     to one of the following values:
+
+     'EAGAIN'
+          The request was not enqueued due to (temporarily) exceeded
+          resource limitations.
+     'ENOSYS'
+          The 'aio_read' function is not implemented.
+     'EBADF'
+          The 'aiocbp->aio_fildes' descriptor is not valid.  This
+          condition need not be recognized before enqueueing the request
+          and so this error might also be signaled asynchronously.
+     'EINVAL'
+          The 'aiocbp->aio_offset' or 'aiocbp->aio_reqpiro' value is
+          invalid.  This condition need not be recognized before
+          enqueueing the request and so this error might also be
+          signaled asynchronously.
+
+     If 'aio_read' returns zero, the current status of the request can
+     be queried using 'aio_error' and 'aio_return' functions.  As long
+     as the value returned by 'aio_error' is 'EINPROGRESS' the operation
+     has not yet completed.  If 'aio_error' returns zero, the operation
+     successfully terminated, otherwise the value is to be interpreted
+     as an error code.  If the function terminated, the result of the
+     operation can be obtained using a call to 'aio_return'.  The
+     returned value is the same as an equivalent call to 'read' would
+     have returned.  Possible error codes returned by 'aio_error' are:
+
+     'EBADF'
+          The 'aiocbp->aio_fildes' descriptor is not valid.
+     'ECANCELED'
+          The operation was canceled before the operation was finished
+          (*note Cancel AIO Operations::)
+     'EINVAL'
+          The 'aiocbp->aio_offset' value is invalid.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' this
+     function is in fact 'aio_read64' since the LFS interface
+     transparently replaces the normal implementation.
+
+ -- Function: int aio_read64 (struct aiocb64 *AIOCBP)
+     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
+     *Note POSIX Safety Concepts::.
+
+     This function is similar to the 'aio_read' function.  The only
+     difference is that on 32 bit machines, the file descriptor should
+     be opened in the large file mode.  Internally, 'aio_read64' uses
+     functionality equivalent to 'lseek64' (*note File Position
+     Primitive::) to position the file descriptor correctly for the
+     reading, as opposed to 'lseek' functionality used in 'aio_read'.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64', this
+     function is available under the name 'aio_read' and so
+     transparently replaces the interface for small files on 32 bit
+     machines.
+
+   To write data asynchronously to a file, there exists an equivalent
+pair of functions with a very similar interface.
+
+ -- Function: int aio_write (struct aiocb *AIOCBP)
+     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
+     *Note POSIX Safety Concepts::.
+
+     This function initiates an asynchronous write operation.  The
+     function call immediately returns after the operation was enqueued
+     or if before this happens an error was encountered.
+
+     The first 'aiocbp->aio_nbytes' bytes from the buffer starting at
+     'aiocbp->aio_buf' are written to the file for which
+     'aiocbp->aio_fildes' is a descriptor, starting at the absolute
+     position 'aiocbp->aio_offset' in the file.
+
+     If prioritized I/O is supported by the platform, the
+     'aiocbp->aio_reqprio' value is used to adjust the priority before
+     the request is actually enqueued.
+
+     The calling process is notified about the termination of the read
+     request according to the 'aiocbp->aio_sigevent' value.
+
+     When 'aio_write' returns, the return value is zero if no error
+     occurred that can be found before the process is enqueued.  If such
+     an early error is found the function returns -1 and sets 'errno' to
+     one of the following values.
+
+     'EAGAIN'
+          The request was not enqueued due to (temporarily) exceeded
+          resource limitations.
+     'ENOSYS'
+          The 'aio_write' function is not implemented.
+     'EBADF'
+          The 'aiocbp->aio_fildes' descriptor is not valid.  This
+          condition may not be recognized before enqueueing the request,
+          and so this error might also be signaled asynchronously.
+     'EINVAL'
+          The 'aiocbp->aio_offset' or 'aiocbp->aio_reqprio' value is
+          invalid.  This condition may not be recognized before
+          enqueueing the request and so this error might also be
+          signaled asynchronously.
+
+     In the case 'aio_write' returns zero, the current status of the
+     request can be queried using 'aio_error' and 'aio_return'
+     functions.  As long as the value returned by 'aio_error' is
+     'EINPROGRESS' the operation has not yet completed.  If 'aio_error'
+     returns zero, the operation successfully terminated, otherwise the
+     value is to be interpreted as an error code.  If the function
+     terminated, the result of the operation can be get using a call to
+     'aio_return'.  The returned value is the same as an equivalent call
+     to 'read' would have returned.  Possible error codes returned by
+     'aio_error' are:
+
+     'EBADF'
+          The 'aiocbp->aio_fildes' descriptor is not valid.
+     'ECANCELED'
+          The operation was canceled before the operation was finished.
+          (*note Cancel AIO Operations::)
+     'EINVAL'
+          The 'aiocbp->aio_offset' value is invalid.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64', this
+     function is in fact 'aio_write64' since the LFS interface
+     transparently replaces the normal implementation.
+
+ -- Function: int aio_write64 (struct aiocb64 *AIOCBP)
+     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
+     *Note POSIX Safety Concepts::.
+
+     This function is similar to the 'aio_write' function.  The only
+     difference is that on 32 bit machines the file descriptor should be
+     opened in the large file mode.  Internally 'aio_write64' uses
+     functionality equivalent to 'lseek64' (*note File Position
+     Primitive::) to position the file descriptor correctly for the
+     writing, as opposed to 'lseek' functionality used in 'aio_write'.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64', this
+     function is available under the name 'aio_write' and so
+     transparently replaces the interface for small files on 32 bit
+     machines.
+
+   Besides these functions with the more or less traditional interface,
+POSIX.1b also defines a function which can initiate more than one
+operation at a time, and which can handle freely mixed read and write
+operations.  It is therefore similar to a combination of 'readv' and
+'writev'.
+
+ -- Function: int lio_listio (int MODE, struct aiocb *const LIST[], int
+          NENT, struct sigevent *SIG)
+     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
+     *Note POSIX Safety Concepts::.
+
+     The 'lio_listio' function can be used to enqueue an arbitrary
+     number of read and write requests at one time.  The requests can
+     all be meant for the same file, all for different files or every
+     solution in between.
+
+     'lio_listio' gets the NENT requests from the array pointed to by
+     LIST.  The operation to be performed is determined by the
+     'aio_lio_opcode' member in each element of LIST.  If this field is
+     'LIO_READ' a read operation is enqueued, similar to a call of
+     'aio_read' for this element of the array (except that the way the
+     termination is signalled is different, as we will see below).  If
+     the 'aio_lio_opcode' member is 'LIO_WRITE' a write operation is
+     enqueued.  Otherwise the 'aio_lio_opcode' must be 'LIO_NOP' in
+     which case this element of LIST is simply ignored.  This
+     "operation" is useful in situations where one has a fixed array of
+     'struct aiocb' elements from which only a few need to be handled at
+     a time.  Another situation is where the 'lio_listio' call was
+     canceled before all requests are processed (*note Cancel AIO
+     Operations::) and the remaining requests have to be reissued.
+
+     The other members of each element of the array pointed to by 'list'
+     must have values suitable for the operation as described in the
+     documentation for 'aio_read' and 'aio_write' above.
+
+     The MODE argument determines how 'lio_listio' behaves after having
+     enqueued all the requests.  If MODE is 'LIO_WAIT' it waits until
+     all requests terminated.  Otherwise MODE must be 'LIO_NOWAIT' and
+     in this case the function returns immediately after having enqueued
+     all the requests.  In this case the caller gets a notification of
+     the termination of all requests according to the SIG parameter.  If
+     SIG is 'NULL' no notification is send.  Otherwise a signal is sent
+     or a thread is started, just as described in the description for
+     'aio_read' or 'aio_write'.
+
+     If MODE is 'LIO_WAIT', the return value of 'lio_listio' is 0 when
+     all requests completed successfully.  Otherwise the function return
+     -1 and 'errno' is set accordingly.  To find out which request or
+     requests failed one has to use the 'aio_error' function on all the
+     elements of the array LIST.
+
+     In case MODE is 'LIO_NOWAIT', the function returns 0 if all
+     requests were enqueued correctly.  The current state of the
+     requests can be found using 'aio_error' and 'aio_return' as
+     described above.  If 'lio_listio' returns -1 in this mode, the
+     global variable 'errno' is set accordingly.  If a request did not
+     yet terminate, a call to 'aio_error' returns 'EINPROGRESS'.  If the
+     value is different, the request is finished and the error value (or
+     0) is returned and the result of the operation can be retrieved
+     using 'aio_return'.
+
+     Possible values for 'errno' are:
+
+     'EAGAIN'
+          The resources necessary to queue all the requests are not
+          available at the moment.  The error status for each element of
+          LIST must be checked to determine which request failed.
+
+          Another reason could be that the system wide limit of AIO
+          requests is exceeded.  This cannot be the case for the
+          implementation on GNU systems since no arbitrary limits exist.
+     'EINVAL'
+          The MODE parameter is invalid or NENT is larger than
+          'AIO_LISTIO_MAX'.
+     'EIO'
+          One or more of the request's I/O operations failed.  The error
+          status of each request should be checked to determine which
+          one failed.
+     'ENOSYS'
+          The 'lio_listio' function is not supported.
+
+     If the MODE parameter is 'LIO_NOWAIT' and the caller cancels a
+     request, the error status for this request returned by 'aio_error'
+     is 'ECANCELED'.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64', this
+     function is in fact 'lio_listio64' since the LFS interface
+     transparently replaces the normal implementation.
+
+ -- Function: int lio_listio64 (int MODE, struct aiocb64 *const LIST[],
+          int NENT, struct sigevent *SIG)
+     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
+     *Note POSIX Safety Concepts::.
+
+     This function is similar to the 'lio_listio' function.  The only
+     difference is that on 32 bit machines, the file descriptor should
+     be opened in the large file mode.  Internally, 'lio_listio64' uses
+     functionality equivalent to 'lseek64' (*note File Position
+     Primitive::) to position the file descriptor correctly for the
+     reading or writing, as opposed to 'lseek' functionality used in
+     'lio_listio'.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64', this
+     function is available under the name 'lio_listio' and so
+     transparently replaces the interface for small files on 32 bit
+     machines.
+
+
+File: libc.info,  Node: Status of AIO Operations,  Next: Synchronizing AIO Operations,  Prev: Asynchronous Reads/Writes,  Up: Asynchronous I/O
+
+13.10.2 Getting the Status of AIO Operations
+--------------------------------------------
+
+As already described in the documentation of the functions in the last
+section, it must be possible to get information about the status of an
+I/O request.  When the operation is performed truly asynchronously (as
+with 'aio_read' and 'aio_write' and with 'lio_listio' when the mode is
+'LIO_NOWAIT'), one sometimes needs to know whether a specific request
+already terminated and if so, what the result was.  The following two
+functions allow you to get this kind of information.
+
+ -- Function: int aio_error (const struct aiocb *AIOCBP)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function determines the error state of the request described
+     by the 'struct aiocb' variable pointed to by AIOCBP.  If the
+     request has not yet terminated the value returned is always
+     'EINPROGRESS'.  Once the request has terminated the value
+     'aio_error' returns is either 0 if the request completed
+     successfully or it returns the value which would be stored in the
+     'errno' variable if the request would have been done using 'read',
+     'write', or 'fsync'.
+
+     The function can return 'ENOSYS' if it is not implemented.  It
+     could also return 'EINVAL' if the AIOCBP parameter does not refer
+     to an asynchronous operation whose return status is not yet known.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' this
+     function is in fact 'aio_error64' since the LFS interface
+     transparently replaces the normal implementation.
+
+ -- Function: int aio_error64 (const struct aiocb64 *AIOCBP)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is similar to 'aio_error' with the only difference
+     that the argument is a reference to a variable of type 'struct
+     aiocb64'.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' this
+     function is available under the name 'aio_error' and so
+     transparently replaces the interface for small files on 32 bit
+     machines.
+
+ -- Function: ssize_t aio_return (struct aiocb *AIOCBP)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function can be used to retrieve the return status of the
+     operation carried out by the request described in the variable
+     pointed to by AIOCBP.  As long as the error status of this request
+     as returned by 'aio_error' is 'EINPROGRESS' the return of this
+     function is undefined.
+
+     Once the request is finished this function can be used exactly once
+     to retrieve the return value.  Following calls might lead to
+     undefined behavior.  The return value itself is the value which
+     would have been returned by the 'read', 'write', or 'fsync' call.
+
+     The function can return 'ENOSYS' if it is not implemented.  It
+     could also return 'EINVAL' if the AIOCBP parameter does not refer
+     to an asynchronous operation whose return status is not yet known.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' this
+     function is in fact 'aio_return64' since the LFS interface
+     transparently replaces the normal implementation.
+
+ -- Function: ssize_t aio_return64 (struct aiocb64 *AIOCBP)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is similar to 'aio_return' with the only difference
+     that the argument is a reference to a variable of type 'struct
+     aiocb64'.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' this
+     function is available under the name 'aio_return' and so
+     transparently replaces the interface for small files on 32 bit
+     machines.
+
+
+File: libc.info,  Node: Synchronizing AIO Operations,  Next: Cancel AIO Operations,  Prev: Status of AIO Operations,  Up: Asynchronous I/O
+
+13.10.3 Getting into a Consistent State
+---------------------------------------
+
+When dealing with asynchronous operations it is sometimes necessary to
+get into a consistent state.  This would mean for AIO that one wants to
+know whether a certain request or a group of request were processed.
+This could be done by waiting for the notification sent by the system
+after the operation terminated, but this sometimes would mean wasting
+resources (mainly computation time).  Instead POSIX.1b defines two
+functions which will help with most kinds of consistency.
+
+   The 'aio_fsync' and 'aio_fsync64' functions are only available if the
+symbol '_POSIX_SYNCHRONIZED_IO' is defined in 'unistd.h'.
+
+ -- Function: int aio_fsync (int OP, struct aiocb *AIOCBP)
+     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
+     *Note POSIX Safety Concepts::.
+
+     Calling this function forces all I/O operations operating queued at
+     the time of the function call operating on the file descriptor
+     'aiocbp->aio_fildes' into the synchronized I/O completion state
+     (*note Synchronizing I/O::).  The 'aio_fsync' function returns
+     immediately but the notification through the method described in
+     'aiocbp->aio_sigevent' will happen only after all requests for this
+     file descriptor have terminated and the file is synchronized.  This
+     also means that requests for this very same file descriptor which
+     are queued after the synchronization request are not affected.
+
+     If OP is 'O_DSYNC' the synchronization happens as with a call to
+     'fdatasync'.  Otherwise OP should be 'O_SYNC' and the
+     synchronization happens as with 'fsync'.
+
+     As long as the synchronization has not happened, a call to
+     'aio_error' with the reference to the object pointed to by AIOCBP
+     returns 'EINPROGRESS'.  Once the synchronization is done
+     'aio_error' return 0 if the synchronization was not successful.
+     Otherwise the value returned is the value to which the 'fsync' or
+     'fdatasync' function would have set the 'errno' variable.  In this
+     case nothing can be assumed about the consistency for the data
+     written to this file descriptor.
+
+     The return value of this function is 0 if the request was
+     successfully enqueued.  Otherwise the return value is -1 and
+     'errno' is set to one of the following values:
+
+     'EAGAIN'
+          The request could not be enqueued due to temporary lack of
+          resources.
+     'EBADF'
+          The file descriptor 'AIOCBP->aio_fildes' is not valid.
+     'EINVAL'
+          The implementation does not support I/O synchronization or the
+          OP parameter is other than 'O_DSYNC' and 'O_SYNC'.
+     'ENOSYS'
+          This function is not implemented.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' this
+     function is in fact 'aio_fsync64' since the LFS interface
+     transparently replaces the normal implementation.
+
+ -- Function: int aio_fsync64 (int OP, struct aiocb64 *AIOCBP)
+     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
+     *Note POSIX Safety Concepts::.
+
+     This function is similar to 'aio_fsync' with the only difference
+     that the argument is a reference to a variable of type 'struct
+     aiocb64'.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' this
+     function is available under the name 'aio_fsync' and so
+     transparently replaces the interface for small files on 32 bit
+     machines.
+
+   Another method of synchronization is to wait until one or more
+requests of a specific set terminated.  This could be achieved by the
+'aio_*' functions to notify the initiating process about the termination
+but in some situations this is not the ideal solution.  In a program
+which constantly updates clients somehow connected to the server it is
+not always the best solution to go round robin since some connections
+might be slow.  On the other hand letting the 'aio_*' function notify
+the caller might also be not the best solution since whenever the
+process works on preparing data for on client it makes no sense to be
+interrupted by a notification since the new client will not be handled
+before the current client is served.  For situations like this
+'aio_suspend' should be used.
+
+ -- Function: int aio_suspend (const struct aiocb *const LIST[], int
+          NENT, const struct timespec *TIMEOUT)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     When calling this function, the calling thread is suspended until
+     at least one of the requests pointed to by the NENT elements of the
+     array LIST has completed.  If any of the requests has already
+     completed at the time 'aio_suspend' is called, the function returns
+     immediately.  Whether a request has terminated or not is determined
+     by comparing the error status of the request with 'EINPROGRESS'.
+     If an element of LIST is 'NULL', the entry is simply ignored.
+
+     If no request has finished, the calling process is suspended.  If
+     TIMEOUT is 'NULL', the process is not woken until a request has
+     finished.  If TIMEOUT is not 'NULL', the process remains suspended
+     at least as long as specified in TIMEOUT.  In this case,
+     'aio_suspend' returns with an error.
+
+     The return value of the function is 0 if one or more requests from
+     the LIST have terminated.  Otherwise the function returns -1 and
+     'errno' is set to one of the following values:
+
+     'EAGAIN'
+          None of the requests from the LIST completed in the time
+          specified by TIMEOUT.
+     'EINTR'
+          A signal interrupted the 'aio_suspend' function.  This signal
+          might also be sent by the AIO implementation while signalling
+          the termination of one of the requests.
+     'ENOSYS'
+          The 'aio_suspend' function is not implemented.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' this
+     function is in fact 'aio_suspend64' since the LFS interface
+     transparently replaces the normal implementation.
+
+ -- Function: int aio_suspend64 (const struct aiocb64 *const LIST[], int
+          NENT, const struct timespec *TIMEOUT)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     This function is similar to 'aio_suspend' with the only difference
+     that the argument is a reference to a variable of type 'struct
+     aiocb64'.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' this
+     function is available under the name 'aio_suspend' and so
+     transparently replaces the interface for small files on 32 bit
+     machines.
+
+
+File: libc.info,  Node: Cancel AIO Operations,  Next: Configuration of AIO,  Prev: Synchronizing AIO Operations,  Up: Asynchronous I/O
+
+13.10.4 Cancellation of AIO Operations
+--------------------------------------
+
+When one or more requests are asynchronously processed, it might be
+useful in some situations to cancel a selected operation, e.g., if it
+becomes obvious that the written data is no longer accurate and would
+have to be overwritten soon.  As an example, assume an application,
+which writes data in files in a situation where new incoming data would
+have to be written in a file which will be updated by an enqueued
+request.  The POSIX AIO implementation provides such a function, but
+this function is not capable of forcing the cancellation of the request.
+It is up to the implementation to decide whether it is possible to
+cancel the operation or not.  Therefore using this function is merely a
+hint.
+
+ -- Function: int aio_cancel (int FILDES, struct aiocb *AIOCBP)
+     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
+     *Note POSIX Safety Concepts::.
+
+     The 'aio_cancel' function can be used to cancel one or more
+     outstanding requests.  If the AIOCBP parameter is 'NULL', the
+     function tries to cancel all of the outstanding requests which
+     would process the file descriptor FILDES (i.e., whose 'aio_fildes'
+     member is FILDES).  If AIOCBP is not 'NULL', 'aio_cancel' attempts
+     to cancel the specific request pointed to by AIOCBP.
+
+     For requests which were successfully canceled, the normal
+     notification about the termination of the request should take
+     place.  I.e., depending on the 'struct sigevent' object which
+     controls this, nothing happens, a signal is sent or a thread is
+     started.  If the request cannot be canceled, it terminates the
+     usual way after performing the operation.
+
+     After a request is successfully canceled, a call to 'aio_error'
+     with a reference to this request as the parameter will return
+     'ECANCELED' and a call to 'aio_return' will return -1.  If the
+     request wasn't canceled and is still running the error status is
+     still 'EINPROGRESS'.
+
+     The return value of the function is 'AIO_CANCELED' if there were
+     requests which haven't terminated and which were successfully
+     canceled.  If there is one or more requests left which couldn't be
+     canceled, the return value is 'AIO_NOTCANCELED'.  In this case
+     'aio_error' must be used to find out which of the, perhaps
+     multiple, requests (in AIOCBP is 'NULL') weren't successfully
+     canceled.  If all requests already terminated at the time
+     'aio_cancel' is called the return value is 'AIO_ALLDONE'.
+
+     If an error occurred during the execution of 'aio_cancel' the
+     function returns -1 and sets 'errno' to one of the following
+     values.
+
+     'EBADF'
+          The file descriptor FILDES is not valid.
+     'ENOSYS'
+          'aio_cancel' is not implemented.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64', this
+     function is in fact 'aio_cancel64' since the LFS interface
+     transparently replaces the normal implementation.
+
+ -- Function: int aio_cancel64 (int FILDES, struct aiocb64 *AIOCBP)
+     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
+     *Note POSIX Safety Concepts::.
+
+     This function is similar to 'aio_cancel' with the only difference
+     that the argument is a reference to a variable of type 'struct
+     aiocb64'.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64', this
+     function is available under the name 'aio_cancel' and so
+     transparently replaces the interface for small files on 32 bit
+     machines.
+
+
+File: libc.info,  Node: Configuration of AIO,  Prev: Cancel AIO Operations,  Up: Asynchronous I/O
+
+13.10.5 How to optimize the AIO implementation
+----------------------------------------------
+
+The POSIX standard does not specify how the AIO functions are
+implemented.  They could be system calls, but it is also possible to
+emulate them at userlevel.
+
+   At the point of this writing, the available implementation is a
+userlevel implementation which uses threads for handling the enqueued
+requests.  While this implementation requires making some decisions
+about limitations, hard limitations are something which is best avoided
+in the GNU C Library.  Therefore, the GNU C Library provides a means for
+tuning the AIO implementation according to the individual use.
+
+ -- Data Type: struct aioinit
+     This data type is used to pass the configuration or tunable
+     parameters to the implementation.  The program has to initialize
+     the members of this struct and pass it to the implementation using
+     the 'aio_init' function.
+
+     'int aio_threads'
+          This member specifies the maximal number of threads which may
+          be used at any one time.
+     'int aio_num'
+          This number provides an estimate on the maximal number of
+          simultaneously enqueued requests.
+     'int aio_locks'
+          Unused.
+     'int aio_usedba'
+          Unused.
+     'int aio_debug'
+          Unused.
+     'int aio_numusers'
+          Unused.
+     'int aio_reserved[2]'
+          Unused.
+
+ -- Function: void aio_init (const struct aioinit *INIT)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     This function must be called before any other AIO function.
+     Calling it is completely voluntary, as it is only meant to help the
+     AIO implementation perform better.
+
+     Before calling the 'aio_init', function the members of a variable
+     of type 'struct aioinit' must be initialized.  Then a reference to
+     this variable is passed as the parameter to 'aio_init' which itself
+     may or may not pay attention to the hints.
+
+     The function has no return value and no error cases are defined.
+     It is a extension which follows a proposal from the SGI
+     implementation in Irix 6.  It is not covered by POSIX.1b or Unix98.
+
+
+File: libc.info,  Node: Control Operations,  Next: Duplicating Descriptors,  Prev: Asynchronous I/O,  Up: Low-Level I/O
+
+13.11 Control Operations on Files
+=================================
+
+This section describes how you can perform various other operations on
+file descriptors, such as inquiring about or setting flags describing
+the status of the file descriptor, manipulating record locks, and the
+like.  All of these operations are performed by the function 'fcntl'.
+
+   The second argument to the 'fcntl' function is a command that
+specifies which operation to perform.  The function and macros that name
+various flags that are used with it are declared in the header file
+'fcntl.h'.  Many of these flags are also used by the 'open' function;
+see *note Opening and Closing Files::.
+
+ -- Function: int fcntl (int FILEDES, int COMMAND, ...)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'fcntl' function performs the operation specified by COMMAND on
+     the file descriptor FILEDES.  Some commands require additional
+     arguments to be supplied.  These additional arguments and the
+     return value and error conditions are given in the detailed
+     descriptions of the individual commands.
+
+     Briefly, here is a list of what the various commands are.
+
+     'F_DUPFD'
+          Duplicate the file descriptor (return another file descriptor
+          pointing to the same open file).  *Note Duplicating
+          Descriptors::.
+
+     'F_GETFD'
+          Get flags associated with the file descriptor.  *Note
+          Descriptor Flags::.
+
+     'F_SETFD'
+          Set flags associated with the file descriptor.  *Note
+          Descriptor Flags::.
+
+     'F_GETFL'
+          Get flags associated with the open file.  *Note File Status
+          Flags::.
+
+     'F_SETFL'
+          Set flags associated with the open file.  *Note File Status
+          Flags::.
+
+     'F_GETLK'
+          Get a file lock.  *Note File Locks::.
+
+     'F_SETLK'
+          Set or clear a file lock.  *Note File Locks::.
+
+     'F_SETLKW'
+          Like 'F_SETLK', but wait for completion.  *Note File Locks::.
+
+     'F_GETOWN'
+          Get process or process group ID to receive 'SIGIO' signals.
+          *Note Interrupt Input::.
+
+     'F_SETOWN'
+          Set process or process group ID to receive 'SIGIO' signals.
+          *Note Interrupt Input::.
+
+     This function is a cancellation point in multi-threaded programs.
+     This is a problem if the thread allocates some resources (like
+     memory, file descriptors, semaphores or whatever) at the time
+     'fcntl' is called.  If the thread gets canceled these resources
+     stay allocated until the program ends.  To avoid this calls to
+     'fcntl' should be protected using cancellation handlers.
+
+
+File: libc.info,  Node: Duplicating Descriptors,  Next: Descriptor Flags,  Prev: Control Operations,  Up: Low-Level I/O
+
+13.12 Duplicating Descriptors
+=============================
+
+You can "duplicate" a file descriptor, or allocate another file
+descriptor that refers to the same open file as the original.  Duplicate
+descriptors share one file position and one set of file status flags
+(*note File Status Flags::), but each has its own set of file descriptor
+flags (*note Descriptor Flags::).
+
+   The major use of duplicating a file descriptor is to implement
+"redirection" of input or output: that is, to change the file or pipe
+that a particular file descriptor corresponds to.
+
+   You can perform this operation using the 'fcntl' function with the
+'F_DUPFD' command, but there are also convenient functions 'dup' and
+'dup2' for duplicating descriptors.
+
+   The 'fcntl' function and flags are declared in 'fcntl.h', while
+prototypes for 'dup' and 'dup2' are in the header file 'unistd.h'.
+
+ -- Function: int dup (int OLD)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function copies descriptor OLD to the first available
+     descriptor number (the first number not currently open).  It is
+     equivalent to 'fcntl (OLD, F_DUPFD, 0)'.
+
+ -- Function: int dup2 (int OLD, int NEW)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function copies the descriptor OLD to descriptor number NEW.
+
+     If OLD is an invalid descriptor, then 'dup2' does nothing; it does
+     not close NEW.  Otherwise, the new duplicate of OLD replaces any
+     previous meaning of descriptor NEW, as if NEW were closed first.
+
+     If OLD and NEW are different numbers, and OLD is a valid descriptor
+     number, then 'dup2' is equivalent to:
+
+          close (NEW);
+          fcntl (OLD, F_DUPFD, NEW)
+
+     However, 'dup2' does this atomically; there is no instant in the
+     middle of calling 'dup2' at which NEW is closed and not yet a
+     duplicate of OLD.
+
+ -- Macro: int F_DUPFD
+     This macro is used as the COMMAND argument to 'fcntl', to copy the
+     file descriptor given as the first argument.
+
+     The form of the call in this case is:
+
+          fcntl (OLD, F_DUPFD, NEXT-FILEDES)
+
+     The NEXT-FILEDES argument is of type 'int' and specifies that the
+     file descriptor returned should be the next available one greater
+     than or equal to this value.
+
+     The return value from 'fcntl' with this command is normally the
+     value of the new file descriptor.  A return value of -1 indicates
+     an error.  The following 'errno' error conditions are defined for
+     this command:
+
+     'EBADF'
+          The OLD argument is invalid.
+
+     'EINVAL'
+          The NEXT-FILEDES argument is invalid.
+
+     'EMFILE'
+          There are no more file descriptors available--your program is
+          already using the maximum.  In BSD and GNU, the maximum is
+          controlled by a resource limit that can be changed; *note
+          Limits on Resources::, for more information about the
+          'RLIMIT_NOFILE' limit.
+
+     'ENFILE' is not a possible error code for 'dup2' because 'dup2'
+     does not create a new opening of a file; duplicate descriptors do
+     not count toward the limit which 'ENFILE' indicates.  'EMFILE' is
+     possible because it refers to the limit on distinct descriptor
+     numbers in use in one process.
+
+   Here is an example showing how to use 'dup2' to do redirection.
+Typically, redirection of the standard streams (like 'stdin') is done by
+a shell or shell-like program before calling one of the 'exec' functions
+(*note Executing a File::) to execute a new program in a child process.
+When the new program is executed, it creates and initializes the
+standard streams to point to the corresponding file descriptors, before
+its 'main' function is invoked.
+
+   So, to redirect standard input to a file, the shell could do
+something like:
+
+     pid = fork ();
+     if (pid == 0)
+       {
+         char *filename;
+         char *program;
+         int file;
+         ...
+         file = TEMP_FAILURE_RETRY (open (filename, O_RDONLY));
+         dup2 (file, STDIN_FILENO);
+         TEMP_FAILURE_RETRY (close (file));
+         execv (program, NULL);
+       }
+
+   There is also a more detailed example showing how to implement
+redirection in the context of a pipeline of processes in *note Launching
+Jobs::.
+
+
+File: libc.info,  Node: Descriptor Flags,  Next: File Status Flags,  Prev: Duplicating Descriptors,  Up: Low-Level I/O
+
+13.13 File Descriptor Flags
+===========================
+
+"File descriptor flags" are miscellaneous attributes of a file
+descriptor.  These flags are associated with particular file
+descriptors, so that if you have created duplicate file descriptors from
+a single opening of a file, each descriptor has its own set of flags.
+
+   Currently there is just one file descriptor flag: 'FD_CLOEXEC', which
+causes the descriptor to be closed if you use any of the 'exec...'
+functions (*note Executing a File::).
+
+   The symbols in this section are defined in the header file 'fcntl.h'.
+
+ -- Macro: int F_GETFD
+     This macro is used as the COMMAND argument to 'fcntl', to specify
+     that it should return the file descriptor flags associated with the
+     FILEDES argument.
+
+     The normal return value from 'fcntl' with this command is a
+     nonnegative number which can be interpreted as the bitwise OR of
+     the individual flags (except that currently there is only one flag
+     to use).
+
+     In case of an error, 'fcntl' returns -1.  The following 'errno'
+     error conditions are defined for this command:
+
+     'EBADF'
+          The FILEDES argument is invalid.
+
+ -- Macro: int F_SETFD
+     This macro is used as the COMMAND argument to 'fcntl', to specify
+     that it should set the file descriptor flags associated with the
+     FILEDES argument.  This requires a third 'int' argument to specify
+     the new flags, so the form of the call is:
+
+          fcntl (FILEDES, F_SETFD, NEW-FLAGS)
+
+     The normal return value from 'fcntl' with this command is an
+     unspecified value other than -1, which indicates an error.  The
+     flags and error conditions are the same as for the 'F_GETFD'
+     command.
+
+   The following macro is defined for use as a file descriptor flag with
+the 'fcntl' function.  The value is an integer constant usable as a bit
+mask value.
+
+ -- Macro: int FD_CLOEXEC
+     This flag specifies that the file descriptor should be closed when
+     an 'exec' function is invoked; see *note Executing a File::.  When
+     a file descriptor is allocated (as with 'open' or 'dup'), this bit
+     is initially cleared on the new file descriptor, meaning that
+     descriptor will survive into the new program after 'exec'.
+
+   If you want to modify the file descriptor flags, you should get the
+current flags with 'F_GETFD' and modify the value.  Don't assume that
+the flags listed here are the only ones that are implemented; your
+program may be run years from now and more flags may exist then.  For
+example, here is a function to set or clear the flag 'FD_CLOEXEC'
+without altering any other flags:
+
+     /* Set the 'FD_CLOEXEC' flag of DESC if VALUE is nonzero,
+        or clear the flag if VALUE is 0.
+        Return 0 on success, or -1 on error with 'errno' set. */
+
+     int
+     set_cloexec_flag (int desc, int value)
+     {
+       int oldflags = fcntl (desc, F_GETFD, 0);
+       /* If reading the flags failed, return error indication now. */
+       if (oldflags < 0)
+         return oldflags;
+       /* Set just the flag we want to set. */
+       if (value != 0)
+         oldflags |= FD_CLOEXEC;
+       else
+         oldflags &= ~FD_CLOEXEC;
+       /* Store modified flag word in the descriptor. */
+       return fcntl (desc, F_SETFD, oldflags);
+     }
+
+
+File: libc.info,  Node: File Status Flags,  Next: File Locks,  Prev: Descriptor Flags,  Up: Low-Level I/O
+
+13.14 File Status Flags
 =======================
 
-System administrators have to deal with lots of different kinds of
-messages from a plethora of subsystems within each system, and usually
-lots of systems as well.  For example, an FTP server might report every
-connection it gets.  The kernel might report hardware failures on a disk
-drive.  A DNS server might report usage statistics at regular intervals.
+"File status flags" are used to specify attributes of the opening of a
+file.  Unlike the file descriptor flags discussed in *note Descriptor
+Flags::, the file status flags are shared by duplicated file descriptors
+resulting from a single opening of the file.  The file status flags are
+specified with the FLAGS argument to 'open'; *note Opening and Closing
+Files::.
 
-   Some of these messages need to be brought to a system administrator's
-attention immediately.  And it may not be just any system administrator
-- there may be a particular system administrator who deals with a
-particular kind of message.  Other messages just need to be recorded for
-future reference if there is a problem.  Still others may need to have
-information extracted from them by an automated process that generates
-monthly reports.
+   File status flags fall into three categories, which are described in
+the following sections.
 
-   To deal with these messages, most Unix systems have a facility called
-"Syslog."  It is generally based on a daemon called "Syslogd" Syslogd
-listens for messages on a Unix domain socket named `/dev/log'.  Based
-on classification information in the messages and its configuration
-file (usually `/etc/syslog.conf'), Syslogd routes them in various ways.
-Some of the popular routings are:
+   * *note Access Modes::, specify what type of access is allowed to the
+     file: reading, writing, or both.  They are set by 'open' and are
+     returned by 'fcntl', but cannot be changed.
 
-   * Write to the system console
+   * *note Open-time Flags::, control details of what 'open' will do.
+     These flags are not preserved after the 'open' call.
 
-   * Mail to a specific user
+   * *note Operating Modes::, affect how operations such as 'read' and
+     'write' are done.  They are set by 'open', and can be fetched or
+     changed with 'fcntl'.
 
-   * Write to a log file
-
-   * Pass to another daemon
-
-   * Discard
-
-   Syslogd can also handle messages from other systems.  It listens on
-the `syslog' UDP port as well as the local socket for messages.
-
-   Syslog can handle messages from the kernel itself.  But the kernel
-doesn't write to `/dev/log'; rather, another daemon (sometimes called
-"Klogd") extracts messages from the kernel and passes them on to Syslog
-as any other process would (and it properly identifies them as messages
-from the kernel).
-
-   Syslog can even handle messages that the kernel issued before
-Syslogd or Klogd was running.  A Linux kernel, for example, stores
-startup messages in a kernel message ring and they are normally still
-there when Klogd later starts up.  Assuming Syslogd is running by the
-time Klogd starts, Klogd then passes everything in the message ring to
-it.
-
-   In order to classify messages for disposition, Syslog requires any
-process that submits a message to it to provide two pieces of
-classification information with it:
-
-facility
-     This identifies who submitted the message.  There are a small
-     number of facilities defined.  The kernel, the mail subsystem, and
-     an FTP server are examples of recognized facilities.  For the
-     complete list, *Note syslog; vsyslog::.  Keep in mind that these
-     are essentially arbitrary classifications.  "Mail subsystem"
-     doesn't have any more meaning than the system administrator gives
-     to it.
-
-priority
-     This tells how important the content of the message is.  Examples
-     of defined priority values are: debug, informational, warning,
-     critical.  For the complete list, see *note syslog; vsyslog::.
-     Except for the fact that the priorities have a defined order, the
-     meaning of each of these priorities is entirely determined by the
-     system administrator.
-
-
-   A "facility/priority" is a number that indicates both the facility
-and the priority.
-
-   *Warning:* This terminology is not universal.  Some people use
-"level" to refer to the priority and "priority" to refer to the
-combination of facility and priority.  A Linux kernel has a concept of a
-message "level," which corresponds both to a Syslog priority and to a
-Syslog facility/priority (It can be both because the facility code for
-the kernel is zero, and that makes priority and facility/priority the
-same value).
-
-   The GNU C Library provides functions to submit messages to Syslog.
-They do it by writing to the `/dev/log' socket.  *Note Submitting
-Syslog Messages::.
-
-   The GNU C Library functions only work to submit messages to the
-Syslog facility on the same system.  To submit a message to the Syslog
-facility on another system, use the socket I/O functions to write a UDP
-datagram to the `syslog' UDP port on that system.  *Note Sockets::.
-
-
-File: libc.info,  Node: Submitting Syslog Messages,  Prev: Overview of Syslog,  Up: Syslog
-
-18.2 Submitting Syslog Messages
-===============================
-
-The GNU C Library provides functions to submit messages to the Syslog
-facility:
+   The symbols in this section are defined in the header file 'fcntl.h'.
 
 * Menu:
 
-* openlog::                      Open connection to Syslog
-* syslog; vsyslog::              Submit message to Syslog
-* closelog::                     Close connection to Syslog
-* setlogmask::                   Cause certain messages to be ignored
-* Syslog Example::               Example of all of the above
+* Access Modes::                Whether the descriptor can read or write.
+* Open-time Flags::             Details of 'open'.
+* Operating Modes::             Special modes to control I/O operations.
+* Getting File Status Flags::   Fetching and changing these flags.
 
-   These functions only work to submit messages to the Syslog facility
-on the same system.  To submit a message to the Syslog facility on
-another system, use the socket I/O functions to write a UDP datagram to
-the `syslog' UDP port on that system.  *Note Sockets::.
+
+File: libc.info,  Node: Access Modes,  Next: Open-time Flags,  Up: File Status Flags
+
+13.14.1 File Access Modes
+-------------------------
+
+The file access modes allow a file descriptor to be used for reading,
+writing, or both.  (On GNU/Hurd systems, they can also allow none of
+these, and allow execution of the file as a program.)  The access modes
+are chosen when the file is opened, and never change.
+
+ -- Macro: int O_RDONLY
+     Open the file for read access.
+
+ -- Macro: int O_WRONLY
+     Open the file for write access.
+
+ -- Macro: int O_RDWR
+     Open the file for both reading and writing.
+
+   On GNU/Hurd systems (and not on other systems), 'O_RDONLY' and
+'O_WRONLY' are independent bits that can be bitwise-ORed together, and
+it is valid for either bit to be set or clear.  This means that 'O_RDWR'
+is the same as 'O_RDONLY|O_WRONLY'.  A file access mode of zero is
+permissible; it allows no operations that do input or output to the
+file, but does allow other operations such as 'fchmod'.  On GNU/Hurd
+systems, since "read-only" or "write-only" is a misnomer, 'fcntl.h'
+defines additional names for the file access modes.  These names are
+preferred when writing GNU-specific code.  But most programs will want
+to be portable to other POSIX.1 systems and should use the POSIX.1 names
+above instead.
+
+ -- Macro: int O_READ
+     Open the file for reading.  Same as 'O_RDONLY'; only defined on
+     GNU.
+
+ -- Macro: int O_WRITE
+     Open the file for writing.  Same as 'O_WRONLY'; only defined on
+     GNU.
+
+ -- Macro: int O_EXEC
+     Open the file for executing.  Only defined on GNU.
+
+   To determine the file access mode with 'fcntl', you must extract the
+access mode bits from the retrieved file status flags.  On GNU/Hurd
+systems, you can just test the 'O_READ' and 'O_WRITE' bits in the flags
+word.  But in other POSIX.1 systems, reading and writing access modes
+are not stored as distinct bit flags.  The portable way to extract the
+file access mode bits is with 'O_ACCMODE'.
+
+ -- Macro: int O_ACCMODE
+     This macro stands for a mask that can be bitwise-ANDed with the
+     file status flag value to produce a value representing the file
+     access mode.  The mode will be 'O_RDONLY', 'O_WRONLY', or 'O_RDWR'.
+     (On GNU/Hurd systems it could also be zero, and it never includes
+     the 'O_EXEC' bit.)
+
+
+File: libc.info,  Node: Open-time Flags,  Next: Operating Modes,  Prev: Access Modes,  Up: File Status Flags
+
+13.14.2 Open-time Flags
+-----------------------
+
+The open-time flags specify options affecting how 'open' will behave.
+These options are not preserved once the file is open.  The exception to
+this is 'O_NONBLOCK', which is also an I/O operating mode and so it _is_
+saved.  *Note Opening and Closing Files::, for how to call 'open'.
+
+   There are two sorts of options specified by open-time flags.
+
+   * "File name translation flags" affect how 'open' looks up the file
+     name to locate the file, and whether the file can be created.
+
+   * "Open-time action flags" specify extra operations that 'open' will
+     perform on the file once it is open.
+
+   Here are the file name translation flags.
+
+ -- Macro: int O_CREAT
+     If set, the file will be created if it doesn't already exist.
+
+ -- Macro: int O_EXCL
+     If both 'O_CREAT' and 'O_EXCL' are set, then 'open' fails if the
+     specified file already exists.  This is guaranteed to never clobber
+     an existing file.
+
+ -- Macro: int O_NONBLOCK
+     This prevents 'open' from blocking for a "long time" to open the
+     file.  This is only meaningful for some kinds of files, usually
+     devices such as serial ports; when it is not meaningful, it is
+     harmless and ignored.  Often opening a port to a modem blocks until
+     the modem reports carrier detection; if 'O_NONBLOCK' is specified,
+     'open' will return immediately without a carrier.
+
+     Note that the 'O_NONBLOCK' flag is overloaded as both an I/O
+     operating mode and a file name translation flag.  This means that
+     specifying 'O_NONBLOCK' in 'open' also sets nonblocking I/O mode;
+     *note Operating Modes::.  To open the file without blocking but do
+     normal I/O that blocks, you must call 'open' with 'O_NONBLOCK' set
+     and then call 'fcntl' to turn the bit off.
+
+ -- Macro: int O_NOCTTY
+     If the named file is a terminal device, don't make it the
+     controlling terminal for the process.  *Note Job Control::, for
+     information about what it means to be the controlling terminal.
+
+     On GNU/Hurd systems and 4.4 BSD, opening a file never makes it the
+     controlling terminal and 'O_NOCTTY' is zero.  However, GNU/Linux
+     systems and some other systems use a nonzero value for 'O_NOCTTY'
+     and set the controlling terminal when you open a file that is a
+     terminal device; so to be portable, use 'O_NOCTTY' when it is
+     important to avoid this.
+
+   The following three file name translation flags exist only on
+GNU/Hurd systems.
+
+ -- Macro: int O_IGNORE_CTTY
+     Do not recognize the named file as the controlling terminal, even
+     if it refers to the process's existing controlling terminal device.
+     Operations on the new file descriptor will never induce job control
+     signals.  *Note Job Control::.
+
+ -- Macro: int O_NOLINK
+     If the named file is a symbolic link, open the link itself instead
+     of the file it refers to.  ('fstat' on the new file descriptor will
+     return the information returned by 'lstat' on the link's name.)
+
+ -- Macro: int O_NOTRANS
+     If the named file is specially translated, do not invoke the
+     translator.  Open the bare file the translator itself sees.
+
+   The open-time action flags tell 'open' to do additional operations
+which are not really related to opening the file.  The reason to do them
+as part of 'open' instead of in separate calls is that 'open' can do
+them atomically.
+
+ -- Macro: int O_TRUNC
+     Truncate the file to zero length.  This option is only useful for
+     regular files, not special files such as directories or FIFOs.
+     POSIX.1 requires that you open the file for writing to use
+     'O_TRUNC'.  In BSD and GNU you must have permission to write the
+     file to truncate it, but you need not open for write access.
+
+     This is the only open-time action flag specified by POSIX.1.  There
+     is no good reason for truncation to be done by 'open', instead of
+     by calling 'ftruncate' afterwards.  The 'O_TRUNC' flag existed in
+     Unix before 'ftruncate' was invented, and is retained for backward
+     compatibility.
+
+   The remaining operating modes are BSD extensions.  They exist only on
+some systems.  On other systems, these macros are not defined.
+
+ -- Macro: int O_SHLOCK
+     Acquire a shared lock on the file, as with 'flock'.  *Note File
+     Locks::.
+
+     If 'O_CREAT' is specified, the locking is done atomically when
+     creating the file.  You are guaranteed that no other process will
+     get the lock on the new file first.
+
+ -- Macro: int O_EXLOCK
+     Acquire an exclusive lock on the file, as with 'flock'.  *Note File
+     Locks::.  This is atomic like 'O_SHLOCK'.
+
+
+File: libc.info,  Node: Operating Modes,  Next: Getting File Status Flags,  Prev: Open-time Flags,  Up: File Status Flags
+
+13.14.3 I/O Operating Modes
+---------------------------
+
+The operating modes affect how input and output operations using a file
+descriptor work.  These flags are set by 'open' and can be fetched and
+changed with 'fcntl'.
+
+ -- Macro: int O_APPEND
+     The bit that enables append mode for the file.  If set, then all
+     'write' operations write the data at the end of the file, extending
+     it, regardless of the current file position.  This is the only
+     reliable way to append to a file.  In append mode, you are
+     guaranteed that the data you write will always go to the current
+     end of the file, regardless of other processes writing to the file.
+     Conversely, if you simply set the file position to the end of file
+     and write, then another process can extend the file after you set
+     the file position but before you write, resulting in your data
+     appearing someplace before the real end of file.
+
+ -- Macro: int O_NONBLOCK
+     The bit that enables nonblocking mode for the file.  If this bit is
+     set, 'read' requests on the file can return immediately with a
+     failure status if there is no input immediately available, instead
+     of blocking.  Likewise, 'write' requests can also return
+     immediately with a failure status if the output can't be written
+     immediately.
+
+     Note that the 'O_NONBLOCK' flag is overloaded as both an I/O
+     operating mode and a file name translation flag; *note Open-time
+     Flags::.
+
+ -- Macro: int O_NDELAY
+     This is an obsolete name for 'O_NONBLOCK', provided for
+     compatibility with BSD. It is not defined by the POSIX.1 standard.
+
+   The remaining operating modes are BSD and GNU extensions.  They exist
+only on some systems.  On other systems, these macros are not defined.
+
+ -- Macro: int O_ASYNC
+     The bit that enables asynchronous input mode.  If set, then 'SIGIO'
+     signals will be generated when input is available.  *Note Interrupt
+     Input::.
+
+     Asynchronous input mode is a BSD feature.
+
+ -- Macro: int O_FSYNC
+     The bit that enables synchronous writing for the file.  If set,
+     each 'write' call will make sure the data is reliably stored on
+     disk before returning.
+
+     Synchronous writing is a BSD feature.
+
+ -- Macro: int O_SYNC
+     This is another name for 'O_FSYNC'.  They have the same value.
+
+ -- Macro: int O_NOATIME
+     If this bit is set, 'read' will not update the access time of the
+     file.  *Note File Times::.  This is used by programs that do
+     backups, so that backing a file up does not count as reading it.
+     Only the owner of the file or the superuser may use this bit.
+
+     This is a GNU extension.
+
+
+File: libc.info,  Node: Getting File Status Flags,  Prev: Operating Modes,  Up: File Status Flags
+
+13.14.4 Getting and Setting File Status Flags
+---------------------------------------------
+
+The 'fcntl' function can fetch or change file status flags.
+
+ -- Macro: int F_GETFL
+     This macro is used as the COMMAND argument to 'fcntl', to read the
+     file status flags for the open file with descriptor FILEDES.
+
+     The normal return value from 'fcntl' with this command is a
+     nonnegative number which can be interpreted as the bitwise OR of
+     the individual flags.  Since the file access modes are not
+     single-bit values, you can mask off other bits in the returned
+     flags with 'O_ACCMODE' to compare them.
+
+     In case of an error, 'fcntl' returns -1.  The following 'errno'
+     error conditions are defined for this command:
+
+     'EBADF'
+          The FILEDES argument is invalid.
+
+ -- Macro: int F_SETFL
+     This macro is used as the COMMAND argument to 'fcntl', to set the
+     file status flags for the open file corresponding to the FILEDES
+     argument.  This command requires a third 'int' argument to specify
+     the new flags, so the call looks like this:
+
+          fcntl (FILEDES, F_SETFL, NEW-FLAGS)
+
+     You can't change the access mode for the file in this way; that is,
+     whether the file descriptor was opened for reading or writing.
+
+     The normal return value from 'fcntl' with this command is an
+     unspecified value other than -1, which indicates an error.  The
+     error conditions are the same as for the 'F_GETFL' command.
+
+   If you want to modify the file status flags, you should get the
+current flags with 'F_GETFL' and modify the value.  Don't assume that
+the flags listed here are the only ones that are implemented; your
+program may be run years from now and more flags may exist then.  For
+example, here is a function to set or clear the flag 'O_NONBLOCK'
+without altering any other flags:
+
+     /* Set the 'O_NONBLOCK' flag of DESC if VALUE is nonzero,
+        or clear the flag if VALUE is 0.
+        Return 0 on success, or -1 on error with 'errno' set. */
+
+     int
+     set_nonblock_flag (int desc, int value)
+     {
+       int oldflags = fcntl (desc, F_GETFL, 0);
+       /* If reading the flags failed, return error indication now. */
+       if (oldflags == -1)
+         return -1;
+       /* Set just the flag we want to set. */
+       if (value != 0)
+         oldflags |= O_NONBLOCK;
+       else
+         oldflags &= ~O_NONBLOCK;
+       /* Store modified flag word in the descriptor. */
+       return fcntl (desc, F_SETFL, oldflags);
+     }
+
+
+File: libc.info,  Node: File Locks,  Next: Interrupt Input,  Prev: File Status Flags,  Up: Low-Level I/O
+
+13.15 File Locks
+================
+
+The remaining 'fcntl' commands are used to support "record locking",
+which permits multiple cooperating programs to prevent each other from
+simultaneously accessing parts of a file in error-prone ways.
+
+   An "exclusive" or "write" lock gives a process exclusive access for
+writing to the specified part of the file.  While a write lock is in
+place, no other process can lock that part of the file.
+
+   A "shared" or "read" lock prohibits any other process from requesting
+a write lock on the specified part of the file.  However, other
+processes can request read locks.
+
+   The 'read' and 'write' functions do not actually check to see whether
+there are any locks in place.  If you want to implement a locking
+protocol for a file shared by multiple processes, your application must
+do explicit 'fcntl' calls to request and clear locks at the appropriate
+points.
+
+   Locks are associated with processes.  A process can only have one
+kind of lock set for each byte of a given file.  When any file
+descriptor for that file is closed by the process, all of the locks that
+process holds on that file are released, even if the locks were made
+using other descriptors that remain open.  Likewise, locks are released
+when a process exits, and are not inherited by child processes created
+using 'fork' (*note Creating a Process::).
+
+   When making a lock, use a 'struct flock' to specify what kind of lock
+and where.  This data type and the associated macros for the 'fcntl'
+function are declared in the header file 'fcntl.h'.
+
+ -- Data Type: struct flock
+     This structure is used with the 'fcntl' function to describe a file
+     lock.  It has these members:
+
+     'short int l_type'
+          Specifies the type of the lock; one of 'F_RDLCK', 'F_WRLCK',
+          or 'F_UNLCK'.
+
+     'short int l_whence'
+          This corresponds to the WHENCE argument to 'fseek' or 'lseek',
+          and specifies what the offset is relative to.  Its value can
+          be one of 'SEEK_SET', 'SEEK_CUR', or 'SEEK_END'.
+
+     'off_t l_start'
+          This specifies the offset of the start of the region to which
+          the lock applies, and is given in bytes relative to the point
+          specified by 'l_whence' member.
+
+     'off_t l_len'
+          This specifies the length of the region to be locked.  A value
+          of '0' is treated specially; it means the region extends to
+          the end of the file.
+
+     'pid_t l_pid'
+          This field is the process ID (*note Process Creation
+          Concepts::) of the process holding the lock.  It is filled in
+          by calling 'fcntl' with the 'F_GETLK' command, but is ignored
+          when making a lock.
+
+ -- Macro: int F_GETLK
+     This macro is used as the COMMAND argument to 'fcntl', to specify
+     that it should get information about a lock.  This command requires
+     a third argument of type 'struct flock *' to be passed to 'fcntl',
+     so that the form of the call is:
+
+          fcntl (FILEDES, F_GETLK, LOCKP)
+
+     If there is a lock already in place that would block the lock
+     described by the LOCKP argument, information about that lock
+     overwrites '*LOCKP'.  Existing locks are not reported if they are
+     compatible with making a new lock as specified.  Thus, you should
+     specify a lock type of 'F_WRLCK' if you want to find out about both
+     read and write locks, or 'F_RDLCK' if you want to find out about
+     write locks only.
+
+     There might be more than one lock affecting the region specified by
+     the LOCKP argument, but 'fcntl' only returns information about one
+     of them.  The 'l_whence' member of the LOCKP structure is set to
+     'SEEK_SET' and the 'l_start' and 'l_len' fields set to identify the
+     locked region.
+
+     If no lock applies, the only change to the LOCKP structure is to
+     update the 'l_type' to a value of 'F_UNLCK'.
+
+     The normal return value from 'fcntl' with this command is an
+     unspecified value other than -1, which is reserved to indicate an
+     error.  The following 'errno' error conditions are defined for this
+     command:
+
+     'EBADF'
+          The FILEDES argument is invalid.
+
+     'EINVAL'
+          Either the LOCKP argument doesn't specify valid lock
+          information, or the file associated with FILEDES doesn't
+          support locks.
+
+ -- Macro: int F_SETLK
+     This macro is used as the COMMAND argument to 'fcntl', to specify
+     that it should set or clear a lock.  This command requires a third
+     argument of type 'struct flock *' to be passed to 'fcntl', so that
+     the form of the call is:
+
+          fcntl (FILEDES, F_SETLK, LOCKP)
+
+     If the process already has a lock on any part of the region, the
+     old lock on that part is replaced with the new lock.  You can
+     remove a lock by specifying a lock type of 'F_UNLCK'.
+
+     If the lock cannot be set, 'fcntl' returns immediately with a value
+     of -1.  This function does not block waiting for other processes to
+     release locks.  If 'fcntl' succeeds, it return a value other than
+     -1.
+
+     The following 'errno' error conditions are defined for this
+     function:
+
+     'EAGAIN'
+     'EACCES'
+          The lock cannot be set because it is blocked by an existing
+          lock on the file.  Some systems use 'EAGAIN' in this case, and
+          other systems use 'EACCES'; your program should treat them
+          alike, after 'F_SETLK'.  (GNU/Linux and GNU/Hurd systems
+          always use 'EAGAIN'.)
+
+     'EBADF'
+          Either: the FILEDES argument is invalid; you requested a read
+          lock but the FILEDES is not open for read access; or, you
+          requested a write lock but the FILEDES is not open for write
+          access.
+
+     'EINVAL'
+          Either the LOCKP argument doesn't specify valid lock
+          information, or the file associated with FILEDES doesn't
+          support locks.
+
+     'ENOLCK'
+          The system has run out of file lock resources; there are
+          already too many file locks in place.
+
+          Well-designed file systems never report this error, because
+          they have no limitation on the number of locks.  However, you
+          must still take account of the possibility of this error, as
+          it could result from network access to a file system on
+          another machine.
+
+ -- Macro: int F_SETLKW
+     This macro is used as the COMMAND argument to 'fcntl', to specify
+     that it should set or clear a lock.  It is just like the 'F_SETLK'
+     command, but causes the process to block (or wait) until the
+     request can be specified.
+
+     This command requires a third argument of type 'struct flock *', as
+     for the 'F_SETLK' command.
+
+     The 'fcntl' return values and errors are the same as for the
+     'F_SETLK' command, but these additional 'errno' error conditions
+     are defined for this command:
+
+     'EINTR'
+          The function was interrupted by a signal while it was waiting.
+          *Note Interrupted Primitives::.
+
+     'EDEADLK'
+          The specified region is being locked by another process.  But
+          that process is waiting to lock a region which the current
+          process has locked, so waiting for the lock would result in
+          deadlock.  The system does not guarantee that it will detect
+          all such conditions, but it lets you know if it notices one.
+
+   The following macros are defined for use as values for the 'l_type'
+member of the 'flock' structure.  The values are integer constants.
+
+'F_RDLCK'
+     This macro is used to specify a read (or shared) lock.
+
+'F_WRLCK'
+     This macro is used to specify a write (or exclusive) lock.
+
+'F_UNLCK'
+     This macro is used to specify that the region is unlocked.
+
+   As an example of a situation where file locking is useful, consider a
+program that can be run simultaneously by several different users, that
+logs status information to a common file.  One example of such a program
+might be a game that uses a file to keep track of high scores.  Another
+example might be a program that records usage or accounting information
+for billing purposes.
+
+   Having multiple copies of the program simultaneously writing to the
+file could cause the contents of the file to become mixed up.  But you
+can prevent this kind of problem by setting a write lock on the file
+before actually writing to the file.
+
+   If the program also needs to read the file and wants to make sure
+that the contents of the file are in a consistent state, then it can
+also use a read lock.  While the read lock is set, no other process can
+lock that part of the file for writing.
+
+   Remember that file locks are only a _voluntary_ protocol for
+controlling access to a file.  There is still potential for access to
+the file by programs that don't use the lock protocol.
+
+
+File: libc.info,  Node: Interrupt Input,  Next: IOCTLs,  Prev: File Locks,  Up: Low-Level I/O
+
+13.16 Interrupt-Driven Input
+============================
+
+If you set the 'O_ASYNC' status flag on a file descriptor (*note File
+Status Flags::), a 'SIGIO' signal is sent whenever input or output
+becomes possible on that file descriptor.  The process or process group
+to receive the signal can be selected by using the 'F_SETOWN' command to
+the 'fcntl' function.  If the file descriptor is a socket, this also
+selects the recipient of 'SIGURG' signals that are delivered when
+out-of-band data arrives on that socket; see *note Out-of-Band Data::.
+('SIGURG' is sent in any situation where 'select' would report the
+socket as having an "exceptional condition".  *Note Waiting for I/O::.)
+
+   If the file descriptor corresponds to a terminal device, then 'SIGIO'
+signals are sent to the foreground process group of the terminal.  *Note
+Job Control::.
+
+   The symbols in this section are defined in the header file 'fcntl.h'.
+
+ -- Macro: int F_GETOWN
+     This macro is used as the COMMAND argument to 'fcntl', to specify
+     that it should get information about the process or process group
+     to which 'SIGIO' signals are sent.  (For a terminal, this is
+     actually the foreground process group ID, which you can get using
+     'tcgetpgrp'; see *note Terminal Access Functions::.)
+
+     The return value is interpreted as a process ID; if negative, its
+     absolute value is the process group ID.
+
+     The following 'errno' error condition is defined for this command:
+
+     'EBADF'
+          The FILEDES argument is invalid.
+
+ -- Macro: int F_SETOWN
+     This macro is used as the COMMAND argument to 'fcntl', to specify
+     that it should set the process or process group to which 'SIGIO'
+     signals are sent.  This command requires a third argument of type
+     'pid_t' to be passed to 'fcntl', so that the form of the call is:
+
+          fcntl (FILEDES, F_SETOWN, PID)
+
+     The PID argument should be a process ID. You can also pass a
+     negative number whose absolute value is a process group ID.
+
+     The return value from 'fcntl' with this command is -1 in case of
+     error and some other value if successful.  The following 'errno'
+     error conditions are defined for this command:
+
+     'EBADF'
+          The FILEDES argument is invalid.
+
+     'ESRCH'
+          There is no process or process group corresponding to PID.
+
+
+File: libc.info,  Node: IOCTLs,  Prev: Interrupt Input,  Up: Low-Level I/O
+
+13.17 Generic I/O Control operations
+====================================
+
+GNU systems can handle most input/output operations on many different
+devices and objects in terms of a few file primitives - 'read', 'write'
+and 'lseek'.  However, most devices also have a few peculiar operations
+which do not fit into this model.  Such as:
+
+   * Changing the character font used on a terminal.
+
+   * Telling a magnetic tape system to rewind or fast forward.  (Since
+     they cannot move in byte increments, 'lseek' is inapplicable).
+
+   * Ejecting a disk from a drive.
+
+   * Playing an audio track from a CD-ROM drive.
+
+   * Maintaining routing tables for a network.
+
+   Although some such objects such as sockets and terminals (1) have
+special functions of their own, it would not be practical to create
+functions for all these cases.
+
+   Instead these minor operations, known as "IOCTL"s, are assigned code
+numbers and multiplexed through the 'ioctl' function, defined in
+'sys/ioctl.h'.  The code numbers themselves are defined in many
+different headers.
+
+ -- Function: int ioctl (int FILEDES, int COMMAND, ...)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'ioctl' function performs the generic I/O operation COMMAND on
+     FILEDES.
+
+     A third argument is usually present, either a single number or a
+     pointer to a structure.  The meaning of this argument, the returned
+     value, and any error codes depends upon the command used.  Often -1
+     is returned for a failure.
+
+   On some systems, IOCTLs used by different devices share the same
+numbers.  Thus, although use of an inappropriate IOCTL _usually_ only
+produces an error, you should not attempt to use device-specific IOCTLs
+on an unknown device.
+
+   Most IOCTLs are OS-specific and/or only used in special system
+utilities, and are thus beyond the scope of this document.  For an
+example of the use of an IOCTL, see *note Out-of-Band Data::.
+
+   ---------- Footnotes ----------
+
+   (1) Actually, the terminal-specific functions are implemented with
+IOCTLs on many platforms.
+
+
+File: libc.info,  Node: File System Interface,  Next: Pipes and FIFOs,  Prev: Low-Level I/O,  Up: Top
+
+14 File System Interface
+************************
+
+This chapter describes the GNU C Library's functions for manipulating
+files.  Unlike the input and output functions (*note I/O on Streams::;
+*note Low-Level I/O::), these functions are concerned with operating on
+the files themselves rather than on their contents.
+
+   Among the facilities described in this chapter are functions for
+examining or modifying directories, functions for renaming and deleting
+files, and functions for examining and setting file attributes such as
+access permissions and modification times.
+
+* Menu:
+
+* Working Directory::           This is used to resolve relative
+				 file names.
+* Accessing Directories::       Finding out what files a directory
+				 contains.
+* Working with Directory Trees:: Apply actions to all files or a selectable
+                                 subset of a directory hierarchy.
+* Hard Links::                  Adding alternate names to a file.
+* Symbolic Links::              A file that "points to" a file name.
+* Deleting Files::              How to delete a file, and what that means.
+* Renaming Files::              Changing a file's name.
+* Creating Directories::        A system call just for creating a directory.
+* File Attributes::             Attributes of individual files.
+* Making Special Files::        How to create special files.
+* Temporary Files::             Naming and creating temporary files.
+
+
+File: libc.info,  Node: Working Directory,  Next: Accessing Directories,  Up: File System Interface
+
+14.1 Working Directory
+======================
+
+Each process has associated with it a directory, called its "current
+working directory" or simply "working directory", that is used in the
+resolution of relative file names (*note File Name Resolution::).
+
+   When you log in and begin a new session, your working directory is
+initially set to the home directory associated with your login account
+in the system user database.  You can find any user's home directory
+using the 'getpwuid' or 'getpwnam' functions; see *note User Database::.
+
+   Users can change the working directory using shell commands like
+'cd'.  The functions described in this section are the primitives used
+by those commands and by other programs for examining and changing the
+working directory.
+
+   Prototypes for these functions are declared in the header file
+'unistd.h'.
+
+ -- Function: char * getcwd (char *BUFFER, size_t SIZE)
+     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
+     POSIX Safety Concepts::.
+
+     The 'getcwd' function returns an absolute file name representing
+     the current working directory, storing it in the character array
+     BUFFER that you provide.  The SIZE argument is how you tell the
+     system the allocation size of BUFFER.
+
+     The GNU C Library version of this function also permits you to
+     specify a null pointer for the BUFFER argument.  Then 'getcwd'
+     allocates a buffer automatically, as with 'malloc' (*note
+     Unconstrained Allocation::).  If the SIZE is greater than zero,
+     then the buffer is that large; otherwise, the buffer is as large as
+     necessary to hold the result.
+
+     The return value is BUFFER on success and a null pointer on
+     failure.  The following 'errno' error conditions are defined for
+     this function:
+
+     'EINVAL'
+          The SIZE argument is zero and BUFFER is not a null pointer.
+
+     'ERANGE'
+          The SIZE argument is less than the length of the working
+          directory name.  You need to allocate a bigger array and try
+          again.
+
+     'EACCES'
+          Permission to read or search a component of the file name was
+          denied.
+
+   You could implement the behavior of GNU's 'getcwd (NULL, 0)' using
+only the standard behavior of 'getcwd':
+
+     char *
+     gnu_getcwd ()
+     {
+       size_t size = 100;
+
+       while (1)
+         {
+           char *buffer = (char *) xmalloc (size);
+           if (getcwd (buffer, size) == buffer)
+             return buffer;
+           free (buffer);
+           if (errno != ERANGE)
+             return 0;
+           size *= 2;
+         }
+     }
+
+*Note Malloc Examples::, for information about 'xmalloc', which is not a
+library function but is a customary name used in most GNU software.
+
+ -- Deprecated Function: char * getwd (char *BUFFER)
+     Preliminary: | MT-Safe | AS-Unsafe heap i18n | AC-Unsafe mem fd |
+     *Note POSIX Safety Concepts::.
+
+     This is similar to 'getcwd', but has no way to specify the size of
+     the buffer.  The GNU C Library provides 'getwd' only for backwards
+     compatibility with BSD.
+
+     The BUFFER argument should be a pointer to an array at least
+     'PATH_MAX' bytes long (*note Limits for Files::).  On GNU/Hurd
+     systems there is no limit to the size of a file name, so this is
+     not necessarily enough space to contain the directory name.  That
+     is why this function is deprecated.
+
+ -- Function: char * get_current_dir_name (void)
+     Preliminary: | MT-Safe env | AS-Unsafe heap | AC-Unsafe mem fd |
+     *Note POSIX Safety Concepts::.
+
+     This 'get_current_dir_name' function is basically equivalent to
+     'getcwd (NULL, 0)'.  The only difference is that the value of the
+     'PWD' variable is returned if this value is correct.  This is a
+     subtle difference which is visible if the path described by the
+     'PWD' value is using one or more symbol links in which case the
+     value returned by 'getcwd' can resolve the symbol links and
+     therefore yield a different result.
+
+     This function is a GNU extension.
+
+ -- Function: int chdir (const char *FILENAME)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is used to set the process's working directory to
+     FILENAME.
+
+     The normal, successful return value from 'chdir' is '0'.  A value
+     of '-1' is returned to indicate an error.  The 'errno' error
+     conditions defined for this function are the usual file name syntax
+     errors (*note File Name Errors::), plus 'ENOTDIR' if the file
+     FILENAME is not a directory.
+
+ -- Function: int fchdir (int FILEDES)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is used to set the process's working directory to
+     directory associated with the file descriptor FILEDES.
+
+     The normal, successful return value from 'fchdir' is '0'.  A value
+     of '-1' is returned to indicate an error.  The following 'errno'
+     error conditions are defined for this function:
+
+     'EACCES'
+          Read permission is denied for the directory named by
+          'dirname'.
+
+     'EBADF'
+          The FILEDES argument is not a valid file descriptor.
+
+     'ENOTDIR'
+          The file descriptor FILEDES is not associated with a
+          directory.
+
+     'EINTR'
+          The function call was interrupt by a signal.
+
+     'EIO'
+          An I/O error occurred.
+
+
+File: libc.info,  Node: Accessing Directories,  Next: Working with Directory Trees,  Prev: Working Directory,  Up: File System Interface
+
+14.2 Accessing Directories
+==========================
+
+The facilities described in this section let you read the contents of a
+directory file.  This is useful if you want your program to list all the
+files in a directory, perhaps as part of a menu.
+
+   The 'opendir' function opens a "directory stream" whose elements are
+directory entries.  Alternatively 'fdopendir' can be used which can have
+advantages if the program needs to have more control over the way the
+directory is opened for reading.  This allows, for instance, to pass the
+'O_NOATIME' flag to 'open'.
+
+   You use the 'readdir' function on the directory stream to retrieve
+these entries, represented as 'struct dirent' objects.  The name of the
+file for each entry is stored in the 'd_name' member of this structure.
+There are obvious parallels here to the stream facilities for ordinary
+files, described in *note I/O on Streams::.
+
+* Menu:
+
+* Directory Entries::           Format of one directory entry.
+* Opening a Directory::         How to open a directory stream.
+* Reading/Closing Directory::   How to read directory entries from the stream.
+* Simple Directory Lister::     A very simple directory listing program.
+* Random Access Directory::     Rereading part of the directory
+                                 already read with the same stream.
+* Scanning Directory Content::  Get entries for user selected subset of
+                                 contents in given directory.
+* Simple Directory Lister Mark II::  Revised version of the program.
+
+
+File: libc.info,  Node: Directory Entries,  Next: Opening a Directory,  Up: Accessing Directories
+
+14.2.1 Format of a Directory Entry
+----------------------------------
+
+This section describes what you find in a single directory entry, as you
+might obtain it from a directory stream.  All the symbols are declared
+in the header file 'dirent.h'.
+
+ -- Data Type: struct dirent
+     This is a structure type used to return information about directory
+     entries.  It contains the following fields:
+
+     'char d_name[]'
+          This is the null-terminated file name component.  This is the
+          only field you can count on in all POSIX systems.
+
+     'ino_t d_fileno'
+          This is the file serial number.  For BSD compatibility, you
+          can also refer to this member as 'd_ino'.  On GNU/Linux and
+          GNU/Hurd systems and most POSIX systems, for most files this
+          the same as the 'st_ino' member that 'stat' will return for
+          the file.  *Note File Attributes::.
+
+     'unsigned char d_namlen'
+          This is the length of the file name, not including the
+          terminating null character.  Its type is 'unsigned char'
+          because that is the integer type of the appropriate size.
+          This member is a BSD extension.  The symbol
+          '_DIRENT_HAVE_D_NAMLEN' is defined if this member is
+          available.
+
+     'unsigned char d_type'
+          This is the type of the file, possibly unknown.  The following
+          constants are defined for its value:
+
+          'DT_UNKNOWN'
+               The type is unknown.  Only some filesystems have full
+               support to return the type of the file, others might
+               always return this value.
+
+          'DT_REG'
+               A regular file.
+
+          'DT_DIR'
+               A directory.
+
+          'DT_FIFO'
+               A named pipe, or FIFO. *Note FIFO Special Files::.
+
+          'DT_SOCK'
+               A local-domain socket.
+
+          'DT_CHR'
+               A character device.
+
+          'DT_BLK'
+               A block device.
+
+          'DT_LNK'
+               A symbolic link.
+
+          This member is a BSD extension.  The symbol
+          '_DIRENT_HAVE_D_TYPE' is defined if this member is available.
+          On systems where it is used, it corresponds to the file type
+          bits in the 'st_mode' member of 'struct stat'.  If the value
+          cannot be determine the member value is DT_UNKNOWN. These two
+          macros convert between 'd_type' values and 'st_mode' values:
+
+           -- Function: int IFTODT (mode_t MODE)
+               Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX
+               Safety Concepts::.
+
+               This returns the 'd_type' value corresponding to MODE.
+
+           -- Function: mode_t DTTOIF (int DTYPE)
+               Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX
+               Safety Concepts::.
+
+               This returns the 'st_mode' value corresponding to DTYPE.
+
+     This structure may contain additional members in the future.  Their
+     availability is always announced in the compilation environment by
+     a macro names '_DIRENT_HAVE_D_XXX' where XXX is replaced by the
+     name of the new member.  For instance, the member 'd_reclen'
+     available on some systems is announced through the macro
+     '_DIRENT_HAVE_D_RECLEN'.
+
+     When a file has multiple names, each name has its own directory
+     entry.  The only way you can tell that the directory entries belong
+     to a single file is that they have the same value for the
+     'd_fileno' field.
+
+     File attributes such as size, modification times etc., are part of
+     the file itself, not of any particular directory entry.  *Note File
+     Attributes::.
+
+
+File: libc.info,  Node: Opening a Directory,  Next: Reading/Closing Directory,  Prev: Directory Entries,  Up: Accessing Directories
+
+14.2.2 Opening a Directory Stream
+---------------------------------
+
+This section describes how to open a directory stream.  All the symbols
+are declared in the header file 'dirent.h'.
+
+ -- Data Type: DIR
+     The 'DIR' data type represents a directory stream.
+
+   You shouldn't ever allocate objects of the 'struct dirent' or 'DIR'
+data types, since the directory access functions do that for you.
+Instead, you refer to these objects using the pointers returned by the
+following functions.
+
+ -- Function: DIR * opendir (const char *DIRNAME)
+     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
+     POSIX Safety Concepts::.
+
+     The 'opendir' function opens and returns a directory stream for
+     reading the directory whose file name is DIRNAME.  The stream has
+     type 'DIR *'.
+
+     If unsuccessful, 'opendir' returns a null pointer.  In addition to
+     the usual file name errors (*note File Name Errors::), the
+     following 'errno' error conditions are defined for this function:
+
+     'EACCES'
+          Read permission is denied for the directory named by
+          'dirname'.
+
+     'EMFILE'
+          The process has too many files open.
+
+     'ENFILE'
+          The entire system, or perhaps the file system which contains
+          the directory, cannot support any additional open files at the
+          moment.  (This problem cannot happen on GNU/Hurd systems.)
+
+     'ENOMEM'
+          Not enough memory available.
+
+     The 'DIR' type is typically implemented using a file descriptor,
+     and the 'opendir' function in terms of the 'open' function.  *Note
+     Low-Level I/O::.  Directory streams and the underlying file
+     descriptors are closed on 'exec' (*note Executing a File::).
+
+   The directory which is opened for reading by 'opendir' is identified
+by the name.  In some situations this is not sufficient.  Or the way
+'opendir' implicitly creates a file descriptor for the directory is not
+the way a program might want it.  In these cases an alternative
+interface can be used.
+
+ -- Function: DIR * fdopendir (int FD)
+     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
+     POSIX Safety Concepts::.
+
+     The 'fdopendir' function works just like 'opendir' but instead of
+     taking a file name and opening a file descriptor for the directory
+     the caller is required to provide a file descriptor.  This file
+     descriptor is then used in subsequent uses of the returned
+     directory stream object.
+
+     The caller must make sure the file descriptor is associated with a
+     directory and it allows reading.
+
+     If the 'fdopendir' call returns successfully the file descriptor is
+     now under the control of the system.  It can be used in the same
+     way the descriptor implicitly created by 'opendir' can be used but
+     the program must not close the descriptor.
+
+     In case the function is unsuccessful it returns a null pointer and
+     the file descriptor remains to be usable by the program.  The
+     following 'errno' error conditions are defined for this function:
+
+     'EBADF'
+          The file descriptor is not valid.
+
+     'ENOTDIR'
+          The file descriptor is not associated with a directory.
+
+     'EINVAL'
+          The descriptor does not allow reading the directory content.
+
+     'ENOMEM'
+          Not enough memory available.
+
+   In some situations it can be desirable to get hold of the file
+descriptor which is created by the 'opendir' call.  For instance, to
+switch the current working directory to the directory just read the
+'fchdir' function could be used.  Historically the 'DIR' type was
+exposed and programs could access the fields.  This does not happen in
+the GNU C Library.  Instead a separate function is provided to allow
+access.
+
+ -- Function: int dirfd (DIR *DIRSTREAM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The function 'dirfd' returns the file descriptor associated with
+     the directory stream DIRSTREAM.  This descriptor can be used until
+     the directory is closed with 'closedir'.  If the directory stream
+     implementation is not using file descriptors the return value is
+     '-1'.
+
+
+File: libc.info,  Node: Reading/Closing Directory,  Next: Simple Directory Lister,  Prev: Opening a Directory,  Up: Accessing Directories
+
+14.2.3 Reading and Closing a Directory Stream
+---------------------------------------------
+
+This section describes how to read directory entries from a directory
+stream, and how to close the stream when you are done with it.  All the
+symbols are declared in the header file 'dirent.h'.
+
+ -- Function: struct dirent * readdir (DIR *DIRSTREAM)
+     Preliminary: | MT-Unsafe race:dirstream | AS-Unsafe lock |
+     AC-Unsafe lock | *Note POSIX Safety Concepts::.
+
+     This function reads the next entry from the directory.  It normally
+     returns a pointer to a structure containing information about the
+     file.  This structure is associated with the DIRSTREAM handle and
+     can be rewritten by a subsequent call.
+
+     *Portability Note:* On some systems 'readdir' may not return
+     entries for '.' and '..', even though these are always valid file
+     names in any directory.  *Note File Name Resolution::.
+
+     If there are no more entries in the directory or an error is
+     detected, 'readdir' returns a null pointer.  The following 'errno'
+     error conditions are defined for this function:
+
+     'EBADF'
+          The DIRSTREAM argument is not valid.
+
+     To distinguish between an end-of-directory condition or an error,
+     you must set 'errno' to zero before calling 'readdir'.  To avoid
+     entering an infinite loop, you should stop reading from the
+     directory after the first error.
+
+     In POSIX.1-2008, 'readdir' is not thread-safe.  In the GNU C
+     Library implementation, it is safe to call 'readdir' concurrently
+     on different DIRSTREAMs, but multiple threads accessing the same
+     DIRSTREAM result in undefined behavior.  'readdir_r' is a fully
+     thread-safe alternative, but suffers from poor portability (see
+     below).  It is recommended that you use 'readdir', with external
+     locking if multiple threads access the same DIRSTREAM.
+
+ -- Function: int readdir_r (DIR *DIRSTREAM, struct dirent *ENTRY,
+          struct dirent **RESULT)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     This function is a version of 'readdir' which performs internal
+     locking.  Like 'readdir' it returns the next entry from the
+     directory.  To prevent conflicts between simultaneously running
+     threads the result is stored inside the ENTRY object.
+
+     *Portability Note:* It is recommended to use 'readdir' instead of
+     'readdir_r' for the following reasons:
+
+        * On systems which do not define 'NAME_MAX', it may not be
+          possible to use 'readdir_r' safely because the caller does not
+          specify the length of the buffer for the directory entry.
+
+        * On some systems, 'readdir_r' cannot read directory entries
+          with very long names.  If such a name is encountered, the GNU
+          C Library implementation of 'readdir_r' returns with an error
+          code of 'ENAMETOOLONG' after the final directory entry has
+          been read.  On other systems, 'readdir_r' may return
+          successfully, but the 'd_name' member may not be
+          NUL-terminated or may be truncated.
+
+        * POSIX-1.2008 does not guarantee that 'readdir' is thread-safe,
+          even when access to the same DIRSTREAM is serialized.  But in
+          current implementations (including the GNU C Library), it is
+          safe to call 'readdir' concurrently on different DIRSTREAMs,
+          so there is no need to use 'readdir_r' in most multi-threaded
+          programs.  In the rare case that multiple threads need to read
+          from the same DIRSTREAM, it is still better to use 'readdir'
+          and external synchronization.
+
+        * It is expected that future versions of POSIX will obsolete
+          'readdir_r' and mandate the level of thread safety for
+          'readdir' which is provided by the GNU C Library and other
+          implementations today.
+
+     Normally 'readdir_r' returns zero and sets '*RESULT' to ENTRY.  If
+     there are no more entries in the directory or an error is detected,
+     'readdir_r' sets '*RESULT' to a null pointer and returns a nonzero
+     error code, also stored in 'errno', as described for 'readdir'.
+
+     It is also important to look at the definition of the 'struct
+     dirent' type.  Simply passing a pointer to an object of this type
+     for the second parameter of 'readdir_r' might not be enough.  Some
+     systems don't define the 'd_name' element sufficiently long.  In
+     this case the user has to provide additional space.  There must be
+     room for at least 'NAME_MAX + 1' characters in the 'd_name' array.
+     Code to call 'readdir_r' could look like this:
+
+            union
+            {
+              struct dirent d;
+              char b[offsetof (struct dirent, d_name) + NAME_MAX + 1];
+            } u;
+
+            if (readdir_r (dir, &u.d, &res) == 0)
+              ...
+
+   To support large filesystems on 32-bit machines there are LFS
+variants of the last two functions.
+
+ -- Function: struct dirent64 * readdir64 (DIR *DIRSTREAM)
+     Preliminary: | MT-Unsafe race:dirstream | AS-Unsafe lock |
+     AC-Unsafe lock | *Note POSIX Safety Concepts::.
+
+     The 'readdir64' function is just like the 'readdir' function except
+     that it returns a pointer to a record of type 'struct dirent64'.
+     Some of the members of this data type (notably 'd_ino') might have
+     a different size to allow large filesystems.
+
+     In all other aspects this function is equivalent to 'readdir'.
+
+ -- Function: int readdir64_r (DIR *DIRSTREAM, struct dirent64 *ENTRY,
+          struct dirent64 **RESULT)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     The 'readdir64_r' function is equivalent to the 'readdir_r'
+     function except that it takes parameters of base type 'struct
+     dirent64' instead of 'struct dirent' in the second and third
+     position.  The same precautions mentioned in the documentation of
+     'readdir_r' also apply here.
+
+ -- Function: int closedir (DIR *DIRSTREAM)
+     Preliminary: | MT-Safe | AS-Unsafe heap lock/hurd | AC-Unsafe mem
+     fd lock/hurd | *Note POSIX Safety Concepts::.
+
+     This function closes the directory stream DIRSTREAM.  It returns
+     '0' on success and '-1' on failure.
+
+     The following 'errno' error conditions are defined for this
+     function:
+
+     'EBADF'
+          The DIRSTREAM argument is not valid.
+
+
+File: libc.info,  Node: Simple Directory Lister,  Next: Random Access Directory,  Prev: Reading/Closing Directory,  Up: Accessing Directories
+
+14.2.4 Simple Program to List a Directory
+-----------------------------------------
+
+Here's a simple program that prints the names of the files in the
+current working directory:
+
+
+     #include <stdio.h>
+     #include <sys/types.h>
+     #include <dirent.h>
+
+     int
+     main (void)
+     {
+       DIR *dp;
+       struct dirent *ep;
+
+       dp = opendir ("./");
+       if (dp != NULL)
+         {
+           while (ep = readdir (dp))
+             puts (ep->d_name);
+           (void) closedir (dp);
+         }
+       else
+         perror ("Couldn't open the directory");
+
+       return 0;
+     }
+
+   The order in which files appear in a directory tends to be fairly
+random.  A more useful program would sort the entries (perhaps by
+alphabetizing them) before printing them; see *note Scanning Directory
+Content::, and *note Array Sort Function::.
+
+
+File: libc.info,  Node: Random Access Directory,  Next: Scanning Directory Content,  Prev: Simple Directory Lister,  Up: Accessing Directories
+
+14.2.5 Random Access in a Directory Stream
+------------------------------------------
+
+This section describes how to reread parts of a directory that you have
+already read from an open directory stream.  All the symbols are
+declared in the header file 'dirent.h'.
+
+ -- Function: void rewinddir (DIR *DIRSTREAM)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     The 'rewinddir' function is used to reinitialize the directory
+     stream DIRSTREAM, so that if you call 'readdir' it returns
+     information about the first entry in the directory again.  This
+     function also notices if files have been added or removed to the
+     directory since it was opened with 'opendir'.  (Entries for these
+     files might or might not be returned by 'readdir' if they were
+     added or removed since you last called 'opendir' or 'rewinddir'.)
+
+ -- Function: long int telldir (DIR *DIRSTREAM)
+     Preliminary: | MT-Safe | AS-Unsafe heap/bsd lock/bsd | AC-Unsafe
+     mem/bsd lock/bsd | *Note POSIX Safety Concepts::.
+
+     The 'telldir' function returns the file position of the directory
+     stream DIRSTREAM.  You can use this value with 'seekdir' to restore
+     the directory stream to that position.
+
+ -- Function: void seekdir (DIR *DIRSTREAM, long int POS)
+     Preliminary: | MT-Safe | AS-Unsafe heap/bsd lock/bsd | AC-Unsafe
+     mem/bsd lock/bsd | *Note POSIX Safety Concepts::.
+
+     The 'seekdir' function sets the file position of the directory
+     stream DIRSTREAM to POS.  The value POS must be the result of a
+     previous call to 'telldir' on this particular stream; closing and
+     reopening the directory can invalidate values returned by
+     'telldir'.
+
+
+File: libc.info,  Node: Scanning Directory Content,  Next: Simple Directory Lister Mark II,  Prev: Random Access Directory,  Up: Accessing Directories
+
+14.2.6 Scanning the Content of a Directory
+------------------------------------------
+
+A higher-level interface to the directory handling functions is the
+'scandir' function.  With its help one can select a subset of the
+entries in a directory, possibly sort them and get a list of names as
+the result.
+
+ -- Function: int scandir (const char *DIR, struct dirent ***NAMELIST,
+          int (*SELECTOR) (const struct dirent *), int (*CMP) (const
+          struct dirent **, const struct dirent **))
+     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
+     POSIX Safety Concepts::.
+
+     The 'scandir' function scans the contents of the directory selected
+     by DIR.  The result in *NAMELIST is an array of pointers to
+     structure of type 'struct dirent' which describe all selected
+     directory entries and which is allocated using 'malloc'.  Instead
+     of always getting all directory entries returned, the user supplied
+     function SELECTOR can be used to decide which entries are in the
+     result.  Only the entries for which SELECTOR returns a non-zero
+     value are selected.
+
+     Finally the entries in *NAMELIST are sorted using the user-supplied
+     function CMP.  The arguments passed to the CMP function are of type
+     'struct dirent **', therefore one cannot directly use the 'strcmp'
+     or 'strcoll' functions; instead see the functions 'alphasort' and
+     'versionsort' below.
+
+     The return value of the function is the number of entries placed in
+     *NAMELIST.  If it is '-1' an error occurred (either the directory
+     could not be opened for reading or the malloc call failed) and the
+     global variable 'errno' contains more information on the error.
+
+   As described above the fourth argument to the 'scandir' function must
+be a pointer to a sorting function.  For the convenience of the
+programmer the GNU C Library contains implementations of functions which
+are very helpful for this purpose.
+
+ -- Function: int alphasort (const void *A, const void *B)
+     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
+     *Note POSIX Safety Concepts::.
+
+     The 'alphasort' function behaves like the 'strcoll' function (*note
+     String/Array Comparison::).  The difference is that the arguments
+     are not string pointers but instead they are of type 'struct dirent
+     **'.
+
+     The return value of 'alphasort' is less than, equal to, or greater
+     than zero depending on the order of the two entries A and B.
+
+ -- Function: int versionsort (const void *A, const void *B)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'versionsort' function is like 'alphasort' except that it uses
+     the 'strverscmp' function internally.
+
+   If the filesystem supports large files we cannot use the 'scandir'
+anymore since the 'dirent' structure might not able to contain all the
+information.  The LFS provides the new type 'struct dirent64'.  To use
+this we need a new function.
+
+ -- Function: int scandir64 (const char *DIR, struct dirent64
+          ***NAMELIST, int (*SELECTOR) (const struct dirent64 *), int
+          (*CMP) (const struct dirent64 **, const struct dirent64 **))
+     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
+     POSIX Safety Concepts::.
+
+     The 'scandir64' function works like the 'scandir' function except
+     that the directory entries it returns are described by elements of
+     type 'struct dirent64'.  The function pointed to by SELECTOR is
+     again used to select the desired entries, except that SELECTOR now
+     must point to a function which takes a 'struct dirent64 *'
+     parameter.
+
+     Similarly the CMP function should expect its two arguments to be of
+     type 'struct dirent64 **'.
+
+   As CMP is now a function of a different type, the functions
+'alphasort' and 'versionsort' cannot be supplied for that argument.
+Instead we provide the two replacement functions below.
+
+ -- Function: int alphasort64 (const void *A, const void *B)
+     Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
+     *Note POSIX Safety Concepts::.
+
+     The 'alphasort64' function behaves like the 'strcoll' function
+     (*note String/Array Comparison::).  The difference is that the
+     arguments are not string pointers but instead they are of type
+     'struct dirent64 **'.
+
+     Return value of 'alphasort64' is less than, equal to, or greater
+     than zero depending on the order of the two entries A and B.
+
+ -- Function: int versionsort64 (const void *A, const void *B)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'versionsort64' function is like 'alphasort64', excepted that
+     it uses the 'strverscmp' function internally.
+
+   It is important not to mix the use of 'scandir' and the 64-bit
+comparison functions or vice versa.  There are systems on which this
+works but on others it will fail miserably.
+
+
+File: libc.info,  Node: Simple Directory Lister Mark II,  Prev: Scanning Directory Content,  Up: Accessing Directories
+
+14.2.7 Simple Program to List a Directory, Mark II
+--------------------------------------------------
+
+Here is a revised version of the directory lister found above (*note
+Simple Directory Lister::).  Using the 'scandir' function we can avoid
+the functions which work directly with the directory contents.  After
+the call the returned entries are available for direct use.
+
+
+     #include <stdio.h>
+     #include <dirent.h>
+
+     static int
+     one (const struct dirent *unused)
+     {
+       return 1;
+     }
+
+     int
+     main (void)
+     {
+       struct dirent **eps;
+       int n;
+
+       n = scandir ("./", &eps, one, alphasort);
+       if (n >= 0)
+         {
+           int cnt;
+           for (cnt = 0; cnt < n; ++cnt)
+             puts (eps[cnt]->d_name);
+         }
+       else
+         perror ("Couldn't open the directory");
+
+       return 0;
+     }
+
+   Note the simple selector function in this example.  Since we want to
+see all directory entries we always return '1'.
+
+
+File: libc.info,  Node: Working with Directory Trees,  Next: Hard Links,  Prev: Accessing Directories,  Up: File System Interface
+
+14.3 Working with Directory Trees
+=================================
+
+The functions described so far for handling the files in a directory
+have allowed you to either retrieve the information bit by bit, or to
+process all the files as a group (see 'scandir').  Sometimes it is
+useful to process whole hierarchies of directories and their contained
+files.  The X/Open specification defines two functions to do this.  The
+simpler form is derived from an early definition in System V systems and
+therefore this function is available on SVID-derived systems.  The
+prototypes and required definitions can be found in the 'ftw.h' header.
+
+   There are four functions in this family: 'ftw', 'nftw' and their
+64-bit counterparts 'ftw64' and 'nftw64'.  These functions take as one
+of their arguments a pointer to a callback function of the appropriate
+type.
+
+ -- Data Type: __ftw_func_t
+
+          int (*) (const char *, const struct stat *, int)
+
+     The type of callback functions given to the 'ftw' function.  The
+     first parameter points to the file name, the second parameter to an
+     object of type 'struct stat' which is filled in for the file named
+     in the first parameter.
+
+     The last parameter is a flag giving more information about the
+     current file.  It can have the following values:
+
+     'FTW_F'
+          The item is either a normal file or a file which does not fit
+          into one of the following categories.  This could be special
+          files, sockets etc.
+     'FTW_D'
+          The item is a directory.
+     'FTW_NS'
+          The 'stat' call failed and so the information pointed to by
+          the second paramater is invalid.
+     'FTW_DNR'
+          The item is a directory which cannot be read.
+     'FTW_SL'
+          The item is a symbolic link.  Since symbolic links are
+          normally followed seeing this value in a 'ftw' callback
+          function means the referenced file does not exist.  The
+          situation for 'nftw' is different.
+
+          This value is only available if the program is compiled with
+          '_BSD_SOURCE' or '_XOPEN_EXTENDED' defined before including
+          the first header.  The original SVID systems do not have
+          symbolic links.
+
+     If the sources are compiled with '_FILE_OFFSET_BITS == 64' this
+     type is in fact '__ftw64_func_t' since this mode changes 'struct
+     stat' to be 'struct stat64'.
+
+   For the LFS interface and for use in the function 'ftw64', the header
+'ftw.h' defines another function type.
+
+ -- Data Type: __ftw64_func_t
+
+          int (*) (const char *, const struct stat64 *, int)
+
+     This type is used just like '__ftw_func_t' for the callback
+     function, but this time is called from 'ftw64'.  The second
+     parameter to the function is a pointer to a variable of type
+     'struct stat64' which is able to represent the larger values.
+
+ -- Data Type: __nftw_func_t
+
+          int (*) (const char *, const struct stat *, int, struct FTW *)
+
+     The first three arguments are the same as for the '__ftw_func_t'
+     type.  However for the third argument some additional values are
+     defined to allow finer differentiation:
+     'FTW_DP'
+          The current item is a directory and all subdirectories have
+          already been visited and reported.  This flag is returned
+          instead of 'FTW_D' if the 'FTW_DEPTH' flag is passed to 'nftw'
+          (see below).
+     'FTW_SLN'
+          The current item is a stale symbolic link.  The file it points
+          to does not exist.
+
+     The last parameter of the callback function is a pointer to a
+     structure with some extra information as described below.
+
+     If the sources are compiled with '_FILE_OFFSET_BITS == 64' this
+     type is in fact '__nftw64_func_t' since this mode changes 'struct
+     stat' to be 'struct stat64'.
+
+   For the LFS interface there is also a variant of this data type
+available which has to be used with the 'nftw64' function.
+
+ -- Data Type: __nftw64_func_t
+
+          int (*) (const char *, const struct stat64 *, int, struct FTW *)
+
+     This type is used just like '__nftw_func_t' for the callback
+     function, but this time is called from 'nftw64'.  The second
+     parameter to the function is this time a pointer to a variable of
+     type 'struct stat64' which is able to represent the larger values.
+
+ -- Data Type: struct FTW
+     The information contained in this structure helps in interpreting
+     the name parameter and gives some information about the current
+     state of the traversal of the directory hierarchy.
+
+     'int base'
+          The value is the offset into the string passed in the first
+          parameter to the callback function of the beginning of the
+          file name.  The rest of the string is the path of the file.
+          This information is especially important if the 'FTW_CHDIR'
+          flag was set in calling 'nftw' since then the current
+          directory is the one the current item is found in.
+     'int level'
+          Whilst processing, the code tracks how many directories down
+          it has gone to find the current file.  This nesting level
+          starts at 0 for files in the initial directory (or is zero for
+          the initial file if a file was passed).
+
+ -- Function: int ftw (const char *FILENAME, __ftw_func_t FUNC, int
+          DESCRIPTORS)
+     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
+     POSIX Safety Concepts::.
+
+     The 'ftw' function calls the callback function given in the
+     parameter FUNC for every item which is found in the directory
+     specified by FILENAME and all directories below.  The function
+     follows symbolic links if necessary but does not process an item
+     twice.  If FILENAME is not a directory then it itself is the only
+     object returned to the callback function.
+
+     The file name passed to the callback function is constructed by
+     taking the FILENAME parameter and appending the names of all passed
+     directories and then the local file name.  So the callback function
+     can use this parameter to access the file.  'ftw' also calls 'stat'
+     for the file and passes that information on to the callback
+     function.  If this 'stat' call was not successful the failure is
+     indicated by setting the third argument of the callback function to
+     'FTW_NS'.  Otherwise it is set according to the description given
+     in the account of '__ftw_func_t' above.
+
+     The callback function is expected to return 0 to indicate that no
+     error occurred and that processing should continue.  If an error
+     occurred in the callback function or it wants 'ftw' to return
+     immediately, the callback function can return a value other than 0.
+     This is the only correct way to stop the function.  The program
+     must not use 'setjmp' or similar techniques to continue from
+     another place.  This would leave resources allocated by the 'ftw'
+     function unfreed.
+
+     The DESCRIPTORS parameter to 'ftw' specifies how many file
+     descriptors it is allowed to consume.  The function runs faster the
+     more descriptors it can use.  For each level in the directory
+     hierarchy at most one descriptor is used, but for very deep ones
+     any limit on open file descriptors for the process or the system
+     may be exceeded.  Moreover, file descriptor limits in a
+     multi-threaded program apply to all the threads as a group, and
+     therefore it is a good idea to supply a reasonable limit to the
+     number of open descriptors.
+
+     The return value of the 'ftw' function is 0 if all callback
+     function calls returned 0 and all actions performed by the 'ftw'
+     succeeded.  If a function call failed (other than calling 'stat' on
+     an item) the function returns -1.  If a callback function returns a
+     value other than 0 this value is returned as the return value of
+     'ftw'.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' on a
+     32-bit system this function is in fact 'ftw64', i.e., the LFS
+     interface transparently replaces the old interface.
+
+ -- Function: int ftw64 (const char *FILENAME, __ftw64_func_t FUNC, int
+          DESCRIPTORS)
+     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
+     POSIX Safety Concepts::.
+
+     This function is similar to 'ftw' but it can work on filesystems
+     with large files.  File information is reported using a variable of
+     type 'struct stat64' which is passed by reference to the callback
+     function.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' on a
+     32-bit system this function is available under the name 'ftw' and
+     transparently replaces the old implementation.
+
+ -- Function: int nftw (const char *FILENAME, __nftw_func_t FUNC, int
+          DESCRIPTORS, int FLAG)
+     Preliminary: | MT-Safe cwd | AS-Unsafe heap | AC-Unsafe mem fd cwd
+     | *Note POSIX Safety Concepts::.
+
+     The 'nftw' function works like the 'ftw' functions.  They call the
+     callback function FUNC for all items found in the directory
+     FILENAME and below.  At most DESCRIPTORS file descriptors are
+     consumed during the 'nftw' call.
+
+     One difference is that the callback function is of a different
+     type.  It is of type 'struct FTW *' and provides the callback
+     function with the extra information described above.
+
+     A second difference is that 'nftw' takes a fourth argument, which
+     is 0 or a bitwise-OR combination of any of the following values.
+
+     'FTW_PHYS'
+          While traversing the directory symbolic links are not
+          followed.  Instead symbolic links are reported using the
+          'FTW_SL' value for the type parameter to the callback
+          function.  If the file referenced by a symbolic link does not
+          exist 'FTW_SLN' is returned instead.
+     'FTW_MOUNT'
+          The callback function is only called for items which are on
+          the same mounted filesystem as the directory given by the
+          FILENAME parameter to 'nftw'.
+     'FTW_CHDIR'
+          If this flag is given the current working directory is changed
+          to the directory of the reported object before the callback
+          function is called.  When 'ntfw' finally returns the current
+          directory is restored to its original value.
+     'FTW_DEPTH'
+          If this option is specified then all subdirectories and files
+          within them are processed before processing the top directory
+          itself (depth-first processing).  This also means the type
+          flag given to the callback function is 'FTW_DP' and not
+          'FTW_D'.
+     'FTW_ACTIONRETVAL'
+          If this option is specified then return values from callbacks
+          are handled differently.  If the callback returns
+          'FTW_CONTINUE', walking continues normally.  'FTW_STOP' means
+          walking stops and 'FTW_STOP' is returned to the caller.  If
+          'FTW_SKIP_SUBTREE' is returned by the callback with 'FTW_D'
+          argument, the subtree is skipped and walking continues with
+          next sibling of the directory.  If 'FTW_SKIP_SIBLINGS' is
+          returned by the callback, all siblings of the current entry
+          are skipped and walking continues in its parent.  No other
+          return values should be returned from the callbacks if this
+          option is set.  This option is a GNU extension.
+
+     The return value is computed in the same way as for 'ftw'.  'nftw'
+     returns 0 if no failures occurred and all callback functions
+     returned 0.  In case of internal errors, such as memory problems,
+     the return value is -1 and ERRNO is set accordingly.  If the return
+     value of a callback invocation was non-zero then that value is
+     returned.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' on a
+     32-bit system this function is in fact 'nftw64', i.e., the LFS
+     interface transparently replaces the old interface.
+
+ -- Function: int nftw64 (const char *FILENAME, __nftw64_func_t FUNC,
+          int DESCRIPTORS, int FLAG)
+     Preliminary: | MT-Safe cwd | AS-Unsafe heap | AC-Unsafe mem fd cwd
+     | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'nftw' but it can work on filesystems
+     with large files.  File information is reported using a variable of
+     type 'struct stat64' which is passed by reference to the callback
+     function.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' on a
+     32-bit system this function is available under the name 'nftw' and
+     transparently replaces the old implementation.
 
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-6 b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-6
index 0825bb8..68ee465 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-6
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-6
@@ -1,7 +1,24 @@
-This is
-/usr/local/google/home/jnewlin/src/uclibc/buildroot/output/build/glibc-2.19/build/manual/libc.info,
-produced by makeinfo version 4.13 from libc.texinfo.
+This is libc.info, produced by makeinfo version 5.2 from libc.texinfo.
 
+This file documents the GNU C Library.
+
+   This is 'The GNU C Library Reference Manual', for version 2.19
+(Buildroot).
+
+   Copyright (C) 1993-2014 Free Software Foundation, Inc.
+
+   Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being "Free Software Needs Free Documentation" and
+"GNU Lesser General Public License", the Front-Cover texts being "A GNU
+Manual", and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled "GNU Free Documentation
+License".
+
+   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
+modify this GNU manual.  Buying copies from the FSF supports it in
+developing GNU and promoting software freedom."
 INFO-DIR-SECTION Software libraries
 START-INFO-DIR-ENTRY
 * Libc: (libc).                 C library.
@@ -1692,6318 +1709,5800 @@
 * ynl: (libc)Special Functions.
 END-INFO-DIR-ENTRY
 
-   This file documents the GNU C Library.
+
+File: libc.info,  Node: Hard Links,  Next: Symbolic Links,  Prev: Working with Directory Trees,  Up: File System Interface
 
-   This is `The GNU C Library Reference Manual', for version 2.19
-(Buildroot).
+14.4 Hard Links
+===============
 
-   Copyright (C) 1993-2014 Free Software Foundation, Inc.
+In POSIX systems, one file can have many names at the same time.  All of
+the names are equally real, and no one of them is preferred to the
+others.
 
-   Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version
-1.3 or any later version published by the Free Software Foundation;
-with the Invariant Sections being "Free Software Needs Free
-Documentation" and "GNU Lesser General Public License", the Front-Cover
-texts being "A GNU Manual", and with the Back-Cover Texts as in (a)
-below.  A copy of the license is included in the section entitled "GNU
-Free Documentation License".
+   To add a name to a file, use the 'link' function.  (The new name is
+also called a "hard link" to the file.)  Creating a new link to a file
+does not copy the contents of the file; it simply makes a new name by
+which the file can be known, in addition to the file's existing name or
+names.
 
-   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
-modify this GNU manual.  Buying copies from the FSF supports it in
-developing GNU and promoting software freedom."
+   One file can have names in several directories, so the organization
+of the file system is not a strict hierarchy or tree.
+
+   In most implementations, it is not possible to have hard links to the
+same file in multiple file systems.  'link' reports an error if you try
+to make a hard link to the file from another file system when this
+cannot be done.
+
+   The prototype for the 'link' function is declared in the header file
+'unistd.h'.
+
+ -- Function: int link (const char *OLDNAME, const char *NEWNAME)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'link' function makes a new link to the existing file named by
+     OLDNAME, under the new name NEWNAME.
+
+     This function returns a value of '0' if it is successful and '-1'
+     on failure.  In addition to the usual file name errors (*note File
+     Name Errors::) for both OLDNAME and NEWNAME, the following 'errno'
+     error conditions are defined for this function:
+
+     'EACCES'
+          You are not allowed to write to the directory in which the new
+          link is to be written.
+
+     'EEXIST'
+          There is already a file named NEWNAME.  If you want to replace
+          this link with a new link, you must remove the old link
+          explicitly first.
+
+     'EMLINK'
+          There are already too many links to the file named by OLDNAME.
+          (The maximum number of links to a file is 'LINK_MAX'; see
+          *note Limits for Files::.)
+
+     'ENOENT'
+          The file named by OLDNAME doesn't exist.  You can't make a
+          link to a file that doesn't exist.
+
+     'ENOSPC'
+          The directory or file system that would contain the new link
+          is full and cannot be extended.
+
+     'EPERM'
+          On GNU/Linux and GNU/Hurd systems and some others, you cannot
+          make links to directories.  Many systems allow only privileged
+          users to do so.  This error is used to report the problem.
+
+     'EROFS'
+          The directory containing the new link can't be modified
+          because it's on a read-only file system.
+
+     'EXDEV'
+          The directory specified in NEWNAME is on a different file
+          system than the existing file.
+
+     'EIO'
+          A hardware error occurred while trying to read or write the to
+          filesystem.
 
 
-File: libc.info,  Node: openlog,  Next: syslog; vsyslog,  Up: Submitting Syslog Messages
+File: libc.info,  Node: Symbolic Links,  Next: Deleting Files,  Prev: Hard Links,  Up: File System Interface
 
-18.2.1 openlog
---------------
-
-The symbols referred to in this section are declared in the file
-`syslog.h'.
-
- -- Function: void openlog (const char *IDENT, int OPTION, int FACILITY)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock fd |
-     *Note POSIX Safety Concepts::.
-
-     `openlog' opens or reopens a connection to Syslog in preparation
-     for submitting messages.
-
-     IDENT is an arbitrary identification string which future `syslog'
-     invocations will prefix to each message.  This is intended to
-     identify the source of the message, and people conventionally set
-     it to the name of the program that will submit the messages.
-
-     If IDENT is NULL, or if `openlog' is not called, the default
-     identification string used in Syslog messages will be the program
-     name, taken from argv[0].
-
-     Please note that the string pointer IDENT will be retained
-     internally by the Syslog routines.  You must not free the memory
-     that IDENT points to.  It is also dangerous to pass a reference to
-     an automatic variable since leaving the scope would mean ending the
-     lifetime of the variable.  If you want to change the IDENT string,
-     you must call `openlog' again; overwriting the string pointed to by
-     IDENT is not thread-safe.
-
-     You can cause the Syslog routines to drop the reference to IDENT
-     and go back to the default string (the program name taken from
-     argv[0]), by calling `closelog': *Note closelog::.
-
-     In particular, if you are writing code for a shared library that
-     might get loaded and then unloaded (e.g. a PAM module), and you
-     use `openlog', you must call `closelog' before any point where
-     your library might get unloaded, as in this example:
-
-          #include <syslog.h>
-
-          void
-          shared_library_function (void)
-          {
-            openlog ("mylibrary", option, priority);
-
-            syslog (LOG_INFO, "shared library has been invoked");
-
-            closelog ();
-          }
-
-     Without the call to `closelog', future invocations of `syslog' by
-     the program using the shared library may crash, if the library gets
-     unloaded and the memory containing the string `"mylibrary"' becomes
-     unmapped.  This is a limitation of the BSD syslog interface.
-
-     `openlog' may or may not open the `/dev/log' socket, depending on
-     OPTION.  If it does, it tries to open it and connect it as a
-     stream socket.  If that doesn't work, it tries to open it and
-     connect it as a datagram socket.  The socket has the "Close on
-     Exec" attribute, so the kernel will close it if the process
-     performs an exec.
-
-     You don't have to use `openlog'.  If you call `syslog' without
-     having called `openlog', `syslog' just opens the connection
-     implicitly and uses defaults for the information in IDENT and
-     OPTIONS.
-
-     OPTIONS is a bit string, with the bits as defined by the following
-     single bit masks:
-
-    `LOG_PERROR'
-          If on, `openlog' sets up the connection so that any `syslog'
-          on this connection writes its message to the calling process'
-          Standard Error stream in addition to submitting it to Syslog.
-          If off, `syslog' does not write the message to Standard Error.
-
-    `LOG_CONS'
-          If on, `openlog' sets up the connection so that a `syslog' on
-          this connection that fails to submit a message to Syslog
-          writes the message instead to system console.  If off,
-          `syslog' does not write to the system console (but of course
-          Syslog may write messages it receives to the console).
-
-    `LOG_PID'
-          When on, `openlog' sets up the connection so that a `syslog'
-          on this connection inserts the calling process' Process ID
-          (PID) into the message.  When off, `openlog' does not insert
-          the PID.
-
-    `LOG_NDELAY'
-          When on, `openlog' opens and connects the `/dev/log' socket.
-          When off, a future `syslog' call must open and connect the
-          socket.
-
-          *Portability note:*  In early systems, the sense of this bit
-          was exactly the opposite.
-
-    `LOG_ODELAY'
-          This bit does nothing.  It exists for backward compatibility.
-
-
-     If any other bit in OPTIONS is on, the result is undefined.
-
-     FACILITY is the default facility code for this connection.  A
-     `syslog' on this connection that specifies default facility causes
-     this facility to be associated with the message.  See `syslog' for
-     possible values.  A value of zero means the default default, which
-     is `LOG_USER'.
-
-     If a Syslog connection is already open when you call `openlog',
-     `openlog' "reopens" the connection.  Reopening is like opening
-     except that if you specify zero for the default facility code, the
-     default facility code simply remains unchanged and if you specify
-     LOG_NDELAY and the socket is already open and connected, `openlog'
-     just leaves it that way.
-
-
-
-File: libc.info,  Node: syslog; vsyslog,  Next: closelog,  Prev: openlog,  Up: Submitting Syslog Messages
-
-18.2.2 syslog, vsyslog
-----------------------
-
-The symbols referred to in this section are declared in the file
-`syslog.h'.
-
- -- Function: void syslog (int FACILITY_PRIORITY, const char *FORMAT,
-          ...)
-     Preliminary: | MT-Safe env locale | AS-Unsafe corrupt heap lock
-     dlopen | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety
-     Concepts::.
-
-     `syslog' submits a message to the Syslog facility.  It does this by
-     writing to the Unix domain socket `/dev/log'.
-
-     `syslog' submits the message with the facility and priority
-     indicated by FACILITY_PRIORITY.  The macro `LOG_MAKEPRI' generates
-     a facility/priority from a facility and a priority, as in the
-     following example:
-
-          LOG_MAKEPRI(LOG_USER, LOG_WARNING)
-
-     The possible values for the facility code are (macros):
-
-    `LOG_USER'
-          A miscellaneous user process
-
-    `LOG_MAIL'
-          Mail
-
-    `LOG_DAEMON'
-          A miscellaneous system daemon
-
-    `LOG_AUTH'
-          Security (authorization)
-
-    `LOG_SYSLOG'
-          Syslog
-
-    `LOG_LPR'
-          Central printer
-
-    `LOG_NEWS'
-          Network news (e.g. Usenet)
-
-    `LOG_UUCP'
-          UUCP
-
-    `LOG_CRON'
-          Cron and At
-
-    `LOG_AUTHPRIV'
-          Private security (authorization)
-
-    `LOG_FTP'
-          Ftp server
-
-    `LOG_LOCAL0'
-          Locally defined
-
-    `LOG_LOCAL1'
-          Locally defined
-
-    `LOG_LOCAL2'
-          Locally defined
-
-    `LOG_LOCAL3'
-          Locally defined
-
-    `LOG_LOCAL4'
-          Locally defined
-
-    `LOG_LOCAL5'
-          Locally defined
-
-    `LOG_LOCAL6'
-          Locally defined
-
-    `LOG_LOCAL7'
-          Locally defined
-
-     Results are undefined if the facility code is anything else.
-
-     *NB:* `syslog' recognizes one other facility code: that of the
-     kernel.  But you can't specify that facility code with these
-     functions.  If you try, it looks the same to `syslog' as if you are
-     requesting the default facility.  But you wouldn't want to anyway,
-     because any program that uses the GNU C Library is not the kernel.
-
-     You can use just a priority code as FACILITY_PRIORITY.  In that
-     case, `syslog' assumes the default facility established when the
-     Syslog connection was opened.  *Note Syslog Example::.
-
-     The possible values for the priority code are (macros):
-
-    `LOG_EMERG'
-          The message says the system is unusable.
-
-    `LOG_ALERT'
-          Action on the message must be taken immediately.
-
-    `LOG_CRIT'
-          The message states a critical condition.
-
-    `LOG_ERR'
-          The message describes an error.
-
-    `LOG_WARNING'
-          The message is a warning.
-
-    `LOG_NOTICE'
-          The message describes a normal but important event.
-
-    `LOG_INFO'
-          The message is purely informational.
-
-    `LOG_DEBUG'
-          The message is only for debugging purposes.
-
-     Results are undefined if the priority code is anything else.
-
-     If the process does not presently have a Syslog connection open
-     (i.e., it did not call `openlog'), `syslog' implicitly opens the
-     connection the same as `openlog' would, with the following defaults
-     for information that would otherwise be included in an `openlog'
-     call: The default identification string is the program name.  The
-     default default facility is `LOG_USER'.  The default for all the
-     connection options in OPTIONS is as if those bits were off.
-     `syslog' leaves the Syslog connection open.
-
-     If the `/dev/log' socket is not open and connected, `syslog' opens
-     and connects it, the same as `openlog' with the `LOG_NDELAY'
-     option would.
-
-     `syslog' leaves `/dev/log' open and connected unless its attempt
-     to send the message failed, in which case `syslog' closes it (with
-     the hope that a future implicit open will restore the Syslog
-     connection to a usable state).
-
-     Example:
-
-
-          #include <syslog.h>
-          syslog (LOG_MAKEPRI(LOG_LOCAL1, LOG_ERROR),
-                  "Unable to make network connection to %s.  Error=%m", host);
-
-
- -- Function: void vsyslog (int FACILITY_PRIORITY, const char *FORMAT,
-          va_list ARGLIST)
-     Preliminary: | MT-Safe env locale | AS-Unsafe corrupt heap lock
-     dlopen | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety
-     Concepts::.
-
-     This is functionally identical to `syslog', with the BSD style
-     variable length argument.
-
-
-
-File: libc.info,  Node: closelog,  Next: setlogmask,  Prev: syslog; vsyslog,  Up: Submitting Syslog Messages
-
-18.2.3 closelog
----------------
-
-The symbols referred to in this section are declared in the file
-`syslog.h'.
-
- -- Function: void closelog (void)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock fd |
-     *Note POSIX Safety Concepts::.
-
-     `closelog' closes the current Syslog connection, if there is one.
-     This includes closing the `/dev/log' socket, if it is open.
-     `closelog' also sets the identification string for Syslog messages
-     back to the default, if `openlog' was called with a non-NULL
-     argument to IDENT.  The default identification string is the
-     program name taken from argv[0].
-
-     If you are writing shared library code that uses `openlog' to
-     generate custom syslog output, you should use `closelog' to drop
-     the GNU C Library's internal reference to the IDENT pointer when
-     you are done.  Please read the section on `openlog' for more
-     information: *Note openlog::.
-
-     `closelog' does not flush any buffers.  You do not have to call
-     `closelog' before re-opening a Syslog connection with `openlog'.
-     Syslog connections are automatically closed on exec or exit.
-
-
-
-File: libc.info,  Node: setlogmask,  Next: Syslog Example,  Prev: closelog,  Up: Submitting Syslog Messages
-
-18.2.4 setlogmask
------------------
-
-The symbols referred to in this section are declared in the file
-`syslog.h'.
-
- -- Function: int setlogmask (int MASK)
-     Preliminary: | MT-Unsafe race:LogMask | AS-Unsafe | AC-Safe |
-     *Note POSIX Safety Concepts::.
-
-     `setlogmask' sets a mask (the "logmask") that determines which
-     future `syslog' calls shall be ignored.  If a program has not
-     called `setlogmask', `syslog' doesn't ignore any calls.  You can
-     use `setlogmask' to specify that messages of particular priorities
-     shall be ignored in the future.
-
-     A `setlogmask' call overrides any previous `setlogmask' call.
-
-     Note that the logmask exists entirely independently of opening and
-     closing of Syslog connections.
-
-     Setting the logmask has a similar effect to, but is not the same
-     as, configuring Syslog.  The Syslog configuration may cause Syslog
-     to discard certain messages it receives, but the logmask causes
-     certain messages never to get submitted to Syslog in the first
-     place.
-
-     MASK is a bit string with one bit corresponding to each of the
-     possible message priorities.  If the bit is on, `syslog' handles
-     messages of that priority normally.  If it is off, `syslog'
-     discards messages of that priority.  Use the message priority
-     macros described in *note syslog; vsyslog:: and the `LOG_MASK' to
-     construct an appropriate MASK value, as in this example:
-
-          LOG_MASK(LOG_EMERG) | LOG_MASK(LOG_ERROR)
-
-     or
-
-          ~(LOG_MASK(LOG_INFO))
-
-     There is also a `LOG_UPTO' macro, which generates a mask with the
-     bits on for a certain priority and all priorities above it:
-
-          LOG_UPTO(LOG_ERROR)
-
-     The unfortunate naming of the macro is due to the fact that
-     internally, higher numbers are used for lower message priorities.
-
-
-
-File: libc.info,  Node: Syslog Example,  Prev: setlogmask,  Up: Submitting Syslog Messages
-
-18.2.5 Syslog Example
----------------------
-
-Here is an example of `openlog', `syslog', and `closelog':
-
-   This example sets the logmask so that debug and informational
-messages get discarded without ever reaching Syslog.  So the second
-`syslog' in the example does nothing.
-
-     #include <syslog.h>
-
-     setlogmask (LOG_UPTO (LOG_NOTICE));
-
-     openlog ("exampleprog", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);
-
-     syslog (LOG_NOTICE, "Program started by User %d", getuid ());
-     syslog (LOG_INFO, "A tree falls in a forest");
-
-     closelog ();
-
-
-File: libc.info,  Node: Mathematics,  Next: Arithmetic,  Prev: Syslog,  Up: Top
-
-19 Mathematics
-**************
-
-This chapter contains information about functions for performing
-mathematical computations, such as trigonometric functions.  Most of
-these functions have prototypes declared in the header file `math.h'.
-The complex-valued functions are defined in `complex.h'.  
-
-   All mathematical functions which take a floating-point argument have
-three variants, one each for `double', `float', and `long double'
-arguments.  The `double' versions are mostly defined in ISO C89.  The
-`float' and `long double' versions are from the numeric extensions to C
-included in ISO C99.
-
-   Which of the three versions of a function should be used depends on
-the situation.  For most calculations, the `float' functions are the
-fastest.  On the other hand, the `long double' functions have the
-highest precision.  `double' is somewhere in between.  It is usually
-wise to pick the narrowest type that can accommodate your data.  Not
-all machines have a distinct `long double' type; it may be the same as
-`double'.
-
-* Menu:
-
-* Mathematical Constants::      Precise numeric values for often-used
-                                 constants.
-* Trig Functions::              Sine, cosine, tangent, and friends.
-* Inverse Trig Functions::      Arcsine, arccosine, etc.
-* Exponents and Logarithms::    Also pow and sqrt.
-* Hyperbolic Functions::        sinh, cosh, tanh, etc.
-* Special Functions::           Bessel, gamma, erf.
-* Errors in Math Functions::    Known Maximum Errors in Math Functions.
-* Pseudo-Random Numbers::       Functions for generating pseudo-random
-				 numbers.
-* FP Function Optimizations::   Fast code or small code.
-
-
-File: libc.info,  Node: Mathematical Constants,  Next: Trig Functions,  Up: Mathematics
-
-19.1 Predefined Mathematical Constants
-======================================
-
-The header `math.h' defines several useful mathematical constants.  All
-values are defined as preprocessor macros starting with `M_'.  The
-values provided are:
-
-`M_E'
-     The base of natural logarithms.
-
-`M_LOG2E'
-     The logarithm to base `2' of `M_E'.
-
-`M_LOG10E'
-     The logarithm to base `10' of `M_E'.
-
-`M_LN2'
-     The natural logarithm of `2'.
-
-`M_LN10'
-     The natural logarithm of `10'.
-
-`M_PI'
-     Pi, the ratio of a circle's circumference to its diameter.
-
-`M_PI_2'
-     Pi divided by two.
-
-`M_PI_4'
-     Pi divided by four.
-
-`M_1_PI'
-     The reciprocal of pi (1/pi)
-
-`M_2_PI'
-     Two times the reciprocal of pi.
-
-`M_2_SQRTPI'
-     Two times the reciprocal of the square root of pi.
-
-`M_SQRT2'
-     The square root of two.
-
-`M_SQRT1_2'
-     The reciprocal of the square root of two (also the square root of
-     1/2).
-
-   These constants come from the Unix98 standard and were also
-available in 4.4BSD; therefore they are only defined if `_BSD_SOURCE' or
-`_XOPEN_SOURCE=500', or a more general feature select macro, is
-defined.  The default set of features includes these constants.  *Note
-Feature Test Macros::.
-
-   All values are of type `double'.  As an extension, the GNU C Library
-also defines these constants with type `long double'.  The `long
-double' macros have a lowercase `l' appended to their names: `M_El',
-`M_PIl', and so forth.  These are only available if `_GNU_SOURCE' is
-defined.
-
-   _Note:_ Some programs use a constant named `PI' which has the same
-value as `M_PI'.  This constant is not standard; it may have appeared
-in some old AT&T headers, and is mentioned in Stroustrup's book on C++.
-It infringes on the user's name space, so the GNU C Library does not
-define it.  Fixing programs written to expect it is simple: replace
-`PI' with `M_PI' throughout, or put `-DPI=M_PI' on the compiler command
-line.
-
-
-File: libc.info,  Node: Trig Functions,  Next: Inverse Trig Functions,  Prev: Mathematical Constants,  Up: Mathematics
-
-19.2 Trigonometric Functions
-============================
-
-These are the familiar `sin', `cos', and `tan' functions.  The
-arguments to all of these functions are in units of radians; recall
-that pi radians equals 180 degrees.
-
-   The math library normally defines `M_PI' to a `double' approximation
-of pi.  If strict ISO and/or POSIX compliance are requested this
-constant is not defined, but you can easily define it yourself:
-
-     #define M_PI 3.14159265358979323846264338327
-
-You can also compute the value of pi with the expression `acos (-1.0)'.
-
- -- Function: double sin (double X)
- -- Function: float sinf (float X)
- -- Function: long double sinl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the sine of X, where X is given in radians.
-     The return value is in the range `-1' to `1'.
-
- -- Function: double cos (double X)
- -- Function: float cosf (float X)
- -- Function: long double cosl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the cosine of X, where X is given in
-     radians.  The return value is in the range `-1' to `1'.
-
- -- Function: double tan (double X)
- -- Function: float tanf (float X)
- -- Function: long double tanl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the tangent of X, where X is given in
-     radians.
-
-     Mathematically, the tangent function has singularities at odd
-     multiples of pi/2.  If the argument X is too close to one of these
-     singularities, `tan' will signal overflow.
-
-   In many applications where `sin' and `cos' are used, the sine and
-cosine of the same angle are needed at the same time.  It is more
-efficient to compute them simultaneously, so the library provides a
-function to do that.
-
- -- Function: void sincos (double X, double *SINX, double *COSX)
- -- Function: void sincosf (float X, float *SINX, float *COSX)
- -- Function: void sincosl (long double X, long double *SINX, long
-          double *COSX)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the sine of X in `*SINX' and the cosine of
-     X in `*COS', where X is given in radians.  Both values, `*SINX'
-     and `*COSX', are in the range of `-1' to `1'.
-
-     This function is a GNU extension.  Portable programs should be
-     prepared to cope with its absence.
-
-   ISO C99 defines variants of the trig functions which work on complex
-numbers.  The GNU C Library provides these functions, but they are only
-useful if your compiler supports the new complex types defined by the
-standard.  (As of this writing GCC supports complex numbers, but there
-are bugs in the implementation.)
-
- -- Function: complex double csin (complex double Z)
- -- Function: complex float csinf (complex float Z)
- -- Function: complex long double csinl (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the complex sine of Z.  The mathematical
-     definition of the complex sine is
-
-     sin (z) = 1/(2*i) * (exp (z*i) - exp (-z*i)).
-
- -- Function: complex double ccos (complex double Z)
- -- Function: complex float ccosf (complex float Z)
- -- Function: complex long double ccosl (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the complex cosine of Z.  The mathematical
-     definition of the complex cosine is
-
-     cos (z) = 1/2 * (exp (z*i) + exp (-z*i))
-
- -- Function: complex double ctan (complex double Z)
- -- Function: complex float ctanf (complex float Z)
- -- Function: complex long double ctanl (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the complex tangent of Z.  The mathematical
-     definition of the complex tangent is
-
-     tan (z) = -i * (exp (z*i) - exp (-z*i)) / (exp (z*i) + exp (-z*i))
-
-     The complex tangent has poles at pi/2 + 2n, where n is an integer.
-     `ctan' may signal overflow if Z is too close to a pole.
-
-
-File: libc.info,  Node: Inverse Trig Functions,  Next: Exponents and Logarithms,  Prev: Trig Functions,  Up: Mathematics
-
-19.3 Inverse Trigonometric Functions
-====================================
-
-These are the usual arc sine, arc cosine and arc tangent functions,
-which are the inverses of the sine, cosine and tangent functions
-respectively.
-
- -- Function: double asin (double X)
- -- Function: float asinf (float X)
- -- Function: long double asinl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions compute the arc sine of X--that is, the value whose
-     sine is X.  The value is in units of radians.  Mathematically,
-     there are infinitely many such values; the one actually returned
-     is the one between `-pi/2' and `pi/2' (inclusive).
-
-     The arc sine function is defined mathematically only over the
-     domain `-1' to `1'.  If X is outside the domain, `asin' signals a
-     domain error.
-
- -- Function: double acos (double X)
- -- Function: float acosf (float X)
- -- Function: long double acosl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions compute the arc cosine of X--that is, the value
-     whose cosine is X.  The value is in units of radians.
-     Mathematically, there are infinitely many such values; the one
-     actually returned is the one between `0' and `pi' (inclusive).
-
-     The arc cosine function is defined mathematically only over the
-     domain `-1' to `1'.  If X is outside the domain, `acos' signals a
-     domain error.
-
- -- Function: double atan (double X)
- -- Function: float atanf (float X)
- -- Function: long double atanl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions compute the arc tangent of X--that is, the value
-     whose tangent is X.  The value is in units of radians.
-     Mathematically, there are infinitely many such values; the one
-     actually returned is the one between `-pi/2' and `pi/2'
-     (inclusive).
-
- -- Function: double atan2 (double Y, double X)
- -- Function: float atan2f (float Y, float X)
- -- Function: long double atan2l (long double Y, long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function computes the arc tangent of Y/X, but the signs of
-     both arguments are used to determine the quadrant of the result,
-     and X is permitted to be zero.  The return value is given in
-     radians and is in the range `-pi' to `pi', inclusive.
-
-     If X and Y are coordinates of a point in the plane, `atan2'
-     returns the signed angle between the line from the origin to that
-     point and the x-axis.  Thus, `atan2' is useful for converting
-     Cartesian coordinates to polar coordinates.  (To compute the
-     radial coordinate, use `hypot'; see *note Exponents and
-     Logarithms::.)
-
-     If both X and Y are zero, `atan2' returns zero.
-
-   ISO C99 defines complex versions of the inverse trig functions.
-
- -- Function: complex double casin (complex double Z)
- -- Function: complex float casinf (complex float Z)
- -- Function: complex long double casinl (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions compute the complex arc sine of Z--that is, the
-     value whose sine is Z.  The value returned is in radians.
-
-     Unlike the real-valued functions, `casin' is defined for all
-     values of Z.
-
- -- Function: complex double cacos (complex double Z)
- -- Function: complex float cacosf (complex float Z)
- -- Function: complex long double cacosl (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions compute the complex arc cosine of Z--that is, the
-     value whose cosine is Z.  The value returned is in radians.
-
-     Unlike the real-valued functions, `cacos' is defined for all
-     values of Z.
-
- -- Function: complex double catan (complex double Z)
- -- Function: complex float catanf (complex float Z)
- -- Function: complex long double catanl (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions compute the complex arc tangent of Z--that is, the
-     value whose tangent is Z.  The value is in units of radians.
-
-
-File: libc.info,  Node: Exponents and Logarithms,  Next: Hyperbolic Functions,  Prev: Inverse Trig Functions,  Up: Mathematics
-
-19.4 Exponentiation and Logarithms
-==================================
-
- -- Function: double exp (double X)
- -- Function: float expf (float X)
- -- Function: long double expl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions compute `e' (the base of natural logarithms) raised
-     to the power X.
-
-     If the magnitude of the result is too large to be representable,
-     `exp' signals overflow.
-
- -- Function: double exp2 (double X)
- -- Function: float exp2f (float X)
- -- Function: long double exp2l (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions compute `2' raised to the power X.
-     Mathematically, `exp2 (x)' is the same as `exp (x * log (2))'.
-
- -- Function: double exp10 (double X)
- -- Function: float exp10f (float X)
- -- Function: long double exp10l (long double X)
- -- Function: double pow10 (double X)
- -- Function: float pow10f (float X)
- -- Function: long double pow10l (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions compute `10' raised to the power X.
-     Mathematically, `exp10 (x)' is the same as `exp (x * log (10))'.
-
-     These functions are GNU extensions.  The name `exp10' is
-     preferred, since it is analogous to `exp' and `exp2'.
-
- -- Function: double log (double X)
- -- Function: float logf (float X)
- -- Function: long double logl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions compute the natural logarithm of X.  `exp (log
-     (X))' equals X, exactly in mathematics and approximately in C.
-
-     If X is negative, `log' signals a domain error.  If X is zero, it
-     returns negative infinity; if X is too close to zero, it may
-     signal overflow.
-
- -- Function: double log10 (double X)
- -- Function: float log10f (float X)
- -- Function: long double log10l (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the base-10 logarithm of X.  `log10 (X)'
-     equals `log (X) / log (10)'.
-
-
- -- Function: double log2 (double X)
- -- Function: float log2f (float X)
- -- Function: long double log2l (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the base-2 logarithm of X.  `log2 (X)'
-     equals `log (X) / log (2)'.
-
- -- Function: double logb (double X)
- -- Function: float logbf (float X)
- -- Function: long double logbl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions extract the exponent of X and return it as a
-     floating-point value.  If `FLT_RADIX' is two, `logb' is equal to
-     `floor (log2 (x))', except it's probably faster.
-
-     If X is de-normalized, `logb' returns the exponent X would have if
-     it were normalized.  If X is infinity (positive or negative),
-     `logb' returns oo.  If X is zero, `logb' returns oo.  It does not
-     signal.
-
- -- Function: int ilogb (double X)
- -- Function: int ilogbf (float X)
- -- Function: int ilogbl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions are equivalent to the corresponding `logb'
-     functions except that they return signed integer values.
-
-Since integers cannot represent infinity and NaN, `ilogb' instead
-returns an integer that can't be the exponent of a normal floating-point
-number.  `math.h' defines constants so you can check for this.
-
- -- Macro: int FP_ILOGB0
-     `ilogb' returns this value if its argument is `0'.  The numeric
-     value is either `INT_MIN' or `-INT_MAX'.
-
-     This macro is defined in ISO C99.
-
- -- Macro: int FP_ILOGBNAN
-     `ilogb' returns this value if its argument is `NaN'.  The numeric
-     value is either `INT_MIN' or `INT_MAX'.
-
-     This macro is defined in ISO C99.
-
-   These values are system specific.  They might even be the same.  The
-proper way to test the result of `ilogb' is as follows:
-
-     i = ilogb (f);
-     if (i == FP_ILOGB0 || i == FP_ILOGBNAN)
-       {
-         if (isnan (f))
-           {
-             /* Handle NaN.  */
-           }
-         else if (f  == 0.0)
-           {
-             /* Handle 0.0.  */
-           }
-         else
-           {
-             /* Some other value with large exponent,
-                perhaps +Inf.  */
-           }
-       }
-
- -- Function: double pow (double BASE, double POWER)
- -- Function: float powf (float BASE, float POWER)
- -- Function: long double powl (long double BASE, long double POWER)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These are general exponentiation functions, returning BASE raised
-     to POWER.
-
-     Mathematically, `pow' would return a complex number when BASE is
-     negative and POWER is not an integral value.  `pow' can't do that,
-     so instead it signals a domain error. `pow' may also underflow or
-     overflow the destination type.
-
- -- Function: double sqrt (double X)
- -- Function: float sqrtf (float X)
- -- Function: long double sqrtl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the nonnegative square root of X.
-
-     If X is negative, `sqrt' signals a domain error.  Mathematically,
-     it should return a complex number.
-
- -- Function: double cbrt (double X)
- -- Function: float cbrtf (float X)
- -- Function: long double cbrtl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the cube root of X.  They cannot fail;
-     every representable real value has a representable real cube root.
-
- -- Function: double hypot (double X, double Y)
- -- Function: float hypotf (float X, float Y)
- -- Function: long double hypotl (long double X, long double Y)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return `sqrt (X*X + Y*Y)'.  This is the length of
-     the hypotenuse of a right triangle with sides of length X and Y,
-     or the distance of the point (X, Y) from the origin.  Using this
-     function instead of the direct formula is wise, since the error is
-     much smaller.  See also the function `cabs' in *note Absolute
-     Value::.
-
- -- Function: double expm1 (double X)
- -- Function: float expm1f (float X)
- -- Function: long double expm1l (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return a value equivalent to `exp (X) - 1'.  They
-     are computed in a way that is accurate even if X is near zero--a
-     case where `exp (X) - 1' would be inaccurate owing to subtraction
-     of two numbers that are nearly equal.
-
- -- Function: double log1p (double X)
- -- Function: float log1pf (float X)
- -- Function: long double log1pl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions returns a value equivalent to `log (1 + X)'.  They
-     are computed in a way that is accurate even if X is near zero.
-
-   ISO C99 defines complex variants of some of the exponentiation and
-logarithm functions.
-
- -- Function: complex double cexp (complex double Z)
- -- Function: complex float cexpf (complex float Z)
- -- Function: complex long double cexpl (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return `e' (the base of natural logarithms) raised
-     to the power of Z.  Mathematically, this corresponds to the value
-
-     exp (z) = exp (creal (z)) * (cos (cimag (z)) + I * sin (cimag (z)))
-
- -- Function: complex double clog (complex double Z)
- -- Function: complex float clogf (complex float Z)
- -- Function: complex long double clogl (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the natural logarithm of Z.
-     Mathematically, this corresponds to the value
-
-     log (z) = log (cabs (z)) + I * carg (z)
-
-     `clog' has a pole at 0, and will signal overflow if Z equals or is
-     very close to 0.  It is well-defined for all other values of Z.
-
- -- Function: complex double clog10 (complex double Z)
- -- Function: complex float clog10f (complex float Z)
- -- Function: complex long double clog10l (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the base 10 logarithm of the complex value
-     Z. Mathematically, this corresponds to the value
-
-     log (z) = log10 (cabs (z)) + I * carg (z)
-
-     These functions are GNU extensions.
-
- -- Function: complex double csqrt (complex double Z)
- -- Function: complex float csqrtf (complex float Z)
- -- Function: complex long double csqrtl (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the complex square root of the argument Z.
-     Unlike the real-valued functions, they are defined for all values
-     of Z.
-
- -- Function: complex double cpow (complex double BASE, complex double
-          POWER)
- -- Function: complex float cpowf (complex float BASE, complex float
-          POWER)
- -- Function: complex long double cpowl (complex long double BASE,
-          complex long double POWER)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return BASE raised to the power of POWER.  This is
-     equivalent to `cexp (y * clog (x))'
-
-
-File: libc.info,  Node: Hyperbolic Functions,  Next: Special Functions,  Prev: Exponents and Logarithms,  Up: Mathematics
-
-19.5 Hyperbolic Functions
-=========================
-
-The functions in this section are related to the exponential functions;
-see *note Exponents and Logarithms::.
-
- -- Function: double sinh (double X)
- -- Function: float sinhf (float X)
- -- Function: long double sinhl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the hyperbolic sine of X, defined
-     mathematically as `(exp (X) - exp (-X)) / 2'.  They may signal
-     overflow if X is too large.
-
- -- Function: double cosh (double X)
- -- Function: float coshf (float X)
- -- Function: long double coshl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These function return the hyperbolic cosine of X, defined
-     mathematically as `(exp (X) + exp (-X)) / 2'.  They may signal
-     overflow if X is too large.
-
- -- Function: double tanh (double X)
- -- Function: float tanhf (float X)
- -- Function: long double tanhl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the hyperbolic tangent of X, defined
-     mathematically as `sinh (X) / cosh (X)'.  They may signal overflow
-     if X is too large.
-
-   There are counterparts for the hyperbolic functions which take
-complex arguments.
-
- -- Function: complex double csinh (complex double Z)
- -- Function: complex float csinhf (complex float Z)
- -- Function: complex long double csinhl (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the complex hyperbolic sine of Z, defined
-     mathematically as `(exp (Z) - exp (-Z)) / 2'.
-
- -- Function: complex double ccosh (complex double Z)
- -- Function: complex float ccoshf (complex float Z)
- -- Function: complex long double ccoshl (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the complex hyperbolic cosine of Z, defined
-     mathematically as `(exp (Z) + exp (-Z)) / 2'.
-
- -- Function: complex double ctanh (complex double Z)
- -- Function: complex float ctanhf (complex float Z)
- -- Function: complex long double ctanhl (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the complex hyperbolic tangent of Z,
-     defined mathematically as `csinh (Z) / ccosh (Z)'.
-
- -- Function: double asinh (double X)
- -- Function: float asinhf (float X)
- -- Function: long double asinhl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the inverse hyperbolic sine of X--the value
-     whose hyperbolic sine is X.
-
- -- Function: double acosh (double X)
- -- Function: float acoshf (float X)
- -- Function: long double acoshl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the inverse hyperbolic cosine of X--the
-     value whose hyperbolic cosine is X.  If X is less than `1',
-     `acosh' signals a domain error.
-
- -- Function: double atanh (double X)
- -- Function: float atanhf (float X)
- -- Function: long double atanhl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the inverse hyperbolic tangent of X--the
-     value whose hyperbolic tangent is X.  If the absolute value of X
-     is greater than `1', `atanh' signals a domain error; if it is
-     equal to 1, `atanh' returns infinity.
-
- -- Function: complex double casinh (complex double Z)
- -- Function: complex float casinhf (complex float Z)
- -- Function: complex long double casinhl (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the inverse complex hyperbolic sine of
-     Z--the value whose complex hyperbolic sine is Z.
-
- -- Function: complex double cacosh (complex double Z)
- -- Function: complex float cacoshf (complex float Z)
- -- Function: complex long double cacoshl (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the inverse complex hyperbolic cosine of
-     Z--the value whose complex hyperbolic cosine is Z.  Unlike the
-     real-valued functions, there are no restrictions on the value of Z.
-
- -- Function: complex double catanh (complex double Z)
- -- Function: complex float catanhf (complex float Z)
- -- Function: complex long double catanhl (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the inverse complex hyperbolic tangent of
-     Z--the value whose complex hyperbolic tangent is Z.  Unlike the
-     real-valued functions, there are no restrictions on the value of Z.
-
-
-File: libc.info,  Node: Special Functions,  Next: Errors in Math Functions,  Prev: Hyperbolic Functions,  Up: Mathematics
-
-19.6 Special Functions
-======================
-
-These are some more exotic mathematical functions which are sometimes
-useful.  Currently they only have real-valued versions.
-
- -- Function: double erf (double X)
- -- Function: float erff (float X)
- -- Function: long double erfl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `erf' returns the error function of X.  The error function is
-     defined as
-          erf (x) = 2/sqrt(pi) * integral from 0 to x of exp(-t^2) dt
-
- -- Function: double erfc (double X)
- -- Function: float erfcf (float X)
- -- Function: long double erfcl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `erfc' returns `1.0 - erf(X)', but computed in a fashion that
-     avoids round-off error when X is large.
-
- -- Function: double lgamma (double X)
- -- Function: float lgammaf (float X)
- -- Function: long double lgammal (long double X)
-     Preliminary: | MT-Unsafe race:signgam | AS-Unsafe | AC-Safe |
-     *Note POSIX Safety Concepts::.
-
-     `lgamma' returns the natural logarithm of the absolute value of
-     the gamma function of X.  The gamma function is defined as
-          gamma (x) = integral from 0 to oo of t^(x-1) e^-t dt
-
-     The sign of the gamma function is stored in the global variable
-     SIGNGAM, which is declared in `math.h'.  It is `1' if the
-     intermediate result was positive or zero, or `-1' if it was
-     negative.
-
-     To compute the real gamma function you can use the `tgamma'
-     function or you can compute the values as follows:
-          lgam = lgamma(x);
-          gam  = signgam*exp(lgam);
-
-     The gamma function has singularities at the non-positive integers.
-     `lgamma' will raise the zero divide exception if evaluated at a
-     singularity.
-
- -- Function: double lgamma_r (double X, int *SIGNP)
- -- Function: float lgammaf_r (float X, int *SIGNP)
- -- Function: long double lgammal_r (long double X, int *SIGNP)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `lgamma_r' is just like `lgamma', but it stores the sign of the
-     intermediate result in the variable pointed to by SIGNP instead of
-     in the SIGNGAM global.  This means it is reentrant.
-
- -- Function: double gamma (double X)
- -- Function: float gammaf (float X)
- -- Function: long double gammal (long double X)
-     Preliminary: | MT-Unsafe race:signgam | AS-Unsafe | AC-Safe |
-     *Note POSIX Safety Concepts::.
-
-     These functions exist for compatibility reasons.  They are
-     equivalent to `lgamma' etc.  It is better to use `lgamma' since
-     for one the name reflects better the actual computation, moreover
-     `lgamma' is standardized in ISO C99 while `gamma' is not.
-
- -- Function: double tgamma (double X)
- -- Function: float tgammaf (float X)
- -- Function: long double tgammal (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `tgamma' applies the gamma function to X.  The gamma function is
-     defined as
-          gamma (x) = integral from 0 to oo of t^(x-1) e^-t dt
-
-     This function was introduced in ISO C99.
-
- -- Function: double j0 (double X)
- -- Function: float j0f (float X)
- -- Function: long double j0l (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `j0' returns the Bessel function of the first kind of order 0 of
-     X.  It may signal underflow if X is too large.
-
- -- Function: double j1 (double X)
- -- Function: float j1f (float X)
- -- Function: long double j1l (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `j1' returns the Bessel function of the first kind of order 1 of
-     X.  It may signal underflow if X is too large.
-
- -- Function: double jn (int N, double X)
- -- Function: float jnf (int N, float X)
- -- Function: long double jnl (int N, long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `jn' returns the Bessel function of the first kind of order N of
-     X.  It may signal underflow if X is too large.
-
- -- Function: double y0 (double X)
- -- Function: float y0f (float X)
- -- Function: long double y0l (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `y0' returns the Bessel function of the second kind of order 0 of
-     X.  It may signal underflow if X is too large.  If X is negative,
-     `y0' signals a domain error; if it is zero, `y0' signals overflow
-     and returns -oo.
-
- -- Function: double y1 (double X)
- -- Function: float y1f (float X)
- -- Function: long double y1l (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `y1' returns the Bessel function of the second kind of order 1 of
-     X.  It may signal underflow if X is too large.  If X is negative,
-     `y1' signals a domain error; if it is zero, `y1' signals overflow
-     and returns -oo.
-
- -- Function: double yn (int N, double X)
- -- Function: float ynf (int N, float X)
- -- Function: long double ynl (int N, long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `yn' returns the Bessel function of the second kind of order N of
-     X.  It may signal underflow if X is too large.  If X is negative,
-     `yn' signals a domain error; if it is zero, `yn' signals overflow
-     and returns -oo.
-
-
-File: libc.info,  Node: Errors in Math Functions,  Next: Pseudo-Random Numbers,  Prev: Special Functions,  Up: Mathematics
-
-19.7 Known Maximum Errors in Math Functions
-===========================================
-
-This section lists the known errors of the functions in the math
-library.  Errors are measured in "units of the last place".  This is a
-measure for the relative error.  For a number z with the representation
-d.d...d*2^e (we assume IEEE floating-point numbers with base 2) the ULP
-is represented by
-
-     |d.d...d - (z / 2^e)| / 2^(p - 1)
-
-where p is the number of bits in the mantissa of the floating-point
-number representation.  Ideally the error for all functions is always
-less than 0.5ulps in round-to-nearest mode.  Using rounding bits this
-is also possible and normally implemented for the basic operations.
-Except for certain functions such as `sqrt', `fma' and `rint' whose
-results are fully specified by reference to corresponding IEEE 754
-floating-point operations, and conversions between strings and floating
-point, the GNU C Library does not aim for correctly rounded results for
-functions in the math library, and does not aim for correctness in
-whether "inexact" exceptions are raised.  Instead, the goals for
-accuracy of functions without fully specified results are as follows;
-some functions have bugs meaning they do not meet these goals in all
-cases.  In future, the GNU C Library may provide some other correctly
-rounding functions under the names such as `crsin' proposed for an
-extension to ISO C.
-
-   * Each function with a floating-point result behaves as if it
-     computes an infinite-precision result that is within a few ulp (in
-     both real and complex parts, for functions with complex results)
-     of the mathematically correct value of the function (interpreted
-     together with ISO C or POSIX semantics for the function in
-     question) at the exact value passed as the input.  Exceptions are
-     raised appropriately for this value and in accordance with IEEE
-     754 / ISO C / POSIX semantics, and it is then rounded according to
-     the current rounding direction to the result that is returned to
-     the user.  `errno' may also be set (*note Math Error Reporting::).
-
-   * For the IBM `long double' format, as used on PowerPC GNU/Linux,
-     the accuracy goal is weaker for input values not exactly
-     representable in 106 bits of precision; it is as if the input
-     value is some value within 0.5ulp of the value actually passed,
-     where "ulp" is interpreted in terms of a fixed-precision 106-bit
-     mantissa, but not necessarily the exact value actually passed with
-     discontiguous mantissa bits.
-
-   * Functions behave as if the infinite-precision result computed is
-     zero, infinity or NaN if and only if that is the mathematically
-     correct infinite-precision result.  They behave as if the
-     infinite-precision result computed always has the same sign as the
-     mathematically correct result.
-
-   * If the mathematical result is more than a few ulp above the
-     overflow threshold for the current rounding direction, the value
-     returned is the appropriate overflow value for the current
-     rounding direction, with the overflow exception raised.
-
-   * If the mathematical result has magnitude well below half the least
-     subnormal magnitude, the returned value is either zero or the least
-     subnormal (in each case, with the correct sign), according to the
-     current rounding direction and with the underflow exception raised.
-
-   * Where the mathematical result underflows and is not exactly
-     representable as a floating-point value, the underflow exception is
-     raised (so there may be spurious underflow exceptions in cases
-     where the underflowing result is exact, but not missing underflow
-     exceptions in cases where it is inexact).
-
-   * The GNU C Library does not aim for functions to satisfy other
-     properties of the underlying mathematical function, such as
-     monotonicity, where not implied by the above goals.
-
-   * All the above applies to both real and complex parts, for complex
-     functions.
-
-
-   Therefore many of the functions in the math library have errors.  The
-table lists the maximum error for each function which is exposed by one
-of the existing tests in the test suite.  The table tries to cover as
-much as possible and list the actual maximum error (or at least a
-ballpark figure) but this is often not achieved due to the large search
-space.
-
-   The table lists the ULP values for different architectures.
-Different architectures have different results since their hardware
-support for floating-point operations varies and also the existing
-hardware support is different.
-
-Function      aarch64         Alpha           ARM             hppa/fpu        IA64
-acosf         -               -               -               -               -
-acos          -               -               -               -               -
-acosl         -               -               -               -               -
-acoshf        -               -               -               -               -
-acosh         1               1               1               1               -
-acoshl        1               1               -               -               -
-asinf         -               -               -               -               -
-asin          -               -               -               -               -
-asinl         1               1               -               -               -
-asinhf        1               1               1               1               -
-asinh         1               1               1               1               -
-asinhl        1               1               -               -               -
-atanf         -               -               -               -               -
-atan          1               -               -               -               -
-atanl         -               -               -               -               -
-atanhf        1               1               1               1               -
-atanh         -               -               -               -               -
-atanhl        1               1               -               -               -
-atan2f        1               1               1               1               -
-atan2         -               -               -               -               -
-atan2l        1               1               -               -               -
-cabsf         -               -               -               -               -
-cabs          -               -               -               -               -
-cabsl         -               -               -               -               -
-cacosf        2 + i 2         2 + i 2         2 + i 2         2 + i 2         2 + i 2
-cacos         1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 1
-cacosl        2 + i 2         2 + i 2         -               -               1 + i 2
-cacoshf       2 + i 2         2 + i 2         2 + i 2         2 + i 2         2 + i 2
-cacosh        1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 1
-cacoshl       2 + i 2         2 + i 2         -               -               2 + i 1
-cargf         -               -               -               -               -
-carg          -               -               -               -               -
-cargl         -               -               -               -               -
-casinf        1 + i 2         1 + i 2         1 + i 2         1 + i 2         1 + i 2
-casin         1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 1
-casinl        2 + i 2         2 + i 2         -               1 + i 0         1 + i 2
-casinhf       2 + i 1         2 + i 1         2 + i 1         2 + i 1         2 + i 1
-casinh        1 + i 1         1 + i 1         1 + i 1         5 + i 3         1 + i 1
-casinhl       2 + i 2         2 + i 2         -               5 + i 3         2 + i 1
-catanf        1 + i 1         1 + i 1         1 + i 1         1 + i 1         0 + i 1
-catan         0 + i 1         0 + i 1         0 + i 1         0 + i 1         0 + i 1
-catanl        1 + i 1         1 + i 1         -               0 + i 1         0 + i 1
-catanhf       1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 0
-catanh        1 + i 0         1 + i 0         1 + i 0         4 + i 0         1 + i 0
-catanhl       1 + i 1         1 + i 1         -               4 + i 0         1 + i 0
-cbrtf         1               1               1               1               -
-cbrt          1               1               1               1               -
-cbrtl         1               1               -               1               -
-ccosf         1 + i 1         1 + i 1         1 + i 1         1 + i 1         0 + i 1
-ccos          1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 1
-ccosl         1 + i 1         1 + i 1         -               1 + i 0         1 + i 1
-ccoshf        1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 1
-ccosh         1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 1
-ccoshl        1 + i 1         1 + i 1         -               1 + i 0         0 + i 1
-ceilf         -               -               -               -               -
-ceil          -               -               -               -               -
-ceill         -               -               -               -               -
-cexpf         1 + i 2         1 + i 2         1 + i 2         1 + i 2         1 + i 2
-cexp          2 + i 1         2 + i 1         2 + i 1         2 + i 1         2 + i 1
-cexpl         1 + i 1         1 + i 1         -               -               1 + i 1
-cimagf        -               -               -               -               -
-cimag         -               -               -               -               -
-cimagl        -               -               -               -               -
-clogf         1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 0
-clog          1 + i 1         1 + i 0         1 + i 0         1 + i 0         1 + i 1
-clogl         1 + i 1         1 + i 1         -               -               1 + i 1
-clog10f       2 + i 1         2 + i 1         2 + i 1         2 + i 1         2 + i 1
-clog10        2 + i 1         2 + i 1         2 + i 1         2 + i 1         2 + i 1
-clog10l       1 + i 2         1 + i 2         -               0 + i 1         1 + i 1
-conjf         -               -               -               -               -
-conj          -               -               -               -               -
-conjl         -               -               -               -               -
-copysignf     -               -               -               -               -
-copysign      -               -               -               -               -
-copysignl     -               -               -               -               -
-cosf          1               1               1               1               -
-cos           -               -               -               2               1
-cosl          1               1               -               2               -
-coshf         1               1               1               1               -
-cosh          1               1               1               1               -
-coshl         1               1               -               -               -
-cpowf         5 + i 2         4 + i 2         4 + i 2         4 + i 2         5 + i 2
-cpow          2 + i 0         2 + i 0         2 + i 0         2 + i 2         2 + i 0
-cpowl         4 + i 1         4 + i 1         -               2 + i 2         3 + i 4
-cprojf        -               -               -               -               -
-cproj         -               -               -               -               -
-cprojl        -               -               -               -               -
-crealf        -               -               -               -               -
-creal         -               -               -               -               -
-creall        -               -               -               -               -
-csinf         1 + i 0         1 + i 0         1 + i 0         1 + i 0         1 + i 1
-csin          1 + i 0         1 + i 0         1 + i 0         1 + i 0         1 + i 0
-csinl         1 + i 1         1 + i 1         -               -               1 + i 0
-csinhf        1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 1
-csinh         0 + i 1         0 + i 1         0 + i 1         0 + i 1         1 + i 1
-csinhl        1 + i 1         1 + i 1         -               0 + i 1         1 + i 0
-csqrtf        1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 1
-csqrt         1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 1
-csqrtl        1 + i 1         1 + i 1         -               -               1 + i 1
-ctanf         1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 1
-ctan          1 + i 2         1 + i 2         1 + i 2         1 + i 2         1 + i 2
-ctanl         3 + i 3         3 + i 3         -               0 + i 1         2 + i 2
-ctanhf        2 + i 1         1 + i 2         1 + i 2         1 + i 2         1 + i 1
-ctanh         2 + i 2         2 + i 2         2 + i 2         2 + i 2         2 + i 2
-ctanhl        3 + i 3         3 + i 3         -               1 + i 0         1 + i 2
-erff          -               -               -               -               -
-erf           1               1               1               1               -
-erfl          1               1               -               1               -
-erfcf         1               1               1               1               -
-erfc          1               1               1               1               -
-erfcl         1               1               -               1               -
-expf          -               -               -               -               -
-exp           -               -               -               -               -
-expl          -               -               -               -               -
-exp10f        -               -               -               2               -
-exp10         1               1               1               6               -
-exp10l        1               1               -               6               -
-exp2f         -               -               -               -               -
-exp2          -               -               -               -               -
-exp2l         1               1               -               -               -
-expm1f        1               1               1               1               -
-expm1         1               1               1               1               -
-expm1l        1               1               -               1               1
-fabsf         -               -               -               -               -
-fabs          -               -               -               -               -
-fabsl         -               -               -               -               -
-fdimf         -               -               -               -               -
-fdim          -               -               -               -               -
-fdiml         -               -               -               -               -
-floorf        -               -               -               -               -
-floor         -               -               -               -               -
-floorl        -               -               -               -               -
-fmaf          -               -               -               -               -
-fma           -               -               -               -               -
-fmal          -               -               -               -               -
-fmaxf         -               -               -               -               -
-fmax          -               -               -               -               -
-fmaxl         -               -               -               -               -
-fminf         -               -               -               -               -
-fmin          -               -               -               -               -
-fminl         -               -               -               -               -
-fmodf         -               -               -               -               -
-fmod          -               -               -               -               -
-fmodl         -               -               -               -               -
-frexpf        -               -               -               -               -
-frexp         -               -               -               -               -
-frexpl        -               -               -               -               -
-gammaf        1               1               1               2               -
-gamma         1               1               1               1               -
-gammal        1               1               -               -               -
-hypotf        -               -               -               1               -
-hypot         1               1               1               1               -
-hypotl        1               1               -               -               -
-ilogbf        -               -               -               -               -
-ilogb         -               -               -               -               -
-ilogbl        -               -               -               -               -
-j0f           2               2               2               2               2
-j0            2               2               2               2               2
-j0l           2               2               -               2               2
-j1f           2               2               2               2               2
-j1            1               1               1               1               1
-j1l           4               4               -               1               1
-jnf           4               4               4               5               4
-jn            4               4               4               4               4
-jnl           7               7               -               4               4
-lgammaf       1               1               1               2               -
-lgamma        1               1               1               1               -
-lgammal       1               1               -               1               -
-lrintf        -               -               -               -               -
-lrint         -               -               -               -               -
-lrintl        -               -               -               -               -
-llrintf       -               -               -               -               -
-llrint        -               -               -               -               -
-llrintl       -               -               -               -               -
-logf          1               1               1               1               -
-log           -               -               -               -               -
-logl          1               1               -               -               -
-log10f        2               2               2               2               -
-log10         1               1               1               1               -
-log10l        1               1               -               1               -
-log1pf        1               1               1               1               -
-log1p         -               -               -               -               -
-log1pl        1               1               -               -               -
-log2f         -               -               -               -               -
-log2          -               -               -               -               -
-log2l         1               1               -               -               -
-logbf         -               -               -               -               -
-logb          -               -               -               -               -
-logbl         -               -               -               -               -
-lroundf       -               -               -               -               -
-lround        -               -               -               -               -
-lroundl       -               -               -               -               -
-llroundf      -               -               -               -               -
-llround       -               -               -               -               -
-llroundl      -               -               -               -               -
-modff         -               -               -               -               -
-modf          -               -               -               -               -
-modfl         -               -               -               -               -
-nearbyintf    -               -               -               -               -
-nearbyint     -               -               -               -               -
-nearbyintl    -               -               -               -               -
-nextafterf    -               -               -               -               -
-nextafter     -               -               -               -               -
-nextafterl    -               -               -               -               -
-nexttowardf   -               -               -               -               -
-nexttoward    -               -               -               -               -
-nexttowardl   -               -               -               -               -
-powf          1               1               1               1               -
-pow           -               -               -               -               -
-powl          1               1               -               -               -
-remainderf    -               -               -               -               -
-remainder     -               -               -               -               -
-remainderl    -               -               -               -               -
-remquof       -               -               -               -               -
-remquo        -               -               -               -               -
-remquol       -               -               -               -               -
-rintf         -               -               -               -               -
-rint          -               -               -               -               -
-rintl         -               -               -               -               -
-roundf        -               -               -               -               -
-round         -               -               -               -               -
-roundl        -               -               -               -               -
-scalbf        -               -               -               -               -
-scalb         -               -               -               -               -
-scalbl        -               -               -               -               -
-scalbnf       -               -               -               -               -
-scalbn        -               -               -               -               -
-scalbnl       -               -               -               -               -
-scalblnf      -               -               -               -               -
-scalbln       -               -               -               -               -
-scalblnl      -               -               -               -               -
-sinf          1               1               1               1               -
-sin           -               -               -               -               1
-sinl          1               1               -               -               -
-sincosf       1               1               1               1               -
-sincos        -               -               -               1               1
-sincosl       1               1               -               1               -
-sinhf         -               -               -               -               -
-sinh          -               -               -               -               -
-sinhl         -               -               -               -               -
-sqrtf         -               -               -               -               -
-sqrt          -               -               -               -               -
-sqrtl         -               -               -               -               -
-tanf          -               -               -               -               -
-tan           -               -               -               1               -
-tanl          1               1               -               1               -
-tanhf         -               -               -               -               -
-tanh          -               -               -               -               -
-tanhl         1               1               -               -               -
-tgammaf       3               3               3               3               -
-tgamma        4               4               4               4               -
-tgammal       4               4               -               1               1
-truncf        -               -               -               -               -
-trunc         -               -               -               -               -
-truncl        -               -               -               -               -
-y0f           1               1               1               1               1
-y0            2               2               2               2               2
-y0l           3               3               -               2               1
-y1f           2               2               2               2               2
-y1            3               3               3               3               3
-y1l           2               2               -               3               2
-ynf           2               2               2               2               3
-yn            3               3               3               3               3
-ynl           4               4               -               3               2
-
-Function      m68k/coldfire/fpum68k/m680x0/fpu microblaze      mips/mips32     mips/mips64
-acosf         -               -               -               -               -
-acos          -               -               -               -               -
-acosl         -               -               -               -               -
-acoshf        -               -               -               -               -
-acosh         -               1               1               1               1
-acoshl        -               -               -               -               1
-asinf         -               -               -               -               -
-asin          -               -               -               -               -
-asinl         -               -               -               -               1
-asinhf        -               1               1               1               1
-asinh         -               -               1               1               1
-asinhl        -               1               -               -               1
-atanf         -               -               -               -               -
-atan          -               -               -               -               -
-atanl         -               -               -               -               -
-atanhf        1               -               1               1               1
-atanh         -               -               -               -               -
-atanhl        -               -               -               -               1
-atan2f        1               -               1               1               1
-atan2         -               -               -               -               -
-atan2l        -               1               -               -               1
-cabsf         -               -               -               -               -
-cabs          -               -               -               -               -
-cabsl         -               -               -               -               -
-cacosf        -               2 + i 1         2 + i 2         2 + i 2         2 + i 2
-cacos         -               1 + i 1         1 + i 1         1 + i 1         1 + i 1
-cacosl        -               1 + i 2         -               -               2 + i 2
-cacoshf       0 + i 1         1 + i 2         2 + i 2         2 + i 2         2 + i 2
-cacosh        -               1 + i 1         1 + i 1         1 + i 1         1 + i 1
-cacoshl       -               2 + i 1         -               -               2 + i 2
-cargf         -               -               -               -               -
-carg          -               -               -               -               -
-cargl         -               -               -               -               -
-casinf        1 + i 0         1 + i 1         1 + i 2         1 + i 2         1 + i 2
-casin         1 + i 0         1 + i 1         1 + i 1         1 + i 1         1 + i 1
-casinl        -               1 + i 2         -               -               2 + i 2
-casinhf       1 + i 6         1 + i 1         2 + i 1         2 + i 1         2 + i 1
-casinh        5 + i 3         1 + i 1         1 + i 1         1 + i 1         1 + i 1
-casinhl       -               2 + i 1         -               -               2 + i 2
-catanf        0 + i 1         0 + i 1         1 + i 1         1 + i 1         1 + i 1
-catan         0 + i 1         0 + i 1         0 + i 1         0 + i 1         0 + i 1
-catanl        -               1 + i 1         -               -               1 + i 1
-catanhf       -               1 + i 0         1 + i 1         1 + i 1         1 + i 1
-catanh        4 + i 0         1 + i 0         1 + i 0         1 + i 0         1 + i 0
-catanhl       -               1 + i 1         -               -               1 + i 1
-cbrtf         -               1               1               1               1
-cbrt          1               1               1               1               1
-cbrtl         -               1               -               -               1
-ccosf         1 + i 1         -               1 + i 1         1 + i 1         1 + i 1
-ccos          1 + i 0         -               1 + i 1         1 + i 1         1 + i 1
-ccosl         -               1 + i 1         -               -               1 + i 1
-ccoshf        1 + i 1         -               1 + i 1         1 + i 1         1 + i 1
-ccosh         1 + i 0         -               1 + i 1         1 + i 1         1 + i 1
-ccoshl        -               0 + i 1         -               -               1 + i 1
-ceilf         -               -               -               -               -
-ceil          -               -               -               -               -
-ceill         -               -               -               -               -
-cexpf         1 + i 1         -               1 + i 2         1 + i 2         1 + i 2
-cexp          -               -               2 + i 1         2 + i 1         2 + i 1
-cexpl         -               1 + i 1         -               -               1 + i 1
-cimagf        -               -               -               -               -
-cimag         -               -               -               -               -
-cimagl        -               -               -               -               -
-clogf         1 + i 0         1 + i 1         1 + i 1         1 + i 1         1 + i 1
-clog          -               1 + i 1         1 + i 0         1 + i 0         1 + i 0
-clogl         -               1 + i 1         -               -               1 + i 1
-clog10f       1 + i 1         1 + i 1         2 + i 1         2 + i 1         2 + i 1
-clog10        0 + i 1         1 + i 1         2 + i 1         2 + i 1         2 + i 1
-clog10l       -               1 + i 2         -               -               1 + i 2
-conjf         -               -               -               -               -
-conj          -               -               -               -               -
-conjl         -               -               -               -               -
-copysignf     -               -               -               -               -
-copysign      -               -               -               -               -
-copysignl     -               -               -               -               -
-cosf          1               -               1               1               1
-cos           2               1               -               -               -
-cosl          -               -               -               -               1
-coshf         -               -               1               1               1
-cosh          -               -               1               1               1
-coshl         -               -               -               -               1
-cpowf         4 + i 2         3 + i 5         4 + i 2         4 + i 2         4 + i 2
-cpow          2 + i 2         1 + i 0         2 + i 0         2 + i 0         2 + i 0
-cpowl         -               3 + i 1         -               -               4 + i 1
-cprojf        -               -               -               -               -
-cproj         -               -               -               -               -
-cprojl        -               -               -               -               -
-crealf        -               -               -               -               -
-creal         -               -               -               -               -
-creall        -               -               -               -               -
-csinf         -               -               1 + i 0         1 + i 0         1 + i 0
-csin          -               -               1 + i 0         1 + i 0         1 + i 0
-csinl         -               1 + i 0         -               -               1 + i 1
-csinhf        1 + i 1         -               1 + i 1         1 + i 1         1 + i 1
-csinh         0 + i 1         -               0 + i 1         0 + i 1         0 + i 1
-csinhl        -               1 + i 0         -               -               1 + i 1
-csqrtf        1 + i 0         -               1 + i 1         1 + i 1         1 + i 1
-csqrt         -               1 + i 1         1 + i 1         1 + i 1         1 + i 1
-csqrtl        -               1 + i 1         -               -               1 + i 1
-ctanf         -               1 + i 1         1 + i 1         1 + i 1         1 + i 1
-ctan          0 + i 1         1 + i 1         1 + i 2         1 + i 2         1 + i 2
-ctanl         -               2 + i 2         -               -               3 + i 3
-ctanhf        2 + i 1         1 + i 2         1 + i 2         1 + i 2         1 + i 2
-ctanh         1 + i 0         1 + i 1         2 + i 2         2 + i 2         2 + i 2
-ctanhl        -               2 + i 2         -               -               3 + i 3
-erff          -               -               -               -               -
-erf           1               -               1               1               1
-erfl          -               1               -               -               1
-erfcf         -               1               1               1               1
-erfc          1               -               1               1               1
-erfcl         -               1               -               -               1
-expf          -               -               -               -               -
-exp           -               -               -               -               -
-expl          -               -               -               -               -
-exp10f        2               -               -               -               -
-exp10         6               -               1               1               1
-exp10l        -               -               -               -               1
-exp2f         -               -               -               -               -
-exp2          -               -               -               -               -
-exp2l         -               -               -               -               1
-expm1f        1               -               1               1               1
-expm1         1               -               1               1               1
-expm1l        -               1               -               -               1
-fabsf         -               -               -               -               -
-fabs          -               -               -               -               -
-fabsl         -               -               -               -               -
-fdimf         -               -               -               -               -
-fdim          -               -               -               -               -
-fdiml         -               -               -               -               -
-floorf        -               -               -               -               -
-floor         -               -               -               -               -
-floorl        -               -               -               -               -
-fmaf          -               -               -               -               -
-fma           -               -               -               -               -
-fmal          -               -               -               -               -
-fmaxf         -               -               -               -               -
-fmax          -               -               -               -               -
-fmaxl         -               -               -               -               -
-fminf         -               -               -               -               -
-fmin          -               -               -               -               -
-fminl         -               -               -               -               -
-fmodf         -               -               -               -               -
-fmod          -               -               -               -               -
-fmodl         -               -               -               -               -
-frexpf        -               -               -               -               -
-frexp         -               -               -               -               -
-frexpl        -               -               -               -               -
-gammaf        -               -               1               1               1
-gamma         -               -               1               1               1
-gammal        -               1               -               -               1
-hypotf        1               -               -               -               -
-hypot         -               1               1               1               1
-hypotl        -               1               -               -               1
-ilogbf        -               -               -               -               -
-ilogb         -               -               -               -               -
-ilogbl        -               -               -               -               -
-j0f           2               2               2               2               2
-j0            2               1               2               2               2
-j0l           -               2               -               -               2
-j1f           2               2               2               2               2
-j1            1               -               1               1               1
-j1l           -               1               -               -               4
-jnf           4               2               4               4               4
-jn            4               1               4               4               4
-jnl           -               4               -               -               7
-lgammaf       2               -               1               1               1
-lgamma        1               -               1               1               1
-lgammal       -               1               -               -               1
-lrintf        -               -               -               -               -
-lrint         -               -               -               -               -
-lrintl        -               -               -               -               -
-llrintf       -               -               -               -               -
-llrint        -               -               -               -               -
-llrintl       -               -               -               -               -
-logf          -               -               1               1               1
-log           -               -               -               -               -
-logl          -               -               -               -               1
-log10f        2               -               2               2               2
-log10         1               -               1               1               1
-log10l        -               -               -               -               1
-log1pf        1               -               1               1               1
-log1p         -               -               -               -               -
-log1pl        -               -               -               -               1
-log2f         -               -               -               -               -
-log2          -               -               -               -               -
-log2l         -               -               -               -               1
-logbf         -               -               -               -               -
-logb          -               -               -               -               -
-logbl         -               -               -               -               -
-lroundf       -               -               -               -               -
-lround        -               -               -               -               -
-lroundl       -               -               -               -               -
-llroundf      -               -               -               -               -
-llround       -               -               -               -               -
-llroundl      -               -               -               -               -
-modff         -               -               -               -               -
-modf          -               -               -               -               -
-modfl         -               -               -               -               -
-nearbyintf    -               -               -               -               -
-nearbyint     -               -               -               -               -
-nearbyintl    -               -               -               -               -
-nextafterf    -               -               -               -               -
-nextafter     -               -               -               -               -
-nextafterl    -               -               -               -               -
-nexttowardf   -               -               -               -               -
-nexttoward    -               -               -               -               -
-nexttowardl   -               -               -               -               -
-powf          -               5               1               1               1
-pow           -               1               -               -               -
-powl          -               7               -               -               1
-remainderf    -               -               -               -               -
-remainder     -               -               -               -               -
-remainderl    -               -               -               -               -
-remquof       -               -               -               -               -
-remquo        -               -               -               -               -
-remquol       -               -               -               -               -
-rintf         -               -               -               -               -
-rint          -               -               -               -               -
-rintl         -               -               -               -               -
-roundf        -               -               -               -               -
-round         -               -               -               -               -
-roundl        -               -               -               -               -
-scalbf        -               -               -               -               -
-scalb         -               -               -               -               -
-scalbl        -               -               -               -               -
-scalbnf       -               -               -               -               -
-scalbn        -               -               -               -               -
-scalbnl       -               -               -               -               -
-scalblnf      -               -               -               -               -
-scalbln       -               -               -               -               -
-scalblnl      -               -               -               -               -
-sinf          -               -               1               1               1
-sin           -               1               -               -               -
-sinl          -               -               -               -               1
-sincosf       1               -               1               1               1
-sincos        1               -               -               -               -
-sincosl       -               -               -               -               1
-sinhf         -               -               -               -               -
-sinh          -               -               -               -               -
-sinhl         -               -               -               -               -
-sqrtf         -               -               -               -               -
-sqrt          -               -               -               -               -
-sqrtl         -               -               -               -               -
-tanf          -               -               -               -               -
-tan           1               -               -               -               -
-tanl          -               -               -               -               1
-tanhf         -               -               -               -               -
-tanh          -               -               -               -               -
-tanhl         -               -               -               -               1
-tgammaf       1               3               3               3               3
-tgamma        1               4               4               4               4
-tgammal       -               9               -               -               4
-truncf        -               -               -               -               -
-trunc         -               -               -               -               -
-truncl        -               -               -               -               -
-y0f           1               1               1               1               1
-y0            2               1               2               2               2
-y0l           -               1               -               -               3
-y1f           2               2               2               2               2
-y1            3               1               3               3               3
-y1l           -               2               -               -               2
-ynf           2               3               2               2               2
-yn            3               1               3               3               3
-ynl           -               4               -               -               4
-
-Function      tile            Generic         ix86            PowerPC         powerpc/nofpu
-acosf         -               -               -               -               -
-acos          -               -               -               -               -
-acosl         -               -               1               1               1
-acoshf        -               -               -               -               -
-acosh         1               -               -               1               1
-acoshl        -               -               -               1               1
-asinf         -               -               -               -               -
-asin          -               -               -               -               -
-asinl         -               -               -               2               2
-asinhf        1               -               -               1               1
-asinh         1               -               -               1               1
-asinhl        -               -               1               1               1
-atanf         -               -               -               -               -
-atan          -               -               -               1               -
-atanl         -               -               -               -               -
-atanhf        1               -               -               1               1
-atanh         -               -               -               -               -
-atanhl        -               -               1               1               1
-atan2f        1               -               -               1               1
-atan2         -               -               -               -               -
-atan2l        -               -               1               2               2
-cabsf         -               -               -               1               -
-cabs          -               -               -               -               -
-cabsl         -               -               -               1               1
-cacosf        2 + i 2         -               1 + i 1         2 + i 2         2 + i 2
-cacos         1 + i 1         -               1 + i 1         1 + i 3         1 + i 1
-cacosl        -               -               1 + i 2         1 + i 2         2 + i 2
-cacoshf       2 + i 2         -               1 + i 1         7 + i 3         2 + i 2
-cacosh        1 + i 1         -               1 + i 1         1 + i 1         1 + i 1
-cacoshl       -               -               2 + i 1         2 + i 1         2 + i 2
-cargf         -               -               -               -               -
-carg          -               -               -               -               -
-cargl         -               -               -               1               1
-casinf        1 + i 2         -               1 + i 1         1 + i 2         1 + i 2
-casin         1 + i 1         -               1 + i 1         1 + i 3         1 + i 1
-casinl        -               -               1 + i 2         1 + i 2         2 + i 2
-casinhf       2 + i 1         -               1 + i 1         2 + i 1         2 + i 1
-casinh        1 + i 1         -               1 + i 1         5 + i 3         1 + i 1
-casinhl       -               -               2 + i 1         2 + i 1         2 + i 2
-catanf        1 + i 1         -               0 + i 1         4 + i 1         1 + i 1
-catan         0 + i 1         -               0 + i 1         0 + i 1         0 + i 1
-catanl        -               -               0 + i 1         1 + i 1         1 + i 1
-catanhf       1 + i 1         -               1 + i 0         1 + i 1         1 + i 1
-catanh        1 + i 0         -               1 + i 0         4 + i 0         1 + i 0
-catanhl       -               -               1 + i 0         1 + i 1         1 + i 1
-cbrtf         1               -               -               1               1
-cbrt          1               -               1               1               1
-cbrtl         -               -               1               1               1
-ccosf         1 + i 1         -               1 + i 1         1 + i 1         1 + i 1
-ccos          1 + i 1         -               1 + i 1         1 + i 1         1 + i 1
-ccosl         -               -               1 + i 1         1 + i 1         1 + i 2
-ccoshf        1 + i 1         -               1 + i 1         1 + i 1         1 + i 1
-ccosh         1 + i 1         -               1 + i 1         1 + i 1         1 + i 1
-ccoshl        -               -               0 + i 1         1 + i 2         1 + i 2
-ceilf         -               -               -               -               -
-ceil          -               -               -               -               -
-ceill         -               -               -               -               -
-cexpf         1 + i 2         -               1 + i 1         1 + i 2         1 + i 2
-cexp          2 + i 1         -               1 + i 1         2 + i 1         2 + i 1
-cexpl         -               -               1 + i 1         2 + i 2         2 + i 2
-cimagf        -               -               -               -               -
-cimag         -               -               -               -               -
-cimagl        -               -               -               -               -
-clogf         1 + i 1         -               1 + i 0         2 + i 3         1 + i 1
-clog          1 + i 0         -               1 + i 1         1 + i 1         1 + i 0
-clogl         -               -               1 + i 1         1 + i 2         1 + i 2
-clog10f       2 + i 1         -               1 + i 1         2 + i 1         2 + i 1
-clog10        2 + i 1         -               1 + i 1         2 + i 1         2 + i 1
-clog10l       -               -               1 + i 1         2 + i 2         2 + i 2
-conjf         -               -               -               -               -
-conj          -               -               -               -               -
-conjl         -               -               -               -               -
-copysignf     -               -               -               -               -
-copysign      -               -               -               -               -
-copysignl     -               -               -               -               -
-cosf          1               -               -               1               1
-cos           -               -               -               2               -
-cosl          -               -               1               2               2
-coshf         1               -               -               1               1
-cosh          1               -               -               1               1
-coshl         -               -               2               3               3
-cpowf         4 + i 2         -               5 + i 1         5 + i 2         4 + i 2
-cpow          2 + i 0         -               2 + i 1         2 + i 2         2 + i 0
-cpowl         -               -               3 + i 4         4 + i 2         4 + i 1
-cprojf        -               -               -               -               -
-cproj         -               -               -               -               -
-cprojl        -               -               -               0 + i 1         -
-crealf        -               -               -               -               -
-creal         -               -               -               -               -
-creall        -               -               -               -               -
-csinf         1 + i 0         -               1 + i 1         1 + i 0         1 + i 0
-csin          1 + i 0         -               1 + i 1         1 + i 0         1 + i 0
-csinl         -               -               1 + i 0         1 + i 1         2 + i 1
-csinhf        1 + i 1         -               1 + i 1         1 + i 1         1 + i 1
-csinh         0 + i 1         -               1 + i 1         0 + i 1         0 + i 1
-csinhl        -               -               1 + i 0         1 + i 1         1 + i 2
-csqrtf        1 + i 1         -               -               2 + i 2         1 + i 1
-csqrt         1 + i 1         -               1 + i 0         1 + i 1         1 + i 1
-csqrtl        -               -               1 + i 1         1 + i 1         1 + i 1
-ctanf         1 + i 1         -               1 + i 1         1 + i 1         1 + i 1
-ctan          1 + i 2         -               1 + i 1         1 + i 2         1 + i 2
-ctanl         -               -               2 + i 1         2 + i 2         2 + i 2
-ctanhf        1 + i 2         -               1 + i 1         2 + i 1         1 + i 2
-ctanh         2 + i 2         -               1 + i 1         2 + i 2         2 + i 2
-ctanhl        -               -               1 + i 2         2 + i 3         2 + i 3
-erff          -               -               -               -               -
-erf           1               -               1               1               1
-erfl          -               -               1               1               1
-erfcf         1               -               -               1               1
-erfc          1               -               1               1               1
-erfcl         -               -               1               2               2
-expf          -               -               -               -               -
-exp           -               -               -               -               -
-expl          -               -               -               1               1
-exp10f        -               -               -               1               -
-exp10         1               -               -               1               1
-exp10l        -               -               1               1               1
-exp2f         -               -               -               -               -
-exp2          -               -               -               -               -
-exp2l         -               -               -               2               -
-expm1f        1               -               -               1               1
-expm1         1               -               -               1               1
-expm1l        -               -               1               1               1
-fabsf         -               -               -               -               -
-fabs          -               -               -               -               -
-fabsl         -               -               -               -               -
-fdimf         -               -               -               -               -
-fdim          -               -               -               -               -
-fdiml         -               -               -               -               -
-floorf        -               -               -               -               -
-floor         -               -               -               -               -
-floorl        -               -               -               -               -
-fmaf          -               -               -               -               -
-fma           -               -               -               -               -
-fmal          -               -               -               -               -
-fmaxf         -               -               -               -               -
-fmax          -               -               -               -               -
-fmaxl         -               -               -               -               -
-fminf         -               -               -               -               -
-fmin          -               -               -               -               -
-fminl         -               -               -               -               -
-fmodf         -               -               -               -               -
-fmod          -               -               -               -               -
-fmodl         -               -               -               -               -
-frexpf        -               -               -               -               -
-frexp         -               -               -               -               -
-frexpl        -               -               -               -               -
-gammaf        1               -               1               2               1
-gamma         1               -               1               1               1
-gammal        -               -               1               1               1
-hypotf        -               -               -               1               -
-hypot         1               -               -               1               1
-hypotl        -               -               1               1               1
-ilogbf        -               -               -               -               -
-ilogb         -               -               -               -               -
-ilogbl        -               -               -               -               -
-j0f           2               -               1               2               2
-j0            2               -               1               3               2
-j0l           -               -               2               2               2
-j1f           2               -               1               2               2
-j1            1               -               2               1               1
-j1l           -               -               1               1               1
-jnf           4               -               3               5               4
-jn            4               -               2               4               4
-jnl           -               -               4               7               4
-lgammaf       1               -               1               2               1
-lgamma        1               -               1               1               1
-lgammal       -               -               1               1               1
-lrintf        -               -               -               -               -
-lrint         -               -               -               -               -
-lrintl        -               -               -               -               -
-llrintf       -               -               -               -               -
-llrint        -               -               -               -               -
-llrintl       -               -               -               -               -
-logf          1               -               -               1               1
-log           -               -               -               -               -
-logl          -               -               1               1               1
-log10f        2               -               -               2               2
-log10         1               -               -               1               1
-log10l        -               -               1               1               1
-log1pf        1               -               -               1               1
-log1p         -               -               -               -               -
-log1pl        -               -               1               1               1
-log2f         -               -               -               -               -
-log2          -               -               -               -               -
-log2l         -               -               -               1               1
-logbf         -               -               -               -               -
-logb          -               -               -               -               -
-logbl         -               -               -               -               -
-lroundf       -               -               -               -               -
-lround        -               -               -               -               -
-lroundl       -               -               -               -               -
-llroundf      -               -               -               -               -
-llround       -               -               -               -               -
-llroundl      -               -               -               -               -
-modff         -               -               -               -               -
-modf          -               -               -               -               -
-modfl         -               -               -               -               -
-nearbyintf    -               -               -               -               -
-nearbyint     -               -               -               -               -
-nearbyintl    -               -               -               -               -
-nextafterf    -               -               -               -               -
-nextafter     -               -               -               -               -
-nextafterl    -               -               -               -               -
-nexttowardf   -               -               -               -               -
-nexttoward    -               -               -               -               -
-nexttowardl   -               -               -               -               -
-powf          1               -               -               1               1
-pow           -               -               -               -               -
-powl          -               -               1               1               1
-remainderf    -               -               -               -               -
-remainder     -               -               -               -               -
-remainderl    -               -               -               -               -
-remquof       -               -               -               -               -
-remquo        -               -               -               -               -
-remquol       -               -               -               -               -
-rintf         -               -               -               -               -
-rint          -               -               -               -               -
-rintl         -               -               -               -               -
-roundf        -               -               -               -               -
-round         -               -               -               -               -
-roundl        -               -               -               -               -
-scalbf        -               -               -               -               -
-scalb         -               -               -               -               -
-scalbl        -               -               -               -               -
-scalbnf       -               -               -               -               -
-scalbn        -               -               -               -               -
-scalbnl       -               -               -               -               -
-scalblnf      -               -               -               -               -
-scalbln       -               -               -               -               -
-scalblnl      -               -               -               -               -
-sinf          1               -               -               1               1
-sin           -               -               -               -               -
-sinl          -               -               1               1               1
-sincosf       1               -               -               1               1
-sincos        -               -               -               1               -
-sincosl       -               -               1               1               1
-sinhf         -               -               -               -               -
-sinh          -               -               -               -               -
-sinhl         -               -               -               1               1
-sqrtf         -               -               -               -               -
-sqrt          -               -               -               1               -
-sqrtl         -               -               -               1               -
-tanf          -               -               1               -               -
-tan           -               -               -               1               -
-tanl          -               -               1               2               2
-tanhf         -               -               -               -               -
-tanh          -               -               -               -               -
-tanhl         -               -               -               1               1
-tgammaf       3               -               2               3               3
-tgamma        4               -               4               4               4
-tgammal       -               -               4               3               3
-truncf        -               -               -               -               -
-trunc         -               -               -               -               -
-truncl        -               -               -               -               -
-y0f           1               -               1               1               1
-y0            2               -               1               2               2
-y0l           -               -               1               1               1
-y1f           2               -               2               2               2
-y1            3               -               2               3               3
-y1l           -               -               2               2               2
-ynf           2               -               3               2               2
-yn            3               -               2               3               3
-ynl           -               -               4               2               2
-
-Function      S/390           sh              sparc/fpu       x86_64/fpu
-acosf         -               -               -               -
-acos          -               -               -               -
-acosl         -               -               -               1
-acoshf        -               -               -               -
-acosh         1               1               1               1
-acoshl        1               -               1               -
-asinf         -               -               -               -
-asin          -               -               -               -
-asinl         1               -               1               -
-asinhf        1               1               1               1
-asinh         1               1               1               1
-asinhl        1               -               1               1
-atanf         -               -               -               -
-atan          1               -               -               -
-atanl         -               -               -               -
-atanhf        1               1               1               1
-atanh         -               -               -               -
-atanhl        1               -               1               1
-atan2f        1               1               1               1
-atan2         -               -               -               -
-atan2l        1               -               1               1
-cabsf         -               -               -               -
-cabs          -               -               -               -
-cabsl         -               -               -               -
-cacosf        2 + i 2         2 + i 2         2 + i 2         2 + i 2
-cacos         1 + i 1         1 + i 1         1 + i 1         1 + i 1
-cacosl        2 + i 2         -               2 + i 2         1 + i 2
-cacoshf       2 + i 2         2 + i 2         2 + i 2         2 + i 2
-cacosh        1 + i 1         1 + i 1         1 + i 1         1 + i 1
-cacoshl       2 + i 2         -               2 + i 2         2 + i 1
-cargf         -               -               -               -
-carg          -               -               -               -
-cargl         -               -               -               -
-casinf        1 + i 2         1 + i 2         1 + i 2         1 + i 2
-casin         1 + i 1         1 + i 1         1 + i 1         1 + i 1
-casinl        2 + i 2         -               2 + i 2         1 + i 2
-casinhf       2 + i 1         2 + i 1         2 + i 1         2 + i 1
-casinh        1 + i 1         1 + i 1         1 + i 1         1 + i 1
-casinhl       2 + i 2         -               2 + i 2         2 + i 1
-catanf        1 + i 1         1 + i 1         1 + i 1         1 + i 1
-catan         0 + i 1         0 + i 1         0 + i 1         0 + i 1
-catanl        1 + i 1         -               1 + i 1         0 + i 1
-catanhf       1 + i 1         1 + i 1         1 + i 1         1 + i 1
-catanh        1 + i 0         1 + i 0         1 + i 0         1 + i 0
-catanhl       1 + i 1         -               1 + i 1         1 + i 0
-cbrtf         1               1               1               1
-cbrt          1               1               1               1
-cbrtl         1               -               1               1
-ccosf         1 + i 1         1 + i 1         1 + i 1         1 + i 1
-ccos          1 + i 1         1 + i 1         1 + i 1         1 + i 1
-ccosl         1 + i 1         -               1 + i 1         1 + i 1
-ccoshf        1 + i 1         1 + i 1         1 + i 1         1 + i 1
-ccosh         1 + i 1         1 + i 1         1 + i 1         1 + i 1
-ccoshl        1 + i 1         -               1 + i 1         0 + i 1
-ceilf         -               -               -               -
-ceil          -               -               -               -
-ceill         -               -               -               -
-cexpf         1 + i 2         1 + i 2         1 + i 2         1 + i 2
-cexp          2 + i 1         2 + i 1         2 + i 1         2 + i 1
-cexpl         1 + i 1         -               1 + i 1         1 + i 1
-cimagf        -               -               -               -
-cimag         -               -               -               -
-cimagl        -               -               -               -
-clogf         1 + i 1         1 + i 1         1 + i 1         1 + i 1
-clog          1 + i 1         1 + i 0         1 + i 0         1 + i 0
-clogl         1 + i 1         -               1 + i 1         1 + i 1
-clog10f       2 + i 1         2 + i 1         2 + i 1         2 + i 1
-clog10        2 + i 1         2 + i 1         2 + i 1         2 + i 1
-clog10l       1 + i 2         -               1 + i 2         1 + i 1
-conjf         -               -               -               -
-conj          -               -               -               -
-conjl         -               -               -               -
-copysignf     -               -               -               -
-copysign      -               -               -               -
-copysignl     -               -               -               -
-cosf          1               1               1               -
-cos           -               -               -               -
-cosl          1               -               1               1
-coshf         1               1               1               1
-cosh          1               1               1               1
-coshl         1               -               1               2
-cpowf         5 + i 2         4 + i 2         4 + i 2         5 + i 2
-cpow          2 + i 0         2 + i 0         2 + i 0         2 + i 0
-cpowl         4 + i 1         -               4 + i 1         3 + i 4
-cprojf        -               -               -               -
-cproj         -               -               -               -
-cprojl        -               -               -               -
-crealf        -               -               -               -
-creal         -               -               -               -
-creall        -               -               -               -
-csinf         1 + i 0         1 + i 0         1 + i 0         1 + i 0
-csin          1 + i 0         1 + i 0         1 + i 0         1 + i 0
-csinl         1 + i 1         -               1 + i 1         1 + i 0
-csinhf        1 + i 1         1 + i 1         1 + i 1         1 + i 1
-csinh         0 + i 1         0 + i 1         0 + i 1         0 + i 1
-csinhl        1 + i 1         -               1 + i 1         1 + i 0
-csqrtf        1 + i 1         1 + i 1         1 + i 1         1 + i 1
-csqrt         1 + i 1         1 + i 1         1 + i 1         1 + i 1
-csqrtl        1 + i 1         -               1 + i 1         1 + i 1
-ctanf         1 + i 1         1 + i 1         1 + i 1         1 + i 2
-ctan          1 + i 2         1 + i 2         1 + i 2         1 + i 2
-ctanl         3 + i 3         -               3 + i 3         2 + i 1
-ctanhf        2 + i 1         1 + i 2         1 + i 2         2 + i 2
-ctanh         2 + i 2         2 + i 2         2 + i 2         2 + i 2
-ctanhl        3 + i 3         -               3 + i 3         1 + i 2
-erff          -               -               -               -
-erf           1               1               1               1
-erfl          1               -               1               1
-erfcf         1               1               1               1
-erfc          1               1               1               1
-erfcl         1               -               1               1
-expf          -               -               -               -
-exp           -               -               -               -
-expl          -               -               -               -
-exp10f        -               -               -               -
-exp10         1               1               1               1
-exp10l        1               -               1               1
-exp2f         -               -               -               -
-exp2          -               -               -               -
-exp2l         1               -               1               -
-expm1f        1               1               1               1
-expm1         1               1               1               1
-expm1l        1               -               1               1
-fabsf         -               -               -               -
-fabs          -               -               -               -
-fabsl         -               -               -               -
-fdimf         -               -               -               -
-fdim          -               -               -               -
-fdiml         -               -               -               -
-floorf        -               -               -               -
-floor         -               -               -               -
-floorl        -               -               -               -
-fmaf          -               -               -               -
-fma           -               -               -               -
-fmal          -               -               -               -
-fmaxf         -               -               -               -
-fmax          -               -               -               -
-fmaxl         -               -               -               -
-fminf         -               -               -               -
-fmin          -               -               -               -
-fminl         -               -               -               -
-fmodf         -               -               -               -
-fmod          -               -               -               -
-fmodl         -               -               -               -
-frexpf        -               -               -               -
-frexp         -               -               -               -
-frexpl        -               -               -               -
-gammaf        1               1               1               1
-gamma         1               1               1               1
-gammal        1               -               1               1
-hypotf        -               -               -               -
-hypot         1               1               1               1
-hypotl        1               -               1               1
-ilogbf        -               -               -               -
-ilogb         -               -               -               -
-ilogbl        -               -               -               -
-j0f           2               2               2               2
-j0            2               2               2               2
-j0l           2               -               2               2
-j1f           2               2               2               2
-j1            1               1               1               1
-j1l           4               -               4               1
-jnf           4               4               4               4
-jn            4               4               4               4
-jnl           7               -               7               4
-lgammaf       1               1               1               1
-lgamma        1               1               1               1
-lgammal       1               -               1               1
-lrintf        -               -               -               -
-lrint         -               -               -               -
-lrintl        -               -               -               -
-llrintf       -               -               -               -
-llrint        -               -               -               -
-llrintl       -               -               -               -
-logf          1               1               1               1
-log           -               -               -               -
-logl          1               -               1               1
-log10f        2               2               2               2
-log10         1               1               1               1
-log10l        1               -               1               1
-log1pf        1               1               1               1
-log1p         -               -               -               -
-log1pl        1               -               1               1
-log2f         -               -               -               -
-log2          -               -               -               -
-log2l         1               -               1               -
-logbf         -               -               -               -
-logb          -               -               -               -
-logbl         -               -               -               -
-lroundf       -               -               -               -
-lround        -               -               -               -
-lroundl       -               -               -               -
-llroundf      -               -               -               -
-llround       -               -               -               -
-llroundl      -               -               -               -
-modff         -               -               -               -
-modf          -               -               -               -
-modfl         -               -               -               -
-nearbyintf    -               -               -               -
-nearbyint     -               -               -               -
-nearbyintl    -               -               -               -
-nextafterf    -               -               -               -
-nextafter     -               -               -               -
-nextafterl    -               -               -               -
-nexttowardf   -               -               -               -
-nexttoward    -               -               -               -
-nexttowardl   -               -               -               -
-powf          1               1               1               1
-pow           -               -               -               -
-powl          1               -               1               1
-remainderf    -               -               -               -
-remainder     -               -               -               -
-remainderl    -               -               -               -
-remquof       -               -               -               -
-remquo        -               -               -               -
-remquol       -               -               -               -
-rintf         -               -               -               -
-rint          -               -               -               -
-rintl         -               -               -               -
-roundf        -               -               -               -
-round         -               -               -               -
-roundl        -               -               -               -
-scalbf        -               -               -               -
-scalb         -               -               -               -
-scalbl        -               -               -               -
-scalbnf       -               -               -               -
-scalbn        -               -               -               -
-scalbnl       -               -               -               -
-scalblnf      -               -               -               -
-scalbln       -               -               -               -
-scalblnl      -               -               -               -
-sinf          1               1               1               -
-sin           -               -               -               -
-sinl          1               -               1               1
-sincosf       1               1               1               -
-sincos        -               -               -               -
-sincosl       1               -               1               1
-sinhf         -               -               -               -
-sinh          -               -               -               -
-sinhl         -               -               -               1
-sqrtf         -               -               -               -
-sqrt          -               -               -               -
-sqrtl         -               -               -               -
-tanf          -               -               -               -
-tan           -               -               -               -
-tanl          1               -               1               1
-tanhf         -               -               -               -
-tanh          -               -               -               -
-tanhl         1               -               1               -
-tgammaf       3               3               3               3
-tgamma        4               4               4               4
-tgammal       4               -               4               4
-truncf        -               -               -               -
-trunc         -               -               -               -
-truncl        -               -               -               -
-y0f           1               1               1               1
-y0            2               2               2               2
-y0l           3               -               3               1
-y1f           2               2               2               2
-y1            3               3               3               3
-y1l           2               -               2               2
-ynf           2               2               2               3
-yn            3               3               3               3
-ynl           4               -               4               4
-
-
-File: libc.info,  Node: Pseudo-Random Numbers,  Next: FP Function Optimizations,  Prev: Errors in Math Functions,  Up: Mathematics
-
-19.8 Pseudo-Random Numbers
-==========================
-
-This section describes the GNU facilities for generating a series of
-pseudo-random numbers.  The numbers generated are not truly random;
-typically, they form a sequence that repeats periodically, with a period
-so large that you can ignore it for ordinary purposes.  The random
-number generator works by remembering a "seed" value which it uses to
-compute the next random number and also to compute a new seed.
-
-   Although the generated numbers look unpredictable within one run of a
-program, the sequence of numbers is _exactly the same_ from one run to
-the next.  This is because the initial seed is always the same.  This
-is convenient when you are debugging a program, but it is unhelpful if
-you want the program to behave unpredictably.  If you want a different
-pseudo-random series each time your program runs, you must specify a
-different seed each time.  For ordinary purposes, basing the seed on the
-current time works well.
-
-   You can obtain repeatable sequences of numbers on a particular
-machine type by specifying the same initial seed value for the random
-number generator.  There is no standard meaning for a particular seed
-value; the same seed, used in different C libraries or on different CPU
-types, will give you different random numbers.
-
-   The GNU C Library supports the standard ISO C random number functions
-plus two other sets derived from BSD and SVID.  The BSD and ISO C
-functions provide identical, somewhat limited functionality.  If only a
-small number of random bits are required, we recommend you use the
-ISO C interface, `rand' and `srand'.  The SVID functions provide a more
-flexible interface, which allows better random number generator
-algorithms, provides more random bits (up to 48) per call, and can
-provide random floating-point numbers.  These functions are required by
-the XPG standard and therefore will be present in all modern Unix
-systems.
-
-* Menu:
-
-* ISO Random::                  `rand' and friends.
-* BSD Random::                  `random' and friends.
-* SVID Random::                 `drand48' and friends.
-
-
-File: libc.info,  Node: ISO Random,  Next: BSD Random,  Up: Pseudo-Random Numbers
-
-19.8.1 ISO C Random Number Functions
-------------------------------------
-
-This section describes the random number functions that are part of the
-ISO C standard.
-
-   To use these facilities, you should include the header file
-`stdlib.h' in your program.  
-
- -- Macro: int RAND_MAX
-     The value of this macro is an integer constant representing the
-     largest value the `rand' function can return.  In the GNU C
-     Library, it is `2147483647', which is the largest signed integer
-     representable in 32 bits.  In other libraries, it may be as low as
-     `32767'.
-
- -- Function: int rand (void)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     The `rand' function returns the next pseudo-random number in the
-     series.  The value ranges from `0' to `RAND_MAX'.
-
- -- Function: void srand (unsigned int SEED)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     This function establishes SEED as the seed for a new series of
-     pseudo-random numbers.  If you call `rand' before a seed has been
-     established with `srand', it uses the value `1' as a default seed.
-
-     To produce a different pseudo-random series each time your program
-     is run, do `srand (time (0))'.
-
-   POSIX.1 extended the C standard functions to support reproducible
-random numbers in multi-threaded programs.  However, the extension is
-badly designed and unsuitable for serious work.
-
- -- Function: int rand_r (unsigned int *SEED)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function returns a random number in the range 0 to `RAND_MAX'
-     just as `rand' does.  However, all its state is stored in the SEED
-     argument.  This means the RNG's state can only have as many bits
-     as the type `unsigned int' has.  This is far too few to provide a
-     good RNG.
-
-     If your program requires a reentrant RNG, we recommend you use the
-     reentrant GNU extensions to the SVID random number generator.  The
-     POSIX.1 interface should only be used when the GNU extensions are
-     not available.
-
-
-File: libc.info,  Node: BSD Random,  Next: SVID Random,  Prev: ISO Random,  Up: Pseudo-Random Numbers
-
-19.8.2 BSD Random Number Functions
-----------------------------------
-
-This section describes a set of random number generation functions that
-are derived from BSD.  There is no advantage to using these functions
-with the GNU C Library; we support them for BSD compatibility only.
-
-   The prototypes for these functions are in `stdlib.h'.  
-
- -- Function: long int random (void)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     This function returns the next pseudo-random number in the
-     sequence.  The value returned ranges from `0' to `2147483647'.
-
-     *NB:* Temporarily this function was defined to return a `int32_t'
-     value to indicate that the return value always contains 32 bits
-     even if `long int' is wider.  The standard demands it differently.
-     Users must always be aware of the 32-bit limitation, though.
-
- -- Function: void srandom (unsigned int SEED)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     The `srandom' function sets the state of the random number
-     generator based on the integer SEED.  If you supply a SEED value
-     of `1', this will cause `random' to reproduce the default set of
-     random numbers.
-
-     To produce a different set of pseudo-random numbers each time your
-     program runs, do `srandom (time (0))'.
-
- -- Function: char * initstate (unsigned int SEED, char *STATE, size_t
-          SIZE)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     The `initstate' function is used to initialize the random number
-     generator state.  The argument STATE is an array of SIZE bytes,
-     used to hold the state information.  It is initialized based on
-     SEED.  The size must be between 8 and 256 bytes, and should be a
-     power of two.  The bigger the STATE array, the better.
-
-     The return value is the previous value of the state information
-     array.  You can use this value later as an argument to `setstate'
-     to restore that state.
-
- -- Function: char * setstate (char *STATE)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     The `setstate' function restores the random number state
-     information STATE.  The argument must have been the result of a
-     previous call to INITSTATE or SETSTATE.
-
-     The return value is the previous value of the state information
-     array.  You can use this value later as an argument to `setstate'
-     to restore that state.
-
-     If the function fails the return value is `NULL'.
-
-   The four functions described so far in this section all work on a
-state which is shared by all threads.  The state is not directly
-accessible to the user and can only be modified by these functions.
-This makes it hard to deal with situations where each thread should
-have its own pseudo-random number generator.
-
-   The GNU C Library contains four additional functions which contain
-the state as an explicit parameter and therefore make it possible to
-handle thread-local PRNGs.  Beside this there is no difference.  In
-fact, the four functions already discussed are implemented internally
-using the following interfaces.
-
-   The `stdlib.h' header contains a definition of the following type:
-
- -- Data Type: struct random_data
-     Objects of type `struct random_data' contain the information
-     necessary to represent the state of the PRNG.  Although a complete
-     definition of the type is present the type should be treated as
-     opaque.
-
-   The functions modifying the state follow exactly the already
-described functions.
-
- -- Function: int random_r (struct random_data *restrict BUF, int32_t
-          *restrict RESULT)
-     Preliminary: | MT-Safe race:buf | AS-Safe | AC-Unsafe corrupt |
-     *Note POSIX Safety Concepts::.
-
-     The `random_r' function behaves exactly like the `random' function
-     except that it uses and modifies the state in the object pointed
-     to by the first parameter instead of the global state.
-
- -- Function: int srandom_r (unsigned int SEED, struct random_data *BUF)
-     Preliminary: | MT-Safe race:buf | AS-Safe | AC-Unsafe corrupt |
-     *Note POSIX Safety Concepts::.
-
-     The `srandom_r' function behaves exactly like the `srandom'
-     function except that it uses and modifies the state in the object
-     pointed to by the second parameter instead of the global state.
-
- -- Function: int initstate_r (unsigned int SEED, char *restrict
-          STATEBUF, size_t STATELEN, struct random_data *restrict BUF)
-     Preliminary: | MT-Safe race:buf | AS-Safe | AC-Unsafe corrupt |
-     *Note POSIX Safety Concepts::.
-
-     The `initstate_r' function behaves exactly like the `initstate'
-     function except that it uses and modifies the state in the object
-     pointed to by the fourth parameter instead of the global state.
-
- -- Function: int setstate_r (char *restrict STATEBUF, struct
-          random_data *restrict BUF)
-     Preliminary: | MT-Safe race:buf | AS-Safe | AC-Unsafe corrupt |
-     *Note POSIX Safety Concepts::.
-
-     The `setstate_r' function behaves exactly like the `setstate'
-     function except that it uses and modifies the state in the object
-     pointed to by the first parameter instead of the global state.
-
-
-File: libc.info,  Node: SVID Random,  Prev: BSD Random,  Up: Pseudo-Random Numbers
-
-19.8.3 SVID Random Number Function
-----------------------------------
-
-The C library on SVID systems contains yet another kind of random number
-generator functions.  They use a state of 48 bits of data.  The user can
-choose among a collection of functions which return the random bits in
-different forms.
-
-   Generally there are two kinds of function.  The first uses a state of
-the random number generator which is shared among several functions and
-by all threads of the process.  The second requires the user to handle
-the state.
-
-   All functions have in common that they use the same congruential
-formula with the same constants.  The formula is
-
-     Y = (a * X + c) mod m
-
-where X is the state of the generator at the beginning and Y the state
-at the end.  `a' and `c' are constants determining the way the
-generator works.  By default they are
-
-     a = 0x5DEECE66D = 25214903917
-     c = 0xb = 11
-
-but they can also be changed by the user.  `m' is of course 2^48 since
-the state consists of a 48-bit array.
-
-   The prototypes for these functions are in `stdlib.h'.  
-
- -- Function: double drand48 (void)
-     Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     This function returns a `double' value in the range of `0.0' to
-     `1.0' (exclusive).  The random bits are determined by the global
-     state of the random number generator in the C library.
-
-     Since the `double' type according to IEEE 754 has a 52-bit
-     mantissa this means 4 bits are not initialized by the random number
-     generator.  These are (of course) chosen to be the least
-     significant bits and they are initialized to `0'.
-
- -- Function: double erand48 (unsigned short int XSUBI[3])
-     Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     This function returns a `double' value in the range of `0.0' to
-     `1.0' (exclusive), similarly to `drand48'.  The argument is an
-     array describing the state of the random number generator.
-
-     This function can be called subsequently since it updates the
-     array to guarantee random numbers.  The array should have been
-     initialized before initial use to obtain reproducible results.
-
- -- Function: long int lrand48 (void)
-     Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `lrand48' function returns an integer value in the range of
-     `0' to `2^31' (exclusive).  Even if the size of the `long int'
-     type can take more than 32 bits, no higher numbers are returned.
-     The random bits are determined by the global state of the random
-     number generator in the C library.
-
- -- Function: long int nrand48 (unsigned short int XSUBI[3])
-     Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     This function is similar to the `lrand48' function in that it
-     returns a number in the range of `0' to `2^31' (exclusive) but the
-     state of the random number generator used to produce the random
-     bits is determined by the array provided as the parameter to the
-     function.
-
-     The numbers in the array are updated afterwards so that subsequent
-     calls to this function yield different results (as is expected of
-     a random number generator).  The array should have been
-     initialized before the first call to obtain reproducible results.
-
- -- Function: long int mrand48 (void)
-     Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `mrand48' function is similar to `lrand48'.  The only
-     difference is that the numbers returned are in the range `-2^31' to
-     `2^31' (exclusive).
-
- -- Function: long int jrand48 (unsigned short int XSUBI[3])
-     Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `jrand48' function is similar to `nrand48'.  The only
-     difference is that the numbers returned are in the range `-2^31' to
-     `2^31' (exclusive).  For the `xsubi' parameter the same
-     requirements are necessary.
-
-   The internal state of the random number generator can be initialized
-in several ways.  The methods differ in the completeness of the
-information provided.
-
- -- Function: void srand48 (long int SEEDVAL)
-     Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `srand48' function sets the most significant 32 bits of the
-     internal state of the random number generator to the least
-     significant 32 bits of the SEEDVAL parameter.  The lower 16 bits
-     are initialized to the value `0x330E'.  Even if the `long int'
-     type contains more than 32 bits only the lower 32 bits are used.
-
-     Owing to this limitation, initialization of the state of this
-     function is not very useful.  But it makes it easy to use a
-     construct like `srand48 (time (0))'.
-
-     A side-effect of this function is that the values `a' and `c' from
-     the internal state, which are used in the congruential formula,
-     are reset to the default values given above.  This is of
-     importance once the user has called the `lcong48' function (see
-     below).
-
- -- Function: unsigned short int * seed48 (unsigned short int
-          SEED16V[3])
-     Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `seed48' function initializes all 48 bits of the state of the
-     internal random number generator from the contents of the parameter
-     SEED16V.  Here the lower 16 bits of the first element of SEE16V
-     initialize the least significant 16 bits of the internal state,
-     the lower 16 bits of `SEED16V[1]' initialize the mid-order 16 bits
-     of the state and the 16 lower bits of `SEED16V[2]' initialize the
-     most significant 16 bits of the state.
-
-     Unlike `srand48' this function lets the user initialize all 48 bits
-     of the state.
-
-     The value returned by `seed48' is a pointer to an array containing
-     the values of the internal state before the change.  This might be
-     useful to restart the random number generator at a certain state.
-     Otherwise the value can simply be ignored.
-
-     As for `srand48', the values `a' and `c' from the congruential
-     formula are reset to the default values.
-
-   There is one more function to initialize the random number generator
-which enables you to specify even more information by allowing you to
-change the parameters in the congruential formula.
-
- -- Function: void lcong48 (unsigned short int PARAM[7])
-     Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `lcong48' function allows the user to change the complete state
-     of the random number generator.  Unlike `srand48' and `seed48',
-     this function also changes the constants in the congruential
-     formula.
-
-     From the seven elements in the array PARAM the least significant
-     16 bits of the entries `PARAM[0]' to `PARAM[2]' determine the
-     initial state, the least significant 16 bits of `PARAM[3]' to
-     `PARAM[5]' determine the 48 bit constant `a' and `PARAM[6]'
-     determines the 16-bit value `c'.
-
-   All the above functions have in common that they use the global
-parameters for the congruential formula.  In multi-threaded programs it
-might sometimes be useful to have different parameters in different
-threads.  For this reason all the above functions have a counterpart
-which works on a description of the random number generator in the
-user-supplied buffer instead of the global state.
-
-   Please note that it is no problem if several threads use the global
-state if all threads use the functions which take a pointer to an array
-containing the state.  The random numbers are computed following the
-same loop but if the state in the array is different all threads will
-obtain an individual random number generator.
-
-   The user-supplied buffer must be of type `struct drand48_data'.
-This type should be regarded as opaque and not manipulated directly.
-
- -- Function: int drand48_r (struct drand48_data *BUFFER, double
-          *RESULT)
-     Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt |
-     *Note POSIX Safety Concepts::.
-
-     This function is equivalent to the `drand48' function with the
-     difference that it does not modify the global random number
-     generator parameters but instead the parameters in the buffer
-     supplied through the pointer BUFFER.  The random number is
-     returned in the variable pointed to by RESULT.
-
-     The return value of the function indicates whether the call
-     succeeded.  If the value is less than `0' an error occurred and
-     ERRNO is set to indicate the problem.
-
-     This function is a GNU extension and should not be used in portable
-     programs.
-
- -- Function: int erand48_r (unsigned short int XSUBI[3], struct
-          drand48_data *BUFFER, double *RESULT)
-     Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt |
-     *Note POSIX Safety Concepts::.
-
-     The `erand48_r' function works like `erand48', but in addition it
-     takes an argument BUFFER which describes the random number
-     generator.  The state of the random number generator is taken from
-     the `xsubi' array, the parameters for the congruential formula
-     from the global random number generator data.  The random number
-     is returned in the variable pointed to by RESULT.
-
-     The return value is non-negative if the call succeeded.
-
-     This function is a GNU extension and should not be used in portable
-     programs.
-
- -- Function: int lrand48_r (struct drand48_data *BUFFER, long int
-          *RESULT)
-     Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt |
-     *Note POSIX Safety Concepts::.
-
-     This function is similar to `lrand48', but in addition it takes a
-     pointer to a buffer describing the state of the random number
-     generator just like `drand48'.
-
-     If the return value of the function is non-negative the variable
-     pointed to by RESULT contains the result.  Otherwise an error
-     occurred.
-
-     This function is a GNU extension and should not be used in portable
-     programs.
-
- -- Function: int nrand48_r (unsigned short int XSUBI[3], struct
-          drand48_data *BUFFER, long int *RESULT)
-     Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt |
-     *Note POSIX Safety Concepts::.
-
-     The `nrand48_r' function works like `nrand48' in that it produces
-     a random number in the range `0' to `2^31'.  But instead of using
-     the global parameters for the congruential formula it uses the
-     information from the buffer pointed to by BUFFER.  The state is
-     described by the values in XSUBI.
-
-     If the return value is non-negative the variable pointed to by
-     RESULT contains the result.
-
-     This function is a GNU extension and should not be used in portable
-     programs.
-
- -- Function: int mrand48_r (struct drand48_data *BUFFER, long int
-          *RESULT)
-     Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt |
-     *Note POSIX Safety Concepts::.
-
-     This function is similar to `mrand48' but like the other reentrant
-     functions it uses the random number generator described by the
-     value in the buffer pointed to by BUFFER.
-
-     If the return value is non-negative the variable pointed to by
-     RESULT contains the result.
-
-     This function is a GNU extension and should not be used in portable
-     programs.
-
- -- Function: int jrand48_r (unsigned short int XSUBI[3], struct
-          drand48_data *BUFFER, long int *RESULT)
-     Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt |
-     *Note POSIX Safety Concepts::.
-
-     The `jrand48_r' function is similar to `jrand48'.  Like the other
-     reentrant functions of this function family it uses the
-     congruential formula parameters from the buffer pointed to by
-     BUFFER.
-
-     If the return value is non-negative the variable pointed to by
-     RESULT contains the result.
-
-     This function is a GNU extension and should not be used in portable
-     programs.
-
-   Before any of the above functions are used the buffer of type
-`struct drand48_data' should be initialized.  The easiest way to do
-this is to fill the whole buffer with null bytes, e.g. by
-
-     memset (buffer, '\0', sizeof (struct drand48_data));
-
-Using any of the reentrant functions of this family now will
-automatically initialize the random number generator to the default
-values for the state and the parameters of the congruential formula.
-
-   The other possibility is to use any of the functions which explicitly
-initialize the buffer.  Though it might be obvious how to initialize the
-buffer from looking at the parameter to the function, it is highly
-recommended to use these functions since the result might not always be
-what you expect.
-
- -- Function: int srand48_r (long int SEEDVAL, struct drand48_data
-          *BUFFER)
-     Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt |
-     *Note POSIX Safety Concepts::.
-
-     The description of the random number generator represented by the
-     information in BUFFER is initialized similarly to what the function
-     `srand48' does.  The state is initialized from the parameter
-     SEEDVAL and the parameters for the congruential formula are
-     initialized to their default values.
-
-     If the return value is non-negative the function call succeeded.
-
-     This function is a GNU extension and should not be used in portable
-     programs.
-
- -- Function: int seed48_r (unsigned short int SEED16V[3], struct
-          drand48_data *BUFFER)
-     Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt |
-     *Note POSIX Safety Concepts::.
-
-     This function is similar to `srand48_r' but like `seed48' it
-     initializes all 48 bits of the state from the parameter SEED16V.
-
-     If the return value is non-negative the function call succeeded.
-     It does not return a pointer to the previous state of the random
-     number generator like the `seed48' function does.  If the user
-     wants to preserve the state for a later re-run s/he can copy the
-     whole buffer pointed to by BUFFER.
-
-     This function is a GNU extension and should not be used in portable
-     programs.
-
- -- Function: int lcong48_r (unsigned short int PARAM[7], struct
-          drand48_data *BUFFER)
-     Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt |
-     *Note POSIX Safety Concepts::.
-
-     This function initializes all aspects of the random number
-     generator described in BUFFER with the data in PARAM.  Here it is
-     especially true that the function does more than just copying the
-     contents of PARAM and BUFFER.  More work is required and therefore
-     it is important to use this function rather than initializing the
-     random number generator directly.
-
-     If the return value is non-negative the function call succeeded.
-
-     This function is a GNU extension and should not be used in portable
-     programs.
-
-
-File: libc.info,  Node: FP Function Optimizations,  Prev: Pseudo-Random Numbers,  Up: Mathematics
-
-19.9 Is Fast Code or Small Code preferred?
-==========================================
-
-If an application uses many floating point functions it is often the
-case that the cost of the function calls themselves is not negligible.
-Modern processors can often execute the operations themselves very
-fast, but the function call disrupts the instruction pipeline.
-
-   For this reason the GNU C Library provides optimizations for many of
-the frequently-used math functions.  When GNU CC is used and the user
-activates the optimizer, several new inline functions and macros are
-defined.  These new functions and macros have the same names as the
-library functions and so are used instead of the latter.  In the case of
-inline functions the compiler will decide whether it is reasonable to
-use them, and this decision is usually correct.
-
-   This means that no calls to the library functions may be necessary,
-and can increase the speed of generated code significantly.  The
-drawback is that code size will increase, and the increase is not
-always negligible.
-
-   There are two kind of inline functions: Those that give the same
-result as the library functions and others that might not set `errno'
-and might have a reduced precision and/or argument range in comparison
-with the library functions.  The latter inline functions are only
-available if the flag `-ffast-math' is given to GNU CC.
-
-   In cases where the inline functions and macros are not wanted the
-symbol `__NO_MATH_INLINES' should be defined before any system header is
-included.  This will ensure that only library functions are used.  Of
-course, it can be determined for each file in the project whether
-giving this option is preferable or not.
-
-   Not all hardware implements the entire IEEE 754 standard, and even
-if it does there may be a substantial performance penalty for using some
-of its features.  For example, enabling traps on some processors forces
-the FPU to run un-pipelined, which can more than double calculation
-time.
-
-
-File: libc.info,  Node: Arithmetic,  Next: Date and Time,  Prev: Mathematics,  Up: Top
-
-20 Arithmetic Functions
-***********************
-
-This chapter contains information about functions for doing basic
-arithmetic operations, such as splitting a float into its integer and
-fractional parts or retrieving the imaginary part of a complex value.
-These functions are declared in the header files `math.h' and
-`complex.h'.
-
-* Menu:
-
-* Integers::                    Basic integer types and concepts
-* Integer Division::            Integer division with guaranteed rounding.
-* Floating Point Numbers::      Basic concepts.  IEEE 754.
-* Floating Point Classes::      The five kinds of floating-point number.
-* Floating Point Errors::       When something goes wrong in a calculation.
-* Rounding::                    Controlling how results are rounded.
-* Control Functions::           Saving and restoring the FPU's state.
-* Arithmetic Functions::        Fundamental operations provided by the library.
-* Complex Numbers::             The types.  Writing complex constants.
-* Operations on Complex::       Projection, conjugation, decomposition.
-* Parsing of Numbers::          Converting strings to numbers.
-* System V Number Conversion::  An archaic way to convert numbers to strings.
-
-
-File: libc.info,  Node: Integers,  Next: Integer Division,  Up: Arithmetic
-
-20.1 Integers
-=============
-
-The C language defines several integer data types: integer, short
-integer, long integer, and character, all in both signed and unsigned
-varieties.  The GNU C compiler extends the language to contain long
-long integers as well.  
-
-   The C integer types were intended to allow code to be portable among
-machines with different inherent data sizes (word sizes), so each type
-may have different ranges on different machines.  The problem with this
-is that a program often needs to be written for a particular range of
-integers, and sometimes must be written for a particular size of
-storage, regardless of what machine the program runs on.
-
-   To address this problem, the GNU C Library contains C type
-definitions you can use to declare integers that meet your exact needs.
-Because the GNU C Library header files are customized to a specific
-machine, your program source code doesn't have to be.
-
-   These `typedef's are in `stdint.h'.  
-
-   If you require that an integer be represented in exactly N bits, use
-one of the following types, with the obvious mapping to bit size and
-signedness:
-
-   * int8_t
-
-   * int16_t
-
-   * int32_t
-
-   * int64_t
-
-   * uint8_t
-
-   * uint16_t
-
-   * uint32_t
-
-   * uint64_t
-
-   If your C compiler and target machine do not allow integers of a
-certain size, the corresponding above type does not exist.
-
-   If you don't need a specific storage size, but want the smallest data
-structure with _at least_ N bits, use one of these:
-
-   * int_least8_t
-
-   * int_least16_t
-
-   * int_least32_t
-
-   * int_least64_t
-
-   * uint_least8_t
-
-   * uint_least16_t
-
-   * uint_least32_t
-
-   * uint_least64_t
-
-   If you don't need a specific storage size, but want the data
-structure that allows the fastest access while having at least N bits
-(and among data structures with the same access speed, the smallest
-one), use one of these:
-
-   * int_fast8_t
-
-   * int_fast16_t
-
-   * int_fast32_t
-
-   * int_fast64_t
-
-   * uint_fast8_t
-
-   * uint_fast16_t
-
-   * uint_fast32_t
-
-   * uint_fast64_t
-
-   If you want an integer with the widest range possible on the
-platform on which it is being used, use one of the following.  If you
-use these, you should write code that takes into account the variable
-size and range of the integer.
-
-   * intmax_t
-
-   * uintmax_t
-
-   The GNU C Library also provides macros that tell you the maximum and
-minimum possible values for each integer data type.  The macro names
-follow these examples: `INT32_MAX', `UINT8_MAX', `INT_FAST32_MIN',
-`INT_LEAST64_MIN', `UINTMAX_MAX', `INTMAX_MAX', `INTMAX_MIN'.  Note
-that there are no macros for unsigned integer minima.  These are always
-zero.  
-
-   There are similar macros for use with C's built in integer types
-which should come with your C compiler.  These are described in *note
-Data Type Measurements::.
-
-   Don't forget you can use the C `sizeof' function with any of these
-data types to get the number of bytes of storage each uses.
-
-
-File: libc.info,  Node: Integer Division,  Next: Floating Point Numbers,  Prev: Integers,  Up: Arithmetic
-
-20.2 Integer Division
-=====================
-
-This section describes functions for performing integer division.  These
-functions are redundant when GNU CC is used, because in GNU C the `/'
-operator always rounds towards zero.  But in other C implementations,
-`/' may round differently with negative arguments.  `div' and `ldiv'
-are useful because they specify how to round the quotient: towards
-zero.  The remainder has the same sign as the numerator.
-
-   These functions are specified to return a result R such that the
-value `R.quot*DENOMINATOR + R.rem' equals NUMERATOR.
-
-   To use these facilities, you should include the header file
-`stdlib.h' in your program.
-
- -- Data Type: div_t
-     This is a structure type used to hold the result returned by the
-     `div' function.  It has the following members:
-
-    `int quot'
-          The quotient from the division.
-
-    `int rem'
-          The remainder from the division.
-
- -- Function: div_t div (int NUMERATOR, int DENOMINATOR)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function `div' computes the quotient and remainder from the
-     division of NUMERATOR by DENOMINATOR, returning the result in a
-     structure of type `div_t'.
-
-     If the result cannot be represented (as in a division by zero), the
-     behavior is undefined.
-
-     Here is an example, albeit not a very useful one.
-
-          div_t result;
-          result = div (20, -6);
-
-     Now `result.quot' is `-3' and `result.rem' is `2'.
-
- -- Data Type: ldiv_t
-     This is a structure type used to hold the result returned by the
-     `ldiv' function.  It has the following members:
-
-    `long int quot'
-          The quotient from the division.
-
-    `long int rem'
-          The remainder from the division.
-
-     (This is identical to `div_t' except that the components are of
-     type `long int' rather than `int'.)
-
- -- Function: ldiv_t ldiv (long int NUMERATOR, long int DENOMINATOR)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `ldiv' function is similar to `div', except that the arguments
-     are of type `long int' and the result is returned as a structure
-     of type `ldiv_t'.
-
- -- Data Type: lldiv_t
-     This is a structure type used to hold the result returned by the
-     `lldiv' function.  It has the following members:
-
-    `long long int quot'
-          The quotient from the division.
-
-    `long long int rem'
-          The remainder from the division.
-
-     (This is identical to `div_t' except that the components are of
-     type `long long int' rather than `int'.)
-
- -- Function: lldiv_t lldiv (long long int NUMERATOR, long long int
-          DENOMINATOR)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `lldiv' function is like the `div' function, but the arguments
-     are of type `long long int' and the result is returned as a
-     structure of type `lldiv_t'.
-
-     The `lldiv' function was added in ISO C99.
-
- -- Data Type: imaxdiv_t
-     This is a structure type used to hold the result returned by the
-     `imaxdiv' function.  It has the following members:
-
-    `intmax_t quot'
-          The quotient from the division.
-
-    `intmax_t rem'
-          The remainder from the division.
-
-     (This is identical to `div_t' except that the components are of
-     type `intmax_t' rather than `int'.)
-
-     See *note Integers:: for a description of the `intmax_t' type.
-
-
- -- Function: imaxdiv_t imaxdiv (intmax_t NUMERATOR, intmax_t
-          DENOMINATOR)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `imaxdiv' function is like the `div' function, but the
-     arguments are of type `intmax_t' and the result is returned as a
-     structure of type `imaxdiv_t'.
-
-     See *note Integers:: for a description of the `intmax_t' type.
-
-     The `imaxdiv' function was added in ISO C99.
-
-
-File: libc.info,  Node: Floating Point Numbers,  Next: Floating Point Classes,  Prev: Integer Division,  Up: Arithmetic
-
-20.3 Floating Point Numbers
-===========================
-
-Most computer hardware has support for two different kinds of numbers:
-integers (...-3, -2, -1, 0, 1, 2, 3...) and floating-point numbers.
-Floating-point numbers have three parts: the "mantissa", the
-"exponent", and the "sign bit".  The real number represented by a
-floating-point value is given by (s ? -1 : 1) * 2^e * M where s is the
-sign bit, e the exponent, and M the mantissa.  *Note Floating Point
-Concepts::, for details.  (It is possible to have a different "base"
-for the exponent, but all modern hardware uses 2.)
-
-   Floating-point numbers can represent a finite subset of the real
-numbers.  While this subset is large enough for most purposes, it is
-important to remember that the only reals that can be represented
-exactly are rational numbers that have a terminating binary expansion
-shorter than the width of the mantissa.  Even simple fractions such as
-1/5 can only be approximated by floating point.
-
-   Mathematical operations and functions frequently need to produce
-values that are not representable.  Often these values can be
-approximated closely enough for practical purposes, but sometimes they
-can't.  Historically there was no way to tell when the results of a
-calculation were inaccurate.  Modern computers implement the IEEE 754
-standard for numerical computations, which defines a framework for
-indicating to the program when the results of calculation are not
-trustworthy.  This framework consists of a set of "exceptions" that
-indicate why a result could not be represented, and the special values
-"infinity" and "not a number" (NaN).
-
-
-File: libc.info,  Node: Floating Point Classes,  Next: Floating Point Errors,  Prev: Floating Point Numbers,  Up: Arithmetic
-
-20.4 Floating-Point Number Classification Functions
-===================================================
-
-ISO C99 defines macros that let you determine what sort of
-floating-point number a variable holds.
-
- -- Macro: int fpclassify (_float-type_ X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This is a generic macro which works on all floating-point types and
-     which returns a value of type `int'.  The possible values are:
-
-    `FP_NAN'
-          The floating-point number X is "Not a Number" (*note Infinity
-          and NaN::)
-
-    `FP_INFINITE'
-          The value of X is either plus or minus infinity (*note
-          Infinity and NaN::)
-
-    `FP_ZERO'
-          The value of X is zero.  In floating-point formats like
-          IEEE 754, where zero can be signed, this value is also
-          returned if X is negative zero.
-
-    `FP_SUBNORMAL'
-          Numbers whose absolute value is too small to be represented
-          in the normal format are represented in an alternate,
-          "denormalized" format (*note Floating Point Concepts::).
-          This format is less precise but can represent values closer
-          to zero.  `fpclassify' returns this value for values of X in
-          this alternate format.
-
-    `FP_NORMAL'
-          This value is returned for all other values of X.  It
-          indicates that there is nothing special about the number.
-
-
-   `fpclassify' is most useful if more than one property of a number
-must be tested.  There are more specific macros which only test one
-property at a time.  Generally these macros execute faster than
-`fpclassify', since there is special hardware support for them.  You
-should therefore use the specific macros whenever possible.
-
- -- Macro: int isfinite (_float-type_ X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro returns a nonzero value if X is finite: not plus or
-     minus infinity, and not NaN.  It is equivalent to
-
-          (fpclassify (x) != FP_NAN && fpclassify (x) != FP_INFINITE)
-
-     `isfinite' is implemented as a macro which accepts any
-     floating-point type.
-
- -- Macro: int isnormal (_float-type_ X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro returns a nonzero value if X is finite and normalized.
-     It is equivalent to
-
-          (fpclassify (x) == FP_NORMAL)
-
- -- Macro: int isnan (_float-type_ X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro returns a nonzero value if X is NaN.  It is equivalent
-     to
-
-          (fpclassify (x) == FP_NAN)
-
- -- Macro: int issignaling (_float-type_ X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro returns a nonzero value if X is a signaling NaN (sNaN).
-     It is based on draft TS 18661 and currently enabled as a GNU
-     extension.
-
-   Another set of floating-point classification functions was provided
-by BSD.  The GNU C Library also supports these functions; however, we
-recommend that you use the ISO C99 macros in new code.  Those are
-standard and will be available more widely.  Also, since they are
-macros, you do not have to worry about the type of their argument.
-
- -- Function: int isinf (double X)
- -- Function: int isinff (float X)
- -- Function: int isinfl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function returns `-1' if X represents negative infinity, `1'
-     if X represents positive infinity, and `0' otherwise.
-
- -- Function: int isnan (double X)
- -- Function: int isnanf (float X)
- -- Function: int isnanl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function returns a nonzero value if X is a "not a number"
-     value, and zero otherwise.
-
-     *NB:* The `isnan' macro defined by ISO C99 overrides the BSD
-     function.  This is normally not a problem, because the two
-     routines behave identically.  However, if you really need to get
-     the BSD function for some reason, you can write
-
-          (isnan) (x)
-
- -- Function: int finite (double X)
- -- Function: int finitef (float X)
- -- Function: int finitel (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function returns a nonzero value if X is finite or a "not a
-     number" value, and zero otherwise.
-
-   *Portability Note:* The functions listed in this section are BSD
-extensions.
-
-
-File: libc.info,  Node: Floating Point Errors,  Next: Rounding,  Prev: Floating Point Classes,  Up: Arithmetic
-
-20.5 Errors in Floating-Point Calculations
-==========================================
-
-* Menu:
-
-* FP Exceptions::               IEEE 754 math exceptions and how to detect them.
-* Infinity and NaN::            Special values returned by calculations.
-* Status bit operations::       Checking for exceptions after the fact.
-* Math Error Reporting::        How the math functions report errors.
-
-
-File: libc.info,  Node: FP Exceptions,  Next: Infinity and NaN,  Up: Floating Point Errors
-
-20.5.1 FP Exceptions
---------------------
-
-The IEEE 754 standard defines five "exceptions" that can occur during a
-calculation.  Each corresponds to a particular sort of error, such as
-overflow.
-
-   When exceptions occur (when exceptions are "raised", in the language
-of the standard), one of two things can happen.  By default the
-exception is simply noted in the floating-point "status word", and the
-program continues as if nothing had happened.  The operation produces a
-default value, which depends on the exception (see the table below).
-Your program can check the status word to find out which exceptions
-happened.
-
-   Alternatively, you can enable "traps" for exceptions.  In that case,
-when an exception is raised, your program will receive the `SIGFPE'
-signal.  The default action for this signal is to terminate the
-program.  *Note Signal Handling::, for how you can change the effect of
-the signal.
-
-   In the System V math library, the user-defined function `matherr' is
-called when certain exceptions occur inside math library functions.
-However, the Unix98 standard deprecates this interface.  We support it
-for historical compatibility, but recommend that you do not use it in
-new programs.  When this interface is used, exceptions may not be
-raised.
-
-The exceptions defined in IEEE 754 are:
-
-`Invalid Operation'
-     This exception is raised if the given operands are invalid for the
-     operation to be performed.  Examples are (see IEEE 754, section 7):
-       1. Addition or subtraction: oo - oo.  (But oo + oo = oo).
-
-       2. Multiplication: 0 * oo.
-
-       3. Division: 0/0 or oo/oo.
-
-       4. Remainder: x REM y, where y is zero or x is infinite.
-
-       5. Square root if the operand is less then zero.  More
-          generally, any mathematical function evaluated outside its
-          domain produces this exception.
-
-       6. Conversion of a floating-point number to an integer or decimal
-          string, when the number cannot be represented in the target
-          format (due to overflow, infinity, or NaN).
-
-       7. Conversion of an unrecognizable input string.
-
-       8. Comparison via predicates involving < or >, when one or other
-          of the operands is NaN.  You can prevent this exception by
-          using the unordered comparison functions instead; see *note
-          FP Comparison Functions::.
-
-     If the exception does not trap, the result of the operation is NaN.
-
-`Division by Zero'
-     This exception is raised when a finite nonzero number is divided
-     by zero.  If no trap occurs the result is either +oo or -oo,
-     depending on the signs of the operands.
-
-`Overflow'
-     This exception is raised whenever the result cannot be represented
-     as a finite value in the precision format of the destination.  If
-     no trap occurs the result depends on the sign of the intermediate
-     result and the current rounding mode (IEEE 754, section 7.3):
-       1. Round to nearest carries all overflows to oo with the sign of
-          the intermediate result.
-
-       2. Round toward 0 carries all overflows to the largest
-          representable finite number with the sign of the intermediate
-          result.
-
-       3. Round toward -oo carries positive overflows to the largest
-          representable finite number and negative overflows to -oo.
-
-       4. Round toward oo carries negative overflows to the most
-          negative representable finite number and positive overflows
-          to oo.
-
-     Whenever the overflow exception is raised, the inexact exception
-     is also raised.
-
-`Underflow'
-     The underflow exception is raised when an intermediate result is
-     too small to be calculated accurately, or if the operation's
-     result rounded to the destination precision is too small to be
-     normalized.
-
-     When no trap is installed for the underflow exception, underflow is
-     signaled (via the underflow flag) only when both tininess and loss
-     of accuracy have been detected.  If no trap handler is installed
-     the operation continues with an imprecise small value, or zero if
-     the destination precision cannot hold the small exact result.
-
-`Inexact'
-     This exception is signalled if a rounded result is not exact (such
-     as when calculating the square root of two) or a result overflows
-     without an overflow trap.
-
-
-File: libc.info,  Node: Infinity and NaN,  Next: Status bit operations,  Prev: FP Exceptions,  Up: Floating Point Errors
-
-20.5.2 Infinity and NaN
------------------------
-
-IEEE 754 floating point numbers can represent positive or negative
-infinity, and "NaN" (not a number).  These three values arise from
-calculations whose result is undefined or cannot be represented
-accurately.  You can also deliberately set a floating-point variable to
-any of them, which is sometimes useful.  Some examples of calculations
-that produce infinity or NaN:
-
-     1/0 = oo
-     log (0) = -oo
-     sqrt (-1) = NaN
-
-   When a calculation produces any of these values, an exception also
-occurs; see *note FP Exceptions::.
-
-   The basic operations and math functions all accept infinity and NaN
-and produce sensible output.  Infinities propagate through calculations
-as one would expect: for example, 2 + oo = oo, 4/oo = 0, atan (oo) =
-pi/2.  NaN, on the other hand, infects any calculation that involves
-it.  Unless the calculation would produce the same result no matter
-what real value replaced NaN, the result is NaN.
-
-   In comparison operations, positive infinity is larger than all values
-except itself and NaN, and negative infinity is smaller than all values
-except itself and NaN.  NaN is "unordered": it is not equal to, greater
-than, or less than anything, _including itself_. `x == x' is false if
-the value of `x' is NaN.  You can use this to test whether a value is
-NaN or not, but the recommended way to test for NaN is with the `isnan'
-function (*note Floating Point Classes::).  In addition, `<', `>',
-`<=', and `>=' will raise an exception when applied to NaNs.
-
-   `math.h' defines macros that allow you to explicitly set a variable
-to infinity or NaN.
-
- -- Macro: float INFINITY
-     An expression representing positive infinity.  It is equal to the
-     value produced  by mathematical operations like `1.0 / 0.0'.
-     `-INFINITY' represents negative infinity.
-
-     You can test whether a floating-point value is infinite by
-     comparing it to this macro.  However, this is not recommended; you
-     should use the `isfinite' macro instead.  *Note Floating Point
-     Classes::.
-
-     This macro was introduced in the ISO C99 standard.
-
- -- Macro: float NAN
-     An expression representing a value which is "not a number".  This
-     macro is a GNU extension, available only on machines that support
-     the "not a number" value--that is to say, on all machines that
-     support IEEE floating point.
-
-     You can use `#ifdef NAN' to test whether the machine supports NaN.
-     (Of course, you must arrange for GNU extensions to be visible,
-     such as by defining `_GNU_SOURCE', and then you must include
-     `math.h'.)
-
-   IEEE 754 also allows for another unusual value: negative zero.  This
-value is produced when you divide a positive number by negative
-infinity, or when a negative result is smaller than the limits of
-representation.
-
-
-File: libc.info,  Node: Status bit operations,  Next: Math Error Reporting,  Prev: Infinity and NaN,  Up: Floating Point Errors
-
-20.5.3 Examining the FPU status word
-------------------------------------
-
-ISO C99 defines functions to query and manipulate the floating-point
-status word.  You can use these functions to check for untrapped
-exceptions when it's convenient, rather than worrying about them in the
-middle of a calculation.
-
-   These constants represent the various IEEE 754 exceptions.  Not all
-FPUs report all the different exceptions.  Each constant is defined if
-and only if the FPU you are compiling for supports that exception, so
-you can test for FPU support with `#ifdef'.  They are defined in
-`fenv.h'.
-
-`FE_INEXACT'
-     The inexact exception.
-
-`FE_DIVBYZERO'
-     The divide by zero exception.
-
-`FE_UNDERFLOW'
-     The underflow exception.
-
-`FE_OVERFLOW'
-     The overflow exception.
-
-`FE_INVALID'
-     The invalid exception.
-
-   The macro `FE_ALL_EXCEPT' is the bitwise OR of all exception macros
-which are supported by the FP implementation.
-
-   These functions allow you to clear exception flags, test for
-exceptions, and save and restore the set of exceptions flagged.
-
- -- Function: int feclearexcept (int EXCEPTS)
-     Preliminary: | MT-Safe | AS-Safe !posix | AC-Safe !posix | *Note
-     POSIX Safety Concepts::.
-
-     This function clears all of the supported exception flags
-     indicated by EXCEPTS.
-
-     The function returns zero in case the operation was successful, a
-     non-zero value otherwise.
-
- -- Function: int feraiseexcept (int EXCEPTS)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function raises the supported exceptions indicated by
-     EXCEPTS.  If more than one exception bit in EXCEPTS is set the
-     order in which the exceptions are raised is undefined except that
-     overflow (`FE_OVERFLOW') or underflow (`FE_UNDERFLOW') are raised
-     before inexact (`FE_INEXACT').  Whether for overflow or underflow
-     the inexact exception is also raised is also implementation
-     dependent.
-
-     The function returns zero in case the operation was successful, a
-     non-zero value otherwise.
-
- -- Function: int fetestexcept (int EXCEPTS)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Test whether the exception flags indicated by the parameter EXCEPT
-     are currently set.  If any of them are, a nonzero value is returned
-     which specifies which exceptions are set.  Otherwise the result is
-     zero.
-
-   To understand these functions, imagine that the status word is an
-integer variable named STATUS.  `feclearexcept' is then equivalent to
-`status &= ~excepts' and `fetestexcept' is equivalent to `(status &
-excepts)'.  The actual implementation may be very different, of course.
-
-   Exception flags are only cleared when the program explicitly
-requests it, by calling `feclearexcept'.  If you want to check for
-exceptions from a set of calculations, you should clear all the flags
-first.  Here is a simple example of the way to use `fetestexcept':
-
-     {
-       double f;
-       int raised;
-       feclearexcept (FE_ALL_EXCEPT);
-       f = compute ();
-       raised = fetestexcept (FE_OVERFLOW | FE_INVALID);
-       if (raised & FE_OVERFLOW) { /* ... */ }
-       if (raised & FE_INVALID) { /* ... */ }
-       /* ... */
-     }
-
-   You cannot explicitly set bits in the status word.  You can, however,
-save the entire status word and restore it later.  This is done with the
-following functions:
-
- -- Function: int fegetexceptflag (fexcept_t *FLAGP, int EXCEPTS)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function stores in the variable pointed to by FLAGP an
-     implementation-defined value representing the current setting of
-     the exception flags indicated by EXCEPTS.
-
-     The function returns zero in case the operation was successful, a
-     non-zero value otherwise.
-
- -- Function: int fesetexceptflag (const fexcept_t *FLAGP, int EXCEPTS)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function restores the flags for the exceptions indicated by
-     EXCEPTS to the values stored in the variable pointed to by FLAGP.
-
-     The function returns zero in case the operation was successful, a
-     non-zero value otherwise.
-
-   Note that the value stored in `fexcept_t' bears no resemblance to
-the bit mask returned by `fetestexcept'.  The type may not even be an
-integer.  Do not attempt to modify an `fexcept_t' variable.
-
-
-File: libc.info,  Node: Math Error Reporting,  Prev: Status bit operations,  Up: Floating Point Errors
-
-20.5.4 Error Reporting by Mathematical Functions
-------------------------------------------------
-
-Many of the math functions are defined only over a subset of the real or
-complex numbers.  Even if they are mathematically defined, their result
-may be larger or smaller than the range representable by their return
-type without loss of accuracy.  These are known as "domain errors",
-"overflows", and "underflows", respectively.  Math functions do several
-things when one of these errors occurs.  In this manual we will refer
-to the complete response as "signalling" a domain error, overflow, or
-underflow.
-
-   When a math function suffers a domain error, it raises the invalid
-exception and returns NaN.  It also sets ERRNO to `EDOM'; this is for
-compatibility with old systems that do not support IEEE 754 exception
-handling.  Likewise, when overflow occurs, math functions raise the
-overflow exception and, in the default rounding mode, return oo or
--oo as appropriate (in other rounding modes, the largest finite value
-of the appropriate sign is returned when appropriate for that rounding
-mode).  They also set ERRNO to `ERANGE' if returning oo or -oo; ERRNO
-may or may not be set to `ERANGE' when a finite value is returned on
-overflow.  When underflow occurs, the underflow exception is raised,
-and zero (appropriately signed) or a subnormal value, as appropriate
-for the mathematical result of the function and the rounding mode, is
-returned.  ERRNO may be set to `ERANGE', but this is not guaranteed; it
-is intended that the GNU C Library should set it when the underflow is
-to an appropriately signed zero, but not necessarily for other
-underflows.
-
-   Some of the math functions are defined mathematically to result in a
-complex value over parts of their domains.  The most familiar example of
-this is taking the square root of a negative number.  The complex math
-functions, such as `csqrt', will return the appropriate complex value
-in this case.  The real-valued functions, such as `sqrt', will signal a
-domain error.
-
-   Some older hardware does not support infinities.  On that hardware,
-overflows instead return a particular very large number (usually the
-largest representable number).  `math.h' defines macros you can use to
-test for overflow on both old and new hardware.
-
- -- Macro: double HUGE_VAL
- -- Macro: float HUGE_VALF
- -- Macro: long double HUGE_VALL
-     An expression representing a particular very large number.  On
-     machines that use IEEE 754 floating point format, `HUGE_VAL' is
-     infinity.  On other machines, it's typically the largest positive
-     number that can be represented.
-
-     Mathematical functions return the appropriately typed version of
-     `HUGE_VAL' or `-HUGE_VAL' when the result is too large to be
-     represented.
-
-
-File: libc.info,  Node: Rounding,  Next: Control Functions,  Prev: Floating Point Errors,  Up: Arithmetic
-
-20.6 Rounding Modes
+14.5 Symbolic Links
 ===================
 
-Floating-point calculations are carried out internally with extra
-precision, and then rounded to fit into the destination type.  This
-ensures that results are as precise as the input data.  IEEE 754
-defines four possible rounding modes:
+GNU systems support "soft links" or "symbolic links".  This is a kind of
+"file" that is essentially a pointer to another file name.  Unlike hard
+links, symbolic links can be made to directories or across file systems
+with no restrictions.  You can also make a symbolic link to a name which
+is not the name of any file.  (Opening this link will fail until a file
+by that name is created.)  Likewise, if the symbolic link points to an
+existing file which is later deleted, the symbolic link continues to
+point to the same file name even though the name no longer names any
+file.
 
-Round to nearest.
-     This is the default mode.  It should be used unless there is a
-     specific need for one of the others.  In this mode results are
-     rounded to the nearest representable value.  If the result is
-     midway between two representable values, the even representable is
-     chosen. "Even" here means the lowest-order bit is zero.  This
-     rounding mode prevents statistical bias and guarantees numeric
-     stability: round-off errors in a lengthy calculation will remain
-     smaller than half of `FLT_EPSILON'.
+   The reason symbolic links work the way they do is that special things
+happen when you try to open the link.  The 'open' function realizes you
+have specified the name of a link, reads the file name contained in the
+link, and opens that file name instead.  The 'stat' function likewise
+operates on the file that the symbolic link points to, instead of on the
+link itself.
 
-Round toward plus Infinity.
-     All results are rounded to the smallest representable value which
-     is greater than the result.
+   By contrast, other operations such as deleting or renaming the file
+operate on the link itself.  The functions 'readlink' and 'lstat' also
+refrain from following symbolic links, because their purpose is to
+obtain information about the link.  'link', the function that makes a
+hard link, does too.  It makes a hard link to the symbolic link, which
+one rarely wants.
 
-Round toward minus Infinity.
-     All results are rounded to the largest representable value which
-     is less than the result.
+   Some systems have for some functions operating on files have a limit
+on how many symbolic links are followed when resolving a path name.  The
+limit if it exists is published in the 'sys/param.h' header file.
 
-Round toward zero.
-     All results are rounded to the largest representable value whose
-     magnitude is less than that of the result.  In other words, if the
-     result is negative it is rounded up; if it is positive, it is
-     rounded down.
+ -- Macro: int MAXSYMLINKS
 
-`fenv.h' defines constants which you can use to refer to the various
-rounding modes.  Each one will be defined if and only if the FPU
-supports the corresponding rounding mode.
+     The macro 'MAXSYMLINKS' specifies how many symlinks some function
+     will follow before returning 'ELOOP'.  Not all functions behave the
+     same and this value is not the same a that returned for
+     '_SC_SYMLOOP' by 'sysconf'.  In fact, the 'sysconf' result can
+     indicate that there is no fixed limit although 'MAXSYMLINKS' exists
+     and has a finite value.
 
-`FE_TONEAREST'
-     Round to nearest.
+   Prototypes for most of the functions listed in this section are in
+'unistd.h'.
 
-`FE_UPWARD'
-     Round toward +oo.
-
-`FE_DOWNWARD'
-     Round toward -oo.
-
-`FE_TOWARDZERO'
-     Round toward zero.
-
-   Underflow is an unusual case.  Normally, IEEE 754 floating point
-numbers are always normalized (*note Floating Point Concepts::).
-Numbers smaller than 2^r (where r is the minimum exponent,
-`FLT_MIN_RADIX-1' for FLOAT) cannot be represented as normalized
-numbers.  Rounding all such numbers to zero or 2^r would cause some
-algorithms to fail at 0.  Therefore, they are left in denormalized
-form.  That produces loss of precision, since some bits of the mantissa
-are stolen to indicate the decimal point.
-
-   If a result is too small to be represented as a denormalized number,
-it is rounded to zero.  However, the sign of the result is preserved; if
-the calculation was negative, the result is "negative zero".  Negative
-zero can also result from some operations on infinity, such as 4/-oo.
-
-   At any time one of the above four rounding modes is selected.  You
-can find out which one with this function:
-
- -- Function: int fegetround (void)
+ -- Function: int symlink (const char *OLDNAME, const char *NEWNAME)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     Returns the currently selected rounding mode, represented by one
-     of the values of the defined rounding mode macros.
+     The 'symlink' function makes a symbolic link to OLDNAME named
+     NEWNAME.
 
-To change the rounding mode, use this function:
+     The normal return value from 'symlink' is '0'.  A return value of
+     '-1' indicates an error.  In addition to the usual file name syntax
+     errors (*note File Name Errors::), the following 'errno' error
+     conditions are defined for this function:
 
- -- Function: int fesetround (int ROUND)
+     'EEXIST'
+          There is already an existing file named NEWNAME.
+
+     'EROFS'
+          The file NEWNAME would exist on a read-only file system.
+
+     'ENOSPC'
+          The directory or file system cannot be extended to make the
+          new link.
+
+     'EIO'
+          A hardware error occurred while reading or writing data on the
+          disk.
+
+ -- Function: ssize_t readlink (const char *FILENAME, char *BUFFER,
+          size_t SIZE)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     Changes the currently selected rounding mode to ROUND.  If ROUND
-     does not correspond to one of the supported rounding modes nothing
-     is changed.  `fesetround' returns zero if it changed the rounding
-     mode, a nonzero value if the mode is not supported.
+     The 'readlink' function gets the value of the symbolic link
+     FILENAME.  The file name that the link points to is copied into
+     BUFFER.  This file name string is _not_ null-terminated; 'readlink'
+     normally returns the number of characters copied.  The SIZE
+     argument specifies the maximum number of characters to copy,
+     usually the allocation size of BUFFER.
 
-   You should avoid changing the rounding mode if possible.  It can be
-an expensive operation; also, some hardware requires you to compile your
-program differently for it to work.  The resulting code may run slower.
-See your compiler documentation for details.
+     If the return value equals SIZE, you cannot tell whether or not
+     there was room to return the entire name.  So make a bigger buffer
+     and call 'readlink' again.  Here is an example:
+
+          char *
+          readlink_malloc (const char *filename)
+          {
+            int size = 100;
+            char *buffer = NULL;
+
+            while (1)
+              {
+                buffer = (char *) xrealloc (buffer, size);
+                int nchars = readlink (filename, buffer, size);
+                if (nchars < 0)
+                  {
+                    free (buffer);
+                    return NULL;
+                  }
+                if (nchars < size)
+                  return buffer;
+                size *= 2;
+              }
+          }
+
+     A value of '-1' is returned in case of error.  In addition to the
+     usual file name errors (*note File Name Errors::), the following
+     'errno' error conditions are defined for this function:
+
+     'EINVAL'
+          The named file is not a symbolic link.
+
+     'EIO'
+          A hardware error occurred while reading or writing data on the
+          disk.
+
+   In some situations it is desirable to resolve all the symbolic links
+to get the real name of a file where no prefix names a symbolic link
+which is followed and no filename in the path is '.' or '..'.  This is
+for instance desirable if files have to be compare in which case
+different names can refer to the same inode.
+
+ -- Function: char * canonicalize_file_name (const char *NAME)
+     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
+     POSIX Safety Concepts::.
+
+     The 'canonicalize_file_name' function returns the absolute name of
+     the file named by NAME which contains no '.', '..' components nor
+     any repeated path separators ('/') or symlinks.  The result is
+     passed back as the return value of the function in a block of
+     memory allocated with 'malloc'.  If the result is not used anymore
+     the memory should be freed with a call to 'free'.
+
+     If any of the path components is missing the function returns a
+     NULL pointer.  This is also what is returned if the length of the
+     path reaches or exceeds 'PATH_MAX' characters.  In any case 'errno'
+     is set accordingly.
+
+     'ENAMETOOLONG'
+          The resulting path is too long.  This error only occurs on
+          systems which have a limit on the file name length.
+
+     'EACCES'
+          At least one of the path components is not readable.
+
+     'ENOENT'
+          The input file name is empty.
+
+     'ENOENT'
+          At least one of the path components does not exist.
+
+     'ELOOP'
+          More than 'MAXSYMLINKS' many symlinks have been followed.
+
+     This function is a GNU extension and is declared in 'stdlib.h'.
+
+   The Unix standard includes a similar function which differs from
+'canonicalize_file_name' in that the user has to provide the buffer
+where the result is placed in.
+
+ -- Function: char * realpath (const char *restrict NAME, char *restrict
+          RESOLVED)
+     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
+     POSIX Safety Concepts::.
+
+     A call to 'realpath' where the RESOLVED parameter is 'NULL' behaves
+     exactly like 'canonicalize_file_name'.  The function allocates a
+     buffer for the file name and returns a pointer to it.  If RESOLVED
+     is not 'NULL' it points to a buffer into which the result is
+     copied.  It is the callers responsibility to allocate a buffer
+     which is large enough.  On systems which define 'PATH_MAX' this
+     means the buffer must be large enough for a pathname of this size.
+     For systems without limitations on the pathname length the
+     requirement cannot be met and programs should not call 'realpath'
+     with anything but 'NULL' for the second parameter.
+
+     One other difference is that the buffer RESOLVED (if nonzero) will
+     contain the part of the path component which does not exist or is
+     not readable if the function returns 'NULL' and 'errno' is set to
+     'EACCES' or 'ENOENT'.
+
+     This function is declared in 'stdlib.h'.
+
+   The advantage of using this function is that it is more widely
+available.  The drawback is that it reports failures for long path on
+systems which have no limits on the file name length.
 
 
-File: libc.info,  Node: Control Functions,  Next: Arithmetic Functions,  Prev: Rounding,  Up: Arithmetic
+File: libc.info,  Node: Deleting Files,  Next: Renaming Files,  Prev: Symbolic Links,  Up: File System Interface
 
-20.7 Floating-Point Control Functions
-=====================================
+14.6 Deleting Files
+===================
 
-IEEE 754 floating-point implementations allow the programmer to decide
-whether traps will occur for each of the exceptions, by setting bits in
-the "control word".  In C, traps result in the program receiving the
-`SIGFPE' signal; see *note Signal Handling::.
+You can delete a file with 'unlink' or 'remove'.
 
-   *NB:* IEEE 754 says that trap handlers are given details of the
-exceptional situation, and can set the result value.  C signals do not
-provide any mechanism to pass this information back and forth.
-Trapping exceptions in C is therefore not very useful.
+   Deletion actually deletes a file name.  If this is the file's only
+name, then the file is deleted as well.  If the file has other remaining
+names (*note Hard Links::), it remains accessible under those names.
 
-   It is sometimes necessary to save the state of the floating-point
-unit while you perform some calculation.  The library provides functions
-which save and restore the exception flags, the set of exceptions that
-generate traps, and the rounding mode.  This information is known as the
-"floating-point environment".
-
-   The functions to save and restore the floating-point environment all
-use a variable of type `fenv_t' to store information.  This type is
-defined in `fenv.h'.  Its size and contents are implementation-defined.
-You should not attempt to manipulate a variable of this type directly.
-
-   To save the state of the FPU, use one of these functions:
-
- -- Function: int fegetenv (fenv_t *ENVP)
+ -- Function: int unlink (const char *FILENAME)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     Store the floating-point environment in the variable pointed to by
-     ENVP.
+     The 'unlink' function deletes the file name FILENAME.  If this is a
+     file's sole name, the file itself is also deleted.  (Actually, if
+     any process has the file open when this happens, deletion is
+     postponed until all processes have closed the file.)
 
-     The function returns zero in case the operation was successful, a
-     non-zero value otherwise.
+     The function 'unlink' is declared in the header file 'unistd.h'.
 
- -- Function: int feholdexcept (fenv_t *ENVP)
+     This function returns '0' on successful completion, and '-1' on
+     error.  In addition to the usual file name errors (*note File Name
+     Errors::), the following 'errno' error conditions are defined for
+     this function:
+
+     'EACCES'
+          Write permission is denied for the directory from which the
+          file is to be removed, or the directory has the sticky bit set
+          and you do not own the file.
+
+     'EBUSY'
+          This error indicates that the file is being used by the system
+          in such a way that it can't be unlinked.  For example, you
+          might see this error if the file name specifies the root
+          directory or a mount point for a file system.
+
+     'ENOENT'
+          The file name to be deleted doesn't exist.
+
+     'EPERM'
+          On some systems 'unlink' cannot be used to delete the name of
+          a directory, or at least can only be used this way by a
+          privileged user.  To avoid such problems, use 'rmdir' to
+          delete directories.  (On GNU/Linux and GNU/Hurd systems
+          'unlink' can never delete the name of a directory.)
+
+     'EROFS'
+          The directory containing the file name to be deleted is on a
+          read-only file system and can't be modified.
+
+ -- Function: int rmdir (const char *FILENAME)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     Store the current floating-point environment in the object pointed
-     to by ENVP.  Then clear all exception flags, and set the FPU to
-     trap no exceptions.  Not all FPUs support trapping no exceptions;
-     if `feholdexcept' cannot set this mode, it returns nonzero value.
-     If it succeeds, it returns zero.
+     The 'rmdir' function deletes a directory.  The directory must be
+     empty before it can be removed; in other words, it can only contain
+     entries for '.' and '..'.
 
-   The functions which restore the floating-point environment can take
-these kinds of arguments:
+     In most other respects, 'rmdir' behaves like 'unlink'.  There are
+     two additional 'errno' error conditions defined for 'rmdir':
 
-   * Pointers to `fenv_t' objects, which were initialized previously by
-     a call to `fegetenv' or `feholdexcept'.
+     'ENOTEMPTY'
+     'EEXIST'
+          The directory to be deleted is not empty.
 
-   * The special macro `FE_DFL_ENV' which represents the floating-point
-     environment as it was available at program start.
+     These two error codes are synonymous; some systems use one, and
+     some use the other.  GNU/Linux and GNU/Hurd systems always use
+     'ENOTEMPTY'.
 
-   * Implementation defined macros with names starting with `FE_' and
-     having type `fenv_t *'.
+     The prototype for this function is declared in the header file
+     'unistd.h'.
 
-     If possible, the GNU C Library defines a macro `FE_NOMASK_ENV'
-     which represents an environment where every exception raised
-     causes a trap to occur.  You can test for this macro using
-     `#ifdef'.  It is only defined if `_GNU_SOURCE' is defined.
-
-     Some platforms might define other predefined environments.
-
-To set the floating-point environment, you can use either of these
-functions:
-
- -- Function: int fesetenv (const fenv_t *ENVP)
+ -- Function: int remove (const char *FILENAME)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     Set the floating-point environment to that described by ENVP.
-
-     The function returns zero in case the operation was successful, a
-     non-zero value otherwise.
-
- -- Function: int feupdateenv (const fenv_t *ENVP)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Like `fesetenv', this function sets the floating-point environment
-     to that described by ENVP.  However, if any exceptions were
-     flagged in the status word before `feupdateenv' was called, they
-     remain flagged after the call.  In other words, after `feupdateenv'
-     is called, the status word is the bitwise OR of the previous
-     status word and the one saved in ENVP.
-
-     The function returns zero in case the operation was successful, a
-     non-zero value otherwise.
-
-To control for individual exceptions if raising them causes a trap to
-occur, you can use the following two functions.
-
-   *Portability Note:* These functions are all GNU extensions.
-
- -- Function: int feenableexcept (int EXCEPTS)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This functions enables traps for each of the exceptions as
-     indicated by the parameter EXCEPT.  The individual exceptions are
-     described in *note Status bit operations::.  Only the specified
-     exceptions are enabled, the status of the other exceptions is not
-     changed.
-
-     The function returns the previous enabled exceptions in case the
-     operation was successful, `-1' otherwise.
-
- -- Function: int fedisableexcept (int EXCEPTS)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This functions disables traps for each of the exceptions as
-     indicated by the parameter EXCEPT.  The individual exceptions are
-     described in *note Status bit operations::.  Only the specified
-     exceptions are disabled, the status of the other exceptions is not
-     changed.
-
-     The function returns the previous enabled exceptions in case the
-     operation was successful, `-1' otherwise.
-
- -- Function: int fegetexcept (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The function returns a bitmask of all currently enabled
-     exceptions.  It returns `-1' in case of failure.
+     This is the ISO C function to remove a file.  It works like
+     'unlink' for files and like 'rmdir' for directories.  'remove' is
+     declared in 'stdio.h'.
 
 
-File: libc.info,  Node: Arithmetic Functions,  Next: Complex Numbers,  Prev: Control Functions,  Up: Arithmetic
+File: libc.info,  Node: Renaming Files,  Next: Creating Directories,  Prev: Deleting Files,  Up: File System Interface
 
-20.8 Arithmetic Functions
+14.7 Renaming Files
+===================
+
+The 'rename' function is used to change a file's name.
+
+ -- Function: int rename (const char *OLDNAME, const char *NEWNAME)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'rename' function renames the file OLDNAME to NEWNAME.  The
+     file formerly accessible under the name OLDNAME is afterwards
+     accessible as NEWNAME instead.  (If the file had any other names
+     aside from OLDNAME, it continues to have those names.)
+
+     The directory containing the name NEWNAME must be on the same file
+     system as the directory containing the name OLDNAME.
+
+     One special case for 'rename' is when OLDNAME and NEWNAME are two
+     names for the same file.  The consistent way to handle this case is
+     to delete OLDNAME.  However, in this case POSIX requires that
+     'rename' do nothing and report success--which is inconsistent.  We
+     don't know what your operating system will do.
+
+     If OLDNAME is not a directory, then any existing file named NEWNAME
+     is removed during the renaming operation.  However, if NEWNAME is
+     the name of a directory, 'rename' fails in this case.
+
+     If OLDNAME is a directory, then either NEWNAME must not exist or it
+     must name a directory that is empty.  In the latter case, the
+     existing directory named NEWNAME is deleted first.  The name
+     NEWNAME must not specify a subdirectory of the directory 'oldname'
+     which is being renamed.
+
+     One useful feature of 'rename' is that the meaning of NEWNAME
+     changes "atomically" from any previously existing file by that name
+     to its new meaning (i.e., the file that was called OLDNAME).  There
+     is no instant at which NEWNAME is non-existent "in between" the old
+     meaning and the new meaning.  If there is a system crash during the
+     operation, it is possible for both names to still exist; but
+     NEWNAME will always be intact if it exists at all.
+
+     If 'rename' fails, it returns '-1'.  In addition to the usual file
+     name errors (*note File Name Errors::), the following 'errno' error
+     conditions are defined for this function:
+
+     'EACCES'
+          One of the directories containing NEWNAME or OLDNAME refuses
+          write permission; or NEWNAME and OLDNAME are directories and
+          write permission is refused for one of them.
+
+     'EBUSY'
+          A directory named by OLDNAME or NEWNAME is being used by the
+          system in a way that prevents the renaming from working.  This
+          includes directories that are mount points for filesystems,
+          and directories that are the current working directories of
+          processes.
+
+     'ENOTEMPTY'
+     'EEXIST'
+          The directory NEWNAME isn't empty.  GNU/Linux and GNU/Hurd
+          systems always return 'ENOTEMPTY' for this, but some other
+          systems return 'EEXIST'.
+
+     'EINVAL'
+          OLDNAME is a directory that contains NEWNAME.
+
+     'EISDIR'
+          NEWNAME is a directory but the OLDNAME isn't.
+
+     'EMLINK'
+          The parent directory of NEWNAME would have too many links
+          (entries).
+
+     'ENOENT'
+          The file OLDNAME doesn't exist.
+
+     'ENOSPC'
+          The directory that would contain NEWNAME has no room for
+          another entry, and there is no space left in the file system
+          to expand it.
+
+     'EROFS'
+          The operation would involve writing to a directory on a
+          read-only file system.
+
+     'EXDEV'
+          The two file names NEWNAME and OLDNAME are on different file
+          systems.
+
+
+File: libc.info,  Node: Creating Directories,  Next: File Attributes,  Prev: Renaming Files,  Up: File System Interface
+
+14.8 Creating Directories
 =========================
 
-The C library provides functions to do basic operations on
-floating-point numbers.  These include absolute value, maximum and
-minimum, normalization, bit twiddling, rounding, and a few others.
+Directories are created with the 'mkdir' function.  (There is also a
+shell command 'mkdir' which does the same thing.)
 
-* Menu:
+ -- Function: int mkdir (const char *FILENAME, mode_t MODE)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-* Absolute Value::              Absolute values of integers and floats.
-* Normalization Functions::     Extracting exponents and putting them back.
-* Rounding Functions::          Rounding floats to integers.
-* Remainder Functions::         Remainders on division, precisely defined.
-* FP Bit Twiddling::            Sign bit adjustment.  Adding epsilon.
-* FP Comparison Functions::     Comparisons without risk of exceptions.
-* Misc FP Arithmetic::          Max, min, positive difference, multiply-add.
+     The 'mkdir' function creates a new, empty directory with name
+     FILENAME.
+
+     The argument MODE specifies the file permissions for the new
+     directory file.  *Note Permission Bits::, for more information
+     about this.
+
+     A return value of '0' indicates successful completion, and '-1'
+     indicates failure.  In addition to the usual file name syntax
+     errors (*note File Name Errors::), the following 'errno' error
+     conditions are defined for this function:
+
+     'EACCES'
+          Write permission is denied for the parent directory in which
+          the new directory is to be added.
+
+     'EEXIST'
+          A file named FILENAME already exists.
+
+     'EMLINK'
+          The parent directory has too many links (entries).
+
+          Well-designed file systems never report this error, because
+          they permit more links than your disk could possibly hold.
+          However, you must still take account of the possibility of
+          this error, as it could result from network access to a file
+          system on another machine.
+
+     'ENOSPC'
+          The file system doesn't have enough room to create the new
+          directory.
+
+     'EROFS'
+          The parent directory of the directory being created is on a
+          read-only file system and cannot be modified.
+
+     To use this function, your program should include the header file
+     'sys/stat.h'.
 
 
-File: libc.info,  Node: Absolute Value,  Next: Normalization Functions,  Up: Arithmetic Functions
+File: libc.info,  Node: File Attributes,  Next: Making Special Files,  Prev: Creating Directories,  Up: File System Interface
 
-20.8.1 Absolute Value
----------------------
-
-These functions are provided for obtaining the "absolute value" (or
-"magnitude") of a number.  The absolute value of a real number X is X
-if X is positive, -X if X is negative.  For a complex number Z, whose
-real part is X and whose imaginary part is Y, the absolute value is
-`sqrt (X*X + Y*Y)'.
-
-   Prototypes for `abs', `labs' and `llabs' are in `stdlib.h';
-`imaxabs' is declared in `inttypes.h'; `fabs', `fabsf' and `fabsl' are
-declared in `math.h'.  `cabs', `cabsf' and `cabsl' are declared in
-`complex.h'.
-
- -- Function: int abs (int NUMBER)
- -- Function: long int labs (long int NUMBER)
- -- Function: long long int llabs (long long int NUMBER)
- -- Function: intmax_t imaxabs (intmax_t NUMBER)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the absolute value of NUMBER.
-
-     Most computers use a two's complement integer representation, in
-     which the absolute value of `INT_MIN' (the smallest possible `int')
-     cannot be represented; thus, `abs (INT_MIN)' is not defined.
-
-     `llabs' and `imaxdiv' are new to ISO C99.
-
-     See *note Integers:: for a description of the `intmax_t' type.
-
-
- -- Function: double fabs (double NUMBER)
- -- Function: float fabsf (float NUMBER)
- -- Function: long double fabsl (long double NUMBER)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function returns the absolute value of the floating-point
-     number NUMBER.
-
- -- Function: double cabs (complex double Z)
- -- Function: float cabsf (complex float Z)
- -- Function: long double cabsl (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the absolute  value of the complex number Z
-     (*note Complex Numbers::).  The absolute value of a complex number
-     is:
-
-          sqrt (creal (Z) * creal (Z) + cimag (Z) * cimag (Z))
-
-     This function should always be used instead of the direct formula
-     because it takes special care to avoid losing precision.  It may
-     also take advantage of hardware support for this operation. See
-     `hypot' in *note Exponents and Logarithms::.
-
-
-File: libc.info,  Node: Normalization Functions,  Next: Rounding Functions,  Prev: Absolute Value,  Up: Arithmetic Functions
-
-20.8.2 Normalization Functions
-------------------------------
-
-The functions described in this section are primarily provided as a way
-to efficiently perform certain low-level manipulations on floating point
-numbers that are represented internally using a binary radix; see *note
-Floating Point Concepts::.  These functions are required to have
-equivalent behavior even if the representation does not use a radix of
-2, but of course they are unlikely to be particularly efficient in
-those cases.
-
-   All these functions are declared in `math.h'.
-
- -- Function: double frexp (double VALUE, int *EXPONENT)
- -- Function: float frexpf (float VALUE, int *EXPONENT)
- -- Function: long double frexpl (long double VALUE, int *EXPONENT)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions are used to split the number VALUE into a
-     normalized fraction and an exponent.
-
-     If the argument VALUE is not zero, the return value is VALUE times
-     a power of two, and its magnitude is always in the range 1/2
-     (inclusive) to 1 (exclusive).  The corresponding exponent is
-     stored in `*EXPONENT'; the return value multiplied by 2 raised to
-     this exponent equals the original number VALUE.
-
-     For example, `frexp (12.8, &exponent)' returns `0.8' and stores
-     `4' in `exponent'.
-
-     If VALUE is zero, then the return value is zero and zero is stored
-     in `*EXPONENT'.
-
- -- Function: double ldexp (double VALUE, int EXPONENT)
- -- Function: float ldexpf (float VALUE, int EXPONENT)
- -- Function: long double ldexpl (long double VALUE, int EXPONENT)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the result of multiplying the floating-point
-     number VALUE by 2 raised to the power EXPONENT.  (It can be used
-     to reassemble floating-point numbers that were taken apart by
-     `frexp'.)
-
-     For example, `ldexp (0.8, 4)' returns `12.8'.
-
-   The following functions, which come from BSD, provide facilities
-equivalent to those of `ldexp' and `frexp'.  See also the ISO C
-function `logb' which originally also appeared in BSD.
-
- -- Function: double scalb (double VALUE, double EXPONENT)
- -- Function: float scalbf (float VALUE, float EXPONENT)
- -- Function: long double scalbl (long double VALUE, long double
-          EXPONENT)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `scalb' function is the BSD name for `ldexp'.
-
- -- Function: double scalbn (double X, int N)
- -- Function: float scalbnf (float X, int N)
- -- Function: long double scalbnl (long double X, int N)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `scalbn' is identical to `scalb', except that the exponent N is an
-     `int' instead of a floating-point number.
-
- -- Function: double scalbln (double X, long int N)
- -- Function: float scalblnf (float X, long int N)
- -- Function: long double scalblnl (long double X, long int N)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `scalbln' is identical to `scalb', except that the exponent N is a
-     `long int' instead of a floating-point number.
-
- -- Function: double significand (double X)
- -- Function: float significandf (float X)
- -- Function: long double significandl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `significand' returns the mantissa of X scaled to the range [1, 2).
-     It is equivalent to `scalb (X, (double) -ilogb (X))'.
-
-     This function exists mainly for use in certain standardized tests
-     of IEEE 754 conformance.
-
-
-File: libc.info,  Node: Rounding Functions,  Next: Remainder Functions,  Prev: Normalization Functions,  Up: Arithmetic Functions
-
-20.8.3 Rounding Functions
--------------------------
-
-The functions listed here perform operations such as rounding and
-truncation of floating-point values. Some of these functions convert
-floating point numbers to integer values.  They are all declared in
-`math.h'.
-
-   You can also convert floating-point numbers to integers simply by
-casting them to `int'.  This discards the fractional part, effectively
-rounding towards zero.  However, this only works if the result can
-actually be represented as an `int'--for very large numbers, this is
-impossible.  The functions listed here return the result as a `double'
-instead to get around this problem.
-
- -- Function: double ceil (double X)
- -- Function: float ceilf (float X)
- -- Function: long double ceill (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions round X upwards to the nearest integer, returning
-     that value as a `double'.  Thus, `ceil (1.5)' is `2.0'.
-
- -- Function: double floor (double X)
- -- Function: float floorf (float X)
- -- Function: long double floorl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions round X downwards to the nearest integer,
-     returning that value as a `double'.  Thus, `floor (1.5)' is `1.0'
-     and `floor (-1.5)' is `-2.0'.
-
- -- Function: double trunc (double X)
- -- Function: float truncf (float X)
- -- Function: long double truncl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `trunc' functions round X towards zero to the nearest integer
-     (returned in floating-point format).  Thus, `trunc (1.5)' is `1.0'
-     and `trunc (-1.5)' is `-1.0'.
-
- -- Function: double rint (double X)
- -- Function: float rintf (float X)
- -- Function: long double rintl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions round X to an integer value according to the
-     current rounding mode.  *Note Floating Point Parameters::, for
-     information about the various rounding modes.  The default
-     rounding mode is to round to the nearest integer; some machines
-     support other modes, but round-to-nearest is always used unless
-     you explicitly select another.
-
-     If X was not initially an integer, these functions raise the
-     inexact exception.
-
- -- Function: double nearbyint (double X)
- -- Function: float nearbyintf (float X)
- -- Function: long double nearbyintl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the same value as the `rint' functions, but
-     do not raise the inexact exception if X is not an integer.
-
- -- Function: double round (double X)
- -- Function: float roundf (float X)
- -- Function: long double roundl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions are similar to `rint', but they round halfway
-     cases away from zero instead of to the nearest integer (or other
-     current rounding mode).
-
- -- Function: long int lrint (double X)
- -- Function: long int lrintf (float X)
- -- Function: long int lrintl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions are just like `rint', but they return a `long int'
-     instead of a floating-point number.
-
- -- Function: long long int llrint (double X)
- -- Function: long long int llrintf (float X)
- -- Function: long long int llrintl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions are just like `rint', but they return a `long long
-     int' instead of a floating-point number.
-
- -- Function: long int lround (double X)
- -- Function: long int lroundf (float X)
- -- Function: long int lroundl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions are just like `round', but they return a `long
-     int' instead of a floating-point number.
-
- -- Function: long long int llround (double X)
- -- Function: long long int llroundf (float X)
- -- Function: long long int llroundl (long double X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions are just like `round', but they return a `long
-     long int' instead of a floating-point number.
-
- -- Function: double modf (double VALUE, double *INTEGER-PART)
- -- Function: float modff (float VALUE, float *INTEGER-PART)
- -- Function: long double modfl (long double VALUE, long double
-          *INTEGER-PART)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions break the argument VALUE into an integer part and a
-     fractional part (between `-1' and `1', exclusive).  Their sum
-     equals VALUE.  Each of the parts has the same sign as VALUE, and
-     the integer part is always rounded toward zero.
-
-     `modf' stores the integer part in `*INTEGER-PART', and returns the
-     fractional part.  For example, `modf (2.5, &intpart)' returns
-     `0.5' and stores `2.0' into `intpart'.
-
-
-File: libc.info,  Node: Remainder Functions,  Next: FP Bit Twiddling,  Prev: Rounding Functions,  Up: Arithmetic Functions
-
-20.8.4 Remainder Functions
---------------------------
-
-The functions in this section compute the remainder on division of two
-floating-point numbers.  Each is a little different; pick the one that
-suits your problem.
-
- -- Function: double fmod (double NUMERATOR, double DENOMINATOR)
- -- Function: float fmodf (float NUMERATOR, float DENOMINATOR)
- -- Function: long double fmodl (long double NUMERATOR, long double
-          DENOMINATOR)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions compute the remainder from the division of
-     NUMERATOR by DENOMINATOR.  Specifically, the return value is
-     `NUMERATOR - N * DENOMINATOR', where N is the quotient of
-     NUMERATOR divided by DENOMINATOR, rounded towards zero to an
-     integer.  Thus, `fmod (6.5, 2.3)' returns `1.9', which is `6.5'
-     minus `4.6'.
-
-     The result has the same sign as the NUMERATOR and has magnitude
-     less than the magnitude of the DENOMINATOR.
-
-     If DENOMINATOR is zero, `fmod' signals a domain error.
-
- -- Function: double drem (double NUMERATOR, double DENOMINATOR)
- -- Function: float dremf (float NUMERATOR, float DENOMINATOR)
- -- Function: long double dreml (long double NUMERATOR, long double
-          DENOMINATOR)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions are like `fmod' except that they round the
-     internal quotient N to the nearest integer instead of towards zero
-     to an integer.  For example, `drem (6.5, 2.3)' returns `-0.4',
-     which is `6.5' minus `6.9'.
-
-     The absolute value of the result is less than or equal to half the
-     absolute value of the DENOMINATOR.  The difference between `fmod
-     (NUMERATOR, DENOMINATOR)' and `drem (NUMERATOR, DENOMINATOR)' is
-     always either DENOMINATOR, minus DENOMINATOR, or zero.
-
-     If DENOMINATOR is zero, `drem' signals a domain error.
-
- -- Function: double remainder (double NUMERATOR, double DENOMINATOR)
- -- Function: float remainderf (float NUMERATOR, float DENOMINATOR)
- -- Function: long double remainderl (long double NUMERATOR, long
-          double DENOMINATOR)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is another name for `drem'.
-
-
-File: libc.info,  Node: FP Bit Twiddling,  Next: FP Comparison Functions,  Prev: Remainder Functions,  Up: Arithmetic Functions
-
-20.8.5 Setting and modifying single bits of FP values
------------------------------------------------------
-
-There are some operations that are too complicated or expensive to
-perform by hand on floating-point numbers.  ISO C99 defines functions
-to do these operations, which mostly involve changing single bits.
-
- -- Function: double copysign (double X, double Y)
- -- Function: float copysignf (float X, float Y)
- -- Function: long double copysignl (long double X, long double Y)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return X but with the sign of Y.  They work even
-     if X or Y are NaN or zero.  Both of these can carry a sign
-     (although not all implementations support it) and this is one of
-     the few operations that can tell the difference.
-
-     `copysign' never raises an exception.
-
-     This function is defined in IEC 559 (and the appendix with
-     recommended functions in IEEE 754/IEEE 854).
-
- -- Function: int signbit (_float-type_ X)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `signbit' is a generic macro which can work on all floating-point
-     types.  It returns a nonzero value if the value of X has its sign
-     bit set.
-
-     This is not the same as `x < 0.0', because IEEE 754 floating point
-     allows zero to be signed.  The comparison `-0.0 < 0.0' is false,
-     but `signbit (-0.0)' will return a nonzero value.
-
- -- Function: double nextafter (double X, double Y)
- -- Function: float nextafterf (float X, float Y)
- -- Function: long double nextafterl (long double X, long double Y)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `nextafter' function returns the next representable neighbor of
-     X in the direction towards Y.  The size of the step between X and
-     the result depends on the type of the result.  If X = Y the
-     function simply returns Y.  If either value is `NaN', `NaN' is
-     returned.  Otherwise a value corresponding to the value of the
-     least significant bit in the mantissa is added or subtracted,
-     depending on the direction.  `nextafter' will signal overflow or
-     underflow if the result goes outside of the range of normalized
-     numbers.
-
-     This function is defined in IEC 559 (and the appendix with
-     recommended functions in IEEE 754/IEEE 854).
-
- -- Function: double nexttoward (double X, long double Y)
- -- Function: float nexttowardf (float X, long double Y)
- -- Function: long double nexttowardl (long double X, long double Y)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions are identical to the corresponding versions of
-     `nextafter' except that their second argument is a `long double'.
-
- -- Function: double nan (const char *TAGP)
- -- Function: float nanf (const char *TAGP)
- -- Function: long double nanl (const char *TAGP)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     The `nan' function returns a representation of NaN, provided that
-     NaN is supported by the target platform.  `nan
-     ("N-CHAR-SEQUENCE")' is equivalent to `strtod
-     ("NAN(N-CHAR-SEQUENCE)")'.
-
-     The argument TAGP is used in an unspecified manner.  On IEEE 754
-     systems, there are many representations of NaN, and TAGP selects
-     one.  On other systems it may do nothing.
-
-
-File: libc.info,  Node: FP Comparison Functions,  Next: Misc FP Arithmetic,  Prev: FP Bit Twiddling,  Up: Arithmetic Functions
-
-20.8.6 Floating-Point Comparison Functions
-------------------------------------------
-
-The standard C comparison operators provoke exceptions when one or other
-of the operands is NaN.  For example,
-
-     int v = a < 1.0;
-
-will raise an exception if A is NaN.  (This does _not_ happen with `=='
-and `!='; those merely return false and true, respectively, when NaN is
-examined.)  Frequently this exception is undesirable.  ISO C99
-therefore defines comparison functions that do not raise exceptions
-when NaN is examined.  All of the functions are implemented as macros
-which allow their arguments to be of any floating-point type.  The
-macros are guaranteed to evaluate their arguments only once.
-
- -- Macro: int isgreater (_real-floating_ X, _real-floating_ Y)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro determines whether the argument X is greater than Y.
-     It is equivalent to `(X) > (Y)', but no exception is raised if X
-     or Y are NaN.
-
- -- Macro: int isgreaterequal (_real-floating_ X, _real-floating_ Y)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro determines whether the argument X is greater than or
-     equal to Y.  It is equivalent to `(X) >= (Y)', but no exception is
-     raised if X or Y are NaN.
-
- -- Macro: int isless (_real-floating_ X, _real-floating_ Y)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro determines whether the argument X is less than Y.  It
-     is equivalent to `(X) < (Y)', but no exception is raised if X or Y
-     are NaN.
-
- -- Macro: int islessequal (_real-floating_ X, _real-floating_ Y)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro determines whether the argument X is less than or equal
-     to Y.  It is equivalent to `(X) <= (Y)', but no exception is
-     raised if X or Y are NaN.
-
- -- Macro: int islessgreater (_real-floating_ X, _real-floating_ Y)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro determines whether the argument X is less or greater
-     than Y.  It is equivalent to `(X) < (Y) || (X) > (Y)' (although it
-     only evaluates X and Y once), but no exception is raised if X or Y
-     are NaN.
-
-     This macro is not equivalent to `X != Y', because that expression
-     is true if X or Y are NaN.
-
- -- Macro: int isunordered (_real-floating_ X, _real-floating_ Y)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro determines whether its arguments are unordered.  In
-     other words, it is true if X or Y are NaN, and false otherwise.
-
-   Not all machines provide hardware support for these operations.  On
-machines that don't, the macros can be very slow.  Therefore, you should
-not use these functions when NaN is not a concern.
-
-   *NB:* There are no macros `isequal' or `isunequal'.  They are
-unnecessary, because the `==' and `!=' operators do _not_ throw an
-exception if one or both of the operands are NaN.
-
-
-File: libc.info,  Node: Misc FP Arithmetic,  Prev: FP Comparison Functions,  Up: Arithmetic Functions
-
-20.8.7 Miscellaneous FP arithmetic functions
---------------------------------------------
-
-The functions in this section perform miscellaneous but common
-operations that are awkward to express with C operators.  On some
-processors these functions can use special machine instructions to
-perform these operations faster than the equivalent C code.
-
- -- Function: double fmin (double X, double Y)
- -- Function: float fminf (float X, float Y)
- -- Function: long double fminl (long double X, long double Y)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `fmin' function returns the lesser of the two values X and Y.
-     It is similar to the expression
-          ((x) < (y) ? (x) : (y))
-     except that X and Y are only evaluated once.
-
-     If an argument is NaN, the other argument is returned.  If both
-     arguments are NaN, NaN is returned.
-
- -- Function: double fmax (double X, double Y)
- -- Function: float fmaxf (float X, float Y)
- -- Function: long double fmaxl (long double X, long double Y)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `fmax' function returns the greater of the two values X and Y.
-
-     If an argument is NaN, the other argument is returned.  If both
-     arguments are NaN, NaN is returned.
-
- -- Function: double fdim (double X, double Y)
- -- Function: float fdimf (float X, float Y)
- -- Function: long double fdiml (long double X, long double Y)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `fdim' function returns the positive difference between X and
-     Y.  The positive difference is X - Y if X is greater than Y, and 0
-     otherwise.
-
-     If X, Y, or both are NaN, NaN is returned.
-
- -- Function: double fma (double X, double Y, double Z)
- -- Function: float fmaf (float X, float Y, float Z)
- -- Function: long double fmal (long double X, long double Y, long
-          double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `fma' function performs floating-point multiply-add.  This is
-     the operation (X * Y) + Z, but the intermediate result is not
-     rounded to the destination type.  This can sometimes improve the
-     precision of a calculation.
-
-     This function was introduced because some processors have a special
-     instruction to perform multiply-add.  The C compiler cannot use it
-     directly, because the expression `x*y + z' is defined to round the
-     intermediate result.  `fma' lets you choose when you want to round
-     only once.
-
-     On processors which do not implement multiply-add in hardware,
-     `fma' can be very slow since it must avoid intermediate rounding.
-     `math.h' defines the symbols `FP_FAST_FMA', `FP_FAST_FMAF', and
-     `FP_FAST_FMAL' when the corresponding version of `fma' is no
-     slower than the expression `x*y + z'.  In the GNU C Library, this
-     always means the operation is implemented in hardware.
-
-
-File: libc.info,  Node: Complex Numbers,  Next: Operations on Complex,  Prev: Arithmetic Functions,  Up: Arithmetic
-
-20.9 Complex Numbers
+14.9 File Attributes
 ====================
 
-ISO C99 introduces support for complex numbers in C.  This is done with
-a new type qualifier, `complex'.  It is a keyword if and only if
-`complex.h' has been included.  There are three complex types,
-corresponding to the three real types:  `float complex', `double
-complex', and `long double complex'.
+When you issue an 'ls -l' shell command on a file, it gives you
+information about the size of the file, who owns it, when it was last
+modified, etc.  These are called the "file attributes", and are
+associated with the file itself and not a particular one of its names.
 
-   To construct complex numbers you need a way to indicate the imaginary
-part of a number.  There is no standard notation for an imaginary
-floating point constant.  Instead, `complex.h' defines two macros that
-can be used to create complex numbers.
-
- -- Macro: const float complex _Complex_I
-     This macro is a representation of the complex number "0+1i".
-     Multiplying a real floating-point value by `_Complex_I' gives a
-     complex number whose value is purely imaginary.  You can use this
-     to construct complex constants:
-
-          3.0 + 4.0i = `3.0 + 4.0 * _Complex_I'
-
-     Note that `_Complex_I * _Complex_I' has the value `-1', but the
-     type of that value is `complex'.
-
-`_Complex_I' is a bit of a mouthful.  `complex.h' also defines a
-shorter name for the same constant.
-
- -- Macro: const float complex I
-     This macro has exactly the same value as `_Complex_I'.  Most of the
-     time it is preferable.  However, it causes problems if you want to
-     use the identifier `I' for something else.  You can safely write
-
-          #include <complex.h>
-          #undef I
-
-     if you need `I' for your own purposes.  (In that case we recommend
-     you also define some other short name for `_Complex_I', such as
-     `J'.)
-
-
-
-File: libc.info,  Node: Operations on Complex,  Next: Parsing of Numbers,  Prev: Complex Numbers,  Up: Arithmetic
-
-20.10 Projections, Conjugates, and Decomposing of Complex Numbers
-=================================================================
-
-ISO C99 also defines functions that perform basic operations on complex
-numbers, such as decomposition and conjugation.  The prototypes for all
-these functions are in `complex.h'.  All functions are available in
-three variants, one for each of the three complex types.
-
- -- Function: double creal (complex double Z)
- -- Function: float crealf (complex float Z)
- -- Function: long double creall (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the real part of the complex number Z.
-
- -- Function: double cimag (complex double Z)
- -- Function: float cimagf (complex float Z)
- -- Function: long double cimagl (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the imaginary part of the complex number Z.
-
- -- Function: complex double conj (complex double Z)
- -- Function: complex float conjf (complex float Z)
- -- Function: complex long double conjl (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the conjugate value of the complex number
-     Z.  The conjugate of a complex number has the same real part and a
-     negated imaginary part.  In other words, `conj(a + bi) = a + -bi'.
-
- -- Function: double carg (complex double Z)
- -- Function: float cargf (complex float Z)
- -- Function: long double cargl (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the argument of the complex number Z.  The
-     argument of a complex number is the angle in the complex plane
-     between the positive real axis and a line passing through zero and
-     the number.  This angle is measured in the usual fashion and
-     ranges from -pi to pi.
-
-     `carg' has a branch cut along the negative real axis.
-
- -- Function: complex double cproj (complex double Z)
- -- Function: complex float cprojf (complex float Z)
- -- Function: complex long double cprojl (complex long double Z)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     These functions return the projection of the complex value Z onto
-     the Riemann sphere.  Values with an infinite imaginary part are
-     projected to positive infinity on the real axis, even if the real
-     part is NaN.  If the real part is infinite, the result is
-     equivalent to
-
-          INFINITY + I * copysign (0.0, cimag (z))
-
-
-File: libc.info,  Node: Parsing of Numbers,  Next: System V Number Conversion,  Prev: Operations on Complex,  Up: Arithmetic
-
-20.11 Parsing of Numbers
-========================
-
-This section describes functions for "reading" integer and
-floating-point numbers from a string.  It may be more convenient in some
-cases to use `sscanf' or one of the related functions; see *note
-Formatted Input::.  But often you can make a program more robust by
-finding the tokens in the string by hand, then converting the numbers
-one by one.
+   This section contains information about how you can inquire about and
+modify the attributes of a file.
 
 * Menu:
 
-* Parsing of Integers::         Functions for conversion of integer values.
-* Parsing of Floats::           Functions for conversion of floating-point
-				 values.
+* Attribute Meanings::          The names of the file attributes,
+                                 and what their values mean.
+* Reading Attributes::          How to read the attributes of a file.
+* Testing File Type::           Distinguishing ordinary files,
+                                 directories, links...
+* File Owner::                  How ownership for new files is determined,
+			         and how to change it.
+* Permission Bits::             How information about a file's access
+                                 mode is stored.
+* Access Permission::           How the system decides who can access a file.
+* Setting Permissions::         How permissions for new files are assigned,
+			         and how to change them.
+* Testing File Access::         How to find out if your process can
+                                 access a file.
+* File Times::                  About the time attributes of a file.
+* File Size::			Manually changing the size of a file.
 
 
-File: libc.info,  Node: Parsing of Integers,  Next: Parsing of Floats,  Up: Parsing of Numbers
+File: libc.info,  Node: Attribute Meanings,  Next: Reading Attributes,  Up: File Attributes
 
-20.11.1 Parsing of Integers
----------------------------
+14.9.1 The meaning of the File Attributes
+-----------------------------------------
 
-The `str' functions are declared in `stdlib.h' and those beginning with
-`wcs' are declared in `wchar.h'.  One might wonder about the use of
-`restrict' in the prototypes of the functions in this section.  It is
-seemingly useless but the ISO C standard uses it (for the functions
-defined there) so we have to do it as well.
+When you read the attributes of a file, they come back in a structure
+called 'struct stat'.  This section describes the names of the
+attributes, their data types, and what they mean.  For the functions to
+read the attributes of a file, see *note Reading Attributes::.
 
- -- Function: long int strtol (const char *restrict STRING, char
-          **restrict TAILPTR, int BASE)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
+   The header file 'sys/stat.h' declares all the symbols defined in this
+section.
 
-     The `strtol' ("string-to-long") function converts the initial part
-     of STRING to a signed integer, which is returned as a value of
-     type `long int'.
+ -- Data Type: struct stat
+     The 'stat' structure type is used to return information about the
+     attributes of a file.  It contains at least the following members:
 
-     This function attempts to decompose STRING as follows:
+     'mode_t st_mode'
+          Specifies the mode of the file.  This includes file type
+          information (*note Testing File Type::) and the file
+          permission bits (*note Permission Bits::).
 
-        * A (possibly empty) sequence of whitespace characters.  Which
-          characters are whitespace is determined by the `isspace'
-          function (*note Classification of Characters::).  These are
-          discarded.
+     'ino_t st_ino'
+          The file serial number, which distinguishes this file from all
+          other files on the same device.
 
-        * An optional plus or minus sign (`+' or `-').
+     'dev_t st_dev'
+          Identifies the device containing the file.  The 'st_ino' and
+          'st_dev', taken together, uniquely identify the file.  The
+          'st_dev' value is not necessarily consistent across reboots or
+          system crashes, however.
 
-        * A nonempty sequence of digits in the radix specified by BASE.
+     'nlink_t st_nlink'
+          The number of hard links to the file.  This count keeps track
+          of how many directories have entries for this file.  If the
+          count is ever decremented to zero, then the file itself is
+          discarded as soon as no process still holds it open.  Symbolic
+          links are not counted in the total.
 
-          If BASE is zero, decimal radix is assumed unless the series of
-          digits begins with `0' (specifying octal radix), or `0x' or
-          `0X' (specifying hexadecimal radix); in other words, the same
-          syntax used for integer constants in C.
+     'uid_t st_uid'
+          The user ID of the file's owner.  *Note File Owner::.
 
-          Otherwise BASE must have a value between `2' and `36'.  If
-          BASE is `16', the digits may optionally be preceded by `0x'
-          or `0X'.  If base has no legal value the value returned is
-          `0l' and the global variable `errno' is set to `EINVAL'.
+     'gid_t st_gid'
+          The group ID of the file.  *Note File Owner::.
 
-        * Any remaining characters in the string.  If TAILPTR is not a
-          null pointer, `strtol' stores a pointer to this tail in
-          `*TAILPTR'.
+     'off_t st_size'
+          This specifies the size of a regular file in bytes.  For files
+          that are really devices this field isn't usually meaningful.
+          For symbolic links this specifies the length of the file name
+          the link refers to.
 
-     If the string is empty, contains only whitespace, or does not
-     contain an initial substring that has the expected syntax for an
-     integer in the specified BASE, no conversion is performed.  In
-     this case, `strtol' returns a value of zero and the value stored in
-     `*TAILPTR' is the value of STRING.
+     'time_t st_atime'
+          This is the last access time for the file.  *Note File
+          Times::.
 
-     In a locale other than the standard `"C"' locale, this function
-     may recognize additional implementation-dependent syntax.
+     'unsigned long int st_atime_usec'
+          This is the fractional part of the last access time for the
+          file.  *Note File Times::.
 
-     If the string has valid syntax for an integer but the value is not
-     representable because of overflow, `strtol' returns either
-     `LONG_MAX' or `LONG_MIN' (*note Range of Type::), as appropriate
-     for the sign of the value.  It also sets `errno' to `ERANGE' to
-     indicate there was overflow.
+     'time_t st_mtime'
+          This is the time of the last modification to the contents of
+          the file.  *Note File Times::.
 
-     You should not check for errors by examining the return value of
-     `strtol', because the string might be a valid representation of
-     `0l', `LONG_MAX', or `LONG_MIN'.  Instead, check whether TAILPTR
-     points to what you expect after the number (e.g. `'\0'' if the
-     string should end after the number).  You also need to clear ERRNO
-     before the call and check it afterward, in case there was overflow.
+     'unsigned long int st_mtime_usec'
+          This is the fractional part of the time of the last
+          modification to the contents of the file.  *Note File Times::.
 
-     There is an example at the end of this section.
+     'time_t st_ctime'
+          This is the time of the last modification to the attributes of
+          the file.  *Note File Times::.
 
- -- Function: long int wcstol (const wchar_t *restrict STRING, wchar_t
-          **restrict TAILPTR, int BASE)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
+     'unsigned long int st_ctime_usec'
+          This is the fractional part of the time of the last
+          modification to the attributes of the file.  *Note File
+          Times::.
 
-     The `wcstol' function is equivalent to the `strtol' function in
-     nearly all aspects but handles wide character strings.
+     'blkcnt_t st_blocks'
+          This is the amount of disk space that the file occupies,
+          measured in units of 512-byte blocks.
 
-     The `wcstol' function was introduced in Amendment 1 of ISO C90.
+          The number of disk blocks is not strictly proportional to the
+          size of the file, for two reasons: the file system may use
+          some blocks for internal record keeping; and the file may be
+          sparse--it may have "holes" which contain zeros but do not
+          actually take up space on the disk.
 
- -- Function: unsigned long int strtoul (const char *retrict STRING,
-          char **restrict TAILPTR, int BASE)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
+          You can tell (approximately) whether a file is sparse by
+          comparing this value with 'st_size', like this:
 
-     The `strtoul' ("string-to-unsigned-long") function is like
-     `strtol' except it converts to an `unsigned long int' value.  The
-     syntax is the same as described above for `strtol'.  The value
-     returned on overflow is `ULONG_MAX' (*note Range of Type::).
+               (st.st_blocks * 512 < st.st_size)
 
-     If STRING depicts a negative number, `strtoul' acts the same as
-     STRTOL but casts the result to an unsigned integer.  That means
-     for example that `strtoul' on `"-1"' returns `ULONG_MAX' and an
-     input more negative than `LONG_MIN' returns (`ULONG_MAX' + 1) / 2.
+          This test is not perfect because a file that is just slightly
+          sparse might not be detected as sparse at all.  For practical
+          applications, this is not a problem.
 
-     `strtoul' sets ERRNO to `EINVAL' if BASE is out of range, or
-     `ERANGE' on overflow.
+     'unsigned int st_blksize'
+          The optimal block size for reading of writing this file, in
+          bytes.  You might use this size for allocating the buffer
+          space for reading of writing the file.  (This is unrelated to
+          'st_blocks'.)
 
- -- Function: unsigned long int wcstoul (const wchar_t *restrict
-          STRING, wchar_t **restrict TAILPTR, int BASE)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
+   The extensions for the Large File Support (LFS) require, even on
+32-bit machines, types which can handle file sizes up to 2^63.
+Therefore a new definition of 'struct stat' is necessary.
 
-     The `wcstoul' function is equivalent to the `strtoul' function in
-     nearly all aspects but handles wide character strings.
+ -- Data Type: struct stat64
+     The members of this type are the same and have the same names as
+     those in 'struct stat'.  The only difference is that the members
+     'st_ino', 'st_size', and 'st_blocks' have a different type to
+     support larger values.
 
-     The `wcstoul' function was introduced in Amendment 1 of ISO C90.
+     'mode_t st_mode'
+          Specifies the mode of the file.  This includes file type
+          information (*note Testing File Type::) and the file
+          permission bits (*note Permission Bits::).
 
- -- Function: long long int strtoll (const char *restrict STRING, char
-          **restrict TAILPTR, int BASE)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
+     'ino64_t st_ino'
+          The file serial number, which distinguishes this file from all
+          other files on the same device.
 
-     The `strtoll' function is like `strtol' except that it returns a
-     `long long int' value, and accepts numbers with a correspondingly
-     larger range.
-
-     If the string has valid syntax for an integer but the value is not
-     representable because of overflow, `strtoll' returns either
-     `LLONG_MAX' or `LLONG_MIN' (*note Range of Type::), as appropriate
-     for the sign of the value.  It also sets `errno' to `ERANGE' to
-     indicate there was overflow.
-
-     The `strtoll' function was introduced in ISO C99.
-
- -- Function: long long int wcstoll (const wchar_t *restrict STRING,
-          wchar_t **restrict TAILPTR, int BASE)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     The `wcstoll' function is equivalent to the `strtoll' function in
-     nearly all aspects but handles wide character strings.
-
-     The `wcstoll' function was introduced in Amendment 1 of ISO C90.
-
- -- Function: long long int strtoq (const char *restrict STRING, char
-          **restrict TAILPTR, int BASE)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     `strtoq' ("string-to-quad-word") is the BSD name for `strtoll'.
-
- -- Function: long long int wcstoq (const wchar_t *restrict STRING,
-          wchar_t **restrict TAILPTR, int BASE)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     The `wcstoq' function is equivalent to the `strtoq' function in
-     nearly all aspects but handles wide character strings.
-
-     The `wcstoq' function is a GNU extension.
-
- -- Function: unsigned long long int strtoull (const char *restrict
-          STRING, char **restrict TAILPTR, int BASE)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     The `strtoull' function is related to `strtoll' the same way
-     `strtoul' is related to `strtol'.
-
-     The `strtoull' function was introduced in ISO C99.
-
- -- Function: unsigned long long int wcstoull (const wchar_t *restrict
-          STRING, wchar_t **restrict TAILPTR, int BASE)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     The `wcstoull' function is equivalent to the `strtoull' function
-     in nearly all aspects but handles wide character strings.
-
-     The `wcstoull' function was introduced in Amendment 1 of ISO C90.
-
- -- Function: unsigned long long int strtouq (const char *restrict
-          STRING, char **restrict TAILPTR, int BASE)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     `strtouq' is the BSD name for `strtoull'.
-
- -- Function: unsigned long long int wcstouq (const wchar_t *restrict
-          STRING, wchar_t **restrict TAILPTR, int BASE)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     The `wcstouq' function is equivalent to the `strtouq' function in
-     nearly all aspects but handles wide character strings.
-
-     The `wcstouq' function is a GNU extension.
-
- -- Function: intmax_t strtoimax (const char *restrict STRING, char
-          **restrict TAILPTR, int BASE)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     The `strtoimax' function is like `strtol' except that it returns a
-     `intmax_t' value, and accepts numbers of a corresponding range.
-
-     If the string has valid syntax for an integer but the value is not
-     representable because of overflow, `strtoimax' returns either
-     `INTMAX_MAX' or `INTMAX_MIN' (*note Integers::), as appropriate
-     for the sign of the value.  It also sets `errno' to `ERANGE' to
-     indicate there was overflow.
-
-     See *note Integers:: for a description of the `intmax_t' type.  The
-     `strtoimax' function was introduced in ISO C99.
-
- -- Function: intmax_t wcstoimax (const wchar_t *restrict STRING,
-          wchar_t **restrict TAILPTR, int BASE)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
+     'dev_t st_dev'
+          Identifies the device containing the file.  The 'st_ino' and
+          'st_dev', taken together, uniquely identify the file.  The
+          'st_dev' value is not necessarily consistent across reboots or
+          system crashes, however.
 
-     The `wcstoimax' function is equivalent to the `strtoimax' function
-     in nearly all aspects but handles wide character strings.
+     'nlink_t st_nlink'
+          The number of hard links to the file.  This count keeps track
+          of how many directories have entries for this file.  If the
+          count is ever decremented to zero, then the file itself is
+          discarded as soon as no process still holds it open.  Symbolic
+          links are not counted in the total.
 
-     The `wcstoimax' function was introduced in ISO C99.
+     'uid_t st_uid'
+          The user ID of the file's owner.  *Note File Owner::.
 
- -- Function: uintmax_t strtoumax (const char *restrict STRING, char
-          **restrict TAILPTR, int BASE)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
+     'gid_t st_gid'
+          The group ID of the file.  *Note File Owner::.
 
-     The `strtoumax' function is related to `strtoimax' the same way
-     that `strtoul' is related to `strtol'.
+     'off64_t st_size'
+          This specifies the size of a regular file in bytes.  For files
+          that are really devices this field isn't usually meaningful.
+          For symbolic links this specifies the length of the file name
+          the link refers to.
 
-     See *note Integers:: for a description of the `intmax_t' type.  The
-     `strtoumax' function was introduced in ISO C99.
+     'time_t st_atime'
+          This is the last access time for the file.  *Note File
+          Times::.
 
- -- Function: uintmax_t wcstoumax (const wchar_t *restrict STRING,
-          wchar_t **restrict TAILPTR, int BASE)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
+     'unsigned long int st_atime_usec'
+          This is the fractional part of the last access time for the
+          file.  *Note File Times::.
 
-     The `wcstoumax' function is equivalent to the `strtoumax' function
-     in nearly all aspects but handles wide character strings.
+     'time_t st_mtime'
+          This is the time of the last modification to the contents of
+          the file.  *Note File Times::.
 
-     The `wcstoumax' function was introduced in ISO C99.
+     'unsigned long int st_mtime_usec'
+          This is the fractional part of the time of the last
+          modification to the contents of the file.  *Note File Times::.
 
- -- Function: long int atol (const char *STRING)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
+     'time_t st_ctime'
+          This is the time of the last modification to the attributes of
+          the file.  *Note File Times::.
 
-     This function is similar to the `strtol' function with a BASE
-     argument of `10', except that it need not detect overflow errors.
-     The `atol' function is provided mostly for compatibility with
-     existing code; using `strtol' is more robust.
+     'unsigned long int st_ctime_usec'
+          This is the fractional part of the time of the last
+          modification to the attributes of the file.  *Note File
+          Times::.
 
- -- Function: int atoi (const char *STRING)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
+     'blkcnt64_t st_blocks'
+          This is the amount of disk space that the file occupies,
+          measured in units of 512-byte blocks.
 
-     This function is like `atol', except that it returns an `int'.
-     The `atoi' function is also considered obsolete; use `strtol'
-     instead.
+     'unsigned int st_blksize'
+          The optimal block size for reading of writing this file, in
+          bytes.  You might use this size for allocating the buffer
+          space for reading of writing the file.  (This is unrelated to
+          'st_blocks'.)
 
- -- Function: long long int atoll (const char *STRING)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
+   Some of the file attributes have special data type names which exist
+specifically for those attributes.  (They are all aliases for well-known
+integer types that you know and love.)  These typedef names are defined
+in the header file 'sys/types.h' as well as in 'sys/stat.h'.  Here is a
+list of them.
 
-     This function is similar to `atol', except it returns a `long long
+ -- Data Type: mode_t
+     This is an integer data type used to represent file modes.  In the
+     GNU C Library, this is an unsigned type no narrower than 'unsigned
      int'.
 
-     The `atoll' function was introduced in ISO C99.  It too is
-     obsolete (despite having just been added); use `strtoll' instead.
+ -- Data Type: ino_t
+     This is an unsigned integer type used to represent file serial
+     numbers.  (In Unix jargon, these are sometimes called "inode
+     numbers".)  In the GNU C Library, this type is no narrower than
+     'unsigned int'.
 
-   All the functions mentioned in this section so far do not handle
-alternative representations of characters as described in the locale
-data.  Some locales specify thousands separator and the way they have to
-be used which can help to make large numbers more readable.  To read
-such numbers one has to use the `scanf' functions with the `'' flag.
+     If the source is compiled with '_FILE_OFFSET_BITS == 64' this type
+     is transparently replaced by 'ino64_t'.
 
-   Here is a function which parses a string as a sequence of integers
-and returns the sum of them:
+ -- Data Type: ino64_t
+     This is an unsigned integer type used to represent file serial
+     numbers for the use in LFS. In the GNU C Library, this type is no
+     narrower than 'unsigned int'.
+
+     When compiling with '_FILE_OFFSET_BITS == 64' this type is
+     available under the name 'ino_t'.
+
+ -- Data Type: dev_t
+     This is an arithmetic data type used to represent file device
+     numbers.  In the GNU C Library, this is an integer type no narrower
+     than 'int'.
+
+ -- Data Type: nlink_t
+     This is an integer type used to represent file link counts.
+
+ -- Data Type: blkcnt_t
+     This is a signed integer type used to represent block counts.  In
+     the GNU C Library, this type is no narrower than 'int'.
+
+     If the source is compiled with '_FILE_OFFSET_BITS == 64' this type
+     is transparently replaced by 'blkcnt64_t'.
+
+ -- Data Type: blkcnt64_t
+     This is a signed integer type used to represent block counts for
+     the use in LFS. In the GNU C Library, this type is no narrower than
+     'int'.
+
+     When compiling with '_FILE_OFFSET_BITS == 64' this type is
+     available under the name 'blkcnt_t'.
+
+
+File: libc.info,  Node: Reading Attributes,  Next: Testing File Type,  Prev: Attribute Meanings,  Up: File Attributes
+
+14.9.2 Reading the Attributes of a File
+---------------------------------------
+
+To examine the attributes of files, use the functions 'stat', 'fstat'
+and 'lstat'.  They return the attribute information in a 'struct stat'
+object.  All three functions are declared in the header file
+'sys/stat.h'.
+
+ -- Function: int stat (const char *FILENAME, struct stat *BUF)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'stat' function returns information about the attributes of the
+     file named by FILENAME in the structure pointed to by BUF.
+
+     If FILENAME is the name of a symbolic link, the attributes you get
+     describe the file that the link points to.  If the link points to a
+     nonexistent file name, then 'stat' fails reporting a nonexistent
+     file.
+
+     The return value is '0' if the operation is successful, or '-1' on
+     failure.  In addition to the usual file name errors (*note File
+     Name Errors::, the following 'errno' error conditions are defined
+     for this function:
+
+     'ENOENT'
+          The file named by FILENAME doesn't exist.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' this
+     function is in fact 'stat64' since the LFS interface transparently
+     replaces the normal implementation.
+
+ -- Function: int stat64 (const char *FILENAME, struct stat64 *BUF)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is similar to 'stat' but it is also able to work on
+     files larger than 2^31 bytes on 32-bit systems.  To be able to do
+     this the result is stored in a variable of type 'struct stat64' to
+     which BUF must point.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' this
+     function is available under the name 'stat' and so transparently
+     replaces the interface for small files on 32-bit machines.
+
+ -- Function: int fstat (int FILEDES, struct stat *BUF)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'fstat' function is like 'stat', except that it takes an open
+     file descriptor as an argument instead of a file name.  *Note
+     Low-Level I/O::.
+
+     Like 'stat', 'fstat' returns '0' on success and '-1' on failure.
+     The following 'errno' error conditions are defined for 'fstat':
+
+     'EBADF'
+          The FILEDES argument is not a valid file descriptor.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' this
+     function is in fact 'fstat64' since the LFS interface transparently
+     replaces the normal implementation.
+
+ -- Function: int fstat64 (int FILEDES, struct stat64 *BUF)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is similar to 'fstat' but is able to work on large
+     files on 32-bit platforms.  For large files the file descriptor
+     FILEDES should be obtained by 'open64' or 'creat64'.  The BUF
+     pointer points to a variable of type 'struct stat64' which is able
+     to represent the larger values.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' this
+     function is available under the name 'fstat' and so transparently
+     replaces the interface for small files on 32-bit machines.
+
+ -- Function: int lstat (const char *FILENAME, struct stat *BUF)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'lstat' function is like 'stat', except that it does not follow
+     symbolic links.  If FILENAME is the name of a symbolic link,
+     'lstat' returns information about the link itself; otherwise
+     'lstat' works like 'stat'.  *Note Symbolic Links::.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' this
+     function is in fact 'lstat64' since the LFS interface transparently
+     replaces the normal implementation.
+
+ -- Function: int lstat64 (const char *FILENAME, struct stat64 *BUF)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is similar to 'lstat' but it is also able to work on
+     files larger than 2^31 bytes on 32-bit systems.  To be able to do
+     this the result is stored in a variable of type 'struct stat64' to
+     which BUF must point.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' this
+     function is available under the name 'lstat' and so transparently
+     replaces the interface for small files on 32-bit machines.
+
+
+File: libc.info,  Node: Testing File Type,  Next: File Owner,  Prev: Reading Attributes,  Up: File Attributes
+
+14.9.3 Testing the Type of a File
+---------------------------------
+
+The "file mode", stored in the 'st_mode' field of the file attributes,
+contains two kinds of information: the file type code, and the access
+permission bits.  This section discusses only the type code, which you
+can use to tell whether the file is a directory, socket, symbolic link,
+and so on.  For details about access permissions see *note Permission
+Bits::.
+
+   There are two ways you can access the file type information in a file
+mode.  Firstly, for each file type there is a "predicate macro" which
+examines a given file mode and returns whether it is of that type or
+not.  Secondly, you can mask out the rest of the file mode to leave just
+the file type code, and compare this against constants for each of the
+supported file types.
+
+   All of the symbols listed in this section are defined in the header
+file 'sys/stat.h'.
+
+   The following predicate macros test the type of a file, given the
+value M which is the 'st_mode' field returned by 'stat' on that file:
+
+ -- Macro: int S_ISDIR (mode_t M)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This macro returns non-zero if the file is a directory.
+
+ -- Macro: int S_ISCHR (mode_t M)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This macro returns non-zero if the file is a character special file
+     (a device like a terminal).
+
+ -- Macro: int S_ISBLK (mode_t M)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This macro returns non-zero if the file is a block special file (a
+     device like a disk).
+
+ -- Macro: int S_ISREG (mode_t M)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This macro returns non-zero if the file is a regular file.
+
+ -- Macro: int S_ISFIFO (mode_t M)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This macro returns non-zero if the file is a FIFO special file, or
+     a pipe.  *Note Pipes and FIFOs::.
+
+ -- Macro: int S_ISLNK (mode_t M)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This macro returns non-zero if the file is a symbolic link.  *Note
+     Symbolic Links::.
+
+ -- Macro: int S_ISSOCK (mode_t M)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This macro returns non-zero if the file is a socket.  *Note
+     Sockets::.
+
+   An alternate non-POSIX method of testing the file type is supported
+for compatibility with BSD. The mode can be bitwise AND-ed with 'S_IFMT'
+to extract the file type code, and compared to the appropriate constant.
+For example,
+
+     S_ISCHR (MODE)
+
+is equivalent to:
+
+     ((MODE & S_IFMT) == S_IFCHR)
+
+ -- Macro: int S_IFMT
+     This is a bit mask used to extract the file type code from a mode
+     value.
+
+   These are the symbolic names for the different file type codes:
+
+'S_IFDIR'
+     This is the file type constant of a directory file.
+
+'S_IFCHR'
+     This is the file type constant of a character-oriented device file.
+
+'S_IFBLK'
+     This is the file type constant of a block-oriented device file.
+
+'S_IFREG'
+     This is the file type constant of a regular file.
+
+'S_IFLNK'
+     This is the file type constant of a symbolic link.
+
+'S_IFSOCK'
+     This is the file type constant of a socket.
+
+'S_IFIFO'
+     This is the file type constant of a FIFO or pipe.
+
+   The POSIX.1b standard introduced a few more objects which possibly
+can be implemented as object in the filesystem.  These are message
+queues, semaphores, and shared memory objects.  To allow differentiating
+these objects from other files the POSIX standard introduces three new
+test macros.  But unlike the other macros it does not take the value of
+the 'st_mode' field as the parameter.  Instead they expect a pointer to
+the whole 'struct stat' structure.
+
+ -- Macro: int S_TYPEISMQ (struct stat *S)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     If the system implement POSIX message queues as distinct objects
+     and the file is a message queue object, this macro returns a
+     non-zero value.  In all other cases the result is zero.
+
+ -- Macro: int S_TYPEISSEM (struct stat *S)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     If the system implement POSIX semaphores as distinct objects and
+     the file is a semaphore object, this macro returns a non-zero
+     value.  In all other cases the result is zero.
+
+ -- Macro: int S_TYPEISSHM (struct stat *S)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     If the system implement POSIX shared memory objects as distinct
+     objects and the file is a shared memory object, this macro returns
+     a non-zero value.  In all other cases the result is zero.
+
+
+File: libc.info,  Node: File Owner,  Next: Permission Bits,  Prev: Testing File Type,  Up: File Attributes
+
+14.9.4 File Owner
+-----------------
+
+Every file has an "owner" which is one of the registered user names
+defined on the system.  Each file also has a "group" which is one of the
+defined groups.  The file owner can often be useful for showing you who
+edited the file (especially when you edit with GNU Emacs), but its main
+purpose is for access control.
+
+   The file owner and group play a role in determining access because
+the file has one set of access permission bits for the owner, another
+set that applies to users who belong to the file's group, and a third
+set of bits that applies to everyone else.  *Note Access Permission::,
+for the details of how access is decided based on this data.
+
+   When a file is created, its owner is set to the effective user ID of
+the process that creates it (*note Process Persona::).  The file's group
+ID may be set to either the effective group ID of the process, or the
+group ID of the directory that contains the file, depending on the
+system where the file is stored.  When you access a remote file system,
+it behaves according to its own rules, not according to the system your
+program is running on.  Thus, your program must be prepared to encounter
+either kind of behavior no matter what kind of system you run it on.
+
+   You can change the owner and/or group owner of an existing file using
+the 'chown' function.  This is the primitive for the 'chown' and 'chgrp'
+shell commands.
+
+   The prototype for this function is declared in 'unistd.h'.
+
+ -- Function: int chown (const char *FILENAME, uid_t OWNER, gid_t GROUP)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'chown' function changes the owner of the file FILENAME to
+     OWNER, and its group owner to GROUP.
+
+     Changing the owner of the file on certain systems clears the
+     set-user-ID and set-group-ID permission bits.  (This is because
+     those bits may not be appropriate for the new owner.)  Other file
+     permission bits are not changed.
+
+     The return value is '0' on success and '-1' on failure.  In
+     addition to the usual file name errors (*note File Name Errors::),
+     the following 'errno' error conditions are defined for this
+     function:
+
+     'EPERM'
+          This process lacks permission to make the requested change.
+
+          Only privileged users or the file's owner can change the
+          file's group.  On most file systems, only privileged users can
+          change the file owner; some file systems allow you to change
+          the owner if you are currently the owner.  When you access a
+          remote file system, the behavior you encounter is determined
+          by the system that actually holds the file, not by the system
+          your program is running on.
+
+          *Note Options for Files::, for information about the
+          '_POSIX_CHOWN_RESTRICTED' macro.
+
+     'EROFS'
+          The file is on a read-only file system.
+
+ -- Function: int fchown (int FILEDES, uid_t OWNER, gid_t GROUP)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This is like 'chown', except that it changes the owner of the open
+     file with descriptor FILEDES.
+
+     The return value from 'fchown' is '0' on success and '-1' on
+     failure.  The following 'errno' error codes are defined for this
+     function:
+
+     'EBADF'
+          The FILEDES argument is not a valid file descriptor.
+
+     'EINVAL'
+          The FILEDES argument corresponds to a pipe or socket, not an
+          ordinary file.
+
+     'EPERM'
+          This process lacks permission to make the requested change.
+          For details see 'chmod' above.
+
+     'EROFS'
+          The file resides on a read-only file system.
+
+
+File: libc.info,  Node: Permission Bits,  Next: Access Permission,  Prev: File Owner,  Up: File Attributes
+
+14.9.5 The Mode Bits for Access Permission
+------------------------------------------
+
+The "file mode", stored in the 'st_mode' field of the file attributes,
+contains two kinds of information: the file type code, and the access
+permission bits.  This section discusses only the access permission
+bits, which control who can read or write the file.  *Note Testing File
+Type::, for information about the file type code.
+
+   All of the symbols listed in this section are defined in the header
+file 'sys/stat.h'.
+
+   These symbolic constants are defined for the file mode bits that
+control access permission for the file:
+
+'S_IRUSR'
+'S_IREAD'
+     Read permission bit for the owner of the file.  On many systems
+     this bit is 0400.  'S_IREAD' is an obsolete synonym provided for
+     BSD compatibility.
+
+'S_IWUSR'
+'S_IWRITE'
+     Write permission bit for the owner of the file.  Usually 0200.  'S_IWRITE'
+     is an obsolete synonym provided for BSD compatibility.
+
+'S_IXUSR'
+'S_IEXEC'
+     Execute (for ordinary files) or search (for directories) permission
+     bit for the owner of the file.  Usually 0100.  'S_IEXEC' is an
+     obsolete synonym provided for BSD compatibility.
+
+'S_IRWXU'
+     This is equivalent to '(S_IRUSR | S_IWUSR | S_IXUSR)'.
+
+'S_IRGRP'
+     Read permission bit for the group owner of the file.  Usually 040.
+
+'S_IWGRP'
+     Write permission bit for the group owner of the file.  Usually 020.
+
+'S_IXGRP'
+     Execute or search permission bit for the group owner of the file.
+     Usually 010.
+
+'S_IRWXG'
+     This is equivalent to '(S_IRGRP | S_IWGRP | S_IXGRP)'.
+
+'S_IROTH'
+     Read permission bit for other users.  Usually 04.
+
+'S_IWOTH'
+     Write permission bit for other users.  Usually 02.
+
+'S_IXOTH'
+     Execute or search permission bit for other users.  Usually 01.
+
+'S_IRWXO'
+     This is equivalent to '(S_IROTH | S_IWOTH | S_IXOTH)'.
+
+'S_ISUID'
+     This is the set-user-ID on execute bit, usually 04000.  *Note How
+     Change Persona::.
+
+'S_ISGID'
+     This is the set-group-ID on execute bit, usually 02000.  *Note How
+     Change Persona::.
+
+'S_ISVTX'
+     This is the "sticky" bit, usually 01000.
+
+     For a directory it gives permission to delete a file in that
+     directory only if you own that file.  Ordinarily, a user can either
+     delete all the files in a directory or cannot delete any of them
+     (based on whether the user has write permission for the directory).
+     The same restriction applies--you must have both write permission
+     for the directory and own the file you want to delete.  The one
+     exception is that the owner of the directory can delete any file in
+     the directory, no matter who owns it (provided the owner has given
+     himself write permission for the directory).  This is commonly used
+     for the '/tmp' directory, where anyone may create files but not
+     delete files created by other users.
+
+     Originally the sticky bit on an executable file modified the
+     swapping policies of the system.  Normally, when a program
+     terminated, its pages in core were immediately freed and reused.
+     If the sticky bit was set on the executable file, the system kept
+     the pages in core for a while as if the program were still running.
+     This was advantageous for a program likely to be run many times in
+     succession.  This usage is obsolete in modern systems.  When a
+     program terminates, its pages always remain in core as long as
+     there is no shortage of memory in the system.  When the program is
+     next run, its pages will still be in core if no shortage arose
+     since the last run.
+
+     On some modern systems where the sticky bit has no useful meaning
+     for an executable file, you cannot set the bit at all for a
+     non-directory.  If you try, 'chmod' fails with 'EFTYPE'; *note
+     Setting Permissions::.
+
+     Some systems (particularly SunOS) have yet another use for the
+     sticky bit.  If the sticky bit is set on a file that is _not_
+     executable, it means the opposite: never cache the pages of this
+     file at all.  The main use of this is for the files on an NFS
+     server machine which are used as the swap area of diskless client
+     machines.  The idea is that the pages of the file will be cached in
+     the client's memory, so it is a waste of the server's memory to
+     cache them a second time.  With this usage the sticky bit also
+     implies that the filesystem may fail to record the file's
+     modification time onto disk reliably (the idea being that no-one
+     cares for a swap file).
+
+     This bit is only available on BSD systems (and those derived from
+     them).  Therefore one has to use the '_BSD_SOURCE' feature select
+     macro to get the definition (*note Feature Test Macros::).
+
+   The actual bit values of the symbols are listed in the table above so
+you can decode file mode values when debugging your programs.  These bit
+values are correct for most systems, but they are not guaranteed.
+
+   *Warning:* Writing explicit numbers for file permissions is bad
+practice.  Not only is it not portable, it also requires everyone who
+reads your program to remember what the bits mean.  To make your program
+clean use the symbolic names.
+
+
+File: libc.info,  Node: Access Permission,  Next: Setting Permissions,  Prev: Permission Bits,  Up: File Attributes
+
+14.9.6 How Your Access to a File is Decided
+-------------------------------------------
+
+Recall that the operating system normally decides access permission for
+a file based on the effective user and group IDs of the process and its
+supplementary group IDs, together with the file's owner, group and
+permission bits.  These concepts are discussed in detail in *note
+Process Persona::.
+
+   If the effective user ID of the process matches the owner user ID of
+the file, then permissions for read, write, and execute/search are
+controlled by the corresponding "user" (or "owner") bits.  Likewise, if
+any of the effective group ID or supplementary group IDs of the process
+matches the group owner ID of the file, then permissions are controlled
+by the "group" bits.  Otherwise, permissions are controlled by the
+"other" bits.
+
+   Privileged users, like 'root', can access any file regardless of its
+permission bits.  As a special case, for a file to be executable even by
+a privileged user, at least one of its execute bits must be set.
+
+
+File: libc.info,  Node: Setting Permissions,  Next: Testing File Access,  Prev: Access Permission,  Up: File Attributes
+
+14.9.7 Assigning File Permissions
+---------------------------------
+
+The primitive functions for creating files (for example, 'open' or
+'mkdir') take a MODE argument, which specifies the file permissions to
+give the newly created file.  This mode is modified by the process's
+"file creation mask", or "umask", before it is used.
+
+   The bits that are set in the file creation mask identify permissions
+that are always to be disabled for newly created files.  For example, if
+you set all the "other" access bits in the mask, then newly created
+files are not accessible at all to processes in the "other" category,
+even if the MODE argument passed to the create function would permit
+such access.  In other words, the file creation mask is the complement
+of the ordinary access permissions you want to grant.
+
+   Programs that create files typically specify a MODE argument that
+includes all the permissions that make sense for the particular file.
+For an ordinary file, this is typically read and write permission for
+all classes of users.  These permissions are then restricted as
+specified by the individual user's own file creation mask.
+
+   To change the permission of an existing file given its name, call
+'chmod'.  This function uses the specified permission bits and ignores
+the file creation mask.
+
+   In normal use, the file creation mask is initialized by the user's
+login shell (using the 'umask' shell command), and inherited by all
+subprocesses.  Application programs normally don't need to worry about
+the file creation mask.  It will automatically do what it is supposed to
+do.
+
+   When your program needs to create a file and bypass the umask for its
+access permissions, the easiest way to do this is to use 'fchmod' after
+opening the file, rather than changing the umask.  In fact, changing the
+umask is usually done only by shells.  They use the 'umask' function.
+
+   The functions in this section are declared in 'sys/stat.h'.
+
+ -- Function: mode_t umask (mode_t MASK)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'umask' function sets the file creation mask of the current
+     process to MASK, and returns the previous value of the file
+     creation mask.
+
+     Here is an example showing how to read the mask with 'umask'
+     without changing it permanently:
+
+          mode_t
+          read_umask (void)
+          {
+            mode_t mask = umask (0);
+            umask (mask);
+            return mask;
+          }
+
+     However, on GNU/Hurd systems it is better to use 'getumask' if you
+     just want to read the mask value, because it is reentrant.
+
+ -- Function: mode_t getumask (void)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     Return the current value of the file creation mask for the current
+     process.  This function is a GNU extension and is only available on
+     GNU/Hurd systems.
+
+ -- Function: int chmod (const char *FILENAME, mode_t MODE)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'chmod' function sets the access permission bits for the file
+     named by FILENAME to MODE.
+
+     If FILENAME is a symbolic link, 'chmod' changes the permissions of
+     the file pointed to by the link, not those of the link itself.
+
+     This function returns '0' if successful and '-1' if not.  In
+     addition to the usual file name errors (*note File Name Errors::),
+     the following 'errno' error conditions are defined for this
+     function:
+
+     'ENOENT'
+          The named file doesn't exist.
+
+     'EPERM'
+          This process does not have permission to change the access
+          permissions of this file.  Only the file's owner (as judged by
+          the effective user ID of the process) or a privileged user can
+          change them.
+
+     'EROFS'
+          The file resides on a read-only file system.
+
+     'EFTYPE'
+          MODE has the 'S_ISVTX' bit (the "sticky bit") set, and the
+          named file is not a directory.  Some systems do not allow
+          setting the sticky bit on non-directory files, and some do
+          (and only some of those assign a useful meaning to the bit for
+          non-directory files).
+
+          You only get 'EFTYPE' on systems where the sticky bit has no
+          useful meaning for non-directory files, so it is always safe
+          to just clear the bit in MODE and call 'chmod' again.  *Note
+          Permission Bits::, for full details on the sticky bit.
+
+ -- Function: int fchmod (int FILEDES, mode_t MODE)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This is like 'chmod', except that it changes the permissions of the
+     currently open file given by FILEDES.
+
+     The return value from 'fchmod' is '0' on success and '-1' on
+     failure.  The following 'errno' error codes are defined for this
+     function:
+
+     'EBADF'
+          The FILEDES argument is not a valid file descriptor.
+
+     'EINVAL'
+          The FILEDES argument corresponds to a pipe or socket, or
+          something else that doesn't really have access permissions.
+
+     'EPERM'
+          This process does not have permission to change the access
+          permissions of this file.  Only the file's owner (as judged by
+          the effective user ID of the process) or a privileged user can
+          change them.
+
+     'EROFS'
+          The file resides on a read-only file system.
+
+
+File: libc.info,  Node: Testing File Access,  Next: File Times,  Prev: Setting Permissions,  Up: File Attributes
+
+14.9.8 Testing Permission to Access a File
+------------------------------------------
+
+In some situations it is desirable to allow programs to access files or
+devices even if this is not possible with the permissions granted to the
+user.  One possible solution is to set the setuid-bit of the program
+file.  If such a program is started the _effective_ user ID of the
+process is changed to that of the owner of the program file.  So to
+allow write access to files like '/etc/passwd', which normally can be
+written only by the super-user, the modifying program will have to be
+owned by 'root' and the setuid-bit must be set.
+
+   But beside the files the program is intended to change the user
+should not be allowed to access any file to which s/he would not have
+access anyway.  The program therefore must explicitly check whether _the
+user_ would have the necessary access to a file, before it reads or
+writes the file.
+
+   To do this, use the function 'access', which checks for access
+permission based on the process's _real_ user ID rather than the
+effective user ID. (The setuid feature does not alter the real user ID,
+so it reflects the user who actually ran the program.)
+
+   There is another way you could check this access, which is easy to
+describe, but very hard to use.  This is to examine the file mode bits
+and mimic the system's own access computation.  This method is
+undesirable because many systems have additional access control
+features; your program cannot portably mimic them, and you would not
+want to try to keep track of the diverse features that different systems
+have.  Using 'access' is simple and automatically does whatever is
+appropriate for the system you are using.
+
+   'access' is _only_ only appropriate to use in setuid programs.  A
+non-setuid program will always use the effective ID rather than the real
+ID.
+
+   The symbols in this section are declared in 'unistd.h'.
+
+ -- Function: int access (const char *FILENAME, int HOW)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'access' function checks to see whether the file named by
+     FILENAME can be accessed in the way specified by the HOW argument.
+     The HOW argument either can be the bitwise OR of the flags 'R_OK',
+     'W_OK', 'X_OK', or the existence test 'F_OK'.
+
+     This function uses the _real_ user and group IDs of the calling
+     process, rather than the _effective_ IDs, to check for access
+     permission.  As a result, if you use the function from a 'setuid'
+     or 'setgid' program (*note How Change Persona::), it gives
+     information relative to the user who actually ran the program.
+
+     The return value is '0' if the access is permitted, and '-1'
+     otherwise.  (In other words, treated as a predicate function,
+     'access' returns true if the requested access is _denied_.)
+
+     In addition to the usual file name errors (*note File Name
+     Errors::), the following 'errno' error conditions are defined for
+     this function:
+
+     'EACCES'
+          The access specified by HOW is denied.
+
+     'ENOENT'
+          The file doesn't exist.
+
+     'EROFS'
+          Write permission was requested for a file on a read-only file
+          system.
+
+   These macros are defined in the header file 'unistd.h' for use as the
+HOW argument to the 'access' function.  The values are integer
+constants.
+
+ -- Macro: int R_OK
+     Flag meaning test for read permission.
+
+ -- Macro: int W_OK
+     Flag meaning test for write permission.
+
+ -- Macro: int X_OK
+     Flag meaning test for execute/search permission.
+
+ -- Macro: int F_OK
+     Flag meaning test for existence of the file.
+
+
+File: libc.info,  Node: File Times,  Next: File Size,  Prev: Testing File Access,  Up: File Attributes
+
+14.9.9 File Times
+-----------------
+
+Each file has three time stamps associated with it: its access time, its
+modification time, and its attribute modification time.  These
+correspond to the 'st_atime', 'st_mtime', and 'st_ctime' members of the
+'stat' structure; see *note File Attributes::.
+
+   All of these times are represented in calendar time format, as
+'time_t' objects.  This data type is defined in 'time.h'.  For more
+information about representation and manipulation of time values, see
+*note Calendar Time::.
+
+   Reading from a file updates its access time attribute, and writing
+updates its modification time.  When a file is created, all three time
+stamps for that file are set to the current time.  In addition, the
+attribute change time and modification time fields of the directory that
+contains the new entry are updated.
+
+   Adding a new name for a file with the 'link' function updates the
+attribute change time field of the file being linked, and both the
+attribute change time and modification time fields of the directory
+containing the new name.  These same fields are affected if a file name
+is deleted with 'unlink', 'remove' or 'rmdir'.  Renaming a file with
+'rename' affects only the attribute change time and modification time
+fields of the two parent directories involved, and not the times for the
+file being renamed.
+
+   Changing the attributes of a file (for example, with 'chmod') updates
+its attribute change time field.
+
+   You can also change some of the time stamps of a file explicitly
+using the 'utime' function--all except the attribute change time.  You
+need to include the header file 'utime.h' to use this facility.
+
+ -- Data Type: struct utimbuf
+     The 'utimbuf' structure is used with the 'utime' function to
+     specify new access and modification times for a file.  It contains
+     the following members:
+
+     'time_t actime'
+          This is the access time for the file.
+
+     'time_t modtime'
+          This is the modification time for the file.
+
+ -- Function: int utime (const char *FILENAME, const struct utimbuf
+          *TIMES)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is used to modify the file times associated with the
+     file named FILENAME.
+
+     If TIMES is a null pointer, then the access and modification times
+     of the file are set to the current time.  Otherwise, they are set
+     to the values from the 'actime' and 'modtime' members
+     (respectively) of the 'utimbuf' structure pointed to by TIMES.
+
+     The attribute modification time for the file is set to the current
+     time in either case (since changing the time stamps is itself a
+     modification of the file attributes).
+
+     The 'utime' function returns '0' if successful and '-1' on failure.
+     In addition to the usual file name errors (*note File Name
+     Errors::), the following 'errno' error conditions are defined for
+     this function:
+
+     'EACCES'
+          There is a permission problem in the case where a null pointer
+          was passed as the TIMES argument.  In order to update the time
+          stamp on the file, you must either be the owner of the file,
+          have write permission for the file, or be a privileged user.
+
+     'ENOENT'
+          The file doesn't exist.
+
+     'EPERM'
+          If the TIMES argument is not a null pointer, you must either
+          be the owner of the file or be a privileged user.
+
+     'EROFS'
+          The file lives on a read-only file system.
+
+   Each of the three time stamps has a corresponding microsecond part,
+which extends its resolution.  These fields are called 'st_atime_usec',
+'st_mtime_usec', and 'st_ctime_usec'; each has a value between 0 and
+999,999, which indicates the time in microseconds.  They correspond to
+the 'tv_usec' field of a 'timeval' structure; see *note High-Resolution
+Calendar::.
+
+   The 'utimes' function is like 'utime', but also lets you specify the
+fractional part of the file times.  The prototype for this function is
+in the header file 'sys/time.h'.
+
+ -- Function: int utimes (const char *FILENAME, const struct timeval
+          TVP[2])
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function sets the file access and modification times of the
+     file FILENAME.  The new file access time is specified by 'TVP[0]',
+     and the new modification time by 'TVP[1]'.  Similar to 'utime', if
+     TVP is a null pointer then the access and modification times of the
+     file are set to the current time.  This function comes from BSD.
+
+     The return values and error conditions are the same as for the
+     'utime' function.
+
+ -- Function: int lutimes (const char *FILENAME, const struct timeval
+          TVP[2])
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is like 'utimes', except that it does not follow
+     symbolic links.  If FILENAME is the name of a symbolic link,
+     'lutimes' sets the file access and modification times of the
+     symbolic link special file itself (as seen by 'lstat'; *note
+     Symbolic Links::) while 'utimes' sets the file access and
+     modification times of the file the symbolic link refers to.  This
+     function comes from FreeBSD, and is not available on all platforms
+     (if not available, it will fail with 'ENOSYS').
+
+     The return values and error conditions are the same as for the
+     'utime' function.
+
+ -- Function: int futimes (int FD, const struct timeval TVP[2])
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is like 'utimes', except that it takes an open file
+     descriptor as an argument instead of a file name.  *Note Low-Level
+     I/O::.  This function comes from FreeBSD, and is not available on
+     all platforms (if not available, it will fail with 'ENOSYS').
+
+     Like 'utimes', 'futimes' returns '0' on success and '-1' on
+     failure.  The following 'errno' error conditions are defined for
+     'futimes':
+
+     'EACCES'
+          There is a permission problem in the case where a null pointer
+          was passed as the TIMES argument.  In order to update the time
+          stamp on the file, you must either be the owner of the file,
+          have write permission for the file, or be a privileged user.
+
+     'EBADF'
+          The FILEDES argument is not a valid file descriptor.
+
+     'EPERM'
+          If the TIMES argument is not a null pointer, you must either
+          be the owner of the file or be a privileged user.
+
+     'EROFS'
+          The file lives on a read-only file system.
+
+
+File: libc.info,  Node: File Size,  Prev: File Times,  Up: File Attributes
+
+14.9.10 File Size
+-----------------
+
+Normally file sizes are maintained automatically.  A file begins with a
+size of 0 and is automatically extended when data is written past its
+end.  It is also possible to empty a file completely by an 'open' or
+'fopen' call.
+
+   However, sometimes it is necessary to _reduce_ the size of a file.
+This can be done with the 'truncate' and 'ftruncate' functions.  They
+were introduced in BSD Unix.  'ftruncate' was later added to POSIX.1.
+
+   Some systems allow you to extend a file (creating holes) with these
+functions.  This is useful when using memory-mapped I/O (*note
+Memory-mapped I/O::), where files are not automatically extended.
+However, it is not portable but must be implemented if 'mmap' allows
+mapping of files (i.e., '_POSIX_MAPPED_FILES' is defined).
+
+   Using these functions on anything other than a regular file gives
+_undefined_ results.  On many systems, such a call will appear to
+succeed, without actually accomplishing anything.
+
+ -- Function: int truncate (const char *FILENAME, off_t LENGTH)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'truncate' function changes the size of FILENAME to LENGTH.  If
+     LENGTH is shorter than the previous length, data at the end will be
+     lost.  The file must be writable by the user to perform this
+     operation.
+
+     If LENGTH is longer, holes will be added to the end.  However, some
+     systems do not support this feature and will leave the file
+     unchanged.
+
+     When the source file is compiled with '_FILE_OFFSET_BITS == 64' the
+     'truncate' function is in fact 'truncate64' and the type 'off_t'
+     has 64 bits which makes it possible to handle files up to 2^63
+     bytes in length.
+
+     The return value is 0 for success, or -1 for an error.  In addition
+     to the usual file name errors, the following errors may occur:
+
+     'EACCES'
+          The file is a directory or not writable.
+
+     'EINVAL'
+          LENGTH is negative.
+
+     'EFBIG'
+          The operation would extend the file beyond the limits of the
+          operating system.
+
+     'EIO'
+          A hardware I/O error occurred.
+
+     'EPERM'
+          The file is "append-only" or "immutable".
+
+     'EINTR'
+          The operation was interrupted by a signal.
+
+ -- Function: int truncate64 (const char *NAME, off64_t LENGTH)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is similar to the 'truncate' function.  The
+     difference is that the LENGTH argument is 64 bits wide even on 32
+     bits machines, which allows the handling of files with sizes up to
+     2^63 bytes.
+
+     When the source file is compiled with '_FILE_OFFSET_BITS == 64' on
+     a 32 bits machine this function is actually available under the
+     name 'truncate' and so transparently replaces the 32 bits
+     interface.
+
+ -- Function: int ftruncate (int FD, off_t LENGTH)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This is like 'truncate', but it works on a file descriptor FD for
+     an opened file instead of a file name to identify the object.  The
+     file must be opened for writing to successfully carry out the
+     operation.
+
+     The POSIX standard leaves it implementation defined what happens if
+     the specified new LENGTH of the file is bigger than the original
+     size.  The 'ftruncate' function might simply leave the file alone
+     and do nothing or it can increase the size to the desired size.  In
+     this later case the extended area should be zero-filled.  So using
+     'ftruncate' is no reliable way to increase the file size but if it
+     is possible it is probably the fastest way.  The function also
+     operates on POSIX shared memory segments if these are implemented
+     by the system.
+
+     'ftruncate' is especially useful in combination with 'mmap'.  Since
+     the mapped region must have a fixed size one cannot enlarge the
+     file by writing something beyond the last mapped page.  Instead one
+     has to enlarge the file itself and then remap the file with the new
+     size.  The example below shows how this works.
+
+     When the source file is compiled with '_FILE_OFFSET_BITS == 64' the
+     'ftruncate' function is in fact 'ftruncate64' and the type 'off_t'
+     has 64 bits which makes it possible to handle files up to 2^63
+     bytes in length.
+
+     The return value is 0 for success, or -1 for an error.  The
+     following errors may occur:
+
+     'EBADF'
+          FD does not correspond to an open file.
+
+     'EACCES'
+          FD is a directory or not open for writing.
+
+     'EINVAL'
+          LENGTH is negative.
+
+     'EFBIG'
+          The operation would extend the file beyond the limits of the
+          operating system.
+
+     'EIO'
+          A hardware I/O error occurred.
+
+     'EPERM'
+          The file is "append-only" or "immutable".
+
+     'EINTR'
+          The operation was interrupted by a signal.
+
+ -- Function: int ftruncate64 (int ID, off64_t LENGTH)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is similar to the 'ftruncate' function.  The
+     difference is that the LENGTH argument is 64 bits wide even on 32
+     bits machines which allows the handling of files with sizes up to
+     2^63 bytes.
+
+     When the source file is compiled with '_FILE_OFFSET_BITS == 64' on
+     a 32 bits machine this function is actually available under the
+     name 'ftruncate' and so transparently replaces the 32 bits
+     interface.
+
+   As announced here is a little example of how to use 'ftruncate' in
+combination with 'mmap':
+
+     int fd;
+     void *start;
+     size_t len;
 
      int
-     sum_ints_from_string (char *string)
+     add (off_t at, void *block, size_t size)
      {
-       int sum = 0;
-
-       while (1) {
-         char *tail;
-         int next;
-
-         /* Skip whitespace by hand, to detect the end.  */
-         while (isspace (*string)) string++;
-         if (*string == 0)
-           break;
-
-         /* There is more nonwhitespace,  */
-         /* so it ought to be another number.  */
-         errno = 0;
-         /* Parse it.  */
-         next = strtol (string, &tail, 0);
-         /* Add it in, if not overflow.  */
-         if (errno)
-           printf ("Overflow\n");
-         else
-           sum += next;
-         /* Advance past it.  */
-         string = tail;
-       }
-
-       return sum;
+       if (at + size > len)
+         {
+           /* Resize the file and remap.  */
+           size_t ps = sysconf (_SC_PAGESIZE);
+           size_t ns = (at + size + ps - 1) & ~(ps - 1);
+           void *np;
+           if (ftruncate (fd, ns) < 0)
+             return -1;
+           np = mmap (NULL, ns, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
+           if (np == MAP_FAILED)
+             return -1;
+           start = np;
+           len = ns;
+         }
+       memcpy ((char *) start + at, block, size);
+       return 0;
      }
 
-
-File: libc.info,  Node: Parsing of Floats,  Prev: Parsing of Integers,  Up: Parsing of Numbers
-
-20.11.2 Parsing of Floats
--------------------------
-
-The `str' functions are declared in `stdlib.h' and those beginning with
-`wcs' are declared in `wchar.h'.  One might wonder about the use of
-`restrict' in the prototypes of the functions in this section.  It is
-seemingly useless but the ISO C standard uses it (for the functions
-defined there) so we have to do it as well.
-
- -- Function: double strtod (const char *restrict STRING, char
-          **restrict TAILPTR)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     The `strtod' ("string-to-double") function converts the initial
-     part of STRING to a floating-point number, which is returned as a
-     value of type `double'.
-
-     This function attempts to decompose STRING as follows:
-
-        * A (possibly empty) sequence of whitespace characters.  Which
-          characters are whitespace is determined by the `isspace'
-          function (*note Classification of Characters::).  These are
-          discarded.
-
-        * An optional plus or minus sign (`+' or `-').
-
-        * A floating point number in decimal or hexadecimal format.  The
-          decimal format is:
-             - A nonempty sequence of digits optionally containing a
-               decimal-point character--normally `.', but it depends on
-               the locale (*note General Numeric::).
-
-             - An optional exponent part, consisting of a character `e'
-               or `E', an optional sign, and a sequence of digits.
-
-
-          The hexadecimal format is as follows:
-             - A 0x or 0X followed by a nonempty sequence of
-               hexadecimal digits optionally containing a decimal-point
-               character--normally `.', but it depends on the locale
-               (*note General Numeric::).
-
-             - An optional binary-exponent part, consisting of a
-               character `p' or `P', an optional sign, and a sequence
-               of digits.
-
-
-        * Any remaining characters in the string.  If TAILPTR is not a
-          null pointer, a pointer to this tail of the string is stored
-          in `*TAILPTR'.
-
-     If the string is empty, contains only whitespace, or does not
-     contain an initial substring that has the expected syntax for a
-     floating-point number, no conversion is performed.  In this case,
-     `strtod' returns a value of zero and the value returned in
-     `*TAILPTR' is the value of STRING.
-
-     In a locale other than the standard `"C"' or `"POSIX"' locales,
-     this function may recognize additional locale-dependent syntax.
-
-     If the string has valid syntax for a floating-point number but the
-     value is outside the range of a `double', `strtod' will signal
-     overflow or underflow as described in *note Math Error Reporting::.
-
-     `strtod' recognizes four special input strings.  The strings
-     `"inf"' and `"infinity"' are converted to oo, or to the largest
-     representable value if the floating-point format doesn't support
-     infinities.  You can prepend a `"+"' or `"-"' to specify the sign.
-     Case is ignored when scanning these strings.
-
-     The strings `"nan"' and `"nan(CHARS...)"' are converted to NaN.
-     Again, case is ignored.  If CHARS... are provided, they are used
-     in some unspecified fashion to select a particular representation
-     of NaN (there can be several).
-
-     Since zero is a valid result as well as the value returned on
-     error, you should check for errors in the same way as for
-     `strtol', by examining ERRNO and TAILPTR.
-
- -- Function: float strtof (const char *STRING, char **TAILPTR)
- -- Function: long double strtold (const char *STRING, char **TAILPTR)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     These functions are analogous to `strtod', but return `float' and
-     `long double' values respectively.  They report errors in the same
-     way as `strtod'.  `strtof' can be substantially faster than
-     `strtod', but has less precision; conversely, `strtold' can be
-     much slower but has more precision (on systems where `long double'
-     is a separate type).
-
-     These functions have been GNU extensions and are new to ISO C99.
-
- -- Function: double wcstod (const wchar_t *restrict STRING, wchar_t
-          **restrict TAILPTR)
- -- Function: float wcstof (const wchar_t *STRING, wchar_t **TAILPTR)
- -- Function: long double wcstold (const wchar_t *STRING, wchar_t
-          **TAILPTR)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     The `wcstod', `wcstof', and `wcstol' functions are equivalent in
-     nearly all aspect to the `strtod', `strtof', and `strtold'
-     functions but it handles wide character string.
-
-     The `wcstod' function was introduced in Amendment 1 of ISO C90.
-     The `wcstof' and `wcstold' functions were introduced in ISO C99.
-
- -- Function: double atof (const char *STRING)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     This function is similar to the `strtod' function, except that it
-     need not detect overflow and underflow errors.  The `atof' function
-     is provided mostly for compatibility with existing code; using
-     `strtod' is more robust.
-
-   The GNU C Library also provides `_l' versions of these functions,
-which take an additional argument, the locale to use in conversion.
-
-   See also *note Parsing of Integers::.
+   The function 'add' writes a block of memory at an arbitrary position
+in the file.  If the current size of the file is too small it is
+extended.  Note the it is extended by a round number of pages.  This is
+a requirement of 'mmap'.  The program has to keep track of the real
+size, and when it has finished a final 'ftruncate' call should set the
+real size of the file.
 
 
-File: libc.info,  Node: System V Number Conversion,  Prev: Parsing of Numbers,  Up: Arithmetic
+File: libc.info,  Node: Making Special Files,  Next: Temporary Files,  Prev: File Attributes,  Up: File System Interface
 
-20.12 Old-fashioned System V number-to-string functions
-=======================================================
+14.10 Making Special Files
+==========================
 
-The old System V C library provided three functions to convert numbers
-to strings, with unusual and hard-to-use semantics.  The GNU C Library
-also provides these functions and some natural extensions.
+The 'mknod' function is the primitive for making special files, such as
+files that correspond to devices.  The GNU C Library includes this
+function for compatibility with BSD.
 
-   These functions are only available in the GNU C Library and on
-systems descended from AT&T Unix.  Therefore, unless these functions do
-precisely what you need, it is better to use `sprintf', which is
-standard.
+   The prototype for 'mknod' is declared in 'sys/stat.h'.
 
-   All these functions are defined in `stdlib.h'.
+ -- Function: int mknod (const char *FILENAME, mode_t MODE, dev_t DEV)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
- -- Function: char * ecvt (double VALUE, int NDIGIT, int *DECPT, int
-          *NEG)
-     Preliminary: | MT-Unsafe race:ecvt | AS-Unsafe | AC-Safe | *Note
-     POSIX Safety Concepts::.
+     The 'mknod' function makes a special file with name FILENAME.  The
+     MODE specifies the mode of the file, and may include the various
+     special file bits, such as 'S_IFCHR' (for a character special file)
+     or 'S_IFBLK' (for a block special file).  *Note Testing File
+     Type::.
 
-     The function `ecvt' converts the floating-point number VALUE to a
-     string with at most NDIGIT decimal digits.  The returned string
-     contains no decimal point or sign. The first digit of the string
-     is non-zero (unless VALUE is actually zero) and the last digit is
-     rounded to nearest.  `*DECPT' is set to the index in the string of
-     the first digit after the decimal point.  `*NEG' is set to a
-     nonzero value if VALUE is negative, zero otherwise.
+     The DEV argument specifies which device the special file refers to.
+     Its exact interpretation depends on the kind of special file being
+     created.
 
-     If NDIGIT decimal digits would exceed the precision of a `double'
-     it is reduced to a system-specific value.
+     The return value is '0' on success and '-1' on error.  In addition
+     to the usual file name errors (*note File Name Errors::), the
+     following 'errno' error conditions are defined for this function:
 
-     The returned string is statically allocated and overwritten by
-     each call to `ecvt'.
+     'EPERM'
+          The calling process is not privileged.  Only the superuser can
+          create special files.
 
-     If VALUE is zero, it is implementation defined whether `*DECPT' is
-     `0' or `1'.
+     'ENOSPC'
+          The directory or file system that would contain the new file
+          is full and cannot be extended.
 
-     For example: `ecvt (12.3, 5, &d, &n)' returns `"12300"' and sets D
-     to `2' and N to `0'.
+     'EROFS'
+          The directory containing the new file can't be modified
+          because it's on a read-only file system.
 
- -- Function: char * fcvt (double VALUE, int NDIGIT, int *DECPT, int
-          *NEG)
-     Preliminary: | MT-Unsafe race:fcvt | AS-Unsafe heap | AC-Unsafe mem
+     'EEXIST'
+          There is already a file named FILENAME.  If you want to
+          replace this file, you must remove the old file explicitly
+          first.
+
+
+File: libc.info,  Node: Temporary Files,  Prev: Making Special Files,  Up: File System Interface
+
+14.11 Temporary Files
+=====================
+
+If you need to use a temporary file in your program, you can use the
+'tmpfile' function to open it.  Or you can use the 'tmpnam' (better:
+'tmpnam_r') function to provide a name for a temporary file and then you
+can open it in the usual way with 'fopen'.
+
+   The 'tempnam' function is like 'tmpnam' but lets you choose what
+directory temporary files will go in, and something about what their
+file names will look like.  Important for multi-threaded programs is
+that 'tempnam' is reentrant, while 'tmpnam' is not since it returns a
+pointer to a static buffer.
+
+   These facilities are declared in the header file 'stdio.h'.
+
+ -- Function: FILE * tmpfile (void)
+     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe mem fd
+     lock | *Note POSIX Safety Concepts::.
+
+     This function creates a temporary binary file for update mode, as
+     if by calling 'fopen' with mode '"wb+"'.  The file is deleted
+     automatically when it is closed or when the program terminates.
+     (On some other ISO C systems the file may fail to be deleted if the
+     program terminates abnormally).
+
+     This function is reentrant.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' on a
+     32-bit system this function is in fact 'tmpfile64', i.e., the LFS
+     interface transparently replaces the old interface.
+
+ -- Function: FILE * tmpfile64 (void)
+     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe mem fd
+     lock | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'tmpfile', but the stream it returns a
+     pointer to was opened using 'tmpfile64'.  Therefore this stream can
+     be used for files larger than 2^31 bytes on 32-bit machines.
+
+     Please note that the return type is still 'FILE *'.  There is no
+     special 'FILE' type for the LFS interface.
+
+     If the sources are compiled with '_FILE_OFFSET_BITS == 64' on a 32
+     bits machine this function is available under the name 'tmpfile'
+     and so transparently replaces the old interface.
+
+ -- Function: char * tmpnam (char *RESULT)
+     Preliminary: | MT-Unsafe race:tmpnam/!result | AS-Unsafe | AC-Safe
      | *Note POSIX Safety Concepts::.
 
-     The function `fcvt' is like `ecvt', but NDIGIT specifies the
-     number of digits after the decimal point.  If NDIGIT is less than
-     zero, VALUE is rounded to the NDIGIT+1'th place to the left of the
-     decimal point.  For example, if NDIGIT is `-1', VALUE will be
-     rounded to the nearest 10.  If NDIGIT is negative and larger than
-     the number of digits to the left of the decimal point in VALUE,
-     VALUE will be rounded to one significant digit.
+     This function constructs and returns a valid file name that does
+     not refer to any existing file.  If the RESULT argument is a null
+     pointer, the return value is a pointer to an internal static
+     string, which might be modified by subsequent calls and therefore
+     makes this function non-reentrant.  Otherwise, the RESULT argument
+     should be a pointer to an array of at least 'L_tmpnam' characters,
+     and the result is written into that array.
 
-     If NDIGIT decimal digits would exceed the precision of a `double'
-     it is reduced to a system-specific value.
+     It is possible for 'tmpnam' to fail if you call it too many times
+     without removing previously-created files.  This is because the
+     limited length of the temporary file names gives room for only a
+     finite number of different names.  If 'tmpnam' fails it returns a
+     null pointer.
 
-     The returned string is statically allocated and overwritten by
-     each call to `fcvt'.
+     *Warning:* Between the time the pathname is constructed and the
+     file is created another process might have created a file with the
+     same name using 'tmpnam', leading to a possible security hole.  The
+     implementation generates names which can hardly be predicted, but
+     when opening the file you should use the 'O_EXCL' flag.  Using
+     'tmpfile' or 'mkstemp' is a safe way to avoid this problem.
 
- -- Function: char * gcvt (double VALUE, int NDIGIT, char *BUF)
+ -- Function: char * tmpnam_r (char *RESULT)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     `gcvt' is functionally equivalent to `sprintf(buf, "%*g", ndigit,
-     value'.  It is provided only for compatibility's sake.  It returns
-     BUF.
+     This function is nearly identical to the 'tmpnam' function, except
+     that if RESULT is a null pointer it returns a null pointer.
 
-     If NDIGIT decimal digits would exceed the precision of a `double'
-     it is reduced to a system-specific value.
+     This guarantees reentrancy because the non-reentrant situation of
+     'tmpnam' cannot happen here.
 
-   As extensions, the GNU C Library provides versions of these three
-functions that take `long double' arguments.
+     *Warning*: This function has the same security problems as
+     'tmpnam'.
 
- -- Function: char * qecvt (long double VALUE, int NDIGIT, int *DECPT,
-          int *NEG)
-     Preliminary: | MT-Unsafe race:qecvt | AS-Unsafe | AC-Safe | *Note
+ -- Macro: int L_tmpnam
+     The value of this macro is an integer constant expression that
+     represents the minimum size of a string large enough to hold a file
+     name generated by the 'tmpnam' function.
+
+ -- Macro: int TMP_MAX
+     The macro 'TMP_MAX' is a lower bound for how many temporary names
+     you can create with 'tmpnam'.  You can rely on being able to call
+     'tmpnam' at least this many times before it might fail saying you
+     have made too many temporary file names.
+
+     With the GNU C Library, you can create a very large number of
+     temporary file names.  If you actually created the files, you would
+     probably run out of disk space before you ran out of names.  Some
+     other systems have a fixed, small limit on the number of temporary
+     files.  The limit is never less than '25'.
+
+ -- Function: char * tempnam (const char *DIR, const char *PREFIX)
+     Preliminary: | MT-Safe env | AS-Unsafe heap | AC-Unsafe mem | *Note
      POSIX Safety Concepts::.
 
-     This function is equivalent to `ecvt' except that it takes a `long
-     double' for the first parameter and that NDIGIT is restricted by
-     the precision of a `long double'.
+     This function generates a unique temporary file name.  If PREFIX is
+     not a null pointer, up to five characters of this string are used
+     as a prefix for the file name.  The return value is a string newly
+     allocated with 'malloc', so you should release its storage with
+     'free' when it is no longer needed.
 
- -- Function: char * qfcvt (long double VALUE, int NDIGIT, int *DECPT,
-          int *NEG)
-     Preliminary: | MT-Unsafe race:qfcvt | AS-Unsafe heap | AC-Unsafe
-     mem | *Note POSIX Safety Concepts::.
+     Because the string is dynamically allocated this function is
+     reentrant.
 
-     This function is equivalent to `fcvt' except that it takes a `long
-     double' for the first parameter and that NDIGIT is restricted by
-     the precision of a `long double'.
+     The directory prefix for the temporary file name is determined by
+     testing each of the following in sequence.  The directory must
+     exist and be writable.
 
- -- Function: char * qgcvt (long double VALUE, int NDIGIT, char *BUF)
+        * The environment variable 'TMPDIR', if it is defined.  For
+          security reasons this only happens if the program is not SUID
+          or SGID enabled.
+
+        * The DIR argument, if it is not a null pointer.
+
+        * The value of the 'P_tmpdir' macro.
+
+        * The directory '/tmp'.
+
+     This function is defined for SVID compatibility.
+
+     *Warning:* Between the time the pathname is constructed and the
+     file is created another process might have created a file with the
+     same name using 'tempnam', leading to a possible security hole.
+     The implementation generates names which can hardly be predicted,
+     but when opening the file you should use the 'O_EXCL' flag.  Using
+     'tmpfile' or 'mkstemp' is a safe way to avoid this problem.
+
+ -- SVID Macro: char * P_tmpdir
+     This macro is the name of the default directory for temporary
+     files.
+
+   Older Unix systems did not have the functions just described.
+Instead they used 'mktemp' and 'mkstemp'.  Both of these functions work
+by modifying a file name template string you pass.  The last six
+characters of this string must be 'XXXXXX'.  These six 'X's are replaced
+with six characters which make the whole string a unique file name.
+Usually the template string is something like '/tmp/PREFIXXXXXXX', and
+each program uses a unique PREFIX.
+
+   *NB:* Because 'mktemp' and 'mkstemp' modify the template string, you
+_must not_ pass string constants to them.  String constants are normally
+in read-only storage, so your program would crash when 'mktemp' or
+'mkstemp' tried to modify the string.  These functions are declared in
+the header file 'stdlib.h'.
+
+ -- Function: char * mktemp (char *TEMPLATE)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This function is equivalent to `gcvt' except that it takes a `long
-     double' for the first parameter and that NDIGIT is restricted by
-     the precision of a `long double'.
+     The 'mktemp' function generates a unique file name by modifying
+     TEMPLATE as described above.  If successful, it returns TEMPLATE as
+     modified.  If 'mktemp' cannot find a unique file name, it makes
+     TEMPLATE an empty string and returns that.  If TEMPLATE does not
+     end with 'XXXXXX', 'mktemp' returns a null pointer.
 
-   The `ecvt' and `fcvt' functions, and their `long double'
-equivalents, all return a string located in a static buffer which is
-overwritten by the next call to the function.  The GNU C Library
-provides another set of extended functions which write the converted
-string into a user-supplied buffer.  These have the conventional `_r'
-suffix.
+     *Warning:* Between the time the pathname is constructed and the
+     file is created another process might have created a file with the
+     same name using 'mktemp', leading to a possible security hole.  The
+     implementation generates names which can hardly be predicted, but
+     when opening the file you should use the 'O_EXCL' flag.  Using
+     'mkstemp' is a safe way to avoid this problem.
 
-   `gcvt_r' is not necessary, because `gcvt' already uses a
-user-supplied buffer.
+ -- Function: int mkstemp (char *TEMPLATE)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
+     Concepts::.
 
- -- Function: int ecvt_r (double VALUE, int NDIGIT, int *DECPT, int
-          *NEG, char *BUF, size_t LEN)
+     The 'mkstemp' function generates a unique file name just as
+     'mktemp' does, but it also opens the file for you with 'open'
+     (*note Opening and Closing Files::).  If successful, it modifies
+     TEMPLATE in place and returns a file descriptor for that file open
+     for reading and writing.  If 'mkstemp' cannot create a
+     uniquely-named file, it returns '-1'.  If TEMPLATE does not end
+     with 'XXXXXX', 'mkstemp' returns '-1' and does not modify TEMPLATE.
+
+     The file is opened using mode '0600'.  If the file is meant to be
+     used by other users this mode must be changed explicitly.
+
+   Unlike 'mktemp', 'mkstemp' is actually guaranteed to create a unique
+file that cannot possibly clash with any other program trying to create
+a temporary file.  This is because it works by calling 'open' with the
+'O_EXCL' flag, which says you want to create a new file and get an error
+if the file already exists.
+
+ -- Function: char * mkdtemp (char *TEMPLATE)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `ecvt_r' function is the same as `ecvt', except that it places
-     its result into the user-specified buffer pointed to by BUF, with
-     length LEN.  The return value is `-1' in case of an error and zero
-     otherwise.
+     The 'mkdtemp' function creates a directory with a unique name.  If
+     it succeeds, it overwrites TEMPLATE with the name of the directory,
+     and returns TEMPLATE.  As with 'mktemp' and 'mkstemp', TEMPLATE
+     should be a string ending with 'XXXXXX'.
 
-     This function is a GNU extension.
+     If 'mkdtemp' cannot create an uniquely named directory, it returns
+     'NULL' and sets ERRNO appropriately.  If TEMPLATE does not end with
+     'XXXXXX', 'mkdtemp' returns 'NULL' and does not modify TEMPLATE.
+     ERRNO will be set to 'EINVAL' in this case.
 
- -- Function: int fcvt_r (double VALUE, int NDIGIT, int *DECPT, int
-          *NEG, char *BUF, size_t LEN)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
+     The directory is created using mode '0700'.
 
-     The `fcvt_r' function is the same as `fcvt', except that it places
-     its result into the user-specified buffer pointed to by BUF, with
-     length LEN.  The return value is `-1' in case of an error and zero
-     otherwise.
+   The directory created by 'mkdtemp' cannot clash with temporary files
+or directories created by other users.  This is because directory
+creation always works like 'open' with 'O_EXCL'.  *Note Creating
+Directories::.
 
-     This function is a GNU extension.
-
- -- Function: int qecvt_r (long double VALUE, int NDIGIT, int *DECPT,
-          int *NEG, char *BUF, size_t LEN)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `qecvt_r' function is the same as `qecvt', except that it
-     places its result into the user-specified buffer pointed to by
-     BUF, with length LEN.  The return value is `-1' in case of an
-     error and zero otherwise.
-
-     This function is a GNU extension.
-
- -- Function: int qfcvt_r (long double VALUE, int NDIGIT, int *DECPT,
-          int *NEG, char *BUF, size_t LEN)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `qfcvt_r' function is the same as `qfcvt', except that it
-     places its result into the user-specified buffer pointed to by
-     BUF, with length LEN.  The return value is `-1' in case of an
-     error and zero otherwise.
-
-     This function is a GNU extension.
+   The 'mkdtemp' function comes from OpenBSD.
 
 
-File: libc.info,  Node: Date and Time,  Next: Resource Usage And Limitation,  Prev: Arithmetic,  Up: Top
+File: libc.info,  Node: Pipes and FIFOs,  Next: Sockets,  Prev: File System Interface,  Up: Top
 
-21 Date and Time
-****************
+15 Pipes and FIFOs
+******************
 
-This chapter describes functions for manipulating dates and times,
-including functions for determining what time it is and conversion
-between different time representations.
+A "pipe" is a mechanism for interprocess communication; data written to
+the pipe by one process can be read by another process.  The data is
+handled in a first-in, first-out (FIFO) order.  The pipe has no name; it
+is created for one use and both ends must be inherited from the single
+process which created the pipe.
+
+   A "FIFO special file" is similar to a pipe, but instead of being an
+anonymous, temporary connection, a FIFO has a name or names like any
+other file.  Processes open the FIFO by name in order to communicate
+through it.
+
+   A pipe or FIFO has to be open at both ends simultaneously.  If you
+read from a pipe or FIFO file that doesn't have any processes writing to
+it (perhaps because they have all closed the file, or exited), the read
+returns end-of-file.  Writing to a pipe or FIFO that doesn't have a
+reading process is treated as an error condition; it generates a
+'SIGPIPE' signal, and fails with error code 'EPIPE' if the signal is
+handled or blocked.
+
+   Neither pipes nor FIFO special files allow file positioning.  Both
+reading and writing operations happen sequentially; reading from the
+beginning of the file and writing at the end.
 
 * Menu:
 
-* Time Basics::                 Concepts and definitions.
-* Elapsed Time::                Data types to represent elapsed times
-* Processor And CPU Time::      Time a program has spent executing.
-* Calendar Time::               Manipulation of ``real'' dates and times.
-* Setting an Alarm::            Sending a signal after a specified time.
-* Sleeping::                    Waiting for a period of time.
+* Creating a Pipe::             Making a pipe with the 'pipe' function.
+* Pipe to a Subprocess::        Using a pipe to communicate with a
+				 child process.
+* FIFO Special Files::          Making a FIFO special file.
+* Pipe Atomicity::		When pipe (or FIFO) I/O is atomic.
 
 
-File: libc.info,  Node: Time Basics,  Next: Elapsed Time,  Up: Date and Time
+File: libc.info,  Node: Creating a Pipe,  Next: Pipe to a Subprocess,  Up: Pipes and FIFOs
 
-21.1 Time Basics
-================
+15.1 Creating a Pipe
+====================
 
-Discussing time in a technical manual can be difficult because the word
-"time" in English refers to lots of different things.  In this manual,
-we use a rigorous terminology to avoid confusion, and the only thing we
-use the simple word "time" for is to talk about the abstract concept.
+The primitive for creating a pipe is the 'pipe' function.  This creates
+both the reading and writing ends of the pipe.  It is not very useful
+for a single process to use a pipe to talk to itself.  In typical use, a
+process creates a pipe just before it forks one or more child processes
+(*note Creating a Process::).  The pipe is then used for communication
+either between the parent or child processes, or between two sibling
+processes.
 
-   A "calendar time" is a point in the time continuum, for example
-November 4, 1990 at 18:02.5 UTC.  Sometimes this is called "absolute
-time".  
+   The 'pipe' function is declared in the header file 'unistd.h'.
 
-   We don't speak of a "date", because that is inherent in a calendar
-time.  
-
-   An "interval" is a contiguous part of the time continuum between two
-calendar times, for example the hour between 9:00 and 10:00 on July 4,
-1980.  
-
-   An "elapsed time" is the length of an interval, for example, 35
-minutes.  People sometimes sloppily use the word "interval" to refer to
-the elapsed time of some interval.  
-
-   An "amount of time" is a sum of elapsed times, which need not be of
-any specific intervals.  For example, the amount of time it takes to
-read a book might be 9 hours, independently of when and in how many
-sittings it is read.
-
-   A "period" is the elapsed time of an interval between two events,
-especially when they are part of a sequence of regularly repeating
-events.  
-
-   "CPU time" is like calendar time, except that it is based on the
-subset of the time continuum when a particular process is actively
-using a CPU.  CPU time is, therefore, relative to a process.  
-
-   "Processor time" is an amount of time that a CPU is in use.  In
-fact, it's a basic system resource, since there's a limit to how much
-can exist in any given interval (that limit is the elapsed time of the
-interval times the number of CPUs in the processor).  People often call
-this CPU time, but we reserve the latter term in this manual for the
-definition above.  
-
-
-File: libc.info,  Node: Elapsed Time,  Next: Processor And CPU Time,  Prev: Time Basics,  Up: Date and Time
-
-21.2 Elapsed Time
-=================
-
-One way to represent an elapsed time is with a simple arithmetic data
-type, as with the following function to compute the elapsed time between
-two calendar times.  This function is declared in `time.h'.
-
- -- Function: double difftime (time_t TIME1, time_t TIME0)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+ -- Function: int pipe (int FILEDES[2])
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
      Concepts::.
 
-     The `difftime' function returns the number of seconds of elapsed
-     time between calendar time TIME1 and calendar time TIME0, as a
-     value of type `double'.  The difference ignores leap seconds
-     unless leap second support is enabled.
+     The 'pipe' function creates a pipe and puts the file descriptors
+     for the reading and writing ends of the pipe (respectively) into
+     'FILEDES[0]' and 'FILEDES[1]'.
 
-     In the GNU C Library, you can simply subtract `time_t' values.
-     But on other systems, the `time_t' data type might use some other
-     encoding where subtraction doesn't work directly.
+     An easy way to remember that the input end comes first is that file
+     descriptor '0' is standard input, and file descriptor '1' is
+     standard output.
 
-   The GNU C Library provides two data types specifically for
-representing an elapsed time.  They are used by various GNU C Library
-functions, and you can use them for your own purposes too.  They're
-exactly the same except that one has a resolution in microseconds, and
-the other, newer one, is in nanoseconds.
+     If successful, 'pipe' returns a value of '0'.  On failure, '-1' is
+     returned.  The following 'errno' error conditions are defined for
+     this function:
 
- -- Data Type: struct timeval
-     The `struct timeval' structure represents an elapsed time.  It is
-     declared in `sys/time.h' and has the following members:
+     'EMFILE'
+          The process has too many files open.
 
-    `long int tv_sec'
-          This represents the number of whole seconds of elapsed time.
+     'ENFILE'
+          There are too many open files in the entire system.  *Note
+          Error Codes::, for more information about 'ENFILE'.  This
+          error never occurs on GNU/Hurd systems.
 
-    `long int tv_usec'
-          This is the rest of the elapsed time (a fraction of a second),
-          represented as the number of microseconds.  It is always less
-          than one million.
+   Here is an example of a simple program that creates a pipe.  This
+program uses the 'fork' function (*note Creating a Process::) to create
+a child process.  The parent process writes data to the pipe, which is
+read by the child process.
 
 
- -- Data Type: struct timespec
-     The `struct timespec' structure represents an elapsed time.  It is
-     declared in `time.h' and has the following members:
+     #include <sys/types.h>
+     #include <unistd.h>
+     #include <stdio.h>
+     #include <stdlib.h>
 
-    `long int tv_sec'
-          This represents the number of whole seconds of elapsed time.
+     /* Read characters from the pipe and echo them to 'stdout'. */
 
-    `long int tv_nsec'
-          This is the rest of the elapsed time (a fraction of a second),
-          represented as the number of nanoseconds.  It is always less
-          than one billion.
-
-
-   It is often necessary to subtract two values of type
-`struct timeval' or `struct timespec'.  Here is the best way to do
-this.  It works even on some peculiar operating systems where the
-`tv_sec' member has an unsigned type.
-
-
-     /* Subtract the `struct timeval' values X and Y,
-        storing the result in RESULT.
-        Return 1 if the difference is negative, otherwise 0. */
-
-     int
-     timeval_subtract (result, x, y)
-          struct timeval *result, *x, *y;
+     void
+     read_from_pipe (int file)
      {
-       /* Perform the carry for the later subtraction by updating Y. */
-       if (x->tv_usec < y->tv_usec) {
-         int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
-         y->tv_usec -= 1000000 * nsec;
-         y->tv_sec += nsec;
-       }
-       if (x->tv_usec - y->tv_usec > 1000000) {
-         int nsec = (x->tv_usec - y->tv_usec) / 1000000;
-         y->tv_usec += 1000000 * nsec;
-         y->tv_sec -= nsec;
-       }
-
-       /* Compute the time remaining to wait.
-          `tv_usec' is certainly positive. */
-       result->tv_sec = x->tv_sec - y->tv_sec;
-       result->tv_usec = x->tv_usec - y->tv_usec;
-
-       /* Return 1 if result is negative. */
-       return x->tv_sec < y->tv_sec;
+       FILE *stream;
+       int c;
+       stream = fdopen (file, "r");
+       while ((c = fgetc (stream)) != EOF)
+         putchar (c);
+       fclose (stream);
      }
 
-   Common functions that use `struct timeval' are `gettimeofday' and
-`settimeofday'.
+     /* Write some random text to the pipe. */
 
-   There are no GNU C Library functions specifically oriented toward
-dealing with elapsed times, but the calendar time, processor time, and
-alarm and sleeping functions have a lot to do with them.
+     void
+     write_to_pipe (int file)
+     {
+       FILE *stream;
+       stream = fdopen (file, "w");
+       fprintf (stream, "hello, world!\n");
+       fprintf (stream, "goodbye, world!\n");
+       fclose (stream);
+     }
+
+     int
+     main (void)
+     {
+       pid_t pid;
+       int mypipe[2];
+
+       /* Create the pipe. */
+       if (pipe (mypipe))
+         {
+           fprintf (stderr, "Pipe failed.\n");
+           return EXIT_FAILURE;
+         }
+
+       /* Create the child process. */
+       pid = fork ();
+       if (pid == (pid_t) 0)
+         {
+           /* This is the child process.
+              Close other end first. */
+           close (mypipe[1]);
+           read_from_pipe (mypipe[0]);
+           return EXIT_SUCCESS;
+         }
+       else if (pid < (pid_t) 0)
+         {
+           /* The fork failed. */
+           fprintf (stderr, "Fork failed.\n");
+           return EXIT_FAILURE;
+         }
+       else
+         {
+           /* This is the parent process.
+              Close other end first. */
+           close (mypipe[0]);
+           write_to_pipe (mypipe[1]);
+           return EXIT_SUCCESS;
+         }
+     }
 
 
-File: libc.info,  Node: Processor And CPU Time,  Next: Calendar Time,  Prev: Elapsed Time,  Up: Date and Time
+File: libc.info,  Node: Pipe to a Subprocess,  Next: FIFO Special Files,  Prev: Creating a Pipe,  Up: Pipes and FIFOs
 
-21.3 Processor And CPU Time
-===========================
+15.2 Pipe to a Subprocess
+=========================
 
-If you're trying to optimize your program or measure its efficiency,
-it's very useful to know how much processor time it uses.  For that,
-calendar time and elapsed times are useless because a process may spend
-time waiting for I/O or for other processes to use the CPU.  However,
-you can get the information with the functions in this section.
+A common use of pipes is to send data to or receive data from a program
+being run as a subprocess.  One way of doing this is by using a
+combination of 'pipe' (to create the pipe), 'fork' (to create the
+subprocess), 'dup2' (to force the subprocess to use the pipe as its
+standard input or output channel), and 'exec' (to execute the new
+program).  Or, you can use 'popen' and 'pclose'.
 
-   CPU time (*note Time Basics::) is represented by the data type
-`clock_t', which is a number of "clock ticks".  It gives the total
-amount of time a process has actively used a CPU since some arbitrary
-event.  On GNU systems, that event is the creation of the process.
-While arbitrary in general, the event is always the same event for any
-particular process, so you can always measure how much time on the CPU
-a particular computation takes by examining the process' CPU time
-before and after the computation.  
+   The advantage of using 'popen' and 'pclose' is that the interface is
+much simpler and easier to use.  But it doesn't offer as much
+flexibility as using the low-level functions directly.
 
-   On GNU/Linux and GNU/Hurd systems, `clock_t' is equivalent to `long
-int' and `CLOCKS_PER_SEC' is an integer value.  But in other systems,
-both `clock_t' and the macro `CLOCKS_PER_SEC' can be either integer or
-floating-point types.  Casting CPU time values to `double', as in the
-example above, makes sure that operations such as arithmetic and
-printing work properly and consistently no matter what the underlying
-representation is.
+ -- Function: FILE * popen (const char *COMMAND, const char *MODE)
+     Preliminary: | MT-Safe | AS-Unsafe heap corrupt | AC-Unsafe corrupt
+     lock fd mem | *Note POSIX Safety Concepts::.
 
-   Note that the clock can wrap around.  On a 32bit system with
-`CLOCKS_PER_SEC' set to one million this function will return the same
-value approximately every 72 minutes.
+     The 'popen' function is closely related to the 'system' function;
+     see *note Running a Command::.  It executes the shell command
+     COMMAND as a subprocess.  However, instead of waiting for the
+     command to complete, it creates a pipe to the subprocess and
+     returns a stream that corresponds to that pipe.
 
-   For additional functions to examine a process' use of processor time,
-and to control it, see *note Resource Usage And Limitation::.
+     If you specify a MODE argument of '"r"', you can read from the
+     stream to retrieve data from the standard output channel of the
+     subprocess.  The subprocess inherits its standard input channel
+     from the parent process.
+
+     Similarly, if you specify a MODE argument of '"w"', you can write
+     to the stream to send data to the standard input channel of the
+     subprocess.  The subprocess inherits its standard output channel
+     from the parent process.
+
+     In the event of an error 'popen' returns a null pointer.  This
+     might happen if the pipe or stream cannot be created, if the
+     subprocess cannot be forked, or if the program cannot be executed.
+
+ -- Function: int pclose (FILE *STREAM)
+     Preliminary: | MT-Safe | AS-Unsafe heap plugin corrupt lock |
+     AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
+
+     The 'pclose' function is used to close a stream created by 'popen'.
+     It waits for the child process to terminate and returns its status
+     value, as for the 'system' function.
+
+   Here is an example showing how to use 'popen' and 'pclose' to filter
+output through another program, in this case the paging program 'more'.
+
+
+     #include <stdio.h>
+     #include <stdlib.h>
+
+     void
+     write_data (FILE * stream)
+     {
+       int i;
+       for (i = 0; i < 100; i++)
+         fprintf (stream, "%d\n", i);
+       if (ferror (stream))
+         {
+           fprintf (stderr, "Output to stream failed.\n");
+           exit (EXIT_FAILURE);
+         }
+     }
+
+     int
+     main (void)
+     {
+       FILE *output;
+
+       output = popen ("more", "w");
+       if (!output)
+         {
+           fprintf (stderr,
+                    "incorrect parameters or too many files.\n");
+           return EXIT_FAILURE;
+         }
+       write_data (output);
+       if (pclose (output) != 0)
+         {
+           fprintf (stderr,
+                    "Could not run more or other error.\n");
+         }
+       return EXIT_SUCCESS;
+     }
+
+
+File: libc.info,  Node: FIFO Special Files,  Next: Pipe Atomicity,  Prev: Pipe to a Subprocess,  Up: Pipes and FIFOs
+
+15.3 FIFO Special Files
+=======================
+
+A FIFO special file is similar to a pipe, except that it is created in a
+different way.  Instead of being an anonymous communications channel, a
+FIFO special file is entered into the file system by calling 'mkfifo'.
+
+   Once you have created a FIFO special file in this way, any process
+can open it for reading or writing, in the same way as an ordinary file.
+However, it has to be open at both ends simultaneously before you can
+proceed to do any input or output operations on it.  Opening a FIFO for
+reading normally blocks until some other process opens the same FIFO for
+writing, and vice versa.
+
+   The 'mkfifo' function is declared in the header file 'sys/stat.h'.
+
+ -- Function: int mkfifo (const char *FILENAME, mode_t MODE)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'mkfifo' function makes a FIFO special file with name FILENAME.
+     The MODE argument is used to set the file's permissions; see *note
+     Setting Permissions::.
+
+     The normal, successful return value from 'mkfifo' is '0'.  In the
+     case of an error, '-1' is returned.  In addition to the usual file
+     name errors (*note File Name Errors::), the following 'errno' error
+     conditions are defined for this function:
+
+     'EEXIST'
+          The named file already exists.
+
+     'ENOSPC'
+          The directory or file system cannot be extended.
+
+     'EROFS'
+          The directory that would contain the file resides on a
+          read-only file system.
+
+
+File: libc.info,  Node: Pipe Atomicity,  Prev: FIFO Special Files,  Up: Pipes and FIFOs
+
+15.4 Atomicity of Pipe I/O
+==========================
+
+Reading or writing pipe data is "atomic" if the size of data written is
+not greater than 'PIPE_BUF'.  This means that the data transfer seems to
+be an instantaneous unit, in that nothing else in the system can observe
+a state in which it is partially complete.  Atomic I/O may not begin
+right away (it may need to wait for buffer space or for data), but once
+it does begin it finishes immediately.
+
+   Reading or writing a larger amount of data may not be atomic; for
+example, output data from other processes sharing the descriptor may be
+interspersed.  Also, once 'PIPE_BUF' characters have been written,
+further writes will block until some characters are read.
+
+   *Note Limits for Files::, for information about the 'PIPE_BUF'
+parameter.
+
+
+File: libc.info,  Node: Sockets,  Next: Low-Level Terminal Interface,  Prev: Pipes and FIFOs,  Up: Top
+
+16 Sockets
+**********
+
+This chapter describes the GNU facilities for interprocess communication
+using sockets.
+
+   A "socket" is a generalized interprocess communication channel.  Like
+a pipe, a socket is represented as a file descriptor.  Unlike pipes
+sockets support communication between unrelated processes, and even
+between processes running on different machines that communicate over a
+network.  Sockets are the primary means of communicating with other
+machines; 'telnet', 'rlogin', 'ftp', 'talk' and the other familiar
+network programs use sockets.
+
+   Not all operating systems support sockets.  In the GNU C Library, the
+header file 'sys/socket.h' exists regardless of the operating system,
+and the socket functions always exist, but if the system does not really
+support sockets these functions always fail.
+
+   *Incomplete:* We do not currently document the facilities for
+broadcast messages or for configuring Internet interfaces.  The
+reentrant functions and some newer functions that are related to IPv6
+aren't documented either so far.
 
 * Menu:
 
-* CPU Time::                    The `clock' function.
-* Processor Time::              The `times' function.
+* Socket Concepts::	Basic concepts you need to know about.
+* Communication Styles::Stream communication, datagrams and other styles.
+* Socket Addresses::	How socket names ("addresses") work.
+* Interface Naming::	Identifying specific network interfaces.
+* Local Namespace::	Details about the local namespace.
+* Internet Namespace::	Details about the Internet namespace.
+* Misc Namespaces::	Other namespaces not documented fully here.
+* Open/Close Sockets::  Creating sockets and destroying them.
+* Connections::		Operations on sockets with connection state.
+* Datagrams::		Operations on datagram sockets.
+* Inetd::		Inetd is a daemon that starts servers on request.
+			   The most convenient way to write a server
+			   is to make it work with Inetd.
+* Socket Options::	Miscellaneous low-level socket options.
+* Networks Database::   Accessing the database of network names.
 
 
-File: libc.info,  Node: CPU Time,  Next: Processor Time,  Up: Processor And CPU Time
+File: libc.info,  Node: Socket Concepts,  Next: Communication Styles,  Up: Sockets
 
-21.3.1 CPU Time Inquiry
------------------------
+16.1 Socket Concepts
+====================
 
-To get a process' CPU time, you can use the `clock' function.  This
-facility is declared in the header file `time.h'.  
+When you create a socket, you must specify the style of communication
+you want to use and the type of protocol that should implement it.  The
+"communication style" of a socket defines the user-level semantics of
+sending and receiving data on the socket.  Choosing a communication
+style specifies the answers to questions such as these:
 
-   In typical usage, you call the `clock' function at the beginning and
-end of the interval you want to time, subtract the values, and then
-divide by `CLOCKS_PER_SEC' (the number of clock ticks per second) to
-get processor time, like this:
+   * *What are the units of data transmission?*  Some communication
+     styles regard the data as a sequence of bytes with no larger
+     structure; others group the bytes into records (which are known in
+     this context as "packets").
 
-     #include <time.h>
+   * *Can data be lost during normal operation?*  Some communication
+     styles guarantee that all the data sent arrives in the order it was
+     sent (barring system or network crashes); other styles occasionally
+     lose data as a normal part of operation, and may sometimes deliver
+     packets more than once or in the wrong order.
 
-     clock_t start, end;
-     double cpu_time_used;
+     Designing a program to use unreliable communication styles usually
+     involves taking precautions to detect lost or misordered packets
+     and to retransmit data as needed.
 
-     start = clock();
-     ... /* Do the work. */
-     end = clock();
-     cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
+   * *Is communication entirely with one partner?*  Some communication
+     styles are like a telephone call--you make a "connection" with one
+     remote socket and then exchange data freely.  Other styles are like
+     mailing letters--you specify a destination address for each message
+     you send.
 
-   Do not use a single CPU time as an amount of time; it doesn't work
-that way.  Either do a subtraction as shown above or query processor
-time directly.  *Note Processor Time::.
+   You must also choose a "namespace" for naming the socket.  A socket
+name ("address") is meaningful only in the context of a particular
+namespace.  In fact, even the data type to use for a socket name may
+depend on the namespace.  Namespaces are also called "domains", but we
+avoid that word as it can be confused with other usage of the same term.
+Each namespace has a symbolic name that starts with 'PF_'.  A
+corresponding symbolic name starting with 'AF_' designates the address
+format for that namespace.
 
-   Different computers and operating systems vary wildly in how they
-keep track of CPU time.  It's common for the internal processor clock
-to have a resolution somewhere between a hundredth and millionth of a
-second.
+   Finally you must choose the "protocol" to carry out the
+communication.  The protocol determines what low-level mechanism is used
+to transmit and receive data.  Each protocol is valid for a particular
+namespace and communication style; a namespace is sometimes called a
+"protocol family" because of this, which is why the namespace names
+start with 'PF_'.
 
- -- Macro: int CLOCKS_PER_SEC
-     The value of this macro is the number of clock ticks per second
-     measured by the `clock' function.  POSIX requires that this value
-     be one million independent of the actual resolution.
+   The rules of a protocol apply to the data passing between two
+programs, perhaps on different computers; most of these rules are
+handled by the operating system and you need not know about them.  What
+you do need to know about protocols is this:
 
- -- Data Type: clock_t
-     This is the type of the value returned by the `clock' function.
-     Values of type `clock_t' are numbers of clock ticks.
+   * In order to have communication between two sockets, they must
+     specify the _same_ protocol.
 
- -- Function: clock_t clock (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
+   * Each protocol is meaningful with particular style/namespace
+     combinations and cannot be used with inappropriate combinations.
+     For example, the TCP protocol fits only the byte stream style of
+     communication and the Internet namespace.
 
-     This function returns the calling process' current CPU time.  If
-     the CPU time is not available or cannot be represented, `clock'
-     returns the value `(clock_t)(-1)'.
+   * For each combination of style and namespace there is a "default
+     protocol", which you can request by specifying 0 as the protocol
+     number.  And that's what you should normally do--use the default.
+
+   Throughout the following description at various places
+variables/parameters to denote sizes are required.  And here the trouble
+starts.  In the first implementations the type of these variables was
+simply 'int'.  On most machines at that time an 'int' was 32 bits wide,
+which created a _de facto_ standard requiring 32-bit variables.  This is
+important since references to variables of this type are passed to the
+kernel.
+
+   Then the POSIX people came and unified the interface with the words
+"all size values are of type 'size_t'".  On 64-bit machines 'size_t' is
+64 bits wide, so pointers to variables were no longer possible.
+
+   The Unix98 specification provides a solution by introducing a type
+'socklen_t'.  This type is used in all of the cases that POSIX changed
+to use 'size_t'.  The only requirement of this type is that it be an
+unsigned type of at least 32 bits.  Therefore, implementations which
+require that references to 32-bit variables be passed can be as happy as
+implementations which use 64-bit values.
 
 
-File: libc.info,  Node: Processor Time,  Prev: CPU Time,  Up: Processor And CPU Time
+File: libc.info,  Node: Communication Styles,  Next: Socket Addresses,  Prev: Socket Concepts,  Up: Sockets
 
-21.3.2 Processor Time Inquiry
------------------------------
+16.2 Communication Styles
+=========================
 
-The `times' function returns information about a process' consumption
-of processor time in a `struct tms' object, in addition to the process'
-CPU time.  *Note Time Basics::.  You should include the header file
-`sys/times.h' to use this facility.  
+The GNU C Library includes support for several different kinds of
+sockets, each with different characteristics.  This section describes
+the supported socket types.  The symbolic constants listed here are
+defined in 'sys/socket.h'.
 
- -- Data Type: struct tms
-     The `tms' structure is used to return information about process
-     times.  It contains at least the following members:
+ -- Macro: int SOCK_STREAM
+     The 'SOCK_STREAM' style is like a pipe (*note Pipes and FIFOs::).
+     It operates over a connection with a particular remote socket and
+     transmits data reliably as a stream of bytes.
 
-    `clock_t tms_utime'
-          This is the total processor time the calling process has used
-          in executing the instructions of its program.
+     Use of this style is covered in detail in *note Connections::.
 
-    `clock_t tms_stime'
-          This is the processor time the system has used on behalf of
-          the calling process.
+ -- Macro: int SOCK_DGRAM
+     The 'SOCK_DGRAM' style is used for sending individually-addressed
+     packets unreliably.  It is the diametrical opposite of
+     'SOCK_STREAM'.
 
-    `clock_t tms_cutime'
-          This is the sum of the `tms_utime' values and the `tms_cutime'
-          values of all terminated child processes of the calling
-          process, whose status has been reported to the parent process
-          by `wait' or `waitpid'; see *note Process Completion::.  In
-          other words, it represents the total processor time used in
-          executing the instructions of all the terminated child
-          processes of the calling process, excluding child processes
-          which have not yet been reported by `wait' or `waitpid'.  
+     Each time you write data to a socket of this kind, that data
+     becomes one packet.  Since 'SOCK_DGRAM' sockets do not have
+     connections, you must specify the recipient address with each
+     packet.
 
-    `clock_t tms_cstime'
-          This is similar to `tms_cutime', but represents the total
-          processor time system has used on behalf of all the
-          terminated child processes of the calling process.
+     The only guarantee that the system makes about your requests to
+     transmit data is that it will try its best to deliver each packet
+     you send.  It may succeed with the sixth packet after failing with
+     the fourth and fifth packets; the seventh packet may arrive before
+     the sixth, and may arrive a second time after the sixth.
 
-     All of the times are given in numbers of clock ticks.  Unlike CPU
-     time, these are the actual amounts of time; not relative to any
-     event.  *Note Creating a Process::.
+     The typical use for 'SOCK_DGRAM' is in situations where it is
+     acceptable to simply re-send a packet if no response is seen in a
+     reasonable amount of time.
 
- -- Macro: int CLK_TCK
-     This is an obsolete name for the number of clock ticks per second.
-     Use `sysconf (_SC_CLK_TCK)' instead.
+     *Note Datagrams::, for detailed information about how to use
+     datagram sockets.
 
- -- Function: clock_t times (struct tms *BUFFER)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `times' function stores the processor time information for the
-     calling process in BUFFER.
-
-     The return value is the number of clock ticks since an arbitrary
-     point in the past, e.g. since system start-up.  `times' returns
-     `(clock_t)(-1)' to indicate failure.
-
-   *Portability Note:* The `clock' function described in *note CPU
-Time:: is specified by the ISO C standard.  The `times' function is a
-feature of POSIX.1.  On GNU systems, the CPU time is defined to be
-equivalent to the sum of the `tms_utime' and `tms_stime' fields
-returned by `times'.
+ -- Macro: int SOCK_RAW
+     This style provides access to low-level network protocols and
+     interfaces.  Ordinary user programs usually have no need to use
+     this style.
 
 
-File: libc.info,  Node: Calendar Time,  Next: Setting an Alarm,  Prev: Processor And CPU Time,  Up: Date and Time
+File: libc.info,  Node: Socket Addresses,  Next: Interface Naming,  Prev: Communication Styles,  Up: Sockets
 
-21.4 Calendar Time
-==================
+16.3 Socket Addresses
+=====================
 
-This section describes facilities for keeping track of calendar time.
-*Note Time Basics::.
+The name of a socket is normally called an "address".  The functions and
+symbols for dealing with socket addresses were named inconsistently,
+sometimes using the term "name" and sometimes using "address".  You can
+regard these terms as synonymous where sockets are concerned.
 
-   The GNU C Library represents calendar time three ways:
+   A socket newly created with the 'socket' function has no address.
+Other processes can find it for communication only if you give it an
+address.  We call this "binding" the address to the socket, and the way
+to do it is with the 'bind' function.
 
-   * "Simple time" (the `time_t' data type) is a compact
-     representation, typically giving the number of seconds of elapsed
-     time since some implementation-specific base time.  
+   You need be concerned with the address of a socket if other processes
+are to find it and start communicating with it.  You can specify an
+address for other sockets, but this is usually pointless; the first time
+you send data from a socket, or use it to initiate a connection, the
+system assigns an address automatically if you have not specified one.
 
-   * There is also a "high-resolution time" representation.  Like simple
-     time, this represents a calendar time as an elapsed time since a
-     base time, but instead of measuring in whole seconds, it uses a
-     `struct timeval' data type, which includes fractions of a second.
-     Use this time representation instead of simple time when you need
-     greater precision.  
+   Occasionally a client needs to specify an address because the server
+discriminates based on address; for example, the rsh and rlogin
+protocols look at the client's socket address and only bypass password
+checking if it is less than 'IPPORT_RESERVED' (*note Ports::).
 
-   * "Local time" or "broken-down time" (the `struct tm' data type)
-     represents a calendar time as a set of components specifying the
-     year, month, and so on in the Gregorian calendar, for a specific
-     time zone.  This calendar time representation is usually used only
-     to communicate with people.  
+   The details of socket addresses vary depending on what namespace you
+are using.  *Note Local Namespace::, or *note Internet Namespace::, for
+specific information.
+
+   Regardless of the namespace, you use the same functions 'bind' and
+'getsockname' to set and examine a socket's address.  These functions
+use a phony data type, 'struct sockaddr *', to accept the address.  In
+practice, the address lives in a structure of some other data type
+appropriate to the address format you are using, but you cast its
+address to 'struct sockaddr *' when you pass it to 'bind'.
 
 * Menu:
 
-* Simple Calendar Time::        Facilities for manipulating calendar time.
-* High-Resolution Calendar::    A time representation with greater precision.
-* Broken-down Time::            Facilities for manipulating local time.
-* High Accuracy Clock::         Maintaining a high accuracy system clock.
-* Formatting Calendar Time::    Converting times to strings.
-* Parsing Date and Time::       Convert textual time and date information back
-                                 into broken-down time values.
-* TZ Variable::                 How users specify the time zone.
-* Time Zone Functions::         Functions to examine or specify the time zone.
-* Time Functions Example::      An example program showing use of some of
-				 the time functions.
+* Address Formats::		About 'struct sockaddr'.
+* Setting Address::		Binding an address to a socket.
+* Reading Address::		Reading the address of a socket.
 
 
-File: libc.info,  Node: Simple Calendar Time,  Next: High-Resolution Calendar,  Up: Calendar Time
+File: libc.info,  Node: Address Formats,  Next: Setting Address,  Up: Socket Addresses
 
-21.4.1 Simple Calendar Time
----------------------------
+16.3.1 Address Formats
+----------------------
 
-This section describes the `time_t' data type for representing calendar
-time as simple time, and the functions which operate on simple time
-objects.  These facilities are declared in the header file `time.h'.  
+The functions 'bind' and 'getsockname' use the generic data type 'struct
+sockaddr *' to represent a pointer to a socket address.  You can't use
+this data type effectively to interpret an address or construct one; for
+that, you must use the proper data type for the socket's namespace.
 
- -- Data Type: time_t
-     This is the data type used to represent simple time.  Sometimes,
-     it also represents an elapsed time.  When interpreted as a
-     calendar time value, it represents the number of seconds elapsed
-     since 00:00:00 on January 1, 1970, Coordinated Universal Time.
-     (This calendar time is sometimes referred to as the "epoch".)
-     POSIX requires that this count not include leap seconds, but on
-     some systems this count includes leap seconds if you set `TZ' to
-     certain values (*note TZ Variable::).
+   Thus, the usual practice is to construct an address of the proper
+namespace-specific type, then cast a pointer to 'struct sockaddr *' when
+you call 'bind' or 'getsockname'.
 
-     Note that a simple time has no concept of local time zone.
-     Calendar Time T is the same instant in time regardless of where on
-     the globe the computer is.
+   The one piece of information that you can get from the 'struct
+sockaddr' data type is the "address format designator".  This tells you
+which data type to use to understand the address fully.
 
-     In the GNU C Library, `time_t' is equivalent to `long int'.  In
-     other systems, `time_t' might be either an integer or
-     floating-point type.
+   The symbols in this section are defined in the header file
+'sys/socket.h'.
 
-   The function `difftime' tells you the elapsed time between two
-simple calendar times, which is not always as easy to compute as just
-subtracting.  *Note Elapsed Time::.
+ -- Data Type: struct sockaddr
+     The 'struct sockaddr' type itself has the following members:
 
- -- Function: time_t time (time_t *RESULT)
+     'short int sa_family'
+          This is the code for the address format of this address.  It
+          identifies the format of the data which follows.
+
+     'char sa_data[14]'
+          This is the actual socket address data, which is
+          format-dependent.  Its length also depends on the format, and
+          may well be more than 14.  The length 14 of 'sa_data' is
+          essentially arbitrary.
+
+   Each address format has a symbolic name which starts with 'AF_'.
+Each of them corresponds to a 'PF_' symbol which designates the
+corresponding namespace.  Here is a list of address format names:
+
+'AF_LOCAL'
+     This designates the address format that goes with the local
+     namespace.  ('PF_LOCAL' is the name of that namespace.)  *Note
+     Local Namespace Details::, for information about this address
+     format.
+
+'AF_UNIX'
+     This is a synonym for 'AF_LOCAL'.  Although 'AF_LOCAL' is mandated
+     by POSIX.1g, 'AF_UNIX' is portable to more systems.  'AF_UNIX' was
+     the traditional name stemming from BSD, so even most POSIX systems
+     support it.  It is also the name of choice in the Unix98
+     specification.  (The same is true for 'PF_UNIX' vs.  'PF_LOCAL').
+
+'AF_FILE'
+     This is another synonym for 'AF_LOCAL', for compatibility.
+     ('PF_FILE' is likewise a synonym for 'PF_LOCAL'.)
+
+'AF_INET'
+     This designates the address format that goes with the Internet
+     namespace.  ('PF_INET' is the name of that namespace.)  *Note
+     Internet Address Formats::.
+
+'AF_INET6'
+     This is similar to 'AF_INET', but refers to the IPv6 protocol.
+     ('PF_INET6' is the name of the corresponding namespace.)
+
+'AF_UNSPEC'
+     This designates no particular address format.  It is used only in
+     rare cases, such as to clear out the default destination address of
+     a "connected" datagram socket.  *Note Sending Datagrams::.
+
+     The corresponding namespace designator symbol 'PF_UNSPEC' exists
+     for completeness, but there is no reason to use it in a program.
+
+   'sys/socket.h' defines symbols starting with 'AF_' for many different
+kinds of networks, most or all of which are not actually implemented.
+We will document those that really work as we receive information about
+how to use them.
+
+
+File: libc.info,  Node: Setting Address,  Next: Reading Address,  Prev: Address Formats,  Up: Socket Addresses
+
+16.3.2 Setting the Address of a Socket
+--------------------------------------
+
+Use the 'bind' function to assign an address to a socket.  The prototype
+for 'bind' is in the header file 'sys/socket.h'.  For examples of use,
+see *note Local Socket Example::, or see *note Inet Example::.
+
+ -- Function: int bind (int SOCKET, struct sockaddr *ADDR, socklen_t
+          LENGTH)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `time' function returns the current calendar time as a value of
-     type `time_t'.  If the argument RESULT is not a null pointer, the
-     calendar time value is also stored in `*RESULT'.  If the current
-     calendar time is not available, the value `(time_t)(-1)' is
-     returned.
+     The 'bind' function assigns an address to the socket SOCKET.  The
+     ADDR and LENGTH arguments specify the address; the detailed format
+     of the address depends on the namespace.  The first part of the
+     address is always the format designator, which specifies a
+     namespace, and says that the address is in the format of that
+     namespace.
 
- -- Function: int stime (const time_t *NEWTIME)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
+     The return value is '0' on success and '-1' on failure.  The
+     following 'errno' error conditions are defined for this function:
 
-     `stime' sets the system clock, i.e., it tells the system that the
-     current calendar time is NEWTIME, where `newtime' is interpreted
-     as described in the above definition of `time_t'.
+     'EBADF'
+          The SOCKET argument is not a valid file descriptor.
 
-     `settimeofday' is a newer function which sets the system clock to
-     better than one second precision.  `settimeofday' is generally a
-     better choice than `stime'.  *Note High-Resolution Calendar::.
+     'ENOTSOCK'
+          The descriptor SOCKET is not a socket.
 
-     Only the superuser can set the system clock.
+     'EADDRNOTAVAIL'
+          The specified address is not available on this machine.
 
-     If the function succeeds, the return value is zero.  Otherwise, it
-     is `-1' and `errno' is set accordingly:
+     'EADDRINUSE'
+          Some other socket is already using the specified address.
 
-    `EPERM'
-          The process is not superuser.
+     'EINVAL'
+          The socket SOCKET already has an address.
+
+     'EACCES'
+          You do not have permission to access the requested address.
+          (In the Internet domain, only the super-user is allowed to
+          specify a port number in the range 0 through 'IPPORT_RESERVED'
+          minus one; see *note Ports::.)
+
+     Additional conditions may be possible depending on the particular
+     namespace of the socket.
 
 
-File: libc.info,  Node: High-Resolution Calendar,  Next: Broken-down Time,  Prev: Simple Calendar Time,  Up: Calendar Time
+File: libc.info,  Node: Reading Address,  Prev: Setting Address,  Up: Socket Addresses
 
-21.4.2 High-Resolution Calendar
+16.3.3 Reading the Address of a Socket
+--------------------------------------
+
+Use the function 'getsockname' to examine the address of an Internet
+socket.  The prototype for this function is in the header file
+'sys/socket.h'.
+
+ -- Function: int getsockname (int SOCKET, struct sockaddr *ADDR,
+          socklen_t *LENGTH-PTR)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe mem/hurd | *Note POSIX
+     Safety Concepts::.
+
+     The 'getsockname' function returns information about the address of
+     the socket SOCKET in the locations specified by the ADDR and
+     LENGTH-PTR arguments.  Note that the LENGTH-PTR is a pointer; you
+     should initialize it to be the allocation size of ADDR, and on
+     return it contains the actual size of the address data.
+
+     The format of the address data depends on the socket namespace.
+     The length of the information is usually fixed for a given
+     namespace, so normally you can know exactly how much space is
+     needed and can provide that much.  The usual practice is to
+     allocate a place for the value using the proper data type for the
+     socket's namespace, then cast its address to 'struct sockaddr *' to
+     pass it to 'getsockname'.
+
+     The return value is '0' on success and '-1' on error.  The
+     following 'errno' error conditions are defined for this function:
+
+     'EBADF'
+          The SOCKET argument is not a valid file descriptor.
+
+     'ENOTSOCK'
+          The descriptor SOCKET is not a socket.
+
+     'ENOBUFS'
+          There are not enough internal buffers available for the
+          operation.
+
+   You can't read the address of a socket in the file namespace.  This
+is consistent with the rest of the system; in general, there's no way to
+find a file's name from a descriptor for that file.
+
+
+File: libc.info,  Node: Interface Naming,  Next: Local Namespace,  Prev: Socket Addresses,  Up: Sockets
+
+16.4 Interface Naming
+=====================
+
+Each network interface has a name.  This usually consists of a few
+letters that relate to the type of interface, which may be followed by a
+number if there is more than one interface of that type.  Examples might
+be 'lo' (the loopback interface) and 'eth0' (the first Ethernet
+interface).
+
+   Although such names are convenient for humans, it would be clumsy to
+have to use them whenever a program needs to refer to an interface.  In
+such situations an interface is referred to by its "index", which is an
+arbitrarily-assigned small positive integer.
+
+   The following functions, constants and data types are declared in the
+header file 'net/if.h'.
+
+ -- Constant: size_t IFNAMSIZ
+     This constant defines the maximum buffer size needed to hold an
+     interface name, including its terminating zero byte.
+
+ -- Function: unsigned int if_nametoindex (const char *IFNAME)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock fd | *Note
+     POSIX Safety Concepts::.
+
+     This function yields the interface index corresponding to a
+     particular name.  If no interface exists with the name given, it
+     returns 0.
+
+ -- Function: char * if_indextoname (unsigned int IFINDEX, char *IFNAME)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock fd | *Note
+     POSIX Safety Concepts::.
+
+     This function maps an interface index to its corresponding name.
+     The returned name is placed in the buffer pointed to by 'ifname',
+     which must be at least 'IFNAMSIZ' bytes in length.  If the index
+     was invalid, the function's return value is a null pointer,
+     otherwise it is 'ifname'.
+
+ -- Data Type: struct if_nameindex
+     This data type is used to hold the information about a single
+     interface.  It has the following members:
+
+     'unsigned int if_index;'
+          This is the interface index.
+
+     'char *if_name'
+          This is the null-terminated index name.
+
+ -- Function: struct if_nameindex * if_nameindex (void)
+     Preliminary: | MT-Safe | AS-Unsafe heap lock/hurd | AC-Unsafe
+     lock/hurd fd mem | *Note POSIX Safety Concepts::.
+
+     This function returns an array of 'if_nameindex' structures, one
+     for every interface that is present.  The end of the list is
+     indicated by a structure with an interface of 0 and a null name
+     pointer.  If an error occurs, this function returns a null pointer.
+
+     The returned structure must be freed with 'if_freenameindex' after
+     use.
+
+ -- Function: void if_freenameindex (struct if_nameindex *PTR)
+     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
+     POSIX Safety Concepts::.
+
+     This function frees the structure returned by an earlier call to
+     'if_nameindex'.
+
+
+File: libc.info,  Node: Local Namespace,  Next: Internet Namespace,  Prev: Interface Naming,  Up: Sockets
+
+16.5 The Local Namespace
+========================
+
+This section describes the details of the local namespace, whose
+symbolic name (required when you create a socket) is 'PF_LOCAL'.  The
+local namespace is also known as "Unix domain sockets".  Another name is
+file namespace since socket addresses are normally implemented as file
+names.
+
+* Menu:
+
+* Concepts: Local Namespace Concepts. What you need to understand.
+* Details: Local Namespace Details.   Address format, symbolic names, etc.
+* Example: Local Socket Example.      Example of creating a socket.
+
+
+File: libc.info,  Node: Local Namespace Concepts,  Next: Local Namespace Details,  Up: Local Namespace
+
+16.5.1 Local Namespace Concepts
 -------------------------------
 
-The `time_t' data type used to represent simple times has a resolution
-of only one second.  Some applications need more precision.
+In the local namespace socket addresses are file names.  You can specify
+any file name you want as the address of the socket, but you must have
+write permission on the directory containing it.  It's common to put
+these files in the '/tmp' directory.
 
-   So, the GNU C Library also contains functions which are capable of
-representing calendar times to a higher resolution than one second.  The
-functions and the associated data types described in this section are
-declared in `sys/time.h'.  
+   One peculiarity of the local namespace is that the name is only used
+when opening the connection; once open the address is not meaningful and
+may not exist.
 
- -- Data Type: struct timezone
-     The `struct timezone' structure is used to hold minimal information
-     about the local time zone.  It has the following members:
+   Another peculiarity is that you cannot connect to such a socket from
+another machine-not even if the other machine shares the file system
+which contains the name of the socket.  You can see the socket in a
+directory listing, but connecting to it never succeeds.  Some programs
+take advantage of this, such as by asking the client to send its own
+process ID, and using the process IDs to distinguish between clients.
+However, we recommend you not use this method in protocols you design,
+as we might someday permit connections from other machines that mount
+the same file systems.  Instead, send each new client an identifying
+number if you want it to have one.
 
-    `int tz_minuteswest'
-          This is the number of minutes west of UTC.
+   After you close a socket in the local namespace, you should delete
+the file name from the file system.  Use 'unlink' or 'remove' to do
+this; see *note Deleting Files::.
 
-    `int tz_dsttime'
-          If nonzero, Daylight Saving Time applies during some part of
-          the year.
-
-     The `struct timezone' type is obsolete and should never be used.
-     Instead, use the facilities described in *note Time Zone
-     Functions::.
-
- -- Function: int gettimeofday (struct timeval *TP, struct timezone
-          *TZP)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `gettimeofday' function returns the current calendar time as
-     the elapsed time since the epoch in the `struct timeval' structure
-     indicated by TP.  (*note Elapsed Time:: for a description of
-     `struct timeval').  Information about the time zone is returned in
-     the structure pointed at TZP.  If the TZP argument is a null
-     pointer, time zone information is ignored.
-
-     The return value is `0' on success and `-1' on failure.  The
-     following `errno' error condition is defined for this function:
-
-    `ENOSYS'
-          The operating system does not support getting time zone
-          information, and TZP is not a null pointer.  GNU systems do
-          not support using `struct timezone' to represent time zone
-          information; that is an obsolete feature of 4.3 BSD.
-          Instead, use the facilities described in *note Time Zone
-          Functions::.
-
- -- Function: int settimeofday (const struct timeval *TP, const struct
-          timezone *TZP)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `settimeofday' function sets the current calendar time in the
-     system clock according to the arguments.  As for `gettimeofday',
-     the calendar time is represented as the elapsed time since the
-     epoch.  As for `gettimeofday', time zone information is ignored if
-     TZP is a null pointer.
-
-     You must be a privileged user in order to use `settimeofday'.
-
-     Some kernels automatically set the system clock from some source
-     such as a hardware clock when they start up.  Others, including
-     Linux, place the system clock in an "invalid" state (in which
-     attempts to read the clock fail).  A call of `stime' removes the
-     system clock from an invalid state, and system startup scripts
-     typically run a program that calls `stime'.
-
-     `settimeofday' causes a sudden jump forwards or backwards, which
-     can cause a variety of problems in a system.  Use `adjtime' (below)
-     to make a smooth transition from one time to another by temporarily
-     speeding up or slowing down the clock.
-
-     With a Linux kernel, `adjtimex' does the same thing and can also
-     make permanent changes to the speed of the system clock so it
-     doesn't need to be corrected as often.
-
-     The return value is `0' on success and `-1' on failure.  The
-     following `errno' error conditions are defined for this function:
-
-    `EPERM'
-          This process cannot set the clock because it is not
-          privileged.
-
-    `ENOSYS'
-          The operating system does not support setting time zone
-          information, and TZP is not a null pointer.
-
- -- Function: int adjtime (const struct timeval *DELTA, struct timeval
-          *OLDDELTA)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function speeds up or slows down the system clock in order to
-     make a gradual adjustment.  This ensures that the calendar time
-     reported by the system clock is always monotonically increasing,
-     which might not happen if you simply set the clock.
-
-     The DELTA argument specifies a relative adjustment to be made to
-     the clock time.  If negative, the system clock is slowed down for a
-     while until it has lost this much elapsed time.  If positive, the
-     system clock is speeded up for a while.
-
-     If the OLDDELTA argument is not a null pointer, the `adjtime'
-     function returns information about any previous time adjustment
-     that has not yet completed.
-
-     This function is typically used to synchronize the clocks of
-     computers in a local network.  You must be a privileged user to
-     use it.
-
-     With a Linux kernel, you can use the `adjtimex' function to
-     permanently change the clock speed.
-
-     The return value is `0' on success and `-1' on failure.  The
-     following `errno' error condition is defined for this function:
-
-    `EPERM'
-          You do not have privilege to set the time.
-
-   *Portability Note:*  The `gettimeofday', `settimeofday', and
-`adjtime' functions are derived from BSD.
-
-   Symbols for the following function are declared in `sys/timex.h'.
-
- -- Function: int adjtimex (struct timex *TIMEX)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `adjtimex' is functionally identical to `ntp_adjtime'.  *Note High
-     Accuracy Clock::.
-
-     This function is present only with a Linux kernel.
-
+   The local namespace supports just one protocol for any communication
+style; it is protocol number '0'.
 
 
-File: libc.info,  Node: Broken-down Time,  Next: High Accuracy Clock,  Prev: High-Resolution Calendar,  Up: Calendar Time
+File: libc.info,  Node: Local Namespace Details,  Next: Local Socket Example,  Prev: Local Namespace Concepts,  Up: Local Namespace
 
-21.4.3 Broken-down Time
+16.5.2 Details of Local Namespace
+---------------------------------
+
+To create a socket in the local namespace, use the constant 'PF_LOCAL'
+as the NAMESPACE argument to 'socket' or 'socketpair'.  This constant is
+defined in 'sys/socket.h'.
+
+ -- Macro: int PF_LOCAL
+     This designates the local namespace, in which socket addresses are
+     local names, and its associated family of protocols.  'PF_Local' is
+     the macro used by Posix.1g.
+
+ -- Macro: int PF_UNIX
+     This is a synonym for 'PF_LOCAL', for compatibility's sake.
+
+ -- Macro: int PF_FILE
+     This is a synonym for 'PF_LOCAL', for compatibility's sake.
+
+   The structure for specifying socket names in the local namespace is
+defined in the header file 'sys/un.h':
+
+ -- Data Type: struct sockaddr_un
+     This structure is used to specify local namespace socket addresses.
+     It has the following members:
+
+     'short int sun_family'
+          This identifies the address family or format of the socket
+          address.  You should store the value 'AF_LOCAL' to designate
+          the local namespace.  *Note Socket Addresses::.
+
+     'char sun_path[108]'
+          This is the file name to use.
+
+          *Incomplete:* Why is 108 a magic number?  RMS suggests making
+          this a zero-length array and tweaking the following example to
+          use 'alloca' to allocate an appropriate amount of storage
+          based on the length of the filename.
+
+   You should compute the LENGTH parameter for a socket address in the
+local namespace as the sum of the size of the 'sun_family' component and
+the string length (_not_ the allocation size!)  of the file name string.
+This can be done using the macro 'SUN_LEN':
+
+ -- Macro: int SUN_LEN (_struct sockaddr_un *_ PTR)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The macro computes the length of socket address in the local
+     namespace.
+
+
+File: libc.info,  Node: Local Socket Example,  Prev: Local Namespace Details,  Up: Local Namespace
+
+16.5.3 Example of Local-Namespace Sockets
+-----------------------------------------
+
+Here is an example showing how to create and name a socket in the local
+namespace.
+
+
+     #include <stddef.h>
+     #include <stdio.h>
+     #include <errno.h>
+     #include <stdlib.h>
+     #include <string.h>
+     #include <sys/socket.h>
+     #include <sys/un.h>
+
+     int
+     make_named_socket (const char *filename)
+     {
+       struct sockaddr_un name;
+       int sock;
+       size_t size;
+
+       /* Create the socket. */
+       sock = socket (PF_LOCAL, SOCK_DGRAM, 0);
+       if (sock < 0)
+         {
+           perror ("socket");
+           exit (EXIT_FAILURE);
+         }
+
+       /* Bind a name to the socket. */
+       name.sun_family = AF_LOCAL;
+       strncpy (name.sun_path, filename, sizeof (name.sun_path));
+       name.sun_path[sizeof (name.sun_path) - 1] = '\0';
+
+       /* The size of the address is
+          the offset of the start of the filename,
+          plus its length (not including the terminating null byte).
+          Alternatively you can just do:
+          size = SUN_LEN (&name);
+      */
+       size = (offsetof (struct sockaddr_un, sun_path)
+               + strlen (name.sun_path));
+
+       if (bind (sock, (struct sockaddr *) &name, size) < 0)
+         {
+           perror ("bind");
+           exit (EXIT_FAILURE);
+         }
+
+       return sock;
+     }
+
+
+File: libc.info,  Node: Internet Namespace,  Next: Misc Namespaces,  Prev: Local Namespace,  Up: Sockets
+
+16.6 The Internet Namespace
+===========================
+
+This section describes the details of the protocols and socket naming
+conventions used in the Internet namespace.
+
+   Originally the Internet namespace used only IP version 4 (IPv4).
+With the growing number of hosts on the Internet, a new protocol with a
+larger address space was necessary: IP version 6 (IPv6).  IPv6
+introduces 128-bit addresses (IPv4 has 32-bit addresses) and other
+features, and will eventually replace IPv4.
+
+   To create a socket in the IPv4 Internet namespace, use the symbolic
+name 'PF_INET' of this namespace as the NAMESPACE argument to 'socket'
+or 'socketpair'.  For IPv6 addresses you need the macro 'PF_INET6'.
+These macros are defined in 'sys/socket.h'.
+
+ -- Macro: int PF_INET
+     This designates the IPv4 Internet namespace and associated family
+     of protocols.
+
+ -- Macro: int PF_INET6
+     This designates the IPv6 Internet namespace and associated family
+     of protocols.
+
+   A socket address for the Internet namespace includes the following
+components:
+
+   * The address of the machine you want to connect to.  Internet
+     addresses can be specified in several ways; these are discussed in
+     *note Internet Address Formats::, *note Host Addresses:: and *note
+     Host Names::.
+
+   * A port number for that machine.  *Note Ports::.
+
+   You must ensure that the address and port number are represented in a
+canonical format called "network byte order".  *Note Byte Order::, for
+information about this.
+
+* Menu:
+
+* Internet Address Formats::    How socket addresses are specified in the
+                                 Internet namespace.
+* Host Addresses::	        All about host addresses of Internet host.
+* Ports::			Internet port numbers.
+* Services Database::           Ports may have symbolic names.
+* Byte Order::		        Different hosts may use different byte
+                                 ordering conventions; you need to
+                                 canonicalize host address and port number.
+* Protocols Database::		Referring to protocols by name.
+* Inet Example::	        Putting it all together.
+
+
+File: libc.info,  Node: Internet Address Formats,  Next: Host Addresses,  Up: Internet Namespace
+
+16.6.1 Internet Socket Address Formats
+--------------------------------------
+
+In the Internet namespace, for both IPv4 ('AF_INET') and IPv6
+('AF_INET6'), a socket address consists of a host address and a port on
+that host.  In addition, the protocol you choose serves effectively as a
+part of the address because local port numbers are meaningful only
+within a particular protocol.
+
+   The data types for representing socket addresses in the Internet
+namespace are defined in the header file 'netinet/in.h'.
+
+ -- Data Type: struct sockaddr_in
+     This is the data type used to represent socket addresses in the
+     Internet namespace.  It has the following members:
+
+     'sa_family_t sin_family'
+          This identifies the address family or format of the socket
+          address.  You should store the value 'AF_INET' in this member.
+          *Note Socket Addresses::.
+
+     'struct in_addr sin_addr'
+          This is the Internet address of the host machine.  *Note Host
+          Addresses::, and *note Host Names::, for how to get a value to
+          store here.
+
+     'unsigned short int sin_port'
+          This is the port number.  *Note Ports::.
+
+   When you call 'bind' or 'getsockname', you should specify 'sizeof
+(struct sockaddr_in)' as the LENGTH parameter if you are using an IPv4
+Internet namespace socket address.
+
+ -- Data Type: struct sockaddr_in6
+     This is the data type used to represent socket addresses in the
+     IPv6 namespace.  It has the following members:
+
+     'sa_family_t sin6_family'
+          This identifies the address family or format of the socket
+          address.  You should store the value of 'AF_INET6' in this
+          member.  *Note Socket Addresses::.
+
+     'struct in6_addr sin6_addr'
+          This is the IPv6 address of the host machine.  *Note Host
+          Addresses::, and *note Host Names::, for how to get a value to
+          store here.
+
+     'uint32_t sin6_flowinfo'
+          This is a currently unimplemented field.
+
+     'uint16_t sin6_port'
+          This is the port number.  *Note Ports::.
+
+
+File: libc.info,  Node: Host Addresses,  Next: Ports,  Prev: Internet Address Formats,  Up: Internet Namespace
+
+16.6.2 Host Addresses
+---------------------
+
+Each computer on the Internet has one or more "Internet addresses",
+numbers which identify that computer among all those on the Internet.
+Users typically write IPv4 numeric host addresses as sequences of four
+numbers, separated by periods, as in '128.52.46.32', and IPv6 numeric
+host addresses as sequences of up to eight numbers separated by colons,
+as in '5f03:1200:836f:c100::1'.
+
+   Each computer also has one or more "host names", which are strings of
+words separated by periods, as in 'www.gnu.org'.
+
+   Programs that let the user specify a host typically accept both
+numeric addresses and host names.  To open a connection a program needs
+a numeric address, and so must convert a host name to the numeric
+address it stands for.
+
+* Menu:
+
+* Abstract Host Addresses::	What a host number consists of.
+* Data type: Host Address Data Type.	Data type for a host number.
+* Functions: Host Address Functions.	Functions to operate on them.
+* Names: Host Names.		Translating host names to host numbers.
+
+
+File: libc.info,  Node: Abstract Host Addresses,  Next: Host Address Data Type,  Up: Host Addresses
+
+16.6.2.1 Internet Host Addresses
+................................
+
+Each computer on the Internet has one or more Internet addresses,
+numbers which identify that computer among all those on the Internet.
+
+   An IPv4 Internet host address is a number containing four bytes of
+data.  Historically these are divided into two parts, a "network number"
+and a "local network address number" within that network.  In the
+mid-1990s classless addresses were introduced which changed this
+behavior.  Since some functions implicitly expect the old definitions,
+we first describe the class-based network and will then describe
+classless addresses.  IPv6 uses only classless addresses and therefore
+the following paragraphs don't apply.
+
+   The class-based IPv4 network number consists of the first one, two or
+three bytes; the rest of the bytes are the local address.
+
+   IPv4 network numbers are registered with the Network Information
+Center (NIC), and are divided into three classes--A, B and C. The local
+network address numbers of individual machines are registered with the
+administrator of the particular network.
+
+   Class A networks have single-byte numbers in the range 0 to 127.
+There are only a small number of Class A networks, but they can each
+support a very large number of hosts.  Medium-sized Class B networks
+have two-byte network numbers, with the first byte in the range 128 to
+191.  Class C networks are the smallest; they have three-byte network
+numbers, with the first byte in the range 192-255.  Thus, the first 1,
+2, or 3 bytes of an Internet address specify a network.  The remaining
+bytes of the Internet address specify the address within that network.
+
+   The Class A network 0 is reserved for broadcast to all networks.  In
+addition, the host number 0 within each network is reserved for
+broadcast to all hosts in that network.  These uses are obsolete now but
+for compatibility reasons you shouldn't use network 0 and host number 0.
+
+   The Class A network 127 is reserved for loopback; you can always use
+the Internet address '127.0.0.1' to refer to the host machine.
+
+   Since a single machine can be a member of multiple networks, it can
+have multiple Internet host addresses.  However, there is never supposed
+to be more than one machine with the same host address.
+
+   There are four forms of the "standard numbers-and-dots notation" for
+Internet addresses:
+
+'A.B.C.D'
+     This specifies all four bytes of the address individually and is
+     the commonly used representation.
+
+'A.B.C'
+     The last part of the address, C, is interpreted as a 2-byte
+     quantity.  This is useful for specifying host addresses in a Class
+     B network with network address number 'A.B'.
+
+'A.B'
+     The last part of the address, B, is interpreted as a 3-byte
+     quantity.  This is useful for specifying host addresses in a Class
+     A network with network address number A.
+
+'A'
+     If only one part is given, this corresponds directly to the host
+     address number.
+
+   Within each part of the address, the usual C conventions for
+specifying the radix apply.  In other words, a leading '0x' or '0X'
+implies hexadecimal radix; a leading '0' implies octal; and otherwise
+decimal radix is assumed.
+
+Classless Addresses
+...................
+
+IPv4 addresses (and IPv6 addresses also) are now considered classless;
+the distinction between classes A, B and C can be ignored.  Instead an
+IPv4 host address consists of a 32-bit address and a 32-bit mask.  The
+mask contains set bits for the network part and cleared bits for the
+host part.  The network part is contiguous from the left, with the
+remaining bits representing the host.  As a consequence, the netmask can
+simply be specified as the number of set bits.  Classes A, B and C are
+just special cases of this general rule.  For example, class A addresses
+have a netmask of '255.0.0.0' or a prefix length of 8.
+
+   Classless IPv4 network addresses are written in numbers-and-dots
+notation with the prefix length appended and a slash as separator.  For
+example the class A network 10 is written as '10.0.0.0/8'.
+
+IPv6 Addresses
+..............
+
+IPv6 addresses contain 128 bits (IPv4 has 32 bits) of data.  A host
+address is usually written as eight 16-bit hexadecimal numbers that are
+separated by colons.  Two colons are used to abbreviate strings of
+consecutive zeros.  For example, the IPv6 loopback address
+'0:0:0:0:0:0:0:1' can just be written as '::1'.
+
+
+File: libc.info,  Node: Host Address Data Type,  Next: Host Address Functions,  Prev: Abstract Host Addresses,  Up: Host Addresses
+
+16.6.2.2 Host Address Data Type
+...............................
+
+IPv4 Internet host addresses are represented in some contexts as
+integers (type 'uint32_t').  In other contexts, the integer is packaged
+inside a structure of type 'struct in_addr'.  It would be better if the
+usage were made consistent, but it is not hard to extract the integer
+from the structure or put the integer into a structure.
+
+   You will find older code that uses 'unsigned long int' for IPv4
+Internet host addresses instead of 'uint32_t' or 'struct in_addr'.
+Historically 'unsigned long int' was a 32-bit number but with 64-bit
+machines this has changed.  Using 'unsigned long int' might break the
+code if it is used on machines where this type doesn't have 32 bits.
+'uint32_t' is specified by Unix98 and guaranteed to have 32 bits.
+
+   IPv6 Internet host addresses have 128 bits and are packaged inside a
+structure of type 'struct in6_addr'.
+
+   The following basic definitions for Internet addresses are declared
+in the header file 'netinet/in.h':
+
+ -- Data Type: struct in_addr
+     This data type is used in certain contexts to contain an IPv4
+     Internet host address.  It has just one field, named 's_addr',
+     which records the host address number as an 'uint32_t'.
+
+ -- Macro: uint32_t INADDR_LOOPBACK
+     You can use this constant to stand for "the address of this
+     machine," instead of finding its actual address.  It is the IPv4
+     Internet address '127.0.0.1', which is usually called 'localhost'.
+     This special constant saves you the trouble of looking up the
+     address of your own machine.  Also, the system usually implements
+     'INADDR_LOOPBACK' specially, avoiding any network traffic for the
+     case of one machine talking to itself.
+
+ -- Macro: uint32_t INADDR_ANY
+     You can use this constant to stand for "any incoming address" when
+     binding to an address.  *Note Setting Address::.  This is the usual
+     address to give in the 'sin_addr' member of 'struct sockaddr_in'
+     when you want to accept Internet connections.
+
+ -- Macro: uint32_t INADDR_BROADCAST
+     This constant is the address you use to send a broadcast message.
+
+ -- Macro: uint32_t INADDR_NONE
+     This constant is returned by some functions to indicate an error.
+
+ -- Data Type: struct in6_addr
+     This data type is used to store an IPv6 address.  It stores 128
+     bits of data, which can be accessed (via a union) in a variety of
+     ways.
+
+ -- Constant: struct in6_addr in6addr_loopback
+     This constant is the IPv6 address '::1', the loopback address.  See
+     above for a description of what this means.  The macro
+     'IN6ADDR_LOOPBACK_INIT' is provided to allow you to initialize your
+     own variables to this value.
+
+ -- Constant: struct in6_addr in6addr_any
+     This constant is the IPv6 address '::', the unspecified address.
+     See above for a description of what this means.  The macro
+     'IN6ADDR_ANY_INIT' is provided to allow you to initialize your own
+     variables to this value.
+
+
+File: libc.info,  Node: Host Address Functions,  Next: Host Names,  Prev: Host Address Data Type,  Up: Host Addresses
+
+16.6.2.3 Host Address Functions
+...............................
+
+These additional functions for manipulating Internet addresses are
+declared in the header file 'arpa/inet.h'.  They represent Internet
+addresses in network byte order, and network numbers and
+local-address-within-network numbers in host byte order.  *Note Byte
+Order::, for an explanation of network and host byte order.
+
+ -- Function: int inet_aton (const char *NAME, struct in_addr *ADDR)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     This function converts the IPv4 Internet host address NAME from the
+     standard numbers-and-dots notation into binary data and stores it
+     in the 'struct in_addr' that ADDR points to.  'inet_aton' returns
+     nonzero if the address is valid, zero if not.
+
+ -- Function: uint32_t inet_addr (const char *NAME)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     This function converts the IPv4 Internet host address NAME from the
+     standard numbers-and-dots notation into binary data.  If the input
+     is not valid, 'inet_addr' returns 'INADDR_NONE'.  This is an
+     obsolete interface to 'inet_aton', described immediately above.  It
+     is obsolete because 'INADDR_NONE' is a valid address
+     (255.255.255.255), and 'inet_aton' provides a cleaner way to
+     indicate error return.
+
+ -- Function: uint32_t inet_network (const char *NAME)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     This function extracts the network number from the address NAME,
+     given in the standard numbers-and-dots notation.  The returned
+     address is in host order.  If the input is not valid,
+     'inet_network' returns '-1'.
+
+     The function works only with traditional IPv4 class A, B and C
+     network types.  It doesn't work with classless addresses and
+     shouldn't be used anymore.
+
+ -- Function: char * inet_ntoa (struct in_addr ADDR)
+     Preliminary: | MT-Safe locale | AS-Unsafe race | AC-Safe | *Note
+     POSIX Safety Concepts::.
+
+     This function converts the IPv4 Internet host address ADDR to a
+     string in the standard numbers-and-dots notation.  The return value
+     is a pointer into a statically-allocated buffer.  Subsequent calls
+     will overwrite the same buffer, so you should copy the string if
+     you need to save it.
+
+     In multi-threaded programs each thread has an own
+     statically-allocated buffer.  But still subsequent calls of
+     'inet_ntoa' in the same thread will overwrite the result of the
+     last call.
+
+     Instead of 'inet_ntoa' the newer function 'inet_ntop' which is
+     described below should be used since it handles both IPv4 and IPv6
+     addresses.
+
+ -- Function: struct in_addr inet_makeaddr (uint32_t NET, uint32_t
+          LOCAL)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function makes an IPv4 Internet host address by combining the
+     network number NET with the local-address-within-network number
+     LOCAL.
+
+ -- Function: uint32_t inet_lnaof (struct in_addr ADDR)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function returns the local-address-within-network part of the
+     Internet host address ADDR.
+
+     The function works only with traditional IPv4 class A, B and C
+     network types.  It doesn't work with classless addresses and
+     shouldn't be used anymore.
+
+ -- Function: uint32_t inet_netof (struct in_addr ADDR)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function returns the network number part of the Internet host
+     address ADDR.
+
+     The function works only with traditional IPv4 class A, B and C
+     network types.  It doesn't work with classless addresses and
+     shouldn't be used anymore.
+
+ -- Function: int inet_pton (int AF, const char *CP, void *BUF)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     This function converts an Internet address (either IPv4 or IPv6)
+     from presentation (textual) to network (binary) format.  AF should
+     be either 'AF_INET' or 'AF_INET6', as appropriate for the type of
+     address being converted.  CP is a pointer to the input string, and
+     BUF is a pointer to a buffer for the result.  It is the caller's
+     responsibility to make sure the buffer is large enough.
+
+ -- Function: const char * inet_ntop (int AF, const void *CP, char *BUF,
+          socklen_t LEN)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     This function converts an Internet address (either IPv4 or IPv6)
+     from network (binary) to presentation (textual) form.  AF should be
+     either 'AF_INET' or 'AF_INET6', as appropriate.  CP is a pointer to
+     the address to be converted.  BUF should be a pointer to a buffer
+     to hold the result, and LEN is the length of this buffer.  The
+     return value from the function will be this buffer address.
+
+
+File: libc.info,  Node: Host Names,  Prev: Host Address Functions,  Up: Host Addresses
+
+16.6.2.4 Host Names
+...................
+
+Besides the standard numbers-and-dots notation for Internet addresses,
+you can also refer to a host by a symbolic name.  The advantage of a
+symbolic name is that it is usually easier to remember.  For example,
+the machine with Internet address '158.121.106.19' is also known as
+'alpha.gnu.org'; and other machines in the 'gnu.org' domain can refer to
+it simply as 'alpha'.
+
+   Internally, the system uses a database to keep track of the mapping
+between host names and host numbers.  This database is usually either
+the file '/etc/hosts' or an equivalent provided by a name server.  The
+functions and other symbols for accessing this database are declared in
+'netdb.h'.  They are BSD features, defined unconditionally if you
+include 'netdb.h'.
+
+ -- Data Type: struct hostent
+     This data type is used to represent an entry in the hosts database.
+     It has the following members:
+
+     'char *h_name'
+          This is the "official" name of the host.
+
+     'char **h_aliases'
+          These are alternative names for the host, represented as a
+          null-terminated vector of strings.
+
+     'int h_addrtype'
+          This is the host address type; in practice, its value is
+          always either 'AF_INET' or 'AF_INET6', with the latter being
+          used for IPv6 hosts.  In principle other kinds of addresses
+          could be represented in the database as well as Internet
+          addresses; if this were done, you might find a value in this
+          field other than 'AF_INET' or 'AF_INET6'.  *Note Socket
+          Addresses::.
+
+     'int h_length'
+          This is the length, in bytes, of each address.
+
+     'char **h_addr_list'
+          This is the vector of addresses for the host.  (Recall that
+          the host might be connected to multiple networks and have
+          different addresses on each one.)  The vector is terminated by
+          a null pointer.
+
+     'char *h_addr'
+          This is a synonym for 'h_addr_list[0]'; in other words, it is
+          the first host address.
+
+   As far as the host database is concerned, each address is just a
+block of memory 'h_length' bytes long.  But in other contexts there is
+an implicit assumption that you can convert IPv4 addresses to a 'struct
+in_addr' or an 'uint32_t'.  Host addresses in a 'struct hostent'
+structure are always given in network byte order; see *note Byte
+Order::.
+
+   You can use 'gethostbyname', 'gethostbyname2' or 'gethostbyaddr' to
+search the hosts database for information about a particular host.  The
+information is returned in a statically-allocated structure; you must
+copy the information if you need to save it across calls.  You can also
+use 'getaddrinfo' and 'getnameinfo' to obtain this information.
+
+ -- Function: struct hostent * gethostbyname (const char *NAME)
+     Preliminary: | MT-Unsafe race:hostbyname env locale | AS-Unsafe
+     dlopen plugin corrupt heap lock | AC-Unsafe lock corrupt mem fd |
+     *Note POSIX Safety Concepts::.
+
+     The 'gethostbyname' function returns information about the host
+     named NAME.  If the lookup fails, it returns a null pointer.
+
+ -- Function: struct hostent * gethostbyname2 (const char *NAME, int AF)
+     Preliminary: | MT-Unsafe race:hostbyname2 env locale | AS-Unsafe
+     dlopen plugin corrupt heap lock | AC-Unsafe lock corrupt mem fd |
+     *Note POSIX Safety Concepts::.
+
+     The 'gethostbyname2' function is like 'gethostbyname', but allows
+     the caller to specify the desired address family (e.g. 'AF_INET' or
+     'AF_INET6') of the result.
+
+ -- Function: struct hostent * gethostbyaddr (const void *ADDR,
+          socklen_t LENGTH, int FORMAT)
+     Preliminary: | MT-Unsafe race:hostbyaddr env locale | AS-Unsafe
+     dlopen plugin corrupt heap lock | AC-Unsafe lock corrupt mem fd |
+     *Note POSIX Safety Concepts::.
+
+     The 'gethostbyaddr' function returns information about the host
+     with Internet address ADDR.  The parameter ADDR is not really a
+     pointer to char - it can be a pointer to an IPv4 or an IPv6
+     address.  The LENGTH argument is the size (in bytes) of the address
+     at ADDR.  FORMAT specifies the address format; for an IPv4 Internet
+     address, specify a value of 'AF_INET'; for an IPv6 Internet
+     address, use 'AF_INET6'.
+
+     If the lookup fails, 'gethostbyaddr' returns a null pointer.
+
+   If the name lookup by 'gethostbyname' or 'gethostbyaddr' fails, you
+can find out the reason by looking at the value of the variable
+'h_errno'.  (It would be cleaner design for these functions to set
+'errno', but use of 'h_errno' is compatible with other systems.)
+
+   Here are the error codes that you may find in 'h_errno':
+
+'HOST_NOT_FOUND'
+     No such host is known in the database.
+
+'TRY_AGAIN'
+     This condition happens when the name server could not be contacted.
+     If you try again later, you may succeed then.
+
+'NO_RECOVERY'
+     A non-recoverable error occurred.
+
+'NO_ADDRESS'
+     The host database contains an entry for the name, but it doesn't
+     have an associated Internet address.
+
+   The lookup functions above all have one in common: they are not
+reentrant and therefore unusable in multi-threaded applications.
+Therefore provides the GNU C Library a new set of functions which can be
+used in this context.
+
+ -- Function: int gethostbyname_r (const char *restrict NAME, struct
+          hostent *restrict RESULT_BUF, char *restrict BUF, size_t
+          BUFLEN, struct hostent **restrict RESULT, int *restrict
+          H_ERRNOP)
+     Preliminary: | MT-Safe env locale | AS-Unsafe dlopen plugin corrupt
+     heap lock | AC-Unsafe lock corrupt mem fd | *Note POSIX Safety
+     Concepts::.
+
+     The 'gethostbyname_r' function returns information about the host
+     named NAME.  The caller must pass a pointer to an object of type
+     'struct hostent' in the RESULT_BUF parameter.  In addition the
+     function may need extra buffer space and the caller must pass an
+     pointer and the size of the buffer in the BUF and BUFLEN
+     parameters.
+
+     A pointer to the buffer, in which the result is stored, is
+     available in '*RESULT' after the function call successfully
+     returned.  The buffer passed as the BUF parameter can be freed only
+     once the caller has finished with the result hostent struct, or has
+     copied it including all the other memory that it points to.  If an
+     error occurs or if no entry is found, the pointer '*RESULT' is a
+     null pointer.  Success is signalled by a zero return value.  If the
+     function failed the return value is an error number.  In addition
+     to the errors defined for 'gethostbyname' it can also be 'ERANGE'.
+     In this case the call should be repeated with a larger buffer.
+     Additional error information is not stored in the global variable
+     'h_errno' but instead in the object pointed to by H_ERRNOP.
+
+     Here's a small example:
+          struct hostent *
+          gethostname (char *host)
+          {
+            struct hostent *hostbuf, *hp;
+            size_t hstbuflen;
+            char *tmphstbuf;
+            int res;
+            int herr;
+
+            hostbuf = malloc (sizeof (struct hostent));
+            hstbuflen = 1024;
+            tmphstbuf = malloc (hstbuflen);
+
+            while ((res = gethostbyname_r (host, hostbuf, tmphstbuf, hstbuflen,
+                                           &hp, &herr)) == ERANGE)
+              {
+                /* Enlarge the buffer.  */
+                hstbuflen *= 2;
+                tmphstbuf = realloc (tmphstbuf, hstbuflen);
+              }
+
+            free (tmphstbuf);
+            /*  Check for errors.  */
+            if (res || hp == NULL)
+              return NULL;
+            return hp;
+          }
+
+ -- Function: int gethostbyname2_r (const char *NAME, int AF, struct
+          hostent *restrict RESULT_BUF, char *restrict BUF, size_t
+          BUFLEN, struct hostent **restrict RESULT, int *restrict
+          H_ERRNOP)
+     Preliminary: | MT-Safe env locale | AS-Unsafe dlopen plugin corrupt
+     heap lock | AC-Unsafe lock corrupt mem fd | *Note POSIX Safety
+     Concepts::.
+
+     The 'gethostbyname2_r' function is like 'gethostbyname_r', but
+     allows the caller to specify the desired address family (e.g.
+     'AF_INET' or 'AF_INET6') for the result.
+
+ -- Function: int gethostbyaddr_r (const void *ADDR, socklen_t LENGTH,
+          int FORMAT, struct hostent *restrict RESULT_BUF, char
+          *restrict BUF, size_t BUFLEN, struct hostent **restrict
+          RESULT, int *restrict H_ERRNOP)
+     Preliminary: | MT-Safe env locale | AS-Unsafe dlopen plugin corrupt
+     heap lock | AC-Unsafe lock corrupt mem fd | *Note POSIX Safety
+     Concepts::.
+
+     The 'gethostbyaddr_r' function returns information about the host
+     with Internet address ADDR.  The parameter ADDR is not really a
+     pointer to char - it can be a pointer to an IPv4 or an IPv6
+     address.  The LENGTH argument is the size (in bytes) of the address
+     at ADDR.  FORMAT specifies the address format; for an IPv4 Internet
+     address, specify a value of 'AF_INET'; for an IPv6 Internet
+     address, use 'AF_INET6'.
+
+     Similar to the 'gethostbyname_r' function, the caller must provide
+     buffers for the result and memory used internally.  In case of
+     success the function returns zero.  Otherwise the value is an error
+     number where 'ERANGE' has the special meaning that the
+     caller-provided buffer is too small.
+
+   You can also scan the entire hosts database one entry at a time using
+'sethostent', 'gethostent' and 'endhostent'.  Be careful when using
+these functions because they are not reentrant.
+
+ -- Function: void sethostent (int STAYOPEN)
+     Preliminary: | MT-Unsafe race:hostent env locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     This function opens the hosts database to begin scanning it.  You
+     can then call 'gethostent' to read the entries.
+
+     If the STAYOPEN argument is nonzero, this sets a flag so that
+     subsequent calls to 'gethostbyname' or 'gethostbyaddr' will not
+     close the database (as they usually would).  This makes for more
+     efficiency if you call those functions several times, by avoiding
+     reopening the database for each call.
+
+ -- Function: struct hostent * gethostent (void)
+     Preliminary: | MT-Unsafe race:hostent race:hostentbuf env locale |
+     AS-Unsafe dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem |
+     *Note POSIX Safety Concepts::.
+
+     This function returns the next entry in the hosts database.  It
+     returns a null pointer if there are no more entries.
+
+ -- Function: void endhostent (void)
+     Preliminary: | MT-Unsafe race:hostent env locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     This function closes the hosts database.
+
+
+File: libc.info,  Node: Ports,  Next: Services Database,  Prev: Host Addresses,  Up: Internet Namespace
+
+16.6.3 Internet Ports
+---------------------
+
+A socket address in the Internet namespace consists of a machine's
+Internet address plus a "port number" which distinguishes the sockets on
+a given machine (for a given protocol).  Port numbers range from 0 to
+65,535.
+
+   Port numbers less than 'IPPORT_RESERVED' are reserved for standard
+servers, such as 'finger' and 'telnet'.  There is a database that keeps
+track of these, and you can use the 'getservbyname' function to map a
+service name onto a port number; see *note Services Database::.
+
+   If you write a server that is not one of the standard ones defined in
+the database, you must choose a port number for it.  Use a number
+greater than 'IPPORT_USERRESERVED'; such numbers are reserved for
+servers and won't ever be generated automatically by the system.
+Avoiding conflicts with servers being run by other users is up to you.
+
+   When you use a socket without specifying its address, the system
+generates a port number for it.  This number is between
+'IPPORT_RESERVED' and 'IPPORT_USERRESERVED'.
+
+   On the Internet, it is actually legitimate to have two different
+sockets with the same port number, as long as they never both try to
+communicate with the same socket address (host address plus port
+number).  You shouldn't duplicate a port number except in special
+circumstances where a higher-level protocol requires it.  Normally, the
+system won't let you do it; 'bind' normally insists on distinct port
+numbers.  To reuse a port number, you must set the socket option
+'SO_REUSEADDR'.  *Note Socket-Level Options::.
+
+   These macros are defined in the header file 'netinet/in.h'.
+
+ -- Macro: int IPPORT_RESERVED
+     Port numbers less than 'IPPORT_RESERVED' are reserved for superuser
+     use.
+
+ -- Macro: int IPPORT_USERRESERVED
+     Port numbers greater than or equal to 'IPPORT_USERRESERVED' are
+     reserved for explicit use; they will never be allocated
+     automatically.
+
+
+File: libc.info,  Node: Services Database,  Next: Byte Order,  Prev: Ports,  Up: Internet Namespace
+
+16.6.4 The Services Database
+----------------------------
+
+The database that keeps track of "well-known" services is usually either
+the file '/etc/services' or an equivalent from a name server.  You can
+use these utilities, declared in 'netdb.h', to access the services
+database.
+
+ -- Data Type: struct servent
+     This data type holds information about entries from the services
+     database.  It has the following members:
+
+     'char *s_name'
+          This is the "official" name of the service.
+
+     'char **s_aliases'
+          These are alternate names for the service, represented as an
+          array of strings.  A null pointer terminates the array.
+
+     'int s_port'
+          This is the port number for the service.  Port numbers are
+          given in network byte order; see *note Byte Order::.
+
+     'char *s_proto'
+          This is the name of the protocol to use with this service.
+          *Note Protocols Database::.
+
+   To get information about a particular service, use the
+'getservbyname' or 'getservbyport' functions.  The information is
+returned in a statically-allocated structure; you must copy the
+information if you need to save it across calls.
+
+ -- Function: struct servent * getservbyname (const char *NAME, const
+          char *PROTO)
+     Preliminary: | MT-Unsafe race:servbyname locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     The 'getservbyname' function returns information about the service
+     named NAME using protocol PROTO.  If it can't find such a service,
+     it returns a null pointer.
+
+     This function is useful for servers as well as for clients; servers
+     use it to determine which port they should listen on (*note
+     Listening::).
+
+ -- Function: struct servent * getservbyport (int PORT, const char
+          *PROTO)
+     Preliminary: | MT-Unsafe race:servbyport locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     The 'getservbyport' function returns information about the service
+     at port PORT using protocol PROTO.  If it can't find such a
+     service, it returns a null pointer.
+
+You can also scan the services database using 'setservent', 'getservent'
+and 'endservent'.  Be careful when using these functions because they
+are not reentrant.
+
+ -- Function: void setservent (int STAYOPEN)
+     Preliminary: | MT-Unsafe race:servent locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     This function opens the services database to begin scanning it.
+
+     If the STAYOPEN argument is nonzero, this sets a flag so that
+     subsequent calls to 'getservbyname' or 'getservbyport' will not
+     close the database (as they usually would).  This makes for more
+     efficiency if you call those functions several times, by avoiding
+     reopening the database for each call.
+
+ -- Function: struct servent * getservent (void)
+     Preliminary: | MT-Unsafe race:servent race:serventbuf locale |
+     AS-Unsafe dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem |
+     *Note POSIX Safety Concepts::.
+
+     This function returns the next entry in the services database.  If
+     there are no more entries, it returns a null pointer.
+
+ -- Function: void endservent (void)
+     Preliminary: | MT-Unsafe race:servent locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     This function closes the services database.
+
+
+File: libc.info,  Node: Byte Order,  Next: Protocols Database,  Prev: Services Database,  Up: Internet Namespace
+
+16.6.5 Byte Order Conversion
+----------------------------
+
+Different kinds of computers use different conventions for the ordering
+of bytes within a word.  Some computers put the most significant byte
+within a word first (this is called "big-endian" order), and others put
+it last ("little-endian" order).
+
+   So that machines with different byte order conventions can
+communicate, the Internet protocols specify a canonical byte order
+convention for data transmitted over the network.  This is known as
+"network byte order".
+
+   When establishing an Internet socket connection, you must make sure
+that the data in the 'sin_port' and 'sin_addr' members of the
+'sockaddr_in' structure are represented in network byte order.  If you
+are encoding integer data in the messages sent through the socket, you
+should convert this to network byte order too.  If you don't do this,
+your program may fail when running on or talking to other kinds of
+machines.
+
+   If you use 'getservbyname' and 'gethostbyname' or 'inet_addr' to get
+the port number and host address, the values are already in network byte
+order, and you can copy them directly into the 'sockaddr_in' structure.
+
+   Otherwise, you have to convert the values explicitly.  Use 'htons'
+and 'ntohs' to convert values for the 'sin_port' member.  Use 'htonl'
+and 'ntohl' to convert IPv4 addresses for the 'sin_addr' member.
+(Remember, 'struct in_addr' is equivalent to 'uint32_t'.)  These
+functions are declared in 'netinet/in.h'.
+
+ -- Function: uint16_t htons (uint16_t HOSTSHORT)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function converts the 'uint16_t' integer HOSTSHORT from host
+     byte order to network byte order.
+
+ -- Function: uint16_t ntohs (uint16_t NETSHORT)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function converts the 'uint16_t' integer NETSHORT from network
+     byte order to host byte order.
+
+ -- Function: uint32_t htonl (uint32_t HOSTLONG)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function converts the 'uint32_t' integer HOSTLONG from host
+     byte order to network byte order.
+
+     This is used for IPv4 Internet addresses.
+
+ -- Function: uint32_t ntohl (uint32_t NETLONG)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function converts the 'uint32_t' integer NETLONG from network
+     byte order to host byte order.
+
+     This is used for IPv4 Internet addresses.
+
+
+File: libc.info,  Node: Protocols Database,  Next: Inet Example,  Prev: Byte Order,  Up: Internet Namespace
+
+16.6.6 Protocols Database
+-------------------------
+
+The communications protocol used with a socket controls low-level
+details of how data are exchanged.  For example, the protocol implements
+things like checksums to detect errors in transmissions, and routing
+instructions for messages.  Normal user programs have little reason to
+mess with these details directly.
+
+   The default communications protocol for the Internet namespace
+depends on the communication style.  For stream communication, the
+default is TCP ("transmission control protocol").  For datagram
+communication, the default is UDP ("user datagram protocol").  For
+reliable datagram communication, the default is RDP ("reliable datagram
+protocol").  You should nearly always use the default.
+
+   Internet protocols are generally specified by a name instead of a
+number.  The network protocols that a host knows about are stored in a
+database.  This is usually either derived from the file
+'/etc/protocols', or it may be an equivalent provided by a name server.
+You look up the protocol number associated with a named protocol in the
+database using the 'getprotobyname' function.
+
+   Here are detailed descriptions of the utilities for accessing the
+protocols database.  These are declared in 'netdb.h'.
+
+ -- Data Type: struct protoent
+     This data type is used to represent entries in the network
+     protocols database.  It has the following members:
+
+     'char *p_name'
+          This is the official name of the protocol.
+
+     'char **p_aliases'
+          These are alternate names for the protocol, specified as an
+          array of strings.  The last element of the array is a null
+          pointer.
+
+     'int p_proto'
+          This is the protocol number (in host byte order); use this
+          member as the PROTOCOL argument to 'socket'.
+
+   You can use 'getprotobyname' and 'getprotobynumber' to search the
+protocols database for a specific protocol.  The information is returned
+in a statically-allocated structure; you must copy the information if
+you need to save it across calls.
+
+ -- Function: struct protoent * getprotobyname (const char *NAME)
+     Preliminary: | MT-Unsafe race:protobyname locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     The 'getprotobyname' function returns information about the network
+     protocol named NAME.  If there is no such protocol, it returns a
+     null pointer.
+
+ -- Function: struct protoent * getprotobynumber (int PROTOCOL)
+     Preliminary: | MT-Unsafe race:protobynumber locale | AS-Unsafe
+     dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note
+     POSIX Safety Concepts::.
+
+     The 'getprotobynumber' function returns information about the
+     network protocol with number PROTOCOL.  If there is no such
+     protocol, it returns a null pointer.
+
+   You can also scan the whole protocols database one protocol at a time
+by using 'setprotoent', 'getprotoent' and 'endprotoent'.  Be careful
+when using these functions because they are not reentrant.
+
+ -- Function: void setprotoent (int STAYOPEN)
+     Preliminary: | MT-Unsafe race:protoent locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     This function opens the protocols database to begin scanning it.
+
+     If the STAYOPEN argument is nonzero, this sets a flag so that
+     subsequent calls to 'getprotobyname' or 'getprotobynumber' will not
+     close the database (as they usually would).  This makes for more
+     efficiency if you call those functions several times, by avoiding
+     reopening the database for each call.
+
+ -- Function: struct protoent * getprotoent (void)
+     Preliminary: | MT-Unsafe race:protoent race:protoentbuf locale |
+     AS-Unsafe dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem |
+     *Note POSIX Safety Concepts::.
+
+     This function returns the next entry in the protocols database.  It
+     returns a null pointer if there are no more entries.
+
+ -- Function: void endprotoent (void)
+     Preliminary: | MT-Unsafe race:protoent locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     This function closes the protocols database.
+
+
+File: libc.info,  Node: Inet Example,  Prev: Protocols Database,  Up: Internet Namespace
+
+16.6.7 Internet Socket Example
+------------------------------
+
+Here is an example showing how to create and name a socket in the
+Internet namespace.  The newly created socket exists on the machine that
+the program is running on.  Rather than finding and using the machine's
+Internet address, this example specifies 'INADDR_ANY' as the host
+address; the system replaces that with the machine's actual address.
+
+
+     #include <stdio.h>
+     #include <stdlib.h>
+     #include <sys/socket.h>
+     #include <netinet/in.h>
+
+     int
+     make_socket (uint16_t port)
+     {
+       int sock;
+       struct sockaddr_in name;
+
+       /* Create the socket. */
+       sock = socket (PF_INET, SOCK_STREAM, 0);
+       if (sock < 0)
+         {
+           perror ("socket");
+           exit (EXIT_FAILURE);
+         }
+
+       /* Give the socket a name. */
+       name.sin_family = AF_INET;
+       name.sin_port = htons (port);
+       name.sin_addr.s_addr = htonl (INADDR_ANY);
+       if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0)
+         {
+           perror ("bind");
+           exit (EXIT_FAILURE);
+         }
+
+       return sock;
+     }
+
+   Here is another example, showing how you can fill in a 'sockaddr_in'
+structure, given a host name string and a port number:
+
+
+     #include <stdio.h>
+     #include <stdlib.h>
+     #include <sys/socket.h>
+     #include <netinet/in.h>
+     #include <netdb.h>
+
+     void
+     init_sockaddr (struct sockaddr_in *name,
+                    const char *hostname,
+                    uint16_t port)
+     {
+       struct hostent *hostinfo;
+
+       name->sin_family = AF_INET;
+       name->sin_port = htons (port);
+       hostinfo = gethostbyname (hostname);
+       if (hostinfo == NULL)
+         {
+           fprintf (stderr, "Unknown host %s.\n", hostname);
+           exit (EXIT_FAILURE);
+         }
+       name->sin_addr = *(struct in_addr *) hostinfo->h_addr;
+     }
+
+
+File: libc.info,  Node: Misc Namespaces,  Next: Open/Close Sockets,  Prev: Internet Namespace,  Up: Sockets
+
+16.7 Other Namespaces
+=====================
+
+Certain other namespaces and associated protocol families are supported
+but not documented yet because they are not often used.  'PF_NS' refers
+to the Xerox Network Software protocols.  'PF_ISO' stands for Open
+Systems Interconnect.  'PF_CCITT' refers to protocols from CCITT.
+'socket.h' defines these symbols and others naming protocols not
+actually implemented.
+
+   'PF_IMPLINK' is used for communicating between hosts and Internet
+Message Processors.  For information on this and 'PF_ROUTE', an
+occasionally-used local area routing protocol, see the GNU Hurd Manual
+(to appear in the future).
+
+
+File: libc.info,  Node: Open/Close Sockets,  Next: Connections,  Prev: Misc Namespaces,  Up: Sockets
+
+16.8 Opening and Closing Sockets
+================================
+
+This section describes the actual library functions for opening and
+closing sockets.  The same functions work for all namespaces and
+connection styles.
+
+* Menu:
+
+* Creating a Socket::           How to open a socket.
+* Closing a Socket::            How to close a socket.
+* Socket Pairs::                These are created like pipes.
+
+
+File: libc.info,  Node: Creating a Socket,  Next: Closing a Socket,  Up: Open/Close Sockets
+
+16.8.1 Creating a Socket
+------------------------
+
+The primitive for creating a socket is the 'socket' function, declared
+in 'sys/socket.h'.
+
+ -- Function: int socket (int NAMESPACE, int STYLE, int PROTOCOL)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
+     Concepts::.
+
+     This function creates a socket and specifies communication style
+     STYLE, which should be one of the socket styles listed in *note
+     Communication Styles::.  The NAMESPACE argument specifies the
+     namespace; it must be 'PF_LOCAL' (*note Local Namespace::) or
+     'PF_INET' (*note Internet Namespace::).  PROTOCOL designates the
+     specific protocol (*note Socket Concepts::); zero is usually right
+     for PROTOCOL.
+
+     The return value from 'socket' is the file descriptor for the new
+     socket, or '-1' in case of error.  The following 'errno' error
+     conditions are defined for this function:
+
+     'EPROTONOSUPPORT'
+          The PROTOCOL or STYLE is not supported by the NAMESPACE
+          specified.
+
+     'EMFILE'
+          The process already has too many file descriptors open.
+
+     'ENFILE'
+          The system already has too many file descriptors open.
+
+     'EACCES'
+          The process does not have the privilege to create a socket of
+          the specified STYLE or PROTOCOL.
+
+     'ENOBUFS'
+          The system ran out of internal buffer space.
+
+     The file descriptor returned by the 'socket' function supports both
+     read and write operations.  However, like pipes, sockets do not
+     support file positioning operations.
+
+   For examples of how to call the 'socket' function, see *note Local
+Socket Example::, or *note Inet Example::.
+
+
+File: libc.info,  Node: Closing a Socket,  Next: Socket Pairs,  Prev: Creating a Socket,  Up: Open/Close Sockets
+
+16.8.2 Closing a Socket
 -----------------------
 
-Calendar time is represented by the usual GNU C Library functions as an
-elapsed time since a fixed base calendar time.  This is convenient for
-computation, but has no relation to the way people normally think of
-calendar time.  By contrast, "broken-down time" is a binary
-representation of calendar time separated into year, month, day, and so
-on.  Broken-down time values are not useful for calculations, but they
-are useful for printing human readable time information.
+When you have finished using a socket, you can simply close its file
+descriptor with 'close'; see *note Opening and Closing Files::.  If
+there is still data waiting to be transmitted over the connection,
+normally 'close' tries to complete this transmission.  You can control
+this behavior using the 'SO_LINGER' socket option to specify a timeout
+period; see *note Socket Options::.
 
-   A broken-down time value is always relative to a choice of time
-zone, and it also indicates which time zone that is.
+   You can also shut down only reception or transmission on a connection
+by calling 'shutdown', which is declared in 'sys/socket.h'.
 
-   The symbols in this section are declared in the header file `time.h'.
+ -- Function: int shutdown (int SOCKET, int HOW)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
- -- Data Type: struct tm
-     This is the data type used to represent a broken-down time.  The
-     structure contains at least the following members, which can
-     appear in any order.
+     The 'shutdown' function shuts down the connection of socket SOCKET.
+     The argument HOW specifies what action to perform:
 
-    `int tm_sec'
-          This is the number of full seconds since the top of the
-          minute (normally in the range `0' through `59', but the
-          actual upper limit is `60', to allow for leap seconds if leap
-          second support is available).  
+     '0'
+          Stop receiving data for this socket.  If further data arrives,
+          reject it.
 
-    `int tm_min'
-          This is the number of full minutes since the top of the hour
-          (in the range `0' through `59').
+     '1'
+          Stop trying to transmit data from this socket.  Discard any
+          data waiting to be sent.  Stop looking for acknowledgement of
+          data already sent; don't retransmit it if it is lost.
 
-    `int tm_hour'
-          This is the number of full hours past midnight (in the range
-          `0' through `23').
+     '2'
+          Stop both reception and transmission.
 
-    `int tm_mday'
-          This is the ordinal day of the month (in the range `1'
-          through `31').  Watch out for this one!  As the only ordinal
-          number in the structure, it is inconsistent with the rest of
-          the structure.
+     The return value is '0' on success and '-1' on failure.  The
+     following 'errno' error conditions are defined for this function:
 
-    `int tm_mon'
-          This is the number of full calendar months since the
-          beginning of the year (in the range `0' through `11').  Watch
-          out for this one!  People usually use ordinal numbers for
-          month-of-year (where January = 1).
+     'EBADF'
+          SOCKET is not a valid file descriptor.
 
-    `int tm_year'
-          This is the number of full calendar years since 1900.
+     'ENOTSOCK'
+          SOCKET is not a socket.
 
-    `int tm_wday'
-          This is the number of full days since Sunday (in the range
-          `0' through `6').
-
-    `int tm_yday'
-          This is the number of full days since the beginning of the
-          year (in the range `0' through `365').
-
-    `int tm_isdst'
-          This is a flag that indicates whether Daylight Saving Time is
-          (or was, or will be) in effect at the time described.  The
-          value is positive if Daylight Saving Time is in effect, zero
-          if it is not, and negative if the information is not
-          available.
-
-    `long int tm_gmtoff'
-          This field describes the time zone that was used to compute
-          this broken-down time value, including any adjustment for
-          daylight saving; it is the number of seconds that you must
-          add to UTC to get local time.  You can also think of this as
-          the number of seconds east of UTC.  For example, for U.S.
-          Eastern Standard Time, the value is `-5*60*60'.  The
-          `tm_gmtoff' field is derived from BSD and is a GNU library
-          extension; it is not visible in a strict ISO C environment.
-
-    `const char *tm_zone'
-          This field is the name for the time zone that was used to
-          compute this broken-down time value.  Like `tm_gmtoff', this
-          field is a BSD and GNU extension, and is not visible in a
-          strict ISO C environment.
-
- -- Function: struct tm * localtime (const time_t *TIME)
-     Preliminary: | MT-Unsafe race:tmbuf env locale | AS-Unsafe heap
-     lock | AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
-
-     The `localtime' function converts the simple time pointed to by
-     TIME to broken-down time representation, expressed relative to the
-     user's specified time zone.
-
-     The return value is a pointer to a static broken-down time
-     structure, which might be overwritten by subsequent calls to
-     `ctime', `gmtime', or `localtime'.  (But no other library function
-     overwrites the contents of this object.)
-
-     The return value is the null pointer if TIME cannot be represented
-     as a broken-down time; typically this is because the year cannot
-     fit into an `int'.
-
-     Calling `localtime' also sets the current time zone as if `tzset'
-     were called.  *Note Time Zone Functions::.
-
-   Using the `localtime' function is a big problem in multi-threaded
-programs.  The result is returned in a static buffer and this is used in
-all threads.  POSIX.1c introduced a variant of this function.
-
- -- Function: struct tm * localtime_r (const time_t *TIME, struct tm
-          *RESULTP)
-     Preliminary: | MT-Safe env locale | AS-Unsafe heap lock |
-     AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
-
-     The `localtime_r' function works just like the `localtime'
-     function.  It takes a pointer to a variable containing a simple
-     time and converts it to the broken-down time format.
-
-     But the result is not placed in a static buffer.  Instead it is
-     placed in the object of type `struct tm' to which the parameter
-     RESULTP points.
-
-     If the conversion is successful the function returns a pointer to
-     the object the result was written into, i.e., it returns RESULTP.
-
- -- Function: struct tm * gmtime (const time_t *TIME)
-     Preliminary: | MT-Unsafe race:tmbuf env locale | AS-Unsafe heap
-     lock | AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
-
-     This function is similar to `localtime', except that the
-     broken-down time is expressed as Coordinated Universal Time (UTC)
-     (formerly called Greenwich Mean Time (GMT)) rather than relative
-     to a local time zone.
-
-
-   As for the `localtime' function we have the problem that the result
-is placed in a static variable.  POSIX.1c also provides a replacement
-for `gmtime'.
-
- -- Function: struct tm * gmtime_r (const time_t *TIME, struct tm
-          *RESULTP)
-     Preliminary: | MT-Safe env locale | AS-Unsafe heap lock |
-     AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
-
-     This function is similar to `localtime_r', except that it converts
-     just like `gmtime' the given time as Coordinated Universal Time.
-
-     If the conversion is successful the function returns a pointer to
-     the object the result was written into, i.e., it returns RESULTP.
-
- -- Function: time_t mktime (struct tm *BROKENTIME)
-     Preliminary: | MT-Safe env locale | AS-Unsafe heap lock |
-     AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
-
-     The `mktime' function converts a broken-down time structure to a
-     simple time representation.  It also normalizes the contents of the
-     broken-down time structure, and fills in some components based on
-     the values of the others.
-
-     The `mktime' function ignores the specified contents of the
-     `tm_wday', `tm_yday', `tm_gmtoff', and `tm_zone' members of the
-     broken-down time structure.  It uses the values of the other
-     components to determine the calendar time; it's permissible for
-     these components to have unnormalized values outside their normal
-     ranges.  The last thing that `mktime' does is adjust the
-     components of the BROKENTIME structure, including the members that
-     were initially ignored.
-
-     If the specified broken-down time cannot be represented as a
-     simple time, `mktime' returns a value of `(time_t)(-1)' and does
-     not modify the contents of BROKENTIME.
-
-     Calling `mktime' also sets the current time zone as if `tzset'
-     were called; `mktime' uses this information instead of
-     BROKENTIME's initial `tm_gmtoff' and `tm_zone' members.  *Note
-     Time Zone Functions::.
-
- -- Function: time_t timelocal (struct tm *BROKENTIME)
-     Preliminary: | MT-Safe env locale | AS-Unsafe heap lock |
-     AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
-
-     `timelocal' is functionally identical to `mktime', but more
-     mnemonically named.  Note that it is the inverse of the `localtime'
-     function.
-
-     *Portability note:*  `mktime' is essentially universally
-     available.  `timelocal' is rather rare.
-
-
- -- Function: time_t timegm (struct tm *BROKENTIME)
-     Preliminary: | MT-Safe env locale | AS-Unsafe heap lock |
-     AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
-
-     `timegm' is functionally identical to `mktime' except it always
-     takes the input values to be Coordinated Universal Time (UTC)
-     regardless of any local time zone setting.
-
-     Note that `timegm' is the inverse of `gmtime'.
-
-     *Portability note:*  `mktime' is essentially universally
-     available.  `timegm' is rather rare.  For the most portable
-     conversion from a UTC broken-down time to a simple time, set the
-     `TZ' environment variable to UTC, call `mktime', then set `TZ'
-     back.
-
+     'ENOTCONN'
+          SOCKET is not connected.
 
 
-File: libc.info,  Node: High Accuracy Clock,  Next: Formatting Calendar Time,  Prev: Broken-down Time,  Up: Calendar Time
+File: libc.info,  Node: Socket Pairs,  Prev: Closing a Socket,  Up: Open/Close Sockets
 
-21.4.4 High Accuracy Clock
+16.8.3 Socket Pairs
+-------------------
+
+A "socket pair" consists of a pair of connected (but unnamed) sockets.
+It is very similar to a pipe and is used in much the same way.  Socket
+pairs are created with the 'socketpair' function, declared in
+'sys/socket.h'.  A socket pair is much like a pipe; the main difference
+is that the socket pair is bidirectional, whereas the pipe has one
+input-only end and one output-only end (*note Pipes and FIFOs::).
+
+ -- Function: int socketpair (int NAMESPACE, int STYLE, int PROTOCOL,
+          int FILEDES[2])
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
+     Concepts::.
+
+     This function creates a socket pair, returning the file descriptors
+     in 'FILEDES[0]' and 'FILEDES[1]'.  The socket pair is a full-duplex
+     communications channel, so that both reading and writing may be
+     performed at either end.
+
+     The NAMESPACE, STYLE and PROTOCOL arguments are interpreted as for
+     the 'socket' function.  STYLE should be one of the communication
+     styles listed in *note Communication Styles::.  The NAMESPACE
+     argument specifies the namespace, which must be 'AF_LOCAL' (*note
+     Local Namespace::); PROTOCOL specifies the communications protocol,
+     but zero is the only meaningful value.
+
+     If STYLE specifies a connectionless communication style, then the
+     two sockets you get are not _connected_, strictly speaking, but
+     each of them knows the other as the default destination address, so
+     they can send packets to each other.
+
+     The 'socketpair' function returns '0' on success and '-1' on
+     failure.  The following 'errno' error conditions are defined for
+     this function:
+
+     'EMFILE'
+          The process has too many file descriptors open.
+
+     'EAFNOSUPPORT'
+          The specified namespace is not supported.
+
+     'EPROTONOSUPPORT'
+          The specified protocol is not supported.
+
+     'EOPNOTSUPP'
+          The specified protocol does not support the creation of socket
+          pairs.
+
+
+File: libc.info,  Node: Connections,  Next: Datagrams,  Prev: Open/Close Sockets,  Up: Sockets
+
+16.9 Using Sockets with Connections
+===================================
+
+The most common communication styles involve making a connection to a
+particular other socket, and then exchanging data with that socket over
+and over.  Making a connection is asymmetric; one side (the "client")
+acts to request a connection, while the other side (the "server") makes
+a socket and waits for the connection request.
+
+* Menu:
+
+* Connecting::    	     What the client program must do.
+* Listening::		     How a server program waits for requests.
+* Accepting Connections::    What the server does when it gets a request.
+* Who is Connected::	     Getting the address of the
+				other side of a connection.
+* Transferring Data::        How to send and receive data.
+* Byte Stream Example::	     An example program: a client for communicating
+			      over a byte stream socket in the Internet namespace.
+* Server Example::	     A corresponding server program.
+* Out-of-Band Data::         This is an advanced feature.
+
+
+File: libc.info,  Node: Connecting,  Next: Listening,  Up: Connections
+
+16.9.1 Making a Connection
 --------------------------
 
-The `ntp_gettime' and `ntp_adjtime' functions provide an interface to
-monitor and manipulate the system clock to maintain high accuracy time.
-For example, you can fine tune the speed of the clock or synchronize it
-with another time source.
+In making a connection, the client makes a connection while the server
+waits for and accepts the connection.  Here we discuss what the client
+program must do with the 'connect' function, which is declared in
+'sys/socket.h'.
 
-   A typical use of these functions is by a server implementing the
-Network Time Protocol to synchronize the clocks of multiple systems and
-high precision clocks.
-
-   These functions are declared in `sys/timex.h'.
-
- -- Data Type: struct ntptimeval
-     This structure is used for information about the system clock.  It
-     contains the following members:
-    `struct timeval time'
-          This is the current calendar time, expressed as the elapsed
-          time since the epoch.  The `struct timeval' data type is
-          described in *note Elapsed Time::.
-
-    `long int maxerror'
-          This is the maximum error, measured in microseconds.  Unless
-          updated via `ntp_adjtime' periodically, this value will reach
-          some platform-specific maximum value.
-
-    `long int esterror'
-          This is the estimated error, measured in microseconds.  This
-          value can be set by `ntp_adjtime' to indicate the estimated
-          offset of the system clock from the true calendar time.
-
- -- Function: int ntp_gettime (struct ntptimeval *TPTR)
+ -- Function: int connect (int SOCKET, struct sockaddr *ADDR, socklen_t
+          LENGTH)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `ntp_gettime' function sets the structure pointed to by TPTR
-     to current values.  The elements of the structure afterwards
-     contain the values the timer implementation in the kernel assumes.
-     They might or might not be correct.  If they are not a
-     `ntp_adjtime' call is necessary.
+     The 'connect' function initiates a connection from the socket with
+     file descriptor SOCKET to the socket whose address is specified by
+     the ADDR and LENGTH arguments.  (This socket is typically on
+     another machine, and it must be already set up as a server.)  *Note
+     Socket Addresses::, for information about how these arguments are
+     interpreted.
 
-     The return value is `0' on success and other values on failure.
-     The following `errno' error conditions are defined for this
+     Normally, 'connect' waits until the server responds to the request
+     before it returns.  You can set nonblocking mode on the socket
+     SOCKET to make 'connect' return immediately without waiting for the
+     response.  *Note File Status Flags::, for information about
+     nonblocking mode.
+
+     The normal return value from 'connect' is '0'.  If an error occurs,
+     'connect' returns '-1'.  The following 'errno' error conditions are
+     defined for this function:
+
+     'EBADF'
+          The socket SOCKET is not a valid file descriptor.
+
+     'ENOTSOCK'
+          File descriptor SOCKET is not a socket.
+
+     'EADDRNOTAVAIL'
+          The specified address is not available on the remote machine.
+
+     'EAFNOSUPPORT'
+          The namespace of the ADDR is not supported by this socket.
+
+     'EISCONN'
+          The socket SOCKET is already connected.
+
+     'ETIMEDOUT'
+          The attempt to establish the connection timed out.
+
+     'ECONNREFUSED'
+          The server has actively refused to establish the connection.
+
+     'ENETUNREACH'
+          The network of the given ADDR isn't reachable from this host.
+
+     'EADDRINUSE'
+          The socket address of the given ADDR is already in use.
+
+     'EINPROGRESS'
+          The socket SOCKET is non-blocking and the connection could not
+          be established immediately.  You can determine when the
+          connection is completely established with 'select'; *note
+          Waiting for I/O::.  Another 'connect' call on the same socket,
+          before the connection is completely established, will fail
+          with 'EALREADY'.
+
+     'EALREADY'
+          The socket SOCKET is non-blocking and already has a pending
+          connection in progress (see 'EINPROGRESS' above).
+
+     This function is defined as a cancellation point in multi-threaded
+     programs, so one has to be prepared for this and make sure that
+     allocated resources (like memory, files descriptors, semaphores or
+     whatever) are freed even if the thread is canceled.
+
+
+File: libc.info,  Node: Listening,  Next: Accepting Connections,  Prev: Connecting,  Up: Connections
+
+16.9.2 Listening for Connections
+--------------------------------
+
+Now let us consider what the server process must do to accept
+connections on a socket.  First it must use the 'listen' function to
+enable connection requests on the socket, and then accept each incoming
+connection with a call to 'accept' (*note Accepting Connections::).
+Once connection requests are enabled on a server socket, the 'select'
+function reports when the socket has a connection ready to be accepted
+(*note Waiting for I/O::).
+
+   The 'listen' function is not allowed for sockets using connectionless
+communication styles.
+
+   You can write a network server that does not even start running until
+a connection to it is requested.  *Note Inetd Servers::.
+
+   In the Internet namespace, there are no special protection mechanisms
+for controlling access to a port; any process on any machine can make a
+connection to your server.  If you want to restrict access to your
+server, make it examine the addresses associated with connection
+requests or implement some other handshaking or identification protocol.
+
+   In the local namespace, the ordinary file protection bits control who
+has access to connect to the socket.
+
+ -- Function: int listen (int SOCKET, int N)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
+     Concepts::.
+
+     The 'listen' function enables the socket SOCKET to accept
+     connections, thus making it a server socket.
+
+     The argument N specifies the length of the queue for pending
+     connections.  When the queue fills, new clients attempting to
+     connect fail with 'ECONNREFUSED' until the server calls 'accept' to
+     accept a connection from the queue.
+
+     The 'listen' function returns '0' on success and '-1' on failure.
+     The following 'errno' error conditions are defined for this
      function:
 
-    `TIME_ERROR'
-          The precision clock model is not properly set up at the
-          moment, thus the clock must be considered unsynchronized, and
-          the values should be treated with care.
+     'EBADF'
+          The argument SOCKET is not a valid file descriptor.
 
- -- Data Type: struct timex
-     This structure is used to control and monitor the system clock.  It
-     contains the following members:
-    `unsigned int modes'
-          This variable controls whether and which values are set.
-          Several symbolic constants have to be combined with _binary
-          or_ to specify the effective mode.  These constants start
-          with `MOD_'.
+     'ENOTSOCK'
+          The argument SOCKET is not a socket.
 
-    `long int offset'
-          This value indicates the current offset of the system clock
-          from the true calendar time.  The value is given in
-          microseconds.  If bit `MOD_OFFSET' is set in `modes', the
-          offset (and possibly other dependent values) can be set.  The
-          offset's absolute value must not exceed `MAXPHASE'.
+     'EOPNOTSUPP'
+          The socket SOCKET does not support this operation.
 
-    `long int frequency'
-          This value indicates the difference in frequency between the
-          true calendar time and the system clock.  The value is
-          expressed as scaled PPM (parts per million, 0.0001%).  The
-          scaling is `1 << SHIFT_USEC'.  The value can be set with bit
-          `MOD_FREQUENCY', but the absolute value must not exceed
-          `MAXFREQ'.
+
+File: libc.info,  Node: Accepting Connections,  Next: Who is Connected,  Prev: Listening,  Up: Connections
 
-    `long int maxerror'
-          This is the maximum error, measured in microseconds.  A new
-          value can be set using bit `MOD_MAXERROR'.  Unless updated via
-          `ntp_adjtime' periodically, this value will increase steadily
-          and reach some platform-specific maximum value.
+16.9.3 Accepting Connections
+----------------------------
 
-    `long int esterror'
-          This is the estimated error, measured in microseconds.  This
-          value can be set using bit `MOD_ESTERROR'.
+When a server receives a connection request, it can complete the
+connection by accepting the request.  Use the function 'accept' to do
+this.
 
-    `int status'
-          This variable reflects the various states of the clock
-          machinery.  There are symbolic constants for the significant
-          bits, starting with `STA_'.  Some of these flags can be
-          updated using the `MOD_STATUS' bit.
+   A socket that has been established as a server can accept connection
+requests from multiple clients.  The server's original socket _does not
+become part of the connection_; instead, 'accept' makes a new socket
+which participates in the connection.  'accept' returns the descriptor
+for this socket.  The server's original socket remains available for
+listening for further connection requests.
 
-    `long int constant'
-          This value represents the bandwidth or stiffness of the PLL
-          (phase locked loop) implemented in the kernel.  The value can
-          be changed using bit `MOD_TIMECONST'.
+   The number of pending connection requests on a server socket is
+finite.  If connection requests arrive from clients faster than the
+server can act upon them, the queue can fill up and additional requests
+are refused with an 'ECONNREFUSED' error.  You can specify the maximum
+length of this queue as an argument to the 'listen' function, although
+the system may also impose its own internal limit on the length of this
+queue.
 
-    `long int precision'
-          This value represents the accuracy or the maximum error when
-          reading the system clock.  The value is expressed in
-          microseconds.
+ -- Function: int accept (int SOCKET, struct sockaddr *ADDR, socklen_t
+          *LENGTH_PTR)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
+     Concepts::.
 
-    `long int tolerance'
-          This value represents the maximum frequency error of the
-          system clock in scaled PPM.  This value is used to increase
-          the `maxerror' every second.
+     This function is used to accept a connection request on the server
+     socket SOCKET.
 
-    `struct timeval time'
-          The current calendar time.
+     The 'accept' function waits if there are no connections pending,
+     unless the socket SOCKET has nonblocking mode set.  (You can use
+     'select' to wait for a pending connection, with a nonblocking
+     socket.)  *Note File Status Flags::, for information about
+     nonblocking mode.
 
-    `long int tick'
-          The elapsed time between clock ticks in microseconds.  A
-          clock tick is a periodic timer interrupt on which the system
-          clock is based.
+     The ADDR and LENGTH-PTR arguments are used to return information
+     about the name of the client socket that initiated the connection.
+     *Note Socket Addresses::, for information about the format of the
+     information.
 
-    `long int ppsfreq'
-          This is the first of a few optional variables that are
-          present only if the system clock can use a PPS (pulse per
-          second) signal to discipline the system clock.  The value is
-          expressed in scaled PPM and it denotes the difference in
-          frequency between the system clock and the PPS signal.
+     Accepting a connection does not make SOCKET part of the connection.
+     Instead, it creates a new socket which becomes connected.  The
+     normal return value of 'accept' is the file descriptor for the new
+     socket.
 
-    `long int jitter'
-          This value expresses a median filtered average of the PPS
-          signal's dispersion in microseconds.
+     After 'accept', the original socket SOCKET remains open and
+     unconnected, and continues listening until you close it.  You can
+     accept further connections with SOCKET by calling 'accept' again.
 
-    `int shift'
-          This value is a binary exponent for the duration of the PPS
-          calibration interval, ranging from `PPS_SHIFT' to
-          `PPS_SHIFTMAX'.
+     If an error occurs, 'accept' returns '-1'.  The following 'errno'
+     error conditions are defined for this function:
 
-    `long int stabil'
-          This value represents the median filtered dispersion of the
-          PPS frequency in scaled PPM.
+     'EBADF'
+          The SOCKET argument is not a valid file descriptor.
 
-    `long int jitcnt'
-          This counter represents the number of pulses where the jitter
-          exceeded the allowed maximum `MAXTIME'.
+     'ENOTSOCK'
+          The descriptor SOCKET argument is not a socket.
 
-    `long int calcnt'
-          This counter reflects the number of successful calibration
-          intervals.
+     'EOPNOTSUPP'
+          The descriptor SOCKET does not support this operation.
 
-    `long int errcnt'
-          This counter represents the number of calibration errors
-          (caused by large offsets or jitter).
+     'EWOULDBLOCK'
+          SOCKET has nonblocking mode set, and there are no pending
+          connections immediately available.
 
-    `long int stbcnt'
-          This counter denotes the number of calibrations where the
-          stability exceeded the threshold.
+     This function is defined as a cancellation point in multi-threaded
+     programs, so one has to be prepared for this and make sure that
+     allocated resources (like memory, files descriptors, semaphores or
+     whatever) are freed even if the thread is canceled.
 
- -- Function: int ntp_adjtime (struct timex *TPTR)
+   The 'accept' function is not allowed for sockets using connectionless
+communication styles.
+
+
+File: libc.info,  Node: Who is Connected,  Next: Transferring Data,  Prev: Accepting Connections,  Up: Connections
+
+16.9.4 Who is Connected to Me?
+------------------------------
+
+ -- Function: int getpeername (int SOCKET, struct sockaddr *ADDR,
+          socklen_t *LENGTH-PTR)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `ntp_adjtime' function sets the structure specified by TPTR to
-     current values.
+     The 'getpeername' function returns the address of the socket that
+     SOCKET is connected to; it stores the address in the memory space
+     specified by ADDR and LENGTH-PTR.  It stores the length of the
+     address in '*LENGTH-PTR'.
 
-     In addition, `ntp_adjtime' updates some settings to match what you
-     pass to it in *TPTR.  Use the `modes' element of *TPTR to select
-     what settings to update.  You can set `offset', `freq',
-     `maxerror', `esterror', `status', `constant', and `tick'.
+     *Note Socket Addresses::, for information about the format of the
+     address.  In some operating systems, 'getpeername' works only for
+     sockets in the Internet domain.
 
-     `modes' = zero means set nothing.
+     The return value is '0' on success and '-1' on error.  The
+     following 'errno' error conditions are defined for this function:
 
-     Only the superuser can update settings.
+     'EBADF'
+          The argument SOCKET is not a valid file descriptor.
 
-     The return value is `0' on success and other values on failure.
-     The following `errno' error conditions are defined for this
+     'ENOTSOCK'
+          The descriptor SOCKET is not a socket.
+
+     'ENOTCONN'
+          The socket SOCKET is not connected.
+
+     'ENOBUFS'
+          There are not enough internal buffers available.
+
+
+File: libc.info,  Node: Transferring Data,  Next: Byte Stream Example,  Prev: Who is Connected,  Up: Connections
+
+16.9.5 Transferring Data
+------------------------
+
+Once a socket has been connected to a peer, you can use the ordinary
+'read' and 'write' operations (*note I/O Primitives::) to transfer data.
+A socket is a two-way communications channel, so read and write
+operations can be performed at either end.
+
+   There are also some I/O modes that are specific to socket operations.
+In order to specify these modes, you must use the 'recv' and 'send'
+functions instead of the more generic 'read' and 'write' functions.  The
+'recv' and 'send' functions take an additional argument which you can
+use to specify various flags to control special I/O modes.  For example,
+you can specify the 'MSG_OOB' flag to read or write out-of-band data,
+the 'MSG_PEEK' flag to peek at input, or the 'MSG_DONTROUTE' flag to
+control inclusion of routing information on output.
+
+* Menu:
+
+* Sending Data::		Sending data with 'send'.
+* Receiving Data::		Reading data with 'recv'.
+* Socket Data Options::		Using 'send' and 'recv'.
+
+
+File: libc.info,  Node: Sending Data,  Next: Receiving Data,  Up: Transferring Data
+
+16.9.5.1 Sending Data
+.....................
+
+The 'send' function is declared in the header file 'sys/socket.h'.  If
+your FLAGS argument is zero, you can just as well use 'write' instead of
+'send'; see *note I/O Primitives::.  If the socket was connected but the
+connection has broken, you get a 'SIGPIPE' signal for any use of 'send'
+or 'write' (*note Miscellaneous Signals::).
+
+ -- Function: ssize_t send (int SOCKET, const void *BUFFER, size_t SIZE,
+          int FLAGS)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'send' function is like 'write', but with the additional flags
+     FLAGS.  The possible values of FLAGS are described in *note Socket
+     Data Options::.
+
+     This function returns the number of bytes transmitted, or '-1' on
+     failure.  If the socket is nonblocking, then 'send' (like 'write')
+     can return after sending just part of the data.  *Note File Status
+     Flags::, for information about nonblocking mode.
+
+     Note, however, that a successful return value merely indicates that
+     the message has been sent without error, not necessarily that it
+     has been received without error.
+
+     The following 'errno' error conditions are defined for this
      function:
 
-    `TIME_ERROR'
-          The high accuracy clock model is not properly set up at the
-          moment, thus the clock must be considered unsynchronized, and
-          the values should be treated with care.  Another reason could
-          be that the specified new values are not allowed.
+     'EBADF'
+          The SOCKET argument is not a valid file descriptor.
 
-    `EPERM'
-          The process specified a settings update, but is not superuser.
+     'EINTR'
+          The operation was interrupted by a signal before any data was
+          sent.  *Note Interrupted Primitives::.
+
+     'ENOTSOCK'
+          The descriptor SOCKET is not a socket.
+
+     'EMSGSIZE'
+          The socket type requires that the message be sent atomically,
+          but the message is too large for this to be possible.
+
+     'EWOULDBLOCK'
+          Nonblocking mode has been set on the socket, and the write
+          operation would block.  (Normally 'send' blocks until the
+          operation can be completed.)
+
+     'ENOBUFS'
+          There is not enough internal buffer space available.
+
+     'ENOTCONN'
+          You never connected this socket.
+
+     'EPIPE'
+          This socket was connected but the connection is now broken.
+          In this case, 'send' generates a 'SIGPIPE' signal first; if
+          that signal is ignored or blocked, or if its handler returns,
+          then 'send' fails with 'EPIPE'.
+
+     This function is defined as a cancellation point in multi-threaded
+     programs, so one has to be prepared for this and make sure that
+     allocated resources (like memory, files descriptors, semaphores or
+     whatever) are freed even if the thread is canceled.
+
+
+File: libc.info,  Node: Receiving Data,  Next: Socket Data Options,  Prev: Sending Data,  Up: Transferring Data
+
+16.9.5.2 Receiving Data
+.......................
+
+The 'recv' function is declared in the header file 'sys/socket.h'.  If
+your FLAGS argument is zero, you can just as well use 'read' instead of
+'recv'; see *note I/O Primitives::.
+
+ -- Function: ssize_t recv (int SOCKET, void *BUFFER, size_t SIZE, int
+          FLAGS)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'recv' function is like 'read', but with the additional flags
+     FLAGS.  The possible values of FLAGS are described in *note Socket
+     Data Options::.
+
+     If nonblocking mode is set for SOCKET, and no data are available to
+     be read, 'recv' fails immediately rather than waiting.  *Note File
+     Status Flags::, for information about nonblocking mode.
+
+     This function returns the number of bytes received, or '-1' on
+     failure.  The following 'errno' error conditions are defined for
+     this function:
+
+     'EBADF'
+          The SOCKET argument is not a valid file descriptor.
+
+     'ENOTSOCK'
+          The descriptor SOCKET is not a socket.
+
+     'EWOULDBLOCK'
+          Nonblocking mode has been set on the socket, and the read
+          operation would block.  (Normally, 'recv' blocks until there
+          is input available to be read.)
+
+     'EINTR'
+          The operation was interrupted by a signal before any data was
+          read.  *Note Interrupted Primitives::.
+
+     'ENOTCONN'
+          You never connected this socket.
+
+     This function is defined as a cancellation point in multi-threaded
+     programs, so one has to be prepared for this and make sure that
+     allocated resources (like memory, files descriptors, semaphores or
+     whatever) are freed even if the thread is canceled.
+
+
+File: libc.info,  Node: Socket Data Options,  Prev: Receiving Data,  Up: Transferring Data
+
+16.9.5.3 Socket Data Options
+............................
+
+The FLAGS argument to 'send' and 'recv' is a bit mask.  You can
+bitwise-OR the values of the following macros together to obtain a value
+for this argument.  All are defined in the header file 'sys/socket.h'.
+
+ -- Macro: int MSG_OOB
+     Send or receive out-of-band data.  *Note Out-of-Band Data::.
+
+ -- Macro: int MSG_PEEK
+     Look at the data but don't remove it from the input queue.  This is
+     only meaningful with input functions such as 'recv', not with
+     'send'.
+
+ -- Macro: int MSG_DONTROUTE
+     Don't include routing information in the message.  This is only
+     meaningful with output operations, and is usually only of interest
+     for diagnostic or routing programs.  We don't try to explain it
+     here.
+
+
+File: libc.info,  Node: Byte Stream Example,  Next: Server Example,  Prev: Transferring Data,  Up: Connections
+
+16.9.6 Byte Stream Socket Example
+---------------------------------
+
+Here is an example client program that makes a connection for a byte
+stream socket in the Internet namespace.  It doesn't do anything
+particularly interesting once it has connected to the server; it just
+sends a text string to the server and exits.
+
+   This program uses 'init_sockaddr' to set up the socket address; see
+*note Inet Example::.
 
 
-     For more details see RFC1305 (Network Time Protocol, Version 3) and
-     related documents.
+     #include <stdio.h>
+     #include <errno.h>
+     #include <stdlib.h>
+     #include <unistd.h>
+     #include <sys/types.h>
+     #include <sys/socket.h>
+     #include <netinet/in.h>
+     #include <netdb.h>
 
-     *Portability note:* Early versions of the GNU C Library did not
-     have this function but did have the synonymous `adjtimex'.
+     #define PORT            5555
+     #define MESSAGE         "Yow!!! Are we having fun yet?!?"
+     #define SERVERHOST      "www.gnu.org"
 
+     void
+     write_to_server (int filedes)
+     {
+       int nbytes;
+
+       nbytes = write (filedes, MESSAGE, strlen (MESSAGE) + 1);
+       if (nbytes < 0)
+         {
+           perror ("write");
+           exit (EXIT_FAILURE);
+         }
+     }
+
+
+     int
+     main (void)
+     {
+       extern void init_sockaddr (struct sockaddr_in *name,
+                                  const char *hostname,
+                                  uint16_t port);
+       int sock;
+       struct sockaddr_in servername;
+
+       /* Create the socket. */
+       sock = socket (PF_INET, SOCK_STREAM, 0);
+       if (sock < 0)
+         {
+           perror ("socket (client)");
+           exit (EXIT_FAILURE);
+         }
+
+       /* Connect to the server. */
+       init_sockaddr (&servername, SERVERHOST, PORT);
+       if (0 > connect (sock,
+                        (struct sockaddr *) &servername,
+                        sizeof (servername)))
+         {
+           perror ("connect (client)");
+           exit (EXIT_FAILURE);
+         }
+
+       /* Send data to the server. */
+       write_to_server (sock);
+       close (sock);
+       exit (EXIT_SUCCESS);
+     }
+
+
+File: libc.info,  Node: Server Example,  Next: Out-of-Band Data,  Prev: Byte Stream Example,  Up: Connections
+
+16.9.7 Byte Stream Connection Server Example
+--------------------------------------------
+
+The server end is much more complicated.  Since we want to allow
+multiple clients to be connected to the server at the same time, it
+would be incorrect to wait for input from a single client by simply
+calling 'read' or 'recv'.  Instead, the right thing to do is to use
+'select' (*note Waiting for I/O::) to wait for input on all of the open
+sockets.  This also allows the server to deal with additional connection
+requests.
+
+   This particular server doesn't do anything interesting once it has
+gotten a message from a client.  It does close the socket for that
+client when it detects an end-of-file condition (resulting from the
+client shutting down its end of the connection).
+
+   This program uses 'make_socket' to set up the socket address; see
+*note Inet Example::.
+
+
+     #include <stdio.h>
+     #include <errno.h>
+     #include <stdlib.h>
+     #include <unistd.h>
+     #include <sys/types.h>
+     #include <sys/socket.h>
+     #include <netinet/in.h>
+     #include <netdb.h>
+
+     #define PORT    5555
+     #define MAXMSG  512
+
+     int
+     read_from_client (int filedes)
+     {
+       char buffer[MAXMSG];
+       int nbytes;
+
+       nbytes = read (filedes, buffer, MAXMSG);
+       if (nbytes < 0)
+         {
+           /* Read error. */
+           perror ("read");
+           exit (EXIT_FAILURE);
+         }
+       else if (nbytes == 0)
+         /* End-of-file. */
+         return -1;
+       else
+         {
+           /* Data read. */
+           fprintf (stderr, "Server: got message: `%s'\n", buffer);
+           return 0;
+         }
+     }
+
+     int
+     main (void)
+     {
+       extern int make_socket (uint16_t port);
+       int sock;
+       fd_set active_fd_set, read_fd_set;
+       int i;
+       struct sockaddr_in clientname;
+       size_t size;
+
+       /* Create the socket and set it up to accept connections. */
+       sock = make_socket (PORT);
+       if (listen (sock, 1) < 0)
+         {
+           perror ("listen");
+           exit (EXIT_FAILURE);
+         }
+
+       /* Initialize the set of active sockets. */
+       FD_ZERO (&active_fd_set);
+       FD_SET (sock, &active_fd_set);
+
+       while (1)
+         {
+           /* Block until input arrives on one or more active sockets. */
+           read_fd_set = active_fd_set;
+           if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0)
+             {
+               perror ("select");
+               exit (EXIT_FAILURE);
+             }
+
+           /* Service all the sockets with input pending. */
+           for (i = 0; i < FD_SETSIZE; ++i)
+             if (FD_ISSET (i, &read_fd_set))
+               {
+                 if (i == sock)
+                   {
+                     /* Connection request on original socket. */
+                     int new;
+                     size = sizeof (clientname);
+                     new = accept (sock,
+                                   (struct sockaddr *) &clientname,
+                                   &size);
+                     if (new < 0)
+                       {
+                         perror ("accept");
+                         exit (EXIT_FAILURE);
+                       }
+                     fprintf (stderr,
+                              "Server: connect from host %s, port %hd.\n",
+                              inet_ntoa (clientname.sin_addr),
+                              ntohs (clientname.sin_port));
+                     FD_SET (new, &active_fd_set);
+                   }
+                 else
+                   {
+                     /* Data arriving on an already-connected socket. */
+                     if (read_from_client (i) < 0)
+                       {
+                         close (i);
+                         FD_CLR (i, &active_fd_set);
+                       }
+                   }
+               }
+         }
+     }
+
+
+File: libc.info,  Node: Out-of-Band Data,  Prev: Server Example,  Up: Connections
+
+16.9.8 Out-of-Band Data
+-----------------------
+
+Streams with connections permit "out-of-band" data that is delivered
+with higher priority than ordinary data.  Typically the reason for
+sending out-of-band data is to send notice of an exceptional condition.
+To send out-of-band data use 'send', specifying the flag 'MSG_OOB'
+(*note Sending Data::).
+
+   Out-of-band data are received with higher priority because the
+receiving process need not read it in sequence; to read the next
+available out-of-band data, use 'recv' with the 'MSG_OOB' flag (*note
+Receiving Data::).  Ordinary read operations do not read out-of-band
+data; they read only ordinary data.
+
+   When a socket finds that out-of-band data are on their way, it sends
+a 'SIGURG' signal to the owner process or process group of the socket.
+You can specify the owner using the 'F_SETOWN' command to the 'fcntl'
+function; see *note Interrupt Input::.  You must also establish a
+handler for this signal, as described in *note Signal Handling::, in
+order to take appropriate action such as reading the out-of-band data.
+
+   Alternatively, you can test for pending out-of-band data, or wait
+until there is out-of-band data, using the 'select' function; it can
+wait for an exceptional condition on the socket.  *Note Waiting for
+I/O::, for more information about 'select'.
+
+   Notification of out-of-band data (whether with 'SIGURG' or with
+'select') indicates that out-of-band data are on the way; the data may
+not actually arrive until later.  If you try to read the out-of-band
+data before it arrives, 'recv' fails with an 'EWOULDBLOCK' error.
+
+   Sending out-of-band data automatically places a "mark" in the stream
+of ordinary data, showing where in the sequence the out-of-band data
+"would have been".  This is useful when the meaning of out-of-band data
+is "cancel everything sent so far".  Here is how you can test, in the
+receiving process, whether any ordinary data was sent before the mark:
+
+     success = ioctl (socket, SIOCATMARK, &atmark);
+
+   The 'integer' variable ATMARK is set to a nonzero value if the
+socket's read pointer has reached the "mark".
+
+   Here's a function to discard any ordinary data preceding the
+out-of-band mark:
+
+     int
+     discard_until_mark (int socket)
+     {
+       while (1)
+         {
+           /* This is not an arbitrary limit; any size will do.  */
+           char buffer[1024];
+           int atmark, success;
+
+           /* If we have reached the mark, return.  */
+           success = ioctl (socket, SIOCATMARK, &atmark);
+           if (success < 0)
+             perror ("ioctl");
+           if (result)
+             return;
+
+           /* Otherwise, read a bunch of ordinary data and discard it.
+              This is guaranteed not to read past the mark
+              if it starts before the mark.  */
+           success = read (socket, buffer, sizeof buffer);
+           if (success < 0)
+             perror ("read");
+         }
+     }
+
+   If you don't want to discard the ordinary data preceding the mark,
+you may need to read some of it anyway, to make room in internal system
+buffers for the out-of-band data.  If you try to read out-of-band data
+and get an 'EWOULDBLOCK' error, try reading some ordinary data (saving
+it so that you can use it when you want it) and see if that makes room.
+Here is an example:
+
+     struct buffer
+     {
+       char *buf;
+       int size;
+       struct buffer *next;
+     };
+
+     /* Read the out-of-band data from SOCKET and return it
+        as a 'struct buffer', which records the address of the data
+        and its size.
+
+        It may be necessary to read some ordinary data
+        in order to make room for the out-of-band data.
+        If so, the ordinary data are saved as a chain of buffers
+        found in the 'next' field of the value.  */
+
+     struct buffer *
+     read_oob (int socket)
+     {
+       struct buffer *tail = 0;
+       struct buffer *list = 0;
+
+       while (1)
+         {
+           /* This is an arbitrary limit.
+              Does anyone know how to do this without a limit?  */
+     #define BUF_SZ 1024
+           char *buf = (char *) xmalloc (BUF_SZ);
+           int success;
+           int atmark;
+
+           /* Try again to read the out-of-band data.  */
+           success = recv (socket, buf, BUF_SZ, MSG_OOB);
+           if (success >= 0)
+             {
+               /* We got it, so return it.  */
+               struct buffer *link
+                 = (struct buffer *) xmalloc (sizeof (struct buffer));
+               link->buf = buf;
+               link->size = success;
+               link->next = list;
+               return link;
+             }
+
+           /* If we fail, see if we are at the mark.  */
+           success = ioctl (socket, SIOCATMARK, &atmark);
+           if (success < 0)
+             perror ("ioctl");
+           if (atmark)
+             {
+               /* At the mark; skipping past more ordinary data cannot help.
+                  So just wait a while.  */
+               sleep (1);
+               continue;
+             }
+
+           /* Otherwise, read a bunch of ordinary data and save it.
+              This is guaranteed not to read past the mark
+              if it starts before the mark.  */
+           success = read (socket, buf, BUF_SZ);
+           if (success < 0)
+             perror ("read");
+
+           /* Save this data in the buffer list.  */
+           {
+             struct buffer *link
+               = (struct buffer *) xmalloc (sizeof (struct buffer));
+             link->buf = buf;
+             link->size = success;
+
+             /* Add the new link to the end of the list.  */
+             if (tail)
+               tail->next = link;
+             else
+               list = link;
+             tail = link;
+           }
+         }
+     }
+
+
+File: libc.info,  Node: Datagrams,  Next: Inetd,  Prev: Connections,  Up: Sockets
+
+16.10 Datagram Socket Operations
+================================
+
+This section describes how to use communication styles that don't use
+connections (styles 'SOCK_DGRAM' and 'SOCK_RDM').  Using these styles,
+you group data into packets and each packet is an independent
+communication.  You specify the destination for each packet
+individually.
+
+   Datagram packets are like letters: you send each one independently
+with its own destination address, and they may arrive in the wrong order
+or not at all.
+
+   The 'listen' and 'accept' functions are not allowed for sockets using
+connectionless communication styles.
+
+* Menu:
+
+* Sending Datagrams::    Sending packets on a datagram socket.
+* Receiving Datagrams::  Receiving packets on a datagram socket.
+* Datagram Example::     An example program: packets sent over a
+                           datagram socket in the local namespace.
+* Example Receiver::	 Another program, that receives those packets.
+
+
+File: libc.info,  Node: Sending Datagrams,  Next: Receiving Datagrams,  Up: Datagrams
+
+16.10.1 Sending Datagrams
+-------------------------
+
+The normal way of sending data on a datagram socket is by using the
+'sendto' function, declared in 'sys/socket.h'.
+
+   You can call 'connect' on a datagram socket, but this only specifies
+a default destination for further data transmission on the socket.  When
+a socket has a default destination you can use 'send' (*note Sending
+Data::) or even 'write' (*note I/O Primitives::) to send a packet there.
+You can cancel the default destination by calling 'connect' using an
+address format of 'AF_UNSPEC' in the ADDR argument.  *Note Connecting::,
+for more information about the 'connect' function.
+
+ -- Function: ssize_t sendto (int SOCKET, const void *BUFFER, size_t
+          SIZE, int FLAGS, struct sockaddr *ADDR, socklen_t LENGTH)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'sendto' function transmits the data in the BUFFER through the
+     socket SOCKET to the destination address specified by the ADDR and
+     LENGTH arguments.  The SIZE argument specifies the number of bytes
+     to be transmitted.
+
+     The FLAGS are interpreted the same way as for 'send'; see *note
+     Socket Data Options::.
+
+     The return value and error conditions are also the same as for
+     'send', but you cannot rely on the system to detect errors and
+     report them; the most common error is that the packet is lost or
+     there is no-one at the specified address to receive it, and the
+     operating system on your machine usually does not know this.
+
+     It is also possible for one call to 'sendto' to report an error
+     owing to a problem related to a previous call.
+
+     This function is defined as a cancellation point in multi-threaded
+     programs, so one has to be prepared for this and make sure that
+     allocated resources (like memory, files descriptors, semaphores or
+     whatever) are freed even if the thread is canceled.
+
+
+File: libc.info,  Node: Receiving Datagrams,  Next: Datagram Example,  Prev: Sending Datagrams,  Up: Datagrams
+
+16.10.2 Receiving Datagrams
+---------------------------
+
+The 'recvfrom' function reads a packet from a datagram socket and also
+tells you where it was sent from.  This function is declared in
+'sys/socket.h'.
+
+ -- Function: ssize_t recvfrom (int SOCKET, void *BUFFER, size_t SIZE,
+          int FLAGS, struct sockaddr *ADDR, socklen_t *LENGTH-PTR)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'recvfrom' function reads one packet from the socket SOCKET
+     into the buffer BUFFER.  The SIZE argument specifies the maximum
+     number of bytes to be read.
+
+     If the packet is longer than SIZE bytes, then you get the first
+     SIZE bytes of the packet and the rest of the packet is lost.
+     There's no way to read the rest of the packet.  Thus, when you use
+     a packet protocol, you must always know how long a packet to
+     expect.
+
+     The ADDR and LENGTH-PTR arguments are used to return the address
+     where the packet came from.  *Note Socket Addresses::.  For a
+     socket in the local domain the address information won't be
+     meaningful, since you can't read the address of such a socket
+     (*note Local Namespace::).  You can specify a null pointer as the
+     ADDR argument if you are not interested in this information.
+
+     The FLAGS are interpreted the same way as for 'recv' (*note Socket
+     Data Options::).  The return value and error conditions are also
+     the same as for 'recv'.
+
+     This function is defined as a cancellation point in multi-threaded
+     programs, so one has to be prepared for this and make sure that
+     allocated resources (like memory, files descriptors, semaphores or
+     whatever) are freed even if the thread is canceled.
+
+   You can use plain 'recv' (*note Receiving Data::) instead of
+'recvfrom' if you don't need to find out who sent the packet (either
+because you know where it should come from or because you treat all
+possible senders alike).  Even 'read' can be used if you don't want to
+specify FLAGS (*note I/O Primitives::).
+
+
+File: libc.info,  Node: Datagram Example,  Next: Example Receiver,  Prev: Receiving Datagrams,  Up: Datagrams
+
+16.10.3 Datagram Socket Example
+-------------------------------
+
+Here is a set of example programs that send messages over a datagram
+stream in the local namespace.  Both the client and server programs use
+the 'make_named_socket' function that was presented in *note Local
+Socket Example::, to create and name their sockets.
+
+   First, here is the server program.  It sits in a loop waiting for
+messages to arrive, bouncing each message back to the sender.  Obviously
+this isn't a particularly useful program, but it does show the general
+ideas involved.
+
+
+     #include <stdio.h>
+     #include <errno.h>
+     #include <stdlib.h>
+     #include <sys/socket.h>
+     #include <sys/un.h>
+
+     #define SERVER  "/tmp/serversocket"
+     #define MAXMSG  512
+
+     int
+     main (void)
+     {
+       int sock;
+       char message[MAXMSG];
+       struct sockaddr_un name;
+       size_t size;
+       int nbytes;
+
+       /* Remove the filename first, it's ok if the call fails */
+       unlink (SERVER);
+
+       /* Make the socket, then loop endlessly. */
+       sock = make_named_socket (SERVER);
+       while (1)
+         {
+           /* Wait for a datagram. */
+           size = sizeof (name);
+           nbytes = recvfrom (sock, message, MAXMSG, 0,
+                              (struct sockaddr *) & name, &size);
+           if (nbytes < 0)
+             {
+               perror ("recfrom (server)");
+               exit (EXIT_FAILURE);
+             }
+
+           /* Give a diagnostic message. */
+           fprintf (stderr, "Server: got message: %s\n", message);
+
+           /* Bounce the message back to the sender. */
+           nbytes = sendto (sock, message, nbytes, 0,
+                            (struct sockaddr *) & name, size);
+           if (nbytes < 0)
+             {
+               perror ("sendto (server)");
+               exit (EXIT_FAILURE);
+             }
+         }
+     }
+
+
+File: libc.info,  Node: Example Receiver,  Prev: Datagram Example,  Up: Datagrams
+
+16.10.4 Example of Reading Datagrams
+------------------------------------
+
+Here is the client program corresponding to the server above.
+
+   It sends a datagram to the server and then waits for a reply.  Notice
+that the socket for the client (as well as for the server) in this
+example has to be given a name.  This is so that the server can direct a
+message back to the client.  Since the socket has no associated
+connection state, the only way the server can do this is by referencing
+the name of the client.
+
+
+     #include <stdio.h>
+     #include <errno.h>
+     #include <unistd.h>
+     #include <stdlib.h>
+     #include <sys/socket.h>
+     #include <sys/un.h>
+
+     #define SERVER  "/tmp/serversocket"
+     #define CLIENT  "/tmp/mysocket"
+     #define MAXMSG  512
+     #define MESSAGE "Yow!!! Are we having fun yet?!?"
+
+     int
+     main (void)
+     {
+       extern int make_named_socket (const char *name);
+       int sock;
+       char message[MAXMSG];
+       struct sockaddr_un name;
+       size_t size;
+       int nbytes;
+
+       /* Make the socket. */
+       sock = make_named_socket (CLIENT);
+
+       /* Initialize the server socket address. */
+       name.sun_family = AF_LOCAL;
+       strcpy (name.sun_path, SERVER);
+       size = strlen (name.sun_path) + sizeof (name.sun_family);
+
+       /* Send the datagram. */
+       nbytes = sendto (sock, MESSAGE, strlen (MESSAGE) + 1, 0,
+                        (struct sockaddr *) & name, size);
+       if (nbytes < 0)
+         {
+           perror ("sendto (client)");
+           exit (EXIT_FAILURE);
+         }
+
+       /* Wait for a reply. */
+       nbytes = recvfrom (sock, message, MAXMSG, 0, NULL, 0);
+       if (nbytes < 0)
+         {
+           perror ("recfrom (client)");
+           exit (EXIT_FAILURE);
+         }
+
+       /* Print a diagnostic message. */
+       fprintf (stderr, "Client: got message: %s\n", message);
+
+       /* Clean up. */
+       remove (CLIENT);
+       close (sock);
+     }
+
+   Keep in mind that datagram socket communications are unreliable.  In
+this example, the client program waits indefinitely if the message never
+reaches the server or if the server's response never comes back.  It's
+up to the user running the program to kill and restart it if desired.  A
+more automatic solution could be to use 'select' (*note Waiting for
+I/O::) to establish a timeout period for the reply, and in case of
+timeout either re-send the message or shut down the socket and exit.
+
+
+File: libc.info,  Node: Inetd,  Next: Socket Options,  Prev: Datagrams,  Up: Sockets
+
+16.11 The 'inetd' Daemon
+========================
+
+We've explained above how to write a server program that does its own
+listening.  Such a server must already be running in order for anyone to
+connect to it.
+
+   Another way to provide a service on an Internet port is to let the
+daemon program 'inetd' do the listening.  'inetd' is a program that runs
+all the time and waits (using 'select') for messages on a specified set
+of ports.  When it receives a message, it accepts the connection (if the
+socket style calls for connections) and then forks a child process to
+run the corresponding server program.  You specify the ports and their
+programs in the file '/etc/inetd.conf'.
+
+* Menu:
+
+* Inetd Servers::
+* Configuring Inetd::
+
+
+File: libc.info,  Node: Inetd Servers,  Next: Configuring Inetd,  Up: Inetd
+
+16.11.1 'inetd' Servers
+-----------------------
+
+Writing a server program to be run by 'inetd' is very simple.  Each time
+someone requests a connection to the appropriate port, a new server
+process starts.  The connection already exists at this time; the socket
+is available as the standard input descriptor and as the standard output
+descriptor (descriptors 0 and 1) in the server process.  Thus the server
+program can begin reading and writing data right away.  Often the
+program needs only the ordinary I/O facilities; in fact, a
+general-purpose filter program that knows nothing about sockets can work
+as a byte stream server run by 'inetd'.
+
+   You can also use 'inetd' for servers that use connectionless
+communication styles.  For these servers, 'inetd' does not try to accept
+a connection since no connection is possible.  It just starts the server
+program, which can read the incoming datagram packet from descriptor 0.
+The server program can handle one request and then exit, or you can
+choose to write it to keep reading more requests until no more arrive,
+and then exit.  You must specify which of these two techniques the
+server uses when you configure 'inetd'.
+
+
+File: libc.info,  Node: Configuring Inetd,  Prev: Inetd Servers,  Up: Inetd
+
+16.11.2 Configuring 'inetd'
+---------------------------
+
+The file '/etc/inetd.conf' tells 'inetd' which ports to listen to and
+what server programs to run for them.  Normally each entry in the file
+is one line, but you can split it onto multiple lines provided all but
+the first line of the entry start with whitespace.  Lines that start
+with '#' are comments.
+
+   Here are two standard entries in '/etc/inetd.conf':
+
+     ftp	stream	tcp	nowait	root	/libexec/ftpd	ftpd
+     talk	dgram	udp	wait	root	/libexec/talkd	talkd
+
+   An entry has this format:
+
+     SERVICE STYLE PROTOCOL WAIT USERNAME PROGRAM ARGUMENTS
+
+   The SERVICE field says which service this program provides.  It
+should be the name of a service defined in '/etc/services'.  'inetd'
+uses SERVICE to decide which port to listen on for this entry.
+
+   The fields STYLE and PROTOCOL specify the communication style and the
+protocol to use for the listening socket.  The style should be the name
+of a communication style, converted to lower case and with 'SOCK_'
+deleted--for example, 'stream' or 'dgram'.  PROTOCOL should be one of
+the protocols listed in '/etc/protocols'.  The typical protocol names
+are 'tcp' for byte stream connections and 'udp' for unreliable
+datagrams.
+
+   The WAIT field should be either 'wait' or 'nowait'.  Use 'wait' if
+STYLE is a connectionless style and the server, once started, handles
+multiple requests as they come in.  Use 'nowait' if 'inetd' should start
+a new process for each message or request that comes in.  If STYLE uses
+connections, then WAIT *must* be 'nowait'.
+
+   USER is the user name that the server should run as.  'inetd' runs as
+root, so it can set the user ID of its children arbitrarily.  It's best
+to avoid using 'root' for USER if you can; but some servers, such as
+Telnet and FTP, read a username and password themselves.  These servers
+need to be root initially so they can log in as commanded by the data
+coming over the network.
+
+   PROGRAM together with ARGUMENTS specifies the command to run to start
+the server.  PROGRAM should be an absolute file name specifying the
+executable file to run.  ARGUMENTS consists of any number of
+whitespace-separated words, which become the command-line arguments of
+PROGRAM.  The first word in ARGUMENTS is argument zero, which should by
+convention be the program name itself (sans directories).
+
+   If you edit '/etc/inetd.conf', you can tell 'inetd' to reread the
+file and obey its new contents by sending the 'inetd' process the
+'SIGHUP' signal.  You'll have to use 'ps' to determine the process ID of
+the 'inetd' process as it is not fixed.
+
+
+File: libc.info,  Node: Socket Options,  Next: Networks Database,  Prev: Inetd,  Up: Sockets
+
+16.12 Socket Options
+====================
+
+This section describes how to read or set various options that modify
+the behavior of sockets and their underlying communications protocols.
+
+   When you are manipulating a socket option, you must specify which
+"level" the option pertains to.  This describes whether the option
+applies to the socket interface, or to a lower-level communications
+protocol interface.
+
+* Menu:
+
+* Socket Option Functions::     The basic functions for setting and getting
+                                 socket options.
+* Socket-Level Options::        Details of the options at the socket level.
+
+
+File: libc.info,  Node: Socket Option Functions,  Next: Socket-Level Options,  Up: Socket Options
+
+16.12.1 Socket Option Functions
+-------------------------------
+
+Here are the functions for examining and modifying socket options.  They
+are declared in 'sys/socket.h'.
+
+ -- Function: int getsockopt (int SOCKET, int LEVEL, int OPTNAME, void
+          *OPTVAL, socklen_t *OPTLEN-PTR)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'getsockopt' function gets information about the value of
+     option OPTNAME at level LEVEL for socket SOCKET.
+
+     The option value is stored in a buffer that OPTVAL points to.
+     Before the call, you should supply in '*OPTLEN-PTR' the size of
+     this buffer; on return, it contains the number of bytes of
+     information actually stored in the buffer.
+
+     Most options interpret the OPTVAL buffer as a single 'int' value.
+
+     The actual return value of 'getsockopt' is '0' on success and '-1'
+     on failure.  The following 'errno' error conditions are defined:
+
+     'EBADF'
+          The SOCKET argument is not a valid file descriptor.
+
+     'ENOTSOCK'
+          The descriptor SOCKET is not a socket.
+
+     'ENOPROTOOPT'
+          The OPTNAME doesn't make sense for the given LEVEL.
+
+ -- Function: int setsockopt (int SOCKET, int LEVEL, int OPTNAME, const
+          void *OPTVAL, socklen_t OPTLEN)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is used to set the socket option OPTNAME at level
+     LEVEL for socket SOCKET.  The value of the option is passed in the
+     buffer OPTVAL of size OPTLEN.
+
+     The return value and error codes for 'setsockopt' are the same as
+     for 'getsockopt'.
+
+
+File: libc.info,  Node: Socket-Level Options,  Prev: Socket Option Functions,  Up: Socket Options
+
+16.12.2 Socket-Level Options
+----------------------------
+
+ -- Constant: int SOL_SOCKET
+     Use this constant as the LEVEL argument to 'getsockopt' or
+     'setsockopt' to manipulate the socket-level options described in
+     this section.
+
+Here is a table of socket-level option names; all are defined in the
+header file 'sys/socket.h'.
+
+'SO_DEBUG'
+
+     This option toggles recording of debugging information in the
+     underlying protocol modules.  The value has type 'int'; a nonzero
+     value means "yes".
+
+'SO_REUSEADDR'
+     This option controls whether 'bind' (*note Setting Address::)
+     should permit reuse of local addresses for this socket.  If you
+     enable this option, you can actually have two sockets with the same
+     Internet port number; but the system won't allow you to use the two
+     identically-named sockets in a way that would confuse the Internet.
+     The reason for this option is that some higher-level Internet
+     protocols, including FTP, require you to keep reusing the same port
+     number.
+
+     The value has type 'int'; a nonzero value means "yes".
+
+'SO_KEEPALIVE'
+     This option controls whether the underlying protocol should
+     periodically transmit messages on a connected socket.  If the peer
+     fails to respond to these messages, the connection is considered
+     broken.  The value has type 'int'; a nonzero value means "yes".
+
+'SO_DONTROUTE'
+     This option controls whether outgoing messages bypass the normal
+     message routing facilities.  If set, messages are sent directly to
+     the network interface instead.  The value has type 'int'; a nonzero
+     value means "yes".
+
+'SO_LINGER'
+     This option specifies what should happen when the socket of a type
+     that promises reliable delivery still has untransmitted messages
+     when it is closed; see *note Closing a Socket::.  The value has
+     type 'struct linger'.
+
+      -- Data Type: struct linger
+          This structure type has the following members:
+
+          'int l_onoff'
+               This field is interpreted as a boolean.  If nonzero,
+               'close' blocks until the data are transmitted or the
+               timeout period has expired.
+
+          'int l_linger'
+               This specifies the timeout period, in seconds.
+
+'SO_BROADCAST'
+     This option controls whether datagrams may be broadcast from the
+     socket.  The value has type 'int'; a nonzero value means "yes".
+
+'SO_OOBINLINE'
+     If this option is set, out-of-band data received on the socket is
+     placed in the normal input queue.  This permits it to be read using
+     'read' or 'recv' without specifying the 'MSG_OOB' flag.  *Note
+     Out-of-Band Data::.  The value has type 'int'; a nonzero value
+     means "yes".
+
+'SO_SNDBUF'
+     This option gets or sets the size of the output buffer.  The value
+     is a 'size_t', which is the size in bytes.
+
+'SO_RCVBUF'
+     This option gets or sets the size of the input buffer.  The value
+     is a 'size_t', which is the size in bytes.
+
+'SO_STYLE'
+'SO_TYPE'
+     This option can be used with 'getsockopt' only.  It is used to get
+     the socket's communication style.  'SO_TYPE' is the historical
+     name, and 'SO_STYLE' is the preferred name in GNU. The value has
+     type 'int' and its value designates a communication style; see
+     *note Communication Styles::.
+
+'SO_ERROR'
+
+     This option can be used with 'getsockopt' only.  It is used to
+     reset the error status of the socket.  The value is an 'int', which
+     represents the previous error status.
+
+
+File: libc.info,  Node: Networks Database,  Prev: Socket Options,  Up: Sockets
+
+16.13 Networks Database
+=======================
+
+Many systems come with a database that records a list of networks known
+to the system developer.  This is usually kept either in the file
+'/etc/networks' or in an equivalent from a name server.  This data base
+is useful for routing programs such as 'route', but it is not useful for
+programs that simply communicate over the network.  We provide functions
+to access this database, which are declared in 'netdb.h'.
+
+ -- Data Type: struct netent
+     This data type is used to represent information about entries in
+     the networks database.  It has the following members:
+
+     'char *n_name'
+          This is the "official" name of the network.
+
+     'char **n_aliases'
+          These are alternative names for the network, represented as a
+          vector of strings.  A null pointer terminates the array.
+
+     'int n_addrtype'
+          This is the type of the network number; this is always equal
+          to 'AF_INET' for Internet networks.
+
+     'unsigned long int n_net'
+          This is the network number.  Network numbers are returned in
+          host byte order; see *note Byte Order::.
+
+   Use the 'getnetbyname' or 'getnetbyaddr' functions to search the
+networks database for information about a specific network.  The
+information is returned in a statically-allocated structure; you must
+copy the information if you need to save it.
+
+ -- Function: struct netent * getnetbyname (const char *NAME)
+     Preliminary: | MT-Unsafe race:netbyname env locale | AS-Unsafe
+     dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note
+     POSIX Safety Concepts::.
+
+     The 'getnetbyname' function returns information about the network
+     named NAME.  It returns a null pointer if there is no such network.
+
+ -- Function: struct netent * getnetbyaddr (uint32_t NET, int TYPE)
+     Preliminary: | MT-Unsafe race:netbyaddr locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     The 'getnetbyaddr' function returns information about the network
+     of type TYPE with number NET.  You should specify a value of
+     'AF_INET' for the TYPE argument for Internet networks.
+
+     'getnetbyaddr' returns a null pointer if there is no such network.
+
+   You can also scan the networks database using 'setnetent',
+'getnetent' and 'endnetent'.  Be careful when using these functions
+because they are not reentrant.
+
+ -- Function: void setnetent (int STAYOPEN)
+     Preliminary: | MT-Unsafe race:netent env locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     This function opens and rewinds the networks database.
+
+     If the STAYOPEN argument is nonzero, this sets a flag so that
+     subsequent calls to 'getnetbyname' or 'getnetbyaddr' will not close
+     the database (as they usually would).  This makes for more
+     efficiency if you call those functions several times, by avoiding
+     reopening the database for each call.
+
+ -- Function: struct netent * getnetent (void)
+     Preliminary: | MT-Unsafe race:netent race:netentbuf env locale |
+     AS-Unsafe dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem |
+     *Note POSIX Safety Concepts::.
+
+     This function returns the next entry in the networks database.  It
+     returns a null pointer if there are no more entries.
+
+ -- Function: void endnetent (void)
+     Preliminary: | MT-Unsafe race:netent env locale | AS-Unsafe dlopen
+     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     Safety Concepts::.
+
+     This function closes the networks database.
+
+
+File: libc.info,  Node: Low-Level Terminal Interface,  Next: Syslog,  Prev: Sockets,  Up: Top
+
+17 Low-Level Terminal Interface
+*******************************
+
+This chapter describes functions that are specific to terminal devices.
+You can use these functions to do things like turn off input echoing;
+set serial line characteristics such as line speed and flow control; and
+change which characters are used for end-of-file, command-line editing,
+sending signals, and similar control functions.
+
+   Most of the functions in this chapter operate on file descriptors.
+*Note Low-Level I/O::, for more information about what a file descriptor
+is and how to open a file descriptor for a terminal device.
+
+* Menu:
+
+* Is It a Terminal::            How to determine if a file is a terminal
+			         device, and what its name is.
+* I/O Queues::                  About flow control and typeahead.
+* Canonical or Not::            Two basic styles of input processing.
+* Terminal Modes::              How to examine and modify flags controlling
+			         details of terminal I/O: echoing,
+                                 signals, editing.  Posix.
+* BSD Terminal Modes::          BSD compatible terminal mode setting
+* Line Control::                Sending break sequences, clearing
+                                 terminal buffers ...
+* Noncanon Example::            How to read single characters without echo.
+* Pseudo-Terminals::            How to open a pseudo-terminal.
+
+
+File: libc.info,  Node: Is It a Terminal,  Next: I/O Queues,  Up: Low-Level Terminal Interface
+
+17.1 Identifying Terminals
+==========================
+
+The functions described in this chapter only work on files that
+correspond to terminal devices.  You can find out whether a file
+descriptor is associated with a terminal by using the 'isatty' function.
+
+   Prototypes for the functions in this section are declared in the
+header file 'unistd.h'.
+
+ -- Function: int isatty (int FILEDES)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function returns '1' if FILEDES is a file descriptor
+     associated with an open terminal device, and 0 otherwise.
+
+   If a file descriptor is associated with a terminal, you can get its
+associated file name using the 'ttyname' function.  See also the
+'ctermid' function, described in *note Identifying the Terminal::.
+
+ -- Function: char * ttyname (int FILEDES)
+     Preliminary: | MT-Unsafe race:ttyname | AS-Unsafe heap lock |
+     AC-Unsafe lock fd mem | *Note POSIX Safety Concepts::.
+
+     If the file descriptor FILEDES is associated with a terminal
+     device, the 'ttyname' function returns a pointer to a
+     statically-allocated, null-terminated string containing the file
+     name of the terminal file.  The value is a null pointer if the file
+     descriptor isn't associated with a terminal, or the file name
+     cannot be determined.
+
+ -- Function: int ttyname_r (int FILEDES, char *BUF, size_t LEN)
+     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
+     POSIX Safety Concepts::.
+
+     The 'ttyname_r' function is similar to the 'ttyname' function
+     except that it places its result into the user-specified buffer
+     starting at BUF with length LEN.
+
+     The normal return value from 'ttyname_r' is 0.  Otherwise an error
+     number is returned to indicate the error.  The following 'errno'
+     error conditions are defined for this function:
+
+     'EBADF'
+          The FILEDES argument is not a valid file descriptor.
+
+     'ENOTTY'
+          The FILEDES is not associated with a terminal.
+
+     'ERANGE'
+          The buffer length LEN is too small to store the string to be
+          returned.
+
+
+File: libc.info,  Node: I/O Queues,  Next: Canonical or Not,  Prev: Is It a Terminal,  Up: Low-Level Terminal Interface
+
+17.2 I/O Queues
+===============
+
+Many of the remaining functions in this section refer to the input and
+output queues of a terminal device.  These queues implement a form of
+buffering _within the kernel_ independent of the buffering implemented
+by I/O streams (*note I/O on Streams::).
+
+   The "terminal input queue" is also sometimes referred to as its
+"typeahead buffer".  It holds the characters that have been received
+from the terminal but not yet read by any process.
+
+   The size of the input queue is described by the 'MAX_INPUT' and '_POSIX_MAX_INPUT'
+parameters; see *note Limits for Files::.  You are guaranteed a queue
+size of at least 'MAX_INPUT', but the queue might be larger, and might
+even dynamically change size.  If input flow control is enabled by
+setting the 'IXOFF' input mode bit (*note Input Modes::), the terminal
+driver transmits STOP and START characters to the terminal when
+necessary to prevent the queue from overflowing.  Otherwise, input may
+be lost if it comes in too fast from the terminal.  In canonical mode,
+all input stays in the queue until a newline character is received, so
+the terminal input queue can fill up when you type a very long line.
+*Note Canonical or Not::.
+
+   The "terminal output queue" is like the input queue, but for output;
+it contains characters that have been written by processes, but not yet
+transmitted to the terminal.  If output flow control is enabled by
+setting the 'IXON' input mode bit (*note Input Modes::), the terminal
+driver obeys START and STOP characters sent by the terminal to stop and
+restart transmission of output.
+
+   "Clearing" the terminal input queue means discarding any characters
+that have been received but not yet read.  Similarly, clearing the
+terminal output queue means discarding any characters that have been
+written but not yet transmitted.
 
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-7 b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-7
index 915e3e5..4caacaa 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-7
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-7
@@ -1,7 +1,24 @@
-This is
-/usr/local/google/home/jnewlin/src/uclibc/buildroot/output/build/glibc-2.19/build/manual/libc.info,
-produced by makeinfo version 4.13 from libc.texinfo.
+This is libc.info, produced by makeinfo version 5.2 from libc.texinfo.
 
+This file documents the GNU C Library.
+
+   This is 'The GNU C Library Reference Manual', for version 2.19
+(Buildroot).
+
+   Copyright (C) 1993-2014 Free Software Foundation, Inc.
+
+   Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being "Free Software Needs Free Documentation" and
+"GNU Lesser General Public License", the Front-Cover texts being "A GNU
+Manual", and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled "GNU Free Documentation
+License".
+
+   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
+modify this GNU manual.  Buying copies from the FSF supports it in
+developing GNU and promoting software freedom."
 INFO-DIR-SECTION Software libraries
 START-INFO-DIR-ENTRY
 * Libc: (libc).                 C library.
@@ -1692,7301 +1709,4821 @@
 * ynl: (libc)Special Functions.
 END-INFO-DIR-ENTRY
 
-   This file documents the GNU C Library.
+
+File: libc.info,  Node: Canonical or Not,  Next: Terminal Modes,  Prev: I/O Queues,  Up: Low-Level Terminal Interface
 
-   This is `The GNU C Library Reference Manual', for version 2.19
-(Buildroot).
+17.3 Two Styles of Input: Canonical or Not
+==========================================
 
-   Copyright (C) 1993-2014 Free Software Foundation, Inc.
+POSIX systems support two basic modes of input: canonical and
+noncanonical.
 
-   Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version
-1.3 or any later version published by the Free Software Foundation;
-with the Invariant Sections being "Free Software Needs Free
-Documentation" and "GNU Lesser General Public License", the Front-Cover
-texts being "A GNU Manual", and with the Back-Cover Texts as in (a)
-below.  A copy of the license is included in the section entitled "GNU
-Free Documentation License".
+   In "canonical input processing" mode, terminal input is processed in
+lines terminated by newline (''\n''), EOF, or EOL characters.  No input
+can be read until an entire line has been typed by the user, and the
+'read' function (*note I/O Primitives::) returns at most a single line
+of input, no matter how many bytes are requested.
 
-   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
-modify this GNU manual.  Buying copies from the FSF supports it in
-developing GNU and promoting software freedom."
+   In canonical input mode, the operating system provides input editing
+facilities: some characters are interpreted specially to perform editing
+operations within the current line of text, such as ERASE and KILL.
+*Note Editing Characters::.
+
+   The constants '_POSIX_MAX_CANON' and 'MAX_CANON' parameterize the
+maximum number of bytes which may appear in a single line of canonical
+input.  *Note Limits for Files::.  You are guaranteed a maximum line
+length of at least 'MAX_CANON' bytes, but the maximum might be larger,
+and might even dynamically change size.
+
+   In "noncanonical input processing" mode, characters are not grouped
+into lines, and ERASE and KILL processing is not performed.  The
+granularity with which bytes are read in noncanonical input mode is
+controlled by the MIN and TIME settings.  *Note Noncanonical Input::.
+
+   Most programs use canonical input mode, because this gives the user a
+way to edit input line by line.  The usual reason to use noncanonical
+mode is when the program accepts single-character commands or provides
+its own editing facilities.
+
+   The choice of canonical or noncanonical input is controlled by the
+'ICANON' flag in the 'c_lflag' member of 'struct termios'.  *Note Local
+Modes::.
 
 
-File: libc.info,  Node: Formatting Calendar Time,  Next: Parsing Date and Time,  Prev: High Accuracy Clock,  Up: Calendar Time
+File: libc.info,  Node: Terminal Modes,  Next: BSD Terminal Modes,  Prev: Canonical or Not,  Up: Low-Level Terminal Interface
 
-21.4.5 Formatting Calendar Time
--------------------------------
+17.4 Terminal Modes
+===================
 
-The functions described in this section format calendar time values as
-strings.  These functions are declared in the header file `time.h'.  
+This section describes the various terminal attributes that control how
+input and output are done.  The functions, data structures, and symbolic
+constants are all declared in the header file 'termios.h'.
 
- -- Function: char * asctime (const struct tm *BROKENTIME)
-     Preliminary: | MT-Unsafe race:asctime locale | AS-Unsafe | AC-Safe
-     | *Note POSIX Safety Concepts::.
-
-     The `asctime' function converts the broken-down time value that
-     BROKENTIME points to into a string in a standard format:
-
-          "Tue May 21 13:46:22 1991\n"
-
-     The abbreviations for the days of week are: `Sun', `Mon', `Tue',
-     `Wed', `Thu', `Fri', and `Sat'.
-
-     The abbreviations for the months are: `Jan', `Feb', `Mar', `Apr',
-     `May', `Jun', `Jul', `Aug', `Sep', `Oct', `Nov', and `Dec'.
-
-     The return value points to a statically allocated string, which
-     might be overwritten by subsequent calls to `asctime' or `ctime'.
-     (But no other library function overwrites the contents of this
-     string.)
-
- -- Function: char * asctime_r (const struct tm *BROKENTIME, char
-          *BUFFER)
-     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     This function is similar to `asctime' but instead of placing the
-     result in a static buffer it writes the string in the buffer
-     pointed to by the parameter BUFFER.  This buffer should have room
-     for at least 26 bytes, including the terminating null.
-
-     If no error occurred the function returns a pointer to the string
-     the result was written into, i.e., it returns BUFFER.  Otherwise
-     return `NULL'.
-
- -- Function: char * ctime (const time_t *TIME)
-     Preliminary: | MT-Unsafe race:tmbuf race:asctime env locale |
-     AS-Unsafe heap lock | AC-Unsafe lock mem fd | *Note POSIX Safety
-     Concepts::.
-
-     The `ctime' function is similar to `asctime', except that you
-     specify the calendar time argument as a `time_t' simple time value
-     rather than in broken-down local time format.  It is equivalent to
-
-          asctime (localtime (TIME))
-
-     Calling `ctime' also sets the current time zone as if `tzset' were
-     called.  *Note Time Zone Functions::.
-
- -- Function: char * ctime_r (const time_t *TIME, char *BUFFER)
-     Preliminary: | MT-Safe env locale | AS-Unsafe heap lock |
-     AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
-
-     This function is similar to `ctime', but places the result in the
-     string pointed to by BUFFER.  It is equivalent to (written using
-     gcc extensions, *note Statement Exprs: (gcc)Statement Exprs.):
-
-          ({ struct tm tm; asctime_r (localtime_r (time, &tm), buf); })
-
-     If no error occurred the function returns a pointer to the string
-     the result was written into, i.e., it returns BUFFER.  Otherwise
-     return `NULL'.
-
- -- Function: size_t strftime (char *S, size_t SIZE, const char
-          *TEMPLATE, const struct tm *BROKENTIME)
-     Preliminary: | MT-Safe env locale | AS-Unsafe corrupt heap lock
-     dlopen | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety
-     Concepts::.
-
-     This function is similar to the `sprintf' function (*note
-     Formatted Input::), but the conversion specifications that can
-     appear in the format template TEMPLATE are specialized for
-     printing components of the date and time BROKENTIME according to
-     the locale currently specified for time conversion (*note
-     Locales::) and the current time zone (*note Time Zone Functions::).
-
-     Ordinary characters appearing in the TEMPLATE are copied to the
-     output string S; this can include multibyte character sequences.
-     Conversion specifiers are introduced by a `%' character, followed
-     by an optional flag which can be one of the following.  These flags
-     are all GNU extensions. The first three affect only the output of
-     numbers:
-
-    `_'
-          The number is padded with spaces.
-
-    `-'
-          The number is not padded at all.
-
-    `0'
-          The number is padded with zeros even if the format specifies
-          padding with spaces.
-
-    `^'
-          The output uses uppercase characters, but only if this is
-          possible (*note Case Conversion::).
-
-     The default action is to pad the number with zeros to keep it a
-     constant width.  Numbers that do not have a range indicated below
-     are never padded, since there is no natural width for them.
-
-     Following the flag an optional specification of the width is
-     possible.  This is specified in decimal notation.  If the natural
-     size of the output is of the field has less than the specified
-     number of characters, the result is written right adjusted and
-     space padded to the given size.
-
-     An optional modifier can follow the optional flag and width
-     specification.  The modifiers, which were first standardized by
-     POSIX.2-1992 and by ISO C99, are:
-
-    `E'
-          Use the locale's alternate representation for date and time.
-          This modifier applies to the `%c', `%C', `%x', `%X', `%y' and
-          `%Y' format specifiers.  In a Japanese locale, for example,
-          `%Ex' might yield a date format based on the Japanese
-          Emperors' reigns.
-
-    `O'
-          Use the locale's alternate numeric symbols for numbers.  This
-          modifier applies only to numeric format specifiers.
-
-     If the format supports the modifier but no alternate representation
-     is available, it is ignored.
-
-     The conversion specifier ends with a format specifier taken from
-     the following list.  The whole `%' sequence is replaced in the
-     output string as follows:
-
-    `%a'
-          The abbreviated weekday name according to the current locale.
-
-    `%A'
-          The full weekday name according to the current locale.
-
-    `%b'
-          The abbreviated month name according to the current locale.
-
-    `%B'
-          The full month name according to the current locale.
-
-          Using `%B' together with `%d' produces grammatically
-          incorrect results for some locales.
-
-    `%c'
-          The preferred calendar time representation for the current
-          locale.
-
-    `%C'
-          The century of the year.  This is equivalent to the greatest
-          integer not greater than the year divided by 100.
-
-          This format was first standardized by POSIX.2-1992 and by
-          ISO C99.
-
-    `%d'
-          The day of the month as a decimal number (range `01' through
-          `31').
-
-    `%D'
-          The date using the format `%m/%d/%y'.
-
-          This format was first standardized by POSIX.2-1992 and by
-          ISO C99.
-
-    `%e'
-          The day of the month like with `%d', but padded with blank
-          (range ` 1' through `31').
-
-          This format was first standardized by POSIX.2-1992 and by
-          ISO C99.
-
-    `%F'
-          The date using the format `%Y-%m-%d'.  This is the form
-          specified in the ISO 8601 standard and is the preferred form
-          for all uses.
-
-          This format was first standardized by ISO C99 and by
-          POSIX.1-2001.
-
-    `%g'
-          The year corresponding to the ISO week number, but without
-          the century (range `00' through `99').  This has the same
-          format and value as `%y', except that if the ISO week number
-          (see `%V') belongs to the previous or next year, that year is
-          used instead.
-
-          This format was first standardized by ISO C99 and by
-          POSIX.1-2001.
-
-    `%G'
-          The year corresponding to the ISO week number.  This has the
-          same format and value as `%Y', except that if the ISO week
-          number (see `%V') belongs to the previous or next year, that
-          year is used instead.
-
-          This format was first standardized by ISO C99 and by
-          POSIX.1-2001 but was previously available as a GNU extension.
-
-    `%h'
-          The abbreviated month name according to the current locale.
-          The action is the same as for `%b'.
-
-          This format was first standardized by POSIX.2-1992 and by
-          ISO C99.
-
-    `%H'
-          The hour as a decimal number, using a 24-hour clock (range
-          `00' through `23').
-
-    `%I'
-          The hour as a decimal number, using a 12-hour clock (range
-          `01' through `12').
-
-    `%j'
-          The day of the year as a decimal number (range `001' through
-          `366').
-
-    `%k'
-          The hour as a decimal number, using a 24-hour clock like
-          `%H', but padded with blank (range ` 0' through `23').
-
-          This format is a GNU extension.
-
-    `%l'
-          The hour as a decimal number, using a 12-hour clock like
-          `%I', but padded with blank (range ` 1' through `12').
-
-          This format is a GNU extension.
-
-    `%m'
-          The month as a decimal number (range `01' through `12').
-
-    `%M'
-          The minute as a decimal number (range `00' through `59').
-
-    `%n'
-          A single `\n' (newline) character.
-
-          This format was first standardized by POSIX.2-1992 and by
-          ISO C99.
-
-    `%p'
-          Either `AM' or `PM', according to the given time value; or the
-          corresponding strings for the current locale.  Noon is
-          treated as `PM' and midnight as `AM'.  In most locales
-          `AM'/`PM' format is not supported, in such cases `"%p"'
-          yields an empty string.
-
-    `%P'
-          Either `am' or `pm', according to the given time value; or the
-          corresponding strings for the current locale, printed in
-          lowercase characters.  Noon is treated as `pm' and midnight
-          as `am'.  In most locales `AM'/`PM' format is not supported,
-          in such cases `"%P"' yields an empty string.
-
-          This format is a GNU extension.
-
-    `%r'
-          The complete calendar time using the AM/PM format of the
-          current locale.
-
-          This format was first standardized by POSIX.2-1992 and by
-          ISO C99.  In the POSIX locale, this format is equivalent to
-          `%I:%M:%S %p'.
-
-    `%R'
-          The hour and minute in decimal numbers using the format
-          `%H:%M'.
-
-          This format was first standardized by ISO C99 and by
-          POSIX.1-2001 but was previously available as a GNU extension.
-
-    `%s'
-          The number of seconds since the epoch, i.e., since 1970-01-01
-          00:00:00 UTC.  Leap seconds are not counted unless leap
-          second support is available.
-
-          This format is a GNU extension.
-
-    `%S'
-          The seconds as a decimal number (range `00' through `60').
-
-    `%t'
-          A single `\t' (tabulator) character.
-
-          This format was first standardized by POSIX.2-1992 and by
-          ISO C99.
-
-    `%T'
-          The time of day using decimal numbers using the format
-          `%H:%M:%S'.
-
-          This format was first standardized by POSIX.2-1992 and by
-          ISO C99.
-
-    `%u'
-          The day of the week as a decimal number (range `1' through
-          `7'), Monday being `1'.
-
-          This format was first standardized by POSIX.2-1992 and by
-          ISO C99.
-
-    `%U'
-          The week number of the current year as a decimal number
-          (range `00' through `53'), starting with the first Sunday as
-          the first day of the first week.  Days preceding the first
-          Sunday in the year are considered to be in week `00'.
-
-    `%V'
-          The ISO 8601:1988 week number as a decimal number (range `01'
-          through `53').  ISO weeks start with Monday and end with
-          Sunday.  Week `01' of a year is the first week which has the
-          majority of its days in that year; this is equivalent to the
-          week containing the year's first Thursday, and it is also
-          equivalent to the week containing January 4.  Week `01' of a
-          year can contain days from the previous year.  The week
-          before week `01' of a year is the last week (`52' or `53') of
-          the previous year even if it contains days from the new year.
-
-          This format was first standardized by POSIX.2-1992 and by
-          ISO C99.
-
-    `%w'
-          The day of the week as a decimal number (range `0' through
-          `6'), Sunday being `0'.
-
-    `%W'
-          The week number of the current year as a decimal number
-          (range `00' through `53'), starting with the first Monday as
-          the first day of the first week.  All days preceding the
-          first Monday in the year are considered to be in week `00'.
-
-    `%x'
-          The preferred date representation for the current locale.
-
-    `%X'
-          The preferred time of day representation for the current
-          locale.
-
-    `%y'
-          The year without a century as a decimal number (range `00'
-          through `99').  This is equivalent to the year modulo 100.
-
-    `%Y'
-          The year as a decimal number, using the Gregorian calendar.
-          Years before the year `1' are numbered `0', `-1', and so on.
-
-    `%z'
-          RFC 822/ISO 8601:1988 style numeric time zone (e.g., `-0600'
-          or `+0100'), or nothing if no time zone is determinable.
-
-          This format was first standardized by ISO C99 and by
-          POSIX.1-2001 but was previously available as a GNU extension.
-
-          In the POSIX locale, a full RFC 822 timestamp is generated by
-          the format `"%a, %d %b %Y %H:%M:%S %z"' (or the equivalent
-          `"%a, %d %b %Y %T %z"').
-
-    `%Z'
-          The time zone abbreviation (empty if the time zone can't be
-          determined).
-
-    `%%'
-          A literal `%' character.
-
-     The SIZE parameter can be used to specify the maximum number of
-     characters to be stored in the array S, including the terminating
-     null character.  If the formatted time requires more than SIZE
-     characters, `strftime' returns zero and the contents of the array
-     S are undefined.  Otherwise the return value indicates the number
-     of characters placed in the array S, not including the terminating
-     null character.
-
-     _Warning:_ This convention for the return value which is prescribed
-     in ISO C can lead to problems in some situations.  For certain
-     format strings and certain locales the output really can be the
-     empty string and this cannot be discovered by testing the return
-     value only.  E.g., in most locales the AM/PM time format is not
-     supported (most of the world uses the 24 hour time
-     representation).  In such locales `"%p"' will return the empty
-     string, i.e., the return value is zero.  To detect situations like
-     this something similar to the following code should be used:
-
-          buf[0] = '\1';
-          len = strftime (buf, bufsize, format, tp);
-          if (len == 0 && buf[0] != '\0')
-            {
-              /* Something went wrong in the strftime call.  */
-              ...
-            }
-
-     If S is a null pointer, `strftime' does not actually write
-     anything, but instead returns the number of characters it would
-     have written.
-
-     Calling `strftime' also sets the current time zone as if `tzset'
-     were called; `strftime' uses this information instead of
-     BROKENTIME's `tm_gmtoff' and `tm_zone' members.  *Note Time Zone
-     Functions::.
-
-     For an example of `strftime', see *note Time Functions Example::.
-
- -- Function: size_t wcsftime (wchar_t *S, size_t SIZE, const wchar_t
-          *TEMPLATE, const struct tm *BROKENTIME)
-     Preliminary: | MT-Safe env locale | AS-Unsafe corrupt heap lock
-     dlopen | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety
-     Concepts::.
-
-     The `wcsftime' function is equivalent to the `strftime' function
-     with the difference that it operates on wide character strings.
-     The buffer where the result is stored, pointed to by S, must be an
-     array of wide characters.  The parameter SIZE which specifies the
-     size of the output buffer gives the number of wide character, not
-     the number of bytes.
-
-     Also the format string TEMPLATE is a wide character string.  Since
-     all characters needed to specify the format string are in the basic
-     character set it is portably possible to write format strings in
-     the C source code using the `L"..."' notation.  The parameter
-     BROKENTIME has the same meaning as in the `strftime' call.
-
-     The `wcsftime' function supports the same flags, modifiers, and
-     format specifiers as the `strftime' function.
-
-     The return value of `wcsftime' is the number of wide characters
-     stored in `s'.  When more characters would have to be written than
-     can be placed in the buffer S the return value is zero, with the
-     same problems indicated in the `strftime' documentation.
-
-
-File: libc.info,  Node: Parsing Date and Time,  Next: TZ Variable,  Prev: Formatting Calendar Time,  Up: Calendar Time
-
-21.4.6 Convert textual time and date information back
------------------------------------------------------
-
-The ISO C standard does not specify any functions which can convert the
-output of the `strftime' function back into a binary format.  This led
-to a variety of more-or-less successful implementations with different
-interfaces over the years.  Then the Unix standard was extended by the
-addition of two functions: `strptime' and `getdate'.  Both have strange
-interfaces but at least they are widely available.
+   Don't confuse terminal attributes with file attributes.  A device
+special file which is associated with a terminal has file attributes as
+described in *note File Attributes::.  These are unrelated to the
+attributes of the terminal device itself, which are discussed in this
+section.
 
 * Menu:
 
-* Low-Level Time String Parsing::  Interpret string according to given format.
-* General Time String Parsing::    User-friendly function to parse data and
-                                    time strings.
+* Mode Data Types::             The data type 'struct termios' and
+                                 related types.
+* Mode Functions::              Functions to read and set the terminal
+                                 attributes.
+* Setting Modes::               The right way to set terminal attributes
+                                 reliably.
+* Input Modes::                 Flags controlling low-level input handling.
+* Output Modes::                Flags controlling low-level output handling.
+* Control Modes::               Flags controlling serial port behavior.
+* Local Modes::                 Flags controlling high-level input handling.
+* Line Speed::                  How to read and set the terminal line speed.
+* Special Characters::          Characters that have special effects,
+			         and how to change them.
+* Noncanonical Input::          Controlling how long to wait for input.
 
 
-File: libc.info,  Node: Low-Level Time String Parsing,  Next: General Time String Parsing,  Up: Parsing Date and Time
+File: libc.info,  Node: Mode Data Types,  Next: Mode Functions,  Up: Terminal Modes
 
-21.4.6.1 Interpret string according to given format
-...................................................
+17.4.1 Terminal Mode Data Types
+-------------------------------
 
-The first function is rather low-level.  It is nevertheless frequently
-used in software since it is better known.  Its interface and
-implementation are heavily influenced by the `getdate' function, which
-is defined and implemented in terms of calls to `strptime'.
+The entire collection of attributes of a terminal is stored in a
+structure of type 'struct termios'.  This structure is used with the
+functions 'tcgetattr' and 'tcsetattr' to read and set the attributes.
 
- -- Function: char * strptime (const char *S, const char *FMT, struct
-          tm *TP)
-     Preliminary: | MT-Safe env locale | AS-Unsafe heap lock |
-     AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
+ -- Data Type: struct termios
+     Structure that records all the I/O attributes of a terminal.  The
+     structure includes at least the following members:
 
-     The `strptime' function parses the input string S according to the
-     format string FMT and stores its results in the structure TP.
+     'tcflag_t c_iflag'
+          A bit mask specifying flags for input modes; see *note Input
+          Modes::.
 
-     The input string could be generated by a `strftime' call or
-     obtained any other way.  It does not need to be in a
-     human-recognizable format; e.g. a date passed as `"02:1999:9"' is
-     acceptable, even though it is ambiguous without context.  As long
-     as the format string FMT matches the input string the function
-     will succeed.
+     'tcflag_t c_oflag'
+          A bit mask specifying flags for output modes; see *note Output
+          Modes::.
 
-     The user has to make sure, though, that the input can be parsed in
-     a unambiguous way.  The string `"1999112"' can be parsed using the
-     format `"%Y%m%d"' as 1999-1-12, 1999-11-2, or even 19991-1-2.  It
-     is necessary to add appropriate separators to reliably get results.
+     'tcflag_t c_cflag'
+          A bit mask specifying flags for control modes; see *note
+          Control Modes::.
 
-     The format string consists of the same components as the format
-     string of the `strftime' function.  The only difference is that
-     the flags `_', `-', `0', and `^' are not allowed.  Several of the
-     distinct formats of `strftime' do the same work in `strptime'
-     since differences like case of the input do not matter.  For
-     reasons of symmetry all formats are supported, though.
+     'tcflag_t c_lflag'
+          A bit mask specifying flags for local modes; see *note Local
+          Modes::.
 
-     The modifiers `E' and `O' are also allowed everywhere the
-     `strftime' function allows them.
+     'cc_t c_cc[NCCS]'
+          An array specifying which characters are associated with
+          various control functions; see *note Special Characters::.
 
-     The formats are:
+     The 'struct termios' structure also contains members which encode
+     input and output transmission speeds, but the representation is not
+     specified.  *Note Line Speed::, for how to examine and store the
+     speed values.
 
-    `%a'
-    `%A'
-          The weekday name according to the current locale, in
-          abbreviated form or the full name.
+   The following sections describe the details of the members of the
+'struct termios' structure.
 
-    `%b'
-    `%B'
-    `%h'
-          The month name according to the current locale, in
-          abbreviated form or the full name.
+ -- Data Type: tcflag_t
+     This is an unsigned integer type used to represent the various bit
+     masks for terminal flags.
 
-    `%c'
-          The date and time representation for the current locale.
+ -- Data Type: cc_t
+     This is an unsigned integer type used to represent characters
+     associated with various terminal control functions.
 
-    `%Ec'
-          Like `%c' but the locale's alternative date and time format
-          is used.
-
-    `%C'
-          The century of the year.
-
-          It makes sense to use this format only if the format string
-          also contains the `%y' format.
-
-    `%EC'
-          The locale's representation of the period.
-
-          Unlike `%C' it sometimes makes sense to use this format since
-          some cultures represent years relative to the beginning of
-          eras instead of using the Gregorian years.
-
-    `%d'
-
-    `%e'
-          The day of the month as a decimal number (range `1' through
-          `31').  Leading zeroes are permitted but not required.
-
-    `%Od'
-    `%Oe'
-          Same as `%d' but using the locale's alternative numeric
-          symbols.
-
-          Leading zeroes are permitted but not required.
-
-    `%D'
-          Equivalent to `%m/%d/%y'.
-
-    `%F'
-          Equivalent to `%Y-%m-%d', which is the ISO 8601 date format.
-
-          This is a GNU extension following an ISO C99 extension to
-          `strftime'.
-
-    `%g'
-          The year corresponding to the ISO week number, but without
-          the century (range `00' through `99').
-
-          _Note:_ Currently, this is not fully implemented.  The format
-          is recognized, input is consumed but no field in TM is set.
-
-          This format is a GNU extension following a GNU extension of
-          `strftime'.
-
-    `%G'
-          The year corresponding to the ISO week number.
-
-          _Note:_ Currently, this is not fully implemented.  The format
-          is recognized, input is consumed but no field in TM is set.
-
-          This format is a GNU extension following a GNU extension of
-          `strftime'.
-
-    `%H'
-    `%k'
-          The hour as a decimal number, using a 24-hour clock (range
-          `00' through `23').
-
-          `%k' is a GNU extension following a GNU extension of
-          `strftime'.
-
-    `%OH'
-          Same as `%H' but using the locale's alternative numeric
-          symbols.
-
-    `%I'
-    `%l'
-          The hour as a decimal number, using a 12-hour clock (range
-          `01' through `12').
-
-          `%l' is a GNU extension following a GNU extension of
-          `strftime'.
-
-    `%OI'
-          Same as `%I' but using the locale's alternative numeric
-          symbols.
-
-    `%j'
-          The day of the year as a decimal number (range `1' through
-          `366').
-
-          Leading zeroes are permitted but not required.
-
-    `%m'
-          The month as a decimal number (range `1' through `12').
-
-          Leading zeroes are permitted but not required.
-
-    `%Om'
-          Same as `%m' but using the locale's alternative numeric
-          symbols.
-
-    `%M'
-          The minute as a decimal number (range `0' through `59').
-
-          Leading zeroes are permitted but not required.
-
-    `%OM'
-          Same as `%M' but using the locale's alternative numeric
-          symbols.
-
-    `%n'
-    `%t'
-          Matches any white space.
-
-    `%p'
-
-    `%P'
-          The locale-dependent equivalent to `AM' or `PM'.
-
-          This format is not useful unless `%I' or `%l' is also used.
-          Another complication is that the locale might not define
-          these values at all and therefore the conversion fails.
-
-          `%P' is a GNU extension following a GNU extension to
-          `strftime'.
-
-    `%r'
-          The complete time using the AM/PM format of the current
-          locale.
-
-          A complication is that the locale might not define this
-          format at all and therefore the conversion fails.
-
-    `%R'
-          The hour and minute in decimal numbers using the format
-          `%H:%M'.
-
-          `%R' is a GNU extension following a GNU extension to
-          `strftime'.
-
-    `%s'
-          The number of seconds since the epoch, i.e., since 1970-01-01
-          00:00:00 UTC.  Leap seconds are not counted unless leap
-          second support is available.
-
-          `%s' is a GNU extension following a GNU extension to
-          `strftime'.
-
-    `%S'
-          The seconds as a decimal number (range `0' through `60').
-
-          Leading zeroes are permitted but not required.
-
-          *NB:* The Unix specification says the upper bound on this
-          value is `61', a result of a decision to allow double leap
-          seconds.  You will not see the value `61' because no minute
-          has more than one leap second, but the myth persists.
-
-    `%OS'
-          Same as `%S' but using the locale's alternative numeric
-          symbols.
-
-    `%T'
-          Equivalent to the use of `%H:%M:%S' in this place.
-
-    `%u'
-          The day of the week as a decimal number (range `1' through
-          `7'), Monday being `1'.
-
-          Leading zeroes are permitted but not required.
-
-          _Note:_ Currently, this is not fully implemented.  The format
-          is recognized, input is consumed but no field in TM is set.
-
-    `%U'
-          The week number of the current year as a decimal number
-          (range `0' through `53').
-
-          Leading zeroes are permitted but not required.
-
-    `%OU'
-          Same as `%U' but using the locale's alternative numeric
-          symbols.
-
-    `%V'
-          The ISO 8601:1988 week number as a decimal number (range `1'
-          through `53').
-
-          Leading zeroes are permitted but not required.
-
-          _Note:_ Currently, this is not fully implemented.  The format
-          is recognized, input is consumed but no field in TM is set.
-
-    `%w'
-          The day of the week as a decimal number (range `0' through
-          `6'), Sunday being `0'.
-
-          Leading zeroes are permitted but not required.
-
-          _Note:_ Currently, this is not fully implemented.  The format
-          is recognized, input is consumed but no field in TM is set.
-
-    `%Ow'
-          Same as `%w' but using the locale's alternative numeric
-          symbols.
-
-    `%W'
-          The week number of the current year as a decimal number
-          (range `0' through `53').
-
-          Leading zeroes are permitted but not required.
-
-          _Note:_ Currently, this is not fully implemented.  The format
-          is recognized, input is consumed but no field in TM is set.
-
-    `%OW'
-          Same as `%W' but using the locale's alternative numeric
-          symbols.
-
-    `%x'
-          The date using the locale's date format.
-
-    `%Ex'
-          Like `%x' but the locale's alternative data representation is
-          used.
-
-    `%X'
-          The time using the locale's time format.
-
-    `%EX'
-          Like `%X' but the locale's alternative time representation is
-          used.
-
-    `%y'
-          The year without a century as a decimal number (range `0'
-          through `99').
-
-          Leading zeroes are permitted but not required.
-
-          Note that it is questionable to use this format without the
-          `%C' format.  The `strptime' function does regard input
-          values in the range 68 to 99 as the years 1969 to 1999 and
-          the values 0 to 68 as the years 2000 to 2068.  But maybe this
-          heuristic fails for some input data.
-
-          Therefore it is best to avoid `%y' completely and use `%Y'
-          instead.
-
-    `%Ey'
-          The offset from `%EC' in the locale's alternative
-          representation.
-
-    `%Oy'
-          The offset of the year (from `%C') using the locale's
-          alternative numeric symbols.
-
-    `%Y'
-          The year as a decimal number, using the Gregorian calendar.
-
-    `%EY'
-          The full alternative year representation.
-
-    `%z'
-          The offset from GMT in ISO 8601/RFC822 format.
-
-    `%Z'
-          The timezone name.
-
-          _Note:_ Currently, this is not fully implemented.  The format
-          is recognized, input is consumed but no field in TM is set.
-
-    `%%'
-          A literal `%' character.
-
-     All other characters in the format string must have a matching
-     character in the input string.  Exceptions are white spaces in the
-     input string which can match zero or more whitespace characters in
-     the format string.
-
-     *Portability Note:* The XPG standard advises applications to use
-     at least one whitespace character (as specified by `isspace') or
-     other non-alphanumeric characters between any two conversion
-     specifications.  The GNU C Library does not have this limitation
-     but other libraries might have trouble parsing formats like
-     `"%d%m%Y%H%M%S"'.
-
-     The `strptime' function processes the input string from right to
-     left.  Each of the three possible input elements (white space,
-     literal, or format) are handled one after the other.  If the input
-     cannot be matched to the format string the function stops.  The
-     remainder of the format and input strings are not processed.
-
-     The function returns a pointer to the first character it was
-     unable to process.  If the input string contains more characters
-     than required by the format string the return value points right
-     after the last consumed input character.  If the whole input
-     string is consumed the return value points to the `NULL' byte at
-     the end of the string.  If an error occurs, i.e., `strptime' fails
-     to match all of the format string, the function returns `NULL'.
-
-   The specification of the function in the XPG standard is rather
-vague, leaving out a few important pieces of information.  Most
-importantly, it does not specify what happens to those elements of TM
-which are not directly initialized by the different formats.  The
-implementations on different Unix systems vary here.
-
-   The GNU C Library implementation does not touch those fields which
-are not directly initialized.  Exceptions are the `tm_wday' and
-`tm_yday' elements, which are recomputed if any of the year, month, or
-date elements changed.  This has two implications:
-
-   * Before calling the `strptime' function for a new input string, you
-     should prepare the TM structure you pass.  Normally this will mean
-     initializing all values are to zero.  Alternatively, you can set
-     all fields to values like `INT_MAX', allowing you to determine
-     which elements were set by the function call.  Zero does not work
-     here since it is a valid value for many of the fields.
-
-     Careful initialization is necessary if you want to find out
-     whether a certain field in TM was initialized by the function call.
-
-   * You can construct a `struct tm' value with several consecutive
-     `strptime' calls.  A useful application of this is e.g. the parsing
-     of two separate strings, one containing date information and the
-     other time information.  By parsing one after the other without
-     clearing the structure in-between, you can construct a complete
-     broken-down time.
-
-   The following example shows a function which parses a string which is
-contains the date information in either US style or ISO 8601 form:
-
-     const char *
-     parse_date (const char *input, struct tm *tm)
-     {
-       const char *cp;
-
-       /* First clear the result structure.  */
-       memset (tm, '\0', sizeof (*tm));
-
-       /* Try the ISO format first.  */
-       cp = strptime (input, "%F", tm);
-       if (cp == NULL)
-         {
-           /* Does not match.  Try the US form.  */
-           cp = strptime (input, "%D", tm);
-         }
-
-       return cp;
-     }
+ -- Macro: int NCCS
+     The value of this macro is the number of elements in the 'c_cc'
+     array.
 
 
-File: libc.info,  Node: General Time String Parsing,  Prev: Low-Level Time String Parsing,  Up: Parsing Date and Time
+File: libc.info,  Node: Mode Functions,  Next: Setting Modes,  Prev: Mode Data Types,  Up: Terminal Modes
 
-21.4.6.2 A More User-friendly Way to Parse Times and Dates
-..........................................................
+17.4.2 Terminal Mode Functions
+------------------------------
 
-The Unix standard defines another function for parsing date strings.
-The interface is weird, but if the function happens to suit your
-application it is just fine.  It is problematic to use this function in
-multi-threaded programs or libraries, since it returns a pointer to a
-static variable, and uses a global variable and global state (an
-environment variable).
+ -- Function: int tcgetattr (int FILEDES, struct termios *TERMIOS-P)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
- -- Variable: getdate_err
-     This variable of type `int' contains the error code of the last
-     unsuccessful call to `getdate'.  Defined values are:
+     This function is used to examine the attributes of the terminal
+     device with file descriptor FILEDES.  The attributes are returned
+     in the structure that TERMIOS-P points to.
 
-    1
-          The environment variable `DATEMSK' is not defined or null.
+     If successful, 'tcgetattr' returns 0.  A return value of -1
+     indicates an error.  The following 'errno' error conditions are
+     defined for this function:
 
-    2
-          The template file denoted by the `DATEMSK' environment
-          variable cannot be opened.
+     'EBADF'
+          The FILEDES argument is not a valid file descriptor.
 
-    3
-          Information about the template file cannot retrieved.
+     'ENOTTY'
+          The FILEDES is not associated with a terminal.
 
-    4
-          The template file is not a regular file.
+ -- Function: int tcsetattr (int FILEDES, int WHEN, const struct termios
+          *TERMIOS-P)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-    5
-          An I/O error occurred while reading the template file.
+     This function sets the attributes of the terminal device with file
+     descriptor FILEDES.  The new attributes are taken from the
+     structure that TERMIOS-P points to.
 
-    6
-          Not enough memory available to execute the function.
+     The WHEN argument specifies how to deal with input and output
+     already queued.  It can be one of the following values:
 
-    7
-          The template file contains no matching template.
+     'TCSANOW'
+          Make the change immediately.
 
-    8
-          The input date is invalid, but would match a template
-          otherwise.  This includes dates like February 31st, and dates
-          which cannot be represented in a `time_t' variable.
+     'TCSADRAIN'
+          Make the change after waiting until all queued output has been
+          written.  You should usually use this option when changing
+          parameters that affect output.
 
- -- Function: struct tm * getdate (const char *STRING)
-     Preliminary: | MT-Unsafe race:getdate env locale | AS-Unsafe heap
-     lock | AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
+     'TCSAFLUSH'
+          This is like 'TCSADRAIN', but also discards any queued input.
 
-     The interface to `getdate' is the simplest possible for a function
-     to parse a string and return the value.  STRING is the input
-     string and the result is returned in a statically-allocated
-     variable.
+     'TCSASOFT'
+          This is a flag bit that you can add to any of the above
+          alternatives.  Its meaning is to inhibit alteration of the
+          state of the terminal hardware.  It is a BSD extension; it is
+          only supported on BSD systems and GNU/Hurd systems.
 
-     The details about how the string is processed are hidden from the
-     user.  In fact, they can be outside the control of the program.
-     Which formats are recognized is controlled by the file named by
-     the environment variable `DATEMSK'.  This file should contain
-     lines of valid format strings which could be passed to `strptime'.
+          Using 'TCSASOFT' is exactly the same as setting the 'CIGNORE'
+          bit in the 'c_cflag' member of the structure TERMIOS-P points
+          to.  *Note Control Modes::, for a description of 'CIGNORE'.
 
-     The `getdate' function reads these format strings one after the
-     other and tries to match the input string.  The first line which
-     completely matches the input string is used.
+     If this function is called from a background process on its
+     controlling terminal, normally all processes in the process group
+     are sent a 'SIGTTOU' signal, in the same way as if the process were
+     trying to write to the terminal.  The exception is if the calling
+     process itself is ignoring or blocking 'SIGTTOU' signals, in which
+     case the operation is performed and no signal is sent.  *Note Job
+     Control::.
 
-     Elements not initialized through the format string retain the
-     values present at the time of the `getdate' function call.
+     If successful, 'tcsetattr' returns 0.  A return value of -1
+     indicates an error.  The following 'errno' error conditions are
+     defined for this function:
 
-     The formats recognized by `getdate' are the same as for
-     `strptime'.  See above for an explanation.  There are only a few
-     extensions to the `strptime' behavior:
+     'EBADF'
+          The FILEDES argument is not a valid file descriptor.
 
-        * If the `%Z' format is given the broken-down time is based on
-          the current time of the timezone matched, not of the current
-          timezone of the runtime environment.
+     'ENOTTY'
+          The FILEDES is not associated with a terminal.
 
-          _Note_: This is not implemented (currently).  The problem is
-          that timezone names are not unique.  If a fixed timezone is
-          assumed for a given string (say `EST' meaning US East Coast
-          time), then uses for countries other than the USA will fail.
-          So far we have found no good solution to this.
+     'EINVAL'
+          Either the value of the 'when' argument is not valid, or there
+          is something wrong with the data in the TERMIOS-P argument.
 
-        * If only the weekday is specified the selected day depends on
-          the current date.  If the current weekday is greater or equal
-          to the `tm_wday' value the current week's day is chosen,
-          otherwise the day next week is chosen.
+   Although 'tcgetattr' and 'tcsetattr' specify the terminal device with
+a file descriptor, the attributes are those of the terminal device
+itself and not of the file descriptor.  This means that the effects of
+changing terminal attributes are persistent; if another process opens
+the terminal file later on, it will see the changed attributes even
+though it doesn't have anything to do with the open file descriptor you
+originally specified in changing the attributes.
 
-        * A similar heuristic is used when only the month is given and
-          not the year.  If the month is greater than or equal to the
-          current month, then the current year is used.  Otherwise it
-          wraps to next year.  The first day of the month is assumed if
-          one is not explicitly specified.
-
-        * The current hour, minute, and second are used if the
-          appropriate value is not set through the format.
-
-        * If no date is given tomorrow's date is used if the time is
-          smaller than the current time.  Otherwise today's date is
-          taken.
-
-     It should be noted that the format in the template file need not
-     only contain format elements.  The following is a list of possible
-     format strings (taken from the Unix standard):
-
-          %m
-          %A %B %d, %Y %H:%M:%S
-          %A
-          %B
-          %m/%d/%y %I %p
-          %d,%m,%Y %H:%M
-          at %A the %dst of %B in %Y
-          run job at %I %p,%B %dnd
-          %A den %d. %B %Y %H.%M Uhr
-
-     As you can see, the template list can contain very specific
-     strings like `run job at %I %p,%B %dnd'.  Using the above list of
-     templates and assuming the current time is Mon Sep 22 12:19:47 EDT
-     1986 we can obtain the following results for the given input.
-
-     Input          Match        Result
-     Mon            %a           Mon Sep 22 12:19:47 EDT 1986
-     Sun            %a           Sun Sep 28 12:19:47 EDT 1986
-     Fri            %a           Fri Sep 26 12:19:47 EDT 1986
-     September      %B           Mon Sep 1 12:19:47 EDT 1986
-     January        %B           Thu Jan 1 12:19:47 EST 1987
-     December       %B           Mon Dec 1 12:19:47 EST 1986
-     Sep Mon        %b %a        Mon Sep 1 12:19:47 EDT 1986
-     Jan Fri        %b %a        Fri Jan 2 12:19:47 EST 1987
-     Dec Mon        %b %a        Mon Dec 1 12:19:47 EST 1986
-     Jan Wed 1989   %b %a %Y     Wed Jan 4 12:19:47 EST 1989
-     Fri 9          %a %H        Fri Sep 26 09:00:00 EDT 1986
-     Feb 10:30      %b %H:%S     Sun Feb 1 10:00:30 EST 1987
-     10:30          %H:%M        Tue Sep 23 10:30:00 EDT 1986
-     13:30          %H:%M        Mon Sep 22 13:30:00 EDT 1986
-
-     The return value of the function is a pointer to a static variable
-     of type `struct tm', or a null pointer if an error occurred.  The
-     result is only valid until the next `getdate' call, making this
-     function unusable in multi-threaded applications.
-
-     The `errno' variable is _not_ changed.  Error conditions are
-     stored in the global variable `getdate_err'.  See the description
-     above for a list of the possible error values.
-
-     _Warning:_ The `getdate' function should _never_ be used in
-     SUID-programs.  The reason is obvious: using the `DATEMSK'
-     environment variable you can get the function to open any
-     arbitrary file and chances are high that with some bogus input
-     (such as a binary file) the program will crash.
-
- -- Function: int getdate_r (const char *STRING, struct tm *TP)
-     Preliminary: | MT-Safe env locale | AS-Unsafe heap lock |
-     AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
-
-     The `getdate_r' function is the reentrant counterpart of
-     `getdate'.  It does not use the global variable `getdate_err' to
-     signal an error, but instead returns an error code.  The same error
-     codes as described in the `getdate_err' documentation above are
-     used, with 0 meaning success.
-
-     Moreover, `getdate_r' stores the broken-down time in the variable
-     of type `struct tm' pointed to by the second argument, rather than
-     in a static variable.
-
-     This function is not defined in the Unix standard.  Nevertheless
-     it is available on some other Unix systems as well.
-
-     The warning against using `getdate' in SUID-programs applies to
-     `getdate_r' as well.
+   Similarly, if a single process has multiple or duplicated file
+descriptors for the same terminal device, changing the terminal
+attributes affects input and output to all of these file descriptors.
+This means, for example, that you can't open one file descriptor or
+stream to read from a terminal in the normal line-buffered, echoed mode;
+and simultaneously have another file descriptor for the same terminal
+that you use to read from it in single-character, non-echoed mode.
+Instead, you have to explicitly switch the terminal back and forth
+between the two modes.
 
 
-File: libc.info,  Node: TZ Variable,  Next: Time Zone Functions,  Prev: Parsing Date and Time,  Up: Calendar Time
+File: libc.info,  Node: Setting Modes,  Next: Input Modes,  Prev: Mode Functions,  Up: Terminal Modes
 
-21.4.7 Specifying the Time Zone with `TZ'
------------------------------------------
+17.4.3 Setting Terminal Modes Properly
+--------------------------------------
 
-In POSIX systems, a user can specify the time zone by means of the `TZ'
-environment variable.  For information about how to set environment
-variables, see *note Environment Variables::.  The functions for
-accessing the time zone are declared in `time.h'.  
+When you set terminal modes, you should call 'tcgetattr' first to get
+the current modes of the particular terminal device, modify only those
+modes that you are really interested in, and store the result with
+'tcsetattr'.
 
-   You should not normally need to set `TZ'.  If the system is
-configured properly, the default time zone will be correct.  You might
-set `TZ' if you are using a computer over a network from a different
-time zone, and would like times reported to you in the time zone local
-to you, rather than what is local to the computer.
+   It's a bad idea to simply initialize a 'struct termios' structure to
+a chosen set of attributes and pass it directly to 'tcsetattr'.  Your
+program may be run years from now, on systems that support members not
+documented in this manual.  The way to avoid setting these members to
+unreasonable values is to avoid changing them.
 
-   In POSIX.1 systems the value of the `TZ' variable can be in one of
-three formats.  With the GNU C Library, the most common format is the
-last one, which can specify a selection from a large database of time
-zone information for many regions of the world.  The first two formats
-are used to describe the time zone information directly, which is both
-more cumbersome and less precise.  But the POSIX.1 standard only
-specifies the details of the first two formats, so it is good to be
-familiar with them in case you come across a POSIX.1 system that doesn't
-support a time zone information database.
+   What's more, different terminal devices may require different mode
+settings in order to function properly.  So you should avoid blindly
+copying attributes from one terminal device to another.
 
-   The first format is used when there is no Daylight Saving Time (or
-summer time) in the local time zone:
+   When a member contains a collection of independent flags, as the
+'c_iflag', 'c_oflag' and 'c_cflag' members do, even setting the entire
+member is a bad idea, because particular operating systems have their
+own flags.  Instead, you should start with the current value of the
+member and alter only the flags whose values matter in your program,
+leaving any other flags unchanged.
 
-     STD OFFSET
-
-   The STD string specifies the name of the time zone.  It must be
-three or more characters long and must not contain a leading colon,
-embedded digits, commas, nor plus and minus signs.  There is no space
-character separating the time zone name from the OFFSET, so these
-restrictions are necessary to parse the specification correctly.
-
-   The OFFSET specifies the time value you must add to the local time
-to get a Coordinated Universal Time value.  It has syntax like
-[`+'|`-']HH[`:'MM[`:'SS]].  This is positive if the local time zone is
-west of the Prime Meridian and negative if it is east.  The hour must
-be between `0' and `24', and the minute and seconds between `0' and
-`59'.
-
-   For example, here is how we would specify Eastern Standard Time, but
-without any Daylight Saving Time alternative:
-
-     EST+5
-
-   The second format is used when there is Daylight Saving Time:
-
-     STD OFFSET DST [OFFSET]`,'START[`/'TIME]`,'END[`/'TIME]
-
-   The initial STD and OFFSET specify the standard time zone, as
-described above.  The DST string and OFFSET specify the name and offset
-for the corresponding Daylight Saving Time zone; if the OFFSET is
-omitted, it defaults to one hour ahead of standard time.
-
-   The remainder of the specification describes when Daylight Saving
-Time is in effect.  The START field is when Daylight Saving Time goes
-into effect and the END field is when the change is made back to
-standard time.  The following formats are recognized for these fields:
-
-`JN'
-     This specifies the Julian day, with N between `1' and `365'.
-     February 29 is never counted, even in leap years.
-
-`N'
-     This specifies the Julian day, with N between `0' and `365'.
-     February 29 is counted in leap years.
-
-`MM.W.D'
-     This specifies day D of week W of month M.  The day D must be
-     between `0' (Sunday) and `6'.  The week W must be between `1' and
-     `5'; week `1' is the first week in which day D occurs, and week
-     `5' specifies the _last_ D day in the month.  The month M should be
-     between `1' and `12'.
-
-   The TIME fields specify when, in the local time currently in effect,
-the change to the other time occurs.  If omitted, the default is
-`02:00:00'.  The hours part of the time fields can range from -167
-through 167; this is an extension to POSIX.1, which allows only the
-range 0 through 24.
-
-   Here are some example `TZ' values, including the appropriate
-Daylight Saving Time and its dates of applicability.  In North American
-Eastern Standard Time (EST) and Eastern Daylight Time (EDT), the normal
-offset from UTC is 5 hours; since this is west of the prime meridian,
-the sign is positive.  Summer time begins on March's second Sunday at
-2:00am, and ends on November's first Sunday at 2:00am.
-
-     EST+5EDT,M3.2.0/2,M11.1.0/2
-
-   Israel Standard Time (IST) and Israel Daylight Time (IDT) are 2 hours
-ahead of the prime meridian in winter, springing forward an hour on
-March's fourth Tuesday at 26:00 (i.e., 02:00 on the first Friday on or
-after March 23), and falling back on October's last Sunday at 02:00.
-
-     IST-2IDT,M3.4.4/26,M10.5.0
-
-   Western Argentina Summer Time (WARST) is 3 hours behind the prime
-meridian all year.  There is a dummy fall-back transition on December
-31 at 25:00 daylight saving time (i.e., 24:00 standard time, equivalent
-to January 1 at 00:00 standard time), and a simultaneous spring-forward
-transition on January 1 at 00:00 standard time, so daylight saving time
-is in effect all year and the initial `WART' is a placeholder.
-
-     WART4WARST,J1/0,J365/25
-
-   Western Greenland Time (WGT) and Western Greenland Summer Time (WGST)
-are 3 hours behind UTC in the winter.  Its clocks follow the European
-Union rules of springing forward by one hour on March's last Sunday at
-01:00 UTC (-02:00 local time) and falling back on October's last Sunday
-at 01:00 UTC (-01:00 local time).
-
-     WGT3WGST,M3.5.0/-2,M10.5.0/-1
-
-   The schedule of Daylight Saving Time in any particular jurisdiction
-has changed over the years.  To be strictly correct, the conversion of
-dates and times in the past should be based on the schedule that was in
-effect then.  However, this format has no facilities to let you specify
-how the schedule has changed from year to year.  The most you can do is
-specify one particular schedule--usually the present day schedule--and
-this is used to convert any date, no matter when.  For precise time zone
-specifications, it is best to use the time zone information database
-(see below).
-
-   The third format looks like this:
-
-     :CHARACTERS
-
-   Each operating system interprets this format differently; in the GNU
-C Library, CHARACTERS is the name of a file which describes the time
-zone.
-
-   If the `TZ' environment variable does not have a value, the
-operation chooses a time zone by default.  In the GNU C Library, the
-default time zone is like the specification `TZ=:/etc/localtime' (or
-`TZ=:/usr/local/etc/localtime', depending on how the GNU C Library was
-configured; *note Installation::).  Other C libraries use their own
-rule for choosing the default time zone, so there is little we can say
-about them.
-
-   If CHARACTERS begins with a slash, it is an absolute file name;
-otherwise the library looks for the file
-`/share/lib/zoneinfo/CHARACTERS'.  The `zoneinfo' directory contains
-data files describing local time zones in many different parts of the
-world.  The names represent major cities, with subdirectories for
-geographical areas; for example, `America/New_York', `Europe/London',
-`Asia/Hong_Kong'.  These data files are installed by the system
-administrator, who also sets `/etc/localtime' to point to the data file
-for the local time zone.  The GNU C Library comes with a large database
-of time zone information for most regions of the world, which is
-maintained by a community of volunteers and put in the public domain.
-
-
-File: libc.info,  Node: Time Zone Functions,  Next: Time Functions Example,  Prev: TZ Variable,  Up: Calendar Time
-
-21.4.8 Functions and Variables for Time Zones
----------------------------------------------
-
- -- Variable: char * tzname [2]
-     The array `tzname' contains two strings, which are the standard
-     names of the pair of time zones (standard and Daylight Saving)
-     that the user has selected.  `tzname[0]' is the name of the
-     standard time zone (for example, `"EST"'), and `tzname[1]' is the
-     name for the time zone when Daylight Saving Time is in use (for
-     example, `"EDT"').  These correspond to the STD and DST strings
-     (respectively) from the `TZ' environment variable.  If Daylight
-     Saving Time is never used, `tzname[1]' is the empty string.
-
-     The `tzname' array is initialized from the `TZ' environment
-     variable whenever `tzset', `ctime', `strftime', `mktime', or
-     `localtime' is called.  If multiple abbreviations have been used
-     (e.g. `"EWT"' and `"EDT"' for U.S. Eastern War Time and Eastern
-     Daylight Time), the array contains the most recent abbreviation.
-
-     The `tzname' array is required for POSIX.1 compatibility, but in
-     GNU programs it is better to use the `tm_zone' member of the
-     broken-down time structure, since `tm_zone' reports the correct
-     abbreviation even when it is not the latest one.
-
-     Though the strings are declared as `char *' the user must refrain
-     from modifying these strings.  Modifying the strings will almost
-     certainly lead to trouble.
-
-
- -- Function: void tzset (void)
-     Preliminary: | MT-Safe env locale | AS-Unsafe heap lock |
-     AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
-
-     The `tzset' function initializes the `tzname' variable from the
-     value of the `TZ' environment variable.  It is not usually
-     necessary for your program to call this function, because it is
-     called automatically when you use the other time conversion
-     functions that depend on the time zone.
-
-   The following variables are defined for compatibility with System V
-Unix.  Like `tzname', these variables are set by calling `tzset' or the
-other time conversion functions.
-
- -- Variable: long int timezone
-     This contains the difference between UTC and the latest local
-     standard time, in seconds west of UTC.  For example, in the U.S.
-     Eastern time zone, the value is `5*60*60'.  Unlike the `tm_gmtoff'
-     member of the broken-down time structure, this value is not
-     adjusted for daylight saving, and its sign is reversed.  In GNU
-     programs it is better to use `tm_gmtoff', since it contains the
-     correct offset even when it is not the latest one.
-
- -- Variable: int daylight
-     This variable has a nonzero value if Daylight Saving Time rules
-     apply.  A nonzero value does not necessarily mean that Daylight
-     Saving Time is now in effect; it means only that Daylight Saving
-     Time is sometimes in effect.
-
-
-File: libc.info,  Node: Time Functions Example,  Prev: Time Zone Functions,  Up: Calendar Time
-
-21.4.9 Time Functions Example
------------------------------
-
-Here is an example program showing the use of some of the calendar time
-functions.
-
-
-     #include <time.h>
-     #include <stdio.h>
-
-     #define SIZE 256
+   Here is an example of how to set one flag ('ISTRIP') in the 'struct
+termios' structure while properly preserving all the other data in the
+structure:
 
      int
-     main (void)
+     set_istrip (int desc, int value)
      {
-       char buffer[SIZE];
-       time_t curtime;
-       struct tm *loctime;
+       struct termios settings;
+       int result;
 
-       /* Get the current time. */
-       curtime = time (NULL);
-
-       /* Convert it to local time representation. */
-       loctime = localtime (&curtime);
-
-       /* Print out the date and time in the standard format. */
-       fputs (asctime (loctime), stdout);
-
-       /* Print it out in a nice format. */
-       strftime (buffer, SIZE, "Today is %A, %B %d.\n", loctime);
-       fputs (buffer, stdout);
-       strftime (buffer, SIZE, "The time is %I:%M %p.\n", loctime);
-       fputs (buffer, stdout);
-
-       return 0;
+       result = tcgetattr (desc, &settings);
+       if (result < 0)
+         {
+           perror ("error in tcgetattr");
+           return 0;
+         }
+       settings.c_iflag &= ~ISTRIP;
+       if (value)
+         settings.c_iflag |= ISTRIP;
+       result = tcsetattr (desc, TCSANOW, &settings);
+       if (result < 0)
+         {
+           perror ("error in tcsetattr");
+           return 0;
+        }
+       return 1;
      }
 
-   It produces output like this:
+
+File: libc.info,  Node: Input Modes,  Next: Output Modes,  Prev: Setting Modes,  Up: Terminal Modes
 
-     Wed Jul 31 13:02:36 1991
-     Today is Wednesday, July 31.
-     The time is 01:02 PM.
+17.4.4 Input Modes
+------------------
+
+This section describes the terminal attribute flags that control fairly
+low-level aspects of input processing: handling of parity errors, break
+signals, flow control, and <RET> and <LFD> characters.
+
+   All of these flags are bits in the 'c_iflag' member of the 'struct
+termios' structure.  The member is an integer, and you change flags
+using the operators '&', '|' and '^'.  Don't try to specify the entire
+value for 'c_iflag'--instead, change only specific flags and leave the
+rest untouched (*note Setting Modes::).
+
+ -- Macro: tcflag_t INPCK
+     If this bit is set, input parity checking is enabled.  If it is not
+     set, no checking at all is done for parity errors on input; the
+     characters are simply passed through to the application.
+
+     Parity checking on input processing is independent of whether
+     parity detection and generation on the underlying terminal hardware
+     is enabled; see *note Control Modes::.  For example, you could
+     clear the 'INPCK' input mode flag and set the 'PARENB' control mode
+     flag to ignore parity errors on input, but still generate parity on
+     output.
+
+     If this bit is set, what happens when a parity error is detected
+     depends on whether the 'IGNPAR' or 'PARMRK' bits are set.  If
+     neither of these bits are set, a byte with a parity error is passed
+     to the application as a ''\0'' character.
+
+ -- Macro: tcflag_t IGNPAR
+     If this bit is set, any byte with a framing or parity error is
+     ignored.  This is only useful if 'INPCK' is also set.
+
+ -- Macro: tcflag_t PARMRK
+     If this bit is set, input bytes with parity or framing errors are
+     marked when passed to the program.  This bit is meaningful only
+     when 'INPCK' is set and 'IGNPAR' is not set.
+
+     The way erroneous bytes are marked is with two preceding bytes,
+     '377' and '0'.  Thus, the program actually reads three bytes for
+     one erroneous byte received from the terminal.
+
+     If a valid byte has the value '0377', and 'ISTRIP' (see below) is
+     not set, the program might confuse it with the prefix that marks a
+     parity error.  So a valid byte '0377' is passed to the program as
+     two bytes, '0377' '0377', in this case.
+
+ -- Macro: tcflag_t ISTRIP
+     If this bit is set, valid input bytes are stripped to seven bits;
+     otherwise, all eight bits are available for programs to read.
+
+ -- Macro: tcflag_t IGNBRK
+     If this bit is set, break conditions are ignored.
+
+     A "break condition" is defined in the context of asynchronous
+     serial data transmission as a series of zero-value bits longer than
+     a single byte.
+
+ -- Macro: tcflag_t BRKINT
+     If this bit is set and 'IGNBRK' is not set, a break condition
+     clears the terminal input and output queues and raises a 'SIGINT'
+     signal for the foreground process group associated with the
+     terminal.
+
+     If neither 'BRKINT' nor 'IGNBRK' are set, a break condition is
+     passed to the application as a single ''\0'' character if 'PARMRK'
+     is not set, or otherwise as a three-character sequence ''\377'',
+     ''\0'', ''\0''.
+
+ -- Macro: tcflag_t IGNCR
+     If this bit is set, carriage return characters (''\r'') are
+     discarded on input.  Discarding carriage return may be useful on
+     terminals that send both carriage return and linefeed when you type
+     the <RET> key.
+
+ -- Macro: tcflag_t ICRNL
+     If this bit is set and 'IGNCR' is not set, carriage return
+     characters (''\r'') received as input are passed to the application
+     as newline characters (''\n'').
+
+ -- Macro: tcflag_t INLCR
+     If this bit is set, newline characters (''\n'') received as input
+     are passed to the application as carriage return characters
+     (''\r'').
+
+ -- Macro: tcflag_t IXOFF
+     If this bit is set, start/stop control on input is enabled.  In
+     other words, the computer sends STOP and START characters as
+     necessary to prevent input from coming in faster than programs are
+     reading it.  The idea is that the actual terminal hardware that is
+     generating the input data responds to a STOP character by
+     suspending transmission, and to a START character by resuming
+     transmission.  *Note Start/Stop Characters::.
+
+ -- Macro: tcflag_t IXON
+     If this bit is set, start/stop control on output is enabled.  In
+     other words, if the computer receives a STOP character, it suspends
+     output until a START character is received.  In this case, the STOP
+     and START characters are never passed to the application program.
+     If this bit is not set, then START and STOP can be read as ordinary
+     characters.  *Note Start/Stop Characters::.
+
+ -- Macro: tcflag_t IXANY
+     If this bit is set, any input character restarts output when output
+     has been suspended with the STOP character.  Otherwise, only the
+     START character restarts output.
+
+     This is a BSD extension; it exists only on BSD systems and
+     GNU/Linux and GNU/Hurd systems.
+
+ -- Macro: tcflag_t IMAXBEL
+     If this bit is set, then filling up the terminal input buffer sends
+     a BEL character (code '007') to the terminal to ring the bell.
+
+     This is a BSD extension.
 
 
-File: libc.info,  Node: Setting an Alarm,  Next: Sleeping,  Prev: Calendar Time,  Up: Date and Time
+File: libc.info,  Node: Output Modes,  Next: Control Modes,  Prev: Input Modes,  Up: Terminal Modes
 
-21.5 Setting an Alarm
-=====================
+17.4.5 Output Modes
+-------------------
 
-The `alarm' and `setitimer' functions provide a mechanism for a process
-to interrupt itself in the future.  They do this by setting a timer;
-when the timer expires, the process receives a signal.
+This section describes the terminal flags and fields that control how
+output characters are translated and padded for display.  All of these
+are contained in the 'c_oflag' member of the 'struct termios' structure.
 
-   Each process has three independent interval timers available:
+   The 'c_oflag' member itself is an integer, and you change the flags
+and fields using the operators '&', '|', and '^'.  Don't try to specify
+the entire value for 'c_oflag'--instead, change only specific flags and
+leave the rest untouched (*note Setting Modes::).
 
-   * A real-time timer that counts elapsed time.  This timer sends a
-     `SIGALRM' signal to the process when it expires.  
+ -- Macro: tcflag_t OPOST
+     If this bit is set, output data is processed in some unspecified
+     way so that it is displayed appropriately on the terminal device.
+     This typically includes mapping newline characters (''\n'') onto
+     carriage return and linefeed pairs.
 
-   * A virtual timer that counts processor time used by the process.
-     This timer sends a `SIGVTALRM' signal to the process when it
-     expires.  
+     If this bit isn't set, the characters are transmitted as-is.
 
-   * A profiling timer that counts both processor time used by the
-     process, and processor time spent in system calls on behalf of the
-     process.  This timer sends a `SIGPROF' signal to the process when
-     it expires.  
+   The following three bits are effective only if 'OPOST' is set.
 
-     This timer is useful for profiling in interpreters.  The interval
-     timer mechanism does not have the fine granularity necessary for
-     profiling native code.
+ -- Macro: tcflag_t ONLCR
+     If this bit is set, convert the newline character on output into a
+     pair of characters, carriage return followed by linefeed.
 
-   You can only have one timer of each kind set at any given time.  If
-you set a timer that has not yet expired, that timer is simply reset to
-the new value.
+ -- Macro: tcflag_t OXTABS
+     If this bit is set, convert tab characters on output into the
+     appropriate number of spaces to emulate a tab stop every eight
+     columns.  This bit exists only on BSD systems and GNU/Hurd systems;
+     on GNU/Linux systems it is available as 'XTABS'.
 
-   You should establish a handler for the appropriate alarm signal using
-`signal' or `sigaction' before issuing a call to `setitimer' or
-`alarm'.  Otherwise, an unusual chain of events could cause the timer
-to expire before your program establishes the handler.  In this case it
-would be terminated, since termination is the default action for the
-alarm signals.  *Note Signal Handling::.
+ -- Macro: tcflag_t ONOEOT
+     If this bit is set, discard 'C-d' characters (code '004') on
+     output.  These characters cause many dial-up terminals to
+     disconnect.  This bit exists only on BSD systems and GNU/Hurd
+     systems.
 
-   To be able to use the alarm function to interrupt a system call which
-might block otherwise indefinitely it is important to _not_ set the
-`SA_RESTART' flag when registering the signal handler using
-`sigaction'.  When not using `sigaction' things get even uglier: the
-`signal' function has to fixed semantics with respect to restarts.  The
-BSD semantics for this function is to set the flag.  Therefore, if
-`sigaction' for whatever reason cannot be used, it is necessary to use
-`sysv_signal' and not `signal'.
+
+File: libc.info,  Node: Control Modes,  Next: Local Modes,  Prev: Output Modes,  Up: Terminal Modes
 
-   The `setitimer' function is the primary means for setting an alarm.
-This facility is declared in the header file `sys/time.h'.  The `alarm'
-function, declared in `unistd.h', provides a somewhat simpler interface
-for setting the real-time timer.  
+17.4.6 Control Modes
+--------------------
 
- -- Data Type: struct itimerval
-     This structure is used to specify when a timer should expire.  It
-     contains the following members:
-    `struct timeval it_interval'
-          This is the period between successive timer interrupts.  If
-          zero, the alarm will only be sent once.
+This section describes the terminal flags and fields that control
+parameters usually associated with asynchronous serial data
+transmission.  These flags may not make sense for other kinds of
+terminal ports (such as a network connection pseudo-terminal).  All of
+these are contained in the 'c_cflag' member of the 'struct termios'
+structure.
 
-    `struct timeval it_value'
-          This is the period between now and the first timer interrupt.
-          If zero, the alarm is disabled.
+   The 'c_cflag' member itself is an integer, and you change the flags
+and fields using the operators '&', '|', and '^'.  Don't try to specify
+the entire value for 'c_cflag'--instead, change only specific flags and
+leave the rest untouched (*note Setting Modes::).
 
-     The `struct timeval' data type is described in *note Elapsed
-     Time::.
+ -- Macro: tcflag_t CLOCAL
+     If this bit is set, it indicates that the terminal is connected
+     "locally" and that the modem status lines (such as carrier detect)
+     should be ignored.
 
- -- Function: int setitimer (int WHICH, const struct itimerval *NEW,
-          struct itimerval *OLD)
-     Preliminary: | MT-Safe timer | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
+     On many systems if this bit is not set and you call 'open' without
+     the 'O_NONBLOCK' flag set, 'open' blocks until a modem connection
+     is established.
 
-     The `setitimer' function sets the timer specified by WHICH
-     according to NEW.  The WHICH argument can have a value of
-     `ITIMER_REAL', `ITIMER_VIRTUAL', or `ITIMER_PROF'.
+     If this bit is not set and a modem disconnect is detected, a
+     'SIGHUP' signal is sent to the controlling process group for the
+     terminal (if it has one).  Normally, this causes the process to
+     exit; see *note Signal Handling::.  Reading from the terminal after
+     a disconnect causes an end-of-file condition, and writing causes an
+     'EIO' error to be returned.  The terminal device must be closed and
+     reopened to clear the condition.
 
-     If OLD is not a null pointer, `setitimer' returns information
-     about any previous unexpired timer of the same kind in the
-     structure it points to.
+ -- Macro: tcflag_t HUPCL
+     If this bit is set, a modem disconnect is generated when all
+     processes that have the terminal device open have either closed the
+     file or exited.
 
-     The return value is `0' on success and `-1' on failure.  The
-     following `errno' error conditions are defined for this function:
+ -- Macro: tcflag_t CREAD
+     If this bit is set, input can be read from the terminal.
+     Otherwise, input is discarded when it arrives.
 
-    `EINVAL'
-          The timer period is too large.
+ -- Macro: tcflag_t CSTOPB
+     If this bit is set, two stop bits are used.  Otherwise, only one
+     stop bit is used.
 
- -- Function: int getitimer (int WHICH, struct itimerval *OLD)
+ -- Macro: tcflag_t PARENB
+     If this bit is set, generation and detection of a parity bit are
+     enabled.  *Note Input Modes::, for information on how input parity
+     errors are handled.
+
+     If this bit is not set, no parity bit is added to output
+     characters, and input characters are not checked for correct
+     parity.
+
+ -- Macro: tcflag_t PARODD
+     This bit is only useful if 'PARENB' is set.  If 'PARODD' is set,
+     odd parity is used, otherwise even parity is used.
+
+   The control mode flags also includes a field for the number of bits
+per character.  You can use the 'CSIZE' macro as a mask to extract the
+value, like this: 'settings.c_cflag & CSIZE'.
+
+ -- Macro: tcflag_t CSIZE
+     This is a mask for the number of bits per character.
+
+ -- Macro: tcflag_t CS5
+     This specifies five bits per byte.
+
+ -- Macro: tcflag_t CS6
+     This specifies six bits per byte.
+
+ -- Macro: tcflag_t CS7
+     This specifies seven bits per byte.
+
+ -- Macro: tcflag_t CS8
+     This specifies eight bits per byte.
+
+   The following four bits are BSD extensions; these exist only on BSD
+systems and GNU/Hurd systems.
+
+ -- Macro: tcflag_t CCTS_OFLOW
+     If this bit is set, enable flow control of output based on the CTS
+     wire (RS232 protocol).
+
+ -- Macro: tcflag_t CRTS_IFLOW
+     If this bit is set, enable flow control of input based on the RTS
+     wire (RS232 protocol).
+
+ -- Macro: tcflag_t MDMBUF
+     If this bit is set, enable carrier-based flow control of output.
+
+ -- Macro: tcflag_t CIGNORE
+     If this bit is set, it says to ignore the control modes and line
+     speed values entirely.  This is only meaningful in a call to
+     'tcsetattr'.
+
+     The 'c_cflag' member and the line speed values returned by
+     'cfgetispeed' and 'cfgetospeed' will be unaffected by the call.
+     'CIGNORE' is useful if you want to set all the software modes in
+     the other members, but leave the hardware details in 'c_cflag'
+     unchanged.  (This is how the 'TCSASOFT' flag to 'tcsettattr'
+     works.)
+
+     This bit is never set in the structure filled in by 'tcgetattr'.
+
+
+File: libc.info,  Node: Local Modes,  Next: Line Speed,  Prev: Control Modes,  Up: Terminal Modes
+
+17.4.7 Local Modes
+------------------
+
+This section describes the flags for the 'c_lflag' member of the 'struct
+termios' structure.  These flags generally control higher-level aspects
+of input processing than the input modes flags described in *note Input
+Modes::, such as echoing, signals, and the choice of canonical or
+noncanonical input.
+
+   The 'c_lflag' member itself is an integer, and you change the flags
+and fields using the operators '&', '|', and '^'.  Don't try to specify
+the entire value for 'c_lflag'--instead, change only specific flags and
+leave the rest untouched (*note Setting Modes::).
+
+ -- Macro: tcflag_t ICANON
+     This bit, if set, enables canonical input processing mode.
+     Otherwise, input is processed in noncanonical mode.  *Note
+     Canonical or Not::.
+
+ -- Macro: tcflag_t ECHO
+     If this bit is set, echoing of input characters back to the
+     terminal is enabled.
+
+ -- Macro: tcflag_t ECHOE
+     If this bit is set, echoing indicates erasure of input with the
+     ERASE character by erasing the last character in the current line
+     from the screen.  Otherwise, the character erased is re-echoed to
+     show what has happened (suitable for a printing terminal).
+
+     This bit only controls the display behavior; the 'ICANON' bit by
+     itself controls actual recognition of the ERASE character and
+     erasure of input, without which 'ECHOE' is simply irrelevant.
+
+ -- Macro: tcflag_t ECHOPRT
+     This bit is like 'ECHOE', enables display of the ERASE character in
+     a way that is geared to a hardcopy terminal.  When you type the
+     ERASE character, a '\' character is printed followed by the first
+     character erased.  Typing the ERASE character again just prints the
+     next character erased.  Then, the next time you type a normal
+     character, a '/' character is printed before the character echoes.
+
+     This is a BSD extension, and exists only in BSD systems and
+     GNU/Linux and GNU/Hurd systems.
+
+ -- Macro: tcflag_t ECHOK
+     This bit enables special display of the KILL character by moving to
+     a new line after echoing the KILL character normally.  The behavior
+     of 'ECHOKE' (below) is nicer to look at.
+
+     If this bit is not set, the KILL character echoes just as it would
+     if it were not the KILL character.  Then it is up to the user to
+     remember that the KILL character has erased the preceding input;
+     there is no indication of this on the screen.
+
+     This bit only controls the display behavior; the 'ICANON' bit by
+     itself controls actual recognition of the KILL character and
+     erasure of input, without which 'ECHOK' is simply irrelevant.
+
+ -- Macro: tcflag_t ECHOKE
+     This bit is similar to 'ECHOK'.  It enables special display of the
+     KILL character by erasing on the screen the entire line that has
+     been killed.  This is a BSD extension, and exists only in BSD
+     systems and GNU/Linux and GNU/Hurd systems.
+
+ -- Macro: tcflag_t ECHONL
+     If this bit is set and the 'ICANON' bit is also set, then the
+     newline (''\n'') character is echoed even if the 'ECHO' bit is not
+     set.
+
+ -- Macro: tcflag_t ECHOCTL
+     If this bit is set and the 'ECHO' bit is also set, echo control
+     characters with '^' followed by the corresponding text character.
+     Thus, control-A echoes as '^A'.  This is usually the preferred mode
+     for interactive input, because echoing a control character back to
+     the terminal could have some undesired effect on the terminal.
+
+     This is a BSD extension, and exists only in BSD systems and
+     GNU/Linux and GNU/Hurd systems.
+
+ -- Macro: tcflag_t ISIG
+     This bit controls whether the INTR, QUIT, and SUSP characters are
+     recognized.  The functions associated with these characters are
+     performed if and only if this bit is set.  Being in canonical or
+     noncanonical input mode has no affect on the interpretation of
+     these characters.
+
+     You should use caution when disabling recognition of these
+     characters.  Programs that cannot be interrupted interactively are
+     very user-unfriendly.  If you clear this bit, your program should
+     provide some alternate interface that allows the user to
+     interactively send the signals associated with these characters, or
+     to escape from the program.
+
+     *Note Signal Characters::.
+
+ -- Macro: tcflag_t IEXTEN
+     POSIX.1 gives 'IEXTEN' implementation-defined meaning, so you
+     cannot rely on this interpretation on all systems.
+
+     On BSD systems and GNU/Linux and GNU/Hurd systems, it enables the
+     LNEXT and DISCARD characters.  *Note Other Special::.
+
+ -- Macro: tcflag_t NOFLSH
+     Normally, the INTR, QUIT, and SUSP characters cause input and
+     output queues for the terminal to be cleared.  If this bit is set,
+     the queues are not cleared.
+
+ -- Macro: tcflag_t TOSTOP
+     If this bit is set and the system supports job control, then
+     'SIGTTOU' signals are generated by background processes that
+     attempt to write to the terminal.  *Note Access to the Terminal::.
+
+   The following bits are BSD extensions; they exist only on BSD systems
+and GNU/Hurd systems.
+
+ -- Macro: tcflag_t ALTWERASE
+     This bit determines how far the WERASE character should erase.  The
+     WERASE character erases back to the beginning of a word; the
+     question is, where do words begin?
+
+     If this bit is clear, then the beginning of a word is a
+     nonwhitespace character following a whitespace character.  If the
+     bit is set, then the beginning of a word is an alphanumeric
+     character or underscore following a character which is none of
+     those.
+
+     *Note Editing Characters::, for more information about the WERASE
+     character.
+
+ -- Macro: tcflag_t FLUSHO
+     This is the bit that toggles when the user types the DISCARD
+     character.  While this bit is set, all output is discarded.  *Note
+     Other Special::.
+
+ -- Macro: tcflag_t NOKERNINFO
+     Setting this bit disables handling of the STATUS character.  *Note
+     Other Special::.
+
+ -- Macro: tcflag_t PENDIN
+     If this bit is set, it indicates that there is a line of input that
+     needs to be reprinted.  Typing the REPRINT character sets this bit;
+     the bit remains set until reprinting is finished.  *Note Editing
+     Characters::.
+
+
+File: libc.info,  Node: Line Speed,  Next: Special Characters,  Prev: Local Modes,  Up: Terminal Modes
+
+17.4.8 Line Speed
+-----------------
+
+The terminal line speed tells the computer how fast to read and write
+data on the terminal.
+
+   If the terminal is connected to a real serial line, the terminal
+speed you specify actually controls the line--if it doesn't match the
+terminal's own idea of the speed, communication does not work.  Real
+serial ports accept only certain standard speeds.  Also, particular
+hardware may not support even all the standard speeds.  Specifying a
+speed of zero hangs up a dialup connection and turns off modem control
+signals.
+
+   If the terminal is not a real serial line (for example, if it is a
+network connection), then the line speed won't really affect data
+transmission speed, but some programs will use it to determine the
+amount of padding needed.  It's best to specify a line speed value that
+matches the actual speed of the actual terminal, but you can safely
+experiment with different values to vary the amount of padding.
+
+   There are actually two line speeds for each terminal, one for input
+and one for output.  You can set them independently, but most often
+terminals use the same speed for both directions.
+
+   The speed values are stored in the 'struct termios' structure, but
+don't try to access them in the 'struct termios' structure directly.
+Instead, you should use the following functions to read and store them:
+
+ -- Function: speed_t cfgetospeed (const struct termios *TERMIOS-P)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `getitimer' function stores information about the timer
-     specified by WHICH in the structure pointed at by OLD.
+     This function returns the output line speed stored in the structure
+     '*TERMIOS-P'.
 
-     The return value and error conditions are the same as for
-     `setitimer'.
-
-`ITIMER_REAL'
-     This constant can be used as the WHICH argument to the `setitimer'
-     and `getitimer' functions to specify the real-time timer.
-
-`ITIMER_VIRTUAL'
-     This constant can be used as the WHICH argument to the `setitimer'
-     and `getitimer' functions to specify the virtual timer.
-
-`ITIMER_PROF'
-     This constant can be used as the WHICH argument to the `setitimer'
-     and `getitimer' functions to specify the profiling timer.
-
- -- Function: unsigned int alarm (unsigned int SECONDS)
-     Preliminary: | MT-Safe timer | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     The `alarm' function sets the real-time timer to expire in SECONDS
-     seconds.  If you want to cancel any existing alarm, you can do
-     this by calling `alarm' with a SECONDS argument of zero.
-
-     The return value indicates how many seconds remain before the
-     previous alarm would have been sent.  If there is no previous
-     alarm, `alarm' returns zero.
-
-   The `alarm' function could be defined in terms of `setitimer' like
-this:
-
-     unsigned int
-     alarm (unsigned int seconds)
-     {
-       struct itimerval old, new;
-       new.it_interval.tv_usec = 0;
-       new.it_interval.tv_sec = 0;
-       new.it_value.tv_usec = 0;
-       new.it_value.tv_sec = (long int) seconds;
-       if (setitimer (ITIMER_REAL, &new, &old) < 0)
-         return 0;
-       else
-         return old.it_value.tv_sec;
-     }
-
-   There is an example showing the use of the `alarm' function in *note
-Handler Returns::.
-
-   If you simply want your process to wait for a given number of
-seconds, you should use the `sleep' function.  *Note Sleeping::.
-
-   You shouldn't count on the signal arriving precisely when the timer
-expires.  In a multiprocessing environment there is typically some
-amount of delay involved.
-
-   *Portability Note:* The `setitimer' and `getitimer' functions are
-derived from BSD Unix, while the `alarm' function is specified by the
-POSIX.1 standard.  `setitimer' is more powerful than `alarm', but
-`alarm' is more widely used.
-
-
-File: libc.info,  Node: Sleeping,  Prev: Setting an Alarm,  Up: Date and Time
-
-21.6 Sleeping
-=============
-
-The function `sleep' gives a simple way to make the program wait for a
-short interval.  If your program doesn't use signals (except to
-terminate), then you can expect `sleep' to wait reliably throughout the
-specified interval.  Otherwise, `sleep' can return sooner if a signal
-arrives; if you want to wait for a given interval regardless of
-signals, use `select' (*note Waiting for I/O::) and don't specify any
-descriptors to wait for.
-
- -- Function: unsigned int sleep (unsigned int SECONDS)
-     Preliminary: | MT-Unsafe sig:SIGCHLD/linux | AS-Unsafe | AC-Unsafe
-     | *Note POSIX Safety Concepts::.
-
-     The `sleep' function waits for SECONDS or until a signal is
-     delivered, whichever happens first.
-
-     If `sleep' function returns because the requested interval is over,
-     it returns a value of zero.  If it returns because of delivery of a
-     signal, its return value is the remaining time in the sleep
-     interval.
-
-     The `sleep' function is declared in `unistd.h'.
-
-   Resist the temptation to implement a sleep for a fixed amount of
-time by using the return value of `sleep', when nonzero, to call
-`sleep' again.  This will work with a certain amount of accuracy as
-long as signals arrive infrequently.  But each signal can cause the
-eventual wakeup time to be off by an additional second or so.  Suppose a
-few signals happen to arrive in rapid succession by bad luck--there is
-no limit on how much this could shorten or lengthen the wait.
-
-   Instead, compute the calendar time at which the program should stop
-waiting, and keep trying to wait until that calendar time.  This won't
-be off by more than a second.  With just a little more work, you can use
-`select' and make the waiting period quite accurate.  (Of course, heavy
-system load can cause additional unavoidable delays--unless the machine
-is dedicated to one application, there is no way you can avoid this.)
-
-   On some systems, `sleep' can do strange things if your program uses
-`SIGALRM' explicitly.  Even if `SIGALRM' signals are being ignored or
-blocked when `sleep' is called, `sleep' might return prematurely on
-delivery of a `SIGALRM' signal.  If you have established a handler for
-`SIGALRM' signals and a `SIGALRM' signal is delivered while the process
-is sleeping, the action taken might be just to cause `sleep' to return
-instead of invoking your handler.  And, if `sleep' is interrupted by
-delivery of a signal whose handler requests an alarm or alters the
-handling of `SIGALRM', this handler and `sleep' will interfere.
-
-   On GNU systems, it is safe to use `sleep' and `SIGALRM' in the same
-program, because `sleep' does not work by means of `SIGALRM'.
-
- -- Function: int nanosleep (const struct timespec *REQUESTED_TIME,
-          struct timespec *REMAINING)
+ -- Function: speed_t cfgetispeed (const struct termios *TERMIOS-P)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     If resolution to seconds is not enough the `nanosleep' function can
-     be used.  As the name suggests the sleep interval can be specified
-     in nanoseconds.  The actual elapsed time of the sleep interval
-     might be longer since the system rounds the elapsed time you
-     request up to the next integer multiple of the actual resolution
-     the system can deliver.
+     This function returns the input line speed stored in the structure
+     '*TERMIOS-P'.
 
-     *`requested_time' is the elapsed time of the interval you want to
-     sleep.
+ -- Function: int cfsetospeed (struct termios *TERMIOS-P, speed_t SPEED)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-     The function returns as *`remaining' the elapsed time left in the
-     interval for which you requested to sleep.  If the interval
-     completed without getting interrupted by a signal, this is zero.
+     This function stores SPEED in '*TERMIOS-P' as the output speed.
+     The normal return value is 0; a value of -1 indicates an error.  If
+     SPEED is not a speed, 'cfsetospeed' returns -1.
 
-     `struct timespec' is described in *Note Elapsed Time::.
+ -- Function: int cfsetispeed (struct termios *TERMIOS-P, speed_t SPEED)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-     If the function returns because the interval is over the return
-     value is zero.  If the function returns -1 the global variable
-     ERRNO is set to the following values:
+     This function stores SPEED in '*TERMIOS-P' as the input speed.  The
+     normal return value is 0; a value of -1 indicates an error.  If
+     SPEED is not a speed, 'cfsetospeed' returns -1.
 
-    `EINTR'
-          The call was interrupted because a signal was delivered to
-          the thread.  If the REMAINING parameter is not the null
-          pointer the structure pointed to by REMAINING is updated to
-          contain the remaining elapsed time.
+ -- Function: int cfsetspeed (struct termios *TERMIOS-P, speed_t SPEED)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-    `EINVAL'
-          The nanosecond value in the REQUESTED_TIME parameter contains
-          an illegal value.  Either the value is negative or greater
-          than or equal to 1000 million.
+     This function stores SPEED in '*TERMIOS-P' as both the input and
+     output speeds.  The normal return value is 0; a value of -1
+     indicates an error.  If SPEED is not a speed, 'cfsetspeed' returns
+     -1.  This function is an extension in 4.4 BSD.
+
+ -- Data Type: speed_t
+     The 'speed_t' type is an unsigned integer data type used to
+     represent line speeds.
+
+   The functions 'cfsetospeed' and 'cfsetispeed' report errors only for
+speed values that the system simply cannot handle.  If you specify a
+speed value that is basically acceptable, then those functions will
+succeed.  But they do not check that a particular hardware device can
+actually support the specified speeds--in fact, they don't know which
+device you plan to set the speed for.  If you use 'tcsetattr' to set the
+speed of a particular device to a value that it cannot handle,
+'tcsetattr' returns -1.
+
+   *Portability note:* In the GNU C Library, the functions above accept
+speeds measured in bits per second as input, and return speed values
+measured in bits per second.  Other libraries require speeds to be
+indicated by special codes.  For POSIX.1 portability, you must use one
+of the following symbols to represent the speed; their precise numeric
+values are system-dependent, but each name has a fixed meaning: 'B110'
+stands for 110 bps, 'B300' for 300 bps, and so on.  There is no portable
+way to represent any speed but these, but these are the only speeds that
+typical serial lines can support.
+
+     B0  B50  B75  B110  B134  B150  B200
+     B300  B600  B1200  B1800  B2400  B4800
+     B9600  B19200  B38400  B57600  B115200
+     B230400  B460800
+
+   BSD defines two additional speed symbols as aliases: 'EXTA' is an
+alias for 'B19200' and 'EXTB' is an alias for 'B38400'.  These aliases
+are obsolete.
+
+
+File: libc.info,  Node: Special Characters,  Next: Noncanonical Input,  Prev: Line Speed,  Up: Terminal Modes
+
+17.4.9 Special Characters
+-------------------------
+
+In canonical input, the terminal driver recognizes a number of special
+characters which perform various control functions.  These include the
+ERASE character (usually <DEL>) for editing input, and other editing
+characters.  The INTR character (normally 'C-c') for sending a 'SIGINT'
+signal, and other signal-raising characters, may be available in either
+canonical or noncanonical input mode.  All these characters are
+described in this section.
+
+   The particular characters used are specified in the 'c_cc' member of
+the 'struct termios' structure.  This member is an array; each element
+specifies the character for a particular role.  Each element has a
+symbolic constant that stands for the index of that element--for
+example, 'VINTR' is the index of the element that specifies the INTR
+character, so storing ''='' in 'TERMIOS.c_cc[VINTR]' specifies '=' as
+the INTR character.
+
+   On some systems, you can disable a particular special character
+function by specifying the value '_POSIX_VDISABLE' for that role.  This
+value is unequal to any possible character code.  *Note Options for
+Files::, for more information about how to tell whether the operating
+system you are using supports '_POSIX_VDISABLE'.
+
+* Menu:
+
+* Editing Characters::          Special characters that terminate lines and
+                                  delete text, and other editing functions.
+* Signal Characters::           Special characters that send or raise signals
+                                  to or for certain classes of processes.
+* Start/Stop Characters::       Special characters that suspend or resume
+                                  suspended output.
+* Other Special::		Other special characters for BSD systems:
+				  they can discard output, and print status.
+
+
+File: libc.info,  Node: Editing Characters,  Next: Signal Characters,  Up: Special Characters
+
+17.4.9.1 Characters for Input Editing
+.....................................
+
+These special characters are active only in canonical input mode.  *Note
+Canonical or Not::.
+
+ -- Macro: int VEOF
+     This is the subscript for the EOF character in the special control
+     character array.  'TERMIOS.c_cc[VEOF]' holds the character itself.
+
+     The EOF character is recognized only in canonical input mode.  It
+     acts as a line terminator in the same way as a newline character,
+     but if the EOF character is typed at the beginning of a line it
+     causes 'read' to return a byte count of zero, indicating
+     end-of-file.  The EOF character itself is discarded.
+
+     Usually, the EOF character is 'C-d'.
+
+ -- Macro: int VEOL
+     This is the subscript for the EOL character in the special control
+     character array.  'TERMIOS.c_cc[VEOL]' holds the character itself.
+
+     The EOL character is recognized only in canonical input mode.  It
+     acts as a line terminator, just like a newline character.  The EOL
+     character is not discarded; it is read as the last character in the
+     input line.
+
+     You don't need to use the EOL character to make <RET> end a line.
+     Just set the ICRNL flag.  In fact, this is the default state of
+     affairs.
+
+ -- Macro: int VEOL2
+     This is the subscript for the EOL2 character in the special control
+     character array.  'TERMIOS.c_cc[VEOL2]' holds the character itself.
+
+     The EOL2 character works just like the EOL character (see above),
+     but it can be a different character.  Thus, you can specify two
+     characters to terminate an input line, by setting EOL to one of
+     them and EOL2 to the other.
+
+     The EOL2 character is a BSD extension; it exists only on BSD
+     systems and GNU/Linux and GNU/Hurd systems.
+
+ -- Macro: int VERASE
+     This is the subscript for the ERASE character in the special
+     control character array.  'TERMIOS.c_cc[VERASE]' holds the
+     character itself.
+
+     The ERASE character is recognized only in canonical input mode.
+     When the user types the erase character, the previous character
+     typed is discarded.  (If the terminal generates multibyte character
+     sequences, this may cause more than one byte of input to be
+     discarded.)  This cannot be used to erase past the beginning of the
+     current line of text.  The ERASE character itself is discarded.
+
+     Usually, the ERASE character is <DEL>.
+
+ -- Macro: int VWERASE
+     This is the subscript for the WERASE character in the special
+     control character array.  'TERMIOS.c_cc[VWERASE]' holds the
+     character itself.
+
+     The WERASE character is recognized only in canonical mode.  It
+     erases an entire word of prior input, and any whitespace after it;
+     whitespace characters before the word are not erased.
+
+     The definition of a "word" depends on the setting of the
+     'ALTWERASE' mode; *note Local Modes::.
+
+     If the 'ALTWERASE' mode is not set, a word is defined as a sequence
+     of any characters except space or tab.
+
+     If the 'ALTWERASE' mode is set, a word is defined as a sequence of
+     characters containing only letters, numbers, and underscores,
+     optionally followed by one character that is not a letter, number,
+     or underscore.
+
+     The WERASE character is usually 'C-w'.
+
+     This is a BSD extension.
+
+ -- Macro: int VKILL
+     This is the subscript for the KILL character in the special control
+     character array.  'TERMIOS.c_cc[VKILL]' holds the character itself.
+
+     The KILL character is recognized only in canonical input mode.
+     When the user types the kill character, the entire contents of the
+     current line of input are discarded.  The kill character itself is
+     discarded too.
+
+     The KILL character is usually 'C-u'.
+
+ -- Macro: int VREPRINT
+     This is the subscript for the REPRINT character in the special
+     control character array.  'TERMIOS.c_cc[VREPRINT]' holds the
+     character itself.
+
+     The REPRINT character is recognized only in canonical mode.  It
+     reprints the current input line.  If some asynchronous output has
+     come while you are typing, this lets you see the line you are
+     typing clearly again.
+
+     The REPRINT character is usually 'C-r'.
+
+     This is a BSD extension.
+
+
+File: libc.info,  Node: Signal Characters,  Next: Start/Stop Characters,  Prev: Editing Characters,  Up: Special Characters
+
+17.4.9.2 Characters that Cause Signals
+......................................
+
+These special characters may be active in either canonical or
+noncanonical input mode, but only when the 'ISIG' flag is set (*note
+Local Modes::).
+
+ -- Macro: int VINTR
+     This is the subscript for the INTR character in the special control
+     character array.  'TERMIOS.c_cc[VINTR]' holds the character itself.
+
+     The INTR (interrupt) character raises a 'SIGINT' signal for all
+     processes in the foreground job associated with the terminal.  The
+     INTR character itself is then discarded.  *Note Signal Handling::,
+     for more information about signals.
+
+     Typically, the INTR character is 'C-c'.
+
+ -- Macro: int VQUIT
+     This is the subscript for the QUIT character in the special control
+     character array.  'TERMIOS.c_cc[VQUIT]' holds the character itself.
+
+     The QUIT character raises a 'SIGQUIT' signal for all processes in
+     the foreground job associated with the terminal.  The QUIT
+     character itself is then discarded.  *Note Signal Handling::, for
+     more information about signals.
+
+     Typically, the QUIT character is 'C-\'.
+
+ -- Macro: int VSUSP
+     This is the subscript for the SUSP character in the special control
+     character array.  'TERMIOS.c_cc[VSUSP]' holds the character itself.
+
+     The SUSP (suspend) character is recognized only if the
+     implementation supports job control (*note Job Control::).  It
+     causes a 'SIGTSTP' signal to be sent to all processes in the
+     foreground job associated with the terminal.  The SUSP character
+     itself is then discarded.  *Note Signal Handling::, for more
+     information about signals.
+
+     Typically, the SUSP character is 'C-z'.
+
+   Few applications disable the normal interpretation of the SUSP
+character.  If your program does this, it should provide some other
+mechanism for the user to stop the job.  When the user invokes this
+mechanism, the program should send a 'SIGTSTP' signal to the process
+group of the process, not just to the process itself.  *Note Signaling
+Another Process::.
+
+ -- Macro: int VDSUSP
+     This is the subscript for the DSUSP character in the special
+     control character array.  'TERMIOS.c_cc[VDSUSP]' holds the
+     character itself.
+
+     The DSUSP (suspend) character is recognized only if the
+     implementation supports job control (*note Job Control::).  It
+     sends a 'SIGTSTP' signal, like the SUSP character, but not right
+     away--only when the program tries to read it as input.  Not all
+     systems with job control support DSUSP; only BSD-compatible systems
+     (including GNU/Hurd systems).
+
+     *Note Signal Handling::, for more information about signals.
+
+     Typically, the DSUSP character is 'C-y'.
+
+
+File: libc.info,  Node: Start/Stop Characters,  Next: Other Special,  Prev: Signal Characters,  Up: Special Characters
+
+17.4.9.3 Special Characters for Flow Control
+............................................
+
+These special characters may be active in either canonical or
+noncanonical input mode, but their use is controlled by the flags 'IXON'
+and 'IXOFF' (*note Input Modes::).
+
+ -- Macro: int VSTART
+     This is the subscript for the START character in the special
+     control character array.  'TERMIOS.c_cc[VSTART]' holds the
+     character itself.
+
+     The START character is used to support the 'IXON' and 'IXOFF' input
+     modes.  If 'IXON' is set, receiving a START character resumes
+     suspended output; the START character itself is discarded.  If
+     'IXANY' is set, receiving any character at all resumes suspended
+     output; the resuming character is not discarded unless it is the
+     START character.  'IXOFF' is set, the system may also transmit
+     START characters to the terminal.
+
+     The usual value for the START character is 'C-q'.  You may not be
+     able to change this value--the hardware may insist on using 'C-q'
+     regardless of what you specify.
+
+ -- Macro: int VSTOP
+     This is the subscript for the STOP character in the special control
+     character array.  'TERMIOS.c_cc[VSTOP]' holds the character itself.
+
+     The STOP character is used to support the 'IXON' and 'IXOFF' input
+     modes.  If 'IXON' is set, receiving a STOP character causes output
+     to be suspended; the STOP character itself is discarded.  If
+     'IXOFF' is set, the system may also transmit STOP characters to the
+     terminal, to prevent the input queue from overflowing.
+
+     The usual value for the STOP character is 'C-s'.  You may not be
+     able to change this value--the hardware may insist on using 'C-s'
+     regardless of what you specify.
+
+
+File: libc.info,  Node: Other Special,  Prev: Start/Stop Characters,  Up: Special Characters
+
+17.4.9.4 Other Special Characters
+.................................
+
+ -- Macro: int VLNEXT
+     This is the subscript for the LNEXT character in the special
+     control character array.  'TERMIOS.c_cc[VLNEXT]' holds the
+     character itself.
+
+     The LNEXT character is recognized only when 'IEXTEN' is set, but in
+     both canonical and noncanonical mode.  It disables any special
+     significance of the next character the user types.  Even if the
+     character would normally perform some editing function or generate
+     a signal, it is read as a plain character.  This is the analogue of
+     the 'C-q' command in Emacs.  "LNEXT" stands for "literal next."
+
+     The LNEXT character is usually 'C-v'.
+
+     This character is available on BSD systems and GNU/Linux and
+     GNU/Hurd systems.
+
+ -- Macro: int VDISCARD
+     This is the subscript for the DISCARD character in the special
+     control character array.  'TERMIOS.c_cc[VDISCARD]' holds the
+     character itself.
+
+     The DISCARD character is recognized only when 'IEXTEN' is set, but
+     in both canonical and noncanonical mode.  Its effect is to toggle
+     the discard-output flag.  When this flag is set, all program output
+     is discarded.  Setting the flag also discards all output currently
+     in the output buffer.  Typing any other character resets the flag.
+
+     This character is available on BSD systems and GNU/Linux and
+     GNU/Hurd systems.
+
+ -- Macro: int VSTATUS
+     This is the subscript for the STATUS character in the special
+     control character array.  'TERMIOS.c_cc[VSTATUS]' holds the
+     character itself.
+
+     The STATUS character's effect is to print out a status message
+     about how the current process is running.
+
+     The STATUS character is recognized only in canonical mode, and only
+     if 'NOKERNINFO' is not set.
+
+     This character is available only on BSD systems and GNU/Hurd
+     systems.
+
+
+File: libc.info,  Node: Noncanonical Input,  Prev: Special Characters,  Up: Terminal Modes
+
+17.4.10 Noncanonical Input
+--------------------------
+
+In noncanonical input mode, the special editing characters such as ERASE
+and KILL are ignored.  The system facilities for the user to edit input
+are disabled in noncanonical mode, so that all input characters (unless
+they are special for signal or flow-control purposes) are passed to the
+application program exactly as typed.  It is up to the application
+program to give the user ways to edit the input, if appropriate.
+
+   Noncanonical mode offers special parameters called MIN and TIME for
+controlling whether and how long to wait for input to be available.  You
+can even use them to avoid ever waiting--to return immediately with
+whatever input is available, or with no input.
+
+   The MIN and TIME are stored in elements of the 'c_cc' array, which is
+a member of the 'struct termios' structure.  Each element of this array
+has a particular role, and each element has a symbolic constant that
+stands for the index of that element.  'VMIN' and 'VMAX' are the names
+for the indices in the array of the MIN and TIME slots.
+
+ -- Macro: int VMIN
+     This is the subscript for the MIN slot in the 'c_cc' array.  Thus,
+     'TERMIOS.c_cc[VMIN]' is the value itself.
+
+     The MIN slot is only meaningful in noncanonical input mode; it
+     specifies the minimum number of bytes that must be available in the
+     input queue in order for 'read' to return.
+
+ -- Macro: int VTIME
+     This is the subscript for the TIME slot in the 'c_cc' array.  Thus,
+     'TERMIOS.c_cc[VTIME]' is the value itself.
+
+     The TIME slot is only meaningful in noncanonical input mode; it
+     specifies how long to wait for input before returning, in units of
+     0.1 seconds.
+
+   The MIN and TIME values interact to determine the criterion for when
+'read' should return; their precise meanings depend on which of them are
+nonzero.  There are four possible cases:
+
+   * Both TIME and MIN are nonzero.
+
+     In this case, TIME specifies how long to wait after each input
+     character to see if more input arrives.  After the first character
+     received, 'read' keeps waiting until either MIN bytes have arrived
+     in all, or TIME elapses with no further input.
+
+     'read' always blocks until the first character arrives, even if
+     TIME elapses first.  'read' can return more than MIN characters if
+     more than MIN happen to be in the queue.
+
+   * Both MIN and TIME are zero.
+
+     In this case, 'read' always returns immediately with as many
+     characters as are available in the queue, up to the number
+     requested.  If no input is immediately available, 'read' returns a
+     value of zero.
+
+   * MIN is zero but TIME has a nonzero value.
+
+     In this case, 'read' waits for time TIME for input to become
+     available; the availability of a single byte is enough to satisfy
+     the read request and cause 'read' to return.  When it returns, it
+     returns as many characters as are available, up to the number
+     requested.  If no input is available before the timer expires,
+     'read' returns a value of zero.
+
+   * TIME is zero but MIN has a nonzero value.
+
+     In this case, 'read' waits until at least MIN bytes are available
+     in the queue.  At that time, 'read' returns as many characters as
+     are available, up to the number requested.  'read' can return more
+     than MIN characters if more than MIN happen to be in the queue.
+
+   What happens if MIN is 50 and you ask to read just 10 bytes?
+Normally, 'read' waits until there are 50 bytes in the buffer (or, more
+generally, the wait condition described above is satisfied), and then
+reads 10 of them, leaving the other 40 buffered in the operating system
+for a subsequent call to 'read'.
+
+   *Portability note:* On some systems, the MIN and TIME slots are
+actually the same as the EOF and EOL slots.  This causes no serious
+problem because the MIN and TIME slots are used only in noncanonical
+input and the EOF and EOL slots are used only in canonical input, but it
+isn't very clean.  The GNU C Library allocates separate slots for these
+uses.
+
+ -- Function: void cfmakeraw (struct termios *TERMIOS-P)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function provides an easy way to set up '*TERMIOS-P' for what
+     has traditionally been called "raw mode" in BSD. This uses
+     noncanonical input, and turns off most processing to give an
+     unmodified channel to the terminal.
+
+     It does exactly this:
+            TERMIOS-P->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
+                                          |INLCR|IGNCR|ICRNL|IXON);
+            TERMIOS-P->c_oflag &= ~OPOST;
+            TERMIOS-P->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
+            TERMIOS-P->c_cflag &= ~(CSIZE|PARENB);
+            TERMIOS-P->c_cflag |= CS8;
+
+
+File: libc.info,  Node: BSD Terminal Modes,  Next: Line Control,  Prev: Terminal Modes,  Up: Low-Level Terminal Interface
+
+17.5 BSD Terminal Modes
+=======================
+
+The usual way to get and set terminal modes is with the functions
+described in *note Terminal Modes::.  However, on some systems you can
+use the BSD-derived functions in this section to do some of the same
+thing.  On many systems, these functions do not exist.  Even with the
+GNU C Library, the functions simply fail with 'errno' = 'ENOSYS' with
+many kernels, including Linux.
+
+   The symbols used in this section are declared in 'sgtty.h'.
+
+ -- Data Type: struct sgttyb
+     This structure is an input or output parameter list for 'gtty' and
+     'stty'.
+
+     'char sg_ispeed'
+          Line speed for input
+     'char sg_ospeed'
+          Line speed for output
+     'char sg_erase'
+          Erase character
+     'char sg_kill'
+          Kill character
+     'int sg_flags'
+          Various flags
+
+ -- Function: int gtty (int FILEDES, struct sgttyb *ATTRIBUTES)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function gets the attributes of a terminal.
+
+     'gtty' sets *ATTRIBUTES to describe the terminal attributes of the
+     terminal which is open with file descriptor FILEDES.
+
+ -- Function: int stty (int FILEDES, const struct sgttyb *ATTRIBUTES)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function sets the attributes of a terminal.
+
+     'stty' sets the terminal attributes of the terminal which is open
+     with file descriptor FILEDES to those described by *FILEDES.
+
+
+File: libc.info,  Node: Line Control,  Next: Noncanon Example,  Prev: BSD Terminal Modes,  Up: Low-Level Terminal Interface
+
+17.6 Line Control Functions
+===========================
+
+These functions perform miscellaneous control actions on terminal
+devices.  As regards terminal access, they are treated like doing
+output: if any of these functions is used by a background process on its
+controlling terminal, normally all processes in the process group are
+sent a 'SIGTTOU' signal.  The exception is if the calling process itself
+is ignoring or blocking 'SIGTTOU' signals, in which case the operation
+is performed and no signal is sent.  *Note Job Control::.
+
+ -- Function: int tcsendbreak (int FILEDES, int DURATION)
+     Preliminary: | MT-Unsafe race:tcattr(filedes)/bsd | AS-Unsafe |
+     AC-Unsafe corrupt/bsd | *Note POSIX Safety Concepts::.
+
+     This function generates a break condition by transmitting a stream
+     of zero bits on the terminal associated with the file descriptor
+     FILEDES.  The duration of the break is controlled by the DURATION
+     argument.  If zero, the duration is between 0.25 and 0.5 seconds.
+     The meaning of a nonzero value depends on the operating system.
+
+     This function does nothing if the terminal is not an asynchronous
+     serial data port.
+
+     The return value is normally zero.  In the event of an error, a
+     value of -1 is returned.  The following 'errno' error conditions
+     are defined for this function:
+
+     'EBADF'
+          The FILEDES is not a valid file descriptor.
+
+     'ENOTTY'
+          The FILEDES is not associated with a terminal device.
+
+ -- Function: int tcdrain (int FILEDES)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'tcdrain' function waits until all queued output to the
+     terminal FILEDES has been transmitted.
 
      This function is a cancellation point in multi-threaded programs.
      This is a problem if the thread allocates some resources (like
      memory, file descriptors, semaphores or whatever) at the time
-     `nanosleep' is called.  If the thread gets canceled these
-     resources stay allocated until the program ends.  To avoid this
-     calls to `nanosleep' should be protected using cancellation
-     handlers.
+     'tcdrain' is called.  If the thread gets canceled these resources
+     stay allocated until the program ends.  To avoid this calls to
+     'tcdrain' should be protected using cancellation handlers.
 
-     The `nanosleep' function is declared in `time.h'.
+     The return value is normally zero.  In the event of an error, a
+     value of -1 is returned.  The following 'errno' error conditions
+     are defined for this function:
+
+     'EBADF'
+          The FILEDES is not a valid file descriptor.
+
+     'ENOTTY'
+          The FILEDES is not associated with a terminal device.
+
+     'EINTR'
+          The operation was interrupted by delivery of a signal.  *Note
+          Interrupted Primitives::.
+
+ -- Function: int tcflush (int FILEDES, int QUEUE)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'tcflush' function is used to clear the input and/or output
+     queues associated with the terminal file FILEDES.  The QUEUE
+     argument specifies which queue(s) to clear, and can be one of the
+     following values:
+
+     'TCIFLUSH'
+
+          Clear any input data received, but not yet read.
+
+     'TCOFLUSH'
+
+          Clear any output data written, but not yet transmitted.
+
+     'TCIOFLUSH'
+
+          Clear both queued input and output.
+
+     The return value is normally zero.  In the event of an error, a
+     value of -1 is returned.  The following 'errno' error conditions
+     are defined for this function:
+
+     'EBADF'
+          The FILEDES is not a valid file descriptor.
+
+     'ENOTTY'
+          The FILEDES is not associated with a terminal device.
+
+     'EINVAL'
+          A bad value was supplied as the QUEUE argument.
+
+     It is unfortunate that this function is named 'tcflush', because
+     the term "flush" is normally used for quite another
+     operation--waiting until all output is transmitted--and using it
+     for discarding input or output would be confusing.  Unfortunately,
+     the name 'tcflush' comes from POSIX and we cannot change it.
+
+ -- Function: int tcflow (int FILEDES, int ACTION)
+     Preliminary: | MT-Unsafe race:tcattr(filedes)/bsd | AS-Unsafe |
+     AC-Safe | *Note POSIX Safety Concepts::.
+
+     The 'tcflow' function is used to perform operations relating to
+     XON/XOFF flow control on the terminal file specified by FILEDES.
+
+     The ACTION argument specifies what operation to perform, and can be
+     one of the following values:
+
+     'TCOOFF'
+          Suspend transmission of output.
+
+     'TCOON'
+          Restart transmission of output.
+
+     'TCIOFF'
+          Transmit a STOP character.
+
+     'TCION'
+          Transmit a START character.
+
+     For more information about the STOP and START characters, see *note
+     Special Characters::.
+
+     The return value is normally zero.  In the event of an error, a
+     value of -1 is returned.  The following 'errno' error conditions
+     are defined for this function:
+
+     'EBADF'
+          The FILEDES is not a valid file descriptor.
+
+     'ENOTTY'
+          The FILEDES is not associated with a terminal device.
+
+     'EINVAL'
+          A bad value was supplied as the ACTION argument.
 
 
-File: libc.info,  Node: Resource Usage And Limitation,  Next: Non-Local Exits,  Prev: Date and Time,  Up: Top
+File: libc.info,  Node: Noncanon Example,  Next: Pseudo-Terminals,  Prev: Line Control,  Up: Low-Level Terminal Interface
 
-22 Resource Usage And Limitation
-********************************
+17.7 Noncanonical Mode Example
+==============================
 
-This chapter describes functions for examining how much of various
-kinds of resources (CPU time, memory, etc.) a process has used and
-getting and setting limits on future usage.
+Here is an example program that shows how you can set up a terminal
+device to read single characters in noncanonical input mode, without
+echo.
 
-* Menu:
 
-* Resource Usage::		Measuring various resources used.
-* Limits on Resources::		Specifying limits on resource usage.
-* Priority::			Reading or setting process run priority.
-* Memory Resources::            Querying memory available resources.
-* Processor Resources::         Learn about the processors available.
-
-
-File: libc.info,  Node: Resource Usage,  Next: Limits on Resources,  Up: Resource Usage And Limitation
-
-22.1 Resource Usage
-===================
-
-The function `getrusage' and the data type `struct rusage' are used to
-examine the resource usage of a process.  They are declared in
-`sys/resource.h'.
-
- -- Function: int getrusage (int PROCESSES, struct rusage *RUSAGE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function reports resource usage totals for processes
-     specified by PROCESSES, storing the information in `*RUSAGE'.
-
-     In most systems, PROCESSES has only two valid values:
-
-    `RUSAGE_SELF'
-          Just the current process.
-
-    `RUSAGE_CHILDREN'
-          All child processes (direct and indirect) that have already
-          terminated.
-
-     The return value of `getrusage' is zero for success, and `-1' for
-     failure.
-
-    `EINVAL'
-          The argument PROCESSES is not valid.
-
-   One way of getting resource usage for a particular child process is
-with the function `wait4', which returns totals for a child when it
-terminates.  *Note BSD Wait Functions::.
-
- -- Data Type: struct rusage
-     This data type stores various resource usage statistics.  It has
-     the following members, and possibly others:
-
-    `struct timeval ru_utime'
-          Time spent executing user instructions.
-
-    `struct timeval ru_stime'
-          Time spent in operating system code on behalf of PROCESSES.
-
-    `long int ru_maxrss'
-          The maximum resident set size used, in kilobytes.  That is,
-          the maximum number of kilobytes of physical memory that
-          PROCESSES used simultaneously.
-
-    `long int ru_ixrss'
-          An integral value expressed in kilobytes times ticks of
-          execution, which indicates the amount of memory used by text
-          that was shared with other processes.
-
-    `long int ru_idrss'
-          An integral value expressed the same way, which is the amount
-          of unshared memory used for data.
-
-    `long int ru_isrss'
-          An integral value expressed the same way, which is the amount
-          of unshared memory used for stack space.
-
-    `long int ru_minflt'
-          The number of page faults which were serviced without
-          requiring any I/O.
-
-    `long int ru_majflt'
-          The number of page faults which were serviced by doing I/O.
-
-    `long int ru_nswap'
-          The number of times PROCESSES was swapped entirely out of
-          main memory.
-
-    `long int ru_inblock'
-          The number of times the file system had to read from the disk
-          on behalf of PROCESSES.
-
-    `long int ru_oublock'
-          The number of times the file system had to write to the disk
-          on behalf of PROCESSES.
-
-    `long int ru_msgsnd'
-          Number of IPC messages sent.
-
-    `long int ru_msgrcv'
-          Number of IPC messages received.
-
-    `long int ru_nsignals'
-          Number of signals received.
-
-    `long int ru_nvcsw'
-          The number of times PROCESSES voluntarily invoked a context
-          switch (usually to wait for some service).
-
-    `long int ru_nivcsw'
-          The number of times an involuntary context switch took place
-          (because a time slice expired, or another process of higher
-          priority was scheduled).
-
-   `vtimes' is a historical function that does some of what `getrusage'
-does.  `getrusage' is a better choice.
-
-   `vtimes' and its `vtimes' data structure are declared in
-`sys/vtimes.h'.  
-
- -- Function: int vtimes (struct vtimes *CURRENT, struct vtimes *CHILD)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `vtimes' reports resource usage totals for a process.
-
-     If CURRENT is non-null, `vtimes' stores resource usage totals for
-     the invoking process alone in the structure to which it points.  If
-     CHILD is non-null, `vtimes' stores resource usage totals for all
-     past children (which have terminated) of the invoking process in
-     the structure to which it points.
-
-      -- Data Type: struct vtimes
-          This data type contains information about the resource usage
-          of a process.  Each member corresponds to a member of the
-          `struct rusage' data type described above.
-
-         `vm_utime'
-               User CPU time.  Analogous to `ru_utime' in `struct
-               rusage'
-
-         `vm_stime'
-               System CPU time.  Analogous to `ru_stime' in `struct
-               rusage'
-
-         `vm_idsrss'
-               Data and stack memory.  The sum of the values that would
-               be reported as `ru_idrss' and `ru_isrss' in `struct
-               rusage'
-
-         `vm_ixrss'
-               Shared memory.  Analogous to `ru_ixrss' in `struct
-               rusage'
-
-         `vm_maxrss'
-               Maximent resident set size.  Analogous to `ru_maxrss' in
-               `struct rusage'
-
-         `vm_majflt'
-               Major page faults.  Analogous to `ru_majflt' in `struct
-               rusage'
-
-         `vm_minflt'
-               Minor page faults.  Analogous to `ru_minflt' in `struct
-               rusage'
-
-         `vm_nswap'
-               Swap count.  Analogous to `ru_nswap' in `struct rusage'
-
-         `vm_inblk'
-               Disk reads.  Analogous to `ru_inblk' in `struct rusage'
-
-         `vm_oublk'
-               Disk writes.  Analogous to `ru_oublk' in `struct rusage'
-
-     The return value is zero if the function succeeds; `-1' otherwise.
-
-   An additional historical function for examining resource usage,
-`vtimes', is supported but not documented here.  It is declared in
-`sys/vtimes.h'.
-
-
-File: libc.info,  Node: Limits on Resources,  Next: Priority,  Prev: Resource Usage,  Up: Resource Usage And Limitation
-
-22.2 Limiting Resource Usage
-============================
-
-You can specify limits for the resource usage of a process.  When the
-process tries to exceed a limit, it may get a signal, or the system call
-by which it tried to do so may fail, depending on the resource.  Each
-process initially inherits its limit values from its parent, but it can
-subsequently change them.
-
-   There are two per-process limits associated with a resource: 
-
-"current limit"
-     The current limit is the value the system will not allow usage to
-     exceed.  It is also called the "soft limit" because the process
-     being limited can generally raise the current limit at will.  
-
-"maximum limit"
-     The maximum limit is the maximum value to which a process is
-     allowed to set its current limit.  It is also called the "hard
-     limit" because there is no way for a process to get around it.  A
-     process may lower its own maximum limit, but only the superuser
-     may increase a maximum limit.  
-
-   The symbols for use with `getrlimit', `setrlimit', `getrlimit64',
-and `setrlimit64' are defined in `sys/resource.h'.
-
- -- Function: int getrlimit (int RESOURCE, struct rlimit *RLP)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Read the current and maximum limits for the resource RESOURCE and
-     store them in `*RLP'.
-
-     The return value is `0' on success and `-1' on failure.  The only
-     possible `errno' error condition is `EFAULT'.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
-     32-bit system this function is in fact `getrlimit64'.  Thus, the
-     LFS interface transparently replaces the old interface.
-
- -- Function: int getrlimit64 (int RESOURCE, struct rlimit64 *RLP)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is similar to `getrlimit' but its second parameter is
-     a pointer to a variable of type `struct rlimit64', which allows it
-     to read values which wouldn't fit in the member of a `struct
-     rlimit'.
-
-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
-     32-bit machine, this function is available under the name
-     `getrlimit' and so transparently replaces the old interface.
-
- -- Function: int setrlimit (int RESOURCE, const struct rlimit *RLP)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Store the current and maximum limits for the resource RESOURCE in
-     `*RLP'.
-
-     The return value is `0' on success and `-1' on failure.  The
-     following `errno' error condition is possible:
-
-    `EPERM'
-             * The process tried to raise a current limit beyond the
-               maximum limit.
-
-             * The process tried to raise a maximum limit, but is not
-               superuser.
-
-     When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
-     32-bit system this function is in fact `setrlimit64'.  Thus, the
-     LFS interface transparently replaces the old interface.
-
- -- Function: int setrlimit64 (int RESOURCE, const struct rlimit64 *RLP)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is similar to `setrlimit' but its second parameter is
-     a pointer to a variable of type `struct rlimit64' which allows it
-     to set values which wouldn't fit in the member of a `struct
-     rlimit'.
-
-     If the sources are compiled with `_FILE_OFFSET_BITS == 64' on a
-     32-bit machine this function is available under the name
-     `setrlimit' and so transparently replaces the old interface.
-
- -- Data Type: struct rlimit
-     This structure is used with `getrlimit' to receive limit values,
-     and with `setrlimit' to specify limit values for a particular
-     process and resource.  It has two fields:
-
-    `rlim_t rlim_cur'
-          The current limit
-
-    `rlim_t rlim_max'
-          The maximum limit.
-
-     For `getrlimit', the structure is an output; it receives the
-     current values.  For `setrlimit', it specifies the new values.
-
-   For the LFS functions a similar type is defined in `sys/resource.h'.
-
- -- Data Type: struct rlimit64
-     This structure is analogous to the `rlimit' structure above, but
-     its components have wider ranges.  It has two fields:
-
-    `rlim64_t rlim_cur'
-          This is analogous to `rlimit.rlim_cur', but with a different
-          type.
-
-    `rlim64_t rlim_max'
-          This is analogous to `rlimit.rlim_max', but with a different
-          type.
-
-
-   Here is a list of resources for which you can specify a limit.
-Memory and file sizes are measured in bytes.
-
-`RLIMIT_CPU'
-     The maximum amount of CPU time the process can use.  If it runs for
-     longer than this, it gets a signal: `SIGXCPU'.  The value is
-     measured in seconds.  *Note Operation Error Signals::.
-
-`RLIMIT_FSIZE'
-     The maximum size of file the process can create.  Trying to write a
-     larger file causes a signal: `SIGXFSZ'.  *Note Operation Error
-     Signals::.
-
-`RLIMIT_DATA'
-     The maximum size of data memory for the process.  If the process
-     tries to allocate data memory beyond this amount, the allocation
-     function fails.
-
-`RLIMIT_STACK'
-     The maximum stack size for the process.  If the process tries to
-     extend its stack past this size, it gets a `SIGSEGV' signal.
-     *Note Program Error Signals::.
-
-`RLIMIT_CORE'
-     The maximum size core file that this process can create.  If the
-     process terminates and would dump a core file larger than this,
-     then no core file is created.  So setting this limit to zero
-     prevents core files from ever being created.
-
-`RLIMIT_RSS'
-     The maximum amount of physical memory that this process should get.
-     This parameter is a guide for the system's scheduler and memory
-     allocator; the system may give the process more memory when there
-     is a surplus.
-
-`RLIMIT_MEMLOCK'
-     The maximum amount of memory that can be locked into physical
-     memory (so it will never be paged out).
-
-`RLIMIT_NPROC'
-     The maximum number of processes that can be created with the same
-     user ID.  If you have reached the limit for your user ID, `fork'
-     will fail with `EAGAIN'.  *Note Creating a Process::.
-
-`RLIMIT_NOFILE'
-`RLIMIT_OFILE'
-     The maximum number of files that the process can open.  If it
-     tries to open more files than this, its open attempt fails with
-     `errno' `EMFILE'.  *Note Error Codes::.  Not all systems support
-     this limit; GNU does, and 4.4 BSD does.
-
-`RLIMIT_AS'
-     The maximum size of total memory that this process should get.  If
-     the process tries to allocate more memory beyond this amount with,
-     for example, `brk', `malloc', `mmap' or `sbrk', the allocation
-     function fails.
-
-`RLIM_NLIMITS'
-     The number of different resource limits.  Any valid RESOURCE
-     operand must be less than `RLIM_NLIMITS'.
-
- -- Constant: rlim_t RLIM_INFINITY
-     This constant stands for a value of "infinity" when supplied as
-     the limit value in `setrlimit'.
-
-   The following are historical functions to do some of what the
-functions above do.  The functions above are better choices.
-
-   `ulimit' and the command symbols are declared in `ulimit.h'.  
-
- -- Function: long int ulimit (int CMD, ...)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `ulimit' gets the current limit or sets the current and maximum
-     limit for a particular resource for the calling process according
-     to the command CMD.a
-
-     If you are getting a limit, the command argument is the only
-     argument.  If you are setting a limit, there is a second argument:
-     `long int' LIMIT which is the value to which you are setting the
-     limit.
-
-     The CMD values and the operations they specify are:
-    `GETFSIZE'
-          Get the current limit on the size of a file, in units of 512
-          bytes.
-
-    `SETFSIZE'
-          Set the current and maximum limit on the size of a file to
-          LIMIT * 512 bytes.
-
-
-     There are also some other CMD values that may do things on some
-     systems, but they are not supported.
-
-     Only the superuser may increase a maximum limit.
-
-     When you successfully get a limit, the return value of `ulimit' is
-     that limit, which is never negative.  When you successfully set a
-     limit, the return value is zero.  When the function fails, the
-     return value is `-1' and `errno' is set according to the reason:
-
-    `EPERM'
-          A process tried to increase a maximum limit, but is not
-          superuser.
-
-
-   `vlimit' and its resource symbols are declared in `sys/vlimit.h'.  
-
- -- Function: int vlimit (int RESOURCE, int LIMIT)
-     Preliminary: | MT-Unsafe race:setrlimit | AS-Unsafe | AC-Safe |
-     *Note POSIX Safety Concepts::.
-
-     `vlimit' sets the current limit for a resource for a process.
-
-     RESOURCE identifies the resource:
-
-    `LIM_CPU'
-          Maximum CPU time.  Same as `RLIMIT_CPU' for `setrlimit'.
-
-    `LIM_FSIZE'
-          Maximum file size.  Same as `RLIMIT_FSIZE' for `setrlimit'.
-
-    `LIM_DATA'
-          Maximum data memory.  Same as `RLIMIT_DATA' for `setrlimit'.
-
-    `LIM_STACK'
-          Maximum stack size.  Same as `RLIMIT_STACK' for `setrlimit'.
-
-    `LIM_CORE'
-          Maximum core file size.  Same as `RLIMIT_COR' for `setrlimit'.
-
-    `LIM_MAXRSS'
-          Maximum physical memory.  Same as `RLIMIT_RSS' for
-          `setrlimit'.
-
-     The return value is zero for success, and `-1' with `errno' set
-     accordingly for failure:
-
-    `EPERM'
-          The process tried to set its current limit beyond its maximum
-          limit.
-
-
-
-File: libc.info,  Node: Priority,  Next: Memory Resources,  Prev: Limits on Resources,  Up: Resource Usage And Limitation
-
-22.3 Process CPU Priority And Scheduling
-========================================
-
-When multiple processes simultaneously require CPU time, the system's
-scheduling policy and process CPU priorities determine which processes
-get it.  This section describes how that determination is made and GNU
-C Library functions to control it.
-
-   It is common to refer to CPU scheduling simply as scheduling and a
-process' CPU priority simply as the process' priority, with the CPU
-resource being implied.  Bear in mind, though, that CPU time is not the
-only resource a process uses or that processes contend for.  In some
-cases, it is not even particularly important.  Giving a process a high
-"priority" may have very little effect on how fast a process runs with
-respect to other processes.  The priorities discussed in this section
-apply only to CPU time.
-
-   CPU scheduling is a complex issue and different systems do it in
-wildly different ways.  New ideas continually develop and find their
-way into the intricacies of the various systems' scheduling algorithms.
-This section discusses the general concepts, some specifics of systems
-that commonly use the GNU C Library, and some standards.
-
-   For simplicity, we talk about CPU contention as if there is only one
-CPU in the system.  But all the same principles apply when a processor
-has multiple CPUs, and knowing that the number of processes that can
-run at any one time is equal to the number of CPUs, you can easily
-extrapolate the information.
-
-   The functions described in this section are all defined by the
-POSIX.1 and POSIX.1b standards (the `sched...' functions are POSIX.1b).
-However, POSIX does not define any semantics for the values that these
-functions get and set.  In this chapter, the semantics are based on the
-Linux kernel's implementation of the POSIX standard.  As you will see,
-the Linux implementation is quite the inverse of what the authors of the
-POSIX syntax had in mind.
-
-* Menu:
-
-* Absolute Priority::               The first tier of priority.  Posix
-* Realtime Scheduling::             Scheduling among the process nobility
-* Basic Scheduling Functions::      Get/set scheduling policy, priority
-* Traditional Scheduling::          Scheduling among the vulgar masses
-* CPU Affinity::                    Limiting execution to certain CPUs
-
-
-File: libc.info,  Node: Absolute Priority,  Next: Realtime Scheduling,  Up: Priority
-
-22.3.1 Absolute Priority
-------------------------
-
-Every process has an absolute priority, and it is represented by a
-number.  The higher the number, the higher the absolute priority.
-
-   On systems of the past, and most systems today, all processes have
-absolute priority 0 and this section is irrelevant.  In that case,
-*Note Traditional Scheduling::.  Absolute priorities were invented to
-accommodate realtime systems, in which it is vital that certain
-processes be able to respond to external events happening in real time,
-which means they cannot wait around while some other process that _wants
-to_, but doesn't _need to_ run occupies the CPU.
-
-   When two processes are in contention to use the CPU at any instant,
-the one with the higher absolute priority always gets it.  This is true
-even if the process with the lower priority is already using the CPU
-(i.e., the scheduling is preemptive).  Of course, we're only talking
-about processes that are running or "ready to run," which means they are
-ready to execute instructions right now.  When a process blocks to wait
-for something like I/O, its absolute priority is irrelevant.
-
-   *NB:*  The term "runnable" is a synonym for "ready to run."
-
-   When two processes are running or ready to run and both have the same
-absolute priority, it's more interesting.  In that case, who gets the
-CPU is determined by the scheduling policy.  If the processes have
-absolute priority 0, the traditional scheduling policy described in
-*note Traditional Scheduling:: applies.  Otherwise, the policies
-described in *note Realtime Scheduling:: apply.
-
-   You normally give an absolute priority above 0 only to a process that
-can be trusted not to hog the CPU.  Such processes are designed to block
-(or terminate) after relatively short CPU runs.
-
-   A process begins life with the same absolute priority as its parent
-process.  Functions described in *note Basic Scheduling Functions:: can
-change it.
-
-   Only a privileged process can change a process' absolute priority to
-something other than `0'.  Only a privileged process or the target
-process' owner can change its absolute priority at all.
-
-   POSIX requires absolute priority values used with the realtime
-scheduling policies to be consecutive with a range of at least 32.  On
-Linux, they are 1 through 99.  The functions `sched_get_priority_max'
-and `sched_set_priority_min' portably tell you what the range is on a
-particular system.
-
-22.3.1.1 Using Absolute Priority
-................................
-
-One thing you must keep in mind when designing real time applications is
-that having higher absolute priority than any other process doesn't
-guarantee the process can run continuously.  Two things that can wreck a
-good CPU run are interrupts and page faults.
-
-   Interrupt handlers live in that limbo between processes.  The CPU is
-executing instructions, but they aren't part of any process.  An
-interrupt will stop even the highest priority process.  So you must
-allow for slight delays and make sure that no device in the system has
-an interrupt handler that could cause too long a delay between
-instructions for your process.
-
-   Similarly, a page fault causes what looks like a straightforward
-sequence of instructions to take a long time.  The fact that other
-processes get to run while the page faults in is of no consequence,
-because as soon as the I/O is complete, the high priority process will
-kick them out and run again, but the wait for the I/O itself could be a
-problem.  To neutralize this threat, use `mlock' or `mlockall'.
-
-   There are a few ramifications of the absoluteness of this priority
-on a single-CPU system that you need to keep in mind when you choose to
-set a priority and also when you're working on a program that runs with
-high absolute priority.  Consider a process that has higher absolute
-priority than any other process in the system and due to a bug in its
-program, it gets into an infinite loop.  It will never cede the CPU.
-You can't run a command to kill it because your command would need to
-get the CPU in order to run.  The errant program is in complete
-control.  It controls the vertical, it controls the horizontal.
-
-   There are two ways to avoid this: 1) keep a shell running somewhere
-with a higher absolute priority.  2) keep a controlling terminal
-attached to the high priority process group.  All the priority in the
-world won't stop an interrupt handler from running and delivering a
-signal to the process if you hit Control-C.
-
-   Some systems use absolute priority as a means of allocating a fixed
-percentage of CPU time to a process.  To do this, a super high priority
-privileged process constantly monitors the process' CPU usage and raises
-its absolute priority when the process isn't getting its entitled share
-and lowers it when the process is exceeding it.
-
-   *NB:*  The absolute priority is sometimes called the "static
-priority."  We don't use that term in this manual because it misses the
-most important feature of the absolute priority:  its absoluteness.
-
-
-File: libc.info,  Node: Realtime Scheduling,  Next: Basic Scheduling Functions,  Prev: Absolute Priority,  Up: Priority
-
-22.3.2 Realtime Scheduling
---------------------------
-
-Whenever two processes with the same absolute priority are ready to run,
-the kernel has a decision to make, because only one can run at a time.
-If the processes have absolute priority 0, the kernel makes this
-decision as described in *note Traditional Scheduling::.  Otherwise,
-the decision is as described in this section.
-
-   If two processes are ready to run but have different absolute
-priorities, the decision is much simpler, and is described in *note
-Absolute Priority::.
-
-   Each process has a scheduling policy.  For processes with absolute
-priority other than zero, there are two available:
-
-  1. First Come First Served
-
-  2. Round Robin
-
-   The most sensible case is where all the processes with a certain
-absolute priority have the same scheduling policy.  We'll discuss that
-first.
-
-   In Round Robin, processes share the CPU, each one running for a small
-quantum of time ("time slice") and then yielding to another in a
-circular fashion.  Of course, only processes that are ready to run and
-have the same absolute priority are in this circle.
-
-   In First Come First Served, the process that has been waiting the
-longest to run gets the CPU, and it keeps it until it voluntarily
-relinquishes the CPU, runs out of things to do (blocks), or gets
-preempted by a higher priority process.
-
-   First Come First Served, along with maximal absolute priority and
-careful control of interrupts and page faults, is the one to use when a
-process absolutely, positively has to run at full CPU speed or not at
-all.
-
-   Judicious use of `sched_yield' function invocations by processes
-with First Come First Served scheduling policy forms a good compromise
-between Round Robin and First Come First Served.
-
-   To understand how scheduling works when processes of different
-scheduling policies occupy the same absolute priority, you have to know
-the nitty gritty details of how processes enter and exit the ready to
-run list:
-
-   In both cases, the ready to run list is organized as a true queue,
-where a process gets pushed onto the tail when it becomes ready to run
-and is popped off the head when the scheduler decides to run it.  Note
-that ready to run and running are two mutually exclusive states.  When
-the scheduler runs a process, that process is no longer ready to run
-and no longer in the ready to run list.  When the process stops
-running, it may go back to being ready to run again.
-
-   The only difference between a process that is assigned the Round
-Robin scheduling policy and a process that is assigned First Come First
-Serve is that in the former case, the process is automatically booted
-off the CPU after a certain amount of time.  When that happens, the
-process goes back to being ready to run, which means it enters the
-queue at the tail.  The time quantum we're talking about is small.
-Really small.  This is not your father's timesharing.  For example,
-with the Linux kernel, the round robin time slice is a thousand times
-shorter than its typical time slice for traditional scheduling.
-
-   A process begins life with the same scheduling policy as its parent
-process.  Functions described in *note Basic Scheduling Functions:: can
-change it.
-
-   Only a privileged process can set the scheduling policy of a process
-that has absolute priority higher than 0.
-
-
-File: libc.info,  Node: Basic Scheduling Functions,  Next: Traditional Scheduling,  Prev: Realtime Scheduling,  Up: Priority
-
-22.3.3 Basic Scheduling Functions
----------------------------------
-
-This section describes functions in the GNU C Library for setting the
-absolute priority and scheduling policy of a process.
-
-   *Portability Note:*  On systems that have the functions in this
-section, the macro _POSIX_PRIORITY_SCHEDULING is defined in
-`<unistd.h>'.
-
-   For the case that the scheduling policy is traditional scheduling,
-more functions to fine tune the scheduling are in *note Traditional
-Scheduling::.
-
-   Don't try to make too much out of the naming and structure of these
-functions.  They don't match the concepts described in this manual
-because the functions are as defined by POSIX.1b, but the implementation
-on systems that use the GNU C Library is the inverse of what the POSIX
-structure contemplates.  The POSIX scheme assumes that the primary
-scheduling parameter is the scheduling policy and that the priority
-value, if any, is a parameter of the scheduling policy.  In the
-implementation, though, the priority value is king and the scheduling
-policy, if anything, only fine tunes the effect of that priority.
-
-   The symbols in this section are declared by including file `sched.h'.
-
- -- Data Type: struct sched_param
-     This structure describes an absolute priority.
-    `int sched_priority'
-          absolute priority value
-
- -- Function: int sched_setscheduler (pid_t PID, int POLICY, const
-          struct sched_param *PARAM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function sets both the absolute priority and the scheduling
-     policy for a process.
-
-     It assigns the absolute priority value given by PARAM and the
-     scheduling policy POLICY to the process with Process ID PID, or
-     the calling process if PID is zero.  If POLICY is negative,
-     `sched_setscheduler' keeps the existing scheduling policy.
-
-     The following macros represent the valid values for POLICY:
-
-    `SCHED_OTHER'
-          Traditional Scheduling
-
-    `SCHED_FIFO'
-          First In First Out
-
-    `SCHED_RR'
-          Round Robin
-
-     On success, the return value is `0'.  Otherwise, it is `-1' and
-     `ERRNO' is set accordingly.  The `errno' values specific to this
-     function are:
-
-    `EPERM'
-             * The calling process does not have `CAP_SYS_NICE'
-               permission and POLICY is not `SCHED_OTHER' (or it's
-               negative and the existing policy is not `SCHED_OTHER'.
-
-             * The calling process does not have `CAP_SYS_NICE'
-               permission and its owner is not the target process'
-               owner.  I.e., the effective uid of the calling process
-               is neither the effective nor the real uid of process PID.
-
-    `ESRCH'
-          There is no process with pid PID and PID is not zero.
-
-    `EINVAL'
-             * POLICY does not identify an existing scheduling policy.
-
-             * The absolute priority value identified by *PARAM is
-               outside the valid range for the scheduling policy POLICY
-               (or the existing scheduling policy if POLICY is
-               negative) or PARAM is null.  `sched_get_priority_max'
-               and `sched_get_priority_min' tell you what the valid
-               range is.
-
-             * PID is negative.
-
-
- -- Function: int sched_getscheduler (pid_t PID)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function returns the scheduling policy assigned to the
-     process with Process ID (pid) PID, or the calling process if PID
-     is zero.
-
-     The return value is the scheduling policy.  See
-     `sched_setscheduler' for the possible values.
-
-     If the function fails, the return value is instead `-1' and
-     `errno' is set accordingly.
-
-     The `errno' values specific to this function are:
-
-    `ESRCH'
-          There is no process with pid PID and it is not zero.
-
-    `EINVAL'
-          PID is negative.
-
-
-     Note that this function is not an exact mate to
-     `sched_setscheduler' because while that function sets the
-     scheduling policy and the absolute priority, this function gets
-     only the scheduling policy.  To get the absolute priority, use
-     `sched_getparam'.
-
-
- -- Function: int sched_setparam (pid_t PID, const struct sched_param
-          *PARAM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function sets a process' absolute priority.
-
-     It is functionally identical to `sched_setscheduler' with POLICY =
-     `-1'.
-
-
- -- Function: int sched_getparam (pid_t PID, struct sched_param *PARAM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function returns a process' absolute priority.
-
-     PID is the Process ID (pid) of the process whose absolute priority
-     you want to know.
-
-     PARAM is a pointer to a structure in which the function stores the
-     absolute priority of the process.
-
-     On success, the return value is `0'.  Otherwise, it is `-1' and
-     `ERRNO' is set accordingly.  The `errno' values specific to this
-     function are:
-
-    `ESRCH'
-          There is no process with pid PID and it is not zero.
-
-    `EINVAL'
-          PID is negative.
-
-
-
- -- Function: int sched_get_priority_min (int POLICY)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function returns the lowest absolute priority value that is
-     allowable for a process with scheduling policy POLICY.
-
-     On Linux, it is 0 for SCHED_OTHER and 1 for everything else.
-
-     On success, the return value is `0'.  Otherwise, it is `-1' and
-     `ERRNO' is set accordingly.  The `errno' values specific to this
-     function are:
-
-    `EINVAL'
-          POLICY does not identify an existing scheduling policy.
-
-
- -- Function: int sched_get_priority_max (int POLICY)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function returns the highest absolute priority value that is
-     allowable for a process that with scheduling policy POLICY.
-
-     On Linux, it is 0 for SCHED_OTHER and 99 for everything else.
-
-     On success, the return value is `0'.  Otherwise, it is `-1' and
-     `ERRNO' is set accordingly.  The `errno' values specific to this
-     function are:
-
-    `EINVAL'
-          POLICY does not identify an existing scheduling policy.
-
-
- -- Function: int sched_rr_get_interval (pid_t PID, struct timespec
-          *INTERVAL)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function returns the length of the quantum (time slice) used
-     with the Round Robin scheduling policy, if it is used, for the
-     process with Process ID PID.
-
-     It returns the length of time as INTERVAL.
-
-     With a Linux kernel, the round robin time slice is always 150
-     microseconds, and PID need not even be a real pid.
-
-     The return value is `0' on success and in the pathological case
-     that it fails, the return value is `-1' and `errno' is set
-     accordingly.  There is nothing specific that can go wrong with this
-     function, so there are no specific `errno' values.
-
-
- -- Function: int sched_yield (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function voluntarily gives up the process' claim on the CPU.
-
-     Technically, `sched_yield' causes the calling process to be made
-     immediately ready to run (as opposed to running, which is what it
-     was before).  This means that if it has absolute priority higher
-     than 0, it gets pushed onto the tail of the queue of processes
-     that share its absolute priority and are ready to run, and it will
-     run again when its turn next arrives.  If its absolute priority is
-     0, it is more complicated, but still has the effect of yielding
-     the CPU to other processes.
-
-     If there are no other processes that share the calling process'
-     absolute priority, this function doesn't have any effect.
-
-     To the extent that the containing program is oblivious to what
-     other processes in the system are doing and how fast it executes,
-     this function appears as a no-op.
-
-     The return value is `0' on success and in the pathological case
-     that it fails, the return value is `-1' and `errno' is set
-     accordingly.  There is nothing specific that can go wrong with this
-     function, so there are no specific `errno' values.
-
-
-
-File: libc.info,  Node: Traditional Scheduling,  Next: CPU Affinity,  Prev: Basic Scheduling Functions,  Up: Priority
-
-22.3.4 Traditional Scheduling
------------------------------
-
-This section is about the scheduling among processes whose absolute
-priority is 0.  When the system hands out the scraps of CPU time that
-are left over after the processes with higher absolute priority have
-taken all they want, the scheduling described herein determines who
-among the great unwashed processes gets them.
-
-* Menu:
-
-* Traditional Scheduling Intro::
-* Traditional Scheduling Functions::
-
-
-File: libc.info,  Node: Traditional Scheduling Intro,  Next: Traditional Scheduling Functions,  Up: Traditional Scheduling
-
-22.3.4.1 Introduction To Traditional Scheduling
-...............................................
-
-Long before there was absolute priority (See *note Absolute Priority::),
-Unix systems were scheduling the CPU using this system.  When Posix came
-in like the Romans and imposed absolute priorities to accommodate the
-needs of realtime processing, it left the indigenous Absolute Priority
-Zero processes to govern themselves by their own familiar scheduling
-policy.
-
-   Indeed, absolute priorities higher than zero are not available on
-many systems today and are not typically used when they are, being
-intended mainly for computers that do realtime processing.  So this
-section describes the only scheduling many programmers need to be
-concerned about.
-
-   But just to be clear about the scope of this scheduling: Any time a
-process with an absolute priority of 0 and a process with an absolute
-priority higher than 0 are ready to run at the same time, the one with
-absolute priority 0 does not run.  If it's already running when the
-higher priority ready-to-run process comes into existence, it stops
-immediately.
-
-   In addition to its absolute priority of zero, every process has
-another priority, which we will refer to as "dynamic priority" because
-it changes over time.  The dynamic priority is meaningless for
-processes with an absolute priority higher than zero.
-
-   The dynamic priority sometimes determines who gets the next turn on
-the CPU.  Sometimes it determines how long turns last.  Sometimes it
-determines whether a process can kick another off the CPU.
-
-   In Linux, the value is a combination of these things, but mostly it
-is just determines the length of the time slice.  The higher a process'
-dynamic priority, the longer a shot it gets on the CPU when it gets one.
-If it doesn't use up its time slice before giving up the CPU to do
-something like wait for I/O, it is favored for getting the CPU back when
-it's ready for it, to finish out its time slice.  Other than that,
-selection of processes for new time slices is basically round robin.
-But the scheduler does throw a bone to the low priority processes: A
-process' dynamic priority rises every time it is snubbed in the
-scheduling process.  In Linux, even the fat kid gets to play.
-
-   The fluctuation of a process' dynamic priority is regulated by
-another value: The "nice" value.  The nice value is an integer, usually
-in the range -20 to 20, and represents an upper limit on a process'
-dynamic priority.  The higher the nice number, the lower that limit.
-
-   On a typical Linux system, for example, a process with a nice value
-of 20 can get only 10 milliseconds on the CPU at a time, whereas a
-process with a nice value of -20 can achieve a high enough priority to
-get 400 milliseconds.
-
-   The idea of the nice value is deferential courtesy.  In the
-beginning, in the Unix garden of Eden, all processes shared equally in
-the bounty of the computer system.  But not all processes really need
-the same share of CPU time, so the nice value gave a courteous process
-the ability to refuse its equal share of CPU time that others might
-prosper.  Hence, the higher a process' nice value, the nicer the
-process is.  (Then a snake came along and offered some process a
-negative nice value and the system became the crass resource allocation
-system we know today).
-
-   Dynamic priorities tend upward and downward with an objective of
-smoothing out allocation of CPU time and giving quick response time to
-infrequent requests.  But they never exceed their nice limits, so on a
-heavily loaded CPU, the nice value effectively determines how fast a
-process runs.
-
-   In keeping with the socialistic heritage of Unix process priority, a
-process begins life with the same nice value as its parent process and
-can raise it at will.  A process can also raise the nice value of any
-other process owned by the same user (or effective user).  But only a
-privileged process can lower its nice value.  A privileged process can
-also raise or lower another process' nice value.
-
-   GNU C Library functions for getting and setting nice values are
-described in *Note Traditional Scheduling Functions::.
-
-
-File: libc.info,  Node: Traditional Scheduling Functions,  Prev: Traditional Scheduling Intro,  Up: Traditional Scheduling
-
-22.3.4.2 Functions For Traditional Scheduling
-.............................................
-
-This section describes how you can read and set the nice value of a
-process.  All these symbols are declared in `sys/resource.h'.
-
-   The function and macro names are defined by POSIX, and refer to
-"priority," but the functions actually have to do with nice values, as
-the terms are used both in the manual and POSIX.
-
-   The range of valid nice values depends on the kernel, but typically
-it runs from `-20' to `20'.  A lower nice value corresponds to higher
-priority for the process.  These constants describe the range of
-priority values:
-
-`PRIO_MIN'
-     The lowest valid nice value.
-
-`PRIO_MAX'
-     The highest valid nice value.
-
- -- Function: int getpriority (int CLASS, int ID)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Return the nice value of a set of processes; CLASS and ID specify
-     which ones (see below).  If the processes specified do not all
-     have the same nice value, this returns the lowest value that any
-     of them has.
-
-     On success, the return value is `0'.  Otherwise, it is `-1' and
-     `ERRNO' is set accordingly.  The `errno' values specific to this
-     function are:
-
-    `ESRCH'
-          The combination of CLASS and ID does not match any existing
-          process.
-
-    `EINVAL'
-          The value of CLASS is not valid.
-
-     If the return value is `-1', it could indicate failure, or it could
-     be the nice value.  The only way to make certain is to set `errno =
-     0' before calling `getpriority', then use `errno != 0' afterward
-     as the criterion for failure.
-
- -- Function: int setpriority (int CLASS, int ID, int NICEVAL)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     Set the nice value of a set of processes to NICEVAL; CLASS and ID
-     specify which ones (see below).
-
-     The return value is `0' on success, and `-1' on failure.  The
-     following `errno' error condition are possible for this function:
-
-    `ESRCH'
-          The combination of CLASS and ID does not match any existing
-          process.
-
-    `EINVAL'
-          The value of CLASS is not valid.
-
-    `EPERM'
-          The call would set the nice value of a process which is owned
-          by a different user than the calling process (i.e., the
-          target process' real or effective uid does not match the
-          calling process' effective uid) and the calling process does
-          not have `CAP_SYS_NICE' permission.
-
-    `EACCES'
-          The call would lower the process' nice value and the process
-          does not have `CAP_SYS_NICE' permission.
-
-
-   The arguments CLASS and ID together specify a set of processes in
-which you are interested.  These are the possible values of CLASS:
-
-`PRIO_PROCESS'
-     One particular process.  The argument ID is a process ID (pid).
-
-`PRIO_PGRP'
-     All the processes in a particular process group.  The argument ID
-     is a process group ID (pgid).
-
-`PRIO_USER'
-     All the processes owned by a particular user (i.e., whose real uid
-     indicates the user).  The argument ID is a user ID (uid).
-
-   If the argument ID is 0, it stands for the calling process, its
-process group, or its owner (real uid), according to CLASS.
-
- -- Function: int nice (int INCREMENT)
-     Preliminary: | MT-Unsafe race:setpriority | AS-Unsafe | AC-Safe |
-     *Note POSIX Safety Concepts::.
-
-     Increment the nice value of the calling process by INCREMENT.  The
-     return value is the new nice value on success, and `-1' on
-     failure.  In the case of failure, `errno' will be set to the same
-     values as for `setpriority'.
-
-     Here is an equivalent definition of `nice':
-
-          int
-          nice (int increment)
-          {
-            int result, old = getpriority (PRIO_PROCESS, 0);
-            result = setpriority (PRIO_PROCESS, 0, old + increment);
-            if (result != -1)
-                return old + increment;
-            else
-                return -1;
-          }
-
-
-File: libc.info,  Node: CPU Affinity,  Prev: Traditional Scheduling,  Up: Priority
-
-22.3.5 Limiting execution to certain CPUs
------------------------------------------
-
-On a multi-processor system the operating system usually distributes
-the different processes which are runnable on all available CPUs in a
-way which allows the system to work most efficiently.  Which processes
-and threads run can be to some extend be control with the scheduling
-functionality described in the last sections.  But which CPU finally
-executes which process or thread is not covered.
-
-   There are a number of reasons why a program might want to have
-control over this aspect of the system as well:
-
-   * One thread or process is responsible for absolutely critical work
-     which under no circumstances must be interrupted or hindered from
-     making process by other process or threads using CPU resources.  In
-     this case the special process would be confined to a CPU which no
-     other process or thread is allowed to use.
-
-   * The access to certain resources (RAM, I/O ports) has different
-     costs from different CPUs.  This is the case in NUMA (Non-Uniform
-     Memory Architecture) machines.  Preferably memory should be
-     accessed locally but this requirement is usually not visible to
-     the scheduler.  Therefore forcing a process or thread to the CPUs
-     which have local access to the mostly used memory helps to
-     significantly boost the performance.
-
-   * In controlled runtimes resource allocation and book-keeping work
-     (for instance garbage collection) is performance local to
-     processors.  This can help to reduce locking costs if the
-     resources do not have to be protected from concurrent accesses
-     from different processors.
-
-   The POSIX standard up to this date is of not much help to solve this
-problem.  The Linux kernel provides a set of interfaces to allow
-specifying _affinity sets_ for a process.  The scheduler will schedule
-the thread or process on CPUs specified by the affinity masks.  The
-interfaces which the GNU C Library define follow to some extend the
-Linux kernel interface.
-
- -- Data Type: cpu_set_t
-     This data set is a bitset where each bit represents a CPU.  How the
-     system's CPUs are mapped to bits in the bitset is system dependent.
-     The data type has a fixed size; in the unlikely case that the
-     number of bits are not sufficient to describe the CPUs of the
-     system a different interface has to be used.
-
-     This type is a GNU extension and is defined in `sched.h'.
-
-   To manipulate the bitset, to set and reset bits, a number of macros
-is defined.  Some of the macros take a CPU number as a parameter.  Here
-it is important to never exceed the size of the bitset.  The following
-macro specifies the number of bits in the `cpu_set_t' bitset.
-
- -- Macro: int CPU_SETSIZE
-     The value of this macro is the maximum number of CPUs which can be
-     handled with a `cpu_set_t' object.
-
-   The type `cpu_set_t' should be considered opaque; all manipulation
-should happen via the next four macros.
-
- -- Macro: void CPU_ZERO (cpu_set_t *SET)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro initializes the CPU set SET to be the empty set.
-
-     This macro is a GNU extension and is defined in `sched.h'.
-
- -- Macro: void CPU_SET (int CPU, cpu_set_t *SET)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro adds CPU to the CPU set SET.
-
-     The CPU parameter must not have side effects since it is evaluated
-     more than once.
-
-     This macro is a GNU extension and is defined in `sched.h'.
-
- -- Macro: void CPU_CLR (int CPU, cpu_set_t *SET)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro removes CPU from the CPU set SET.
-
-     The CPU parameter must not have side effects since it is evaluated
-     more than once.
-
-     This macro is a GNU extension and is defined in `sched.h'.
-
- -- Macro: int CPU_ISSET (int CPU, const cpu_set_t *SET)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro returns a nonzero value (true) if CPU is a member of
-     the CPU set SET, and zero (false) otherwise.
-
-     The CPU parameter must not have side effects since it is evaluated
-     more than once.
-
-     This macro is a GNU extension and is defined in `sched.h'.
-
-   CPU bitsets can be constructed from scratch or the currently
-installed affinity mask can be retrieved from the system.
-
- -- Function: int sched_getaffinity (pid_t PID, size_t CPUSETSIZE,
-          cpu_set_t *CPUSET)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This functions stores the CPU affinity mask for the process or
-     thread with the ID PID in the CPUSETSIZE bytes long bitmap pointed
-     to by CPUSET.  If successful, the function always initializes all
-     bits in the `cpu_set_t' object and returns zero.
-
-     If PID does not correspond to a process or thread on the system
-     the or the function fails for some other reason, it returns `-1'
-     and `errno' is set to represent the error condition.
-
-    `ESRCH'
-          No process or thread with the given ID found.
-
-    `EFAULT'
-          The pointer CPUSET is does not point to a valid object.
-
-     This function is a GNU extension and is declared in `sched.h'.
-
-   Note that it is not portably possible to use this information to
-retrieve the information for different POSIX threads.  A separate
-interface must be provided for that.
-
- -- Function: int sched_setaffinity (pid_t PID, size_t CPUSETSIZE,
-          const cpu_set_t *CPUSET)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function installs the CPUSETSIZE bytes long affinity mask
-     pointed to by CPUSET for the process or thread with the ID PID.
-     If successful the function returns zero and the scheduler will in
-     future take the affinity information into account.
-
-     If the function fails it will return `-1' and `errno' is set to
-     the error code:
-
-    `ESRCH'
-          No process or thread with the given ID found.
-
-    `EFAULT'
-          The pointer CPUSET is does not point to a valid object.
-
-    `EINVAL'
-          The bitset is not valid.  This might mean that the affinity
-          set might not leave a processor for the process or thread to
-          run on.
-
-     This function is a GNU extension and is declared in `sched.h'.
-
-
-File: libc.info,  Node: Memory Resources,  Next: Processor Resources,  Prev: Priority,  Up: Resource Usage And Limitation
-
-22.4 Querying memory available resources
-========================================
-
-The amount of memory available in the system and the way it is organized
-determines oftentimes the way programs can and have to work.  For
-functions like `mmap' it is necessary to know about the size of
-individual memory pages and knowing how much memory is available enables
-a program to select appropriate sizes for, say, caches.  Before we get
-into these details a few words about memory subsystems in traditional
-Unix systems will be given.
-
-* Menu:
-
-* Memory Subsystem::           Overview about traditional Unix memory handling.
-* Query Memory Parameters::    How to get information about the memory
-                                subsystem?
-
-
-File: libc.info,  Node: Memory Subsystem,  Next: Query Memory Parameters,  Up: Memory Resources
-
-22.4.1 Overview about traditional Unix memory handling
-------------------------------------------------------
-
-Unix systems normally provide processes virtual address spaces.  This
-means that the addresses of the memory regions do not have to correspond
-directly to the addresses of the actual physical memory which stores the
-data.  An extra level of indirection is introduced which translates
-virtual addresses into physical addresses.  This is normally done by the
-hardware of the processor.
-
-   Using a virtual address space has several advantage.  The most
-important is process isolation.  The different processes running on the
-system cannot interfere directly with each other.  No process can write
-into the address space of another process (except when shared memory is
-used but then it is wanted and controlled).
-
-   Another advantage of virtual memory is that the address space the
-processes see can actually be larger than the physical memory available.
-The physical memory can be extended by storage on an external media
-where the content of currently unused memory regions is stored.  The
-address translation can then intercept accesses to these memory regions
-and make memory content available again by loading the data back into
-memory.  This concept makes it necessary that programs which have to use
-lots of memory know the difference between available virtual address
-space and available physical memory.  If the working set of virtual
-memory of all the processes is larger than the available physical memory
-the system will slow down dramatically due to constant swapping of
-memory content from the memory to the storage media and back.  This is
-called "thrashing".  
-
-   A final aspect of virtual memory which is important and follows from
-what is said in the last paragraph is the granularity of the virtual
-address space handling.  When we said that the virtual address handling
-stores memory content externally it cannot do this on a byte-by-byte
-basis.  The administrative overhead does not allow this (leaving alone
-the processor hardware).  Instead several thousand bytes are handled
-together and form a "page".  The size of each page is always a power of
-two byte.  The smallest page size in use today is 4096, with 8192,
-16384, and 65536 being other popular sizes.
-
-
-File: libc.info,  Node: Query Memory Parameters,  Prev: Memory Subsystem,  Up: Memory Resources
-
-22.4.2 How to get information about the memory subsystem?
----------------------------------------------------------
-
-The page size of the virtual memory the process sees is essential to
-know in several situations.  Some programming interface (e.g., `mmap',
-*note Memory-mapped I/O::) require the user to provide information
-adjusted to the page size.  In the case of `mmap' is it necessary to
-provide a length argument which is a multiple of the page size.
-Another place where the knowledge about the page size is useful is in
-memory allocation.  If one allocates pieces of memory in larger chunks
-which are then subdivided by the application code it is useful to
-adjust the size of the larger blocks to the page size.  If the total
-memory requirement for the block is close (but not larger) to a multiple
-of the page size the kernel's memory handling can work more effectively
-since it only has to allocate memory pages which are fully used.  (To do
-this optimization it is necessary to know a bit about the memory
-allocator which will require a bit of memory itself for each block and
-this overhead must not push the total size over the page size multiple.
-
-   The page size traditionally was a compile time constant.  But recent
-development of processors changed this.  Processors now support
-different page sizes and they can possibly even vary among different
-processes on the same system.  Therefore the system should be queried at
-runtime about the current page size and no assumptions (except about it
-being a power of two) should be made.
-
-   The correct interface to query about the page size is `sysconf'
-(*note Sysconf Definition::) with the parameter `_SC_PAGESIZE'.  There
-is a much older interface available, too.
-
- -- Function: int getpagesize (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `getpagesize' function returns the page size of the process.
-     This value is fixed for the runtime of the process but can vary in
-     different runs of the application.
-
-     The function is declared in `unistd.h'.
-
-   Widely available on System V derived systems is a method to get
-information about the physical memory the system has.  The call
-
-       sysconf (_SC_PHYS_PAGES)
-
-returns the total number of pages of physical the system has.  This
-does not mean all this memory is available.  This information can be
-found using
-
-       sysconf (_SC_AVPHYS_PAGES)
-
-   These two values help to optimize applications.  The value returned
-for `_SC_AVPHYS_PAGES' is the amount of memory the application can use
-without hindering any other process (given that no other process
-increases its memory usage).  The value returned for `_SC_PHYS_PAGES'
-is more or less a hard limit for the working set.  If all applications
-together constantly use more than that amount of memory the system is
-in trouble.
-
-   The GNU C Library provides in addition to these already described
-way to get this information two functions.  They are declared in the
-file `sys/sysinfo.h'.  Programmers should prefer to use the `sysconf'
-method described above.
-
- -- Function: long int get_phys_pages (void)
-     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe lock fd
-     mem | *Note POSIX Safety Concepts::.
-
-     The `get_phys_pages' function returns the total number of pages of
-     physical the system has.  To get the amount of memory this number
-     has to be multiplied by the page size.
-
-     This function is a GNU extension.
-
- -- Function: long int get_avphys_pages (void)
-     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe lock fd
-     mem | *Note POSIX Safety Concepts::.
-
-     The `get_phys_pages' function returns the number of available
-     pages of physical the system has.  To get the amount of memory
-     this number has to be multiplied by the page size.
-
-     This function is a GNU extension.
-
-
-File: libc.info,  Node: Processor Resources,  Prev: Memory Resources,  Up: Resource Usage And Limitation
-
-22.5 Learn about the processors available
-=========================================
-
-The use of threads or processes with shared memory allows an application
-to take advantage of all the processing power a system can provide.  If
-the task can be parallelized the optimal way to write an application is
-to have at any time as many processes running as there are processors.
-To determine the number of processors available to the system one can
-run
-
-       sysconf (_SC_NPROCESSORS_CONF)
-
-which returns the number of processors the operating system configured.
-But it might be possible for the operating system to disable individual
-processors and so the call
-
-       sysconf (_SC_NPROCESSORS_ONLN)
-
-returns the number of processors which are currently online (i.e.,
-available).
-
-   For these two pieces of information the GNU C Library also provides
-functions to get the information directly.  The functions are declared
-in `sys/sysinfo.h'.
-
- -- Function: int get_nprocs_conf (void)
-     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe lock fd
-     mem | *Note POSIX Safety Concepts::.
-
-     The `get_nprocs_conf' function returns the number of processors the
-     operating system configured.
-
-     This function is a GNU extension.
-
- -- Function: int get_nprocs (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
-     Concepts::.
-
-     The `get_nprocs' function returns the number of available
-     processors.
-
-     This function is a GNU extension.
-
-   Before starting more threads it should be checked whether the
-processors are not already overused.  Unix systems calculate something
-called the "load average".  This is a number indicating how many
-processes were running.  This number is average over different periods
-of times (normally 1, 5, and 15 minutes).
-
- -- Function: int getloadavg (double LOADAVG[], int NELEM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
-     Concepts::.
-
-     This function gets the 1, 5 and 15 minute load averages of the
-     system. The values are placed in LOADAVG.  `getloadavg' will place
-     at most NELEM elements into the array but never more than three
-     elements.  The return value is the number of elements written to
-     LOADAVG, or -1 on error.
-
-     This function is declared in `stdlib.h'.
-
-
-File: libc.info,  Node: Non-Local Exits,  Next: Signal Handling,  Prev: Resource Usage And Limitation,  Up: Top
-
-23 Non-Local Exits
-******************
-
-Sometimes when your program detects an unusual situation inside a deeply
-nested set of function calls, you would like to be able to immediately
-return to an outer level of control.  This section describes how you can
-do such "non-local exits" using the `setjmp' and `longjmp' functions.
-
-* Menu:
-
-* Intro: Non-Local Intro.        When and how to use these facilities.
-* Details: Non-Local Details.    Functions for non-local exits.
-* Non-Local Exits and Signals::  Portability issues.
-* System V contexts::            Complete context control a la System V.
-
-
-File: libc.info,  Node: Non-Local Intro,  Next: Non-Local Details,  Up: Non-Local Exits
-
-23.1 Introduction to Non-Local Exits
-====================================
-
-As an example of a situation where a non-local exit can be useful,
-suppose you have an interactive program that has a "main loop" that
-prompts for and executes commands.  Suppose the "read" command reads
-input from a file, doing some lexical analysis and parsing of the input
-while processing it.  If a low-level input error is detected, it would
-be useful to be able to return immediately to the "main loop" instead
-of having to make each of the lexical analysis, parsing, and processing
-phases all have to explicitly deal with error situations initially
-detected by nested calls.
-
-   (On the other hand, if each of these phases has to do a substantial
-amount of cleanup when it exits--such as closing files, deallocating
-buffers or other data structures, and the like--then it can be more
-appropriate to do a normal return and have each phase do its own
-cleanup, because a non-local exit would bypass the intervening phases
-and their associated cleanup code entirely.  Alternatively, you could
-use a non-local exit but do the cleanup explicitly either before or
-after returning to the "main loop".)
-
-   In some ways, a non-local exit is similar to using the `return'
-statement to return from a function.  But while `return' abandons only
-a single function call, transferring control back to the point at which
-it was called, a non-local exit can potentially abandon many levels of
-nested function calls.
-
-   You identify return points for non-local exits by calling the
-function `setjmp'.  This function saves information about the execution
-environment in which the call to `setjmp' appears in an object of type
-`jmp_buf'.  Execution of the program continues normally after the call
-to `setjmp', but if an exit is later made to this return point by
-calling `longjmp' with the corresponding `jmp_buf' object, control is
-transferred back to the point where `setjmp' was called.  The return
-value from `setjmp' is used to distinguish between an ordinary return
-and a return made by a call to `longjmp', so calls to `setjmp' usually
-appear in an `if' statement.
-
-   Here is how the example program described above might be set up:
-
-
-     #include <setjmp.h>
-     #include <stdlib.h>
+     #include <unistd.h>
      #include <stdio.h>
+     #include <stdlib.h>
+     #include <termios.h>
 
-     jmp_buf main_loop;
+     /* Use this variable to remember original terminal attributes. */
+
+     struct termios saved_attributes;
 
      void
-     abort_to_main_loop (int status)
+     reset_input_mode (void)
      {
-       longjmp (main_loop, status);
+       tcsetattr (STDIN_FILENO, TCSANOW, &saved_attributes);
+     }
+
+     void
+     set_input_mode (void)
+     {
+       struct termios tattr;
+       char *name;
+
+       /* Make sure stdin is a terminal. */
+       if (!isatty (STDIN_FILENO))
+         {
+           fprintf (stderr, "Not a terminal.\n");
+           exit (EXIT_FAILURE);
+         }
+
+       /* Save the terminal attributes so we can restore them later. */
+       tcgetattr (STDIN_FILENO, &saved_attributes);
+       atexit (reset_input_mode);
+
+       /* Set the funny terminal modes. */
+       tcgetattr (STDIN_FILENO, &tattr);
+       tattr.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */
+       tattr.c_cc[VMIN] = 1;
+       tattr.c_cc[VTIME] = 0;
+       tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr);
      }
 
      int
      main (void)
      {
-       while (1)
-         if (setjmp (main_loop))
-           puts ("Back at main loop....");
-         else
-           do_command ();
-     }
+       char c;
 
-
-     void
-     do_command (void)
-     {
-       char buffer[128];
-       if (fgets (buffer, 128, stdin) == NULL)
-         abort_to_main_loop (-1);
-       else
-         exit (EXIT_SUCCESS);
-     }
-
-   The function `abort_to_main_loop' causes an immediate transfer of
-control back to the main loop of the program, no matter where it is
-called from.
-
-   The flow of control inside the `main' function may appear a little
-mysterious at first, but it is actually a common idiom with `setjmp'.
-A normal call to `setjmp' returns zero, so the "else" clause of the
-conditional is executed.  If `abort_to_main_loop' is called somewhere
-within the execution of `do_command', then it actually appears as if
-the _same_ call to `setjmp' in `main' were returning a second time with
-a value of `-1'.
-
-   So, the general pattern for using `setjmp' looks something like:
-
-     if (setjmp (BUFFER))
-       /* Code to clean up after premature return. */
-       ...
-     else
-       /* Code to be executed normally after setting up the return point. */
-       ...
-
-
-File: libc.info,  Node: Non-Local Details,  Next: Non-Local Exits and Signals,  Prev: Non-Local Intro,  Up: Non-Local Exits
-
-23.2 Details of Non-Local Exits
-===============================
-
-Here are the details on the functions and data structures used for
-performing non-local exits.  These facilities are declared in
-`setjmp.h'.  
-
- -- Data Type: jmp_buf
-     Objects of type `jmp_buf' hold the state information to be
-     restored by a non-local exit.  The contents of a `jmp_buf'
-     identify a specific place to return to.
-
- -- Macro: int setjmp (jmp_buf STATE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     When called normally, `setjmp' stores information about the
-     execution state of the program in STATE and returns zero.  If
-     `longjmp' is later used to perform a non-local exit to this STATE,
-     `setjmp' returns a nonzero value.
-
- -- Function: void longjmp (jmp_buf STATE, int VALUE)
-     Preliminary: | MT-Safe | AS-Unsafe plugin corrupt lock/hurd |
-     AC-Unsafe corrupt lock/hurd | *Note POSIX Safety Concepts::.
-
-     This function restores current execution to the state saved in
-     STATE, and continues execution from the call to `setjmp' that
-     established that return point.  Returning from `setjmp' by means of
-     `longjmp' returns the VALUE argument that was passed to `longjmp',
-     rather than `0'.  (But if VALUE is given as `0', `setjmp' returns
-     `1').
-
-   There are a lot of obscure but important restrictions on the use of
-`setjmp' and `longjmp'.  Most of these restrictions are present because
-non-local exits require a fair amount of magic on the part of the C
-compiler and can interact with other parts of the language in strange
-ways.
-
-   The `setjmp' function is actually a macro without an actual function
-definition, so you shouldn't try to `#undef' it or take its address.
-In addition, calls to `setjmp' are safe in only the following contexts:
-
-   * As the test expression of a selection or iteration statement (such
-     as `if', `switch', or `while').
-
-   * As one operand of an equality or comparison operator that appears
-     as the test expression of a selection or iteration statement.  The
-     other operand must be an integer constant expression.
-
-   * As the operand of a unary `!' operator, that appears as the test
-     expression of a selection or iteration statement.
-
-   * By itself as an expression statement.
-
-   Return points are valid only during the dynamic extent of the
-function that called `setjmp' to establish them.  If you `longjmp' to a
-return point that was established in a function that has already
-returned, unpredictable and disastrous things are likely to happen.
-
-   You should use a nonzero VALUE argument to `longjmp'.  While
-`longjmp' refuses to pass back a zero argument as the return value from
-`setjmp', this is intended as a safety net against accidental misuse
-and is not really good programming style.
-
-   When you perform a non-local exit, accessible objects generally
-retain whatever values they had at the time `longjmp' was called.  The
-exception is that the values of automatic variables local to the
-function containing the `setjmp' call that have been changed since the
-call to `setjmp' are indeterminate, unless you have declared them
-`volatile'.
-
-
-File: libc.info,  Node: Non-Local Exits and Signals,  Next: System V contexts,  Prev: Non-Local Details,  Up: Non-Local Exits
-
-23.3 Non-Local Exits and Signals
-================================
-
-In BSD Unix systems, `setjmp' and `longjmp' also save and restore the
-set of blocked signals; see *note Blocking Signals::.  However, the
-POSIX.1 standard requires `setjmp' and `longjmp' not to change the set
-of blocked signals, and provides an additional pair of functions
-(`sigsetjmp' and `siglongjmp') to get the BSD behavior.
-
-   The behavior of `setjmp' and `longjmp' in the GNU C Library is
-controlled by feature test macros; see *note Feature Test Macros::.  The
-default in the GNU C Library is the POSIX.1 behavior rather than the BSD
-behavior.
-
-   The facilities in this section are declared in the header file
-`setjmp.h'.  
-
- -- Data Type: sigjmp_buf
-     This is similar to `jmp_buf', except that it can also store state
-     information about the set of blocked signals.
-
- -- Function: int sigsetjmp (sigjmp_buf STATE, int SAVESIGS)
-     Preliminary: | MT-Safe | AS-Unsafe lock/hurd | AC-Unsafe lock/hurd
-     | *Note POSIX Safety Concepts::.
-
-     This is similar to `setjmp'.  If SAVESIGS is nonzero, the set of
-     blocked signals is saved in STATE and will be restored if a
-     `siglongjmp' is later performed with this STATE.
-
- -- Function: void siglongjmp (sigjmp_buf STATE, int VALUE)
-     Preliminary: | MT-Safe | AS-Unsafe plugin corrupt lock/hurd |
-     AC-Unsafe corrupt lock/hurd | *Note POSIX Safety Concepts::.
-
-     This is similar to `longjmp' except for the type of its STATE
-     argument.  If the `sigsetjmp' call that set this STATE used a
-     nonzero SAVESIGS flag, `siglongjmp' also restores the set of
-     blocked signals.
-
-
-File: libc.info,  Node: System V contexts,  Prev: Non-Local Exits and Signals,  Up: Non-Local Exits
-
-23.4 Complete Context Control
-=============================
-
-The Unix standard provides one more set of functions to control the
-execution path and these functions are more powerful than those
-discussed in this chapter so far.  These function were part of the
-original System V API and by this route were added to the Unix API.
-Beside on branded Unix implementations these interfaces are not widely
-available.  Not all platforms and/or architectures the GNU C Library is
-available on provide this interface.  Use `configure' to detect the
-availability.
-
-   Similar to the `jmp_buf' and `sigjmp_buf' types used for the
-variables to contain the state of the `longjmp' functions the
-interfaces of interest here have an appropriate type as well.  Objects
-of this type are normally much larger since more information is
-contained.  The type is also used in a few more places as we will see.
-The types and functions described in this section are all defined and
-declared respectively in the `ucontext.h' header file.
-
- -- Data Type: ucontext_t
-     The `ucontext_t' type is defined as a structure with as least the
-     following elements:
-
-    `ucontext_t *uc_link'
-          This is a pointer to the next context structure which is used
-          if the context described in the current structure returns.
-
-    `sigset_t uc_sigmask'
-          Set of signals which are blocked when this context is used.
-
-    `stack_t uc_stack'
-          Stack used for this context.  The value need not be (and
-          normally is not) the stack pointer.  *Note Signal Stack::.
-
-    `mcontext_t uc_mcontext'
-          This element contains the actual state of the process.  The
-          `mcontext_t' type is also defined in this header but the
-          definition should be treated as opaque.  Any use of knowledge
-          of the type makes applications less portable.
-
-
-   Objects of this type have to be created by the user.  The
-initialization and modification happens through one of the following
-functions:
-
- -- Function: int getcontext (ucontext_t *UCP)
-     Preliminary: | MT-Safe race:ucp | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     The `getcontext' function initializes the variable pointed to by
-     UCP with the context of the calling thread.  The context contains
-     the content of the registers, the signal mask, and the current
-     stack.  Executing the contents would start at the point where the
-     `getcontext' call just returned.
-
-     The function returns `0' if successful.  Otherwise it returns `-1'
-     and sets ERRNO accordingly.
-
-   The `getcontext' function is similar to `setjmp' but it does not
-provide an indication of whether the function returns for the first
-time or whether the initialized context was used and the execution is
-resumed at just that point.  If this is necessary the user has to take
-determine this herself.  This must be done carefully since the context
-contains registers which might contain register variables.  This is a
-good situation to define variables with `volatile'.
-
-   Once the context variable is initialized it can be used as is or it
-can be modified.  The latter is normally done to implement co-routines
-or similar constructs.  The `makecontext' function is what has to be
-used to do that.
-
- -- Function: void makecontext (ucontext_t *UCP, void (*FUNC) (void),
-          int ARGC, ...)
-     Preliminary: | MT-Safe race:ucp | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     The UCP parameter passed to the `makecontext' shall be initialized
-     by a call to `getcontext'.  The context will be modified to in a
-     way so that if the context is resumed it will start by calling the
-     function `func' which gets ARGC integer arguments passed.  The
-     integer arguments which are to be passed should follow the ARGC
-     parameter in the call to `makecontext'.
-
-     Before the call to this function the `uc_stack' and `uc_link'
-     element of the UCP structure should be initialized.  The
-     `uc_stack' element describes the stack which is used for this
-     context.  No two contexts which are used at the same time should
-     use the same memory region for a stack.
-
-     The `uc_link' element of the object pointed to by UCP should be a
-     pointer to the context to be executed when the function FUNC
-     returns or it should be a null pointer.  See `setcontext' for more
-     information about the exact use.
-
-   While allocating the memory for the stack one has to be careful.
-Most modern processors keep track of whether a certain memory region is
-allowed to contain code which is executed or not.  Data segments and
-heap memory is normally not tagged to allow this.  The result is that
-programs would fail.  Examples for such code include the calling
-sequences the GNU C compiler generates for calls to nested functions.
-Safe ways to allocate stacks correctly include using memory on the
-original threads stack or explicitly allocate memory tagged for
-execution using (*note Memory-mapped I/O::).
-
-   *Compatibility note*: The current Unix standard is very imprecise
-about the way the stack is allocated.  All implementations seem to agree
-that the `uc_stack' element must be used but the values stored in the
-elements of the `stack_t' value are unclear.  The GNU C Library and
-most other Unix implementations require the `ss_sp' value of the
-`uc_stack' element to point to the base of the memory region allocated
-for the stack and the size of the memory region is stored in `ss_size'.
-There are implements out there which require `ss_sp' to be set to the
-value the stack pointer will have (which can depending on the direction
-the stack grows be different).  This difference makes the `makecontext'
-function hard to use and it requires detection of the platform at
-compile time.
-
- -- Function: int setcontext (const ucontext_t *UCP)
-     Preliminary: | MT-Safe race:ucp | AS-Unsafe corrupt | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     The `setcontext' function restores the context described by UCP.
-     The context is not modified and can be reused as often as wanted.
-
-     If the context was created by `getcontext' execution resumes with
-     the registers filled with the same values and the same stack as if
-     the `getcontext' call just returned.
-
-     If the context was modified with a call to `makecontext' execution
-     continues with the function passed to `makecontext' which gets the
-     specified parameters passed.  If this function returns execution is
-     resumed in the context which was referenced by the `uc_link'
-     element of the context structure passed to `makecontext' at the
-     time of the call.  If `uc_link' was a null pointer the application
-     terminates normally with an exit status value of `EXIT_SUCCESS'
-     (*note Program Termination::).
-
-     Since the context contains information about the stack no two
-     threads should use the same context at the same time.  The result
-     in most cases would be disastrous.
-
-     The `setcontext' function does not return unless an error occurred
-     in which case it returns `-1'.
-
-   The `setcontext' function simply replaces the current context with
-the one described by the UCP parameter.  This is often useful but there
-are situations where the current context has to be preserved.
-
- -- Function: int swapcontext (ucontext_t *restrict OUCP, const
-          ucontext_t *restrict UCP)
-     Preliminary: | MT-Safe race:oucp race:ucp | AS-Unsafe corrupt |
-     AC-Unsafe corrupt | *Note POSIX Safety Concepts::.
-
-     The `swapcontext' function is similar to `setcontext' but instead
-     of just replacing the current context the latter is first saved in
-     the object pointed to by OUCP as if this was a call to
-     `getcontext'.  The saved context would resume after the call to
-     `swapcontext'.
-
-     Once the current context is saved the context described in UCP is
-     installed and execution continues as described in this context.
-
-     If `swapcontext' succeeds the function does not return unless the
-     context OUCP is used without prior modification by `makecontext'.
-     The return value in this case is `0'.  If the function fails it
-     returns `-1' and set ERRNO accordingly.
-
-Example for SVID Context Handling
-=================================
-
-The easiest way to use the context handling functions is as a
-replacement for `setjmp' and `longjmp'.  The context contains on most
-platforms more information which might lead to less surprises but this
-also means using these functions is more expensive (beside being less
-portable).
-
-     int
-     random_search (int n, int (*fp) (int, ucontext_t *))
-     {
-       volatile int cnt = 0;
-       ucontext_t uc;
-
-       /* Safe current context.  */
-       if (getcontext (&uc) < 0)
-         return -1;
-
-       /* If we have not tried N times try again.  */
-       if (cnt++ < n)
-         /* Call the function with a new random number
-            and the context.  */
-         if (fp (rand (), &uc) != 0)
-           /* We found what we were looking for.  */
-           return 1;
-
-       /* Not found.  */
-       return 0;
-     }
-
-   Using contexts in such a way enables emulating exception handling.
-The search functions passed in the FP parameter could be very large,
-nested, and complex which would make it complicated (or at least would
-require a lot of code) to leave the function with an error value which
-has to be passed down to the caller.  By using the context it is
-possible to leave the search function in one step and allow restarting
-the search which also has the nice side effect that it can be
-significantly faster.
-
-   Something which is harder to implement with `setjmp' and `longjmp'
-is to switch temporarily to a different execution path and then resume
-where execution was stopped.
-
-
-     #include <signal.h>
-     #include <stdio.h>
-     #include <stdlib.h>
-     #include <ucontext.h>
-     #include <sys/time.h>
-
-     /* Set by the signal handler. */
-     static volatile int expired;
-
-     /* The contexts. */
-     static ucontext_t uc[3];
-
-     /* We do only a certain number of switches. */
-     static int switches;
-
+       set_input_mode ();
 
-     /* This is the function doing the work.  It is just a
-        skeleton, real code has to be filled in. */
-     static void
-     f (int n)
-     {
-       int m = 0;
        while (1)
          {
-           /* This is where the work would be done. */
-           if (++m % 100 == 0)
-             {
-               putchar ('.');
-               fflush (stdout);
-             }
-
-           /* Regularly the EXPIRE variable must be checked. */
-           if (expired)
-             {
-               /* We do not want the program to run forever. */
-               if (++switches == 20)
-                 return;
-
-               printf ("\nswitching from %d to %d\n", n, 3 - n);
-               expired = 0;
-               /* Switch to the other context, saving the current one. */
-               swapcontext (&uc[n], &uc[3 - n]);
-             }
+           read (STDIN_FILENO, &c, 1);
+           if (c == '\004')          /* 'C-d' */
+             break;
+           else
+             putchar (c);
          }
-     }
-
-     /* This is the signal handler which simply set the variable. */
-     void
-     handler (int signal)
-     {
-       expired = 1;
-     }
-
-
-     int
-     main (void)
-     {
-       struct sigaction sa;
-       struct itimerval it;
-       char st1[8192];
-       char st2[8192];
-
-       /* Initialize the data structures for the interval timer. */
-       sa.sa_flags = SA_RESTART;
-       sigfillset (&sa.sa_mask);
-       sa.sa_handler = handler;
-       it.it_interval.tv_sec = 0;
-       it.it_interval.tv_usec = 1;
-       it.it_value = it.it_interval;
-
-       /* Install the timer and get the context we can manipulate. */
-       if (sigaction (SIGPROF, &sa, NULL) < 0
-           || setitimer (ITIMER_PROF, &it, NULL) < 0
-           || getcontext (&uc[1]) == -1
-           || getcontext (&uc[2]) == -1)
-         abort ();
-
-       /* Create a context with a separate stack which causes the
-          function `f' to be call with the parameter `1'.
-          Note that the `uc_link' points to the main context
-          which will cause the program to terminate once the function
-          return. */
-       uc[1].uc_link = &uc[0];
-       uc[1].uc_stack.ss_sp = st1;
-       uc[1].uc_stack.ss_size = sizeof st1;
-       makecontext (&uc[1], (void (*) (void)) f, 1, 1);
-
-       /* Similarly, but `2' is passed as the parameter to `f'. */
-       uc[2].uc_link = &uc[0];
-       uc[2].uc_stack.ss_sp = st2;
-       uc[2].uc_stack.ss_size = sizeof st2;
-       makecontext (&uc[2], (void (*) (void)) f, 1, 2);
-
-       /* Start running. */
-       swapcontext (&uc[0], &uc[1]);
-       putchar ('\n');
-
-       return 0;
-     }
-
-   This an example how the context functions can be used to implement
-co-routines or cooperative multi-threading.  All that has to be done is
-to call every once in a while `swapcontext' to continue running a
-different context.  It is not allowed to do the context switching from
-the signal handler directly since neither `setcontext' nor
-`swapcontext' are functions which can be called from a signal handler.
-But setting a variable in the signal handler and checking it in the
-body of the functions which are executed.  Since `swapcontext' is
-saving the current context it is possible to have multiple different
-scheduling points in the code.  Execution will always resume where it
-was left.
-
-
-File: libc.info,  Node: Signal Handling,  Next: Program Basics,  Prev: Non-Local Exits,  Up: Top
-
-24 Signal Handling
-******************
-
-A "signal" is a software interrupt delivered to a process.  The
-operating system uses signals to report exceptional situations to an
-executing program.  Some signals report errors such as references to
-invalid memory addresses; others report asynchronous events, such as
-disconnection of a phone line.
-
-   The GNU C Library defines a variety of signal types, each for a
-particular kind of event.  Some kinds of events make it inadvisable or
-impossible for the program to proceed as usual, and the corresponding
-signals normally abort the program.  Other kinds of signals that report
-harmless events are ignored by default.
-
-   If you anticipate an event that causes signals, you can define a
-handler function and tell the operating system to run it when that
-particular type of signal arrives.
-
-   Finally, one process can send a signal to another process; this
-allows a parent process to abort a child, or two related processes to
-communicate and synchronize.
-
-* Menu:
-
-* Concepts of Signals::         Introduction to the signal facilities.
-* Standard Signals::            Particular kinds of signals with
-                                 standard names and meanings.
-* Signal Actions::              Specifying what happens when a
-                                 particular signal is delivered.
-* Defining Handlers::           How to write a signal handler function.
-* Interrupted Primitives::	Signal handlers affect use of `open',
-				 `read', `write' and other functions.
-* Generating Signals::          How to send a signal to a process.
-* Blocking Signals::            Making the system hold signals temporarily.
-* Waiting for a Signal::        Suspending your program until a signal
-                                 arrives.
-* Signal Stack::                Using a Separate Signal Stack.
-* BSD Signal Handling::         Additional functions for backward
-			         compatibility with BSD.
-
-
-File: libc.info,  Node: Concepts of Signals,  Next: Standard Signals,  Up: Signal Handling
-
-24.1 Basic Concepts of Signals
-==============================
-
-This section explains basic concepts of how signals are generated, what
-happens after a signal is delivered, and how programs can handle
-signals.
-
-* Menu:
-
-* Kinds of Signals::            Some examples of what can cause a signal.
-* Signal Generation::           Concepts of why and how signals occur.
-* Delivery of Signal::          Concepts of what a signal does to the
-                                 process.
-
-
-File: libc.info,  Node: Kinds of Signals,  Next: Signal Generation,  Up: Concepts of Signals
-
-24.1.1 Some Kinds of Signals
-----------------------------
-
-A signal reports the occurrence of an exceptional event.  These are some
-of the events that can cause (or "generate", or "raise") a signal:
-
-   * A program error such as dividing by zero or issuing an address
-     outside the valid range.
-
-   * A user request to interrupt or terminate the program.  Most
-     environments are set up to let a user suspend the program by
-     typing `C-z', or terminate it with `C-c'.  Whatever key sequence
-     is used, the operating system sends the proper signal to interrupt
-     the process.
-
-   * The termination of a child process.
-
-   * Expiration of a timer or alarm.
-
-   * A call to `kill' or `raise' by the same process.
-
-   * A call to `kill' from another process.  Signals are a limited but
-     useful form of interprocess communication.
-
-   * An attempt to perform an I/O operation that cannot be done.
-     Examples are reading from a pipe that has no writer (*note Pipes
-     and FIFOs::), and reading or writing to a terminal in certain
-     situations (*note Job Control::).
-
-   Each of these kinds of events (excepting explicit calls to `kill'
-and `raise') generates its own particular kind of signal.  The various
-kinds of signals are listed and described in detail in *note Standard
-Signals::.
-
-
-File: libc.info,  Node: Signal Generation,  Next: Delivery of Signal,  Prev: Kinds of Signals,  Up: Concepts of Signals
-
-24.1.2 Concepts of Signal Generation
-------------------------------------
-
-In general, the events that generate signals fall into three major
-categories: errors, external events, and explicit requests.
-
-   An error means that a program has done something invalid and cannot
-continue execution.  But not all kinds of errors generate signals--in
-fact, most do not.  For example, opening a nonexistent file is an error,
-but it does not raise a signal; instead, `open' returns `-1'.  In
-general, errors that are necessarily associated with certain library
-functions are reported by returning a value that indicates an error.
-The errors which raise signals are those which can happen anywhere in
-the program, not just in library calls.  These include division by zero
-and invalid memory addresses.
-
-   An external event generally has to do with I/O or other processes.
-These include the arrival of input, the expiration of a timer, and the
-termination of a child process.
-
-   An explicit request means the use of a library function such as
-`kill' whose purpose is specifically to generate a signal.
-
-   Signals may be generated "synchronously" or "asynchronously".  A
-synchronous signal pertains to a specific action in the program, and is
-delivered (unless blocked) during that action.  Most errors generate
-signals synchronously, and so do explicit requests by a process to
-generate a signal for that same process.  On some machines, certain
-kinds of hardware errors (usually floating-point exceptions) are not
-reported completely synchronously, but may arrive a few instructions
-later.
-
-   Asynchronous signals are generated by events outside the control of
-the process that receives them.  These signals arrive at unpredictable
-times during execution.  External events generate signals
-asynchronously, and so do explicit requests that apply to some other
-process.
-
-   A given type of signal is either typically synchronous or typically
-asynchronous.  For example, signals for errors are typically synchronous
-because errors generate signals synchronously.  But any type of signal
-can be generated synchronously or asynchronously with an explicit
-request.
-
-
-File: libc.info,  Node: Delivery of Signal,  Prev: Signal Generation,  Up: Concepts of Signals
-
-24.1.3 How Signals Are Delivered
---------------------------------
-
-When a signal is generated, it becomes "pending".  Normally it remains
-pending for just a short period of time and then is "delivered" to the
-process that was signaled.  However, if that kind of signal is
-currently "blocked", it may remain pending indefinitely--until signals
-of that kind are "unblocked".  Once unblocked, it will be delivered
-immediately.  *Note Blocking Signals::.
-
-   When the signal is delivered, whether right away or after a long
-delay, the "specified action" for that signal is taken.  For certain
-signals, such as `SIGKILL' and `SIGSTOP', the action is fixed, but for
-most signals, the program has a choice: ignore the signal, specify a
-"handler function", or accept the "default action" for that kind of
-signal.  The program specifies its choice using functions such as
-`signal' or `sigaction' (*note Signal Actions::).  We sometimes say
-that a handler "catches" the signal.  While the handler is running,
-that particular signal is normally blocked.
-
-   If the specified action for a kind of signal is to ignore it, then
-any such signal which is generated is discarded immediately.  This
-happens even if the signal is also blocked at the time.  A signal
-discarded in this way will never be delivered, not even if the program
-subsequently specifies a different action for that kind of signal and
-then unblocks it.
-
-   If a signal arrives which the program has neither handled nor
-ignored, its "default action" takes place.  Each kind of signal has its
-own default action, documented below (*note Standard Signals::).  For
-most kinds of signals, the default action is to terminate the process.
-For certain kinds of signals that represent "harmless" events, the
-default action is to do nothing.
-
-   When a signal terminates a process, its parent process can determine
-the cause of termination by examining the termination status code
-reported by the `wait' or `waitpid' functions.  (This is discussed in
-more detail in *note Process Completion::.)  The information it can get
-includes the fact that termination was due to a signal and the kind of
-signal involved.  If a program you run from a shell is terminated by a
-signal, the shell typically prints some kind of error message.
-
-   The signals that normally represent program errors have a special
-property: when one of these signals terminates the process, it also
-writes a "core dump file" which records the state of the process at the
-time of termination.  You can examine the core dump with a debugger to
-investigate what caused the error.
-
-   If you raise a "program error" signal by explicit request, and this
-terminates the process, it makes a core dump file just as if the signal
-had been due directly to an error.
-
-
-File: libc.info,  Node: Standard Signals,  Next: Signal Actions,  Prev: Concepts of Signals,  Up: Signal Handling
-
-24.2 Standard Signals
-=====================
-
-This section lists the names for various standard kinds of signals and
-describes what kind of event they mean.  Each signal name is a macro
-which stands for a positive integer--the "signal number" for that kind
-of signal.  Your programs should never make assumptions about the
-numeric code for a particular kind of signal, but rather refer to them
-always by the names defined here.  This is because the number for a
-given kind of signal can vary from system to system, but the meanings of
-the names are standardized and fairly uniform.
-
-   The signal names are defined in the header file `signal.h'.
-
- -- Macro: int NSIG
-     The value of this symbolic constant is the total number of signals
-     defined.  Since the signal numbers are allocated consecutively,
-     `NSIG' is also one greater than the largest defined signal number.
-
-* Menu:
-
-* Program Error Signals::       Used to report serious program errors.
-* Termination Signals::         Used to interrupt and/or terminate the
-                                 program.
-* Alarm Signals::               Used to indicate expiration of timers.
-* Asynchronous I/O Signals::    Used to indicate input is available.
-* Job Control Signals::         Signals used to support job control.
-* Operation Error Signals::     Used to report operational system errors.
-* Miscellaneous Signals::       Miscellaneous Signals.
-* Signal Messages::             Printing a message describing a signal.
-
-
-File: libc.info,  Node: Program Error Signals,  Next: Termination Signals,  Up: Standard Signals
-
-24.2.1 Program Error Signals
-----------------------------
-
-The following signals are generated when a serious program error is
-detected by the operating system or the computer itself.  In general,
-all of these signals are indications that your program is seriously
-broken in some way, and there's usually no way to continue the
-computation which encountered the error.
-
-   Some programs handle program error signals in order to tidy up before
-terminating; for example, programs that turn off echoing of terminal
-input should handle program error signals in order to turn echoing back
-on.  The handler should end by specifying the default action for the
-signal that happened and then reraising it; this will cause the program
-to terminate with that signal, as if it had not had a handler.  (*Note
-Termination in Handler::.)
-
-   Termination is the sensible ultimate outcome from a program error in
-most programs.  However, programming systems such as Lisp that can load
-compiled user programs might need to keep executing even if a user
-program incurs an error.  These programs have handlers which use
-`longjmp' to return control to the command level.
-
-   The default action for all of these signals is to cause the process
-to terminate.  If you block or ignore these signals or establish
-handlers for them that return normally, your program will probably
-break horribly when such signals happen, unless they are generated by
-`raise' or `kill' instead of a real error.
-
-   When one of these program error signals terminates a process, it also
-writes a "core dump file" which records the state of the process at the
-time of termination.  The core dump file is named `core' and is written
-in whichever directory is current in the process at the time.  (On
-GNU/Hurd systems, you can specify the file name for core dumps with the
-environment variable `COREFILE'.)  The purpose of core dump files is so
-that you can examine them with a debugger to investigate what caused
-the error.
-
- -- Macro: int SIGFPE
-     The `SIGFPE' signal reports a fatal arithmetic error.  Although the
-     name is derived from "floating-point exception", this signal
-     actually covers all arithmetic errors, including division by zero
-     and overflow.  If a program stores integer data in a location
-     which is then used in a floating-point operation, this often
-     causes an "invalid operation" exception, because the processor
-     cannot recognize the data as a floating-point number.  
-
-     Actual floating-point exceptions are a complicated subject because
-     there are many types of exceptions with subtly different meanings,
-     and the `SIGFPE' signal doesn't distinguish between them.  The
-     `IEEE Standard for Binary Floating-Point Arithmetic (ANSI/IEEE Std
-     754-1985 and ANSI/IEEE Std 854-1987)' defines various
-     floating-point exceptions and requires conforming computer systems
-     to report their occurrences.  However, this standard does not
-     specify how the exceptions are reported, or what kinds of handling
-     and control the operating system can offer to the programmer.
-
-   BSD systems provide the `SIGFPE' handler with an extra argument that
-distinguishes various causes of the exception.  In order to access this
-argument, you must define the handler to accept two arguments, which
-means you must cast it to a one-argument function type in order to
-establish the handler.  The GNU C Library does provide this extra
-argument, but the value is meaningful only on operating systems that
-provide the information (BSD systems and GNU systems).
-
-`FPE_INTOVF_TRAP'
-     Integer overflow (impossible in a C program unless you enable
-     overflow trapping in a hardware-specific fashion).
-
-`FPE_INTDIV_TRAP'
-     Integer division by zero.
-
-`FPE_SUBRNG_TRAP'
-     Subscript-range (something that C programs never check for).
-
-`FPE_FLTOVF_TRAP'
-     Floating overflow trap.
-
-`FPE_FLTDIV_TRAP'
-     Floating/decimal division by zero.
-
-`FPE_FLTUND_TRAP'
-     Floating underflow trap.  (Trapping on floating underflow is not
-     normally enabled.)
-
-`FPE_DECOVF_TRAP'
-     Decimal overflow trap.  (Only a few machines have decimal
-     arithmetic and C never uses it.)
-
- -- Macro: int SIGILL
-     The name of this signal is derived from "illegal instruction"; it
-     usually means your program is trying to execute garbage or a
-     privileged instruction.  Since the C compiler generates only valid
-     instructions, `SIGILL' typically indicates that the executable
-     file is corrupted, or that you are trying to execute data.  Some
-     common ways of getting into the latter situation are by passing an
-     invalid object where a pointer to a function was expected, or by
-     writing past the end of an automatic array (or similar problems
-     with pointers to automatic variables) and corrupting other data on
-     the stack such as the return address of a stack frame.
-
-     `SIGILL' can also be generated when the stack overflows, or when
-     the system has trouble running the handler for a signal.
-   
- -- Macro: int SIGSEGV
-     This signal is generated when a program tries to read or write
-     outside the memory that is allocated for it, or to write memory
-     that can only be read.  (Actually, the signals only occur when the
-     program goes far enough outside to be detected by the system's
-     memory protection mechanism.)  The name is an abbreviation for
-     "segmentation violation".
-
-     Common ways of getting a `SIGSEGV' condition include dereferencing
-     a null or uninitialized pointer, or when you use a pointer to step
-     through an array, but fail to check for the end of the array.  It
-     varies among systems whether dereferencing a null pointer generates
-     `SIGSEGV' or `SIGBUS'.
-
- -- Macro: int SIGBUS
-     This signal is generated when an invalid pointer is dereferenced.
-     Like `SIGSEGV', this signal is typically the result of
-     dereferencing an uninitialized pointer.  The difference between
-     the two is that `SIGSEGV' indicates an invalid access to valid
-     memory, while `SIGBUS' indicates an access to an invalid address.
-     In particular, `SIGBUS' signals often result from dereferencing a
-     misaligned pointer, such as referring to a four-word integer at an
-     address not divisible by four.  (Each kind of computer has its own
-     requirements for address alignment.)
-
-     The name of this signal is an abbreviation for "bus error".
-   
- -- Macro: int SIGABRT
-     This signal indicates an error detected by the program itself and
-     reported by calling `abort'.  *Note Aborting a Program::.
-
- -- Macro: int SIGIOT
-     Generated by the PDP-11 "iot" instruction.  On most machines, this
-     is just another name for `SIGABRT'.
-
- -- Macro: int SIGTRAP
-     Generated by the machine's breakpoint instruction, and possibly
-     other trap instructions.  This signal is used by debuggers.  Your
-     program will probably only see `SIGTRAP' if it is somehow
-     executing bad instructions.
-
- -- Macro: int SIGEMT
-     Emulator trap; this results from certain unimplemented instructions
-     which might be emulated in software, or the operating system's
-     failure to properly emulate them.
-
- -- Macro: int SIGSYS
-     Bad system call; that is to say, the instruction to trap to the
-     operating system was executed, but the code number for the system
-     call to perform was invalid.
-
-
-File: libc.info,  Node: Termination Signals,  Next: Alarm Signals,  Prev: Program Error Signals,  Up: Standard Signals
-
-24.2.2 Termination Signals
---------------------------
-
-These signals are all used to tell a process to terminate, in one way
-or another.  They have different names because they're used for slightly
-different purposes, and programs might want to handle them differently.
-
-   The reason for handling these signals is usually so your program can
-tidy up as appropriate before actually terminating.  For example, you
-might want to save state information, delete temporary files, or restore
-the previous terminal modes.  Such a handler should end by specifying
-the default action for the signal that happened and then reraising it;
-this will cause the program to terminate with that signal, as if it had
-not had a handler.  (*Note Termination in Handler::.)
-
-   The (obvious) default action for all of these signals is to cause the
-process to terminate.
-
- -- Macro: int SIGTERM
-     The `SIGTERM' signal is a generic signal used to cause program
-     termination.  Unlike `SIGKILL', this signal can be blocked,
-     handled, and ignored.  It is the normal way to politely ask a
-     program to terminate.
-
-     The shell command `kill' generates `SIGTERM' by default.  
-
- -- Macro: int SIGINT
-     The `SIGINT' ("program interrupt") signal is sent when the user
-     types the INTR character (normally `C-c').  *Note Special
-     Characters::, for information about terminal driver support for
-     `C-c'.
-
- -- Macro: int SIGQUIT
-     The `SIGQUIT' signal is similar to `SIGINT', except that it's
-     controlled by a different key--the QUIT character, usually
-     `C-\'--and produces a core dump when it terminates the process,
-     just like a program error signal.  You can think of this as a
-     program error condition "detected" by the user.
-
-     *Note Program Error Signals::, for information about core dumps.
-     *Note Special Characters::, for information about terminal driver
-     support.
-
-     Certain kinds of cleanups are best omitted in handling `SIGQUIT'.
-     For example, if the program creates temporary files, it should
-     handle the other termination requests by deleting the temporary
-     files.  But it is better for `SIGQUIT' not to delete them, so that
-     the user can examine them in conjunction with the core dump.
-
- -- Macro: int SIGKILL
-     The `SIGKILL' signal is used to cause immediate program
-     termination.  It cannot be handled or ignored, and is therefore
-     always fatal.  It is also not possible to block this signal.
-
-     This signal is usually generated only by explicit request.  Since
-     it cannot be handled, you should generate it only as a last
-     resort, after first trying a less drastic method such as `C-c' or
-     `SIGTERM'.  If a process does not respond to any other termination
-     signals, sending it a `SIGKILL' signal will almost always cause it
-     to go away.
-
-     In fact, if `SIGKILL' fails to terminate a process, that by itself
-     constitutes an operating system bug which you should report.
-
-     The system will generate `SIGKILL' for a process itself under some
-     unusual conditions where the program cannot possibly continue to
-     run (even to run a signal handler).
-   
- -- Macro: int SIGHUP
-     The `SIGHUP' ("hang-up") signal is used to report that the user's
-     terminal is disconnected, perhaps because a network or telephone
-     connection was broken.  For more information about this, see *note
-     Control Modes::.
-
-     This signal is also used to report the termination of the
-     controlling process on a terminal to jobs associated with that
-     session; this termination effectively disconnects all processes in
-     the session from the controlling terminal.  For more information,
-     see *note Termination Internals::.
-
-
-File: libc.info,  Node: Alarm Signals,  Next: Asynchronous I/O Signals,  Prev: Termination Signals,  Up: Standard Signals
-
-24.2.3 Alarm Signals
---------------------
-
-These signals are used to indicate the expiration of timers.  *Note
-Setting an Alarm::, for information about functions that cause these
-signals to be sent.
-
-   The default behavior for these signals is to cause program
-termination.  This default is rarely useful, but no other default would
-be useful; most of the ways of using these signals would require
-handler functions in any case.
-
- -- Macro: int SIGALRM
-     This signal typically indicates expiration of a timer that
-     measures real or clock time.  It is used by the `alarm' function,
-     for example.
-   
- -- Macro: int SIGVTALRM
-     This signal typically indicates expiration of a timer that
-     measures CPU time used by the current process.  The name is an
-     abbreviation for "virtual time alarm".
-   
- -- Macro: int SIGPROF
-     This signal typically indicates expiration of a timer that measures
-     both CPU time used by the current process, and CPU time expended on
-     behalf of the process by the system.  Such a timer is used to
-     implement code profiling facilities, hence the name of this signal.
-   
-
-File: libc.info,  Node: Asynchronous I/O Signals,  Next: Job Control Signals,  Prev: Alarm Signals,  Up: Standard Signals
-
-24.2.4 Asynchronous I/O Signals
--------------------------------
-
-The signals listed in this section are used in conjunction with
-asynchronous I/O facilities.  You have to take explicit action by
-calling `fcntl' to enable a particular file descriptor to generate
-these signals (*note Interrupt Input::).  The default action for these
-signals is to ignore them.
-
- -- Macro: int SIGIO
-     This signal is sent when a file descriptor is ready to perform
-     input or output.
-
-     On most operating systems, terminals and sockets are the only
-     kinds of files that can generate `SIGIO'; other kinds, including
-     ordinary files, never generate `SIGIO' even if you ask them to.
-
-     On GNU systems `SIGIO' will always be generated properly if you
-     successfully set asynchronous mode with `fcntl'.
-
- -- Macro: int SIGURG
-     This signal is sent when "urgent" or out-of-band data arrives on a
-     socket.  *Note Out-of-Band Data::.
-
- -- Macro: int SIGPOLL
-     This is a System V signal name, more or less similar to `SIGIO'.
-     It is defined only for compatibility.
-
-
-File: libc.info,  Node: Job Control Signals,  Next: Operation Error Signals,  Prev: Asynchronous I/O Signals,  Up: Standard Signals
-
-24.2.5 Job Control Signals
---------------------------
-
-These signals are used to support job control.  If your system doesn't
-support job control, then these macros are defined but the signals
-themselves can't be raised or handled.
-
-   You should generally leave these signals alone unless you really
-understand how job control works.  *Note Job Control::.
-
- -- Macro: int SIGCHLD
-     This signal is sent to a parent process whenever one of its child
-     processes terminates or stops.
-
-     The default action for this signal is to ignore it.  If you
-     establish a handler for this signal while there are child
-     processes that have terminated but not reported their status via
-     `wait' or `waitpid' (*note Process Completion::), whether your new
-     handler applies to those processes or not depends on the
-     particular operating system.
-
- -- Macro: int SIGCLD
-     This is an obsolete name for `SIGCHLD'.
-
- -- Macro: int SIGCONT
-     You can send a `SIGCONT' signal to a process to make it continue.
-     This signal is special--it always makes the process continue if it
-     is stopped, before the signal is delivered.  The default behavior
-     is to do nothing else.  You cannot block this signal.  You can set
-     a handler, but `SIGCONT' always makes the process continue
-     regardless.
-
-     Most programs have no reason to handle `SIGCONT'; they simply
-     resume execution without realizing they were ever stopped.  You
-     can use a handler for `SIGCONT' to make a program do something
-     special when it is stopped and continued--for example, to reprint
-     a prompt when it is suspended while waiting for input.
-
- -- Macro: int SIGSTOP
-     The `SIGSTOP' signal stops the process.  It cannot be handled,
-     ignored, or blocked.
-   
- -- Macro: int SIGTSTP
-     The `SIGTSTP' signal is an interactive stop signal.  Unlike
-     `SIGSTOP', this signal can be handled and ignored.
-
-     Your program should handle this signal if you have a special need
-     to leave files or system tables in a secure state when a process is
-     stopped.  For example, programs that turn off echoing should handle
-     `SIGTSTP' so they can turn echoing back on before stopping.
-
-     This signal is generated when the user types the SUSP character
-     (normally `C-z').  For more information about terminal driver
-     support, see *note Special Characters::.
-   
- -- Macro: int SIGTTIN
-     A process cannot read from the user's terminal while it is running
-     as a background job.  When any process in a background job tries to
-     read from the terminal, all of the processes in the job are sent a
-     `SIGTTIN' signal.  The default action for this signal is to stop
-     the process.  For more information about how this interacts with
-     the terminal driver, see *note Access to the Terminal::.
-   
- -- Macro: int SIGTTOU
-     This is similar to `SIGTTIN', but is generated when a process in a
-     background job attempts to write to the terminal or set its modes.
-     Again, the default action is to stop the process.  `SIGTTOU' is
-     only generated for an attempt to write to the terminal if the
-     `TOSTOP' output mode is set; *note Output Modes::.
-   
-   While a process is stopped, no more signals can be delivered to it
-until it is continued, except `SIGKILL' signals and (obviously)
-`SIGCONT' signals.  The signals are marked as pending, but not
-delivered until the process is continued.  The `SIGKILL' signal always
-causes termination of the process and can't be blocked, handled or
-ignored.  You can ignore `SIGCONT', but it always causes the process to
-be continued anyway if it is stopped.  Sending a `SIGCONT' signal to a
-process causes any pending stop signals for that process to be
-discarded.  Likewise, any pending `SIGCONT' signals for a process are
-discarded when it receives a stop signal.
-
-   When a process in an orphaned process group (*note Orphaned Process
-Groups::) receives a `SIGTSTP', `SIGTTIN', or `SIGTTOU' signal and does
-not handle it, the process does not stop.  Stopping the process would
-probably not be very useful, since there is no shell program that will
-notice it stop and allow the user to continue it.  What happens instead
-depends on the operating system you are using.  Some systems may do
-nothing; others may deliver another signal instead, such as `SIGKILL'
-or `SIGHUP'.  On GNU/Hurd systems, the process dies with `SIGKILL';
-this avoids the problem of many stopped, orphaned processes lying
-around the system.
-
-
-File: libc.info,  Node: Operation Error Signals,  Next: Miscellaneous Signals,  Prev: Job Control Signals,  Up: Standard Signals
-
-24.2.6 Operation Error Signals
-------------------------------
-
-These signals are used to report various errors generated by an
-operation done by the program.  They do not necessarily indicate a
-programming error in the program, but an error that prevents an
-operating system call from completing.  The default action for all of
-them is to cause the process to terminate.
-
- -- Macro: int SIGPIPE
-     Broken pipe.  If you use pipes or FIFOs, you have to design your
-     application so that one process opens the pipe for reading before
-     another starts writing.  If the reading process never starts, or
-     terminates unexpectedly, writing to the pipe or FIFO raises a
-     `SIGPIPE' signal.  If `SIGPIPE' is blocked, handled or ignored,
-     the offending call fails with `EPIPE' instead.
-
-     Pipes and FIFO special files are discussed in more detail in *note
-     Pipes and FIFOs::.
-
-     Another cause of `SIGPIPE' is when you try to output to a socket
-     that isn't connected.  *Note Sending Data::.
-
- -- Macro: int SIGLOST
-     Resource lost.  This signal is generated when you have an advisory
-     lock on an NFS file, and the NFS server reboots and forgets about
-     your lock.
-
-     On GNU/Hurd systems, `SIGLOST' is generated when any server program
-     dies unexpectedly.  It is usually fine to ignore the signal;
-     whatever call was made to the server that died just returns an
-     error.
-
- -- Macro: int SIGXCPU
-     CPU time limit exceeded.  This signal is generated when the process
-     exceeds its soft resource limit on CPU time.  *Note Limits on
-     Resources::.
-
- -- Macro: int SIGXFSZ
-     File size limit exceeded.  This signal is generated when the
-     process attempts to extend a file so it exceeds the process's soft
-     resource limit on file size.  *Note Limits on Resources::.
-
-
-File: libc.info,  Node: Miscellaneous Signals,  Next: Signal Messages,  Prev: Operation Error Signals,  Up: Standard Signals
-
-24.2.7 Miscellaneous Signals
-----------------------------
-
-These signals are used for various other purposes.  In general, they
-will not affect your program unless it explicitly uses them for
-something.
-
- -- Macro: int SIGUSR1
- -- Macro: int SIGUSR2
-     The `SIGUSR1' and `SIGUSR2' signals are set aside for you to use
-     any way you want.  They're useful for simple interprocess
-     communication, if you write a signal handler for them in the
-     program that receives the signal.
-
-     There is an example showing the use of `SIGUSR1' and `SIGUSR2' in
-     *note Signaling Another Process::.
-
-     The default action is to terminate the process.
-
- -- Macro: int SIGWINCH
-     Window size change.  This is generated on some systems (including
-     GNU) when the terminal driver's record of the number of rows and
-     columns on the screen is changed.  The default action is to ignore
-     it.
-
-     If a program does full-screen display, it should handle `SIGWINCH'.
-     When the signal arrives, it should fetch the new screen size and
-     reformat its display accordingly.
-
- -- Macro: int SIGINFO
-     Information request.  On 4.4 BSD and GNU/Hurd systems, this signal
-     is sent to all the processes in the foreground process group of
-     the controlling terminal when the user types the STATUS character
-     in canonical mode; *note Signal Characters::.
-
-     If the process is the leader of the process group, the default
-     action is to print some status information about the system and
-     what the process is doing.  Otherwise the default is to do nothing.
-
-
-File: libc.info,  Node: Signal Messages,  Prev: Miscellaneous Signals,  Up: Standard Signals
-
-24.2.8 Signal Messages
-----------------------
-
-We mentioned above that the shell prints a message describing the signal
-that terminated a child process.  The clean way to print a message
-describing a signal is to use the functions `strsignal' and `psignal'.
-These functions use a signal number to specify which kind of signal to
-describe.  The signal number may come from the termination status of a
-child process (*note Process Completion::) or it may come from a signal
-handler in the same process.
-
- -- Function: char * strsignal (int SIGNUM)
-     Preliminary: | MT-Unsafe race:strsignal locale | AS-Unsafe init
-     i18n corrupt heap | AC-Unsafe init corrupt mem | *Note POSIX
-     Safety Concepts::.
-
-     This function returns a pointer to a statically-allocated string
-     containing a message describing the signal SIGNUM.  You should not
-     modify the contents of this string; and, since it can be rewritten
-     on subsequent calls, you should save a copy of it if you need to
-     reference it later.
-
-     This function is a GNU extension, declared in the header file
-     `string.h'.
-
- -- Function: void psignal (int SIGNUM, const char *MESSAGE)
-     Preliminary: | MT-Safe locale | AS-Unsafe corrupt i18n heap |
-     AC-Unsafe lock corrupt mem | *Note POSIX Safety Concepts::.
-
-     This function prints a message describing the signal SIGNUM to the
-     standard error output stream `stderr'; see *note Standard
-     Streams::.
-
-     If you call `psignal' with a MESSAGE that is either a null pointer
-     or an empty string, `psignal' just prints the message
-     corresponding to SIGNUM, adding a trailing newline.
-
-     If you supply a non-null MESSAGE argument, then `psignal' prefixes
-     its output with this string.  It adds a colon and a space
-     character to separate the MESSAGE from the string corresponding to
-     SIGNUM.
-
-     This function is a BSD feature, declared in the header file
-     `signal.h'.
-
-   There is also an array `sys_siglist' which contains the messages for
-the various signal codes.  This array exists on BSD systems, unlike
-`strsignal'.
-
-
-File: libc.info,  Node: Signal Actions,  Next: Defining Handlers,  Prev: Standard Signals,  Up: Signal Handling
-
-24.3 Specifying Signal Actions
-==============================
-
-The simplest way to change the action for a signal is to use the
-`signal' function.  You can specify a built-in action (such as to
-ignore the signal), or you can "establish a handler".
-
-   The GNU C Library also implements the more versatile `sigaction'
-facility.  This section describes both facilities and gives suggestions
-on which to use when.
-
-* Menu:
-
-* Basic Signal Handling::       The simple `signal' function.
-* Advanced Signal Handling::    The more powerful `sigaction' function.
-* Signal and Sigaction::        How those two functions interact.
-* Sigaction Function Example::  An example of using the sigaction function.
-* Flags for Sigaction::         Specifying options for signal handling.
-* Initial Signal Actions::      How programs inherit signal actions.
-
-
-File: libc.info,  Node: Basic Signal Handling,  Next: Advanced Signal Handling,  Up: Signal Actions
-
-24.3.1 Basic Signal Handling
-----------------------------
-
-The `signal' function provides a simple interface for establishing an
-action for a particular signal.  The function and associated macros are
-declared in the header file `signal.h'.  
-
- -- Data Type: sighandler_t
-     This is the type of signal handler functions.  Signal handlers
-     take one integer argument specifying the signal number, and have
-     return type `void'.  So, you should define handler functions like
-     this:
-
-          void HANDLER (int `signum') { ... }
-
-     The name `sighandler_t' for this data type is a GNU extension.
-
- -- Function: sighandler_t signal (int SIGNUM, sighandler_t ACTION)
-     Preliminary: | MT-Safe sigintr | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     The `signal' function establishes ACTION as the action for the
-     signal SIGNUM.
-
-     The first argument, SIGNUM, identifies the signal whose behavior
-     you want to control, and should be a signal number.  The proper
-     way to specify a signal number is with one of the symbolic signal
-     names (*note Standard Signals::)--don't use an explicit number,
-     because the numerical code for a given kind of signal may vary
-     from operating system to operating system.
-
-     The second argument, ACTION, specifies the action to use for the
-     signal SIGNUM.  This can be one of the following:
-
-    `SIG_DFL'
-          `SIG_DFL' specifies the default action for the particular
-          signal.  The default actions for various kinds of signals are
-          stated in *note Standard Signals::.
-
-    `SIG_IGN'
-          `SIG_IGN' specifies that the signal should be ignored.
-
-          Your program generally should not ignore signals that
-          represent serious events or that are normally used to request
-          termination.  You cannot ignore the `SIGKILL' or `SIGSTOP'
-          signals at all.  You can ignore program error signals like
-          `SIGSEGV', but ignoring the error won't enable the program to
-          continue executing meaningfully.  Ignoring user requests such
-          as `SIGINT', `SIGQUIT', and `SIGTSTP' is unfriendly.
-
-          When you do not wish signals to be delivered during a certain
-          part of the program, the thing to do is to block them, not
-          ignore them.  *Note Blocking Signals::.
-
-    `HANDLER'
-          Supply the address of a handler function in your program, to
-          specify running this handler as the way to deliver the signal.
-
-          For more information about defining signal handler functions,
-          see *note Defining Handlers::.
-
-     If you set the action for a signal to `SIG_IGN', or if you set it
-     to `SIG_DFL' and the default action is to ignore that signal, then
-     any pending signals of that type are discarded (even if they are
-     blocked).  Discarding the pending signals means that they will
-     never be delivered, not even if you subsequently specify another
-     action and unblock this kind of signal.
-
-     The `signal' function returns the action that was previously in
-     effect for the specified SIGNUM.  You can save this value and
-     restore it later by calling `signal' again.
-
-     If `signal' can't honor the request, it returns `SIG_ERR' instead.
-     The following `errno' error conditions are defined for this
-     function:
-
-    `EINVAL'
-          You specified an invalid SIGNUM; or you tried to ignore or
-          provide a handler for `SIGKILL' or `SIGSTOP'.
-
-   *Compatibility Note:* A problem encountered when working with the
-`signal' function is that it has different semantics on BSD and SVID
-systems.  The difference is that on SVID systems the signal handler is
-deinstalled after signal delivery.  On BSD systems the handler must be
-explicitly deinstalled.  In the GNU C Library we use the BSD version by
-default.  To use the SVID version you can either use the function
-`sysv_signal' (see below) or use the `_XOPEN_SOURCE' feature select
-macro (*note Feature Test Macros::).  In general, use of these
-functions should be avoided because of compatibility problems.  It is
-better to use `sigaction' if it is available since the results are much
-more reliable.
-
-   Here is a simple example of setting up a handler to delete temporary
-files when certain fatal signals happen:
-
-     #include <signal.h>
-
-     void
-     termination_handler (int signum)
-     {
-       struct temp_file *p;
-
-       for (p = temp_file_list; p; p = p->next)
-         unlink (p->name);
-     }
-
-     int
-     main (void)
-     {
-       ...
-       if (signal (SIGINT, termination_handler) == SIG_IGN)
-         signal (SIGINT, SIG_IGN);
-       if (signal (SIGHUP, termination_handler) == SIG_IGN)
-         signal (SIGHUP, SIG_IGN);
-       if (signal (SIGTERM, termination_handler) == SIG_IGN)
-         signal (SIGTERM, SIG_IGN);
-       ...
-     }
-
-Note that if a given signal was previously set to be ignored, this code
-avoids altering that setting.  This is because non-job-control shells
-often ignore certain signals when starting children, and it is important
-for the children to respect this.
-
-   We do not handle `SIGQUIT' or the program error signals in this
-example because these are designed to provide information for debugging
-(a core dump), and the temporary files may give useful information.
-
- -- Function: sighandler_t sysv_signal (int SIGNUM, sighandler_t ACTION)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `sysv_signal' implements the behavior of the standard `signal'
-     function as found on SVID systems.  The difference to BSD systems
-     is that the handler is deinstalled after a delivery of a signal.
-
-     *Compatibility Note:* As said above for `signal', this function
-     should be avoided when possible.  `sigaction' is the preferred
-     method.
-
- -- Function: sighandler_t ssignal (int SIGNUM, sighandler_t ACTION)
-     Preliminary: | MT-Safe sigintr | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     The `ssignal' function does the same thing as `signal'; it is
-     provided only for compatibility with SVID.
-
- -- Macro: sighandler_t SIG_ERR
-     The value of this macro is used as the return value from `signal'
-     to indicate an error.
-
-
-File: libc.info,  Node: Advanced Signal Handling,  Next: Signal and Sigaction,  Prev: Basic Signal Handling,  Up: Signal Actions
-
-24.3.2 Advanced Signal Handling
--------------------------------
-
-The `sigaction' function has the same basic effect as `signal': to
-specify how a signal should be handled by the process.  However,
-`sigaction' offers more control, at the expense of more complexity.  In
-particular, `sigaction' allows you to specify additional flags to
-control when the signal is generated and how the handler is invoked.
-
-   The `sigaction' function is declared in `signal.h'.  
-
- -- Data Type: struct sigaction
-     Structures of type `struct sigaction' are used in the `sigaction'
-     function to specify all the information about how to handle a
-     particular signal.  This structure contains at least the following
-     members:
-
-    `sighandler_t sa_handler'
-          This is used in the same way as the ACTION argument to the
-          `signal' function.  The value can be `SIG_DFL', `SIG_IGN', or
-          a function pointer.  *Note Basic Signal Handling::.
-
-    `sigset_t sa_mask'
-          This specifies a set of signals to be blocked while the
-          handler runs.  Blocking is explained in *note Blocking for
-          Handler::.  Note that the signal that was delivered is
-          automatically blocked by default before its handler is
-          started; this is true regardless of the value in `sa_mask'.
-          If you want that signal not to be blocked within its handler,
-          you must write code in the handler to unblock it.
-
-    `int sa_flags'
-          This specifies various flags which can affect the behavior of
-          the signal.  These are described in more detail in *note
-          Flags for Sigaction::.
-
- -- Function: int sigaction (int SIGNUM, const struct sigaction
-          *restrict ACTION, struct sigaction *restrict OLD-ACTION)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The ACTION argument is used to set up a new action for the signal
-     SIGNUM, while the OLD-ACTION argument is used to return
-     information about the action previously associated with this
-     symbol.  (In other words, OLD-ACTION has the same purpose as the
-     `signal' function's return value--you can check to see what the
-     old action in effect for the signal was, and restore it later if
-     you want.)
-
-     Either ACTION or OLD-ACTION can be a null pointer.  If OLD-ACTION
-     is a null pointer, this simply suppresses the return of
-     information about the old action.  If ACTION is a null pointer,
-     the action associated with the signal SIGNUM is unchanged; this
-     allows you to inquire about how a signal is being handled without
-     changing that handling.
-
-     The return value from `sigaction' is zero if it succeeds, and `-1'
-     on failure.  The following `errno' error conditions are defined
-     for this function:
-
-    `EINVAL'
-          The SIGNUM argument is not valid, or you are trying to trap
-          or ignore `SIGKILL' or `SIGSTOP'.
-
-
-File: libc.info,  Node: Signal and Sigaction,  Next: Sigaction Function Example,  Prev: Advanced Signal Handling,  Up: Signal Actions
-
-24.3.3 Interaction of `signal' and `sigaction'
-----------------------------------------------
-
-It's possible to use both the `signal' and `sigaction' functions within
-a single program, but you have to be careful because they can interact
-in slightly strange ways.
-
-   The `sigaction' function specifies more information than the
-`signal' function, so the return value from `signal' cannot express the
-full range of `sigaction' possibilities.  Therefore, if you use
-`signal' to save and later reestablish an action, it may not be able to
-reestablish properly a handler that was established with `sigaction'.
-
-   To avoid having problems as a result, always use `sigaction' to save
-and restore a handler if your program uses `sigaction' at all.  Since
-`sigaction' is more general, it can properly save and reestablish any
-action, regardless of whether it was established originally with
-`signal' or `sigaction'.
-
-   On some systems if you establish an action with `signal' and then
-examine it with `sigaction', the handler address that you get may not
-be the same as what you specified with `signal'.  It may not even be
-suitable for use as an action argument with `signal'.  But you can rely
-on using it as an argument to `sigaction'.  This problem never happens
-on GNU systems.
-
-   So, you're better off using one or the other of the mechanisms
-consistently within a single program.
-
-   *Portability Note:* The basic `signal' function is a feature of
-ISO C, while `sigaction' is part of the POSIX.1 standard.  If you are
-concerned about portability to non-POSIX systems, then you should use
-the `signal' function instead.
-
-
-File: libc.info,  Node: Sigaction Function Example,  Next: Flags for Sigaction,  Prev: Signal and Sigaction,  Up: Signal Actions
-
-24.3.4 `sigaction' Function Example
------------------------------------
-
-In *note Basic Signal Handling::, we gave an example of establishing a
-simple handler for termination signals using `signal'.  Here is an
-equivalent example using `sigaction':
-
-     #include <signal.h>
-
-     void
-     termination_handler (int signum)
-     {
-       struct temp_file *p;
-
-       for (p = temp_file_list; p; p = p->next)
-         unlink (p->name);
-     }
-
-     int
-     main (void)
-     {
-       ...
-       struct sigaction new_action, old_action;
-
-       /* Set up the structure to specify the new action. */
-       new_action.sa_handler = termination_handler;
-       sigemptyset (&new_action.sa_mask);
-       new_action.sa_flags = 0;
-
-       sigaction (SIGINT, NULL, &old_action);
-       if (old_action.sa_handler != SIG_IGN)
-         sigaction (SIGINT, &new_action, NULL);
-       sigaction (SIGHUP, NULL, &old_action);
-       if (old_action.sa_handler != SIG_IGN)
-         sigaction (SIGHUP, &new_action, NULL);
-       sigaction (SIGTERM, NULL, &old_action);
-       if (old_action.sa_handler != SIG_IGN)
-         sigaction (SIGTERM, &new_action, NULL);
-       ...
-     }
-
-   The program just loads the `new_action' structure with the desired
-parameters and passes it in the `sigaction' call.  The usage of
-`sigemptyset' is described later; see *note Blocking Signals::.
-
-   As in the example using `signal', we avoid handling signals
-previously set to be ignored.  Here we can avoid altering the signal
-handler even momentarily, by using the feature of `sigaction' that lets
-us examine the current action without specifying a new one.
-
-   Here is another example.  It retrieves information about the current
-action for `SIGINT' without changing that action.
-
-     struct sigaction query_action;
-
-     if (sigaction (SIGINT, NULL, &query_action) < 0)
-       /* `sigaction' returns -1 in case of error. */
-     else if (query_action.sa_handler == SIG_DFL)
-       /* `SIGINT' is handled in the default, fatal manner. */
-     else if (query_action.sa_handler == SIG_IGN)
-       /* `SIGINT' is ignored. */
-     else
-       /* A programmer-defined signal handler is in effect. */
-
-
-File: libc.info,  Node: Flags for Sigaction,  Next: Initial Signal Actions,  Prev: Sigaction Function Example,  Up: Signal Actions
-
-24.3.5 Flags for `sigaction'
-----------------------------
-
-The `sa_flags' member of the `sigaction' structure is a catch-all for
-special features.  Most of the time, `SA_RESTART' is a good value to
-use for this field.
-
-   The value of `sa_flags' is interpreted as a bit mask.  Thus, you
-should choose the flags you want to set, OR those flags together, and
-store the result in the `sa_flags' member of your `sigaction' structure.
-
-   Each signal number has its own set of flags.  Each call to
-`sigaction' affects one particular signal number, and the flags that
-you specify apply only to that particular signal.
-
-   In the GNU C Library, establishing a handler with `signal' sets all
-the flags to zero except for `SA_RESTART', whose value depends on the
-settings you have made with `siginterrupt'.  *Note Interrupted
-Primitives::, to see what this is about.
-
-   These macros are defined in the header file `signal.h'.
-
- -- Macro: int SA_NOCLDSTOP
-     This flag is meaningful only for the `SIGCHLD' signal.  When the
-     flag is set, the system delivers the signal for a terminated child
-     process but not for one that is stopped.  By default, `SIGCHLD' is
-     delivered for both terminated children and stopped children.
-
-     Setting this flag for a signal other than `SIGCHLD' has no effect.
-
- -- Macro: int SA_ONSTACK
-     If this flag is set for a particular signal number, the system
-     uses the signal stack when delivering that kind of signal.  *Note
-     Signal Stack::.  If a signal with this flag arrives and you have
-     not set a signal stack, the system terminates the program with
-     `SIGILL'.
-
- -- Macro: int SA_RESTART
-     This flag controls what happens when a signal is delivered during
-     certain primitives (such as `open', `read' or `write'), and the
-     signal handler returns normally.  There are two alternatives: the
-     library function can resume, or it can return failure with error
-     code `EINTR'.
-
-     The choice is controlled by the `SA_RESTART' flag for the
-     particular kind of signal that was delivered.  If the flag is set,
-     returning from a handler resumes the library function.  If the
-     flag is clear, returning from a handler makes the function fail.
-     *Note Interrupted Primitives::.
-
-
-File: libc.info,  Node: Initial Signal Actions,  Prev: Flags for Sigaction,  Up: Signal Actions
-
-24.3.6 Initial Signal Actions
------------------------------
-
-When a new process is created (*note Creating a Process::), it inherits
-handling of signals from its parent process.  However, when you load a
-new process image using the `exec' function (*note Executing a File::),
-any signals that you've defined your own handlers for revert to their
-`SIG_DFL' handling.  (If you think about it a little, this makes sense;
-the handler functions from the old program are specific to that
-program, and aren't even present in the address space of the new
-program image.)  Of course, the new program can establish its own
-handlers.
-
-   When a program is run by a shell, the shell normally sets the initial
-actions for the child process to `SIG_DFL' or `SIG_IGN', as
-appropriate.  It's a good idea to check to make sure that the shell has
-not set up an initial action of `SIG_IGN' before you establish your own
-signal handlers.
-
-   Here is an example of how to establish a handler for `SIGHUP', but
-not if `SIGHUP' is currently ignored:
-
-     ...
-     struct sigaction temp;
-
-     sigaction (SIGHUP, NULL, &temp);
-
-     if (temp.sa_handler != SIG_IGN)
-       {
-         temp.sa_handler = handle_sighup;
-         sigemptyset (&temp.sa_mask);
-         sigaction (SIGHUP, &temp, NULL);
-       }
-
-
-File: libc.info,  Node: Defining Handlers,  Next: Interrupted Primitives,  Prev: Signal Actions,  Up: Signal Handling
-
-24.4 Defining Signal Handlers
-=============================
-
-This section describes how to write a signal handler function that can
-be established with the `signal' or `sigaction' functions.
-
-   A signal handler is just a function that you compile together with
-the rest of the program.  Instead of directly invoking the function,
-you use `signal' or `sigaction' to tell the operating system to call it
-when a signal arrives.  This is known as "establishing" the handler.
-*Note Signal Actions::.
-
-   There are two basic strategies you can use in signal handler
-functions:
-
-   * You can have the handler function note that the signal arrived by
-     tweaking some global data structures, and then return normally.
-
-   * You can have the handler function terminate the program or transfer
-     control to a point where it can recover from the situation that
-     caused the signal.
-
-   You need to take special care in writing handler functions because
-they can be called asynchronously.  That is, a handler might be called
-at any point in the program, unpredictably.  If two signals arrive
-during a very short interval, one handler can run within another.  This
-section describes what your handler should do, and what you should
-avoid.
-
-* Menu:
-
-* Handler Returns::             Handlers that return normally, and what
-                                 this means.
-* Termination in Handler::      How handler functions terminate a program.
-* Longjmp in Handler::          Nonlocal transfer of control out of a
-                                 signal handler.
-* Signals in Handler::          What happens when signals arrive while
-                                 the handler is already occupied.
-* Merged Signals::		When a second signal arrives before the
-				 first is handled.
-* Nonreentrancy::               Do not call any functions unless you know they
-                                 are reentrant with respect to signals.
-* Atomic Data Access::          A single handler can run in the middle of
-                                 reading or writing a single object.
-
-
-File: libc.info,  Node: Handler Returns,  Next: Termination in Handler,  Up: Defining Handlers
-
-24.4.1 Signal Handlers that Return
-----------------------------------
-
-Handlers which return normally are usually used for signals such as
-`SIGALRM' and the I/O and interprocess communication signals.  But a
-handler for `SIGINT' might also return normally after setting a flag
-that tells the program to exit at a convenient time.
-
-   It is not safe to return normally from the handler for a program
-error signal, because the behavior of the program when the handler
-function returns is not defined after a program error.  *Note Program
-Error Signals::.
-
-   Handlers that return normally must modify some global variable in
-order to have any effect.  Typically, the variable is one that is
-examined periodically by the program during normal operation.  Its data
-type should be `sig_atomic_t' for reasons described in *note Atomic
-Data Access::.
-
-   Here is a simple example of such a program.  It executes the body of
-the loop until it has noticed that a `SIGALRM' signal has arrived.
-This technique is useful because it allows the iteration in progress
-when the signal arrives to complete before the loop exits.
-
-
-     #include <signal.h>
-     #include <stdio.h>
-     #include <stdlib.h>
-
-     /* This flag controls termination of the main loop. */
-     volatile sig_atomic_t keep_going = 1;
-
-     /* The signal handler just clears the flag and re-enables itself. */
-     void
-     catch_alarm (int sig)
-     {
-       keep_going = 0;
-       signal (sig, catch_alarm);
-     }
-
-     void
-     do_stuff (void)
-     {
-       puts ("Doing stuff while waiting for alarm....");
-     }
-
-     int
-     main (void)
-     {
-       /* Establish a handler for SIGALRM signals. */
-       signal (SIGALRM, catch_alarm);
-
-       /* Set an alarm to go off in a little while. */
-       alarm (2);
-
-       /* Check the flag once in a while to see when to quit. */
-       while (keep_going)
-         do_stuff ();
 
        return EXIT_SUCCESS;
      }
 
-
-File: libc.info,  Node: Termination in Handler,  Next: Longjmp in Handler,  Prev: Handler Returns,  Up: Defining Handlers
+   This program is careful to restore the original terminal modes before
+exiting or terminating with a signal.  It uses the 'atexit' function
+(*note Cleanups on Exit::) to make sure this is done by 'exit'.
 
-24.4.2 Handlers That Terminate the Process
-------------------------------------------
-
-Handler functions that terminate the program are typically used to cause
-orderly cleanup or recovery from program error signals and interactive
-interrupts.
-
-   The cleanest way for a handler to terminate the process is to raise
-the same signal that ran the handler in the first place.  Here is how
-to do this:
-
-     volatile sig_atomic_t fatal_error_in_progress = 0;
-
-     void
-     fatal_error_signal (int sig)
-     {
-       /* Since this handler is established for more than one kind of signal,
-          it might still get invoked recursively by delivery of some other kind
-          of signal.  Use a static variable to keep track of that. */
-       if (fatal_error_in_progress)
-         raise (sig);
-       fatal_error_in_progress = 1;
-
-       /* Now do the clean up actions:
-          - reset terminal modes
-          - kill child processes
-          - remove lock files */
-       ...
-
-       /* Now reraise the signal.  We reactivate the signal's
-          default handling, which is to terminate the process.
-          We could just call `exit' or `abort',
-          but reraising the signal sets the return status
-          from the process correctly. */
-       signal (sig, SIG_DFL);
-       raise (sig);
-     }
+   The shell is supposed to take care of resetting the terminal modes
+when a process is stopped or continued; see *note Job Control::.  But
+some existing shells do not actually do this, so you may wish to
+establish handlers for job control signals that reset terminal modes.
+The above example does so.
 
 
-File: libc.info,  Node: Longjmp in Handler,  Next: Signals in Handler,  Prev: Termination in Handler,  Up: Defining Handlers
+File: libc.info,  Node: Pseudo-Terminals,  Prev: Noncanon Example,  Up: Low-Level Terminal Interface
 
-24.4.3 Nonlocal Control Transfer in Handlers
---------------------------------------------
-
-You can do a nonlocal transfer of control out of a signal handler using
-the `setjmp' and `longjmp' facilities (*note Non-Local Exits::).
-
-   When the handler does a nonlocal control transfer, the part of the
-program that was running will not continue.  If this part of the program
-was in the middle of updating an important data structure, the data
-structure will remain inconsistent.  Since the program does not
-terminate, the inconsistency is likely to be noticed later on.
-
-   There are two ways to avoid this problem.  One is to block the signal
-for the parts of the program that update important data structures.
-Blocking the signal delays its delivery until it is unblocked, once the
-critical updating is finished.  *Note Blocking Signals::.
-
-   The other way is to re-initialize the crucial data structures in the
-signal handler, or to make their values consistent.
-
-   Here is a rather schematic example showing the reinitialization of
-one global variable.
-
-     #include <signal.h>
-     #include <setjmp.h>
-
-     jmp_buf return_to_top_level;
-
-     volatile sig_atomic_t waiting_for_input;
-
-     void
-     handle_sigint (int signum)
-     {
-       /* We may have been waiting for input when the signal arrived,
-          but we are no longer waiting once we transfer control. */
-       waiting_for_input = 0;
-       longjmp (return_to_top_level, 1);
-     }
-
-     int
-     main (void)
-     {
-       ...
-       signal (SIGINT, sigint_handler);
-       ...
-       while (1) {
-         prepare_for_command ();
-         if (setjmp (return_to_top_level) == 0)
-           read_and_execute_command ();
-       }
-     }
-
-     /* Imagine this is a subroutine used by various commands. */
-     char *
-     read_data ()
-     {
-       if (input_from_terminal) {
-         waiting_for_input = 1;
-         ...
-         waiting_for_input = 0;
-       } else {
-         ...
-       }
-     }
-
-
-File: libc.info,  Node: Signals in Handler,  Next: Merged Signals,  Prev: Longjmp in Handler,  Up: Defining Handlers
-
-24.4.4 Signals Arriving While a Handler Runs
---------------------------------------------
-
-What happens if another signal arrives while your signal handler
-function is running?
-
-   When the handler for a particular signal is invoked, that signal is
-automatically blocked until the handler returns.  That means that if two
-signals of the same kind arrive close together, the second one will be
-held until the first has been handled.  (The handler can explicitly
-unblock the signal using `sigprocmask', if you want to allow more
-signals of this type to arrive; see *note Process Signal Mask::.)
-
-   However, your handler can still be interrupted by delivery of another
-kind of signal.  To avoid this, you can use the `sa_mask' member of the
-action structure passed to `sigaction' to explicitly specify which
-signals should be blocked while the signal handler runs.  These signals
-are in addition to the signal for which the handler was invoked, and
-any other signals that are normally blocked by the process.  *Note
-Blocking for Handler::.
-
-   When the handler returns, the set of blocked signals is restored to
-the value it had before the handler ran.  So using `sigprocmask' inside
-the handler only affects what signals can arrive during the execution of
-the handler itself, not what signals can arrive once the handler
-returns.
-
-   *Portability Note:* Always use `sigaction' to establish a handler
-for a signal that you expect to receive asynchronously, if you want
-your program to work properly on System V Unix.  On this system, the
-handling of a signal whose handler was established with `signal'
-automatically sets the signal's action back to `SIG_DFL', and the
-handler must re-establish itself each time it runs.  This practice,
-while inconvenient, does work when signals cannot arrive in succession.
-However, if another signal can arrive right away, it may arrive before
-the handler can re-establish itself.  Then the second signal would
-receive the default handling, which could terminate the process.
-
-
-File: libc.info,  Node: Merged Signals,  Next: Nonreentrancy,  Prev: Signals in Handler,  Up: Defining Handlers
-
-24.4.5 Signals Close Together Merge into One
---------------------------------------------
-
-If multiple signals of the same type are delivered to your process
-before your signal handler has a chance to be invoked at all, the
-handler may only be invoked once, as if only a single signal had
-arrived.  In effect, the signals merge into one.  This situation can
-arise when the signal is blocked, or in a multiprocessing environment
-where the system is busy running some other processes while the signals
-are delivered.  This means, for example, that you cannot reliably use a
-signal handler to count signals.  The only distinction you can reliably
-make is whether at least one signal has arrived since a given time in
-the past.
-
-   Here is an example of a handler for `SIGCHLD' that compensates for
-the fact that the number of signals received may not equal the number of
-child processes that generate them.  It assumes that the program keeps
-track of all the child processes with a chain of structures as follows:
-
-     struct process
-     {
-       struct process *next;
-       /* The process ID of this child.  */
-       int pid;
-       /* The descriptor of the pipe or pseudo terminal
-          on which output comes from this child.  */
-       int input_descriptor;
-       /* Nonzero if this process has stopped or terminated.  */
-       sig_atomic_t have_status;
-       /* The status of this child; 0 if running,
-          otherwise a status value from `waitpid'.  */
-       int status;
-     };
-
-     struct process *process_list;
-
-   This example also uses a flag to indicate whether signals have
-arrived since some time in the past--whenever the program last cleared
-it to zero.
-
-     /* Nonzero means some child's status has changed
-        so look at `process_list' for the details.  */
-     int process_status_change;
-
-   Here is the handler itself:
-
-     void
-     sigchld_handler (int signo)
-     {
-       int old_errno = errno;
-
-       while (1) {
-         register int pid;
-         int w;
-         struct process *p;
-
-         /* Keep asking for a status until we get a definitive result.  */
-         do
-           {
-             errno = 0;
-             pid = waitpid (WAIT_ANY, &w, WNOHANG | WUNTRACED);
-           }
-         while (pid <= 0 && errno == EINTR);
-
-         if (pid <= 0) {
-           /* A real failure means there are no more
-              stopped or terminated child processes, so return.  */
-           errno = old_errno;
-           return;
-         }
-
-         /* Find the process that signaled us, and record its status.  */
-
-         for (p = process_list; p; p = p->next)
-           if (p->pid == pid) {
-             p->status = w;
-             /* Indicate that the `status' field
-                has data to look at.  We do this only after storing it.  */
-             p->have_status = 1;
-
-             /* If process has terminated, stop waiting for its output.  */
-             if (WIFSIGNALED (w) || WIFEXITED (w))
-               if (p->input_descriptor)
-                 FD_CLR (p->input_descriptor, &input_wait_mask);
-
-             /* The program should check this flag from time to time
-                to see if there is any news in `process_list'.  */
-             ++process_status_change;
-           }
-
-         /* Loop around to handle all the processes
-            that have something to tell us.  */
-       }
-     }
-
-   Here is the proper way to check the flag `process_status_change':
-
-     if (process_status_change) {
-       struct process *p;
-       process_status_change = 0;
-       for (p = process_list; p; p = p->next)
-         if (p->have_status) {
-           ... Examine `p->status' ...
-         }
-     }
-
-It is vital to clear the flag before examining the list; otherwise, if a
-signal were delivered just before the clearing of the flag, and after
-the appropriate element of the process list had been checked, the status
-change would go unnoticed until the next signal arrived to set the flag
-again.  You could, of course, avoid this problem by blocking the signal
-while scanning the list, but it is much more elegant to guarantee
-correctness by doing things in the right order.
-
-   The loop which checks process status avoids examining `p->status'
-until it sees that status has been validly stored.  This is to make sure
-that the status cannot change in the middle of accessing it.  Once
-`p->have_status' is set, it means that the child process is stopped or
-terminated, and in either case, it cannot stop or terminate again until
-the program has taken notice.  *Note Atomic Usage::, for more
-information about coping with interruptions during accesses of a
-variable.
-
-   Here is another way you can test whether the handler has run since
-the last time you checked.  This technique uses a counter which is never
-changed outside the handler.  Instead of clearing the count, the program
-remembers the previous value and sees whether it has changed since the
-previous check.  The advantage of this method is that different parts of
-the program can check independently, each part checking whether there
-has been a signal since that part last checked.
-
-     sig_atomic_t process_status_change;
-
-     sig_atomic_t last_process_status_change;
-
-     ...
-     {
-       sig_atomic_t prev = last_process_status_change;
-       last_process_status_change = process_status_change;
-       if (last_process_status_change != prev) {
-         struct process *p;
-         for (p = process_list; p; p = p->next)
-           if (p->have_status) {
-             ... Examine `p->status' ...
-           }
-       }
-     }
-
-
-File: libc.info,  Node: Nonreentrancy,  Next: Atomic Data Access,  Prev: Merged Signals,  Up: Defining Handlers
-
-24.4.6 Signal Handling and Nonreentrant Functions
--------------------------------------------------
-
-Handler functions usually don't do very much.  The best practice is to
-write a handler that does nothing but set an external variable that the
-program checks regularly, and leave all serious work to the program.
-This is best because the handler can be called asynchronously, at
-unpredictable times--perhaps in the middle of a primitive function, or
-even between the beginning and the end of a C operator that requires
-multiple instructions.  The data structures being manipulated might
-therefore be in an inconsistent state when the handler function is
-invoked.  Even copying one `int' variable into another can take two
-instructions on most machines.
-
-   This means you have to be very careful about what you do in a signal
-handler.
-
-   * If your handler needs to access any global variables from your
-     program, declare those variables `volatile'.  This tells the
-     compiler that the value of the variable might change
-     asynchronously, and inhibits certain optimizations that would be
-     invalidated by such modifications.
-
-   * If you call a function in the handler, make sure it is "reentrant"
-     with respect to signals, or else make sure that the signal cannot
-     interrupt a call to a related function.
-
-   A function can be non-reentrant if it uses memory that is not on the
-stack.
-
-   * If a function uses a static variable or a global variable, or a
-     dynamically-allocated object that it finds for itself, then it is
-     non-reentrant and any two calls to the function can interfere.
-
-     For example, suppose that the signal handler uses `gethostbyname'.
-     This function returns its value in a static object, reusing the
-     same object each time.  If the signal happens to arrive during a
-     call to `gethostbyname', or even after one (while the program is
-     still using the value), it will clobber the value that the program
-     asked for.
-
-     However, if the program does not use `gethostbyname' or any other
-     function that returns information in the same object, or if it
-     always blocks signals around each use, then you are safe.
-
-     There are a large number of library functions that return values
-     in a fixed object, always reusing the same object in this fashion,
-     and all of them cause the same problem.  Function descriptions in
-     this manual always mention this behavior.
-
-   * If a function uses and modifies an object that you supply, then it
-     is potentially non-reentrant; two calls can interfere if they use
-     the same object.
-
-     This case arises when you do I/O using streams.  Suppose that the
-     signal handler prints a message with `fprintf'.  Suppose that the
-     program was in the middle of an `fprintf' call using the same
-     stream when the signal was delivered.  Both the signal handler's
-     message and the program's data could be corrupted, because both
-     calls operate on the same data structure--the stream itself.
-
-     However, if you know that the stream that the handler uses cannot
-     possibly be used by the program at a time when signals can arrive,
-     then you are safe.  It is no problem if the program uses some
-     other stream.
-
-   * On most systems, `malloc' and `free' are not reentrant, because
-     they use a static data structure which records what memory blocks
-     are free.  As a result, no library functions that allocate or free
-     memory are reentrant.  This includes functions that allocate space
-     to store a result.
-
-     The best way to avoid the need to allocate memory in a handler is
-     to allocate in advance space for signal handlers to use.
-
-     The best way to avoid freeing memory in a handler is to flag or
-     record the objects to be freed, and have the program check from
-     time to time whether anything is waiting to be freed.  But this
-     must be done with care, because placing an object on a chain is
-     not atomic, and if it is interrupted by another signal handler
-     that does the same thing, you could "lose" one of the objects.
-
-   * Any function that modifies `errno' is non-reentrant, but you can
-     correct for this: in the handler, save the original value of
-     `errno' and restore it before returning normally.  This prevents
-     errors that occur within the signal handler from being confused
-     with errors from system calls at the point the program is
-     interrupted to run the handler.
-
-     This technique is generally applicable; if you want to call in a
-     handler a function that modifies a particular object in memory,
-     you can make this safe by saving and restoring that object.
-
-   * Merely reading from a memory object is safe provided that you can
-     deal with any of the values that might appear in the object at a
-     time when the signal can be delivered.  Keep in mind that
-     assignment to some data types requires more than one instruction,
-     which means that the handler could run "in the middle of" an
-     assignment to the variable if its type is not atomic.  *Note
-     Atomic Data Access::.
-
-   * Merely writing into a memory object is safe as long as a sudden
-     change in the value, at any time when the handler might run, will
-     not disturb anything.
-
-
-File: libc.info,  Node: Atomic Data Access,  Prev: Nonreentrancy,  Up: Defining Handlers
-
-24.4.7 Atomic Data Access and Signal Handling
----------------------------------------------
-
-Whether the data in your application concerns atoms, or mere text, you
-have to be careful about the fact that access to a single datum is not
-necessarily "atomic".  This means that it can take more than one
-instruction to read or write a single object.  In such cases, a signal
-handler might be invoked in the middle of reading or writing the object.
-
-   There are three ways you can cope with this problem.  You can use
-data types that are always accessed atomically; you can carefully
-arrange that nothing untoward happens if an access is interrupted, or
-you can block all signals around any access that had better not be
-interrupted (*note Blocking Signals::).
-
-* Menu:
-
-* Non-atomic Example::		A program illustrating interrupted access.
-* Types: Atomic Types.		Data types that guarantee no interruption.
-* Usage: Atomic Usage.		Proving that interruption is harmless.
-
-
-File: libc.info,  Node: Non-atomic Example,  Next: Atomic Types,  Up: Atomic Data Access
-
-24.4.7.1 Problems with Non-Atomic Access
-........................................
-
-Here is an example which shows what can happen if a signal handler runs
-in the middle of modifying a variable.  (Interrupting the reading of a
-variable can also lead to paradoxical results, but here we only show
-writing.)
-
-     #include <signal.h>
-     #include <stdio.h>
-
-     volatile struct two_words { int a, b; } memory;
-
-     void
-     handler(int signum)
-     {
-        printf ("%d,%d\n", memory.a, memory.b);
-        alarm (1);
-     }
-
-     int
-     main (void)
-     {
-        static struct two_words zeros = { 0, 0 }, ones = { 1, 1 };
-        signal (SIGALRM, handler);
-        memory = zeros;
-        alarm (1);
-        while (1)
-          {
-            memory = zeros;
-            memory = ones;
-          }
-     }
-
-   This program fills `memory' with zeros, ones, zeros, ones,
-alternating forever; meanwhile, once per second, the alarm signal
-handler prints the current contents.  (Calling `printf' in the handler
-is safe in this program because it is certainly not being called outside
-the handler when the signal happens.)
-
-   Clearly, this program can print a pair of zeros or a pair of ones.
-But that's not all it can do!  On most machines, it takes several
-instructions to store a new value in `memory', and the value is stored
-one word at a time.  If the signal is delivered in between these
-instructions, the handler might find that `memory.a' is zero and
-`memory.b' is one (or vice versa).
-
-   On some machines it may be possible to store a new value in `memory'
-with just one instruction that cannot be interrupted.  On these
-machines, the handler will always print two zeros or two ones.
-
-
-File: libc.info,  Node: Atomic Types,  Next: Atomic Usage,  Prev: Non-atomic Example,  Up: Atomic Data Access
-
-24.4.7.2 Atomic Types
-.....................
-
-To avoid uncertainty about interrupting access to a variable, you can
-use a particular data type for which access is always atomic:
-`sig_atomic_t'.  Reading and writing this data type is guaranteed to
-happen in a single instruction, so there's no way for a handler to run
-"in the middle" of an access.
-
-   The type `sig_atomic_t' is always an integer data type, but which
-one it is, and how many bits it contains, may vary from machine to
-machine.
-
- -- Data Type: sig_atomic_t
-     This is an integer data type.  Objects of this type are always
-     accessed atomically.
-
-   In practice, you can assume that `int' is atomic.  You can also
-assume that pointer types are atomic; that is very convenient.  Both of
-these assumptions are true on all of the machines that the GNU C
-Library supports and on all POSIX systems we know of.
-
-
-File: libc.info,  Node: Atomic Usage,  Prev: Atomic Types,  Up: Atomic Data Access
-
-24.4.7.3 Atomic Usage Patterns
-..............................
-
-Certain patterns of access avoid any problem even if an access is
-interrupted.  For example, a flag which is set by the handler, and
-tested and cleared by the main program from time to time, is always safe
-even if access actually requires two instructions.  To show that this is
-so, we must consider each access that could be interrupted, and show
-that there is no problem if it is interrupted.
-
-   An interrupt in the middle of testing the flag is safe because
-either it's recognized to be nonzero, in which case the precise value
-doesn't matter, or it will be seen to be nonzero the next time it's
-tested.
-
-   An interrupt in the middle of clearing the flag is no problem because
-either the value ends up zero, which is what happens if a signal comes
-in just before the flag is cleared, or the value ends up nonzero, and
-subsequent events occur as if the signal had come in just after the flag
-was cleared.  As long as the code handles both of these cases properly,
-it can also handle a signal in the middle of clearing the flag.  (This
-is an example of the sort of reasoning you need to do to figure out
-whether non-atomic usage is safe.)
-
-   Sometimes you can insure uninterrupted access to one object by
-protecting its use with another object, perhaps one whose type
-guarantees atomicity.  *Note Merged Signals::, for an example.
-
-
-File: libc.info,  Node: Interrupted Primitives,  Next: Generating Signals,  Prev: Defining Handlers,  Up: Signal Handling
-
-24.5 Primitives Interrupted by Signals
-======================================
-
-A signal can arrive and be handled while an I/O primitive such as
-`open' or `read' is waiting for an I/O device.  If the signal handler
-returns, the system faces the question: what should happen next?
-
-   POSIX specifies one approach: make the primitive fail right away.
-The error code for this kind of failure is `EINTR'.  This is flexible,
-but usually inconvenient.  Typically, POSIX applications that use signal
-handlers must check for `EINTR' after each library function that can
-return it, in order to try the call again.  Often programmers forget to
-check, which is a common source of error.
-
-   The GNU C Library provides a convenient way to retry a call after a
-temporary failure, with the macro `TEMP_FAILURE_RETRY':
-
- -- Macro: TEMP_FAILURE_RETRY (EXPRESSION)
-     This macro evaluates EXPRESSION once, and examines its value as
-     type `long int'.  If the value equals `-1', that indicates a
-     failure and `errno' should be set to show what kind of failure.
-     If it fails and reports error code `EINTR', `TEMP_FAILURE_RETRY'
-     evaluates it again, and over and over until the result is not a
-     temporary failure.
-
-     The value returned by `TEMP_FAILURE_RETRY' is whatever value
-     EXPRESSION produced.
-
-   BSD avoids `EINTR' entirely and provides a more convenient approach:
-to restart the interrupted primitive, instead of making it fail.  If
-you choose this approach, you need not be concerned with `EINTR'.
-
-   You can choose either approach with the GNU C Library.  If you use
-`sigaction' to establish a signal handler, you can specify how that
-handler should behave.  If you specify the `SA_RESTART' flag, return
-from that handler will resume a primitive; otherwise, return from that
-handler will cause `EINTR'.  *Note Flags for Sigaction::.
-
-   Another way to specify the choice is with the `siginterrupt'
-function.  *Note BSD Handler::.
-
-   When you don't specify with `sigaction' or `siginterrupt' what a
-particular handler should do, it uses a default choice.  The default
-choice in the GNU C Library depends on the feature test macros you have
-defined.  If you define `_BSD_SOURCE' or `_GNU_SOURCE' before calling
-`signal', the default is to resume primitives; otherwise, the default
-is to make them fail with `EINTR'.  (The library contains alternate
-versions of the `signal' function, and the feature test macros
-determine which one you really call.)  *Note Feature Test Macros::.  
-
-   The description of each primitive affected by this issue lists
-`EINTR' among the error codes it can return.
-
-   There is one situation where resumption never happens no matter which
-choice you make: when a data-transfer function such as `read' or
-`write' is interrupted by a signal after transferring part of the data.
-In this case, the function returns the number of bytes already
-transferred, indicating partial success.
-
-   This might at first appear to cause unreliable behavior on
-record-oriented devices (including datagram sockets; *note Datagrams::),
-where splitting one `read' or `write' into two would read or write two
-records.  Actually, there is no problem, because interruption after a
-partial transfer cannot happen on such devices; they always transfer an
-entire record in one burst, with no waiting once data transfer has
-started.
-
-
-File: libc.info,  Node: Generating Signals,  Next: Blocking Signals,  Prev: Interrupted Primitives,  Up: Signal Handling
-
-24.6 Generating Signals
-=======================
-
-Besides signals that are generated as a result of a hardware trap or
-interrupt, your program can explicitly send signals to itself or to
-another process.
-
-* Menu:
-
-* Signaling Yourself::          A process can send a signal to itself.
-* Signaling Another Process::   Send a signal to another process.
-* Permission for kill::         Permission for using `kill'.
-* Kill Example::                Using `kill' for Communication.
-
-
-File: libc.info,  Node: Signaling Yourself,  Next: Signaling Another Process,  Up: Generating Signals
-
-24.6.1 Signaling Yourself
--------------------------
-
-A process can send itself a signal with the `raise' function.  This
-function is declared in `signal.h'.  
-
- -- Function: int raise (int SIGNUM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `raise' function sends the signal SIGNUM to the calling
-     process.  It returns zero if successful and a nonzero value if it
-     fails.  About the only reason for failure would be if the value of
-     SIGNUM is invalid.
-
- -- Function: int gsignal (int SIGNUM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `gsignal' function does the same thing as `raise'; it is
-     provided only for compatibility with SVID.
-
-   One convenient use for `raise' is to reproduce the default behavior
-of a signal that you have trapped.  For instance, suppose a user of your
-program types the SUSP character (usually `C-z'; *note Special
-Characters::) to send it an interactive stop signal (`SIGTSTP'), and
-you want to clean up some internal data buffers before stopping.  You
-might set this up like this:
-
-     #include <signal.h>
-
-     /* When a stop signal arrives, set the action back to the default
-        and then resend the signal after doing cleanup actions. */
-
-     void
-     tstp_handler (int sig)
-     {
-       signal (SIGTSTP, SIG_DFL);
-       /* Do cleanup actions here. */
-       ...
-       raise (SIGTSTP);
-     }
-
-     /* When the process is continued again, restore the signal handler. */
-
-     void
-     cont_handler (int sig)
-     {
-       signal (SIGCONT, cont_handler);
-       signal (SIGTSTP, tstp_handler);
-     }
-
-     /* Enable both handlers during program initialization. */
-
-     int
-     main (void)
-     {
-       signal (SIGCONT, cont_handler);
-       signal (SIGTSTP, tstp_handler);
-       ...
-     }
-
-   *Portability note:* `raise' was invented by the ISO C committee.
-Older systems may not support it, so using `kill' may be more portable.
-*Note Signaling Another Process::.
-
-
-File: libc.info,  Node: Signaling Another Process,  Next: Permission for kill,  Prev: Signaling Yourself,  Up: Generating Signals
-
-24.6.2 Signaling Another Process
---------------------------------
-
-The `kill' function can be used to send a signal to another process.
-In spite of its name, it can be used for a lot of things other than
-causing a process to terminate.  Some examples of situations where you
-might want to send signals between processes are:
-
-   * A parent process starts a child to perform a task--perhaps having
-     the child running an infinite loop--and then terminates the child
-     when the task is no longer needed.
-
-   * A process executes as part of a group, and needs to terminate or
-     notify the other processes in the group when an error or other
-     event occurs.
-
-   * Two processes need to synchronize while working together.
-
-   This section assumes that you know a little bit about how processes
-work.  For more information on this subject, see *note Processes::.
-
-   The `kill' function is declared in `signal.h'.  
-
- -- Function: int kill (pid_t PID, int SIGNUM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `kill' function sends the signal SIGNUM to the process or
-     process group specified by PID.  Besides the signals listed in
-     *note Standard Signals::, SIGNUM can also have a value of zero to
-     check the validity of the PID.
-
-     The PID specifies the process or process group to receive the
-     signal:
-
-    `PID > 0'
-          The process whose identifier is PID.
-
-    `PID == 0'
-          All processes in the same process group as the sender.
-
-    `PID < -1'
-          The process group whose identifier is -PID.
-
-    `PID == -1'
-          If the process is privileged, send the signal to all
-          processes except for some special system processes.
-          Otherwise, send the signal to all processes with the same
-          effective user ID.
-
-     A process can send a signal to itself with a call like
-     `kill (getpid(), SIGNUM)'.  If `kill' is used by a process to send
-     a signal to itself, and the signal is not blocked, then `kill'
-     delivers at least one signal (which might be some other pending
-     unblocked signal instead of the signal SIGNUM) to that process
-     before it returns.
-
-     The return value from `kill' is zero if the signal can be sent
-     successfully.  Otherwise, no signal is sent, and a value of `-1' is
-     returned.  If PID specifies sending a signal to several processes,
-     `kill' succeeds if it can send the signal to at least one of them.
-     There's no way you can tell which of the processes got the signal
-     or whether all of them did.
-
-     The following `errno' error conditions are defined for this
-     function:
-
-    `EINVAL'
-          The SIGNUM argument is an invalid or unsupported number.
-
-    `EPERM'
-          You do not have the privilege to send a signal to the process
-          or any of the processes in the process group named by PID.
-
-    `ESRCH'
-          The PID argument does not refer to an existing process or
-          group.
-
- -- Function: int killpg (int PGID, int SIGNUM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This is similar to `kill', but sends signal SIGNUM to the process
-     group PGID.  This function is provided for compatibility with BSD;
-     using `kill' to do this is more portable.
-
-   As a simple example of `kill', the call `kill (getpid (), SIG)' has
-the same effect as `raise (SIG)'.
-
-
-File: libc.info,  Node: Permission for kill,  Next: Kill Example,  Prev: Signaling Another Process,  Up: Generating Signals
-
-24.6.3 Permission for using `kill'
-----------------------------------
-
-There are restrictions that prevent you from using `kill' to send
-signals to any random process.  These are intended to prevent antisocial
-behavior such as arbitrarily killing off processes belonging to another
-user.  In typical use, `kill' is used to pass signals between parent,
-child, and sibling processes, and in these situations you normally do
-have permission to send signals.  The only common exception is when you
-run a setuid program in a child process; if the program changes its
-real UID as well as its effective UID, you may not have permission to
-send a signal.  The `su' program does this.
-
-   Whether a process has permission to send a signal to another process
-is determined by the user IDs of the two processes.  This concept is
-discussed in detail in *note Process Persona::.
-
-   Generally, for a process to be able to send a signal to another
-process, either the sending process must belong to a privileged user
-(like `root'), or the real or effective user ID of the sending process
-must match the real or effective user ID of the receiving process.  If
-the receiving process has changed its effective user ID from the
-set-user-ID mode bit on its process image file, then the owner of the
-process image file is used in place of its current effective user ID.
-In some implementations, a parent process might be able to send signals
-to a child process even if the user ID's don't match, and other
-implementations might enforce other restrictions.
-
-   The `SIGCONT' signal is a special case.  It can be sent if the
-sender is part of the same session as the receiver, regardless of user
-IDs.
-
-
-File: libc.info,  Node: Kill Example,  Prev: Permission for kill,  Up: Generating Signals
-
-24.6.4 Using `kill' for Communication
--------------------------------------
-
-Here is a longer example showing how signals can be used for
-interprocess communication.  This is what the `SIGUSR1' and `SIGUSR2'
-signals are provided for.  Since these signals are fatal by default,
-the process that is supposed to receive them must trap them through
-`signal' or `sigaction'.
-
-   In this example, a parent process forks a child process and then
-waits for the child to complete its initialization.  The child process
-tells the parent when it is ready by sending it a `SIGUSR1' signal,
-using the `kill' function.
-
-
-     #include <signal.h>
-     #include <stdio.h>
-     #include <sys/types.h>
-     #include <unistd.h>
-
-     /* When a `SIGUSR1' signal arrives, set this variable. */
-     volatile sig_atomic_t usr_interrupt = 0;
-
-     void
-     synch_signal (int sig)
-     {
-       usr_interrupt = 1;
-     }
-
-     /* The child process executes this function. */
-     void
-     child_function (void)
-     {
-       /* Perform initialization. */
-       printf ("I'm here!!!  My pid is %d.\n", (int) getpid ());
-
-       /* Let parent know you're done. */
-       kill (getppid (), SIGUSR1);
-
-       /* Continue with execution. */
-       puts ("Bye, now....");
-       exit (0);
-     }
-
-     int
-     main (void)
-     {
-       struct sigaction usr_action;
-       sigset_t block_mask;
-       pid_t child_id;
-
-       /* Establish the signal handler. */
-       sigfillset (&block_mask);
-       usr_action.sa_handler = synch_signal;
-       usr_action.sa_mask = block_mask;
-       usr_action.sa_flags = 0;
-       sigaction (SIGUSR1, &usr_action, NULL);
-
-       /* Create the child process. */
-       child_id = fork ();
-       if (child_id == 0)
-         child_function ();          /* Does not return. */
-
-       /* Busy wait for the child to send a signal. */
-       while (!usr_interrupt)
-         ;
-
-       /* Now continue execution. */
-       puts ("That's all, folks!");
-
-       return 0;
-     }
-
-   This example uses a busy wait, which is bad, because it wastes CPU
-cycles that other programs could otherwise use.  It is better to ask the
-system to wait until the signal arrives.  See the example in *note
-Waiting for a Signal::.
-
-
-File: libc.info,  Node: Blocking Signals,  Next: Waiting for a Signal,  Prev: Generating Signals,  Up: Signal Handling
-
-24.7 Blocking Signals
+17.8 Pseudo-Terminals
 =====================
 
-Blocking a signal means telling the operating system to hold it and
-deliver it later.  Generally, a program does not block signals
-indefinitely--it might as well ignore them by setting their actions to
-`SIG_IGN'.  But it is useful to block signals briefly, to prevent them
-from interrupting sensitive operations.  For instance:
+A "pseudo-terminal" is a special interprocess communication channel that
+acts like a terminal.  One end of the channel is called the "master"
+side or "master pseudo-terminal device", the other side is called the
+"slave" side.  Data written to the master side is received by the slave
+side as if it was the result of a user typing at an ordinary terminal,
+and data written to the slave side is sent to the master side as if it
+was written on an ordinary terminal.
 
-   * You can use the `sigprocmask' function to block signals while you
-     modify global variables that are also modified by the handlers for
-     these signals.
-
-   * You can set `sa_mask' in your `sigaction' call to block certain
-     signals while a particular signal handler runs.  This way, the
-     signal handler can run without being interrupted itself by signals.
+   Pseudo terminals are the way programs like 'xterm' and 'emacs'
+implement their terminal emulation functionality.
 
 * Menu:
 
-* Why Block::                           The purpose of blocking signals.
-* Signal Sets::                         How to specify which signals to
-                                         block.
-* Process Signal Mask::                 Blocking delivery of signals to your
-				         process during normal execution.
-* Testing for Delivery::                Blocking to Test for Delivery of
-                                         a Signal.
-* Blocking for Handler::                Blocking additional signals while a
-				         handler is being run.
-* Checking for Pending Signals::        Checking for Pending Signals
-* Remembering a Signal::                How you can get almost the same
-                                         effect as blocking a signal, by
-                                         handling it and setting a flag
-                                         to be tested later.
+* Allocation::             Allocating a pseudo terminal.
+* Pseudo-Terminal Pairs::  How to open both sides of a
+                            pseudo-terminal in a single operation.
 
 
-File: libc.info,  Node: Why Block,  Next: Signal Sets,  Up: Blocking Signals
+File: libc.info,  Node: Allocation,  Next: Pseudo-Terminal Pairs,  Up: Pseudo-Terminals
 
-24.7.1 Why Blocking Signals is Useful
--------------------------------------
-
-Temporary blocking of signals with `sigprocmask' gives you a way to
-prevent interrupts during critical parts of your code.  If signals
-arrive in that part of the program, they are delivered later, after you
-unblock them.
-
-   One example where this is useful is for sharing data between a signal
-handler and the rest of the program.  If the type of the data is not
-`sig_atomic_t' (*note Atomic Data Access::), then the signal handler
-could run when the rest of the program has only half finished reading
-or writing the data.  This would lead to confusing consequences.
-
-   To make the program reliable, you can prevent the signal handler from
-running while the rest of the program is examining or modifying that
-data--by blocking the appropriate signal around the parts of the
-program that touch the data.
-
-   Blocking signals is also necessary when you want to perform a certain
-action only if a signal has not arrived.  Suppose that the handler for
-the signal sets a flag of type `sig_atomic_t'; you would like to test
-the flag and perform the action if the flag is not set.  This is
-unreliable.  Suppose the signal is delivered immediately after you test
-the flag, but before the consequent action: then the program will
-perform the action even though the signal has arrived.
-
-   The only way to test reliably for whether a signal has yet arrived
-is to test while the signal is blocked.
-
-
-File: libc.info,  Node: Signal Sets,  Next: Process Signal Mask,  Prev: Why Block,  Up: Blocking Signals
-
-24.7.2 Signal Sets
-------------------
-
-All of the signal blocking functions use a data structure called a
-"signal set" to specify what signals are affected.  Thus, every
-activity involves two stages: creating the signal set, and then passing
-it as an argument to a library function.  
-
-   These facilities are declared in the header file `signal.h'.  
-
- -- Data Type: sigset_t
-     The `sigset_t' data type is used to represent a signal set.
-     Internally, it may be implemented as either an integer or structure
-     type.
-
-     For portability, use only the functions described in this section
-     to initialize, change, and retrieve information from `sigset_t'
-     objects--don't try to manipulate them directly.
-
-   There are two ways to initialize a signal set.  You can initially
-specify it to be empty with `sigemptyset' and then add specified
-signals individually.  Or you can specify it to be full with
-`sigfillset' and then delete specified signals individually.
-
-   You must always initialize the signal set with one of these two
-functions before using it in any other way.  Don't try to set all the
-signals explicitly because the `sigset_t' object might include some
-other information (like a version field) that needs to be initialized as
-well.  (In addition, it's not wise to put into your program an
-assumption that the system has no signals aside from the ones you know
-about.)
-
- -- Function: int sigemptyset (sigset_t *SET)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function initializes the signal set SET to exclude all of the
-     defined signals.  It always returns `0'.
-
- -- Function: int sigfillset (sigset_t *SET)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function initializes the signal set SET to include all of the
-     defined signals.  Again, the return value is `0'.
-
- -- Function: int sigaddset (sigset_t *SET, int SIGNUM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function adds the signal SIGNUM to the signal set SET.  All
-     `sigaddset' does is modify SET; it does not block or unblock any
-     signals.
-
-     The return value is `0' on success and `-1' on failure.  The
-     following `errno' error condition is defined for this function:
-
-    `EINVAL'
-          The SIGNUM argument doesn't specify a valid signal.
-
- -- Function: int sigdelset (sigset_t *SET, int SIGNUM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function removes the signal SIGNUM from the signal set SET.
-     All `sigdelset' does is modify SET; it does not block or unblock
-     any signals.  The return value and error conditions are the same
-     as for `sigaddset'.
-
-   Finally, there is a function to test what signals are in a signal
-set:
-
- -- Function: int sigismember (const sigset_t *SET, int SIGNUM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `sigismember' function tests whether the signal SIGNUM is a
-     member of the signal set SET.  It returns `1' if the signal is in
-     the set, `0' if not, and `-1' if there is an error.
-
-     The following `errno' error condition is defined for this function:
-
-    `EINVAL'
-          The SIGNUM argument doesn't specify a valid signal.
-
-
-File: libc.info,  Node: Process Signal Mask,  Next: Testing for Delivery,  Prev: Signal Sets,  Up: Blocking Signals
-
-24.7.3 Process Signal Mask
---------------------------
-
-The collection of signals that are currently blocked is called the
-"signal mask".  Each process has its own signal mask.  When you create
-a new process (*note Creating a Process::), it inherits its parent's
-mask.  You can block or unblock signals with total flexibility by
-modifying the signal mask.
-
-   The prototype for the `sigprocmask' function is in `signal.h'.  
-
-   Note that you must not use `sigprocmask' in multi-threaded processes,
-because each thread has its own signal mask and there is no single
-process signal mask. According to POSIX, the behavior of `sigprocmask'
-in a multi-threaded process is "unspecified".  Instead, use
-`pthread_sigmask'.
-
- -- Function: int sigprocmask (int HOW, const sigset_t *restrict SET,
-          sigset_t *restrict OLDSET)
-     Preliminary: | MT-Unsafe race:sigprocmask/bsd(SIG_UNBLOCK) |
-     AS-Unsafe lock/hurd | AC-Unsafe lock/hurd | *Note POSIX Safety
-     Concepts::.
-
-     The `sigprocmask' function is used to examine or change the calling
-     process's signal mask.  The HOW argument determines how the signal
-     mask is changed, and must be one of the following values:
-
-    `SIG_BLOCK'
-          Block the signals in `set'--add them to the existing mask.  In
-          other words, the new mask is the union of the existing mask
-          and SET.
-
-    `SIG_UNBLOCK'
-          Unblock the signals in SET--remove them from the existing
-          mask.
-
-    `SIG_SETMASK'
-          Use SET for the mask; ignore the previous value of the mask.
-
-     The last argument, OLDSET, is used to return information about the
-     old process signal mask.  If you just want to change the mask
-     without looking at it, pass a null pointer as the OLDSET argument.
-     Similarly, if you want to know what's in the mask without changing
-     it, pass a null pointer for SET (in this case the HOW argument is
-     not significant).  The OLDSET argument is often used to remember
-     the previous signal mask in order to restore it later.  (Since the
-     signal mask is inherited over `fork' and `exec' calls, you can't
-     predict what its contents are when your program starts running.)
-
-     If invoking `sigprocmask' causes any pending signals to be
-     unblocked, at least one of those signals is delivered to the
-     process before `sigprocmask' returns.  The order in which pending
-     signals are delivered is not specified, but you can control the
-     order explicitly by making multiple `sigprocmask' calls to unblock
-     various signals one at a time.
-
-     The `sigprocmask' function returns `0' if successful, and `-1' to
-     indicate an error.  The following `errno' error conditions are
-     defined for this function:
-
-    `EINVAL'
-          The HOW argument is invalid.
-
-     You can't block the `SIGKILL' and `SIGSTOP' signals, but if the
-     signal set includes these, `sigprocmask' just ignores them instead
-     of returning an error status.
-
-     Remember, too, that blocking program error signals such as `SIGFPE'
-     leads to undesirable results for signals generated by an actual
-     program error (as opposed to signals sent with `raise' or `kill').
-     This is because your program may be too broken to be able to
-     continue executing to a point where the signal is unblocked again.
-     *Note Program Error Signals::.
-
-
-File: libc.info,  Node: Testing for Delivery,  Next: Blocking for Handler,  Prev: Process Signal Mask,  Up: Blocking Signals
-
-24.7.4 Blocking to Test for Delivery of a Signal
-------------------------------------------------
-
-Now for a simple example.  Suppose you establish a handler for
-`SIGALRM' signals that sets a flag whenever a signal arrives, and your
-main program checks this flag from time to time and then resets it.
-You can prevent additional `SIGALRM' signals from arriving in the
-meantime by wrapping the critical part of the code with calls to
-`sigprocmask', like this:
-
-     /* This variable is set by the SIGALRM signal handler. */
-     volatile sig_atomic_t flag = 0;
-
-     int
-     main (void)
-     {
-       sigset_t block_alarm;
-
-       ...
-
-       /* Initialize the signal mask. */
-       sigemptyset (&block_alarm);
-       sigaddset (&block_alarm, SIGALRM);
-
-       while (1)
-         {
-           /* Check if a signal has arrived; if so, reset the flag. */
-           sigprocmask (SIG_BLOCK, &block_alarm, NULL);
-           if (flag)
-             {
-               ACTIONS-IF-NOT-ARRIVED
-               flag = 0;
-             }
-           sigprocmask (SIG_UNBLOCK, &block_alarm, NULL);
-
-           ...
-         }
-     }
-
-
-File: libc.info,  Node: Blocking for Handler,  Next: Checking for Pending Signals,  Prev: Testing for Delivery,  Up: Blocking Signals
-
-24.7.5 Blocking Signals for a Handler
--------------------------------------
-
-When a signal handler is invoked, you usually want it to be able to
-finish without being interrupted by another signal.  From the moment the
-handler starts until the moment it finishes, you must block signals that
-might confuse it or corrupt its data.
-
-   When a handler function is invoked on a signal, that signal is
-automatically blocked (in addition to any other signals that are already
-in the process's signal mask) during the time the handler is running.
-If you set up a handler for `SIGTSTP', for instance, then the arrival
-of that signal forces further `SIGTSTP' signals to wait during the
-execution of the handler.
-
-   However, by default, other kinds of signals are not blocked; they can
-arrive during handler execution.
-
-   The reliable way to block other kinds of signals during the
-execution of the handler is to use the `sa_mask' member of the
-`sigaction' structure.
-
-   Here is an example:
-
-     #include <signal.h>
-     #include <stddef.h>
-
-     void catch_stop ();
-
-     void
-     install_handler (void)
-     {
-       struct sigaction setup_action;
-       sigset_t block_mask;
-
-       sigemptyset (&block_mask);
-       /* Block other terminal-generated signals while handler runs. */
-       sigaddset (&block_mask, SIGINT);
-       sigaddset (&block_mask, SIGQUIT);
-       setup_action.sa_handler = catch_stop;
-       setup_action.sa_mask = block_mask;
-       setup_action.sa_flags = 0;
-       sigaction (SIGTSTP, &setup_action, NULL);
-     }
-
-   This is more reliable than blocking the other signals explicitly in
-the code for the handler.  If you block signals explicitly in the
-handler, you can't avoid at least a short interval at the beginning of
-the handler where they are not yet blocked.
-
-   You cannot remove signals from the process's current mask using this
-mechanism.  However, you can make calls to `sigprocmask' within your
-handler to block or unblock signals as you wish.
-
-   In any case, when the handler returns, the system restores the mask
-that was in place before the handler was entered.  If any signals that
-become unblocked by this restoration are pending, the process will
-receive those signals immediately, before returning to the code that was
-interrupted.
-
-
-File: libc.info,  Node: Checking for Pending Signals,  Next: Remembering a Signal,  Prev: Blocking for Handler,  Up: Blocking Signals
-
-24.7.6 Checking for Pending Signals
------------------------------------
-
-You can find out which signals are pending at any time by calling
-`sigpending'.  This function is declared in `signal.h'.  
-
- -- Function: int sigpending (sigset_t *SET)
-     Preliminary: | MT-Safe | AS-Unsafe lock/hurd | AC-Unsafe lock/hurd
-     | *Note POSIX Safety Concepts::.
-
-     The `sigpending' function stores information about pending signals
-     in SET.  If there is a pending signal that is blocked from
-     delivery, then that signal is a member of the returned set.  (You
-     can test whether a particular signal is a member of this set using
-     `sigismember'; see *note Signal Sets::.)
-
-     The return value is `0' if successful, and `-1' on failure.
-
-   Testing whether a signal is pending is not often useful.  Testing
-when that signal is not blocked is almost certainly bad design.
-
-   Here is an example.
-
-     #include <signal.h>
-     #include <stddef.h>
-
-     sigset_t base_mask, waiting_mask;
-
-     sigemptyset (&base_mask);
-     sigaddset (&base_mask, SIGINT);
-     sigaddset (&base_mask, SIGTSTP);
-
-     /* Block user interrupts while doing other processing. */
-     sigprocmask (SIG_SETMASK, &base_mask, NULL);
-     ...
-
-     /* After a while, check to see whether any signals are pending. */
-     sigpending (&waiting_mask);
-     if (sigismember (&waiting_mask, SIGINT)) {
-       /* User has tried to kill the process. */
-     }
-     else if (sigismember (&waiting_mask, SIGTSTP)) {
-       /* User has tried to stop the process. */
-     }
-
-   Remember that if there is a particular signal pending for your
-process, additional signals of that same type that arrive in the
-meantime might be discarded.  For example, if a `SIGINT' signal is
-pending when another `SIGINT' signal arrives, your program will
-probably only see one of them when you unblock this signal.
-
-   *Portability Note:* The `sigpending' function is new in POSIX.1.
-Older systems have no equivalent facility.
-
-
-File: libc.info,  Node: Remembering a Signal,  Prev: Checking for Pending Signals,  Up: Blocking Signals
-
-24.7.7 Remembering a Signal to Act On Later
--------------------------------------------
-
-Instead of blocking a signal using the library facilities, you can get
-almost the same results by making the handler set a flag to be tested
-later, when you "unblock".  Here is an example:
-
-     /* If this flag is nonzero, don't handle the signal right away. */
-     volatile sig_atomic_t signal_pending;
-
-     /* This is nonzero if a signal arrived and was not handled. */
-     volatile sig_atomic_t defer_signal;
-
-     void
-     handler (int signum)
-     {
-       if (defer_signal)
-         signal_pending = signum;
-       else
-         ... /* "Really" handle the signal. */
-     }
-
-     ...
-
-     void
-     update_mumble (int frob)
-     {
-       /* Prevent signals from having immediate effect. */
-       defer_signal++;
-       /* Now update `mumble', without worrying about interruption. */
-       mumble.a = 1;
-       mumble.b = hack ();
-       mumble.c = frob;
-       /* We have updated `mumble'.  Handle any signal that came in. */
-       defer_signal--;
-       if (defer_signal == 0 && signal_pending != 0)
-         raise (signal_pending);
-     }
-
-   Note how the particular signal that arrives is stored in
-`signal_pending'.  That way, we can handle several types of
-inconvenient signals with the same mechanism.
-
-   We increment and decrement `defer_signal' so that nested critical
-sections will work properly; thus, if `update_mumble' were called with
-`signal_pending' already nonzero, signals would be deferred not only
-within `update_mumble', but also within the caller.  This is also why
-we do not check `signal_pending' if `defer_signal' is still nonzero.
-
-   The incrementing and decrementing of `defer_signal' each require more
-than one instruction; it is possible for a signal to happen in the
-middle.  But that does not cause any problem.  If the signal happens
-early enough to see the value from before the increment or decrement,
-that is equivalent to a signal which came before the beginning of the
-increment or decrement, which is a case that works properly.
-
-   It is absolutely vital to decrement `defer_signal' before testing
-`signal_pending', because this avoids a subtle bug.  If we did these
-things in the other order, like this,
-
-       if (defer_signal == 1 && signal_pending != 0)
-         raise (signal_pending);
-       defer_signal--;
-
-then a signal arriving in between the `if' statement and the decrement
-would be effectively "lost" for an indefinite amount of time.  The
-handler would merely set `defer_signal', but the program having already
-tested this variable, it would not test the variable again.
-
-   Bugs like these are called "timing errors".  They are especially bad
-because they happen only rarely and are nearly impossible to reproduce.
-You can't expect to find them with a debugger as you would find a
-reproducible bug.  So it is worth being especially careful to avoid
-them.
-
-   (You would not be tempted to write the code in this order, given the
-use of `defer_signal' as a counter which must be tested along with
-`signal_pending'.  After all, testing for zero is cleaner than testing
-for one.  But if you did not use `defer_signal' as a counter, and gave
-it values of zero and one only, then either order might seem equally
-simple.  This is a further advantage of using a counter for
-`defer_signal': it will reduce the chance you will write the code in
-the wrong order and create a subtle bug.)
-
-
-File: libc.info,  Node: Waiting for a Signal,  Next: Signal Stack,  Prev: Blocking Signals,  Up: Signal Handling
-
-24.8 Waiting for a Signal
-=========================
-
-If your program is driven by external events, or uses signals for
-synchronization, then when it has nothing to do it should probably wait
-until a signal arrives.
-
-* Menu:
-
-* Using Pause::                 The simple way, using `pause'.
-* Pause Problems::              Why the simple way is often not very good.
-* Sigsuspend::                  Reliably waiting for a specific signal.
-
-
-File: libc.info,  Node: Using Pause,  Next: Pause Problems,  Up: Waiting for a Signal
-
-24.8.1 Using `pause'
---------------------
-
-The simple way to wait until a signal arrives is to call `pause'.
-Please read about its disadvantages, in the following section, before
-you use it.
-
- -- Function: int pause (void)
-     Preliminary: | MT-Unsafe race:sigprocmask/!bsd!linux | AS-Unsafe
-     lock/hurd | AC-Unsafe lock/hurd | *Note POSIX Safety Concepts::.
-
-     The `pause' function suspends program execution until a signal
-     arrives whose action is either to execute a handler function, or to
-     terminate the process.
-
-     If the signal causes a handler function to be executed, then
-     `pause' returns.  This is considered an unsuccessful return (since
-     "successful" behavior would be to suspend the program forever), so
-     the return value is `-1'.  Even if you specify that other
-     primitives should resume when a system handler returns (*note
-     Interrupted Primitives::), this has no effect on `pause'; it
-     always fails when a signal is handled.
-
-     The following `errno' error conditions are defined for this
-     function:
-
-    `EINTR'
-          The function was interrupted by delivery of a signal.
-
-     If the signal causes program termination, `pause' doesn't return
-     (obviously).
-
-     This function is a cancellation point in multithreaded programs.
-     This is a problem if the thread allocates some resources (like
-     memory, file descriptors, semaphores or whatever) at the time
-     `pause' is called.  If the thread gets cancelled these resources
-     stay allocated until the program ends.  To avoid this calls to
-     `pause' should be protected using cancellation handlers.
-
-     The `pause' function is declared in  `unistd.h'.
-
-
-File: libc.info,  Node: Pause Problems,  Next: Sigsuspend,  Prev: Using Pause,  Up: Waiting for a Signal
-
-24.8.2 Problems with `pause'
-----------------------------
-
-The simplicity of `pause' can conceal serious timing errors that can
-make a program hang mysteriously.
-
-   It is safe to use `pause' if the real work of your program is done
-by the signal handlers themselves, and the "main program" does nothing
-but call `pause'.  Each time a signal is delivered, the handler will do
-the next batch of work that is to be done, and then return, so that the
-main loop of the program can call `pause' again.
-
-   You can't safely use `pause' to wait until one more signal arrives,
-and then resume real work.  Even if you arrange for the signal handler
-to cooperate by setting a flag, you still can't use `pause' reliably.
-Here is an example of this problem:
-
-     /* `usr_interrupt' is set by the signal handler.  */
-     if (!usr_interrupt)
-       pause ();
-
-     /* Do work once the signal arrives.  */
-     ...
-
-This has a bug: the signal could arrive after the variable
-`usr_interrupt' is checked, but before the call to `pause'.  If no
-further signals arrive, the process would never wake up again.
-
-   You can put an upper limit on the excess waiting by using `sleep' in
-a loop, instead of using `pause'.  (*Note Sleeping::, for more about
-`sleep'.)  Here is what this looks like:
-
-     /* `usr_interrupt' is set by the signal handler.
-     while (!usr_interrupt)
-       sleep (1);
-
-     /* Do work once the signal arrives.  */
-     ...
-
-   For some purposes, that is good enough.  But with a little more
-complexity, you can wait reliably until a particular signal handler is
-run, using `sigsuspend'.  *Note Sigsuspend::.
-
-
-File: libc.info,  Node: Sigsuspend,  Prev: Pause Problems,  Up: Waiting for a Signal
-
-24.8.3 Using `sigsuspend'
--------------------------
-
-The clean and reliable way to wait for a signal to arrive is to block it
-and then use `sigsuspend'.  By using `sigsuspend' in a loop, you can
-wait for certain kinds of signals, while letting other kinds of signals
-be handled by their handlers.
-
- -- Function: int sigsuspend (const sigset_t *SET)
-     Preliminary: | MT-Unsafe race:sigprocmask/!bsd!linux | AS-Unsafe
-     lock/hurd | AC-Unsafe lock/hurd | *Note POSIX Safety Concepts::.
-
-     This function replaces the process's signal mask with SET and then
-     suspends the process until a signal is delivered whose action is
-     either to terminate the process or invoke a signal handling
-     function.  In other words, the program is effectively suspended
-     until one of the signals that is not a member of SET arrives.
-
-     If the process is woken up by delivery of a signal that invokes a
-     handler function, and the handler function returns, then
-     `sigsuspend' also returns.
-
-     The mask remains SET only as long as `sigsuspend' is waiting.  The
-     function `sigsuspend' always restores the previous signal mask
-     when it returns.
-
-     The return value and error conditions are the same as for `pause'.
-
-   With `sigsuspend', you can replace the `pause' or `sleep' loop in
-the previous section with something completely reliable:
-
-     sigset_t mask, oldmask;
-
-     ...
-
-     /* Set up the mask of signals to temporarily block. */
-     sigemptyset (&mask);
-     sigaddset (&mask, SIGUSR1);
-
-     ...
-
-     /* Wait for a signal to arrive. */
-     sigprocmask (SIG_BLOCK, &mask, &oldmask);
-     while (!usr_interrupt)
-       sigsuspend (&oldmask);
-     sigprocmask (SIG_UNBLOCK, &mask, NULL);
-
-   This last piece of code is a little tricky.  The key point to
-remember here is that when `sigsuspend' returns, it resets the process's
-signal mask to the original value, the value from before the call to
-`sigsuspend'--in this case, the `SIGUSR1' signal is once again blocked.
-The second call to `sigprocmask' is necessary to explicitly unblock
-this signal.
-
-   One other point: you may be wondering why the `while' loop is
-necessary at all, since the program is apparently only waiting for one
-`SIGUSR1' signal.  The answer is that the mask passed to `sigsuspend'
-permits the process to be woken up by the delivery of other kinds of
-signals, as well--for example, job control signals.  If the process is
-woken up by a signal that doesn't set `usr_interrupt', it just suspends
-itself again until the "right" kind of signal eventually arrives.
-
-   This technique takes a few more lines of preparation, but that is
-needed just once for each kind of wait criterion you want to use.  The
-code that actually waits is just four lines.
-
-
-File: libc.info,  Node: Signal Stack,  Next: BSD Signal Handling,  Prev: Waiting for a Signal,  Up: Signal Handling
-
-24.9 Using a Separate Signal Stack
-==================================
-
-A signal stack is a special area of memory to be used as the execution
-stack during signal handlers.  It should be fairly large, to avoid any
-danger that it will overflow in turn; the macro `SIGSTKSZ' is defined
-to a canonical size for signal stacks.  You can use `malloc' to
-allocate the space for the stack.  Then call `sigaltstack' or
-`sigstack' to tell the system to use that space for the signal stack.
-
-   You don't need to write signal handlers differently in order to use a
-signal stack.  Switching from one stack to the other happens
-automatically.  (Some non-GNU debuggers on some machines may get
-confused if you examine a stack trace while a handler that uses the
-signal stack is running.)
-
-   There are two interfaces for telling the system to use a separate
-signal stack.  `sigstack' is the older interface, which comes from 4.2
-BSD.  `sigaltstack' is the newer interface, and comes from 4.4 BSD.
-The `sigaltstack' interface has the advantage that it does not require
-your program to know which direction the stack grows, which depends on
-the specific machine and operating system.
-
- -- Data Type: stack_t
-     This structure describes a signal stack.  It contains the
-     following members:
-
-    `void *ss_sp'
-          This points to the base of the signal stack.
-
-    `size_t ss_size'
-          This is the size (in bytes) of the signal stack which `ss_sp'
-          points to.  You should set this to however much space you
-          allocated for the stack.
-
-          There are two macros defined in `signal.h' that you should
-          use in calculating this size:
-
-         `SIGSTKSZ'
-               This is the canonical size for a signal stack.  It is
-               judged to be sufficient for normal uses.
-
-         `MINSIGSTKSZ'
-               This is the amount of signal stack space the operating
-               system needs just to implement signal delivery.  The
-               size of a signal stack *must* be greater than this.
-
-               For most cases, just using `SIGSTKSZ' for `ss_size' is
-               sufficient.  But if you know how much stack space your
-               program's signal handlers will need, you may want to use
-               a different size.  In this case, you should allocate
-               `MINSIGSTKSZ' additional bytes for the signal stack and
-               increase `ss_size' accordingly.
-
-    `int ss_flags'
-          This field contains the bitwise OR of these flags:
-
-         `SS_DISABLE'
-               This tells the system that it should not use the signal
-               stack.
-
-         `SS_ONSTACK'
-               This is set by the system, and indicates that the signal
-               stack is currently in use.  If this bit is not set, then
-               signals will be delivered on the normal user stack.
-
- -- Function: int sigaltstack (const stack_t *restrict STACK, stack_t
-          *restrict OLDSTACK)
-     Preliminary: | MT-Safe | AS-Unsafe lock/hurd | AC-Unsafe lock/hurd
-     | *Note POSIX Safety Concepts::.
-
-     The `sigaltstack' function specifies an alternate stack for use
-     during signal handling.  When a signal is received by the process
-     and its action indicates that the signal stack is used, the system
-     arranges a switch to the currently installed signal stack while
-     the handler for that signal is executed.
-
-     If OLDSTACK is not a null pointer, information about the currently
-     installed signal stack is returned in the location it points to.
-     If STACK is not a null pointer, then this is installed as the new
-     stack for use by signal handlers.
-
-     The return value is `0' on success and `-1' on failure.  If
-     `sigaltstack' fails, it sets `errno' to one of these values:
-
-    `EINVAL'
-          You tried to disable a stack that was in fact currently in
-          use.
-
-    `ENOMEM'
-          The size of the alternate stack was too small.  It must be
-          greater than `MINSIGSTKSZ'.
-
-   Here is the older `sigstack' interface.  You should use
-`sigaltstack' instead on systems that have it.
-
- -- Data Type: struct sigstack
-     This structure describes a signal stack.  It contains the
-     following members:
-
-    `void *ss_sp'
-          This is the stack pointer.  If the stack grows downwards on
-          your machine, this should point to the top of the area you
-          allocated.  If the stack grows upwards, it should point to
-          the bottom.
-
-    `int ss_onstack'
-          This field is true if the process is currently using this
-          stack.
-
- -- Function: int sigstack (struct sigstack *STACK, struct sigstack
-          *OLDSTACK)
-     Preliminary: | MT-Safe | AS-Unsafe lock/hurd | AC-Unsafe lock/hurd
-     | *Note POSIX Safety Concepts::.
-
-     The `sigstack' function specifies an alternate stack for use during
-     signal handling.  When a signal is received by the process and its
-     action indicates that the signal stack is used, the system
-     arranges a switch to the currently installed signal stack while
-     the handler for that signal is executed.
-
-     If OLDSTACK is not a null pointer, information about the currently
-     installed signal stack is returned in the location it points to.
-     If STACK is not a null pointer, then this is installed as the new
-     stack for use by signal handlers.
-
-     The return value is `0' on success and `-1' on failure.
-
-
-File: libc.info,  Node: BSD Signal Handling,  Prev: Signal Stack,  Up: Signal Handling
-
-24.10 BSD Signal Handling
-=========================
-
-This section describes alternative signal handling functions derived
-from BSD Unix.  These facilities were an advance, in their time; today,
-they are mostly obsolete, and supported mainly for compatibility with
-BSD Unix.
-
-   There are many similarities between the BSD and POSIX signal handling
-facilities, because the POSIX facilities were inspired by the BSD
-facilities.  Besides having different names for all the functions to
-avoid conflicts, the main differences between the two are:
-
-   * BSD Unix represents signal masks as an `int' bit mask, rather than
-     as a `sigset_t' object.
-
-   * The BSD facilities use a different default for whether an
-     interrupted primitive should fail or resume.  The POSIX facilities
-     make system calls fail unless you specify that they should resume.
-     With the BSD facility, the default is to make system calls resume
-     unless you say they should fail.  *Note Interrupted Primitives::.
-
-   The BSD facilities are declared in `signal.h'.  
-
-* Menu:
-
-* BSD Handler::                 BSD Function to Establish a Handler.
-* Blocking in BSD::             BSD Functions for Blocking Signals.
-
-
-File: libc.info,  Node: BSD Handler,  Next: Blocking in BSD,  Up: BSD Signal Handling
-
-24.10.1 BSD Function to Establish a Handler
--------------------------------------------
-
- -- Data Type: struct sigvec
-     This data type is the BSD equivalent of `struct sigaction' (*note
-     Advanced Signal Handling::); it is used to specify signal actions
-     to the `sigvec' function.  It contains the following members:
-
-    `sighandler_t sv_handler'
-          This is the handler function.
-
-    `int sv_mask'
-          This is the mask of additional signals to be blocked while
-          the handler function is being called.
-
-    `int sv_flags'
-          This is a bit mask used to specify various flags which affect
-          the behavior of the signal.  You can also refer to this field
-          as `sv_onstack'.
-
-These symbolic constants can be used to provide values for the
-`sv_flags' field of a `sigvec' structure.  This field is a bit mask
-value, so you bitwise-OR the flags of interest to you together.
-
- -- Macro: int SV_ONSTACK
-     If this bit is set in the `sv_flags' field of a `sigvec'
-     structure, it means to use the signal stack when delivering the
-     signal.
-
- -- Macro: int SV_INTERRUPT
-     If this bit is set in the `sv_flags' field of a `sigvec'
-     structure, it means that system calls interrupted by this kind of
-     signal should not be restarted if the handler returns; instead,
-     the system calls should return with a `EINTR' error status.  *Note
-     Interrupted Primitives::.
-
- -- Macro: int SV_RESETHAND
-     If this bit is set in the `sv_flags' field of a `sigvec'
-     structure, it means to reset the action for the signal back to
-     `SIG_DFL' when the signal is received.
-
- -- Function: int sigvec (int SIGNUM, const struct sigvec *ACTION,
-          struct sigvec *OLD-ACTION)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is the equivalent of `sigaction' (*note Advanced
-     Signal Handling::); it installs the action ACTION for the signal
-     SIGNUM, returning information about the previous action in effect
-     for that signal in OLD-ACTION.
-
- -- Function: int siginterrupt (int SIGNUM, int FAILFLAG)
-     Preliminary: | MT-Unsafe const:sigintr | AS-Unsafe | AC-Unsafe
-     corrupt | *Note POSIX Safety Concepts::.
-
-     This function specifies which approach to use when certain
-     primitives are interrupted by handling signal SIGNUM.  If FAILFLAG
-     is false, signal SIGNUM restarts primitives.  If FAILFLAG is true,
-     handling SIGNUM causes these primitives to fail with error code
-     `EINTR'.  *Note Interrupted Primitives::.
-
-
-File: libc.info,  Node: Blocking in BSD,  Prev: BSD Handler,  Up: BSD Signal Handling
-
-24.10.2 BSD Functions for Blocking Signals
-------------------------------------------
-
- -- Macro: int sigmask (int SIGNUM)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro returns a signal mask that has the bit for signal SIGNUM
-     set.  You can bitwise-OR the results of several calls to `sigmask'
-     together to specify more than one signal.  For example,
-
-          (sigmask (SIGTSTP) | sigmask (SIGSTOP)
-           | sigmask (SIGTTIN) | sigmask (SIGTTOU))
-
-     specifies a mask that includes all the job-control stop signals.
-
- -- Function: int sigblock (int MASK)
-     Preliminary: | MT-Safe | AS-Unsafe lock/hurd | AC-Unsafe lock/hurd
-     | *Note POSIX Safety Concepts::.
-
-     This function is equivalent to `sigprocmask' (*note Process Signal
-     Mask::) with a HOW argument of `SIG_BLOCK': it adds the signals
-     specified by MASK to the calling process's set of blocked signals.
-     The return value is the previous set of blocked signals.
-
- -- Function: int sigsetmask (int MASK)
-     Preliminary: | MT-Safe | AS-Unsafe lock/hurd | AC-Unsafe lock/hurd
-     | *Note POSIX Safety Concepts::.
-
-     This function equivalent to `sigprocmask' (*note Process Signal
-     Mask::) with a HOW argument of `SIG_SETMASK': it sets the calling
-     process's signal mask to MASK.  The return value is the previous
-     set of blocked signals.
-
- -- Function: int sigpause (int MASK)
-     Preliminary: | MT-Unsafe race:sigprocmask/!bsd!linux | AS-Unsafe
-     lock/hurd | AC-Unsafe lock/hurd | *Note POSIX Safety Concepts::.
-
-     This function is the equivalent of `sigsuspend' (*note Waiting for
-     a Signal::):  it sets the calling process's signal mask to MASK,
-     and waits for a signal to arrive.  On return the previous set of
-     blocked signals is restored.
-
-
-File: libc.info,  Node: Program Basics,  Next: Processes,  Prev: Signal Handling,  Up: Top
-
-25 The Basic Program/System Interface
-*************************************
-
-"Processes" are the primitive units for allocation of system resources.
-Each process has its own address space and (usually) one thread of
-control.  A process executes a program; you can have multiple processes
-executing the same program, but each process has its own copy of the
-program within its own address space and executes it independently of
-the other copies.  Though it may have multiple threads of control
-within the same program and a program may be composed of multiple
-logically separate modules, a process always executes exactly one
-program.
-
-   Note that we are using a specific definition of "program" for the
-purposes of this manual, which corresponds to a common definition in the
-context of Unix system.  In popular usage, "program" enjoys a much
-broader definition; it can refer for example to a system's kernel, an
-editor macro, a complex package of software, or a discrete section of
-code executing within a process.
-
-   Writing the program is what this manual is all about.  This chapter
-explains the most basic interface between your program and the system
-that runs, or calls, it.  This includes passing of parameters (arguments
-and environment) from the system, requesting basic services from the
-system, and telling the system the program is done.
-
-   A program starts another program with the `exec' family of system
-calls.  This chapter looks at program startup from the execee's point
-of view.  To see the event from the execor's point of view, see *note
-Executing a File::.
-
-* Menu:
-
-* Program Arguments::           Parsing your program's command-line arguments
-* Environment Variables::       Less direct parameters affecting your program
-* Auxiliary Vector::            Least direct parameters affecting your program
-* System Calls::                Requesting service from the system
-* Program Termination::         Telling the system you're done; return status
-
-
-File: libc.info,  Node: Program Arguments,  Next: Environment Variables,  Up: Program Basics
-
-25.1 Program Arguments
-======================
-
-The system starts a C program by calling the function `main'.  It is up
-to you to write a function named `main'--otherwise, you won't even be
-able to link your program without errors.
-
-   In ISO C you can define `main' either to take no arguments, or to
-take two arguments that represent the command line arguments to the
-program, like this:
-
-     int main (int ARGC, char *ARGV[])
-
-   The command line arguments are the whitespace-separated tokens given
-in the shell command used to invoke the program; thus, in `cat foo
-bar', the arguments are `foo' and `bar'.  The only way a program can
-look at its command line arguments is via the arguments of `main'.  If
-`main' doesn't take arguments, then you cannot get at the command line.
-
-   The value of the ARGC argument is the number of command line
-arguments.  The ARGV argument is a vector of C strings; its elements
-are the individual command line argument strings.  The file name of the
-program being run is also included in the vector as the first element;
-the value of ARGC counts this element.  A null pointer always follows
-the last element: `ARGV[ARGC]' is this null pointer.
-
-   For the command `cat foo bar', ARGC is 3 and ARGV has three
-elements, `"cat"', `"foo"' and `"bar"'.
-
-   In Unix systems you can define `main' a third way, using three
-arguments:
-
-     int main (int ARGC, char *ARGV[], char *ENVP[])
-
-   The first two arguments are just the same.  The third argument ENVP
-gives the program's environment; it is the same as the value of
-`environ'.  *Note Environment Variables::.  POSIX.1 does not allow this
-three-argument form, so to be portable it is best to write `main' to
-take two arguments, and use the value of `environ'.
-
-* Menu:
-
-* Argument Syntax::             By convention, options start with a hyphen.
-* Parsing Program Arguments::   Ways to parse program options and arguments.
-
-
-File: libc.info,  Node: Argument Syntax,  Next: Parsing Program Arguments,  Up: Program Arguments
-
-25.1.1 Program Argument Syntax Conventions
-------------------------------------------
-
-POSIX recommends these conventions for command line arguments.
-`getopt' (*note Getopt::) and `argp_parse' (*note Argp::) make it easy
-to implement them.
-
-   * Arguments are options if they begin with a hyphen delimiter (`-').
-
-   * Multiple options may follow a hyphen delimiter in a single token if
-     the options do not take arguments.  Thus, `-abc' is equivalent to
-     `-a -b -c'.
-
-   * Option names are single alphanumeric characters (as for `isalnum';
-     *note Classification of Characters::).
-
-   * Certain options require an argument.  For example, the `-o' command
-     of the `ld' command requires an argument--an output file name.
-
-   * An option and its argument may or may not appear as separate
-     tokens.  (In other words, the whitespace separating them is
-     optional.)  Thus, `-o foo' and `-ofoo' are equivalent.
-
-   * Options typically precede other non-option arguments.
-
-     The implementations of `getopt' and `argp_parse' in the GNU C
-     Library normally make it appear as if all the option arguments were
-     specified before all the non-option arguments for the purposes of
-     parsing, even if the user of your program intermixed option and
-     non-option arguments.  They do this by reordering the elements of
-     the ARGV array.  This behavior is nonstandard; if you want to
-     suppress it, define the `_POSIX_OPTION_ORDER' environment variable.
-     *Note Standard Environment::.
-
-   * The argument `--' terminates all options; any following arguments
-     are treated as non-option arguments, even if they begin with a
-     hyphen.
-
-   * A token consisting of a single hyphen character is interpreted as
-     an ordinary non-option argument.  By convention, it is used to
-     specify input from or output to the standard input and output
-     streams.
-
-   * Options may be supplied in any order, or appear multiple times.
-     The interpretation is left up to the particular application
-     program.
-
-   GNU adds "long options" to these conventions.  Long options consist
-of `--' followed by a name made of alphanumeric characters and dashes.
-Option names are typically one to three words long, with hyphens to
-separate words.  Users can abbreviate the option names as long as the
-abbreviations are unique.
-
-   To specify an argument for a long option, write `--NAME=VALUE'.
-This syntax enables a long option to accept an argument that is itself
-optional.
-
-   Eventually, GNU systems will provide completion for long option names
-in the shell.
-
-
-File: libc.info,  Node: Parsing Program Arguments,  Prev: Argument Syntax,  Up: Program Arguments
-
-25.1.2 Parsing Program Arguments
---------------------------------
-
-If the syntax for the command line arguments to your program is simple
-enough, you can simply pick the arguments off from ARGV by hand.  But
-unless your program takes a fixed number of arguments, or all of the
-arguments are interpreted in the same way (as file names, for example),
-you are usually better off using `getopt' (*note Getopt::) or
-`argp_parse' (*note Argp::) to do the parsing.
-
-   `getopt' is more standard (the short-option only version of it is a
-part of the POSIX standard), but using `argp_parse' is often easier,
-both for very simple and very complex option structures, because it
-does more of the dirty work for you.
-
-* Menu:
-
-* Getopt::                      Parsing program options using `getopt'.
-* Argp::                        Parsing program options using `argp_parse'.
-* Suboptions::                  Some programs need more detailed options.
-* Suboptions Example::          This shows how it could be done for `mount'.
-
-
-File: libc.info,  Node: Getopt,  Next: Argp,  Up: Parsing Program Arguments
-
-25.2 Parsing program options using `getopt'
-===========================================
-
-The `getopt' and `getopt_long' functions automate some of the chore
-involved in parsing typical unix command line options.
-
-* Menu:
-
-* Using Getopt::                Using the `getopt' function.
-* Example of Getopt::           An example of parsing options with `getopt'.
-* Getopt Long Options::         GNU suggests utilities accept long-named
-                                 options; here is one way to do.
-* Getopt Long Option Example::  An example of using `getopt_long'.
-
-
-File: libc.info,  Node: Using Getopt,  Next: Example of Getopt,  Up: Getopt
-
-25.2.1 Using the `getopt' function
+17.8.1 Allocating Pseudo-Terminals
 ----------------------------------
 
-Here are the details about how to call the `getopt' function.  To use
-this facility, your program must include the header file `unistd.h'.  
+This subsection describes functions for allocating a pseudo-terminal,
+and for making this pseudo-terminal available for actual use.  These
+functions are declared in the header file 'stdlib.h'.
 
- -- Variable: int opterr
-     If the value of this variable is nonzero, then `getopt' prints an
-     error message to the standard error stream if it encounters an
-     unknown option character or an option with a missing required
-     argument.  This is the default behavior.  If you set this variable
-     to zero, `getopt' does not print any messages, but it still
-     returns the character `?' to indicate an error.
-
- -- Variable: int optopt
-     When `getopt' encounters an unknown option character or an option
-     with a missing required argument, it stores that option character
-     in this variable.  You can use this for providing your own
-     diagnostic messages.
-
- -- Variable: int optind
-     This variable is set by `getopt' to the index of the next element
-     of the ARGV array to be processed.  Once `getopt' has found all of
-     the option arguments, you can use this variable to determine where
-     the remaining non-option arguments begin.  The initial value of
-     this variable is `1'.
-
- -- Variable: char * optarg
-     This variable is set by `getopt' to point at the value of the
-     option argument, for those options that accept arguments.
-
- -- Function: int getopt (int ARGC, char *const *ARGV, const char
-          *OPTIONS)
-     Preliminary: | MT-Unsafe race:getopt env | AS-Unsafe heap i18n
-     lock corrupt | AC-Unsafe mem lock corrupt | *Note POSIX Safety
+ -- Function: int getpt (void)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
      Concepts::.
 
-     The `getopt' function gets the next option argument from the
-     argument list specified by the ARGV and ARGC arguments.  Normally
-     these values come directly from the arguments received by `main'.
+     The 'getpt' function returns a new file descriptor for the next
+     available master pseudo-terminal.  The normal return value from
+     'getpt' is a non-negative integer file descriptor.  In the case of
+     an error, a value of -1 is returned instead.  The following 'errno'
+     conditions are defined for this function:
 
-     The OPTIONS argument is a string that specifies the option
-     characters that are valid for this program.  An option character
-     in this string can be followed by a colon (`:') to indicate that
-     it takes a required argument.  If an option character is followed
-     by two colons (`::'), its argument is optional; this is a GNU
-     extension.
+     'ENOENT'
+          There are no free master pseudo-terminals available.
 
-     `getopt' has three ways to deal with options that follow
-     non-options ARGV elements.  The special argument `--' forces in
-     all cases the end of option scanning.
+     This function is a GNU extension.
 
-        * The default is to permute the contents of ARGV while scanning
-          it so that eventually all the non-options are at the end.
-          This allows options to be given in any order, even with
-          programs that were not written to expect this.
+ -- Function: int grantpt (int FILEDES)
+     Preliminary: | MT-Safe locale | AS-Unsafe dlopen plugin heap lock |
+     AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
 
-        * If the OPTIONS argument string begins with a hyphen (`-'),
-          this is treated specially.  It permits arguments that are not
-          options to be returned as if they were associated with option
-          character `\1'.
+     The 'grantpt' function changes the ownership and access permission
+     of the slave pseudo-terminal device corresponding to the master
+     pseudo-terminal device associated with the file descriptor FILEDES.
+     The owner is set from the real user ID of the calling process
+     (*note Process Persona::), and the group is set to a special group
+     (typically "tty") or from the real group ID of the calling process.
+     The access permission is set such that the file is both readable
+     and writable by the owner and only writable by the group.
 
-        * POSIX demands the following behavior: The first non-option
-          stops option processing.  This mode is selected by either
-          setting the environment variable `POSIXLY_CORRECT' or
-          beginning the OPTIONS argument string with a plus sign (`+').
+     On some systems this function is implemented by invoking a special
+     'setuid' root program (*note How Change Persona::).  As a
+     consequence, installing a signal handler for the 'SIGCHLD' signal
+     (*note Job Control Signals::) may interfere with a call to
+     'grantpt'.
 
-     The `getopt' function returns the option character for the next
-     command line option.  When no more option arguments are available,
-     it returns `-1'.  There may still be more non-option arguments; you
-     must compare the external variable `optind' against the ARGC
-     parameter to check this.
+     The normal return value from 'grantpt' is 0; a value of -1 is
+     returned in case of failure.  The following 'errno' error
+     conditions are defined for this function:
 
-     If the option has an argument, `getopt' returns the argument by
-     storing it in the variable OPTARG.  You don't ordinarily need to
-     copy the `optarg' string, since it is a pointer into the original
-     ARGV array, not into a static area that might be overwritten.
+     'EBADF'
+          The FILEDES argument is not a valid file descriptor.
 
-     If `getopt' finds an option character in ARGV that was not
-     included in OPTIONS, or a missing option argument, it returns `?'
-     and sets the external variable `optopt' to the actual option
-     character.  If the first character of OPTIONS is a colon (`:'),
-     then `getopt' returns `:' instead of `?' to indicate a missing
-     option argument.  In addition, if the external variable `opterr'
-     is nonzero (which is the default), `getopt' prints an error
-     message.
+     'EINVAL'
+          The FILEDES argument is not associated with a master
+          pseudo-terminal device.
 
-
-File: libc.info,  Node: Example of Getopt,  Next: Getopt Long Options,  Prev: Using Getopt,  Up: Getopt
+     'EACCES'
+          The slave pseudo-terminal device corresponding to the master
+          associated with FILEDES could not be accessed.
 
-25.2.2 Example of Parsing Arguments with `getopt'
--------------------------------------------------
+ -- Function: int unlockpt (int FILEDES)
+     Preliminary: | MT-Safe | AS-Unsafe heap/bsd | AC-Unsafe mem fd |
+     *Note POSIX Safety Concepts::.
 
-Here is an example showing how `getopt' is typically used.  The key
-points to notice are:
+     The 'unlockpt' function unlocks the slave pseudo-terminal device
+     corresponding to the master pseudo-terminal device associated with
+     the file descriptor FILEDES.  On many systems, the slave can only
+     be opened after unlocking, so portable applications should always
+     call 'unlockpt' before trying to open the slave.
 
-   * Normally, `getopt' is called in a loop.  When `getopt' returns
-     `-1', indicating no more options are present, the loop terminates.
+     The normal return value from 'unlockpt' is 0; a value of -1 is
+     returned in case of failure.  The following 'errno' error
+     conditions are defined for this function:
 
-   * A `switch' statement is used to dispatch on the return value from
-     `getopt'.  In typical use, each case just sets a variable that is
-     used later in the program.
+     'EBADF'
+          The FILEDES argument is not a valid file descriptor.
 
-   * A second loop is used to process the remaining non-option
-     arguments.
+     'EINVAL'
+          The FILEDES argument is not associated with a master
+          pseudo-terminal device.
 
+ -- Function: char * ptsname (int FILEDES)
+     Preliminary: | MT-Unsafe race:ptsname | AS-Unsafe heap/bsd |
+     AC-Unsafe mem fd | *Note POSIX Safety Concepts::.
 
-     #include <ctype.h>
-     #include <stdio.h>
-     #include <stdlib.h>
-     #include <unistd.h>
+     If the file descriptor FILEDES is associated with a master
+     pseudo-terminal device, the 'ptsname' function returns a pointer to
+     a statically-allocated, null-terminated string containing the file
+     name of the associated slave pseudo-terminal file.  This string
+     might be overwritten by subsequent calls to 'ptsname'.
 
+ -- Function: int ptsname_r (int FILEDES, char *BUF, size_t LEN)
+     Preliminary: | MT-Safe | AS-Unsafe heap/bsd | AC-Unsafe mem fd |
+     *Note POSIX Safety Concepts::.
+
+     The 'ptsname_r' function is similar to the 'ptsname' function
+     except that it places its result into the user-specified buffer
+     starting at BUF with length LEN.
+
+     This function is a GNU extension.
+
+   *Portability Note:* On System V derived systems, the file returned by
+the 'ptsname' and 'ptsname_r' functions may be STREAMS-based, and
+therefore require additional processing after opening before it actually
+behaves as a pseudo terminal.
+
+   Typical usage of these functions is illustrated by the following
+example:
      int
-     main (int argc, char **argv)
+     open_pty_pair (int *amaster, int *aslave)
      {
-       int aflag = 0;
-       int bflag = 0;
-       char *cvalue = NULL;
-       int index;
-       int c;
+       int master, slave;
+       char *name;
 
-       opterr = 0;
+       master = getpt ();
+       if (master < 0)
+         return 0;
 
-       while ((c = getopt (argc, argv, "abc:")) != -1)
-         switch (c)
-           {
-           case 'a':
-             aflag = 1;
-             break;
-           case 'b':
-             bflag = 1;
-             break;
-           case 'c':
-             cvalue = optarg;
-             break;
-           case '?':
-             if (optopt == 'c')
-               fprintf (stderr, "Option -%c requires an argument.\n", optopt);
-             else if (isprint (optopt))
-               fprintf (stderr, "Unknown option `-%c'.\n", optopt);
-             else
-               fprintf (stderr,
-                        "Unknown option character `\\x%x'.\n",
-                        optopt);
-             return 1;
-           default:
-             abort ();
-           }
+       if (grantpt (master) < 0 || unlockpt (master) < 0)
+         goto close_master;
+       name = ptsname (master);
+       if (name == NULL)
+         goto close_master;
 
-       printf ("aflag = %d, bflag = %d, cvalue = %s\n",
-               aflag, bflag, cvalue);
+       slave = open (name, O_RDWR);
+       if (slave == -1)
+         goto close_master;
 
-       for (index = optind; index < argc; index++)
-         printf ("Non-option argument %s\n", argv[index]);
+       if (isastream (slave))
+         {
+           if (ioctl (slave, I_PUSH, "ptem") < 0
+               || ioctl (slave, I_PUSH, "ldterm") < 0)
+             goto close_slave;
+         }
+
+       *amaster = master;
+       *aslave = slave;
+       return 1;
+
+     close_slave:
+       close (slave);
+
+     close_master:
+       close (master);
        return 0;
      }
 
-   Here are some examples showing what this program prints with
-different combinations of arguments:
+
+File: libc.info,  Node: Pseudo-Terminal Pairs,  Prev: Allocation,  Up: Pseudo-Terminals
 
-     % testopt
-     aflag = 0, bflag = 0, cvalue = (null)
+17.8.2 Opening a Pseudo-Terminal Pair
+-------------------------------------
 
-     % testopt -a -b
-     aflag = 1, bflag = 1, cvalue = (null)
+These functions, derived from BSD, are available in the separate
+'libutil' library, and declared in 'pty.h'.
 
-     % testopt -ab
-     aflag = 1, bflag = 1, cvalue = (null)
+ -- Function: int openpty (int *AMASTER, int *ASLAVE, char *NAME, const
+          struct termios *TERMP, const struct winsize *WINP)
+     Preliminary: | MT-Safe locale | AS-Unsafe dlopen plugin heap lock |
+     AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
 
-     % testopt -c foo
-     aflag = 0, bflag = 0, cvalue = foo
+     This function allocates and opens a pseudo-terminal pair, returning
+     the file descriptor for the master in *AMASTER, and the file
+     descriptor for the slave in *ASLAVE.  If the argument NAME is not a
+     null pointer, the file name of the slave pseudo-terminal device is
+     stored in '*name'.  If TERMP is not a null pointer, the terminal
+     attributes of the slave are set to the ones specified in the
+     structure that TERMP points to (*note Terminal Modes::).  Likewise,
+     if the WINP is not a null pointer, the screen size of the slave is
+     set to the values specified in the structure that WINP points to.
 
-     % testopt -cfoo
-     aflag = 0, bflag = 0, cvalue = foo
+     The normal return value from 'openpty' is 0; a value of -1 is
+     returned in case of failure.  The following 'errno' conditions are
+     defined for this function:
 
-     % testopt arg1
-     aflag = 0, bflag = 0, cvalue = (null)
-     Non-option argument arg1
+     'ENOENT'
+          There are no free pseudo-terminal pairs available.
 
-     % testopt -a arg1
-     aflag = 1, bflag = 0, cvalue = (null)
-     Non-option argument arg1
+     *Warning:* Using the 'openpty' function with NAME not set to 'NULL'
+     is *very dangerous* because it provides no protection against
+     overflowing the string NAME.  You should use the 'ttyname' function
+     on the file descriptor returned in *SLAVE to find out the file name
+     of the slave pseudo-terminal device instead.
 
-     % testopt -c foo arg1
-     aflag = 0, bflag = 0, cvalue = foo
-     Non-option argument arg1
+ -- Function: int forkpty (int *AMASTER, char *NAME, const struct
+          termios *TERMP, const struct winsize *WINP)
+     Preliminary: | MT-Safe locale | AS-Unsafe dlopen plugin heap lock |
+     AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
 
-     % testopt -a -- -b
-     aflag = 1, bflag = 0, cvalue = (null)
-     Non-option argument -b
+     This function is similar to the 'openpty' function, but in
+     addition, forks a new process (*note Creating a Process::) and
+     makes the newly opened slave pseudo-terminal device the controlling
+     terminal (*note Controlling Terminal::) for the child process.
 
-     % testopt -a -
-     aflag = 1, bflag = 0, cvalue = (null)
-     Non-option argument -
+     If the operation is successful, there are then both parent and
+     child processes and both see 'forkpty' return, but with different
+     values: it returns a value of 0 in the child process and returns
+     the child's process ID in the parent process.
+
+     If the allocation of a pseudo-terminal pair or the process creation
+     failed, 'forkpty' returns a value of -1 in the parent process.
+
+     *Warning:* The 'forkpty' function has the same problems with
+     respect to the NAME argument as 'openpty'.
 
 
-File: libc.info,  Node: Getopt Long Options,  Next: Getopt Long Option Example,  Prev: Example of Getopt,  Up: Getopt
+File: libc.info,  Node: Syslog,  Next: Mathematics,  Prev: Low-Level Terminal Interface,  Up: Top
 
-25.2.3 Parsing Long Options with `getopt_long'
-----------------------------------------------
+18 Syslog
+*********
 
-To accept GNU-style long options as well as single-character options,
-use `getopt_long' instead of `getopt'.  This function is declared in
-`getopt.h', not `unistd.h'.  You should make every program accept long
-options if it uses any options, for this takes little extra work and
-helps beginners remember how to use the program.
+This chapter describes facilities for issuing and logging messages of
+system administration interest.  This chapter has nothing to do with
+programs issuing messages to their own users or keeping private logs
+(One would typically do that with the facilities described in *note I/O
+on Streams::).
 
- -- Data Type: struct option
-     This structure describes a single long option name for the sake of
-     `getopt_long'.  The argument LONGOPTS must be an array of these
-     structures, one for each long option.  Terminate the array with an
-     element containing all zeros.
+   Most systems have a facility called "Syslog" that allows programs to
+submit messages of interest to system administrators and can be
+configured to pass these messages on in various ways, such as printing
+on the console, mailing to a particular person, or recording in a log
+file for future reference.
 
-     The `struct option' structure has these fields:
+   A program uses the facilities in this chapter to submit such
+messages.
 
-    `const char *name'
-          This field is the name of the option.  It is a string.
+* Menu:
 
-    `int has_arg'
-          This field says whether the option takes an argument.  It is
-          an integer, and there are three legitimate values:
-          `no_argument', `required_argument' and `optional_argument'.
+* Overview of Syslog::           Overview of a system's Syslog facility
+* Submitting Syslog Messages::   Functions to submit messages to Syslog
 
-    `int *flag'
-    `int val'
-          These fields control how to report or act on the option when
-          it occurs.
+
+File: libc.info,  Node: Overview of Syslog,  Next: Submitting Syslog Messages,  Up: Syslog
 
-          If `flag' is a null pointer, then the `val' is a value which
-          identifies this option.  Often these values are chosen to
-          uniquely identify particular long options.
+18.1 Overview of Syslog
+=======================
 
-          If `flag' is not a null pointer, it should be the address of
-          an `int' variable which is the flag for this option.  The
-          value in `val' is the value to store in the flag to indicate
-          that the option was seen.
+System administrators have to deal with lots of different kinds of
+messages from a plethora of subsystems within each system, and usually
+lots of systems as well.  For example, an FTP server might report every
+connection it gets.  The kernel might report hardware failures on a disk
+drive.  A DNS server might report usage statistics at regular intervals.
 
- -- Function: int getopt_long (int ARGC, char *const *ARGV, const char
-          *SHORTOPTS, const struct option *LONGOPTS, int *INDEXPTR)
-     Preliminary: | MT-Unsafe race:getopt env | AS-Unsafe heap i18n
-     lock corrupt | AC-Unsafe mem lock corrupt | *Note POSIX Safety
+   Some of these messages need to be brought to a system administrator's
+attention immediately.  And it may not be just any system administrator
+- there may be a particular system administrator who deals with a
+particular kind of message.  Other messages just need to be recorded for
+future reference if there is a problem.  Still others may need to have
+information extracted from them by an automated process that generates
+monthly reports.
+
+   To deal with these messages, most Unix systems have a facility called
+"Syslog."  It is generally based on a daemon called "Syslogd" Syslogd
+listens for messages on a Unix domain socket named '/dev/log'.  Based on
+classification information in the messages and its configuration file
+(usually '/etc/syslog.conf'), Syslogd routes them in various ways.  Some
+of the popular routings are:
+
+   * Write to the system console
+   * Mail to a specific user
+   * Write to a log file
+   * Pass to another daemon
+   * Discard
+
+   Syslogd can also handle messages from other systems.  It listens on
+the 'syslog' UDP port as well as the local socket for messages.
+
+   Syslog can handle messages from the kernel itself.  But the kernel
+doesn't write to '/dev/log'; rather, another daemon (sometimes called
+"Klogd") extracts messages from the kernel and passes them on to Syslog
+as any other process would (and it properly identifies them as messages
+from the kernel).
+
+   Syslog can even handle messages that the kernel issued before Syslogd
+or Klogd was running.  A Linux kernel, for example, stores startup
+messages in a kernel message ring and they are normally still there when
+Klogd later starts up.  Assuming Syslogd is running by the time Klogd
+starts, Klogd then passes everything in the message ring to it.
+
+   In order to classify messages for disposition, Syslog requires any
+process that submits a message to it to provide two pieces of
+classification information with it:
+
+facility
+     This identifies who submitted the message.  There are a small
+     number of facilities defined.  The kernel, the mail subsystem, and
+     an FTP server are examples of recognized facilities.  For the
+     complete list, *Note syslog; vsyslog::.  Keep in mind that these
+     are essentially arbitrary classifications.  "Mail subsystem"
+     doesn't have any more meaning than the system administrator gives
+     to it.
+
+priority
+     This tells how important the content of the message is.  Examples
+     of defined priority values are: debug, informational, warning,
+     critical.  For the complete list, see *note syslog; vsyslog::.
+     Except for the fact that the priorities have a defined order, the
+     meaning of each of these priorities is entirely determined by the
+     system administrator.
+
+   A "facility/priority" is a number that indicates both the facility
+and the priority.
+
+   *Warning:* This terminology is not universal.  Some people use
+"level" to refer to the priority and "priority" to refer to the
+combination of facility and priority.  A Linux kernel has a concept of a
+message "level," which corresponds both to a Syslog priority and to a
+Syslog facility/priority (It can be both because the facility code for
+the kernel is zero, and that makes priority and facility/priority the
+same value).
+
+   The GNU C Library provides functions to submit messages to Syslog.
+They do it by writing to the '/dev/log' socket.  *Note Submitting Syslog
+Messages::.
+
+   The GNU C Library functions only work to submit messages to the
+Syslog facility on the same system.  To submit a message to the Syslog
+facility on another system, use the socket I/O functions to write a UDP
+datagram to the 'syslog' UDP port on that system.  *Note Sockets::.
+
+
+File: libc.info,  Node: Submitting Syslog Messages,  Prev: Overview of Syslog,  Up: Syslog
+
+18.2 Submitting Syslog Messages
+===============================
+
+The GNU C Library provides functions to submit messages to the Syslog
+facility:
+
+* Menu:
+
+* openlog::                      Open connection to Syslog
+* syslog; vsyslog::              Submit message to Syslog
+* closelog::                     Close connection to Syslog
+* setlogmask::                   Cause certain messages to be ignored
+* Syslog Example::               Example of all of the above
+
+   These functions only work to submit messages to the Syslog facility
+on the same system.  To submit a message to the Syslog facility on
+another system, use the socket I/O functions to write a UDP datagram to
+the 'syslog' UDP port on that system.  *Note Sockets::.
+
+
+File: libc.info,  Node: openlog,  Next: syslog; vsyslog,  Up: Submitting Syslog Messages
+
+18.2.1 openlog
+--------------
+
+The symbols referred to in this section are declared in the file
+'syslog.h'.
+
+ -- Function: void openlog (const char *IDENT, int OPTION, int FACILITY)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock fd | *Note
+     POSIX Safety Concepts::.
+
+     'openlog' opens or reopens a connection to Syslog in preparation
+     for submitting messages.
+
+     IDENT is an arbitrary identification string which future 'syslog'
+     invocations will prefix to each message.  This is intended to
+     identify the source of the message, and people conventionally set
+     it to the name of the program that will submit the messages.
+
+     If IDENT is NULL, or if 'openlog' is not called, the default
+     identification string used in Syslog messages will be the program
+     name, taken from argv[0].
+
+     Please note that the string pointer IDENT will be retained
+     internally by the Syslog routines.  You must not free the memory
+     that IDENT points to.  It is also dangerous to pass a reference to
+     an automatic variable since leaving the scope would mean ending the
+     lifetime of the variable.  If you want to change the IDENT string,
+     you must call 'openlog' again; overwriting the string pointed to by
+     IDENT is not thread-safe.
+
+     You can cause the Syslog routines to drop the reference to IDENT
+     and go back to the default string (the program name taken from
+     argv[0]), by calling 'closelog': *Note closelog::.
+
+     In particular, if you are writing code for a shared library that
+     might get loaded and then unloaded (e.g.  a PAM module), and you
+     use 'openlog', you must call 'closelog' before any point where your
+     library might get unloaded, as in this example:
+
+          #include <syslog.h>
+
+          void
+          shared_library_function (void)
+          {
+            openlog ("mylibrary", option, priority);
+
+            syslog (LOG_INFO, "shared library has been invoked");
+
+            closelog ();
+          }
+
+     Without the call to 'closelog', future invocations of 'syslog' by
+     the program using the shared library may crash, if the library gets
+     unloaded and the memory containing the string '"mylibrary"' becomes
+     unmapped.  This is a limitation of the BSD syslog interface.
+
+     'openlog' may or may not open the '/dev/log' socket, depending on
+     OPTION.  If it does, it tries to open it and connect it as a stream
+     socket.  If that doesn't work, it tries to open it and connect it
+     as a datagram socket.  The socket has the "Close on Exec"
+     attribute, so the kernel will close it if the process performs an
+     exec.
+
+     You don't have to use 'openlog'.  If you call 'syslog' without
+     having called 'openlog', 'syslog' just opens the connection
+     implicitly and uses defaults for the information in IDENT and
+     OPTIONS.
+
+     OPTIONS is a bit string, with the bits as defined by the following
+     single bit masks:
+
+     'LOG_PERROR'
+          If on, 'openlog' sets up the connection so that any 'syslog'
+          on this connection writes its message to the calling process'
+          Standard Error stream in addition to submitting it to Syslog.
+          If off, 'syslog' does not write the message to Standard Error.
+
+     'LOG_CONS'
+          If on, 'openlog' sets up the connection so that a 'syslog' on
+          this connection that fails to submit a message to Syslog
+          writes the message instead to system console.  If off,
+          'syslog' does not write to the system console (but of course
+          Syslog may write messages it receives to the console).
+
+     'LOG_PID'
+          When on, 'openlog' sets up the connection so that a 'syslog'
+          on this connection inserts the calling process' Process ID
+          (PID) into the message.  When off, 'openlog' does not insert
+          the PID.
+
+     'LOG_NDELAY'
+          When on, 'openlog' opens and connects the '/dev/log' socket.
+          When off, a future 'syslog' call must open and connect the
+          socket.
+
+          *Portability note:* In early systems, the sense of this bit
+          was exactly the opposite.
+
+     'LOG_ODELAY'
+          This bit does nothing.  It exists for backward compatibility.
+
+     If any other bit in OPTIONS is on, the result is undefined.
+
+     FACILITY is the default facility code for this connection.  A
+     'syslog' on this connection that specifies default facility causes
+     this facility to be associated with the message.  See 'syslog' for
+     possible values.  A value of zero means the default default, which
+     is 'LOG_USER'.
+
+     If a Syslog connection is already open when you call 'openlog',
+     'openlog' "reopens" the connection.  Reopening is like opening
+     except that if you specify zero for the default facility code, the
+     default facility code simply remains unchanged and if you specify
+     LOG_NDELAY and the socket is already open and connected, 'openlog'
+     just leaves it that way.
+
+
+File: libc.info,  Node: syslog; vsyslog,  Next: closelog,  Prev: openlog,  Up: Submitting Syslog Messages
+
+18.2.2 syslog, vsyslog
+----------------------
+
+The symbols referred to in this section are declared in the file
+'syslog.h'.
+
+ -- Function: void syslog (int FACILITY_PRIORITY, const char *FORMAT,
+          ...)
+     Preliminary: | MT-Safe env locale | AS-Unsafe corrupt heap lock
+     dlopen | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety
      Concepts::.
 
-     Decode options from the vector ARGV (whose length is ARGC).  The
-     argument SHORTOPTS describes the short options to accept, just as
-     it does in `getopt'.  The argument LONGOPTS describes the long
-     options to accept (see above).
+     'syslog' submits a message to the Syslog facility.  It does this by
+     writing to the Unix domain socket '/dev/log'.
 
-     When `getopt_long' encounters a short option, it does the same
-     thing that `getopt' would do: it returns the character code for the
-     option, and stores the options argument (if it has one) in
-     `optarg'.
+     'syslog' submits the message with the facility and priority
+     indicated by FACILITY_PRIORITY.  The macro 'LOG_MAKEPRI' generates
+     a facility/priority from a facility and a priority, as in the
+     following example:
 
-     When `getopt_long' encounters a long option, it takes actions based
-     on the `flag' and `val' fields of the definition of that option.
+          LOG_MAKEPRI(LOG_USER, LOG_WARNING)
 
-     If `flag' is a null pointer, then `getopt_long' returns the
-     contents of `val' to indicate which option it found.  You should
-     arrange distinct values in the `val' field for options with
-     different meanings, so you can decode these values after
-     `getopt_long' returns.  If the long option is equivalent to a short
-     option, you can use the short option's character code in `val'.
+     The possible values for the facility code are (macros):
 
-     If `flag' is not a null pointer, that means this option should just
-     set a flag in the program.  The flag is a variable of type `int'
-     that you define.  Put the address of the flag in the `flag' field.
-     Put in the `val' field the value you would like this option to
-     store in the flag.  In this case, `getopt_long' returns `0'.
+     'LOG_USER'
+          A miscellaneous user process
+     'LOG_MAIL'
+          Mail
+     'LOG_DAEMON'
+          A miscellaneous system daemon
+     'LOG_AUTH'
+          Security (authorization)
+     'LOG_SYSLOG'
+          Syslog
+     'LOG_LPR'
+          Central printer
+     'LOG_NEWS'
+          Network news (e.g.  Usenet)
+     'LOG_UUCP'
+          UUCP
+     'LOG_CRON'
+          Cron and At
+     'LOG_AUTHPRIV'
+          Private security (authorization)
+     'LOG_FTP'
+          Ftp server
+     'LOG_LOCAL0'
+          Locally defined
+     'LOG_LOCAL1'
+          Locally defined
+     'LOG_LOCAL2'
+          Locally defined
+     'LOG_LOCAL3'
+          Locally defined
+     'LOG_LOCAL4'
+          Locally defined
+     'LOG_LOCAL5'
+          Locally defined
+     'LOG_LOCAL6'
+          Locally defined
+     'LOG_LOCAL7'
+          Locally defined
 
-     For any long option, `getopt_long' tells you the index in the array
-     LONGOPTS of the options definition, by storing it into
-     `*INDEXPTR'.  You can get the name of the option with
-     `LONGOPTS[*INDEXPTR].name'.  So you can distinguish among long
-     options either by the values in their `val' fields or by their
-     indices.  You can also distinguish in this way among long options
-     that set flags.
+     Results are undefined if the facility code is anything else.
 
-     When a long option has an argument, `getopt_long' puts the argument
-     value in the variable `optarg' before returning.  When the option
-     has no argument, the value in `optarg' is a null pointer.  This is
-     how you can tell whether an optional argument was supplied.
+     *NB:* 'syslog' recognizes one other facility code: that of the
+     kernel.  But you can't specify that facility code with these
+     functions.  If you try, it looks the same to 'syslog' as if you are
+     requesting the default facility.  But you wouldn't want to anyway,
+     because any program that uses the GNU C Library is not the kernel.
 
-     When `getopt_long' has no more options to handle, it returns `-1',
-     and leaves in the variable `optind' the index in ARGV of the next
-     remaining argument.
+     You can use just a priority code as FACILITY_PRIORITY.  In that
+     case, 'syslog' assumes the default facility established when the
+     Syslog connection was opened.  *Note Syslog Example::.
 
-   Since long option names were used before the `getopt_long' options
-was invented there are program interfaces which require programs to
-recognize options like `-option value' instead of `--option value'.  To
-enable these programs to use the GNU getopt functionality there is one
-more function available.
+     The possible values for the priority code are (macros):
 
- -- Function: int getopt_long_only (int ARGC, char *const *ARGV, const
-          char *SHORTOPTS, const struct option *LONGOPTS, int *INDEXPTR)
-     Preliminary: | MT-Unsafe race:getopt env | AS-Unsafe heap i18n
-     lock corrupt | AC-Unsafe mem lock corrupt | *Note POSIX Safety
+     'LOG_EMERG'
+          The message says the system is unusable.
+     'LOG_ALERT'
+          Action on the message must be taken immediately.
+     'LOG_CRIT'
+          The message states a critical condition.
+     'LOG_ERR'
+          The message describes an error.
+     'LOG_WARNING'
+          The message is a warning.
+     'LOG_NOTICE'
+          The message describes a normal but important event.
+     'LOG_INFO'
+          The message is purely informational.
+     'LOG_DEBUG'
+          The message is only for debugging purposes.
+
+     Results are undefined if the priority code is anything else.
+
+     If the process does not presently have a Syslog connection open
+     (i.e., it did not call 'openlog'), 'syslog' implicitly opens the
+     connection the same as 'openlog' would, with the following defaults
+     for information that would otherwise be included in an 'openlog'
+     call: The default identification string is the program name.  The
+     default default facility is 'LOG_USER'.  The default for all the
+     connection options in OPTIONS is as if those bits were off.
+     'syslog' leaves the Syslog connection open.
+
+     If the '/dev/log' socket is not open and connected, 'syslog' opens
+     and connects it, the same as 'openlog' with the 'LOG_NDELAY' option
+     would.
+
+     'syslog' leaves '/dev/log' open and connected unless its attempt to
+     send the message failed, in which case 'syslog' closes it (with the
+     hope that a future implicit open will restore the Syslog connection
+     to a usable state).
+
+     Example:
+
+
+          #include <syslog.h>
+          syslog (LOG_MAKEPRI(LOG_LOCAL1, LOG_ERROR),
+                  "Unable to make network connection to %s.  Error=%m", host);
+
+
+ -- Function: void vsyslog (int FACILITY_PRIORITY, const char *FORMAT,
+          va_list ARGLIST)
+     Preliminary: | MT-Safe env locale | AS-Unsafe corrupt heap lock
+     dlopen | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety
      Concepts::.
 
-     The `getopt_long_only' function is equivalent to the `getopt_long'
-     function but it allows to specify the user of the application to
-     pass long options with only `-' instead of `--'.  The `--' prefix
-     is still recognized but instead of looking through the short
-     options if a `-' is seen it is first tried whether this parameter
-     names a long option.  If not, it is parsed as a short option.
+     This is functionally identical to 'syslog', with the BSD style
+     variable length argument.
 
-     Assuming `getopt_long_only' is used starting an application with
+
+File: libc.info,  Node: closelog,  Next: setlogmask,  Prev: syslog; vsyslog,  Up: Submitting Syslog Messages
 
-            app -foo
+18.2.3 closelog
+---------------
 
-     the `getopt_long_only' will first look for a long option named
-     `foo'.  If this is not found, the short options `f', `o', and
-     again `o' are recognized.
+The symbols referred to in this section are declared in the file
+'syslog.h'.
 
+ -- Function: void closelog (void)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock fd | *Note
+     POSIX Safety Concepts::.
+
+     'closelog' closes the current Syslog connection, if there is one.
+     This includes closing the '/dev/log' socket, if it is open.
+     'closelog' also sets the identification string for Syslog messages
+     back to the default, if 'openlog' was called with a non-NULL
+     argument to IDENT.  The default identification string is the
+     program name taken from argv[0].
+
+     If you are writing shared library code that uses 'openlog' to
+     generate custom syslog output, you should use 'closelog' to drop
+     the GNU C Library's internal reference to the IDENT pointer when
+     you are done.  Please read the section on 'openlog' for more
+     information: *Note openlog::.
+
+     'closelog' does not flush any buffers.  You do not have to call
+     'closelog' before re-opening a Syslog connection with 'openlog'.
+     Syslog connections are automatically closed on exec or exit.
+
+
+File: libc.info,  Node: setlogmask,  Next: Syslog Example,  Prev: closelog,  Up: Submitting Syslog Messages
+
+18.2.4 setlogmask
+-----------------
+
+The symbols referred to in this section are declared in the file
+'syslog.h'.
+
+ -- Function: int setlogmask (int MASK)
+     Preliminary: | MT-Unsafe race:LogMask | AS-Unsafe | AC-Safe | *Note
+     POSIX Safety Concepts::.
+
+     'setlogmask' sets a mask (the "logmask") that determines which
+     future 'syslog' calls shall be ignored.  If a program has not
+     called 'setlogmask', 'syslog' doesn't ignore any calls.  You can
+     use 'setlogmask' to specify that messages of particular priorities
+     shall be ignored in the future.
+
+     A 'setlogmask' call overrides any previous 'setlogmask' call.
+
+     Note that the logmask exists entirely independently of opening and
+     closing of Syslog connections.
+
+     Setting the logmask has a similar effect to, but is not the same
+     as, configuring Syslog.  The Syslog configuration may cause Syslog
+     to discard certain messages it receives, but the logmask causes
+     certain messages never to get submitted to Syslog in the first
+     place.
+
+     MASK is a bit string with one bit corresponding to each of the
+     possible message priorities.  If the bit is on, 'syslog' handles
+     messages of that priority normally.  If it is off, 'syslog'
+     discards messages of that priority.  Use the message priority
+     macros described in *note syslog; vsyslog:: and the 'LOG_MASK' to
+     construct an appropriate MASK value, as in this example:
+
+          LOG_MASK(LOG_EMERG) | LOG_MASK(LOG_ERROR)
+
+     or
+
+          ~(LOG_MASK(LOG_INFO))
+
+     There is also a 'LOG_UPTO' macro, which generates a mask with the
+     bits on for a certain priority and all priorities above it:
+
+          LOG_UPTO(LOG_ERROR)
+
+     The unfortunate naming of the macro is due to the fact that
+     internally, higher numbers are used for lower message priorities.
+
+
+File: libc.info,  Node: Syslog Example,  Prev: setlogmask,  Up: Submitting Syslog Messages
+
+18.2.5 Syslog Example
+---------------------
+
+Here is an example of 'openlog', 'syslog', and 'closelog':
+
+   This example sets the logmask so that debug and informational
+messages get discarded without ever reaching Syslog.  So the second
+'syslog' in the example does nothing.
+
+     #include <syslog.h>
+
+     setlogmask (LOG_UPTO (LOG_NOTICE));
+
+     openlog ("exampleprog", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);
+
+     syslog (LOG_NOTICE, "Program started by User %d", getuid ());
+     syslog (LOG_INFO, "A tree falls in a forest");
+
+     closelog ();
+
+
+
+File: libc.info,  Node: Mathematics,  Next: Arithmetic,  Prev: Syslog,  Up: Top
+
+19 Mathematics
+**************
+
+This chapter contains information about functions for performing
+mathematical computations, such as trigonometric functions.  Most of
+these functions have prototypes declared in the header file 'math.h'.
+The complex-valued functions are defined in 'complex.h'.
+
+   All mathematical functions which take a floating-point argument have
+three variants, one each for 'double', 'float', and 'long double'
+arguments.  The 'double' versions are mostly defined in ISO C89.  The
+'float' and 'long double' versions are from the numeric extensions to C
+included in ISO C99.
+
+   Which of the three versions of a function should be used depends on
+the situation.  For most calculations, the 'float' functions are the
+fastest.  On the other hand, the 'long double' functions have the
+highest precision.  'double' is somewhere in between.  It is usually
+wise to pick the narrowest type that can accommodate your data.  Not all
+machines have a distinct 'long double' type; it may be the same as
+'double'.
+
+* Menu:
+
+* Mathematical Constants::      Precise numeric values for often-used
+                                 constants.
+* Trig Functions::              Sine, cosine, tangent, and friends.
+* Inverse Trig Functions::      Arcsine, arccosine, etc.
+* Exponents and Logarithms::    Also pow and sqrt.
+* Hyperbolic Functions::        sinh, cosh, tanh, etc.
+* Special Functions::           Bessel, gamma, erf.
+* Errors in Math Functions::    Known Maximum Errors in Math Functions.
+* Pseudo-Random Numbers::       Functions for generating pseudo-random
+				 numbers.
+* FP Function Optimizations::   Fast code or small code.
+
+
+File: libc.info,  Node: Mathematical Constants,  Next: Trig Functions,  Up: Mathematics
+
+19.1 Predefined Mathematical Constants
+======================================
+
+The header 'math.h' defines several useful mathematical constants.  All
+values are defined as preprocessor macros starting with 'M_'.  The
+values provided are:
+
+'M_E'
+     The base of natural logarithms.
+'M_LOG2E'
+     The logarithm to base '2' of 'M_E'.
+'M_LOG10E'
+     The logarithm to base '10' of 'M_E'.
+'M_LN2'
+     The natural logarithm of '2'.
+'M_LN10'
+     The natural logarithm of '10'.
+'M_PI'
+     Pi, the ratio of a circle's circumference to its diameter.
+'M_PI_2'
+     Pi divided by two.
+'M_PI_4'
+     Pi divided by four.
+'M_1_PI'
+     The reciprocal of pi (1/pi)
+'M_2_PI'
+     Two times the reciprocal of pi.
+'M_2_SQRTPI'
+     Two times the reciprocal of the square root of pi.
+'M_SQRT2'
+     The square root of two.
+'M_SQRT1_2'
+     The reciprocal of the square root of two (also the square root of
+     1/2).
+
+   These constants come from the Unix98 standard and were also available
+in 4.4BSD; therefore they are only defined if '_BSD_SOURCE' or
+'_XOPEN_SOURCE=500', or a more general feature select macro, is defined.
+The default set of features includes these constants.  *Note Feature
+Test Macros::.
+
+   All values are of type 'double'.  As an extension, the GNU C Library
+also defines these constants with type 'long double'.  The 'long double'
+macros have a lowercase 'l' appended to their names: 'M_El', 'M_PIl',
+and so forth.  These are only available if '_GNU_SOURCE' is defined.
+
+   _Note:_ Some programs use a constant named 'PI' which has the same
+value as 'M_PI'.  This constant is not standard; it may have appeared in
+some old AT&T headers, and is mentioned in Stroustrup's book on C++.  It
+infringes on the user's name space, so the GNU C Library does not define
+it.  Fixing programs written to expect it is simple: replace 'PI' with
+'M_PI' throughout, or put '-DPI=M_PI' on the compiler command line.
+
+
+File: libc.info,  Node: Trig Functions,  Next: Inverse Trig Functions,  Prev: Mathematical Constants,  Up: Mathematics
+
+19.2 Trigonometric Functions
+============================
+
+These are the familiar 'sin', 'cos', and 'tan' functions.  The arguments
+to all of these functions are in units of radians; recall that pi
+radians equals 180 degrees.
+
+   The math library normally defines 'M_PI' to a 'double' approximation
+of pi.  If strict ISO and/or POSIX compliance are requested this
+constant is not defined, but you can easily define it yourself:
+
+     #define M_PI 3.14159265358979323846264338327
+
+You can also compute the value of pi with the expression 'acos (-1.0)'.
+
+ -- Function: double sin (double X)
+ -- Function: float sinf (float X)
+ -- Function: long double sinl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the sine of X, where X is given in radians.
+     The return value is in the range '-1' to '1'.
+
+ -- Function: double cos (double X)
+ -- Function: float cosf (float X)
+ -- Function: long double cosl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the cosine of X, where X is given in
+     radians.  The return value is in the range '-1' to '1'.
+
+ -- Function: double tan (double X)
+ -- Function: float tanf (float X)
+ -- Function: long double tanl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the tangent of X, where X is given in
+     radians.
+
+     Mathematically, the tangent function has singularities at odd
+     multiples of pi/2.  If the argument X is too close to one of these
+     singularities, 'tan' will signal overflow.
+
+   In many applications where 'sin' and 'cos' are used, the sine and
+cosine of the same angle are needed at the same time.  It is more
+efficient to compute them simultaneously, so the library provides a
+function to do that.
+
+ -- Function: void sincos (double X, double *SINX, double *COSX)
+ -- Function: void sincosf (float X, float *SINX, float *COSX)
+ -- Function: void sincosl (long double X, long double *SINX, long
+          double *COSX)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the sine of X in '*SINX' and the cosine of X
+     in '*COS', where X is given in radians.  Both values, '*SINX' and
+     '*COSX', are in the range of '-1' to '1'.
+
+     This function is a GNU extension.  Portable programs should be
+     prepared to cope with its absence.
+
+   ISO C99 defines variants of the trig functions which work on complex
+numbers.  The GNU C Library provides these functions, but they are only
+useful if your compiler supports the new complex types defined by the
+standard.  (As of this writing GCC supports complex numbers, but there
+are bugs in the implementation.)
+
+ -- Function: complex double csin (complex double Z)
+ -- Function: complex float csinf (complex float Z)
+ -- Function: complex long double csinl (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the complex sine of Z.  The mathematical
+     definition of the complex sine is
+
+     sin (z) = 1/(2*i) * (exp (z*i) - exp (-z*i)).
+
+ -- Function: complex double ccos (complex double Z)
+ -- Function: complex float ccosf (complex float Z)
+ -- Function: complex long double ccosl (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the complex cosine of Z.  The mathematical
+     definition of the complex cosine is
+
+     cos (z) = 1/2 * (exp (z*i) + exp (-z*i))
+
+ -- Function: complex double ctan (complex double Z)
+ -- Function: complex float ctanf (complex float Z)
+ -- Function: complex long double ctanl (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the complex tangent of Z.  The mathematical
+     definition of the complex tangent is
+
+     tan (z) = -i * (exp (z*i) - exp (-z*i)) / (exp (z*i) + exp (-z*i))
+
+     The complex tangent has poles at pi/2 + 2n, where n is an integer.
+     'ctan' may signal overflow if Z is too close to a pole.
+
+
+File: libc.info,  Node: Inverse Trig Functions,  Next: Exponents and Logarithms,  Prev: Trig Functions,  Up: Mathematics
+
+19.3 Inverse Trigonometric Functions
+====================================
+
+These are the usual arc sine, arc cosine and arc tangent functions,
+which are the inverses of the sine, cosine and tangent functions
+respectively.
+
+ -- Function: double asin (double X)
+ -- Function: float asinf (float X)
+ -- Function: long double asinl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions compute the arc sine of X--that is, the value whose
+     sine is X.  The value is in units of radians.  Mathematically,
+     there are infinitely many such values; the one actually returned is
+     the one between '-pi/2' and 'pi/2' (inclusive).
+
+     The arc sine function is defined mathematically only over the
+     domain '-1' to '1'.  If X is outside the domain, 'asin' signals a
+     domain error.
+
+ -- Function: double acos (double X)
+ -- Function: float acosf (float X)
+ -- Function: long double acosl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions compute the arc cosine of X--that is, the value
+     whose cosine is X.  The value is in units of radians.
+     Mathematically, there are infinitely many such values; the one
+     actually returned is the one between '0' and 'pi' (inclusive).
+
+     The arc cosine function is defined mathematically only over the
+     domain '-1' to '1'.  If X is outside the domain, 'acos' signals a
+     domain error.
+
+ -- Function: double atan (double X)
+ -- Function: float atanf (float X)
+ -- Function: long double atanl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions compute the arc tangent of X--that is, the value
+     whose tangent is X.  The value is in units of radians.
+     Mathematically, there are infinitely many such values; the one
+     actually returned is the one between '-pi/2' and 'pi/2'
+     (inclusive).
+
+ -- Function: double atan2 (double Y, double X)
+ -- Function: float atan2f (float Y, float X)
+ -- Function: long double atan2l (long double Y, long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function computes the arc tangent of Y/X, but the signs of
+     both arguments are used to determine the quadrant of the result,
+     and X is permitted to be zero.  The return value is given in
+     radians and is in the range '-pi' to 'pi', inclusive.
+
+     If X and Y are coordinates of a point in the plane, 'atan2' returns
+     the signed angle between the line from the origin to that point and
+     the x-axis.  Thus, 'atan2' is useful for converting Cartesian
+     coordinates to polar coordinates.  (To compute the radial
+     coordinate, use 'hypot'; see *note Exponents and Logarithms::.)
+
+     If both X and Y are zero, 'atan2' returns zero.
+
+   ISO C99 defines complex versions of the inverse trig functions.
+
+ -- Function: complex double casin (complex double Z)
+ -- Function: complex float casinf (complex float Z)
+ -- Function: complex long double casinl (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions compute the complex arc sine of Z--that is, the
+     value whose sine is Z.  The value returned is in radians.
+
+     Unlike the real-valued functions, 'casin' is defined for all values
+     of Z.
+
+ -- Function: complex double cacos (complex double Z)
+ -- Function: complex float cacosf (complex float Z)
+ -- Function: complex long double cacosl (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions compute the complex arc cosine of Z--that is, the
+     value whose cosine is Z.  The value returned is in radians.
+
+     Unlike the real-valued functions, 'cacos' is defined for all values
+     of Z.
+
+ -- Function: complex double catan (complex double Z)
+ -- Function: complex float catanf (complex float Z)
+ -- Function: complex long double catanl (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions compute the complex arc tangent of Z--that is, the
+     value whose tangent is Z.  The value is in units of radians.
+
+
+File: libc.info,  Node: Exponents and Logarithms,  Next: Hyperbolic Functions,  Prev: Inverse Trig Functions,  Up: Mathematics
+
+19.4 Exponentiation and Logarithms
+==================================
+
+ -- Function: double exp (double X)
+ -- Function: float expf (float X)
+ -- Function: long double expl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions compute 'e' (the base of natural logarithms) raised
+     to the power X.
+
+     If the magnitude of the result is too large to be representable,
+     'exp' signals overflow.
+
+ -- Function: double exp2 (double X)
+ -- Function: float exp2f (float X)
+ -- Function: long double exp2l (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions compute '2' raised to the power X.  Mathematically,
+     'exp2 (x)' is the same as 'exp (x * log (2))'.
+
+ -- Function: double exp10 (double X)
+ -- Function: float exp10f (float X)
+ -- Function: long double exp10l (long double X)
+ -- Function: double pow10 (double X)
+ -- Function: float pow10f (float X)
+ -- Function: long double pow10l (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions compute '10' raised to the power X.
+     Mathematically, 'exp10 (x)' is the same as 'exp (x * log (10))'.
+
+     These functions are GNU extensions.  The name 'exp10' is preferred,
+     since it is analogous to 'exp' and 'exp2'.
+
+ -- Function: double log (double X)
+ -- Function: float logf (float X)
+ -- Function: long double logl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions compute the natural logarithm of X.  'exp (log
+     (X))' equals X, exactly in mathematics and approximately in C.
+
+     If X is negative, 'log' signals a domain error.  If X is zero, it
+     returns negative infinity; if X is too close to zero, it may signal
+     overflow.
+
+ -- Function: double log10 (double X)
+ -- Function: float log10f (float X)
+ -- Function: long double log10l (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the base-10 logarithm of X.  'log10 (X)'
+     equals 'log (X) / log (10)'.
+
+ -- Function: double log2 (double X)
+ -- Function: float log2f (float X)
+ -- Function: long double log2l (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the base-2 logarithm of X.  'log2 (X)'
+     equals 'log (X) / log (2)'.
+
+ -- Function: double logb (double X)
+ -- Function: float logbf (float X)
+ -- Function: long double logbl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions extract the exponent of X and return it as a
+     floating-point value.  If 'FLT_RADIX' is two, 'logb' is equal to
+     'floor (log2 (x))', except it's probably faster.
+
+     If X is de-normalized, 'logb' returns the exponent X would have if
+     it were normalized.  If X is infinity (positive or negative),
+     'logb' returns oo.  If X is zero, 'logb' returns oo.  It does not
+     signal.
+
+ -- Function: int ilogb (double X)
+ -- Function: int ilogbf (float X)
+ -- Function: int ilogbl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions are equivalent to the corresponding 'logb'
+     functions except that they return signed integer values.
+
+Since integers cannot represent infinity and NaN, 'ilogb' instead
+returns an integer that can't be the exponent of a normal floating-point
+number.  'math.h' defines constants so you can check for this.
+
+ -- Macro: int FP_ILOGB0
+     'ilogb' returns this value if its argument is '0'.  The numeric
+     value is either 'INT_MIN' or '-INT_MAX'.
+
+     This macro is defined in ISO C99.
+
+ -- Macro: int FP_ILOGBNAN
+     'ilogb' returns this value if its argument is 'NaN'.  The numeric
+     value is either 'INT_MIN' or 'INT_MAX'.
+
+     This macro is defined in ISO C99.
+
+   These values are system specific.  They might even be the same.  The
+proper way to test the result of 'ilogb' is as follows:
+
+     i = ilogb (f);
+     if (i == FP_ILOGB0 || i == FP_ILOGBNAN)
+       {
+         if (isnan (f))
+           {
+             /* Handle NaN.  */
+           }
+         else if (f  == 0.0)
+           {
+             /* Handle 0.0.  */
+           }
+         else
+           {
+             /* Some other value with large exponent,
+                perhaps +Inf.  */
+           }
+       }
+
+ -- Function: double pow (double BASE, double POWER)
+ -- Function: float powf (float BASE, float POWER)
+ -- Function: long double powl (long double BASE, long double POWER)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These are general exponentiation functions, returning BASE raised
+     to POWER.
+
+     Mathematically, 'pow' would return a complex number when BASE is
+     negative and POWER is not an integral value.  'pow' can't do that,
+     so instead it signals a domain error.  'pow' may also underflow or
+     overflow the destination type.
+
+ -- Function: double sqrt (double X)
+ -- Function: float sqrtf (float X)
+ -- Function: long double sqrtl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the nonnegative square root of X.
+
+     If X is negative, 'sqrt' signals a domain error.  Mathematically,
+     it should return a complex number.
+
+ -- Function: double cbrt (double X)
+ -- Function: float cbrtf (float X)
+ -- Function: long double cbrtl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the cube root of X.  They cannot fail; every
+     representable real value has a representable real cube root.
+
+ -- Function: double hypot (double X, double Y)
+ -- Function: float hypotf (float X, float Y)
+ -- Function: long double hypotl (long double X, long double Y)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return 'sqrt (X*X + Y*Y)'.  This is the length of
+     the hypotenuse of a right triangle with sides of length X and Y, or
+     the distance of the point (X, Y) from the origin.  Using this
+     function instead of the direct formula is wise, since the error is
+     much smaller.  See also the function 'cabs' in *note Absolute
+     Value::.
+
+ -- Function: double expm1 (double X)
+ -- Function: float expm1f (float X)
+ -- Function: long double expm1l (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return a value equivalent to 'exp (X) - 1'.  They
+     are computed in a way that is accurate even if X is near zero--a
+     case where 'exp (X) - 1' would be inaccurate owing to subtraction
+     of two numbers that are nearly equal.
+
+ -- Function: double log1p (double X)
+ -- Function: float log1pf (float X)
+ -- Function: long double log1pl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions returns a value equivalent to 'log (1 + X)'.  They
+     are computed in a way that is accurate even if X is near zero.
+
+   ISO C99 defines complex variants of some of the exponentiation and
+logarithm functions.
+
+ -- Function: complex double cexp (complex double Z)
+ -- Function: complex float cexpf (complex float Z)
+ -- Function: complex long double cexpl (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return 'e' (the base of natural logarithms) raised
+     to the power of Z.  Mathematically, this corresponds to the value
+
+     exp (z) = exp (creal (z)) * (cos (cimag (z)) + I * sin (cimag (z)))
+
+ -- Function: complex double clog (complex double Z)
+ -- Function: complex float clogf (complex float Z)
+ -- Function: complex long double clogl (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the natural logarithm of Z.  Mathematically,
+     this corresponds to the value
+
+     log (z) = log (cabs (z)) + I * carg (z)
+
+     'clog' has a pole at 0, and will signal overflow if Z equals or is
+     very close to 0.  It is well-defined for all other values of Z.
+
+ -- Function: complex double clog10 (complex double Z)
+ -- Function: complex float clog10f (complex float Z)
+ -- Function: complex long double clog10l (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the base 10 logarithm of the complex value
+     Z.  Mathematically, this corresponds to the value
+
+     log (z) = log10 (cabs (z)) + I * carg (z)
+
+     These functions are GNU extensions.
+
+ -- Function: complex double csqrt (complex double Z)
+ -- Function: complex float csqrtf (complex float Z)
+ -- Function: complex long double csqrtl (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the complex square root of the argument Z.
+     Unlike the real-valued functions, they are defined for all values
+     of Z.
+
+ -- Function: complex double cpow (complex double BASE, complex double
+          POWER)
+ -- Function: complex float cpowf (complex float BASE, complex float
+          POWER)
+ -- Function: complex long double cpowl (complex long double BASE,
+          complex long double POWER)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return BASE raised to the power of POWER.  This is
+     equivalent to 'cexp (y * clog (x))'
+
+
+File: libc.info,  Node: Hyperbolic Functions,  Next: Special Functions,  Prev: Exponents and Logarithms,  Up: Mathematics
+
+19.5 Hyperbolic Functions
+=========================
+
+The functions in this section are related to the exponential functions;
+see *note Exponents and Logarithms::.
+
+ -- Function: double sinh (double X)
+ -- Function: float sinhf (float X)
+ -- Function: long double sinhl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the hyperbolic sine of X, defined
+     mathematically as '(exp (X) - exp (-X)) / 2'.  They may signal
+     overflow if X is too large.
+
+ -- Function: double cosh (double X)
+ -- Function: float coshf (float X)
+ -- Function: long double coshl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These function return the hyperbolic cosine of X, defined
+     mathematically as '(exp (X) + exp (-X)) / 2'.  They may signal
+     overflow if X is too large.
+
+ -- Function: double tanh (double X)
+ -- Function: float tanhf (float X)
+ -- Function: long double tanhl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the hyperbolic tangent of X, defined
+     mathematically as 'sinh (X) / cosh (X)'.  They may signal overflow
+     if X is too large.
+
+   There are counterparts for the hyperbolic functions which take
+complex arguments.
+
+ -- Function: complex double csinh (complex double Z)
+ -- Function: complex float csinhf (complex float Z)
+ -- Function: complex long double csinhl (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the complex hyperbolic sine of Z, defined
+     mathematically as '(exp (Z) - exp (-Z)) / 2'.
+
+ -- Function: complex double ccosh (complex double Z)
+ -- Function: complex float ccoshf (complex float Z)
+ -- Function: complex long double ccoshl (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the complex hyperbolic cosine of Z, defined
+     mathematically as '(exp (Z) + exp (-Z)) / 2'.
+
+ -- Function: complex double ctanh (complex double Z)
+ -- Function: complex float ctanhf (complex float Z)
+ -- Function: complex long double ctanhl (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the complex hyperbolic tangent of Z, defined
+     mathematically as 'csinh (Z) / ccosh (Z)'.
+
+ -- Function: double asinh (double X)
+ -- Function: float asinhf (float X)
+ -- Function: long double asinhl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the inverse hyperbolic sine of X--the value
+     whose hyperbolic sine is X.
+
+ -- Function: double acosh (double X)
+ -- Function: float acoshf (float X)
+ -- Function: long double acoshl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the inverse hyperbolic cosine of X--the
+     value whose hyperbolic cosine is X.  If X is less than '1', 'acosh'
+     signals a domain error.
+
+ -- Function: double atanh (double X)
+ -- Function: float atanhf (float X)
+ -- Function: long double atanhl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the inverse hyperbolic tangent of X--the
+     value whose hyperbolic tangent is X.  If the absolute value of X is
+     greater than '1', 'atanh' signals a domain error; if it is equal to
+     1, 'atanh' returns infinity.
+
+ -- Function: complex double casinh (complex double Z)
+ -- Function: complex float casinhf (complex float Z)
+ -- Function: complex long double casinhl (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the inverse complex hyperbolic sine of
+     Z--the value whose complex hyperbolic sine is Z.
+
+ -- Function: complex double cacosh (complex double Z)
+ -- Function: complex float cacoshf (complex float Z)
+ -- Function: complex long double cacoshl (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the inverse complex hyperbolic cosine of
+     Z--the value whose complex hyperbolic cosine is Z.  Unlike the
+     real-valued functions, there are no restrictions on the value of Z.
+
+ -- Function: complex double catanh (complex double Z)
+ -- Function: complex float catanhf (complex float Z)
+ -- Function: complex long double catanhl (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the inverse complex hyperbolic tangent of
+     Z--the value whose complex hyperbolic tangent is Z.  Unlike the
+     real-valued functions, there are no restrictions on the value of Z.
+
+
+File: libc.info,  Node: Special Functions,  Next: Errors in Math Functions,  Prev: Hyperbolic Functions,  Up: Mathematics
+
+19.6 Special Functions
+======================
+
+These are some more exotic mathematical functions which are sometimes
+useful.  Currently they only have real-valued versions.
+
+ -- Function: double erf (double X)
+ -- Function: float erff (float X)
+ -- Function: long double erfl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'erf' returns the error function of X.  The error function is
+     defined as
+          erf (x) = 2/sqrt(pi) * integral from 0 to x of exp(-t^2) dt
+
+ -- Function: double erfc (double X)
+ -- Function: float erfcf (float X)
+ -- Function: long double erfcl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'erfc' returns '1.0 - erf(X)', but computed in a fashion that
+     avoids round-off error when X is large.
+
+ -- Function: double lgamma (double X)
+ -- Function: float lgammaf (float X)
+ -- Function: long double lgammal (long double X)
+     Preliminary: | MT-Unsafe race:signgam | AS-Unsafe | AC-Safe | *Note
+     POSIX Safety Concepts::.
+
+     'lgamma' returns the natural logarithm of the absolute value of the
+     gamma function of X.  The gamma function is defined as
+          gamma (x) = integral from 0 to oo of t^(x-1) e^-t dt
+
+     The sign of the gamma function is stored in the global variable
+     SIGNGAM, which is declared in 'math.h'.  It is '1' if the
+     intermediate result was positive or zero, or '-1' if it was
+     negative.
+
+     To compute the real gamma function you can use the 'tgamma'
+     function or you can compute the values as follows:
+          lgam = lgamma(x);
+          gam  = signgam*exp(lgam);
+
+     The gamma function has singularities at the non-positive integers.
+     'lgamma' will raise the zero divide exception if evaluated at a
+     singularity.
+
+ -- Function: double lgamma_r (double X, int *SIGNP)
+ -- Function: float lgammaf_r (float X, int *SIGNP)
+ -- Function: long double lgammal_r (long double X, int *SIGNP)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'lgamma_r' is just like 'lgamma', but it stores the sign of the
+     intermediate result in the variable pointed to by SIGNP instead of
+     in the SIGNGAM global.  This means it is reentrant.
+
+ -- Function: double gamma (double X)
+ -- Function: float gammaf (float X)
+ -- Function: long double gammal (long double X)
+     Preliminary: | MT-Unsafe race:signgam | AS-Unsafe | AC-Safe | *Note
+     POSIX Safety Concepts::.
+
+     These functions exist for compatibility reasons.  They are
+     equivalent to 'lgamma' etc.  It is better to use 'lgamma' since for
+     one the name reflects better the actual computation, moreover
+     'lgamma' is standardized in ISO C99 while 'gamma' is not.
+
+ -- Function: double tgamma (double X)
+ -- Function: float tgammaf (float X)
+ -- Function: long double tgammal (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'tgamma' applies the gamma function to X.  The gamma function is
+     defined as
+          gamma (x) = integral from 0 to oo of t^(x-1) e^-t dt
+
+     This function was introduced in ISO C99.
+
+ -- Function: double j0 (double X)
+ -- Function: float j0f (float X)
+ -- Function: long double j0l (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'j0' returns the Bessel function of the first kind of order 0 of X.
+     It may signal underflow if X is too large.
+
+ -- Function: double j1 (double X)
+ -- Function: float j1f (float X)
+ -- Function: long double j1l (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'j1' returns the Bessel function of the first kind of order 1 of X.
+     It may signal underflow if X is too large.
+
+ -- Function: double jn (int N, double X)
+ -- Function: float jnf (int N, float X)
+ -- Function: long double jnl (int N, long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'jn' returns the Bessel function of the first kind of order N of X.
+     It may signal underflow if X is too large.
+
+ -- Function: double y0 (double X)
+ -- Function: float y0f (float X)
+ -- Function: long double y0l (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'y0' returns the Bessel function of the second kind of order 0 of
+     X.  It may signal underflow if X is too large.  If X is negative,
+     'y0' signals a domain error; if it is zero, 'y0' signals overflow
+     and returns -oo.
+
+ -- Function: double y1 (double X)
+ -- Function: float y1f (float X)
+ -- Function: long double y1l (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'y1' returns the Bessel function of the second kind of order 1 of
+     X.  It may signal underflow if X is too large.  If X is negative,
+     'y1' signals a domain error; if it is zero, 'y1' signals overflow
+     and returns -oo.
+
+ -- Function: double yn (int N, double X)
+ -- Function: float ynf (int N, float X)
+ -- Function: long double ynl (int N, long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'yn' returns the Bessel function of the second kind of order N of
+     X.  It may signal underflow if X is too large.  If X is negative,
+     'yn' signals a domain error; if it is zero, 'yn' signals overflow
+     and returns -oo.
+
+
+File: libc.info,  Node: Errors in Math Functions,  Next: Pseudo-Random Numbers,  Prev: Special Functions,  Up: Mathematics
+
+19.7 Known Maximum Errors in Math Functions
+===========================================
+
+This section lists the known errors of the functions in the math
+library.  Errors are measured in "units of the last place".  This is a
+measure for the relative error.  For a number z with the representation
+d.d...d*2^e (we assume IEEE floating-point numbers with base 2) the ULP
+is represented by
+
+     |d.d...d - (z / 2^e)| / 2^(p - 1)
+
+where p is the number of bits in the mantissa of the floating-point
+number representation.  Ideally the error for all functions is always
+less than 0.5ulps in round-to-nearest mode.  Using rounding bits this is
+also possible and normally implemented for the basic operations.  Except
+for certain functions such as 'sqrt', 'fma' and 'rint' whose results are
+fully specified by reference to corresponding IEEE 754 floating-point
+operations, and conversions between strings and floating point, the GNU
+C Library does not aim for correctly rounded results for functions in
+the math library, and does not aim for correctness in whether "inexact"
+exceptions are raised.  Instead, the goals for accuracy of functions
+without fully specified results are as follows; some functions have bugs
+meaning they do not meet these goals in all cases.  In future, the GNU C
+Library may provide some other correctly rounding functions under the
+names such as 'crsin' proposed for an extension to ISO C.
+
+   * Each function with a floating-point result behaves as if it
+     computes an infinite-precision result that is within a few ulp (in
+     both real and complex parts, for functions with complex results) of
+     the mathematically correct value of the function (interpreted
+     together with ISO C or POSIX semantics for the function in
+     question) at the exact value passed as the input.  Exceptions are
+     raised appropriately for this value and in accordance with IEEE 754
+     / ISO C / POSIX semantics, and it is then rounded according to the
+     current rounding direction to the result that is returned to the
+     user.  'errno' may also be set (*note Math Error Reporting::).
+
+   * For the IBM 'long double' format, as used on PowerPC GNU/Linux, the
+     accuracy goal is weaker for input values not exactly representable
+     in 106 bits of precision; it is as if the input value is some value
+     within 0.5ulp of the value actually passed, where "ulp" is
+     interpreted in terms of a fixed-precision 106-bit mantissa, but not
+     necessarily the exact value actually passed with discontiguous
+     mantissa bits.
+
+   * Functions behave as if the infinite-precision result computed is
+     zero, infinity or NaN if and only if that is the mathematically
+     correct infinite-precision result.  They behave as if the
+     infinite-precision result computed always has the same sign as the
+     mathematically correct result.
+
+   * If the mathematical result is more than a few ulp above the
+     overflow threshold for the current rounding direction, the value
+     returned is the appropriate overflow value for the current rounding
+     direction, with the overflow exception raised.
+
+   * If the mathematical result has magnitude well below half the least
+     subnormal magnitude, the returned value is either zero or the least
+     subnormal (in each case, with the correct sign), according to the
+     current rounding direction and with the underflow exception raised.
+
+   * Where the mathematical result underflows and is not exactly
+     representable as a floating-point value, the underflow exception is
+     raised (so there may be spurious underflow exceptions in cases
+     where the underflowing result is exact, but not missing underflow
+     exceptions in cases where it is inexact).
+
+   * The GNU C Library does not aim for functions to satisfy other
+     properties of the underlying mathematical function, such as
+     monotonicity, where not implied by the above goals.
+
+   * All the above applies to both real and complex parts, for complex
+     functions.
+
+   Therefore many of the functions in the math library have errors.  The
+table lists the maximum error for each function which is exposed by one
+of the existing tests in the test suite.  The table tries to cover as
+much as possible and list the actual maximum error (or at least a
+ballpark figure) but this is often not achieved due to the large search
+space.
+
+   The table lists the ULP values for different architectures.
+Different architectures have different results since their hardware
+support for floating-point operations varies and also the existing
+hardware support is different.
+
+Function      aarch64         Alpha           ARM             hppa/fpu        IA64
+acosf         -               -               -               -               -
+acos          -               -               -               -               -
+acosl         -               -               -               -               -
+acoshf        -               -               -               -               -
+acosh         1               1               1               1               -
+acoshl        1               1               -               -               -
+asinf         -               -               -               -               -
+asin          -               -               -               -               -
+asinl         1               1               -               -               -
+asinhf        1               1               1               1               -
+asinh         1               1               1               1               -
+asinhl        1               1               -               -               -
+atanf         -               -               -               -               -
+atan          1               -               -               -               -
+atanl         -               -               -               -               -
+atanhf        1               1               1               1               -
+atanh         -               -               -               -               -
+atanhl        1               1               -               -               -
+atan2f        1               1               1               1               -
+atan2         -               -               -               -               -
+atan2l        1               1               -               -               -
+cabsf         -               -               -               -               -
+cabs          -               -               -               -               -
+cabsl         -               -               -               -               -
+cacosf        2 + i 2         2 + i 2         2 + i 2         2 + i 2         2 + i 2
+cacos         1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 1
+cacosl        2 + i 2         2 + i 2         -               -               1 + i 2
+cacoshf       2 + i 2         2 + i 2         2 + i 2         2 + i 2         2 + i 2
+cacosh        1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 1
+cacoshl       2 + i 2         2 + i 2         -               -               2 + i 1
+cargf         -               -               -               -               -
+carg          -               -               -               -               -
+cargl         -               -               -               -               -
+casinf        1 + i 2         1 + i 2         1 + i 2         1 + i 2         1 + i 2
+casin         1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 1
+casinl        2 + i 2         2 + i 2         -               1 + i 0         1 + i 2
+casinhf       2 + i 1         2 + i 1         2 + i 1         2 + i 1         2 + i 1
+casinh        1 + i 1         1 + i 1         1 + i 1         5 + i 3         1 + i 1
+casinhl       2 + i 2         2 + i 2         -               5 + i 3         2 + i 1
+catanf        1 + i 1         1 + i 1         1 + i 1         1 + i 1         0 + i 1
+catan         0 + i 1         0 + i 1         0 + i 1         0 + i 1         0 + i 1
+catanl        1 + i 1         1 + i 1         -               0 + i 1         0 + i 1
+catanhf       1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 0
+catanh        1 + i 0         1 + i 0         1 + i 0         4 + i 0         1 + i 0
+catanhl       1 + i 1         1 + i 1         -               4 + i 0         1 + i 0
+cbrtf         1               1               1               1               -
+cbrt          1               1               1               1               -
+cbrtl         1               1               -               1               -
+ccosf         1 + i 1         1 + i 1         1 + i 1         1 + i 1         0 + i 1
+ccos          1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 1
+ccosl         1 + i 1         1 + i 1         -               1 + i 0         1 + i 1
+ccoshf        1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 1
+ccosh         1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 1
+ccoshl        1 + i 1         1 + i 1         -               1 + i 0         0 + i 1
+ceilf         -               -               -               -               -
+ceil          -               -               -               -               -
+ceill         -               -               -               -               -
+cexpf         1 + i 2         1 + i 2         1 + i 2         1 + i 2         1 + i 2
+cexp          2 + i 1         2 + i 1         2 + i 1         2 + i 1         2 + i 1
+cexpl         1 + i 1         1 + i 1         -               -               1 + i 1
+cimagf        -               -               -               -               -
+cimag         -               -               -               -               -
+cimagl        -               -               -               -               -
+clogf         1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 0
+clog          1 + i 1         1 + i 0         1 + i 0         1 + i 0         1 + i 1
+clogl         1 + i 1         1 + i 1         -               -               1 + i 1
+clog10f       2 + i 1         2 + i 1         2 + i 1         2 + i 1         2 + i 1
+clog10        2 + i 1         2 + i 1         2 + i 1         2 + i 1         2 + i 1
+clog10l       1 + i 2         1 + i 2         -               0 + i 1         1 + i 1
+conjf         -               -               -               -               -
+conj          -               -               -               -               -
+conjl         -               -               -               -               -
+copysignf     -               -               -               -               -
+copysign      -               -               -               -               -
+copysignl     -               -               -               -               -
+cosf          1               1               1               1               -
+cos           -               -               -               2               1
+cosl          1               1               -               2               -
+coshf         1               1               1               1               -
+cosh          1               1               1               1               -
+coshl         1               1               -               -               -
+cpowf         5 + i 2         4 + i 2         4 + i 2         4 + i 2         5 + i 2
+cpow          2 + i 0         2 + i 0         2 + i 0         2 + i 2         2 + i 0
+cpowl         4 + i 1         4 + i 1         -               2 + i 2         3 + i 4
+cprojf        -               -               -               -               -
+cproj         -               -               -               -               -
+cprojl        -               -               -               -               -
+crealf        -               -               -               -               -
+creal         -               -               -               -               -
+creall        -               -               -               -               -
+csinf         1 + i 0         1 + i 0         1 + i 0         1 + i 0         1 + i 1
+csin          1 + i 0         1 + i 0         1 + i 0         1 + i 0         1 + i 0
+csinl         1 + i 1         1 + i 1         -               -               1 + i 0
+csinhf        1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 1
+csinh         0 + i 1         0 + i 1         0 + i 1         0 + i 1         1 + i 1
+csinhl        1 + i 1         1 + i 1         -               0 + i 1         1 + i 0
+csqrtf        1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 1
+csqrt         1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 1
+csqrtl        1 + i 1         1 + i 1         -               -               1 + i 1
+ctanf         1 + i 1         1 + i 1         1 + i 1         1 + i 1         1 + i 1
+ctan          1 + i 2         1 + i 2         1 + i 2         1 + i 2         1 + i 2
+ctanl         3 + i 3         3 + i 3         -               0 + i 1         2 + i 2
+ctanhf        2 + i 1         1 + i 2         1 + i 2         1 + i 2         1 + i 1
+ctanh         2 + i 2         2 + i 2         2 + i 2         2 + i 2         2 + i 2
+ctanhl        3 + i 3         3 + i 3         -               1 + i 0         1 + i 2
+erff          -               -               -               -               -
+erf           1               1               1               1               -
+erfl          1               1               -               1               -
+erfcf         1               1               1               1               -
+erfc          1               1               1               1               -
+erfcl         1               1               -               1               -
+expf          -               -               -               -               -
+exp           -               -               -               -               -
+expl          -               -               -               -               -
+exp10f        -               -               -               2               -
+exp10         1               1               1               6               -
+exp10l        1               1               -               6               -
+exp2f         -               -               -               -               -
+exp2          -               -               -               -               -
+exp2l         1               1               -               -               -
+expm1f        1               1               1               1               -
+expm1         1               1               1               1               -
+expm1l        1               1               -               1               1
+fabsf         -               -               -               -               -
+fabs          -               -               -               -               -
+fabsl         -               -               -               -               -
+fdimf         -               -               -               -               -
+fdim          -               -               -               -               -
+fdiml         -               -               -               -               -
+floorf        -               -               -               -               -
+floor         -               -               -               -               -
+floorl        -               -               -               -               -
+fmaf          -               -               -               -               -
+fma           -               -               -               -               -
+fmal          -               -               -               -               -
+fmaxf         -               -               -               -               -
+fmax          -               -               -               -               -
+fmaxl         -               -               -               -               -
+fminf         -               -               -               -               -
+fmin          -               -               -               -               -
+fminl         -               -               -               -               -
+fmodf         -               -               -               -               -
+fmod          -               -               -               -               -
+fmodl         -               -               -               -               -
+frexpf        -               -               -               -               -
+frexp         -               -               -               -               -
+frexpl        -               -               -               -               -
+gammaf        1               1               1               2               -
+gamma         1               1               1               1               -
+gammal        1               1               -               -               -
+hypotf        -               -               -               1               -
+hypot         1               1               1               1               -
+hypotl        1               1               -               -               -
+ilogbf        -               -               -               -               -
+ilogb         -               -               -               -               -
+ilogbl        -               -               -               -               -
+j0f           2               2               2               2               2
+j0            2               2               2               2               2
+j0l           2               2               -               2               2
+j1f           2               2               2               2               2
+j1            1               1               1               1               1
+j1l           4               4               -               1               1
+jnf           4               4               4               5               4
+jn            4               4               4               4               4
+jnl           7               7               -               4               4
+lgammaf       1               1               1               2               -
+lgamma        1               1               1               1               -
+lgammal       1               1               -               1               -
+lrintf        -               -               -               -               -
+lrint         -               -               -               -               -
+lrintl        -               -               -               -               -
+llrintf       -               -               -               -               -
+llrint        -               -               -               -               -
+llrintl       -               -               -               -               -
+logf          1               1               1               1               -
+log           -               -               -               -               -
+logl          1               1               -               -               -
+log10f        2               2               2               2               -
+log10         1               1               1               1               -
+log10l        1               1               -               1               -
+log1pf        1               1               1               1               -
+log1p         -               -               -               -               -
+log1pl        1               1               -               -               -
+log2f         -               -               -               -               -
+log2          -               -               -               -               -
+log2l         1               1               -               -               -
+logbf         -               -               -               -               -
+logb          -               -               -               -               -
+logbl         -               -               -               -               -
+lroundf       -               -               -               -               -
+lround        -               -               -               -               -
+lroundl       -               -               -               -               -
+llroundf      -               -               -               -               -
+llround       -               -               -               -               -
+llroundl      -               -               -               -               -
+modff         -               -               -               -               -
+modf          -               -               -               -               -
+modfl         -               -               -               -               -
+nearbyintf    -               -               -               -               -
+nearbyint     -               -               -               -               -
+nearbyintl    -               -               -               -               -
+nextafterf    -               -               -               -               -
+nextafter     -               -               -               -               -
+nextafterl    -               -               -               -               -
+nexttowardf   -               -               -               -               -
+nexttoward    -               -               -               -               -
+nexttowardl   -               -               -               -               -
+powf          1               1               1               1               -
+pow           -               -               -               -               -
+powl          1               1               -               -               -
+remainderf    -               -               -               -               -
+remainder     -               -               -               -               -
+remainderl    -               -               -               -               -
+remquof       -               -               -               -               -
+remquo        -               -               -               -               -
+remquol       -               -               -               -               -
+rintf         -               -               -               -               -
+rint          -               -               -               -               -
+rintl         -               -               -               -               -
+roundf        -               -               -               -               -
+round         -               -               -               -               -
+roundl        -               -               -               -               -
+scalbf        -               -               -               -               -
+scalb         -               -               -               -               -
+scalbl        -               -               -               -               -
+scalbnf       -               -               -               -               -
+scalbn        -               -               -               -               -
+scalbnl       -               -               -               -               -
+scalblnf      -               -               -               -               -
+scalbln       -               -               -               -               -
+scalblnl      -               -               -               -               -
+sinf          1               1               1               1               -
+sin           -               -               -               -               1
+sinl          1               1               -               -               -
+sincosf       1               1               1               1               -
+sincos        -               -               -               1               1
+sincosl       1               1               -               1               -
+sinhf         -               -               -               -               -
+sinh          -               -               -               -               -
+sinhl         -               -               -               -               -
+sqrtf         -               -               -               -               -
+sqrt          -               -               -               -               -
+sqrtl         -               -               -               -               -
+tanf          -               -               -               -               -
+tan           -               -               -               1               -
+tanl          1               1               -               1               -
+tanhf         -               -               -               -               -
+tanh          -               -               -               -               -
+tanhl         1               1               -               -               -
+tgammaf       3               3               3               3               -
+tgamma        4               4               4               4               -
+tgammal       4               4               -               1               1
+truncf        -               -               -               -               -
+trunc         -               -               -               -               -
+truncl        -               -               -               -               -
+y0f           1               1               1               1               1
+y0            2               2               2               2               2
+y0l           3               3               -               2               1
+y1f           2               2               2               2               2
+y1            3               3               3               3               3
+y1l           2               2               -               3               2
+ynf           2               2               2               2               3
+yn            3               3               3               3               3
+ynl           4               4               -               3               2
+Function      m68k/coldfire/fpum68k/m680x0/fpumicroblaze      mips/mips32     mips/mips64
+acosf         -               -               -               -               -
+acos          -               -               -               -               -
+acosl         -               -               -               -               -
+acoshf        -               -               -               -               -
+acosh         -               1               1               1               1
+acoshl        -               -               -               -               1
+asinf         -               -               -               -               -
+asin          -               -               -               -               -
+asinl         -               -               -               -               1
+asinhf        -               1               1               1               1
+asinh         -               -               1               1               1
+asinhl        -               1               -               -               1
+atanf         -               -               -               -               -
+atan          -               -               -               -               -
+atanl         -               -               -               -               -
+atanhf        1               -               1               1               1
+atanh         -               -               -               -               -
+atanhl        -               -               -               -               1
+atan2f        1               -               1               1               1
+atan2         -               -               -               -               -
+atan2l        -               1               -               -               1
+cabsf         -               -               -               -               -
+cabs          -               -               -               -               -
+cabsl         -               -               -               -               -
+cacosf        -               2 + i 1         2 + i 2         2 + i 2         2 + i 2
+cacos         -               1 + i 1         1 + i 1         1 + i 1         1 + i 1
+cacosl        -               1 + i 2         -               -               2 + i 2
+cacoshf       0 + i 1         1 + i 2         2 + i 2         2 + i 2         2 + i 2
+cacosh        -               1 + i 1         1 + i 1         1 + i 1         1 + i 1
+cacoshl       -               2 + i 1         -               -               2 + i 2
+cargf         -               -               -               -               -
+carg          -               -               -               -               -
+cargl         -               -               -               -               -
+casinf        1 + i 0         1 + i 1         1 + i 2         1 + i 2         1 + i 2
+casin         1 + i 0         1 + i 1         1 + i 1         1 + i 1         1 + i 1
+casinl        -               1 + i 2         -               -               2 + i 2
+casinhf       1 + i 6         1 + i 1         2 + i 1         2 + i 1         2 + i 1
+casinh        5 + i 3         1 + i 1         1 + i 1         1 + i 1         1 + i 1
+casinhl       -               2 + i 1         -               -               2 + i 2
+catanf        0 + i 1         0 + i 1         1 + i 1         1 + i 1         1 + i 1
+catan         0 + i 1         0 + i 1         0 + i 1         0 + i 1         0 + i 1
+catanl        -               1 + i 1         -               -               1 + i 1
+catanhf       -               1 + i 0         1 + i 1         1 + i 1         1 + i 1
+catanh        4 + i 0         1 + i 0         1 + i 0         1 + i 0         1 + i 0
+catanhl       -               1 + i 1         -               -               1 + i 1
+cbrtf         -               1               1               1               1
+cbrt          1               1               1               1               1
+cbrtl         -               1               -               -               1
+ccosf         1 + i 1         -               1 + i 1         1 + i 1         1 + i 1
+ccos          1 + i 0         -               1 + i 1         1 + i 1         1 + i 1
+ccosl         -               1 + i 1         -               -               1 + i 1
+ccoshf        1 + i 1         -               1 + i 1         1 + i 1         1 + i 1
+ccosh         1 + i 0         -               1 + i 1         1 + i 1         1 + i 1
+ccoshl        -               0 + i 1         -               -               1 + i 1
+ceilf         -               -               -               -               -
+ceil          -               -               -               -               -
+ceill         -               -               -               -               -
+cexpf         1 + i 1         -               1 + i 2         1 + i 2         1 + i 2
+cexp          -               -               2 + i 1         2 + i 1         2 + i 1
+cexpl         -               1 + i 1         -               -               1 + i 1
+cimagf        -               -               -               -               -
+cimag         -               -               -               -               -
+cimagl        -               -               -               -               -
+clogf         1 + i 0         1 + i 1         1 + i 1         1 + i 1         1 + i 1
+clog          -               1 + i 1         1 + i 0         1 + i 0         1 + i 0
+clogl         -               1 + i 1         -               -               1 + i 1
+clog10f       1 + i 1         1 + i 1         2 + i 1         2 + i 1         2 + i 1
+clog10        0 + i 1         1 + i 1         2 + i 1         2 + i 1         2 + i 1
+clog10l       -               1 + i 2         -               -               1 + i 2
+conjf         -               -               -               -               -
+conj          -               -               -               -               -
+conjl         -               -               -               -               -
+copysignf     -               -               -               -               -
+copysign      -               -               -               -               -
+copysignl     -               -               -               -               -
+cosf          1               -               1               1               1
+cos           2               1               -               -               -
+cosl          -               -               -               -               1
+coshf         -               -               1               1               1
+cosh          -               -               1               1               1
+coshl         -               -               -               -               1
+cpowf         4 + i 2         3 + i 5         4 + i 2         4 + i 2         4 + i 2
+cpow          2 + i 2         1 + i 0         2 + i 0         2 + i 0         2 + i 0
+cpowl         -               3 + i 1         -               -               4 + i 1
+cprojf        -               -               -               -               -
+cproj         -               -               -               -               -
+cprojl        -               -               -               -               -
+crealf        -               -               -               -               -
+creal         -               -               -               -               -
+creall        -               -               -               -               -
+csinf         -               -               1 + i 0         1 + i 0         1 + i 0
+csin          -               -               1 + i 0         1 + i 0         1 + i 0
+csinl         -               1 + i 0         -               -               1 + i 1
+csinhf        1 + i 1         -               1 + i 1         1 + i 1         1 + i 1
+csinh         0 + i 1         -               0 + i 1         0 + i 1         0 + i 1
+csinhl        -               1 + i 0         -               -               1 + i 1
+csqrtf        1 + i 0         -               1 + i 1         1 + i 1         1 + i 1
+csqrt         -               1 + i 1         1 + i 1         1 + i 1         1 + i 1
+csqrtl        -               1 + i 1         -               -               1 + i 1
+ctanf         -               1 + i 1         1 + i 1         1 + i 1         1 + i 1
+ctan          0 + i 1         1 + i 1         1 + i 2         1 + i 2         1 + i 2
+ctanl         -               2 + i 2         -               -               3 + i 3
+ctanhf        2 + i 1         1 + i 2         1 + i 2         1 + i 2         1 + i 2
+ctanh         1 + i 0         1 + i 1         2 + i 2         2 + i 2         2 + i 2
+ctanhl        -               2 + i 2         -               -               3 + i 3
+erff          -               -               -               -               -
+erf           1               -               1               1               1
+erfl          -               1               -               -               1
+erfcf         -               1               1               1               1
+erfc          1               -               1               1               1
+erfcl         -               1               -               -               1
+expf          -               -               -               -               -
+exp           -               -               -               -               -
+expl          -               -               -               -               -
+exp10f        2               -               -               -               -
+exp10         6               -               1               1               1
+exp10l        -               -               -               -               1
+exp2f         -               -               -               -               -
+exp2          -               -               -               -               -
+exp2l         -               -               -               -               1
+expm1f        1               -               1               1               1
+expm1         1               -               1               1               1
+expm1l        -               1               -               -               1
+fabsf         -               -               -               -               -
+fabs          -               -               -               -               -
+fabsl         -               -               -               -               -
+fdimf         -               -               -               -               -
+fdim          -               -               -               -               -
+fdiml         -               -               -               -               -
+floorf        -               -               -               -               -
+floor         -               -               -               -               -
+floorl        -               -               -               -               -
+fmaf          -               -               -               -               -
+fma           -               -               -               -               -
+fmal          -               -               -               -               -
+fmaxf         -               -               -               -               -
+fmax          -               -               -               -               -
+fmaxl         -               -               -               -               -
+fminf         -               -               -               -               -
+fmin          -               -               -               -               -
+fminl         -               -               -               -               -
+fmodf         -               -               -               -               -
+fmod          -               -               -               -               -
+fmodl         -               -               -               -               -
+frexpf        -               -               -               -               -
+frexp         -               -               -               -               -
+frexpl        -               -               -               -               -
+gammaf        -               -               1               1               1
+gamma         -               -               1               1               1
+gammal        -               1               -               -               1
+hypotf        1               -               -               -               -
+hypot         -               1               1               1               1
+hypotl        -               1               -               -               1
+ilogbf        -               -               -               -               -
+ilogb         -               -               -               -               -
+ilogbl        -               -               -               -               -
+j0f           2               2               2               2               2
+j0            2               1               2               2               2
+j0l           -               2               -               -               2
+j1f           2               2               2               2               2
+j1            1               -               1               1               1
+j1l           -               1               -               -               4
+jnf           4               2               4               4               4
+jn            4               1               4               4               4
+jnl           -               4               -               -               7
+lgammaf       2               -               1               1               1
+lgamma        1               -               1               1               1
+lgammal       -               1               -               -               1
+lrintf        -               -               -               -               -
+lrint         -               -               -               -               -
+lrintl        -               -               -               -               -
+llrintf       -               -               -               -               -
+llrint        -               -               -               -               -
+llrintl       -               -               -               -               -
+logf          -               -               1               1               1
+log           -               -               -               -               -
+logl          -               -               -               -               1
+log10f        2               -               2               2               2
+log10         1               -               1               1               1
+log10l        -               -               -               -               1
+log1pf        1               -               1               1               1
+log1p         -               -               -               -               -
+log1pl        -               -               -               -               1
+log2f         -               -               -               -               -
+log2          -               -               -               -               -
+log2l         -               -               -               -               1
+logbf         -               -               -               -               -
+logb          -               -               -               -               -
+logbl         -               -               -               -               -
+lroundf       -               -               -               -               -
+lround        -               -               -               -               -
+lroundl       -               -               -               -               -
+llroundf      -               -               -               -               -
+llround       -               -               -               -               -
+llroundl      -               -               -               -               -
+modff         -               -               -               -               -
+modf          -               -               -               -               -
+modfl         -               -               -               -               -
+nearbyintf    -               -               -               -               -
+nearbyint     -               -               -               -               -
+nearbyintl    -               -               -               -               -
+nextafterf    -               -               -               -               -
+nextafter     -               -               -               -               -
+nextafterl    -               -               -               -               -
+nexttowardf   -               -               -               -               -
+nexttoward    -               -               -               -               -
+nexttowardl   -               -               -               -               -
+powf          -               5               1               1               1
+pow           -               1               -               -               -
+powl          -               7               -               -               1
+remainderf    -               -               -               -               -
+remainder     -               -               -               -               -
+remainderl    -               -               -               -               -
+remquof       -               -               -               -               -
+remquo        -               -               -               -               -
+remquol       -               -               -               -               -
+rintf         -               -               -               -               -
+rint          -               -               -               -               -
+rintl         -               -               -               -               -
+roundf        -               -               -               -               -
+round         -               -               -               -               -
+roundl        -               -               -               -               -
+scalbf        -               -               -               -               -
+scalb         -               -               -               -               -
+scalbl        -               -               -               -               -
+scalbnf       -               -               -               -               -
+scalbn        -               -               -               -               -
+scalbnl       -               -               -               -               -
+scalblnf      -               -               -               -               -
+scalbln       -               -               -               -               -
+scalblnl      -               -               -               -               -
+sinf          -               -               1               1               1
+sin           -               1               -               -               -
+sinl          -               -               -               -               1
+sincosf       1               -               1               1               1
+sincos        1               -               -               -               -
+sincosl       -               -               -               -               1
+sinhf         -               -               -               -               -
+sinh          -               -               -               -               -
+sinhl         -               -               -               -               -
+sqrtf         -               -               -               -               -
+sqrt          -               -               -               -               -
+sqrtl         -               -               -               -               -
+tanf          -               -               -               -               -
+tan           1               -               -               -               -
+tanl          -               -               -               -               1
+tanhf         -               -               -               -               -
+tanh          -               -               -               -               -
+tanhl         -               -               -               -               1
+tgammaf       1               3               3               3               3
+tgamma        1               4               4               4               4
+tgammal       -               9               -               -               4
+truncf        -               -               -               -               -
+trunc         -               -               -               -               -
+truncl        -               -               -               -               -
+y0f           1               1               1               1               1
+y0            2               1               2               2               2
+y0l           -               1               -               -               3
+y1f           2               2               2               2               2
+y1            3               1               3               3               3
+y1l           -               2               -               -               2
+ynf           2               3               2               2               2
+yn            3               1               3               3               3
+ynl           -               4               -               -               4
+Function      tile            Generic         ix86            PowerPC         powerpc/nofpu
+acosf         -               -               -               -               -
+acos          -               -               -               -               -
+acosl         -               -               1               1               1
+acoshf        -               -               -               -               -
+acosh         1               -               -               1               1
+acoshl        -               -               -               1               1
+asinf         -               -               -               -               -
+asin          -               -               -               -               -
+asinl         -               -               -               2               2
+asinhf        1               -               -               1               1
+asinh         1               -               -               1               1
+asinhl        -               -               1               1               1
+atanf         -               -               -               -               -
+atan          -               -               -               1               -
+atanl         -               -               -               -               -
+atanhf        1               -               -               1               1
+atanh         -               -               -               -               -
+atanhl        -               -               1               1               1
+atan2f        1               -               -               1               1
+atan2         -               -               -               -               -
+atan2l        -               -               1               2               2
+cabsf         -               -               -               1               -
+cabs          -               -               -               -               -
+cabsl         -               -               -               1               1
+cacosf        2 + i 2         -               1 + i 1         2 + i 2         2 + i 2
+cacos         1 + i 1         -               1 + i 1         1 + i 3         1 + i 1
+cacosl        -               -               1 + i 2         1 + i 2         2 + i 2
+cacoshf       2 + i 2         -               1 + i 1         7 + i 3         2 + i 2
+cacosh        1 + i 1         -               1 + i 1         1 + i 1         1 + i 1
+cacoshl       -               -               2 + i 1         2 + i 1         2 + i 2
+cargf         -               -               -               -               -
+carg          -               -               -               -               -
+cargl         -               -               -               1               1
+casinf        1 + i 2         -               1 + i 1         1 + i 2         1 + i 2
+casin         1 + i 1         -               1 + i 1         1 + i 3         1 + i 1
+casinl        -               -               1 + i 2         1 + i 2         2 + i 2
+casinhf       2 + i 1         -               1 + i 1         2 + i 1         2 + i 1
+casinh        1 + i 1         -               1 + i 1         5 + i 3         1 + i 1
+casinhl       -               -               2 + i 1         2 + i 1         2 + i 2
+catanf        1 + i 1         -               0 + i 1         4 + i 1         1 + i 1
+catan         0 + i 1         -               0 + i 1         0 + i 1         0 + i 1
+catanl        -               -               0 + i 1         1 + i 1         1 + i 1
+catanhf       1 + i 1         -               1 + i 0         1 + i 1         1 + i 1
+catanh        1 + i 0         -               1 + i 0         4 + i 0         1 + i 0
+catanhl       -               -               1 + i 0         1 + i 1         1 + i 1
+cbrtf         1               -               -               1               1
+cbrt          1               -               1               1               1
+cbrtl         -               -               1               1               1
+ccosf         1 + i 1         -               1 + i 1         1 + i 1         1 + i 1
+ccos          1 + i 1         -               1 + i 1         1 + i 1         1 + i 1
+ccosl         -               -               1 + i 1         1 + i 1         1 + i 2
+ccoshf        1 + i 1         -               1 + i 1         1 + i 1         1 + i 1
+ccosh         1 + i 1         -               1 + i 1         1 + i 1         1 + i 1
+ccoshl        -               -               0 + i 1         1 + i 2         1 + i 2
+ceilf         -               -               -               -               -
+ceil          -               -               -               -               -
+ceill         -               -               -               -               -
+cexpf         1 + i 2         -               1 + i 1         1 + i 2         1 + i 2
+cexp          2 + i 1         -               1 + i 1         2 + i 1         2 + i 1
+cexpl         -               -               1 + i 1         2 + i 2         2 + i 2
+cimagf        -               -               -               -               -
+cimag         -               -               -               -               -
+cimagl        -               -               -               -               -
+clogf         1 + i 1         -               1 + i 0         2 + i 3         1 + i 1
+clog          1 + i 0         -               1 + i 1         1 + i 1         1 + i 0
+clogl         -               -               1 + i 1         1 + i 2         1 + i 2
+clog10f       2 + i 1         -               1 + i 1         2 + i 1         2 + i 1
+clog10        2 + i 1         -               1 + i 1         2 + i 1         2 + i 1
+clog10l       -               -               1 + i 1         2 + i 2         2 + i 2
+conjf         -               -               -               -               -
+conj          -               -               -               -               -
+conjl         -               -               -               -               -
+copysignf     -               -               -               -               -
+copysign      -               -               -               -               -
+copysignl     -               -               -               -               -
+cosf          1               -               -               1               1
+cos           -               -               -               2               -
+cosl          -               -               1               2               2
+coshf         1               -               -               1               1
+cosh          1               -               -               1               1
+coshl         -               -               2               3               3
+cpowf         4 + i 2         -               5 + i 1         5 + i 2         4 + i 2
+cpow          2 + i 0         -               2 + i 1         2 + i 2         2 + i 0
+cpowl         -               -               3 + i 4         4 + i 2         4 + i 1
+cprojf        -               -               -               -               -
+cproj         -               -               -               -               -
+cprojl        -               -               -               0 + i 1         -
+crealf        -               -               -               -               -
+creal         -               -               -               -               -
+creall        -               -               -               -               -
+csinf         1 + i 0         -               1 + i 1         1 + i 0         1 + i 0
+csin          1 + i 0         -               1 + i 1         1 + i 0         1 + i 0
+csinl         -               -               1 + i 0         1 + i 1         2 + i 1
+csinhf        1 + i 1         -               1 + i 1         1 + i 1         1 + i 1
+csinh         0 + i 1         -               1 + i 1         0 + i 1         0 + i 1
+csinhl        -               -               1 + i 0         1 + i 1         1 + i 2
+csqrtf        1 + i 1         -               -               2 + i 2         1 + i 1
+csqrt         1 + i 1         -               1 + i 0         1 + i 1         1 + i 1
+csqrtl        -               -               1 + i 1         1 + i 1         1 + i 1
+ctanf         1 + i 1         -               1 + i 1         1 + i 1         1 + i 1
+ctan          1 + i 2         -               1 + i 1         1 + i 2         1 + i 2
+ctanl         -               -               2 + i 1         2 + i 2         2 + i 2
+ctanhf        1 + i 2         -               1 + i 1         2 + i 1         1 + i 2
+ctanh         2 + i 2         -               1 + i 1         2 + i 2         2 + i 2
+ctanhl        -               -               1 + i 2         2 + i 3         2 + i 3
+erff          -               -               -               -               -
+erf           1               -               1               1               1
+erfl          -               -               1               1               1
+erfcf         1               -               -               1               1
+erfc          1               -               1               1               1
+erfcl         -               -               1               2               2
+expf          -               -               -               -               -
+exp           -               -               -               -               -
+expl          -               -               -               1               1
+exp10f        -               -               -               1               -
+exp10         1               -               -               1               1
+exp10l        -               -               1               1               1
+exp2f         -               -               -               -               -
+exp2          -               -               -               -               -
+exp2l         -               -               -               2               -
+expm1f        1               -               -               1               1
+expm1         1               -               -               1               1
+expm1l        -               -               1               1               1
+fabsf         -               -               -               -               -
+fabs          -               -               -               -               -
+fabsl         -               -               -               -               -
+fdimf         -               -               -               -               -
+fdim          -               -               -               -               -
+fdiml         -               -               -               -               -
+floorf        -               -               -               -               -
+floor         -               -               -               -               -
+floorl        -               -               -               -               -
+fmaf          -               -               -               -               -
+fma           -               -               -               -               -
+fmal          -               -               -               -               -
+fmaxf         -               -               -               -               -
+fmax          -               -               -               -               -
+fmaxl         -               -               -               -               -
+fminf         -               -               -               -               -
+fmin          -               -               -               -               -
+fminl         -               -               -               -               -
+fmodf         -               -               -               -               -
+fmod          -               -               -               -               -
+fmodl         -               -               -               -               -
+frexpf        -               -               -               -               -
+frexp         -               -               -               -               -
+frexpl        -               -               -               -               -
+gammaf        1               -               1               2               1
+gamma         1               -               1               1               1
+gammal        -               -               1               1               1
+hypotf        -               -               -               1               -
+hypot         1               -               -               1               1
+hypotl        -               -               1               1               1
+ilogbf        -               -               -               -               -
+ilogb         -               -               -               -               -
+ilogbl        -               -               -               -               -
+j0f           2               -               1               2               2
+j0            2               -               1               3               2
+j0l           -               -               2               2               2
+j1f           2               -               1               2               2
+j1            1               -               2               1               1
+j1l           -               -               1               1               1
+jnf           4               -               3               5               4
+jn            4               -               2               4               4
+jnl           -               -               4               7               4
+lgammaf       1               -               1               2               1
+lgamma        1               -               1               1               1
+lgammal       -               -               1               1               1
+lrintf        -               -               -               -               -
+lrint         -               -               -               -               -
+lrintl        -               -               -               -               -
+llrintf       -               -               -               -               -
+llrint        -               -               -               -               -
+llrintl       -               -               -               -               -
+logf          1               -               -               1               1
+log           -               -               -               -               -
+logl          -               -               1               1               1
+log10f        2               -               -               2               2
+log10         1               -               -               1               1
+log10l        -               -               1               1               1
+log1pf        1               -               -               1               1
+log1p         -               -               -               -               -
+log1pl        -               -               1               1               1
+log2f         -               -               -               -               -
+log2          -               -               -               -               -
+log2l         -               -               -               1               1
+logbf         -               -               -               -               -
+logb          -               -               -               -               -
+logbl         -               -               -               -               -
+lroundf       -               -               -               -               -
+lround        -               -               -               -               -
+lroundl       -               -               -               -               -
+llroundf      -               -               -               -               -
+llround       -               -               -               -               -
+llroundl      -               -               -               -               -
+modff         -               -               -               -               -
+modf          -               -               -               -               -
+modfl         -               -               -               -               -
+nearbyintf    -               -               -               -               -
+nearbyint     -               -               -               -               -
+nearbyintl    -               -               -               -               -
+nextafterf    -               -               -               -               -
+nextafter     -               -               -               -               -
+nextafterl    -               -               -               -               -
+nexttowardf   -               -               -               -               -
+nexttoward    -               -               -               -               -
+nexttowardl   -               -               -               -               -
+powf          1               -               -               1               1
+pow           -               -               -               -               -
+powl          -               -               1               1               1
+remainderf    -               -               -               -               -
+remainder     -               -               -               -               -
+remainderl    -               -               -               -               -
+remquof       -               -               -               -               -
+remquo        -               -               -               -               -
+remquol       -               -               -               -               -
+rintf         -               -               -               -               -
+rint          -               -               -               -               -
+rintl         -               -               -               -               -
+roundf        -               -               -               -               -
+round         -               -               -               -               -
+roundl        -               -               -               -               -
+scalbf        -               -               -               -               -
+scalb         -               -               -               -               -
+scalbl        -               -               -               -               -
+scalbnf       -               -               -               -               -
+scalbn        -               -               -               -               -
+scalbnl       -               -               -               -               -
+scalblnf      -               -               -               -               -
+scalbln       -               -               -               -               -
+scalblnl      -               -               -               -               -
+sinf          1               -               -               1               1
+sin           -               -               -               -               -
+sinl          -               -               1               1               1
+sincosf       1               -               -               1               1
+sincos        -               -               -               1               -
+sincosl       -               -               1               1               1
+sinhf         -               -               -               -               -
+sinh          -               -               -               -               -
+sinhl         -               -               -               1               1
+sqrtf         -               -               -               -               -
+sqrt          -               -               -               1               -
+sqrtl         -               -               -               1               -
+tanf          -               -               1               -               -
+tan           -               -               -               1               -
+tanl          -               -               1               2               2
+tanhf         -               -               -               -               -
+tanh          -               -               -               -               -
+tanhl         -               -               -               1               1
+tgammaf       3               -               2               3               3
+tgamma        4               -               4               4               4
+tgammal       -               -               4               3               3
+truncf        -               -               -               -               -
+trunc         -               -               -               -               -
+truncl        -               -               -               -               -
+y0f           1               -               1               1               1
+y0            2               -               1               2               2
+y0l           -               -               1               1               1
+y1f           2               -               2               2               2
+y1            3               -               2               3               3
+y1l           -               -               2               2               2
+ynf           2               -               3               2               2
+yn            3               -               2               3               3
+ynl           -               -               4               2               2
+Function      S/390           sh              sparc/fpu       x86_64/fpu
+acosf         -               -               -               -
+acos          -               -               -               -
+acosl         -               -               -               1
+acoshf        -               -               -               -
+acosh         1               1               1               1
+acoshl        1               -               1               -
+asinf         -               -               -               -
+asin          -               -               -               -
+asinl         1               -               1               -
+asinhf        1               1               1               1
+asinh         1               1               1               1
+asinhl        1               -               1               1
+atanf         -               -               -               -
+atan          1               -               -               -
+atanl         -               -               -               -
+atanhf        1               1               1               1
+atanh         -               -               -               -
+atanhl        1               -               1               1
+atan2f        1               1               1               1
+atan2         -               -               -               -
+atan2l        1               -               1               1
+cabsf         -               -               -               -
+cabs          -               -               -               -
+cabsl         -               -               -               -
+cacosf        2 + i 2         2 + i 2         2 + i 2         2 + i 2
+cacos         1 + i 1         1 + i 1         1 + i 1         1 + i 1
+cacosl        2 + i 2         -               2 + i 2         1 + i 2
+cacoshf       2 + i 2         2 + i 2         2 + i 2         2 + i 2
+cacosh        1 + i 1         1 + i 1         1 + i 1         1 + i 1
+cacoshl       2 + i 2         -               2 + i 2         2 + i 1
+cargf         -               -               -               -
+carg          -               -               -               -
+cargl         -               -               -               -
+casinf        1 + i 2         1 + i 2         1 + i 2         1 + i 2
+casin         1 + i 1         1 + i 1         1 + i 1         1 + i 1
+casinl        2 + i 2         -               2 + i 2         1 + i 2
+casinhf       2 + i 1         2 + i 1         2 + i 1         2 + i 1
+casinh        1 + i 1         1 + i 1         1 + i 1         1 + i 1
+casinhl       2 + i 2         -               2 + i 2         2 + i 1
+catanf        1 + i 1         1 + i 1         1 + i 1         1 + i 1
+catan         0 + i 1         0 + i 1         0 + i 1         0 + i 1
+catanl        1 + i 1         -               1 + i 1         0 + i 1
+catanhf       1 + i 1         1 + i 1         1 + i 1         1 + i 1
+catanh        1 + i 0         1 + i 0         1 + i 0         1 + i 0
+catanhl       1 + i 1         -               1 + i 1         1 + i 0
+cbrtf         1               1               1               1
+cbrt          1               1               1               1
+cbrtl         1               -               1               1
+ccosf         1 + i 1         1 + i 1         1 + i 1         1 + i 1
+ccos          1 + i 1         1 + i 1         1 + i 1         1 + i 1
+ccosl         1 + i 1         -               1 + i 1         1 + i 1
+ccoshf        1 + i 1         1 + i 1         1 + i 1         1 + i 1
+ccosh         1 + i 1         1 + i 1         1 + i 1         1 + i 1
+ccoshl        1 + i 1         -               1 + i 1         0 + i 1
+ceilf         -               -               -               -
+ceil          -               -               -               -
+ceill         -               -               -               -
+cexpf         1 + i 2         1 + i 2         1 + i 2         1 + i 2
+cexp          2 + i 1         2 + i 1         2 + i 1         2 + i 1
+cexpl         1 + i 1         -               1 + i 1         1 + i 1
+cimagf        -               -               -               -
+cimag         -               -               -               -
+cimagl        -               -               -               -
+clogf         1 + i 1         1 + i 1         1 + i 1         1 + i 1
+clog          1 + i 1         1 + i 0         1 + i 0         1 + i 0
+clogl         1 + i 1         -               1 + i 1         1 + i 1
+clog10f       2 + i 1         2 + i 1         2 + i 1         2 + i 1
+clog10        2 + i 1         2 + i 1         2 + i 1         2 + i 1
+clog10l       1 + i 2         -               1 + i 2         1 + i 1
+conjf         -               -               -               -
+conj          -               -               -               -
+conjl         -               -               -               -
+copysignf     -               -               -               -
+copysign      -               -               -               -
+copysignl     -               -               -               -
+cosf          1               1               1               -
+cos           -               -               -               -
+cosl          1               -               1               1
+coshf         1               1               1               1
+cosh          1               1               1               1
+coshl         1               -               1               2
+cpowf         5 + i 2         4 + i 2         4 + i 2         5 + i 2
+cpow          2 + i 0         2 + i 0         2 + i 0         2 + i 0
+cpowl         4 + i 1         -               4 + i 1         3 + i 4
+cprojf        -               -               -               -
+cproj         -               -               -               -
+cprojl        -               -               -               -
+crealf        -               -               -               -
+creal         -               -               -               -
+creall        -               -               -               -
+csinf         1 + i 0         1 + i 0         1 + i 0         1 + i 0
+csin          1 + i 0         1 + i 0         1 + i 0         1 + i 0
+csinl         1 + i 1         -               1 + i 1         1 + i 0
+csinhf        1 + i 1         1 + i 1         1 + i 1         1 + i 1
+csinh         0 + i 1         0 + i 1         0 + i 1         0 + i 1
+csinhl        1 + i 1         -               1 + i 1         1 + i 0
+csqrtf        1 + i 1         1 + i 1         1 + i 1         1 + i 1
+csqrt         1 + i 1         1 + i 1         1 + i 1         1 + i 1
+csqrtl        1 + i 1         -               1 + i 1         1 + i 1
+ctanf         1 + i 1         1 + i 1         1 + i 1         1 + i 2
+ctan          1 + i 2         1 + i 2         1 + i 2         1 + i 2
+ctanl         3 + i 3         -               3 + i 3         2 + i 1
+ctanhf        2 + i 1         1 + i 2         1 + i 2         2 + i 2
+ctanh         2 + i 2         2 + i 2         2 + i 2         2 + i 2
+ctanhl        3 + i 3         -               3 + i 3         1 + i 2
+erff          -               -               -               -
+erf           1               1               1               1
+erfl          1               -               1               1
+erfcf         1               1               1               1
+erfc          1               1               1               1
+erfcl         1               -               1               1
+expf          -               -               -               -
+exp           -               -               -               -
+expl          -               -               -               -
+exp10f        -               -               -               -
+exp10         1               1               1               1
+exp10l        1               -               1               1
+exp2f         -               -               -               -
+exp2          -               -               -               -
+exp2l         1               -               1               -
+expm1f        1               1               1               1
+expm1         1               1               1               1
+expm1l        1               -               1               1
+fabsf         -               -               -               -
+fabs          -               -               -               -
+fabsl         -               -               -               -
+fdimf         -               -               -               -
+fdim          -               -               -               -
+fdiml         -               -               -               -
+floorf        -               -               -               -
+floor         -               -               -               -
+floorl        -               -               -               -
+fmaf          -               -               -               -
+fma           -               -               -               -
+fmal          -               -               -               -
+fmaxf         -               -               -               -
+fmax          -               -               -               -
+fmaxl         -               -               -               -
+fminf         -               -               -               -
+fmin          -               -               -               -
+fminl         -               -               -               -
+fmodf         -               -               -               -
+fmod          -               -               -               -
+fmodl         -               -               -               -
+frexpf        -               -               -               -
+frexp         -               -               -               -
+frexpl        -               -               -               -
+gammaf        1               1               1               1
+gamma         1               1               1               1
+gammal        1               -               1               1
+hypotf        -               -               -               -
+hypot         1               1               1               1
+hypotl        1               -               1               1
+ilogbf        -               -               -               -
+ilogb         -               -               -               -
+ilogbl        -               -               -               -
+j0f           2               2               2               2
+j0            2               2               2               2
+j0l           2               -               2               2
+j1f           2               2               2               2
+j1            1               1               1               1
+j1l           4               -               4               1
+jnf           4               4               4               4
+jn            4               4               4               4
+jnl           7               -               7               4
+lgammaf       1               1               1               1
+lgamma        1               1               1               1
+lgammal       1               -               1               1
+lrintf        -               -               -               -
+lrint         -               -               -               -
+lrintl        -               -               -               -
+llrintf       -               -               -               -
+llrint        -               -               -               -
+llrintl       -               -               -               -
+logf          1               1               1               1
+log           -               -               -               -
+logl          1               -               1               1
+log10f        2               2               2               2
+log10         1               1               1               1
+log10l        1               -               1               1
+log1pf        1               1               1               1
+log1p         -               -               -               -
+log1pl        1               -               1               1
+log2f         -               -               -               -
+log2          -               -               -               -
+log2l         1               -               1               -
+logbf         -               -               -               -
+logb          -               -               -               -
+logbl         -               -               -               -
+lroundf       -               -               -               -
+lround        -               -               -               -
+lroundl       -               -               -               -
+llroundf      -               -               -               -
+llround       -               -               -               -
+llroundl      -               -               -               -
+modff         -               -               -               -
+modf          -               -               -               -
+modfl         -               -               -               -
+nearbyintf    -               -               -               -
+nearbyint     -               -               -               -
+nearbyintl    -               -               -               -
+nextafterf    -               -               -               -
+nextafter     -               -               -               -
+nextafterl    -               -               -               -
+nexttowardf   -               -               -               -
+nexttoward    -               -               -               -
+nexttowardl   -               -               -               -
+powf          1               1               1               1
+pow           -               -               -               -
+powl          1               -               1               1
+remainderf    -               -               -               -
+remainder     -               -               -               -
+remainderl    -               -               -               -
+remquof       -               -               -               -
+remquo        -               -               -               -
+remquol       -               -               -               -
+rintf         -               -               -               -
+rint          -               -               -               -
+rintl         -               -               -               -
+roundf        -               -               -               -
+round         -               -               -               -
+roundl        -               -               -               -
+scalbf        -               -               -               -
+scalb         -               -               -               -
+scalbl        -               -               -               -
+scalbnf       -               -               -               -
+scalbn        -               -               -               -
+scalbnl       -               -               -               -
+scalblnf      -               -               -               -
+scalbln       -               -               -               -
+scalblnl      -               -               -               -
+sinf          1               1               1               -
+sin           -               -               -               -
+sinl          1               -               1               1
+sincosf       1               1               1               -
+sincos        -               -               -               -
+sincosl       1               -               1               1
+sinhf         -               -               -               -
+sinh          -               -               -               -
+sinhl         -               -               -               1
+sqrtf         -               -               -               -
+sqrt          -               -               -               -
+sqrtl         -               -               -               -
+tanf          -               -               -               -
+tan           -               -               -               -
+tanl          1               -               1               1
+tanhf         -               -               -               -
+tanh          -               -               -               -
+tanhl         1               -               1               -
+tgammaf       3               3               3               3
+tgamma        4               4               4               4
+tgammal       4               -               4               4
+truncf        -               -               -               -
+trunc         -               -               -               -
+truncl        -               -               -               -
+y0f           1               1               1               1
+y0            2               2               2               2
+y0l           3               -               3               1
+y1f           2               2               2               2
+y1            3               3               3               3
+y1l           2               -               2               2
+ynf           2               2               2               3
+yn            3               3               3               3
+ynl           4               -               4               4
+
+
+File: libc.info,  Node: Pseudo-Random Numbers,  Next: FP Function Optimizations,  Prev: Errors in Math Functions,  Up: Mathematics
+
+19.8 Pseudo-Random Numbers
+==========================
+
+This section describes the GNU facilities for generating a series of
+pseudo-random numbers.  The numbers generated are not truly random;
+typically, they form a sequence that repeats periodically, with a period
+so large that you can ignore it for ordinary purposes.  The random
+number generator works by remembering a "seed" value which it uses to
+compute the next random number and also to compute a new seed.
+
+   Although the generated numbers look unpredictable within one run of a
+program, the sequence of numbers is _exactly the same_ from one run to
+the next.  This is because the initial seed is always the same.  This is
+convenient when you are debugging a program, but it is unhelpful if you
+want the program to behave unpredictably.  If you want a different
+pseudo-random series each time your program runs, you must specify a
+different seed each time.  For ordinary purposes, basing the seed on the
+current time works well.
+
+   You can obtain repeatable sequences of numbers on a particular
+machine type by specifying the same initial seed value for the random
+number generator.  There is no standard meaning for a particular seed
+value; the same seed, used in different C libraries or on different CPU
+types, will give you different random numbers.
+
+   The GNU C Library supports the standard ISO C random number functions
+plus two other sets derived from BSD and SVID. The BSD and ISO C
+functions provide identical, somewhat limited functionality.  If only a
+small number of random bits are required, we recommend you use the ISO C
+interface, 'rand' and 'srand'.  The SVID functions provide a more
+flexible interface, which allows better random number generator
+algorithms, provides more random bits (up to 48) per call, and can
+provide random floating-point numbers.  These functions are required by
+the XPG standard and therefore will be present in all modern Unix
+systems.
+
+* Menu:
+
+* ISO Random::                  'rand' and friends.
+* BSD Random::                  'random' and friends.
+* SVID Random::                 'drand48' and friends.
+
+
+File: libc.info,  Node: ISO Random,  Next: BSD Random,  Up: Pseudo-Random Numbers
+
+19.8.1 ISO C Random Number Functions
+------------------------------------
+
+This section describes the random number functions that are part of the ISO C
+standard.
+
+   To use these facilities, you should include the header file
+'stdlib.h' in your program.
+
+ -- Macro: int RAND_MAX
+     The value of this macro is an integer constant representing the
+     largest value the 'rand' function can return.  In the GNU C
+     Library, it is '2147483647', which is the largest signed integer
+     representable in 32 bits.  In other libraries, it may be as low as
+     '32767'.
+
+ -- Function: int rand (void)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     The 'rand' function returns the next pseudo-random number in the
+     series.  The value ranges from '0' to 'RAND_MAX'.
+
+ -- Function: void srand (unsigned int SEED)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     This function establishes SEED as the seed for a new series of
+     pseudo-random numbers.  If you call 'rand' before a seed has been
+     established with 'srand', it uses the value '1' as a default seed.
+
+     To produce a different pseudo-random series each time your program
+     is run, do 'srand (time (0))'.
+
+   POSIX.1 extended the C standard functions to support reproducible
+random numbers in multi-threaded programs.  However, the extension is
+badly designed and unsuitable for serious work.
+
+ -- Function: int rand_r (unsigned int *SEED)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function returns a random number in the range 0 to 'RAND_MAX'
+     just as 'rand' does.  However, all its state is stored in the SEED
+     argument.  This means the RNG's state can only have as many bits as
+     the type 'unsigned int' has.  This is far too few to provide a good
+     RNG.
+
+     If your program requires a reentrant RNG, we recommend you use the
+     reentrant GNU extensions to the SVID random number generator.  The
+     POSIX.1 interface should only be used when the GNU extensions are
+     not available.
+
+
+File: libc.info,  Node: BSD Random,  Next: SVID Random,  Prev: ISO Random,  Up: Pseudo-Random Numbers
+
+19.8.2 BSD Random Number Functions
+----------------------------------
+
+This section describes a set of random number generation functions that
+are derived from BSD. There is no advantage to using these functions
+with the GNU C Library; we support them for BSD compatibility only.
+
+   The prototypes for these functions are in 'stdlib.h'.
+
+ -- Function: long int random (void)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     This function returns the next pseudo-random number in the
+     sequence.  The value returned ranges from '0' to '2147483647'.
+
+     *NB:* Temporarily this function was defined to return a 'int32_t'
+     value to indicate that the return value always contains 32 bits
+     even if 'long int' is wider.  The standard demands it differently.
+     Users must always be aware of the 32-bit limitation, though.
+
+ -- Function: void srandom (unsigned int SEED)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     The 'srandom' function sets the state of the random number
+     generator based on the integer SEED.  If you supply a SEED value of
+     '1', this will cause 'random' to reproduce the default set of
+     random numbers.
+
+     To produce a different set of pseudo-random numbers each time your
+     program runs, do 'srandom (time (0))'.
+
+ -- Function: char * initstate (unsigned int SEED, char *STATE, size_t
+          SIZE)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     The 'initstate' function is used to initialize the random number
+     generator state.  The argument STATE is an array of SIZE bytes,
+     used to hold the state information.  It is initialized based on
+     SEED.  The size must be between 8 and 256 bytes, and should be a
+     power of two.  The bigger the STATE array, the better.
+
+     The return value is the previous value of the state information
+     array.  You can use this value later as an argument to 'setstate'
+     to restore that state.
+
+ -- Function: char * setstate (char *STATE)
+     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
+     POSIX Safety Concepts::.
+
+     The 'setstate' function restores the random number state
+     information STATE.  The argument must have been the result of a
+     previous call to INITSTATE or SETSTATE.
+
+     The return value is the previous value of the state information
+     array.  You can use this value later as an argument to 'setstate'
+     to restore that state.
+
+     If the function fails the return value is 'NULL'.
+
+   The four functions described so far in this section all work on a
+state which is shared by all threads.  The state is not directly
+accessible to the user and can only be modified by these functions.
+This makes it hard to deal with situations where each thread should have
+its own pseudo-random number generator.
+
+   The GNU C Library contains four additional functions which contain
+the state as an explicit parameter and therefore make it possible to
+handle thread-local PRNGs.  Beside this there is no difference.  In
+fact, the four functions already discussed are implemented internally
+using the following interfaces.
+
+   The 'stdlib.h' header contains a definition of the following type:
+
+ -- Data Type: struct random_data
+
+     Objects of type 'struct random_data' contain the information
+     necessary to represent the state of the PRNG. Although a complete
+     definition of the type is present the type should be treated as
+     opaque.
+
+   The functions modifying the state follow exactly the already
+described functions.
+
+ -- Function: int random_r (struct random_data *restrict BUF, int32_t
+          *restrict RESULT)
+     Preliminary: | MT-Safe race:buf | AS-Safe | AC-Unsafe corrupt |
+     *Note POSIX Safety Concepts::.
+
+     The 'random_r' function behaves exactly like the 'random' function
+     except that it uses and modifies the state in the object pointed to
+     by the first parameter instead of the global state.
+
+ -- Function: int srandom_r (unsigned int SEED, struct random_data *BUF)
+     Preliminary: | MT-Safe race:buf | AS-Safe | AC-Unsafe corrupt |
+     *Note POSIX Safety Concepts::.
+
+     The 'srandom_r' function behaves exactly like the 'srandom'
+     function except that it uses and modifies the state in the object
+     pointed to by the second parameter instead of the global state.
+
+ -- Function: int initstate_r (unsigned int SEED, char *restrict
+          STATEBUF, size_t STATELEN, struct random_data *restrict BUF)
+     Preliminary: | MT-Safe race:buf | AS-Safe | AC-Unsafe corrupt |
+     *Note POSIX Safety Concepts::.
+
+     The 'initstate_r' function behaves exactly like the 'initstate'
+     function except that it uses and modifies the state in the object
+     pointed to by the fourth parameter instead of the global state.
+
+ -- Function: int setstate_r (char *restrict STATEBUF, struct
+          random_data *restrict BUF)
+     Preliminary: | MT-Safe race:buf | AS-Safe | AC-Unsafe corrupt |
+     *Note POSIX Safety Concepts::.
+
+     The 'setstate_r' function behaves exactly like the 'setstate'
+     function except that it uses and modifies the state in the object
+     pointed to by the first parameter instead of the global state.
+
+
+File: libc.info,  Node: SVID Random,  Prev: BSD Random,  Up: Pseudo-Random Numbers
+
+19.8.3 SVID Random Number Function
+----------------------------------
+
+The C library on SVID systems contains yet another kind of random number
+generator functions.  They use a state of 48 bits of data.  The user can
+choose among a collection of functions which return the random bits in
+different forms.
+
+   Generally there are two kinds of function.  The first uses a state of
+the random number generator which is shared among several functions and
+by all threads of the process.  The second requires the user to handle
+the state.
+
+   All functions have in common that they use the same congruential
+formula with the same constants.  The formula is
+
+     Y = (a * X + c) mod m
+
+where X is the state of the generator at the beginning and Y the state
+at the end.  'a' and 'c' are constants determining the way the generator
+works.  By default they are
+
+     a = 0x5DEECE66D = 25214903917
+     c = 0xb = 11
+
+but they can also be changed by the user.  'm' is of course 2^48 since
+the state consists of a 48-bit array.
+
+   The prototypes for these functions are in 'stdlib.h'.
+
+ -- Function: double drand48 (void)
+     Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     This function returns a 'double' value in the range of '0.0' to
+     '1.0' (exclusive).  The random bits are determined by the global
+     state of the random number generator in the C library.
+
+     Since the 'double' type according to IEEE 754 has a 52-bit mantissa
+     this means 4 bits are not initialized by the random number
+     generator.  These are (of course) chosen to be the least
+     significant bits and they are initialized to '0'.
+
+ -- Function: double erand48 (unsigned short int XSUBI[3])
+     Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     This function returns a 'double' value in the range of '0.0' to
+     '1.0' (exclusive), similarly to 'drand48'.  The argument is an
+     array describing the state of the random number generator.
+
+     This function can be called subsequently since it updates the array
+     to guarantee random numbers.  The array should have been
+     initialized before initial use to obtain reproducible results.
+
+ -- Function: long int lrand48 (void)
+     Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'lrand48' function returns an integer value in the range of '0'
+     to '2^31' (exclusive).  Even if the size of the 'long int' type can
+     take more than 32 bits, no higher numbers are returned.  The random
+     bits are determined by the global state of the random number
+     generator in the C library.
+
+ -- Function: long int nrand48 (unsigned short int XSUBI[3])
+     Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     This function is similar to the 'lrand48' function in that it
+     returns a number in the range of '0' to '2^31' (exclusive) but the
+     state of the random number generator used to produce the random
+     bits is determined by the array provided as the parameter to the
+     function.
+
+     The numbers in the array are updated afterwards so that subsequent
+     calls to this function yield different results (as is expected of a
+     random number generator).  The array should have been initialized
+     before the first call to obtain reproducible results.
+
+ -- Function: long int mrand48 (void)
+     Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'mrand48' function is similar to 'lrand48'.  The only
+     difference is that the numbers returned are in the range '-2^31' to
+     '2^31' (exclusive).
+
+ -- Function: long int jrand48 (unsigned short int XSUBI[3])
+     Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'jrand48' function is similar to 'nrand48'.  The only
+     difference is that the numbers returned are in the range '-2^31' to
+     '2^31' (exclusive).  For the 'xsubi' parameter the same
+     requirements are necessary.
+
+   The internal state of the random number generator can be initialized
+in several ways.  The methods differ in the completeness of the
+information provided.
+
+ -- Function: void srand48 (long int SEEDVAL)
+     Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'srand48' function sets the most significant 32 bits of the
+     internal state of the random number generator to the least
+     significant 32 bits of the SEEDVAL parameter.  The lower 16 bits
+     are initialized to the value '0x330E'.  Even if the 'long int' type
+     contains more than 32 bits only the lower 32 bits are used.
+
+     Owing to this limitation, initialization of the state of this
+     function is not very useful.  But it makes it easy to use a
+     construct like 'srand48 (time (0))'.
+
+     A side-effect of this function is that the values 'a' and 'c' from
+     the internal state, which are used in the congruential formula, are
+     reset to the default values given above.  This is of importance
+     once the user has called the 'lcong48' function (see below).
+
+ -- Function: unsigned short int * seed48 (unsigned short int
+          SEED16V[3])
+     Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'seed48' function initializes all 48 bits of the state of the
+     internal random number generator from the contents of the parameter
+     SEED16V.  Here the lower 16 bits of the first element of SEE16V
+     initialize the least significant 16 bits of the internal state, the
+     lower 16 bits of 'SEED16V[1]' initialize the mid-order 16 bits of
+     the state and the 16 lower bits of 'SEED16V[2]' initialize the most
+     significant 16 bits of the state.
+
+     Unlike 'srand48' this function lets the user initialize all 48 bits
+     of the state.
+
+     The value returned by 'seed48' is a pointer to an array containing
+     the values of the internal state before the change.  This might be
+     useful to restart the random number generator at a certain state.
+     Otherwise the value can simply be ignored.
+
+     As for 'srand48', the values 'a' and 'c' from the congruential
+     formula are reset to the default values.
+
+   There is one more function to initialize the random number generator
+which enables you to specify even more information by allowing you to
+change the parameters in the congruential formula.
+
+ -- Function: void lcong48 (unsigned short int PARAM[7])
+     Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'lcong48' function allows the user to change the complete state
+     of the random number generator.  Unlike 'srand48' and 'seed48',
+     this function also changes the constants in the congruential
+     formula.
+
+     From the seven elements in the array PARAM the least significant 16
+     bits of the entries 'PARAM[0]' to 'PARAM[2]' determine the initial
+     state, the least significant 16 bits of 'PARAM[3]' to 'PARAM[5]'
+     determine the 48 bit constant 'a' and 'PARAM[6]' determines the
+     16-bit value 'c'.
+
+   All the above functions have in common that they use the global
+parameters for the congruential formula.  In multi-threaded programs it
+might sometimes be useful to have different parameters in different
+threads.  For this reason all the above functions have a counterpart
+which works on a description of the random number generator in the
+user-supplied buffer instead of the global state.
+
+   Please note that it is no problem if several threads use the global
+state if all threads use the functions which take a pointer to an array
+containing the state.  The random numbers are computed following the
+same loop but if the state in the array is different all threads will
+obtain an individual random number generator.
+
+   The user-supplied buffer must be of type 'struct drand48_data'.  This
+type should be regarded as opaque and not manipulated directly.
+
+ -- Function: int drand48_r (struct drand48_data *BUFFER, double
+          *RESULT)
+     Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt |
+     *Note POSIX Safety Concepts::.
+
+     This function is equivalent to the 'drand48' function with the
+     difference that it does not modify the global random number
+     generator parameters but instead the parameters in the buffer
+     supplied through the pointer BUFFER.  The random number is returned
+     in the variable pointed to by RESULT.
+
+     The return value of the function indicates whether the call
+     succeeded.  If the value is less than '0' an error occurred and
+     ERRNO is set to indicate the problem.
+
+     This function is a GNU extension and should not be used in portable
+     programs.
+
+ -- Function: int erand48_r (unsigned short int XSUBI[3], struct
+          drand48_data *BUFFER, double *RESULT)
+     Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt |
+     *Note POSIX Safety Concepts::.
+
+     The 'erand48_r' function works like 'erand48', but in addition it
+     takes an argument BUFFER which describes the random number
+     generator.  The state of the random number generator is taken from
+     the 'xsubi' array, the parameters for the congruential formula from
+     the global random number generator data.  The random number is
+     returned in the variable pointed to by RESULT.
+
+     The return value is non-negative if the call succeeded.
+
+     This function is a GNU extension and should not be used in portable
+     programs.
+
+ -- Function: int lrand48_r (struct drand48_data *BUFFER, long int
+          *RESULT)
+     Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt |
+     *Note POSIX Safety Concepts::.
+
+     This function is similar to 'lrand48', but in addition it takes a
+     pointer to a buffer describing the state of the random number
+     generator just like 'drand48'.
+
+     If the return value of the function is non-negative the variable
+     pointed to by RESULT contains the result.  Otherwise an error
+     occurred.
+
+     This function is a GNU extension and should not be used in portable
+     programs.
+
+ -- Function: int nrand48_r (unsigned short int XSUBI[3], struct
+          drand48_data *BUFFER, long int *RESULT)
+     Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt |
+     *Note POSIX Safety Concepts::.
+
+     The 'nrand48_r' function works like 'nrand48' in that it produces a
+     random number in the range '0' to '2^31'.  But instead of using the
+     global parameters for the congruential formula it uses the
+     information from the buffer pointed to by BUFFER.  The state is
+     described by the values in XSUBI.
+
+     If the return value is non-negative the variable pointed to by
+     RESULT contains the result.
+
+     This function is a GNU extension and should not be used in portable
+     programs.
+
+ -- Function: int mrand48_r (struct drand48_data *BUFFER, long int
+          *RESULT)
+     Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt |
+     *Note POSIX Safety Concepts::.
+
+     This function is similar to 'mrand48' but like the other reentrant
+     functions it uses the random number generator described by the
+     value in the buffer pointed to by BUFFER.
+
+     If the return value is non-negative the variable pointed to by
+     RESULT contains the result.
+
+     This function is a GNU extension and should not be used in portable
+     programs.
+
+ -- Function: int jrand48_r (unsigned short int XSUBI[3], struct
+          drand48_data *BUFFER, long int *RESULT)
+     Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt |
+     *Note POSIX Safety Concepts::.
+
+     The 'jrand48_r' function is similar to 'jrand48'.  Like the other
+     reentrant functions of this function family it uses the
+     congruential formula parameters from the buffer pointed to by
+     BUFFER.
+
+     If the return value is non-negative the variable pointed to by
+     RESULT contains the result.
+
+     This function is a GNU extension and should not be used in portable
+     programs.
+
+   Before any of the above functions are used the buffer of type 'struct
+drand48_data' should be initialized.  The easiest way to do this is to
+fill the whole buffer with null bytes, e.g.  by
+
+     memset (buffer, '\0', sizeof (struct drand48_data));
+
+Using any of the reentrant functions of this family now will
+automatically initialize the random number generator to the default
+values for the state and the parameters of the congruential formula.
+
+   The other possibility is to use any of the functions which explicitly
+initialize the buffer.  Though it might be obvious how to initialize the
+buffer from looking at the parameter to the function, it is highly
+recommended to use these functions since the result might not always be
+what you expect.
+
+ -- Function: int srand48_r (long int SEEDVAL, struct drand48_data
+          *BUFFER)
+     Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt |
+     *Note POSIX Safety Concepts::.
+
+     The description of the random number generator represented by the
+     information in BUFFER is initialized similarly to what the function
+     'srand48' does.  The state is initialized from the parameter
+     SEEDVAL and the parameters for the congruential formula are
+     initialized to their default values.
+
+     If the return value is non-negative the function call succeeded.
+
+     This function is a GNU extension and should not be used in portable
+     programs.
+
+ -- Function: int seed48_r (unsigned short int SEED16V[3], struct
+          drand48_data *BUFFER)
+     Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt |
+     *Note POSIX Safety Concepts::.
+
+     This function is similar to 'srand48_r' but like 'seed48' it
+     initializes all 48 bits of the state from the parameter SEED16V.
+
+     If the return value is non-negative the function call succeeded.
+     It does not return a pointer to the previous state of the random
+     number generator like the 'seed48' function does.  If the user
+     wants to preserve the state for a later re-run s/he can copy the
+     whole buffer pointed to by BUFFER.
+
+     This function is a GNU extension and should not be used in portable
+     programs.
+
+ -- Function: int lcong48_r (unsigned short int PARAM[7], struct
+          drand48_data *BUFFER)
+     Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt |
+     *Note POSIX Safety Concepts::.
+
+     This function initializes all aspects of the random number
+     generator described in BUFFER with the data in PARAM.  Here it is
+     especially true that the function does more than just copying the
+     contents of PARAM and BUFFER.  More work is required and therefore
+     it is important to use this function rather than initializing the
+     random number generator directly.
+
+     If the return value is non-negative the function call succeeded.
+
+     This function is a GNU extension and should not be used in portable
+     programs.
+
+
+File: libc.info,  Node: FP Function Optimizations,  Prev: Pseudo-Random Numbers,  Up: Mathematics
+
+19.9 Is Fast Code or Small Code preferred?
+==========================================
+
+If an application uses many floating point functions it is often the
+case that the cost of the function calls themselves is not negligible.
+Modern processors can often execute the operations themselves very fast,
+but the function call disrupts the instruction pipeline.
+
+   For this reason the GNU C Library provides optimizations for many of
+the frequently-used math functions.  When GNU CC is used and the user
+activates the optimizer, several new inline functions and macros are
+defined.  These new functions and macros have the same names as the
+library functions and so are used instead of the latter.  In the case of
+inline functions the compiler will decide whether it is reasonable to
+use them, and this decision is usually correct.
+
+   This means that no calls to the library functions may be necessary,
+and can increase the speed of generated code significantly.  The
+drawback is that code size will increase, and the increase is not always
+negligible.
+
+   There are two kind of inline functions: Those that give the same
+result as the library functions and others that might not set 'errno'
+and might have a reduced precision and/or argument range in comparison
+with the library functions.  The latter inline functions are only
+available if the flag '-ffast-math' is given to GNU CC.
+
+   In cases where the inline functions and macros are not wanted the
+symbol '__NO_MATH_INLINES' should be defined before any system header is
+included.  This will ensure that only library functions are used.  Of
+course, it can be determined for each file in the project whether giving
+this option is preferable or not.
+
+   Not all hardware implements the entire IEEE 754 standard, and even if
+it does there may be a substantial performance penalty for using some of
+its features.  For example, enabling traps on some processors forces the
+FPU to run un-pipelined, which can more than double calculation time.
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-8 b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-8
index 4daa490..6e88445 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-8
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-8
@@ -1,7 +1,24 @@
-This is
-/usr/local/google/home/jnewlin/src/uclibc/buildroot/output/build/glibc-2.19/build/manual/libc.info,
-produced by makeinfo version 4.13 from libc.texinfo.
+This is libc.info, produced by makeinfo version 5.2 from libc.texinfo.
 
+This file documents the GNU C Library.
+
+   This is 'The GNU C Library Reference Manual', for version 2.19
+(Buildroot).
+
+   Copyright (C) 1993-2014 Free Software Foundation, Inc.
+
+   Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being "Free Software Needs Free Documentation" and
+"GNU Lesser General Public License", the Front-Cover texts being "A GNU
+Manual", and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled "GNU Free Documentation
+License".
+
+   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
+modify this GNU manual.  Buying copies from the FSF supports it in
+developing GNU and promoting software freedom."
 INFO-DIR-SECTION Software libraries
 START-INFO-DIR-ENTRY
 * Libc: (libc).                 C library.
@@ -1692,7429 +1709,5838 @@
 * ynl: (libc)Special Functions.
 END-INFO-DIR-ENTRY
 
-   This file documents the GNU C Library.
-
-   This is `The GNU C Library Reference Manual', for version 2.19
-(Buildroot).
-
-   Copyright (C) 1993-2014 Free Software Foundation, Inc.
-
-   Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version
-1.3 or any later version published by the Free Software Foundation;
-with the Invariant Sections being "Free Software Needs Free
-Documentation" and "GNU Lesser General Public License", the Front-Cover
-texts being "A GNU Manual", and with the Back-Cover Texts as in (a)
-below.  A copy of the license is included in the section entitled "GNU
-Free Documentation License".
-
-   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
-modify this GNU manual.  Buying copies from the FSF supports it in
-developing GNU and promoting software freedom."
 
 
-File: libc.info,  Node: Getopt Long Option Example,  Prev: Getopt Long Options,  Up: Getopt
+File: libc.info,  Node: Arithmetic,  Next: Date and Time,  Prev: Mathematics,  Up: Top
 
-25.2.4 Example of Parsing Long Options with `getopt_long'
----------------------------------------------------------
+20 Arithmetic Functions
+***********************
 
-
-     #include <stdio.h>
-     #include <stdlib.h>
-     #include <getopt.h>
-
-     /* Flag set by `--verbose'. */
-     static int verbose_flag;
-
-     int
-     main (int argc, char **argv)
-     {
-       int c;
-
-       while (1)
-         {
-           static struct option long_options[] =
-             {
-               /* These options set a flag. */
-               {"verbose", no_argument,       &verbose_flag, 1},
-               {"brief",   no_argument,       &verbose_flag, 0},
-               /* These options don't set a flag.
-                  We distinguish them by their indices. */
-               {"add",     no_argument,       0, 'a'},
-               {"append",  no_argument,       0, 'b'},
-               {"delete",  required_argument, 0, 'd'},
-               {"create",  required_argument, 0, 'c'},
-               {"file",    required_argument, 0, 'f'},
-               {0, 0, 0, 0}
-             };
-           /* `getopt_long' stores the option index here. */
-           int option_index = 0;
-
-           c = getopt_long (argc, argv, "abc:d:f:",
-                            long_options, &option_index);
-
-           /* Detect the end of the options. */
-           if (c == -1)
-             break;
-
-           switch (c)
-             {
-             case 0:
-               /* If this option set a flag, do nothing else now. */
-               if (long_options[option_index].flag != 0)
-                 break;
-               printf ("option %s", long_options[option_index].name);
-               if (optarg)
-                 printf (" with arg %s", optarg);
-               printf ("\n");
-               break;
-
-             case 'a':
-               puts ("option -a\n");
-               break;
-
-             case 'b':
-               puts ("option -b\n");
-               break;
-
-             case 'c':
-               printf ("option -c with value `%s'\n", optarg);
-               break;
-
-             case 'd':
-               printf ("option -d with value `%s'\n", optarg);
-               break;
-
-             case 'f':
-               printf ("option -f with value `%s'\n", optarg);
-               break;
-
-             case '?':
-               /* `getopt_long' already printed an error message. */
-               break;
-
-             default:
-               abort ();
-             }
-         }
-
-       /* Instead of reporting `--verbose'
-          and `--brief' as they are encountered,
-          we report the final status resulting from them. */
-       if (verbose_flag)
-         puts ("verbose flag is set");
-
-       /* Print any remaining command line arguments (not options). */
-       if (optind < argc)
-         {
-           printf ("non-option ARGV-elements: ");
-           while (optind < argc)
-             printf ("%s ", argv[optind++]);
-           putchar ('\n');
-         }
-
-       exit (0);
-     }
-
-
-File: libc.info,  Node: Argp,  Next: Suboptions,  Prev: Getopt,  Up: Parsing Program Arguments
-
-25.3 Parsing Program Options with Argp
-======================================
-
-"Argp" is an interface for parsing unix-style argument vectors.  *Note
-Program Arguments::.
-
-   Argp provides features unavailable in the more commonly used
-`getopt' interface.  These features include automatically producing
-output in response to the `--help' and `--version' options, as
-described in the GNU coding standards.  Using argp makes it less likely
-that programmers will neglect to implement these additional options or
-keep them up to date.
-
-   Argp also provides the ability to merge several independently defined
-option parsers into one, mediating conflicts between them and making the
-result appear seamless.  A library can export an argp option parser that
-user programs might employ in conjunction with their own option parsers,
-resulting in less work for the user programs.  Some programs may use
-only argument parsers exported by libraries, thereby achieving
-consistent and efficient option-parsing for abstractions implemented by
-the libraries.
-
-   The header file `<argp.h>' should be included to use argp.
-
-25.3.1 The `argp_parse' Function
---------------------------------
-
-The main interface to argp is the `argp_parse' function.  In many
-cases, calling `argp_parse' is the only argument-parsing code needed in
-`main'.  *Note Program Arguments::.
-
- -- Function: error_t argp_parse (const struct argp *ARGP, int ARGC,
-          char **ARGV, unsigned FLAGS, int *ARG_INDEX, void *INPUT)
-     Preliminary: | MT-Unsafe race:argpbuf locale env | AS-Unsafe heap
-     i18n lock corrupt | AC-Unsafe mem lock corrupt | *Note POSIX
-     Safety Concepts::.
-
-     The `argp_parse' function parses the arguments in ARGV, of length
-     ARGC, using the argp parser ARGP.  *Note Argp Parsers::.  Passing
-     a null pointer for ARGP is the same as using a `struct argp'
-     containing all zeros.
-
-     FLAGS is a set of flag bits that modify the parsing behavior.
-     *Note Argp Flags::.  INPUT is passed through to the argp parser
-     ARGP, and has meaning defined by ARGP.  A typical usage is to pass
-     a pointer to a structure which is used for specifying parameters
-     to the parser and passing back the results.
-
-     Unless the `ARGP_NO_EXIT' or `ARGP_NO_HELP' flags are included in
-     FLAGS, calling `argp_parse' may result in the program exiting.
-     This behavior is true if an error is detected, or when an unknown
-     option is encountered.  *Note Program Termination::.
-
-     If ARG_INDEX is non-null, the index of the first unparsed option
-     in ARGV is returned as a value.
-
-     The return value is zero for successful parsing, or an error code
-     (*note Error Codes::) if an error is detected.  Different argp
-     parsers may return arbitrary error codes, but the standard error
-     codes are: `ENOMEM' if a memory allocation error occurred, or
-     `EINVAL' if an unknown option or option argument is encountered.
+This chapter contains information about functions for doing basic
+arithmetic operations, such as splitting a float into its integer and
+fractional parts or retrieving the imaginary part of a complex value.
+These functions are declared in the header files 'math.h' and
+'complex.h'.
 
 * Menu:
 
-* Globals: Argp Global Variables.  Global argp parameters.
-* Parsers: Argp Parsers.        Defining parsers for use with `argp_parse'.
-* Flags: Argp Flags.            Flags that modify the behavior of `argp_parse'.
-* Help: Argp Help.              Printing help messages when not parsing.
-* Examples: Argp Examples.      Simple examples of programs using argp.
-* Customization: Argp User Customization.
-                                Users may control the `--help' output format.
+* Integers::                    Basic integer types and concepts
+* Integer Division::            Integer division with guaranteed rounding.
+* Floating Point Numbers::      Basic concepts.  IEEE 754.
+* Floating Point Classes::      The five kinds of floating-point number.
+* Floating Point Errors::       When something goes wrong in a calculation.
+* Rounding::                    Controlling how results are rounded.
+* Control Functions::           Saving and restoring the FPU's state.
+* Arithmetic Functions::        Fundamental operations provided by the library.
+* Complex Numbers::             The types.  Writing complex constants.
+* Operations on Complex::       Projection, conjugation, decomposition.
+* Parsing of Numbers::          Converting strings to numbers.
+* System V Number Conversion::  An archaic way to convert numbers to strings.
 
 
-File: libc.info,  Node: Argp Global Variables,  Next: Argp Parsers,  Up: Argp
+File: libc.info,  Node: Integers,  Next: Integer Division,  Up: Arithmetic
 
-25.3.2 Argp Global Variables
-----------------------------
+20.1 Integers
+=============
 
-These variables make it easy for user programs to implement the
-`--version' option and provide a bug-reporting address in the `--help'
-output.  These are implemented in argp by default.
+The C language defines several integer data types: integer, short
+integer, long integer, and character, all in both signed and unsigned
+varieties.  The GNU C compiler extends the language to contain long long
+integers as well.
 
- -- Variable: const char * argp_program_version
-     If defined or set by the user program to a non-zero value, then a
-     `--version' option is added when parsing with `argp_parse', which
-     will print the `--version' string followed by a newline and exit.
-     The exception to this is if the `ARGP_NO_EXIT' flag is used.
+   The C integer types were intended to allow code to be portable among
+machines with different inherent data sizes (word sizes), so each type
+may have different ranges on different machines.  The problem with this
+is that a program often needs to be written for a particular range of
+integers, and sometimes must be written for a particular size of
+storage, regardless of what machine the program runs on.
 
- -- Variable: const char * argp_program_bug_address
-     If defined or set by the user program to a non-zero value,
-     `argp_program_bug_address' should point to a string that will be
-     printed at the end of the standard output for the `--help' option,
-     embedded in a sentence that says `Report bugs to ADDRESS.'.
+   To address this problem, the GNU C Library contains C type
+definitions you can use to declare integers that meet your exact needs.
+Because the GNU C Library header files are customized to a specific
+machine, your program source code doesn't have to be.
 
- -- Variable: argp_program_version_hook
-     If defined or set by the user program to a non-zero value, a
-     `--version' option is added when parsing with `arg_parse', which
-     prints the program version and exits with a status of zero.  This
-     is not the case if the `ARGP_NO_HELP' flag is used.  If the
-     `ARGP_NO_EXIT' flag is set, the exit behavior of the program is
-     suppressed or modified, as when the argp parser is going to be
-     used by other programs.
+   These 'typedef's are in 'stdint.h'.
 
-     It should point to a function with this type of signature:
+   If you require that an integer be represented in exactly N bits, use
+one of the following types, with the obvious mapping to bit size and
+signedness:
 
-          void PRINT-VERSION (FILE *STREAM, struct argp_state *STATE)
+   * int8_t
+   * int16_t
+   * int32_t
+   * int64_t
+   * uint8_t
+   * uint16_t
+   * uint32_t
+   * uint64_t
 
-     *Note Argp Parsing State::, for an explanation of STATE.
+   If your C compiler and target machine do not allow integers of a
+certain size, the corresponding above type does not exist.
 
-     This variable takes precedence over `argp_program_version', and is
-     useful if a program has version information not easily expressed
-     in a simple string.
+   If you don't need a specific storage size, but want the smallest data
+structure with _at least_ N bits, use one of these:
 
- -- Variable: error_t argp_err_exit_status
-     This is the exit status used when argp exits due to a parsing
-     error.  If not defined or set by the user program, this defaults
-     to: `EX_USAGE' from `<sysexits.h>'.
+   * int_least8_t
+   * int_least16_t
+   * int_least32_t
+   * int_least64_t
+   * uint_least8_t
+   * uint_least16_t
+   * uint_least32_t
+   * uint_least64_t
+
+   If you don't need a specific storage size, but want the data
+structure that allows the fastest access while having at least N bits
+(and among data structures with the same access speed, the smallest
+one), use one of these:
+
+   * int_fast8_t
+   * int_fast16_t
+   * int_fast32_t
+   * int_fast64_t
+   * uint_fast8_t
+   * uint_fast16_t
+   * uint_fast32_t
+   * uint_fast64_t
+
+   If you want an integer with the widest range possible on the platform
+on which it is being used, use one of the following.  If you use these,
+you should write code that takes into account the variable size and
+range of the integer.
+
+   * intmax_t
+   * uintmax_t
+
+   The GNU C Library also provides macros that tell you the maximum and
+minimum possible values for each integer data type.  The macro names
+follow these examples: 'INT32_MAX', 'UINT8_MAX', 'INT_FAST32_MIN',
+'INT_LEAST64_MIN', 'UINTMAX_MAX', 'INTMAX_MAX', 'INTMAX_MIN'.  Note that
+there are no macros for unsigned integer minima.  These are always zero.
+
+   There are similar macros for use with C's built in integer types
+which should come with your C compiler.  These are described in *note
+Data Type Measurements::.
+
+   Don't forget you can use the C 'sizeof' function with any of these
+data types to get the number of bytes of storage each uses.
 
 
-File: libc.info,  Node: Argp Parsers,  Next: Argp Flags,  Prev: Argp Global Variables,  Up: Argp
+File: libc.info,  Node: Integer Division,  Next: Floating Point Numbers,  Prev: Integers,  Up: Arithmetic
 
-25.3.3 Specifying Argp Parsers
-------------------------------
-
-The first argument to the `argp_parse' function is a pointer to a
-`struct argp', which is known as an "argp parser":
-
- -- Data Type: struct argp
-     This structure specifies how to parse a given set of options and
-     arguments, perhaps in conjunction with other argp parsers.  It has
-     the following fields:
-
-    `const struct argp_option *options'
-          A pointer to a vector of `argp_option' structures specifying
-          which options this argp parser understands; it may be zero if
-          there are no options at all.  *Note Argp Option Vectors::.
-
-    `argp_parser_t parser'
-          A pointer to a function that defines actions for this parser;
-          it is called for each option parsed, and at other
-          well-defined points in the parsing process.  A value of zero
-          is the same as a pointer to a function that always returns
-          `ARGP_ERR_UNKNOWN'.  *Note Argp Parser Functions::.
-
-    `const char *args_doc'
-          If non-zero, a string describing what non-option arguments
-          are called by this parser.  This is only used to print the
-          `Usage:' message.  If it contains newlines, the strings
-          separated by them are considered alternative usage patterns
-          and printed on separate lines.  Lines after the first are
-          prefixed by ` or: ' instead of `Usage:'.
-
-    `const char *doc'
-          If non-zero, a string containing extra text to be printed
-          before and after the options in a long help message, with the
-          two sections separated by a vertical tab (`'\v'', `'\013'')
-          character.  By convention, the documentation before the
-          options is just a short string explaining what the program
-          does.  Documentation printed after the options describe
-          behavior in more detail.
-
-    `const struct argp_child *children'
-          A pointer to a vector of `argp_children' structures.  This
-          pointer specifies which additional argp parsers should be
-          combined with this one.  *Note Argp Children::.
-
-    `char *(*help_filter)(int KEY, const char *TEXT, void *INPUT)'
-          If non-zero, a pointer to a function that filters the output
-          of help messages.  *Note Argp Help Filtering::.
-
-    `const char *argp_domain'
-          If non-zero, the strings used in the argp library are
-          translated using the domain described by this string.  If
-          zero, the current default domain is used.
-
-
-   Of the above group, `options', `parser', `args_doc', and the `doc'
-fields are usually all that are needed.  If an argp parser is defined
-as an initialized C variable, only the fields used need be specified in
-the initializer.  The rest will default to zero due to the way C
-structure initialization works.  This design is exploited in most argp
-structures; the most-used fields are grouped near the beginning, the
-unused fields left unspecified.
-
-* Menu:
-
-* Options: Argp Option Vectors.   Specifying options in an argp parser.
-* Argp Parser Functions::         Defining actions for an argp parser.
-* Children: Argp Children.        Combining multiple argp parsers.
-* Help Filtering: Argp Help Filtering.  Customizing help output for an argp parser.
-
-
-File: libc.info,  Node: Argp Option Vectors,  Next: Argp Parser Functions,  Prev: Argp Parsers,  Up: Argp Parsers
-
-25.3.4 Specifying Options in an Argp Parser
--------------------------------------------
-
-The `options' field in a `struct argp' points to a vector of `struct
-argp_option' structures, each of which specifies an option that the
-argp parser supports.  Multiple entries may be used for a single option
-provided it has multiple names.  This should be terminated by an entry
-with zero in all fields.  Note that when using an initialized C array
-for options, writing `{ 0 }' is enough to achieve this.
-
- -- Data Type: struct argp_option
-     This structure specifies a single option that an argp parser
-     understands, as well as how to parse and document that option.  It
-     has the following fields:
-
-    `const char *name'
-          The long name for this option, corresponding to the long
-          option `--NAME'; this field may be zero if this option _only_
-          has a short name.  To specify multiple names for an option,
-          additional entries may follow this one, with the
-          `OPTION_ALIAS' flag set.  *Note Argp Option Flags::.
-
-    `int key'
-          The integer key provided by the current option to the option
-          parser.  If KEY has a value that is a printable ASCII
-          character (i.e., `isascii (KEY)' is true), it _also_
-          specifies a short option `-CHAR', where CHAR is the ASCII
-          character with the code KEY.
-
-    `const char *arg'
-          If non-zero, this is the name of an argument associated with
-          this option, which must be provided (e.g., with the
-          `--NAME=VALUE' or `-CHAR VALUE' syntaxes), unless the
-          `OPTION_ARG_OPTIONAL' flag (*note Argp Option Flags::) is
-          set, in which case it _may_ be provided.
-
-    `int flags'
-          Flags associated with this option, some of which are referred
-          to above.  *Note Argp Option Flags::.
-
-    `const char *doc'
-          A documentation string for this option, for printing in help
-          messages.
-
-          If both the `name' and `key' fields are zero, this string
-          will be printed tabbed left from the normal option column,
-          making it useful as a group header.  This will be the first
-          thing printed in its group.  In this usage, it's conventional
-          to end the string with a `:' character.
-
-    `int group'
-          Group identity for this option.
-
-          In a long help message, options are sorted alphabetically
-          within each group, and the groups presented in the order 0,
-          1, 2, ..., N, -M, ..., -2, -1.
-
-          Every entry in an options array with this field 0 will
-          inherit the group number of the previous entry, or zero if
-          it's the first one.  If it's a group header with `name' and
-          `key' fields both zero, the previous entry + 1 is the
-          default.  Automagic options such as `--help' are put into
-          group -1.
-
-          Note that because of C structure initialization rules, this
-          field often need not be specified, because 0 is the correct
-          value.
-
-* Menu:
-
-* Flags: Argp Option Flags.     Flags for options.
-
-
-File: libc.info,  Node: Argp Option Flags,  Up: Argp Option Vectors
-
-25.3.4.1 Flags for Argp Options
-...............................
-
-The following flags may be or'd together in the `flags' field of a
-`struct argp_option'.  These flags control various aspects of how that
-option is parsed or displayed in help messages:
-
-`OPTION_ARG_OPTIONAL'
-     The argument associated with this option is optional.
-
-`OPTION_HIDDEN'
-     This option isn't displayed in any help messages.
-
-`OPTION_ALIAS'
-     This option is an alias for the closest previous non-alias option.
-     This means that it will be displayed in the same help entry, and
-     will inherit fields other than `name' and `key' from the option
-     being aliased.
-
-`OPTION_DOC'
-     This option isn't actually an option and should be ignored by the
-     actual option parser.  It is an arbitrary section of documentation
-     that should be displayed in much the same manner as the options.
-     This is known as a "documentation option".
-
-     If this flag is set, then the option `name' field is displayed
-     unmodified (e.g., no `--' prefix is added) at the left-margin where
-     a _short_ option would normally be displayed, and this
-     documentation string is left in it's usual place.  For purposes of
-     sorting, any leading whitespace and punctuation is ignored, unless
-     the first non-whitespace character is `-'.  This entry is displayed
-     after all options, after `OPTION_DOC' entries with a leading `-',
-     in the same group.
-
-`OPTION_NO_USAGE'
-     This option shouldn't be included in `long' usage messages, but
-     should still be included in other help messages.  This is intended
-     for options that are completely documented in an argp's `args_doc'
-     field.  *Note Argp Parsers::.  Including this option in the
-     generic usage list would be redundant, and should be avoided.
-
-     For instance, if `args_doc' is `"FOO BAR\n-x BLAH"', and the `-x'
-     option's purpose is to distinguish these two cases, `-x' should
-     probably be marked `OPTION_NO_USAGE'.
-
-
-File: libc.info,  Node: Argp Parser Functions,  Next: Argp Children,  Prev: Argp Option Vectors,  Up: Argp Parsers
-
-25.3.5 Argp Parser Functions
-----------------------------
-
-The function pointed to by the `parser' field in a `struct argp' (*note
-Argp Parsers::) defines what actions take place in response to each
-option or argument parsed.  It is also used as a hook, allowing a
-parser to perform tasks at certain other points during parsing.
-
-   Argp parser functions have the following type signature:
-
-     error_t PARSER (int KEY, char *ARG, struct argp_state *STATE)
-
-where the arguments are as follows:
-
-KEY
-     For each option that is parsed, PARSER is called with a value of
-     KEY from that option's `key' field in the option vector.  *Note
-     Argp Option Vectors::.  PARSER is also called at other times with
-     special reserved keys, such as `ARGP_KEY_ARG' for non-option
-     arguments.  *Note Argp Special Keys::.
-
-ARG
-     If KEY is an option, ARG is its given value.  This defaults to
-     zero if no value is specified.  Only options that have a non-zero
-     `arg' field can ever have a value.  These must _always_ have a
-     value unless the `OPTION_ARG_OPTIONAL' flag is specified.  If the
-     input being parsed specifies a value for an option that doesn't
-     allow one, an error results before PARSER ever gets called.
-
-     If KEY is `ARGP_KEY_ARG', ARG is a non-option argument.  Other
-     special keys always have a zero ARG.
-
-STATE
-     STATE points to a `struct argp_state', containing useful
-     information about the current parsing state for use by PARSER.
-     *Note Argp Parsing State::.
-
-   When PARSER is called, it should perform whatever action is
-appropriate for KEY, and return `0' for success, `ARGP_ERR_UNKNOWN' if
-the value of KEY is not handled by this parser function, or a unix
-error code if a real error occurred.  *Note Error Codes::.
-
- -- Macro: int ARGP_ERR_UNKNOWN
-     Argp parser functions should return `ARGP_ERR_UNKNOWN' for any KEY
-     value they do not recognize, or for non-option arguments (`KEY ==
-     ARGP_KEY_ARG') that they are not equipped to handle.
-
-   A typical parser function uses a switch statement on KEY:
-
-     error_t
-     parse_opt (int key, char *arg, struct argp_state *state)
-     {
-       switch (key)
-         {
-         case OPTION_KEY:
-           ACTION
-           break;
-         ...
-         default:
-           return ARGP_ERR_UNKNOWN;
-         }
-       return 0;
-     }
-
-* Menu:
-
-* Keys: Argp Special Keys.           Special values for the KEY argument.
-* State: Argp Parsing State.         What the STATE argument refers to.
-* Functions: Argp Helper Functions.  Functions to help during argp parsing.
-
-
-File: libc.info,  Node: Argp Special Keys,  Next: Argp Parsing State,  Up: Argp Parser Functions
-
-25.3.5.1 Special Keys for Argp Parser Functions
-...............................................
-
-In addition to key values corresponding to user options, the KEY
-argument to argp parser functions may have a number of other special
-values.  In the following example ARG and STATE refer to parser
-function arguments.  *Note Argp Parser Functions::.
-
-`ARGP_KEY_ARG'
-     This is not an option at all, but rather a command line argument,
-     whose value is pointed to by ARG.
-
-     When there are multiple parser functions in play due to argp
-     parsers being combined, it's impossible to know which one will
-     handle a specific argument.  Each is called until one returns 0 or
-     an error other than `ARGP_ERR_UNKNOWN'; if an argument is not
-     handled, `argp_parse' immediately returns success, without parsing
-     any more arguments.
-
-     Once a parser function returns success for this key, that fact is
-     recorded, and the `ARGP_KEY_NO_ARGS' case won't be used.
-     _However_, if while processing the argument a parser function
-     decrements the `next' field of its STATE argument, the option
-     won't be considered processed; this is to allow you to actually
-     modify the argument, perhaps into an option, and have it processed
-     again.
-
-`ARGP_KEY_ARGS'
-     If a parser function returns `ARGP_ERR_UNKNOWN' for
-     `ARGP_KEY_ARG', it is immediately called again with the key
-     `ARGP_KEY_ARGS', which has a similar meaning, but is slightly more
-     convenient for consuming all remaining arguments.  ARG is 0, and
-     the tail of the argument vector may be found at `STATE->argv +
-     STATE->next'.  If success is returned for this key, and
-     `STATE->next' is unchanged, all remaining arguments are considered
-     to have been consumed.  Otherwise, the amount by which
-     `STATE->next' has been adjusted indicates how many were used.
-     Here's an example that uses both, for different args:
-
-          ...
-          case ARGP_KEY_ARG:
-            if (STATE->arg_num == 0)
-              /* First argument */
-              first_arg = ARG;
-            else
-              /* Let the next case parse it.  */
-              return ARGP_KEY_UNKNOWN;
-            break;
-          case ARGP_KEY_ARGS:
-            remaining_args = STATE->argv + STATE->next;
-            num_remaining_args = STATE->argc - STATE->next;
-            break;
-
-`ARGP_KEY_END'
-     This indicates that there are no more command line arguments.
-     Parser functions are called in a different order, children first.
-     This allows each parser to clean up its state for the parent.
-
-`ARGP_KEY_NO_ARGS'
-     Because it's common to do some special processing if there aren't
-     any non-option args, parser functions are called with this key if
-     they didn't successfully process any non-option arguments.  This
-     is called just before `ARGP_KEY_END', where more general validity
-     checks on previously parsed arguments take place.
-
-`ARGP_KEY_INIT'
-     This is passed in before any parsing is done.  Afterwards, the
-     values of each element of the `child_input' field of STATE, if
-     any, are copied to each child's state to be the initial value of
-     the `input' when _their_ parsers are called.
-
-`ARGP_KEY_SUCCESS'
-     Passed in when parsing has successfully been completed, even if
-     arguments remain.
-
-`ARGP_KEY_ERROR'
-     Passed in if an error has occurred and parsing is terminated.  In
-     this case a call with a key of `ARGP_KEY_SUCCESS' is never made.
-
-`ARGP_KEY_FINI'
-     The final key ever seen by any parser, even after
-     `ARGP_KEY_SUCCESS' and `ARGP_KEY_ERROR'.  Any resources allocated
-     by `ARGP_KEY_INIT' may be freed here.  At times, certain resources
-     allocated are to be returned to the caller after a successful
-     parse.  In that case, those particular resources can be freed in
-     the `ARGP_KEY_ERROR' case.
-
-   In all cases, `ARGP_KEY_INIT' is the first key seen by parser
-functions, and `ARGP_KEY_FINI' the last, unless an error was returned
-by the parser for `ARGP_KEY_INIT'.  Other keys can occur in one the
-following orders.  OPT refers to an arbitrary option key:
-
-OPT... `ARGP_KEY_NO_ARGS' `ARGP_KEY_END' `ARGP_KEY_SUCCESS'
-     The arguments being parsed did not contain any non-option
-     arguments.
-
-( OPT | `ARGP_KEY_ARG' )... `ARGP_KEY_END' `ARGP_KEY_SUCCESS'
-     All non-option arguments were successfully handled by a parser
-     function.  There may be multiple parser functions if multiple argp
-     parsers were combined.
-
-( OPT | `ARGP_KEY_ARG' )... `ARGP_KEY_SUCCESS'
-     Some non-option argument went unrecognized.
-
-     This occurs when every parser function returns `ARGP_KEY_UNKNOWN'
-     for an argument, in which case parsing stops at that argument if
-     ARG_INDEX is a null pointer.  Otherwise an error occurs.
-
-   In all cases, if a non-null value for ARG_INDEX gets passed to
-`argp_parse', the index of the first unparsed command-line argument is
-passed back in that value.
-
-   If an error occurs and is either detected by argp or because a parser
-function returned an error value, each parser is called with
-`ARGP_KEY_ERROR'.  No further calls are made, except the final call
-with `ARGP_KEY_FINI'.
-
-
-File: libc.info,  Node: Argp Parsing State,  Next: Argp Helper Functions,  Prev: Argp Special Keys,  Up: Argp Parser Functions
-
-25.3.5.2 Argp Parsing State
-...........................
-
-The third argument to argp parser functions (*note Argp Parser
-Functions::) is a pointer to a `struct argp_state', which contains
-information about the state of the option parsing.
-
- -- Data Type: struct argp_state
-     This structure has the following fields, which may be modified as
-     noted:
-
-    `const struct argp *const root_argp'
-          The top level argp parser being parsed.  Note that this is
-          often _not_ the same `struct argp' passed into `argp_parse' by
-          the invoking program.  *Note Argp::.  It is an internal argp
-          parser that contains options implemented by `argp_parse'
-          itself, such as `--help'.
-
-    `int argc'
-    `char **argv'
-          The argument vector being parsed.  This may be modified.
-
-    `int next'
-          The index in `argv' of the next argument to be parsed.  This
-          may be modified.
-
-          One way to consume all remaining arguments in the input is to
-          set `STATE->next = STATE->argc', perhaps after recording the
-          value of the `next' field to find the consumed arguments.  The
-          current option can be re-parsed immediately by decrementing
-          this field, then modifying `STATE->argv[STATE->next]' to
-          reflect the option that should be reexamined.
-
-    `unsigned flags'
-          The flags supplied to `argp_parse'.  These may be modified,
-          although some flags may only take effect when `argp_parse' is
-          first invoked.  *Note Argp Flags::.
-
-    `unsigned arg_num'
-          While calling a parsing function with the KEY argument
-          `ARGP_KEY_ARG', this represents the number of the current arg,
-          starting at 0.  It is incremented after each `ARGP_KEY_ARG'
-          call returns.  At all other times, this is the number of
-          `ARGP_KEY_ARG' arguments that have been processed.
-
-    `int quoted'
-          If non-zero, the index in `argv' of the first argument
-          following a special `--' argument.  This prevents anything
-          that follows from being interpreted as an option.  It is only
-          set after argument parsing has proceeded past this point.
-
-    `void *input'
-          An arbitrary pointer passed in from the caller of
-          `argp_parse', in the INPUT argument.
-
-    `void **child_inputs'
-          These are values that will be passed to child parsers.  This
-          vector will be the same length as the number of children in
-          the current parser.  Each child parser will be given the
-          value of `STATE->child_inputs[I]' as _its_ `STATE->input'
-          field, where I is the index of the child in the this parser's
-          `children' field.  *Note Argp Children::.
-
-    `void *hook'
-          For the parser function's use.  Initialized to 0, but
-          otherwise ignored by argp.
-
-    `char *name'
-          The name used when printing messages.  This is initialized to
-          `argv[0]', or `program_invocation_name' if `argv[0]' is
-          unavailable.
-
-    `FILE *err_stream'
-    `FILE *out_stream'
-          The stdio streams used when argp prints.  Error messages are
-          printed to `err_stream', all other output, such as `--help'
-          output) to `out_stream'.  These are initialized to `stderr'
-          and `stdout' respectively.  *Note Standard Streams::.
-
-    `void *pstate'
-          Private, for use by the argp implementation.
-
-
-File: libc.info,  Node: Argp Helper Functions,  Prev: Argp Parsing State,  Up: Argp Parser Functions
-
-25.3.5.3 Functions For Use in Argp Parsers
-..........................................
-
-Argp provides a number of functions available to the user of argp
-(*note Argp Parser Functions::), mostly for producing error messages.
-These take as their first argument the STATE argument to the parser
-function.  *Note Argp Parsing State::.
-
- -- Function: void argp_usage (const struct argp_state *STATE)
-     Preliminary: | MT-Unsafe race:argpbuf env locale | AS-Unsafe heap
-     i18n corrupt | AC-Unsafe mem corrupt lock | *Note POSIX Safety
-     Concepts::.
-
-     Outputs the standard usage message for the argp parser referred to
-     by STATE to `STATE->err_stream' and terminate the program with
-     `exit (argp_err_exit_status)'.  *Note Argp Global Variables::.
-
- -- Function: void argp_error (const struct argp_state *STATE, const
-          char *FMT, ...)
-     Preliminary: | MT-Unsafe race:argpbuf env locale | AS-Unsafe heap
-     i18n corrupt | AC-Unsafe mem corrupt lock | *Note POSIX Safety
-     Concepts::.
-
-     Prints the printf format string FMT and following args, preceded
-     by the program name and `:', and followed by a `Try ... --help'
-     message, and terminates the program with an exit status of
-     `argp_err_exit_status'.  *Note Argp Global Variables::.
-
- -- Function: void argp_failure (const struct argp_state *STATE, int
-          STATUS, int ERRNUM, const char *FMT, ...)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt heap | AC-Unsafe lock
-     corrupt mem | *Note POSIX Safety Concepts::.
-
-     Similar to the standard gnu error-reporting function `error', this
-     prints the program name and `:', the printf format string FMT, and
-     the appropriate following args.  If it is non-zero, the standard
-     unix error text for ERRNUM is printed.  If STATUS is non-zero, it
-     terminates the program with that value as its exit status.
-
-     The difference between `argp_failure' and `argp_error' is that
-     `argp_error' is for _parsing errors_, whereas `argp_failure' is
-     for other problems that occur during parsing but don't reflect a
-     syntactic problem with the input, such as illegal values for
-     options, bad phase of the moon, etc.
-
- -- Function: void argp_state_help (const struct argp_state *STATE,
-          FILE *STREAM, unsigned FLAGS)
-     Preliminary: | MT-Unsafe race:argpbuf env locale | AS-Unsafe heap
-     i18n corrupt | AC-Unsafe mem corrupt lock | *Note POSIX Safety
-     Concepts::.
-
-     Outputs a help message for the argp parser referred to by STATE,
-     to STREAM.  The FLAGS argument determines what sort of help
-     message is produced.  *Note Argp Help Flags::.
-
-   Error output is sent to `STATE->err_stream', and the program name
-printed is `STATE->name'.
-
-   The output or program termination behavior of these functions may be
-suppressed if the `ARGP_NO_EXIT' or `ARGP_NO_ERRS' flags are passed to
-`argp_parse'.  *Note Argp Flags::.
-
-   This behavior is useful if an argp parser is exported for use by
-other programs (e.g., by a library), and may be used in a context where
-it is not desirable to terminate the program in response to parsing
-errors.  In argp parsers intended for such general use, and for the
-case where the program _doesn't_ terminate, calls to any of these
-functions should be followed by code that returns the appropriate error
-code:
-
-     if (BAD ARGUMENT SYNTAX)
-       {
-          argp_usage (STATE);
-          return EINVAL;
-       }
-
-If a parser function will _only_ be used when `ARGP_NO_EXIT' is not
-set, the return may be omitted.
-
-
-File: libc.info,  Node: Argp Children,  Next: Argp Help Filtering,  Prev: Argp Parser Functions,  Up: Argp Parsers
-
-25.3.6 Combining Multiple Argp Parsers
---------------------------------------
-
-The `children' field in a `struct argp' enables other argp parsers to
-be combined with the referencing one for the parsing of a single set of
-arguments.  This field should point to a vector of `struct argp_child',
-which is terminated by an entry having a value of zero in the `argp'
-field.
-
-   Where conflicts between combined parsers arise, as when two specify
-an option with the same name, the parser conflicts are resolved in
-favor of the parent argp parser(s), or the earlier of the argp parsers
-in the list of children.
-
- -- Data Type: struct argp_child
-     An entry in the list of subsidiary argp parsers pointed to by the
-     `children' field in a `struct argp'.  The fields are as follows:
-
-    `const struct argp *argp'
-          The child argp parser, or zero to end of the list.
-
-    `int flags'
-          Flags for this child.
-
-    `const char *header'
-          If non-zero, this is an optional header to be printed within
-          help output before the child options.  As a side-effect, a
-          non-zero value forces the child options to be grouped
-          together.  To achieve this effect without actually printing a
-          header string, use a value of `""'.  As with header strings
-          specified in an option entry, the conventional value of the
-          last character is `:'.  *Note Argp Option Vectors::.
-
-    `int group'
-          This is where the child options are grouped relative to the
-          other `consolidated' options in the parent argp parser.  The
-          values are the same as the `group' field in `struct
-          argp_option'.  *Note Argp Option Vectors::.  All
-          child-groupings follow parent options at a particular group
-          level.  If both this field and `header' are zero, then the
-          child's options aren't grouped together, they are merged with
-          parent options at the parent option group level.
-
-
-
-File: libc.info,  Node: Argp Flags,  Next: Argp Help,  Prev: Argp Parsers,  Up: Argp
-
-25.3.7 Flags for `argp_parse'
------------------------------
-
-The default behavior of `argp_parse' is designed to be convenient for
-the most common case of parsing program command line argument.  To
-modify these defaults, the following flags may be or'd together in the
-FLAGS argument to `argp_parse':
-
-`ARGP_PARSE_ARGV0'
-     Don't ignore the first element of the ARGV argument to
-     `argp_parse'.  Unless `ARGP_NO_ERRS' is set, the first element of
-     the argument vector is skipped for option parsing purposes, as it
-     corresponds to the program name in a command line.
-
-`ARGP_NO_ERRS'
-     Don't print error messages for unknown options to `stderr'; unless
-     this flag is set, `ARGP_PARSE_ARGV0' is ignored, as `argv[0]' is
-     used as the program name in the error messages.  This flag implies
-     `ARGP_NO_EXIT'.  This is based on the assumption that silent
-     exiting upon errors is bad behavior.
-
-`ARGP_NO_ARGS'
-     Don't parse any non-option args.  Normally these are parsed by
-     calling the parse functions with a key of `ARGP_KEY_ARG', the
-     actual argument being the value.  This flag needn't normally be
-     set, as the default behavior is to stop parsing as soon as an
-     argument fails to be parsed.  *Note Argp Parser Functions::.
-
-`ARGP_IN_ORDER'
-     Parse options and arguments in the same order they occur on the
-     command line.  Normally they're rearranged so that all options
-     come first.
-
-`ARGP_NO_HELP'
-     Don't provide the standard long option `--help', which ordinarily
-     causes usage and option help information to be output to `stdout'
-     and `exit (0)'.
-
-`ARGP_NO_EXIT'
-     Don't exit on errors, although they may still result in error
-     messages.
-
-`ARGP_LONG_ONLY'
-     Use the gnu getopt `long-only' rules for parsing arguments.  This
-     allows long-options to be recognized with only a single `-' (i.e.,
-     `-help').  This results in a less useful interface, and its use is
-     discouraged as it conflicts with the way most GNU programs work as
-     well as the GNU coding standards.
-
-`ARGP_SILENT'
-     Turns off any message-printing/exiting options, specifically
-     `ARGP_NO_EXIT', `ARGP_NO_ERRS', and `ARGP_NO_HELP'.
-
-
-File: libc.info,  Node: Argp Help Filtering,  Prev: Argp Children,  Up: Argp Parsers
-
-25.3.8 Customizing Argp Help Output
------------------------------------
-
-The `help_filter' field in a `struct argp' is a pointer to a function
-that filters the text of help messages before displaying them.  They
-have a function signature like:
-
-     char *HELP-FILTER (int KEY, const char *TEXT, void *INPUT)
-
-Where KEY is either a key from an option, in which case TEXT is that
-option's help text.  *Note Argp Option Vectors::.  Alternately, one of
-the special keys with names beginning with `ARGP_KEY_HELP_' might be
-used, describing which other help text TEXT will contain.  *Note Argp
-Help Filter Keys::.
-
-   The function should return either TEXT if it remains as-is, or a
-replacement string allocated using `malloc'.  This will be either be
-freed by argp or zero, which prints nothing.  The value of TEXT is
-supplied _after_ any translation has been done, so if any of the
-replacement text needs translation, it will be done by the filter
-function.  INPUT is either the input supplied to `argp_parse' or it is
-zero, if `argp_help' was called directly by the user.
-
-* Menu:
-
-* Keys: Argp Help Filter Keys.  Special KEY values for help filter functions.
-
-
-File: libc.info,  Node: Argp Help Filter Keys,  Up: Argp Help Filtering
-
-25.3.8.1 Special Keys for Argp Help Filter Functions
-....................................................
-
-The following special values may be passed to an argp help filter
-function as the first argument in addition to key values for user
-options.  They specify which help text the TEXT argument contains:
-
-`ARGP_KEY_HELP_PRE_DOC'
-     The help text preceding options.
-
-`ARGP_KEY_HELP_POST_DOC'
-     The help text following options.
-
-`ARGP_KEY_HELP_HEADER'
-     The option header string.
-
-`ARGP_KEY_HELP_EXTRA'
-     This is used after all other documentation; TEXT is zero for this
-     key.
-
-`ARGP_KEY_HELP_DUP_ARGS_NOTE'
-     The explanatory note printed when duplicate option arguments have
-     been suppressed.
-
-`ARGP_KEY_HELP_ARGS_DOC'
-     The argument doc string; formally the `args_doc' field from the
-     argp parser.  *Note Argp Parsers::.
-
-
-File: libc.info,  Node: Argp Help,  Next: Argp Examples,  Prev: Argp Flags,  Up: Argp
-
-25.3.9 The `argp_help' Function
--------------------------------
-
-Normally programs using argp need not be written with particular
-printing argument-usage-type help messages in mind as the standard
-`--help' option is handled automatically by argp.  Typical error cases
-can be handled using `argp_usage' and `argp_error'.  *Note Argp Helper
-Functions::.  However, if it's desirable to print a help message in
-some context other than parsing the program options, argp offers the
-`argp_help' interface.
-
- -- Function: void argp_help (const struct argp *ARGP, FILE *STREAM,
-          unsigned FLAGS, char *NAME)
-     Preliminary: | MT-Unsafe race:argpbuf env locale | AS-Unsafe heap
-     i18n corrupt | AC-Unsafe mem corrupt lock | *Note POSIX Safety
-     Concepts::.
-
-     This outputs a help message for the argp parser ARGP to STREAM.
-     The type of messages printed will be determined by FLAGS.
-
-     Any options such as `--help' that are implemented automatically by
-     argp itself will _not_ be present in the help output; for this
-     reason it is best to use `argp_state_help' if calling from within
-     an argp parser function.  *Note Argp Helper Functions::.
-
-* Menu:
-
-* Flags: Argp Help Flags.       Specifying what sort of help message to print.
-
-
-File: libc.info,  Node: Argp Help Flags,  Up: Argp Help
-
-25.3.10 Flags for the `argp_help' Function
-------------------------------------------
-
-When calling `argp_help' (*note Argp Help::) or `argp_state_help'
-(*note Argp Helper Functions::) the exact output is determined by the
-FLAGS argument.  This should consist of any of the following flags,
-or'd together:
-
-`ARGP_HELP_USAGE'
-     A unix `Usage:' message that explicitly lists all options.
-
-`ARGP_HELP_SHORT_USAGE'
-     A unix `Usage:' message that displays an appropriate placeholder to
-     indicate where the options go; useful for showing the non-option
-     argument syntax.
-
-`ARGP_HELP_SEE'
-     A `Try ... for more help' message; `...' contains the program name
-     and `--help'.
-
-`ARGP_HELP_LONG'
-     A verbose option help message that gives each option available
-     along with its documentation string.
-
-`ARGP_HELP_PRE_DOC'
-     The part of the argp parser doc string preceding the verbose
-     option help.
-
-`ARGP_HELP_POST_DOC'
-     The part of the argp parser doc string that following the verbose
-     option help.
-
-`ARGP_HELP_DOC'
-     `(ARGP_HELP_PRE_DOC | ARGP_HELP_POST_DOC)'
-
-`ARGP_HELP_BUG_ADDR'
-     A message that prints where to report bugs for this program, if the
-     `argp_program_bug_address' variable contains this information.
-
-`ARGP_HELP_LONG_ONLY'
-     This will modify any output to reflect the `ARGP_LONG_ONLY' mode.
-
-   The following flags are only understood when used with
-`argp_state_help'.  They control whether the function returns after
-printing its output, or terminates the program:
-
-`ARGP_HELP_EXIT_ERR'
-     This will terminate the program with `exit (argp_err_exit_status)'.
-
-`ARGP_HELP_EXIT_OK'
-     This will terminate the program with `exit (0)'.
-
-   The following flags are combinations of the basic flags for printing
-standard messages:
-
-`ARGP_HELP_STD_ERR'
-     Assuming that an error message for a parsing error has printed,
-     this prints a message on how to get help, and terminates the
-     program with an error.
-
-`ARGP_HELP_STD_USAGE'
-     This prints a standard usage message and terminates the program
-     with an error.  This is used when no other specific error messages
-     are appropriate or available.
-
-`ARGP_HELP_STD_HELP'
-     This prints the standard response for a `--help' option, and
-     terminates the program successfully.
-
-
-File: libc.info,  Node: Argp Examples,  Next: Argp User Customization,  Prev: Argp Help,  Up: Argp
-
-25.3.11 Argp Examples
----------------------
-
-These example programs demonstrate the basic usage of argp.
-
-* Menu:
-
-* 1: Argp Example 1.            A minimal program using argp.
-* 2: Argp Example 2.            A program using only default options.
-* 3: Argp Example 3.            A simple program with user options.
-* 4: Argp Example 4.            Combining multiple argp parsers.
-
-
-File: libc.info,  Node: Argp Example 1,  Next: Argp Example 2,  Up: Argp Examples
-
-25.3.11.1 A Minimal Program Using Argp
-......................................
-
-This is perhaps the smallest program possible that uses argp.  It won't
-do much except give an error messages and exit when there are any
-arguments, and prints a rather pointless message for `--help'.
-
-
-     /* This is (probably) the smallest possible program that
-        uses argp.  It won't do much except give an error
-        messages and exit when there are any arguments, and print
-        a (rather pointless) messages for -help. */
-
-     #include <stdlib.h>
-     #include <argp.h>
-
-     int
-     main (int argc, char **argv)
-     {
-       argp_parse (0, argc, argv, 0, 0, 0);
-       exit (0);
-     }
-
-
-File: libc.info,  Node: Argp Example 2,  Next: Argp Example 3,  Prev: Argp Example 1,  Up: Argp Examples
-
-25.3.11.2 A Program Using Argp with Only Default Options
-........................................................
-
-This program doesn't use any options or arguments, it uses argp to be
-compliant with the GNU standard command line format.
-
-   In addition to giving no arguments and implementing a `--help'
-option, this example has a `--version' option, which will put the given
-documentation string and bug address in the `--help' output, as per GNU
-standards.
-
-   The variable `argp' contains the argument parser specification.
-Adding fields to this structure is the way most parameters are passed
-to `argp_parse'.  The first three fields are normally used, but they
-are not in this small program.  There are also two global variables
-that argp can use defined here, `argp_program_version' and
-`argp_program_bug_address'.  They are considered global variables
-because they will almost always be constant for a given program, even
-if they use different argument parsers for various tasks.
-
-
-     /* This program doesn't use any options or arguments, but uses
-        argp to be compliant with the GNU standard command line
-        format.
-
-        In addition to making sure no arguments are given, and
-        implementing a -help option, this example will have a
-        -version option, and will put the given documentation string
-        and bug address in the -help output, as per GNU standards.
-
-        The variable ARGP contains the argument parser specification;
-        adding fields to this structure is the way most parameters are
-        passed to argp_parse (the first three fields are usually used,
-        but not in this small program).  There are also two global
-        variables that argp knows about defined here,
-        ARGP_PROGRAM_VERSION and ARGP_PROGRAM_BUG_ADDRESS (they are
-        global variables because they will almost always be constant
-        for a given program, even if it uses different argument
-        parsers for various tasks). */
-
-     #include <stdlib.h>
-     #include <argp.h>
-
-     const char *argp_program_version =
-       "argp-ex2 1.0";
-     const char *argp_program_bug_address =
-       "<bug-gnu-utils@gnu.org>";
-
-     /* Program documentation. */
-     static char doc[] =
-       "Argp example #2 -- a pretty minimal program using argp";
-
-     /* Our argument parser.  The `options', `parser', and
-        `args_doc' fields are zero because we have neither options or
-        arguments; `doc' and `argp_program_bug_address' will be
-        used in the output for `--help', and the `--version'
-        option will print out `argp_program_version'. */
-     static struct argp argp = { 0, 0, 0, doc };
-
-     int
-     main (int argc, char **argv)
-     {
-       argp_parse (&argp, argc, argv, 0, 0, 0);
-       exit (0);
-     }
-
-
-File: libc.info,  Node: Argp Example 3,  Next: Argp Example 4,  Prev: Argp Example 2,  Up: Argp Examples
-
-25.3.11.3 A Program Using Argp with User Options
-................................................
-
-This program uses the same features as example 2, adding user options
-and arguments.
-
-   We now use the first four fields in `argp' (*note Argp Parsers::)
-and specify `parse_opt' as the parser function.  *Note Argp Parser
-Functions::.
-
-   Note that in this example, `main' uses a structure to communicate
-with the `parse_opt' function, a pointer to which it passes in the
-`input' argument to `argp_parse'.  *Note Argp::.  It is retrieved by
-`parse_opt' through the `input' field in its `state' argument.  *Note
-Argp Parsing State::.  Of course, it's also possible to use global
-variables instead, but using a structure like this is somewhat more
-flexible and clean.
-
-
-     /* This program uses the same features as example 2, and uses options and
-        arguments.
-
-        We now use the first four fields in ARGP, so here's a description of them:
-          OPTIONS  - A pointer to a vector of struct argp_option (see below)
-          PARSER   - A function to parse a single option, called by argp
-          ARGS_DOC - A string describing how the non-option arguments should look
-          DOC      - A descriptive string about this program; if it contains a
-                      vertical tab character (\v), the part after it will be
-                      printed *following* the options
-
-        The function PARSER takes the following arguments:
-          KEY  - An integer specifying which option this is (taken
-                  from the KEY field in each struct argp_option), or
-                  a special key specifying something else; the only
-                  special keys we use here are ARGP_KEY_ARG, meaning
-                  a non-option argument, and ARGP_KEY_END, meaning
-                  that all arguments have been parsed
-          ARG  - For an option KEY, the string value of its
-                  argument, or NULL if it has none
-          STATE- A pointer to a struct argp_state, containing
-                  various useful information about the parsing state; used here
-                  are the INPUT field, which reflects the INPUT argument to
-                  argp_parse, and the ARG_NUM field, which is the number of the
-                  current non-option argument being parsed
-        It should return either 0, meaning success, ARGP_ERR_UNKNOWN, meaning the
-        given KEY wasn't recognized, or an errno value indicating some other
-        error.
-
-        Note that in this example, main uses a structure to communicate with the
-        parse_opt function, a pointer to which it passes in the INPUT argument to
-        argp_parse.  Of course, it's also possible to use global variables
-        instead, but this is somewhat more flexible.
-
-        The OPTIONS field contains a pointer to a vector of struct argp_option's;
-        that structure has the following fields (if you assign your option
-        structures using array initialization like this example, unspecified
-        fields will be defaulted to 0, and need not be specified):
-          NAME   - The name of this option's long option (may be zero)
-          KEY    - The KEY to pass to the PARSER function when parsing this option,
-                    *and* the name of this option's short option, if it is a
-                    printable ascii character
-          ARG    - The name of this option's argument, if any
-          FLAGS  - Flags describing this option; some of them are:
-                      OPTION_ARG_OPTIONAL - The argument to this option is optional
-                      OPTION_ALIAS        - This option is an alias for the
-                                             previous option
-                      OPTION_HIDDEN       - Don't show this option in -help output
-          DOC    - A documentation string for this option, shown in -help output
-
-        An options vector should be terminated by an option with all fields zero. */
-
-     #include <stdlib.h>
-     #include <argp.h>
-
-     const char *argp_program_version =
-       "argp-ex3 1.0";
-     const char *argp_program_bug_address =
-       "<bug-gnu-utils@gnu.org>";
-
-     /* Program documentation. */
-     static char doc[] =
-       "Argp example #3 -- a program with options and arguments using argp";
-
-     /* A description of the arguments we accept. */
-     static char args_doc[] = "ARG1 ARG2";
-
-     /* The options we understand. */
-     static struct argp_option options[] = {
-       {"verbose",  'v', 0,      0,  "Produce verbose output" },
-       {"quiet",    'q', 0,      0,  "Don't produce any output" },
-       {"silent",   's', 0,      OPTION_ALIAS },
-       {"output",   'o', "FILE", 0,
-        "Output to FILE instead of standard output" },
-       { 0 }
-     };
-
-     /* Used by `main' to communicate with `parse_opt'. */
-     struct arguments
-     {
-       char *args[2];                /* ARG1 & ARG2 */
-       int silent, verbose;
-       char *output_file;
-     };
-
-     /* Parse a single option. */
-     static error_t
-     parse_opt (int key, char *arg, struct argp_state *state)
-     {
-       /* Get the INPUT argument from `argp_parse', which we
-          know is a pointer to our arguments structure. */
-       struct arguments *arguments = state->input;
-
-       switch (key)
-         {
-         case 'q': case 's':
-           arguments->silent = 1;
-           break;
-         case 'v':
-           arguments->verbose = 1;
-           break;
-         case 'o':
-           arguments->output_file = arg;
-           break;
-
-         case ARGP_KEY_ARG:
-           if (state->arg_num >= 2)
-             /* Too many arguments. */
-             argp_usage (state);
-
-           arguments->args[state->arg_num] = arg;
-
-           break;
-
-         case ARGP_KEY_END:
-           if (state->arg_num < 2)
-             /* Not enough arguments. */
-             argp_usage (state);
-           break;
-
-         default:
-           return ARGP_ERR_UNKNOWN;
-         }
-       return 0;
-     }
-
-     /* Our argp parser. */
-     static struct argp argp = { options, parse_opt, args_doc, doc };
-
-     int
-     main (int argc, char **argv)
-     {
-       struct arguments arguments;
-
-       /* Default values. */
-       arguments.silent = 0;
-       arguments.verbose = 0;
-       arguments.output_file = "-";
-
-       /* Parse our arguments; every option seen by `parse_opt' will
-          be reflected in `arguments'. */
-       argp_parse (&argp, argc, argv, 0, 0, &arguments);
-
-       printf ("ARG1 = %s\nARG2 = %s\nOUTPUT_FILE = %s\n"
-               "VERBOSE = %s\nSILENT = %s\n",
-               arguments.args[0], arguments.args[1],
-               arguments.output_file,
-               arguments.verbose ? "yes" : "no",
-               arguments.silent ? "yes" : "no");
-
-       exit (0);
-     }
-
-
-File: libc.info,  Node: Argp Example 4,  Prev: Argp Example 3,  Up: Argp Examples
-
-25.3.11.4 A Program Using Multiple Combined Argp Parsers
-........................................................
-
-This program uses the same features as example 3, but has more options,
-and presents more structure in the `--help' output.  It also
-illustrates how you can `steal' the remainder of the input arguments
-past a certain point for programs that accept a list of items.  It also
-illustrates the KEY value `ARGP_KEY_NO_ARGS', which is only given if no
-non-option arguments were supplied to the program.  *Note Argp Special
-Keys::.
-
-   For structuring help output, two features are used: _headers_ and a
-two part option string.  The _headers_ are entries in the options
-vector.  *Note Argp Option Vectors::.  The first four fields are zero.
-The two part documentation string are in the variable `doc', which
-allows documentation both before and after the options.  *Note Argp
-Parsers::, the two parts of `doc' are separated by a vertical-tab
-character (`'\v'', or `'\013'').  By convention, the documentation
-before the options is a short string stating what the program does, and
-after any options it is longer, describing the behavior in more detail.
-All documentation strings are automatically filled for output, although
-newlines may be included to force a line break at a particular point.
-In addition, documentation strings are passed to the `gettext'
-function, for possible translation into the current locale.
-
-
-     /* This program uses the same features as example 3, but has more
-        options, and somewhat more structure in the -help output.  It
-        also shows how you can `steal' the remainder of the input
-        arguments past a certain point, for programs that accept a
-        list of items.  It also shows the special argp KEY value
-        ARGP_KEY_NO_ARGS, which is only given if no non-option
-        arguments were supplied to the program.
-
-        For structuring the help output, two features are used,
-        *headers* which are entries in the options vector with the
-        first four fields being zero, and a two part documentation
-        string (in the variable DOC), which allows documentation both
-        before and after the options; the two parts of DOC are
-        separated by a vertical-tab character ('\v', or '\013').  By
-        convention, the documentation before the options is just a
-        short string saying what the program does, and that afterwards
-        is longer, describing the behavior in more detail.  All
-        documentation strings are automatically filled for output,
-        although newlines may be included to force a line break at a
-        particular point.  All documentation strings are also passed to
-        the `gettext' function, for possible translation into the
-        current locale. */
-
-     #include <stdlib.h>
-     #include <error.h>
-     #include <argp.h>
-
-     const char *argp_program_version =
-       "argp-ex4 1.0";
-     const char *argp_program_bug_address =
-       "<bug-gnu-utils@prep.ai.mit.edu>";
-
-     /* Program documentation. */
-     static char doc[] =
-       "Argp example #4 -- a program with somewhat more complicated\
-     options\
-     \vThis part of the documentation comes *after* the options;\
-      note that the text is automatically filled, but it's possible\
-      to force a line-break, e.g.\n<-- here.";
-
-     /* A description of the arguments we accept. */
-     static char args_doc[] = "ARG1 [STRING...]";
-
-     /* Keys for options without short-options. */
-     #define OPT_ABORT  1            /* -abort */
-
-     /* The options we understand. */
-     static struct argp_option options[] = {
-       {"verbose",  'v', 0,       0, "Produce verbose output" },
-       {"quiet",    'q', 0,       0, "Don't produce any output" },
-       {"silent",   's', 0,       OPTION_ALIAS },
-       {"output",   'o', "FILE",  0,
-        "Output to FILE instead of standard output" },
-
-       {0,0,0,0, "The following options should be grouped together:" },
-       {"repeat",   'r', "COUNT", OPTION_ARG_OPTIONAL,
-        "Repeat the output COUNT (default 10) times"},
-       {"abort",    OPT_ABORT, 0, 0, "Abort before showing any output"},
-
-       { 0 }
-     };
-
-     /* Used by `main' to communicate with `parse_opt'. */
-     struct arguments
-     {
-       char *arg1;                   /* ARG1 */
-       char **strings;               /* [STRING...] */
-       int silent, verbose, abort;   /* `-s', `-v', `--abort' */
-       char *output_file;            /* FILE arg to `--output' */
-       int repeat_count;             /* COUNT arg to `--repeat' */
-     };
-
-     /* Parse a single option. */
-     static error_t
-     parse_opt (int key, char *arg, struct argp_state *state)
-     {
-       /* Get the `input' argument from `argp_parse', which we
-          know is a pointer to our arguments structure. */
-       struct arguments *arguments = state->input;
-
-       switch (key)
-         {
-         case 'q': case 's':
-           arguments->silent = 1;
-           break;
-         case 'v':
-           arguments->verbose = 1;
-           break;
-         case 'o':
-           arguments->output_file = arg;
-           break;
-         case 'r':
-           arguments->repeat_count = arg ? atoi (arg) : 10;
-           break;
-         case OPT_ABORT:
-           arguments->abort = 1;
-           break;
-
-         case ARGP_KEY_NO_ARGS:
-           argp_usage (state);
-
-         case ARGP_KEY_ARG:
-           /* Here we know that `state->arg_num == 0', since we
-              force argument parsing to end before any more arguments can
-              get here. */
-           arguments->arg1 = arg;
-
-           /* Now we consume all the rest of the arguments.
-              `state->next' is the index in `state->argv' of the
-              next argument to be parsed, which is the first STRING
-              we're interested in, so we can just use
-              `&state->argv[state->next]' as the value for
-              arguments->strings.
-
-              _In addition_, by setting `state->next' to the end
-              of the arguments, we can force argp to stop parsing here and
-              return. */
-           arguments->strings = &state->argv[state->next];
-           state->next = state->argc;
-
-           break;
-
-         default:
-           return ARGP_ERR_UNKNOWN;
-         }
-       return 0;
-     }
-
-     /* Our argp parser. */
-     static struct argp argp = { options, parse_opt, args_doc, doc };
-
-     int
-     main (int argc, char **argv)
-     {
-       int i, j;
-       struct arguments arguments;
-
-       /* Default values. */
-       arguments.silent = 0;
-       arguments.verbose = 0;
-       arguments.output_file = "-";
-       arguments.repeat_count = 1;
-       arguments.abort = 0;
-
-       /* Parse our arguments; every option seen by `parse_opt' will be
-          reflected in `arguments'. */
-       argp_parse (&argp, argc, argv, 0, 0, &arguments);
-
-       if (arguments.abort)
-         error (10, 0, "ABORTED");
-
-       for (i = 0; i < arguments.repeat_count; i++)
-         {
-           printf ("ARG1 = %s\n", arguments.arg1);
-           printf ("STRINGS = ");
-           for (j = 0; arguments.strings[j]; j++)
-             printf (j == 0 ? "%s" : ", %s", arguments.strings[j]);
-           printf ("\n");
-           printf ("OUTPUT_FILE = %s\nVERBOSE = %s\nSILENT = %s\n",
-                   arguments.output_file,
-                   arguments.verbose ? "yes" : "no",
-                   arguments.silent ? "yes" : "no");
-         }
-
-       exit (0);
-     }
-
-
-File: libc.info,  Node: Argp User Customization,  Prev: Argp Examples,  Up: Argp
-
-25.3.12 Argp User Customization
--------------------------------
-
-The formatting of argp `--help' output may be controlled to some extent
-by a program's users, by setting the `ARGP_HELP_FMT' environment
-variable to a comma-separated list of tokens.  Whitespace is ignored:
-
-`dup-args'
-`no-dup-args'
-     These turn "duplicate-argument-mode" on or off.  In duplicate
-     argument mode, if an option that accepts an argument has multiple
-     names, the argument is shown for each name.  Otherwise, it is only
-     shown for the first long option.  A note is subsequently printed
-     so the user knows that it applies to other names as well.  The
-     default is `no-dup-args', which is less consistent, but prettier.
-
-`dup-args-note'
-
-`no-dup-args-note'
-     These will enable or disable the note informing the user of
-     suppressed option argument duplication.  The default is
-     `dup-args-note'.
-
-`short-opt-col=N'
-     This prints the first short option in column N.  The default is 2.
-
-`long-opt-col=N'
-     This prints the first long option in column N.  The default is 6.
-
-`doc-opt-col=N'
-     This prints `documentation options' (*note Argp Option Flags::) in
-     column N.  The default is 2.
-
-`opt-doc-col=N'
-     This prints the documentation for options starting in column N.
-     The default is 29.
-
-`header-col=N'
-     This will indent the group headers that document groups of options
-     to column N.  The default is 1.
-
-`usage-indent=N'
-     This will indent continuation lines in `Usage:' messages to column
-     N.  The default is 12.
-
-`rmargin=N'
-     This will word wrap help output at or before column N.  The default
-     is 79.
-
-
-File: libc.info,  Node: Suboptions,  Next: Suboptions Example,  Prev: Argp,  Up: Parsing Program Arguments
-
-25.3.12.1 Parsing of Suboptions
-...............................
-
-Having a single level of options is sometimes not enough.  There might
-be too many options which have to be available or a set of options is
-closely related.
-
-   For this case some programs use suboptions.  One of the most
-prominent programs is certainly `mount'(8).  The `-o' option take one
-argument which itself is a comma separated list of options.  To ease the
-programming of code like this the function `getsubopt' is available.
-
- -- Function: int getsubopt (char **OPTIONP, char *const *TOKENS, char
-          **VALUEP)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The OPTIONP parameter must be a pointer to a variable containing
-     the address of the string to process.  When the function returns
-     the reference is updated to point to the next suboption or to the
-     terminating `\0' character if there is no more suboption available.
-
-     The TOKENS parameter references an array of strings containing the
-     known suboptions.  All strings must be `\0' terminated and to mark
-     the end a null pointer must be stored.  When `getsubopt' finds a
-     possible legal suboption it compares it with all strings available
-     in the TOKENS array and returns the index in the string as the
-     indicator.
-
-     In case the suboption has an associated value introduced by a `='
-     character, a pointer to the value is returned in VALUEP.  The
-     string is `\0' terminated.  If no argument is available VALUEP is
-     set to the null pointer.  By doing this the caller can check
-     whether a necessary value is given or whether no unexpected value
-     is present.
-
-     In case the next suboption in the string is not mentioned in the
-     TOKENS array the starting address of the suboption including a
-     possible value is returned in VALUEP and the return value of the
-     function is `-1'.
-
-
-File: libc.info,  Node: Suboptions Example,  Prev: Suboptions,  Up: Parsing Program Arguments
-
-25.3.13 Parsing of Suboptions Example
--------------------------------------
-
-The code which might appear in the `mount'(8) program is a perfect
-example of the use of `getsubopt':
-
-
-     #include <stdio.h>
-     #include <stdlib.h>
-     #include <unistd.h>
-
-     int do_all;
-     const char *type;
-     int read_size;
-     int write_size;
-     int read_only;
-
-     enum
-     {
-       RO_OPTION = 0,
-       RW_OPTION,
-       READ_SIZE_OPTION,
-       WRITE_SIZE_OPTION,
-       THE_END
-     };
-
-     const char *mount_opts[] =
-     {
-       [RO_OPTION] = "ro",
-       [RW_OPTION] = "rw",
-       [READ_SIZE_OPTION] = "rsize",
-       [WRITE_SIZE_OPTION] = "wsize",
-       [THE_END] = NULL
-     };
-
-     int
-     main (int argc, char **argv)
-     {
-       char *subopts, *value;
-       int opt;
-
-       while ((opt = getopt (argc, argv, "at:o:")) != -1)
-         switch (opt)
-           {
-           case 'a':
-             do_all = 1;
-             break;
-           case 't':
-             type = optarg;
-             break;
-           case 'o':
-             subopts = optarg;
-             while (*subopts != '\0')
-               switch (getsubopt (&subopts, mount_opts, &value))
-                 {
-                 case RO_OPTION:
-                   read_only = 1;
-                   break;
-                 case RW_OPTION:
-                   read_only = 0;
-                   break;
-                 case READ_SIZE_OPTION:
-                   if (value == NULL)
-                     abort ();
-                   read_size = atoi (value);
-                   break;
-                 case WRITE_SIZE_OPTION:
-                   if (value == NULL)
-                     abort ();
-                   write_size = atoi (value);
-                   break;
-                 default:
-                   /* Unknown suboption. */
-                   printf ("Unknown suboption `%s'\n", value);
-                   break;
-                 }
-             break;
-           default:
-             abort ();
-           }
-
-       /* Do the real work. */
-
-       return 0;
-     }
-
-
-File: libc.info,  Node: Environment Variables,  Next: Auxiliary Vector,  Prev: Program Arguments,  Up: Program Basics
-
-25.4 Environment Variables
-==========================
-
-When a program is executed, it receives information about the context in
-which it was invoked in two ways.  The first mechanism uses the ARGV
-and ARGC arguments to its `main' function, and is discussed in *note
-Program Arguments::.  The second mechanism uses "environment variables"
-and is discussed in this section.
-
-   The ARGV mechanism is typically used to pass command-line arguments
-specific to the particular program being invoked.  The environment, on
-the other hand, keeps track of information that is shared by many
-programs, changes infrequently, and that is less frequently used.
-
-   The environment variables discussed in this section are the same
-environment variables that you set using assignments and the `export'
-command in the shell.  Programs executed from the shell inherit all of
-the environment variables from the shell.
-
-   Standard environment variables are used for information about the
-user's home directory, terminal type, current locale, and so on; you
-can define additional variables for other purposes.  The set of all
-environment variables that have values is collectively known as the
-"environment".
-
-   Names of environment variables are case-sensitive and must not
-contain the character `='.  System-defined environment variables are
-invariably uppercase.
-
-   The values of environment variables can be anything that can be
-represented as a string.  A value must not contain an embedded null
-character, since this is assumed to terminate the string.
-
-* Menu:
-
-* Environment Access::          How to get and set the values of
-				 environment variables.
-* Standard Environment::        These environment variables have
-                		 standard interpretations.
-
-
-File: libc.info,  Node: Environment Access,  Next: Standard Environment,  Up: Environment Variables
-
-25.4.1 Environment Access
--------------------------
-
-The value of an environment variable can be accessed with the `getenv'
-function.  This is declared in the header file `stdlib.h'.  
-
-   Libraries should use `secure_getenv' instead of `getenv', so that
-they do not accidentally use untrusted environment variables.
-Modifications of environment variables are not allowed in
-multi-threaded programs.  The `getenv' and `secure_getenv' functions
-can be safely used in multi-threaded programs.
-
- -- Function: char * getenv (const char *NAME)
-     Preliminary: | MT-Safe env | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     This function returns a string that is the value of the environment
-     variable NAME.  You must not modify this string.  In some non-Unix
-     systems not using the GNU C Library, it might be overwritten by
-     subsequent calls to `getenv' (but not by any other library
-     function).  If the environment variable NAME is not defined, the
-     value is a null pointer.
-
- -- Function: char * secure_getenv (const char *NAME)
-     Preliminary: | MT-Safe env | AS-Safe | AC-Safe | *Note POSIX
-     Safety Concepts::.
-
-     This function is similar to `getenv', but it returns a null
-     pointer if the environment is untrusted.  This happens when the
-     program file has SUID or SGID bits set.  General-purpose libraries
-     should always prefer this function over `getenv' to avoid
-     vulnerabilities if the library is referenced from a SUID/SGID
-     program.
-
-     This function is a GNU extension.
-
- -- Function: int putenv (char *STRING)
-     Preliminary: | MT-Unsafe const:env | AS-Unsafe heap lock |
-     AC-Unsafe corrupt lock mem | *Note POSIX Safety Concepts::.
-
-     The `putenv' function adds or removes definitions from the
-     environment.  If the STRING is of the form `NAME=VALUE', the
-     definition is added to the environment.  Otherwise, the STRING is
-     interpreted as the name of an environment variable, and any
-     definition for this variable in the environment is removed.
-
-     If the function is successful it returns `0'.  Otherwise the return
-     value is nonzero and `errno' is set to indicate the error.
-
-     The difference to the `setenv' function is that the exact string
-     given as the parameter STRING is put into the environment.  If the
-     user should change the string after the `putenv' call this will
-     reflect automatically in the environment.  This also requires that
-     STRING not be an automatic variable whose scope is left before the
-     variable is removed from the environment.  The same applies of
-     course to dynamically allocated variables which are freed later.
-
-     This function is part of the extended Unix interface.  Since it
-     was also available in old SVID libraries you should define either
-     _XOPEN_SOURCE or _SVID_SOURCE before including any header.
-
- -- Function: int setenv (const char *NAME, const char *VALUE, int
-          REPLACE)
-     Preliminary: | MT-Unsafe const:env | AS-Unsafe heap lock |
-     AC-Unsafe corrupt lock mem | *Note POSIX Safety Concepts::.
-
-     The `setenv' function can be used to add a new definition to the
-     environment.  The entry with the name NAME is replaced by the
-     value `NAME=VALUE'.  Please note that this is also true if VALUE
-     is the empty string.  To do this a new string is created and the
-     strings NAME and VALUE are copied.  A null pointer for the VALUE
-     parameter is illegal.  If the environment already contains an
-     entry with key NAME the REPLACE parameter controls the action.  If
-     replace is zero, nothing happens.  Otherwise the old entry is
-     replaced by the new one.
-
-     Please note that you cannot remove an entry completely using this
-     function.
-
-     If the function is successful it returns `0'.  Otherwise the
-     environment is unchanged and the return value is `-1' and `errno'
-     is set.
-
-     This function was originally part of the BSD library but is now
-     part of the Unix standard.
-
- -- Function: int unsetenv (const char *NAME)
-     Preliminary: | MT-Unsafe const:env | AS-Unsafe lock | AC-Unsafe
-     lock | *Note POSIX Safety Concepts::.
-
-     Using this function one can remove an entry completely from the
-     environment.  If the environment contains an entry with the key
-     NAME this whole entry is removed.  A call to this function is
-     equivalent to a call to `putenv' when the VALUE part of the string
-     is empty.
-
-     The function return `-1' if NAME is a null pointer, points to an
-     empty string, or points to a string containing a `=' character.
-     It returns `0' if the call succeeded.
-
-     This function was originally part of the BSD library but is now
-     part of the Unix standard.  The BSD version had no return value,
-     though.
-
-   There is one more function to modify the whole environment.  This
-function is said to be used in the POSIX.9 (POSIX bindings for Fortran
-77) and so one should expect it did made it into POSIX.1.  But this
-never happened.  But we still provide this function as a GNU extension
-to enable writing standard compliant Fortran environments.
-
- -- Function: int clearenv (void)
-     Preliminary: | MT-Unsafe const:env | AS-Unsafe heap lock |
-     AC-Unsafe lock mem | *Note POSIX Safety Concepts::.
-
-     The `clearenv' function removes all entries from the environment.
-     Using `putenv' and `setenv' new entries can be added again later.
-
-     If the function is successful it returns `0'.  Otherwise the return
-     value is nonzero.
-
-   You can deal directly with the underlying representation of
-environment objects to add more variables to the environment (for
-example, to communicate with another program you are about to execute;
-*note Executing a File::).
-
- -- Variable: char ** environ
-     The environment is represented as an array of strings.  Each
-     string is of the format `NAME=VALUE'.  The order in which strings
-     appear in the environment is not significant, but the same NAME
-     must not appear more than once.  The last element of the array is
-     a null pointer.
-
-     This variable is declared in the header file `unistd.h'.
-
-     If you just want to get the value of an environment variable, use
-     `getenv'.
-
-   Unix systems, and GNU systems, pass the initial value of `environ'
-as the third argument to `main'.  *Note Program Arguments::.
-
-
-File: libc.info,  Node: Standard Environment,  Prev: Environment Access,  Up: Environment Variables
-
-25.4.2 Standard Environment Variables
--------------------------------------
-
-These environment variables have standard meanings.  This doesn't mean
-that they are always present in the environment; but if these variables
-_are_ present, they have these meanings.  You shouldn't try to use
-these environment variable names for some other purpose.
-
-`HOME'
-     This is a string representing the user's "home directory", or
-     initial default working directory.
-
-     The user can set `HOME' to any value.  If you need to make sure to
-     obtain the proper home directory for a particular user, you should
-     not use `HOME'; instead, look up the user's name in the user
-     database (*note User Database::).
-
-     For most purposes, it is better to use `HOME', precisely because
-     this lets the user specify the value.
-
-`LOGNAME'
-     This is the name that the user used to log in.  Since the value in
-     the environment can be tweaked arbitrarily, this is not a reliable
-     way to identify the user who is running a program; a function like
-     `getlogin' (*note Who Logged In::) is better for that purpose.
-
-     For most purposes, it is better to use `LOGNAME', precisely because
-     this lets the user specify the value.
-
-`PATH'
-     A "path" is a sequence of directory names which is used for
-     searching for a file.  The variable `PATH' holds a path used for
-     searching for programs to be run.
-
-     The `execlp' and `execvp' functions (*note Executing a File::) use
-     this environment variable, as do many shells and other utilities
-     which are implemented in terms of those functions.
-
-     The syntax of a path is a sequence of directory names separated by
-     colons.  An empty string instead of a directory name stands for the
-     current directory (*note Working Directory::).
-
-     A typical value for this environment variable might be a string
-     like:
-
-          :/bin:/etc:/usr/bin:/usr/new/X11:/usr/new:/usr/local/bin
-
-     This means that if the user tries to execute a program named `foo',
-     the system will look for files named `foo', `/bin/foo',
-     `/etc/foo', and so on.  The first of these files that exists is
-     the one that is executed.
-
-`TERM'
-     This specifies the kind of terminal that is receiving program
-     output.  Some programs can make use of this information to take
-     advantage of special escape sequences or terminal modes supported
-     by particular kinds of terminals.  Many programs which use the
-     termcap library (*note Find: (termcap)Finding a Terminal
-     Description.) use the `TERM' environment variable, for example.
-
-`TZ'
-     This specifies the time zone.  *Note TZ Variable::, for
-     information about the format of this string and how it is used.
-
-`LANG'
-     This specifies the default locale to use for attribute categories
-     where neither `LC_ALL' nor the specific environment variable for
-     that category is set.  *Note Locales::, for more information about
-     locales.
-
-`LC_ALL'
-     If this environment variable is set it overrides the selection for
-     all the locales done using the other `LC_*' environment variables.
-     The value of the other `LC_*' environment variables is simply
-     ignored in this case.
-
-`LC_COLLATE'
-     This specifies what locale to use for string sorting.
-
-`LC_CTYPE'
-     This specifies what locale to use for character sets and character
-     classification.
-
-`LC_MESSAGES'
-     This specifies what locale to use for printing messages and to
-     parse responses.
-
-`LC_MONETARY'
-     This specifies what locale to use for formatting monetary values.
-
-`LC_NUMERIC'
-     This specifies what locale to use for formatting numbers.
-
-`LC_TIME'
-     This specifies what locale to use for formatting date/time values.
-
-`NLSPATH'
-     This specifies the directories in which the `catopen' function
-     looks for message translation catalogs.
-
-`_POSIX_OPTION_ORDER'
-     If this environment variable is defined, it suppresses the usual
-     reordering of command line arguments by `getopt' and `argp_parse'.
-     *Note Argument Syntax::.
-
-
-
-File: libc.info,  Node: Auxiliary Vector,  Next: System Calls,  Prev: Environment Variables,  Up: Program Basics
-
-25.5 Auxiliary Vector
+20.2 Integer Division
 =====================
 
-When a program is executed, it receives information from the operating
-system about the environment in which it is operating.  The form of this
-information is a table of key-value pairs, where the keys are from the
-set of `AT_' values in `elf.h'.  Some of the data is provided by the
-kernel for libc consumption, and may be obtained by ordinary
-interfaces, such as `sysconf'.  However, on a platform-by-platform
-basis there may be information that is not available any other way.
+This section describes functions for performing integer division.  These
+functions are redundant when GNU CC is used, because in GNU C the '/'
+operator always rounds towards zero.  But in other C implementations,
+'/' may round differently with negative arguments.  'div' and 'ldiv' are
+useful because they specify how to round the quotient: towards zero.
+The remainder has the same sign as the numerator.
 
-25.5.1 Definition of `getauxval'
---------------------------------
+   These functions are specified to return a result R such that the
+value 'R.quot*DENOMINATOR + R.rem' equals NUMERATOR.
 
- -- Function: unsigned long int getauxval (unsigned long int TYPE)
+   To use these facilities, you should include the header file
+'stdlib.h' in your program.
+
+ -- Data Type: div_t
+     This is a structure type used to hold the result returned by the
+     'div' function.  It has the following members:
+
+     'int quot'
+          The quotient from the division.
+
+     'int rem'
+          The remainder from the division.
+
+ -- Function: div_t div (int NUMERATOR, int DENOMINATOR)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This function is used to inquire about the entries in the auxiliary
-     vector.  The TYPE argument should be one of the `AT_' symbols
-     defined in `elf.h'.  If a matching entry is found, the value is
-     returned; if the entry is not found, zero is returned and `errno'
-     is set to `ENOENT'.
+     This function 'div' computes the quotient and remainder from the
+     division of NUMERATOR by DENOMINATOR, returning the result in a
+     structure of type 'div_t'.
 
-   For some platforms, the key `AT_HWCAP' is the easiest way to inquire
-about any instruction set extensions available at runtime.  In this
-case, there will (of necessity) be a platform-specific set of `HWCAP_'
-values masked together that describe the capabilities of the cpu on
-which the program is being executed.
+     If the result cannot be represented (as in a division by zero), the
+     behavior is undefined.
 
-
-File: libc.info,  Node: System Calls,  Next: Program Termination,  Prev: Auxiliary Vector,  Up: Program Basics
+     Here is an example, albeit not a very useful one.
 
-25.6 System Calls
-=================
+          div_t result;
+          result = div (20, -6);
 
-A system call is a request for service that a program makes of the
-kernel.  The service is generally something that only the kernel has
-the privilege to do, such as doing I/O.  Programmers don't normally
-need to be concerned with system calls because there are functions in
-the GNU C Library to do virtually everything that system calls do.
-These functions work by making system calls themselves.  For example,
-there is a system call that changes the permissions of a file, but you
-don't need to know about it because you can just use the GNU C Library's
-`chmod' function.
+     Now 'result.quot' is '-3' and 'result.rem' is '2'.
 
-   System calls are sometimes called kernel calls.
+ -- Data Type: ldiv_t
+     This is a structure type used to hold the result returned by the
+     'ldiv' function.  It has the following members:
 
-   However, there are times when you want to make a system call
-explicitly, and for that, the GNU C Library provides the `syscall'
-function.  `syscall' is harder to use and less portable than functions
-like `chmod', but easier and more portable than coding the system call
-in assembler instructions.
+     'long int quot'
+          The quotient from the division.
 
-   `syscall' is most useful when you are working with a system call
-which is special to your system or is newer than the GNU C Library you
-are using.  `syscall' is implemented in an entirely generic way; the
-function does not know anything about what a particular system call
-does or even if it is valid.
+     'long int rem'
+          The remainder from the division.
 
-   The description of `syscall' in this section assumes a certain
-protocol for system calls on the various platforms on which the GNU C
-Library runs.  That protocol is not defined by any strong authority, but
-we won't describe it here either because anyone who is coding `syscall'
-probably won't accept anything less than kernel and C library source
-code as a specification of the interface between them anyway.
+     (This is identical to 'div_t' except that the components are of
+     type 'long int' rather than 'int'.)
 
-   `syscall' is declared in `unistd.h'.
-
- -- Function: long int syscall (long int SYSNO, ...)
+ -- Function: ldiv_t ldiv (long int NUMERATOR, long int DENOMINATOR)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     `syscall' performs a generic system call.
+     The 'ldiv' function is similar to 'div', except that the arguments
+     are of type 'long int' and the result is returned as a structure of
+     type 'ldiv_t'.
 
-     SYSNO is the system call number.  Each kind of system call is
-     identified by a number.  Macros for all the possible system call
-     numbers are defined in `sys/syscall.h'
+ -- Data Type: lldiv_t
+     This is a structure type used to hold the result returned by the
+     'lldiv' function.  It has the following members:
 
-     The remaining arguments are the arguments for the system call, in
-     order, and their meanings depend on the kind of system call.  Each
-     kind of system call has a definite number of arguments, from zero
-     to five.  If you code more arguments than the system call takes,
-     the extra ones to the right are ignored.
+     'long long int quot'
+          The quotient from the division.
 
-     The return value is the return value from the system call, unless
-     the system call failed.  In that case, `syscall' returns `-1' and
-     sets `errno' to an error code that the system call returned.  Note
-     that system calls do not return `-1' when they succeed.  
+     'long long int rem'
+          The remainder from the division.
 
-     If you specify an invalid SYSNO, `syscall' returns `-1' with
-     `errno' = `ENOSYS'.
+     (This is identical to 'div_t' except that the components are of
+     type 'long long int' rather than 'int'.)
 
-     Example:
-
-
-          #include <unistd.h>
-          #include <sys/syscall.h>
-          #include <errno.h>
-
-          ...
-
-          int rc;
-
-          rc = syscall(SYS_chmod, "/etc/passwd", 0444);
-
-          if (rc == -1)
-             fprintf(stderr, "chmod failed, errno = %d\n", errno);
-
-     This, if all the compatibility stars are aligned, is equivalent to
-     the following preferable code:
-
-
-          #include <sys/types.h>
-          #include <sys/stat.h>
-          #include <errno.h>
-
-          ...
-
-          int rc;
-
-          rc = chmod("/etc/passwd", 0444);
-          if (rc == -1)
-             fprintf(stderr, "chmod failed, errno = %d\n", errno);
-
-
-
-File: libc.info,  Node: Program Termination,  Prev: System Calls,  Up: Program Basics
-
-25.7 Program Termination
-========================
-
-The usual way for a program to terminate is simply for its `main'
-function to return.  The "exit status value" returned from the `main'
-function is used to report information back to the process's parent
-process or shell.
-
-   A program can also terminate normally by calling the `exit' function.
-
-   In addition, programs can be terminated by signals; this is
-discussed in more detail in *note Signal Handling::.  The `abort'
-function causes a signal that kills the program.
-
-* Menu:
-
-* Normal Termination::          If a program calls `exit', a
-                                 process terminates normally.
-* Exit Status::                 The `exit status' provides information
-                                 about why the process terminated.
-* Cleanups on Exit::            A process can run its own cleanup
-                                 functions upon normal termination.
-* Aborting a Program::          The `abort' function causes
-                                 abnormal program termination.
-* Termination Internals::       What happens when a process terminates.
-
-
-File: libc.info,  Node: Normal Termination,  Next: Exit Status,  Up: Program Termination
-
-25.7.1 Normal Termination
--------------------------
-
-A process terminates normally when its program signals it is done by
-calling `exit'.  Returning from `main' is equivalent to calling `exit',
-and the value that `main' returns is used as the argument to `exit'.
-
- -- Function: void exit (int STATUS)
-     Preliminary: | MT-Unsafe race:exit | AS-Unsafe corrupt | AC-Unsafe
-     corrupt lock | *Note POSIX Safety Concepts::.
-
-     The `exit' function tells the system that the program is done,
-     which causes it to terminate the process.
-
-     STATUS is the program's exit status, which becomes part of the
-     process' termination status.  This function does not return.
-
-   Normal termination causes the following actions:
-
-  1. Functions that were registered with the `atexit' or `on_exit'
-     functions are called in the reverse order of their registration.
-     This mechanism allows your application to specify its own
-     "cleanup" actions to be performed at program termination.
-     Typically, this is used to do things like saving program state
-     information in a file, or unlocking locks in shared data bases.
-
-  2. All open streams are closed, writing out any buffered output data.
-     See *note Closing Streams::.  In addition, temporary files opened
-     with the `tmpfile' function are removed; see *note Temporary
-     Files::.
-
-  3. `_exit' is called, terminating the program.  *Note Termination
-     Internals::.
-
-
-File: libc.info,  Node: Exit Status,  Next: Cleanups on Exit,  Prev: Normal Termination,  Up: Program Termination
-
-25.7.2 Exit Status
-------------------
-
-When a program exits, it can return to the parent process a small
-amount of information about the cause of termination, using the "exit
-status".  This is a value between 0 and 255 that the exiting process
-passes as an argument to `exit'.
-
-   Normally you should use the exit status to report very broad
-information about success or failure.  You can't provide a lot of
-detail about the reasons for the failure, and most parent processes
-would not want much detail anyway.
-
-   There are conventions for what sorts of status values certain
-programs should return.  The most common convention is simply 0 for
-success and 1 for failure.  Programs that perform comparison use a
-different convention: they use status 1 to indicate a mismatch, and
-status 2 to indicate an inability to compare.  Your program should
-follow an existing convention if an existing convention makes sense for
-it.
-
-   A general convention reserves status values 128 and up for special
-purposes.  In particular, the value 128 is used to indicate failure to
-execute another program in a subprocess.  This convention is not
-universally obeyed, but it is a good idea to follow it in your programs.
-
-   *Warning:* Don't try to use the number of errors as the exit status.
-This is actually not very useful; a parent process would generally not
-care how many errors occurred.  Worse than that, it does not work,
-because the status value is truncated to eight bits.  Thus, if the
-program tried to report 256 errors, the parent would receive a report
-of 0 errors--that is, success.
-
-   For the same reason, it does not work to use the value of `errno' as
-the exit status--these can exceed 255.
-
-   *Portability note:* Some non-POSIX systems use different conventions
-for exit status values.  For greater portability, you can use the
-macros `EXIT_SUCCESS' and `EXIT_FAILURE' for the conventional status
-value for success and failure, respectively.  They are declared in the
-file `stdlib.h'.  
-
- -- Macro: int EXIT_SUCCESS
-     This macro can be used with the `exit' function to indicate
-     successful program completion.
-
-     On POSIX systems, the value of this macro is `0'.  On other
-     systems, the value might be some other (possibly non-constant)
-     integer expression.
-
- -- Macro: int EXIT_FAILURE
-     This macro can be used with the `exit' function to indicate
-     unsuccessful program completion in a general sense.
-
-     On POSIX systems, the value of this macro is `1'.  On other
-     systems, the value might be some other (possibly non-constant)
-     integer expression.  Other nonzero status values also indicate
-     failures.  Certain programs use different nonzero status values to
-     indicate particular kinds of "non-success".  For example, `diff'
-     uses status value `1' to mean that the files are different, and
-     `2' or more to mean that there was difficulty in opening the files.
-
-   Don't confuse a program's exit status with a process' termination
-status.  There are lots of ways a process can terminate besides having
-its program finish.  In the event that the process termination _is_
-caused by program termination (i.e., `exit'), though, the program's
-exit status becomes part of the process' termination status.
-
-
-File: libc.info,  Node: Cleanups on Exit,  Next: Aborting a Program,  Prev: Exit Status,  Up: Program Termination
-
-25.7.3 Cleanups on Exit
------------------------
-
-Your program can arrange to run its own cleanup functions if normal
-termination happens.  If you are writing a library for use in various
-application programs, then it is unreliable to insist that all
-applications call the library's cleanup functions explicitly before
-exiting.  It is much more robust to make the cleanup invisible to the
-application, by setting up a cleanup function in the library itself
-using `atexit' or `on_exit'.
-
- -- Function: int atexit (void (*FUNCTION) (void))
-     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe lock mem
-     | *Note POSIX Safety Concepts::.
-
-     The `atexit' function registers the function FUNCTION to be called
-     at normal program termination.  The FUNCTION is called with no
-     arguments.
-
-     The return value from `atexit' is zero on success and nonzero if
-     the function cannot be registered.
-
- -- Function: int on_exit (void (*FUNCTION)(int STATUS, void *ARG),
-          void *ARG)
-     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe lock mem
-     | *Note POSIX Safety Concepts::.
-
-     This function is a somewhat more powerful variant of `atexit'.  It
-     accepts two arguments, a function FUNCTION and an arbitrary
-     pointer ARG.  At normal program termination, the FUNCTION is
-     called with two arguments:  the STATUS value passed to `exit', and
-     the ARG.
-
-     This function is included in the GNU C Library only for
-     compatibility for SunOS, and may not be supported by other
-     implementations.
-
-   Here's a trivial program that illustrates the use of `exit' and
-`atexit':
-
-
-     #include <stdio.h>
-     #include <stdlib.h>
-
-     void
-     bye (void)
-     {
-       puts ("Goodbye, cruel world....");
-     }
-
-     int
-     main (void)
-     {
-       atexit (bye);
-       exit (EXIT_SUCCESS);
-     }
-
-When this program is executed, it just prints the message and exits.
-
-
-File: libc.info,  Node: Aborting a Program,  Next: Termination Internals,  Prev: Cleanups on Exit,  Up: Program Termination
-
-25.7.4 Aborting a Program
--------------------------
-
-You can abort your program using the `abort' function.  The prototype
-for this function is in `stdlib.h'.  
-
- -- Function: void abort (void)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt
-     | *Note POSIX Safety Concepts::.
-
-     The `abort' function causes abnormal program termination.  This
-     does not execute cleanup functions registered with `atexit' or
-     `on_exit'.
-
-     This function actually terminates the process by raising a
-     `SIGABRT' signal, and your program can include a handler to
-     intercept this signal; see *note Signal Handling::.
-
-   *Future Change Warning:* Proposed Federal censorship regulations may
-prohibit us from giving you information about the possibility of
-calling this function.  We would be required to say that this is not an
-acceptable way of terminating a program.
-
-
-File: libc.info,  Node: Termination Internals,  Prev: Aborting a Program,  Up: Program Termination
-
-25.7.5 Termination Internals
-----------------------------
-
-The `_exit' function is the primitive used for process termination by
-`exit'.  It is declared in the header file `unistd.h'.  
-
- -- Function: void _exit (int STATUS)
+ -- Function: lldiv_t lldiv (long long int NUMERATOR, long long int
+          DENOMINATOR)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `_exit' function is the primitive for causing a process to
-     terminate with status STATUS.  Calling this function does not
-     execute cleanup functions registered with `atexit' or `on_exit'.
+     The 'lldiv' function is like the 'div' function, but the arguments
+     are of type 'long long int' and the result is returned as a
+     structure of type 'lldiv_t'.
 
- -- Function: void _Exit (int STATUS)
+     The 'lldiv' function was added in ISO C99.
+
+ -- Data Type: imaxdiv_t
+     This is a structure type used to hold the result returned by the
+     'imaxdiv' function.  It has the following members:
+
+     'intmax_t quot'
+          The quotient from the division.
+
+     'intmax_t rem'
+          The remainder from the division.
+
+     (This is identical to 'div_t' except that the components are of
+     type 'intmax_t' rather than 'int'.)
+
+     See *note Integers:: for a description of the 'intmax_t' type.
+
+ -- Function: imaxdiv_t imaxdiv (intmax_t NUMERATOR, intmax_t
+          DENOMINATOR)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `_Exit' function is the ISO C equivalent to `_exit'.  The
-     ISO C committee members were not sure whether the definitions of
-     `_exit' and `_Exit' were compatible so they have not used the
-     POSIX name.
+     The 'imaxdiv' function is like the 'div' function, but the
+     arguments are of type 'intmax_t' and the result is returned as a
+     structure of type 'imaxdiv_t'.
 
-     This function was introduced in ISO C99 and is declared in
-     `stdlib.h'.
+     See *note Integers:: for a description of the 'intmax_t' type.
 
-   When a process terminates for any reason--either because the program
-terminates, or as a result of a signal--the following things happen:
-
-   * All open file descriptors in the process are closed.  *Note
-     Low-Level I/O::.  Note that streams are not flushed automatically
-     when the process terminates; see *note I/O on Streams::.
-
-   * A process exit status is saved to be reported back to the parent
-     process via `wait' or `waitpid'; see *note Process Completion::.
-     If the program exited, this status includes as its low-order 8
-     bits the program exit status.
-
-   * Any child processes of the process being terminated are assigned a
-     new parent process.  (On most systems, including GNU, this is the
-     `init' process, with process ID 1.)
-
-   * A `SIGCHLD' signal is sent to the parent process.
-
-   * If the process is a session leader that has a controlling
-     terminal, then a `SIGHUP' signal is sent to each process in the
-     foreground job, and the controlling terminal is disassociated from
-     that session.  *Note Job Control::.
-
-   * If termination of a process causes a process group to become
-     orphaned, and any member of that process group is stopped, then a
-     `SIGHUP' signal and a `SIGCONT' signal are sent to each process in
-     the group.  *Note Job Control::.
+     The 'imaxdiv' function was added in ISO C99.
 
 
-File: libc.info,  Node: Processes,  Next: Job Control,  Prev: Program Basics,  Up: Top
+File: libc.info,  Node: Floating Point Numbers,  Next: Floating Point Classes,  Prev: Integer Division,  Up: Arithmetic
 
-26 Processes
-************
-
-"Processes" are the primitive units for allocation of system resources.
-Each process has its own address space and (usually) one thread of
-control.  A process executes a program; you can have multiple processes
-executing the same program, but each process has its own copy of the
-program within its own address space and executes it independently of
-the other copies.
-
-   Processes are organized hierarchically.  Each process has a "parent
-process" which explicitly arranged to create it.  The processes created
-by a given parent are called its "child processes".  A child inherits
-many of its attributes from the parent process.
-
-   This chapter describes how a program can create, terminate, and
-control child processes.  Actually, there are three distinct operations
-involved: creating a new child process, causing the new process to
-execute a program, and coordinating the completion of the child process
-with the original program.
-
-   The `system' function provides a simple, portable mechanism for
-running another program; it does all three steps automatically.  If you
-need more control over the details of how this is done, you can use the
-primitive functions to do each step individually instead.
-
-* Menu:
-
-* Running a Command::           The easy way to run another program.
-* Process Creation Concepts::   An overview of the hard way to do it.
-* Process Identification::      How to get the process ID of a process.
-* Creating a Process::          How to fork a child process.
-* Executing a File::            How to make a process execute another program.
-* Process Completion::          How to tell when a child process has completed.
-* Process Completion Status::   How to interpret the status value
-                                 returned from a child process.
-* BSD Wait Functions::  	More functions, for backward compatibility.
-* Process Creation Example::    A complete example program.
-
-
-File: libc.info,  Node: Running a Command,  Next: Process Creation Concepts,  Up: Processes
-
-26.1 Running a Command
-======================
-
-The easy way to run another program is to use the `system' function.
-This function does all the work of running a subprogram, but it doesn't
-give you much control over the details: you have to wait until the
-subprogram terminates before you can do anything else.
-
- -- Function: int system (const char *COMMAND)
-     Preliminary: | MT-Safe | AS-Unsafe plugin heap lock | AC-Unsafe
-     lock mem | *Note POSIX Safety Concepts::.
-
-     This function executes COMMAND as a shell command.  In the GNU C
-     Library, it always uses the default shell `sh' to run the command.
-     In particular, it searches the directories in `PATH' to find
-     programs to execute.  The return value is `-1' if it wasn't
-     possible to create the shell process, and otherwise is the status
-     of the shell process.  *Note Process Completion::, for details on
-     how this status code can be interpreted.
-
-     If the COMMAND argument is a null pointer, a return value of zero
-     indicates that no command processor is available.
-
-     This function is a cancellation point in multi-threaded programs.
-     This is a problem if the thread allocates some resources (like
-     memory, file descriptors, semaphores or whatever) at the time
-     `system' is called.  If the thread gets canceled these resources
-     stay allocated until the program ends.  To avoid this calls to
-     `system' should be protected using cancellation handlers.
-
-     The `system' function is declared in the header file `stdlib.h'.
-
-   *Portability Note:* Some C implementations may not have any notion
-of a command processor that can execute other programs.  You can
-determine whether a command processor exists by executing
-`system (NULL)'; if the return value is nonzero, a command processor is
-available.
-
-   The `popen' and `pclose' functions (*note Pipe to a Subprocess::)
-are closely related to the `system' function.  They allow the parent
-process to communicate with the standard input and output channels of
-the command being executed.
-
-
-File: libc.info,  Node: Process Creation Concepts,  Next: Process Identification,  Prev: Running a Command,  Up: Processes
-
-26.2 Process Creation Concepts
-==============================
-
-This section gives an overview of processes and of the steps involved in
-creating a process and making it run another program.
-
-   Each process is named by a "process ID" number.  A unique process ID
-is allocated to each process when it is created.  The "lifetime" of a
-process ends when its termination is reported to its parent process; at
-that time, all of the process resources, including its process ID, are
-freed.
-
-   Processes are created with the `fork' system call (so the operation
-of creating a new process is sometimes called "forking" a process).
-The "child process" created by `fork' is a copy of the original "parent
-process", except that it has its own process ID.
-
-   After forking a child process, both the parent and child processes
-continue to execute normally.  If you want your program to wait for a
-child process to finish executing before continuing, you must do this
-explicitly after the fork operation, by calling `wait' or `waitpid'
-(*note Process Completion::).  These functions give you limited
-information about why the child terminated--for example, its exit
-status code.
-
-   A newly forked child process continues to execute the same program as
-its parent process, at the point where the `fork' call returns.  You
-can use the return value from `fork' to tell whether the program is
-running in the parent process or the child.
-
-   Having several processes run the same program is only occasionally
-useful.  But the child can execute another program using one of the
-`exec' functions; see *note Executing a File::.  The program that the
-process is executing is called its "process image".  Starting execution
-of a new program causes the process to forget all about its previous
-process image; when the new program exits, the process exits too,
-instead of returning to the previous process image.
-
-
-File: libc.info,  Node: Process Identification,  Next: Creating a Process,  Prev: Process Creation Concepts,  Up: Processes
-
-26.3 Process Identification
+20.3 Floating Point Numbers
 ===========================
 
-The `pid_t' data type represents process IDs.  You can get the process
-ID of a process by calling `getpid'.  The function `getppid' returns
-the process ID of the parent of the current process (this is also known
-as the "parent process ID").  Your program should include the header
-files `unistd.h' and `sys/types.h' to use these functions.  
+Most computer hardware has support for two different kinds of numbers:
+integers (...-3, -2, -1, 0, 1, 2, 3...) and floating-point numbers.
+Floating-point numbers have three parts: the "mantissa", the "exponent",
+and the "sign bit".  The real number represented by a floating-point
+value is given by (s ? -1 : 1) * 2^e * M where s is the sign bit, e the
+exponent, and M the mantissa.  *Note Floating Point Concepts::, for
+details.  (It is possible to have a different "base" for the exponent,
+but all modern hardware uses 2.)
 
- -- Data Type: pid_t
-     The `pid_t' data type is a signed integer type which is capable of
-     representing a process ID.  In the GNU C Library, this is an `int'.
+   Floating-point numbers can represent a finite subset of the real
+numbers.  While this subset is large enough for most purposes, it is
+important to remember that the only reals that can be represented
+exactly are rational numbers that have a terminating binary expansion
+shorter than the width of the mantissa.  Even simple fractions such as
+1/5 can only be approximated by floating point.
 
- -- Function: pid_t getpid (void)
+   Mathematical operations and functions frequently need to produce
+values that are not representable.  Often these values can be
+approximated closely enough for practical purposes, but sometimes they
+can't.  Historically there was no way to tell when the results of a
+calculation were inaccurate.  Modern computers implement the IEEE 754
+standard for numerical computations, which defines a framework for
+indicating to the program when the results of calculation are not
+trustworthy.  This framework consists of a set of "exceptions" that
+indicate why a result could not be represented, and the special values
+"infinity" and "not a number" (NaN).
+
+
+File: libc.info,  Node: Floating Point Classes,  Next: Floating Point Errors,  Prev: Floating Point Numbers,  Up: Arithmetic
+
+20.4 Floating-Point Number Classification Functions
+===================================================
+
+ISO C99 defines macros that let you determine what sort of
+floating-point number a variable holds.
+
+ -- Macro: int fpclassify (_float-type_ X)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `getpid' function returns the process ID of the current
-     process.
+     This is a generic macro which works on all floating-point types and
+     which returns a value of type 'int'.  The possible values are:
 
- -- Function: pid_t getppid (void)
+     'FP_NAN'
+          The floating-point number X is "Not a Number" (*note Infinity
+          and NaN::)
+     'FP_INFINITE'
+          The value of X is either plus or minus infinity (*note
+          Infinity and NaN::)
+     'FP_ZERO'
+          The value of X is zero.  In floating-point formats like
+          IEEE 754, where zero can be signed, this value is also
+          returned if X is negative zero.
+     'FP_SUBNORMAL'
+          Numbers whose absolute value is too small to be represented in
+          the normal format are represented in an alternate,
+          "denormalized" format (*note Floating Point Concepts::).  This
+          format is less precise but can represent values closer to
+          zero.  'fpclassify' returns this value for values of X in this
+          alternate format.
+     'FP_NORMAL'
+          This value is returned for all other values of X.  It
+          indicates that there is nothing special about the number.
+
+   'fpclassify' is most useful if more than one property of a number
+must be tested.  There are more specific macros which only test one
+property at a time.  Generally these macros execute faster than
+'fpclassify', since there is special hardware support for them.  You
+should therefore use the specific macros whenever possible.
+
+ -- Macro: int isfinite (_float-type_ X)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `getppid' function returns the process ID of the parent of the
-     current process.
+     This macro returns a nonzero value if X is finite: not plus or
+     minus infinity, and not NaN. It is equivalent to
 
-
-File: libc.info,  Node: Creating a Process,  Next: Executing a File,  Prev: Process Identification,  Up: Processes
+          (fpclassify (x) != FP_NAN && fpclassify (x) != FP_INFINITE)
 
-26.4 Creating a Process
-=======================
+     'isfinite' is implemented as a macro which accepts any
+     floating-point type.
 
-The `fork' function is the primitive for creating a process.  It is
-declared in the header file `unistd.h'.  
-
- -- Function: pid_t fork (void)
-     Preliminary: | MT-Safe | AS-Unsafe plugin | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     The `fork' function creates a new process.
-
-     If the operation is successful, there are then both parent and
-     child processes and both see `fork' return, but with different
-     values: it returns a value of `0' in the child process and returns
-     the child's process ID in the parent process.
-
-     If process creation failed, `fork' returns a value of `-1' in the
-     parent process.  The following `errno' error conditions are
-     defined for `fork':
-
-    `EAGAIN'
-          There aren't enough system resources to create another
-          process, or the user already has too many processes running.
-          This means exceeding the `RLIMIT_NPROC' resource limit, which
-          can usually be increased; *note Limits on Resources::.
-
-    `ENOMEM'
-          The process requires more space than the system can supply.
-
-   The specific attributes of the child process that differ from the
-parent process are:
-
-   * The child process has its own unique process ID.
-
-   * The parent process ID of the child process is the process ID of its
-     parent process.
-
-   * The child process gets its own copies of the parent process's open
-     file descriptors.  Subsequently changing attributes of the file
-     descriptors in the parent process won't affect the file
-     descriptors in the child, and vice versa.  *Note Control
-     Operations::.  However, the file position associated with each
-     descriptor is shared by both processes; *note File Position::.
-
-   * The elapsed processor times for the child process are set to zero;
-     see *note Processor Time::.
-
-   * The child doesn't inherit file locks set by the parent process.
-     *Note Control Operations::.
-
-   * The child doesn't inherit alarms set by the parent process.  *Note
-     Setting an Alarm::.
-
-   * The set of pending signals (*note Delivery of Signal::) for the
-     child process is cleared.  (The child process inherits its mask of
-     blocked signals and signal actions from the parent process.)
-
- -- Function: pid_t vfork (void)
-     Preliminary: | MT-Safe | AS-Unsafe plugin | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     The `vfork' function is similar to `fork' but on some systems it
-     is more efficient; however, there are restrictions you must follow
-     to use it safely.
-
-     While `fork' makes a complete copy of the calling process's address
-     space and allows both the parent and child to execute
-     independently, `vfork' does not make this copy.  Instead, the
-     child process created with `vfork' shares its parent's address
-     space until it calls `_exit' or one of the `exec' functions.  In
-     the meantime, the parent process suspends execution.
-
-     You must be very careful not to allow the child process created
-     with `vfork' to modify any global data or even local variables
-     shared with the parent.  Furthermore, the child process cannot
-     return from (or do a long jump out of) the function that called
-     `vfork'!  This would leave the parent process's control
-     information very confused.  If in doubt, use `fork' instead.
-
-     Some operating systems don't really implement `vfork'.  The GNU C
-     Library permits you to use `vfork' on all systems, but actually
-     executes `fork' if `vfork' isn't available.  If you follow the
-     proper precautions for using `vfork', your program will still work
-     even if the system uses `fork' instead.
-
-
-File: libc.info,  Node: Executing a File,  Next: Process Completion,  Prev: Creating a Process,  Up: Processes
-
-26.5 Executing a File
-=====================
-
-This section describes the `exec' family of functions, for executing a
-file as a process image.  You can use these functions to make a child
-process execute a new program after it has been forked.
-
-   To see the effects of `exec' from the point of view of the called
-program, see *note Program Basics::.
-
-   The functions in this family differ in how you specify the arguments,
-but otherwise they all do the same thing.  They are declared in the
-header file `unistd.h'.
-
- -- Function: int execv (const char *FILENAME, char *const ARGV[])
+ -- Macro: int isnormal (_float-type_ X)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `execv' function executes the file named by FILENAME as a new
-     process image.
+     This macro returns a nonzero value if X is finite and normalized.
+     It is equivalent to
 
-     The ARGV argument is an array of null-terminated strings that is
-     used to provide a value for the `argv' argument to the `main'
-     function of the program to be executed.  The last element of this
-     array must be a null pointer.  By convention, the first element of
-     this array is the file name of the program sans directory names.
-     *Note Program Arguments::, for full details on how programs can
-     access these arguments.
+          (fpclassify (x) == FP_NORMAL)
 
-     The environment for the new process image is taken from the
-     `environ' variable of the current process image; see *note
-     Environment Variables::, for information about environments.
-
- -- Function: int execl (const char *FILENAME, const char *ARG0, ...)
-     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
-     POSIX Safety Concepts::.
-
-     This is similar to `execv', but the ARGV strings are specified
-     individually instead of as an array.  A null pointer must be
-     passed as the last such argument.
-
- -- Function: int execve (const char *FILENAME, char *const ARGV[],
-          char *const ENV[])
+ -- Macro: int isnan (_float-type_ X)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This is similar to `execv', but permits you to specify the
-     environment for the new program explicitly as the ENV argument.
-     This should be an array of strings in the same format as for the
-     `environ' variable; see *note Environment Access::.
+     This macro returns a nonzero value if X is NaN. It is equivalent to
 
- -- Function: int execle (const char *FILENAME, const char *ARG0, ...,
-          char *const ENV[])
-     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem | *Note
-     POSIX Safety Concepts::.
+          (fpclassify (x) == FP_NAN)
 
-     This is similar to `execl', but permits you to specify the
-     environment for the new program explicitly.  The environment
-     argument is passed following the null pointer that marks the last
-     ARGV argument, and should be an array of strings in the same
-     format as for the `environ' variable.
-
- -- Function: int execvp (const char *FILENAME, char *const ARGV[])
-     Preliminary: | MT-Safe env | AS-Unsafe heap | AC-Unsafe mem |
-     *Note POSIX Safety Concepts::.
-
-     The `execvp' function is similar to `execv', except that it
-     searches the directories listed in the `PATH' environment variable
-     (*note Standard Environment::) to find the full file name of a
-     file from FILENAME if FILENAME does not contain a slash.
-
-     This function is useful for executing system utility programs,
-     because it looks for them in the places that the user has chosen.
-     Shells use it to run the commands that users type.
-
- -- Function: int execlp (const char *FILENAME, const char *ARG0, ...)
-     Preliminary: | MT-Safe env | AS-Unsafe heap | AC-Unsafe mem |
-     *Note POSIX Safety Concepts::.
-
-     This function is like `execl', except that it performs the same
-     file name searching as the `execvp' function.
-
-   The size of the argument list and environment list taken together
-must not be greater than `ARG_MAX' bytes.  *Note General Limits::.  On
-GNU/Hurd systems, the size (which compares against `ARG_MAX') includes,
-for each string, the number of characters in the string, plus the size
-of a `char *', plus one, rounded up to a multiple of the size of a
-`char *'.  Other systems may have somewhat different rules for counting.
-
-   These functions normally don't return, since execution of a new
-program causes the currently executing program to go away completely.
-A value of `-1' is returned in the event of a failure.  In addition to
-the usual file name errors (*note File Name Errors::), the following
-`errno' error conditions are defined for these functions:
-
-`E2BIG'
-     The combined size of the new program's argument list and
-     environment list is larger than `ARG_MAX' bytes.  GNU/Hurd systems
-     have no specific limit on the argument list size, so this error
-     code cannot result, but you may get `ENOMEM' instead if the
-     arguments are too big for available memory.
-
-`ENOEXEC'
-     The specified file can't be executed because it isn't in the right
-     format.
-
-`ENOMEM'
-     Executing the specified file requires more storage than is
-     available.
-
-   If execution of the new file succeeds, it updates the access time
-field of the file as if the file had been read.  *Note File Times::,
-for more details about access times of files.
-
-   The point at which the file is closed again is not specified, but is
-at some point before the process exits or before another process image
-is executed.
-
-   Executing a new process image completely changes the contents of
-memory, copying only the argument and environment strings to new
-locations.  But many other attributes of the process are unchanged:
-
-   * The process ID and the parent process ID.  *Note Process Creation
-     Concepts::.
-
-   * Session and process group membership.  *Note Concepts of Job
-     Control::.
-
-   * Real user ID and group ID, and supplementary group IDs.  *Note
-     Process Persona::.
-
-   * Pending alarms.  *Note Setting an Alarm::.
-
-   * Current working directory and root directory.  *Note Working
-     Directory::.  On GNU/Hurd systems, the root directory is not
-     copied when executing a setuid program; instead the system default
-     root directory is used for the new program.
-
-   * File mode creation mask.  *Note Setting Permissions::.
-
-   * Process signal mask; see *note Process Signal Mask::.
-
-   * Pending signals; see *note Blocking Signals::.
-
-   * Elapsed processor time associated with the process; see *note
-     Processor Time::.
-
-   If the set-user-ID and set-group-ID mode bits of the process image
-file are set, this affects the effective user ID and effective group ID
-(respectively) of the process.  These concepts are discussed in detail
-in *note Process Persona::.
-
-   Signals that are set to be ignored in the existing process image are
-also set to be ignored in the new process image.  All other signals are
-set to the default action in the new process image.  For more
-information about signals, see *note Signal Handling::.
-
-   File descriptors open in the existing process image remain open in
-the new process image, unless they have the `FD_CLOEXEC'
-(close-on-exec) flag set.  The files that remain open inherit all
-attributes of the open file description from the existing process image,
-including file locks.  File descriptors are discussed in *note
-Low-Level I/O::.
-
-   Streams, by contrast, cannot survive through `exec' functions,
-because they are located in the memory of the process itself.  The new
-process image has no streams except those it creates afresh.  Each of
-the streams in the pre-`exec' process image has a descriptor inside it,
-and these descriptors do survive through `exec' (provided that they do
-not have `FD_CLOEXEC' set).  The new process image can reconnect these
-to new streams using `fdopen' (*note Descriptors and Streams::).
-
-
-File: libc.info,  Node: Process Completion,  Next: Process Completion Status,  Prev: Executing a File,  Up: Processes
-
-26.6 Process Completion
-=======================
-
-The functions described in this section are used to wait for a child
-process to terminate or stop, and determine its status.  These functions
-are declared in the header file `sys/wait.h'.  
-
- -- Function: pid_t waitpid (pid_t PID, int *STATUS-PTR, int OPTIONS)
+ -- Macro: int issignaling (_float-type_ X)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `waitpid' function is used to request status information from a
-     child process whose process ID is PID.  Normally, the calling
-     process is suspended until the child process makes status
-     information available by terminating.
+     This macro returns a nonzero value if X is a signaling NaN (sNaN).
+     It is based on draft TS 18661 and currently enabled as a GNU
+     extension.
 
-     Other values for the PID argument have special interpretations.  A
-     value of `-1' or `WAIT_ANY' requests status information for any
-     child process; a value of `0' or `WAIT_MYPGRP' requests
-     information for any child process in the same process group as the
-     calling process; and any other negative value - PGID requests
-     information for any child process whose process group ID is PGID.
+   Another set of floating-point classification functions was provided
+by BSD. The GNU C Library also supports these functions; however, we
+recommend that you use the ISO C99 macros in new code.  Those are
+standard and will be available more widely.  Also, since they are
+macros, you do not have to worry about the type of their argument.
 
-     If status information for a child process is available
-     immediately, this function returns immediately without waiting.
-     If more than one eligible child process has status information
-     available, one of them is chosen randomly, and its status is
-     returned immediately.  To get the status from the other eligible
-     child processes, you need to call `waitpid' again.
-
-     The OPTIONS argument is a bit mask.  Its value should be the
-     bitwise OR (that is, the `|' operator) of zero or more of the
-     `WNOHANG' and `WUNTRACED' flags.  You can use the `WNOHANG' flag
-     to indicate that the parent process shouldn't wait; and the
-     `WUNTRACED' flag to request status information from stopped
-     processes as well as processes that have terminated.
-
-     The status information from the child process is stored in the
-     object that STATUS-PTR points to, unless STATUS-PTR is a null
-     pointer.
-
-     This function is a cancellation point in multi-threaded programs.
-     This is a problem if the thread allocates some resources (like
-     memory, file descriptors, semaphores or whatever) at the time
-     `waitpid' is called.  If the thread gets canceled these resources
-     stay allocated until the program ends.  To avoid this calls to
-     `waitpid' should be protected using cancellation handlers.
-
-     The return value is normally the process ID of the child process
-     whose status is reported.  If there are child processes but none
-     of them is waiting to be noticed, `waitpid' will block until one
-     is.  However, if the `WNOHANG' option was specified, `waitpid'
-     will return zero instead of blocking.
-
-     If a specific PID to wait for was given to `waitpid', it will
-     ignore all other children (if any).  Therefore if there are
-     children waiting to be noticed but the child whose PID was
-     specified is not one of them, `waitpid' will block or return zero
-     as described above.
-
-     A value of `-1' is returned in case of error.  The following
-     `errno' error conditions are defined for this function:
-
-    `EINTR'
-          The function was interrupted by delivery of a signal to the
-          calling process.  *Note Interrupted Primitives::.
-
-    `ECHILD'
-          There are no child processes to wait for, or the specified PID
-          is not a child of the calling process.
-
-    `EINVAL'
-          An invalid value was provided for the OPTIONS argument.
-
-   These symbolic constants are defined as values for the PID argument
-to the `waitpid' function.
-
-`WAIT_ANY'
-     This constant macro (whose value is `-1') specifies that `waitpid'
-     should return status information about any child process.
-
-`WAIT_MYPGRP'
-     This constant (with value `0') specifies that `waitpid' should
-     return status information about any child process in the same
-     process group as the calling process.
-
-   These symbolic constants are defined as flags for the OPTIONS
-argument to the `waitpid' function.  You can bitwise-OR the flags
-together to obtain a value to use as the argument.
-
-`WNOHANG'
-     This flag specifies that `waitpid' should return immediately
-     instead of waiting, if there is no child process ready to be
-     noticed.
-
-`WUNTRACED'
-     This flag specifies that `waitpid' should report the status of any
-     child processes that have been stopped as well as those that have
-     terminated.
-
- -- Function: pid_t wait (int *STATUS-PTR)
+ -- Function: int isinf (double X)
+ -- Function: int isinff (float X)
+ -- Function: int isinfl (long double X)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This is a simplified version of `waitpid', and is used to wait
-     until any one child process terminates.  The call:
+     This function returns '-1' if X represents negative infinity, '1'
+     if X represents positive infinity, and '0' otherwise.
 
-          wait (&status)
-
-     is exactly equivalent to:
-
-          waitpid (-1, &status, 0)
-
-     This function is a cancellation point in multi-threaded programs.
-     This is a problem if the thread allocates some resources (like
-     memory, file descriptors, semaphores or whatever) at the time
-     `wait' is called.  If the thread gets canceled these resources
-     stay allocated until the program ends.  To avoid this calls to
-     `wait' should be protected using cancellation handlers.
-
- -- Function: pid_t wait4 (pid_t PID, int *STATUS-PTR, int OPTIONS,
-          struct rusage *USAGE)
+ -- Function: int isnan (double X)
+ -- Function: int isnanf (float X)
+ -- Function: int isnanl (long double X)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     If USAGE is a null pointer, `wait4' is equivalent to `waitpid
-     (PID, STATUS-PTR, OPTIONS)'.
+     This function returns a nonzero value if X is a "not a number"
+     value, and zero otherwise.
 
-     If USAGE is not null, `wait4' stores usage figures for the child
-     process in `*RUSAGE' (but only if the child has terminated, not if
-     it has stopped).  *Note Resource Usage::.
+     *NB:* The 'isnan' macro defined by ISO C99 overrides the BSD
+     function.  This is normally not a problem, because the two routines
+     behave identically.  However, if you really need to get the BSD
+     function for some reason, you can write
 
-     This function is a BSD extension.
+          (isnan) (x)
 
-   Here's an example of how to use `waitpid' to get the status from all
-child processes that have terminated, without ever waiting.  This
-function is designed to be a handler for `SIGCHLD', the signal that
-indicates that at least one child process has terminated.
-
-     void
-     sigchld_handler (int signum)
-     {
-       int pid, status, serrno;
-       serrno = errno;
-       while (1)
-         {
-           pid = waitpid (WAIT_ANY, &status, WNOHANG);
-           if (pid < 0)
-             {
-               perror ("waitpid");
-               break;
-             }
-           if (pid == 0)
-             break;
-           notice_termination (pid, status);
-         }
-       errno = serrno;
-     }
-
-
-File: libc.info,  Node: Process Completion Status,  Next: BSD Wait Functions,  Prev: Process Completion,  Up: Processes
-
-26.7 Process Completion Status
-==============================
-
-If the exit status value (*note Program Termination::) of the child
-process is zero, then the status value reported by `waitpid' or `wait'
-is also zero.  You can test for other kinds of information encoded in
-the returned status value using the following macros.  These macros are
-defined in the header file `sys/wait.h'.  
-
- -- Macro: int WIFEXITED (int STATUS)
+ -- Function: int finite (double X)
+ -- Function: int finitef (float X)
+ -- Function: int finitel (long double X)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This macro returns a nonzero value if the child process terminated
-     normally with `exit' or `_exit'.
+     This function returns a nonzero value if X is finite or a "not a
+     number" value, and zero otherwise.
 
- -- Macro: int WEXITSTATUS (int STATUS)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     If `WIFEXITED' is true of STATUS, this macro returns the low-order
-     8 bits of the exit status value from the child process.  *Note
-     Exit Status::.
-
- -- Macro: int WIFSIGNALED (int STATUS)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro returns a nonzero value if the child process terminated
-     because it received a signal that was not handled.  *Note Signal
-     Handling::.
-
- -- Macro: int WTERMSIG (int STATUS)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     If `WIFSIGNALED' is true of STATUS, this macro returns the signal
-     number of the signal that terminated the child process.
-
- -- Macro: int WCOREDUMP (int STATUS)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro returns a nonzero value if the child process terminated
-     and produced a core dump.
-
- -- Macro: int WIFSTOPPED (int STATUS)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro returns a nonzero value if the child process is stopped.
-
- -- Macro: int WSTOPSIG (int STATUS)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     If `WIFSTOPPED' is true of STATUS, this macro returns the signal
-     number of the signal that caused the child process to stop.
+   *Portability Note:* The functions listed in this section are BSD
+extensions.
 
 
-File: libc.info,  Node: BSD Wait Functions,  Next: Process Creation Example,  Prev: Process Completion Status,  Up: Processes
+File: libc.info,  Node: Floating Point Errors,  Next: Rounding,  Prev: Floating Point Classes,  Up: Arithmetic
 
-26.8 BSD Process Wait Functions
-===============================
-
-The GNU C Library also provides these related facilities for
-compatibility with BSD Unix.  BSD uses the `union wait' data type to
-represent status values rather than an `int'.  The two representations
-are actually interchangeable; they describe the same bit patterns.  The
-GNU C Library defines macros such as `WEXITSTATUS' so that they will
-work on either kind of object, and the `wait' function is defined to
-accept either type of pointer as its STATUS-PTR argument.
-
-   These functions are declared in `sys/wait.h'.  
-
- -- Data Type: union wait
-     This data type represents program termination status values.  It
-     has the following members:
-
-    `int w_termsig'
-          The value of this member is the same as that of the
-          `WTERMSIG' macro.
-
-    `int w_coredump'
-          The value of this member is the same as that of the
-          `WCOREDUMP' macro.
-
-    `int w_retcode'
-          The value of this member is the same as that of the
-          `WEXITSTATUS' macro.
-
-    `int w_stopsig'
-          The value of this member is the same as that of the
-          `WSTOPSIG' macro.
-
-     Instead of accessing these members directly, you should use the
-     equivalent macros.
-
-   The `wait3' function is the predecessor to `wait4', which is more
-flexible.  `wait3' is now obsolete.
-
- -- Function: pid_t wait3 (union wait *STATUS-PTR, int OPTIONS, struct
-          rusage *USAGE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     If USAGE is a null pointer, `wait3' is equivalent to `waitpid (-1,
-     STATUS-PTR, OPTIONS)'.
-
-     If USAGE is not null, `wait3' stores usage figures for the child
-     process in `*RUSAGE' (but only if the child has terminated, not if
-     it has stopped).  *Note Resource Usage::.
-
-
-File: libc.info,  Node: Process Creation Example,  Prev: BSD Wait Functions,  Up: Processes
-
-26.9 Process Creation Example
-=============================
-
-Here is an example program showing how you might write a function
-similar to the built-in `system'.  It executes its COMMAND argument
-using the equivalent of `sh -c COMMAND'.
-
-     #include <stddef.h>
-     #include <stdlib.h>
-     #include <unistd.h>
-     #include <sys/types.h>
-     #include <sys/wait.h>
-
-     /* Execute the command using this shell program.  */
-     #define SHELL "/bin/sh"
-
-     int
-     my_system (const char *command)
-     {
-       int status;
-       pid_t pid;
-
-       pid = fork ();
-       if (pid == 0)
-         {
-           /* This is the child process.  Execute the shell command. */
-           execl (SHELL, SHELL, "-c", command, NULL);
-           _exit (EXIT_FAILURE);
-         }
-       else if (pid < 0)
-         /* The fork failed.  Report failure.  */
-         status = -1;
-       else
-         /* This is the parent process.  Wait for the child to complete.  */
-         if (waitpid (pid, &status, 0) != pid)
-           status = -1;
-       return status;
-     }
-
-   There are a couple of things you should pay attention to in this
-example.
-
-   Remember that the first `argv' argument supplied to the program
-represents the name of the program being executed.  That is why, in the
-call to `execl', `SHELL' is supplied once to name the program to
-execute and a second time to supply a value for `argv[0]'.
-
-   The `execl' call in the child process doesn't return if it is
-successful.  If it fails, you must do something to make the child
-process terminate.  Just returning a bad status code with `return'
-would leave two processes running the original program.  Instead, the
-right behavior is for the child process to report failure to its parent
-process.
-
-   Call `_exit' to accomplish this.  The reason for using `_exit'
-instead of `exit' is to avoid flushing fully buffered streams such as
-`stdout'.  The buffers of these streams probably contain data that was
-copied from the parent process by the `fork', data that will be output
-eventually by the parent process.  Calling `exit' in the child would
-output the data twice.  *Note Termination Internals::.
-
-
-File: libc.info,  Node: Job Control,  Next: Name Service Switch,  Prev: Processes,  Up: Top
-
-27 Job Control
-**************
-
-"Job control" refers to the protocol for allowing a user to move
-between multiple "process groups" (or "jobs") within a single "login
-session".  The job control facilities are set up so that appropriate
-behavior for most programs happens automatically and they need not do
-anything special about job control.  So you can probably ignore the
-material in this chapter unless you are writing a shell or login
-program.
-
-   You need to be familiar with concepts relating to process creation
-(*note Process Creation Concepts::) and signal handling (*note Signal
-Handling::) in order to understand this material presented in this
-chapter.
-
-* Menu:
-
-* Concepts of Job Control::     Jobs can be controlled by a shell.
-* Job Control is Optional::     Not all POSIX systems support job control.
-* Controlling Terminal::        How a process gets its controlling terminal.
-* Access to the Terminal::      How processes share the controlling terminal.
-* Orphaned Process Groups::     Jobs left after the user logs out.
-* Implementing a Shell::        What a shell must do to implement job control.
-* Functions for Job Control::   Functions to control process groups.
-
-
-File: libc.info,  Node: Concepts of Job Control,  Next: Job Control is Optional,  Up: Job Control
-
-27.1 Concepts of Job Control
-============================
-
-The fundamental purpose of an interactive shell is to read commands
-from the user's terminal and create processes to execute the programs
-specified by those commands.  It can do this using the `fork' (*note
-Creating a Process::) and `exec' (*note Executing a File::) functions.
-
-   A single command may run just one process--but often one command uses
-several processes.  If you use the `|' operator in a shell command, you
-explicitly request several programs in their own processes.  But even
-if you run just one program, it can use multiple processes internally.
-For example, a single compilation command such as `cc -c foo.c'
-typically uses four processes (though normally only two at any given
-time).  If you run `make', its job is to run other programs in separate
-processes.
-
-   The processes belonging to a single command are called a "process
-group" or "job".  This is so that you can operate on all of them at
-once.  For example, typing `C-c' sends the signal `SIGINT' to terminate
-all the processes in the foreground process group.
-
-   A "session" is a larger group of processes.  Normally all the
-processes that stem from a single login belong to the same session.
-
-   Every process belongs to a process group.  When a process is
-created, it becomes a member of the same process group and session as
-its parent process.  You can put it in another process group using the
-`setpgid' function, provided the process group belongs to the same
-session.
-
-   The only way to put a process in a different session is to make it
-the initial process of a new session, or a "session leader", using the
-`setsid' function.  This also puts the session leader into a new
-process group, and you can't move it out of that process group again.
-
-   Usually, new sessions are created by the system login program, and
-the session leader is the process running the user's login shell.
-
-   A shell that supports job control must arrange to control which job
-can use the terminal at any time.  Otherwise there might be multiple
-jobs trying to read from the terminal at once, and confusion about which
-process should receive the input typed by the user.  To prevent this,
-the shell must cooperate with the terminal driver using the protocol
-described in this chapter.
-
-   The shell can give unlimited access to the controlling terminal to
-only one process group at a time.  This is called the "foreground job"
-on that controlling terminal.  Other process groups managed by the shell
-that are executing without such access to the terminal are called
-"background jobs".
-
-   If a background job needs to read from its controlling terminal, it
-is "stopped" by the terminal driver; if the `TOSTOP' mode is set,
-likewise for writing.  The user can stop a foreground job by typing the
-SUSP character (*note Special Characters::) and a program can stop any
-job by sending it a `SIGSTOP' signal.  It's the responsibility of the
-shell to notice when jobs stop, to notify the user about them, and to
-provide mechanisms for allowing the user to interactively continue
-stopped jobs and switch jobs between foreground and background.
-
-   *Note Access to the Terminal::, for more information about I/O to the
-controlling terminal,
-
-
-File: libc.info,  Node: Job Control is Optional,  Next: Controlling Terminal,  Prev: Concepts of Job Control,  Up: Job Control
-
-27.2 Job Control is Optional
-============================
-
-Not all operating systems support job control.  GNU systems do support
-job control, but if you are using the GNU C Library on some other
-system, that system may not support job control itself.
-
-   You can use the `_POSIX_JOB_CONTROL' macro to test at compile-time
-whether the system supports job control.  *Note System Options::.
-
-   If job control is not supported, then there can be only one process
-group per session, which behaves as if it were always in the foreground.
-The functions for creating additional process groups simply fail with
-the error code `ENOSYS'.
-
-   The macros naming the various job control signals (*note Job Control
-Signals::) are defined even if job control is not supported.  However,
-the system never generates these signals, and attempts to send a job
-control signal or examine or specify their actions report errors or do
-nothing.
-
-
-File: libc.info,  Node: Controlling Terminal,  Next: Access to the Terminal,  Prev: Job Control is Optional,  Up: Job Control
-
-27.3 Controlling Terminal of a Process
-======================================
-
-One of the attributes of a process is its controlling terminal.  Child
-processes created with `fork' inherit the controlling terminal from
-their parent process.  In this way, all the processes in a session
-inherit the controlling terminal from the session leader.  A session
-leader that has control of a terminal is called the "controlling
-process" of that terminal.
-
-   You generally do not need to worry about the exact mechanism used to
-allocate a controlling terminal to a session, since it is done for you
-by the system when you log in.
-
-   An individual process disconnects from its controlling terminal when
-it calls `setsid' to become the leader of a new session.  *Note Process
-Group Functions::.
-
-
-File: libc.info,  Node: Access to the Terminal,  Next: Orphaned Process Groups,  Prev: Controlling Terminal,  Up: Job Control
-
-27.4 Access to the Controlling Terminal
-=======================================
-
-Processes in the foreground job of a controlling terminal have
-unrestricted access to that terminal; background processes do not.  This
-section describes in more detail what happens when a process in a
-background job tries to access its controlling terminal.
-
-   When a process in a background job tries to read from its controlling
-terminal, the process group is usually sent a `SIGTTIN' signal.  This
-normally causes all of the processes in that group to stop (unless they
-handle the signal and don't stop themselves).  However, if the reading
-process is ignoring or blocking this signal, then `read' fails with an
-`EIO' error instead.
-
-   Similarly, when a process in a background job tries to write to its
-controlling terminal, the default behavior is to send a `SIGTTOU'
-signal to the process group.  However, the behavior is modified by the
-`TOSTOP' bit of the local modes flags (*note Local Modes::).  If this
-bit is not set (which is the default), then writing to the controlling
-terminal is always permitted without sending a signal.  Writing is also
-permitted if the `SIGTTOU' signal is being ignored or blocked by the
-writing process.
-
-   Most other terminal operations that a program can do are treated as
-reading or as writing.  (The description of each operation should say
-which.)
-
-   For more information about the primitive `read' and `write'
-functions, see *note I/O Primitives::.
-
-
-File: libc.info,  Node: Orphaned Process Groups,  Next: Implementing a Shell,  Prev: Access to the Terminal,  Up: Job Control
-
-27.5 Orphaned Process Groups
-============================
-
-When a controlling process terminates, its terminal becomes free and a
-new session can be established on it.  (In fact, another user could log
-in on the terminal.)  This could cause a problem if any processes from
-the old session are still trying to use that terminal.
-
-   To prevent problems, process groups that continue running even after
-the session leader has terminated are marked as "orphaned process
-groups".
-
-   When a process group becomes an orphan, its processes are sent a
-`SIGHUP' signal.  Ordinarily, this causes the processes to terminate.
-However, if a program ignores this signal or establishes a handler for
-it (*note Signal Handling::), it can continue running as in the orphan
-process group even after its controlling process terminates; but it
-still cannot access the terminal any more.
-
-
-File: libc.info,  Node: Implementing a Shell,  Next: Functions for Job Control,  Prev: Orphaned Process Groups,  Up: Job Control
-
-27.6 Implementing a Job Control Shell
-=====================================
-
-This section describes what a shell must do to implement job control, by
-presenting an extensive sample program to illustrate the concepts
-involved.
-
-* Menu:
-
-* Data Structures::             Introduction to the sample shell.
-* Initializing the Shell::      What the shell must do to take
-				 responsibility for job control.
-* Launching Jobs::              Creating jobs to execute commands.
-* Foreground and Background::   Putting a job in foreground of background.
-* Stopped and Terminated Jobs::  Reporting job status.
-* Continuing Stopped Jobs::     How to continue a stopped job in
-				 the foreground or background.
-* Missing Pieces::              Other parts of the shell.
-
-
-File: libc.info,  Node: Data Structures,  Next: Initializing the Shell,  Up: Implementing a Shell
-
-27.6.1 Data Structures for the Shell
-------------------------------------
-
-All of the program examples included in this chapter are part of a
-simple shell program.  This section presents data structures and
-utility functions which are used throughout the example.
-
-   The sample shell deals mainly with two data structures.  The `job'
-type contains information about a job, which is a set of subprocesses
-linked together with pipes.  The `process' type holds information about
-a single subprocess.  Here are the relevant data structure declarations:
-
-     /* A process is a single process.  */
-     typedef struct process
-     {
-       struct process *next;       /* next process in pipeline */
-       char **argv;                /* for exec */
-       pid_t pid;                  /* process ID */
-       char completed;             /* true if process has completed */
-       char stopped;               /* true if process has stopped */
-       int status;                 /* reported status value */
-     } process;
-
-     /* A job is a pipeline of processes.  */
-     typedef struct job
-     {
-       struct job *next;           /* next active job */
-       char *command;              /* command line, used for messages */
-       process *first_process;     /* list of processes in this job */
-       pid_t pgid;                 /* process group ID */
-       char notified;              /* true if user told about stopped job */
-       struct termios tmodes;      /* saved terminal modes */
-       int stdin, stdout, stderr;  /* standard i/o channels */
-     } job;
-
-     /* The active jobs are linked into a list.  This is its head.   */
-     job *first_job = NULL;
-
-   Here are some utility functions that are used for operating on `job'
-objects.
-
-     /* Find the active job with the indicated PGID.  */
-     job *
-     find_job (pid_t pgid)
-     {
-       job *j;
-
-       for (j = first_job; j; j = j->next)
-         if (j->pgid == pgid)
-           return j;
-       return NULL;
-     }
-
-     /* Return true if all processes in the job have stopped or completed.  */
-     int
-     job_is_stopped (job *j)
-     {
-       process *p;
-
-       for (p = j->first_process; p; p = p->next)
-         if (!p->completed && !p->stopped)
-           return 0;
-       return 1;
-     }
-
-     /* Return true if all processes in the job have completed.  */
-     int
-     job_is_completed (job *j)
-     {
-       process *p;
-
-       for (p = j->first_process; p; p = p->next)
-         if (!p->completed)
-           return 0;
-       return 1;
-     }
-
-
-File: libc.info,  Node: Initializing the Shell,  Next: Launching Jobs,  Prev: Data Structures,  Up: Implementing a Shell
-
-27.6.2 Initializing the Shell
------------------------------
-
-When a shell program that normally performs job control is started, it
-has to be careful in case it has been invoked from another shell that is
-already doing its own job control.
-
-   A subshell that runs interactively has to ensure that it has been
-placed in the foreground by its parent shell before it can enable job
-control itself.  It does this by getting its initial process group ID
-with the `getpgrp' function, and comparing it to the process group ID
-of the current foreground job associated with its controlling terminal
-(which can be retrieved using the `tcgetpgrp' function).
-
-   If the subshell is not running as a foreground job, it must stop
-itself by sending a `SIGTTIN' signal to its own process group.  It may
-not arbitrarily put itself into the foreground; it must wait for the
-user to tell the parent shell to do this.  If the subshell is continued
-again, it should repeat the check and stop itself again if it is still
-not in the foreground.
-
-   Once the subshell has been placed into the foreground by its parent
-shell, it can enable its own job control.  It does this by calling
-`setpgid' to put itself into its own process group, and then calling
-`tcsetpgrp' to place this process group into the foreground.
-
-   When a shell enables job control, it should set itself to ignore all
-the job control stop signals so that it doesn't accidentally stop
-itself.  You can do this by setting the action for all the stop signals
-to `SIG_IGN'.
-
-   A subshell that runs non-interactively cannot and should not support
-job control.  It must leave all processes it creates in the same process
-group as the shell itself; this allows the non-interactive shell and its
-child processes to be treated as a single job by the parent shell.  This
-is easy to do--just don't use any of the job control primitives--but
-you must remember to make the shell do it.
-
-   Here is the initialization code for the sample shell that shows how
-to do all of this.
-
-     /* Keep track of attributes of the shell.  */
-
-     #include <sys/types.h>
-     #include <termios.h>
-     #include <unistd.h>
-
-     pid_t shell_pgid;
-     struct termios shell_tmodes;
-     int shell_terminal;
-     int shell_is_interactive;
-
-
-     /* Make sure the shell is running interactively as the foreground job
-        before proceeding. */
-
-     void
-     init_shell ()
-     {
-
-       /* See if we are running interactively.  */
-       shell_terminal = STDIN_FILENO;
-       shell_is_interactive = isatty (shell_terminal);
-
-       if (shell_is_interactive)
-         {
-           /* Loop until we are in the foreground.  */
-           while (tcgetpgrp (shell_terminal) != (shell_pgid = getpgrp ()))
-             kill (- shell_pgid, SIGTTIN);
-
-           /* Ignore interactive and job-control signals.  */
-           signal (SIGINT, SIG_IGN);
-           signal (SIGQUIT, SIG_IGN);
-           signal (SIGTSTP, SIG_IGN);
-           signal (SIGTTIN, SIG_IGN);
-           signal (SIGTTOU, SIG_IGN);
-           signal (SIGCHLD, SIG_IGN);
-
-           /* Put ourselves in our own process group.  */
-           shell_pgid = getpid ();
-           if (setpgid (shell_pgid, shell_pgid) < 0)
-             {
-               perror ("Couldn't put the shell in its own process group");
-               exit (1);
-             }
-
-           /* Grab control of the terminal.  */
-           tcsetpgrp (shell_terminal, shell_pgid);
-
-           /* Save default terminal attributes for shell.  */
-           tcgetattr (shell_terminal, &shell_tmodes);
-         }
-     }
-
-
-File: libc.info,  Node: Launching Jobs,  Next: Foreground and Background,  Prev: Initializing the Shell,  Up: Implementing a Shell
-
-27.6.3 Launching Jobs
----------------------
-
-Once the shell has taken responsibility for performing job control on
-its controlling terminal, it can launch jobs in response to commands
-typed by the user.
-
-   To create the processes in a process group, you use the same `fork'
-and `exec' functions described in *note Process Creation Concepts::.
-Since there are multiple child processes involved, though, things are a
-little more complicated and you must be careful to do things in the
-right order.  Otherwise, nasty race conditions can result.
-
-   You have two choices for how to structure the tree of parent-child
-relationships among the processes.  You can either make all the
-processes in the process group be children of the shell process, or you
-can make one process in group be the ancestor of all the other processes
-in that group.  The sample shell program presented in this chapter uses
-the first approach because it makes bookkeeping somewhat simpler.
-
-   As each process is forked, it should put itself in the new process
-group by calling `setpgid'; see *note Process Group Functions::.  The
-first process in the new group becomes its "process group leader", and
-its process ID becomes the "process group ID" for the group.
-
-   The shell should also call `setpgid' to put each of its child
-processes into the new process group.  This is because there is a
-potential timing problem: each child process must be put in the process
-group before it begins executing a new program, and the shell depends on
-having all the child processes in the group before it continues
-executing.  If both the child processes and the shell call `setpgid',
-this ensures that the right things happen no matter which process gets
-to it first.
-
-   If the job is being launched as a foreground job, the new process
-group also needs to be put into the foreground on the controlling
-terminal using `tcsetpgrp'.  Again, this should be done by the shell as
-well as by each of its child processes, to avoid race conditions.
-
-   The next thing each child process should do is to reset its signal
-actions.
-
-   During initialization, the shell process set itself to ignore job
-control signals; see *note Initializing the Shell::.  As a result, any
-child processes it creates also ignore these signals by inheritance.
-This is definitely undesirable, so each child process should explicitly
-set the actions for these signals back to `SIG_DFL' just after it is
-forked.
-
-   Since shells follow this convention, applications can assume that
-they inherit the correct handling of these signals from the parent
-process.  But every application has a responsibility not to mess up the
-handling of stop signals.  Applications that disable the normal
-interpretation of the SUSP character should provide some other
-mechanism for the user to stop the job.  When the user invokes this
-mechanism, the program should send a `SIGTSTP' signal to the process
-group of the process, not just to the process itself.  *Note Signaling
-Another Process::.
-
-   Finally, each child process should call `exec' in the normal way.
-This is also the point at which redirection of the standard input and
-output channels should be handled.  *Note Duplicating Descriptors::,
-for an explanation of how to do this.
-
-   Here is the function from the sample shell program that is
-responsible for launching a program.  The function is executed by each
-child process immediately after it has been forked by the shell, and
-never returns.
-
-     void
-     launch_process (process *p, pid_t pgid,
-                     int infile, int outfile, int errfile,
-                     int foreground)
-     {
-       pid_t pid;
-
-       if (shell_is_interactive)
-         {
-           /* Put the process into the process group and give the process group
-              the terminal, if appropriate.
-              This has to be done both by the shell and in the individual
-              child processes because of potential race conditions.  */
-           pid = getpid ();
-           if (pgid == 0) pgid = pid;
-           setpgid (pid, pgid);
-           if (foreground)
-             tcsetpgrp (shell_terminal, pgid);
-
-           /* Set the handling for job control signals back to the default.  */
-           signal (SIGINT, SIG_DFL);
-           signal (SIGQUIT, SIG_DFL);
-           signal (SIGTSTP, SIG_DFL);
-           signal (SIGTTIN, SIG_DFL);
-           signal (SIGTTOU, SIG_DFL);
-           signal (SIGCHLD, SIG_DFL);
-         }
-
-       /* Set the standard input/output channels of the new process.  */
-       if (infile != STDIN_FILENO)
-         {
-           dup2 (infile, STDIN_FILENO);
-           close (infile);
-         }
-       if (outfile != STDOUT_FILENO)
-         {
-           dup2 (outfile, STDOUT_FILENO);
-           close (outfile);
-         }
-       if (errfile != STDERR_FILENO)
-         {
-           dup2 (errfile, STDERR_FILENO);
-           close (errfile);
-         }
-
-       /* Exec the new process.  Make sure we exit.  */
-       execvp (p->argv[0], p->argv);
-       perror ("execvp");
-       exit (1);
-     }
-
-   If the shell is not running interactively, this function does not do
-anything with process groups or signals.  Remember that a shell not
-performing job control must keep all of its subprocesses in the same
-process group as the shell itself.
-
-   Next, here is the function that actually launches a complete job.
-After creating the child processes, this function calls some other
-functions to put the newly created job into the foreground or
-background; these are discussed in *note Foreground and Background::.
-
-     void
-     launch_job (job *j, int foreground)
-     {
-       process *p;
-       pid_t pid;
-       int mypipe[2], infile, outfile;
-
-       infile = j->stdin;
-       for (p = j->first_process; p; p = p->next)
-         {
-           /* Set up pipes, if necessary.  */
-           if (p->next)
-             {
-               if (pipe (mypipe) < 0)
-                 {
-                   perror ("pipe");
-                   exit (1);
-                 }
-               outfile = mypipe[1];
-             }
-           else
-             outfile = j->stdout;
-
-           /* Fork the child processes.  */
-           pid = fork ();
-           if (pid == 0)
-             /* This is the child process.  */
-             launch_process (p, j->pgid, infile,
-                             outfile, j->stderr, foreground);
-           else if (pid < 0)
-             {
-               /* The fork failed.  */
-               perror ("fork");
-               exit (1);
-             }
-           else
-             {
-               /* This is the parent process.  */
-               p->pid = pid;
-               if (shell_is_interactive)
-                 {
-                   if (!j->pgid)
-                     j->pgid = pid;
-                   setpgid (pid, j->pgid);
-                 }
-             }
-
-           /* Clean up after pipes.  */
-           if (infile != j->stdin)
-             close (infile);
-           if (outfile != j->stdout)
-             close (outfile);
-           infile = mypipe[0];
-         }
-
-       format_job_info (j, "launched");
-
-       if (!shell_is_interactive)
-         wait_for_job (j);
-       else if (foreground)
-         put_job_in_foreground (j, 0);
-       else
-         put_job_in_background (j, 0);
-     }
-
-
-File: libc.info,  Node: Foreground and Background,  Next: Stopped and Terminated Jobs,  Prev: Launching Jobs,  Up: Implementing a Shell
-
-27.6.4 Foreground and Background
---------------------------------
-
-Now let's consider what actions must be taken by the shell when it
-launches a job into the foreground, and how this differs from what must
-be done when a background job is launched.
-
-   When a foreground job is launched, the shell must first give it
-access to the controlling terminal by calling `tcsetpgrp'.  Then, the
-shell should wait for processes in that process group to terminate or
-stop.  This is discussed in more detail in *note Stopped and Terminated
-Jobs::.
-
-   When all of the processes in the group have either completed or
-stopped, the shell should regain control of the terminal for its own
-process group by calling `tcsetpgrp' again.  Since stop signals caused
-by I/O from a background process or a SUSP character typed by the user
-are sent to the process group, normally all the processes in the job
-stop together.
-
-   The foreground job may have left the terminal in a strange state, so
-the shell should restore its own saved terminal modes before
-continuing.  In case the job is merely stopped, the shell should first
-save the current terminal modes so that it can restore them later if
-the job is continued.  The functions for dealing with terminal modes are
-`tcgetattr' and `tcsetattr'; these are described in *note Terminal
-Modes::.
-
-   Here is the sample shell's function for doing all of this.
-
-     /* Put job J in the foreground.  If CONT is nonzero,
-        restore the saved terminal modes and send the process group a
-        `SIGCONT' signal to wake it up before we block.  */
-
-     void
-     put_job_in_foreground (job *j, int cont)
-     {
-       /* Put the job into the foreground.  */
-       tcsetpgrp (shell_terminal, j->pgid);
-
-       /* Send the job a continue signal, if necessary.  */
-       if (cont)
-         {
-           tcsetattr (shell_terminal, TCSADRAIN, &j->tmodes);
-           if (kill (- j->pgid, SIGCONT) < 0)
-             perror ("kill (SIGCONT)");
-         }
-
-       /* Wait for it to report.  */
-       wait_for_job (j);
-
-       /* Put the shell back in the foreground.  */
-       tcsetpgrp (shell_terminal, shell_pgid);
-
-       /* Restore the shell's terminal modes.  */
-       tcgetattr (shell_terminal, &j->tmodes);
-       tcsetattr (shell_terminal, TCSADRAIN, &shell_tmodes);
-     }
-
-   If the process group is launched as a background job, the shell
-should remain in the foreground itself and continue to read commands
-from the terminal.
-
-   In the sample shell, there is not much that needs to be done to put
-a job into the background.  Here is the function it uses:
-
-     /* Put a job in the background.  If the cont argument is true, send
-        the process group a `SIGCONT' signal to wake it up.  */
-
-     void
-     put_job_in_background (job *j, int cont)
-     {
-       /* Send the job a continue signal, if necessary.  */
-       if (cont)
-         if (kill (-j->pgid, SIGCONT) < 0)
-           perror ("kill (SIGCONT)");
-     }
-
-
-File: libc.info,  Node: Stopped and Terminated Jobs,  Next: Continuing Stopped Jobs,  Prev: Foreground and Background,  Up: Implementing a Shell
-
-27.6.5 Stopped and Terminated Jobs
-----------------------------------
-
-When a foreground process is launched, the shell must block until all of
-the processes in that job have either terminated or stopped.  It can do
-this by calling the `waitpid' function; see *note Process Completion::.
-Use the `WUNTRACED' option so that status is reported for processes
-that stop as well as processes that terminate.
-
-   The shell must also check on the status of background jobs so that it
-can report terminated and stopped jobs to the user; this can be done by
-calling `waitpid' with the `WNOHANG' option.  A good place to put a
-such a check for terminated and stopped jobs is just before prompting
-for a new command.
-
-   The shell can also receive asynchronous notification that there is
-status information available for a child process by establishing a
-handler for `SIGCHLD' signals.  *Note Signal Handling::.
-
-   In the sample shell program, the `SIGCHLD' signal is normally
-ignored.  This is to avoid reentrancy problems involving the global data
-structures the shell manipulates.  But at specific times when the shell
-is not using these data structures--such as when it is waiting for
-input on the terminal--it makes sense to enable a handler for
-`SIGCHLD'.  The same function that is used to do the synchronous status
-checks (`do_job_notification', in this case) can also be called from
-within this handler.
-
-   Here are the parts of the sample shell program that deal with
-checking the status of jobs and reporting the information to the user.
-
-     /* Store the status of the process PID that was returned by waitpid.
-        Return 0 if all went well, nonzero otherwise.  */
-
-     int
-     mark_process_status (pid_t pid, int status)
-     {
-       job *j;
-       process *p;
-
-       if (pid > 0)
-         {
-           /* Update the record for the process.  */
-           for (j = first_job; j; j = j->next)
-             for (p = j->first_process; p; p = p->next)
-               if (p->pid == pid)
-                 {
-                   p->status = status;
-                   if (WIFSTOPPED (status))
-                     p->stopped = 1;
-                   else
-                     {
-                       p->completed = 1;
-                       if (WIFSIGNALED (status))
-                         fprintf (stderr, "%d: Terminated by signal %d.\n",
-                                  (int) pid, WTERMSIG (p->status));
-                     }
-                   return 0;
-                  }
-           fprintf (stderr, "No child process %d.\n", pid);
-           return -1;
-         }
-       else if (pid == 0 || errno == ECHILD)
-         /* No processes ready to report.  */
-         return -1;
-       else {
-         /* Other weird errors.  */
-         perror ("waitpid");
-         return -1;
-       }
-     }
-
-     /* Check for processes that have status information available,
-        without blocking.  */
-
-     void
-     update_status (void)
-     {
-       int status;
-       pid_t pid;
-
-       do
-         pid = waitpid (WAIT_ANY, &status, WUNTRACED|WNOHANG);
-       while (!mark_process_status (pid, status));
-     }
-
-     /* Check for processes that have status information available,
-        blocking until all processes in the given job have reported.  */
-
-     void
-     wait_for_job (job *j)
-     {
-       int status;
-       pid_t pid;
-
-       do
-         pid = waitpid (WAIT_ANY, &status, WUNTRACED);
-       while (!mark_process_status (pid, status)
-              && !job_is_stopped (j)
-              && !job_is_completed (j));
-     }
-
-     /* Format information about job status for the user to look at.  */
-
-     void
-     format_job_info (job *j, const char *status)
-     {
-       fprintf (stderr, "%ld (%s): %s\n", (long)j->pgid, status, j->command);
-     }
-
-     /* Notify the user about stopped or terminated jobs.
-        Delete terminated jobs from the active job list.  */
-
-     void
-     do_job_notification (void)
-     {
-       job *j, *jlast, *jnext;
-       process *p;
-
-       /* Update status information for child processes.  */
-       update_status ();
-
-       jlast = NULL;
-       for (j = first_job; j; j = jnext)
-         {
-           jnext = j->next;
-
-           /* If all processes have completed, tell the user the job has
-              completed and delete it from the list of active jobs.  */
-           if (job_is_completed (j)) {
-             format_job_info (j, "completed");
-             if (jlast)
-               jlast->next = jnext;
-             else
-               first_job = jnext;
-             free_job (j);
-           }
-
-           /* Notify the user about stopped jobs,
-              marking them so that we won't do this more than once.  */
-           else if (job_is_stopped (j) && !j->notified) {
-             format_job_info (j, "stopped");
-             j->notified = 1;
-             jlast = j;
-           }
-
-           /* Don't say anything about jobs that are still running.  */
-           else
-             jlast = j;
-         }
-     }
-
-
-File: libc.info,  Node: Continuing Stopped Jobs,  Next: Missing Pieces,  Prev: Stopped and Terminated Jobs,  Up: Implementing a Shell
-
-27.6.6 Continuing Stopped Jobs
-------------------------------
-
-The shell can continue a stopped job by sending a `SIGCONT' signal to
-its process group.  If the job is being continued in the foreground,
-the shell should first invoke `tcsetpgrp' to give the job access to the
-terminal, and restore the saved terminal settings.  After continuing a
-job in the foreground, the shell should wait for the job to stop or
-complete, as if the job had just been launched in the foreground.
-
-   The sample shell program handles both newly created and continued
-jobs with the same pair of functions, `put_job_in_foreground' and
-`put_job_in_background'.  The definitions of these functions were given
-in *note Foreground and Background::.  When continuing a stopped job, a
-nonzero value is passed as the CONT argument to ensure that the
-`SIGCONT' signal is sent and the terminal modes reset, as appropriate.
-
-   This leaves only a function for updating the shell's internal
-bookkeeping about the job being continued:
-
-     /* Mark a stopped job J as being running again.  */
-
-     void
-     mark_job_as_running (job *j)
-     {
-       Process *p;
-
-       for (p = j->first_process; p; p = p->next)
-         p->stopped = 0;
-       j->notified = 0;
-     }
-
-     /* Continue the job J.  */
-
-     void
-     continue_job (job *j, int foreground)
-     {
-       mark_job_as_running (j);
-       if (foreground)
-         put_job_in_foreground (j, 1);
-       else
-         put_job_in_background (j, 1);
-     }
-
-
-File: libc.info,  Node: Missing Pieces,  Prev: Continuing Stopped Jobs,  Up: Implementing a Shell
-
-27.6.7 The Missing Pieces
--------------------------
-
-The code extracts for the sample shell included in this chapter are only
-a part of the entire shell program.  In particular, nothing at all has
-been said about how `job' and `program' data structures are allocated
-and initialized.
-
-   Most real shells provide a complex user interface that has support
-for a command language; variables; abbreviations, substitutions, and
-pattern matching on file names; and the like.  All of this is far too
-complicated to explain here!  Instead, we have concentrated on showing
-how to implement the core process creation and job control functions
-that can be called from such a shell.
-
-   Here is a table summarizing the major entry points we have presented:
-
-`void init_shell (void)'
-     Initialize the shell's internal state.  *Note Initializing the
-     Shell::.
-
-`void launch_job (job *J, int FOREGROUND)'
-     Launch the job J as either a foreground or background job.  *Note
-     Launching Jobs::.
-
-`void do_job_notification (void)'
-     Check for and report any jobs that have terminated or stopped.
-     Can be called synchronously or within a handler for `SIGCHLD'
-     signals.  *Note Stopped and Terminated Jobs::.
-
-`void continue_job (job *J, int FOREGROUND)'
-     Continue the job J.  *Note Continuing Stopped Jobs::.
-
-   Of course, a real shell would also want to provide other functions
-for managing jobs.  For example, it would be useful to have commands to
-list all active jobs or to send a signal (such as `SIGKILL') to a job.
-
-
-File: libc.info,  Node: Functions for Job Control,  Prev: Implementing a Shell,  Up: Job Control
-
-27.7 Functions for Job Control
-==============================
-
-This section contains detailed descriptions of the functions relating
-to job control.
-
-* Menu:
-
-* Identifying the Terminal::    Determining the controlling terminal's name.
-* Process Group Functions::     Functions for manipulating process groups.
-* Terminal Access Functions::   Functions for controlling terminal access.
-
-
-File: libc.info,  Node: Identifying the Terminal,  Next: Process Group Functions,  Up: Functions for Job Control
-
-27.7.1 Identifying the Controlling Terminal
--------------------------------------------
-
-You can use the `ctermid' function to get a file name that you can use
-to open the controlling terminal.  In the GNU C Library, it returns the
-same string all the time: `"/dev/tty"'.  That is a special "magic" file
-name that refers to the controlling terminal of the current process (if
-it has one).  To find the name of the specific terminal device, use
-`ttyname'; *note Is It a Terminal::.
-
-   The function `ctermid' is declared in the header file `stdio.h'.  
-
- -- Function: char * ctermid (char *STRING)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `ctermid' function returns a string containing the file name of
-     the controlling terminal for the current process.  If STRING is
-     not a null pointer, it should be an array that can hold at least
-     `L_ctermid' characters; the string is returned in this array.
-     Otherwise, a pointer to a string in a static area is returned,
-     which might get overwritten on subsequent calls to this function.
-
-     An empty string is returned if the file name cannot be determined
-     for any reason.  Even if a file name is returned, access to the
-     file it represents is not guaranteed.
-
- -- Macro: int L_ctermid
-     The value of this macro is an integer constant expression that
-     represents the size of a string large enough to hold the file name
-     returned by `ctermid'.
-
-   See also the `isatty' and `ttyname' functions, in *note Is It a
-Terminal::.
-
-
-File: libc.info,  Node: Process Group Functions,  Next: Terminal Access Functions,  Prev: Identifying the Terminal,  Up: Functions for Job Control
-
-27.7.2 Process Group Functions
-------------------------------
-
-Here are descriptions of the functions for manipulating process groups.
-Your program should include the header files `sys/types.h' and
-`unistd.h' to use these functions.  
-
- -- Function: pid_t setsid (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `setsid' function creates a new session.  The calling process
-     becomes the session leader, and is put in a new process group whose
-     process group ID is the same as the process ID of that process.
-     There are initially no other processes in the new process group,
-     and no other process groups in the new session.
-
-     This function also makes the calling process have no controlling
-     terminal.
-
-     The `setsid' function returns the new process group ID of the
-     calling process if successful.  A return value of `-1' indicates an
-     error.  The following `errno' error conditions are defined for this
-     function:
-
-    `EPERM'
-          The calling process is already a process group leader, or
-          there is already another process group around that has the
-          same process group ID.
-
- -- Function: pid_t getsid (pid_t PID)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `getsid' function returns the process group ID of the session
-     leader of the specified process.  If a PID is `0', the process
-     group ID of the session leader of the current process is returned.
-
-     In case of error `-1' is returned and `errno' is set.  The
-     following `errno' error conditions are defined for this function:
-
-    `ESRCH'
-          There is no process with the given process ID PID.
-
-    `EPERM'
-          The calling process and the process specified by PID are in
-          different sessions, and the implementation doesn't allow to
-          access the process group ID of the session leader of the
-          process with ID PID from the calling process.
-
- -- Function: pid_t getpgrp (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `getpgrp' function returns the process group ID of the calling
-     process.
-
- -- Function: int getpgid (pid_t PID)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `getpgid' function returns the process group ID of the process
-     PID.  You can supply a value of `0' for the PID argument to get
-     information about the calling process.
-
-     In case of error `-1' is returned and `errno' is set.  The
-     following `errno' error conditions are defined for this function:
-
-    `ESRCH'
-          There is no process with the given process ID PID.  The
-          calling process and the process specified by PID are in
-          different sessions, and the implementation doesn't allow to
-          access the process group ID of the process with ID PID from
-          the calling process.
-
- -- Function: int setpgid (pid_t PID, pid_t PGID)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `setpgid' function puts the process PID into the process group
-     PGID.  As a special case, either PID or PGID can be zero to
-     indicate the process ID of the calling process.
-
-     This function fails on a system that does not support job control.
-     *Note Job Control is Optional::, for more information.
-
-     If the operation is successful, `setpgid' returns zero.  Otherwise
-     it returns `-1'.  The following `errno' error conditions are
-     defined for this function:
-
-    `EACCES'
-          The child process named by PID has executed an `exec'
-          function since it was forked.
-
-    `EINVAL'
-          The value of the PGID is not valid.
-
-    `ENOSYS'
-          The system doesn't support job control.
-
-    `EPERM'
-          The process indicated by the PID argument is a session leader,
-          or is not in the same session as the calling process, or the
-          value of the PGID argument doesn't match a process group ID
-          in the same session as the calling process.
-
-    `ESRCH'
-          The process indicated by the PID argument is not the calling
-          process or a child of the calling process.
-
- -- Function: int setpgrp (pid_t PID, pid_t PGID)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This is the BSD Unix name for `setpgid'.  Both functions do exactly
-     the same thing.
-
-
-File: libc.info,  Node: Terminal Access Functions,  Prev: Process Group Functions,  Up: Functions for Job Control
-
-27.7.3 Functions for Controlling Terminal Access
-------------------------------------------------
-
-These are the functions for reading or setting the foreground process
-group of a terminal.  You should include the header files `sys/types.h'
-and `unistd.h' in your application to use these functions.  
-
-   Although these functions take a file descriptor argument to specify
-the terminal device, the foreground job is associated with the terminal
-file itself and not a particular open file descriptor.
-
- -- Function: pid_t tcgetpgrp (int FILEDES)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function returns the process group ID of the foreground
-     process group associated with the terminal open on descriptor
-     FILEDES.
-
-     If there is no foreground process group, the return value is a
-     number greater than `1' that does not match the process group ID
-     of any existing process group.  This can happen if all of the
-     processes in the job that was formerly the foreground job have
-     terminated, and no other job has yet been moved into the
-     foreground.
-
-     In case of an error, a value of `-1' is returned.  The following
-     `errno' error conditions are defined for this function:
-
-    `EBADF'
-          The FILEDES argument is not a valid file descriptor.
-
-    `ENOSYS'
-          The system doesn't support job control.
-
-    `ENOTTY'
-          The terminal file associated with the FILEDES argument isn't
-          the controlling terminal of the calling process.
-
- -- Function: int tcsetpgrp (int FILEDES, pid_t PGID)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is used to set a terminal's foreground process group
-     ID.  The argument FILEDES is a descriptor which specifies the
-     terminal; PGID specifies the process group.  The calling process
-     must be a member of the same session as PGID and must have the same
-     controlling terminal.
-
-     For terminal access purposes, this function is treated as output.
-     If it is called from a background process on its controlling
-     terminal, normally all processes in the process group are sent a
-     `SIGTTOU' signal.  The exception is if the calling process itself
-     is ignoring or blocking `SIGTTOU' signals, in which case the
-     operation is performed and no signal is sent.
-
-     If successful, `tcsetpgrp' returns `0'.  A return value of `-1'
-     indicates an error.  The following `errno' error conditions are
-     defined for this function:
-
-    `EBADF'
-          The FILEDES argument is not a valid file descriptor.
-
-    `EINVAL'
-          The PGID argument is not valid.
-
-    `ENOSYS'
-          The system doesn't support job control.
-
-    `ENOTTY'
-          The FILEDES isn't the controlling terminal of the calling
-          process.
-
-    `EPERM'
-          The PGID isn't a process group in the same session as the
-          calling process.
-
- -- Function: pid_t tcgetsid (int FILDES)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function is used to obtain the process group ID of the session
-     for which the terminal specified by FILDES is the controlling
-     terminal.  If the call is successful the group ID is returned.
-     Otherwise the return value is `(pid_t) -1' and the global variable
-     ERRNO is set to the following value:
-    `EBADF'
-          The FILEDES argument is not a valid file descriptor.
-
-    `ENOTTY'
-          The calling process does not have a controlling terminal, or
-          the file is not the controlling terminal.
-
-
-File: libc.info,  Node: Name Service Switch,  Next: Users and Groups,  Prev: Job Control,  Up: Top
-
-28 System Databases and Name Service Switch
-*******************************************
-
-Various functions in the C Library need to be configured to work
-correctly in the local environment.  Traditionally, this was done by
-using files (e.g., `/etc/passwd'), but other nameservices (like the
-Network Information Service (NIS) and the Domain Name Service (DNS))
-became popular, and were hacked into the C library, usually with a fixed
-search order.
-
-   The GNU C Library contains a cleaner solution of this problem.  It is
-designed after a method used by Sun Microsystems in the C library of
-Solaris 2.  The GNU C Library follows their name and calls this scheme
-"Name Service Switch" (NSS).
-
-   Though the interface might be similar to Sun's version there is no
-common code.  We never saw any source code of Sun's implementation and
-so the internal interface is incompatible.  This also manifests in the
-file names we use as we will see later.
-
-* Menu:
-
-* NSS Basics::                  What is this NSS good for.
-* NSS Configuration File::      Configuring NSS.
-* NSS Module Internals::        How does it work internally.
-* Extending NSS::               What to do to add services or databases.
-
-
-File: libc.info,  Node: NSS Basics,  Next: NSS Configuration File,  Prev: Name Service Switch,  Up: Name Service Switch
-
-28.1 NSS Basics
-===============
-
-The basic idea is to put the implementation of the different services
-offered to access the databases in separate modules.  This has some
-advantages:
-
-  1. Contributors can add new services without adding them to the GNU C
-     Library.
-
-  2. The modules can be updated separately.
-
-  3. The C library image is smaller.
-
-   To fulfill the first goal above the ABI of the modules will be
-described below.  For getting the implementation of a new service right
-it is important to understand how the functions in the modules get
-called.  They are in no way designed to be used by the programmer
-directly.  Instead the programmer should only use the documented and
-standardized functions to access the databases.
-
-The databases available in the NSS are
-
-`aliases'
-     Mail aliases
-
-`ethers'
-     Ethernet numbers,
-
-`group'
-     Groups of users, *note Group Database::.
-
-`hosts'
-     Host names and numbers, *note Host Names::.
-
-`netgroup'
-     Network wide list of host and users, *note Netgroup Database::.
-
-`networks'
-     Network names and numbers, *note Networks Database::.
-
-`protocols'
-     Network protocols, *note Protocols Database::.
-
-`passwd'
-     User passwords, *note User Database::.
-
-`rpc'
-     Remote procedure call names and numbers,
-
-`services'
-     Network services, *note Services Database::.
-
-`shadow'
-     Shadow user passwords,
-
-There will be some more added later (`automount', `bootparams',
-`netmasks', and `publickey').
-
-
-File: libc.info,  Node: NSS Configuration File,  Next: NSS Module Internals,  Prev: NSS Basics,  Up: Name Service Switch
-
-28.2 The NSS Configuration File
-===============================
-
-Somehow the NSS code must be told about the wishes of the user.  For
-this reason there is the file `/etc/nsswitch.conf'.  For each database
-this file contain a specification how the lookup process should work.
-The file could look like this:
-
-     # /etc/nsswitch.conf
-     #
-     # Name Service Switch configuration file.
-     #
-
-     passwd:     db files nis
-     shadow:     files
-     group:      db files nis
-
-     hosts:      files nisplus nis dns
-     networks:   nisplus [NOTFOUND=return] files
-
-     ethers:     nisplus [NOTFOUND=return] db files
-     protocols:  nisplus [NOTFOUND=return] db files
-     rpc:        nisplus [NOTFOUND=return] db files
-     services:   nisplus [NOTFOUND=return] db files
-
-   The first column is the database as you can guess from the table
-above.  The rest of the line specifies how the lookup process works.
-Please note that you specify the way it works for each database
-individually.  This cannot be done with the old way of a monolithic
-implementation.
-
-   The configuration specification for each database can contain two
-different items:
-
-   * the service specification like `files', `db', or `nis'.
-
-   * the reaction on lookup result like `[NOTFOUND=return]'.
-
-* Menu:
-
-* Services in the NSS configuration::  Service names in the NSS configuration.
-* Actions in the NSS configuration::  React appropriately to the lookup result.
-* Notes on NSS Configuration File::  Things to take care about while
-                                     configuring NSS.
-
-
-File: libc.info,  Node: Services in the NSS configuration,  Next: Actions in the NSS configuration,  Prev: NSS Configuration File,  Up: NSS Configuration File
-
-28.2.1 Services in the NSS configuration File
----------------------------------------------
-
-The above example file mentions five different services: `files', `db',
-`dns', `nis', and `nisplus'.  This does not mean these services are
-available on all sites and it does also not mean these are all the
-services which will ever be available.
-
-   In fact, these names are simply strings which the NSS code uses to
-find the implicitly addressed functions.  The internal interface will be
-described later.  Visible to the user are the modules which implement an
-individual service.
-
-   Assume the service NAME shall be used for a lookup.  The code for
-this service is implemented in a module called `libnss_NAME'.  On a
-system supporting shared libraries this is in fact a shared library
-with the name (for example) `libnss_NAME.so.2'.  The number at the end
-is the currently used version of the interface which will not change
-frequently.  Normally the user should not have to be cognizant of these
-files since they should be placed in a directory where they are found
-automatically.  Only the names of all available services are important.
-
-
-File: libc.info,  Node: Actions in the NSS configuration,  Next: Notes on NSS Configuration File,  Prev: Services in the NSS configuration,  Up: NSS Configuration File
-
-28.2.2 Actions in the NSS configuration
----------------------------------------
-
-The second item in the specification gives the user much finer control
-on the lookup process.  Action items are placed between two service
-names and are written within brackets.  The general form is
-
-     `[' ( `!'? STATUS `=' ACTION )+ `]'
-
-where
-
-     STATUS => success | notfound | unavail | tryagain
-     ACTION => return | continue
-
-   The case of the keywords is insignificant.  The STATUS values are
-the results of a call to a lookup function of a specific service.  They
-mean
-
-`success'
-     No error occurred and the wanted entry is returned.  The default
-     action for this is `return'.
-
-`notfound'
-     The lookup process works ok but the needed value was not found.
-     The default action is `continue'.
-
-`unavail'
-     The service is permanently unavailable.  This can either mean the
-     needed file is not available, or, for DNS, the server is not
-     available or does not allow queries.  The default action is
-     `continue'.
-
-`tryagain'
-     The service is temporarily unavailable.  This could mean a file is
-     locked or a server currently cannot accept more connections.  The
-     default action is `continue'.
-
-If we have a line like
-
-     ethers: nisplus [NOTFOUND=return] db files
-
-this is equivalent to
-
-     ethers: nisplus [SUCCESS=return NOTFOUND=return UNAVAIL=continue
-                      TRYAGAIN=continue]
-             db      [SUCCESS=return NOTFOUND=continue UNAVAIL=continue
-                      TRYAGAIN=continue]
-             files
-
-(except that it would have to be written on one line).  The default
-value for the actions are normally what you want, and only need to be
-changed in exceptional cases.
-
-   If the optional `!' is placed before the STATUS this means the
-following action is used for all statuses but STATUS itself.  I.e., `!'
-is negation as in the C language (and others).
-
-   Before we explain the exception which makes this action item
-necessary one more remark: obviously it makes no sense to add another
-action item after the `files' service.  Since there is no other service
-following the action _always_ is `return'.
-
-   Now, why is this `[NOTFOUND=return]' action useful?  To understand
-this we should know that the `nisplus' service is often complete; i.e.,
-if an entry is not available in the NIS+ tables it is not available
-anywhere else.  This is what is expressed by this action item: it is
-useless to examine further services since they will not give us a
-result.
-
-   The situation would be different if the NIS+ service is not available
-because the machine is booting.  In this case the return value of the
-lookup function is not `notfound' but instead `unavail'.  And as you
-can see in the complete form above: in this situation the `db' and
-`files' services are used.  Neat, isn't it?  The system administrator
-need not pay special care for the time the system is not completely
-ready to work (while booting or shutdown or network problems).
-
-
-File: libc.info,  Node: Notes on NSS Configuration File,  Prev: Actions in the NSS configuration,  Up: NSS Configuration File
-
-28.2.3 Notes on the NSS Configuration File
-------------------------------------------
-
-Finally a few more hints.  The NSS implementation is not completely
-helpless if `/etc/nsswitch.conf' does not exist.  For all supported
-databases there is a default value so it should normally be possible to
-get the system running even if the file is corrupted or missing.
-
-   For the `hosts' and `networks' databases the default value is `dns
-[!UNAVAIL=return] files'.  I.e., the system is prepared for the DNS
-service not to be available but if it is available the answer it
-returns is definitive.
-
-   The `passwd', `group', and `shadow' databases are traditionally
-handled in a special way.  The appropriate files in the `/etc'
-directory are read but if an entry with a name starting with a `+'
-character is found NIS is used.  This kind of lookup remains possible
-by using the special lookup service `compat' and the default value for
-the three databases above is `compat [NOTFOUND=return] files'.
-
-   For all other databases the default value is `nis [NOTFOUND=return]
-files'.  This solution give the best chance to be correct since NIS and
-file based lookup is used.
-
-   A second point is that the user should try to optimize the lookup
-process.  The different service have different response times.  A
-simple file look up on a local file could be fast, but if the file is
-long and the needed entry is near the end of the file this may take
-quite some time.  In this case it might be better to use the `db'
-service which allows fast local access to large data sets.
-
-   Often the situation is that some global information like NIS must be
-used.  So it is unavoidable to use service entries like `nis' etc.  But
-one should avoid slow services like this if possible.
-
-
-File: libc.info,  Node: NSS Module Internals,  Next: Extending NSS,  Prev: NSS Configuration File,  Up: Name Service Switch
-
-28.3 NSS Module Internals
-=========================
-
-Now it is time to describe what the modules look like.  The functions
-contained in a module are identified by their names.  I.e., there is no
-jump table or the like.  How this is done is of no interest here; those
-interested in this topic should read about Dynamic Linking.
-
-* Menu:
-
-* NSS Module Names::            Construction of the interface function of
-                                the NSS modules.
-* NSS Modules Interface::       Programming interface in the NSS module
-                                functions.
-
-
-File: libc.info,  Node: NSS Module Names,  Next: NSS Modules Interface,  Prev: NSS Module Internals,  Up: NSS Module Internals
-
-28.3.1 The Naming Scheme of the NSS Modules
--------------------------------------------
-
-The name of each function consist of various parts:
-
-            _nss_SERVICE_FUNCTION
-
-   SERVICE of course corresponds to the name of the module this
-function is found in.(1)  The FUNCTION part is derived from the
-interface function in the C library itself.  If the user calls the
-function `gethostbyname' and the service used is `files' the function
-
-            _nss_files_gethostbyname_r
-
-in the module
-
-            libnss_files.so.2
-
-is used.  You see, what is explained above in not the whole truth.  In
-fact the NSS modules only contain reentrant versions of the lookup
-functions.  I.e., if the user would call the `gethostbyname_r' function
-this also would end in the above function.  For all user interface
-functions the C library maps this call to a call to the reentrant
-function.  For reentrant functions this is trivial since the interface
-is (nearly) the same.  For the non-reentrant version The library keeps
-internal buffers which are used to replace the user supplied buffer.
-
-   I.e., the reentrant functions _can_ have counterparts.  No service
-module is forced to have functions for all databases and all kinds to
-access them.  If a function is not available it is simply treated as if
-the function would return `unavail' (*note Actions in the NSS
-configuration::).
-
-   The file name `libnss_files.so.2' would be on a Solaris 2 system
-`nss_files.so.2'.  This is the difference mentioned above.  Sun's NSS
-modules are usable as modules which get indirectly loaded only.
-
-   The NSS modules in the GNU C Library are prepared to be used as
-normal libraries themselves.  This is _not_ true at the moment, though.
-However,  the organization of the name space in the modules does not
-make it impossible like it is for Solaris.  Now you can see why the
-modules are still libraries.(2)
-
-   ---------- Footnotes ----------
-
-   (1) Now you might ask why this information is duplicated.  The
-answer is that we want to make it possible to link directly with these
-shared objects.
-
-   (2) There is a second explanation: we were too lazy to change the
-Makefiles to allow the generation of shared objects not starting with
-`lib' but don't tell this to anybody.
-
-
-File: libc.info,  Node: NSS Modules Interface,  Prev: NSS Module Names,  Up: NSS Module Internals
-
-28.3.2 The Interface of the Function in NSS Modules
----------------------------------------------------
-
-Now we know about the functions contained in the modules.  It is now
-time to describe the types.  When we mentioned the reentrant versions of
-the functions above, this means there are some additional arguments
-(compared with the standard, non-reentrant version).  The prototypes for
-the non-reentrant and reentrant versions of our function above are:
-
-     struct hostent *gethostbyname (const char *name)
-
-     int gethostbyname_r (const char *name, struct hostent *result_buf,
-                          char *buf, size_t buflen, struct hostent **result,
-                          int *h_errnop)
-
-The actual prototype of the function in the NSS modules in this case is
-
-     enum nss_status _nss_files_gethostbyname_r (const char *name,
-                                                 struct hostent *result_buf,
-                                                 char *buf, size_t buflen,
-                                                 int *errnop, int *h_errnop)
-
-   I.e., the interface function is in fact the reentrant function with
-the change of the return value and the omission of the RESULT
-parameter.  While the user-level function returns a pointer to the
-result the reentrant function return an `enum nss_status' value:
-
-`NSS_STATUS_TRYAGAIN'
-     numeric value `-2'
-
-`NSS_STATUS_UNAVAIL'
-     numeric value `-1'
-
-`NSS_STATUS_NOTFOUND'
-     numeric value `0'
-
-`NSS_STATUS_SUCCESS'
-     numeric value `1'
-
-Now you see where the action items of the `/etc/nsswitch.conf' file are
-used.
-
-   If you study the source code you will find there is a fifth value:
-`NSS_STATUS_RETURN'.  This is an internal use only value, used by a few
-functions in places where none of the above value can be used.  If
-necessary the source code should be examined to learn about the details.
-
-   In case the interface function has to return an error it is important
-that the correct error code is stored in `*ERRNOP'.  Some return status
-value have only one associated error code, others have more.
-
-`NSS_STATUS_TRYAGAIN'   `EAGAIN'      One of the functions used ran
-                                      temporarily out of resources or a
-                                      service is currently not available.
-                       `ERANGE'       The provided buffer is not large
-                                      enough.  The function should be
-                                      called again with a larger buffer.
-`NSS_STATUS_UNAVAIL'    `ENOENT'      A necessary input file cannot be
-                                      found.
-`NSS_STATUS_NOTFOUND'   `ENOENT'      The requested entry is not
-                                      available.
-
-   These are proposed values.  There can be other error codes and the
-described error codes can have different meaning.  *With one
-exception:* when returning `NSS_STATUS_TRYAGAIN' the error code
-`ERANGE' _must_ mean that the user provided buffer is too small.
-Everything is non-critical.
-
-   The above function has something special which is missing for almost
-all the other module functions.  There is an argument H_ERRNOP.  This
-points to a variable which will be filled with the error code in case
-the execution of the function fails for some reason.  The reentrant
-function cannot use the global variable H_ERRNO; `gethostbyname' calls
-`gethostbyname_r' with the last argument set to `&h_errno'.
-
-   The `getXXXbyYYY' functions are the most important functions in the
-NSS modules.  But there are others which implement the other ways to
-access system databases (say for the password database, there are
-`setpwent', `getpwent', and `endpwent').  These will be described in
-more detail later.  Here we give a general way to determine the
-signature of the module function:
-
-   * the return value is `int';
-
-   * the name is as explained in *note NSS Module Names::;
-
-   * the first arguments are identical to the arguments of the
-     non-reentrant function;
-
-   * the next three arguments are:
-
-    `STRUCT_TYPE *result_buf'
-          pointer to buffer where the result is stored.  `STRUCT_TYPE'
-          is normally a struct which corresponds to the database.
-
-    `char *buffer'
-          pointer to a buffer where the function can store additional
-          data for the result etc.
-
-    `size_t buflen'
-          length of the buffer pointed to by BUFFER.
-
-   * possibly a last argument H_ERRNOP, for the host name and network
-     name lookup functions.
-
-This table is correct for all functions but the `set...ent' and
-`end...ent' functions.
-
-
-File: libc.info,  Node: Extending NSS,  Prev: NSS Module Internals,  Up: Name Service Switch
-
-28.4 Extending NSS
-==================
-
-One of the advantages of NSS mentioned above is that it can be extended
-quite easily.  There are two ways in which the extension can happen:
-adding another database or adding another service.  The former is
-normally done only by the C library developers.  It is here only
-important to remember that adding another database is independent from
-adding another service because a service need not support all databases
-or lookup functions.
-
-   A designer/implementor of a new service is therefore free to choose
-the databases s/he is interested in and leave the rest for later (or
-completely aside).
-
-* Menu:
-
-* Adding another Service to NSS::  What is to do to add a new service.
-* NSS Module Function Internals::  Guidelines for writing new NSS
-                                        service functions.
-
-
-File: libc.info,  Node: Adding another Service to NSS,  Next: NSS Module Function Internals,  Prev: Extending NSS,  Up: Extending NSS
-
-28.4.1 Adding another Service to NSS
-------------------------------------
-
-The sources for a new service need not (and should not) be part of the
-GNU C Library itself.  The developer retains complete control over the
-sources and its development.  The links between the C library and the
-new service module consists solely of the interface functions.
-
-   Each module is designed following a specific interface specification.
-For now the version is 2 (the interface in version 1 was not adequate)
-and this manifests in the version number of the shared library object of
-the NSS modules: they have the extension `.2'.  If the interface
-changes again in an incompatible way, this number will be increased.
-Modules using the old interface will still be usable.
-
-   Developers of a new service will have to make sure that their module
-is created using the correct interface number.  This means the file
-itself must have the correct name and on ELF systems the "soname"
-(Shared Object Name) must also have this number.  Building a module
-from a bunch of object files on an ELF system using GNU CC could be
-done like this:
-
-     gcc -shared -o libnss_NAME.so.2 -Wl,-soname,libnss_NAME.so.2 OBJECTS
-
-*note Options for Linking: (gcc)Link Options, to learn more about this
-command line.
-
-   To use the new module the library must be able to find it.  This can
-be achieved by using options for the dynamic linker so that it will
-search the directory where the binary is placed.  For an ELF system
-this could be done by adding the wanted directory to the value of
-`LD_LIBRARY_PATH'.
-
-   But this is not always possible since some programs (those which run
-under IDs which do not belong to the user) ignore this variable.
-Therefore the stable version of the module should be placed into a
-directory which is searched by the dynamic linker.  Normally this should
-be the directory `$prefix/lib', where `$prefix' corresponds to the
-value given to configure using the `--prefix' option.  But be careful:
-this should only be done if it is clear the module does not cause any
-harm.  System administrators should be careful.
-
-
-File: libc.info,  Node: NSS Module Function Internals,  Prev: Adding another Service to NSS,  Up: Extending NSS
-
-28.4.2 Internals of the NSS Module Functions
---------------------------------------------
-
-Until now we only provided the syntactic interface for the functions in
-the NSS module.  In fact there is not much more we can say since the
-implementation obviously is different for each function.  But a few
-general rules must be followed by all functions.
-
-   In fact there are four kinds of different functions which may appear
-in the interface.  All derive from the traditional ones for system
-databases.  DB in the following table is normally an abbreviation for
-the database (e.g., it is `pw' for the password database).
-
-`enum nss_status _nss_DATABASE_setDBent (void)'
-     This function prepares the service for following operations.  For a
-     simple file based lookup this means files could be opened, for
-     other services this function simply is a noop.
-
-     One special case for this function is that it takes an additional
-     argument for some DATABASEs (i.e., the interface is `int setDBent
-     (int)').  *note Host Names::, which describes the `sethostent'
-     function.
-
-     The return value should be NSS_STATUS_SUCCESS or according to the
-     table above in case of an error (*note NSS Modules Interface::).
-
-`enum nss_status _nss_DATABASE_endDBent (void)'
-     This function simply closes all files which are still open or
-     removes buffer caches.  If there are no files or buffers to remove
-     this is again a simple noop.
-
-     There normally is no return value different to NSS_STATUS_SUCCESS.
-
-`enum nss_status _nss_DATABASE_getDBent_r (STRUCTURE *result, char *buffer, size_t buflen, int *errnop)'
-     Since this function will be called several times in a row to
-     retrieve one entry after the other it must keep some kind of
-     state.  But this also means the functions are not really
-     reentrant.  They are reentrant only in that simultaneous calls to
-     this function will not try to write the retrieved data in the same
-     place (as it would be the case for the non-reentrant functions);
-     instead, it writes to the structure pointed to by the RESULT
-     parameter.  But the calls share a common state and in the case of
-     a file access this means they return neighboring entries in the
-     file.
-
-     The buffer of length BUFLEN pointed to by BUFFER can be used for
-     storing some additional data for the result.  It is _not_
-     guaranteed that the same buffer will be passed for the next call
-     of this function.  Therefore one must not misuse this buffer to
-     save some state information from one call to another.
-
-     Before the function returns the implementation should store the
-     value of the local ERRNO variable in the variable pointed to be
-     ERRNOP.  This is important to guarantee the module working in
-     statically linked programs.
-
-     As explained above this function could also have an additional last
-     argument.  This depends on the database used; it happens only for
-     `host' and `networks'.
-
-     The function shall return `NSS_STATUS_SUCCESS' as long as there are
-     more entries.  When the last entry was read it should return
-     `NSS_STATUS_NOTFOUND'.  When the buffer given as an argument is too
-     small for the data to be returned `NSS_STATUS_TRYAGAIN' should be
-     returned.  When the service was not formerly initialized by a call
-     to `_nss_DATABASE_setDBent' all return value allowed for this
-     function can also be returned here.
-
-`enum nss_status _nss_DATABASE_getDBbyXX_r (PARAMS, STRUCTURE *result, char *buffer, size_t buflen, int *errnop)'
-     This function shall return the entry from the database which is
-     addressed by the PARAMS.  The type and number of these arguments
-     vary.  It must be individually determined by looking to the
-     user-level interface functions.  All arguments given to the
-     non-reentrant version are here described by PARAMS.
-
-     The result must be stored in the structure pointed to by RESULT.
-     If there is additional data to return (say strings, where the
-     RESULT structure only contains pointers) the function must use the
-     BUFFER or length BUFLEN.  There must not be any references to
-     non-constant global data.
-
-     The implementation of this function should honor the STAYOPEN flag
-     set by the `setDBent' function whenever this makes sense.
-
-     Before the function returns the implementation should store the
-     value of the local ERRNO variable in the variable pointed to be
-     ERRNOP.  This is important to guarantee the module working in
-     statically linked programs.
-
-     Again, this function takes an additional last argument for the
-     `host' and `networks' database.
-
-     The return value should as always follow the rules given above
-     (*note NSS Modules Interface::).
-
-
-
-File: libc.info,  Node: Users and Groups,  Next: System Management,  Prev: Name Service Switch,  Up: Top
-
-29 Users and Groups
-*******************
-
-Every user who can log in on the system is identified by a unique number
-called the "user ID".  Each process has an effective user ID which says
-which user's access permissions it has.
-
-   Users are classified into "groups" for access control purposes.  Each
-process has one or more "group ID values" which say which groups the
-process can use for access to files.
-
-   The effective user and group IDs of a process collectively form its
-"persona".  This determines which files the process can access.
-Normally, a process inherits its persona from the parent process, but
-under special circumstances a process can change its persona and thus
-change its access permissions.
-
-   Each file in the system also has a user ID and a group ID.  Access
-control works by comparing the user and group IDs of the file with those
-of the running process.
-
-   The system keeps a database of all the registered users, and another
-database of all the defined groups.  There are library functions you
-can use to examine these databases.
-
-* Menu:
-
-* User and Group IDs::          Each user has a unique numeric ID;
-				 likewise for groups.
-* Process Persona::             The user IDs and group IDs of a process.
-* Why Change Persona::          Why a program might need to change
-				 its user and/or group IDs.
-* How Change Persona::          Changing the user and group IDs.
-* Reading Persona::             How to examine the user and group IDs.
-
-* Setting User ID::             Functions for setting the user ID.
-* Setting Groups::              Functions for setting the group IDs.
-
-* Enable/Disable Setuid::       Turning setuid access on and off.
-* Setuid Program Example::      The pertinent parts of one sample program.
-* Tips for Setuid::             How to avoid granting unlimited access.
-
-* Who Logged In::               Getting the name of the user who logged in,
-				 or of the real user ID of the current process.
-
-* User Accounting Database::    Keeping information about users and various
-                                 actions in databases.
-
-* User Database::               Functions and data structures for
-                        	 accessing the user database.
-* Group Database::              Functions and data structures for
-                        	 accessing the group database.
-* Database Example::            Example program showing the use of database
-				 inquiry functions.
-* Netgroup Database::           Functions for accessing the netgroup database.
-
-
-File: libc.info,  Node: User and Group IDs,  Next: Process Persona,  Up: Users and Groups
-
-29.1 User and Group IDs
-=======================
-
-Each user account on a computer system is identified by a "user name"
-(or "login name") and "user ID".  Normally, each user name has a unique
-user ID, but it is possible for several login names to have the same
-user ID.  The user names and corresponding user IDs are stored in a
-data base which you can access as described in *note User Database::.
-
-   Users are classified in "groups".  Each user name belongs to one
-"default group" and may also belong to any number of "supplementary
-groups". Users who are members of the same group can share resources
-(such as files) that are not accessible to users who are not a member
-of that group.  Each group has a "group name" and "group ID".  *Note
-Group Database::, for how to find information about a group ID or group
-name.
-
-
-File: libc.info,  Node: Process Persona,  Next: Why Change Persona,  Prev: User and Group IDs,  Up: Users and Groups
-
-29.2 The Persona of a Process
-=============================
-
-At any time, each process has an "effective user ID", a "effective
-group ID", and a set of "supplementary group IDs".  These IDs determine
-the privileges of the process.  They are collectively called the
-"persona" of the process, because they determine "who it is" for
-purposes of access control.
-
-   Your login shell starts out with a persona which consists of your
-user ID, your default group ID, and your supplementary group IDs (if
-you are in more than one group).  In normal circumstances, all your
-other processes inherit these values.
-
-   A process also has a "real user ID" which identifies the user who
-created the process, and a "real group ID" which identifies that user's
-default group.  These values do not play a role in access control, so
-we do not consider them part of the persona.  But they are also
-important.
-
-   Both the real and effective user ID can be changed during the
-lifetime of a process.  *Note Why Change Persona::.
-
-   For details on how a process's effective user ID and group IDs affect
-its permission to access files, see *note Access Permission::.
-
-   The effective user ID of a process also controls permissions for
-sending signals using the `kill' function.  *Note Signaling Another
-Process::.
-
-   Finally, there are many operations which can only be performed by a
-process whose effective user ID is zero.  A process with this user ID is
-a "privileged process".  Commonly the user name `root' is associated
-with user ID 0, but there may be other user names with this ID.
-
-
-File: libc.info,  Node: Why Change Persona,  Next: How Change Persona,  Prev: Process Persona,  Up: Users and Groups
-
-29.3 Why Change the Persona of a Process?
-=========================================
-
-The most obvious situation where it is necessary for a process to change
-its user and/or group IDs is the `login' program.  When `login' starts
-running, its user ID is `root'.  Its job is to start a shell whose user
-and group IDs are those of the user who is logging in.  (To accomplish
-this fully, `login' must set the real user and group IDs as well as its
-persona.  But this is a special case.)
-
-   The more common case of changing persona is when an ordinary user
-program needs access to a resource that wouldn't ordinarily be
-accessible to the user actually running it.
-
-   For example, you may have a file that is controlled by your program
-but that shouldn't be read or modified directly by other users, either
-because it implements some kind of locking protocol, or because you want
-to preserve the integrity or privacy of the information it contains.
-This kind of restricted access can be implemented by having the program
-change its effective user or group ID to match that of the resource.
-
-   Thus, imagine a game program that saves scores in a file.  The game
-program itself needs to be able to update this file no matter who is
-running it, but if users can write the file without going through the
-game, they can give themselves any scores they like.  Some people
-consider this undesirable, or even reprehensible.  It can be prevented
-by creating a new user ID and login name (say, `games') to own the
-scores file, and make the file writable only by this user.  Then, when
-the game program wants to update this file, it can change its effective
-user ID to be that for `games'.  In effect, the program must adopt the
-persona of `games' so it can write the scores file.
-
-
-File: libc.info,  Node: How Change Persona,  Next: Reading Persona,  Prev: Why Change Persona,  Up: Users and Groups
-
-29.4 How an Application Can Change Persona
+20.5 Errors in Floating-Point Calculations
 ==========================================
 
-The ability to change the persona of a process can be a source of
-unintentional privacy violations, or even intentional abuse.  Because of
-the potential for problems, changing persona is restricted to special
-circumstances.
-
-   You can't arbitrarily set your user ID or group ID to anything you
-want; only privileged processes can do that.  Instead, the normal way
-for a program to change its persona is that it has been set up in
-advance to change to a particular user or group.  This is the function
-of the setuid and setgid bits of a file's access mode.  *Note
-Permission Bits::.
-
-   When the setuid bit of an executable file is on, executing that file
-gives the process a third user ID: the "file user ID".  This ID is set
-to the owner ID of the file.  The system then changes the effective
-user ID to the file user ID.  The real user ID remains as it was.
-Likewise, if the setgid bit is on, the process is given a "file group
-ID" equal to the group ID of the file, and its effective group ID is
-changed to the file group ID.
-
-   If a process has a file ID (user or group), then it can at any time
-change its effective ID to its real ID and back to its file ID.
-Programs use this feature to relinquish their special privileges except
-when they actually need them.  This makes it less likely that they can
-be tricked into doing something inappropriate with their privileges.
-
-   *Portability Note:* Older systems do not have file IDs.  To
-determine if a system has this feature, you can test the compiler
-define `_POSIX_SAVED_IDS'.  (In the POSIX standard, file IDs are known
-as saved IDs.)
-
-   *Note File Attributes::, for a more general discussion of file modes
-and accessibility.
-
-
-File: libc.info,  Node: Reading Persona,  Next: Setting User ID,  Prev: How Change Persona,  Up: Users and Groups
-
-29.5 Reading the Persona of a Process
-=====================================
-
-Here are detailed descriptions of the functions for reading the user and
-group IDs of a process, both real and effective.  To use these
-facilities, you must include the header files `sys/types.h' and
-`unistd.h'.  
-
- -- Data Type: uid_t
-     This is an integer data type used to represent user IDs.  In the
-     GNU C Library, this is an alias for `unsigned int'.
-
- -- Data Type: gid_t
-     This is an integer data type used to represent group IDs.  In the
-     GNU C Library, this is an alias for `unsigned int'.
-
- -- Function: uid_t getuid (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `getuid' function returns the real user ID of the process.
-
- -- Function: gid_t getgid (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `getgid' function returns the real group ID of the process.
-
- -- Function: uid_t geteuid (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `geteuid' function returns the effective user ID of the
-     process.
-
- -- Function: gid_t getegid (void)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `getegid' function returns the effective group ID of the
-     process.
-
- -- Function: int getgroups (int COUNT, gid_t *GROUPS)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `getgroups' function is used to inquire about the supplementary
-     group IDs of the process.  Up to COUNT of these group IDs are
-     stored in the array GROUPS; the return value from the function is
-     the number of group IDs actually stored.  If COUNT is smaller than
-     the total number of supplementary group IDs, then `getgroups'
-     returns a value of `-1' and `errno' is set to `EINVAL'.
-
-     If COUNT is zero, then `getgroups' just returns the total number
-     of supplementary group IDs.  On systems that do not support
-     supplementary groups, this will always be zero.
-
-     Here's how to use `getgroups' to read all the supplementary group
-     IDs:
-
-          gid_t *
-          read_all_groups (void)
-          {
-            int ngroups = getgroups (0, NULL);
-            gid_t *groups
-              = (gid_t *) xmalloc (ngroups * sizeof (gid_t));
-            int val = getgroups (ngroups, groups);
-            if (val < 0)
-              {
-                free (groups);
-                return NULL;
-              }
-            return groups;
-          }
-
-
-File: libc.info,  Node: Setting User ID,  Next: Setting Groups,  Prev: Reading Persona,  Up: Users and Groups
-
-29.6 Setting the User ID
-========================
-
-This section describes the functions for altering the user ID (real
-and/or effective) of a process.  To use these facilities, you must
-include the header files `sys/types.h' and `unistd.h'.  
-
- -- Function: int seteuid (uid_t NEWEUID)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     This function sets the effective user ID of a process to NEWEUID,
-     provided that the process is allowed to change its effective user
-     ID.  A privileged process (effective user ID zero) can change its
-     effective user ID to any legal value.  An unprivileged process
-     with a file user ID can change its effective user ID to its real
-     user ID or to its file user ID.  Otherwise, a process may not
-     change its effective user ID at all.
-
-     The `seteuid' function returns a value of `0' to indicate
-     successful completion, and a value of `-1' to indicate an error.
-     The following `errno' error conditions are defined for this
-     function:
-
-    `EINVAL'
-          The value of the NEWEUID argument is invalid.
-
-    `EPERM'
-          The process may not change to the specified ID.
-
-     Older systems (those without the `_POSIX_SAVED_IDS' feature) do not
-     have this function.
-
- -- Function: int setuid (uid_t NEWUID)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     If the calling process is privileged, this function sets both the
-     real and effective user ID of the process to NEWUID.  It also
-     deletes the file user ID of the process, if any.  NEWUID may be any
-     legal value.  (Once this has been done, there is no way to recover
-     the old effective user ID.)
-
-     If the process is not privileged, and the system supports the
-     `_POSIX_SAVED_IDS' feature, then this function behaves like
-     `seteuid'.
-
-     The return values and error conditions are the same as for
-     `seteuid'.
-
- -- Function: int setreuid (uid_t RUID, uid_t EUID)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     This function sets the real user ID of the process to RUID and the
-     effective user ID to EUID.  If RUID is `-1', it means not to
-     change the real user ID; likewise if EUID is `-1', it means not to
-     change the effective user ID.
-
-     The `setreuid' function exists for compatibility with 4.3 BSD Unix,
-     which does not support file IDs.  You can use this function to
-     swap the effective and real user IDs of the process.  (Privileged
-     processes are not limited to this particular usage.)  If file IDs
-     are supported, you should use that feature instead of this
-     function.  *Note Enable/Disable Setuid::.
-
-     The return value is `0' on success and `-1' on failure.  The
-     following `errno' error conditions are defined for this function:
-
-    `EPERM'
-          The process does not have the appropriate privileges; you do
-          not have permission to change to the specified ID.
-
-
-File: libc.info,  Node: Setting Groups,  Next: Enable/Disable Setuid,  Prev: Setting User ID,  Up: Users and Groups
-
-29.7 Setting the Group IDs
-==========================
-
-This section describes the functions for altering the group IDs (real
-and effective) of a process.  To use these facilities, you must include
-the header files `sys/types.h' and `unistd.h'.  
-
- -- Function: int setegid (gid_t NEWGID)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     This function sets the effective group ID of the process to
-     NEWGID, provided that the process is allowed to change its group
-     ID.  Just as with `seteuid', if the process is privileged it may
-     change its effective group ID to any value; if it isn't, but it
-     has a file group ID, then it may change to its real group ID or
-     file group ID; otherwise it may not change its effective group ID.
-
-     Note that a process is only privileged if its effective _user_ ID
-     is zero.  The effective group ID only affects access permissions.
-
-     The return values and error conditions for `setegid' are the same
-     as those for `seteuid'.
-
-     This function is only present if `_POSIX_SAVED_IDS' is defined.
-
- -- Function: int setgid (gid_t NEWGID)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     This function sets both the real and effective group ID of the
-     process to NEWGID, provided that the process is privileged.  It
-     also deletes the file group ID, if any.
-
-     If the process is not privileged, then `setgid' behaves like
-     `setegid'.
-
-     The return values and error conditions for `setgid' are the same
-     as those for `seteuid'.
-
- -- Function: int setregid (gid_t RGID, gid_t EGID)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     This function sets the real group ID of the process to RGID and
-     the effective group ID to EGID.  If RGID is `-1', it means not to
-     change the real group ID; likewise if EGID is `-1', it means not
-     to change the effective group ID.
-
-     The `setregid' function is provided for compatibility with 4.3 BSD
-     Unix, which does not support file IDs.  You can use this function
-     to swap the effective and real group IDs of the process.
-     (Privileged processes are not limited to this usage.)  If file IDs
-     are supported, you should use that feature instead of using this
-     function.  *Note Enable/Disable Setuid::.
-
-     The return values and error conditions for `setregid' are the same
-     as those for `setreuid'.
-
-   `setuid' and `setgid' behave differently depending on whether the
-effective user ID at the time is zero.  If it is not zero, they behave
-like `seteuid' and `setegid'.  If it is, they change both effective and
-real IDs and delete the file ID.  To avoid confusion, we recommend you
-always use `seteuid' and `setegid' except when you know the effective
-user ID is zero and your intent is to change the persona permanently.
-This case is rare--most of the programs that need it, such as `login'
-and `su', have already been written.
-
-   Note that if your program is setuid to some user other than `root',
-there is no way to drop privileges permanently.
-
-   The system also lets privileged processes change their supplementary
-group IDs.  To use `setgroups' or `initgroups', your programs should
-include the header file `grp.h'.  
-
- -- Function: int setgroups (size_t COUNT, const gid_t *GROUPS)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     This function sets the process's supplementary group IDs.  It can
-     only be called from privileged processes.  The COUNT argument
-     specifies the number of group IDs in the array GROUPS.
-
-     This function returns `0' if successful and `-1' on error.  The
-     following `errno' error conditions are defined for this function:
-
-    `EPERM'
-          The calling process is not privileged.
-
- -- Function: int initgroups (const char *USER, gid_t GROUP)
-     Preliminary: | MT-Safe locale | AS-Unsafe dlopen plugin heap lock
-     | AC-Unsafe corrupt mem fd lock | *Note POSIX Safety Concepts::.
-
-     The `initgroups' function sets the process's supplementary group
-     IDs to be the normal default for the user name USER.  The group
-     GROUP is automatically included.
-
-     This function works by scanning the group database for all the
-     groups USER belongs to.  It then calls `setgroups' with the list it
-     has constructed.
-
-     The return values and error conditions are the same as for
-     `setgroups'.
-
-   If you are interested in the groups a particular user belongs to,
-but do not want to change the process's supplementary group IDs, you
-can use `getgrouplist'.  To use `getgrouplist', your programs should
-include the header file `grp.h'.  
-
- -- Function: int getgrouplist (const char *USER, gid_t GROUP, gid_t
-          *GROUPS, int *NGROUPS)
-     Preliminary: | MT-Safe locale | AS-Unsafe dlopen plugin heap lock
-     | AC-Unsafe corrupt mem fd lock | *Note POSIX Safety Concepts::.
-
-     The `getgrouplist' function scans the group database for all the
-     groups USER belongs to.  Up to *NGROUPS group IDs corresponding to
-     these groups are stored in the array GROUPS; the return value from
-     the function is the number of group IDs actually stored.  If
-     *NGROUPS is smaller than the total number of groups found, then
-     `getgrouplist' returns a value of `-1' and stores the actual
-     number of groups in *NGROUPS.  The group GROUP is automatically
-     included in the list of groups returned by `getgrouplist'.
-
-     Here's how to use `getgrouplist' to read all supplementary groups
-     for USER:
-
-          gid_t *
-          supplementary_groups (char *user)
-          {
-            int ngroups = 16;
-            gid_t *groups
-              = (gid_t *) xmalloc (ngroups * sizeof (gid_t));
-            struct passwd *pw = getpwnam (user);
-
-            if (pw == NULL)
-              return NULL;
-
-            if (getgrouplist (pw->pw_name, pw->pw_gid, groups, &ngroups) < 0)
-              {
-                groups = xrealloc (ngroups * sizeof (gid_t));
-                getgrouplist (pw->pw_name, pw->pw_gid, groups, &ngroups);
-              }
-            return groups;
-          }
-
-
-File: libc.info,  Node: Enable/Disable Setuid,  Next: Setuid Program Example,  Prev: Setting Groups,  Up: Users and Groups
-
-29.8 Enabling and Disabling Setuid Access
-=========================================
-
-A typical setuid program does not need its special access all of the
-time.  It's a good idea to turn off this access when it isn't needed,
-so it can't possibly give unintended access.
-
-   If the system supports the `_POSIX_SAVED_IDS' feature, you can
-accomplish this with `seteuid'.  When the game program starts, its real
-user ID is `jdoe', its effective user ID is `games', and its saved user
-ID is also `games'.  The program should record both user ID values once
-at the beginning, like this:
-
-     user_user_id = getuid ();
-     game_user_id = geteuid ();
-
-   Then it can turn off game file access with
-
-     seteuid (user_user_id);
-
-and turn it on with
-
-     seteuid (game_user_id);
-
-Throughout this process, the real user ID remains `jdoe' and the file
-user ID remains `games', so the program can always set its effective
-user ID to either one.
-
-   On other systems that don't support file user IDs, you can turn
-setuid access on and off by using `setreuid' to swap the real and
-effective user IDs of the process, as follows:
-
-     setreuid (geteuid (), getuid ());
-
-This special case is always allowed--it cannot fail.
-
-   Why does this have the effect of toggling the setuid access?
-Suppose a game program has just started, and its real user ID is `jdoe'
-while its effective user ID is `games'.  In this state, the game can
-write the scores file.  If it swaps the two uids, the real becomes
-`games' and the effective becomes `jdoe'; now the program has only
-`jdoe' access.  Another swap brings `games' back to the effective user
-ID and restores access to the scores file.
-
-   In order to handle both kinds of systems, test for the saved user ID
-feature with a preprocessor conditional, like this:
-
-     #ifdef _POSIX_SAVED_IDS
-       seteuid (user_user_id);
-     #else
-       setreuid (geteuid (), getuid ());
-     #endif
-
-
-File: libc.info,  Node: Setuid Program Example,  Next: Tips for Setuid,  Prev: Enable/Disable Setuid,  Up: Users and Groups
-
-29.9 Setuid Program Example
-===========================
-
-Here's an example showing how to set up a program that changes its
-effective user ID.
-
-   This is part of a game program called `caber-toss' that manipulates
-a file `scores' that should be writable only by the game program
-itself.  The program assumes that its executable file will be installed
-with the setuid bit set and owned by the same user as the `scores'
-file.  Typically, a system administrator will set up an account like
-`games' for this purpose.
-
-   The executable file is given mode `4755', so that doing an `ls -l'
-on it produces output like:
-
-     -rwsr-xr-x   1 games    184422 Jul 30 15:17 caber-toss
-
-The setuid bit shows up in the file modes as the `s'.
-
-   The scores file is given mode `644', and doing an `ls -l' on it
-shows:
-
-     -rw-r--r--  1 games           0 Jul 31 15:33 scores
-
-   Here are the parts of the program that show how to set up the changed
-user ID.  This program is conditionalized so that it makes use of the
-file IDs feature if it is supported, and otherwise uses `setreuid' to
-swap the effective and real user IDs.
-
-     #include <stdio.h>
-     #include <sys/types.h>
-     #include <unistd.h>
-     #include <stdlib.h>
-
-
-     /* Remember the effective and real UIDs. */
-
-     static uid_t euid, ruid;
-
-
-     /* Restore the effective UID to its original value. */
-
-     void
-     do_setuid (void)
-     {
-       int status;
-
-     #ifdef _POSIX_SAVED_IDS
-       status = seteuid (euid);
-     #else
-       status = setreuid (ruid, euid);
-     #endif
-       if (status < 0) {
-         fprintf (stderr, "Couldn't set uid.\n");
-         exit (status);
-         }
-     }
-
-
-     /* Set the effective UID to the real UID. */
-
-     void
-     undo_setuid (void)
-     {
-       int status;
-
-     #ifdef _POSIX_SAVED_IDS
-       status = seteuid (ruid);
-     #else
-       status = setreuid (euid, ruid);
-     #endif
-       if (status < 0) {
-         fprintf (stderr, "Couldn't set uid.\n");
-         exit (status);
-         }
-     }
-
-     /* Main program. */
-
-     int
-     main (void)
-     {
-       /* Remember the real and effective user IDs.  */
-       ruid = getuid ();
-       euid = geteuid ();
-       undo_setuid ();
-
-       /* Do the game and record the score.  */
-       ...
-     }
-
-   Notice how the first thing the `main' function does is to set the
-effective user ID back to the real user ID.  This is so that any other
-file accesses that are performed while the user is playing the game use
-the real user ID for determining permissions.  Only when the program
-needs to open the scores file does it switch back to the file user ID,
-like this:
-
-     /* Record the score. */
-
-     int
-     record_score (int score)
-     {
-       FILE *stream;
-       char *myname;
-
-       /* Open the scores file. */
-       do_setuid ();
-       stream = fopen (SCORES_FILE, "a");
-       undo_setuid ();
-
-       /* Write the score to the file. */
-       if (stream)
-         {
-           myname = cuserid (NULL);
-           if (score < 0)
-             fprintf (stream, "%10s: Couldn't lift the caber.\n", myname);
-           else
-             fprintf (stream, "%10s: %d feet.\n", myname, score);
-           fclose (stream);
-           return 0;
-         }
-       else
-         return -1;
-     }
-
-
-File: libc.info,  Node: Tips for Setuid,  Next: Who Logged In,  Prev: Setuid Program Example,  Up: Users and Groups
-
-29.10 Tips for Writing Setuid Programs
-======================================
-
-It is easy for setuid programs to give the user access that isn't
-intended--in fact, if you want to avoid this, you need to be careful.
-Here are some guidelines for preventing unintended access and
-minimizing its consequences when it does occur:
-
-   * Don't have `setuid' programs with privileged user IDs such as
-     `root' unless it is absolutely necessary.  If the resource is
-     specific to your particular program, it's better to define a new,
-     nonprivileged user ID or group ID just to manage that resource.
-     It's better if you can write your program to use a special group
-     than a special user.
-
-   * Be cautious about using the `exec' functions in combination with
-     changing the effective user ID.  Don't let users of your program
-     execute arbitrary programs under a changed user ID.  Executing a
-     shell is especially bad news. Less obviously, the `execlp' and
-     `execvp' functions are a potential risk (since the program they
-     execute depends on the user's `PATH' environment variable).
-
-     If you must `exec' another program under a changed ID, specify an
-     absolute file name (*note File Name Resolution::) for the
-     executable, and make sure that the protections on that executable
-     and _all_ containing directories are such that ordinary users
-     cannot replace it with some other program.
-
-     You should also check the arguments passed to the program to make
-     sure they do not have unexpected effects.  Likewise, you should
-     examine the environment variables.  Decide which arguments and
-     variables are safe, and reject all others.
-
-     You should never use `system' in a privileged program, because it
-     invokes a shell.
-
-   * Only use the user ID controlling the resource in the part of the
-     program that actually uses that resource.  When you're finished
-     with it, restore the effective user ID back to the actual user's
-     user ID.  *Note Enable/Disable Setuid::.
-
-   * If the `setuid' part of your program needs to access other files
-     besides the controlled resource, it should verify that the real
-     user would ordinarily have permission to access those files.  You
-     can use the `access' function (*note Access Permission::) to check
-     this; it uses the real user and group IDs, rather than the
-     effective IDs.
-
-
-File: libc.info,  Node: Who Logged In,  Next: User Accounting Database,  Prev: Tips for Setuid,  Up: Users and Groups
-
-29.11 Identifying Who Logged In
-===============================
-
-You can use the functions listed in this section to determine the login
-name of the user who is running a process, and the name of the user who
-logged in the current session.  See also the function `getuid' and
-friends (*note Reading Persona::).  How this information is collected by
-the system and how to control/add/remove information from the background
-storage is described in *note User Accounting Database::.
-
-   The `getlogin' function is declared in `unistd.h', while `cuserid'
-and `L_cuserid' are declared in `stdio.h'.  
-
- -- Function: char * getlogin (void)
-     Preliminary: | MT-Unsafe race:getlogin race:utent sig:ALRM timer
-     locale | AS-Unsafe dlopen plugin heap lock | AC-Unsafe corrupt
-     lock fd mem | *Note POSIX Safety Concepts::.
-
-     The `getlogin' function returns a pointer to a string containing
-     the name of the user logged in on the controlling terminal of the
-     process, or a null pointer if this information cannot be
-     determined.  The string is statically allocated and might be
-     overwritten on subsequent calls to this function or to `cuserid'.
-
- -- Function: char * cuserid (char *STRING)
-     Preliminary: | MT-Safe locale | AS-Unsafe dlopen plugin heap lock
-     | AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
-
-     The `cuserid' function returns a pointer to a string containing a
-     user name associated with the effective ID of the process.  If
-     STRING is not a null pointer, it should be an array that can hold
-     at least `L_cuserid' characters; the string is returned in this
-     array.  Otherwise, a pointer to a string in a static area is
-     returned.  This string is statically allocated and might be
-     overwritten on subsequent calls to this function or to `getlogin'.
-
-     The use of this function is deprecated since it is marked to be
-     withdrawn in XPG4.2 and has already been removed from newer
-     revisions of POSIX.1.
-
- -- Macro: int L_cuserid
-     An integer constant that indicates how long an array you might
-     need to store a user name.
-
-   These functions let your program identify positively the user who is
-running or the user who logged in this session.  (These can differ when
-setuid programs are involved; see *note Process Persona::.)  The user
-cannot do anything to fool these functions.
-
-   For most purposes, it is more useful to use the environment variable
-`LOGNAME' to find out who the user is.  This is more flexible precisely
-because the user can set `LOGNAME' arbitrarily.  *Note Standard
-Environment::.
-
-
-File: libc.info,  Node: User Accounting Database,  Next: User Database,  Prev: Who Logged In,  Up: Users and Groups
-
-29.12 The User Accounting Database
-==================================
-
-Most Unix-like operating systems keep track of logged in users by
-maintaining a user accounting database.  This user accounting database
-stores for each terminal, who has logged on, at what time, the process
-ID of the user's login shell, etc., etc., but also stores information
-about the run level of the system, the time of the last system reboot,
-and possibly more.
-
-   The user accounting database typically lives in `/etc/utmp',
-`/var/adm/utmp' or `/var/run/utmp'.  However, these files should
-*never* be accessed directly.  For reading information from and writing
-information to the user accounting database, the functions described in
-this section should be used.
-
 * Menu:
 
-* Manipulating the Database::   Scanning and modifying the user
-                                 accounting database.
-* XPG Functions::               A standardized way for doing the same thing.
-* Logging In and Out::          Functions from BSD that modify the user
-                                 accounting database.
+* FP Exceptions::               IEEE 754 math exceptions and how to detect them.
+* Infinity and NaN::            Special values returned by calculations.
+* Status bit operations::       Checking for exceptions after the fact.
+* Math Error Reporting::        How the math functions report errors.
 
 
-File: libc.info,  Node: Manipulating the Database,  Next: XPG Functions,  Up: User Accounting Database
+File: libc.info,  Node: FP Exceptions,  Next: Infinity and NaN,  Up: Floating Point Errors
 
-29.12.1 Manipulating the User Accounting Database
--------------------------------------------------
+20.5.1 FP Exceptions
+--------------------
 
-These functions and the corresponding data structures are declared in
-the header file `utmp.h'.  
+The IEEE 754 standard defines five "exceptions" that can occur during a
+calculation.  Each corresponds to a particular sort of error, such as
+overflow.
 
- -- Data Type: struct exit_status
-     The `exit_status' data structure is used to hold information about
-     the exit status of processes marked as `DEAD_PROCESS' in the user
-     accounting database.
+   When exceptions occur (when exceptions are "raised", in the language
+of the standard), one of two things can happen.  By default the
+exception is simply noted in the floating-point "status word", and the
+program continues as if nothing had happened.  The operation produces a
+default value, which depends on the exception (see the table below).
+Your program can check the status word to find out which exceptions
+happened.
 
-    `short int e_termination'
-          The exit status of the process.
+   Alternatively, you can enable "traps" for exceptions.  In that case,
+when an exception is raised, your program will receive the 'SIGFPE'
+signal.  The default action for this signal is to terminate the program.
+*Note Signal Handling::, for how you can change the effect of the
+signal.
 
-    `short int e_exit'
-          The exit status of the process.
+   In the System V math library, the user-defined function 'matherr' is
+called when certain exceptions occur inside math library functions.
+However, the Unix98 standard deprecates this interface.  We support it
+for historical compatibility, but recommend that you do not use it in
+new programs.  When this interface is used, exceptions may not be
+raised.
 
- -- Data Type: struct utmp
-     The `utmp' data structure is used to hold information about entries
-     in the user accounting database.  On GNU systems it has the
-     following members:
+The exceptions defined in IEEE 754 are:
 
-    `short int ut_type'
-          Specifies the type of login; one of `EMPTY', `RUN_LVL',
-          `BOOT_TIME', `OLD_TIME', `NEW_TIME', `INIT_PROCESS',
-          `LOGIN_PROCESS', `USER_PROCESS', `DEAD_PROCESS' or
-          `ACCOUNTING'.
+'Invalid Operation'
+     This exception is raised if the given operands are invalid for the
+     operation to be performed.  Examples are (see IEEE 754, section 7):
+       1. Addition or subtraction: oo - oo.  (But oo + oo = oo).
+       2. Multiplication: 0 * oo.
+       3. Division: 0/0 or oo/oo.
+       4. Remainder: x REM y, where y is zero or x is infinite.
+       5. Square root if the operand is less then zero.  More generally,
+          any mathematical function evaluated outside its domain
+          produces this exception.
+       6. Conversion of a floating-point number to an integer or decimal
+          string, when the number cannot be represented in the target
+          format (due to overflow, infinity, or NaN).
+       7. Conversion of an unrecognizable input string.
+       8. Comparison via predicates involving < or >, when one or other
+          of the operands is NaN. You can prevent this exception by
+          using the unordered comparison functions instead; see *note FP
+          Comparison Functions::.
 
-    `pid_t ut_pid'
-          The process ID number of the login process.
+     If the exception does not trap, the result of the operation is NaN.
 
-    `char ut_line[]'
-          The device name of the tty (without `/dev/').
+'Division by Zero'
+     This exception is raised when a finite nonzero number is divided by
+     zero.  If no trap occurs the result is either +oo or -oo, depending
+     on the signs of the operands.
 
-    `char ut_id[]'
-          The inittab ID of the process.
+'Overflow'
+     This exception is raised whenever the result cannot be represented
+     as a finite value in the precision format of the destination.  If
+     no trap occurs the result depends on the sign of the intermediate
+     result and the current rounding mode (IEEE 754, section 7.3):
+       1. Round to nearest carries all overflows to oo with the sign of
+          the intermediate result.
+       2. Round toward 0 carries all overflows to the largest
+          representable finite number with the sign of the intermediate
+          result.
+       3. Round toward -oo carries positive overflows to the largest
+          representable finite number and negative overflows to -oo.
 
-    `char ut_user[]'
-          The user's login name.
+       4. Round toward oo carries negative overflows to the most
+          negative representable finite number and positive overflows to
+          oo.
 
-    `char ut_host[]'
-          The name of the host from which the user logged in.
+     Whenever the overflow exception is raised, the inexact exception is
+     also raised.
 
-    `struct exit_status ut_exit'
-          The exit status of a process marked as `DEAD_PROCESS'.
+'Underflow'
+     The underflow exception is raised when an intermediate result is
+     too small to be calculated accurately, or if the operation's result
+     rounded to the destination precision is too small to be normalized.
 
-    `long ut_session'
-          The Session ID, used for windowing.
+     When no trap is installed for the underflow exception, underflow is
+     signaled (via the underflow flag) only when both tininess and loss
+     of accuracy have been detected.  If no trap handler is installed
+     the operation continues with an imprecise small value, or zero if
+     the destination precision cannot hold the small exact result.
 
-    `struct timeval ut_tv'
-          Time the entry was made.  For entries of type `OLD_TIME' this
-          is the time when the system clock changed, and for entries of
-          type `NEW_TIME' this is the time the system clock was set to.
-
-    `int32_t ut_addr_v6[4]'
-          The Internet address of a remote host.
-
-   The `ut_type', `ut_pid', `ut_id', `ut_tv', and `ut_host' fields are
-not available on all systems.  Portable applications therefore should
-be prepared for these situations.  To help doing this the `utmp.h'
-header provides macros `_HAVE_UT_TYPE', `_HAVE_UT_PID', `_HAVE_UT_ID',
-`_HAVE_UT_TV', and `_HAVE_UT_HOST' if the respective field is
-available.  The programmer can handle the situations by using `#ifdef'
-in the program code.
-
-   The following macros are defined for use as values for the `ut_type'
-member of the `utmp' structure.  The values are integer constants.
-
-`EMPTY'
-     This macro is used to indicate that the entry contains no valid
-     user accounting information.
-
-`RUN_LVL'
-     This macro is used to identify the systems runlevel.
-
-`BOOT_TIME'
-     This macro is used to identify the time of system boot.
-
-`OLD_TIME'
-     This macro is used to identify the time when the system clock
-     changed.
-
-`NEW_TIME'
-     This macro is used to identify the time after the system changed.
-
-`INIT_PROCESS'
-     This macro is used to identify a process spawned by the init
-     process.
-
-`LOGIN_PROCESS'
-     This macro is used to identify the session leader of a logged in
-     user.
-
-`USER_PROCESS'
-     This macro is used to identify a user process.
-
-`DEAD_PROCESS'
-     This macro is used to identify a terminated process.
-
-`ACCOUNTING'
-     ???
-
-   The size of the `ut_line', `ut_id', `ut_user' and `ut_host' arrays
-can be found using the `sizeof' operator.
-
-   Many older systems have, instead of an `ut_tv' member, an `ut_time'
-member, usually of type `time_t', for representing the time associated
-with the entry.  Therefore, for backwards compatibility only, `utmp.h'
-defines `ut_time' as an alias for `ut_tv.tv_sec'.
-
- -- Function: void setutent (void)
-     Preliminary: | MT-Unsafe race:utent | AS-Unsafe lock | AC-Unsafe
-     lock fd | *Note POSIX Safety Concepts::.
-
-     This function opens the user accounting database to begin scanning
-     it.  You can then call `getutent', `getutid' or `getutline' to
-     read entries and `pututline' to write entries.
-
-     If the database is already open, it resets the input to the
-     beginning of the database.
-
- -- Function: struct utmp * getutent (void)
-     Preliminary: | MT-Unsafe init race:utent race:utentbuf sig:ALRM
-     timer | AS-Unsafe heap lock | AC-Unsafe lock fd mem | *Note POSIX
-     Safety Concepts::.
-
-     The `getutent' function reads the next entry from the user
-     accounting database.  It returns a pointer to the entry, which is
-     statically allocated and may be overwritten by subsequent calls to
-     `getutent'.  You must copy the contents of the structure if you
-     wish to save the information or you can use the `getutent_r'
-     function which stores the data in a user-provided buffer.
-
-     A null pointer is returned in case no further entry is available.
-
- -- Function: void endutent (void)
-     Preliminary: | MT-Unsafe race:utent | AS-Unsafe lock | AC-Unsafe
-     lock fd | *Note POSIX Safety Concepts::.
-
-     This function closes the user accounting database.
-
- -- Function: struct utmp * getutid (const struct utmp *ID)
-     Preliminary: | MT-Unsafe init race:utent sig:ALRM timer |
-     AS-Unsafe lock heap | AC-Unsafe lock mem fd | *Note POSIX Safety
-     Concepts::.
-
-     This function searches forward from the current point in the
-     database for an entry that matches ID.  If the `ut_type' member of
-     the ID structure is one of `RUN_LVL', `BOOT_TIME', `OLD_TIME' or
-     `NEW_TIME' the entries match if the `ut_type' members are
-     identical.  If the `ut_type' member of the ID structure is
-     `INIT_PROCESS', `LOGIN_PROCESS', `USER_PROCESS' or `DEAD_PROCESS',
-     the entries match if the `ut_type' member of the entry read from
-     the database is one of these four, and the `ut_id' members match.
-     However if the `ut_id' member of either the ID structure or the
-     entry read from the database is empty it checks if the `ut_line'
-     members match instead.  If a matching entry is found, `getutid'
-     returns a pointer to the entry, which is statically allocated, and
-     may be overwritten by a subsequent call to `getutent', `getutid'
-     or `getutline'.  You must copy the contents of the structure if
-     you wish to save the information.
-
-     A null pointer is returned in case the end of the database is
-     reached without a match.
-
-     The `getutid' function may cache the last read entry.  Therefore,
-     if you are using `getutid' to search for multiple occurrences, it
-     is necessary to zero out the static data after each call.
-     Otherwise `getutid' could just return a pointer to the same entry
-     over and over again.
-
- -- Function: struct utmp * getutline (const struct utmp *LINE)
-     Preliminary: | MT-Unsafe init race:utent sig:ALRM timer |
-     AS-Unsafe heap lock | AC-Unsafe lock fd mem | *Note POSIX Safety
-     Concepts::.
-
-     This function searches forward from the current point in the
-     database until it finds an entry whose `ut_type' value is
-     `LOGIN_PROCESS' or `USER_PROCESS', and whose `ut_line' member
-     matches the `ut_line' member of the LINE structure.  If it finds
-     such an entry, it returns a pointer to the entry which is
-     statically allocated, and may be overwritten by a subsequent call
-     to `getutent', `getutid' or `getutline'.  You must copy the
-     contents of the structure if you wish to save the information.
-
-     A null pointer is returned in case the end of the database is
-     reached without a match.
-
-     The `getutline' function may cache the last read entry.  Therefore
-     if you are using `getutline' to search for multiple occurrences, it
-     is necessary to zero out the static data after each call.
-     Otherwise `getutline' could just return a pointer to the same
-     entry over and over again.
-
- -- Function: struct utmp * pututline (const struct utmp *UTMP)
-     Preliminary: | MT-Unsafe race:utent sig:ALRM timer | AS-Unsafe lock
-     | AC-Unsafe lock fd | *Note POSIX Safety Concepts::.
-
-     The `pututline' function inserts the entry `*UTMP' at the
-     appropriate place in the user accounting database.  If it finds
-     that it is not already at the correct place in the database, it
-     uses `getutid' to search for the position to insert the entry,
-     however this will not modify the static structure returned by
-     `getutent', `getutid' and `getutline'.  If this search fails, the
-     entry is appended to the database.
-
-     The `pututline' function returns a pointer to a copy of the entry
-     inserted in the user accounting database, or a null pointer if the
-     entry could not be added.  The following `errno' error conditions
-     are defined for this function:
-
-    `EPERM'
-          The process does not have the appropriate privileges; you
-          cannot modify the user accounting database.
-
-   All the `get*' functions mentioned before store the information they
-return in a static buffer.  This can be a problem in multi-threaded
-programs since the data returned for the request is overwritten by the
-return value data in another thread.  Therefore the GNU C Library
-provides as extensions three more functions which return the data in a
-user-provided buffer.
-
- -- Function: int getutent_r (struct utmp *BUFFER, struct utmp **RESULT)
-     Preliminary: | MT-Unsafe race:utent sig:ALRM timer | AS-Unsafe lock
-     | AC-Unsafe lock fd | *Note POSIX Safety Concepts::.
-
-     The `getutent_r' is equivalent to the `getutent' function.  It
-     returns the next entry from the database.  But instead of storing
-     the information in a static buffer it stores it in the buffer
-     pointed to by the parameter BUFFER.
-
-     If the call was successful, the function returns `0' and the
-     pointer variable pointed to by the parameter RESULT contains a
-     pointer to the buffer which contains the result (this is most
-     probably the same value as BUFFER).  If something went wrong
-     during the execution of `getutent_r' the function returns `-1'.
-
-     This function is a GNU extension.
-
- -- Function: int getutid_r (const struct utmp *ID, struct utmp
-          *BUFFER, struct utmp **RESULT)
-     Preliminary: | MT-Unsafe race:utent sig:ALRM timer | AS-Unsafe lock
-     | AC-Unsafe lock fd | *Note POSIX Safety Concepts::.
-
-     This function retrieves just like `getutid' the next entry matching
-     the information stored in ID.  But the result is stored in the
-     buffer pointed to by the parameter BUFFER.
-
-     If successful the function returns `0' and the pointer variable
-     pointed to by the parameter RESULT contains a pointer to the
-     buffer with the result (probably the same as RESULT.  If not
-     successful the function return `-1'.
-
-     This function is a GNU extension.
-
- -- Function: int getutline_r (const struct utmp *LINE, struct utmp
-          *BUFFER, struct utmp **RESULT)
-     Preliminary: | MT-Unsafe race:utent sig:ALRM timer | AS-Unsafe lock
-     | AC-Unsafe lock fd | *Note POSIX Safety Concepts::.
-
-     This function retrieves just like `getutline' the next entry
-     matching the information stored in LINE.  But the result is stored
-     in the buffer pointed to by the parameter BUFFER.
-
-     If successful the function returns `0' and the pointer variable
-     pointed to by the parameter RESULT contains a pointer to the
-     buffer with the result (probably the same as RESULT.  If not
-     successful the function return `-1'.
-
-     This function is a GNU extension.
-
-   In addition to the user accounting database, most systems keep a
-number of similar databases.  For example most systems keep a log file
-with all previous logins (usually in `/etc/wtmp' or `/var/log/wtmp').
-
-   For specifying which database to examine, the following function
-should be used.
-
- -- Function: int utmpname (const char *FILE)
-     Preliminary: | MT-Unsafe race:utent | AS-Unsafe lock heap |
-     AC-Unsafe lock mem | *Note POSIX Safety Concepts::.
-
-     The `utmpname' function changes the name of the database to be
-     examined to FILE, and closes any previously opened database.  By
-     default `getutent', `getutid', `getutline' and `pututline' read
-     from and write to the user accounting database.
-
-     The following macros are defined for use as the FILE argument:
-
-      -- Macro: char * _PATH_UTMP
-          This macro is used to specify the user accounting database.
-
-      -- Macro: char * _PATH_WTMP
-          This macro is used to specify the user accounting log file.
-
-     The `utmpname' function returns a value of `0' if the new name was
-     successfully stored, and a value of `-1' to indicate an error.
-     Note that `utmpname' does not try to open the database, and that
-     therefore the return value does not say anything about whether the
-     database can be successfully opened.
-
-   Specially for maintaining log-like databases the GNU C Library
-provides the following function:
-
- -- Function: void updwtmp (const char *WTMP_FILE, const struct utmp
-          *UTMP)
-     Preliminary: | MT-Unsafe sig:ALRM timer | AS-Unsafe | AC-Unsafe fd
-     | *Note POSIX Safety Concepts::.
-
-     The `updwtmp' function appends the entry *UTMP to the database
-     specified by WTMP_FILE.  For possible values for the WTMP_FILE
-     argument see the `utmpname' function.
-
-   *Portability Note:* Although many operating systems provide a subset
-of these functions, they are not standardized.  There are often subtle
-differences in the return types, and there are considerable differences
-between the various definitions of `struct utmp'.  When programming for
-the GNU C Library, it is probably best to stick with the functions
-described in this section.  If however, you want your program to be
-portable, consider using the XPG functions described in *note XPG
-Functions::, or take a look at the BSD compatible functions in *note
-Logging In and Out::.
+'Inexact'
+     This exception is signalled if a rounded result is not exact (such
+     as when calculating the square root of two) or a result overflows
+     without an overflow trap.
 
 
-File: libc.info,  Node: XPG Functions,  Next: Logging In and Out,  Prev: Manipulating the Database,  Up: User Accounting Database
+File: libc.info,  Node: Infinity and NaN,  Next: Status bit operations,  Prev: FP Exceptions,  Up: Floating Point Errors
 
-29.12.2 XPG User Accounting Database Functions
-----------------------------------------------
+20.5.2 Infinity and NaN
+-----------------------
 
-These functions, described in the X/Open Portability Guide, are declared
-in the header file `utmpx.h'.  
+IEEE 754 floating point numbers can represent positive or negative
+infinity, and "NaN" (not a number).  These three values arise from
+calculations whose result is undefined or cannot be represented
+accurately.  You can also deliberately set a floating-point variable to
+any of them, which is sometimes useful.  Some examples of calculations
+that produce infinity or NaN:
 
- -- Data Type: struct utmpx
-     The `utmpx' data structure contains at least the following members:
+     1/0 = oo
+     log (0) = -oo
+     sqrt (-1) = NaN
 
-    `short int ut_type'
-          Specifies the type of login; one of `EMPTY', `RUN_LVL',
-          `BOOT_TIME', `OLD_TIME', `NEW_TIME', `INIT_PROCESS',
-          `LOGIN_PROCESS', `USER_PROCESS' or `DEAD_PROCESS'.
+   When a calculation produces any of these values, an exception also
+occurs; see *note FP Exceptions::.
 
-    `pid_t ut_pid'
-          The process ID number of the login process.
+   The basic operations and math functions all accept infinity and NaN
+and produce sensible output.  Infinities propagate through calculations
+as one would expect: for example, 2 + oo = oo, 4/oo = 0, atan (oo) =
+pi/2.  NaN, on the other hand, infects any calculation that involves it.
+Unless the calculation would produce the same result no matter what real
+value replaced NaN, the result is NaN.
 
-    `char ut_line[]'
-          The device name of the tty (without `/dev/').
+   In comparison operations, positive infinity is larger than all values
+except itself and NaN, and negative infinity is smaller than all values
+except itself and NaN. NaN is "unordered": it is not equal to, greater
+than, or less than anything, _including itself_.  'x == x' is false if
+the value of 'x' is NaN. You can use this to test whether a value is NaN
+or not, but the recommended way to test for NaN is with the 'isnan'
+function (*note Floating Point Classes::).  In addition, '<', '>', '<=',
+and '>=' will raise an exception when applied to NaNs.
 
-    `char ut_id[]'
-          The inittab ID of the process.
+   'math.h' defines macros that allow you to explicitly set a variable
+to infinity or NaN.
 
-    `char ut_user[]'
-          The user's login name.
+ -- Macro: float INFINITY
+     An expression representing positive infinity.  It is equal to the
+     value produced by mathematical operations like '1.0 / 0.0'.
+     '-INFINITY' represents negative infinity.
 
-    `struct timeval ut_tv'
-          Time the entry was made.  For entries of type `OLD_TIME' this
-          is the time when the system clock changed, and for entries of
-          type `NEW_TIME' this is the time the system clock was set to.
-     In the GNU C Library, `struct utmpx' is identical to `struct utmp'
-     except for the fact that including `utmpx.h' does not make visible
-     the declaration of `struct exit_status'.
+     You can test whether a floating-point value is infinite by
+     comparing it to this macro.  However, this is not recommended; you
+     should use the 'isfinite' macro instead.  *Note Floating Point
+     Classes::.
 
-   The following macros are defined for use as values for the `ut_type'
-member of the `utmpx' structure.  The values are integer constants and
-are, in the GNU C Library, identical to the definitions in `utmp.h'.
+     This macro was introduced in the ISO C99 standard.
 
-`EMPTY'
-     This macro is used to indicate that the entry contains no valid
-     user accounting information.
+ -- Macro: float NAN
+     An expression representing a value which is "not a number".  This
+     macro is a GNU extension, available only on machines that support
+     the "not a number" value--that is to say, on all machines that
+     support IEEE floating point.
 
-`RUN_LVL'
-     This macro is used to identify the systems runlevel.
+     You can use '#ifdef NAN' to test whether the machine supports NaN.
+     (Of course, you must arrange for GNU extensions to be visible, such
+     as by defining '_GNU_SOURCE', and then you must include 'math.h'.)
 
-`BOOT_TIME'
-     This macro is used to identify the time of system boot.
+   IEEE 754 also allows for another unusual value: negative zero.  This
+value is produced when you divide a positive number by negative
+infinity, or when a negative result is smaller than the limits of
+representation.
 
-`OLD_TIME'
-     This macro is used to identify the time when the system clock
-     changed.
+
+File: libc.info,  Node: Status bit operations,  Next: Math Error Reporting,  Prev: Infinity and NaN,  Up: Floating Point Errors
 
-`NEW_TIME'
-     This macro is used to identify the time after the system changed.
+20.5.3 Examining the FPU status word
+------------------------------------
 
-`INIT_PROCESS'
-     This macro is used to identify a process spawned by the init
-     process.
+ISO C99 defines functions to query and manipulate the floating-point
+status word.  You can use these functions to check for untrapped
+exceptions when it's convenient, rather than worrying about them in the
+middle of a calculation.
 
-`LOGIN_PROCESS'
-     This macro is used to identify the session leader of a logged in
-     user.
+   These constants represent the various IEEE 754 exceptions.  Not all
+FPUs report all the different exceptions.  Each constant is defined if
+and only if the FPU you are compiling for supports that exception, so
+you can test for FPU support with '#ifdef'.  They are defined in
+'fenv.h'.
 
-`USER_PROCESS'
-     This macro is used to identify a user process.
+'FE_INEXACT'
+     The inexact exception.
+'FE_DIVBYZERO'
+     The divide by zero exception.
+'FE_UNDERFLOW'
+     The underflow exception.
+'FE_OVERFLOW'
+     The overflow exception.
+'FE_INVALID'
+     The invalid exception.
 
-`DEAD_PROCESS'
-     This macro is used to identify a terminated process.
+   The macro 'FE_ALL_EXCEPT' is the bitwise OR of all exception macros
+which are supported by the FP implementation.
 
-   The size of the `ut_line', `ut_id' and `ut_user' arrays can be found
-using the `sizeof' operator.
+   These functions allow you to clear exception flags, test for
+exceptions, and save and restore the set of exceptions flagged.
 
- -- Function: void setutxent (void)
-     Preliminary: | MT-Unsafe race:utent | AS-Unsafe lock | AC-Unsafe
-     lock fd | *Note POSIX Safety Concepts::.
+ -- Function: int feclearexcept (int EXCEPTS)
+     Preliminary: | MT-Safe | AS-Safe !posix | AC-Safe !posix | *Note
+     POSIX Safety Concepts::.
 
-     This function is similar to `setutent'.  In the GNU C Library it is
-     simply an alias for `setutent'.
+     This function clears all of the supported exception flags indicated
+     by EXCEPTS.
 
- -- Function: struct utmpx * getutxent (void)
-     Preliminary: | MT-Unsafe init race:utent sig:ALRM timer |
-     AS-Unsafe heap lock | AC-Unsafe lock fd mem | *Note POSIX Safety
-     Concepts::.
+     The function returns zero in case the operation was successful, a
+     non-zero value otherwise.
 
-     The `getutxent' function is similar to `getutent', but returns a
-     pointer to a `struct utmpx' instead of `struct utmp'.  In the GNU
-     C Library it simply is an alias for `getutent'.
-
- -- Function: void endutxent (void)
-     Preliminary: | MT-Unsafe race:utent | AS-Unsafe lock | AC-Unsafe
-     lock | *Note POSIX Safety Concepts::.
-
-     This function is similar to `endutent'.  In the GNU C Library it is
-     simply an alias for `endutent'.
-
- -- Function: struct utmpx * getutxid (const struct utmpx *ID)
-     Preliminary: | MT-Unsafe init race:utent sig:ALRM timer |
-     AS-Unsafe lock heap | AC-Unsafe lock mem fd | *Note POSIX Safety
-     Concepts::.
-
-     This function is similar to `getutid', but uses `struct utmpx'
-     instead of `struct utmp'.  In the GNU C Library it is simply an
-     alias for `getutid'.
-
- -- Function: struct utmpx * getutxline (const struct utmpx *LINE)
-     Preliminary: | MT-Unsafe init race:utent sig:ALRM timer |
-     AS-Unsafe heap lock | AC-Unsafe lock fd mem | *Note POSIX Safety
-     Concepts::.
-
-     This function is similar to `getutid', but uses `struct utmpx'
-     instead of `struct utmp'.  In the GNU C Library it is simply an
-     alias for `getutline'.
-
- -- Function: struct utmpx * pututxline (const struct utmpx *UTMP)
-     Preliminary: | MT-Unsafe race:utent sig:ALRM timer | AS-Unsafe lock
-     | AC-Unsafe lock fd | *Note POSIX Safety Concepts::.
-
-     The `pututxline' function is functionally identical to
-     `pututline', but uses `struct utmpx' instead of `struct utmp'.  In
-     the GNU C Library, `pututxline' is simply an alias for `pututline'.
-
- -- Function: int utmpxname (const char *FILE)
-     Preliminary: | MT-Unsafe race:utent | AS-Unsafe lock heap |
-     AC-Unsafe lock mem | *Note POSIX Safety Concepts::.
-
-     The `utmpxname' function is functionally identical to `utmpname'.
-     In the GNU C Library, `utmpxname' is simply an alias for
-     `utmpname'.
-
-   You can translate between a traditional `struct utmp' and an XPG
-`struct utmpx' with the following functions.  In the GNU C Library,
-these functions are merely copies, since the two structures are
-identical.
-
- -- Function: int getutmp (const struct utmpx *UTMPX, struct utmp *UTMP)
+ -- Function: int feraiseexcept (int EXCEPTS)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     `getutmp' copies the information, insofar as the structures are
-     compatible, from UTMPX to UTMP.
+     This function raises the supported exceptions indicated by EXCEPTS.
+     If more than one exception bit in EXCEPTS is set the order in which
+     the exceptions are raised is undefined except that overflow
+     ('FE_OVERFLOW') or underflow ('FE_UNDERFLOW') are raised before
+     inexact ('FE_INEXACT').  Whether for overflow or underflow the
+     inexact exception is also raised is also implementation dependent.
 
- -- Function: int getutmpx (const struct utmp *UTMP, struct utmpx
-          *UTMPX)
+     The function returns zero in case the operation was successful, a
+     non-zero value otherwise.
+
+ -- Function: int fetestexcept (int EXCEPTS)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     `getutmpx' copies the information, insofar as the structures are
-     compatible, from UTMP to UTMPX.
+     Test whether the exception flags indicated by the parameter EXCEPT
+     are currently set.  If any of them are, a nonzero value is returned
+     which specifies which exceptions are set.  Otherwise the result is
+     zero.
 
-
-File: libc.info,  Node: Logging In and Out,  Prev: XPG Functions,  Up: User Accounting Database
+   To understand these functions, imagine that the status word is an
+integer variable named STATUS.  'feclearexcept' is then equivalent to
+'status &= ~excepts' and 'fetestexcept' is equivalent to '(status &
+excepts)'.  The actual implementation may be very different, of course.
 
-29.12.3 Logging In and Out
---------------------------
+   Exception flags are only cleared when the program explicitly requests
+it, by calling 'feclearexcept'.  If you want to check for exceptions
+from a set of calculations, you should clear all the flags first.  Here
+is a simple example of the way to use 'fetestexcept':
 
-These functions, derived from BSD, are available in the separate
-`libutil' library, and declared in `utmp.h'.  
+     {
+       double f;
+       int raised;
+       feclearexcept (FE_ALL_EXCEPT);
+       f = compute ();
+       raised = fetestexcept (FE_OVERFLOW | FE_INVALID);
+       if (raised & FE_OVERFLOW) { /* ... */ }
+       if (raised & FE_INVALID) { /* ... */ }
+       /* ... */
+     }
 
-   Note that the `ut_user' member of `struct utmp' is called `ut_name'
-in BSD.  Therefore, `ut_name' is defined as an alias for `ut_user' in
-`utmp.h'.
+   You cannot explicitly set bits in the status word.  You can, however,
+save the entire status word and restore it later.  This is done with the
+following functions:
 
- -- Function: int login_tty (int FILEDES)
-     Preliminary: | MT-Unsafe race:ttyname | AS-Unsafe heap lock |
-     AC-Unsafe lock fd mem | *Note POSIX Safety Concepts::.
-
-     This function makes FILEDES the controlling terminal of the
-     current process, redirects standard input, standard output and
-     standard error output to this terminal, and closes FILEDES.
-
-     This function returns `0' on successful completion, and `-1' on
-     error.
-
- -- Function: void login (const struct utmp *ENTRY)
-     Preliminary: | MT-Unsafe race:utent sig:ALRM timer | AS-Unsafe
-     lock heap | AC-Unsafe lock corrupt fd mem | *Note POSIX Safety
+ -- Function: int fegetexceptflag (fexcept_t *FLAGP, int EXCEPTS)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `login' functions inserts an entry into the user accounting
-     database.  The `ut_line' member is set to the name of the terminal
-     on standard input.  If standard input is not a terminal `login'
-     uses standard output or standard error output to determine the
-     name of the terminal.  If `struct utmp' has a `ut_type' member,
-     `login' sets it to `USER_PROCESS', and if there is an `ut_pid'
-     member, it will be set to the process ID of the current process.
-     The remaining entries are copied from ENTRY.
+     This function stores in the variable pointed to by FLAGP an
+     implementation-defined value representing the current setting of
+     the exception flags indicated by EXCEPTS.
 
-     A copy of the entry is written to the user accounting log file.
+     The function returns zero in case the operation was successful, a
+     non-zero value otherwise.
 
- -- Function: int logout (const char *UT_LINE)
-     Preliminary: | MT-Unsafe race:utent sig:ALRM timer | AS-Unsafe
-     lock heap | AC-Unsafe lock fd mem | *Note POSIX Safety Concepts::.
+ -- Function: int fesetexceptflag (const fexcept_t *FLAGP, int EXCEPTS)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-     This function modifies the user accounting database to indicate
-     that the user on UT_LINE has logged out.
+     This function restores the flags for the exceptions indicated by
+     EXCEPTS to the values stored in the variable pointed to by FLAGP.
 
-     The `logout' function returns `1' if the entry was successfully
-     written to the database, or `0' on error.
+     The function returns zero in case the operation was successful, a
+     non-zero value otherwise.
 
- -- Function: void logwtmp (const char *UT_LINE, const char *UT_NAME,
-          const char *UT_HOST)
-     Preliminary: | MT-Unsafe sig:ALRM timer | AS-Unsafe | AC-Unsafe fd
-     | *Note POSIX Safety Concepts::.
-
-     The `logwtmp' function appends an entry to the user accounting log
-     file, for the current time and the information provided in the
-     UT_LINE, UT_NAME and UT_HOST arguments.
-
-   *Portability Note:* The BSD `struct utmp' only has the `ut_line',
-`ut_name', `ut_host' and `ut_time' members.  Older systems do not even
-have the `ut_host' member.
+   Note that the value stored in 'fexcept_t' bears no resemblance to the
+bit mask returned by 'fetestexcept'.  The type may not even be an
+integer.  Do not attempt to modify an 'fexcept_t' variable.
 
 
-File: libc.info,  Node: User Database,  Next: Group Database,  Prev: User Accounting Database,  Up: Users and Groups
+File: libc.info,  Node: Math Error Reporting,  Prev: Status bit operations,  Up: Floating Point Errors
 
-29.13 User Database
-===================
-
-This section describes how to search and scan the database of registered
-users.  The database itself is kept in the file `/etc/passwd' on most
-systems, but on some systems a special network server gives access to
-it.
-
-* Menu:
-
-* User Data Structure::         What each user record contains.
-* Lookup User::                 How to look for a particular user.
-* Scanning All Users::          Scanning the list of all users, one by one.
-* Writing a User Entry::        How a program can rewrite a user's record.
-
-
-File: libc.info,  Node: User Data Structure,  Next: Lookup User,  Up: User Database
-
-29.13.1 The Data Structure that Describes a User
+20.5.4 Error Reporting by Mathematical Functions
 ------------------------------------------------
 
-The functions and data structures for accessing the system user database
-are declared in the header file `pwd.h'.  
+Many of the math functions are defined only over a subset of the real or
+complex numbers.  Even if they are mathematically defined, their result
+may be larger or smaller than the range representable by their return
+type without loss of accuracy.  These are known as "domain errors",
+"overflows", and "underflows", respectively.  Math functions do several
+things when one of these errors occurs.  In this manual we will refer to
+the complete response as "signalling" a domain error, overflow, or
+underflow.
 
- -- Data Type: struct passwd
-     The `passwd' data structure is used to hold information about
-     entries in the system user data base.  It has at least the
-     following members:
+   When a math function suffers a domain error, it raises the invalid
+exception and returns NaN. It also sets ERRNO to 'EDOM'; this is for
+compatibility with old systems that do not support IEEE 754 exception
+handling.  Likewise, when overflow occurs, math functions raise the
+overflow exception and, in the default rounding mode, return oo or -oo
+as appropriate (in other rounding modes, the largest finite value of the
+appropriate sign is returned when appropriate for that rounding mode).
+They also set ERRNO to 'ERANGE' if returning oo or -oo; ERRNO may or may
+not be set to 'ERANGE' when a finite value is returned on overflow.
+When underflow occurs, the underflow exception is raised, and zero
+(appropriately signed) or a subnormal value, as appropriate for the
+mathematical result of the function and the rounding mode, is returned.
+ERRNO may be set to 'ERANGE', but this is not guaranteed; it is intended
+that the GNU C Library should set it when the underflow is to an
+appropriately signed zero, but not necessarily for other underflows.
 
-    `char *pw_name'
-          The user's login name.
+   Some of the math functions are defined mathematically to result in a
+complex value over parts of their domains.  The most familiar example of
+this is taking the square root of a negative number.  The complex math
+functions, such as 'csqrt', will return the appropriate complex value in
+this case.  The real-valued functions, such as 'sqrt', will signal a
+domain error.
 
-    `char *pw_passwd.'
-          The encrypted password string.
+   Some older hardware does not support infinities.  On that hardware,
+overflows instead return a particular very large number (usually the
+largest representable number).  'math.h' defines macros you can use to
+test for overflow on both old and new hardware.
 
-    `uid_t pw_uid'
-          The user ID number.
+ -- Macro: double HUGE_VAL
+ -- Macro: float HUGE_VALF
+ -- Macro: long double HUGE_VALL
+     An expression representing a particular very large number.  On
+     machines that use IEEE 754 floating point format, 'HUGE_VAL' is
+     infinity.  On other machines, it's typically the largest positive
+     number that can be represented.
 
-    `gid_t pw_gid'
-          The user's default group ID number.
-
-    `char *pw_gecos'
-          A string typically containing the user's real name, and
-          possibly other information such as a phone number.
-
-    `char *pw_dir'
-          The user's home directory, or initial working directory.
-          This might be a null pointer, in which case the
-          interpretation is system-dependent.
-
-    `char *pw_shell'
-          The user's default shell, or the initial program run when the
-          user logs in.  This might be a null pointer, indicating that
-          the system default should be used.
+     Mathematical functions return the appropriately typed version of
+     'HUGE_VAL' or '-HUGE_VAL' when the result is too large to be
+     represented.
 
 
-File: libc.info,  Node: Lookup User,  Next: Scanning All Users,  Prev: User Data Structure,  Up: User Database
+File: libc.info,  Node: Rounding,  Next: Control Functions,  Prev: Floating Point Errors,  Up: Arithmetic
 
-29.13.2 Looking Up One User
----------------------------
+20.6 Rounding Modes
+===================
 
-You can search the system user database for information about a
-specific user using `getpwuid' or `getpwnam'.  These functions are
-declared in `pwd.h'.
+Floating-point calculations are carried out internally with extra
+precision, and then rounded to fit into the destination type.  This
+ensures that results are as precise as the input data.  IEEE 754 defines
+four possible rounding modes:
 
- -- Function: struct passwd * getpwuid (uid_t UID)
-     Preliminary: | MT-Unsafe race:pwuid locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
-     Safety Concepts::.
+Round to nearest.
+     This is the default mode.  It should be used unless there is a
+     specific need for one of the others.  In this mode results are
+     rounded to the nearest representable value.  If the result is
+     midway between two representable values, the even representable is
+     chosen.  "Even" here means the lowest-order bit is zero.  This
+     rounding mode prevents statistical bias and guarantees numeric
+     stability: round-off errors in a lengthy calculation will remain
+     smaller than half of 'FLT_EPSILON'.
 
-     This function returns a pointer to a statically-allocated structure
-     containing information about the user whose user ID is UID.  This
-     structure may be overwritten on subsequent calls to `getpwuid'.
+Round toward plus Infinity.
+     All results are rounded to the smallest representable value which
+     is greater than the result.
 
-     A null pointer value indicates there is no user in the data base
-     with user ID UID.
+Round toward minus Infinity.
+     All results are rounded to the largest representable value which is
+     less than the result.
 
- -- Function: int getpwuid_r (uid_t UID, struct passwd *RESULT_BUF,
-          char *BUFFER, size_t BUFLEN, struct passwd **RESULT)
-     Preliminary: | MT-Safe locale | AS-Unsafe dlopen plugin heap lock
-     | AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
+Round toward zero.
+     All results are rounded to the largest representable value whose
+     magnitude is less than that of the result.  In other words, if the
+     result is negative it is rounded up; if it is positive, it is
+     rounded down.
 
-     This function is similar to `getpwuid' in that it returns
-     information about the user whose user ID is UID.  However, it
-     fills the user supplied structure pointed to by RESULT_BUF with
-     the information instead of using a static buffer.  The first
-     BUFLEN bytes of the additional buffer pointed to by BUFFER are
-     used to contain additional information, normally strings which are
-     pointed to by the elements of the result structure.
+'fenv.h' defines constants which you can use to refer to the various
+rounding modes.  Each one will be defined if and only if the FPU
+supports the corresponding rounding mode.
 
-     If a user with ID UID is found, the pointer returned in RESULT
-     points to the record which contains the wanted data (i.e., RESULT
-     contains the value RESULT_BUF).  If no user is found or if an
-     error occurred, the pointer returned in RESULT is a null pointer.
-     The function returns zero or an error code.  If the buffer BUFFER
-     is too small to contain all the needed information, the error code
-     `ERANGE' is returned and ERRNO is set to `ERANGE'.
+'FE_TONEAREST'
+     Round to nearest.
 
- -- Function: struct passwd * getpwnam (const char *NAME)
-     Preliminary: | MT-Unsafe race:pwnam locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
-     Safety Concepts::.
+'FE_UPWARD'
+     Round toward +oo.
 
-     This function returns a pointer to a statically-allocated structure
-     containing information about the user whose user name is NAME.
-     This structure may be overwritten on subsequent calls to
-     `getpwnam'.
+'FE_DOWNWARD'
+     Round toward -oo.
 
-     A null pointer return indicates there is no user named NAME.
+'FE_TOWARDZERO'
+     Round toward zero.
 
- -- Function: int getpwnam_r (const char *NAME, struct passwd
-          *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct passwd
-          **RESULT)
-     Preliminary: | MT-Safe locale | AS-Unsafe dlopen plugin heap lock
-     | AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
+   Underflow is an unusual case.  Normally, IEEE 754 floating point
+numbers are always normalized (*note Floating Point Concepts::).
+Numbers smaller than 2^r (where r is the minimum exponent,
+'FLT_MIN_RADIX-1' for FLOAT) cannot be represented as normalized
+numbers.  Rounding all such numbers to zero or 2^r would cause some
+algorithms to fail at 0.  Therefore, they are left in denormalized form.
+That produces loss of precision, since some bits of the mantissa are
+stolen to indicate the decimal point.
 
-     This function is similar to `getpwnam' in that is returns
-     information about the user whose user name is NAME.  However, like
-     `getpwuid_r', it fills the user supplied buffers in RESULT_BUF and
-     BUFFER with the information instead of using a static buffer.
+   If a result is too small to be represented as a denormalized number,
+it is rounded to zero.  However, the sign of the result is preserved; if
+the calculation was negative, the result is "negative zero".  Negative
+zero can also result from some operations on infinity, such as 4/-oo.
 
-     The return values are the same as for `getpwuid_r'.
+   At any time one of the above four rounding modes is selected.  You
+can find out which one with this function:
+
+ -- Function: int fegetround (void)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     Returns the currently selected rounding mode, represented by one of
+     the values of the defined rounding mode macros.
+
+To change the rounding mode, use this function:
+
+ -- Function: int fesetround (int ROUND)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     Changes the currently selected rounding mode to ROUND.  If ROUND
+     does not correspond to one of the supported rounding modes nothing
+     is changed.  'fesetround' returns zero if it changed the rounding
+     mode, a nonzero value if the mode is not supported.
+
+   You should avoid changing the rounding mode if possible.  It can be
+an expensive operation; also, some hardware requires you to compile your
+program differently for it to work.  The resulting code may run slower.
+See your compiler documentation for details.
 
 
-File: libc.info,  Node: Scanning All Users,  Next: Writing a User Entry,  Prev: Lookup User,  Up: User Database
+File: libc.info,  Node: Control Functions,  Next: Arithmetic Functions,  Prev: Rounding,  Up: Arithmetic
 
-29.13.3 Scanning the List of All Users
---------------------------------------
+20.7 Floating-Point Control Functions
+=====================================
 
-This section explains how a program can read the list of all users in
-the system, one user at a time.  The functions described here are
-declared in `pwd.h'.
+IEEE 754 floating-point implementations allow the programmer to decide
+whether traps will occur for each of the exceptions, by setting bits in
+the "control word".  In C, traps result in the program receiving the
+'SIGFPE' signal; see *note Signal Handling::.
 
-   You can use the `fgetpwent' function to read user entries from a
-particular file.
+   *NB:* IEEE 754 says that trap handlers are given details of the
+exceptional situation, and can set the result value.  C signals do not
+provide any mechanism to pass this information back and forth.  Trapping
+exceptions in C is therefore not very useful.
 
- -- Function: struct passwd * fgetpwent (FILE *STREAM)
-     Preliminary: | MT-Unsafe race:fpwent | AS-Unsafe corrupt lock |
-     AC-Unsafe corrupt lock | *Note POSIX Safety Concepts::.
+   It is sometimes necessary to save the state of the floating-point
+unit while you perform some calculation.  The library provides functions
+which save and restore the exception flags, the set of exceptions that
+generate traps, and the rounding mode.  This information is known as the
+"floating-point environment".
 
-     This function reads the next user entry from STREAM and returns a
-     pointer to the entry.  The structure is statically allocated and is
-     rewritten on subsequent calls to `fgetpwent'.  You must copy the
-     contents of the structure if you wish to save the information.
+   The functions to save and restore the floating-point environment all
+use a variable of type 'fenv_t' to store information.  This type is
+defined in 'fenv.h'.  Its size and contents are implementation-defined.
+You should not attempt to manipulate a variable of this type directly.
 
-     The stream must correspond to a file in the same format as the
-     standard password database file.
+   To save the state of the FPU, use one of these functions:
 
- -- Function: int fgetpwent_r (FILE *STREAM, struct passwd *RESULT_BUF,
-          char *BUFFER, size_t BUFLEN, struct passwd **RESULT)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
-     | *Note POSIX Safety Concepts::.
+ -- Function: int fegetenv (fenv_t *ENVP)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-     This function is similar to `fgetpwent' in that it reads the next
-     user entry from STREAM.  But the result is returned in the
-     structure pointed to by RESULT_BUF.  The first BUFLEN bytes of the
-     additional buffer pointed to by BUFFER are used to contain
-     additional information, normally strings which are pointed to by
-     the elements of the result structure.
+     Store the floating-point environment in the variable pointed to by
+     ENVP.
 
-     The stream must correspond to a file in the same format as the
-     standard password database file.
+     The function returns zero in case the operation was successful, a
+     non-zero value otherwise.
 
-     If the function returns zero RESULT points to the structure with
-     the wanted data (normally this is in RESULT_BUF).  If errors
-     occurred the return value is nonzero and RESULT contains a null
-     pointer.
+ -- Function: int feholdexcept (fenv_t *ENVP)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-   The way to scan all the entries in the user database is with
-`setpwent', `getpwent', and `endpwent'.
+     Store the current floating-point environment in the object pointed
+     to by ENVP.  Then clear all exception flags, and set the FPU to
+     trap no exceptions.  Not all FPUs support trapping no exceptions;
+     if 'feholdexcept' cannot set this mode, it returns nonzero value.
+     If it succeeds, it returns zero.
 
- -- Function: void setpwent (void)
-     Preliminary: | MT-Unsafe race:pwent locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
-     Safety Concepts::.
+   The functions which restore the floating-point environment can take
+these kinds of arguments:
 
-     This function initializes a stream which `getpwent' and
-     `getpwent_r' use to read the user database.
+   * Pointers to 'fenv_t' objects, which were initialized previously by
+     a call to 'fegetenv' or 'feholdexcept'.
+   * The special macro 'FE_DFL_ENV' which represents the floating-point
+     environment as it was available at program start.
+   * Implementation defined macros with names starting with 'FE_' and
+     having type 'fenv_t *'.
 
- -- Function: struct passwd * getpwent (void)
-     Preliminary: | MT-Unsafe race:pwent race:pwentbuf locale |
-     AS-Unsafe dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem
-     | *Note POSIX Safety Concepts::.
+     If possible, the GNU C Library defines a macro 'FE_NOMASK_ENV'
+     which represents an environment where every exception raised causes
+     a trap to occur.  You can test for this macro using '#ifdef'.  It
+     is only defined if '_GNU_SOURCE' is defined.
 
-     The `getpwent' function reads the next entry from the stream
-     initialized by `setpwent'.  It returns a pointer to the entry.  The
-     structure is statically allocated and is rewritten on subsequent
-     calls to `getpwent'.  You must copy the contents of the structure
-     if you wish to save the information.
+     Some platforms might define other predefined environments.
 
-     A null pointer is returned when no more entries are available.
+To set the floating-point environment, you can use either of these
+functions:
 
- -- Function: int getpwent_r (struct passwd *RESULT_BUF, char *BUFFER,
-          size_t BUFLEN, struct passwd **RESULT)
-     Preliminary: | MT-Unsafe race:pwent locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
-     Safety Concepts::.
+ -- Function: int fesetenv (const fenv_t *ENVP)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-     This function is similar to `getpwent' in that it returns the next
-     entry from the stream initialized by `setpwent'.  Like
-     `fgetpwent_r', it uses the user-supplied buffers in RESULT_BUF and
-     BUFFER to return the information requested.
+     Set the floating-point environment to that described by ENVP.
 
-     The return values are the same as for `fgetpwent_r'.
+     The function returns zero in case the operation was successful, a
+     non-zero value otherwise.
 
+ -- Function: int feupdateenv (const fenv_t *ENVP)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
- -- Function: void endpwent (void)
-     Preliminary: | MT-Unsafe race:pwent locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
-     Safety Concepts::.
+     Like 'fesetenv', this function sets the floating-point environment
+     to that described by ENVP.  However, if any exceptions were flagged
+     in the status word before 'feupdateenv' was called, they remain
+     flagged after the call.  In other words, after 'feupdateenv' is
+     called, the status word is the bitwise OR of the previous status
+     word and the one saved in ENVP.
 
-     This function closes the internal stream used by `getpwent' or
-     `getpwent_r'.
+     The function returns zero in case the operation was successful, a
+     non-zero value otherwise.
+
+To control for individual exceptions if raising them causes a trap to
+occur, you can use the following two functions.
+
+   *Portability Note:* These functions are all GNU extensions.
+
+ -- Function: int feenableexcept (int EXCEPTS)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This functions enables traps for each of the exceptions as
+     indicated by the parameter EXCEPT.  The individual exceptions are
+     described in *note Status bit operations::.  Only the specified
+     exceptions are enabled, the status of the other exceptions is not
+     changed.
+
+     The function returns the previous enabled exceptions in case the
+     operation was successful, '-1' otherwise.
+
+ -- Function: int fedisableexcept (int EXCEPTS)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This functions disables traps for each of the exceptions as
+     indicated by the parameter EXCEPT.  The individual exceptions are
+     described in *note Status bit operations::.  Only the specified
+     exceptions are disabled, the status of the other exceptions is not
+     changed.
+
+     The function returns the previous enabled exceptions in case the
+     operation was successful, '-1' otherwise.
+
+ -- Function: int fegetexcept (void)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The function returns a bitmask of all currently enabled exceptions.
+     It returns '-1' in case of failure.
 
 
-File: libc.info,  Node: Writing a User Entry,  Prev: Scanning All Users,  Up: User Database
+File: libc.info,  Node: Arithmetic Functions,  Next: Complex Numbers,  Prev: Control Functions,  Up: Arithmetic
 
-29.13.4 Writing a User Entry
-----------------------------
+20.8 Arithmetic Functions
+=========================
 
- -- Function: int putpwent (const struct passwd *P, FILE *STREAM)
-     Preliminary: | MT-Safe locale | AS-Unsafe corrupt | AC-Unsafe lock
-     corrupt | *Note POSIX Safety Concepts::.
-
-     This function writes the user entry `*P' to the stream STREAM, in
-     the format used for the standard user database file.  The return
-     value is zero on success and nonzero on failure.
-
-     This function exists for compatibility with SVID.  We recommend
-     that you avoid using it, because it makes sense only on the
-     assumption that the `struct passwd' structure has no members
-     except the standard ones; on a system which merges the traditional
-     Unix data base with other extended information about users, adding
-     an entry using this function would inevitably leave out much of
-     the important information.
-
-     The group and user ID fields are left empty if the group or user
-     name starts with a - or +.
-
-     The function `putpwent' is declared in `pwd.h'.
-
-
-File: libc.info,  Node: Group Database,  Next: Database Example,  Prev: User Database,  Up: Users and Groups
-
-29.14 Group Database
-====================
-
-This section describes how to search and scan the database of
-registered groups.  The database itself is kept in the file
-`/etc/group' on most systems, but on some systems a special network
-service provides access to it.
+The C library provides functions to do basic operations on
+floating-point numbers.  These include absolute value, maximum and
+minimum, normalization, bit twiddling, rounding, and a few others.
 
 * Menu:
 
-* Group Data Structure::        What each group record contains.
-* Lookup Group::                How to look for a particular group.
-* Scanning All Groups::         Scanning the list of all groups.
+* Absolute Value::              Absolute values of integers and floats.
+* Normalization Functions::     Extracting exponents and putting them back.
+* Rounding Functions::          Rounding floats to integers.
+* Remainder Functions::         Remainders on division, precisely defined.
+* FP Bit Twiddling::            Sign bit adjustment.  Adding epsilon.
+* FP Comparison Functions::     Comparisons without risk of exceptions.
+* Misc FP Arithmetic::          Max, min, positive difference, multiply-add.
 
 
-File: libc.info,  Node: Group Data Structure,  Next: Lookup Group,  Up: Group Database
+File: libc.info,  Node: Absolute Value,  Next: Normalization Functions,  Up: Arithmetic Functions
 
-29.14.1 The Data Structure for a Group
---------------------------------------
+20.8.1 Absolute Value
+---------------------
 
-The functions and data structures for accessing the system group
-database are declared in the header file `grp.h'.  
+These functions are provided for obtaining the "absolute value" (or
+"magnitude") of a number.  The absolute value of a real number X is X if
+X is positive, -X if X is negative.  For a complex number Z, whose real
+part is X and whose imaginary part is Y, the absolute value is
+'sqrt (X*X + Y*Y)'.
 
- -- Data Type: struct group
-     The `group' structure is used to hold information about an entry in
-     the system group database.  It has at least the following members:
+   Prototypes for 'abs', 'labs' and 'llabs' are in 'stdlib.h'; 'imaxabs'
+is declared in 'inttypes.h'; 'fabs', 'fabsf' and 'fabsl' are declared in
+'math.h'.  'cabs', 'cabsf' and 'cabsl' are declared in 'complex.h'.
 
-    `char *gr_name'
-          The name of the group.
+ -- Function: int abs (int NUMBER)
+ -- Function: long int labs (long int NUMBER)
+ -- Function: long long int llabs (long long int NUMBER)
+ -- Function: intmax_t imaxabs (intmax_t NUMBER)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-    `gid_t gr_gid'
-          The group ID of the group.
+     These functions return the absolute value of NUMBER.
 
-    `char **gr_mem'
-          A vector of pointers to the names of users in the group.
-          Each user name is a null-terminated string, and the vector
-          itself is terminated by a null pointer.
+     Most computers use a two's complement integer representation, in
+     which the absolute value of 'INT_MIN' (the smallest possible 'int')
+     cannot be represented; thus, 'abs (INT_MIN)' is not defined.
+
+     'llabs' and 'imaxdiv' are new to ISO C99.
+
+     See *note Integers:: for a description of the 'intmax_t' type.
+
+ -- Function: double fabs (double NUMBER)
+ -- Function: float fabsf (float NUMBER)
+ -- Function: long double fabsl (long double NUMBER)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function returns the absolute value of the floating-point
+     number NUMBER.
+
+ -- Function: double cabs (complex double Z)
+ -- Function: float cabsf (complex float Z)
+ -- Function: long double cabsl (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the absolute value of the complex number Z
+     (*note Complex Numbers::).  The absolute value of a complex number
+     is:
+
+          sqrt (creal (Z) * creal (Z) + cimag (Z) * cimag (Z))
+
+     This function should always be used instead of the direct formula
+     because it takes special care to avoid losing precision.  It may
+     also take advantage of hardware support for this operation.  See
+     'hypot' in *note Exponents and Logarithms::.
 
 
-File: libc.info,  Node: Lookup Group,  Next: Scanning All Groups,  Prev: Group Data Structure,  Up: Group Database
+File: libc.info,  Node: Normalization Functions,  Next: Rounding Functions,  Prev: Absolute Value,  Up: Arithmetic Functions
 
-29.14.2 Looking Up One Group
-----------------------------
+20.8.2 Normalization Functions
+------------------------------
 
-You can search the group database for information about a specific
-group using `getgrgid' or `getgrnam'.  These functions are declared in
-`grp.h'.
+The functions described in this section are primarily provided as a way
+to efficiently perform certain low-level manipulations on floating point
+numbers that are represented internally using a binary radix; see *note
+Floating Point Concepts::.  These functions are required to have
+equivalent behavior even if the representation does not use a radix of
+2, but of course they are unlikely to be particularly efficient in those
+cases.
 
- -- Function: struct group * getgrgid (gid_t GID)
-     Preliminary: | MT-Unsafe race:grgid locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+   All these functions are declared in 'math.h'.
+
+ -- Function: double frexp (double VALUE, int *EXPONENT)
+ -- Function: float frexpf (float VALUE, int *EXPONENT)
+ -- Function: long double frexpl (long double VALUE, int *EXPONENT)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions are used to split the number VALUE into a
+     normalized fraction and an exponent.
+
+     If the argument VALUE is not zero, the return value is VALUE times
+     a power of two, and its magnitude is always in the range 1/2
+     (inclusive) to 1 (exclusive).  The corresponding exponent is stored
+     in '*EXPONENT'; the return value multiplied by 2 raised to this
+     exponent equals the original number VALUE.
+
+     For example, 'frexp (12.8, &exponent)' returns '0.8' and stores '4'
+     in 'exponent'.
+
+     If VALUE is zero, then the return value is zero and zero is stored
+     in '*EXPONENT'.
+
+ -- Function: double ldexp (double VALUE, int EXPONENT)
+ -- Function: float ldexpf (float VALUE, int EXPONENT)
+ -- Function: long double ldexpl (long double VALUE, int EXPONENT)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the result of multiplying the floating-point
+     number VALUE by 2 raised to the power EXPONENT.  (It can be used to
+     reassemble floating-point numbers that were taken apart by
+     'frexp'.)
+
+     For example, 'ldexp (0.8, 4)' returns '12.8'.
+
+   The following functions, which come from BSD, provide facilities
+equivalent to those of 'ldexp' and 'frexp'.  See also the ISO C function
+'logb' which originally also appeared in BSD.
+
+ -- Function: double scalb (double VALUE, double EXPONENT)
+ -- Function: float scalbf (float VALUE, float EXPONENT)
+ -- Function: long double scalbl (long double VALUE, long double
+          EXPONENT)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'scalb' function is the BSD name for 'ldexp'.
+
+ -- Function: double scalbn (double X, int N)
+ -- Function: float scalbnf (float X, int N)
+ -- Function: long double scalbnl (long double X, int N)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'scalbn' is identical to 'scalb', except that the exponent N is an
+     'int' instead of a floating-point number.
+
+ -- Function: double scalbln (double X, long int N)
+ -- Function: float scalblnf (float X, long int N)
+ -- Function: long double scalblnl (long double X, long int N)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'scalbln' is identical to 'scalb', except that the exponent N is a
+     'long int' instead of a floating-point number.
+
+ -- Function: double significand (double X)
+ -- Function: float significandf (float X)
+ -- Function: long double significandl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'significand' returns the mantissa of X scaled to the range [1, 2).
+     It is equivalent to 'scalb (X, (double) -ilogb (X))'.
+
+     This function exists mainly for use in certain standardized tests
+     of IEEE 754 conformance.
+
+
+File: libc.info,  Node: Rounding Functions,  Next: Remainder Functions,  Prev: Normalization Functions,  Up: Arithmetic Functions
+
+20.8.3 Rounding Functions
+-------------------------
+
+The functions listed here perform operations such as rounding and
+truncation of floating-point values.  Some of these functions convert
+floating point numbers to integer values.  They are all declared in
+'math.h'.
+
+   You can also convert floating-point numbers to integers simply by
+casting them to 'int'.  This discards the fractional part, effectively
+rounding towards zero.  However, this only works if the result can
+actually be represented as an 'int'--for very large numbers, this is
+impossible.  The functions listed here return the result as a 'double'
+instead to get around this problem.
+
+ -- Function: double ceil (double X)
+ -- Function: float ceilf (float X)
+ -- Function: long double ceill (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions round X upwards to the nearest integer, returning
+     that value as a 'double'.  Thus, 'ceil (1.5)' is '2.0'.
+
+ -- Function: double floor (double X)
+ -- Function: float floorf (float X)
+ -- Function: long double floorl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions round X downwards to the nearest integer, returning
+     that value as a 'double'.  Thus, 'floor (1.5)' is '1.0' and 'floor
+     (-1.5)' is '-2.0'.
+
+ -- Function: double trunc (double X)
+ -- Function: float truncf (float X)
+ -- Function: long double truncl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'trunc' functions round X towards zero to the nearest integer
+     (returned in floating-point format).  Thus, 'trunc (1.5)' is '1.0'
+     and 'trunc (-1.5)' is '-1.0'.
+
+ -- Function: double rint (double X)
+ -- Function: float rintf (float X)
+ -- Function: long double rintl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions round X to an integer value according to the
+     current rounding mode.  *Note Floating Point Parameters::, for
+     information about the various rounding modes.  The default rounding
+     mode is to round to the nearest integer; some machines support
+     other modes, but round-to-nearest is always used unless you
+     explicitly select another.
+
+     If X was not initially an integer, these functions raise the
+     inexact exception.
+
+ -- Function: double nearbyint (double X)
+ -- Function: float nearbyintf (float X)
+ -- Function: long double nearbyintl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the same value as the 'rint' functions, but
+     do not raise the inexact exception if X is not an integer.
+
+ -- Function: double round (double X)
+ -- Function: float roundf (float X)
+ -- Function: long double roundl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions are similar to 'rint', but they round halfway cases
+     away from zero instead of to the nearest integer (or other current
+     rounding mode).
+
+ -- Function: long int lrint (double X)
+ -- Function: long int lrintf (float X)
+ -- Function: long int lrintl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions are just like 'rint', but they return a 'long int'
+     instead of a floating-point number.
+
+ -- Function: long long int llrint (double X)
+ -- Function: long long int llrintf (float X)
+ -- Function: long long int llrintl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions are just like 'rint', but they return a 'long long
+     int' instead of a floating-point number.
+
+ -- Function: long int lround (double X)
+ -- Function: long int lroundf (float X)
+ -- Function: long int lroundl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions are just like 'round', but they return a 'long int'
+     instead of a floating-point number.
+
+ -- Function: long long int llround (double X)
+ -- Function: long long int llroundf (float X)
+ -- Function: long long int llroundl (long double X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions are just like 'round', but they return a 'long long
+     int' instead of a floating-point number.
+
+ -- Function: double modf (double VALUE, double *INTEGER-PART)
+ -- Function: float modff (float VALUE, float *INTEGER-PART)
+ -- Function: long double modfl (long double VALUE, long double
+          *INTEGER-PART)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions break the argument VALUE into an integer part and a
+     fractional part (between '-1' and '1', exclusive).  Their sum
+     equals VALUE.  Each of the parts has the same sign as VALUE, and
+     the integer part is always rounded toward zero.
+
+     'modf' stores the integer part in '*INTEGER-PART', and returns the
+     fractional part.  For example, 'modf (2.5, &intpart)' returns '0.5'
+     and stores '2.0' into 'intpart'.
+
+
+File: libc.info,  Node: Remainder Functions,  Next: FP Bit Twiddling,  Prev: Rounding Functions,  Up: Arithmetic Functions
+
+20.8.4 Remainder Functions
+--------------------------
+
+The functions in this section compute the remainder on division of two
+floating-point numbers.  Each is a little different; pick the one that
+suits your problem.
+
+ -- Function: double fmod (double NUMERATOR, double DENOMINATOR)
+ -- Function: float fmodf (float NUMERATOR, float DENOMINATOR)
+ -- Function: long double fmodl (long double NUMERATOR, long double
+          DENOMINATOR)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions compute the remainder from the division of
+     NUMERATOR by DENOMINATOR.  Specifically, the return value is
+     'NUMERATOR - N * DENOMINATOR', where N is the quotient of NUMERATOR
+     divided by DENOMINATOR, rounded towards zero to an integer.  Thus, 'fmod (6.5, 2.3)'
+     returns '1.9', which is '6.5' minus '4.6'.
+
+     The result has the same sign as the NUMERATOR and has magnitude
+     less than the magnitude of the DENOMINATOR.
+
+     If DENOMINATOR is zero, 'fmod' signals a domain error.
+
+ -- Function: double drem (double NUMERATOR, double DENOMINATOR)
+ -- Function: float dremf (float NUMERATOR, float DENOMINATOR)
+ -- Function: long double dreml (long double NUMERATOR, long double
+          DENOMINATOR)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions are like 'fmod' except that they round the internal
+     quotient N to the nearest integer instead of towards zero to an
+     integer.  For example, 'drem (6.5, 2.3)' returns '-0.4', which is
+     '6.5' minus '6.9'.
+
+     The absolute value of the result is less than or equal to half the
+     absolute value of the DENOMINATOR.  The difference between 'fmod
+     (NUMERATOR, DENOMINATOR)' and 'drem (NUMERATOR, DENOMINATOR)' is
+     always either DENOMINATOR, minus DENOMINATOR, or zero.
+
+     If DENOMINATOR is zero, 'drem' signals a domain error.
+
+ -- Function: double remainder (double NUMERATOR, double DENOMINATOR)
+ -- Function: float remainderf (float NUMERATOR, float DENOMINATOR)
+ -- Function: long double remainderl (long double NUMERATOR, long double
+          DENOMINATOR)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is another name for 'drem'.
+
+
+File: libc.info,  Node: FP Bit Twiddling,  Next: FP Comparison Functions,  Prev: Remainder Functions,  Up: Arithmetic Functions
+
+20.8.5 Setting and modifying single bits of FP values
+-----------------------------------------------------
+
+There are some operations that are too complicated or expensive to
+perform by hand on floating-point numbers.  ISO C99 defines functions to
+do these operations, which mostly involve changing single bits.
+
+ -- Function: double copysign (double X, double Y)
+ -- Function: float copysignf (float X, float Y)
+ -- Function: long double copysignl (long double X, long double Y)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return X but with the sign of Y.  They work even if
+     X or Y are NaN or zero.  Both of these can carry a sign (although
+     not all implementations support it) and this is one of the few
+     operations that can tell the difference.
+
+     'copysign' never raises an exception.
+
+     This function is defined in IEC 559 (and the appendix with
+     recommended functions in IEEE 754/IEEE 854).
+
+ -- Function: int signbit (_float-type_ X)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'signbit' is a generic macro which can work on all floating-point
+     types.  It returns a nonzero value if the value of X has its sign
+     bit set.
+
+     This is not the same as 'x < 0.0', because IEEE 754 floating point
+     allows zero to be signed.  The comparison '-0.0 < 0.0' is false,
+     but 'signbit (-0.0)' will return a nonzero value.
+
+ -- Function: double nextafter (double X, double Y)
+ -- Function: float nextafterf (float X, float Y)
+ -- Function: long double nextafterl (long double X, long double Y)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'nextafter' function returns the next representable neighbor of
+     X in the direction towards Y.  The size of the step between X and
+     the result depends on the type of the result.  If X = Y the
+     function simply returns Y.  If either value is 'NaN', 'NaN' is
+     returned.  Otherwise a value corresponding to the value of the
+     least significant bit in the mantissa is added or subtracted,
+     depending on the direction.  'nextafter' will signal overflow or
+     underflow if the result goes outside of the range of normalized
+     numbers.
+
+     This function is defined in IEC 559 (and the appendix with
+     recommended functions in IEEE 754/IEEE 854).
+
+ -- Function: double nexttoward (double X, long double Y)
+ -- Function: float nexttowardf (float X, long double Y)
+ -- Function: long double nexttowardl (long double X, long double Y)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions are identical to the corresponding versions of
+     'nextafter' except that their second argument is a 'long double'.
+
+ -- Function: double nan (const char *TAGP)
+ -- Function: float nanf (const char *TAGP)
+ -- Function: long double nanl (const char *TAGP)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
      Safety Concepts::.
 
-     This function returns a pointer to a statically-allocated structure
-     containing information about the group whose group ID is GID.
-     This structure may be overwritten by subsequent calls to
-     `getgrgid'.
+     The 'nan' function returns a representation of NaN, provided that
+     NaN is supported by the target platform.  'nan ("N-CHAR-SEQUENCE")'
+     is equivalent to 'strtod ("NAN(N-CHAR-SEQUENCE)")'.
 
-     A null pointer indicates there is no group with ID GID.
-
- -- Function: int getgrgid_r (gid_t GID, struct group *RESULT_BUF, char
-          *BUFFER, size_t BUFLEN, struct group **RESULT)
-     Preliminary: | MT-Safe locale | AS-Unsafe dlopen plugin heap lock
-     | AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
-
-     This function is similar to `getgrgid' in that it returns
-     information about the group whose group ID is GID.  However, it
-     fills the user supplied structure pointed to by RESULT_BUF with
-     the information instead of using a static buffer.  The first
-     BUFLEN bytes of the additional buffer pointed to by BUFFER are
-     used to contain additional information, normally strings which are
-     pointed to by the elements of the result structure.
-
-     If a group with ID GID is found, the pointer returned in RESULT
-     points to the record which contains the wanted data (i.e., RESULT
-     contains the value RESULT_BUF).  If no group is found or if an
-     error occurred, the pointer returned in RESULT is a null pointer.
-     The function returns zero or an error code.  If the buffer BUFFER
-     is too small to contain all the needed information, the error code
-     `ERANGE' is returned and ERRNO is set to `ERANGE'.
-
- -- Function: struct group * getgrnam (const char *NAME)
-     Preliminary: | MT-Unsafe race:grnam locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
-     Safety Concepts::.
-
-     This function returns a pointer to a statically-allocated structure
-     containing information about the group whose group name is NAME.
-     This structure may be overwritten by subsequent calls to
-     `getgrnam'.
-
-     A null pointer indicates there is no group named NAME.
-
- -- Function: int getgrnam_r (const char *NAME, struct group
-          *RESULT_BUF, char *BUFFER, size_t BUFLEN, struct group
-          **RESULT)
-     Preliminary: | MT-Safe locale | AS-Unsafe dlopen plugin heap lock
-     | AC-Unsafe corrupt lock fd mem | *Note POSIX Safety Concepts::.
-
-     This function is similar to `getgrnam' in that is returns
-     information about the group whose group name is NAME.  Like
-     `getgrgid_r', it uses the user supplied buffers in RESULT_BUF and
-     BUFFER, not a static buffer.
-
-     The return values are the same as for `getgrgid_r' `ERANGE'.
+     The argument TAGP is used in an unspecified manner.  On IEEE 754
+     systems, there are many representations of NaN, and TAGP selects
+     one.  On other systems it may do nothing.
 
 
-File: libc.info,  Node: Scanning All Groups,  Prev: Lookup Group,  Up: Group Database
+File: libc.info,  Node: FP Comparison Functions,  Next: Misc FP Arithmetic,  Prev: FP Bit Twiddling,  Up: Arithmetic Functions
 
-29.14.3 Scanning the List of All Groups
----------------------------------------
+20.8.6 Floating-Point Comparison Functions
+------------------------------------------
 
-This section explains how a program can read the list of all groups in
-the system, one group at a time.  The functions described here are
-declared in `grp.h'.
+The standard C comparison operators provoke exceptions when one or other
+of the operands is NaN. For example,
 
-   You can use the `fgetgrent' function to read group entries from a
-particular file.
+     int v = a < 1.0;
 
- -- Function: struct group * fgetgrent (FILE *STREAM)
-     Preliminary: | MT-Unsafe race:fgrent | AS-Unsafe corrupt lock |
-     AC-Unsafe corrupt lock | *Note POSIX Safety Concepts::.
+will raise an exception if A is NaN. (This does _not_ happen with '=='
+and '!='; those merely return false and true, respectively, when NaN is
+examined.)  Frequently this exception is undesirable.  ISO C99 therefore
+defines comparison functions that do not raise exceptions when NaN is
+examined.  All of the functions are implemented as macros which allow
+their arguments to be of any floating-point type.  The macros are
+guaranteed to evaluate their arguments only once.
 
-     The `fgetgrent' function reads the next entry from STREAM.  It
-     returns a pointer to the entry.  The structure is statically
-     allocated and is overwritten on subsequent calls to `fgetgrent'.
-     You must copy the contents of the structure if you wish to save the
-     information.
+ -- Macro: int isgreater (_real-floating_ X, _real-floating_ Y)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-     The stream must correspond to a file in the same format as the
-     standard group database file.
+     This macro determines whether the argument X is greater than Y.  It
+     is equivalent to '(X) > (Y)', but no exception is raised if X or Y
+     are NaN.
 
- -- Function: int fgetgrent_r (FILE *STREAM, struct group *RESULT_BUF,
-          char *BUFFER, size_t BUFLEN, struct group **RESULT)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe corrupt lock
+ -- Macro: int isgreaterequal (_real-floating_ X, _real-floating_ Y)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This macro determines whether the argument X is greater than or
+     equal to Y.  It is equivalent to '(X) >= (Y)', but no exception is
+     raised if X or Y are NaN.
+
+ -- Macro: int isless (_real-floating_ X, _real-floating_ Y)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This macro determines whether the argument X is less than Y.  It is
+     equivalent to '(X) < (Y)', but no exception is raised if X or Y are
+     NaN.
+
+ -- Macro: int islessequal (_real-floating_ X, _real-floating_ Y)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This macro determines whether the argument X is less than or equal
+     to Y.  It is equivalent to '(X) <= (Y)', but no exception is raised
+     if X or Y are NaN.
+
+ -- Macro: int islessgreater (_real-floating_ X, _real-floating_ Y)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This macro determines whether the argument X is less or greater
+     than Y.  It is equivalent to '(X) < (Y) || (X) > (Y)' (although it
+     only evaluates X and Y once), but no exception is raised if X or Y
+     are NaN.
+
+     This macro is not equivalent to 'X != Y', because that expression
+     is true if X or Y are NaN.
+
+ -- Macro: int isunordered (_real-floating_ X, _real-floating_ Y)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This macro determines whether its arguments are unordered.  In
+     other words, it is true if X or Y are NaN, and false otherwise.
+
+   Not all machines provide hardware support for these operations.  On
+machines that don't, the macros can be very slow.  Therefore, you should
+not use these functions when NaN is not a concern.
+
+   *NB:* There are no macros 'isequal' or 'isunequal'.  They are
+unnecessary, because the '==' and '!=' operators do _not_ throw an
+exception if one or both of the operands are NaN.
+
+
+File: libc.info,  Node: Misc FP Arithmetic,  Prev: FP Comparison Functions,  Up: Arithmetic Functions
+
+20.8.7 Miscellaneous FP arithmetic functions
+--------------------------------------------
+
+The functions in this section perform miscellaneous but common
+operations that are awkward to express with C operators.  On some
+processors these functions can use special machine instructions to
+perform these operations faster than the equivalent C code.
+
+ -- Function: double fmin (double X, double Y)
+ -- Function: float fminf (float X, float Y)
+ -- Function: long double fminl (long double X, long double Y)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'fmin' function returns the lesser of the two values X and Y.
+     It is similar to the expression
+          ((x) < (y) ? (x) : (y))
+     except that X and Y are only evaluated once.
+
+     If an argument is NaN, the other argument is returned.  If both
+     arguments are NaN, NaN is returned.
+
+ -- Function: double fmax (double X, double Y)
+ -- Function: float fmaxf (float X, float Y)
+ -- Function: long double fmaxl (long double X, long double Y)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'fmax' function returns the greater of the two values X and Y.
+
+     If an argument is NaN, the other argument is returned.  If both
+     arguments are NaN, NaN is returned.
+
+ -- Function: double fdim (double X, double Y)
+ -- Function: float fdimf (float X, float Y)
+ -- Function: long double fdiml (long double X, long double Y)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'fdim' function returns the positive difference between X and
+     Y.  The positive difference is X - Y if X is greater than Y, and 0
+     otherwise.
+
+     If X, Y, or both are NaN, NaN is returned.
+
+ -- Function: double fma (double X, double Y, double Z)
+ -- Function: float fmaf (float X, float Y, float Z)
+ -- Function: long double fmal (long double X, long double Y, long
+          double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'fma' function performs floating-point multiply-add.  This is
+     the operation (X * Y) + Z, but the intermediate result is not
+     rounded to the destination type.  This can sometimes improve the
+     precision of a calculation.
+
+     This function was introduced because some processors have a special
+     instruction to perform multiply-add.  The C compiler cannot use it
+     directly, because the expression 'x*y + z' is defined to round the
+     intermediate result.  'fma' lets you choose when you want to round
+     only once.
+
+     On processors which do not implement multiply-add in hardware,
+     'fma' can be very slow since it must avoid intermediate rounding.
+     'math.h' defines the symbols 'FP_FAST_FMA', 'FP_FAST_FMAF', and
+     'FP_FAST_FMAL' when the corresponding version of 'fma' is no slower
+     than the expression 'x*y + z'.  In the GNU C Library, this always
+     means the operation is implemented in hardware.
+
+
+File: libc.info,  Node: Complex Numbers,  Next: Operations on Complex,  Prev: Arithmetic Functions,  Up: Arithmetic
+
+20.9 Complex Numbers
+====================
+
+ISO C99 introduces support for complex numbers in C. This is done with a
+new type qualifier, 'complex'.  It is a keyword if and only if
+'complex.h' has been included.  There are three complex types,
+corresponding to the three real types: 'float complex', 'double
+complex', and 'long double complex'.
+
+   To construct complex numbers you need a way to indicate the imaginary
+part of a number.  There is no standard notation for an imaginary
+floating point constant.  Instead, 'complex.h' defines two macros that
+can be used to create complex numbers.
+
+ -- Macro: const float complex _Complex_I
+     This macro is a representation of the complex number "0+1i".
+     Multiplying a real floating-point value by '_Complex_I' gives a
+     complex number whose value is purely imaginary.  You can use this
+     to construct complex constants:
+
+          3.0 + 4.0i = 3.0 + 4.0 * _Complex_I
+
+     Note that '_Complex_I * _Complex_I' has the value '-1', but the
+     type of that value is 'complex'.
+
+'_Complex_I' is a bit of a mouthful.  'complex.h' also defines a shorter
+name for the same constant.
+
+ -- Macro: const float complex I
+     This macro has exactly the same value as '_Complex_I'.  Most of the
+     time it is preferable.  However, it causes problems if you want to
+     use the identifier 'I' for something else.  You can safely write
+
+          #include <complex.h>
+          #undef I
+
+     if you need 'I' for your own purposes.  (In that case we recommend
+     you also define some other short name for '_Complex_I', such as
+     'J'.)
+
+
+File: libc.info,  Node: Operations on Complex,  Next: Parsing of Numbers,  Prev: Complex Numbers,  Up: Arithmetic
+
+20.10 Projections, Conjugates, and Decomposing of Complex Numbers
+=================================================================
+
+ISO C99 also defines functions that perform basic operations on complex
+numbers, such as decomposition and conjugation.  The prototypes for all
+these functions are in 'complex.h'.  All functions are available in
+three variants, one for each of the three complex types.
+
+ -- Function: double creal (complex double Z)
+ -- Function: float crealf (complex float Z)
+ -- Function: long double creall (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the real part of the complex number Z.
+
+ -- Function: double cimag (complex double Z)
+ -- Function: float cimagf (complex float Z)
+ -- Function: long double cimagl (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the imaginary part of the complex number Z.
+
+ -- Function: complex double conj (complex double Z)
+ -- Function: complex float conjf (complex float Z)
+ -- Function: complex long double conjl (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the conjugate value of the complex number Z.
+     The conjugate of a complex number has the same real part and a
+     negated imaginary part.  In other words, 'conj(a + bi) = a + -bi'.
+
+ -- Function: double carg (complex double Z)
+ -- Function: float cargf (complex float Z)
+ -- Function: long double cargl (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the argument of the complex number Z.  The
+     argument of a complex number is the angle in the complex plane
+     between the positive real axis and a line passing through zero and
+     the number.  This angle is measured in the usual fashion and ranges
+     from -pi to pi.
+
+     'carg' has a branch cut along the negative real axis.
+
+ -- Function: complex double cproj (complex double Z)
+ -- Function: complex float cprojf (complex float Z)
+ -- Function: complex long double cprojl (complex long double Z)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     These functions return the projection of the complex value Z onto
+     the Riemann sphere.  Values with an infinite imaginary part are
+     projected to positive infinity on the real axis, even if the real
+     part is NaN. If the real part is infinite, the result is equivalent
+     to
+
+          INFINITY + I * copysign (0.0, cimag (z))
+
+
+File: libc.info,  Node: Parsing of Numbers,  Next: System V Number Conversion,  Prev: Operations on Complex,  Up: Arithmetic
+
+20.11 Parsing of Numbers
+========================
+
+This section describes functions for "reading" integer and
+floating-point numbers from a string.  It may be more convenient in some
+cases to use 'sscanf' or one of the related functions; see *note
+Formatted Input::.  But often you can make a program more robust by
+finding the tokens in the string by hand, then converting the numbers
+one by one.
+
+* Menu:
+
+* Parsing of Integers::         Functions for conversion of integer values.
+* Parsing of Floats::           Functions for conversion of floating-point
+				 values.
+
+
+File: libc.info,  Node: Parsing of Integers,  Next: Parsing of Floats,  Up: Parsing of Numbers
+
+20.11.1 Parsing of Integers
+---------------------------
+
+The 'str' functions are declared in 'stdlib.h' and those beginning with
+'wcs' are declared in 'wchar.h'.  One might wonder about the use of
+'restrict' in the prototypes of the functions in this section.  It is
+seemingly useless but the ISO C standard uses it (for the functions
+defined there) so we have to do it as well.
+
+ -- Function: long int strtol (const char *restrict STRING, char
+          **restrict TAILPTR, int BASE)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'strtol' ("string-to-long") function converts the initial part
+     of STRING to a signed integer, which is returned as a value of type
+     'long int'.
+
+     This function attempts to decompose STRING as follows:
+
+        * A (possibly empty) sequence of whitespace characters.  Which
+          characters are whitespace is determined by the 'isspace'
+          function (*note Classification of Characters::).  These are
+          discarded.
+
+        * An optional plus or minus sign ('+' or '-').
+
+        * A nonempty sequence of digits in the radix specified by BASE.
+
+          If BASE is zero, decimal radix is assumed unless the series of
+          digits begins with '0' (specifying octal radix), or '0x' or
+          '0X' (specifying hexadecimal radix); in other words, the same
+          syntax used for integer constants in C.
+
+          Otherwise BASE must have a value between '2' and '36'.  If
+          BASE is '16', the digits may optionally be preceded by '0x' or
+          '0X'.  If base has no legal value the value returned is '0l'
+          and the global variable 'errno' is set to 'EINVAL'.
+
+        * Any remaining characters in the string.  If TAILPTR is not a
+          null pointer, 'strtol' stores a pointer to this tail in
+          '*TAILPTR'.
+
+     If the string is empty, contains only whitespace, or does not
+     contain an initial substring that has the expected syntax for an
+     integer in the specified BASE, no conversion is performed.  In this
+     case, 'strtol' returns a value of zero and the value stored in
+     '*TAILPTR' is the value of STRING.
+
+     In a locale other than the standard '"C"' locale, this function may
+     recognize additional implementation-dependent syntax.
+
+     If the string has valid syntax for an integer but the value is not
+     representable because of overflow, 'strtol' returns either
+     'LONG_MAX' or 'LONG_MIN' (*note Range of Type::), as appropriate
+     for the sign of the value.  It also sets 'errno' to 'ERANGE' to
+     indicate there was overflow.
+
+     You should not check for errors by examining the return value of
+     'strtol', because the string might be a valid representation of
+     '0l', 'LONG_MAX', or 'LONG_MIN'.  Instead, check whether TAILPTR
+     points to what you expect after the number (e.g.  ''\0'' if the
+     string should end after the number).  You also need to clear ERRNO
+     before the call and check it afterward, in case there was overflow.
+
+     There is an example at the end of this section.
+
+ -- Function: long int wcstol (const wchar_t *restrict STRING, wchar_t
+          **restrict TAILPTR, int BASE)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'wcstol' function is equivalent to the 'strtol' function in
+     nearly all aspects but handles wide character strings.
+
+     The 'wcstol' function was introduced in Amendment 1 of ISO C90.
+
+ -- Function: unsigned long int strtoul (const char *retrict STRING,
+          char **restrict TAILPTR, int BASE)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'strtoul' ("string-to-unsigned-long") function is like 'strtol'
+     except it converts to an 'unsigned long int' value.  The syntax is
+     the same as described above for 'strtol'.  The value returned on
+     overflow is 'ULONG_MAX' (*note Range of Type::).
+
+     If STRING depicts a negative number, 'strtoul' acts the same as
+     STRTOL but casts the result to an unsigned integer.  That means for
+     example that 'strtoul' on '"-1"' returns 'ULONG_MAX' and an input
+     more negative than 'LONG_MIN' returns ('ULONG_MAX' + 1) / 2.
+
+     'strtoul' sets ERRNO to 'EINVAL' if BASE is out of range, or
+     'ERANGE' on overflow.
+
+ -- Function: unsigned long int wcstoul (const wchar_t *restrict STRING,
+          wchar_t **restrict TAILPTR, int BASE)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'wcstoul' function is equivalent to the 'strtoul' function in
+     nearly all aspects but handles wide character strings.
+
+     The 'wcstoul' function was introduced in Amendment 1 of ISO C90.
+
+ -- Function: long long int strtoll (const char *restrict STRING, char
+          **restrict TAILPTR, int BASE)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'strtoll' function is like 'strtol' except that it returns a
+     'long long int' value, and accepts numbers with a correspondingly
+     larger range.
+
+     If the string has valid syntax for an integer but the value is not
+     representable because of overflow, 'strtoll' returns either
+     'LLONG_MAX' or 'LLONG_MIN' (*note Range of Type::), as appropriate
+     for the sign of the value.  It also sets 'errno' to 'ERANGE' to
+     indicate there was overflow.
+
+     The 'strtoll' function was introduced in ISO C99.
+
+ -- Function: long long int wcstoll (const wchar_t *restrict STRING,
+          wchar_t **restrict TAILPTR, int BASE)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'wcstoll' function is equivalent to the 'strtoll' function in
+     nearly all aspects but handles wide character strings.
+
+     The 'wcstoll' function was introduced in Amendment 1 of ISO C90.
+
+ -- Function: long long int strtoq (const char *restrict STRING, char
+          **restrict TAILPTR, int BASE)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     'strtoq' ("string-to-quad-word") is the BSD name for 'strtoll'.
+
+ -- Function: long long int wcstoq (const wchar_t *restrict STRING,
+          wchar_t **restrict TAILPTR, int BASE)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'wcstoq' function is equivalent to the 'strtoq' function in
+     nearly all aspects but handles wide character strings.
+
+     The 'wcstoq' function is a GNU extension.
+
+ -- Function: unsigned long long int strtoull (const char *restrict
+          STRING, char **restrict TAILPTR, int BASE)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'strtoull' function is related to 'strtoll' the same way
+     'strtoul' is related to 'strtol'.
+
+     The 'strtoull' function was introduced in ISO C99.
+
+ -- Function: unsigned long long int wcstoull (const wchar_t *restrict
+          STRING, wchar_t **restrict TAILPTR, int BASE)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'wcstoull' function is equivalent to the 'strtoull' function in
+     nearly all aspects but handles wide character strings.
+
+     The 'wcstoull' function was introduced in Amendment 1 of ISO C90.
+
+ -- Function: unsigned long long int strtouq (const char *restrict
+          STRING, char **restrict TAILPTR, int BASE)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     'strtouq' is the BSD name for 'strtoull'.
+
+ -- Function: unsigned long long int wcstouq (const wchar_t *restrict
+          STRING, wchar_t **restrict TAILPTR, int BASE)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'wcstouq' function is equivalent to the 'strtouq' function in
+     nearly all aspects but handles wide character strings.
+
+     The 'wcstouq' function is a GNU extension.
+
+ -- Function: intmax_t strtoimax (const char *restrict STRING, char
+          **restrict TAILPTR, int BASE)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'strtoimax' function is like 'strtol' except that it returns a
+     'intmax_t' value, and accepts numbers of a corresponding range.
+
+     If the string has valid syntax for an integer but the value is not
+     representable because of overflow, 'strtoimax' returns either
+     'INTMAX_MAX' or 'INTMAX_MIN' (*note Integers::), as appropriate for
+     the sign of the value.  It also sets 'errno' to 'ERANGE' to
+     indicate there was overflow.
+
+     See *note Integers:: for a description of the 'intmax_t' type.  The
+     'strtoimax' function was introduced in ISO C99.
+
+ -- Function: intmax_t wcstoimax (const wchar_t *restrict STRING,
+          wchar_t **restrict TAILPTR, int BASE)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'wcstoimax' function is equivalent to the 'strtoimax' function
+     in nearly all aspects but handles wide character strings.
+
+     The 'wcstoimax' function was introduced in ISO C99.
+
+ -- Function: uintmax_t strtoumax (const char *restrict STRING, char
+          **restrict TAILPTR, int BASE)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'strtoumax' function is related to 'strtoimax' the same way
+     that 'strtoul' is related to 'strtol'.
+
+     See *note Integers:: for a description of the 'intmax_t' type.  The
+     'strtoumax' function was introduced in ISO C99.
+
+ -- Function: uintmax_t wcstoumax (const wchar_t *restrict STRING,
+          wchar_t **restrict TAILPTR, int BASE)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'wcstoumax' function is equivalent to the 'strtoumax' function
+     in nearly all aspects but handles wide character strings.
+
+     The 'wcstoumax' function was introduced in ISO C99.
+
+ -- Function: long int atol (const char *STRING)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     This function is similar to the 'strtol' function with a BASE
+     argument of '10', except that it need not detect overflow errors.
+     The 'atol' function is provided mostly for compatibility with
+     existing code; using 'strtol' is more robust.
+
+ -- Function: int atoi (const char *STRING)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     This function is like 'atol', except that it returns an 'int'.  The
+     'atoi' function is also considered obsolete; use 'strtol' instead.
+
+ -- Function: long long int atoll (const char *STRING)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     This function is similar to 'atol', except it returns a 'long long
+     int'.
+
+     The 'atoll' function was introduced in ISO C99.  It too is obsolete
+     (despite having just been added); use 'strtoll' instead.
+
+   All the functions mentioned in this section so far do not handle
+alternative representations of characters as described in the locale
+data.  Some locales specify thousands separator and the way they have to
+be used which can help to make large numbers more readable.  To read
+such numbers one has to use the 'scanf' functions with the ''' flag.
+
+   Here is a function which parses a string as a sequence of integers
+and returns the sum of them:
+
+     int
+     sum_ints_from_string (char *string)
+     {
+       int sum = 0;
+
+       while (1) {
+         char *tail;
+         int next;
+
+         /* Skip whitespace by hand, to detect the end.  */
+         while (isspace (*string)) string++;
+         if (*string == 0)
+           break;
+
+         /* There is more nonwhitespace,  */
+         /* so it ought to be another number.  */
+         errno = 0;
+         /* Parse it.  */
+         next = strtol (string, &tail, 0);
+         /* Add it in, if not overflow.  */
+         if (errno)
+           printf ("Overflow\n");
+         else
+           sum += next;
+         /* Advance past it.  */
+         string = tail;
+       }
+
+       return sum;
+     }
+
+
+File: libc.info,  Node: Parsing of Floats,  Prev: Parsing of Integers,  Up: Parsing of Numbers
+
+20.11.2 Parsing of Floats
+-------------------------
+
+The 'str' functions are declared in 'stdlib.h' and those beginning with
+'wcs' are declared in 'wchar.h'.  One might wonder about the use of
+'restrict' in the prototypes of the functions in this section.  It is
+seemingly useless but the ISO C standard uses it (for the functions
+defined there) so we have to do it as well.
+
+ -- Function: double strtod (const char *restrict STRING, char
+          **restrict TAILPTR)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'strtod' ("string-to-double") function converts the initial
+     part of STRING to a floating-point number, which is returned as a
+     value of type 'double'.
+
+     This function attempts to decompose STRING as follows:
+
+        * A (possibly empty) sequence of whitespace characters.  Which
+          characters are whitespace is determined by the 'isspace'
+          function (*note Classification of Characters::).  These are
+          discarded.
+
+        * An optional plus or minus sign ('+' or '-').
+
+        * A floating point number in decimal or hexadecimal format.  The
+          decimal format is:
+
+             - A nonempty sequence of digits optionally containing a
+               decimal-point character--normally '.', but it depends on
+               the locale (*note General Numeric::).
+
+             - An optional exponent part, consisting of a character 'e'
+               or 'E', an optional sign, and a sequence of digits.
+
+          The hexadecimal format is as follows:
+
+             - A 0x or 0X followed by a nonempty sequence of hexadecimal
+               digits optionally containing a decimal-point
+               character--normally '.', but it depends on the locale
+               (*note General Numeric::).
+
+             - An optional binary-exponent part, consisting of a
+               character 'p' or 'P', an optional sign, and a sequence of
+               digits.
+
+        * Any remaining characters in the string.  If TAILPTR is not a
+          null pointer, a pointer to this tail of the string is stored
+          in '*TAILPTR'.
+
+     If the string is empty, contains only whitespace, or does not
+     contain an initial substring that has the expected syntax for a
+     floating-point number, no conversion is performed.  In this case,
+     'strtod' returns a value of zero and the value returned in
+     '*TAILPTR' is the value of STRING.
+
+     In a locale other than the standard '"C"' or '"POSIX"' locales,
+     this function may recognize additional locale-dependent syntax.
+
+     If the string has valid syntax for a floating-point number but the
+     value is outside the range of a 'double', 'strtod' will signal
+     overflow or underflow as described in *note Math Error Reporting::.
+
+     'strtod' recognizes four special input strings.  The strings
+     '"inf"' and '"infinity"' are converted to oo, or to the largest
+     representable value if the floating-point format doesn't support
+     infinities.  You can prepend a '"+"' or '"-"' to specify the sign.
+     Case is ignored when scanning these strings.
+
+     The strings '"nan"' and '"nan(CHARS...)"' are converted to NaN.
+     Again, case is ignored.  If CHARS... are provided, they are used in
+     some unspecified fashion to select a particular representation of
+     NaN (there can be several).
+
+     Since zero is a valid result as well as the value returned on
+     error, you should check for errors in the same way as for 'strtol',
+     by examining ERRNO and TAILPTR.
+
+ -- Function: float strtof (const char *STRING, char **TAILPTR)
+ -- Function: long double strtold (const char *STRING, char **TAILPTR)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     These functions are analogous to 'strtod', but return 'float' and
+     'long double' values respectively.  They report errors in the same
+     way as 'strtod'.  'strtof' can be substantially faster than
+     'strtod', but has less precision; conversely, 'strtold' can be much
+     slower but has more precision (on systems where 'long double' is a
+     separate type).
+
+     These functions have been GNU extensions and are new to ISO C99.
+
+ -- Function: double wcstod (const wchar_t *restrict STRING, wchar_t
+          **restrict TAILPTR)
+ -- Function: float wcstof (const wchar_t *STRING, wchar_t **TAILPTR)
+ -- Function: long double wcstold (const wchar_t *STRING, wchar_t
+          **TAILPTR)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'wcstod', 'wcstof', and 'wcstol' functions are equivalent in
+     nearly all aspect to the 'strtod', 'strtof', and 'strtold'
+     functions but it handles wide character string.
+
+     The 'wcstod' function was introduced in Amendment 1 of ISO C90.
+     The 'wcstof' and 'wcstold' functions were introduced in ISO C99.
+
+ -- Function: double atof (const char *STRING)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     This function is similar to the 'strtod' function, except that it
+     need not detect overflow and underflow errors.  The 'atof' function
+     is provided mostly for compatibility with existing code; using
+     'strtod' is more robust.
+
+   The GNU C Library also provides '_l' versions of these functions,
+which take an additional argument, the locale to use in conversion.
+
+   See also *note Parsing of Integers::.
+
+
+File: libc.info,  Node: System V Number Conversion,  Prev: Parsing of Numbers,  Up: Arithmetic
+
+20.12 Old-fashioned System V number-to-string functions
+=======================================================
+
+The old System V C library provided three functions to convert numbers
+to strings, with unusual and hard-to-use semantics.  The GNU C Library
+also provides these functions and some natural extensions.
+
+   These functions are only available in the GNU C Library and on
+systems descended from AT&T Unix.  Therefore, unless these functions do
+precisely what you need, it is better to use 'sprintf', which is
+standard.
+
+   All these functions are defined in 'stdlib.h'.
+
+ -- Function: char * ecvt (double VALUE, int NDIGIT, int *DECPT, int
+          *NEG)
+     Preliminary: | MT-Unsafe race:ecvt | AS-Unsafe | AC-Safe | *Note
+     POSIX Safety Concepts::.
+
+     The function 'ecvt' converts the floating-point number VALUE to a
+     string with at most NDIGIT decimal digits.  The returned string
+     contains no decimal point or sign.  The first digit of the string
+     is non-zero (unless VALUE is actually zero) and the last digit is
+     rounded to nearest.  '*DECPT' is set to the index in the string of
+     the first digit after the decimal point.  '*NEG' is set to a
+     nonzero value if VALUE is negative, zero otherwise.
+
+     If NDIGIT decimal digits would exceed the precision of a 'double'
+     it is reduced to a system-specific value.
+
+     The returned string is statically allocated and overwritten by each
+     call to 'ecvt'.
+
+     If VALUE is zero, it is implementation defined whether '*DECPT' is
+     '0' or '1'.
+
+     For example: 'ecvt (12.3, 5, &d, &n)' returns '"12300"' and sets D
+     to '2' and N to '0'.
+
+ -- Function: char * fcvt (double VALUE, int NDIGIT, int *DECPT, int
+          *NEG)
+     Preliminary: | MT-Unsafe race:fcvt | AS-Unsafe heap | AC-Unsafe mem
      | *Note POSIX Safety Concepts::.
 
-     This function is similar to `fgetgrent' in that it reads the next
-     user entry from STREAM.  But the result is returned in the
-     structure pointed to by RESULT_BUF.  The first BUFLEN bytes of the
-     additional buffer pointed to by BUFFER are used to contain
-     additional information, normally strings which are pointed to by
-     the elements of the result structure.
+     The function 'fcvt' is like 'ecvt', but NDIGIT specifies the number
+     of digits after the decimal point.  If NDIGIT is less than zero,
+     VALUE is rounded to the NDIGIT+1'th place to the left of the
+     decimal point.  For example, if NDIGIT is '-1', VALUE will be
+     rounded to the nearest 10.  If NDIGIT is negative and larger than
+     the number of digits to the left of the decimal point in VALUE,
+     VALUE will be rounded to one significant digit.
 
-     This stream must correspond to a file in the same format as the
-     standard group database file.
+     If NDIGIT decimal digits would exceed the precision of a 'double'
+     it is reduced to a system-specific value.
 
-     If the function returns zero RESULT points to the structure with
-     the wanted data (normally this is in RESULT_BUF).  If errors
-     occurred the return value is non-zero and RESULT contains a null
-     pointer.
+     The returned string is statically allocated and overwritten by each
+     call to 'fcvt'.
 
-   The way to scan all the entries in the group database is with
-`setgrent', `getgrent', and `endgrent'.
+ -- Function: char * gcvt (double VALUE, int NDIGIT, char *BUF)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
- -- Function: void setgrent (void)
-     Preliminary: | MT-Unsafe race:grent locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
-     Safety Concepts::.
+     'gcvt' is functionally equivalent to 'sprintf(buf, "%*g", ndigit,
+     value'.  It is provided only for compatibility's sake.  It returns
+     BUF.
 
-     This function initializes a stream for reading from the group data
-     base.  You use this stream by calling `getgrent' or `getgrent_r'.
+     If NDIGIT decimal digits would exceed the precision of a 'double'
+     it is reduced to a system-specific value.
 
- -- Function: struct group * getgrent (void)
-     Preliminary: | MT-Unsafe race:grent race:grentbuf locale |
-     AS-Unsafe dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem
-     | *Note POSIX Safety Concepts::.
+   As extensions, the GNU C Library provides versions of these three
+functions that take 'long double' arguments.
 
-     The `getgrent' function reads the next entry from the stream
-     initialized by `setgrent'.  It returns a pointer to the entry.  The
-     structure is statically allocated and is overwritten on subsequent
-     calls to `getgrent'.  You must copy the contents of the structure
-     if you wish to save the information.
+ -- Function: char * qecvt (long double VALUE, int NDIGIT, int *DECPT,
+          int *NEG)
+     Preliminary: | MT-Unsafe race:qecvt | AS-Unsafe | AC-Safe | *Note
+     POSIX Safety Concepts::.
 
- -- Function: int getgrent_r (struct group *RESULT_BUF, char *BUFFER,
-          size_t BUFLEN, struct group **RESULT)
-     Preliminary: | MT-Unsafe race:grent locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
-     Safety Concepts::.
+     This function is equivalent to 'ecvt' except that it takes a 'long
+     double' for the first parameter and that NDIGIT is restricted by
+     the precision of a 'long double'.
 
-     This function is similar to `getgrent' in that it returns the next
-     entry from the stream initialized by `setgrent'.  Like
-     `fgetgrent_r', it places the result in user-supplied buffers
-     pointed to RESULT_BUF and BUFFER.
+ -- Function: char * qfcvt (long double VALUE, int NDIGIT, int *DECPT,
+          int *NEG)
+     Preliminary: | MT-Unsafe race:qfcvt | AS-Unsafe heap | AC-Unsafe
+     mem | *Note POSIX Safety Concepts::.
 
-     If the function returns zero RESULT contains a pointer to the data
-     (normally equal to RESULT_BUF).  If errors occurred the return
-     value is non-zero and RESULT contains a null pointer.
+     This function is equivalent to 'fcvt' except that it takes a 'long
+     double' for the first parameter and that NDIGIT is restricted by
+     the precision of a 'long double'.
 
- -- Function: void endgrent (void)
-     Preliminary: | MT-Unsafe race:grent locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
-     Safety Concepts::.
+ -- Function: char * qgcvt (long double VALUE, int NDIGIT, char *BUF)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-     This function closes the internal stream used by `getgrent' or
-     `getgrent_r'.
+     This function is equivalent to 'gcvt' except that it takes a 'long
+     double' for the first parameter and that NDIGIT is restricted by
+     the precision of a 'long double'.
+
+   The 'ecvt' and 'fcvt' functions, and their 'long double' equivalents,
+all return a string located in a static buffer which is overwritten by
+the next call to the function.  The GNU C Library provides another set
+of extended functions which write the converted string into a
+user-supplied buffer.  These have the conventional '_r' suffix.
+
+   'gcvt_r' is not necessary, because 'gcvt' already uses a
+user-supplied buffer.
+
+ -- Function: int ecvt_r (double VALUE, int NDIGIT, int *DECPT, int
+          *NEG, char *BUF, size_t LEN)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'ecvt_r' function is the same as 'ecvt', except that it places
+     its result into the user-specified buffer pointed to by BUF, with
+     length LEN.  The return value is '-1' in case of an error and zero
+     otherwise.
+
+     This function is a GNU extension.
+
+ -- Function: int fcvt_r (double VALUE, int NDIGIT, int *DECPT, int
+          *NEG, char *BUF, size_t LEN)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'fcvt_r' function is the same as 'fcvt', except that it places
+     its result into the user-specified buffer pointed to by BUF, with
+     length LEN.  The return value is '-1' in case of an error and zero
+     otherwise.
+
+     This function is a GNU extension.
+
+ -- Function: int qecvt_r (long double VALUE, int NDIGIT, int *DECPT,
+          int *NEG, char *BUF, size_t LEN)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'qecvt_r' function is the same as 'qecvt', except that it
+     places its result into the user-specified buffer pointed to by BUF,
+     with length LEN.  The return value is '-1' in case of an error and
+     zero otherwise.
+
+     This function is a GNU extension.
+
+ -- Function: int qfcvt_r (long double VALUE, int NDIGIT, int *DECPT,
+          int *NEG, char *BUF, size_t LEN)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'qfcvt_r' function is the same as 'qfcvt', except that it
+     places its result into the user-specified buffer pointed to by BUF,
+     with length LEN.  The return value is '-1' in case of an error and
+     zero otherwise.
+
+     This function is a GNU extension.
 
 
-File: libc.info,  Node: Database Example,  Next: Netgroup Database,  Prev: Group Database,  Up: Users and Groups
+File: libc.info,  Node: Date and Time,  Next: Resource Usage And Limitation,  Prev: Arithmetic,  Up: Top
 
-29.15 User and Group Database Example
-=====================================
+21 Date and Time
+****************
 
-Here is an example program showing the use of the system database
-inquiry functions.  The program prints some information about the user
-running the program.
+This chapter describes functions for manipulating dates and times,
+including functions for determining what time it is and conversion
+between different time representations.
+
+* Menu:
+
+* Time Basics::                 Concepts and definitions.
+* Elapsed Time::                Data types to represent elapsed times
+* Processor And CPU Time::      Time a program has spent executing.
+* Calendar Time::               Manipulation of "real" dates and times.
+* Setting an Alarm::            Sending a signal after a specified time.
+* Sleeping::                    Waiting for a period of time.
+
+
+File: libc.info,  Node: Time Basics,  Next: Elapsed Time,  Up: Date and Time
+
+21.1 Time Basics
+================
+
+Discussing time in a technical manual can be difficult because the word
+"time" in English refers to lots of different things.  In this manual,
+we use a rigorous terminology to avoid confusion, and the only thing we
+use the simple word "time" for is to talk about the abstract concept.
+
+   A "calendar time" is a point in the time continuum, for example
+November 4, 1990 at 18:02.5 UTC. Sometimes this is called "absolute
+time".
+
+   We don't speak of a "date", because that is inherent in a calendar
+time.
+
+   An "interval" is a contiguous part of the time continuum between two
+calendar times, for example the hour between 9:00 and 10:00 on July 4,
+1980.
+
+   An "elapsed time" is the length of an interval, for example, 35
+minutes.  People sometimes sloppily use the word "interval" to refer to
+the elapsed time of some interval.
+
+   An "amount of time" is a sum of elapsed times, which need not be of
+any specific intervals.  For example, the amount of time it takes to
+read a book might be 9 hours, independently of when and in how many
+sittings it is read.
+
+   A "period" is the elapsed time of an interval between two events,
+especially when they are part of a sequence of regularly repeating
+events.
+
+   "CPU time" is like calendar time, except that it is based on the
+subset of the time continuum when a particular process is actively using
+a CPU. CPU time is, therefore, relative to a process.
+
+   "Processor time" is an amount of time that a CPU is in use.  In fact,
+it's a basic system resource, since there's a limit to how much can
+exist in any given interval (that limit is the elapsed time of the
+interval times the number of CPUs in the processor).  People often call
+this CPU time, but we reserve the latter term in this manual for the
+definition above.
+
+
+File: libc.info,  Node: Elapsed Time,  Next: Processor And CPU Time,  Prev: Time Basics,  Up: Date and Time
+
+21.2 Elapsed Time
+=================
+
+One way to represent an elapsed time is with a simple arithmetic data
+type, as with the following function to compute the elapsed time between
+two calendar times.  This function is declared in 'time.h'.
+
+ -- Function: double difftime (time_t TIME1, time_t TIME0)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'difftime' function returns the number of seconds of elapsed
+     time between calendar time TIME1 and calendar time TIME0, as a
+     value of type 'double'.  The difference ignores leap seconds unless
+     leap second support is enabled.
+
+     In the GNU C Library, you can simply subtract 'time_t' values.  But
+     on other systems, the 'time_t' data type might use some other
+     encoding where subtraction doesn't work directly.
+
+   The GNU C Library provides two data types specifically for
+representing an elapsed time.  They are used by various GNU C Library
+functions, and you can use them for your own purposes too.  They're
+exactly the same except that one has a resolution in microseconds, and
+the other, newer one, is in nanoseconds.
+
+ -- Data Type: struct timeval
+     The 'struct timeval' structure represents an elapsed time.  It is
+     declared in 'sys/time.h' and has the following members:
+
+     'long int tv_sec'
+          This represents the number of whole seconds of elapsed time.
+
+     'long int tv_usec'
+          This is the rest of the elapsed time (a fraction of a second),
+          represented as the number of microseconds.  It is always less
+          than one million.
+
+ -- Data Type: struct timespec
+     The 'struct timespec' structure represents an elapsed time.  It is
+     declared in 'time.h' and has the following members:
+
+     'long int tv_sec'
+          This represents the number of whole seconds of elapsed time.
+
+     'long int tv_nsec'
+          This is the rest of the elapsed time (a fraction of a second),
+          represented as the number of nanoseconds.  It is always less
+          than one billion.
+
+   It is often necessary to subtract two values of type 'struct timeval'
+or 'struct timespec'.  Here is the best way to do this.  It works even
+on some peculiar operating systems where the 'tv_sec' member has an
+unsigned type.
 
 
-     #include <grp.h>
-     #include <pwd.h>
-     #include <sys/types.h>
-     #include <unistd.h>
-     #include <stdlib.h>
+     /* Subtract the 'struct timeval' values X and Y,
+        storing the result in RESULT.
+        Return 1 if the difference is negative, otherwise 0. */
+
+     int
+     timeval_subtract (result, x, y)
+          struct timeval *result, *x, *y;
+     {
+       /* Perform the carry for the later subtraction by updating Y. */
+       if (x->tv_usec < y->tv_usec) {
+         int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
+         y->tv_usec -= 1000000 * nsec;
+         y->tv_sec += nsec;
+       }
+       if (x->tv_usec - y->tv_usec > 1000000) {
+         int nsec = (x->tv_usec - y->tv_usec) / 1000000;
+         y->tv_usec += 1000000 * nsec;
+         y->tv_sec -= nsec;
+       }
+
+       /* Compute the time remaining to wait.
+          'tv_usec' is certainly positive. */
+       result->tv_sec = x->tv_sec - y->tv_sec;
+       result->tv_usec = x->tv_usec - y->tv_usec;
+
+       /* Return 1 if result is negative. */
+       return x->tv_sec < y->tv_sec;
+     }
+
+   Common functions that use 'struct timeval' are 'gettimeofday' and
+'settimeofday'.
+
+   There are no GNU C Library functions specifically oriented toward
+dealing with elapsed times, but the calendar time, processor time, and
+alarm and sleeping functions have a lot to do with them.
+
+
+File: libc.info,  Node: Processor And CPU Time,  Next: Calendar Time,  Prev: Elapsed Time,  Up: Date and Time
+
+21.3 Processor And CPU Time
+===========================
+
+If you're trying to optimize your program or measure its efficiency,
+it's very useful to know how much processor time it uses.  For that,
+calendar time and elapsed times are useless because a process may spend
+time waiting for I/O or for other processes to use the CPU. However, you
+can get the information with the functions in this section.
+
+   CPU time (*note Time Basics::) is represented by the data type
+'clock_t', which is a number of "clock ticks".  It gives the total
+amount of time a process has actively used a CPU since some arbitrary
+event.  On GNU systems, that event is the creation of the process.
+While arbitrary in general, the event is always the same event for any
+particular process, so you can always measure how much time on the CPU a
+particular computation takes by examining the process' CPU time before
+and after the computation.
+
+   On GNU/Linux and GNU/Hurd systems, 'clock_t' is equivalent to 'long
+int' and 'CLOCKS_PER_SEC' is an integer value.  But in other systems,
+both 'clock_t' and the macro 'CLOCKS_PER_SEC' can be either integer or
+floating-point types.  Casting CPU time values to 'double', as in the
+example above, makes sure that operations such as arithmetic and
+printing work properly and consistently no matter what the underlying
+representation is.
+
+   Note that the clock can wrap around.  On a 32bit system with
+'CLOCKS_PER_SEC' set to one million this function will return the same
+value approximately every 72 minutes.
+
+   For additional functions to examine a process' use of processor time,
+and to control it, see *note Resource Usage And Limitation::.
+
+* Menu:
+
+* CPU Time::                    The 'clock' function.
+* Processor Time::              The 'times' function.
+
+
+File: libc.info,  Node: CPU Time,  Next: Processor Time,  Up: Processor And CPU Time
+
+21.3.1 CPU Time Inquiry
+-----------------------
+
+To get a process' CPU time, you can use the 'clock' function.  This
+facility is declared in the header file 'time.h'.
+
+   In typical usage, you call the 'clock' function at the beginning and
+end of the interval you want to time, subtract the values, and then
+divide by 'CLOCKS_PER_SEC' (the number of clock ticks per second) to get
+processor time, like this:
+
+     #include <time.h>
+
+     clock_t start, end;
+     double cpu_time_used;
+
+     start = clock();
+     ... /* Do the work. */
+     end = clock();
+     cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
+
+   Do not use a single CPU time as an amount of time; it doesn't work
+that way.  Either do a subtraction as shown above or query processor
+time directly.  *Note Processor Time::.
+
+   Different computers and operating systems vary wildly in how they
+keep track of CPU time.  It's common for the internal processor clock to
+have a resolution somewhere between a hundredth and millionth of a
+second.
+
+ -- Macro: int CLOCKS_PER_SEC
+     The value of this macro is the number of clock ticks per second
+     measured by the 'clock' function.  POSIX requires that this value
+     be one million independent of the actual resolution.
+
+ -- Data Type: clock_t
+     This is the type of the value returned by the 'clock' function.
+     Values of type 'clock_t' are numbers of clock ticks.
+
+ -- Function: clock_t clock (void)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function returns the calling process' current CPU time.  If
+     the CPU time is not available or cannot be represented, 'clock'
+     returns the value '(clock_t)(-1)'.
+
+
+File: libc.info,  Node: Processor Time,  Prev: CPU Time,  Up: Processor And CPU Time
+
+21.3.2 Processor Time Inquiry
+-----------------------------
+
+The 'times' function returns information about a process' consumption of
+processor time in a 'struct tms' object, in addition to the process' CPU
+time.  *Note Time Basics::.  You should include the header file
+'sys/times.h' to use this facility.
+
+ -- Data Type: struct tms
+     The 'tms' structure is used to return information about process
+     times.  It contains at least the following members:
+
+     'clock_t tms_utime'
+          This is the total processor time the calling process has used
+          in executing the instructions of its program.
+
+     'clock_t tms_stime'
+          This is the processor time the system has used on behalf of
+          the calling process.
+
+     'clock_t tms_cutime'
+          This is the sum of the 'tms_utime' values and the 'tms_cutime'
+          values of all terminated child processes of the calling
+          process, whose status has been reported to the parent process
+          by 'wait' or 'waitpid'; see *note Process Completion::.  In
+          other words, it represents the total processor time used in
+          executing the instructions of all the terminated child
+          processes of the calling process, excluding child processes
+          which have not yet been reported by 'wait' or 'waitpid'.
+
+     'clock_t tms_cstime'
+          This is similar to 'tms_cutime', but represents the total
+          processor time system has used on behalf of all the terminated
+          child processes of the calling process.
+
+     All of the times are given in numbers of clock ticks.  Unlike CPU
+     time, these are the actual amounts of time; not relative to any
+     event.  *Note Creating a Process::.
+
+ -- Macro: int CLK_TCK
+     This is an obsolete name for the number of clock ticks per second.
+     Use 'sysconf (_SC_CLK_TCK)' instead.
+
+ -- Function: clock_t times (struct tms *BUFFER)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'times' function stores the processor time information for the
+     calling process in BUFFER.
+
+     The return value is the number of clock ticks since an arbitrary
+     point in the past, e.g.  since system start-up.  'times' returns
+     '(clock_t)(-1)' to indicate failure.
+
+   *Portability Note:* The 'clock' function described in *note CPU
+Time:: is specified by the ISO C standard.  The 'times' function is a
+feature of POSIX.1.  On GNU systems, the CPU time is defined to be
+equivalent to the sum of the 'tms_utime' and 'tms_stime' fields returned
+by 'times'.
+
+
+File: libc.info,  Node: Calendar Time,  Next: Setting an Alarm,  Prev: Processor And CPU Time,  Up: Date and Time
+
+21.4 Calendar Time
+==================
+
+This section describes facilities for keeping track of calendar time.
+*Note Time Basics::.
+
+   The GNU C Library represents calendar time three ways:
+
+   * "Simple time" (the 'time_t' data type) is a compact representation,
+     typically giving the number of seconds of elapsed time since some
+     implementation-specific base time.
+
+   * There is also a "high-resolution time" representation.  Like simple
+     time, this represents a calendar time as an elapsed time since a
+     base time, but instead of measuring in whole seconds, it uses a
+     'struct timeval' data type, which includes fractions of a second.
+     Use this time representation instead of simple time when you need
+     greater precision.
+
+   * "Local time" or "broken-down time" (the 'struct tm' data type)
+     represents a calendar time as a set of components specifying the
+     year, month, and so on in the Gregorian calendar, for a specific
+     time zone.  This calendar time representation is usually used only
+     to communicate with people.
+
+* Menu:
+
+* Simple Calendar Time::        Facilities for manipulating calendar time.
+* High-Resolution Calendar::    A time representation with greater precision.
+* Broken-down Time::            Facilities for manipulating local time.
+* High Accuracy Clock::         Maintaining a high accuracy system clock.
+* Formatting Calendar Time::    Converting times to strings.
+* Parsing Date and Time::       Convert textual time and date information back
+                                 into broken-down time values.
+* TZ Variable::                 How users specify the time zone.
+* Time Zone Functions::         Functions to examine or specify the time zone.
+* Time Functions Example::      An example program showing use of some of
+				 the time functions.
+
+
+File: libc.info,  Node: Simple Calendar Time,  Next: High-Resolution Calendar,  Up: Calendar Time
+
+21.4.1 Simple Calendar Time
+---------------------------
+
+This section describes the 'time_t' data type for representing calendar
+time as simple time, and the functions which operate on simple time
+objects.  These facilities are declared in the header file 'time.h'.
+
+ -- Data Type: time_t
+     This is the data type used to represent simple time.  Sometimes, it
+     also represents an elapsed time.  When interpreted as a calendar
+     time value, it represents the number of seconds elapsed since
+     00:00:00 on January 1, 1970, Coordinated Universal Time.  (This
+     calendar time is sometimes referred to as the "epoch".)  POSIX
+     requires that this count not include leap seconds, but on some
+     systems this count includes leap seconds if you set 'TZ' to certain
+     values (*note TZ Variable::).
+
+     Note that a simple time has no concept of local time zone.
+     Calendar Time T is the same instant in time regardless of where on
+     the globe the computer is.
+
+     In the GNU C Library, 'time_t' is equivalent to 'long int'.  In
+     other systems, 'time_t' might be either an integer or
+     floating-point type.
+
+   The function 'difftime' tells you the elapsed time between two simple
+calendar times, which is not always as easy to compute as just
+subtracting.  *Note Elapsed Time::.
+
+ -- Function: time_t time (time_t *RESULT)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'time' function returns the current calendar time as a value of
+     type 'time_t'.  If the argument RESULT is not a null pointer, the
+     calendar time value is also stored in '*RESULT'.  If the current
+     calendar time is not available, the value '(time_t)(-1)' is
+     returned.
+
+ -- Function: int stime (const time_t *NEWTIME)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'stime' sets the system clock, i.e., it tells the system that the
+     current calendar time is NEWTIME, where 'newtime' is interpreted as
+     described in the above definition of 'time_t'.
+
+     'settimeofday' is a newer function which sets the system clock to
+     better than one second precision.  'settimeofday' is generally a
+     better choice than 'stime'.  *Note High-Resolution Calendar::.
+
+     Only the superuser can set the system clock.
+
+     If the function succeeds, the return value is zero.  Otherwise, it
+     is '-1' and 'errno' is set accordingly:
+
+     'EPERM'
+          The process is not superuser.
+
+
+File: libc.info,  Node: High-Resolution Calendar,  Next: Broken-down Time,  Prev: Simple Calendar Time,  Up: Calendar Time
+
+21.4.2 High-Resolution Calendar
+-------------------------------
+
+The 'time_t' data type used to represent simple times has a resolution
+of only one second.  Some applications need more precision.
+
+   So, the GNU C Library also contains functions which are capable of
+representing calendar times to a higher resolution than one second.  The
+functions and the associated data types described in this section are
+declared in 'sys/time.h'.
+
+ -- Data Type: struct timezone
+     The 'struct timezone' structure is used to hold minimal information
+     about the local time zone.  It has the following members:
+
+     'int tz_minuteswest'
+          This is the number of minutes west of UTC.
+
+     'int tz_dsttime'
+          If nonzero, Daylight Saving Time applies during some part of
+          the year.
+
+     The 'struct timezone' type is obsolete and should never be used.
+     Instead, use the facilities described in *note Time Zone
+     Functions::.
+
+ -- Function: int gettimeofday (struct timeval *TP, struct timezone
+          *TZP)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'gettimeofday' function returns the current calendar time as
+     the elapsed time since the epoch in the 'struct timeval' structure
+     indicated by TP.  (*note Elapsed Time:: for a description of
+     'struct timeval').  Information about the time zone is returned in
+     the structure pointed at TZP.  If the TZP argument is a null
+     pointer, time zone information is ignored.
+
+     The return value is '0' on success and '-1' on failure.  The
+     following 'errno' error condition is defined for this function:
+
+     'ENOSYS'
+          The operating system does not support getting time zone
+          information, and TZP is not a null pointer.  GNU systems do
+          not support using 'struct timezone' to represent time zone
+          information; that is an obsolete feature of 4.3 BSD. Instead,
+          use the facilities described in *note Time Zone Functions::.
+
+ -- Function: int settimeofday (const struct timeval *TP, const struct
+          timezone *TZP)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'settimeofday' function sets the current calendar time in the
+     system clock according to the arguments.  As for 'gettimeofday',
+     the calendar time is represented as the elapsed time since the
+     epoch.  As for 'gettimeofday', time zone information is ignored if
+     TZP is a null pointer.
+
+     You must be a privileged user in order to use 'settimeofday'.
+
+     Some kernels automatically set the system clock from some source
+     such as a hardware clock when they start up.  Others, including
+     Linux, place the system clock in an "invalid" state (in which
+     attempts to read the clock fail).  A call of 'stime' removes the
+     system clock from an invalid state, and system startup scripts
+     typically run a program that calls 'stime'.
+
+     'settimeofday' causes a sudden jump forwards or backwards, which
+     can cause a variety of problems in a system.  Use 'adjtime' (below)
+     to make a smooth transition from one time to another by temporarily
+     speeding up or slowing down the clock.
+
+     With a Linux kernel, 'adjtimex' does the same thing and can also
+     make permanent changes to the speed of the system clock so it
+     doesn't need to be corrected as often.
+
+     The return value is '0' on success and '-1' on failure.  The
+     following 'errno' error conditions are defined for this function:
+
+     'EPERM'
+          This process cannot set the clock because it is not
+          privileged.
+
+     'ENOSYS'
+          The operating system does not support setting time zone
+          information, and TZP is not a null pointer.
+
+ -- Function: int adjtime (const struct timeval *DELTA, struct timeval
+          *OLDDELTA)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function speeds up or slows down the system clock in order to
+     make a gradual adjustment.  This ensures that the calendar time
+     reported by the system clock is always monotonically increasing,
+     which might not happen if you simply set the clock.
+
+     The DELTA argument specifies a relative adjustment to be made to
+     the clock time.  If negative, the system clock is slowed down for a
+     while until it has lost this much elapsed time.  If positive, the
+     system clock is speeded up for a while.
+
+     If the OLDDELTA argument is not a null pointer, the 'adjtime'
+     function returns information about any previous time adjustment
+     that has not yet completed.
+
+     This function is typically used to synchronize the clocks of
+     computers in a local network.  You must be a privileged user to use
+     it.
+
+     With a Linux kernel, you can use the 'adjtimex' function to
+     permanently change the clock speed.
+
+     The return value is '0' on success and '-1' on failure.  The
+     following 'errno' error condition is defined for this function:
+
+     'EPERM'
+          You do not have privilege to set the time.
+
+   *Portability Note:* The 'gettimeofday', 'settimeofday', and 'adjtime'
+functions are derived from BSD.
+
+   Symbols for the following function are declared in 'sys/timex.h'.
+
+ -- Function: int adjtimex (struct timex *TIMEX)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'adjtimex' is functionally identical to 'ntp_adjtime'.  *Note High
+     Accuracy Clock::.
+
+     This function is present only with a Linux kernel.
+
+
+File: libc.info,  Node: Broken-down Time,  Next: High Accuracy Clock,  Prev: High-Resolution Calendar,  Up: Calendar Time
+
+21.4.3 Broken-down Time
+-----------------------
+
+Calendar time is represented by the usual GNU C Library functions as an
+elapsed time since a fixed base calendar time.  This is convenient for
+computation, but has no relation to the way people normally think of
+calendar time.  By contrast, "broken-down time" is a binary
+representation of calendar time separated into year, month, day, and so
+on.  Broken-down time values are not useful for calculations, but they
+are useful for printing human readable time information.
+
+   A broken-down time value is always relative to a choice of time zone,
+and it also indicates which time zone that is.
+
+   The symbols in this section are declared in the header file 'time.h'.
+
+ -- Data Type: struct tm
+     This is the data type used to represent a broken-down time.  The
+     structure contains at least the following members, which can appear
+     in any order.
+
+     'int tm_sec'
+          This is the number of full seconds since the top of the minute
+          (normally in the range '0' through '59', but the actual upper
+          limit is '60', to allow for leap seconds if leap second
+          support is available).
+
+     'int tm_min'
+          This is the number of full minutes since the top of the hour
+          (in the range '0' through '59').
+
+     'int tm_hour'
+          This is the number of full hours past midnight (in the range
+          '0' through '23').
+
+     'int tm_mday'
+          This is the ordinal day of the month (in the range '1' through
+          '31').  Watch out for this one!  As the only ordinal number in
+          the structure, it is inconsistent with the rest of the
+          structure.
+
+     'int tm_mon'
+          This is the number of full calendar months since the beginning
+          of the year (in the range '0' through '11').  Watch out for
+          this one!  People usually use ordinal numbers for
+          month-of-year (where January = 1).
+
+     'int tm_year'
+          This is the number of full calendar years since 1900.
+
+     'int tm_wday'
+          This is the number of full days since Sunday (in the range '0'
+          through '6').
+
+     'int tm_yday'
+          This is the number of full days since the beginning of the
+          year (in the range '0' through '365').
+
+     'int tm_isdst'
+          This is a flag that indicates whether Daylight Saving Time is
+          (or was, or will be) in effect at the time described.  The
+          value is positive if Daylight Saving Time is in effect, zero
+          if it is not, and negative if the information is not
+          available.
+
+     'long int tm_gmtoff'
+          This field describes the time zone that was used to compute
+          this broken-down time value, including any adjustment for
+          daylight saving; it is the number of seconds that you must add
+          to UTC to get local time.  You can also think of this as the
+          number of seconds east of UTC. For example, for U.S. Eastern
+          Standard Time, the value is '-5*60*60'.  The 'tm_gmtoff' field
+          is derived from BSD and is a GNU library extension; it is not
+          visible in a strict ISO C environment.
+
+     'const char *tm_zone'
+          This field is the name for the time zone that was used to
+          compute this broken-down time value.  Like 'tm_gmtoff', this
+          field is a BSD and GNU extension, and is not visible in a
+          strict ISO C environment.
+
+ -- Function: struct tm * localtime (const time_t *TIME)
+     Preliminary: | MT-Unsafe race:tmbuf env locale | AS-Unsafe heap
+     lock | AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
+
+     The 'localtime' function converts the simple time pointed to by
+     TIME to broken-down time representation, expressed relative to the
+     user's specified time zone.
+
+     The return value is a pointer to a static broken-down time
+     structure, which might be overwritten by subsequent calls to
+     'ctime', 'gmtime', or 'localtime'.  (But no other library function
+     overwrites the contents of this object.)
+
+     The return value is the null pointer if TIME cannot be represented
+     as a broken-down time; typically this is because the year cannot
+     fit into an 'int'.
+
+     Calling 'localtime' also sets the current time zone as if 'tzset'
+     were called.  *Note Time Zone Functions::.
+
+   Using the 'localtime' function is a big problem in multi-threaded
+programs.  The result is returned in a static buffer and this is used in
+all threads.  POSIX.1c introduced a variant of this function.
+
+ -- Function: struct tm * localtime_r (const time_t *TIME, struct tm
+          *RESULTP)
+     Preliminary: | MT-Safe env locale | AS-Unsafe heap lock | AC-Unsafe
+     lock mem fd | *Note POSIX Safety Concepts::.
+
+     The 'localtime_r' function works just like the 'localtime'
+     function.  It takes a pointer to a variable containing a simple
+     time and converts it to the broken-down time format.
+
+     But the result is not placed in a static buffer.  Instead it is
+     placed in the object of type 'struct tm' to which the parameter
+     RESULTP points.
+
+     If the conversion is successful the function returns a pointer to
+     the object the result was written into, i.e., it returns RESULTP.
+
+ -- Function: struct tm * gmtime (const time_t *TIME)
+     Preliminary: | MT-Unsafe race:tmbuf env locale | AS-Unsafe heap
+     lock | AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'localtime', except that the
+     broken-down time is expressed as Coordinated Universal Time (UTC)
+     (formerly called Greenwich Mean Time (GMT)) rather than relative to
+     a local time zone.
+
+   As for the 'localtime' function we have the problem that the result
+is placed in a static variable.  POSIX.1c also provides a replacement
+for 'gmtime'.
+
+ -- Function: struct tm * gmtime_r (const time_t *TIME, struct tm
+          *RESULTP)
+     Preliminary: | MT-Safe env locale | AS-Unsafe heap lock | AC-Unsafe
+     lock mem fd | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'localtime_r', except that it converts
+     just like 'gmtime' the given time as Coordinated Universal Time.
+
+     If the conversion is successful the function returns a pointer to
+     the object the result was written into, i.e., it returns RESULTP.
+
+ -- Function: time_t mktime (struct tm *BROKENTIME)
+     Preliminary: | MT-Safe env locale | AS-Unsafe heap lock | AC-Unsafe
+     lock mem fd | *Note POSIX Safety Concepts::.
+
+     The 'mktime' function converts a broken-down time structure to a
+     simple time representation.  It also normalizes the contents of the
+     broken-down time structure, and fills in some components based on
+     the values of the others.
+
+     The 'mktime' function ignores the specified contents of the
+     'tm_wday', 'tm_yday', 'tm_gmtoff', and 'tm_zone' members of the
+     broken-down time structure.  It uses the values of the other
+     components to determine the calendar time; it's permissible for
+     these components to have unnormalized values outside their normal
+     ranges.  The last thing that 'mktime' does is adjust the components
+     of the BROKENTIME structure, including the members that were
+     initially ignored.
+
+     If the specified broken-down time cannot be represented as a simple
+     time, 'mktime' returns a value of '(time_t)(-1)' and does not
+     modify the contents of BROKENTIME.
+
+     Calling 'mktime' also sets the current time zone as if 'tzset' were
+     called; 'mktime' uses this information instead of BROKENTIME's
+     initial 'tm_gmtoff' and 'tm_zone' members.  *Note Time Zone
+     Functions::.
+
+ -- Function: time_t timelocal (struct tm *BROKENTIME)
+     Preliminary: | MT-Safe env locale | AS-Unsafe heap lock | AC-Unsafe
+     lock mem fd | *Note POSIX Safety Concepts::.
+
+     'timelocal' is functionally identical to 'mktime', but more
+     mnemonically named.  Note that it is the inverse of the 'localtime'
+     function.
+
+     *Portability note:* 'mktime' is essentially universally available.
+     'timelocal' is rather rare.
+
+ -- Function: time_t timegm (struct tm *BROKENTIME)
+     Preliminary: | MT-Safe env locale | AS-Unsafe heap lock | AC-Unsafe
+     lock mem fd | *Note POSIX Safety Concepts::.
+
+     'timegm' is functionally identical to 'mktime' except it always
+     takes the input values to be Coordinated Universal Time (UTC)
+     regardless of any local time zone setting.
+
+     Note that 'timegm' is the inverse of 'gmtime'.
+
+     *Portability note:* 'mktime' is essentially universally available.
+     'timegm' is rather rare.  For the most portable conversion from a
+     UTC broken-down time to a simple time, set the 'TZ' environment
+     variable to UTC, call 'mktime', then set 'TZ' back.
+
+
+File: libc.info,  Node: High Accuracy Clock,  Next: Formatting Calendar Time,  Prev: Broken-down Time,  Up: Calendar Time
+
+21.4.4 High Accuracy Clock
+--------------------------
+
+The 'ntp_gettime' and 'ntp_adjtime' functions provide an interface to
+monitor and manipulate the system clock to maintain high accuracy time.
+For example, you can fine tune the speed of the clock or synchronize it
+with another time source.
+
+   A typical use of these functions is by a server implementing the
+Network Time Protocol to synchronize the clocks of multiple systems and
+high precision clocks.
+
+   These functions are declared in 'sys/timex.h'.
+
+ -- Data Type: struct ntptimeval
+     This structure is used for information about the system clock.  It
+     contains the following members:
+     'struct timeval time'
+          This is the current calendar time, expressed as the elapsed
+          time since the epoch.  The 'struct timeval' data type is
+          described in *note Elapsed Time::.
+
+     'long int maxerror'
+          This is the maximum error, measured in microseconds.  Unless
+          updated via 'ntp_adjtime' periodically, this value will reach
+          some platform-specific maximum value.
+
+     'long int esterror'
+          This is the estimated error, measured in microseconds.  This
+          value can be set by 'ntp_adjtime' to indicate the estimated
+          offset of the system clock from the true calendar time.
+
+ -- Function: int ntp_gettime (struct ntptimeval *TPTR)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'ntp_gettime' function sets the structure pointed to by TPTR to
+     current values.  The elements of the structure afterwards contain
+     the values the timer implementation in the kernel assumes.  They
+     might or might not be correct.  If they are not a 'ntp_adjtime'
+     call is necessary.
+
+     The return value is '0' on success and other values on failure.
+     The following 'errno' error conditions are defined for this
+     function:
+
+     'TIME_ERROR'
+          The precision clock model is not properly set up at the
+          moment, thus the clock must be considered unsynchronized, and
+          the values should be treated with care.
+
+ -- Data Type: struct timex
+     This structure is used to control and monitor the system clock.  It
+     contains the following members:
+     'unsigned int modes'
+          This variable controls whether and which values are set.
+          Several symbolic constants have to be combined with _binary
+          or_ to specify the effective mode.  These constants start with
+          'MOD_'.
+
+     'long int offset'
+          This value indicates the current offset of the system clock
+          from the true calendar time.  The value is given in
+          microseconds.  If bit 'MOD_OFFSET' is set in 'modes', the
+          offset (and possibly other dependent values) can be set.  The
+          offset's absolute value must not exceed 'MAXPHASE'.
+
+     'long int frequency'
+          This value indicates the difference in frequency between the
+          true calendar time and the system clock.  The value is
+          expressed as scaled PPM (parts per million, 0.0001%).  The
+          scaling is '1 << SHIFT_USEC'.  The value can be set with bit
+          'MOD_FREQUENCY', but the absolute value must not exceed
+          'MAXFREQ'.
+
+     'long int maxerror'
+          This is the maximum error, measured in microseconds.  A new
+          value can be set using bit 'MOD_MAXERROR'.  Unless updated via
+          'ntp_adjtime' periodically, this value will increase steadily
+          and reach some platform-specific maximum value.
+
+     'long int esterror'
+          This is the estimated error, measured in microseconds.  This
+          value can be set using bit 'MOD_ESTERROR'.
+
+     'int status'
+          This variable reflects the various states of the clock
+          machinery.  There are symbolic constants for the significant
+          bits, starting with 'STA_'.  Some of these flags can be
+          updated using the 'MOD_STATUS' bit.
+
+     'long int constant'
+          This value represents the bandwidth or stiffness of the PLL
+          (phase locked loop) implemented in the kernel.  The value can
+          be changed using bit 'MOD_TIMECONST'.
+
+     'long int precision'
+          This value represents the accuracy or the maximum error when
+          reading the system clock.  The value is expressed in
+          microseconds.
+
+     'long int tolerance'
+          This value represents the maximum frequency error of the
+          system clock in scaled PPM. This value is used to increase the
+          'maxerror' every second.
+
+     'struct timeval time'
+          The current calendar time.
+
+     'long int tick'
+          The elapsed time between clock ticks in microseconds.  A clock
+          tick is a periodic timer interrupt on which the system clock
+          is based.
+
+     'long int ppsfreq'
+          This is the first of a few optional variables that are present
+          only if the system clock can use a PPS (pulse per second)
+          signal to discipline the system clock.  The value is expressed
+          in scaled PPM and it denotes the difference in frequency
+          between the system clock and the PPS signal.
+
+     'long int jitter'
+          This value expresses a median filtered average of the PPS
+          signal's dispersion in microseconds.
+
+     'int shift'
+          This value is a binary exponent for the duration of the PPS
+          calibration interval, ranging from 'PPS_SHIFT' to
+          'PPS_SHIFTMAX'.
+
+     'long int stabil'
+          This value represents the median filtered dispersion of the
+          PPS frequency in scaled PPM.
+
+     'long int jitcnt'
+          This counter represents the number of pulses where the jitter
+          exceeded the allowed maximum 'MAXTIME'.
+
+     'long int calcnt'
+          This counter reflects the number of successful calibration
+          intervals.
+
+     'long int errcnt'
+          This counter represents the number of calibration errors
+          (caused by large offsets or jitter).
+
+     'long int stbcnt'
+          This counter denotes the number of calibrations where the
+          stability exceeded the threshold.
+
+ -- Function: int ntp_adjtime (struct timex *TPTR)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'ntp_adjtime' function sets the structure specified by TPTR to
+     current values.
+
+     In addition, 'ntp_adjtime' updates some settings to match what you
+     pass to it in *TPTR.  Use the 'modes' element of *TPTR to select
+     what settings to update.  You can set 'offset', 'freq', 'maxerror',
+     'esterror', 'status', 'constant', and 'tick'.
+
+     'modes' = zero means set nothing.
+
+     Only the superuser can update settings.
+
+     The return value is '0' on success and other values on failure.
+     The following 'errno' error conditions are defined for this
+     function:
+
+     'TIME_ERROR'
+          The high accuracy clock model is not properly set up at the
+          moment, thus the clock must be considered unsynchronized, and
+          the values should be treated with care.  Another reason could
+          be that the specified new values are not allowed.
+
+     'EPERM'
+          The process specified a settings update, but is not superuser.
+
+     For more details see RFC1305 (Network Time Protocol, Version 3) and
+     related documents.
+
+     *Portability note:* Early versions of the GNU C Library did not
+     have this function but did have the synonymous 'adjtimex'.
+
+
+File: libc.info,  Node: Formatting Calendar Time,  Next: Parsing Date and Time,  Prev: High Accuracy Clock,  Up: Calendar Time
+
+21.4.5 Formatting Calendar Time
+-------------------------------
+
+The functions described in this section format calendar time values as
+strings.  These functions are declared in the header file 'time.h'.
+
+ -- Function: char * asctime (const struct tm *BROKENTIME)
+     Preliminary: | MT-Unsafe race:asctime locale | AS-Unsafe | AC-Safe
+     | *Note POSIX Safety Concepts::.
+
+     The 'asctime' function converts the broken-down time value that
+     BROKENTIME points to into a string in a standard format:
+
+          "Tue May 21 13:46:22 1991\n"
+
+     The abbreviations for the days of week are: 'Sun', 'Mon', 'Tue',
+     'Wed', 'Thu', 'Fri', and 'Sat'.
+
+     The abbreviations for the months are: 'Jan', 'Feb', 'Mar', 'Apr',
+     'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', and 'Dec'.
+
+     The return value points to a statically allocated string, which
+     might be overwritten by subsequent calls to 'asctime' or 'ctime'.
+     (But no other library function overwrites the contents of this
+     string.)
+
+ -- Function: char * asctime_r (const struct tm *BROKENTIME, char
+          *BUFFER)
+     Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     This function is similar to 'asctime' but instead of placing the
+     result in a static buffer it writes the string in the buffer
+     pointed to by the parameter BUFFER.  This buffer should have room
+     for at least 26 bytes, including the terminating null.
+
+     If no error occurred the function returns a pointer to the string
+     the result was written into, i.e., it returns BUFFER.  Otherwise
+     return 'NULL'.
+
+ -- Function: char * ctime (const time_t *TIME)
+     Preliminary: | MT-Unsafe race:tmbuf race:asctime env locale |
+     AS-Unsafe heap lock | AC-Unsafe lock mem fd | *Note POSIX Safety
+     Concepts::.
+
+     The 'ctime' function is similar to 'asctime', except that you
+     specify the calendar time argument as a 'time_t' simple time value
+     rather than in broken-down local time format.  It is equivalent to
+
+          asctime (localtime (TIME))
+
+     Calling 'ctime' also sets the current time zone as if 'tzset' were
+     called.  *Note Time Zone Functions::.
+
+ -- Function: char * ctime_r (const time_t *TIME, char *BUFFER)
+     Preliminary: | MT-Safe env locale | AS-Unsafe heap lock | AC-Unsafe
+     lock mem fd | *Note POSIX Safety Concepts::.
+
+     This function is similar to 'ctime', but places the result in the
+     string pointed to by BUFFER.  It is equivalent to (written using
+     gcc extensions, *note (gcc)Statement Exprs::):
+
+          ({ struct tm tm; asctime_r (localtime_r (time, &tm), buf); })
+
+     If no error occurred the function returns a pointer to the string
+     the result was written into, i.e., it returns BUFFER.  Otherwise
+     return 'NULL'.
+
+ -- Function: size_t strftime (char *S, size_t SIZE, const char
+          *TEMPLATE, const struct tm *BROKENTIME)
+     Preliminary: | MT-Safe env locale | AS-Unsafe corrupt heap lock
+     dlopen | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety
+     Concepts::.
+
+     This function is similar to the 'sprintf' function (*note Formatted
+     Input::), but the conversion specifications that can appear in the
+     format template TEMPLATE are specialized for printing components of
+     the date and time BROKENTIME according to the locale currently
+     specified for time conversion (*note Locales::) and the current
+     time zone (*note Time Zone Functions::).
+
+     Ordinary characters appearing in the TEMPLATE are copied to the
+     output string S; this can include multibyte character sequences.
+     Conversion specifiers are introduced by a '%' character, followed
+     by an optional flag which can be one of the following.  These flags
+     are all GNU extensions.  The first three affect only the output of
+     numbers:
+
+     '_'
+          The number is padded with spaces.
+
+     '-'
+          The number is not padded at all.
+
+     '0'
+          The number is padded with zeros even if the format specifies
+          padding with spaces.
+
+     '^'
+          The output uses uppercase characters, but only if this is
+          possible (*note Case Conversion::).
+
+     The default action is to pad the number with zeros to keep it a
+     constant width.  Numbers that do not have a range indicated below
+     are never padded, since there is no natural width for them.
+
+     Following the flag an optional specification of the width is
+     possible.  This is specified in decimal notation.  If the natural
+     size of the output is of the field has less than the specified
+     number of characters, the result is written right adjusted and
+     space padded to the given size.
+
+     An optional modifier can follow the optional flag and width
+     specification.  The modifiers, which were first standardized by
+     POSIX.2-1992 and by ISO C99, are:
+
+     'E'
+          Use the locale's alternate representation for date and time.
+          This modifier applies to the '%c', '%C', '%x', '%X', '%y' and
+          '%Y' format specifiers.  In a Japanese locale, for example,
+          '%Ex' might yield a date format based on the Japanese
+          Emperors' reigns.
+
+     'O'
+          Use the locale's alternate numeric symbols for numbers.  This
+          modifier applies only to numeric format specifiers.
+
+     If the format supports the modifier but no alternate representation
+     is available, it is ignored.
+
+     The conversion specifier ends with a format specifier taken from
+     the following list.  The whole '%' sequence is replaced in the
+     output string as follows:
+
+     '%a'
+          The abbreviated weekday name according to the current locale.
+
+     '%A'
+          The full weekday name according to the current locale.
+
+     '%b'
+          The abbreviated month name according to the current locale.
+
+     '%B'
+          The full month name according to the current locale.
+
+          Using '%B' together with '%d' produces grammatically incorrect
+          results for some locales.
+
+     '%c'
+          The preferred calendar time representation for the current
+          locale.
+
+     '%C'
+          The century of the year.  This is equivalent to the greatest
+          integer not greater than the year divided by 100.
+
+          This format was first standardized by POSIX.2-1992 and by
+          ISO C99.
+
+     '%d'
+          The day of the month as a decimal number (range '01' through
+          '31').
+
+     '%D'
+          The date using the format '%m/%d/%y'.
+
+          This format was first standardized by POSIX.2-1992 and by
+          ISO C99.
+
+     '%e'
+          The day of the month like with '%d', but padded with blank
+          (range ' 1' through '31').
+
+          This format was first standardized by POSIX.2-1992 and by
+          ISO C99.
+
+     '%F'
+          The date using the format '%Y-%m-%d'.  This is the form
+          specified in the ISO 8601 standard and is the preferred form
+          for all uses.
+
+          This format was first standardized by ISO C99 and by
+          POSIX.1-2001.
+
+     '%g'
+          The year corresponding to the ISO week number, but without the
+          century (range '00' through '99').  This has the same format
+          and value as '%y', except that if the ISO week number (see
+          '%V') belongs to the previous or next year, that year is used
+          instead.
+
+          This format was first standardized by ISO C99 and by
+          POSIX.1-2001.
+
+     '%G'
+          The year corresponding to the ISO week number.  This has the
+          same format and value as '%Y', except that if the ISO week
+          number (see '%V') belongs to the previous or next year, that
+          year is used instead.
+
+          This format was first standardized by ISO C99 and by
+          POSIX.1-2001 but was previously available as a GNU extension.
+
+     '%h'
+          The abbreviated month name according to the current locale.
+          The action is the same as for '%b'.
+
+          This format was first standardized by POSIX.2-1992 and by
+          ISO C99.
+
+     '%H'
+          The hour as a decimal number, using a 24-hour clock (range
+          '00' through '23').
+
+     '%I'
+          The hour as a decimal number, using a 12-hour clock (range
+          '01' through '12').
+
+     '%j'
+          The day of the year as a decimal number (range '001' through
+          '366').
+
+     '%k'
+          The hour as a decimal number, using a 24-hour clock like '%H',
+          but padded with blank (range ' 0' through '23').
+
+          This format is a GNU extension.
+
+     '%l'
+          The hour as a decimal number, using a 12-hour clock like '%I',
+          but padded with blank (range ' 1' through '12').
+
+          This format is a GNU extension.
+
+     '%m'
+          The month as a decimal number (range '01' through '12').
+
+     '%M'
+          The minute as a decimal number (range '00' through '59').
+
+     '%n'
+          A single '\n' (newline) character.
+
+          This format was first standardized by POSIX.2-1992 and by
+          ISO C99.
+
+     '%p'
+          Either 'AM' or 'PM', according to the given time value; or the
+          corresponding strings for the current locale.  Noon is treated
+          as 'PM' and midnight as 'AM'.  In most locales 'AM'/'PM'
+          format is not supported, in such cases '"%p"' yields an empty
+          string.
+
+     '%P'
+          Either 'am' or 'pm', according to the given time value; or the
+          corresponding strings for the current locale, printed in
+          lowercase characters.  Noon is treated as 'pm' and midnight as
+          'am'.  In most locales 'AM'/'PM' format is not supported, in
+          such cases '"%P"' yields an empty string.
+
+          This format is a GNU extension.
+
+     '%r'
+          The complete calendar time using the AM/PM format of the
+          current locale.
+
+          This format was first standardized by POSIX.2-1992 and by
+          ISO C99.  In the POSIX locale, this format is equivalent to
+          '%I:%M:%S %p'.
+
+     '%R'
+          The hour and minute in decimal numbers using the format
+          '%H:%M'.
+
+          This format was first standardized by ISO C99 and by
+          POSIX.1-2001 but was previously available as a GNU extension.
+
+     '%s'
+          The number of seconds since the epoch, i.e., since 1970-01-01
+          00:00:00 UTC. Leap seconds are not counted unless leap second
+          support is available.
+
+          This format is a GNU extension.
+
+     '%S'
+          The seconds as a decimal number (range '00' through '60').
+
+     '%t'
+          A single '\t' (tabulator) character.
+
+          This format was first standardized by POSIX.2-1992 and by
+          ISO C99.
+
+     '%T'
+          The time of day using decimal numbers using the format
+          '%H:%M:%S'.
+
+          This format was first standardized by POSIX.2-1992 and by
+          ISO C99.
+
+     '%u'
+          The day of the week as a decimal number (range '1' through
+          '7'), Monday being '1'.
+
+          This format was first standardized by POSIX.2-1992 and by
+          ISO C99.
+
+     '%U'
+          The week number of the current year as a decimal number (range
+          '00' through '53'), starting with the first Sunday as the
+          first day of the first week.  Days preceding the first Sunday
+          in the year are considered to be in week '00'.
+
+     '%V'
+          The ISO 8601:1988 week number as a decimal number (range '01'
+          through '53').  ISO weeks start with Monday and end with
+          Sunday.  Week '01' of a year is the first week which has the
+          majority of its days in that year; this is equivalent to the
+          week containing the year's first Thursday, and it is also
+          equivalent to the week containing January 4.  Week '01' of a
+          year can contain days from the previous year.  The week before
+          week '01' of a year is the last week ('52' or '53') of the
+          previous year even if it contains days from the new year.
+
+          This format was first standardized by POSIX.2-1992 and by
+          ISO C99.
+
+     '%w'
+          The day of the week as a decimal number (range '0' through
+          '6'), Sunday being '0'.
+
+     '%W'
+          The week number of the current year as a decimal number (range
+          '00' through '53'), starting with the first Monday as the
+          first day of the first week.  All days preceding the first
+          Monday in the year are considered to be in week '00'.
+
+     '%x'
+          The preferred date representation for the current locale.
+
+     '%X'
+          The preferred time of day representation for the current
+          locale.
+
+     '%y'
+          The year without a century as a decimal number (range '00'
+          through '99').  This is equivalent to the year modulo 100.
+
+     '%Y'
+          The year as a decimal number, using the Gregorian calendar.
+          Years before the year '1' are numbered '0', '-1', and so on.
+
+     '%z'
+          RFC 822/ISO 8601:1988 style numeric time zone (e.g., '-0600'
+          or '+0100'), or nothing if no time zone is determinable.
+
+          This format was first standardized by ISO C99 and by
+          POSIX.1-2001 but was previously available as a GNU extension.
+
+          In the POSIX locale, a full RFC 822 timestamp is generated by
+          the format '"%a, %d %b %Y %H:%M:%S %z"' (or the equivalent
+          '"%a, %d %b %Y %T %z"').
+
+     '%Z'
+          The time zone abbreviation (empty if the time zone can't be
+          determined).
+
+     '%%'
+          A literal '%' character.
+
+     The SIZE parameter can be used to specify the maximum number of
+     characters to be stored in the array S, including the terminating
+     null character.  If the formatted time requires more than SIZE
+     characters, 'strftime' returns zero and the contents of the array S
+     are undefined.  Otherwise the return value indicates the number of
+     characters placed in the array S, not including the terminating
+     null character.
+
+     _Warning:_ This convention for the return value which is prescribed
+     in ISO C can lead to problems in some situations.  For certain
+     format strings and certain locales the output really can be the
+     empty string and this cannot be discovered by testing the return
+     value only.  E.g., in most locales the AM/PM time format is not
+     supported (most of the world uses the 24 hour time representation).
+     In such locales '"%p"' will return the empty string, i.e., the
+     return value is zero.  To detect situations like this something
+     similar to the following code should be used:
+
+          buf[0] = '\1';
+          len = strftime (buf, bufsize, format, tp);
+          if (len == 0 && buf[0] != '\0')
+            {
+              /* Something went wrong in the strftime call.  */
+              ...
+            }
+
+     If S is a null pointer, 'strftime' does not actually write
+     anything, but instead returns the number of characters it would
+     have written.
+
+     Calling 'strftime' also sets the current time zone as if 'tzset'
+     were called; 'strftime' uses this information instead of
+     BROKENTIME's 'tm_gmtoff' and 'tm_zone' members.  *Note Time Zone
+     Functions::.
+
+     For an example of 'strftime', see *note Time Functions Example::.
+
+ -- Function: size_t wcsftime (wchar_t *S, size_t SIZE, const wchar_t
+          *TEMPLATE, const struct tm *BROKENTIME)
+     Preliminary: | MT-Safe env locale | AS-Unsafe corrupt heap lock
+     dlopen | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety
+     Concepts::.
+
+     The 'wcsftime' function is equivalent to the 'strftime' function
+     with the difference that it operates on wide character strings.
+     The buffer where the result is stored, pointed to by S, must be an
+     array of wide characters.  The parameter SIZE which specifies the
+     size of the output buffer gives the number of wide character, not
+     the number of bytes.
+
+     Also the format string TEMPLATE is a wide character string.  Since
+     all characters needed to specify the format string are in the basic
+     character set it is portably possible to write format strings in
+     the C source code using the 'L"..."' notation.  The parameter
+     BROKENTIME has the same meaning as in the 'strftime' call.
+
+     The 'wcsftime' function supports the same flags, modifiers, and
+     format specifiers as the 'strftime' function.
+
+     The return value of 'wcsftime' is the number of wide characters
+     stored in 's'.  When more characters would have to be written than
+     can be placed in the buffer S the return value is zero, with the
+     same problems indicated in the 'strftime' documentation.
+
+
+File: libc.info,  Node: Parsing Date and Time,  Next: TZ Variable,  Prev: Formatting Calendar Time,  Up: Calendar Time
+
+21.4.6 Convert textual time and date information back
+-----------------------------------------------------
+
+The ISO C standard does not specify any functions which can convert the
+output of the 'strftime' function back into a binary format.  This led
+to a variety of more-or-less successful implementations with different
+interfaces over the years.  Then the Unix standard was extended by the
+addition of two functions: 'strptime' and 'getdate'.  Both have strange
+interfaces but at least they are widely available.
+
+* Menu:
+
+* Low-Level Time String Parsing::  Interpret string according to given format.
+* General Time String Parsing::    User-friendly function to parse data and
+                                    time strings.
+
+
+File: libc.info,  Node: Low-Level Time String Parsing,  Next: General Time String Parsing,  Up: Parsing Date and Time
+
+21.4.6.1 Interpret string according to given format
+...................................................
+
+The first function is rather low-level.  It is nevertheless frequently
+used in software since it is better known.  Its interface and
+implementation are heavily influenced by the 'getdate' function, which
+is defined and implemented in terms of calls to 'strptime'.
+
+ -- Function: char * strptime (const char *S, const char *FMT, struct tm
+          *TP)
+     Preliminary: | MT-Safe env locale | AS-Unsafe heap lock | AC-Unsafe
+     lock mem fd | *Note POSIX Safety Concepts::.
+
+     The 'strptime' function parses the input string S according to the
+     format string FMT and stores its results in the structure TP.
+
+     The input string could be generated by a 'strftime' call or
+     obtained any other way.  It does not need to be in a
+     human-recognizable format; e.g.  a date passed as '"02:1999:9"' is
+     acceptable, even though it is ambiguous without context.  As long
+     as the format string FMT matches the input string the function will
+     succeed.
+
+     The user has to make sure, though, that the input can be parsed in
+     a unambiguous way.  The string '"1999112"' can be parsed using the
+     format '"%Y%m%d"' as 1999-1-12, 1999-11-2, or even 19991-1-2.  It
+     is necessary to add appropriate separators to reliably get results.
+
+     The format string consists of the same components as the format
+     string of the 'strftime' function.  The only difference is that the
+     flags '_', '-', '0', and '^' are not allowed.  Several of the
+     distinct formats of 'strftime' do the same work in 'strptime' since
+     differences like case of the input do not matter.  For reasons of
+     symmetry all formats are supported, though.
+
+     The modifiers 'E' and 'O' are also allowed everywhere the
+     'strftime' function allows them.
+
+     The formats are:
+
+     '%a'
+     '%A'
+          The weekday name according to the current locale, in
+          abbreviated form or the full name.
+
+     '%b'
+     '%B'
+     '%h'
+          The month name according to the current locale, in abbreviated
+          form or the full name.
+
+     '%c'
+          The date and time representation for the current locale.
+
+     '%Ec'
+          Like '%c' but the locale's alternative date and time format is
+          used.
+
+     '%C'
+          The century of the year.
+
+          It makes sense to use this format only if the format string
+          also contains the '%y' format.
+
+     '%EC'
+          The locale's representation of the period.
+
+          Unlike '%C' it sometimes makes sense to use this format since
+          some cultures represent years relative to the beginning of
+          eras instead of using the Gregorian years.
+
+     '%d'
+     '%e'
+          The day of the month as a decimal number (range '1' through
+          '31').  Leading zeroes are permitted but not required.
+
+     '%Od'
+     '%Oe'
+          Same as '%d' but using the locale's alternative numeric
+          symbols.
+
+          Leading zeroes are permitted but not required.
+
+     '%D'
+          Equivalent to '%m/%d/%y'.
+
+     '%F'
+          Equivalent to '%Y-%m-%d', which is the ISO 8601 date format.
+
+          This is a GNU extension following an ISO C99 extension to
+          'strftime'.
+
+     '%g'
+          The year corresponding to the ISO week number, but without the
+          century (range '00' through '99').
+
+          _Note:_ Currently, this is not fully implemented.  The format
+          is recognized, input is consumed but no field in TM is set.
+
+          This format is a GNU extension following a GNU extension of
+          'strftime'.
+
+     '%G'
+          The year corresponding to the ISO week number.
+
+          _Note:_ Currently, this is not fully implemented.  The format
+          is recognized, input is consumed but no field in TM is set.
+
+          This format is a GNU extension following a GNU extension of
+          'strftime'.
+
+     '%H'
+     '%k'
+          The hour as a decimal number, using a 24-hour clock (range
+          '00' through '23').
+
+          '%k' is a GNU extension following a GNU extension of
+          'strftime'.
+
+     '%OH'
+          Same as '%H' but using the locale's alternative numeric
+          symbols.
+
+     '%I'
+     '%l'
+          The hour as a decimal number, using a 12-hour clock (range
+          '01' through '12').
+
+          '%l' is a GNU extension following a GNU extension of
+          'strftime'.
+
+     '%OI'
+          Same as '%I' but using the locale's alternative numeric
+          symbols.
+
+     '%j'
+          The day of the year as a decimal number (range '1' through
+          '366').
+
+          Leading zeroes are permitted but not required.
+
+     '%m'
+          The month as a decimal number (range '1' through '12').
+
+          Leading zeroes are permitted but not required.
+
+     '%Om'
+          Same as '%m' but using the locale's alternative numeric
+          symbols.
+
+     '%M'
+          The minute as a decimal number (range '0' through '59').
+
+          Leading zeroes are permitted but not required.
+
+     '%OM'
+          Same as '%M' but using the locale's alternative numeric
+          symbols.
+
+     '%n'
+     '%t'
+          Matches any white space.
+
+     '%p'
+     '%P'
+          The locale-dependent equivalent to 'AM' or 'PM'.
+
+          This format is not useful unless '%I' or '%l' is also used.
+          Another complication is that the locale might not define these
+          values at all and therefore the conversion fails.
+
+          '%P' is a GNU extension following a GNU extension to
+          'strftime'.
+
+     '%r'
+          The complete time using the AM/PM format of the current
+          locale.
+
+          A complication is that the locale might not define this format
+          at all and therefore the conversion fails.
+
+     '%R'
+          The hour and minute in decimal numbers using the format
+          '%H:%M'.
+
+          '%R' is a GNU extension following a GNU extension to
+          'strftime'.
+
+     '%s'
+          The number of seconds since the epoch, i.e., since 1970-01-01
+          00:00:00 UTC. Leap seconds are not counted unless leap second
+          support is available.
+
+          '%s' is a GNU extension following a GNU extension to
+          'strftime'.
+
+     '%S'
+          The seconds as a decimal number (range '0' through '60').
+
+          Leading zeroes are permitted but not required.
+
+          *NB:* The Unix specification says the upper bound on this
+          value is '61', a result of a decision to allow double leap
+          seconds.  You will not see the value '61' because no minute
+          has more than one leap second, but the myth persists.
+
+     '%OS'
+          Same as '%S' but using the locale's alternative numeric
+          symbols.
+
+     '%T'
+          Equivalent to the use of '%H:%M:%S' in this place.
+
+     '%u'
+          The day of the week as a decimal number (range '1' through
+          '7'), Monday being '1'.
+
+          Leading zeroes are permitted but not required.
+
+          _Note:_ Currently, this is not fully implemented.  The format
+          is recognized, input is consumed but no field in TM is set.
+
+     '%U'
+          The week number of the current year as a decimal number (range
+          '0' through '53').
+
+          Leading zeroes are permitted but not required.
+
+     '%OU'
+          Same as '%U' but using the locale's alternative numeric
+          symbols.
+
+     '%V'
+          The ISO 8601:1988 week number as a decimal number (range '1'
+          through '53').
+
+          Leading zeroes are permitted but not required.
+
+          _Note:_ Currently, this is not fully implemented.  The format
+          is recognized, input is consumed but no field in TM is set.
+
+     '%w'
+          The day of the week as a decimal number (range '0' through
+          '6'), Sunday being '0'.
+
+          Leading zeroes are permitted but not required.
+
+          _Note:_ Currently, this is not fully implemented.  The format
+          is recognized, input is consumed but no field in TM is set.
+
+     '%Ow'
+          Same as '%w' but using the locale's alternative numeric
+          symbols.
+
+     '%W'
+          The week number of the current year as a decimal number (range
+          '0' through '53').
+
+          Leading zeroes are permitted but not required.
+
+          _Note:_ Currently, this is not fully implemented.  The format
+          is recognized, input is consumed but no field in TM is set.
+
+     '%OW'
+          Same as '%W' but using the locale's alternative numeric
+          symbols.
+
+     '%x'
+          The date using the locale's date format.
+
+     '%Ex'
+          Like '%x' but the locale's alternative data representation is
+          used.
+
+     '%X'
+          The time using the locale's time format.
+
+     '%EX'
+          Like '%X' but the locale's alternative time representation is
+          used.
+
+     '%y'
+          The year without a century as a decimal number (range '0'
+          through '99').
+
+          Leading zeroes are permitted but not required.
+
+          Note that it is questionable to use this format without the
+          '%C' format.  The 'strptime' function does regard input values
+          in the range 68 to 99 as the years 1969 to 1999 and the values
+          0 to 68 as the years 2000 to 2068.  But maybe this heuristic
+          fails for some input data.
+
+          Therefore it is best to avoid '%y' completely and use '%Y'
+          instead.
+
+     '%Ey'
+          The offset from '%EC' in the locale's alternative
+          representation.
+
+     '%Oy'
+          The offset of the year (from '%C') using the locale's
+          alternative numeric symbols.
+
+     '%Y'
+          The year as a decimal number, using the Gregorian calendar.
+
+     '%EY'
+          The full alternative year representation.
+
+     '%z'
+          The offset from GMT in ISO 8601/RFC822 format.
+
+     '%Z'
+          The timezone name.
+
+          _Note:_ Currently, this is not fully implemented.  The format
+          is recognized, input is consumed but no field in TM is set.
+
+     '%%'
+          A literal '%' character.
+
+     All other characters in the format string must have a matching
+     character in the input string.  Exceptions are white spaces in the
+     input string which can match zero or more whitespace characters in
+     the format string.
+
+     *Portability Note:* The XPG standard advises applications to use at
+     least one whitespace character (as specified by 'isspace') or other
+     non-alphanumeric characters between any two conversion
+     specifications.  The GNU C Library does not have this limitation
+     but other libraries might have trouble parsing formats like
+     '"%d%m%Y%H%M%S"'.
+
+     The 'strptime' function processes the input string from right to
+     left.  Each of the three possible input elements (white space,
+     literal, or format) are handled one after the other.  If the input
+     cannot be matched to the format string the function stops.  The
+     remainder of the format and input strings are not processed.
+
+     The function returns a pointer to the first character it was unable
+     to process.  If the input string contains more characters than
+     required by the format string the return value points right after
+     the last consumed input character.  If the whole input string is
+     consumed the return value points to the 'NULL' byte at the end of
+     the string.  If an error occurs, i.e., 'strptime' fails to match
+     all of the format string, the function returns 'NULL'.
+
+   The specification of the function in the XPG standard is rather
+vague, leaving out a few important pieces of information.  Most
+importantly, it does not specify what happens to those elements of TM
+which are not directly initialized by the different formats.  The
+implementations on different Unix systems vary here.
+
+   The GNU C Library implementation does not touch those fields which
+are not directly initialized.  Exceptions are the 'tm_wday' and
+'tm_yday' elements, which are recomputed if any of the year, month, or
+date elements changed.  This has two implications:
+
+   * Before calling the 'strptime' function for a new input string, you
+     should prepare the TM structure you pass.  Normally this will mean
+     initializing all values are to zero.  Alternatively, you can set
+     all fields to values like 'INT_MAX', allowing you to determine
+     which elements were set by the function call.  Zero does not work
+     here since it is a valid value for many of the fields.
+
+     Careful initialization is necessary if you want to find out whether
+     a certain field in TM was initialized by the function call.
+
+   * You can construct a 'struct tm' value with several consecutive
+     'strptime' calls.  A useful application of this is e.g.  the
+     parsing of two separate strings, one containing date information
+     and the other time information.  By parsing one after the other
+     without clearing the structure in-between, you can construct a
+     complete broken-down time.
+
+   The following example shows a function which parses a string which is
+contains the date information in either US style or ISO 8601 form:
+
+     const char *
+     parse_date (const char *input, struct tm *tm)
+     {
+       const char *cp;
+
+       /* First clear the result structure.  */
+       memset (tm, '\0', sizeof (*tm));
+
+       /* Try the ISO format first.  */
+       cp = strptime (input, "%F", tm);
+       if (cp == NULL)
+         {
+           /* Does not match.  Try the US form.  */
+           cp = strptime (input, "%D", tm);
+         }
+
+       return cp;
+     }
+
+
+File: libc.info,  Node: General Time String Parsing,  Prev: Low-Level Time String Parsing,  Up: Parsing Date and Time
+
+21.4.6.2 A More User-friendly Way to Parse Times and Dates
+..........................................................
+
+The Unix standard defines another function for parsing date strings.
+The interface is weird, but if the function happens to suit your
+application it is just fine.  It is problematic to use this function in
+multi-threaded programs or libraries, since it returns a pointer to a
+static variable, and uses a global variable and global state (an
+environment variable).
+
+ -- Variable: getdate_err
+     This variable of type 'int' contains the error code of the last
+     unsuccessful call to 'getdate'.  Defined values are:
+
+     1
+          The environment variable 'DATEMSK' is not defined or null.
+     2
+          The template file denoted by the 'DATEMSK' environment
+          variable cannot be opened.
+     3
+          Information about the template file cannot retrieved.
+     4
+          The template file is not a regular file.
+     5
+          An I/O error occurred while reading the template file.
+     6
+          Not enough memory available to execute the function.
+     7
+          The template file contains no matching template.
+     8
+          The input date is invalid, but would match a template
+          otherwise.  This includes dates like February 31st, and dates
+          which cannot be represented in a 'time_t' variable.
+
+ -- Function: struct tm * getdate (const char *STRING)
+     Preliminary: | MT-Unsafe race:getdate env locale | AS-Unsafe heap
+     lock | AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
+
+     The interface to 'getdate' is the simplest possible for a function
+     to parse a string and return the value.  STRING is the input string
+     and the result is returned in a statically-allocated variable.
+
+     The details about how the string is processed are hidden from the
+     user.  In fact, they can be outside the control of the program.
+     Which formats are recognized is controlled by the file named by the
+     environment variable 'DATEMSK'.  This file should contain lines of
+     valid format strings which could be passed to 'strptime'.
+
+     The 'getdate' function reads these format strings one after the
+     other and tries to match the input string.  The first line which
+     completely matches the input string is used.
+
+     Elements not initialized through the format string retain the
+     values present at the time of the 'getdate' function call.
+
+     The formats recognized by 'getdate' are the same as for 'strptime'.
+     See above for an explanation.  There are only a few extensions to
+     the 'strptime' behavior:
+
+        * If the '%Z' format is given the broken-down time is based on
+          the current time of the timezone matched, not of the current
+          timezone of the runtime environment.
+
+          _Note_: This is not implemented (currently).  The problem is
+          that timezone names are not unique.  If a fixed timezone is
+          assumed for a given string (say 'EST' meaning US East Coast
+          time), then uses for countries other than the USA will fail.
+          So far we have found no good solution to this.
+
+        * If only the weekday is specified the selected day depends on
+          the current date.  If the current weekday is greater or equal
+          to the 'tm_wday' value the current week's day is chosen,
+          otherwise the day next week is chosen.
+
+        * A similar heuristic is used when only the month is given and
+          not the year.  If the month is greater than or equal to the
+          current month, then the current year is used.  Otherwise it
+          wraps to next year.  The first day of the month is assumed if
+          one is not explicitly specified.
+
+        * The current hour, minute, and second are used if the
+          appropriate value is not set through the format.
+
+        * If no date is given tomorrow's date is used if the time is
+          smaller than the current time.  Otherwise today's date is
+          taken.
+
+     It should be noted that the format in the template file need not
+     only contain format elements.  The following is a list of possible
+     format strings (taken from the Unix standard):
+
+          %m
+          %A %B %d, %Y %H:%M:%S
+          %A
+          %B
+          %m/%d/%y %I %p
+          %d,%m,%Y %H:%M
+          at %A the %dst of %B in %Y
+          run job at %I %p,%B %dnd
+          %A den %d. %B %Y %H.%M Uhr
+
+     As you can see, the template list can contain very specific strings
+     like 'run job at %I %p,%B %dnd'.  Using the above list of templates
+     and assuming the current time is Mon Sep 22 12:19:47 EDT 1986 we
+     can obtain the following results for the given input.
+
+     Input          Match        Result
+     Mon            %a           Mon Sep 22 12:19:47 EDT 1986
+     Sun            %a           Sun Sep 28 12:19:47 EDT 1986
+     Fri            %a           Fri Sep 26 12:19:47 EDT 1986
+     September      %B           Mon Sep 1 12:19:47 EDT 1986
+     January        %B           Thu Jan 1 12:19:47 EST 1987
+     December       %B           Mon Dec 1 12:19:47 EST 1986
+     Sep Mon        %b %a        Mon Sep 1 12:19:47 EDT 1986
+     Jan Fri        %b %a        Fri Jan 2 12:19:47 EST 1987
+     Dec Mon        %b %a        Mon Dec 1 12:19:47 EST 1986
+     Jan Wed 1989   %b %a %Y     Wed Jan 4 12:19:47 EST 1989
+     Fri 9          %a %H        Fri Sep 26 09:00:00 EDT 1986
+     Feb 10:30      %b %H:%S     Sun Feb 1 10:00:30 EST 1987
+     10:30          %H:%M        Tue Sep 23 10:30:00 EDT 1986
+     13:30          %H:%M        Mon Sep 22 13:30:00 EDT 1986
+
+     The return value of the function is a pointer to a static variable
+     of type 'struct tm', or a null pointer if an error occurred.  The
+     result is only valid until the next 'getdate' call, making this
+     function unusable in multi-threaded applications.
+
+     The 'errno' variable is _not_ changed.  Error conditions are stored
+     in the global variable 'getdate_err'.  See the description above
+     for a list of the possible error values.
+
+     _Warning:_ The 'getdate' function should _never_ be used in
+     SUID-programs.  The reason is obvious: using the 'DATEMSK'
+     environment variable you can get the function to open any arbitrary
+     file and chances are high that with some bogus input (such as a
+     binary file) the program will crash.
+
+ -- Function: int getdate_r (const char *STRING, struct tm *TP)
+     Preliminary: | MT-Safe env locale | AS-Unsafe heap lock | AC-Unsafe
+     lock mem fd | *Note POSIX Safety Concepts::.
+
+     The 'getdate_r' function is the reentrant counterpart of 'getdate'.
+     It does not use the global variable 'getdate_err' to signal an
+     error, but instead returns an error code.  The same error codes as
+     described in the 'getdate_err' documentation above are used, with 0
+     meaning success.
+
+     Moreover, 'getdate_r' stores the broken-down time in the variable
+     of type 'struct tm' pointed to by the second argument, rather than
+     in a static variable.
+
+     This function is not defined in the Unix standard.  Nevertheless it
+     is available on some other Unix systems as well.
+
+     The warning against using 'getdate' in SUID-programs applies to
+     'getdate_r' as well.
+
+
+File: libc.info,  Node: TZ Variable,  Next: Time Zone Functions,  Prev: Parsing Date and Time,  Up: Calendar Time
+
+21.4.7 Specifying the Time Zone with 'TZ'
+-----------------------------------------
+
+In POSIX systems, a user can specify the time zone by means of the 'TZ'
+environment variable.  For information about how to set environment
+variables, see *note Environment Variables::.  The functions for
+accessing the time zone are declared in 'time.h'.
+
+   You should not normally need to set 'TZ'.  If the system is
+configured properly, the default time zone will be correct.  You might
+set 'TZ' if you are using a computer over a network from a different
+time zone, and would like times reported to you in the time zone local
+to you, rather than what is local to the computer.
+
+   In POSIX.1 systems the value of the 'TZ' variable can be in one of
+three formats.  With the GNU C Library, the most common format is the
+last one, which can specify a selection from a large database of time
+zone information for many regions of the world.  The first two formats
+are used to describe the time zone information directly, which is both
+more cumbersome and less precise.  But the POSIX.1 standard only
+specifies the details of the first two formats, so it is good to be
+familiar with them in case you come across a POSIX.1 system that doesn't
+support a time zone information database.
+
+   The first format is used when there is no Daylight Saving Time (or
+summer time) in the local time zone:
+
+     STD OFFSET
+
+   The STD string specifies the name of the time zone.  It must be three
+or more characters long and must not contain a leading colon, embedded
+digits, commas, nor plus and minus signs.  There is no space character
+separating the time zone name from the OFFSET, so these restrictions are
+necessary to parse the specification correctly.
+
+   The OFFSET specifies the time value you must add to the local time to
+get a Coordinated Universal Time value.  It has syntax like
+['+'|'-']HH[':'MM[':'SS]].  This is positive if the local time zone is
+west of the Prime Meridian and negative if it is east.  The hour must be
+between '0' and '24', and the minute and seconds between '0' and '59'.
+
+   For example, here is how we would specify Eastern Standard Time, but
+without any Daylight Saving Time alternative:
+
+     EST+5
+
+   The second format is used when there is Daylight Saving Time:
+
+     STD OFFSET DST [OFFSET]','START['/'TIME]','END['/'TIME]
+
+   The initial STD and OFFSET specify the standard time zone, as
+described above.  The DST string and OFFSET specify the name and offset
+for the corresponding Daylight Saving Time zone; if the OFFSET is
+omitted, it defaults to one hour ahead of standard time.
+
+   The remainder of the specification describes when Daylight Saving
+Time is in effect.  The START field is when Daylight Saving Time goes
+into effect and the END field is when the change is made back to
+standard time.  The following formats are recognized for these fields:
+
+'JN'
+     This specifies the Julian day, with N between '1' and '365'.
+     February 29 is never counted, even in leap years.
+
+'N'
+     This specifies the Julian day, with N between '0' and '365'.
+     February 29 is counted in leap years.
+
+'MM.W.D'
+     This specifies day D of week W of month M.  The day D must be
+     between '0' (Sunday) and '6'.  The week W must be between '1' and
+     '5'; week '1' is the first week in which day D occurs, and week '5'
+     specifies the _last_ D day in the month.  The month M should be
+     between '1' and '12'.
+
+   The TIME fields specify when, in the local time currently in effect,
+the change to the other time occurs.  If omitted, the default is
+'02:00:00'.  The hours part of the time fields can range from -167
+through 167; this is an extension to POSIX.1, which allows only the
+range 0 through 24.
+
+   Here are some example 'TZ' values, including the appropriate Daylight
+Saving Time and its dates of applicability.  In North American Eastern
+Standard Time (EST) and Eastern Daylight Time (EDT), the normal offset
+from UTC is 5 hours; since this is west of the prime meridian, the sign
+is positive.  Summer time begins on March's second Sunday at 2:00am, and
+ends on November's first Sunday at 2:00am.
+
+     EST+5EDT,M3.2.0/2,M11.1.0/2
+
+   Israel Standard Time (IST) and Israel Daylight Time (IDT) are 2 hours
+ahead of the prime meridian in winter, springing forward an hour on
+March's fourth Tuesday at 26:00 (i.e., 02:00 on the first Friday on or
+after March 23), and falling back on October's last Sunday at 02:00.
+
+     IST-2IDT,M3.4.4/26,M10.5.0
+
+   Western Argentina Summer Time (WARST) is 3 hours behind the prime
+meridian all year.  There is a dummy fall-back transition on December 31
+at 25:00 daylight saving time (i.e., 24:00 standard time, equivalent to
+January 1 at 00:00 standard time), and a simultaneous spring-forward
+transition on January 1 at 00:00 standard time, so daylight saving time
+is in effect all year and the initial 'WART' is a placeholder.
+
+     WART4WARST,J1/0,J365/25
+
+   Western Greenland Time (WGT) and Western Greenland Summer Time (WGST)
+are 3 hours behind UTC in the winter.  Its clocks follow the European
+Union rules of springing forward by one hour on March's last Sunday at
+01:00 UTC (-02:00 local time) and falling back on October's last Sunday
+at 01:00 UTC (-01:00 local time).
+
+     WGT3WGST,M3.5.0/-2,M10.5.0/-1
+
+   The schedule of Daylight Saving Time in any particular jurisdiction
+has changed over the years.  To be strictly correct, the conversion of
+dates and times in the past should be based on the schedule that was in
+effect then.  However, this format has no facilities to let you specify
+how the schedule has changed from year to year.  The most you can do is
+specify one particular schedule--usually the present day schedule--and
+this is used to convert any date, no matter when.  For precise time zone
+specifications, it is best to use the time zone information database
+(see below).
+
+   The third format looks like this:
+
+     :CHARACTERS
+
+   Each operating system interprets this format differently; in the GNU
+C Library, CHARACTERS is the name of a file which describes the time
+zone.
+
+   If the 'TZ' environment variable does not have a value, the operation
+chooses a time zone by default.  In the GNU C Library, the default time
+zone is like the specification 'TZ=:/etc/localtime' (or
+'TZ=:/usr/local/etc/localtime', depending on how the GNU C Library was
+configured; *note Installation::).  Other C libraries use their own rule
+for choosing the default time zone, so there is little we can say about
+them.
+
+   If CHARACTERS begins with a slash, it is an absolute file name;
+otherwise the library looks for the file
+'/share/lib/zoneinfo/CHARACTERS'.  The 'zoneinfo' directory contains
+data files describing local time zones in many different parts of the
+world.  The names represent major cities, with subdirectories for
+geographical areas; for example, 'America/New_York', 'Europe/London',
+'Asia/Hong_Kong'.  These data files are installed by the system
+administrator, who also sets '/etc/localtime' to point to the data file
+for the local time zone.  The GNU C Library comes with a large database
+of time zone information for most regions of the world, which is
+maintained by a community of volunteers and put in the public domain.
+
+
+File: libc.info,  Node: Time Zone Functions,  Next: Time Functions Example,  Prev: TZ Variable,  Up: Calendar Time
+
+21.4.8 Functions and Variables for Time Zones
+---------------------------------------------
+
+ -- Variable: char * tzname [2]
+     The array 'tzname' contains two strings, which are the standard
+     names of the pair of time zones (standard and Daylight Saving) that
+     the user has selected.  'tzname[0]' is the name of the standard
+     time zone (for example, '"EST"'), and 'tzname[1]' is the name for
+     the time zone when Daylight Saving Time is in use (for example,
+     '"EDT"').  These correspond to the STD and DST strings
+     (respectively) from the 'TZ' environment variable.  If Daylight
+     Saving Time is never used, 'tzname[1]' is the empty string.
+
+     The 'tzname' array is initialized from the 'TZ' environment
+     variable whenever 'tzset', 'ctime', 'strftime', 'mktime', or
+     'localtime' is called.  If multiple abbreviations have been used
+     (e.g.  '"EWT"' and '"EDT"' for U.S. Eastern War Time and Eastern
+     Daylight Time), the array contains the most recent abbreviation.
+
+     The 'tzname' array is required for POSIX.1 compatibility, but in
+     GNU programs it is better to use the 'tm_zone' member of the
+     broken-down time structure, since 'tm_zone' reports the correct
+     abbreviation even when it is not the latest one.
+
+     Though the strings are declared as 'char *' the user must refrain
+     from modifying these strings.  Modifying the strings will almost
+     certainly lead to trouble.
+
+ -- Function: void tzset (void)
+     Preliminary: | MT-Safe env locale | AS-Unsafe heap lock | AC-Unsafe
+     lock mem fd | *Note POSIX Safety Concepts::.
+
+     The 'tzset' function initializes the 'tzname' variable from the
+     value of the 'TZ' environment variable.  It is not usually
+     necessary for your program to call this function, because it is
+     called automatically when you use the other time conversion
+     functions that depend on the time zone.
+
+   The following variables are defined for compatibility with System V
+Unix.  Like 'tzname', these variables are set by calling 'tzset' or the
+other time conversion functions.
+
+ -- Variable: long int timezone
+     This contains the difference between UTC and the latest local
+     standard time, in seconds west of UTC. For example, in the U.S.
+     Eastern time zone, the value is '5*60*60'.  Unlike the 'tm_gmtoff'
+     member of the broken-down time structure, this value is not
+     adjusted for daylight saving, and its sign is reversed.  In GNU
+     programs it is better to use 'tm_gmtoff', since it contains the
+     correct offset even when it is not the latest one.
+
+ -- Variable: int daylight
+     This variable has a nonzero value if Daylight Saving Time rules
+     apply.  A nonzero value does not necessarily mean that Daylight
+     Saving Time is now in effect; it means only that Daylight Saving
+     Time is sometimes in effect.
+
+
+File: libc.info,  Node: Time Functions Example,  Prev: Time Zone Functions,  Up: Calendar Time
+
+21.4.9 Time Functions Example
+-----------------------------
+
+Here is an example program showing the use of some of the calendar time
+functions.
+
+
+     #include <time.h>
+     #include <stdio.h>
+
+     #define SIZE 256
 
      int
      main (void)
      {
-       uid_t me;
-       struct passwd *my_passwd;
-       struct group *my_group;
-       char **members;
+       char buffer[SIZE];
+       time_t curtime;
+       struct tm *loctime;
 
-       /* Get information about the user ID. */
-       me = getuid ();
-       my_passwd = getpwuid (me);
-       if (!my_passwd)
-         {
-           printf ("Couldn't find out about user %d.\n", (int) me);
-           exit (EXIT_FAILURE);
-         }
+       /* Get the current time. */
+       curtime = time (NULL);
 
-       /* Print the information. */
-       printf ("I am %s.\n", my_passwd->pw_gecos);
-       printf ("My login name is %s.\n", my_passwd->pw_name);
-       printf ("My uid is %d.\n", (int) (my_passwd->pw_uid));
-       printf ("My home directory is %s.\n", my_passwd->pw_dir);
-       printf ("My default shell is %s.\n", my_passwd->pw_shell);
+       /* Convert it to local time representation. */
+       loctime = localtime (&curtime);
 
-       /* Get information about the default group ID. */
-       my_group = getgrgid (my_passwd->pw_gid);
-       if (!my_group)
-         {
-           printf ("Couldn't find out about group %d.\n",
-                   (int) my_passwd->pw_gid);
-           exit (EXIT_FAILURE);
-         }
+       /* Print out the date and time in the standard format. */
+       fputs (asctime (loctime), stdout);
 
-       /* Print the information. */
-       printf ("My default group is %s (%d).\n",
-               my_group->gr_name, (int) (my_passwd->pw_gid));
-       printf ("The members of this group are:\n");
-       members = my_group->gr_mem;
-       while (*members)
-         {
-           printf ("  %s\n", *(members));
-           members++;
-         }
+       /* Print it out in a nice format. */
+       strftime (buffer, SIZE, "Today is %A, %B %d.\n", loctime);
+       fputs (buffer, stdout);
+       strftime (buffer, SIZE, "The time is %I:%M %p.\n", loctime);
+       fputs (buffer, stdout);
 
-       return EXIT_SUCCESS;
+       return 0;
      }
 
-   Here is some output from this program:
+   It produces output like this:
 
-     I am Throckmorton Snurd.
-     My login name is snurd.
-     My uid is 31093.
-     My home directory is /home/fsg/snurd.
-     My default shell is /bin/sh.
-     My default group is guest (12).
-     The members of this group are:
-       friedman
-       tami
+     Wed Jul 31 13:02:36 1991
+     Today is Wednesday, July 31.
+     The time is 01:02 PM.
 
 
-File: libc.info,  Node: Netgroup Database,  Prev: Database Example,  Up: Users and Groups
+File: libc.info,  Node: Setting an Alarm,  Next: Sleeping,  Prev: Calendar Time,  Up: Date and Time
 
-29.16 Netgroup Database
-=======================
+21.5 Setting an Alarm
+=====================
 
-* Menu:
+The 'alarm' and 'setitimer' functions provide a mechanism for a process
+to interrupt itself in the future.  They do this by setting a timer;
+when the timer expires, the process receives a signal.
 
-* Netgroup Data::                  Data in the Netgroup database and where
-                                   it comes from.
-* Lookup Netgroup::                How to look for a particular netgroup.
-* Netgroup Membership::            How to test for netgroup membership.
+   Each process has three independent interval timers available:
 
-
-File: libc.info,  Node: Netgroup Data,  Next: Lookup Netgroup,  Up: Netgroup Database
+   * A real-time timer that counts elapsed time.  This timer sends a
+     'SIGALRM' signal to the process when it expires.
 
-29.16.1 Netgroup Data
----------------------
+   * A virtual timer that counts processor time used by the process.
+     This timer sends a 'SIGVTALRM' signal to the process when it
+     expires.
 
-Sometimes it is useful to group users according to other criteria
-(*note Group Database::).  E.g., it is useful to associate a certain
-group of users with a certain machine.  On the other hand grouping of
-host names is not supported so far.
+   * A profiling timer that counts both processor time used by the
+     process, and processor time spent in system calls on behalf of the
+     process.  This timer sends a 'SIGPROF' signal to the process when
+     it expires.
 
-   In Sun Microsystems SunOS appeared a new kind of database, the
-netgroup database.  It allows grouping hosts, users, and domains
-freely, giving them individual names.  To be more concrete, a netgroup
-is a list of triples consisting of a host name, a user name, and a
-domain name where any of the entries can be a wildcard entry matching
-all inputs.  A last possibility is that names of other netgroups can
-also be given in the list specifying a netgroup.  So one can construct
-arbitrary hierarchies without loops.
+     This timer is useful for profiling in interpreters.  The interval
+     timer mechanism does not have the fine granularity necessary for
+     profiling native code.
 
-   Sun's implementation allows netgroups only for the `nis' or
-`nisplus' service, *note Services in the NSS configuration::.  The
-implementation in the GNU C Library has no such restriction.  An entry
-in either of the input services must have the following form:
+   You can only have one timer of each kind set at any given time.  If
+you set a timer that has not yet expired, that timer is simply reset to
+the new value.
 
-     GROUPNAME ( GROUPNAME | `('HOSTNAME`,'USERNAME`,'`domainname'`)' )+
+   You should establish a handler for the appropriate alarm signal using
+'signal' or 'sigaction' before issuing a call to 'setitimer' or 'alarm'.
+Otherwise, an unusual chain of events could cause the timer to expire
+before your program establishes the handler.  In this case it would be
+terminated, since termination is the default action for the alarm
+signals.  *Note Signal Handling::.
 
-   Any of the fields in the triple can be empty which means anything
-matches.  While describing the functions we will see that the opposite
-case is useful as well.  I.e., there may be entries which will not
-match any input.  For entries like this, a name consisting of the single
-character `-' shall be used.
+   To be able to use the alarm function to interrupt a system call which
+might block otherwise indefinitely it is important to _not_ set the
+'SA_RESTART' flag when registering the signal handler using 'sigaction'.
+When not using 'sigaction' things get even uglier: the 'signal' function
+has to fixed semantics with respect to restarts.  The BSD semantics for
+this function is to set the flag.  Therefore, if 'sigaction' for
+whatever reason cannot be used, it is necessary to use 'sysv_signal' and
+not 'signal'.
 
-
-File: libc.info,  Node: Lookup Netgroup,  Next: Netgroup Membership,  Prev: Netgroup Data,  Up: Netgroup Database
+   The 'setitimer' function is the primary means for setting an alarm.
+This facility is declared in the header file 'sys/time.h'.  The 'alarm'
+function, declared in 'unistd.h', provides a somewhat simpler interface
+for setting the real-time timer.
 
-29.16.2 Looking up one Netgroup
--------------------------------
+ -- Data Type: struct itimerval
+     This structure is used to specify when a timer should expire.  It
+     contains the following members:
+     'struct timeval it_interval'
+          This is the period between successive timer interrupts.  If
+          zero, the alarm will only be sent once.
 
-The lookup functions for netgroups are a bit different to all other
-system database handling functions.  Since a single netgroup can contain
-many entries a two-step process is needed.  First a single netgroup is
-selected and then one can iterate over all entries in this netgroup.
-These functions are declared in `netdb.h'.
+     'struct timeval it_value'
+          This is the period between now and the first timer interrupt.
+          If zero, the alarm is disabled.
 
- -- Function: int setnetgrent (const char *NETGROUP)
-     Preliminary: | MT-Unsafe race:netgrent locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
+     The 'struct timeval' data type is described in *note Elapsed
+     Time::.
+
+ -- Function: int setitimer (int WHICH, const struct itimerval *NEW,
+          struct itimerval *OLD)
+     Preliminary: | MT-Safe timer | AS-Safe | AC-Safe | *Note POSIX
      Safety Concepts::.
 
-     A call to this function initializes the internal state of the
-     library to allow following calls of the `getnetgrent' to iterate
-     over all entries in the netgroup with name NETGROUP.
+     The 'setitimer' function sets the timer specified by WHICH
+     according to NEW.  The WHICH argument can have a value of
+     'ITIMER_REAL', 'ITIMER_VIRTUAL', or 'ITIMER_PROF'.
 
-     When the call is successful (i.e., when a netgroup with this name
-     exists) the return value is `1'.  When the return value is `0' no
-     netgroup of this name is known or some other error occurred.
+     If OLD is not a null pointer, 'setitimer' returns information about
+     any previous unexpired timer of the same kind in the structure it
+     points to.
 
-   It is important to remember that there is only one single state for
-iterating the netgroups.  Even if the programmer uses the
-`getnetgrent_r' function the result is not really reentrant since
-always only one single netgroup at a time can be processed.  If the
-program needs to process more than one netgroup simultaneously she must
-protect this by using external locking.  This problem was introduced in
-the original netgroups implementation in SunOS and since we must stay
-compatible it is not possible to change this.
+     The return value is '0' on success and '-1' on failure.  The
+     following 'errno' error conditions are defined for this function:
 
-   Some other functions also use the netgroups state.  Currently these
-are the `innetgr' function and parts of the implementation of the
-`compat' service part of the NSS implementation.
+     'EINVAL'
+          The timer period is too large.
 
- -- Function: int getnetgrent (char **HOSTP, char **USERP, char
-          **DOMAINP)
-     Preliminary: | MT-Unsafe race:netgrent race:netgrentbuf locale |
-     AS-Unsafe dlopen plugin heap lock | AC-Unsafe corrupt lock fd mem
+ -- Function: int getitimer (int WHICH, struct itimerval *OLD)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'getitimer' function stores information about the timer
+     specified by WHICH in the structure pointed at by OLD.
+
+     The return value and error conditions are the same as for
+     'setitimer'.
+
+'ITIMER_REAL'
+     This constant can be used as the WHICH argument to the 'setitimer'
+     and 'getitimer' functions to specify the real-time timer.
+
+'ITIMER_VIRTUAL'
+     This constant can be used as the WHICH argument to the 'setitimer'
+     and 'getitimer' functions to specify the virtual timer.
+
+'ITIMER_PROF'
+     This constant can be used as the WHICH argument to the 'setitimer'
+     and 'getitimer' functions to specify the profiling timer.
+
+ -- Function: unsigned int alarm (unsigned int SECONDS)
+     Preliminary: | MT-Safe timer | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'alarm' function sets the real-time timer to expire in SECONDS
+     seconds.  If you want to cancel any existing alarm, you can do this
+     by calling 'alarm' with a SECONDS argument of zero.
+
+     The return value indicates how many seconds remain before the
+     previous alarm would have been sent.  If there is no previous
+     alarm, 'alarm' returns zero.
+
+   The 'alarm' function could be defined in terms of 'setitimer' like
+this:
+
+     unsigned int
+     alarm (unsigned int seconds)
+     {
+       struct itimerval old, new;
+       new.it_interval.tv_usec = 0;
+       new.it_interval.tv_sec = 0;
+       new.it_value.tv_usec = 0;
+       new.it_value.tv_sec = (long int) seconds;
+       if (setitimer (ITIMER_REAL, &new, &old) < 0)
+         return 0;
+       else
+         return old.it_value.tv_sec;
+     }
+
+   There is an example showing the use of the 'alarm' function in *note
+Handler Returns::.
+
+   If you simply want your process to wait for a given number of
+seconds, you should use the 'sleep' function.  *Note Sleeping::.
+
+   You shouldn't count on the signal arriving precisely when the timer
+expires.  In a multiprocessing environment there is typically some
+amount of delay involved.
+
+   *Portability Note:* The 'setitimer' and 'getitimer' functions are
+derived from BSD Unix, while the 'alarm' function is specified by the
+POSIX.1 standard.  'setitimer' is more powerful than 'alarm', but
+'alarm' is more widely used.
+
+
+File: libc.info,  Node: Sleeping,  Prev: Setting an Alarm,  Up: Date and Time
+
+21.6 Sleeping
+=============
+
+The function 'sleep' gives a simple way to make the program wait for a
+short interval.  If your program doesn't use signals (except to
+terminate), then you can expect 'sleep' to wait reliably throughout the
+specified interval.  Otherwise, 'sleep' can return sooner if a signal
+arrives; if you want to wait for a given interval regardless of signals,
+use 'select' (*note Waiting for I/O::) and don't specify any descriptors
+to wait for.
+
+ -- Function: unsigned int sleep (unsigned int SECONDS)
+     Preliminary: | MT-Unsafe sig:SIGCHLD/linux | AS-Unsafe | AC-Unsafe
      | *Note POSIX Safety Concepts::.
 
-     This function returns the next unprocessed entry of the currently
-     selected netgroup.  The string pointers, in which addresses are
-     passed in the arguments HOSTP, USERP, and DOMAINP, will contain
-     after a successful call pointers to appropriate strings.  If the
-     string in the next entry is empty the pointer has the value `NULL'.
-     The returned string pointers are only valid if none of the netgroup
-     related functions are called.
+     The 'sleep' function waits for SECONDS or until a signal is
+     delivered, whichever happens first.
 
-     The return value is `1' if the next entry was successfully read.  A
-     value of `0' means no further entries exist or internal errors
-     occurred.
+     If 'sleep' function returns because the requested interval is over,
+     it returns a value of zero.  If it returns because of delivery of a
+     signal, its return value is the remaining time in the sleep
+     interval.
 
- -- Function: int getnetgrent_r (char **HOSTP, char **USERP, char
-          **DOMAINP, char *BUFFER, size_t BUFLEN)
-     Preliminary: | MT-Unsafe race:netgrent locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
-     Safety Concepts::.
+     The 'sleep' function is declared in 'unistd.h'.
 
-     This function is similar to `getnetgrent' with only one exception:
-     the strings the three string pointers HOSTP, USERP, and DOMAINP
-     point to, are placed in the buffer of BUFLEN bytes starting at
-     BUFFER.  This means the returned values are valid even after other
-     netgroup related functions are called.
+   Resist the temptation to implement a sleep for a fixed amount of time
+by using the return value of 'sleep', when nonzero, to call 'sleep'
+again.  This will work with a certain amount of accuracy as long as
+signals arrive infrequently.  But each signal can cause the eventual
+wakeup time to be off by an additional second or so.  Suppose a few
+signals happen to arrive in rapid succession by bad luck--there is no
+limit on how much this could shorten or lengthen the wait.
 
-     The return value is `1' if the next entry was successfully read and
-     the buffer contains enough room to place the strings in it.  `0' is
-     returned in case no more entries are found, the buffer is too
-     small, or internal errors occurred.
+   Instead, compute the calendar time at which the program should stop
+waiting, and keep trying to wait until that calendar time.  This won't
+be off by more than a second.  With just a little more work, you can use
+'select' and make the waiting period quite accurate.  (Of course, heavy
+system load can cause additional unavoidable delays--unless the machine
+is dedicated to one application, there is no way you can avoid this.)
 
-     This function is a GNU extension.  The original implementation in
-     the SunOS libc does not provide this function.
+   On some systems, 'sleep' can do strange things if your program uses
+'SIGALRM' explicitly.  Even if 'SIGALRM' signals are being ignored or
+blocked when 'sleep' is called, 'sleep' might return prematurely on
+delivery of a 'SIGALRM' signal.  If you have established a handler for
+'SIGALRM' signals and a 'SIGALRM' signal is delivered while the process
+is sleeping, the action taken might be just to cause 'sleep' to return
+instead of invoking your handler.  And, if 'sleep' is interrupted by
+delivery of a signal whose handler requests an alarm or alters the
+handling of 'SIGALRM', this handler and 'sleep' will interfere.
 
- -- Function: void endnetgrent (void)
-     Preliminary: | MT-Unsafe race:netgrent | AS-Unsafe dlopen plugin
-     heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX Safety
+   On GNU systems, it is safe to use 'sleep' and 'SIGALRM' in the same
+program, because 'sleep' does not work by means of 'SIGALRM'.
+
+ -- Function: int nanosleep (const struct timespec *REQUESTED_TIME,
+          struct timespec *REMAINING)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This function frees all buffers which were allocated to process
-     the last selected netgroup.  As a result all string pointers
-     returned by calls to `getnetgrent' are invalid afterwards.
+     If resolution to seconds is not enough the 'nanosleep' function can
+     be used.  As the name suggests the sleep interval can be specified
+     in nanoseconds.  The actual elapsed time of the sleep interval
+     might be longer since the system rounds the elapsed time you
+     request up to the next integer multiple of the actual resolution
+     the system can deliver.
+
+     *'requested_time' is the elapsed time of the interval you want to
+     sleep.
+
+     The function returns as *'remaining' the elapsed time left in the
+     interval for which you requested to sleep.  If the interval
+     completed without getting interrupted by a signal, this is zero.
+
+     'struct timespec' is described in *Note Elapsed Time::.
+
+     If the function returns because the interval is over the return
+     value is zero.  If the function returns -1 the global variable
+     ERRNO is set to the following values:
+
+     'EINTR'
+          The call was interrupted because a signal was delivered to the
+          thread.  If the REMAINING parameter is not the null pointer
+          the structure pointed to by REMAINING is updated to contain
+          the remaining elapsed time.
+
+     'EINVAL'
+          The nanosecond value in the REQUESTED_TIME parameter contains
+          an illegal value.  Either the value is negative or greater
+          than or equal to 1000 million.
+
+     This function is a cancellation point in multi-threaded programs.
+     This is a problem if the thread allocates some resources (like
+     memory, file descriptors, semaphores or whatever) at the time
+     'nanosleep' is called.  If the thread gets canceled these resources
+     stay allocated until the program ends.  To avoid this calls to
+     'nanosleep' should be protected using cancellation handlers.
+
+     The 'nanosleep' function is declared in 'time.h'.
 
 
-File: libc.info,  Node: Netgroup Membership,  Prev: Lookup Netgroup,  Up: Netgroup Database
+File: libc.info,  Node: Resource Usage And Limitation,  Next: Non-Local Exits,  Prev: Date and Time,  Up: Top
 
-29.16.3 Testing for Netgroup Membership
----------------------------------------
+22 Resource Usage And Limitation
+********************************
 
-It is often not necessary to scan the whole netgroup since often the
-only interesting question is whether a given entry is part of the
-selected netgroup.
-
- -- Function: int innetgr (const char *NETGROUP, const char *HOST,
-          const char *USER, const char *DOMAIN)
-     Preliminary: | MT-Unsafe race:netgrent locale | AS-Unsafe dlopen
-     plugin heap lock | AC-Unsafe corrupt lock fd mem | *Note POSIX
-     Safety Concepts::.
-
-     This function tests whether the triple specified by the parameters
-     HOSTP, USERP, and DOMAINP is part of the netgroup NETGROUP.  Using
-     this function has the advantage that
-
-       1. no other netgroup function can use the global netgroup state
-          since internal locking is used and
-
-       2. the function is implemented more efficiently than successive
-          calls to the other `set'/`get'/`endnetgrent' functions.
-
-     Any of the pointers HOSTP, USERP, and DOMAINP can be `NULL' which
-     means any value is accepted in this position.  This is also true
-     for the name `-' which should not match any other string otherwise.
-
-     The return value is `1' if an entry matching the given triple is
-     found in the netgroup.  The return value is `0' if the netgroup
-     itself is not found, the netgroup does not contain the triple or
-     internal errors occurred.
-
-
-File: libc.info,  Node: System Management,  Next: System Configuration,  Prev: Users and Groups,  Up: Top
-
-30 System Management
-********************
-
-This chapter describes facilities for controlling the system that
-underlies a process (including the operating system and hardware) and
-for getting information about it.  Anyone can generally use the
-informational facilities, but usually only a properly privileged process
-can make changes.
+This chapter describes functions for examining how much of various kinds
+of resources (CPU time, memory, etc.)  a process has used and getting
+and setting limits on future usage.
 
 * Menu:
 
-* Host Identification::         Determining the name of the machine.
-* Platform Type::               Determining operating system and basic
-                                  machine type
-* Filesystem Handling::         Controlling/querying mounts
-* System Parameters::           Getting and setting various system parameters
-
-   To get information on parameters of the system that are built into
-the system, such as the maximum length of a filename, *note System
-Configuration::.
+* Resource Usage::		Measuring various resources used.
+* Limits on Resources::		Specifying limits on resource usage.
+* Priority::			Reading or setting process run priority.
+* Memory Resources::            Querying memory available resources.
+* Processor Resources::         Learn about the processors available.
 
 
-File: libc.info,  Node: Host Identification,  Next: Platform Type,  Up: System Management
+File: libc.info,  Node: Resource Usage,  Next: Limits on Resources,  Up: Resource Usage And Limitation
 
-30.1 Host Identification
-========================
+22.1 Resource Usage
+===================
 
-This section explains how to identify the particular system on which
-your program is running.  First, let's review the various ways computer
-systems are named, which is a little complicated because of the history
-of the development of the Internet.
+The function 'getrusage' and the data type 'struct rusage' are used to
+examine the resource usage of a process.  They are declared in
+'sys/resource.h'.
 
-   Every Unix system (also known as a host) has a host name, whether
-it's connected to a network or not.  In its simplest form, as used
-before computer networks were an issue, it's just a word like `chicken'.  
-
-   But any system attached to the Internet or any network like it
-conforms to a more rigorous naming convention as part of the Domain
-Name System (DNS).  In DNS, every host name is composed of two parts: 
-
-  1. hostname 
-
-  2. domain name 
-
-   You will note that "hostname" looks a lot like "host name", but is
-not the same thing, and that people often incorrectly refer to entire
-host names as "domain names."
-
-   In DNS, the full host name is properly called the FQDN (Fully
-Qualified Domain Name) and consists of the hostname, then a period,
-then the domain name.  The domain name itself usually has multiple
-components separated by periods.  So for example, a system's hostname
-may be `chicken' and its domain name might be `ai.mit.edu', so its FQDN
-(which is its host name) is `chicken.ai.mit.edu'.  
-
-   Adding to the confusion, though, is that DNS is not the only name
-space in which a computer needs to be known.  Another name space is the
-NIS (aka YP) name space.  For NIS purposes, there is another domain
-name, which is called the NIS domain name or the YP domain name.  It
-need not have anything to do with the DNS domain name.  
-
-   Confusing things even more is the fact that in DNS, it is possible
-for multiple FQDNs to refer to the same system.  However, there is
-always exactly one of them that is the true host name, and it is called
-the canonical FQDN.
-
-   In some contexts, the host name is called a "node name."
-
-   For more information on DNS host naming, see *note Host Names::.
-
-   Prototypes for these functions appear in `unistd.h'.
-
-   The programs `hostname', `hostid', and `domainname' work by calling
-these functions.
-
- -- Function: int gethostname (char *NAME, size_t SIZE)
+ -- Function: int getrusage (int PROCESSES, struct rusage *RUSAGE)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This function returns the host name of the system on which it is
-     called, in the array NAME.  The SIZE argument specifies the size of
-     this array, in bytes.  Note that this is _not_ the DNS hostname.
-     If the system participates in DNS, this is the FQDN (see above).
+     This function reports resource usage totals for processes specified
+     by PROCESSES, storing the information in '*RUSAGE'.
 
-     The return value is `0' on success and `-1' on failure.  In the
-     GNU C Library, `gethostname' fails if SIZE is not large enough;
-     then you can try again with a larger array.  The following `errno'
-     error condition is defined for this function:
+     In most systems, PROCESSES has only two valid values:
 
-    `ENAMETOOLONG'
-          The SIZE argument is less than the size of the host name plus
-          one.
+     'RUSAGE_SELF'
+          Just the current process.
 
-     On some systems, there is a symbol for the maximum possible host
-     name length: `MAXHOSTNAMELEN'.  It is defined in `sys/param.h'.
-     But you can't count on this to exist, so it is cleaner to handle
-     failure and try again.
+     'RUSAGE_CHILDREN'
+          All child processes (direct and indirect) that have already
+          terminated.
 
-     `gethostname' stores the beginning of the host name in NAME even
-     if the host name won't entirely fit.  For some purposes, a
-     truncated host name is good enough.  If it is, you can ignore the
-     error code.
+     The return value of 'getrusage' is zero for success, and '-1' for
+     failure.
 
- -- Function: int sethostname (const char *NAME, size_t LENGTH)
+     'EINVAL'
+          The argument PROCESSES is not valid.
+
+   One way of getting resource usage for a particular child process is
+with the function 'wait4', which returns totals for a child when it
+terminates.  *Note BSD Wait Functions::.
+
+ -- Data Type: struct rusage
+     This data type stores various resource usage statistics.  It has
+     the following members, and possibly others:
+
+     'struct timeval ru_utime'
+          Time spent executing user instructions.
+
+     'struct timeval ru_stime'
+          Time spent in operating system code on behalf of PROCESSES.
+
+     'long int ru_maxrss'
+          The maximum resident set size used, in kilobytes.  That is,
+          the maximum number of kilobytes of physical memory that
+          PROCESSES used simultaneously.
+
+     'long int ru_ixrss'
+          An integral value expressed in kilobytes times ticks of
+          execution, which indicates the amount of memory used by text
+          that was shared with other processes.
+
+     'long int ru_idrss'
+          An integral value expressed the same way, which is the amount
+          of unshared memory used for data.
+
+     'long int ru_isrss'
+          An integral value expressed the same way, which is the amount
+          of unshared memory used for stack space.
+
+     'long int ru_minflt'
+          The number of page faults which were serviced without
+          requiring any I/O.
+
+     'long int ru_majflt'
+          The number of page faults which were serviced by doing I/O.
+
+     'long int ru_nswap'
+          The number of times PROCESSES was swapped entirely out of main
+          memory.
+
+     'long int ru_inblock'
+          The number of times the file system had to read from the disk
+          on behalf of PROCESSES.
+
+     'long int ru_oublock'
+          The number of times the file system had to write to the disk
+          on behalf of PROCESSES.
+
+     'long int ru_msgsnd'
+          Number of IPC messages sent.
+
+     'long int ru_msgrcv'
+          Number of IPC messages received.
+
+     'long int ru_nsignals'
+          Number of signals received.
+
+     'long int ru_nvcsw'
+          The number of times PROCESSES voluntarily invoked a context
+          switch (usually to wait for some service).
+
+     'long int ru_nivcsw'
+          The number of times an involuntary context switch took place
+          (because a time slice expired, or another process of higher
+          priority was scheduled).
+
+   'vtimes' is a historical function that does some of what 'getrusage'
+does.  'getrusage' is a better choice.
+
+   'vtimes' and its 'vtimes' data structure are declared in
+'sys/vtimes.h'.
+
+ -- Function: int vtimes (struct vtimes *CURRENT, struct vtimes *CHILD)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `sethostname' function sets the host name of the system that
-     calls it to NAME, a string with length LENGTH.  Only privileged
-     processes are permitted to do this.
+     'vtimes' reports resource usage totals for a process.
 
-     Usually `sethostname' gets called just once, at system boot time.
-     Often, the program that calls it sets it to the value it finds in
-     the file `/etc/hostname'.  
+     If CURRENT is non-null, 'vtimes' stores resource usage totals for
+     the invoking process alone in the structure to which it points.  If
+     CHILD is non-null, 'vtimes' stores resource usage totals for all
+     past children (which have terminated) of the invoking process in
+     the structure to which it points.
 
-     Be sure to set the host name to the full host name, not just the
-     DNS hostname (see above).
+      -- Data Type: struct vtimes
+          This data type contains information about the resource usage
+          of a process.  Each member corresponds to a member of the
+          'struct rusage' data type described above.
 
-     The return value is `0' on success and `-1' on failure.  The
-     following `errno' error condition is defined for this function:
+          'vm_utime'
+               User CPU time.  Analogous to 'ru_utime' in 'struct
+               rusage'
+          'vm_stime'
+               System CPU time.  Analogous to 'ru_stime' in 'struct
+               rusage'
+          'vm_idsrss'
+               Data and stack memory.  The sum of the values that would
+               be reported as 'ru_idrss' and 'ru_isrss' in 'struct
+               rusage'
+          'vm_ixrss'
+               Shared memory.  Analogous to 'ru_ixrss' in 'struct
+               rusage'
+          'vm_maxrss'
+               Maximent resident set size.  Analogous to 'ru_maxrss' in
+               'struct rusage'
+          'vm_majflt'
+               Major page faults.  Analogous to 'ru_majflt' in 'struct
+               rusage'
+          'vm_minflt'
+               Minor page faults.  Analogous to 'ru_minflt' in 'struct
+               rusage'
+          'vm_nswap'
+               Swap count.  Analogous to 'ru_nswap' in 'struct rusage'
+          'vm_inblk'
+               Disk reads.  Analogous to 'ru_inblk' in 'struct rusage'
+          'vm_oublk'
+               Disk writes.  Analogous to 'ru_oublk' in 'struct rusage'
 
-    `EPERM'
-          This process cannot set the host name because it is not
-          privileged.
+     The return value is zero if the function succeeds; '-1' otherwise.
 
- -- Function: int getdomainnname (char *NAME, size_t LENGTH)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `getdomainname' returns the NIS (aka YP) domain name of the system
-     on which it is called.  Note that this is not the more popular DNS
-     domain name.  Get that with `gethostname'.
-
-     The specifics of this function are analogous to `gethostname',
-     above.
-
-
- -- Function: int setdomainname (const char *NAME, size_t LENGTH)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `getdomainname' sets the NIS (aka YP) domain name of the system on
-     which it is called.  Note that this is not the more popular DNS
-     domain name.  Set that with `sethostname'.
-
-     The specifics of this function are analogous to `sethostname',
-     above.
-
-
- -- Function: long int gethostid (void)
-     Preliminary: | MT-Safe hostid env locale | AS-Unsafe dlopen plugin
-     corrupt heap lock | AC-Unsafe lock corrupt mem fd | *Note POSIX
-     Safety Concepts::.
-
-     This function returns the "host ID" of the machine the program is
-     running on.  By convention, this is usually the primary Internet
-     IP address of that machine, converted to a `long int'.  However,
-     on some systems it is a meaningless but unique number which is
-     hard-coded for each machine.
-
-     This is not widely used.  It arose in BSD 4.2, but was dropped in
-     BSD 4.4.  It is not required by POSIX.
-
-     The proper way to query the IP address is to use `gethostbyname'
-     on the results of `gethostname'.  For more information on IP
-     addresses, *Note Host Addresses::.
-
- -- Function: int sethostid (long int ID)
-     Preliminary: | MT-Unsafe const:hostid | AS-Unsafe | AC-Unsafe
-     corrupt fd | *Note POSIX Safety Concepts::.
-
-     The `sethostid' function sets the "host ID" of the host machine to
-     ID.  Only privileged processes are permitted to do this.  Usually
-     it happens just once, at system boot time.
-
-     The proper way to establish the primary IP address of a system is
-     to configure the IP address resolver to associate that IP address
-     with the system's host name as returned by `gethostname'.  For
-     example, put a record for the system in `/etc/hosts'.
-
-     See `gethostid' above for more information on host ids.
-
-     The return value is `0' on success and `-1' on failure.  The
-     following `errno' error conditions are defined for this function:
-
-    `EPERM'
-          This process cannot set the host name because it is not
-          privileged.
-
-    `ENOSYS'
-          The operating system does not support setting the host ID.
-          On some systems, the host ID is a meaningless but unique
-          number hard-coded for each machine.
+   An additional historical function for examining resource usage,
+'vtimes', is supported but not documented here.  It is declared in
+'sys/vtimes.h'.
 
 
-File: libc.info,  Node: Platform Type,  Next: Filesystem Handling,  Prev: Host Identification,  Up: System Management
+File: libc.info,  Node: Limits on Resources,  Next: Priority,  Prev: Resource Usage,  Up: Resource Usage And Limitation
 
-30.2 Platform Type Identification
-=================================
+22.2 Limiting Resource Usage
+============================
 
-You can use the `uname' function to find out some information about the
-type of computer your program is running on.  This function and the
-associated data type are declared in the header file `sys/utsname.h'.  
+You can specify limits for the resource usage of a process.  When the
+process tries to exceed a limit, it may get a signal, or the system call
+by which it tried to do so may fail, depending on the resource.  Each
+process initially inherits its limit values from its parent, but it can
+subsequently change them.
 
-   As a bonus, `uname' also gives some information identifying the
-particular system your program is running on.  This is the same
-information which you can get with functions targeted to this purpose
-described in *note Host Identification::.
+   There are two per-process limits associated with a resource:
 
- -- Data Type: struct utsname
-     The `utsname' structure is used to hold information returned by
-     the `uname' function.  It has the following members:
+"current limit"
+     The current limit is the value the system will not allow usage to
+     exceed.  It is also called the "soft limit" because the process
+     being limited can generally raise the current limit at will.
 
-    `char sysname[]'
-          This is the name of the operating system in use.
+"maximum limit"
+     The maximum limit is the maximum value to which a process is
+     allowed to set its current limit.  It is also called the "hard
+     limit" because there is no way for a process to get around it.  A
+     process may lower its own maximum limit, but only the superuser may
+     increase a maximum limit.
 
-    `char release[]'
-          This is the current release level of the operating system
-          implementation.
+   The symbols for use with 'getrlimit', 'setrlimit', 'getrlimit64', and
+'setrlimit64' are defined in 'sys/resource.h'.
 
-    `char version[]'
-          This is the current version level within the release of the
-          operating system.
-
-    `char machine[]'
-          This is a description of the type of hardware that is in use.
-
-          Some systems provide a mechanism to interrogate the kernel
-          directly for this information.  On systems without such a
-          mechanism, the GNU C Library fills in this field based on the
-          configuration name that was specified when building and
-          installing the library.
-
-          GNU uses a three-part name to describe a system
-          configuration; the three parts are CPU, MANUFACTURER and
-          SYSTEM-TYPE, and they are separated with dashes.  Any
-          possible combination of three names is potentially
-          meaningful, but most such combinations are meaningless in
-          practice and even the meaningful ones are not necessarily
-          supported by any particular GNU program.
-
-          Since the value in `machine' is supposed to describe just the
-          hardware, it consists of the first two parts of the
-          configuration name: `CPU-MANUFACTURER'.  For example, it
-          might be one of these:
-
-               `"sparc-sun"', `"i386-ANYTHING"', `"m68k-hp"',
-               `"m68k-sony"', `"m68k-sun"', `"mips-dec"'
-
-    `char nodename[]'
-          This is the host name of this particular computer.  In the
-          GNU C Library, the value is the same as that returned by
-          `gethostname'; see *note Host Identification::.
-
-          gethostname() is implemented with a call to uname().
-
-    `char domainname[]'
-          This is the NIS or YP domain name.  It is the same value
-          returned by `getdomainname'; see *note Host Identification::.
-          This element is a relatively recent invention and use of it
-          is not as portable as use of the rest of the structure.
-
-
- -- Function: int uname (struct utsname *INFO)
+ -- Function: int getrlimit (int RESOURCE, struct rlimit *RLP)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     The `uname' function fills in the structure pointed to by INFO
-     with information about the operating system and host machine.  A
-     non-negative value indicates that the data was successfully stored.
+     Read the current and maximum limits for the resource RESOURCE and
+     store them in '*RLP'.
 
-     `-1' as the value indicates an error.  The only error possible is
-     `EFAULT', which we normally don't mention as it is always a
-     possibility.
+     The return value is '0' on success and '-1' on failure.  The only
+     possible 'errno' error condition is 'EFAULT'.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' on a
+     32-bit system this function is in fact 'getrlimit64'.  Thus, the
+     LFS interface transparently replaces the old interface.
+
+ -- Function: int getrlimit64 (int RESOURCE, struct rlimit64 *RLP)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is similar to 'getrlimit' but its second parameter is
+     a pointer to a variable of type 'struct rlimit64', which allows it
+     to read values which wouldn't fit in the member of a 'struct
+     rlimit'.
+
+     If the sources are compiled with '_FILE_OFFSET_BITS == 64' on a
+     32-bit machine, this function is available under the name
+     'getrlimit' and so transparently replaces the old interface.
+
+ -- Function: int setrlimit (int RESOURCE, const struct rlimit *RLP)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     Store the current and maximum limits for the resource RESOURCE in
+     '*RLP'.
+
+     The return value is '0' on success and '-1' on failure.  The
+     following 'errno' error condition is possible:
+
+     'EPERM'
+             * The process tried to raise a current limit beyond the
+               maximum limit.
+
+             * The process tried to raise a maximum limit, but is not
+               superuser.
+
+     When the sources are compiled with '_FILE_OFFSET_BITS == 64' on a
+     32-bit system this function is in fact 'setrlimit64'.  Thus, the
+     LFS interface transparently replaces the old interface.
+
+ -- Function: int setrlimit64 (int RESOURCE, const struct rlimit64 *RLP)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is similar to 'setrlimit' but its second parameter is
+     a pointer to a variable of type 'struct rlimit64' which allows it
+     to set values which wouldn't fit in the member of a 'struct
+     rlimit'.
+
+     If the sources are compiled with '_FILE_OFFSET_BITS == 64' on a
+     32-bit machine this function is available under the name
+     'setrlimit' and so transparently replaces the old interface.
+
+ -- Data Type: struct rlimit
+     This structure is used with 'getrlimit' to receive limit values,
+     and with 'setrlimit' to specify limit values for a particular
+     process and resource.  It has two fields:
+
+     'rlim_t rlim_cur'
+          The current limit
+
+     'rlim_t rlim_max'
+          The maximum limit.
+
+     For 'getrlimit', the structure is an output; it receives the
+     current values.  For 'setrlimit', it specifies the new values.
+
+   For the LFS functions a similar type is defined in 'sys/resource.h'.
+
+ -- Data Type: struct rlimit64
+     This structure is analogous to the 'rlimit' structure above, but
+     its components have wider ranges.  It has two fields:
+
+     'rlim64_t rlim_cur'
+          This is analogous to 'rlimit.rlim_cur', but with a different
+          type.
+
+     'rlim64_t rlim_max'
+          This is analogous to 'rlimit.rlim_max', but with a different
+          type.
+
+   Here is a list of resources for which you can specify a limit.
+Memory and file sizes are measured in bytes.
+
+'RLIMIT_CPU'
+     The maximum amount of CPU time the process can use.  If it runs for
+     longer than this, it gets a signal: 'SIGXCPU'.  The value is
+     measured in seconds.  *Note Operation Error Signals::.
+
+'RLIMIT_FSIZE'
+     The maximum size of file the process can create.  Trying to write a
+     larger file causes a signal: 'SIGXFSZ'.  *Note Operation Error
+     Signals::.
+
+'RLIMIT_DATA'
+     The maximum size of data memory for the process.  If the process
+     tries to allocate data memory beyond this amount, the allocation
+     function fails.
+
+'RLIMIT_STACK'
+     The maximum stack size for the process.  If the process tries to
+     extend its stack past this size, it gets a 'SIGSEGV' signal.  *Note
+     Program Error Signals::.
+
+'RLIMIT_CORE'
+     The maximum size core file that this process can create.  If the
+     process terminates and would dump a core file larger than this,
+     then no core file is created.  So setting this limit to zero
+     prevents core files from ever being created.
+
+'RLIMIT_RSS'
+     The maximum amount of physical memory that this process should get.
+     This parameter is a guide for the system's scheduler and memory
+     allocator; the system may give the process more memory when there
+     is a surplus.
+
+'RLIMIT_MEMLOCK'
+     The maximum amount of memory that can be locked into physical
+     memory (so it will never be paged out).
+
+'RLIMIT_NPROC'
+     The maximum number of processes that can be created with the same
+     user ID. If you have reached the limit for your user ID, 'fork'
+     will fail with 'EAGAIN'.  *Note Creating a Process::.
+
+'RLIMIT_NOFILE'
+'RLIMIT_OFILE'
+     The maximum number of files that the process can open.  If it tries
+     to open more files than this, its open attempt fails with 'errno'
+     'EMFILE'.  *Note Error Codes::.  Not all systems support this
+     limit; GNU does, and 4.4 BSD does.
+
+'RLIMIT_AS'
+     The maximum size of total memory that this process should get.  If
+     the process tries to allocate more memory beyond this amount with,
+     for example, 'brk', 'malloc', 'mmap' or 'sbrk', the allocation
+     function fails.
+
+'RLIM_NLIMITS'
+     The number of different resource limits.  Any valid RESOURCE
+     operand must be less than 'RLIM_NLIMITS'.
+
+ -- Constant: rlim_t RLIM_INFINITY
+     This constant stands for a value of "infinity" when supplied as the
+     limit value in 'setrlimit'.
+
+   The following are historical functions to do some of what the
+functions above do.  The functions above are better choices.
+
+   'ulimit' and the command symbols are declared in 'ulimit.h'.
+
+ -- Function: long int ulimit (int CMD, ...)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     'ulimit' gets the current limit or sets the current and maximum
+     limit for a particular resource for the calling process according
+     to the command CMD.a
+
+     If you are getting a limit, the command argument is the only
+     argument.  If you are setting a limit, there is a second argument:
+     'long int' LIMIT which is the value to which you are setting the
+     limit.
+
+     The CMD values and the operations they specify are:
+
+     'GETFSIZE'
+          Get the current limit on the size of a file, in units of 512
+          bytes.
+
+     'SETFSIZE'
+          Set the current and maximum limit on the size of a file to
+          LIMIT * 512 bytes.
+
+     There are also some other CMD values that may do things on some
+     systems, but they are not supported.
+
+     Only the superuser may increase a maximum limit.
+
+     When you successfully get a limit, the return value of 'ulimit' is
+     that limit, which is never negative.  When you successfully set a
+     limit, the return value is zero.  When the function fails, the
+     return value is '-1' and 'errno' is set according to the reason:
+
+     'EPERM'
+          A process tried to increase a maximum limit, but is not
+          superuser.
+
+   'vlimit' and its resource symbols are declared in 'sys/vlimit.h'.
+
+ -- Function: int vlimit (int RESOURCE, int LIMIT)
+     Preliminary: | MT-Unsafe race:setrlimit | AS-Unsafe | AC-Safe |
+     *Note POSIX Safety Concepts::.
+
+     'vlimit' sets the current limit for a resource for a process.
+
+     RESOURCE identifies the resource:
+
+     'LIM_CPU'
+          Maximum CPU time.  Same as 'RLIMIT_CPU' for 'setrlimit'.
+     'LIM_FSIZE'
+          Maximum file size.  Same as 'RLIMIT_FSIZE' for 'setrlimit'.
+     'LIM_DATA'
+          Maximum data memory.  Same as 'RLIMIT_DATA' for 'setrlimit'.
+     'LIM_STACK'
+          Maximum stack size.  Same as 'RLIMIT_STACK' for 'setrlimit'.
+     'LIM_CORE'
+          Maximum core file size.  Same as 'RLIMIT_COR' for 'setrlimit'.
+     'LIM_MAXRSS'
+          Maximum physical memory.  Same as 'RLIMIT_RSS' for
+          'setrlimit'.
+
+     The return value is zero for success, and '-1' with 'errno' set
+     accordingly for failure:
+
+     'EPERM'
+          The process tried to set its current limit beyond its maximum
+          limit.
 
 
-File: libc.info,  Node: Filesystem Handling,  Next: System Parameters,  Prev: Platform Type,  Up: System Management
+File: libc.info,  Node: Priority,  Next: Memory Resources,  Prev: Limits on Resources,  Up: Resource Usage And Limitation
 
-30.3 Controlling and Querying Mounts
-====================================
+22.3 Process CPU Priority And Scheduling
+========================================
 
-All files are in filesystems, and before you can access any file, its
-filesystem must be mounted.  Because of Unix's concept of _Everything
-is a file_, mounting of filesystems is central to doing almost
-anything.  This section explains how to find out what filesystems are
-currently mounted and what filesystems are available for mounting, and
-how to change what is mounted.
+When multiple processes simultaneously require CPU time, the system's
+scheduling policy and process CPU priorities determine which processes
+get it.  This section describes how that determination is made and GNU C
+Library functions to control it.
 
-   The classic filesystem is the contents of a disk drive.  The concept
-is considerably more abstract, though, and lots of things other than
-disk drives can be mounted.
+   It is common to refer to CPU scheduling simply as scheduling and a
+process' CPU priority simply as the process' priority, with the CPU
+resource being implied.  Bear in mind, though, that CPU time is not the
+only resource a process uses or that processes contend for.  In some
+cases, it is not even particularly important.  Giving a process a high
+"priority" may have very little effect on how fast a process runs with
+respect to other processes.  The priorities discussed in this section
+apply only to CPU time.
 
-   Some block devices don't correspond to traditional devices like disk
-drives.  For example, a loop device is a block device whose driver uses
-a regular file in another filesystem as its medium.  So if that regular
-file contains appropriate data for a filesystem, you can by mounting the
-loop device essentially mount a regular file.
+   CPU scheduling is a complex issue and different systems do it in
+wildly different ways.  New ideas continually develop and find their way
+into the intricacies of the various systems' scheduling algorithms.
+This section discusses the general concepts, some specifics of systems
+that commonly use the GNU C Library, and some standards.
 
-   Some filesystems aren't based on a device of any kind.  The "proc"
-filesystem, for example, contains files whose data is made up by the
-filesystem driver on the fly whenever you ask for it.  And when you
-write to it, the data you write causes changes in the system.  No data
-gets stored.
+   For simplicity, we talk about CPU contention as if there is only one
+CPU in the system.  But all the same principles apply when a processor
+has multiple CPUs, and knowing that the number of processes that can run
+at any one time is equal to the number of CPUs, you can easily
+extrapolate the information.
+
+   The functions described in this section are all defined by the
+POSIX.1 and POSIX.1b standards (the 'sched...' functions are POSIX.1b).
+However, POSIX does not define any semantics for the values that these
+functions get and set.  In this chapter, the semantics are based on the
+Linux kernel's implementation of the POSIX standard.  As you will see,
+the Linux implementation is quite the inverse of what the authors of the
+POSIX syntax had in mind.
 
 * Menu:
 
-* Mount Information::           What is or could be mounted?
-* Mount-Unmount-Remount::       Controlling what is mounted and how
+* Absolute Priority::               The first tier of priority.  Posix
+* Realtime Scheduling::             Scheduling among the process nobility
+* Basic Scheduling Functions::      Get/set scheduling policy, priority
+* Traditional Scheduling::          Scheduling among the vulgar masses
+* CPU Affinity::                    Limiting execution to certain CPUs
 
 
-File: libc.info,  Node: Mount Information,  Next: Mount-Unmount-Remount,  Up: Filesystem Handling
+File: libc.info,  Node: Absolute Priority,  Next: Realtime Scheduling,  Up: Priority
 
-30.3.1 Mount Information
+22.3.1 Absolute Priority
 ------------------------
 
-For some programs it is desirable and necessary to access information
-about whether a certain filesystem is mounted and, if it is, where, or
-simply to get lists of all the available filesystems.  The GNU C Library
-provides some functions to retrieve this information portably.
+Every process has an absolute priority, and it is represented by a
+number.  The higher the number, the higher the absolute priority.
 
-   Traditionally Unix systems have a file named `/etc/fstab' which
-describes all possibly mounted filesystems.  The `mount' program uses
-this file to mount at startup time of the system all the necessary
-filesystems.  The information about all the filesystems actually
-mounted is normally kept in a file named either `/var/run/mtab' or
-`/etc/mtab'.  Both files share the same syntax and it is crucial that
-this syntax is followed all the time.  Therefore it is best to never
-directly write the files.  The functions described in this section can
-do this and they also provide the functionality to convert the external
-textual representation to the internal representation.
+   On systems of the past, and most systems today, all processes have
+absolute priority 0 and this section is irrelevant.  In that case, *Note
+Traditional Scheduling::.  Absolute priorities were invented to
+accommodate realtime systems, in which it is vital that certain
+processes be able to respond to external events happening in real time,
+which means they cannot wait around while some other process that _wants
+to_, but doesn't _need to_ run occupies the CPU.
 
-   Note that the `fstab' and `mtab' files are maintained on a system by
-_convention_.  It is possible for the files not to exist or not to be
-consistent with what is really mounted or available to mount, if the
-system's administration policy allows it.  But programs that mount and
-unmount filesystems typically maintain and use these files as described
-herein.
+   When two processes are in contention to use the CPU at any instant,
+the one with the higher absolute priority always gets it.  This is true
+even if the process with the lower priority is already using the CPU
+(i.e., the scheduling is preemptive).  Of course, we're only talking
+about processes that are running or "ready to run," which means they are
+ready to execute instructions right now.  When a process blocks to wait
+for something like I/O, its absolute priority is irrelevant.
 
-   The filenames given above should never be used directly.  The
-portable way to handle these file is to use the macro `_PATH_FSTAB',
-defined in `fstab.h', or `_PATH_MNTTAB', defined in `mntent.h' and
-`paths.h', for `fstab'; and the macro `_PATH_MOUNTED', also defined in
-`mntent.h' and `paths.h', for `mtab'.  There are also two alternate
-macro names `FSTAB', `MNTTAB', and `MOUNTED' defined but these names
-are deprecated and kept only for backward compatibility.  The names
-`_PATH_MNTTAB' and `_PATH_MOUNTED' should always be used.
+   *NB:* The term "runnable" is a synonym for "ready to run."
+
+   When two processes are running or ready to run and both have the same
+absolute priority, it's more interesting.  In that case, who gets the
+CPU is determined by the scheduling policy.  If the processes have
+absolute priority 0, the traditional scheduling policy described in
+*note Traditional Scheduling:: applies.  Otherwise, the policies
+described in *note Realtime Scheduling:: apply.
+
+   You normally give an absolute priority above 0 only to a process that
+can be trusted not to hog the CPU. Such processes are designed to block
+(or terminate) after relatively short CPU runs.
+
+   A process begins life with the same absolute priority as its parent
+process.  Functions described in *note Basic Scheduling Functions:: can
+change it.
+
+   Only a privileged process can change a process' absolute priority to
+something other than '0'.  Only a privileged process or the target
+process' owner can change its absolute priority at all.
+
+   POSIX requires absolute priority values used with the realtime
+scheduling policies to be consecutive with a range of at least 32.  On
+Linux, they are 1 through 99.  The functions 'sched_get_priority_max'
+and 'sched_set_priority_min' portably tell you what the range is on a
+particular system.
+
+22.3.1.1 Using Absolute Priority
+................................
+
+One thing you must keep in mind when designing real time applications is
+that having higher absolute priority than any other process doesn't
+guarantee the process can run continuously.  Two things that can wreck a
+good CPU run are interrupts and page faults.
+
+   Interrupt handlers live in that limbo between processes.  The CPU is
+executing instructions, but they aren't part of any process.  An
+interrupt will stop even the highest priority process.  So you must
+allow for slight delays and make sure that no device in the system has
+an interrupt handler that could cause too long a delay between
+instructions for your process.
+
+   Similarly, a page fault causes what looks like a straightforward
+sequence of instructions to take a long time.  The fact that other
+processes get to run while the page faults in is of no consequence,
+because as soon as the I/O is complete, the high priority process will
+kick them out and run again, but the wait for the I/O itself could be a
+problem.  To neutralize this threat, use 'mlock' or 'mlockall'.
+
+   There are a few ramifications of the absoluteness of this priority on
+a single-CPU system that you need to keep in mind when you choose to set
+a priority and also when you're working on a program that runs with high
+absolute priority.  Consider a process that has higher absolute priority
+than any other process in the system and due to a bug in its program, it
+gets into an infinite loop.  It will never cede the CPU. You can't run a
+command to kill it because your command would need to get the CPU in
+order to run.  The errant program is in complete control.  It controls
+the vertical, it controls the horizontal.
+
+   There are two ways to avoid this: 1) keep a shell running somewhere
+with a higher absolute priority.  2) keep a controlling terminal
+attached to the high priority process group.  All the priority in the
+world won't stop an interrupt handler from running and delivering a
+signal to the process if you hit Control-C.
+
+   Some systems use absolute priority as a means of allocating a fixed
+percentage of CPU time to a process.  To do this, a super high priority
+privileged process constantly monitors the process' CPU usage and raises
+its absolute priority when the process isn't getting its entitled share
+and lowers it when the process is exceeding it.
+
+   *NB:* The absolute priority is sometimes called the "static
+priority."  We don't use that term in this manual because it misses the
+most important feature of the absolute priority: its absoluteness.
+
+
+File: libc.info,  Node: Realtime Scheduling,  Next: Basic Scheduling Functions,  Prev: Absolute Priority,  Up: Priority
+
+22.3.2 Realtime Scheduling
+--------------------------
+
+Whenever two processes with the same absolute priority are ready to run,
+the kernel has a decision to make, because only one can run at a time.
+If the processes have absolute priority 0, the kernel makes this
+decision as described in *note Traditional Scheduling::.  Otherwise, the
+decision is as described in this section.
+
+   If two processes are ready to run but have different absolute
+priorities, the decision is much simpler, and is described in *note
+Absolute Priority::.
+
+   Each process has a scheduling policy.  For processes with absolute
+priority other than zero, there are two available:
+
+  1. First Come First Served
+  2. Round Robin
+
+   The most sensible case is where all the processes with a certain
+absolute priority have the same scheduling policy.  We'll discuss that
+first.
+
+   In Round Robin, processes share the CPU, each one running for a small
+quantum of time ("time slice") and then yielding to another in a
+circular fashion.  Of course, only processes that are ready to run and
+have the same absolute priority are in this circle.
+
+   In First Come First Served, the process that has been waiting the
+longest to run gets the CPU, and it keeps it until it voluntarily
+relinquishes the CPU, runs out of things to do (blocks), or gets
+preempted by a higher priority process.
+
+   First Come First Served, along with maximal absolute priority and
+careful control of interrupts and page faults, is the one to use when a
+process absolutely, positively has to run at full CPU speed or not at
+all.
+
+   Judicious use of 'sched_yield' function invocations by processes with
+First Come First Served scheduling policy forms a good compromise
+between Round Robin and First Come First Served.
+
+   To understand how scheduling works when processes of different
+scheduling policies occupy the same absolute priority, you have to know
+the nitty gritty details of how processes enter and exit the ready to
+run list:
+
+   In both cases, the ready to run list is organized as a true queue,
+where a process gets pushed onto the tail when it becomes ready to run
+and is popped off the head when the scheduler decides to run it.  Note
+that ready to run and running are two mutually exclusive states.  When
+the scheduler runs a process, that process is no longer ready to run and
+no longer in the ready to run list.  When the process stops running, it
+may go back to being ready to run again.
+
+   The only difference between a process that is assigned the Round
+Robin scheduling policy and a process that is assigned First Come First
+Serve is that in the former case, the process is automatically booted
+off the CPU after a certain amount of time.  When that happens, the
+process goes back to being ready to run, which means it enters the queue
+at the tail.  The time quantum we're talking about is small.  Really
+small.  This is not your father's timesharing.  For example, with the
+Linux kernel, the round robin time slice is a thousand times shorter
+than its typical time slice for traditional scheduling.
+
+   A process begins life with the same scheduling policy as its parent
+process.  Functions described in *note Basic Scheduling Functions:: can
+change it.
+
+   Only a privileged process can set the scheduling policy of a process
+that has absolute priority higher than 0.
+
+
+File: libc.info,  Node: Basic Scheduling Functions,  Next: Traditional Scheduling,  Prev: Realtime Scheduling,  Up: Priority
+
+22.3.3 Basic Scheduling Functions
+---------------------------------
+
+This section describes functions in the GNU C Library for setting the
+absolute priority and scheduling policy of a process.
+
+   *Portability Note:* On systems that have the functions in this
+section, the macro _POSIX_PRIORITY_SCHEDULING is defined in
+'<unistd.h>'.
+
+   For the case that the scheduling policy is traditional scheduling,
+more functions to fine tune the scheduling are in *note Traditional
+Scheduling::.
+
+   Don't try to make too much out of the naming and structure of these
+functions.  They don't match the concepts described in this manual
+because the functions are as defined by POSIX.1b, but the implementation
+on systems that use the GNU C Library is the inverse of what the POSIX
+structure contemplates.  The POSIX scheme assumes that the primary
+scheduling parameter is the scheduling policy and that the priority
+value, if any, is a parameter of the scheduling policy.  In the
+implementation, though, the priority value is king and the scheduling
+policy, if anything, only fine tunes the effect of that priority.
+
+   The symbols in this section are declared by including file 'sched.h'.
+
+ -- Data Type: struct sched_param
+     This structure describes an absolute priority.
+     'int sched_priority'
+          absolute priority value
+
+ -- Function: int sched_setscheduler (pid_t PID, int POLICY, const
+          struct sched_param *PARAM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function sets both the absolute priority and the scheduling
+     policy for a process.
+
+     It assigns the absolute priority value given by PARAM and the
+     scheduling policy POLICY to the process with Process ID PID, or the
+     calling process if PID is zero.  If POLICY is negative,
+     'sched_setscheduler' keeps the existing scheduling policy.
+
+     The following macros represent the valid values for POLICY:
+
+     'SCHED_OTHER'
+          Traditional Scheduling
+     'SCHED_FIFO'
+          First In First Out
+     'SCHED_RR'
+          Round Robin
+
+     On success, the return value is '0'.  Otherwise, it is '-1' and
+     'ERRNO' is set accordingly.  The 'errno' values specific to this
+     function are:
+
+     'EPERM'
+             * The calling process does not have 'CAP_SYS_NICE'
+               permission and POLICY is not 'SCHED_OTHER' (or it's
+               negative and the existing policy is not 'SCHED_OTHER'.
+
+             * The calling process does not have 'CAP_SYS_NICE'
+               permission and its owner is not the target process'
+               owner.  I.e., the effective uid of the calling process is
+               neither the effective nor the real uid of process PID.
+
+     'ESRCH'
+          There is no process with pid PID and PID is not zero.
+
+     'EINVAL'
+             * POLICY does not identify an existing scheduling policy.
+
+             * The absolute priority value identified by *PARAM is
+               outside the valid range for the scheduling policy POLICY
+               (or the existing scheduling policy if POLICY is negative)
+               or PARAM is null.  'sched_get_priority_max' and
+               'sched_get_priority_min' tell you what the valid range
+               is.
+
+             * PID is negative.
+
+ -- Function: int sched_getscheduler (pid_t PID)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function returns the scheduling policy assigned to the process
+     with Process ID (pid) PID, or the calling process if PID is zero.
+
+     The return value is the scheduling policy.  See
+     'sched_setscheduler' for the possible values.
+
+     If the function fails, the return value is instead '-1' and 'errno'
+     is set accordingly.
+
+     The 'errno' values specific to this function are:
+
+     'ESRCH'
+          There is no process with pid PID and it is not zero.
+
+     'EINVAL'
+          PID is negative.
+
+     Note that this function is not an exact mate to
+     'sched_setscheduler' because while that function sets the
+     scheduling policy and the absolute priority, this function gets
+     only the scheduling policy.  To get the absolute priority, use
+     'sched_getparam'.
+
+ -- Function: int sched_setparam (pid_t PID, const struct sched_param
+          *PARAM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function sets a process' absolute priority.
+
+     It is functionally identical to 'sched_setscheduler' with POLICY =
+     '-1'.
+
+ -- Function: int sched_getparam (pid_t PID, struct sched_param *PARAM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function returns a process' absolute priority.
+
+     PID is the Process ID (pid) of the process whose absolute priority
+     you want to know.
+
+     PARAM is a pointer to a structure in which the function stores the
+     absolute priority of the process.
+
+     On success, the return value is '0'.  Otherwise, it is '-1' and
+     'ERRNO' is set accordingly.  The 'errno' values specific to this
+     function are:
+
+     'ESRCH'
+          There is no process with pid PID and it is not zero.
+
+     'EINVAL'
+          PID is negative.
+
+ -- Function: int sched_get_priority_min (int POLICY)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function returns the lowest absolute priority value that is
+     allowable for a process with scheduling policy POLICY.
+
+     On Linux, it is 0 for SCHED_OTHER and 1 for everything else.
+
+     On success, the return value is '0'.  Otherwise, it is '-1' and
+     'ERRNO' is set accordingly.  The 'errno' values specific to this
+     function are:
+
+     'EINVAL'
+          POLICY does not identify an existing scheduling policy.
+
+ -- Function: int sched_get_priority_max (int POLICY)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function returns the highest absolute priority value that is
+     allowable for a process that with scheduling policy POLICY.
+
+     On Linux, it is 0 for SCHED_OTHER and 99 for everything else.
+
+     On success, the return value is '0'.  Otherwise, it is '-1' and
+     'ERRNO' is set accordingly.  The 'errno' values specific to this
+     function are:
+
+     'EINVAL'
+          POLICY does not identify an existing scheduling policy.
+
+ -- Function: int sched_rr_get_interval (pid_t PID, struct timespec
+          *INTERVAL)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function returns the length of the quantum (time slice) used
+     with the Round Robin scheduling policy, if it is used, for the
+     process with Process ID PID.
+
+     It returns the length of time as INTERVAL.
+
+     With a Linux kernel, the round robin time slice is always 150
+     microseconds, and PID need not even be a real pid.
+
+     The return value is '0' on success and in the pathological case
+     that it fails, the return value is '-1' and 'errno' is set
+     accordingly.  There is nothing specific that can go wrong with this
+     function, so there are no specific 'errno' values.
+
+ -- Function: int sched_yield (void)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function voluntarily gives up the process' claim on the CPU.
+
+     Technically, 'sched_yield' causes the calling process to be made
+     immediately ready to run (as opposed to running, which is what it
+     was before).  This means that if it has absolute priority higher
+     than 0, it gets pushed onto the tail of the queue of processes that
+     share its absolute priority and are ready to run, and it will run
+     again when its turn next arrives.  If its absolute priority is 0,
+     it is more complicated, but still has the effect of yielding the
+     CPU to other processes.
+
+     If there are no other processes that share the calling process'
+     absolute priority, this function doesn't have any effect.
+
+     To the extent that the containing program is oblivious to what
+     other processes in the system are doing and how fast it executes,
+     this function appears as a no-op.
+
+     The return value is '0' on success and in the pathological case
+     that it fails, the return value is '-1' and 'errno' is set
+     accordingly.  There is nothing specific that can go wrong with this
+     function, so there are no specific 'errno' values.
+
+
+File: libc.info,  Node: Traditional Scheduling,  Next: CPU Affinity,  Prev: Basic Scheduling Functions,  Up: Priority
+
+22.3.4 Traditional Scheduling
+-----------------------------
+
+This section is about the scheduling among processes whose absolute
+priority is 0.  When the system hands out the scraps of CPU time that
+are left over after the processes with higher absolute priority have
+taken all they want, the scheduling described herein determines who
+among the great unwashed processes gets them.
 
 * Menu:
 
-* fstab::                       The `fstab' file
-* mtab::                        The `mtab' file
-* Other Mount Information::     Other (non-libc) sources of mount information
+* Traditional Scheduling Intro::
+* Traditional Scheduling Functions::
+
+
+File: libc.info,  Node: Traditional Scheduling Intro,  Next: Traditional Scheduling Functions,  Up: Traditional Scheduling
+
+22.3.4.1 Introduction To Traditional Scheduling
+...............................................
+
+Long before there was absolute priority (See *note Absolute Priority::),
+Unix systems were scheduling the CPU using this system.  When Posix came
+in like the Romans and imposed absolute priorities to accommodate the
+needs of realtime processing, it left the indigenous Absolute Priority
+Zero processes to govern themselves by their own familiar scheduling
+policy.
+
+   Indeed, absolute priorities higher than zero are not available on
+many systems today and are not typically used when they are, being
+intended mainly for computers that do realtime processing.  So this
+section describes the only scheduling many programmers need to be
+concerned about.
+
+   But just to be clear about the scope of this scheduling: Any time a
+process with an absolute priority of 0 and a process with an absolute
+priority higher than 0 are ready to run at the same time, the one with
+absolute priority 0 does not run.  If it's already running when the
+higher priority ready-to-run process comes into existence, it stops
+immediately.
+
+   In addition to its absolute priority of zero, every process has
+another priority, which we will refer to as "dynamic priority" because
+it changes over time.  The dynamic priority is meaningless for processes
+with an absolute priority higher than zero.
+
+   The dynamic priority sometimes determines who gets the next turn on
+the CPU. Sometimes it determines how long turns last.  Sometimes it
+determines whether a process can kick another off the CPU.
+
+   In Linux, the value is a combination of these things, but mostly it
+is just determines the length of the time slice.  The higher a process'
+dynamic priority, the longer a shot it gets on the CPU when it gets one.
+If it doesn't use up its time slice before giving up the CPU to do
+something like wait for I/O, it is favored for getting the CPU back when
+it's ready for it, to finish out its time slice.  Other than that,
+selection of processes for new time slices is basically round robin.
+But the scheduler does throw a bone to the low priority processes: A
+process' dynamic priority rises every time it is snubbed in the
+scheduling process.  In Linux, even the fat kid gets to play.
+
+   The fluctuation of a process' dynamic priority is regulated by
+another value: The "nice" value.  The nice value is an integer, usually
+in the range -20 to 20, and represents an upper limit on a process'
+dynamic priority.  The higher the nice number, the lower that limit.
+
+   On a typical Linux system, for example, a process with a nice value
+of 20 can get only 10 milliseconds on the CPU at a time, whereas a
+process with a nice value of -20 can achieve a high enough priority to
+get 400 milliseconds.
+
+   The idea of the nice value is deferential courtesy.  In the
+beginning, in the Unix garden of Eden, all processes shared equally in
+the bounty of the computer system.  But not all processes really need
+the same share of CPU time, so the nice value gave a courteous process
+the ability to refuse its equal share of CPU time that others might
+prosper.  Hence, the higher a process' nice value, the nicer the process
+is.  (Then a snake came along and offered some process a negative nice
+value and the system became the crass resource allocation system we know
+today).
+
+   Dynamic priorities tend upward and downward with an objective of
+smoothing out allocation of CPU time and giving quick response time to
+infrequent requests.  But they never exceed their nice limits, so on a
+heavily loaded CPU, the nice value effectively determines how fast a
+process runs.
+
+   In keeping with the socialistic heritage of Unix process priority, a
+process begins life with the same nice value as its parent process and
+can raise it at will.  A process can also raise the nice value of any
+other process owned by the same user (or effective user).  But only a
+privileged process can lower its nice value.  A privileged process can
+also raise or lower another process' nice value.
+
+   GNU C Library functions for getting and setting nice values are
+described in *Note Traditional Scheduling Functions::.
+
+
+File: libc.info,  Node: Traditional Scheduling Functions,  Prev: Traditional Scheduling Intro,  Up: Traditional Scheduling
+
+22.3.4.2 Functions For Traditional Scheduling
+.............................................
+
+This section describes how you can read and set the nice value of a
+process.  All these symbols are declared in 'sys/resource.h'.
+
+   The function and macro names are defined by POSIX, and refer to
+"priority," but the functions actually have to do with nice values, as
+the terms are used both in the manual and POSIX.
+
+   The range of valid nice values depends on the kernel, but typically
+it runs from '-20' to '20'.  A lower nice value corresponds to higher
+priority for the process.  These constants describe the range of
+priority values:
+
+'PRIO_MIN'
+     The lowest valid nice value.
+
+'PRIO_MAX'
+     The highest valid nice value.
+
+ -- Function: int getpriority (int CLASS, int ID)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     Return the nice value of a set of processes; CLASS and ID specify
+     which ones (see below).  If the processes specified do not all have
+     the same nice value, this returns the lowest value that any of them
+     has.
+
+     On success, the return value is '0'.  Otherwise, it is '-1' and
+     'ERRNO' is set accordingly.  The 'errno' values specific to this
+     function are:
+
+     'ESRCH'
+          The combination of CLASS and ID does not match any existing
+          process.
+
+     'EINVAL'
+          The value of CLASS is not valid.
+
+     If the return value is '-1', it could indicate failure, or it could
+     be the nice value.  The only way to make certain is to set 'errno =
+     0' before calling 'getpriority', then use 'errno != 0' afterward as
+     the criterion for failure.
+
+ -- Function: int setpriority (int CLASS, int ID, int NICEVAL)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     Set the nice value of a set of processes to NICEVAL; CLASS and ID
+     specify which ones (see below).
+
+     The return value is '0' on success, and '-1' on failure.  The
+     following 'errno' error condition are possible for this function:
+
+     'ESRCH'
+          The combination of CLASS and ID does not match any existing
+          process.
+
+     'EINVAL'
+          The value of CLASS is not valid.
+
+     'EPERM'
+          The call would set the nice value of a process which is owned
+          by a different user than the calling process (i.e., the target
+          process' real or effective uid does not match the calling
+          process' effective uid) and the calling process does not have
+          'CAP_SYS_NICE' permission.
+
+     'EACCES'
+          The call would lower the process' nice value and the process
+          does not have 'CAP_SYS_NICE' permission.
+
+   The arguments CLASS and ID together specify a set of processes in
+which you are interested.  These are the possible values of CLASS:
+
+'PRIO_PROCESS'
+     One particular process.  The argument ID is a process ID (pid).
+
+'PRIO_PGRP'
+     All the processes in a particular process group.  The argument ID
+     is a process group ID (pgid).
+
+'PRIO_USER'
+     All the processes owned by a particular user (i.e., whose real uid
+     indicates the user).  The argument ID is a user ID (uid).
+
+   If the argument ID is 0, it stands for the calling process, its
+process group, or its owner (real uid), according to CLASS.
+
+ -- Function: int nice (int INCREMENT)
+     Preliminary: | MT-Unsafe race:setpriority | AS-Unsafe | AC-Safe |
+     *Note POSIX Safety Concepts::.
+
+     Increment the nice value of the calling process by INCREMENT.  The
+     return value is the new nice value on success, and '-1' on failure.
+     In the case of failure, 'errno' will be set to the same values as
+     for 'setpriority'.
+
+     Here is an equivalent definition of 'nice':
+
+          int
+          nice (int increment)
+          {
+            int result, old = getpriority (PRIO_PROCESS, 0);
+            result = setpriority (PRIO_PROCESS, 0, old + increment);
+            if (result != -1)
+                return old + increment;
+            else
+                return -1;
+          }
 
diff --git a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-9 b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-9
index 283ec26..8969072 100644
--- a/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-9
+++ b/arm-buildroot-linux-gnueabi/sysroot/usr/share/info/libc.info-9
@@ -1,7 +1,24 @@
-This is
-/usr/local/google/home/jnewlin/src/uclibc/buildroot/output/build/glibc-2.19/build/manual/libc.info,
-produced by makeinfo version 4.13 from libc.texinfo.
+This is libc.info, produced by makeinfo version 5.2 from libc.texinfo.
 
+This file documents the GNU C Library.
+
+   This is 'The GNU C Library Reference Manual', for version 2.19
+(Buildroot).
+
+   Copyright (C) 1993-2014 Free Software Foundation, Inc.
+
+   Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being "Free Software Needs Free Documentation" and
+"GNU Lesser General Public License", the Front-Cover texts being "A GNU
+Manual", and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled "GNU Free Documentation
+License".
+
+   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
+modify this GNU manual.  Buying copies from the FSF supports it in
+developing GNU and promoting software freedom."
 INFO-DIR-SECTION Software libraries
 START-INFO-DIR-ENTRY
 * Libc: (libc).                 C library.
@@ -1692,4277 +1709,5635 @@
 * ynl: (libc)Special Functions.
 END-INFO-DIR-ENTRY
 
-   This file documents the GNU C Library.
-
-   This is `The GNU C Library Reference Manual', for version 2.19
-(Buildroot).
-
-   Copyright (C) 1993-2014 Free Software Foundation, Inc.
-
-   Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version
-1.3 or any later version published by the Free Software Foundation;
-with the Invariant Sections being "Free Software Needs Free
-Documentation" and "GNU Lesser General Public License", the Front-Cover
-texts being "A GNU Manual", and with the Back-Cover Texts as in (a)
-below.  A copy of the license is included in the section entitled "GNU
-Free Documentation License".
-
-   (a) The FSF's Back-Cover Text is: "You have the freedom to copy and
-modify this GNU manual.  Buying copies from the FSF supports it in
-developing GNU and promoting software freedom."
-
 
-File: libc.info,  Node: fstab,  Next: mtab,  Up: Mount Information
+File: libc.info,  Node: CPU Affinity,  Prev: Traditional Scheduling,  Up: Priority
 
-30.3.1.1 The `fstab' file
-.........................
-
-The internal representation for entries of the file is `struct fstab',
-defined in `fstab.h'.
-
- -- Data Type: struct fstab
-     This structure is used with the `getfsent', `getfsspec', and
-     `getfsfile' functions.
-
-    `char *fs_spec'
-          This element describes the device from which the filesystem
-          is mounted.  Normally this is the name of a special device,
-          such as a hard disk partition, but it could also be a more or
-          less generic string.  For "NFS" it would be a hostname and
-          directory name combination.
-
-          Even though the element is not declared `const' it shouldn't
-          be modified.  The missing `const' has historic reasons, since
-          this function predates ISO C.  The same is true for the other
-          string elements of this structure.
-
-    `char *fs_file'
-          This describes the mount point on the local system.  I.e.,
-          accessing any file in this filesystem has implicitly or
-          explicitly this string as a prefix.
-
-    `char *fs_vfstype'
-          This is the type of the filesystem.  Depending on what the
-          underlying kernel understands it can be any string.
-
-    `char *fs_mntops'
-          This is a string containing options passed to the kernel with
-          the `mount' call.  Again, this can be almost anything.  There
-          can be more than one option, separated from the others by a
-          comma.  Each option consists of a name and an optional value
-          part, introduced by an `=' character.
-
-          If the value of this element must be processed it should
-          ideally be done using the `getsubopt' function; see *note
-          Suboptions::.
-
-    `const char *fs_type'
-          This name is poorly chosen.  This element points to a string
-          (possibly in the `fs_mntops' string) which describes the
-          modes with which the filesystem is mounted.  `fstab' defines
-          five macros to describe the possible values:
-
-         `FSTAB_RW'
-               The filesystems gets mounted with read and write enabled.
-
-         `FSTAB_RQ'
-               The filesystems gets mounted with read and write
-               enabled.  Write access is restricted by quotas.
-
-         `FSTAB_RO'
-               The filesystem gets mounted read-only.
-
-         `FSTAB_SW'
-               This is not a real filesystem, it is a swap device.
-
-         `FSTAB_XX'
-               This entry from the `fstab' file is totally ignored.
-
-          Testing for equality with these value must happen using
-          `strcmp' since these are all strings.  Comparing the pointer
-          will probably always fail.
-
-    `int fs_freq'
-          This element describes the dump frequency in days.
-
-    `int fs_passno'
-          This element describes the pass number on parallel dumps.  It
-          is closely related to the `dump' utility used on Unix systems.
-
-   To read the entire content of the of the `fstab' file the GNU C
-Library contains a set of three functions which are designed in the
-usual way.
-
- -- Function: int setfsent (void)
-     Preliminary: | MT-Unsafe race:fsent | AS-Unsafe heap corrupt lock
-     | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
-
-     This function makes sure that the internal read pointer for the
-     `fstab' file is at the beginning of the file.  This is done by
-     either opening the file or resetting the read pointer.
-
-     Since the file handle is internal to the libc this function is not
-     thread-safe.
-
-     This function returns a non-zero value if the operation was
-     successful and the `getfs*' functions can be used to read the
-     entries of the file.
-
- -- Function: void endfsent (void)
-     Preliminary: | MT-Unsafe race:fsent | AS-Unsafe heap corrupt lock
-     | AC-Unsafe corrupt lock mem fd | *Note POSIX Safety Concepts::.
-
-     This function makes sure that all resources acquired by a prior
-     call to `setfsent' (explicitly or implicitly by calling
-     `getfsent') are freed.
-
- -- Function: struct fstab * getfsent (void)
-     Preliminary: | MT-Unsafe race:fsent locale | AS-Unsafe corrupt
-     heap lock | AC-Unsafe corrupt lock mem | *Note POSIX Safety
-     Concepts::.
-
-     This function returns the next entry of the `fstab' file.  If this
-     is the first call to any of the functions handling `fstab' since
-     program start or the last call of `endfsent', the file will be
-     opened.
-
-     The function returns a pointer to a variable of type `struct
-     fstab'.  This variable is shared by all threads and therefore this
-     function is not thread-safe.  If an error occurred `getfsent'
-     returns a `NULL' pointer.
-
- -- Function: struct fstab * getfsspec (const char *NAME)
-     Preliminary: | MT-Unsafe race:fsent locale | AS-Unsafe corrupt
-     heap lock | AC-Unsafe corrupt lock mem | *Note POSIX Safety
-     Concepts::.
-
-     This function returns the next entry of the `fstab' file which has
-     a string equal to NAME pointed to by the `fs_spec' element.  Since
-     there is normally exactly one entry for each special device it
-     makes no sense to call this function more than once for the same
-     argument.  If this is the first call to any of the functions
-     handling `fstab' since program start or the last call of
-     `endfsent', the file will be opened.
-
-     The function returns a pointer to a variable of type `struct
-     fstab'.  This variable is shared by all threads and therefore this
-     function is not thread-safe.  If an error occurred `getfsent'
-     returns a `NULL' pointer.
-
- -- Function: struct fstab * getfsfile (const char *NAME)
-     Preliminary: | MT-Unsafe race:fsent locale | AS-Unsafe corrupt
-     heap lock | AC-Unsafe corrupt lock mem | *Note POSIX Safety
-     Concepts::.
-
-     This function returns the next entry of the `fstab' file which has
-     a string equal to NAME pointed to by the `fs_file' element.  Since
-     there is normally exactly one entry for each mount point it makes
-     no sense to call this function more than once for the same
-     argument.  If this is the first call to any of the functions
-     handling `fstab' since program start or the last call of
-     `endfsent', the file will be opened.
-
-     The function returns a pointer to a variable of type `struct
-     fstab'.  This variable is shared by all threads and therefore this
-     function is not thread-safe.  If an error occurred `getfsent'
-     returns a `NULL' pointer.
-
-
-File: libc.info,  Node: mtab,  Next: Other Mount Information,  Prev: fstab,  Up: Mount Information
-
-30.3.1.2 The `mtab' file
-........................
-
-The following functions and data structure access the `mtab' file.
-
- -- Data Type: struct mntent
-     This structure is used with the `getmntent', `getmntent_t',
-     `addmntent', and `hasmntopt' functions.
-
-    `char *mnt_fsname'
-          This element contains a pointer to a string describing the
-          name of the special device from which the filesystem is
-          mounted.  It corresponds to the `fs_spec' element in `struct
-          fstab'.
-
-    `char *mnt_dir'
-          This element points to a string describing the mount point of
-          the filesystem.  It corresponds to the `fs_file' element in
-          `struct fstab'.
-
-    `char *mnt_type'
-          `mnt_type' describes the filesystem type and is therefore
-          equivalent to `fs_vfstype' in `struct fstab'.  `mntent.h'
-          defines a few symbolic names for some of the values this
-          string can have.  But since the kernel can support arbitrary
-          filesystems it does not make much sense to give them symbolic
-          names.  If one knows the symbol name one also knows the
-          filesystem name.  Nevertheless here follows the list of the
-          symbols provided in `mntent.h'.
-
-         `MNTTYPE_IGNORE'
-               This symbol expands to `"ignore"'.  The value is
-               sometime used in `fstab' files to make sure entries are
-               not used without removing them.
-
-         `MNTTYPE_NFS'
-               Expands to `"nfs"'.  Using this macro sometimes could
-               make sense since it names the default NFS
-               implementation, in case both version 2 and 3 are
-               supported.
-
-         `MNTTYPE_SWAP'
-               This symbol expands to `"swap"'.  It names the special
-               `fstab' entry which names one of the possibly multiple
-               swap partitions.
-
-    `char *mnt_opts'
-          The element contains a string describing the options used
-          while mounting the filesystem.  As for the equivalent element
-          `fs_mntops' of `struct fstab' it is best to use the function
-          `getsubopt' (*note Suboptions::) to access the parts of this
-          string.
-
-          The `mntent.h' file defines a number of macros with string
-          values which correspond to some of the options understood by
-          the kernel.  There might be many more options which are
-          possible so it doesn't make much sense to rely on these
-          macros but to be consistent here is the list:
-
-         `MNTOPT_DEFAULTS'
-               Expands to `"defaults"'.  This option should be used
-               alone since it indicates all values for the customizable
-               values are chosen to be the default.
-
-         `MNTOPT_RO'
-               Expands to `"ro"'.  See the `FSTAB_RO' value, it means
-               the filesystem is mounted read-only.
-
-         `MNTOPT_RW'
-               Expand to `"rw"'.  See the `FSTAB_RW' value, it means the
-               filesystem is mounted with read and write permissions.
-
-         `MNTOPT_SUID'
-               Expands to `"suid"'.  This means that the SUID bit
-               (*note How Change Persona::) is respected when a program
-               from the filesystem is started.
-
-         `MNTOPT_NOSUID'
-               Expands to `"nosuid"'.  This is the opposite of
-               `MNTOPT_SUID', the SUID bit for all files from the
-               filesystem is ignored.
-
-         `MNTOPT_NOAUTO'
-               Expands to `"noauto"'.  At startup time the `mount'
-               program will ignore this entry if it is started with the
-               `-a' option to mount all filesystems mentioned in the
-               `fstab' file.
-
-          As for the `FSTAB_*' entries introduced above it is important
-          to use `strcmp' to check for equality.
-
-    `mnt_freq'
-          This elements corresponds to `fs_freq' and also specifies the
-          frequency in days in which dumps are made.
-
-    `mnt_passno'
-          This element is equivalent to `fs_passno' with the same
-          meaning which is uninteresting for all programs beside `dump'.
-
-   For accessing the `mtab' file there is again a set of three
-functions to access all entries in a row.  Unlike the functions to
-handle `fstab' these functions do not access a fixed file and there is
-even a thread safe variant of the get function.  Beside this the GNU C
-Library contains functions to alter the file and test for specific
-options.
-
- -- Function: FILE * setmntent (const char *FILE, const char *MODE)
-     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe mem fd
-     lock | *Note POSIX Safety Concepts::.
-
-     The `setmntent' function prepares the file named FILE which must
-     be in the format of a `fstab' and `mtab' file for the upcoming
-     processing through the other functions of the family.  The MODE
-     parameter can be chosen in the way the OPENTYPE parameter for
-     `fopen' (*note Opening Streams::) can be chosen.  If the file is
-     opened for writing the file is also allowed to be empty.
-
-     If the file was successfully opened `setmntent' returns a file
-     descriptor for future use.  Otherwise the return value is `NULL'
-     and `errno' is set accordingly.
-
- -- Function: int endmntent (FILE *STREAM)
-     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe lock mem
-     fd | *Note POSIX Safety Concepts::.
-
-     This function takes for the STREAM parameter a file handle which
-     previously was returned from the `setmntent' call.  `endmntent'
-     closes the stream and frees all resources.
-
-     The return value is 1 unless an error occurred in which case it is
-     0.
-
- -- Function: struct mntent * getmntent (FILE *STREAM)
-     Preliminary: | MT-Unsafe race:mntentbuf locale | AS-Unsafe corrupt
-     heap init | AC-Unsafe init corrupt lock mem | *Note POSIX Safety
-     Concepts::.
-
-     The `getmntent' function takes as the parameter a file handle
-     previously returned by successful call to `setmntent'.  It returns
-     a pointer to a static variable of type `struct mntent' which is
-     filled with the information from the next entry from the file
-     currently read.
-
-     The file format used prescribes the use of spaces or tab
-     characters to separate the fields.  This makes it harder to use
-     name containing one of these characters (e.g., mount points using
-     spaces).  Therefore these characters are encoded in the files and
-     the `getmntent' function takes care of the decoding while reading
-     the entries back in.  `'\040'' is used to encode a space
-     character, `'\011'' to encode a tab character, `'\012'' to encode
-     a newline character, and `'\\'' to encode a backslash.
-
-     If there was an error or the end of the file is reached the return
-     value is `NULL'.
-
-     This function is not thread-safe since all calls to this function
-     return a pointer to the same static variable.  `getmntent_r'
-     should be used in situations where multiple threads access the
-     file.
-
- -- Function: struct mntent * getmntent_r (FILE *STREAM, struct mntent
-          *RESULT, char *BUFFER, int BUFSIZE)
-     Preliminary: | MT-Safe locale | AS-Unsafe corrupt heap | AC-Unsafe
-     corrupt lock mem | *Note POSIX Safety Concepts::.
-
-     The `getmntent_r' function is the reentrant variant of
-     `getmntent'.  It also returns the next entry from the file and
-     returns a pointer.  The actual variable the values are stored in
-     is not static, though.  Instead the function stores the values in
-     the variable pointed to by the RESULT parameter.  Additional
-     information (e.g., the strings pointed to by the elements of the
-     result) are kept in the buffer of size BUFSIZE pointed to by
-     BUFFER.
-
-     Escaped characters (space, tab, backslash) are converted back in
-     the same way as it happens for `getmentent'.
-
-     The function returns a `NULL' pointer in error cases.  Errors
-     could be:
-        * error while reading the file,
-
-        * end of file reached,
-
-        * BUFSIZE is too small for reading a complete new entry.
-
- -- Function: int addmntent (FILE *STREAM, const struct mntent *MNT)
-     Preliminary: | MT-Unsafe race:stream locale | AS-Unsafe corrupt |
-     AC-Unsafe corrupt | *Note POSIX Safety Concepts::.
-
-     The `addmntent' function allows adding a new entry to the file
-     previously opened with `setmntent'.  The new entries are always
-     appended.  I.e., even if the position of the file descriptor is
-     not at the end of the file this function does not overwrite an
-     existing entry following the current position.
-
-     The implication of this is that to remove an entry from a file one
-     has to create a new file while leaving out the entry to be removed
-     and after closing the file remove the old one and rename the new
-     file to the chosen name.
-
-     This function takes care of spaces and tab characters in the names
-     to be written to the file.  It converts them and the backslash
-     character into the format describe in the `getmntent' description
-     above.
-
-     This function returns 0 in case the operation was successful.
-     Otherwise the return value is 1 and `errno' is set appropriately.
-
- -- Function: char * hasmntopt (const struct mntent *MNT, const char
-          *OPT)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This function can be used to check whether the string pointed to
-     by the `mnt_opts' element of the variable pointed to by MNT
-     contains the option OPT.  If this is true a pointer to the
-     beginning of the option in the `mnt_opts' element is returned.  If
-     no such option exists the function returns `NULL'.
-
-     This function is useful to test whether a specific option is
-     present but when all options have to be processed one is better
-     off with using the `getsubopt' function to iterate over all
-     options in the string.
-
-
-File: libc.info,  Node: Other Mount Information,  Prev: mtab,  Up: Mount Information
-
-30.3.1.3 Other (Non-libc) Sources of Mount Information
-......................................................
-
-On a system with a Linux kernel and the `proc' filesystem, you can get
-information on currently mounted filesystems from the file `mounts' in
-the `proc' filesystem.  Its format is similar to that of the `mtab'
-file, but represents what is truly mounted without relying on
-facilities outside the kernel to keep `mtab' up to date.
-
-
-File: libc.info,  Node: Mount-Unmount-Remount,  Prev: Mount Information,  Up: Filesystem Handling
-
-30.3.2 Mount, Unmount, Remount
-------------------------------
-
-This section describes the functions for mounting, unmounting, and
-remounting filesystems.
-
-   Only the superuser can mount, unmount, or remount a filesystem.
-
-   These functions do not access the `fstab' and `mtab' files.  You
-should maintain and use these separately.  *Note Mount Information::.
-
-   The symbols in this section are declared in `sys/mount.h'.
-
- -- Function: int mount (const char *SPECIAL_FILE, const char *DIR,
-          const char *FSTYPE, unsigned long int OPTIONS, const void
-          *DATA)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `mount' mounts or remounts a filesystem.  The two operations are
-     quite different and are merged rather unnaturally into this one
-     function.  The `MS_REMOUNT' option, explained below, determines
-     whether `mount' mounts or remounts.
-
-     For a mount, the filesystem on the block device represented by the
-     device special file named SPECIAL_FILE gets mounted over the mount
-     point DIR.  This means that the directory DIR (along with any
-     files in it) is no longer visible; in its place (and still with
-     the name DIR) is the root directory of the filesystem on the
-     device.
-
-     As an exception, if the filesystem type (see below) is one which
-     is not based on a device (e.g. "proc"), `mount' instantiates a
-     filesystem and mounts it over DIR and ignores SPECIAL_FILE.
-
-     For a remount, DIR specifies the mount point where the filesystem
-     to be remounted is (and remains) mounted and SPECIAL_FILE is
-     ignored.  Remounting a filesystem means changing the options that
-     control operations on the filesystem while it is mounted.  It does
-     not mean unmounting and mounting again.
-
-     For a mount, you must identify the type of the filesystem as
-     FSTYPE.  This type tells the kernel how to access the filesystem
-     and can be thought of as the name of a filesystem driver.  The
-     acceptable values are system dependent.  On a system with a Linux
-     kernel and the `proc' filesystem, the list of possible values is
-     in the file `filesystems' in the `proc' filesystem (e.g. type `cat
-     /proc/filesystems' to see the list).  With a Linux kernel, the
-     types of filesystems that `mount' can mount, and their type names,
-     depends on what filesystem drivers are configured into the kernel
-     or loaded as loadable kernel modules.  An example of a common
-     value for FSTYPE is `ext2'.
-
-     For a remount, `mount' ignores FSTYPE.
-
-     OPTIONS specifies a variety of options that apply until the
-     filesystem is unmounted or remounted.  The precise meaning of an
-     option depends on the filesystem and with some filesystems, an
-     option may have no effect at all.  Furthermore, for some
-     filesystems, some of these options (but never `MS_RDONLY') can be
-     overridden for individual file accesses via `ioctl'.
-
-     OPTIONS is a bit string with bit fields defined using the
-     following mask and masked value macros:
-
-    `MS_MGC_MASK'
-          This multibit field contains a magic number.  If it does not
-          have the value `MS_MGC_VAL', `mount' assumes all the
-          following bits are zero and the DATA argument is a null
-          string, regardless of their actual values.
-
-    `MS_REMOUNT'
-          This bit on means to remount the filesystem.  Off means to
-          mount it.
-
-    `MS_RDONLY'
-          This bit on specifies that no writing to the filesystem shall
-          be allowed while it is mounted.  This cannot be overridden by
-          `ioctl'.  This option is available on nearly all filesystems.
-
-    `S_IMMUTABLE'
-          This bit on specifies that no writing to the files in the
-          filesystem shall be allowed while it is mounted.  This can be
-          overridden for a particular file access by a properly
-          privileged call to `ioctl'.  This option is a relatively new
-          invention and is not available on many filesystems.
-
-    `S_APPEND'
-          This bit on specifies that the only file writing that shall
-          be allowed while the filesystem is mounted is appending.
-          Some filesystems allow this to be overridden for a particular
-          process by a properly privileged call to `ioctl'.  This is a
-          relatively new invention and is not available on many
-          filesystems.
-
-    `MS_NOSUID'
-          This bit on specifies that Setuid and Setgid permissions on
-          files in the filesystem shall be ignored while it is mounted.
-
-    `MS_NOEXEC'
-          This bit on specifies that no files in the filesystem shall
-          be executed while the filesystem is mounted.
-
-    `MS_NODEV'
-          This bit on specifies that no device special files in the
-          filesystem shall be accessible while the filesystem is
-          mounted.
-
-    `MS_SYNCHRONOUS'
-          This bit on specifies that all writes to the filesystem while
-          it is mounted shall be synchronous; i.e., data shall be
-          synced before each write completes rather than held in the
-          buffer cache.
-
-    `MS_MANDLOCK'
-          This bit on specifies that mandatory locks on files shall be
-          permitted while the filesystem is mounted.
-
-    `MS_NOATIME'
-          This bit on specifies that access times of files shall not be
-          updated when the files are accessed while the filesystem is
-          mounted.
-
-    `MS_NODIRATIME'
-          This bit on specifies that access times of directories shall
-          not be updated when the directories are accessed while the
-          filesystem in mounted.
-
-
-     Any bits not covered by the above masks should be set off;
-     otherwise, results are undefined.
-
-     The meaning of DATA depends on the filesystem type and is
-     controlled entirely by the filesystem driver in the kernel.
-
-     Example:
-
-          #include <sys/mount.h>
-
-          mount("/dev/hdb", "/cdrom", MS_MGC_VAL | MS_RDONLY | MS_NOSUID, "");
-
-          mount("/dev/hda2", "/mnt", MS_MGC_VAL | MS_REMOUNT, "");
-
-     Appropriate arguments for `mount' are conventionally recorded in
-     the `fstab' table.  *Note Mount Information::.
-
-     The return value is zero if the mount or remount is successful.
-     Otherwise, it is `-1' and `errno' is set appropriately.  The
-     values of `errno' are filesystem dependent, but here is a general
-     list:
-
-    `EPERM'
-          The process is not superuser.
-
-    `ENODEV'
-          The file system type FSTYPE is not known to the kernel.
-
-    `ENOTBLK'
-          The file DEV is not a block device special file.
-
-    `EBUSY'
-             * The device is already mounted.
-
-             * The mount point is busy.  (E.g. it is some process'
-               working directory or has a filesystem mounted on it
-               already).
-
-             * The request is to remount read-only, but there are files
-               open for write.
-
-    `EINVAL'
-             * A remount was attempted, but there is no filesystem
-               mounted over the specified mount point.
-
-             * The supposed filesystem has an invalid superblock.
-
-
-    `EACCES'
-             * The filesystem is inherently read-only (possibly due to
-               a switch on the device) and the process attempted to
-               mount it read/write (by setting the `MS_RDONLY' bit off).
-
-             * SPECIAL_FILE or DIR is not accessible due to file
-               permissions.
-
-             * SPECIAL_FILE is not accessible because it is in a
-               filesystem that is mounted with the `MS_NODEV' option.
-
-
-    `EM_FILE'
-          The table of dummy devices is full.  `mount' needs to create a
-          dummy device (aka "unnamed" device) if the filesystem being
-          mounted is not one that uses a device.
-
-
-
- -- Function: int umount2 (const char *FILE, int FLAGS)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `umount2' unmounts a filesystem.
-
-     You can identify the filesystem to unmount either by the device
-     special file that contains the filesystem or by the mount point.
-     The effect is the same.  Specify either as the string FILE.
-
-     FLAGS contains the one-bit field identified by the following mask
-     macro:
-
-    `MNT_FORCE'
-          This bit on means to force the unmounting even if the
-          filesystem is busy, by making it unbusy first.  If the bit is
-          off and the filesystem is busy, `umount2' fails with `errno'
-          = `EBUSY'.  Depending on the filesystem, this may override
-          all, some, or no busy conditions.
-
-
-     All other bits in FLAGS should be set to zero; otherwise, the
-     result is undefined.
-
-     Example:
-
-          #include <sys/mount.h>
-
-          umount2("/mnt", MNT_FORCE);
-
-          umount2("/dev/hdd1", 0);
-
-     After the filesystem is unmounted, the directory that was the
-     mount point is visible, as are any files in it.
-
-     As part of unmounting, `umount2' syncs the filesystem.
-
-     If the unmounting is successful, the return value is zero.
-     Otherwise, it is `-1' and `errno' is set accordingly:
-
-    `EPERM'
-          The process is not superuser.
-
-    `EBUSY'
-          The filesystem cannot be unmounted because it is busy.  E.g.
-          it contains a directory that is some process's working
-          directory or a file that some process has open.  With some
-          filesystems in some cases, you can avoid this failure with
-          the `MNT_FORCE' option.
-
-    `EINVAL'
-          FILE validly refers to a file, but that file is neither a
-          mount point nor a device special file of a currently mounted
-          filesystem.
-
-
-     This function is not available on all systems.
-
- -- Function: int umount (const char *FILE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `umount' does the same thing as `umount2' with FLAGS set to
-     zeroes.  It is more widely available than `umount2' but since it
-     lacks the possibility to forcefully unmount a filesystem is
-     deprecated when `umount2' is also available.
-
-
-File: libc.info,  Node: System Parameters,  Prev: Filesystem Handling,  Up: System Management
-
-30.4 System Parameters
-======================
-
-This section describes the `sysctl' function, which gets and sets a
-variety of system parameters.
-
-   The symbols used in this section are declared in the file
-`sys/sysctl.h'.
-
- -- Function: int sysctl (int *NAMES, int NLEN, void *OLDVAL, size_t
-          *OLDLENP, void *NEWVAL, size_t NEWLEN)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     `sysctl' gets or sets a specified system parameter.  There are so
-     many of these parameters that it is not practical to list them all
-     here, but here are some examples:
-
-        * network domain name
-
-        * paging parameters
-
-        * network Address Resolution Protocol timeout time
-
-        * maximum number of files that may be open
-
-        * root filesystem device
-
-        * when kernel was built
-
-     The set of available parameters depends on the kernel
-     configuration and can change while the system is running,
-     particularly when you load and unload loadable kernel modules.
-
-     The system parameters with which `syslog' is concerned are arranged
-     in a hierarchical structure like a hierarchical filesystem.  To
-     identify a particular parameter, you specify a path through the
-     structure in a way analogous to specifying the pathname of a file.
-     Each component of the path is specified by an integer and each of
-     these integers has a macro defined for it by `sys/sysctl.h'.
-     NAMES is the path, in the form of an array of integers.  Each
-     component of the path is one element of the array, in order.  NLEN
-     is the number of components in the path.
-
-     For example, the first component of the path for all the paging
-     parameters is the value `CTL_VM'.  For the free page thresholds,
-     the second component of the path is `VM_FREEPG'.  So to get the
-     free page threshold values, make NAMES an array containing the two
-     elements `CTL_VM' and `VM_FREEPG' and make NLEN = 2.
-
-     The format of the value of a parameter depends on the parameter.
-     Sometimes it is an integer; sometimes it is an ASCII string;
-     sometimes it is an elaborate structure.  In the case of the free
-     page thresholds used in the example above, the parameter value is
-     a structure containing several integers.
-
-     In any case, you identify a place to return the parameter's value
-     with OLDVAL and specify the amount of storage available at that
-     location as *OLDLENP.  *OLDLENP does double duty because it is
-     also the output location that contains the actual length of the
-     returned value.
-
-     If you don't want the parameter value returned, specify a null
-     pointer for OLDVAL.
-
-     To set the parameter, specify the address and length of the new
-     value as NEWVAL and NEWLEN.  If you don't want to set the
-     parameter, specify a null pointer as NEWVAL.
-
-     If you get and set a parameter in the same `sysctl' call, the value
-     returned is the value of the parameter before it was set.
-
-     Each system parameter has a set of permissions similar to the
-     permissions for a file (including the permissions on directories
-     in its path) that determine whether you may get or set it.  For
-     the purposes of these permissions, every parameter is considered
-     to be owned by the superuser and Group 0 so processes with that
-     effective uid or gid may have more access to system parameters.
-     Unlike with files, the superuser does not invariably have full
-     permission to all system parameters, because some of them are
-     designed not to be changed ever.
-
-     `sysctl' returns a zero return value if it succeeds.  Otherwise, it
-     returns `-1' and sets `errno' appropriately.  Besides the failures
-     that apply to all system calls, the following are the `errno'
-     codes for all possible failures:
-
-    `EPERM'
-          The process is not permitted to access one of the components
-          of the path of the system parameter or is not permitted to
-          access the system parameter itself in the way (read or write)
-          that it requested.
-
-    `ENOTDIR'
-          There is no system parameter corresponding to NAME.
-
-    `EFAULT'
-          OLDVAL is not null, which means the process wanted to read
-          the parameter, but *OLDLENP is zero, so there is no place to
-          return it.
-
-    `EINVAL'
-             * The process attempted to set a system parameter to a
-               value that is not valid for that parameter.
-
-             * The space provided for the return of the system
-               parameter is not the right size for that parameter.
-
-    `ENOMEM'
-          This value may be returned instead of the more correct
-          `EINVAL' in some cases where the space provided for the
-          return of the system parameter is too small.
-
-
-
-   If you have a Linux kernel with the `proc' filesystem, you can get
-and set most of the same parameters by reading and writing to files in
-the `sys' directory of the `proc' filesystem.  In the `sys' directory,
-the directory structure represents the hierarchical structure of the
-parameters.  E.g. you can display the free page thresholds with
-     cat /proc/sys/vm/freepages
-
-   Some more traditional and more widely available, though less general,
-GNU C Library functions for getting and setting some of the same system
-parameters are:
-
-   * `getdomainname', `setdomainname'
-
-   * `gethostname', `sethostname' (*Note Host Identification::.)
-
-   * `uname' (*Note Platform Type::.)
-
-   * `bdflush'
-
-
-File: libc.info,  Node: System Configuration,  Next: Cryptographic Functions,  Prev: System Management,  Up: Top
-
-31 System Configuration Parameters
-**********************************
-
-The functions and macros listed in this chapter give information about
-configuration parameters of the operating system--for example, capacity
-limits, presence of optional POSIX features, and the default path for
-executable files (*note String Parameters::).
-
-* Menu:
-
-* General Limits::           Constants and functions that describe
-				various process-related limits that have
-				one uniform value for any given machine.
-* System Options::           Optional POSIX features.
-* Version Supported::        Version numbers of POSIX.1 and POSIX.2.
-* Sysconf::                  Getting specific configuration values
-                                of general limits and system options.
-* Minimums::                 Minimum values for general limits.
-
-* Limits for Files::         Size limitations that pertain to individual files.
-                                These can vary between file systems
-                                or even from file to file.
-* Options for Files::        Optional features that some files may support.
-* File Minimums::            Minimum values for file limits.
-* Pathconf::                 Getting the limit values for a particular file.
-
-* Utility Limits::           Capacity limits of some POSIX.2 utility programs.
-* Utility Minimums::         Minimum allowable values of those limits.
-
-* String Parameters::        Getting the default search path.
-
-
-File: libc.info,  Node: General Limits,  Next: System Options,  Up: System Configuration
-
-31.1 General Capacity Limits
-============================
-
-The POSIX.1 and POSIX.2 standards specify a number of parameters that
-describe capacity limitations of the system.  These limits can be fixed
-constants for a given operating system, or they can vary from machine to
-machine.  For example, some limit values may be configurable by the
-system administrator, either at run time or by rebuilding the kernel,
-and this should not require recompiling application programs.
-
-   Each of the following limit parameters has a macro that is defined in
-`limits.h' only if the system has a fixed, uniform limit for the
-parameter in question.  If the system allows different file systems or
-files to have different limits, then the macro is undefined; use
-`sysconf' to find out the limit that applies at a particular time on a
-particular machine.  *Note Sysconf::.
-
-   Each of these parameters also has another macro, with a name starting
-with `_POSIX', which gives the lowest value that the limit is allowed
-to have on _any_ POSIX system.  *Note Minimums::.
-
- -- Macro: int ARG_MAX
-     If defined, the unvarying maximum combined length of the ARGV and
-     ENVIRON arguments that can be passed to the `exec' functions.
-
- -- Macro: int CHILD_MAX
-     If defined, the unvarying maximum number of processes that can
-     exist with the same real user ID at any one time.  In BSD and GNU,
-     this is controlled by the `RLIMIT_NPROC' resource limit; *note
-     Limits on Resources::.
-
- -- Macro: int OPEN_MAX
-     If defined, the unvarying maximum number of files that a single
-     process can have open simultaneously.  In BSD and GNU, this is
-     controlled by the `RLIMIT_NOFILE' resource limit; *note Limits on
-     Resources::.
-
- -- Macro: int STREAM_MAX
-     If defined, the unvarying maximum number of streams that a single
-     process can have open simultaneously.  *Note Opening Streams::.
-
- -- Macro: int TZNAME_MAX
-     If defined, the unvarying maximum length of a time zone name.
-     *Note Time Zone Functions::.
-
-   These limit macros are always defined in `limits.h'.
-
- -- Macro: int NGROUPS_MAX
-     The maximum number of supplementary group IDs that one process can
-     have.
-
-     The value of this macro is actually a lower bound for the maximum.
-     That is, you can count on being able to have that many
-     supplementary group IDs, but a particular machine might let you
-     have even more.  You can use `sysconf' to see whether a particular
-     machine will let you have more (*note Sysconf::).
-
- -- Macro: ssize_t SSIZE_MAX
-     The largest value that can fit in an object of type `ssize_t'.
-     Effectively, this is the limit on the number of bytes that can be
-     read or written in a single operation.
-
-     This macro is defined in all POSIX systems because this limit is
-     never configurable.
-
- -- Macro: int RE_DUP_MAX
-     The largest number of repetitions you are guaranteed is allowed in
-     the construct `\{MIN,MAX\}' in a regular expression.
-
-     The value of this macro is actually a lower bound for the maximum.
-     That is, you can count on being able to have that many
-     repetitions, but a particular machine might let you have even
-     more.  You can use `sysconf' to see whether a particular machine
-     will let you have more (*note Sysconf::).  And even the value that
-     `sysconf' tells you is just a lower bound--larger values might
-     work.
-
-     This macro is defined in all POSIX.2 systems, because POSIX.2 says
-     it should always be defined even if there is no specific imposed
-     limit.
-
-
-File: libc.info,  Node: System Options,  Next: Version Supported,  Prev: General Limits,  Up: System Configuration
-
-31.2 Overall System Options
-===========================
-
-POSIX defines certain system-specific options that not all POSIX systems
-support.  Since these options are provided in the kernel, not in the
-library, simply using the GNU C Library does not guarantee any of these
-features is supported; it depends on the system you are using.
-
-   You can test for the availability of a given option using the macros
-in this section, together with the function `sysconf'.  The macros are
-defined only if you include `unistd.h'.
-
-   For the following macros, if the macro is defined in `unistd.h',
-then the option is supported.  Otherwise, the option may or may not be
-supported; use `sysconf' to find out.  *Note Sysconf::.
-
- -- Macro: int _POSIX_JOB_CONTROL
-     If this symbol is defined, it indicates that the system supports
-     job control.  Otherwise, the implementation behaves as if all
-     processes within a session belong to a single process group.
-     *Note Job Control::.
-
- -- Macro: int _POSIX_SAVED_IDS
-     If this symbol is defined, it indicates that the system remembers
-     the effective user and group IDs of a process before it executes an
-     executable file with the set-user-ID or set-group-ID bits set, and
-     that explicitly changing the effective user or group IDs back to
-     these values is permitted.  If this option is not defined, then if
-     a nonprivileged process changes its effective user or group ID to
-     the real user or group ID of the process, it can't change it back
-     again.  *Note Enable/Disable Setuid::.
-
-   For the following macros, if the macro is defined in `unistd.h',
-then its value indicates whether the option is supported.  A value of
-`-1' means no, and any other value means yes.  If the macro is not
-defined, then the option may or may not be supported; use `sysconf' to
-find out.  *Note Sysconf::.
-
- -- Macro: int _POSIX2_C_DEV
-     If this symbol is defined, it indicates that the system has the
-     POSIX.2 C compiler command, `c89'.  The GNU C Library always
-     defines this as `1', on the assumption that you would not have
-     installed it if you didn't have a C compiler.
-
- -- Macro: int _POSIX2_FORT_DEV
-     If this symbol is defined, it indicates that the system has the
-     POSIX.2 Fortran compiler command, `fort77'.  The GNU C Library
-     never defines this, because we don't know what the system has.
-
- -- Macro: int _POSIX2_FORT_RUN
-     If this symbol is defined, it indicates that the system has the
-     POSIX.2 `asa' command to interpret Fortran carriage control.  The
-     GNU C Library never defines this, because we don't know what the
-     system has.
-
- -- Macro: int _POSIX2_LOCALEDEF
-     If this symbol is defined, it indicates that the system has the
-     POSIX.2 `localedef' command.  The GNU C Library never defines
-     this, because we don't know what the system has.
-
- -- Macro: int _POSIX2_SW_DEV
-     If this symbol is defined, it indicates that the system has the
-     POSIX.2 commands `ar', `make', and `strip'.  The GNU C Library
-     always defines this as `1', on the assumption that you had to have
-     `ar' and `make' to install the library, and it's unlikely that
-     `strip' would be absent when those are present.
-
-
-File: libc.info,  Node: Version Supported,  Next: Sysconf,  Prev: System Options,  Up: System Configuration
-
-31.3 Which Version of POSIX is Supported
-========================================
-
- -- Macro: long int _POSIX_VERSION
-     This constant represents the version of the POSIX.1 standard to
-     which the implementation conforms.  For an implementation
-     conforming to the 1995 POSIX.1 standard, the value is the integer
-     `199506L'.
-
-     `_POSIX_VERSION' is always defined (in `unistd.h') in any POSIX
-     system.
-
-     *Usage Note:* Don't try to test whether the system supports POSIX
-     by including `unistd.h' and then checking whether `_POSIX_VERSION'
-     is defined.  On a non-POSIX system, this will probably fail
-     because there is no `unistd.h'.  We do not know of _any_ way you
-     can reliably test at compilation time whether your target system
-     supports POSIX or whether `unistd.h' exists.
-
- -- Macro: long int _POSIX2_C_VERSION
-     This constant represents the version of the POSIX.2 standard which
-     the library and system kernel support.  We don't know what value
-     this will be for the first version of the POSIX.2 standard,
-     because the value is based on the year and month in which the
-     standard is officially adopted.
-
-     The value of this symbol says nothing about the utilities
-     installed on the system.
-
-     *Usage Note:* You can use this macro to tell whether a POSIX.1
-     system library supports POSIX.2 as well.  Any POSIX.1 system
-     contains `unistd.h', so include that file and then test `defined
-     (_POSIX2_C_VERSION)'.
-
-
-File: libc.info,  Node: Sysconf,  Next: Minimums,  Prev: Version Supported,  Up: System Configuration
-
-31.4 Using `sysconf'
-====================
-
-When your system has configurable system limits, you can use the
-`sysconf' function to find out the value that applies to any particular
-machine.  The function and the associated PARAMETER constants are
-declared in the header file `unistd.h'.
-
-* Menu:
-
-* Sysconf Definition::        Detailed specifications of `sysconf'.
-* Constants for Sysconf::     The list of parameters `sysconf' can read.
-* Examples of Sysconf::       How to use `sysconf' and the parameter
-				 macros properly together.
-
-
-File: libc.info,  Node: Sysconf Definition,  Next: Constants for Sysconf,  Up: Sysconf
-
-31.4.1 Definition of `sysconf'
-------------------------------
-
- -- Function: long int sysconf (int PARAMETER)
-     Preliminary: | MT-Safe env | AS-Unsafe lock heap | AC-Unsafe lock
-     mem fd | *Note POSIX Safety Concepts::.
-
-     This function is used to inquire about runtime system parameters.
-     The PARAMETER argument should be one of the `_SC_' symbols listed
-     below.
-
-     The normal return value from `sysconf' is the value you requested.
-     A value of `-1' is returned both if the implementation does not
-     impose a limit, and in case of an error.
-
-     The following `errno' error conditions are defined for this
-     function:
-
-    `EINVAL'
-          The value of the PARAMETER is invalid.
-
-
-File: libc.info,  Node: Constants for Sysconf,  Next: Examples of Sysconf,  Prev: Sysconf Definition,  Up: Sysconf
-
-31.4.2 Constants for `sysconf' Parameters
+22.3.5 Limiting execution to certain CPUs
 -----------------------------------------
 
-Here are the symbolic constants for use as the PARAMETER argument to
-`sysconf'.  The values are all integer constants (more specifically,
-enumeration type values).
+On a multi-processor system the operating system usually distributes the
+different processes which are runnable on all available CPUs in a way
+which allows the system to work most efficiently.  Which processes and
+threads run can be to some extend be control with the scheduling
+functionality described in the last sections.  But which CPU finally
+executes which process or thread is not covered.
 
-`_SC_ARG_MAX'
-     Inquire about the parameter corresponding to `ARG_MAX'.
+   There are a number of reasons why a program might want to have
+control over this aspect of the system as well:
 
-`_SC_CHILD_MAX'
-     Inquire about the parameter corresponding to `CHILD_MAX'.
+   * One thread or process is responsible for absolutely critical work
+     which under no circumstances must be interrupted or hindered from
+     making process by other process or threads using CPU resources.  In
+     this case the special process would be confined to a CPU which no
+     other process or thread is allowed to use.
 
-`_SC_OPEN_MAX'
-     Inquire about the parameter corresponding to `OPEN_MAX'.
+   * The access to certain resources (RAM, I/O ports) has different
+     costs from different CPUs.  This is the case in NUMA (Non-Uniform
+     Memory Architecture) machines.  Preferably memory should be
+     accessed locally but this requirement is usually not visible to the
+     scheduler.  Therefore forcing a process or thread to the CPUs which
+     have local access to the mostly used memory helps to significantly
+     boost the performance.
 
-`_SC_STREAM_MAX'
-     Inquire about the parameter corresponding to `STREAM_MAX'.
+   * In controlled runtimes resource allocation and book-keeping work
+     (for instance garbage collection) is performance local to
+     processors.  This can help to reduce locking costs if the resources
+     do not have to be protected from concurrent accesses from different
+     processors.
 
-`_SC_TZNAME_MAX'
-     Inquire about the parameter corresponding to `TZNAME_MAX'.
+   The POSIX standard up to this date is of not much help to solve this
+problem.  The Linux kernel provides a set of interfaces to allow
+specifying _affinity sets_ for a process.  The scheduler will schedule
+the thread or process on CPUs specified by the affinity masks.  The
+interfaces which the GNU C Library define follow to some extend the
+Linux kernel interface.
 
-`_SC_NGROUPS_MAX'
-     Inquire about the parameter corresponding to `NGROUPS_MAX'.
+ -- Data Type: cpu_set_t
+     This data set is a bitset where each bit represents a CPU. How the
+     system's CPUs are mapped to bits in the bitset is system dependent.
+     The data type has a fixed size; in the unlikely case that the
+     number of bits are not sufficient to describe the CPUs of the
+     system a different interface has to be used.
 
-`_SC_JOB_CONTROL'
-     Inquire about the parameter corresponding to `_POSIX_JOB_CONTROL'.
+     This type is a GNU extension and is defined in 'sched.h'.
 
-`_SC_SAVED_IDS'
-     Inquire about the parameter corresponding to `_POSIX_SAVED_IDS'.
+   To manipulate the bitset, to set and reset bits, a number of macros
+is defined.  Some of the macros take a CPU number as a parameter.  Here
+it is important to never exceed the size of the bitset.  The following
+macro specifies the number of bits in the 'cpu_set_t' bitset.
 
-`_SC_VERSION'
-     Inquire about the parameter corresponding to `_POSIX_VERSION'.
+ -- Macro: int CPU_SETSIZE
+     The value of this macro is the maximum number of CPUs which can be
+     handled with a 'cpu_set_t' object.
 
-`_SC_CLK_TCK'
-     Inquire about the number of clock ticks per second; *note CPU
-     Time::.  The corresponding parameter `CLK_TCK' is obsolete.
+   The type 'cpu_set_t' should be considered opaque; all manipulation
+should happen via the next four macros.
 
-`_SC_CHARCLASS_NAME_MAX'
-     Inquire about the parameter corresponding to maximal length
-     allowed for a character class name in an extended locale
-     specification.  These extensions are not yet standardized and so
-     this option is not standardized as well.
-
-`_SC_REALTIME_SIGNALS'
-     Inquire about the parameter corresponding to
-     `_POSIX_REALTIME_SIGNALS'.
-
-`_SC_PRIORITY_SCHEDULING'
-     Inquire about the parameter corresponding to
-     `_POSIX_PRIORITY_SCHEDULING'.
-
-`_SC_TIMERS'
-     Inquire about the parameter corresponding to `_POSIX_TIMERS'.
-
-`_SC_ASYNCHRONOUS_IO'
-     Inquire about the parameter corresponding to
-     `_POSIX_ASYNCHRONOUS_IO'.
-
-`_SC_PRIORITIZED_IO'
-     Inquire about the parameter corresponding to
-     `_POSIX_PRIORITIZED_IO'.
-
-`_SC_SYNCHRONIZED_IO'
-     Inquire about the parameter corresponding to
-     `_POSIX_SYNCHRONIZED_IO'.
-
-`_SC_FSYNC'
-     Inquire about the parameter corresponding to `_POSIX_FSYNC'.
-
-`_SC_MAPPED_FILES'
-     Inquire about the parameter corresponding to `_POSIX_MAPPED_FILES'.
-
-`_SC_MEMLOCK'
-     Inquire about the parameter corresponding to `_POSIX_MEMLOCK'.
-
-`_SC_MEMLOCK_RANGE'
-     Inquire about the parameter corresponding to
-     `_POSIX_MEMLOCK_RANGE'.
-
-`_SC_MEMORY_PROTECTION'
-     Inquire about the parameter corresponding to
-     `_POSIX_MEMORY_PROTECTION'.
-
-`_SC_MESSAGE_PASSING'
-     Inquire about the parameter corresponding to
-     `_POSIX_MESSAGE_PASSING'.
-
-`_SC_SEMAPHORES'
-     Inquire about the parameter corresponding to `_POSIX_SEMAPHORES'.
-
-`_SC_SHARED_MEMORY_OBJECTS'
-     Inquire about the parameter corresponding to
-     `_POSIX_SHARED_MEMORY_OBJECTS'.
-
-`_SC_AIO_LISTIO_MAX'
-     Inquire about the parameter corresponding to
-     `_POSIX_AIO_LISTIO_MAX'.
-
-`_SC_AIO_MAX'
-     Inquire about the parameter corresponding to `_POSIX_AIO_MAX'.
-
-`_SC_AIO_PRIO_DELTA_MAX'
-     Inquire the value by which a process can decrease its asynchronous
-     I/O priority level from its own scheduling priority.  This
-     corresponds to the run-time invariant value `AIO_PRIO_DELTA_MAX'.
-
-`_SC_DELAYTIMER_MAX'
-     Inquire about the parameter corresponding to
-     `_POSIX_DELAYTIMER_MAX'.
-
-`_SC_MQ_OPEN_MAX'
-     Inquire about the parameter corresponding to `_POSIX_MQ_OPEN_MAX'.
-
-`_SC_MQ_PRIO_MAX'
-     Inquire about the parameter corresponding to `_POSIX_MQ_PRIO_MAX'.
-
-`_SC_RTSIG_MAX'
-     Inquire about the parameter corresponding to `_POSIX_RTSIG_MAX'.
-
-`_SC_SEM_NSEMS_MAX'
-     Inquire about the parameter corresponding to
-     `_POSIX_SEM_NSEMS_MAX'.
-
-`_SC_SEM_VALUE_MAX'
-     Inquire about the parameter corresponding to
-     `_POSIX_SEM_VALUE_MAX'.
-
-`_SC_SIGQUEUE_MAX'
-     Inquire about the parameter corresponding to `_POSIX_SIGQUEUE_MAX'.
-
-`_SC_TIMER_MAX'
-     Inquire about the parameter corresponding to `_POSIX_TIMER_MAX'.
-
-`_SC_PII'
-     Inquire about the parameter corresponding to `_POSIX_PII'.
-
-`_SC_PII_XTI'
-     Inquire about the parameter corresponding to `_POSIX_PII_XTI'.
-
-`_SC_PII_SOCKET'
-     Inquire about the parameter corresponding to `_POSIX_PII_SOCKET'.
-
-`_SC_PII_INTERNET'
-     Inquire about the parameter corresponding to `_POSIX_PII_INTERNET'.
-
-`_SC_PII_OSI'
-     Inquire about the parameter corresponding to `_POSIX_PII_OSI'.
-
-`_SC_SELECT'
-     Inquire about the parameter corresponding to `_POSIX_SELECT'.
-
-`_SC_UIO_MAXIOV'
-     Inquire about the parameter corresponding to `_POSIX_UIO_MAXIOV'.
-
-`_SC_PII_INTERNET_STREAM'
-     Inquire about the parameter corresponding to
-     `_POSIX_PII_INTERNET_STREAM'.
-
-`_SC_PII_INTERNET_DGRAM'
-     Inquire about the parameter corresponding to
-     `_POSIX_PII_INTERNET_DGRAM'.
-
-`_SC_PII_OSI_COTS'
-     Inquire about the parameter corresponding to `_POSIX_PII_OSI_COTS'.
-
-`_SC_PII_OSI_CLTS'
-     Inquire about the parameter corresponding to `_POSIX_PII_OSI_CLTS'.
-
-`_SC_PII_OSI_M'
-     Inquire about the parameter corresponding to `_POSIX_PII_OSI_M'.
-
-`_SC_T_IOV_MAX'
-     Inquire the value of the value associated with the `T_IOV_MAX'
-     variable.
-
-`_SC_THREADS'
-     Inquire about the parameter corresponding to `_POSIX_THREADS'.
-
-`_SC_THREAD_SAFE_FUNCTIONS'
-     Inquire about the parameter corresponding to
-     `_POSIX_THREAD_SAFE_FUNCTIONS'.
-
-`_SC_GETGR_R_SIZE_MAX'
-     Inquire about the parameter corresponding to
-     `_POSIX_GETGR_R_SIZE_MAX'.
-
-`_SC_GETPW_R_SIZE_MAX'
-     Inquire about the parameter corresponding to
-     `_POSIX_GETPW_R_SIZE_MAX'.
-
-`_SC_LOGIN_NAME_MAX'
-     Inquire about the parameter corresponding to
-     `_POSIX_LOGIN_NAME_MAX'.
-
-`_SC_TTY_NAME_MAX'
-     Inquire about the parameter corresponding to `_POSIX_TTY_NAME_MAX'.
-
-`_SC_THREAD_DESTRUCTOR_ITERATIONS'
-     Inquire about the parameter corresponding to
-     `_POSIX_THREAD_DESTRUCTOR_ITERATIONS'.
-
-`_SC_THREAD_KEYS_MAX'
-     Inquire about the parameter corresponding to
-     `_POSIX_THREAD_KEYS_MAX'.
-
-`_SC_THREAD_STACK_MIN'
-     Inquire about the parameter corresponding to
-     `_POSIX_THREAD_STACK_MIN'.
-
-`_SC_THREAD_THREADS_MAX'
-     Inquire about the parameter corresponding to
-     `_POSIX_THREAD_THREADS_MAX'.
-
-`_SC_THREAD_ATTR_STACKADDR'
-     Inquire about the parameter corresponding to
-     a `_POSIX_THREAD_ATTR_STACKADDR'.
-
-`_SC_THREAD_ATTR_STACKSIZE'
-     Inquire about the parameter corresponding to
-     `_POSIX_THREAD_ATTR_STACKSIZE'.
-
-`_SC_THREAD_PRIORITY_SCHEDULING'
-     Inquire about the parameter corresponding to
-     `_POSIX_THREAD_PRIORITY_SCHEDULING'.
-
-`_SC_THREAD_PRIO_INHERIT'
-     Inquire about the parameter corresponding to
-     `_POSIX_THREAD_PRIO_INHERIT'.
-
-`_SC_THREAD_PRIO_PROTECT'
-     Inquire about the parameter corresponding to
-     `_POSIX_THREAD_PRIO_PROTECT'.
-
-`_SC_THREAD_PROCESS_SHARED'
-     Inquire about the parameter corresponding to
-     `_POSIX_THREAD_PROCESS_SHARED'.
-
-`_SC_2_C_DEV'
-     Inquire about whether the system has the POSIX.2 C compiler
-     command, `c89'.
-
-`_SC_2_FORT_DEV'
-     Inquire about whether the system has the POSIX.2 Fortran compiler
-     command, `fort77'.
-
-`_SC_2_FORT_RUN'
-     Inquire about whether the system has the POSIX.2 `asa' command to
-     interpret Fortran carriage control.
-
-`_SC_2_LOCALEDEF'
-     Inquire about whether the system has the POSIX.2 `localedef'
-     command.
-
-`_SC_2_SW_DEV'
-     Inquire about whether the system has the POSIX.2 commands `ar',
-     `make', and `strip'.
-
-`_SC_BC_BASE_MAX'
-     Inquire about the maximum value of `obase' in the `bc' utility.
-
-`_SC_BC_DIM_MAX'
-     Inquire about the maximum size of an array in the `bc' utility.
-
-`_SC_BC_SCALE_MAX'
-     Inquire about the maximum value of `scale' in the `bc' utility.
-
-`_SC_BC_STRING_MAX'
-     Inquire about the maximum size of a string constant in the `bc'
-     utility.
-
-`_SC_COLL_WEIGHTS_MAX'
-     Inquire about the maximum number of weights that can necessarily
-     be used in defining the collating sequence for a locale.
-
-`_SC_EXPR_NEST_MAX'
-     Inquire about the maximum number of expressions nested within
-     parentheses when using the `expr' utility.
-
-`_SC_LINE_MAX'
-     Inquire about the maximum size of a text line that the POSIX.2 text
-     utilities can handle.
-
-`_SC_EQUIV_CLASS_MAX'
-     Inquire about the maximum number of weights that can be assigned
-     to an entry of the `LC_COLLATE' category `order' keyword in a
-     locale definition.  The GNU C Library does not presently support
-     locale definitions.
-
-`_SC_VERSION'
-     Inquire about the version number of POSIX.1 that the library and
-     kernel support.
-
-`_SC_2_VERSION'
-     Inquire about the version number of POSIX.2 that the system
-     utilities support.
-
-`_SC_PAGESIZE'
-     Inquire about the virtual memory page size of the machine.
-     `getpagesize' returns the same value (*note Query Memory
-     Parameters::).
-
-`_SC_NPROCESSORS_CONF'
-     Inquire about the number of configured processors.
-
-`_SC_NPROCESSORS_ONLN'
-     Inquire about the number of processors online.
-
-`_SC_PHYS_PAGES'
-     Inquire about the number of physical pages in the system.
-
-`_SC_AVPHYS_PAGES'
-     Inquire about the number of available physical pages in the system.
-
-`_SC_ATEXIT_MAX'
-     Inquire about the number of functions which can be registered as
-     termination functions for `atexit'; *note Cleanups on Exit::.
-
-`_SC_XOPEN_VERSION'
-     Inquire about the parameter corresponding to `_XOPEN_VERSION'.
-
-`_SC_XOPEN_XCU_VERSION'
-     Inquire about the parameter corresponding to `_XOPEN_XCU_VERSION'.
-
-`_SC_XOPEN_UNIX'
-     Inquire about the parameter corresponding to `_XOPEN_UNIX'.
-
-`_SC_XOPEN_REALTIME'
-     Inquire about the parameter corresponding to `_XOPEN_REALTIME'.
-
-`_SC_XOPEN_REALTIME_THREADS'
-     Inquire about the parameter corresponding to
-     `_XOPEN_REALTIME_THREADS'.
-
-`_SC_XOPEN_LEGACY'
-     Inquire about the parameter corresponding to `_XOPEN_LEGACY'.
-
-`_SC_XOPEN_CRYPT'
-     Inquire about the parameter corresponding to `_XOPEN_CRYPT'.
-
-`_SC_XOPEN_ENH_I18N'
-     Inquire about the parameter corresponding to `_XOPEN_ENH_I18N'.
-
-`_SC_XOPEN_SHM'
-     Inquire about the parameter corresponding to `_XOPEN_SHM'.
-
-`_SC_XOPEN_XPG2'
-     Inquire about the parameter corresponding to `_XOPEN_XPG2'.
-
-`_SC_XOPEN_XPG3'
-     Inquire about the parameter corresponding to `_XOPEN_XPG3'.
-
-`_SC_XOPEN_XPG4'
-     Inquire about the parameter corresponding to `_XOPEN_XPG4'.
-
-`_SC_CHAR_BIT'
-     Inquire about the number of bits in a variable of type `char'.
-
-`_SC_CHAR_MAX'
-     Inquire about the maximum value which can be stored in a variable
-     of type `char'.
-
-`_SC_CHAR_MIN'
-     Inquire about the minimum value which can be stored in a variable
-     of type `char'.
-
-`_SC_INT_MAX'
-     Inquire about the maximum value which can be stored in a variable
-     of type `int'.
-
-`_SC_INT_MIN'
-     Inquire about the minimum value which can be stored in a variable
-     of type `int'.
-
-`_SC_LONG_BIT'
-     Inquire about the number of bits in a variable of type `long int'.
-
-`_SC_WORD_BIT'
-     Inquire about the number of bits in a variable of a register word.
-
-`_SC_MB_LEN_MAX'
-     Inquire the maximum length of a multi-byte representation of a wide
-     character value.
-
-`_SC_NZERO'
-     Inquire about the value used to internally represent the zero
-     priority level for the process execution.
-
-`SC_SSIZE_MAX'
-     Inquire about the maximum value which can be stored in a variable
-     of type `ssize_t'.
-
-`_SC_SCHAR_MAX'
-     Inquire about the maximum value which can be stored in a variable
-     of type `signed char'.
-
-`_SC_SCHAR_MIN'
-     Inquire about the minimum value which can be stored in a variable
-     of type `signed char'.
-
-`_SC_SHRT_MAX'
-     Inquire about the maximum value which can be stored in a variable
-     of type `short int'.
-
-`_SC_SHRT_MIN'
-     Inquire about the minimum value which can be stored in a variable
-     of type `short int'.
-
-`_SC_UCHAR_MAX'
-     Inquire about the maximum value which can be stored in a variable
-     of type `unsigned char'.
-
-`_SC_UINT_MAX'
-     Inquire about the maximum value which can be stored in a variable
-     of type `unsigned int'.
-
-`_SC_ULONG_MAX'
-     Inquire about the maximum value which can be stored in a variable
-     of type `unsigned long int'.
-
-`_SC_USHRT_MAX'
-     Inquire about the maximum value which can be stored in a variable
-     of type `unsigned short int'.
-
-`_SC_NL_ARGMAX'
-     Inquire about the parameter corresponding to `NL_ARGMAX'.
-
-`_SC_NL_LANGMAX'
-     Inquire about the parameter corresponding to `NL_LANGMAX'.
-
-`_SC_NL_MSGMAX'
-     Inquire about the parameter corresponding to `NL_MSGMAX'.
-
-`_SC_NL_NMAX'
-     Inquire about  the parameter corresponding to `NL_NMAX'.
-
-`_SC_NL_SETMAX'
-     Inquire about the parameter corresponding to `NL_SETMAX'.
-
-`_SC_NL_TEXTMAX'
-     Inquire about the parameter corresponding to `NL_TEXTMAX'.
-
-
-File: libc.info,  Node: Examples of Sysconf,  Prev: Constants for Sysconf,  Up: Sysconf
-
-31.4.3 Examples of `sysconf'
-----------------------------
-
-We recommend that you first test for a macro definition for the
-parameter you are interested in, and call `sysconf' only if the macro
-is not defined.  For example, here is how to test whether job control
-is supported:
-
-     int
-     have_job_control (void)
-     {
-     #ifdef _POSIX_JOB_CONTROL
-       return 1;
-     #else
-       int value = sysconf (_SC_JOB_CONTROL);
-       if (value < 0)
-         /* If the system is that badly wedged,
-            there's no use trying to go on.  */
-         fatal (strerror (errno));
-       return value;
-     #endif
-     }
-
-   Here is how to get the value of a numeric limit:
-
-     int
-     get_child_max ()
-     {
-     #ifdef CHILD_MAX
-       return CHILD_MAX;
-     #else
-       int value = sysconf (_SC_CHILD_MAX);
-       if (value < 0)
-         fatal (strerror (errno));
-       return value;
-     #endif
-     }
-
-
-File: libc.info,  Node: Minimums,  Next: Limits for Files,  Prev: Sysconf,  Up: System Configuration
-
-31.5 Minimum Values for General Capacity Limits
-===============================================
-
-Here are the names for the POSIX minimum upper bounds for the system
-limit parameters.  The significance of these values is that you can
-safely push to these limits without checking whether the particular
-system you are using can go that far.
-
-`_POSIX_AIO_LISTIO_MAX'
-     The most restrictive limit permitted by POSIX for the maximum
-     number of I/O operations that can be specified in a list I/O call.
-     The value of this constant is `2'; thus you can add up to two new
-     entries of the list of outstanding operations.
-
-`_POSIX_AIO_MAX'
-     The most restrictive limit permitted by POSIX for the maximum
-     number of outstanding asynchronous I/O operations.  The value of
-     this constant is `1'.  So you cannot expect that you can issue
-     more than one operation and immediately continue with the normal
-     work, receiving the notifications asynchronously.
-
-`_POSIX_ARG_MAX'
-     The value of this macro is the most restrictive limit permitted by
-     POSIX for the maximum combined length of the ARGV and ENVIRON
-     arguments that can be passed to the `exec' functions.  Its value
-     is `4096'.
-
-`_POSIX_CHILD_MAX'
-     The value of this macro is the most restrictive limit permitted by
-     POSIX for the maximum number of simultaneous processes per real
-     user ID.  Its value is `6'.
-
-`_POSIX_NGROUPS_MAX'
-     The value of this macro is the most restrictive limit permitted by
-     POSIX for the maximum number of supplementary group IDs per
-     process.  Its value is `0'.
-
-`_POSIX_OPEN_MAX'
-     The value of this macro is the most restrictive limit permitted by
-     POSIX for the maximum number of files that a single process can
-     have open simultaneously.  Its value is `16'.
-
-`_POSIX_SSIZE_MAX'
-     The value of this macro is the most restrictive limit permitted by
-     POSIX for the maximum value that can be stored in an object of type
-     `ssize_t'.  Its value is `32767'.
-
-`_POSIX_STREAM_MAX'
-     The value of this macro is the most restrictive limit permitted by
-     POSIX for the maximum number of streams that a single process can
-     have open simultaneously.  Its value is `8'.
-
-`_POSIX_TZNAME_MAX'
-     The value of this macro is the most restrictive limit permitted by
-     POSIX for the maximum length of a time zone name.  Its value is
-     `3'.
-
-`_POSIX2_RE_DUP_MAX'
-     The value of this macro is the most restrictive limit permitted by
-     POSIX for the numbers used in the `\{MIN,MAX\}' construct in a
-     regular expression.  Its value is `255'.
-
-
-File: libc.info,  Node: Limits for Files,  Next: Options for Files,  Prev: Minimums,  Up: System Configuration
-
-31.6 Limits on File System Capacity
-===================================
-
-The POSIX.1 standard specifies a number of parameters that describe the
-limitations of the file system.  It's possible for the system to have a
-fixed, uniform limit for a parameter, but this isn't the usual case.  On
-most systems, it's possible for different file systems (and, for some
-parameters, even different files) to have different maximum limits.  For
-example, this is very likely if you use NFS to mount some of the file
-systems from other machines.
-
-   Each of the following macros is defined in `limits.h' only if the
-system has a fixed, uniform limit for the parameter in question.  If the
-system allows different file systems or files to have different limits,
-then the macro is undefined; use `pathconf' or `fpathconf' to find out
-the limit that applies to a particular file.  *Note Pathconf::.
-
-   Each parameter also has another macro, with a name starting with
-`_POSIX', which gives the lowest value that the limit is allowed to
-have on _any_ POSIX system.  *Note File Minimums::.
-
- -- Macro: int LINK_MAX
-     The uniform system limit (if any) for the number of names for a
-     given file.  *Note Hard Links::.
-
- -- Macro: int MAX_CANON
-     The uniform system limit (if any) for the amount of text in a line
-     of input when input editing is enabled.  *Note Canonical or Not::.
-
- -- Macro: int MAX_INPUT
-     The uniform system limit (if any) for the total number of
-     characters typed ahead as input.  *Note I/O Queues::.
-
- -- Macro: int NAME_MAX
-     The uniform system limit (if any) for the length of a file name
-     component, not including the terminating null character.
-
-     *Portability Note:* On some systems, the GNU C Library defines
-     `NAME_MAX', but does not actually enforce this limit.
-
- -- Macro: int PATH_MAX
-     The uniform system limit (if any) for the length of an entire file
-     name (that is, the argument given to system calls such as `open'),
-     including the terminating null character.
-
-     *Portability Note:* The GNU C Library does not enforce this limit
-     even if `PATH_MAX' is defined.
-
- -- Macro: int PIPE_BUF
-     The uniform system limit (if any) for the number of bytes that can
-     be written atomically to a pipe.  If multiple processes are
-     writing to the same pipe simultaneously, output from different
-     processes might be interleaved in chunks of this size.  *Note
-     Pipes and FIFOs::.
-
-   These are alternative macro names for some of the same information.
-
- -- Macro: int MAXNAMLEN
-     This is the BSD name for `NAME_MAX'.  It is defined in `dirent.h'.
-
- -- Macro: int FILENAME_MAX
-     The value of this macro is an integer constant expression that
-     represents the maximum length of a file name string.  It is
-     defined in `stdio.h'.
-
-     Unlike `PATH_MAX', this macro is defined even if there is no actual
-     limit imposed.  In such a case, its value is typically a very large
-     number.  *This is always the case on GNU/Hurd systems.*
-
-     *Usage Note:* Don't use `FILENAME_MAX' as the size of an array in
-     which to store a file name!  You can't possibly make an array that
-     big!  Use dynamic allocation (*note Memory Allocation::) instead.
-
-
-File: libc.info,  Node: Options for Files,  Next: File Minimums,  Prev: Limits for Files,  Up: System Configuration
-
-31.7 Optional Features in File Support
-======================================
-
-POSIX defines certain system-specific options in the system calls for
-operating on files.  Some systems support these options and others do
-not.  Since these options are provided in the kernel, not in the
-library, simply using the GNU C Library does not guarantee that any of
-these features is supported; it depends on the system you are using.
-They can also vary between file systems on a single machine.
-
-   This section describes the macros you can test to determine whether a
-particular option is supported on your machine.  If a given macro is
-defined in `unistd.h', then its value says whether the corresponding
-feature is supported.  (A value of `-1' indicates no; any other value
-indicates yes.)  If the macro is undefined, it means particular files
-may or may not support the feature.
-
-   Since all the machines that support the GNU C Library also support
-NFS, one can never make a general statement about whether all file
-systems support the `_POSIX_CHOWN_RESTRICTED' and `_POSIX_NO_TRUNC'
-features.  So these names are never defined as macros in the GNU C
-Library.
-
- -- Macro: int _POSIX_CHOWN_RESTRICTED
-     If this option is in effect, the `chown' function is restricted so
-     that the only changes permitted to nonprivileged processes is to
-     change the group owner of a file to either be the effective group
-     ID of the process, or one of its supplementary group IDs.  *Note
-     File Owner::.
-
- -- Macro: int _POSIX_NO_TRUNC
-     If this option is in effect, file name components longer than
-     `NAME_MAX' generate an `ENAMETOOLONG' error.  Otherwise, file name
-     components that are too long are silently truncated.
-
- -- Macro: unsigned char _POSIX_VDISABLE
-     This option is only meaningful for files that are terminal devices.
-     If it is enabled, then handling for special control characters can
-     be disabled individually.  *Note Special Characters::.
-
-   If one of these macros is undefined, that means that the option
-might be in effect for some files and not for others.  To inquire about
-a particular file, call `pathconf' or `fpathconf'.  *Note Pathconf::.
-
-
-File: libc.info,  Node: File Minimums,  Next: Pathconf,  Prev: Options for Files,  Up: System Configuration
-
-31.8 Minimum Values for File System Limits
-==========================================
-
-Here are the names for the POSIX minimum upper bounds for some of the
-above parameters.  The significance of these values is that you can
-safely push to these limits without checking whether the particular
-system you are using can go that far.  In most cases GNU systems do not
-have these strict limitations.  The actual limit should be requested if
-necessary.
-
-`_POSIX_LINK_MAX'
-     The most restrictive limit permitted by POSIX for the maximum
-     value of a file's link count.  The value of this constant is `8';
-     thus, you can always make up to eight names for a file without
-     running into a system limit.
-
-`_POSIX_MAX_CANON'
-     The most restrictive limit permitted by POSIX for the maximum
-     number of bytes in a canonical input line from a terminal device.
-     The value of this constant is `255'.
-
-`_POSIX_MAX_INPUT'
-     The most restrictive limit permitted by POSIX for the maximum
-     number of bytes in a terminal device input queue (or typeahead
-     buffer).  *Note Input Modes::.  The value of this constant is
-     `255'.
-
-`_POSIX_NAME_MAX'
-     The most restrictive limit permitted by POSIX for the maximum
-     number of bytes in a file name component.  The value of this
-     constant is `14'.
-
-`_POSIX_PATH_MAX'
-     The most restrictive limit permitted by POSIX for the maximum
-     number of bytes in a file name.  The value of this constant is
-     `256'.
-
-`_POSIX_PIPE_BUF'
-     The most restrictive limit permitted by POSIX for the maximum
-     number of bytes that can be written atomically to a pipe.  The
-     value of this constant is `512'.
-
-`SYMLINK_MAX'
-     Maximum number of bytes in a symbolic link.
-
-`POSIX_REC_INCR_XFER_SIZE'
-     Recommended increment for file transfer sizes between the
-     `POSIX_REC_MIN_XFER_SIZE' and `POSIX_REC_MAX_XFER_SIZE' values.
-
-`POSIX_REC_MAX_XFER_SIZE'
-     Maximum recommended file transfer size.
-
-`POSIX_REC_MIN_XFER_SIZE'
-     Minimum recommended file transfer size.
-
-`POSIX_REC_XFER_ALIGN'
-     Recommended file transfer buffer alignment.
-
-
-File: libc.info,  Node: Pathconf,  Next: Utility Limits,  Prev: File Minimums,  Up: System Configuration
-
-31.9 Using `pathconf'
-=====================
-
-When your machine allows different files to have different values for a
-file system parameter, you can use the functions in this section to find
-out the value that applies to any particular file.
-
-   These functions and the associated constants for the PARAMETER
-argument are declared in the header file `unistd.h'.
-
- -- Function: long int pathconf (const char *FILENAME, int PARAMETER)
-     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock fd
-     mem | *Note POSIX Safety Concepts::.
-
-     This function is used to inquire about the limits that apply to
-     the file named FILENAME.
-
-     The PARAMETER argument should be one of the `_PC_' constants
-     listed below.
-
-     The normal return value from `pathconf' is the value you requested.
-     A value of `-1' is returned both if the implementation does not
-     impose a limit, and in case of an error.  In the former case,
-     `errno' is not set, while in the latter case, `errno' is set to
-     indicate the cause of the problem.  So the only way to use this
-     function robustly is to store `0' into `errno' just before calling
-     it.
-
-     Besides the usual file name errors (*note File Name Errors::), the
-     following error condition is defined for this function:
-
-    `EINVAL'
-          The value of PARAMETER is invalid, or the implementation
-          doesn't support the PARAMETER for the specific file.
-
- -- Function: long int fpathconf (int FILEDES, int PARAMETER)
-     Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock fd
-     mem | *Note POSIX Safety Concepts::.
-
-     This is just like `pathconf' except that an open file descriptor
-     is used to specify the file for which information is requested,
-     instead of a file name.
-
-     The following `errno' error conditions are defined for this
-     function:
-
-    `EBADF'
-          The FILEDES argument is not a valid file descriptor.
-
-    `EINVAL'
-          The value of PARAMETER is invalid, or the implementation
-          doesn't support the PARAMETER for the specific file.
-
-   Here are the symbolic constants that you can use as the PARAMETER
-argument to `pathconf' and `fpathconf'.  The values are all integer
-constants.
-
-`_PC_LINK_MAX'
-     Inquire about the value of `LINK_MAX'.
-
-`_PC_MAX_CANON'
-     Inquire about the value of `MAX_CANON'.
-
-`_PC_MAX_INPUT'
-     Inquire about the value of `MAX_INPUT'.
-
-`_PC_NAME_MAX'
-     Inquire about the value of `NAME_MAX'.
-
-`_PC_PATH_MAX'
-     Inquire about the value of `PATH_MAX'.
-
-`_PC_PIPE_BUF'
-     Inquire about the value of `PIPE_BUF'.
-
-`_PC_CHOWN_RESTRICTED'
-     Inquire about the value of `_POSIX_CHOWN_RESTRICTED'.
-
-`_PC_NO_TRUNC'
-     Inquire about the value of `_POSIX_NO_TRUNC'.
-
-`_PC_VDISABLE'
-     Inquire about the value of `_POSIX_VDISABLE'.
-
-`_PC_SYNC_IO'
-     Inquire about the value of `_POSIX_SYNC_IO'.
-
-`_PC_ASYNC_IO'
-     Inquire about the value of `_POSIX_ASYNC_IO'.
-
-`_PC_PRIO_IO'
-     Inquire about the value of `_POSIX_PRIO_IO'.
-
-`_PC_FILESIZEBITS'
-     Inquire about the availability of large files on the filesystem.
-
-`_PC_REC_INCR_XFER_SIZE'
-     Inquire about the value of `POSIX_REC_INCR_XFER_SIZE'.
-
-`_PC_REC_MAX_XFER_SIZE'
-     Inquire about the value of `POSIX_REC_MAX_XFER_SIZE'.
-
-`_PC_REC_MIN_XFER_SIZE'
-     Inquire about the value of `POSIX_REC_MIN_XFER_SIZE'.
-
-`_PC_REC_XFER_ALIGN'
-     Inquire about the value of `POSIX_REC_XFER_ALIGN'.
-
-   *Portability Note:* On some systems, the GNU C Library does not
-enforce `_PC_NAME_MAX' or `_PC_PATH_MAX' limits.
-
-
-File: libc.info,  Node: Utility Limits,  Next: Utility Minimums,  Prev: Pathconf,  Up: System Configuration
-
-31.10 Utility Program Capacity Limits
-=====================================
-
-The POSIX.2 standard specifies certain system limits that you can access
-through `sysconf' that apply to utility behavior rather than the
-behavior of the library or the operating system.
-
-   The GNU C Library defines macros for these limits, and `sysconf'
-returns values for them if you ask; but these values convey no
-meaningful information.  They are simply the smallest values that
-POSIX.2 permits.
-
- -- Macro: int BC_BASE_MAX
-     The largest value of `obase' that the `bc' utility is guaranteed
-     to support.
-
- -- Macro: int BC_DIM_MAX
-     The largest number of elements in one array that the `bc' utility
-     is guaranteed to support.
-
- -- Macro: int BC_SCALE_MAX
-     The largest value of `scale' that the `bc' utility is guaranteed
-     to support.
-
- -- Macro: int BC_STRING_MAX
-     The largest number of characters in one string constant that the
-     `bc' utility is guaranteed to support.
-
- -- Macro: int COLL_WEIGHTS_MAX
-     The largest number of weights that can necessarily be used in
-     defining the collating sequence for a locale.
-
- -- Macro: int EXPR_NEST_MAX
-     The maximum number of expressions that can be nested within
-     parenthesis by the `expr' utility.
-
- -- Macro: int LINE_MAX
-     The largest text line that the text-oriented POSIX.2 utilities can
-     support.  (If you are using the GNU versions of these utilities,
-     then there is no actual limit except that imposed by the available
-     virtual memory, but there is no way that the library can tell you
-     this.)
-
- -- Macro: int EQUIV_CLASS_MAX
-     The maximum number of weights that can be assigned to an entry of
-     the `LC_COLLATE' category `order' keyword in a locale definition.
-     The GNU C Library does not presently support locale definitions.
-
-
-File: libc.info,  Node: Utility Minimums,  Next: String Parameters,  Prev: Utility Limits,  Up: System Configuration
-
-31.11 Minimum Values for Utility Limits
-=======================================
-
-`_POSIX2_BC_BASE_MAX'
-     The most restrictive limit permitted by POSIX.2 for the maximum
-     value of `obase' in the `bc' utility.  Its value is `99'.
-
-`_POSIX2_BC_DIM_MAX'
-     The most restrictive limit permitted by POSIX.2 for the maximum
-     size of an array in the `bc' utility.  Its value is `2048'.
-
-`_POSIX2_BC_SCALE_MAX'
-     The most restrictive limit permitted by POSIX.2 for the maximum
-     value of `scale' in the `bc' utility.  Its value is `99'.
-
-`_POSIX2_BC_STRING_MAX'
-     The most restrictive limit permitted by POSIX.2 for the maximum
-     size of a string constant in the `bc' utility.  Its value is
-     `1000'.
-
-`_POSIX2_COLL_WEIGHTS_MAX'
-     The most restrictive limit permitted by POSIX.2 for the maximum
-     number of weights that can necessarily be used in defining the
-     collating sequence for a locale.  Its value is `2'.
-
-`_POSIX2_EXPR_NEST_MAX'
-     The most restrictive limit permitted by POSIX.2 for the maximum
-     number of expressions nested within parenthesis when using the
-     `expr' utility.  Its value is `32'.
-
-`_POSIX2_LINE_MAX'
-     The most restrictive limit permitted by POSIX.2 for the maximum
-     size of a text line that the text utilities can handle.  Its value
-     is `2048'.
-
-`_POSIX2_EQUIV_CLASS_MAX'
-     The most restrictive limit permitted by POSIX.2 for the maximum
-     number of weights that can be assigned to an entry of the
-     `LC_COLLATE' category `order' keyword in a locale definition.  Its
-     value is `2'.  The GNU C Library does not presently support locale
-     definitions.
-
-
-File: libc.info,  Node: String Parameters,  Prev: Utility Minimums,  Up: System Configuration
-
-31.12 String-Valued Parameters
-==============================
-
-POSIX.2 defines a way to get string-valued parameters from the operating
-system with the function `confstr':
-
- -- Function: size_t confstr (int PARAMETER, char *BUF, size_t LEN)
+ -- Macro: void CPU_ZERO (cpu_set_t *SET)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This function reads the value of a string-valued system parameter,
-     storing the string into LEN bytes of memory space starting at BUF.
-     The PARAMETER argument should be one of the `_CS_' symbols listed
-     below.
+     This macro initializes the CPU set SET to be the empty set.
 
-     The normal return value from `confstr' is the length of the string
-     value that you asked for.  If you supply a null pointer for BUF,
-     then `confstr' does not try to store the string; it just returns
-     its length.  A value of `0' indicates an error.
+     This macro is a GNU extension and is defined in 'sched.h'.
 
-     If the string you asked for is too long for the buffer (that is,
-     longer than `LEN - 1'), then `confstr' stores just that much
-     (leaving room for the terminating null character).  You can tell
-     that this has happened because `confstr' returns a value greater
-     than or equal to LEN.
+ -- Macro: void CPU_SET (int CPU, cpu_set_t *SET)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-     The following `errno' error conditions are defined for this
-     function:
+     This macro adds CPU to the CPU set SET.
 
-    `EINVAL'
-          The value of the PARAMETER is invalid.
+     The CPU parameter must not have side effects since it is evaluated
+     more than once.
 
-   Currently there is just one parameter you can read with `confstr':
+     This macro is a GNU extension and is defined in 'sched.h'.
 
-`_CS_PATH'
-     This parameter's value is the recommended default path for
-     searching for executable files.  This is the path that a user has
-     by default just after logging in.
+ -- Macro: void CPU_CLR (int CPU, cpu_set_t *SET)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-`_CS_LFS_CFLAGS'
-     The returned string specifies which additional flags must be given
-     to the C compiler if a source is compiled using the
-     `_LARGEFILE_SOURCE' feature select macro; *note Feature Test
-     Macros::.
+     This macro removes CPU from the CPU set SET.
 
-`_CS_LFS_LDFLAGS'
-     The returned string specifies which additional flags must be given
-     to the linker if a source is compiled using the
-     `_LARGEFILE_SOURCE' feature select macro; *note Feature Test
-     Macros::.
+     The CPU parameter must not have side effects since it is evaluated
+     more than once.
 
-`_CS_LFS_LIBS'
-     The returned string specifies which additional libraries must be
-     linked to the application if a source is compiled using the
-     `_LARGEFILE_SOURCE' feature select macro; *note Feature Test
-     Macros::.
+     This macro is a GNU extension and is defined in 'sched.h'.
 
-`_CS_LFS_LINTFLAGS'
-     The returned string specifies which additional flags must be given
-     to the lint tool if a source is compiled using the
-     `_LARGEFILE_SOURCE' feature select macro; *note Feature Test
-     Macros::.
+ -- Macro: int CPU_ISSET (int CPU, const cpu_set_t *SET)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-`_CS_LFS64_CFLAGS'
-     The returned string specifies which additional flags must be given
-     to the C compiler if a source is compiled using the
-     `_LARGEFILE64_SOURCE' feature select macro; *note Feature Test
-     Macros::.
+     This macro returns a nonzero value (true) if CPU is a member of the
+     CPU set SET, and zero (false) otherwise.
 
-`_CS_LFS64_LDFLAGS'
-     The returned string specifies which additional flags must be given
-     to the linker if a source is compiled using the
-     `_LARGEFILE64_SOURCE' feature select macro; *note Feature Test
-     Macros::.
+     The CPU parameter must not have side effects since it is evaluated
+     more than once.
 
-`_CS_LFS64_LIBS'
-     The returned string specifies which additional libraries must be
-     linked to the application if a source is compiled using the
-     `_LARGEFILE64_SOURCE' feature select macro; *note Feature Test
-     Macros::.
+     This macro is a GNU extension and is defined in 'sched.h'.
 
-`_CS_LFS64_LINTFLAGS'
-     The returned string specifies which additional flags must be given
-     to the lint tool if a source is compiled using the
-     `_LARGEFILE64_SOURCE' feature select macro; *note Feature Test
-     Macros::.
+   CPU bitsets can be constructed from scratch or the currently
+installed affinity mask can be retrieved from the system.
 
-   The way to use `confstr' without any arbitrary limit on string size
-is to call it twice: first call it to get the length, allocate the
-buffer accordingly, and then call `confstr' again to fill the buffer,
-like this:
+ -- Function: int sched_getaffinity (pid_t PID, size_t CPUSETSIZE,
+          cpu_set_t *CPUSET)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-     char *
-     get_default_path (void)
-     {
-       size_t len = confstr (_CS_PATH, NULL, 0);
-       char *buffer = (char *) xmalloc (len);
+     This functions stores the CPU affinity mask for the process or
+     thread with the ID PID in the CPUSETSIZE bytes long bitmap pointed
+     to by CPUSET.  If successful, the function always initializes all
+     bits in the 'cpu_set_t' object and returns zero.
 
-       if (confstr (_CS_PATH, buf, len + 1) == 0)
-         {
-           free (buffer);
-           return NULL;
-         }
+     If PID does not correspond to a process or thread on the system the
+     or the function fails for some other reason, it returns '-1' and
+     'errno' is set to represent the error condition.
 
-       return buffer;
-     }
+     'ESRCH'
+          No process or thread with the given ID found.
+
+     'EFAULT'
+          The pointer CPUSET is does not point to a valid object.
+
+     This function is a GNU extension and is declared in 'sched.h'.
+
+   Note that it is not portably possible to use this information to
+retrieve the information for different POSIX threads.  A separate
+interface must be provided for that.
+
+ -- Function: int sched_setaffinity (pid_t PID, size_t CPUSETSIZE, const
+          cpu_set_t *CPUSET)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function installs the CPUSETSIZE bytes long affinity mask
+     pointed to by CPUSET for the process or thread with the ID PID.  If
+     successful the function returns zero and the scheduler will in
+     future take the affinity information into account.
+
+     If the function fails it will return '-1' and 'errno' is set to the
+     error code:
+
+     'ESRCH'
+          No process or thread with the given ID found.
+
+     'EFAULT'
+          The pointer CPUSET is does not point to a valid object.
+
+     'EINVAL'
+          The bitset is not valid.  This might mean that the affinity
+          set might not leave a processor for the process or thread to
+          run on.
+
+     This function is a GNU extension and is declared in 'sched.h'.
 
 
-File: libc.info,  Node: Cryptographic Functions,  Next: Debugging Support,  Prev: System Configuration,  Up: Top
+File: libc.info,  Node: Memory Resources,  Next: Processor Resources,  Prev: Priority,  Up: Resource Usage And Limitation
 
-32 DES Encryption and Password Handling
-***************************************
+22.4 Querying memory available resources
+========================================
 
-On many systems, it is unnecessary to have any kind of user
-authentication; for instance, a workstation which is not connected to a
-network probably does not need any user authentication, because to use
-the machine an intruder must have physical access.
-
-   Sometimes, however, it is necessary to be sure that a user is
-authorized to use some service a machine provides--for instance, to log
-in as a particular user id (*note Users and Groups::).  One traditional
-way of doing this is for each user to choose a secret "password"; then,
-the system can ask someone claiming to be a user what the user's
-password is, and if the person gives the correct password then the
-system can grant the appropriate privileges.
-
-   If all the passwords are just stored in a file somewhere, then this
-file has to be very carefully protected.  To avoid this, passwords are
-run through a "one-way function", a function which makes it difficult to
-work out what its input was by looking at its output, before storing in
-the file.
-
-   The GNU C Library provides a one-way function that is compatible with
-the behavior of the `crypt' function introduced in FreeBSD 2.0.  It
-supports two one-way algorithms: one based on the MD5 message-digest
-algorithm that is compatible with modern BSD systems, and the other
-based on the Data Encryption Standard (DES) that is compatible with
-Unix systems.
-
-   It also provides support for Secure RPC, and some library functions
-that can be used to perform normal DES encryption.  The `AUTH_DES'
-authentication flavor in Secure RPC, as provided by the GNU C Library,
-uses DES and does not comply with FIPS 140-2 nor does any other use of
-DES within the GNU C Library.  It is recommended that Secure RPC should
-not be used for systems that need to comply with FIPS 140-2 since all
-flavors of encrypted authentication use normal DES.
+The amount of memory available in the system and the way it is organized
+determines oftentimes the way programs can and have to work.  For
+functions like 'mmap' it is necessary to know about the size of
+individual memory pages and knowing how much memory is available enables
+a program to select appropriate sizes for, say, caches.  Before we get
+into these details a few words about memory subsystems in traditional
+Unix systems will be given.
 
 * Menu:
 
-* Legal Problems::              This software can get you locked up, or worse.
-* getpass::                     Prompting the user for a password.
-* crypt::                       A one-way function for passwords.
-* DES Encryption::              Routines for DES encryption.
+* Memory Subsystem::           Overview about traditional Unix memory handling.
+* Query Memory Parameters::    How to get information about the memory
+                                subsystem?
 
 
-File: libc.info,  Node: Legal Problems,  Next: getpass,  Up: Cryptographic Functions
+File: libc.info,  Node: Memory Subsystem,  Next: Query Memory Parameters,  Up: Memory Resources
 
-32.1 Legal Problems
-===================
+22.4.1 Overview about traditional Unix memory handling
+------------------------------------------------------
 
-Because of the continuously changing state of the law, it's not possible
-to provide a definitive survey of the laws affecting cryptography.
-Instead, this section warns you of some of the known trouble spots; this
-may help you when you try to find out what the laws of your country are.
+Unix systems normally provide processes virtual address spaces.  This
+means that the addresses of the memory regions do not have to correspond
+directly to the addresses of the actual physical memory which stores the
+data.  An extra level of indirection is introduced which translates
+virtual addresses into physical addresses.  This is normally done by the
+hardware of the processor.
 
-   Some countries require that you have a licence to use, possess, or
-import cryptography.  These countries are believed to include
-Byelorussia, Burma, India, Indonesia, Israel, Kazakhstan, Pakistan,
-Russia, and Saudi Arabia.
+   Using a virtual address space has several advantage.  The most
+important is process isolation.  The different processes running on the
+system cannot interfere directly with each other.  No process can write
+into the address space of another process (except when shared memory is
+used but then it is wanted and controlled).
 
-   Some countries restrict the transmission of encrypted messages by
-radio; some telecommunications carriers restrict the transmission of
-encrypted messages over their network.
+   Another advantage of virtual memory is that the address space the
+processes see can actually be larger than the physical memory available.
+The physical memory can be extended by storage on an external media
+where the content of currently unused memory regions is stored.  The
+address translation can then intercept accesses to these memory regions
+and make memory content available again by loading the data back into
+memory.  This concept makes it necessary that programs which have to use
+lots of memory know the difference between available virtual address
+space and available physical memory.  If the working set of virtual
+memory of all the processes is larger than the available physical memory
+the system will slow down dramatically due to constant swapping of
+memory content from the memory to the storage media and back.  This is
+called "thrashing".
 
-   Many countries have some form of export control for encryption
-software.  The Wassenaar Arrangement is a multilateral agreement
-between 33 countries (Argentina, Australia, Austria, Belgium, Bulgaria,
-Canada, the Czech Republic, Denmark, Finland, France, Germany, Greece,
-Hungary, Ireland, Italy, Japan, Luxembourg, the Netherlands, New
-Zealand, Norway, Poland, Portugal, the Republic of Korea, Romania, the
-Russian Federation, the Slovak Republic, Spain, Sweden, Switzerland,
-Turkey, Ukraine, the United Kingdom and the United States) which
-restricts some kinds of encryption exports.  Different countries apply
-the arrangement in different ways; some do not allow the exception for
-certain kinds of "public domain" software (which would include this
-library), some only restrict the export of software in tangible form,
-and others impose significant additional restrictions.
-
-   The United States has additional rules.  This software would
-generally be exportable under 15 CFR 740.13(e), which permits exports of
-"encryption source code" which is "publicly available" and which is
-"not subject to an express agreement for the payment of a licensing fee
-or royalty for commercial production or sale of any product developed
-with the source code" to most countries.
-
-   The rules in this area are continuously changing.  If you know of any
-information in this manual that is out-of-date, please report it to the
-bug database.  *Note Reporting Bugs::.
+   A final aspect of virtual memory which is important and follows from
+what is said in the last paragraph is the granularity of the virtual
+address space handling.  When we said that the virtual address handling
+stores memory content externally it cannot do this on a byte-by-byte
+basis.  The administrative overhead does not allow this (leaving alone
+the processor hardware).  Instead several thousand bytes are handled
+together and form a "page".  The size of each page is always a power of
+two byte.  The smallest page size in use today is 4096, with 8192,
+16384, and 65536 being other popular sizes.
 
 
-File: libc.info,  Node: getpass,  Next: crypt,  Prev: Legal Problems,  Up: Cryptographic Functions
+File: libc.info,  Node: Query Memory Parameters,  Prev: Memory Subsystem,  Up: Memory Resources
 
-32.2 Reading Passwords
-======================
+22.4.2 How to get information about the memory subsystem?
+---------------------------------------------------------
 
-When reading in a password, it is desirable to avoid displaying it on
-the screen, to help keep it secret.  The following function handles this
-in a convenient way.
+The page size of the virtual memory the process sees is essential to
+know in several situations.  Some programming interface (e.g., 'mmap',
+*note Memory-mapped I/O::) require the user to provide information
+adjusted to the page size.  In the case of 'mmap' is it necessary to
+provide a length argument which is a multiple of the page size.  Another
+place where the knowledge about the page size is useful is in memory
+allocation.  If one allocates pieces of memory in larger chunks which
+are then subdivided by the application code it is useful to adjust the
+size of the larger blocks to the page size.  If the total memory
+requirement for the block is close (but not larger) to a multiple of the
+page size the kernel's memory handling can work more effectively since
+it only has to allocate memory pages which are fully used.  (To do this
+optimization it is necessary to know a bit about the memory allocator
+which will require a bit of memory itself for each block and this
+overhead must not push the total size over the page size multiple.
 
- -- Function: char * getpass (const char *PROMPT)
-     Preliminary: | MT-Unsafe term | AS-Unsafe heap lock corrupt |
-     AC-Unsafe term lock corrupt | *Note POSIX Safety Concepts::.
+   The page size traditionally was a compile time constant.  But recent
+development of processors changed this.  Processors now support
+different page sizes and they can possibly even vary among different
+processes on the same system.  Therefore the system should be queried at
+runtime about the current page size and no assumptions (except about it
+being a power of two) should be made.
 
-     `getpass' outputs PROMPT, then reads a string in from the terminal
-     without echoing it.  It tries to connect to the real terminal,
-     `/dev/tty', if possible, to encourage users not to put plaintext
-     passwords in files; otherwise, it uses `stdin' and `stderr'.
-     `getpass' also disables the INTR, QUIT, and SUSP characters on the
-     terminal using the `ISIG' terminal attribute (*note Local Modes::).
-     The terminal is flushed before and after `getpass', so that
-     characters of a mistyped password are not accidentally visible.
+   The correct interface to query about the page size is 'sysconf'
+(*note Sysconf Definition::) with the parameter '_SC_PAGESIZE'.  There
+is a much older interface available, too.
 
-     In other C libraries, `getpass' may only return the first
-     `PASS_MAX' bytes of a password.  The GNU C Library has no limit, so
-     `PASS_MAX' is undefined.
+ -- Function: int getpagesize (void)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-     The prototype for this function is in `unistd.h'.  `PASS_MAX'
-     would be defined in `limits.h'.
+     The 'getpagesize' function returns the page size of the process.
+     This value is fixed for the runtime of the process but can vary in
+     different runs of the application.
 
-   This precise set of operations may not suit all possible situations.
-In this case, it is recommended that users write their own `getpass'
-substitute.  For instance, a very simple substitute is as follows:
+     The function is declared in 'unistd.h'.
+
+   Widely available on System V derived systems is a method to get
+information about the physical memory the system has.  The call
+
+       sysconf (_SC_PHYS_PAGES)
+
+returns the total number of pages of physical the system has.  This does
+not mean all this memory is available.  This information can be found
+using
+
+       sysconf (_SC_AVPHYS_PAGES)
+
+   These two values help to optimize applications.  The value returned
+for '_SC_AVPHYS_PAGES' is the amount of memory the application can use
+without hindering any other process (given that no other process
+increases its memory usage).  The value returned for '_SC_PHYS_PAGES' is
+more or less a hard limit for the working set.  If all applications
+together constantly use more than that amount of memory the system is in
+trouble.
+
+   The GNU C Library provides in addition to these already described way
+to get this information two functions.  They are declared in the file
+'sys/sysinfo.h'.  Programmers should prefer to use the 'sysconf' method
+described above.
+
+ -- Function: long int get_phys_pages (void)
+     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe lock fd
+     mem | *Note POSIX Safety Concepts::.
+
+     The 'get_phys_pages' function returns the total number of pages of
+     physical the system has.  To get the amount of memory this number
+     has to be multiplied by the page size.
+
+     This function is a GNU extension.
+
+ -- Function: long int get_avphys_pages (void)
+     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe lock fd
+     mem | *Note POSIX Safety Concepts::.
+
+     The 'get_phys_pages' function returns the number of available pages
+     of physical the system has.  To get the amount of memory this
+     number has to be multiplied by the page size.
+
+     This function is a GNU extension.
+
+
+File: libc.info,  Node: Processor Resources,  Prev: Memory Resources,  Up: Resource Usage And Limitation
+
+22.5 Learn about the processors available
+=========================================
+
+The use of threads or processes with shared memory allows an application
+to take advantage of all the processing power a system can provide.  If
+the task can be parallelized the optimal way to write an application is
+to have at any time as many processes running as there are processors.
+To determine the number of processors available to the system one can
+run
+
+       sysconf (_SC_NPROCESSORS_CONF)
+
+which returns the number of processors the operating system configured.
+But it might be possible for the operating system to disable individual
+processors and so the call
+
+       sysconf (_SC_NPROCESSORS_ONLN)
+
+returns the number of processors which are currently online (i.e.,
+available).
+
+   For these two pieces of information the GNU C Library also provides
+functions to get the information directly.  The functions are declared
+in 'sys/sysinfo.h'.
+
+ -- Function: int get_nprocs_conf (void)
+     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe lock fd
+     mem | *Note POSIX Safety Concepts::.
+
+     The 'get_nprocs_conf' function returns the number of processors the
+     operating system configured.
+
+     This function is a GNU extension.
+
+ -- Function: int get_nprocs (void)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
+     Concepts::.
+
+     The 'get_nprocs' function returns the number of available
+     processors.
+
+     This function is a GNU extension.
+
+   Before starting more threads it should be checked whether the
+processors are not already overused.  Unix systems calculate something
+called the "load average".  This is a number indicating how many
+processes were running.  This number is average over different periods
+of times (normally 1, 5, and 15 minutes).
+
+ -- Function: int getloadavg (double LOADAVG[], int NELEM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
+     Concepts::.
+
+     This function gets the 1, 5 and 15 minute load averages of the
+     system.  The values are placed in LOADAVG.  'getloadavg' will place
+     at most NELEM elements into the array but never more than three
+     elements.  The return value is the number of elements written to
+     LOADAVG, or -1 on error.
+
+     This function is declared in 'stdlib.h'.
+
+
+File: libc.info,  Node: Non-Local Exits,  Next: Signal Handling,  Prev: Resource Usage And Limitation,  Up: Top
+
+23 Non-Local Exits
+******************
+
+Sometimes when your program detects an unusual situation inside a deeply
+nested set of function calls, you would like to be able to immediately
+return to an outer level of control.  This section describes how you can
+do such "non-local exits" using the 'setjmp' and 'longjmp' functions.
+
+* Menu:
+
+* Intro: Non-Local Intro.        When and how to use these facilities.
+* Details: Non-Local Details.    Functions for non-local exits.
+* Non-Local Exits and Signals::  Portability issues.
+* System V contexts::            Complete context control a la System V.
+
+
+File: libc.info,  Node: Non-Local Intro,  Next: Non-Local Details,  Up: Non-Local Exits
+
+23.1 Introduction to Non-Local Exits
+====================================
+
+As an example of a situation where a non-local exit can be useful,
+suppose you have an interactive program that has a "main loop" that
+prompts for and executes commands.  Suppose the "read" command reads
+input from a file, doing some lexical analysis and parsing of the input
+while processing it.  If a low-level input error is detected, it would
+be useful to be able to return immediately to the "main loop" instead of
+having to make each of the lexical analysis, parsing, and processing
+phases all have to explicitly deal with error situations initially
+detected by nested calls.
+
+   (On the other hand, if each of these phases has to do a substantial
+amount of cleanup when it exits--such as closing files, deallocating
+buffers or other data structures, and the like--then it can be more
+appropriate to do a normal return and have each phase do its own
+cleanup, because a non-local exit would bypass the intervening phases
+and their associated cleanup code entirely.  Alternatively, you could
+use a non-local exit but do the cleanup explicitly either before or
+after returning to the "main loop".)
+
+   In some ways, a non-local exit is similar to using the 'return'
+statement to return from a function.  But while 'return' abandons only a
+single function call, transferring control back to the point at which it
+was called, a non-local exit can potentially abandon many levels of
+nested function calls.
+
+   You identify return points for non-local exits by calling the
+function 'setjmp'.  This function saves information about the execution
+environment in which the call to 'setjmp' appears in an object of type
+'jmp_buf'.  Execution of the program continues normally after the call
+to 'setjmp', but if an exit is later made to this return point by
+calling 'longjmp' with the corresponding 'jmp_buf' object, control is
+transferred back to the point where 'setjmp' was called.  The return
+value from 'setjmp' is used to distinguish between an ordinary return
+and a return made by a call to 'longjmp', so calls to 'setjmp' usually
+appear in an 'if' statement.
+
+   Here is how the example program described above might be set up:
 
 
-     #include <termios.h>
+     #include <setjmp.h>
+     #include <stdlib.h>
      #include <stdio.h>
 
-     ssize_t
-     my_getpass (char **lineptr, size_t *n, FILE *stream)
+     jmp_buf main_loop;
+
+     void
+     abort_to_main_loop (int status)
      {
-       struct termios old, new;
-       int nread;
-
-       /* Turn echoing off and fail if we can't. */
-       if (tcgetattr (fileno (stream), &old) != 0)
-         return -1;
-       new = old;
-       new.c_lflag &= ~ECHO;
-       if (tcsetattr (fileno (stream), TCSAFLUSH, &new) != 0)
-         return -1;
-
-       /* Read the password. */
-       nread = getline (lineptr, n, stream);
-
-       /* Restore terminal. */
-       (void) tcsetattr (fileno (stream), TCSAFLUSH, &old);
-
-       return nread;
+       longjmp (main_loop, status);
      }
 
-   The substitute takes the same parameters as `getline' (*note Line
-Input::); the user must print any prompt desired.
+     int
+     main (void)
+     {
+       while (1)
+         if (setjmp (main_loop))
+           puts ("Back at main loop....");
+         else
+           do_command ();
+     }
+
+
+     void
+     do_command (void)
+     {
+       char buffer[128];
+       if (fgets (buffer, 128, stdin) == NULL)
+         abort_to_main_loop (-1);
+       else
+         exit (EXIT_SUCCESS);
+     }
+
+   The function 'abort_to_main_loop' causes an immediate transfer of
+control back to the main loop of the program, no matter where it is
+called from.
+
+   The flow of control inside the 'main' function may appear a little
+mysterious at first, but it is actually a common idiom with 'setjmp'.  A
+normal call to 'setjmp' returns zero, so the "else" clause of the
+conditional is executed.  If 'abort_to_main_loop' is called somewhere
+within the execution of 'do_command', then it actually appears as if the
+_same_ call to 'setjmp' in 'main' were returning a second time with a
+value of '-1'.
+
+   So, the general pattern for using 'setjmp' looks something like:
+
+     if (setjmp (BUFFER))
+       /* Code to clean up after premature return. */
+       ...
+     else
+       /* Code to be executed normally after setting up the return point. */
+       ...
 
 
-File: libc.info,  Node: crypt,  Next: DES Encryption,  Prev: getpass,  Up: Cryptographic Functions
+File: libc.info,  Node: Non-Local Details,  Next: Non-Local Exits and Signals,  Prev: Non-Local Intro,  Up: Non-Local Exits
 
-32.3 Encrypting Passwords
-=========================
+23.2 Details of Non-Local Exits
+===============================
 
- -- Function: char * crypt (const char *KEY, const char *SALT)
-     Preliminary: | MT-Unsafe race:crypt | AS-Unsafe corrupt lock heap
-     dlopen | AC-Unsafe lock mem | *Note POSIX Safety Concepts::.
+Here are the details on the functions and data structures used for
+performing non-local exits.  These facilities are declared in
+'setjmp.h'.
 
-     The `crypt' function takes a password, KEY, as a string, and a
-     SALT character array which is described below, and returns a
-     printable ASCII string which starts with another salt.  It is
-     believed that, given the output of the function, the best way to
-     find a KEY that will produce that output is to guess values of KEY
-     until the original value of KEY is found.
+ -- Data Type: jmp_buf
+     Objects of type 'jmp_buf' hold the state information to be restored
+     by a non-local exit.  The contents of a 'jmp_buf' identify a
+     specific place to return to.
 
-     The SALT parameter does two things.  Firstly, it selects which
-     algorithm is used, the MD5-based one or the DES-based one.
-     Secondly, it makes life harder for someone trying to guess
-     passwords against a file containing many passwords; without a
-     SALT, an intruder can make a guess, run `crypt' on it once, and
-     compare the result with all the passwords.  With a SALT, the
-     intruder must run `crypt' once for each different salt.
+ -- Macro: int setjmp (jmp_buf STATE)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
 
-     For the MD5-based algorithm, the SALT should consist of the string
-     `$1$', followed by up to 8 characters, terminated by either
-     another `$' or the end of the string.  The result of `crypt' will
-     be the SALT, followed by a `$' if the salt didn't end with one,
-     followed by 22 characters from the alphabet `./0-9A-Za-z', up to
-     34 characters total.  Every character in the KEY is significant.
+     When called normally, 'setjmp' stores information about the
+     execution state of the program in STATE and returns zero.  If
+     'longjmp' is later used to perform a non-local exit to this STATE,
+     'setjmp' returns a nonzero value.
 
-     For the DES-based algorithm, the SALT should consist of two
-     characters from the alphabet `./0-9A-Za-z', and the result of
-     `crypt' will be those two characters followed by 11 more from the
-     same alphabet, 13 in total.  Only the first 8 characters in the
-     KEY are significant.
+ -- Function: void longjmp (jmp_buf STATE, int VALUE)
+     Preliminary: | MT-Safe | AS-Unsafe plugin corrupt lock/hurd |
+     AC-Unsafe corrupt lock/hurd | *Note POSIX Safety Concepts::.
 
-     The MD5-based algorithm has no limit on the useful length of the
-     password used, and is slightly more secure.  It is therefore
-     preferred over the DES-based algorithm.
+     This function restores current execution to the state saved in
+     STATE, and continues execution from the call to 'setjmp' that
+     established that return point.  Returning from 'setjmp' by means of
+     'longjmp' returns the VALUE argument that was passed to 'longjmp',
+     rather than '0'.  (But if VALUE is given as '0', 'setjmp' returns
+     '1').
 
-     When the user enters their password for the first time, the SALT
-     should be set to a new string which is reasonably random.  To
-     verify a password against the result of a previous call to
-     `crypt', pass the result of the previous call as the SALT.
+   There are a lot of obscure but important restrictions on the use of
+'setjmp' and 'longjmp'.  Most of these restrictions are present because
+non-local exits require a fair amount of magic on the part of the C
+compiler and can interact with other parts of the language in strange
+ways.
 
-   The following short program is an example of how to use `crypt' the
-first time a password is entered.  Note that the SALT generation is
-just barely acceptable; in particular, it is not unique between
-machines, and in many applications it would not be acceptable to let an
-attacker know what time the user's password was last set.
+   The 'setjmp' function is actually a macro without an actual function
+definition, so you shouldn't try to '#undef' it or take its address.  In
+addition, calls to 'setjmp' are safe in only the following contexts:
 
+   * As the test expression of a selection or iteration statement (such
+     as 'if', 'switch', or 'while').
 
-     #include <stdio.h>
-     #include <time.h>
-     #include <unistd.h>
-     #include <crypt.h>
+   * As one operand of an equality or comparison operator that appears
+     as the test expression of a selection or iteration statement.  The
+     other operand must be an integer constant expression.
+
+   * As the operand of a unary '!' operator, that appears as the test
+     expression of a selection or iteration statement.
+
+   * By itself as an expression statement.
+
+   Return points are valid only during the dynamic extent of the
+function that called 'setjmp' to establish them.  If you 'longjmp' to a
+return point that was established in a function that has already
+returned, unpredictable and disastrous things are likely to happen.
+
+   You should use a nonzero VALUE argument to 'longjmp'.  While
+'longjmp' refuses to pass back a zero argument as the return value from
+'setjmp', this is intended as a safety net against accidental misuse and
+is not really good programming style.
+
+   When you perform a non-local exit, accessible objects generally
+retain whatever values they had at the time 'longjmp' was called.  The
+exception is that the values of automatic variables local to the
+function containing the 'setjmp' call that have been changed since the
+call to 'setjmp' are indeterminate, unless you have declared them
+'volatile'.
+
+
+File: libc.info,  Node: Non-Local Exits and Signals,  Next: System V contexts,  Prev: Non-Local Details,  Up: Non-Local Exits
+
+23.3 Non-Local Exits and Signals
+================================
+
+In BSD Unix systems, 'setjmp' and 'longjmp' also save and restore the
+set of blocked signals; see *note Blocking Signals::.  However, the
+POSIX.1 standard requires 'setjmp' and 'longjmp' not to change the set
+of blocked signals, and provides an additional pair of functions
+('sigsetjmp' and 'siglongjmp') to get the BSD behavior.
+
+   The behavior of 'setjmp' and 'longjmp' in the GNU C Library is
+controlled by feature test macros; see *note Feature Test Macros::.  The
+default in the GNU C Library is the POSIX.1 behavior rather than the BSD
+behavior.
+
+   The facilities in this section are declared in the header file
+'setjmp.h'.
+
+ -- Data Type: sigjmp_buf
+     This is similar to 'jmp_buf', except that it can also store state
+     information about the set of blocked signals.
+
+ -- Function: int sigsetjmp (sigjmp_buf STATE, int SAVESIGS)
+     Preliminary: | MT-Safe | AS-Unsafe lock/hurd | AC-Unsafe lock/hurd
+     | *Note POSIX Safety Concepts::.
+
+     This is similar to 'setjmp'.  If SAVESIGS is nonzero, the set of
+     blocked signals is saved in STATE and will be restored if a
+     'siglongjmp' is later performed with this STATE.
+
+ -- Function: void siglongjmp (sigjmp_buf STATE, int VALUE)
+     Preliminary: | MT-Safe | AS-Unsafe plugin corrupt lock/hurd |
+     AC-Unsafe corrupt lock/hurd | *Note POSIX Safety Concepts::.
+
+     This is similar to 'longjmp' except for the type of its STATE
+     argument.  If the 'sigsetjmp' call that set this STATE used a
+     nonzero SAVESIGS flag, 'siglongjmp' also restores the set of
+     blocked signals.
+
+
+File: libc.info,  Node: System V contexts,  Prev: Non-Local Exits and Signals,  Up: Non-Local Exits
+
+23.4 Complete Context Control
+=============================
+
+The Unix standard provides one more set of functions to control the
+execution path and these functions are more powerful than those
+discussed in this chapter so far.  These function were part of the
+original System V API and by this route were added to the Unix API.
+Beside on branded Unix implementations these interfaces are not widely
+available.  Not all platforms and/or architectures the GNU C Library is
+available on provide this interface.  Use 'configure' to detect the
+availability.
+
+   Similar to the 'jmp_buf' and 'sigjmp_buf' types used for the
+variables to contain the state of the 'longjmp' functions the interfaces
+of interest here have an appropriate type as well.  Objects of this type
+are normally much larger since more information is contained.  The type
+is also used in a few more places as we will see.  The types and
+functions described in this section are all defined and declared
+respectively in the 'ucontext.h' header file.
+
+ -- Data Type: ucontext_t
+
+     The 'ucontext_t' type is defined as a structure with as least the
+     following elements:
+
+     'ucontext_t *uc_link'
+          This is a pointer to the next context structure which is used
+          if the context described in the current structure returns.
+
+     'sigset_t uc_sigmask'
+          Set of signals which are blocked when this context is used.
+
+     'stack_t uc_stack'
+          Stack used for this context.  The value need not be (and
+          normally is not) the stack pointer.  *Note Signal Stack::.
+
+     'mcontext_t uc_mcontext'
+          This element contains the actual state of the process.  The
+          'mcontext_t' type is also defined in this header but the
+          definition should be treated as opaque.  Any use of knowledge
+          of the type makes applications less portable.
+
+   Objects of this type have to be created by the user.  The
+initialization and modification happens through one of the following
+functions:
+
+ -- Function: int getcontext (ucontext_t *UCP)
+     Preliminary: | MT-Safe race:ucp | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'getcontext' function initializes the variable pointed to by
+     UCP with the context of the calling thread.  The context contains
+     the content of the registers, the signal mask, and the current
+     stack.  Executing the contents would start at the point where the
+     'getcontext' call just returned.
+
+     The function returns '0' if successful.  Otherwise it returns '-1'
+     and sets ERRNO accordingly.
+
+   The 'getcontext' function is similar to 'setjmp' but it does not
+provide an indication of whether the function returns for the first time
+or whether the initialized context was used and the execution is resumed
+at just that point.  If this is necessary the user has to take determine
+this herself.  This must be done carefully since the context contains
+registers which might contain register variables.  This is a good
+situation to define variables with 'volatile'.
+
+   Once the context variable is initialized it can be used as is or it
+can be modified.  The latter is normally done to implement co-routines
+or similar constructs.  The 'makecontext' function is what has to be
+used to do that.
+
+ -- Function: void makecontext (ucontext_t *UCP, void (*FUNC) (void),
+          int ARGC, ...)
+     Preliminary: | MT-Safe race:ucp | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The UCP parameter passed to the 'makecontext' shall be initialized
+     by a call to 'getcontext'.  The context will be modified to in a
+     way so that if the context is resumed it will start by calling the
+     function 'func' which gets ARGC integer arguments passed.  The
+     integer arguments which are to be passed should follow the ARGC
+     parameter in the call to 'makecontext'.
+
+     Before the call to this function the 'uc_stack' and 'uc_link'
+     element of the UCP structure should be initialized.  The 'uc_stack'
+     element describes the stack which is used for this context.  No two
+     contexts which are used at the same time should use the same memory
+     region for a stack.
+
+     The 'uc_link' element of the object pointed to by UCP should be a
+     pointer to the context to be executed when the function FUNC
+     returns or it should be a null pointer.  See 'setcontext' for more
+     information about the exact use.
+
+   While allocating the memory for the stack one has to be careful.
+Most modern processors keep track of whether a certain memory region is
+allowed to contain code which is executed or not.  Data segments and
+heap memory is normally not tagged to allow this.  The result is that
+programs would fail.  Examples for such code include the calling
+sequences the GNU C compiler generates for calls to nested functions.
+Safe ways to allocate stacks correctly include using memory on the
+original threads stack or explicitly allocate memory tagged for
+execution using (*note Memory-mapped I/O::).
+
+   *Compatibility note*: The current Unix standard is very imprecise
+about the way the stack is allocated.  All implementations seem to agree
+that the 'uc_stack' element must be used but the values stored in the
+elements of the 'stack_t' value are unclear.  The GNU C Library and most
+other Unix implementations require the 'ss_sp' value of the 'uc_stack'
+element to point to the base of the memory region allocated for the
+stack and the size of the memory region is stored in 'ss_size'.  There
+are implements out there which require 'ss_sp' to be set to the value
+the stack pointer will have (which can depending on the direction the
+stack grows be different).  This difference makes the 'makecontext'
+function hard to use and it requires detection of the platform at
+compile time.
+
+ -- Function: int setcontext (const ucontext_t *UCP)
+     Preliminary: | MT-Safe race:ucp | AS-Unsafe corrupt | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     The 'setcontext' function restores the context described by UCP.
+     The context is not modified and can be reused as often as wanted.
+
+     If the context was created by 'getcontext' execution resumes with
+     the registers filled with the same values and the same stack as if
+     the 'getcontext' call just returned.
+
+     If the context was modified with a call to 'makecontext' execution
+     continues with the function passed to 'makecontext' which gets the
+     specified parameters passed.  If this function returns execution is
+     resumed in the context which was referenced by the 'uc_link'
+     element of the context structure passed to 'makecontext' at the
+     time of the call.  If 'uc_link' was a null pointer the application
+     terminates normally with an exit status value of 'EXIT_SUCCESS'
+     (*note Program Termination::).
+
+     Since the context contains information about the stack no two
+     threads should use the same context at the same time.  The result
+     in most cases would be disastrous.
+
+     The 'setcontext' function does not return unless an error occurred
+     in which case it returns '-1'.
+
+   The 'setcontext' function simply replaces the current context with
+the one described by the UCP parameter.  This is often useful but there
+are situations where the current context has to be preserved.
+
+ -- Function: int swapcontext (ucontext_t *restrict OUCP, const
+          ucontext_t *restrict UCP)
+     Preliminary: | MT-Safe race:oucp race:ucp | AS-Unsafe corrupt |
+     AC-Unsafe corrupt | *Note POSIX Safety Concepts::.
+
+     The 'swapcontext' function is similar to 'setcontext' but instead
+     of just replacing the current context the latter is first saved in
+     the object pointed to by OUCP as if this was a call to
+     'getcontext'.  The saved context would resume after the call to
+     'swapcontext'.
+
+     Once the current context is saved the context described in UCP is
+     installed and execution continues as described in this context.
+
+     If 'swapcontext' succeeds the function does not return unless the
+     context OUCP is used without prior modification by 'makecontext'.
+     The return value in this case is '0'.  If the function fails it
+     returns '-1' and set ERRNO accordingly.
+
+Example for SVID Context Handling
+=================================
+
+The easiest way to use the context handling functions is as a
+replacement for 'setjmp' and 'longjmp'.  The context contains on most
+platforms more information which might lead to less surprises but this
+also means using these functions is more expensive (beside being less
+portable).
 
      int
-     main(void)
+     random_search (int n, int (*fp) (int, ucontext_t *))
      {
-       unsigned long seed[2];
-       char salt[] = "$1$........";
-       const char *const seedchars =
-         "./0123456789ABCDEFGHIJKLMNOPQRST"
-         "UVWXYZabcdefghijklmnopqrstuvwxyz";
-       char *password;
-       int i;
+       volatile int cnt = 0;
+       ucontext_t uc;
 
-       /* Generate a (not very) random seed.
-          You should do it better than this... */
-       seed[0] = time(NULL);
-       seed[1] = getpid() ^ (seed[0] >> 14 & 0x30000);
+       /* Safe current context.  */
+       if (getcontext (&uc) < 0)
+         return -1;
 
-       /* Turn it into printable characters from `seedchars'. */
-       for (i = 0; i < 8; i++)
-         salt[3+i] = seedchars[(seed[i/5] >> (i%5)*6) & 0x3f];
+       /* If we have not tried N times try again.  */
+       if (cnt++ < n)
+         /* Call the function with a new random number
+            and the context.  */
+         if (fp (rand (), &uc) != 0)
+           /* We found what we were looking for.  */
+           return 1;
 
-       /* Read in the user's password and encrypt it. */
-       password = crypt(getpass("Password:"), salt);
-
-       /* Print the results. */
-       puts(password);
+       /* Not found.  */
        return 0;
      }
 
-   The next program shows how to verify a password.  It prompts the user
-for a password and prints "Access granted." if the user types `GNU libc
-manual'.
+   Using contexts in such a way enables emulating exception handling.
+The search functions passed in the FP parameter could be very large,
+nested, and complex which would make it complicated (or at least would
+require a lot of code) to leave the function with an error value which
+has to be passed down to the caller.  By using the context it is
+possible to leave the search function in one step and allow restarting
+the search which also has the nice side effect that it can be
+significantly faster.
+
+   Something which is harder to implement with 'setjmp' and 'longjmp' is
+to switch temporarily to a different execution path and then resume
+where execution was stopped.
 
 
+     #include <signal.h>
      #include <stdio.h>
-     #include <string.h>
-     #include <unistd.h>
-     #include <crypt.h>
+     #include <stdlib.h>
+     #include <ucontext.h>
+     #include <sys/time.h>
 
-     int
-     main(void)
+     /* Set by the signal handler. */
+     static volatile int expired;
+
+     /* The contexts. */
+     static ucontext_t uc[3];
+
+     /* We do only a certain number of switches. */
+     static int switches;
+
+
+     /* This is the function doing the work.  It is just a
+        skeleton, real code has to be filled in. */
+     static void
+     f (int n)
      {
-       /* Hashed form of "GNU libc manual". */
-       const char *const pass = "$1$/iSaq7rB$EoUw5jJPPvAPECNaaWzMK/";
+       int m = 0;
+       while (1)
+         {
+           /* This is where the work would be done. */
+           if (++m % 100 == 0)
+             {
+               putchar ('.');
+               fflush (stdout);
+             }
 
-       char *result;
-       int ok;
+           /* Regularly the EXPIRE variable must be checked. */
+           if (expired)
+             {
+               /* We do not want the program to run forever. */
+               if (++switches == 20)
+                 return;
 
-       /* Read in the user's password and encrypt it,
-          passing the expected password in as the salt. */
-       result = crypt(getpass("Password:"), pass);
-
-       /* Test the result. */
-       ok = strcmp (result, pass) == 0;
-
-       puts(ok ? "Access granted." : "Access denied.");
-       return ok ? 0 : 1;
+               printf ("\nswitching from %d to %d\n", n, 3 - n);
+               expired = 0;
+               /* Switch to the other context, saving the current one. */
+               swapcontext (&uc[n], &uc[3 - n]);
+             }
+         }
      }
 
- -- Function: char * crypt_r (const char *KEY, const char *SALT, struct
-          crypt_data * DATA)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt lock heap dlopen |
-     AC-Unsafe lock mem | *Note POSIX Safety Concepts::.
+     /* This is the signal handler which simply set the variable. */
+     void
+     handler (int signal)
+     {
+       expired = 1;
+     }
 
-     The `crypt_r' function does the same thing as `crypt', but takes
-     an extra parameter which includes space for its result (among
-     other things), so it can be reentrant.  `data->initialized' must be
-     cleared to zero before the first time `crypt_r' is called.
 
-     The `crypt_r' function is a GNU extension.
+     int
+     main (void)
+     {
+       struct sigaction sa;
+       struct itimerval it;
+       char st1[8192];
+       char st2[8192];
 
-   The `crypt' and `crypt_r' functions are prototyped in the header
-`crypt.h'.
+       /* Initialize the data structures for the interval timer. */
+       sa.sa_flags = SA_RESTART;
+       sigfillset (&sa.sa_mask);
+       sa.sa_handler = handler;
+       it.it_interval.tv_sec = 0;
+       it.it_interval.tv_usec = 1;
+       it.it_value = it.it_interval;
+
+       /* Install the timer and get the context we can manipulate. */
+       if (sigaction (SIGPROF, &sa, NULL) < 0
+           || setitimer (ITIMER_PROF, &it, NULL) < 0
+           || getcontext (&uc[1]) == -1
+           || getcontext (&uc[2]) == -1)
+         abort ();
+
+       /* Create a context with a separate stack which causes the
+          function 'f' to be call with the parameter '1'.
+          Note that the 'uc_link' points to the main context
+          which will cause the program to terminate once the function
+          return. */
+       uc[1].uc_link = &uc[0];
+       uc[1].uc_stack.ss_sp = st1;
+       uc[1].uc_stack.ss_size = sizeof st1;
+       makecontext (&uc[1], (void (*) (void)) f, 1, 1);
+
+       /* Similarly, but '2' is passed as the parameter to 'f'. */
+       uc[2].uc_link = &uc[0];
+       uc[2].uc_stack.ss_sp = st2;
+       uc[2].uc_stack.ss_size = sizeof st2;
+       makecontext (&uc[2], (void (*) (void)) f, 1, 2);
+
+       /* Start running. */
+       swapcontext (&uc[0], &uc[1]);
+       putchar ('\n');
+
+       return 0;
+     }
+
+   This an example how the context functions can be used to implement
+co-routines or cooperative multi-threading.  All that has to be done is
+to call every once in a while 'swapcontext' to continue running a
+different context.  It is not allowed to do the context switching from
+the signal handler directly since neither 'setcontext' nor 'swapcontext'
+are functions which can be called from a signal handler.  But setting a
+variable in the signal handler and checking it in the body of the
+functions which are executed.  Since 'swapcontext' is saving the current
+context it is possible to have multiple different scheduling points in
+the code.  Execution will always resume where it was left.
 
 
-File: libc.info,  Node: DES Encryption,  Prev: crypt,  Up: Cryptographic Functions
+File: libc.info,  Node: Signal Handling,  Next: Program Basics,  Prev: Non-Local Exits,  Up: Top
 
-32.4 DES Encryption
-===================
+24 Signal Handling
+******************
 
-The Data Encryption Standard is described in the US Government Federal
-Information Processing Standards (FIPS) 46-3 published by the National
-Institute of Standards and Technology.  The DES has been very thoroughly
-analyzed since it was developed in the late 1970s, and no new
-significant flaws have been found.
+A "signal" is a software interrupt delivered to a process.  The
+operating system uses signals to report exceptional situations to an
+executing program.  Some signals report errors such as references to
+invalid memory addresses; others report asynchronous events, such as
+disconnection of a phone line.
 
-   However, the DES uses only a 56-bit key (plus 8 parity bits), and a
-machine has been built in 1998 which can search through all possible
-keys in about 6 days, which cost about US$200000; faster searches would
-be possible with more money.  This makes simple DES insecure for most
-purposes, and NIST no longer permits new US government systems to use
-simple DES.
+   The GNU C Library defines a variety of signal types, each for a
+particular kind of event.  Some kinds of events make it inadvisable or
+impossible for the program to proceed as usual, and the corresponding
+signals normally abort the program.  Other kinds of signals that report
+harmless events are ignored by default.
 
-   For serious encryption functionality, it is recommended that one of
-the many free encryption libraries be used instead of these routines.
+   If you anticipate an event that causes signals, you can define a
+handler function and tell the operating system to run it when that
+particular type of signal arrives.
 
-   The DES is a reversible operation which takes a 64-bit block and a
-64-bit key, and produces another 64-bit block.  Usually the bits are
-numbered so that the most-significant bit, the first bit, of each block
-is numbered 1.
-
-   Under that numbering, every 8th bit of the key (the 8th, 16th, and so
-on) is not used by the encryption algorithm itself.  But the key must
-have odd parity; that is, out of bits 1 through 8, and 9 through 16, and
-so on, there must be an odd number of `1' bits, and this completely
-specifies the unused bits.
-
- -- Function: void setkey (const char *KEY)
-     Preliminary: | MT-Unsafe race:crypt | AS-Unsafe corrupt lock |
-     AC-Unsafe lock | *Note POSIX Safety Concepts::.
-
-     The `setkey' function sets an internal data structure to be an
-     expanded form of KEY.  KEY is specified as an array of 64 bits
-     each stored in a `char', the first bit is `key[0]' and the 64th
-     bit is `key[63]'.  The KEY should have the correct parity.
-
- -- Function: void encrypt (char *BLOCK, int EDFLAG)
-     Preliminary: | MT-Unsafe race:crypt | AS-Unsafe corrupt lock |
-     AC-Unsafe lock | *Note POSIX Safety Concepts::.
-
-     The `encrypt' function encrypts BLOCK if EDFLAG is 0, otherwise it
-     decrypts BLOCK, using a key previously set by `setkey'.  The
-     result is placed in BLOCK.
-
-     Like `setkey', BLOCK is specified as an array of 64 bits each
-     stored in a `char', but there are no parity bits in BLOCK.
-
- -- Function: void setkey_r (const char *KEY, struct crypt_data * DATA)
- -- Function: void encrypt_r (char *BLOCK, int EDFLAG, struct
-          crypt_data * DATA)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt lock | AC-Unsafe lock |
-     *Note POSIX Safety Concepts::.
-
-     These are reentrant versions of `setkey' and `encrypt'.  The only
-     difference is the extra parameter, which stores the expanded
-     version of KEY.  Before calling `setkey_r' the first time,
-     `data->initialized' must be cleared to zero.
-
-   The `setkey_r' and `encrypt_r' functions are GNU extensions.
-`setkey', `encrypt', `setkey_r', and `encrypt_r' are defined in
-`crypt.h'.
-
- -- Function: int ecb_crypt (char *KEY, char *BLOCKS, unsigned LEN,
-          unsigned MODE)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The function `ecb_crypt' encrypts or decrypts one or more blocks
-     using DES.  Each block is encrypted independently.
-
-     The BLOCKS and the KEY are stored packed in 8-bit bytes, so that
-     the first bit of the key is the most-significant bit of `key[0]'
-     and the 63rd bit of the key is stored as the least-significant bit
-     of `key[7]'.  The KEY should have the correct parity.
-
-     LEN is the number of bytes in BLOCKS.  It should be a multiple of
-     8 (so that there is a whole number of blocks to encrypt).  LEN is
-     limited to a maximum of `DES_MAXDATA' bytes.
-
-     The result of the encryption replaces the input in BLOCKS.
-
-     The MODE parameter is the bitwise OR of two of the following:
-
-    `DES_ENCRYPT'
-          This constant, used in the MODE parameter, specifies that
-          BLOCKS is to be encrypted.
-
-    `DES_DECRYPT'
-          This constant, used in the MODE parameter, specifies that
-          BLOCKS is to be decrypted.
-
-    `DES_HW'
-          This constant, used in the MODE parameter, asks to use a
-          hardware device.  If no hardware device is available,
-          encryption happens anyway, but in software.
-
-    `DES_SW'
-          This constant, used in the MODE parameter, specifies that no
-          hardware device is to be used.
-
-     The result of the function will be one of these values:
-
-    `DESERR_NONE'
-          The encryption succeeded.
-
-    `DESERR_NOHWDEVICE'
-          The encryption succeeded, but there was no hardware device
-          available.
-
-    `DESERR_HWERROR'
-          The encryption failed because of a hardware problem.
-
-    `DESERR_BADPARAM'
-          The encryption failed because of a bad parameter, for
-          instance LEN is not a multiple of 8 or LEN is larger than
-          `DES_MAXDATA'.
-
- -- Function: int DES_FAILED (int ERR)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro returns 1 if ERR is a `success' result code from
-     `ecb_crypt' or `cbc_crypt', and 0 otherwise.
-
- -- Function: int cbc_crypt (char *KEY, char *BLOCKS, unsigned LEN,
-          unsigned MODE, char *IVEC)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The function `cbc_crypt' encrypts or decrypts one or more blocks
-     using DES in Cipher Block Chaining mode.
-
-     For encryption in CBC mode, each block is exclusive-ored with IVEC
-     before being encrypted, then IVEC is replaced with the result of
-     the encryption, then the next block is processed.  Decryption is
-     the reverse of this process.
-
-     This has the advantage that blocks which are the same before being
-     encrypted are very unlikely to be the same after being encrypted,
-     making it much harder to detect patterns in the data.
-
-     Usually, IVEC is set to 8 random bytes before encryption starts.
-     Then the 8 random bytes are transmitted along with the encrypted
-     data (without themselves being encrypted), and passed back in as
-     IVEC for decryption.  Another possibility is to set IVEC to 8
-     zeroes initially, and have the first the block encrypted consist
-     of 8 random bytes.
-
-     Otherwise, all the parameters are similar to those for `ecb_crypt'.
-
- -- Function: void des_setparity (char *KEY)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The function `des_setparity' changes the 64-bit KEY, stored packed
-     in 8-bit bytes, to have odd parity by altering the low bits of
-     each byte.
-
-   The `ecb_crypt', `cbc_crypt', and `des_setparity' functions and
-their accompanying macros are all defined in the header
-`rpc/des_crypt.h'.
-
-
-File: libc.info,  Node: Debugging Support,  Next: POSIX Threads,  Prev: Cryptographic Functions,  Up: Top
-
-33 Debugging support
-********************
-
-Applications are usually debugged using dedicated debugger programs.
-But sometimes this is not possible and, in any case, it is useful to
-provide the developer with as much information as possible at the time
-the problems are experienced.  For this reason a few functions are
-provided which a program can use to help the developer more easily
-locate the problem.
+   Finally, one process can send a signal to another process; this
+allows a parent process to abort a child, or two related processes to
+communicate and synchronize.
 
 * Menu:
 
-* Backtraces::                Obtaining and printing a back trace of the
-                               current stack.
+* Concepts of Signals::         Introduction to the signal facilities.
+* Standard Signals::            Particular kinds of signals with
+                                 standard names and meanings.
+* Signal Actions::              Specifying what happens when a
+                                 particular signal is delivered.
+* Defining Handlers::           How to write a signal handler function.
+* Interrupted Primitives::	Signal handlers affect use of 'open',
+				 'read', 'write' and other functions.
+* Generating Signals::          How to send a signal to a process.
+* Blocking Signals::            Making the system hold signals temporarily.
+* Waiting for a Signal::        Suspending your program until a signal
+                                 arrives.
+* Signal Stack::                Using a Separate Signal Stack.
+* BSD Signal Handling::         Additional functions for backward
+			         compatibility with BSD.
 
 
-File: libc.info,  Node: Backtraces,  Up: Debugging Support
+File: libc.info,  Node: Concepts of Signals,  Next: Standard Signals,  Up: Signal Handling
 
-33.1 Backtraces
-===============
+24.1 Basic Concepts of Signals
+==============================
 
-A "backtrace" is a list of the function calls that are currently active
-in a thread.  The usual way to inspect a backtrace of a program is to
-use an external debugger such as gdb.  However, sometimes it is useful
-to obtain a backtrace programmatically from within a program, e.g., for
-the purposes of logging or diagnostics.
+This section explains basic concepts of how signals are generated, what
+happens after a signal is delivered, and how programs can handle
+signals.
 
-   The header file `execinfo.h' declares three functions that obtain
-and manipulate backtraces of the current thread.  
+* Menu:
 
- -- Function: int backtrace (void **BUFFER, int SIZE)
-     Preliminary: | MT-Safe | AS-Unsafe init heap dlopen plugin lock |
-     AC-Unsafe init mem lock fd | *Note POSIX Safety Concepts::.
+* Kinds of Signals::            Some examples of what can cause a signal.
+* Signal Generation::           Concepts of why and how signals occur.
+* Delivery of Signal::          Concepts of what a signal does to the
+                                 process.
 
-     The `backtrace' function obtains a backtrace for the current
-     thread, as a list of pointers, and places the information into
-     BUFFER.  The argument SIZE should be the number of `void *'
-     elements that will fit into BUFFER.  The return value is the
-     actual number of entries of BUFFER that are obtained, and is at
-     most SIZE.
+
+File: libc.info,  Node: Kinds of Signals,  Next: Signal Generation,  Up: Concepts of Signals
 
-     The pointers placed in BUFFER are actually return addresses
-     obtained by inspecting the stack, one return address per stack
-     frame.
+24.1.1 Some Kinds of Signals
+----------------------------
 
-     Note that certain compiler optimizations may interfere with
-     obtaining a valid backtrace.  Function inlining causes the inlined
-     function to not have a stack frame; tail call optimization
-     replaces one stack frame with another; frame pointer elimination
-     will stop `backtrace' from interpreting the stack contents
-     correctly.
+A signal reports the occurrence of an exceptional event.  These are some
+of the events that can cause (or "generate", or "raise") a signal:
 
- -- Function: char ** backtrace_symbols (void *const *BUFFER, int SIZE)
-     Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem lock |
-     *Note POSIX Safety Concepts::.
+   * A program error such as dividing by zero or issuing an address
+     outside the valid range.
 
-     The `backtrace_symbols' function translates the information
-     obtained from the `backtrace' function into an array of strings.
-     The argument BUFFER should be a pointer to an array of addresses
-     obtained via the `backtrace' function, and SIZE is the number of
-     entries in that array (the return value of `backtrace').
+   * A user request to interrupt or terminate the program.  Most
+     environments are set up to let a user suspend the program by typing
+     'C-z', or terminate it with 'C-c'.  Whatever key sequence is used,
+     the operating system sends the proper signal to interrupt the
+     process.
 
-     The return value is a pointer to an array of strings, which has
-     SIZE entries just like the array BUFFER.  Each string contains a
-     printable representation of the corresponding element of BUFFER.
-     It includes the function name (if this can be determined), an
-     offset into the function, and the actual return address (in
-     hexadecimal).
+   * The termination of a child process.
 
-     Currently, the function name and offset only be obtained on
-     systems that use the ELF binary format for programs and libraries.
-     On other systems, only the hexadecimal return address will be
-     present.  Also, you may need to pass additional flags to the
-     linker to make the function names available to the program.  (For
-     example, on systems using GNU ld, you must pass (`-rdynamic'.)
+   * Expiration of a timer or alarm.
 
-     The return value of `backtrace_symbols' is a pointer obtained via
-     the `malloc' function, and it is the responsibility of the caller
-     to `free' that pointer.  Note that only the return value need be
-     freed, not the individual strings.
+   * A call to 'kill' or 'raise' by the same process.
 
-     The return value is `NULL' if sufficient memory for the strings
-     cannot be obtained.
+   * A call to 'kill' from another process.  Signals are a limited but
+     useful form of interprocess communication.
 
- -- Function: void backtrace_symbols_fd (void *const *BUFFER, int SIZE,
-          int FD)
-     Preliminary: | MT-Safe | AS-Safe | AC-Unsafe lock | *Note POSIX
+   * An attempt to perform an I/O operation that cannot be done.
+     Examples are reading from a pipe that has no writer (*note Pipes
+     and FIFOs::), and reading or writing to a terminal in certain
+     situations (*note Job Control::).
+
+   Each of these kinds of events (excepting explicit calls to 'kill' and
+'raise') generates its own particular kind of signal.  The various kinds
+of signals are listed and described in detail in *note Standard
+Signals::.
+
+
+File: libc.info,  Node: Signal Generation,  Next: Delivery of Signal,  Prev: Kinds of Signals,  Up: Concepts of Signals
+
+24.1.2 Concepts of Signal Generation
+------------------------------------
+
+In general, the events that generate signals fall into three major
+categories: errors, external events, and explicit requests.
+
+   An error means that a program has done something invalid and cannot
+continue execution.  But not all kinds of errors generate signals--in
+fact, most do not.  For example, opening a nonexistent file is an error,
+but it does not raise a signal; instead, 'open' returns '-1'.  In
+general, errors that are necessarily associated with certain library
+functions are reported by returning a value that indicates an error.
+The errors which raise signals are those which can happen anywhere in
+the program, not just in library calls.  These include division by zero
+and invalid memory addresses.
+
+   An external event generally has to do with I/O or other processes.
+These include the arrival of input, the expiration of a timer, and the
+termination of a child process.
+
+   An explicit request means the use of a library function such as
+'kill' whose purpose is specifically to generate a signal.
+
+   Signals may be generated "synchronously" or "asynchronously".  A
+synchronous signal pertains to a specific action in the program, and is
+delivered (unless blocked) during that action.  Most errors generate
+signals synchronously, and so do explicit requests by a process to
+generate a signal for that same process.  On some machines, certain
+kinds of hardware errors (usually floating-point exceptions) are not
+reported completely synchronously, but may arrive a few instructions
+later.
+
+   Asynchronous signals are generated by events outside the control of
+the process that receives them.  These signals arrive at unpredictable
+times during execution.  External events generate signals
+asynchronously, and so do explicit requests that apply to some other
+process.
+
+   A given type of signal is either typically synchronous or typically
+asynchronous.  For example, signals for errors are typically synchronous
+because errors generate signals synchronously.  But any type of signal
+can be generated synchronously or asynchronously with an explicit
+request.
+
+
+File: libc.info,  Node: Delivery of Signal,  Prev: Signal Generation,  Up: Concepts of Signals
+
+24.1.3 How Signals Are Delivered
+--------------------------------
+
+When a signal is generated, it becomes "pending".  Normally it remains
+pending for just a short period of time and then is "delivered" to the
+process that was signaled.  However, if that kind of signal is currently
+"blocked", it may remain pending indefinitely--until signals of that
+kind are "unblocked".  Once unblocked, it will be delivered immediately.
+*Note Blocking Signals::.
+
+   When the signal is delivered, whether right away or after a long
+delay, the "specified action" for that signal is taken.  For certain
+signals, such as 'SIGKILL' and 'SIGSTOP', the action is fixed, but for
+most signals, the program has a choice: ignore the signal, specify a
+"handler function", or accept the "default action" for that kind of
+signal.  The program specifies its choice using functions such as
+'signal' or 'sigaction' (*note Signal Actions::).  We sometimes say that
+a handler "catches" the signal.  While the handler is running, that
+particular signal is normally blocked.
+
+   If the specified action for a kind of signal is to ignore it, then
+any such signal which is generated is discarded immediately.  This
+happens even if the signal is also blocked at the time.  A signal
+discarded in this way will never be delivered, not even if the program
+subsequently specifies a different action for that kind of signal and
+then unblocks it.
+
+   If a signal arrives which the program has neither handled nor
+ignored, its "default action" takes place.  Each kind of signal has its
+own default action, documented below (*note Standard Signals::).  For
+most kinds of signals, the default action is to terminate the process.
+For certain kinds of signals that represent "harmless" events, the
+default action is to do nothing.
+
+   When a signal terminates a process, its parent process can determine
+the cause of termination by examining the termination status code
+reported by the 'wait' or 'waitpid' functions.  (This is discussed in
+more detail in *note Process Completion::.)  The information it can get
+includes the fact that termination was due to a signal and the kind of
+signal involved.  If a program you run from a shell is terminated by a
+signal, the shell typically prints some kind of error message.
+
+   The signals that normally represent program errors have a special
+property: when one of these signals terminates the process, it also
+writes a "core dump file" which records the state of the process at the
+time of termination.  You can examine the core dump with a debugger to
+investigate what caused the error.
+
+   If you raise a "program error" signal by explicit request, and this
+terminates the process, it makes a core dump file just as if the signal
+had been due directly to an error.
+
+
+File: libc.info,  Node: Standard Signals,  Next: Signal Actions,  Prev: Concepts of Signals,  Up: Signal Handling
+
+24.2 Standard Signals
+=====================
+
+This section lists the names for various standard kinds of signals and
+describes what kind of event they mean.  Each signal name is a macro
+which stands for a positive integer--the "signal number" for that kind
+of signal.  Your programs should never make assumptions about the
+numeric code for a particular kind of signal, but rather refer to them
+always by the names defined here.  This is because the number for a
+given kind of signal can vary from system to system, but the meanings of
+the names are standardized and fairly uniform.
+
+   The signal names are defined in the header file 'signal.h'.
+
+ -- Macro: int NSIG
+     The value of this symbolic constant is the total number of signals
+     defined.  Since the signal numbers are allocated consecutively,
+     'NSIG' is also one greater than the largest defined signal number.
+
+* Menu:
+
+* Program Error Signals::       Used to report serious program errors.
+* Termination Signals::         Used to interrupt and/or terminate the
+                                 program.
+* Alarm Signals::               Used to indicate expiration of timers.
+* Asynchronous I/O Signals::    Used to indicate input is available.
+* Job Control Signals::         Signals used to support job control.
+* Operation Error Signals::     Used to report operational system errors.
+* Miscellaneous Signals::       Miscellaneous Signals.
+* Signal Messages::             Printing a message describing a signal.
+
+
+File: libc.info,  Node: Program Error Signals,  Next: Termination Signals,  Up: Standard Signals
+
+24.2.1 Program Error Signals
+----------------------------
+
+The following signals are generated when a serious program error is
+detected by the operating system or the computer itself.  In general,
+all of these signals are indications that your program is seriously
+broken in some way, and there's usually no way to continue the
+computation which encountered the error.
+
+   Some programs handle program error signals in order to tidy up before
+terminating; for example, programs that turn off echoing of terminal
+input should handle program error signals in order to turn echoing back
+on.  The handler should end by specifying the default action for the
+signal that happened and then reraising it; this will cause the program
+to terminate with that signal, as if it had not had a handler.  (*Note
+Termination in Handler::.)
+
+   Termination is the sensible ultimate outcome from a program error in
+most programs.  However, programming systems such as Lisp that can load
+compiled user programs might need to keep executing even if a user
+program incurs an error.  These programs have handlers which use
+'longjmp' to return control to the command level.
+
+   The default action for all of these signals is to cause the process
+to terminate.  If you block or ignore these signals or establish
+handlers for them that return normally, your program will probably break
+horribly when such signals happen, unless they are generated by 'raise'
+or 'kill' instead of a real error.
+
+   When one of these program error signals terminates a process, it also
+writes a "core dump file" which records the state of the process at the
+time of termination.  The core dump file is named 'core' and is written
+in whichever directory is current in the process at the time.  (On
+GNU/Hurd systems, you can specify the file name for core dumps with the
+environment variable 'COREFILE'.)  The purpose of core dump files is so
+that you can examine them with a debugger to investigate what caused the
+error.
+
+ -- Macro: int SIGFPE
+     The 'SIGFPE' signal reports a fatal arithmetic error.  Although the
+     name is derived from "floating-point exception", this signal
+     actually covers all arithmetic errors, including division by zero
+     and overflow.  If a program stores integer data in a location which
+     is then used in a floating-point operation, this often causes an
+     "invalid operation" exception, because the processor cannot
+     recognize the data as a floating-point number.
+
+     Actual floating-point exceptions are a complicated subject because
+     there are many types of exceptions with subtly different meanings,
+     and the 'SIGFPE' signal doesn't distinguish between them.  The
+     'IEEE Standard for Binary Floating-Point Arithmetic (ANSI/IEEE Std
+     754-1985 and ANSI/IEEE Std 854-1987)' defines various
+     floating-point exceptions and requires conforming computer systems
+     to report their occurrences.  However, this standard does not
+     specify how the exceptions are reported, or what kinds of handling
+     and control the operating system can offer to the programmer.
+
+   BSD systems provide the 'SIGFPE' handler with an extra argument that
+distinguishes various causes of the exception.  In order to access this
+argument, you must define the handler to accept two arguments, which
+means you must cast it to a one-argument function type in order to
+establish the handler.  The GNU C Library does provide this extra
+argument, but the value is meaningful only on operating systems that
+provide the information (BSD systems and GNU systems).
+
+'FPE_INTOVF_TRAP'
+     Integer overflow (impossible in a C program unless you enable
+     overflow trapping in a hardware-specific fashion).
+'FPE_INTDIV_TRAP'
+     Integer division by zero.
+'FPE_SUBRNG_TRAP'
+     Subscript-range (something that C programs never check for).
+'FPE_FLTOVF_TRAP'
+     Floating overflow trap.
+'FPE_FLTDIV_TRAP'
+     Floating/decimal division by zero.
+'FPE_FLTUND_TRAP'
+     Floating underflow trap.  (Trapping on floating underflow is not
+     normally enabled.)
+'FPE_DECOVF_TRAP'
+     Decimal overflow trap.  (Only a few machines have decimal
+     arithmetic and C never uses it.)
+
+ -- Macro: int SIGILL
+     The name of this signal is derived from "illegal instruction"; it
+     usually means your program is trying to execute garbage or a
+     privileged instruction.  Since the C compiler generates only valid
+     instructions, 'SIGILL' typically indicates that the executable file
+     is corrupted, or that you are trying to execute data.  Some common
+     ways of getting into the latter situation are by passing an invalid
+     object where a pointer to a function was expected, or by writing
+     past the end of an automatic array (or similar problems with
+     pointers to automatic variables) and corrupting other data on the
+     stack such as the return address of a stack frame.
+
+     'SIGILL' can also be generated when the stack overflows, or when
+     the system has trouble running the handler for a signal.
+
+ -- Macro: int SIGSEGV
+     This signal is generated when a program tries to read or write
+     outside the memory that is allocated for it, or to write memory
+     that can only be read.  (Actually, the signals only occur when the
+     program goes far enough outside to be detected by the system's
+     memory protection mechanism.)  The name is an abbreviation for
+     "segmentation violation".
+
+     Common ways of getting a 'SIGSEGV' condition include dereferencing
+     a null or uninitialized pointer, or when you use a pointer to step
+     through an array, but fail to check for the end of the array.  It
+     varies among systems whether dereferencing a null pointer generates
+     'SIGSEGV' or 'SIGBUS'.
+
+ -- Macro: int SIGBUS
+     This signal is generated when an invalid pointer is dereferenced.
+     Like 'SIGSEGV', this signal is typically the result of
+     dereferencing an uninitialized pointer.  The difference between the
+     two is that 'SIGSEGV' indicates an invalid access to valid memory,
+     while 'SIGBUS' indicates an access to an invalid address.  In
+     particular, 'SIGBUS' signals often result from dereferencing a
+     misaligned pointer, such as referring to a four-word integer at an
+     address not divisible by four.  (Each kind of computer has its own
+     requirements for address alignment.)
+
+     The name of this signal is an abbreviation for "bus error".
+
+ -- Macro: int SIGABRT
+     This signal indicates an error detected by the program itself and
+     reported by calling 'abort'.  *Note Aborting a Program::.
+
+ -- Macro: int SIGIOT
+     Generated by the PDP-11 "iot" instruction.  On most machines, this
+     is just another name for 'SIGABRT'.
+
+ -- Macro: int SIGTRAP
+     Generated by the machine's breakpoint instruction, and possibly
+     other trap instructions.  This signal is used by debuggers.  Your
+     program will probably only see 'SIGTRAP' if it is somehow executing
+     bad instructions.
+
+ -- Macro: int SIGEMT
+     Emulator trap; this results from certain unimplemented instructions
+     which might be emulated in software, or the operating system's
+     failure to properly emulate them.
+
+ -- Macro: int SIGSYS
+     Bad system call; that is to say, the instruction to trap to the
+     operating system was executed, but the code number for the system
+     call to perform was invalid.
+
+
+File: libc.info,  Node: Termination Signals,  Next: Alarm Signals,  Prev: Program Error Signals,  Up: Standard Signals
+
+24.2.2 Termination Signals
+--------------------------
+
+These signals are all used to tell a process to terminate, in one way or
+another.  They have different names because they're used for slightly
+different purposes, and programs might want to handle them differently.
+
+   The reason for handling these signals is usually so your program can
+tidy up as appropriate before actually terminating.  For example, you
+might want to save state information, delete temporary files, or restore
+the previous terminal modes.  Such a handler should end by specifying
+the default action for the signal that happened and then reraising it;
+this will cause the program to terminate with that signal, as if it had
+not had a handler.  (*Note Termination in Handler::.)
+
+   The (obvious) default action for all of these signals is to cause the
+process to terminate.
+
+ -- Macro: int SIGTERM
+     The 'SIGTERM' signal is a generic signal used to cause program
+     termination.  Unlike 'SIGKILL', this signal can be blocked,
+     handled, and ignored.  It is the normal way to politely ask a
+     program to terminate.
+
+     The shell command 'kill' generates 'SIGTERM' by default.
+
+ -- Macro: int SIGINT
+     The 'SIGINT' ("program interrupt") signal is sent when the user
+     types the INTR character (normally 'C-c').  *Note Special
+     Characters::, for information about terminal driver support for
+     'C-c'.
+
+ -- Macro: int SIGQUIT
+     The 'SIGQUIT' signal is similar to 'SIGINT', except that it's
+     controlled by a different key--the QUIT character, usually
+     'C-\'--and produces a core dump when it terminates the process,
+     just like a program error signal.  You can think of this as a
+     program error condition "detected" by the user.
+
+     *Note Program Error Signals::, for information about core dumps.
+     *Note Special Characters::, for information about terminal driver
+     support.
+
+     Certain kinds of cleanups are best omitted in handling 'SIGQUIT'.
+     For example, if the program creates temporary files, it should
+     handle the other termination requests by deleting the temporary
+     files.  But it is better for 'SIGQUIT' not to delete them, so that
+     the user can examine them in conjunction with the core dump.
+
+ -- Macro: int SIGKILL
+     The 'SIGKILL' signal is used to cause immediate program
+     termination.  It cannot be handled or ignored, and is therefore
+     always fatal.  It is also not possible to block this signal.
+
+     This signal is usually generated only by explicit request.  Since
+     it cannot be handled, you should generate it only as a last resort,
+     after first trying a less drastic method such as 'C-c' or
+     'SIGTERM'.  If a process does not respond to any other termination
+     signals, sending it a 'SIGKILL' signal will almost always cause it
+     to go away.
+
+     In fact, if 'SIGKILL' fails to terminate a process, that by itself
+     constitutes an operating system bug which you should report.
+
+     The system will generate 'SIGKILL' for a process itself under some
+     unusual conditions where the program cannot possibly continue to
+     run (even to run a signal handler).
+
+ -- Macro: int SIGHUP
+     The 'SIGHUP' ("hang-up") signal is used to report that the user's
+     terminal is disconnected, perhaps because a network or telephone
+     connection was broken.  For more information about this, see *note
+     Control Modes::.
+
+     This signal is also used to report the termination of the
+     controlling process on a terminal to jobs associated with that
+     session; this termination effectively disconnects all processes in
+     the session from the controlling terminal.  For more information,
+     see *note Termination Internals::.
+
+
+File: libc.info,  Node: Alarm Signals,  Next: Asynchronous I/O Signals,  Prev: Termination Signals,  Up: Standard Signals
+
+24.2.3 Alarm Signals
+--------------------
+
+These signals are used to indicate the expiration of timers.  *Note
+Setting an Alarm::, for information about functions that cause these
+signals to be sent.
+
+   The default behavior for these signals is to cause program
+termination.  This default is rarely useful, but no other default would
+be useful; most of the ways of using these signals would require handler
+functions in any case.
+
+ -- Macro: int SIGALRM
+     This signal typically indicates expiration of a timer that measures
+     real or clock time.  It is used by the 'alarm' function, for
+     example.
+
+ -- Macro: int SIGVTALRM
+     This signal typically indicates expiration of a timer that measures
+     CPU time used by the current process.  The name is an abbreviation
+     for "virtual time alarm".
+
+ -- Macro: int SIGPROF
+     This signal typically indicates expiration of a timer that measures
+     both CPU time used by the current process, and CPU time expended on
+     behalf of the process by the system.  Such a timer is used to
+     implement code profiling facilities, hence the name of this signal.
+
+
+File: libc.info,  Node: Asynchronous I/O Signals,  Next: Job Control Signals,  Prev: Alarm Signals,  Up: Standard Signals
+
+24.2.4 Asynchronous I/O Signals
+-------------------------------
+
+The signals listed in this section are used in conjunction with
+asynchronous I/O facilities.  You have to take explicit action by
+calling 'fcntl' to enable a particular file descriptor to generate these
+signals (*note Interrupt Input::).  The default action for these signals
+is to ignore them.
+
+ -- Macro: int SIGIO
+     This signal is sent when a file descriptor is ready to perform
+     input or output.
+
+     On most operating systems, terminals and sockets are the only kinds
+     of files that can generate 'SIGIO'; other kinds, including ordinary
+     files, never generate 'SIGIO' even if you ask them to.
+
+     On GNU systems 'SIGIO' will always be generated properly if you
+     successfully set asynchronous mode with 'fcntl'.
+
+ -- Macro: int SIGURG
+     This signal is sent when "urgent" or out-of-band data arrives on a
+     socket.  *Note Out-of-Band Data::.
+
+ -- Macro: int SIGPOLL
+     This is a System V signal name, more or less similar to 'SIGIO'.
+     It is defined only for compatibility.
+
+
+File: libc.info,  Node: Job Control Signals,  Next: Operation Error Signals,  Prev: Asynchronous I/O Signals,  Up: Standard Signals
+
+24.2.5 Job Control Signals
+--------------------------
+
+These signals are used to support job control.  If your system doesn't
+support job control, then these macros are defined but the signals
+themselves can't be raised or handled.
+
+   You should generally leave these signals alone unless you really
+understand how job control works.  *Note Job Control::.
+
+ -- Macro: int SIGCHLD
+     This signal is sent to a parent process whenever one of its child
+     processes terminates or stops.
+
+     The default action for this signal is to ignore it.  If you
+     establish a handler for this signal while there are child processes
+     that have terminated but not reported their status via 'wait' or
+     'waitpid' (*note Process Completion::), whether your new handler
+     applies to those processes or not depends on the particular
+     operating system.
+
+ -- Macro: int SIGCLD
+     This is an obsolete name for 'SIGCHLD'.
+
+ -- Macro: int SIGCONT
+     You can send a 'SIGCONT' signal to a process to make it continue.
+     This signal is special--it always makes the process continue if it
+     is stopped, before the signal is delivered.  The default behavior
+     is to do nothing else.  You cannot block this signal.  You can set
+     a handler, but 'SIGCONT' always makes the process continue
+     regardless.
+
+     Most programs have no reason to handle 'SIGCONT'; they simply
+     resume execution without realizing they were ever stopped.  You can
+     use a handler for 'SIGCONT' to make a program do something special
+     when it is stopped and continued--for example, to reprint a prompt
+     when it is suspended while waiting for input.
+
+ -- Macro: int SIGSTOP
+     The 'SIGSTOP' signal stops the process.  It cannot be handled,
+     ignored, or blocked.
+
+ -- Macro: int SIGTSTP
+     The 'SIGTSTP' signal is an interactive stop signal.  Unlike
+     'SIGSTOP', this signal can be handled and ignored.
+
+     Your program should handle this signal if you have a special need
+     to leave files or system tables in a secure state when a process is
+     stopped.  For example, programs that turn off echoing should handle
+     'SIGTSTP' so they can turn echoing back on before stopping.
+
+     This signal is generated when the user types the SUSP character
+     (normally 'C-z').  For more information about terminal driver
+     support, see *note Special Characters::.
+
+ -- Macro: int SIGTTIN
+     A process cannot read from the user's terminal while it is running
+     as a background job.  When any process in a background job tries to
+     read from the terminal, all of the processes in the job are sent a
+     'SIGTTIN' signal.  The default action for this signal is to stop
+     the process.  For more information about how this interacts with
+     the terminal driver, see *note Access to the Terminal::.
+
+ -- Macro: int SIGTTOU
+     This is similar to 'SIGTTIN', but is generated when a process in a
+     background job attempts to write to the terminal or set its modes.
+     Again, the default action is to stop the process.  'SIGTTOU' is
+     only generated for an attempt to write to the terminal if the
+     'TOSTOP' output mode is set; *note Output Modes::.
+
+   While a process is stopped, no more signals can be delivered to it
+until it is continued, except 'SIGKILL' signals and (obviously)
+'SIGCONT' signals.  The signals are marked as pending, but not delivered
+until the process is continued.  The 'SIGKILL' signal always causes
+termination of the process and can't be blocked, handled or ignored.
+You can ignore 'SIGCONT', but it always causes the process to be
+continued anyway if it is stopped.  Sending a 'SIGCONT' signal to a
+process causes any pending stop signals for that process to be
+discarded.  Likewise, any pending 'SIGCONT' signals for a process are
+discarded when it receives a stop signal.
+
+   When a process in an orphaned process group (*note Orphaned Process
+Groups::) receives a 'SIGTSTP', 'SIGTTIN', or 'SIGTTOU' signal and does
+not handle it, the process does not stop.  Stopping the process would
+probably not be very useful, since there is no shell program that will
+notice it stop and allow the user to continue it.  What happens instead
+depends on the operating system you are using.  Some systems may do
+nothing; others may deliver another signal instead, such as 'SIGKILL' or
+'SIGHUP'.  On GNU/Hurd systems, the process dies with 'SIGKILL'; this
+avoids the problem of many stopped, orphaned processes lying around the
+system.
+
+
+File: libc.info,  Node: Operation Error Signals,  Next: Miscellaneous Signals,  Prev: Job Control Signals,  Up: Standard Signals
+
+24.2.6 Operation Error Signals
+------------------------------
+
+These signals are used to report various errors generated by an
+operation done by the program.  They do not necessarily indicate a
+programming error in the program, but an error that prevents an
+operating system call from completing.  The default action for all of
+them is to cause the process to terminate.
+
+ -- Macro: int SIGPIPE
+     Broken pipe.  If you use pipes or FIFOs, you have to design your
+     application so that one process opens the pipe for reading before
+     another starts writing.  If the reading process never starts, or
+     terminates unexpectedly, writing to the pipe or FIFO raises a
+     'SIGPIPE' signal.  If 'SIGPIPE' is blocked, handled or ignored, the
+     offending call fails with 'EPIPE' instead.
+
+     Pipes and FIFO special files are discussed in more detail in *note
+     Pipes and FIFOs::.
+
+     Another cause of 'SIGPIPE' is when you try to output to a socket
+     that isn't connected.  *Note Sending Data::.
+
+ -- Macro: int SIGLOST
+     Resource lost.  This signal is generated when you have an advisory
+     lock on an NFS file, and the NFS server reboots and forgets about
+     your lock.
+
+     On GNU/Hurd systems, 'SIGLOST' is generated when any server program
+     dies unexpectedly.  It is usually fine to ignore the signal;
+     whatever call was made to the server that died just returns an
+     error.
+
+ -- Macro: int SIGXCPU
+     CPU time limit exceeded.  This signal is generated when the process
+     exceeds its soft resource limit on CPU time.  *Note Limits on
+     Resources::.
+
+ -- Macro: int SIGXFSZ
+     File size limit exceeded.  This signal is generated when the
+     process attempts to extend a file so it exceeds the process's soft
+     resource limit on file size.  *Note Limits on Resources::.
+
+
+File: libc.info,  Node: Miscellaneous Signals,  Next: Signal Messages,  Prev: Operation Error Signals,  Up: Standard Signals
+
+24.2.7 Miscellaneous Signals
+----------------------------
+
+These signals are used for various other purposes.  In general, they
+will not affect your program unless it explicitly uses them for
+something.
+
+ -- Macro: int SIGUSR1
+ -- Macro: int SIGUSR2
+     The 'SIGUSR1' and 'SIGUSR2' signals are set aside for you to use
+     any way you want.  They're useful for simple interprocess
+     communication, if you write a signal handler for them in the
+     program that receives the signal.
+
+     There is an example showing the use of 'SIGUSR1' and 'SIGUSR2' in
+     *note Signaling Another Process::.
+
+     The default action is to terminate the process.
+
+ -- Macro: int SIGWINCH
+     Window size change.  This is generated on some systems (including
+     GNU) when the terminal driver's record of the number of rows and
+     columns on the screen is changed.  The default action is to ignore
+     it.
+
+     If a program does full-screen display, it should handle 'SIGWINCH'.
+     When the signal arrives, it should fetch the new screen size and
+     reformat its display accordingly.
+
+ -- Macro: int SIGINFO
+     Information request.  On 4.4 BSD and GNU/Hurd systems, this signal
+     is sent to all the processes in the foreground process group of the
+     controlling terminal when the user types the STATUS character in
+     canonical mode; *note Signal Characters::.
+
+     If the process is the leader of the process group, the default
+     action is to print some status information about the system and
+     what the process is doing.  Otherwise the default is to do nothing.
+
+
+File: libc.info,  Node: Signal Messages,  Prev: Miscellaneous Signals,  Up: Standard Signals
+
+24.2.8 Signal Messages
+----------------------
+
+We mentioned above that the shell prints a message describing the signal
+that terminated a child process.  The clean way to print a message
+describing a signal is to use the functions 'strsignal' and 'psignal'.
+These functions use a signal number to specify which kind of signal to
+describe.  The signal number may come from the termination status of a
+child process (*note Process Completion::) or it may come from a signal
+handler in the same process.
+
+ -- Function: char * strsignal (int SIGNUM)
+     Preliminary: | MT-Unsafe race:strsignal locale | AS-Unsafe init
+     i18n corrupt heap | AC-Unsafe init corrupt mem | *Note POSIX Safety
+     Concepts::.
+
+     This function returns a pointer to a statically-allocated string
+     containing a message describing the signal SIGNUM.  You should not
+     modify the contents of this string; and, since it can be rewritten
+     on subsequent calls, you should save a copy of it if you need to
+     reference it later.
+
+     This function is a GNU extension, declared in the header file
+     'string.h'.
+
+ -- Function: void psignal (int SIGNUM, const char *MESSAGE)
+     Preliminary: | MT-Safe locale | AS-Unsafe corrupt i18n heap |
+     AC-Unsafe lock corrupt mem | *Note POSIX Safety Concepts::.
+
+     This function prints a message describing the signal SIGNUM to the
+     standard error output stream 'stderr'; see *note Standard
+     Streams::.
+
+     If you call 'psignal' with a MESSAGE that is either a null pointer
+     or an empty string, 'psignal' just prints the message corresponding
+     to SIGNUM, adding a trailing newline.
+
+     If you supply a non-null MESSAGE argument, then 'psignal' prefixes
+     its output with this string.  It adds a colon and a space character
+     to separate the MESSAGE from the string corresponding to SIGNUM.
+
+     This function is a BSD feature, declared in the header file
+     'signal.h'.
+
+   There is also an array 'sys_siglist' which contains the messages for
+the various signal codes.  This array exists on BSD systems, unlike
+'strsignal'.
+
+
+File: libc.info,  Node: Signal Actions,  Next: Defining Handlers,  Prev: Standard Signals,  Up: Signal Handling
+
+24.3 Specifying Signal Actions
+==============================
+
+The simplest way to change the action for a signal is to use the
+'signal' function.  You can specify a built-in action (such as to ignore
+the signal), or you can "establish a handler".
+
+   The GNU C Library also implements the more versatile 'sigaction'
+facility.  This section describes both facilities and gives suggestions
+on which to use when.
+
+* Menu:
+
+* Basic Signal Handling::       The simple 'signal' function.
+* Advanced Signal Handling::    The more powerful 'sigaction' function.
+* Signal and Sigaction::        How those two functions interact.
+* Sigaction Function Example::  An example of using the sigaction function.
+* Flags for Sigaction::         Specifying options for signal handling.
+* Initial Signal Actions::      How programs inherit signal actions.
+
+
+File: libc.info,  Node: Basic Signal Handling,  Next: Advanced Signal Handling,  Up: Signal Actions
+
+24.3.1 Basic Signal Handling
+----------------------------
+
+The 'signal' function provides a simple interface for establishing an
+action for a particular signal.  The function and associated macros are
+declared in the header file 'signal.h'.
+
+ -- Data Type: sighandler_t
+     This is the type of signal handler functions.  Signal handlers take
+     one integer argument specifying the signal number, and have return
+     type 'void'.  So, you should define handler functions like this:
+
+          void HANDLER (int signum) { ... }
+
+     The name 'sighandler_t' for this data type is a GNU extension.
+
+ -- Function: sighandler_t signal (int SIGNUM, sighandler_t ACTION)
+     Preliminary: | MT-Safe sigintr | AS-Safe | AC-Safe | *Note POSIX
      Safety Concepts::.
 
-     The `backtrace_symbols_fd' function performs the same translation
-     as the function `backtrace_symbols' function.  Instead of returning
-     the strings to the caller, it writes the strings to the file
-     descriptor FD, one per line.  It does not use the `malloc'
-     function, and can therefore be used in situations where that
-     function might fail.
+     The 'signal' function establishes ACTION as the action for the
+     signal SIGNUM.
 
-   The following program illustrates the use of these functions.  Note
-that the array to contain the return addresses returned by `backtrace'
-is allocated on the stack.  Therefore code like this can be used in
-situations where the memory handling via `malloc' does not work anymore
-(in which case the `backtrace_symbols' has to be replaced by a
-`backtrace_symbols_fd' call as well).  The number of return addresses
-is normally not very large.  Even complicated programs rather seldom
-have a nesting level of more than, say, 50 and with 200 possible
-entries probably all programs should be covered.
+     The first argument, SIGNUM, identifies the signal whose behavior
+     you want to control, and should be a signal number.  The proper way
+     to specify a signal number is with one of the symbolic signal names
+     (*note Standard Signals::)--don't use an explicit number, because
+     the numerical code for a given kind of signal may vary from
+     operating system to operating system.
+
+     The second argument, ACTION, specifies the action to use for the
+     signal SIGNUM.  This can be one of the following:
+
+     'SIG_DFL'
+          'SIG_DFL' specifies the default action for the particular
+          signal.  The default actions for various kinds of signals are
+          stated in *note Standard Signals::.
+
+     'SIG_IGN'
+          'SIG_IGN' specifies that the signal should be ignored.
+
+          Your program generally should not ignore signals that
+          represent serious events or that are normally used to request
+          termination.  You cannot ignore the 'SIGKILL' or 'SIGSTOP'
+          signals at all.  You can ignore program error signals like
+          'SIGSEGV', but ignoring the error won't enable the program to
+          continue executing meaningfully.  Ignoring user requests such
+          as 'SIGINT', 'SIGQUIT', and 'SIGTSTP' is unfriendly.
+
+          When you do not wish signals to be delivered during a certain
+          part of the program, the thing to do is to block them, not
+          ignore them.  *Note Blocking Signals::.
+
+     'HANDLER'
+          Supply the address of a handler function in your program, to
+          specify running this handler as the way to deliver the signal.
+
+          For more information about defining signal handler functions,
+          see *note Defining Handlers::.
+
+     If you set the action for a signal to 'SIG_IGN', or if you set it
+     to 'SIG_DFL' and the default action is to ignore that signal, then
+     any pending signals of that type are discarded (even if they are
+     blocked).  Discarding the pending signals means that they will
+     never be delivered, not even if you subsequently specify another
+     action and unblock this kind of signal.
+
+     The 'signal' function returns the action that was previously in
+     effect for the specified SIGNUM.  You can save this value and
+     restore it later by calling 'signal' again.
+
+     If 'signal' can't honor the request, it returns 'SIG_ERR' instead.
+     The following 'errno' error conditions are defined for this
+     function:
+
+     'EINVAL'
+          You specified an invalid SIGNUM; or you tried to ignore or
+          provide a handler for 'SIGKILL' or 'SIGSTOP'.
+
+   *Compatibility Note:* A problem encountered when working with the
+'signal' function is that it has different semantics on BSD and SVID
+systems.  The difference is that on SVID systems the signal handler is
+deinstalled after signal delivery.  On BSD systems the handler must be
+explicitly deinstalled.  In the GNU C Library we use the BSD version by
+default.  To use the SVID version you can either use the function
+'sysv_signal' (see below) or use the '_XOPEN_SOURCE' feature select
+macro (*note Feature Test Macros::).  In general, use of these functions
+should be avoided because of compatibility problems.  It is better to
+use 'sigaction' if it is available since the results are much more
+reliable.
+
+   Here is a simple example of setting up a handler to delete temporary
+files when certain fatal signals happen:
+
+     #include <signal.h>
+
+     void
+     termination_handler (int signum)
+     {
+       struct temp_file *p;
+
+       for (p = temp_file_list; p; p = p->next)
+         unlink (p->name);
+     }
+
+     int
+     main (void)
+     {
+       ...
+       if (signal (SIGINT, termination_handler) == SIG_IGN)
+         signal (SIGINT, SIG_IGN);
+       if (signal (SIGHUP, termination_handler) == SIG_IGN)
+         signal (SIGHUP, SIG_IGN);
+       if (signal (SIGTERM, termination_handler) == SIG_IGN)
+         signal (SIGTERM, SIG_IGN);
+       ...
+     }
+
+Note that if a given signal was previously set to be ignored, this code
+avoids altering that setting.  This is because non-job-control shells
+often ignore certain signals when starting children, and it is important
+for the children to respect this.
+
+   We do not handle 'SIGQUIT' or the program error signals in this
+example because these are designed to provide information for debugging
+(a core dump), and the temporary files may give useful information.
+
+ -- Function: sighandler_t sysv_signal (int SIGNUM, sighandler_t ACTION)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'sysv_signal' implements the behavior of the standard 'signal'
+     function as found on SVID systems.  The difference to BSD systems
+     is that the handler is deinstalled after a delivery of a signal.
+
+     *Compatibility Note:* As said above for 'signal', this function
+     should be avoided when possible.  'sigaction' is the preferred
+     method.
+
+ -- Function: sighandler_t ssignal (int SIGNUM, sighandler_t ACTION)
+     Preliminary: | MT-Safe sigintr | AS-Safe | AC-Safe | *Note POSIX
+     Safety Concepts::.
+
+     The 'ssignal' function does the same thing as 'signal'; it is
+     provided only for compatibility with SVID.
+
+ -- Macro: sighandler_t SIG_ERR
+     The value of this macro is used as the return value from 'signal'
+     to indicate an error.
+
+
+File: libc.info,  Node: Advanced Signal Handling,  Next: Signal and Sigaction,  Prev: Basic Signal Handling,  Up: Signal Actions
+
+24.3.2 Advanced Signal Handling
+-------------------------------
+
+The 'sigaction' function has the same basic effect as 'signal': to
+specify how a signal should be handled by the process.  However,
+'sigaction' offers more control, at the expense of more complexity.  In
+particular, 'sigaction' allows you to specify additional flags to
+control when the signal is generated and how the handler is invoked.
+
+   The 'sigaction' function is declared in 'signal.h'.
+
+ -- Data Type: struct sigaction
+     Structures of type 'struct sigaction' are used in the 'sigaction'
+     function to specify all the information about how to handle a
+     particular signal.  This structure contains at least the following
+     members:
+
+     'sighandler_t sa_handler'
+          This is used in the same way as the ACTION argument to the
+          'signal' function.  The value can be 'SIG_DFL', 'SIG_IGN', or
+          a function pointer.  *Note Basic Signal Handling::.
+
+     'sigset_t sa_mask'
+          This specifies a set of signals to be blocked while the
+          handler runs.  Blocking is explained in *note Blocking for
+          Handler::.  Note that the signal that was delivered is
+          automatically blocked by default before its handler is
+          started; this is true regardless of the value in 'sa_mask'.
+          If you want that signal not to be blocked within its handler,
+          you must write code in the handler to unblock it.
+
+     'int sa_flags'
+          This specifies various flags which can affect the behavior of
+          the signal.  These are described in more detail in *note Flags
+          for Sigaction::.
+
+ -- Function: int sigaction (int SIGNUM, const struct sigaction
+          *restrict ACTION, struct sigaction *restrict OLD-ACTION)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The ACTION argument is used to set up a new action for the signal
+     SIGNUM, while the OLD-ACTION argument is used to return information
+     about the action previously associated with this symbol.  (In other
+     words, OLD-ACTION has the same purpose as the 'signal' function's
+     return value--you can check to see what the old action in effect
+     for the signal was, and restore it later if you want.)
+
+     Either ACTION or OLD-ACTION can be a null pointer.  If OLD-ACTION
+     is a null pointer, this simply suppresses the return of information
+     about the old action.  If ACTION is a null pointer, the action
+     associated with the signal SIGNUM is unchanged; this allows you to
+     inquire about how a signal is being handled without changing that
+     handling.
+
+     The return value from 'sigaction' is zero if it succeeds, and '-1'
+     on failure.  The following 'errno' error conditions are defined for
+     this function:
+
+     'EINVAL'
+          The SIGNUM argument is not valid, or you are trying to trap or
+          ignore 'SIGKILL' or 'SIGSTOP'.
+
+
+File: libc.info,  Node: Signal and Sigaction,  Next: Sigaction Function Example,  Prev: Advanced Signal Handling,  Up: Signal Actions
+
+24.3.3 Interaction of 'signal' and 'sigaction'
+----------------------------------------------
+
+It's possible to use both the 'signal' and 'sigaction' functions within
+a single program, but you have to be careful because they can interact
+in slightly strange ways.
+
+   The 'sigaction' function specifies more information than the 'signal'
+function, so the return value from 'signal' cannot express the full
+range of 'sigaction' possibilities.  Therefore, if you use 'signal' to
+save and later reestablish an action, it may not be able to reestablish
+properly a handler that was established with 'sigaction'.
+
+   To avoid having problems as a result, always use 'sigaction' to save
+and restore a handler if your program uses 'sigaction' at all.  Since
+'sigaction' is more general, it can properly save and reestablish any
+action, regardless of whether it was established originally with
+'signal' or 'sigaction'.
+
+   On some systems if you establish an action with 'signal' and then
+examine it with 'sigaction', the handler address that you get may not be
+the same as what you specified with 'signal'.  It may not even be
+suitable for use as an action argument with 'signal'.  But you can rely
+on using it as an argument to 'sigaction'.  This problem never happens
+on GNU systems.
+
+   So, you're better off using one or the other of the mechanisms
+consistently within a single program.
+
+   *Portability Note:* The basic 'signal' function is a feature of
+ISO C, while 'sigaction' is part of the POSIX.1 standard.  If you are
+concerned about portability to non-POSIX systems, then you should use
+the 'signal' function instead.
+
+
+File: libc.info,  Node: Sigaction Function Example,  Next: Flags for Sigaction,  Prev: Signal and Sigaction,  Up: Signal Actions
+
+24.3.4 'sigaction' Function Example
+-----------------------------------
+
+In *note Basic Signal Handling::, we gave an example of establishing a
+simple handler for termination signals using 'signal'.  Here is an
+equivalent example using 'sigaction':
+
+     #include <signal.h>
+
+     void
+     termination_handler (int signum)
+     {
+       struct temp_file *p;
+
+       for (p = temp_file_list; p; p = p->next)
+         unlink (p->name);
+     }
+
+     int
+     main (void)
+     {
+       ...
+       struct sigaction new_action, old_action;
+
+       /* Set up the structure to specify the new action. */
+       new_action.sa_handler = termination_handler;
+       sigemptyset (&new_action.sa_mask);
+       new_action.sa_flags = 0;
+
+       sigaction (SIGINT, NULL, &old_action);
+       if (old_action.sa_handler != SIG_IGN)
+         sigaction (SIGINT, &new_action, NULL);
+       sigaction (SIGHUP, NULL, &old_action);
+       if (old_action.sa_handler != SIG_IGN)
+         sigaction (SIGHUP, &new_action, NULL);
+       sigaction (SIGTERM, NULL, &old_action);
+       if (old_action.sa_handler != SIG_IGN)
+         sigaction (SIGTERM, &new_action, NULL);
+       ...
+     }
+
+   The program just loads the 'new_action' structure with the desired
+parameters and passes it in the 'sigaction' call.  The usage of
+'sigemptyset' is described later; see *note Blocking Signals::.
+
+   As in the example using 'signal', we avoid handling signals
+previously set to be ignored.  Here we can avoid altering the signal
+handler even momentarily, by using the feature of 'sigaction' that lets
+us examine the current action without specifying a new one.
+
+   Here is another example.  It retrieves information about the current
+action for 'SIGINT' without changing that action.
+
+     struct sigaction query_action;
+
+     if (sigaction (SIGINT, NULL, &query_action) < 0)
+       /* 'sigaction' returns -1 in case of error. */
+     else if (query_action.sa_handler == SIG_DFL)
+       /* 'SIGINT' is handled in the default, fatal manner. */
+     else if (query_action.sa_handler == SIG_IGN)
+       /* 'SIGINT' is ignored. */
+     else
+       /* A programmer-defined signal handler is in effect. */
+
+
+File: libc.info,  Node: Flags for Sigaction,  Next: Initial Signal Actions,  Prev: Sigaction Function Example,  Up: Signal Actions
+
+24.3.5 Flags for 'sigaction'
+----------------------------
+
+The 'sa_flags' member of the 'sigaction' structure is a catch-all for
+special features.  Most of the time, 'SA_RESTART' is a good value to use
+for this field.
+
+   The value of 'sa_flags' is interpreted as a bit mask.  Thus, you
+should choose the flags you want to set, OR those flags together, and
+store the result in the 'sa_flags' member of your 'sigaction' structure.
+
+   Each signal number has its own set of flags.  Each call to
+'sigaction' affects one particular signal number, and the flags that you
+specify apply only to that particular signal.
+
+   In the GNU C Library, establishing a handler with 'signal' sets all
+the flags to zero except for 'SA_RESTART', whose value depends on the
+settings you have made with 'siginterrupt'.  *Note Interrupted
+Primitives::, to see what this is about.
+
+   These macros are defined in the header file 'signal.h'.
+
+ -- Macro: int SA_NOCLDSTOP
+     This flag is meaningful only for the 'SIGCHLD' signal.  When the
+     flag is set, the system delivers the signal for a terminated child
+     process but not for one that is stopped.  By default, 'SIGCHLD' is
+     delivered for both terminated children and stopped children.
+
+     Setting this flag for a signal other than 'SIGCHLD' has no effect.
+
+ -- Macro: int SA_ONSTACK
+     If this flag is set for a particular signal number, the system uses
+     the signal stack when delivering that kind of signal.  *Note Signal
+     Stack::.  If a signal with this flag arrives and you have not set a
+     signal stack, the system terminates the program with 'SIGILL'.
+
+ -- Macro: int SA_RESTART
+     This flag controls what happens when a signal is delivered during
+     certain primitives (such as 'open', 'read' or 'write'), and the
+     signal handler returns normally.  There are two alternatives: the
+     library function can resume, or it can return failure with error
+     code 'EINTR'.
+
+     The choice is controlled by the 'SA_RESTART' flag for the
+     particular kind of signal that was delivered.  If the flag is set,
+     returning from a handler resumes the library function.  If the flag
+     is clear, returning from a handler makes the function fail.  *Note
+     Interrupted Primitives::.
+
+
+File: libc.info,  Node: Initial Signal Actions,  Prev: Flags for Sigaction,  Up: Signal Actions
+
+24.3.6 Initial Signal Actions
+-----------------------------
+
+When a new process is created (*note Creating a Process::), it inherits
+handling of signals from its parent process.  However, when you load a
+new process image using the 'exec' function (*note Executing a File::),
+any signals that you've defined your own handlers for revert to their
+'SIG_DFL' handling.  (If you think about it a little, this makes sense;
+the handler functions from the old program are specific to that program,
+and aren't even present in the address space of the new program image.)
+Of course, the new program can establish its own handlers.
+
+   When a program is run by a shell, the shell normally sets the initial
+actions for the child process to 'SIG_DFL' or 'SIG_IGN', as appropriate.
+It's a good idea to check to make sure that the shell has not set up an
+initial action of 'SIG_IGN' before you establish your own signal
+handlers.
+
+   Here is an example of how to establish a handler for 'SIGHUP', but
+not if 'SIGHUP' is currently ignored:
+
+     ...
+     struct sigaction temp;
+
+     sigaction (SIGHUP, NULL, &temp);
+
+     if (temp.sa_handler != SIG_IGN)
+       {
+         temp.sa_handler = handle_sighup;
+         sigemptyset (&temp.sa_mask);
+         sigaction (SIGHUP, &temp, NULL);
+       }
+
+
+File: libc.info,  Node: Defining Handlers,  Next: Interrupted Primitives,  Prev: Signal Actions,  Up: Signal Handling
+
+24.4 Defining Signal Handlers
+=============================
+
+This section describes how to write a signal handler function that can
+be established with the 'signal' or 'sigaction' functions.
+
+   A signal handler is just a function that you compile together with
+the rest of the program.  Instead of directly invoking the function, you
+use 'signal' or 'sigaction' to tell the operating system to call it when
+a signal arrives.  This is known as "establishing" the handler.  *Note
+Signal Actions::.
+
+   There are two basic strategies you can use in signal handler
+functions:
+
+   * You can have the handler function note that the signal arrived by
+     tweaking some global data structures, and then return normally.
+
+   * You can have the handler function terminate the program or transfer
+     control to a point where it can recover from the situation that
+     caused the signal.
+
+   You need to take special care in writing handler functions because
+they can be called asynchronously.  That is, a handler might be called
+at any point in the program, unpredictably.  If two signals arrive
+during a very short interval, one handler can run within another.  This
+section describes what your handler should do, and what you should
+avoid.
+
+* Menu:
+
+* Handler Returns::             Handlers that return normally, and what
+                                 this means.
+* Termination in Handler::      How handler functions terminate a program.
+* Longjmp in Handler::          Nonlocal transfer of control out of a
+                                 signal handler.
+* Signals in Handler::          What happens when signals arrive while
+                                 the handler is already occupied.
+* Merged Signals::		When a second signal arrives before the
+				 first is handled.
+* Nonreentrancy::               Do not call any functions unless you know they
+                                 are reentrant with respect to signals.
+* Atomic Data Access::          A single handler can run in the middle of
+                                 reading or writing a single object.
+
+
+File: libc.info,  Node: Handler Returns,  Next: Termination in Handler,  Up: Defining Handlers
+
+24.4.1 Signal Handlers that Return
+----------------------------------
+
+Handlers which return normally are usually used for signals such as
+'SIGALRM' and the I/O and interprocess communication signals.  But a
+handler for 'SIGINT' might also return normally after setting a flag
+that tells the program to exit at a convenient time.
+
+   It is not safe to return normally from the handler for a program
+error signal, because the behavior of the program when the handler
+function returns is not defined after a program error.  *Note Program
+Error Signals::.
+
+   Handlers that return normally must modify some global variable in
+order to have any effect.  Typically, the variable is one that is
+examined periodically by the program during normal operation.  Its data
+type should be 'sig_atomic_t' for reasons described in *note Atomic Data
+Access::.
+
+   Here is a simple example of such a program.  It executes the body of
+the loop until it has noticed that a 'SIGALRM' signal has arrived.  This
+technique is useful because it allows the iteration in progress when the
+signal arrives to complete before the loop exits.
 
 
-     #include <execinfo.h>
+     #include <signal.h>
      #include <stdio.h>
      #include <stdlib.h>
 
-     /* Obtain a backtrace and print it to `stdout'. */
+     /* This flag controls termination of the main loop. */
+     volatile sig_atomic_t keep_going = 1;
+
+     /* The signal handler just clears the flag and re-enables itself. */
      void
-     print_trace (void)
+     catch_alarm (int sig)
      {
-       void *array[10];
-       size_t size;
-       char **strings;
-       size_t i;
-
-       size = backtrace (array, 10);
-       strings = backtrace_symbols (array, size);
-
-       printf ("Obtained %zd stack frames.\n", size);
-
-       for (i = 0; i < size; i++)
-          printf ("%s\n", strings[i]);
-
-       free (strings);
+       keep_going = 0;
+       signal (sig, catch_alarm);
      }
 
-     /* A dummy function to make the backtrace more interesting. */
      void
-     dummy_function (void)
+     do_stuff (void)
      {
-       print_trace ();
+       puts ("Doing stuff while waiting for alarm....");
      }
 
      int
      main (void)
      {
-       dummy_function ();
-       return 0;
+       /* Establish a handler for SIGALRM signals. */
+       signal (SIGALRM, catch_alarm);
+
+       /* Set an alarm to go off in a little while. */
+       alarm (2);
+
+       /* Check the flag once in a while to see when to quit. */
+       while (keep_going)
+         do_stuff ();
+
+       return EXIT_SUCCESS;
      }
 
 
-File: libc.info,  Node: POSIX Threads,  Next: Internal Probes,  Prev: Debugging Support,  Up: Top
+File: libc.info,  Node: Termination in Handler,  Next: Longjmp in Handler,  Prev: Handler Returns,  Up: Defining Handlers
 
-34 POSIX Threads
-****************
+24.4.2 Handlers That Terminate the Process
+------------------------------------------
 
-This chapter describes the GNU C Library POSIX Thread implementation.
+Handler functions that terminate the program are typically used to cause
+orderly cleanup or recovery from program error signals and interactive
+interrupts.
 
-* Menu:
+   The cleanest way for a handler to terminate the process is to raise
+the same signal that ran the handler in the first place.  Here is how to
+do this:
 
-* Thread-specific Data::          Support for creating and
-				  managing thread-specific data
-* Non-POSIX Extensions::          Additional functions to extend
-				  POSIX Thread functionality
+     volatile sig_atomic_t fatal_error_in_progress = 0;
+
+     void
+     fatal_error_signal (int sig)
+     {
+       /* Since this handler is established for more than one kind of signal, 
+          it might still get invoked recursively by delivery of some other kind
+          of signal.  Use a static variable to keep track of that. */
+       if (fatal_error_in_progress)
+         raise (sig);
+       fatal_error_in_progress = 1;
+
+       /* Now do the clean up actions:
+          - reset terminal modes
+          - kill child processes
+          - remove lock files */
+       ...
+
+       /* Now reraise the signal.  We reactivate the signal's
+          default handling, which is to terminate the process.
+          We could just call 'exit' or 'abort',
+          but reraising the signal sets the return status
+          from the process correctly. */
+       signal (sig, SIG_DFL);
+       raise (sig);
+     }
 
 
-File: libc.info,  Node: Thread-specific Data,  Next: Non-POSIX Extensions,  Up: POSIX Threads
+File: libc.info,  Node: Longjmp in Handler,  Next: Signals in Handler,  Prev: Termination in Handler,  Up: Defining Handlers
 
-34.1 Thread-specific Data
-=========================
+24.4.3 Nonlocal Control Transfer in Handlers
+--------------------------------------------
 
-The GNU C Library implements functions to allow users to create and
-manage data specific to a thread.  Such data may be destroyed at thread
-exit, if a destructor is provided.  The following functions are defined:
+You can do a nonlocal transfer of control out of a signal handler using
+the 'setjmp' and 'longjmp' facilities (*note Non-Local Exits::).
 
- -- Function: int pthread_key_create (pthread_key_t *KEY, void
-          (*DESTRUCTOR)(void*))
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
+   When the handler does a nonlocal control transfer, the part of the
+program that was running will not continue.  If this part of the program
+was in the middle of updating an important data structure, the data
+structure will remain inconsistent.  Since the program does not
+terminate, the inconsistency is likely to be noticed later on.
 
-     Create a thread-specific data key for the calling thread,
-     referenced by KEY.
+   There are two ways to avoid this problem.  One is to block the signal
+for the parts of the program that update important data structures.
+Blocking the signal delays its delivery until it is unblocked, once the
+critical updating is finished.  *Note Blocking Signals::.
 
-     Objects declared with the C++11 `thread_local' keyword are
-     destroyed before thread-specific data, so they should not be used
-     in thread-specific data destructors or even as members of the
-     thread-specific data, since the latter is passed as an argument to
-     the destructor function.
+   The other way is to re-initialize the crucial data structures in the
+signal handler, or to make their values consistent.
 
- -- Function: int pthread_key_delete (pthread_key_t KEY)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
+   Here is a rather schematic example showing the reinitialization of
+one global variable.
 
-     Destroy the thread-specific data KEY in the calling thread.  The
-     destructor for the thread-specific data is not called during
-     destruction, nor is it called during thread exit.
+     #include <signal.h>
+     #include <setjmp.h>
 
- -- Function: void *pthread_getspecific (pthread_key_t KEY)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
+     jmp_buf return_to_top_level;
 
-     Return the thread-specific data associated with KEY in the calling
-     thread.
+     volatile sig_atomic_t waiting_for_input;
 
- -- Function: int pthread_setspecific (pthread_key_t KEY, const void
-          *VALUE)
-     Preliminary: | MT-Safe | AS-Unsafe corrupt heap | AC-Unsafe
-     corrupt mem | *Note POSIX Safety Concepts::.
-
-     Associate the thread-specific VALUE with KEY in the calling thread.
-
-
-File: libc.info,  Node: Non-POSIX Extensions,  Prev: Thread-specific Data,  Up: POSIX Threads
-
-34.2 Non-POSIX Extensions
-=========================
-
-In addition to implementing the POSIX API for threads, the GNU C
-Library provides additional functions and interfaces to provide
-functionality not specified in the standard.
-
-* Menu:
-
-* Default Thread Attributes::             Setting default attributes for
-					  threads in a process.
-
-
-File: libc.info,  Node: Default Thread Attributes,  Up: Non-POSIX Extensions
-
-34.2.1 Setting Process-wide defaults for thread attributes
-----------------------------------------------------------
-
-The GNU C Library provides non-standard API functions to set and get
-the default attributes used in the creation of threads in a process.
-
- -- Function: int pthread_getattr_default_np (pthread_attr_t *ATTR)
-     Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
-     POSIX Safety Concepts::.
-
-     Get the default attribute values and set ATTR to match.  This
-     function returns 0 on success and a non-zero error code on failure.
-
- -- Function: int pthread_setattr_default_np (pthread_attr_t *ATTR)
-     Preliminary: | MT-Safe | AS-Unsafe heap lock | AC-Unsafe lock mem
-     | *Note POSIX Safety Concepts::.
-
-     Set the default attribute values to match the values in ATTR.  The
-     function returns 0 on success and a non-zero error code on failure.
-     The following error codes are defined for this function:
-
-    `EINVAL'
-          At least one of the values in ATTR does not qualify as valid
-          for the attributes or the stack address is set in the
-          attribute.
-
-    `ENOMEM'
-          The system does not have sufficient memory.
-
-
-File: libc.info,  Node: Internal Probes,  Next: Language Features,  Prev: POSIX Threads,  Up: Top
-
-35 Internal probes
-******************
-
-In order to aid in debugging and monitoring internal behavior, the GNU
-C Library exposes nearly-zero-overhead SystemTap probes marked with the
-`libc' provider.
-
-   These probes are not part of the GNU C Library stable ABI, and they
-are subject to change or removal across releases.  Our only promise with
-regard to them is that, if we find a need to remove or modify the
-arguments of a probe, the modified probe will have a different name, so
-that program monitors relying on the old probe will not get unexpected
-arguments.
-
-* Menu:
-
-* Memory Allocation Probes::  Probes in the memory allocation subsystem
-* Mathematical Function Probes::  Probes in mathematical functions
-
-
-File: libc.info,  Node: Memory Allocation Probes,  Next: Mathematical Function Probes,  Up: Internal Probes
-
-35.1 Memory Allocation Probes
-=============================
-
-These probes are designed to signal relatively unusual situations within
-the virtual memory subsystem of the GNU C Library.
-
- -- Probe: memory_sbrk_more (void *$ARG1, size_t $ARG2)
-     This probe is triggered after the main arena is extended by calling
-     `sbrk'.  Argument $ARG1 is the additional size requested to
-     `sbrk', and $ARG2 is the pointer that marks the end of the `sbrk'
-     area, returned in response to the request.
-
- -- Probe: memory_sbrk_less (void *$ARG1, size_t $ARG2)
-     This probe is triggered after the size of the main arena is
-     decreased by calling `sbrk'.  Argument $ARG1 is the size released
-     by `sbrk' (the positive value, rather than the negative value
-     passed to `sbrk'), and $ARG2 is the pointer that marks the end of
-     the `sbrk' area, returned in response to the request.
-
- -- Probe: memory_heap_new (void *$ARG1, size_t $ARG2)
-     This probe is triggered after a new heap is `mmap'ed.  Argument
-     $ARG1 is a pointer to the base of the memory area, where the
-     `heap_info' data structure is held, and $ARG2 is the size of the
-     heap.
-
- -- Probe: memory_heap_free (void *$ARG1, size_t $ARG2)
-     This probe is triggered _before_ (unlike the other sbrk and heap
-     probes) a heap is completely removed via `munmap'.  Argument $ARG1
-     is a pointer to the heap, and $ARG2 is the size of the heap.
-
- -- Probe: memory_heap_more (void *$ARG1, size_t $ARG2)
-     This probe is triggered after a trailing portion of an `mmap'ed
-     heap is extended.  Argument $ARG1 is a pointer to the heap, and
-     $ARG2 is the new size of the heap.
-
- -- Probe: memory_heap_less (void *$ARG1, size_t $ARG2)
-     This probe is triggered after a trailing portion of an `mmap'ed
-     heap is released.  Argument $ARG1 is a pointer to the heap, and
-     $ARG2 is the new size of the heap.
-
- -- Probe: memory_malloc_retry (size_t $ARG1)
- -- Probe: memory_realloc_retry (size_t $ARG1, void *$ARG2)
- -- Probe: memory_memalign_retry (size_t $ARG1, size_t $ARG2)
- -- Probe: memory_calloc_retry (size_t $ARG1)
-     These probes are triggered when the corresponding functions fail to
-     obtain the requested amount of memory from the arena in use,
-     before they call `arena_get_retry' to select an alternate arena in
-     which to retry the allocation.  Argument $ARG1 is the amount of
-     memory requested by the user; in the `calloc' case, that is the
-     total size computed from both function arguments.  In the
-     `realloc' case, $ARG2 is the pointer to the memory area being
-     resized.  In the `memalign' case, $ARG2 is the alignment to be
-     used for the request, which may be stricter than the value passed
-     to the `memalign' function.  A `memalign' probe is also used by
-     functions `posix_memalign, valloc' and `pvalloc'.
-
-     Note that the argument order does _not_ match that of the
-     corresponding two-argument functions, so that in all of these
-     probes the user-requested allocation size is in $ARG1.
-
- -- Probe: memory_arena_retry (size_t $ARG1, void *$ARG2)
-     This probe is triggered within `arena_get_retry' (the function
-     called to select the alternate arena in which to retry an
-     allocation that failed on the first attempt), before the selection
-     of an alternate arena.  This probe is redundant, but much easier
-     to use when it's not important to determine which of the various
-     memory allocation functions is failing to allocate on the first
-     try.  Argument $ARG1 is the same as in the function-specific
-     probes, except for extra room for padding introduced by functions
-     that have to ensure stricter alignment.  Argument $ARG2 is the
-     arena in which allocation failed.
-
- -- Probe: memory_arena_new (void *$ARG1, size_t $ARG2)
-     This probe is triggered when `malloc' allocates and initializes an
-     additional arena (not the main arena), but before the arena is
-     assigned to the running thread or inserted into the internal
-     linked list of arenas.  The arena's `malloc_state' internal data
-     structure is located at $ARG1, within a newly-allocated heap big
-     enough to hold at least $ARG2 bytes.
-
- -- Probe: memory_arena_reuse (void *$ARG1, void *$ARG2)
-     This probe is triggered when `malloc' has just selected an existing
-     arena to reuse, and (temporarily) reserved it for exclusive use.
-     Argument $ARG1 is a pointer to the newly-selected arena, and $ARG2
-     is a pointer to the arena previously used by that thread.
-
-     This occurs within `reused_arena', right after the mutex mentioned
-     in probe `memory_arena_reuse_wait' is acquired; argument $ARG1 will
-     point to the same arena.  In this configuration, this will usually
-     only occur once per thread.  The exception is when a thread first
-     selected the main arena, but a subsequent allocation from it
-     fails: then, and only then, may we switch to another arena to
-     retry that allocations, and for further allocations within that
-     thread.
-
- -- Probe: memory_arena_reuse_wait (void *$ARG1, void *$ARG2, void
-          *$ARG3)
-     This probe is triggered when `malloc' is about to wait for an arena
-     to become available for reuse.  Argument $ARG1 holds a pointer to
-     the mutex the thread is going to wait on, $ARG2 is a pointer to a
-     newly-chosen arena to be reused, and $ARG3 is a pointer to the
-     arena previously used by that thread.
-
-     This occurs within `reused_arena', when a thread first tries to
-     allocate memory or needs a retry after a failure to allocate from
-     the main arena, there isn't any free arena, the maximum number of
-     arenas has been reached, and an existing arena was chosen for
-     reuse, but its mutex could not be immediately acquired.  The mutex
-     in $ARG1 is the mutex of the selected arena.
-
- -- Probe: memory_arena_reuse_free_list (void *$ARG1)
-     This probe is triggered when `malloc' has chosen an arena that is
-     in the free list for use by a thread, within the `get_free_list'
-     function.  The argument $ARG1 holds a pointer to the selected
-     arena.
-
- -- Probe: memory_mallopt (int $ARG1, int $ARG2)
-     This probe is triggered when function `mallopt' is called to change
-     `malloc' internal configuration parameters, before any change to
-     the parameters is made.  The arguments $ARG1 and $ARG2 are the
-     ones passed to the `mallopt' function.
-
- -- Probe: memory_mallopt_mxfast (int $ARG1, int $ARG2)
-     This probe is triggered shortly after the `memory_mallopt' probe,
-     when the parameter to be changed is `M_MXFAST', and the requested
-     value is in an acceptable range.  Argument $ARG1 is the requested
-     value, and $ARG2 is the previous value of this `malloc' parameter.
-
- -- Probe: memory_mallopt_trim_threshold (int $ARG1, int $ARG2, int
-          $ARG3)
-     This probe is triggere shortly after the `memory_mallopt' probe,
-     when the parameter to be changed is `M_TRIM_THRESHOLD'.  Argument
-     $ARG1 is the requested value, $ARG2 is the previous value of this
-     `malloc' parameter, and $ARG3 is nonzero if dynamic threshold
-     adjustment was already disabled.
-
- -- Probe: memory_mallopt_top_pad (int $ARG1, int $ARG2, int $ARG3)
-     This probe is triggered shortly after the `memory_mallopt' probe,
-     when the parameter to be changed is `M_TOP_PAD'.  Argument $ARG1
-     is the requested value, $ARG2 is the previous value of this
-     `malloc' parameter, and $ARG3 is nonzero if dynamic threshold
-     adjustment was already disabled.
-
- -- Probe: memory_mallopt_mmap_threshold (int $ARG1, int $ARG2, int
-          $ARG3)
-     This probe is triggered shortly after the `memory_mallopt' probe,
-     when the parameter to be changed is `M_MMAP_THRESHOLD', and the
-     requested value is in an acceptable range.  Argument $ARG1 is the
-     requested value, $ARG2 is the previous value of this `malloc'
-     parameter, and $ARG3 is nonzero if dynamic threshold adjustment
-     was already disabled.
-
- -- Probe: memory_mallopt_mmap_max (int $ARG1, int $ARG2, int $ARG3)
-     This probe is triggered shortly after the `memory_mallopt' probe,
-     when the parameter to be changed is `M_MMAP_MAX'.  Argument $ARG1
-     is the requested value, $ARG2 is the previous value of this
-     `malloc' parameter, and $ARG3 is nonzero if dynamic threshold
-     adjustment was already disabled.
-
- -- Probe: memory_mallopt_check_action (int $ARG1, int $ARG2)
-     This probe is triggered shortly after the `memory_mallopt' probe,
-     when the parameter to be changed is `M_CHECK_ACTION'.  Argument
-     $ARG1 is the requested value, and $ARG2 is the previous value of
-     this `malloc' parameter.
-
- -- Probe: memory_mallopt_perturb (int $ARG1, int $ARG2)
-     This probe is triggered shortly after the `memory_mallopt' probe,
-     when the parameter to be changed is `M_PERTURB'.  Argument $ARG1
-     is the requested value, and $ARG2 is the previous value of this
-     `malloc' parameter.
-
- -- Probe: memory_mallopt_arena_test (int $ARG1, int $ARG2)
-     This probe is triggered shortly after the `memory_mallopt' probe,
-     when the parameter to be changed is `M_ARENA_TEST', and the
-     requested value is in an acceptable range.  Argument $ARG1 is the
-     requested value, and $ARG2 is the previous value of this `malloc'
-     parameter.
-
- -- Probe: memory_mallopt_arena_max (int $ARG1, int $ARG2)
-     This probe is triggered shortly after the `memory_mallopt' probe,
-     when the parameter to be changed is `M_ARENA_MAX', and the
-     requested value is in an acceptable range.  Argument $ARG1 is the
-     requested value, and $ARG2 is the previous value of this `malloc'
-     parameter.
-
- -- Probe: memory_mallopt_free_dyn_thresholds (int $ARG1, int $ARG2)
-     This probe is triggered when function `free' decides to adjust the
-     dynamic brk/mmap thresholds.  Argument $ARG1 and $ARG2 are the
-     adjusted mmap and trim thresholds, respectively.
-
-
-File: libc.info,  Node: Mathematical Function Probes,  Prev: Memory Allocation Probes,  Up: Internal Probes
-
-35.2 Mathematical Function Probes
-=================================
-
-Some mathematical functions fall back to multiple precision arithmetic
-for some inputs to get last bit precision for their return values.
-This multiple precision fallback is much slower than the default
-algorithms and may have a significant impact on application
-performance.  The systemtap probe markers described in this section may
-help you determine if your application calls mathematical functions
-with inputs that may result in multiple-precision arithmetic.
-
-   Unless explicitly mentioned otherwise, a precision of 1 implies 24
-bits of precision in the mantissa of the multiple precision number.
-Hence, a precision level of 32 implies 768 bits of precision in the
-mantissa.
-
- -- Probe: slowexp_p6 (double $ARG1, double $ARG2)
-     This probe is hit when the `exp' function is called with an input
-     that results in multiple precision computation with precision 6.
-     Argument $ARG1 is the input value and $ARG2 is the computed output.
-
- -- Probe: slowexp_p32 (double $ARG1, double $ARG2)
-     This probe is hit when the `exp' function is called with an input
-     that results in multiple precision computation with precision 32.
-     Argument $ARG1 is the input value and $ARG2 is the computed output.
-
- -- Probe: slowpow_p10 (double $ARG1, double $ARG2, double $ARG3,
-          double $ARG4)
-     This probe is hit when the `pow' function is called with inputs
-     that result in multiple precision computation with precision 10.
-     Arguments $ARG1 and $ARG2 are the input values, `$arg3' is the
-     value computed in the fast phase of the algorithm and `$arg4' is
-     the final accurate value.
-
- -- Probe: slowpow_p32 (double $ARG1, double $ARG2, double $ARG3,
-          double $ARG4)
-     This probe is hit when the `pow' function is called with an input
-     that results in multiple precision computation with precision 32.
-     Arguments $ARG1 and $ARG2 are the input values, `$arg3' is the
-     value computed in the fast phase of the algorithm and `$arg4' is
-     the final accurate value.
-
- -- Probe: slowlog (int $ARG1, double $ARG2, double $ARG3)
-     This probe is hit when the `log' function is called with an input
-     that results in multiple precision computation.  Argument $ARG1 is
-     the precision with which the computation succeeded.  Argument
-     $ARG2 is the input and $ARG3 is the computed output.
-
- -- Probe: slowlog_inexact (int $ARG1, double $ARG2, double $ARG3)
-     This probe is hit when the `log' function is called with an input
-     that results in multiple precision computation and none of the
-     multiple precision computations result in an accurate result.
-     Argument $ARG1 is the maximum precision  with which computations
-     were performed.  Argument $ARG2 is the input and $ARG3 is the
-     computed output.
-
- -- Probe: slowatan2 (int $ARG1, double $ARG2, double $ARG3, double
-          $ARG4)
-     This probe is hit when the `atan2' function is called with an
-     input that results in multiple precision computation.  Argument
-     $ARG1 is the precision with which computation succeeded.
-     Arguments $ARG2 and $ARG3 are inputs to the `atan2' function and
-     $ARG4 is the computed result.
-
- -- Probe: slowatan2_inexact (int $ARG1, double $ARG2, double $ARG3,
-          double $ARG4)
-     This probe is hit when the `atan' function is called with an input
-     that results in multiple precision computation and none of the
-     multiple precision computations result in an accurate result.
-     Argument $ARG1 is the maximum precision  with which computations
-     were performed.  Arguments $ARG2 and $ARG3 are inputs to the
-     `atan2' function and $ARG4 is the computed result.
-
- -- Probe: slowatan (int $ARG1, double $ARG2, double $ARG3)
-     This probe is hit when the `atan' function is called with an input
-     that results in multiple precision computation.  Argument $ARG1 is
-     the precision with which computation succeeded.  Argument $ARG2 is
-     the input to the `atan' function and $ARG3 is the computed result.
-
- -- Probe: slowatan_inexact (int $ARG1, double $ARG2, double $ARG3)
-     This probe is hit when the `atan' function is called with an input
-     that results in multiple precision computation and none of the
-     multiple precision computations result in an accurate result.
-     Argument $ARG1 is the maximum precision  with which computations
-     were performed.  Argument $ARG2 is the input to the `atan'
-     function and $ARG3 is the computed result.
-
- -- Probe: slowtan (double $ARG1, double $ARG2)
-     This probe is hit when the `tan' function is called with an input
-     that results in multiple precision computation with precision 32.
-     Argument $ARG1 is the input to the function and $ARG2 is the
-     computed result.
-
- -- Probe: slowasin (double $ARG1, double $ARG2)
-     This probe is hit when the `asin' function is called with an input
-     that results in multiple precision computation with precision 32.
-     Argument $ARG1 is the input to the function and $ARG2 is the
-     computed result.
-
- -- Probe: slowacos (double $ARG1, double $ARG2)
-     This probe is hit when the `acos' function is called with an input
-     that results in multiple precision computation with precision 32.
-     Argument $ARG1 is the input to the function and $ARG2 is the
-     computed result.
-
- -- Probe: slowsin (double $ARG1, double $ARG2)
-     This probe is hit when the `sin' function is called with an input
-     that results in multiple precision computation with precision 32.
-     Argument $ARG1 is the input to the function and $ARG2 is the
-     computed result.
-
- -- Probe: slowcos (double $ARG1, double $ARG2)
-     This probe is hit when the `cos' function is called with an input
-     that results in multiple precision computation with precision 32.
-     Argument $ARG1 is the input to the function and $ARG2 is the
-     computed result.
-
- -- Probe: slowsin_dx (double $ARG1, double $ARG2, double $ARG3)
-     This probe is hit when the `sin' function is called with an input
-     that results in multiple precision computation with precision 32.
-     Argument $ARG1 is the input to the function, $ARG2 is the error
-     bound of $ARG1 and $ARG3 is the computed result.
-
- -- Probe: slowcos_dx (double $ARG1, double $ARG2, double $ARG3)
-     This probe is hit when the `cos' function is called with an input
-     that results in multiple precision computation with precision 32.
-     Argument $ARG1 is the input to the function, $ARG2 is the error
-     bound of $ARG1 and $ARG3 is the computed result.
-
-
-File: libc.info,  Node: Language Features,  Next: Library Summary,  Prev: Internal Probes,  Up: Top
-
-Appendix A C Language Facilities in the Library
-***********************************************
-
-Some of the facilities implemented by the C library really should be
-thought of as parts of the C language itself.  These facilities ought to
-be documented in the C Language Manual, not in the library manual; but
-since we don't have the language manual yet, and documentation for these
-features has been written, we are publishing it here.
-
-* Menu:
-
-* Consistency Checking::        Using `assert' to abort if
-				 something ``impossible'' happens.
-* Variadic Functions::          Defining functions with varying numbers
-                                 of args.
-* Null Pointer Constant::       The macro `NULL'.
-* Important Data Types::        Data types for object sizes.
-* Data Type Measurements::      Parameters of data type representations.
-
-
-File: libc.info,  Node: Consistency Checking,  Next: Variadic Functions,  Up: Language Features
-
-A.1 Explicitly Checking Internal Consistency
-============================================
-
-When you're writing a program, it's often a good idea to put in checks
-at strategic places for "impossible" errors or violations of basic
-assumptions.  These kinds of checks are helpful in debugging problems
-with the interfaces between different parts of the program, for example.
-
-   The `assert' macro, defined in the header file `assert.h', provides
-a convenient way to abort the program while printing a message about
-where in the program the error was detected.
-
-   Once you think your program is debugged, you can disable the error
-checks performed by the `assert' macro by recompiling with the macro
-`NDEBUG' defined.  This means you don't actually have to change the
-program source code to disable these checks.
-
-   But disabling these consistency checks is undesirable unless they
-make the program significantly slower.  All else being equal, more error
-checking is good no matter who is running the program.  A wise user
-would rather have a program crash, visibly, than have it return nonsense
-without indicating anything might be wrong.
-
- -- Macro: void assert (int EXPRESSION)
-     Preliminary: | MT-Safe | AS-Unsafe heap corrupt | AC-Unsafe mem
-     lock corrupt | *Note POSIX Safety Concepts::.
-
-     Verify the programmer's belief that EXPRESSION is nonzero at this
-     point in the program.
-
-     If `NDEBUG' is not defined, `assert' tests the value of
-     EXPRESSION.  If it is false (zero), `assert' aborts the program
-     (*note Aborting a Program::) after printing a message of the form:
-
-          `FILE':LINENUM: FUNCTION: Assertion `EXPRESSION' failed.
-
-     on the standard error stream `stderr' (*note Standard Streams::).
-     The filename and line number are taken from the C preprocessor
-     macros `__FILE__' and `__LINE__' and specify where the call to
-     `assert' was made.  When using the GNU C compiler, the name of the
-     function which calls `assert' is taken from the built-in variable
-     `__PRETTY_FUNCTION__'; with older compilers, the function name and
-     following colon are omitted.
-
-     If the preprocessor macro `NDEBUG' is defined before `assert.h' is
-     included, the `assert' macro is defined to do absolutely nothing.
-
-     *Warning:* Even the argument expression EXPRESSION is not
-     evaluated if `NDEBUG' is in effect.  So never use `assert' with
-     arguments that involve side effects.  For example, `assert (++i >
-     0);' is a bad idea, because `i' will not be incremented if
-     `NDEBUG' is defined.
-
-   Sometimes the "impossible" condition you want to check for is an
-error return from an operating system function.  Then it is useful to
-display not only where the program crashes, but also what error was
-returned.  The `assert_perror' macro makes this easy.
-
- -- Macro: void assert_perror (int ERRNUM)
-     Preliminary: | MT-Safe | AS-Unsafe heap corrupt | AC-Unsafe mem
-     lock corrupt | *Note POSIX Safety Concepts::.
-
-     Similar to `assert', but verifies that ERRNUM is zero.
-
-     If `NDEBUG' is not defined, `assert_perror' tests the value of
-     ERRNUM.  If it is nonzero, `assert_perror' aborts the program
-     after printing a message of the form:
-
-          `FILE':LINENUM: FUNCTION: ERROR TEXT
-
-     on the standard error stream.  The file name, line number, and
-     function name are as for `assert'.  The error text is the result of
-     `strerror (ERRNUM)'.  *Note Error Messages::.
-
-     Like `assert', if `NDEBUG' is defined before `assert.h' is
-     included, the `assert_perror' macro does absolutely nothing.  It
-     does not evaluate the argument, so ERRNUM should not have any side
-     effects.  It is best for ERRNUM to be just a simple variable
-     reference; often it will be `errno'.
-
-     This macro is a GNU extension.
-
-   *Usage note:* The `assert' facility is designed for detecting
-_internal inconsistency_; it is not suitable for reporting invalid
-input or improper usage by the _user_ of the program.
-
-   The information in the diagnostic messages printed by the `assert'
-and `assert_perror' macro is intended to help you, the programmer,
-track down the cause of a bug, but is not really useful for telling a
-user of your program why his or her input was invalid or why a command
-could not be carried out.  What's more, your program should not abort
-when given invalid input, as `assert' would do--it should exit with
-nonzero status (*note Exit Status::) after printing its error messages,
-or perhaps read another command or move on to the next input file.
-
-   *Note Error Messages::, for information on printing error messages
-for problems that _do not_ represent bugs in the program.
-
-
-File: libc.info,  Node: Variadic Functions,  Next: Null Pointer Constant,  Prev: Consistency Checking,  Up: Language Features
-
-A.2 Variadic Functions
-======================
-
-ISO C defines a syntax for declaring a function to take a variable
-number or type of arguments.  (Such functions are referred to as
-"varargs functions" or "variadic functions".)  However, the language
-itself provides no mechanism for such functions to access their
-non-required arguments; instead, you use the variable arguments macros
-defined in `stdarg.h'.
-
-   This section describes how to declare variadic functions, how to
-write them, and how to call them properly.
-
-   *Compatibility Note:* Many older C dialects provide a similar, but
-incompatible, mechanism for defining functions with variable numbers of
-arguments, using `varargs.h'.
-
-* Menu:
-
-* Why Variadic::                Reasons for making functions take
-                                 variable arguments.
-* How Variadic::                How to define and call variadic functions.
-* Variadic Example::            A complete example.
-
-
-File: libc.info,  Node: Why Variadic,  Next: How Variadic,  Up: Variadic Functions
-
-A.2.1 Why Variadic Functions are Used
--------------------------------------
-
-Ordinary C functions take a fixed number of arguments.  When you define
-a function, you specify the data type for each argument.  Every call to
-the function should supply the expected number of arguments, with types
-that can be converted to the specified ones.  Thus, if the function
-`foo' is declared with `int foo (int, char *);' then you must call it
-with two arguments, a number (any kind will do) and a string pointer.
-
-   But some functions perform operations that can meaningfully accept an
-unlimited number of arguments.
-
-   In some cases a function can handle any number of values by
-operating on all of them as a block.  For example, consider a function
-that allocates a one-dimensional array with `malloc' to hold a
-specified set of values.  This operation makes sense for any number of
-values, as long as the length of the array corresponds to that number.
-Without facilities for variable arguments, you would have to define a
-separate function for each possible array size.
-
-   The library function `printf' (*note Formatted Output::) is an
-example of another class of function where variable arguments are
-useful.  This function prints its arguments (which can vary in type as
-well as number) under the control of a format template string.
-
-   These are good reasons to define a "variadic" function which can
-handle as many arguments as the caller chooses to pass.
-
-   Some functions such as `open' take a fixed set of arguments, but
-occasionally ignore the last few.  Strict adherence to ISO C requires
-these functions to be defined as variadic; in practice, however, the GNU
-C compiler and most other C compilers let you define such a function to
-take a fixed set of arguments--the most it can ever use--and then only
-_declare_ the function as variadic (or not declare its arguments at
-all!).
-
-
-File: libc.info,  Node: How Variadic,  Next: Variadic Example,  Prev: Why Variadic,  Up: Variadic Functions
-
-A.2.2 How Variadic Functions are Defined and Used
--------------------------------------------------
-
-Defining and using a variadic function involves three steps:
-
-   * _Define_ the function as variadic, using an ellipsis (`...') in
-     the argument list, and using special macros to access the variable
-     arguments.  *Note Receiving Arguments::.
-
-   * _Declare_ the function as variadic, using a prototype with an
-     ellipsis (`...'), in all the files which call it.  *Note Variadic
-     Prototypes::.
-
-   * _Call_ the function by writing the fixed arguments followed by the
-     additional variable arguments.  *Note Calling Variadics::.
-
-* Menu:
-
-* Variadic Prototypes::  How to make a prototype for a function
-			  with variable arguments.
-* Receiving Arguments::  Steps you must follow to access the
-			  optional argument values.
-* How Many Arguments::   How to decide whether there are more arguments.
-* Calling Variadics::    Things you need to know about calling
-			  variable arguments functions.
-* Argument Macros::      Detailed specification of the macros
-        		  for accessing variable arguments.
-
-
-File: libc.info,  Node: Variadic Prototypes,  Next: Receiving Arguments,  Up: How Variadic
-
-A.2.2.1 Syntax for Variable Arguments
-.....................................
-
-A function that accepts a variable number of arguments must be declared
-with a prototype that says so.   You write the fixed arguments as usual,
-and then tack on `...' to indicate the possibility of additional
-arguments.  The syntax of ISO C requires at least one fixed argument
-before the `...'.  For example,
+     void
+     handle_sigint (int signum)
+     {
+       /* We may have been waiting for input when the signal arrived,
+          but we are no longer waiting once we transfer control. */
+       waiting_for_input = 0;
+       longjmp (return_to_top_level, 1);
+     }
 
      int
-     func (const char *a, int b, ...)
+     main (void)
      {
        ...
+       signal (SIGINT, sigint_handler);
+       ...
+       while (1) {
+         prepare_for_command ();
+         if (setjmp (return_to_top_level) == 0)
+           read_and_execute_command ();
+       }
      }
 
-defines a function `func' which returns an `int' and takes two required
-arguments, a `const char *' and an `int'.  These are followed by any
-number of anonymous arguments.
-
-   *Portability note:* For some C compilers, the last required argument
-must not be declared `register' in the function definition.
-Furthermore, this argument's type must be "self-promoting": that is,
-the default promotions must not change its type.  This rules out array
-and function types, as well as `float', `char' (whether signed or not)
-and `short int' (whether signed or not).  This is actually an ISO C
-requirement.
+     /* Imagine this is a subroutine used by various commands. */
+     char *
+     read_data ()
+     {
+       if (input_from_terminal) {
+         waiting_for_input = 1;
+         ...
+         waiting_for_input = 0;
+       } else {
+         ...
+       }
+     }
 
 
-File: libc.info,  Node: Receiving Arguments,  Next: How Many Arguments,  Prev: Variadic Prototypes,  Up: How Variadic
+File: libc.info,  Node: Signals in Handler,  Next: Merged Signals,  Prev: Longjmp in Handler,  Up: Defining Handlers
 
-A.2.2.2 Receiving the Argument Values
-.....................................
+24.4.4 Signals Arriving While a Handler Runs
+--------------------------------------------
 
-Ordinary fixed arguments have individual names, and you can use these
-names to access their values.  But optional arguments have no
-names--nothing but `...'.  How can you access them?
+What happens if another signal arrives while your signal handler
+function is running?
 
-   The only way to access them is sequentially, in the order they were
-written, and you must use special macros from `stdarg.h' in the
-following three step process:
+   When the handler for a particular signal is invoked, that signal is
+automatically blocked until the handler returns.  That means that if two
+signals of the same kind arrive close together, the second one will be
+held until the first has been handled.  (The handler can explicitly
+unblock the signal using 'sigprocmask', if you want to allow more
+signals of this type to arrive; see *note Process Signal Mask::.)
 
-  1. You initialize an argument pointer variable of type `va_list' using
-     `va_start'.  The argument pointer when initialized points to the
-     first optional argument.
+   However, your handler can still be interrupted by delivery of another
+kind of signal.  To avoid this, you can use the 'sa_mask' member of the
+action structure passed to 'sigaction' to explicitly specify which
+signals should be blocked while the signal handler runs.  These signals
+are in addition to the signal for which the handler was invoked, and any
+other signals that are normally blocked by the process.  *Note Blocking
+for Handler::.
 
-  2. You access the optional arguments by successive calls to `va_arg'.
-     The first call to `va_arg' gives you the first optional argument,
-     the next call gives you the second, and so on.
+   When the handler returns, the set of blocked signals is restored to
+the value it had before the handler ran.  So using 'sigprocmask' inside
+the handler only affects what signals can arrive during the execution of
+the handler itself, not what signals can arrive once the handler
+returns.
 
-     You can stop at any time if you wish to ignore any remaining
-     optional arguments.  It is perfectly all right for a function to
-     access fewer arguments than were supplied in the call, but you
-     will get garbage values if you try to access too many arguments.
-
-  3. You indicate that you are finished with the argument pointer
-     variable by calling `va_end'.
-
-     (In practice, with most C compilers, calling `va_end' does nothing.
-     This is always true in the GNU C compiler.  But you might as well
-     call `va_end' just in case your program is someday compiled with a
-     peculiar compiler.)
-
-   *Note Argument Macros::, for the full definitions of `va_start',
-`va_arg' and `va_end'.
-
-   Steps 1 and 3 must be performed in the function that accepts the
-optional arguments.  However, you can pass the `va_list' variable as an
-argument to another function and perform all or part of step 2 there.
-
-   You can perform the entire sequence of three steps multiple times
-within a single function invocation.  If you want to ignore the optional
-arguments, you can do these steps zero times.
-
-   You can have more than one argument pointer variable if you like.
-You can initialize each variable with `va_start' when you wish, and
-then you can fetch arguments with each argument pointer as you wish.
-Each argument pointer variable will sequence through the same set of
-argument values, but at its own pace.
-
-   *Portability note:* With some compilers, once you pass an argument
-pointer value to a subroutine, you must not keep using the same
-argument pointer value after that subroutine returns.  For full
-portability, you should just pass it to `va_end'.  This is actually an
-ISO C requirement, but most ANSI C compilers work happily regardless.
+   *Portability Note:* Always use 'sigaction' to establish a handler for
+a signal that you expect to receive asynchronously, if you want your
+program to work properly on System V Unix.  On this system, the handling
+of a signal whose handler was established with 'signal' automatically
+sets the signal's action back to 'SIG_DFL', and the handler must
+re-establish itself each time it runs.  This practice, while
+inconvenient, does work when signals cannot arrive in succession.
+However, if another signal can arrive right away, it may arrive before
+the handler can re-establish itself.  Then the second signal would
+receive the default handling, which could terminate the process.
 
 
-File: libc.info,  Node: How Many Arguments,  Next: Calling Variadics,  Prev: Receiving Arguments,  Up: How Variadic
+File: libc.info,  Node: Merged Signals,  Next: Nonreentrancy,  Prev: Signals in Handler,  Up: Defining Handlers
 
-A.2.2.3 How Many Arguments Were Supplied
+24.4.5 Signals Close Together Merge into One
+--------------------------------------------
+
+If multiple signals of the same type are delivered to your process
+before your signal handler has a chance to be invoked at all, the
+handler may only be invoked once, as if only a single signal had
+arrived.  In effect, the signals merge into one.  This situation can
+arise when the signal is blocked, or in a multiprocessing environment
+where the system is busy running some other processes while the signals
+are delivered.  This means, for example, that you cannot reliably use a
+signal handler to count signals.  The only distinction you can reliably
+make is whether at least one signal has arrived since a given time in
+the past.
+
+   Here is an example of a handler for 'SIGCHLD' that compensates for
+the fact that the number of signals received may not equal the number of
+child processes that generate them.  It assumes that the program keeps
+track of all the child processes with a chain of structures as follows:
+
+     struct process
+     {
+       struct process *next;
+       /* The process ID of this child.  */
+       int pid;
+       /* The descriptor of the pipe or pseudo terminal
+          on which output comes from this child.  */
+       int input_descriptor;
+       /* Nonzero if this process has stopped or terminated.  */
+       sig_atomic_t have_status;
+       /* The status of this child; 0 if running,
+          otherwise a status value from 'waitpid'.  */
+       int status;
+     };
+
+     struct process *process_list;
+
+   This example also uses a flag to indicate whether signals have
+arrived since some time in the past--whenever the program last cleared
+it to zero.
+
+     /* Nonzero means some child's status has changed
+        so look at 'process_list' for the details.  */
+     int process_status_change;
+
+   Here is the handler itself:
+
+     void
+     sigchld_handler (int signo)
+     {
+       int old_errno = errno;
+
+       while (1) {
+         register int pid;
+         int w;
+         struct process *p;
+
+         /* Keep asking for a status until we get a definitive result.  */
+         do
+           {
+             errno = 0;
+             pid = waitpid (WAIT_ANY, &w, WNOHANG | WUNTRACED);
+           }
+         while (pid <= 0 && errno == EINTR);
+
+         if (pid <= 0) {
+           /* A real failure means there are no more
+              stopped or terminated child processes, so return.  */
+           errno = old_errno;
+           return;
+         }
+
+         /* Find the process that signaled us, and record its status.  */
+
+         for (p = process_list; p; p = p->next)
+           if (p->pid == pid) {
+             p->status = w;
+             /* Indicate that the 'status' field
+                has data to look at.  We do this only after storing it.  */
+             p->have_status = 1;
+
+             /* If process has terminated, stop waiting for its output.  */
+             if (WIFSIGNALED (w) || WIFEXITED (w))
+               if (p->input_descriptor)
+                 FD_CLR (p->input_descriptor, &input_wait_mask);
+
+             /* The program should check this flag from time to time
+                to see if there is any news in 'process_list'.  */
+             ++process_status_change;
+           }
+
+         /* Loop around to handle all the processes
+            that have something to tell us.  */
+       }
+     }
+
+   Here is the proper way to check the flag 'process_status_change':
+
+     if (process_status_change) {
+       struct process *p;
+       process_status_change = 0;
+       for (p = process_list; p; p = p->next)
+         if (p->have_status) {
+           ... Examine 'p->status' ...
+         }
+     }
+
+It is vital to clear the flag before examining the list; otherwise, if a
+signal were delivered just before the clearing of the flag, and after
+the appropriate element of the process list had been checked, the status
+change would go unnoticed until the next signal arrived to set the flag
+again.  You could, of course, avoid this problem by blocking the signal
+while scanning the list, but it is much more elegant to guarantee
+correctness by doing things in the right order.
+
+   The loop which checks process status avoids examining 'p->status'
+until it sees that status has been validly stored.  This is to make sure
+that the status cannot change in the middle of accessing it.  Once
+'p->have_status' is set, it means that the child process is stopped or
+terminated, and in either case, it cannot stop or terminate again until
+the program has taken notice.  *Note Atomic Usage::, for more
+information about coping with interruptions during accesses of a
+variable.
+
+   Here is another way you can test whether the handler has run since
+the last time you checked.  This technique uses a counter which is never
+changed outside the handler.  Instead of clearing the count, the program
+remembers the previous value and sees whether it has changed since the
+previous check.  The advantage of this method is that different parts of
+the program can check independently, each part checking whether there
+has been a signal since that part last checked.
+
+     sig_atomic_t process_status_change;
+
+     sig_atomic_t last_process_status_change;
+
+     ...
+     {
+       sig_atomic_t prev = last_process_status_change;
+       last_process_status_change = process_status_change;
+       if (last_process_status_change != prev) {
+         struct process *p;
+         for (p = process_list; p; p = p->next)
+           if (p->have_status) {
+             ... Examine 'p->status' ...
+           }
+       }
+     }
+
+
+File: libc.info,  Node: Nonreentrancy,  Next: Atomic Data Access,  Prev: Merged Signals,  Up: Defining Handlers
+
+24.4.6 Signal Handling and Nonreentrant Functions
+-------------------------------------------------
+
+Handler functions usually don't do very much.  The best practice is to
+write a handler that does nothing but set an external variable that the
+program checks regularly, and leave all serious work to the program.
+This is best because the handler can be called asynchronously, at
+unpredictable times--perhaps in the middle of a primitive function, or
+even between the beginning and the end of a C operator that requires
+multiple instructions.  The data structures being manipulated might
+therefore be in an inconsistent state when the handler function is
+invoked.  Even copying one 'int' variable into another can take two
+instructions on most machines.
+
+   This means you have to be very careful about what you do in a signal
+handler.
+
+   * If your handler needs to access any global variables from your
+     program, declare those variables 'volatile'.  This tells the
+     compiler that the value of the variable might change
+     asynchronously, and inhibits certain optimizations that would be
+     invalidated by such modifications.
+
+   * If you call a function in the handler, make sure it is "reentrant"
+     with respect to signals, or else make sure that the signal cannot
+     interrupt a call to a related function.
+
+   A function can be non-reentrant if it uses memory that is not on the
+stack.
+
+   * If a function uses a static variable or a global variable, or a
+     dynamically-allocated object that it finds for itself, then it is
+     non-reentrant and any two calls to the function can interfere.
+
+     For example, suppose that the signal handler uses 'gethostbyname'.
+     This function returns its value in a static object, reusing the
+     same object each time.  If the signal happens to arrive during a
+     call to 'gethostbyname', or even after one (while the program is
+     still using the value), it will clobber the value that the program
+     asked for.
+
+     However, if the program does not use 'gethostbyname' or any other
+     function that returns information in the same object, or if it
+     always blocks signals around each use, then you are safe.
+
+     There are a large number of library functions that return values in
+     a fixed object, always reusing the same object in this fashion, and
+     all of them cause the same problem.  Function descriptions in this
+     manual always mention this behavior.
+
+   * If a function uses and modifies an object that you supply, then it
+     is potentially non-reentrant; two calls can interfere if they use
+     the same object.
+
+     This case arises when you do I/O using streams.  Suppose that the
+     signal handler prints a message with 'fprintf'.  Suppose that the
+     program was in the middle of an 'fprintf' call using the same
+     stream when the signal was delivered.  Both the signal handler's
+     message and the program's data could be corrupted, because both
+     calls operate on the same data structure--the stream itself.
+
+     However, if you know that the stream that the handler uses cannot
+     possibly be used by the program at a time when signals can arrive,
+     then you are safe.  It is no problem if the program uses some other
+     stream.
+
+   * On most systems, 'malloc' and 'free' are not reentrant, because
+     they use a static data structure which records what memory blocks
+     are free.  As a result, no library functions that allocate or free
+     memory are reentrant.  This includes functions that allocate space
+     to store a result.
+
+     The best way to avoid the need to allocate memory in a handler is
+     to allocate in advance space for signal handlers to use.
+
+     The best way to avoid freeing memory in a handler is to flag or
+     record the objects to be freed, and have the program check from
+     time to time whether anything is waiting to be freed.  But this
+     must be done with care, because placing an object on a chain is not
+     atomic, and if it is interrupted by another signal handler that
+     does the same thing, you could "lose" one of the objects.
+
+   * Any function that modifies 'errno' is non-reentrant, but you can
+     correct for this: in the handler, save the original value of
+     'errno' and restore it before returning normally.  This prevents
+     errors that occur within the signal handler from being confused
+     with errors from system calls at the point the program is
+     interrupted to run the handler.
+
+     This technique is generally applicable; if you want to call in a
+     handler a function that modifies a particular object in memory, you
+     can make this safe by saving and restoring that object.
+
+   * Merely reading from a memory object is safe provided that you can
+     deal with any of the values that might appear in the object at a
+     time when the signal can be delivered.  Keep in mind that
+     assignment to some data types requires more than one instruction,
+     which means that the handler could run "in the middle of" an
+     assignment to the variable if its type is not atomic.  *Note Atomic
+     Data Access::.
+
+   * Merely writing into a memory object is safe as long as a sudden
+     change in the value, at any time when the handler might run, will
+     not disturb anything.
+
+
+File: libc.info,  Node: Atomic Data Access,  Prev: Nonreentrancy,  Up: Defining Handlers
+
+24.4.7 Atomic Data Access and Signal Handling
+---------------------------------------------
+
+Whether the data in your application concerns atoms, or mere text, you
+have to be careful about the fact that access to a single datum is not
+necessarily "atomic".  This means that it can take more than one
+instruction to read or write a single object.  In such cases, a signal
+handler might be invoked in the middle of reading or writing the object.
+
+   There are three ways you can cope with this problem.  You can use
+data types that are always accessed atomically; you can carefully
+arrange that nothing untoward happens if an access is interrupted, or
+you can block all signals around any access that had better not be
+interrupted (*note Blocking Signals::).
+
+* Menu:
+
+* Non-atomic Example::		A program illustrating interrupted access.
+* Types: Atomic Types.		Data types that guarantee no interruption.
+* Usage: Atomic Usage.		Proving that interruption is harmless.
+
+
+File: libc.info,  Node: Non-atomic Example,  Next: Atomic Types,  Up: Atomic Data Access
+
+24.4.7.1 Problems with Non-Atomic Access
 ........................................
 
-There is no general way for a function to determine the number and type
-of the optional arguments it was called with.  So whoever designs the
-function typically designs a convention for the caller to specify the
-number and type of arguments.  It is up to you to define an appropriate
-calling convention for each variadic function, and write all calls
-accordingly.
+Here is an example which shows what can happen if a signal handler runs
+in the middle of modifying a variable.  (Interrupting the reading of a
+variable can also lead to paradoxical results, but here we only show
+writing.)
 
-   One kind of calling convention is to pass the number of optional
-arguments as one of the fixed arguments.  This convention works provided
-all of the optional arguments are of the same type.
-
-   A similar alternative is to have one of the required arguments be a
-bit mask, with a bit for each possible purpose for which an optional
-argument might be supplied.  You would test the bits in a predefined
-sequence; if the bit is set, fetch the value of the next argument,
-otherwise use a default value.
-
-   A required argument can be used as a pattern to specify both the
-number and types of the optional arguments.  The format string argument
-to `printf' is one example of this (*note Formatted Output Functions::).
-
-   Another possibility is to pass an "end marker" value as the last
-optional argument.  For example, for a function that manipulates an
-arbitrary number of pointer arguments, a null pointer might indicate the
-end of the argument list.  (This assumes that a null pointer isn't
-otherwise meaningful to the function.)  The `execl' function works in
-just this way; see *note Executing a File::.
-
-
-File: libc.info,  Node: Calling Variadics,  Next: Argument Macros,  Prev: How Many Arguments,  Up: How Variadic
-
-A.2.2.4 Calling Variadic Functions
-..................................
-
-You don't have to do anything special to call a variadic function.
-Just put the arguments (required arguments, followed by optional ones)
-inside parentheses, separated by commas, as usual.  But you must declare
-the function with a prototype and know how the argument values are
-converted.
-
-   In principle, functions that are _defined_ to be variadic must also
-be _declared_ to be variadic using a function prototype whenever you
-call them.  (*Note Variadic Prototypes::, for how.)  This is because
-some C compilers use a different calling convention to pass the same set
-of argument values to a function depending on whether that function
-takes variable arguments or fixed arguments.
-
-   In practice, the GNU C compiler always passes a given set of argument
-types in the same way regardless of whether they are optional or
-required.  So, as long as the argument types are self-promoting, you can
-safely omit declaring them.  Usually it is a good idea to declare the
-argument types for variadic functions, and indeed for all functions.
-But there are a few functions which it is extremely convenient not to
-have to declare as variadic--for example, `open' and `printf'.
-
-   Since the prototype doesn't specify types for optional arguments, in
-a call to a variadic function the "default argument promotions" are
-performed on the optional argument values.  This means the objects of
-type `char' or `short int' (whether signed or not) are promoted to
-either `int' or `unsigned int', as appropriate; and that objects of
-type `float' are promoted to type `double'.  So, if the caller passes a
-`char' as an optional argument, it is promoted to an `int', and the
-function can access it with `va_arg (AP, int)'.
-
-   Conversion of the required arguments is controlled by the function
-prototype in the usual way: the argument expression is converted to the
-declared argument type as if it were being assigned to a variable of
-that type.
-
-
-File: libc.info,  Node: Argument Macros,  Prev: Calling Variadics,  Up: How Variadic
-
-A.2.2.5 Argument Access Macros
-..............................
-
-Here are descriptions of the macros used to retrieve variable arguments.
-These macros are defined in the header file `stdarg.h'.  
-
- -- Data Type: va_list
-     The type `va_list' is used for argument pointer variables.
-
- -- Macro: void va_start (va_list AP, LAST-REQUIRED)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This macro initializes the argument pointer variable AP to point
-     to the first of the optional arguments of the current function;
-     LAST-REQUIRED must be the last required argument to the function.
-
- -- Macro: TYPE va_arg (va_list AP, TYPE)
-     Preliminary: | MT-Safe race:ap | AS-Safe | AC-Unsafe corrupt |
-     *Note POSIX Safety Concepts::.
-
-     The `va_arg' macro returns the value of the next optional argument,
-     and modifies the value of AP to point to the subsequent argument.
-     Thus, successive uses of `va_arg' return successive optional
-     arguments.
-
-     The type of the value returned by `va_arg' is TYPE as specified in
-     the call.  TYPE must be a self-promoting type (not `char' or
-     `short int' or `float') that matches the type of the actual
-     argument.
-
- -- Macro: void va_end (va_list AP)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     This ends the use of AP.  After a `va_end' call, further `va_arg'
-     calls with the same AP may not work.  You should invoke `va_end'
-     before returning from the function in which `va_start' was invoked
-     with the same AP argument.
-
-     In the GNU C Library, `va_end' does nothing, and you need not ever
-     use it except for reasons of portability.
-
-
-   Sometimes it is necessary to parse the list of parameters more than
-once or one wants to remember a certain position in the parameter list.
-To do this, one will have to make a copy of the current value of the
-argument.  But `va_list' is an opaque type and one cannot necessarily
-assign the value of one variable of type `va_list' to another variable
-of the same type.
-
- -- Macro: void va_copy (va_list DEST, va_list SRC)
- -- Macro: void __va_copy (va_list DEST, va_list SRC)
-     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
-     Concepts::.
-
-     The `va_copy' macro allows copying of objects of type `va_list'
-     even if this is not an integral type.  The argument pointer in
-     DEST is initialized to point to the same argument as the pointer
-     in SRC.
-
-     This macro was added in ISO C99.  When building for strict
-     conformance to ISO C90 (`gcc -ansi'), it is not available.  The
-     macro `__va_copy' is available as a GNU extension in any standards
-     mode; before GCC 3.0, it was the only macro for this functionality.
-
-   If you want to use `va_copy' and be portable to pre-C99 systems, you
-should always be prepared for the possibility that this macro will not
-be available.  On architectures where a simple assignment is invalid,
-hopefully `va_copy' _will_ be available, so one should always write
-something like this if concerned about pre-C99 portability:
-
-     {
-       va_list ap, save;
-       ...
-     #ifdef va_copy
-       va_copy (save, ap);
-     #else
-       save = ap;
-     #endif
-       ...
-     }
-
-
-File: libc.info,  Node: Variadic Example,  Prev: How Variadic,  Up: Variadic Functions
-
-A.2.3 Example of a Variadic Function
-------------------------------------
-
-Here is a complete sample function that accepts a variable number of
-arguments.  The first argument to the function is the count of remaining
-arguments, which are added up and the result returned.  While trivial,
-this function is sufficient to illustrate how to use the variable
-arguments facility.
-
-
-     #include <stdarg.h>
+     #include <signal.h>
      #include <stdio.h>
 
-     int
-     add_em_up (int count,...)
+     volatile struct two_words { int a, b; } memory;
+
+     void
+     handler(int signum)
      {
-       va_list ap;
-       int i, sum;
-
-       va_start (ap, count);         /* Initialize the argument list. */
-
-       sum = 0;
-       for (i = 0; i < count; i++)
-         sum += va_arg (ap, int);    /* Get the next argument value. */
-
-       va_end (ap);                  /* Clean up. */
-       return sum;
+        printf ("%d,%d\n", memory.a, memory.b);
+        alarm (1);
      }
 
      int
      main (void)
      {
-       /* This call prints 16. */
-       printf ("%d\n", add_em_up (3, 5, 5, 6));
+        static struct two_words zeros = { 0, 0 }, ones = { 1, 1 };
+        signal (SIGALRM, handler);
+        memory = zeros;
+        alarm (1);
+        while (1)
+          {
+            memory = zeros;
+            memory = ones;
+          }
+     }
 
-       /* This call prints 55. */
-       printf ("%d\n", add_em_up (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
+   This program fills 'memory' with zeros, ones, zeros, ones,
+alternating forever; meanwhile, once per second, the alarm signal
+handler prints the current contents.  (Calling 'printf' in the handler
+is safe in this program because it is certainly not being called outside
+the handler when the signal happens.)
+
+   Clearly, this program can print a pair of zeros or a pair of ones.
+But that's not all it can do!  On most machines, it takes several
+instructions to store a new value in 'memory', and the value is stored
+one word at a time.  If the signal is delivered in between these
+instructions, the handler might find that 'memory.a' is zero and
+'memory.b' is one (or vice versa).
+
+   On some machines it may be possible to store a new value in 'memory'
+with just one instruction that cannot be interrupted.  On these
+machines, the handler will always print two zeros or two ones.
+
+
+File: libc.info,  Node: Atomic Types,  Next: Atomic Usage,  Prev: Non-atomic Example,  Up: Atomic Data Access
+
+24.4.7.2 Atomic Types
+.....................
+
+To avoid uncertainty about interrupting access to a variable, you can
+use a particular data type for which access is always atomic:
+'sig_atomic_t'.  Reading and writing this data type is guaranteed to
+happen in a single instruction, so there's no way for a handler to run
+"in the middle" of an access.
+
+   The type 'sig_atomic_t' is always an integer data type, but which one
+it is, and how many bits it contains, may vary from machine to machine.
+
+ -- Data Type: sig_atomic_t
+     This is an integer data type.  Objects of this type are always
+     accessed atomically.
+
+   In practice, you can assume that 'int' is atomic.  You can also
+assume that pointer types are atomic; that is very convenient.  Both of
+these assumptions are true on all of the machines that the GNU C Library
+supports and on all POSIX systems we know of.
+
+
+File: libc.info,  Node: Atomic Usage,  Prev: Atomic Types,  Up: Atomic Data Access
+
+24.4.7.3 Atomic Usage Patterns
+..............................
+
+Certain patterns of access avoid any problem even if an access is
+interrupted.  For example, a flag which is set by the handler, and
+tested and cleared by the main program from time to time, is always safe
+even if access actually requires two instructions.  To show that this is
+so, we must consider each access that could be interrupted, and show
+that there is no problem if it is interrupted.
+
+   An interrupt in the middle of testing the flag is safe because either
+it's recognized to be nonzero, in which case the precise value doesn't
+matter, or it will be seen to be nonzero the next time it's tested.
+
+   An interrupt in the middle of clearing the flag is no problem because
+either the value ends up zero, which is what happens if a signal comes
+in just before the flag is cleared, or the value ends up nonzero, and
+subsequent events occur as if the signal had come in just after the flag
+was cleared.  As long as the code handles both of these cases properly,
+it can also handle a signal in the middle of clearing the flag.  (This
+is an example of the sort of reasoning you need to do to figure out
+whether non-atomic usage is safe.)
+
+   Sometimes you can insure uninterrupted access to one object by
+protecting its use with another object, perhaps one whose type
+guarantees atomicity.  *Note Merged Signals::, for an example.
+
+
+File: libc.info,  Node: Interrupted Primitives,  Next: Generating Signals,  Prev: Defining Handlers,  Up: Signal Handling
+
+24.5 Primitives Interrupted by Signals
+======================================
+
+A signal can arrive and be handled while an I/O primitive such as 'open'
+or 'read' is waiting for an I/O device.  If the signal handler returns,
+the system faces the question: what should happen next?
+
+   POSIX specifies one approach: make the primitive fail right away.
+The error code for this kind of failure is 'EINTR'.  This is flexible,
+but usually inconvenient.  Typically, POSIX applications that use signal
+handlers must check for 'EINTR' after each library function that can
+return it, in order to try the call again.  Often programmers forget to
+check, which is a common source of error.
+
+   The GNU C Library provides a convenient way to retry a call after a
+temporary failure, with the macro 'TEMP_FAILURE_RETRY':
+
+ -- Macro: TEMP_FAILURE_RETRY (EXPRESSION)
+     This macro evaluates EXPRESSION once, and examines its value as
+     type 'long int'.  If the value equals '-1', that indicates a
+     failure and 'errno' should be set to show what kind of failure.  If
+     it fails and reports error code 'EINTR', 'TEMP_FAILURE_RETRY'
+     evaluates it again, and over and over until the result is not a
+     temporary failure.
+
+     The value returned by 'TEMP_FAILURE_RETRY' is whatever value
+     EXPRESSION produced.
+
+   BSD avoids 'EINTR' entirely and provides a more convenient approach:
+to restart the interrupted primitive, instead of making it fail.  If you
+choose this approach, you need not be concerned with 'EINTR'.
+
+   You can choose either approach with the GNU C Library.  If you use
+'sigaction' to establish a signal handler, you can specify how that
+handler should behave.  If you specify the 'SA_RESTART' flag, return
+from that handler will resume a primitive; otherwise, return from that
+handler will cause 'EINTR'.  *Note Flags for Sigaction::.
+
+   Another way to specify the choice is with the 'siginterrupt'
+function.  *Note BSD Handler::.
+
+   When you don't specify with 'sigaction' or 'siginterrupt' what a
+particular handler should do, it uses a default choice.  The default
+choice in the GNU C Library depends on the feature test macros you have
+defined.  If you define '_BSD_SOURCE' or '_GNU_SOURCE' before calling
+'signal', the default is to resume primitives; otherwise, the default is
+to make them fail with 'EINTR'.  (The library contains alternate
+versions of the 'signal' function, and the feature test macros determine
+which one you really call.)  *Note Feature Test Macros::.
+
+   The description of each primitive affected by this issue lists
+'EINTR' among the error codes it can return.
+
+   There is one situation where resumption never happens no matter which
+choice you make: when a data-transfer function such as 'read' or 'write'
+is interrupted by a signal after transferring part of the data.  In this
+case, the function returns the number of bytes already transferred,
+indicating partial success.
+
+   This might at first appear to cause unreliable behavior on
+record-oriented devices (including datagram sockets; *note Datagrams::),
+where splitting one 'read' or 'write' into two would read or write two
+records.  Actually, there is no problem, because interruption after a
+partial transfer cannot happen on such devices; they always transfer an
+entire record in one burst, with no waiting once data transfer has
+started.
+
+
+File: libc.info,  Node: Generating Signals,  Next: Blocking Signals,  Prev: Interrupted Primitives,  Up: Signal Handling
+
+24.6 Generating Signals
+=======================
+
+Besides signals that are generated as a result of a hardware trap or
+interrupt, your program can explicitly send signals to itself or to
+another process.
+
+* Menu:
+
+* Signaling Yourself::          A process can send a signal to itself.
+* Signaling Another Process::   Send a signal to another process.
+* Permission for kill::         Permission for using 'kill'.
+* Kill Example::                Using 'kill' for Communication.
+
+
+File: libc.info,  Node: Signaling Yourself,  Next: Signaling Another Process,  Up: Generating Signals
+
+24.6.1 Signaling Yourself
+-------------------------
+
+A process can send itself a signal with the 'raise' function.  This
+function is declared in 'signal.h'.
+
+ -- Function: int raise (int SIGNUM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'raise' function sends the signal SIGNUM to the calling
+     process.  It returns zero if successful and a nonzero value if it
+     fails.  About the only reason for failure would be if the value of
+     SIGNUM is invalid.
+
+ -- Function: int gsignal (int SIGNUM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'gsignal' function does the same thing as 'raise'; it is
+     provided only for compatibility with SVID.
+
+   One convenient use for 'raise' is to reproduce the default behavior
+of a signal that you have trapped.  For instance, suppose a user of your
+program types the SUSP character (usually 'C-z'; *note Special
+Characters::) to send it an interactive stop signal ('SIGTSTP'), and you
+want to clean up some internal data buffers before stopping.  You might
+set this up like this:
+
+     #include <signal.h>
+
+     /* When a stop signal arrives, set the action back to the default
+        and then resend the signal after doing cleanup actions. */
+
+     void
+     tstp_handler (int sig)
+     {
+       signal (SIGTSTP, SIG_DFL);
+       /* Do cleanup actions here. */
+       ...
+       raise (SIGTSTP);
+     }
+
+     /* When the process is continued again, restore the signal handler. */
+
+     void
+     cont_handler (int sig)
+     {
+       signal (SIGCONT, cont_handler);
+       signal (SIGTSTP, tstp_handler);
+     }
+
+     /* Enable both handlers during program initialization. */
+
+     int
+     main (void)
+     {
+       signal (SIGCONT, cont_handler);
+       signal (SIGTSTP, tstp_handler);
+       ...
+     }
+
+   *Portability note:* 'raise' was invented by the ISO C committee.
+Older systems may not support it, so using 'kill' may be more portable.
+*Note Signaling Another Process::.
+
+
+File: libc.info,  Node: Signaling Another Process,  Next: Permission for kill,  Prev: Signaling Yourself,  Up: Generating Signals
+
+24.6.2 Signaling Another Process
+--------------------------------
+
+The 'kill' function can be used to send a signal to another process.  In
+spite of its name, it can be used for a lot of things other than causing
+a process to terminate.  Some examples of situations where you might
+want to send signals between processes are:
+
+   * A parent process starts a child to perform a task--perhaps having
+     the child running an infinite loop--and then terminates the child
+     when the task is no longer needed.
+
+   * A process executes as part of a group, and needs to terminate or
+     notify the other processes in the group when an error or other
+     event occurs.
+
+   * Two processes need to synchronize while working together.
+
+   This section assumes that you know a little bit about how processes
+work.  For more information on this subject, see *note Processes::.
+
+   The 'kill' function is declared in 'signal.h'.
+
+ -- Function: int kill (pid_t PID, int SIGNUM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'kill' function sends the signal SIGNUM to the process or
+     process group specified by PID.  Besides the signals listed in
+     *note Standard Signals::, SIGNUM can also have a value of zero to
+     check the validity of the PID.
+
+     The PID specifies the process or process group to receive the
+     signal:
+
+     'PID > 0'
+          The process whose identifier is PID.
+
+     'PID == 0'
+          All processes in the same process group as the sender.
+
+     'PID < -1'
+          The process group whose identifier is -PID.
+
+     'PID == -1'
+          If the process is privileged, send the signal to all processes
+          except for some special system processes.  Otherwise, send the
+          signal to all processes with the same effective user ID.
+
+     A process can send a signal to itself with a call like
+     'kill (getpid(), SIGNUM)'.  If 'kill' is used by a process to send
+     a signal to itself, and the signal is not blocked, then 'kill'
+     delivers at least one signal (which might be some other pending
+     unblocked signal instead of the signal SIGNUM) to that process
+     before it returns.
+
+     The return value from 'kill' is zero if the signal can be sent
+     successfully.  Otherwise, no signal is sent, and a value of '-1' is
+     returned.  If PID specifies sending a signal to several processes,
+     'kill' succeeds if it can send the signal to at least one of them.
+     There's no way you can tell which of the processes got the signal
+     or whether all of them did.
+
+     The following 'errno' error conditions are defined for this
+     function:
+
+     'EINVAL'
+          The SIGNUM argument is an invalid or unsupported number.
+
+     'EPERM'
+          You do not have the privilege to send a signal to the process
+          or any of the processes in the process group named by PID.
+
+     'ESRCH'
+          The PID argument does not refer to an existing process or
+          group.
+
+ -- Function: int killpg (int PGID, int SIGNUM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This is similar to 'kill', but sends signal SIGNUM to the process
+     group PGID.  This function is provided for compatibility with BSD;
+     using 'kill' to do this is more portable.
+
+   As a simple example of 'kill', the call 'kill (getpid (), SIG)' has
+the same effect as 'raise (SIG)'.
+
+
+File: libc.info,  Node: Permission for kill,  Next: Kill Example,  Prev: Signaling Another Process,  Up: Generating Signals
+
+24.6.3 Permission for using 'kill'
+----------------------------------
+
+There are restrictions that prevent you from using 'kill' to send
+signals to any random process.  These are intended to prevent antisocial
+behavior such as arbitrarily killing off processes belonging to another
+user.  In typical use, 'kill' is used to pass signals between parent,
+child, and sibling processes, and in these situations you normally do
+have permission to send signals.  The only common exception is when you
+run a setuid program in a child process; if the program changes its real
+UID as well as its effective UID, you may not have permission to send a
+signal.  The 'su' program does this.
+
+   Whether a process has permission to send a signal to another process
+is determined by the user IDs of the two processes.  This concept is
+discussed in detail in *note Process Persona::.
+
+   Generally, for a process to be able to send a signal to another
+process, either the sending process must belong to a privileged user
+(like 'root'), or the real or effective user ID of the sending process
+must match the real or effective user ID of the receiving process.  If
+the receiving process has changed its effective user ID from the
+set-user-ID mode bit on its process image file, then the owner of the
+process image file is used in place of its current effective user ID. In
+some implementations, a parent process might be able to send signals to
+a child process even if the user ID's don't match, and other
+implementations might enforce other restrictions.
+
+   The 'SIGCONT' signal is a special case.  It can be sent if the sender
+is part of the same session as the receiver, regardless of user IDs.
+
+
+File: libc.info,  Node: Kill Example,  Prev: Permission for kill,  Up: Generating Signals
+
+24.6.4 Using 'kill' for Communication
+-------------------------------------
+
+Here is a longer example showing how signals can be used for
+interprocess communication.  This is what the 'SIGUSR1' and 'SIGUSR2'
+signals are provided for.  Since these signals are fatal by default, the
+process that is supposed to receive them must trap them through 'signal'
+or 'sigaction'.
+
+   In this example, a parent process forks a child process and then
+waits for the child to complete its initialization.  The child process
+tells the parent when it is ready by sending it a 'SIGUSR1' signal,
+using the 'kill' function.
+
+
+     #include <signal.h>
+     #include <stdio.h>
+     #include <sys/types.h>
+     #include <unistd.h>
+
+     /* When a 'SIGUSR1' signal arrives, set this variable. */
+     volatile sig_atomic_t usr_interrupt = 0;
+
+     void
+     synch_signal (int sig)
+     {
+       usr_interrupt = 1;
+     }
+
+     /* The child process executes this function. */
+     void
+     child_function (void)
+     {
+       /* Perform initialization. */
+       printf ("I'm here!!!  My pid is %d.\n", (int) getpid ());
+
+       /* Let parent know you're done. */
+       kill (getppid (), SIGUSR1);
+
+       /* Continue with execution. */
+       puts ("Bye, now....");
+       exit (0);
+     }
+
+     int
+     main (void)
+     {
+       struct sigaction usr_action;
+       sigset_t block_mask;
+       pid_t child_id;
+
+       /* Establish the signal handler. */
+       sigfillset (&block_mask);
+       usr_action.sa_handler = synch_signal;
+       usr_action.sa_mask = block_mask;
+       usr_action.sa_flags = 0;
+       sigaction (SIGUSR1, &usr_action, NULL);
+
+       /* Create the child process. */
+       child_id = fork ();
+       if (child_id == 0)
+         child_function ();          /* Does not return. */
+
+       /* Busy wait for the child to send a signal. */
+       while (!usr_interrupt)
+         ;
+
+       /* Now continue execution. */
+       puts ("That's all, folks!");
 
        return 0;
      }
 
-
-File: libc.info,  Node: Null Pointer Constant,  Next: Important Data Types,  Prev: Variadic Functions,  Up: Language Features
-
-A.3 Null Pointer Constant
-=========================
-
-The null pointer constant is guaranteed not to point to any real object.
-You can assign it to any pointer variable since it has type `void *'.
-The preferred way to write a null pointer constant is with `NULL'.
-
- -- Macro: void * NULL
-     This is a null pointer constant.
-
-   You can also use `0' or `(void *)0' as a null pointer constant, but
-using `NULL' is cleaner because it makes the purpose of the constant
-more evident.
-
-   If you use the null pointer constant as a function argument, then for
-complete portability you should make sure that the function has a
-prototype declaration.  Otherwise, if the target machine has two
-different pointer representations, the compiler won't know which
-representation to use for that argument.  You can avoid the problem by
-explicitly casting the constant to the proper pointer type, but we
-recommend instead adding a prototype for the function you are calling.
+   This example uses a busy wait, which is bad, because it wastes CPU
+cycles that other programs could otherwise use.  It is better to ask the
+system to wait until the signal arrives.  See the example in *note
+Waiting for a Signal::.
 
 
-File: libc.info,  Node: Important Data Types,  Next: Data Type Measurements,  Prev: Null Pointer Constant,  Up: Language Features
+File: libc.info,  Node: Blocking Signals,  Next: Waiting for a Signal,  Prev: Generating Signals,  Up: Signal Handling
 
-A.4 Important Data Types
-========================
+24.7 Blocking Signals
+=====================
 
-The result of subtracting two pointers in C is always an integer, but
-the precise data type varies from C compiler to C compiler.  Likewise,
-the data type of the result of `sizeof' also varies between compilers.
-ISO defines standard aliases for these two types, so you can refer to
-them in a portable fashion.  They are defined in the header file
-`stddef.h'.  
+Blocking a signal means telling the operating system to hold it and
+deliver it later.  Generally, a program does not block signals
+indefinitely--it might as well ignore them by setting their actions to
+'SIG_IGN'.  But it is useful to block signals briefly, to prevent them
+from interrupting sensitive operations.  For instance:
 
- -- Data Type: ptrdiff_t
-     This is the signed integer type of the result of subtracting two
-     pointers.  For example, with the declaration `char *p1, *p2;', the
-     expression `p2 - p1' is of type `ptrdiff_t'.  This will probably
-     be one of the standard signed integer types (`short int', `int' or
-     `long int'), but might be a nonstandard type that exists only for
-     this purpose.
+   * You can use the 'sigprocmask' function to block signals while you
+     modify global variables that are also modified by the handlers for
+     these signals.
 
- -- Data Type: size_t
-     This is an unsigned integer type used to represent the sizes of
-     objects.  The result of the `sizeof' operator is of this type, and
-     functions such as `malloc' (*note Unconstrained Allocation::) and
-     `memcpy' (*note Copying and Concatenation::) accept arguments of
-     this type to specify object sizes.  On systems using the GNU C
-     Library, this will be `unsigned int' or `unsigned long int'.
-
-     *Usage Note:* `size_t' is the preferred way to declare any
-     arguments or variables that hold the size of an object.
-
-   *Compatibility Note:* Implementations of C before the advent of
-ISO C generally used `unsigned int' for representing object sizes and
-`int' for pointer subtraction results.  They did not necessarily define
-either `size_t' or `ptrdiff_t'.  Unix systems did define `size_t', in
-`sys/types.h', but the definition was usually a signed type.
-
-
-File: libc.info,  Node: Data Type Measurements,  Prev: Important Data Types,  Up: Language Features
-
-A.5 Data Type Measurements
-==========================
-
-Most of the time, if you choose the proper C data type for each object
-in your program, you need not be concerned with just how it is
-represented or how many bits it uses.  When you do need such
-information, the C language itself does not provide a way to get it.
-The header files `limits.h' and `float.h' contain macros which give you
-this information in full detail.
+   * You can set 'sa_mask' in your 'sigaction' call to block certain
+     signals while a particular signal handler runs.  This way, the
+     signal handler can run without being interrupted itself by signals.
 
 * Menu:
 
-* Width of Type::           How many bits does an integer type hold?
-* Range of Type::           What are the largest and smallest values
-			     that an integer type can hold?
-* Floating Type Macros::    Parameters that measure the floating point types.
-* Structure Measurement::   Getting measurements on structure types.
+* Why Block::                           The purpose of blocking signals.
+* Signal Sets::                         How to specify which signals to
+                                         block.
+* Process Signal Mask::                 Blocking delivery of signals to your
+				         process during normal execution.
+* Testing for Delivery::                Blocking to Test for Delivery of
+                                         a Signal.
+* Blocking for Handler::                Blocking additional signals while a
+				         handler is being run.
+* Checking for Pending Signals::        Checking for Pending Signals
+* Remembering a Signal::                How you can get almost the same
+                                         effect as blocking a signal, by
+                                         handling it and setting a flag
+                                         to be tested later.
 
 
-File: libc.info,  Node: Width of Type,  Next: Range of Type,  Up: Data Type Measurements
+File: libc.info,  Node: Why Block,  Next: Signal Sets,  Up: Blocking Signals
 
-A.5.1 Computing the Width of an Integer Data Type
--------------------------------------------------
+24.7.1 Why Blocking Signals is Useful
+-------------------------------------
 
-The most common reason that a program needs to know how many bits are in
-an integer type is for using an array of `long int' as a bit vector.
-You can access the bit at index N with
+Temporary blocking of signals with 'sigprocmask' gives you a way to
+prevent interrupts during critical parts of your code.  If signals
+arrive in that part of the program, they are delivered later, after you
+unblock them.
 
-     vector[N / LONGBITS] & (1 << (N % LONGBITS))
+   One example where this is useful is for sharing data between a signal
+handler and the rest of the program.  If the type of the data is not
+'sig_atomic_t' (*note Atomic Data Access::), then the signal handler
+could run when the rest of the program has only half finished reading or
+writing the data.  This would lead to confusing consequences.
 
-provided you define `LONGBITS' as the number of bits in a `long int'.
+   To make the program reliable, you can prevent the signal handler from
+running while the rest of the program is examining or modifying that
+data--by blocking the appropriate signal around the parts of the program
+that touch the data.
 
-   There is no operator in the C language that can give you the number
-of bits in an integer data type.  But you can compute it from the macro
-`CHAR_BIT', defined in the header file `limits.h'.
+   Blocking signals is also necessary when you want to perform a certain
+action only if a signal has not arrived.  Suppose that the handler for
+the signal sets a flag of type 'sig_atomic_t'; you would like to test
+the flag and perform the action if the flag is not set.  This is
+unreliable.  Suppose the signal is delivered immediately after you test
+the flag, but before the consequent action: then the program will
+perform the action even though the signal has arrived.
 
-`CHAR_BIT'
-     This is the number of bits in a `char'--eight, on most systems.
-     The value has type `int'.
-
-     You can compute the number of bits in any data type TYPE like this:
-
-          sizeof (TYPE) * CHAR_BIT
+   The only way to test reliably for whether a signal has yet arrived is
+to test while the signal is blocked.
 
 
-File: libc.info,  Node: Range of Type,  Next: Floating Type Macros,  Prev: Width of Type,  Up: Data Type Measurements
+File: libc.info,  Node: Signal Sets,  Next: Process Signal Mask,  Prev: Why Block,  Up: Blocking Signals
 
-A.5.2 Range of an Integer Type
-------------------------------
+24.7.2 Signal Sets
+------------------
 
-Suppose you need to store an integer value which can range from zero to
-one million.  Which is the smallest type you can use?  There is no
-general rule; it depends on the C compiler and target machine.  You can
-use the `MIN' and `MAX' macros in `limits.h' to determine which type
-will work.
+All of the signal blocking functions use a data structure called a
+"signal set" to specify what signals are affected.  Thus, every activity
+involves two stages: creating the signal set, and then passing it as an
+argument to a library function.
 
-   Each signed integer type has a pair of macros which give the smallest
-and largest values that it can hold.  Each unsigned integer type has one
-such macro, for the maximum value; the minimum value is, of course,
-zero.
+   These facilities are declared in the header file 'signal.h'.
 
-   The values of these macros are all integer constant expressions.  The
-`MAX' and `MIN' macros for `char' and `short int' types have values of
-type `int'.  The `MAX' and `MIN' macros for the other types have values
-of the same type described by the macro--thus, `ULONG_MAX' has type
-`unsigned long int'.
+ -- Data Type: sigset_t
+     The 'sigset_t' data type is used to represent a signal set.
+     Internally, it may be implemented as either an integer or structure
+     type.
 
-`SCHAR_MIN'
-     This is the minimum value that can be represented by a
-     `signed char'.
+     For portability, use only the functions described in this section
+     to initialize, change, and retrieve information from 'sigset_t'
+     objects--don't try to manipulate them directly.
 
-`SCHAR_MAX'
-`UCHAR_MAX'
-     These are the maximum values that can be represented by a
-     `signed char' and `unsigned char', respectively.
+   There are two ways to initialize a signal set.  You can initially
+specify it to be empty with 'sigemptyset' and then add specified signals
+individually.  Or you can specify it to be full with 'sigfillset' and
+then delete specified signals individually.
 
-`CHAR_MIN'
-     This is the minimum value that can be represented by a `char'.
-     It's equal to `SCHAR_MIN' if `char' is signed, or zero otherwise.
+   You must always initialize the signal set with one of these two
+functions before using it in any other way.  Don't try to set all the
+signals explicitly because the 'sigset_t' object might include some
+other information (like a version field) that needs to be initialized as
+well.  (In addition, it's not wise to put into your program an
+assumption that the system has no signals aside from the ones you know
+about.)
 
-`CHAR_MAX'
-     This is the maximum value that can be represented by a `char'.
-     It's equal to `SCHAR_MAX' if `char' is signed, or `UCHAR_MAX'
-     otherwise.
-
-`SHRT_MIN'
-     This is the minimum value that can be represented by a
-     `signed short int'.  On most machines that the GNU C Library runs
-     on, `short' integers are 16-bit quantities.
-
-`SHRT_MAX'
-`USHRT_MAX'
-     These are the maximum values that can be represented by a
-     `signed short int' and `unsigned short int', respectively.
-
-`INT_MIN'
-     This is the minimum value that can be represented by a
-     `signed int'.  On most machines that the GNU C Library runs on, an
-     `int' is a 32-bit quantity.
-
-`INT_MAX'
-`UINT_MAX'
-     These are the maximum values that can be represented by,
-     respectively, the type `signed int' and the type `unsigned int'.
-
-`LONG_MIN'
-     This is the minimum value that can be represented by a
-     `signed long int'.  On most machines that the GNU C Library runs
-     on, `long' integers are 32-bit quantities, the same size as `int'.
-
-`LONG_MAX'
-`ULONG_MAX'
-     These are the maximum values that can be represented by a
-     `signed long int' and `unsigned long int', respectively.
-
-`LLONG_MIN'
-     This is the minimum value that can be represented by a
-     `signed long long int'.  On most machines that the GNU C Library
-     runs on, `long long' integers are 64-bit quantities.
-
-`LLONG_MAX'
-`ULLONG_MAX'
-     These are the maximum values that can be represented by a `signed
-     long long int' and `unsigned long long int', respectively.
-
-`LONG_LONG_MIN'
-`LONG_LONG_MAX'
-`ULONG_LONG_MAX'
-     These are obsolete names for `LLONG_MIN', `LLONG_MAX', and
-     `ULLONG_MAX'.  They are only available if `_GNU_SOURCE' is defined
-     (*note Feature Test Macros::).  In GCC versions prior to 3.0,
-     these were the only names available.
-
-`WCHAR_MAX'
-     This is the maximum value that can be represented by a `wchar_t'.
-     *Note Extended Char Intro::.
-
-   The header file `limits.h' also defines some additional constants
-that parameterize various operating system and file system limits.
-These constants are described in *note System Configuration::.
-
-
-File: libc.info,  Node: Floating Type Macros,  Next: Structure Measurement,  Prev: Range of Type,  Up: Data Type Measurements
-
-A.5.3 Floating Type Macros
---------------------------
-
-The specific representation of floating point numbers varies from
-machine to machine.  Because floating point numbers are represented
-internally as approximate quantities, algorithms for manipulating
-floating point data often need to take account of the precise details of
-the machine's floating point representation.
-
-   Some of the functions in the C library itself need this information;
-for example, the algorithms for printing and reading floating point
-numbers (*note I/O on Streams::) and for calculating trigonometric and
-irrational functions (*note Mathematics::) use it to avoid round-off
-error and loss of accuracy.  User programs that implement numerical
-analysis techniques also often need this information in order to
-minimize or compute error bounds.
-
-   The header file `float.h' describes the format used by your machine.
-
-* Menu:
-
-* Floating Point Concepts::     Definitions of terminology.
-* Floating Point Parameters::   Details of specific macros.
-* IEEE Floating Point::         The measurements for one common
-                                 representation.
-
-
-File: libc.info,  Node: Floating Point Concepts,  Next: Floating Point Parameters,  Up: Floating Type Macros
-
-A.5.3.1 Floating Point Representation Concepts
-..............................................
-
-This section introduces the terminology for describing floating point
-representations.
-
-   You are probably already familiar with most of these concepts in
-terms of scientific or exponential notation for floating point numbers.
-For example, the number `123456.0' could be expressed in exponential
-notation as `1.23456e+05', a shorthand notation indicating that the
-mantissa `1.23456' is multiplied by the base `10' raised to power `5'.
-
-   More formally, the internal representation of a floating point number
-can be characterized in terms of the following parameters:
-
-   * The "sign" is either `-1' or `1'.
-
-   * The "base" or "radix" for exponentiation, an integer greater than
-     `1'.  This is a constant for a particular representation.
-
-   * The "exponent" to which the base is raised.  The upper and lower
-     bounds of the exponent value are constants for a particular
-     representation.
-
-     Sometimes, in the actual bits representing the floating point
-     number, the exponent is "biased" by adding a constant to it, to
-     make it always be represented as an unsigned quantity.  This is
-     only important if you have some reason to pick apart the bit
-     fields making up the floating point number by hand, which is
-     something for which the GNU C Library provides no support.  So
-     this is ignored in the discussion that follows.
-
-   * The "mantissa" or "significand" is an unsigned integer which is a
-     part of each floating point number.
-
-   * The "precision" of the mantissa.  If the base of the representation
-     is B, then the precision is the number of base-B digits in the
-     mantissa.  This is a constant for a particular representation.
-
-     Many floating point representations have an implicit "hidden bit"
-     in the mantissa.  This is a bit which is present virtually in the
-     mantissa, but not stored in memory because its value is always 1
-     in a normalized number.  The precision figure (see above) includes
-     any hidden bits.
-
-     Again, the GNU C Library provides no facilities for dealing with
-     such low-level aspects of the representation.
-
-   The mantissa of a floating point number represents an implicit
-fraction whose denominator is the base raised to the power of the
-precision.  Since the largest representable mantissa is one less than
-this denominator, the value of the fraction is always strictly less
-than `1'.  The mathematical value of a floating point number is then
-the product of this fraction, the sign, and the base raised to the
-exponent.
-
-   We say that the floating point number is "normalized" if the
-fraction is at least `1/B', where B is the base.  In other words, the
-mantissa would be too large to fit if it were multiplied by the base.
-Non-normalized numbers are sometimes called "denormal"; they contain
-less precision than the representation normally can hold.
-
-   If the number is not normalized, then you can subtract `1' from the
-exponent while multiplying the mantissa by the base, and get another
-floating point number with the same value.  "Normalization" consists of
-doing this repeatedly until the number is normalized.  Two distinct
-normalized floating point numbers cannot be equal in value.
-
-   (There is an exception to this rule: if the mantissa is zero, it is
-considered normalized.  Another exception happens on certain machines
-where the exponent is as small as the representation can hold.  Then it
-is impossible to subtract `1' from the exponent, so a number may be
-normalized even if its fraction is less than `1/B'.)
-
-
-File: libc.info,  Node: Floating Point Parameters,  Next: IEEE Floating Point,  Prev: Floating Point Concepts,  Up: Floating Type Macros
-
-A.5.3.2 Floating Point Parameters
-.................................
-
-These macro definitions can be accessed by including the header file
-`float.h' in your program.
-
-   Macro names starting with `FLT_' refer to the `float' type, while
-names beginning with `DBL_' refer to the `double' type and names
-beginning with `LDBL_' refer to the `long double' type.  (If GCC does
-not support `long double' as a distinct data type on a target machine
-then the values for the `LDBL_' constants are equal to the
-corresponding constants for the `double' type.)
-
-   Of these macros, only `FLT_RADIX' is guaranteed to be a constant
-expression.  The other macros listed here cannot be reliably used in
-places that require constant expressions, such as `#if' preprocessing
-directives or in the dimensions of static arrays.
-
-   Although the ISO C standard specifies minimum and maximum values for
-most of these parameters, the GNU C implementation uses whatever values
-describe the floating point representation of the target machine.  So in
-principle GNU C actually satisfies the ISO C requirements only if the
-target machine is suitable.  In practice, all the machines currently
-supported are suitable.
-
-`FLT_ROUNDS'
-     This value characterizes the rounding mode for floating point
-     addition.  The following values indicate standard rounding modes:
-
-    `-1'
-          The mode is indeterminable.
-
-    `0'
-          Rounding is towards zero.
-
-    `1'
-          Rounding is to the nearest number.
-
-    `2'
-          Rounding is towards positive infinity.
-
-    `3'
-          Rounding is towards negative infinity.
-
-     Any other value represents a machine-dependent nonstandard rounding
-     mode.
-
-     On most machines, the value is `1', in accordance with the IEEE
-     standard for floating point.
-
-     Here is a table showing how certain values round for each possible
-     value of `FLT_ROUNDS', if the other aspects of the representation
-     match the IEEE single-precision standard.
-
-                          0      1             2             3
-           1.00000003    1.0    1.0           1.00000012    1.0
-           1.00000007    1.0    1.00000012    1.00000012    1.0
-          -1.00000003   -1.0   -1.0          -1.0          -1.00000012
-          -1.00000007   -1.0   -1.00000012   -1.0          -1.00000012
-
-`FLT_RADIX'
-     This is the value of the base, or radix, of the exponent
-     representation.  This is guaranteed to be a constant expression,
-     unlike the other macros described in this section.  The value is 2
-     on all machines we know of except the IBM 360 and derivatives.
-
-`FLT_MANT_DIG'
-     This is the number of base-`FLT_RADIX' digits in the floating point
-     mantissa for the `float' data type.  The following expression
-     yields `1.0' (even though mathematically it should not) due to the
-     limited number of mantissa digits:
-
-          float radix = FLT_RADIX;
-
-          1.0f + 1.0f / radix / radix / ... / radix
-
-     where `radix' appears `FLT_MANT_DIG' times.
-
-`DBL_MANT_DIG'
-`LDBL_MANT_DIG'
-     This is the number of base-`FLT_RADIX' digits in the floating point
-     mantissa for the data types `double' and `long double',
-     respectively.
-
-`FLT_DIG'
-     This is the number of decimal digits of precision for the `float'
-     data type.  Technically, if P and B are the precision and base
-     (respectively) for the representation, then the decimal precision
-     Q is the maximum number of decimal digits such that any floating
-     point number with Q base 10 digits can be rounded to a floating
-     point number with P base B digits and back again, without change
-     to the Q decimal digits.
-
-     The value of this macro is supposed to be at least `6', to satisfy
-     ISO C.
-
-`DBL_DIG'
-`LDBL_DIG'
-     These are similar to `FLT_DIG', but for the data types `double'
-     and `long double', respectively.  The values of these macros are
-     supposed to be at least `10'.
-
-`FLT_MIN_EXP'
-     This is the smallest possible exponent value for type `float'.
-     More precisely, is the minimum negative integer such that the value
-     `FLT_RADIX' raised to this power minus 1 can be represented as a
-     normalized floating point number of type `float'.
-
-`DBL_MIN_EXP'
-`LDBL_MIN_EXP'
-     These are similar to `FLT_MIN_EXP', but for the data types
-     `double' and `long double', respectively.
-
-`FLT_MIN_10_EXP'
-     This is the minimum negative integer such that `10' raised to this
-     power minus 1 can be represented as a normalized floating point
-     number of type `float'.  This is supposed to be `-37' or even less.
-
-`DBL_MIN_10_EXP'
-`LDBL_MIN_10_EXP'
-     These are similar to `FLT_MIN_10_EXP', but for the data types
-     `double' and `long double', respectively.
-
-`FLT_MAX_EXP'
-     This is the largest possible exponent value for type `float'.  More
-     precisely, this is the maximum positive integer such that value
-     `FLT_RADIX' raised to this power minus 1 can be represented as a
-     floating point number of type `float'.
-
-`DBL_MAX_EXP'
-`LDBL_MAX_EXP'
-     These are similar to `FLT_MAX_EXP', but for the data types
-     `double' and `long double', respectively.
-
-`FLT_MAX_10_EXP'
-     This is the maximum positive integer such that `10' raised to this
-     power minus 1 can be represented as a normalized floating point
-     number of type `float'.  This is supposed to be at least `37'.
-
-`DBL_MAX_10_EXP'
-`LDBL_MAX_10_EXP'
-     These are similar to `FLT_MAX_10_EXP', but for the data types
-     `double' and `long double', respectively.
-
-`FLT_MAX'
-     The value of this macro is the maximum number representable in type
-     `float'.  It is supposed to be at least `1E+37'.  The value has
-     type `float'.
-
-     The smallest representable number is `- FLT_MAX'.
-
-`DBL_MAX'
-`LDBL_MAX'
-     These are similar to `FLT_MAX', but for the data types `double'
-     and `long double', respectively.  The type of the macro's value is
-     the same as the type it describes.
-
-`FLT_MIN'
-     The value of this macro is the minimum normalized positive floating
-     point number that is representable in type `float'.  It is supposed
-     to be no more than `1E-37'.
-
-`DBL_MIN'
-`LDBL_MIN'
-     These are similar to `FLT_MIN', but for the data types `double'
-     and `long double', respectively.  The type of the macro's value is
-     the same as the type it describes.
-
-`FLT_EPSILON'
-     This is the difference between 1 and the smallest floating point
-     number of type `float' that is greater than 1.  It's supposed to
-     be no greater than `1E-5'.
-
-`DBL_EPSILON'
-`LDBL_EPSILON'
-     These are similar to `FLT_EPSILON', but for the data types
-     `double' and `long double', respectively.  The type of the macro's
-     value is the same as the type it describes.  The values are not
-     supposed to be greater than `1E-9'.
-
-
-File: libc.info,  Node: IEEE Floating Point,  Prev: Floating Point Parameters,  Up: Floating Type Macros
-
-A.5.3.3 IEEE Floating Point
-...........................
-
-Here is an example showing how the floating type measurements come out
-for the most common floating point representation, specified by the
-`IEEE Standard for Binary Floating Point Arithmetic (ANSI/IEEE Std
-754-1985)'.  Nearly all computers designed since the 1980s use this
-format.
-
-   The IEEE single-precision float representation uses a base of 2.
-There is a sign bit, a mantissa with 23 bits plus one hidden bit (so
-the total precision is 24 base-2 digits), and an 8-bit exponent that
-can represent values in the range -125 to 128, inclusive.
-
-   So, for an implementation that uses this representation for the
-`float' data type, appropriate values for the corresponding parameters
-are:
-
-     FLT_RADIX                             2
-     FLT_MANT_DIG                         24
-     FLT_DIG                               6
-     FLT_MIN_EXP                        -125
-     FLT_MIN_10_EXP                      -37
-     FLT_MAX_EXP                         128
-     FLT_MAX_10_EXP                      +38
-     FLT_MIN                 1.17549435E-38F
-     FLT_MAX                 3.40282347E+38F
-     FLT_EPSILON             1.19209290E-07F
-
-   Here are the values for the `double' data type:
-
-     DBL_MANT_DIG                         53
-     DBL_DIG                              15
-     DBL_MIN_EXP                       -1021
-     DBL_MIN_10_EXP                     -307
-     DBL_MAX_EXP                        1024
-     DBL_MAX_10_EXP                      308
-     DBL_MAX         1.7976931348623157E+308
-     DBL_MIN         2.2250738585072014E-308
-     DBL_EPSILON     2.2204460492503131E-016
-
-
-File: libc.info,  Node: Structure Measurement,  Prev: Floating Type Macros,  Up: Data Type Measurements
-
-A.5.4 Structure Field Offset Measurement
-----------------------------------------
-
-You can use `offsetof' to measure the location within a structure type
-of a particular structure member.
-
- -- Macro: size_t offsetof (TYPE, MEMBER)
+ -- Function: int sigemptyset (sigset_t *SET)
      Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
      Concepts::.
 
-     This expands to an integer constant expression that is the offset
-     of the structure member named MEMBER in the structure type TYPE.
-     For example, `offsetof (struct s, elem)' is the offset, in bytes,
-     of the member `elem' in a `struct s'.
+     This function initializes the signal set SET to exclude all of the
+     defined signals.  It always returns '0'.
 
-     This macro won't work if MEMBER is a bit field; you get an error
-     from the C compiler in that case.
+ -- Function: int sigfillset (sigset_t *SET)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function initializes the signal set SET to include all of the
+     defined signals.  Again, the return value is '0'.
+
+ -- Function: int sigaddset (sigset_t *SET, int SIGNUM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function adds the signal SIGNUM to the signal set SET.  All
+     'sigaddset' does is modify SET; it does not block or unblock any
+     signals.
+
+     The return value is '0' on success and '-1' on failure.  The
+     following 'errno' error condition is defined for this function:
+
+     'EINVAL'
+          The SIGNUM argument doesn't specify a valid signal.
+
+ -- Function: int sigdelset (sigset_t *SET, int SIGNUM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function removes the signal SIGNUM from the signal set SET.
+     All 'sigdelset' does is modify SET; it does not block or unblock
+     any signals.  The return value and error conditions are the same as
+     for 'sigaddset'.
+
+   Finally, there is a function to test what signals are in a signal
+set:
+
+ -- Function: int sigismember (const sigset_t *SET, int SIGNUM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     The 'sigismember' function tests whether the signal SIGNUM is a
+     member of the signal set SET.  It returns '1' if the signal is in
+     the set, '0' if not, and '-1' if there is an error.
+
+     The following 'errno' error condition is defined for this function:
+
+     'EINVAL'
+          The SIGNUM argument doesn't specify a valid signal.
+
+
+File: libc.info,  Node: Process Signal Mask,  Next: Testing for Delivery,  Prev: Signal Sets,  Up: Blocking Signals
+
+24.7.3 Process Signal Mask
+--------------------------
+
+The collection of signals that are currently blocked is called the
+"signal mask".  Each process has its own signal mask.  When you create a
+new process (*note Creating a Process::), it inherits its parent's mask.
+You can block or unblock signals with total flexibility by modifying the
+signal mask.
+
+   The prototype for the 'sigprocmask' function is in 'signal.h'.
+
+   Note that you must not use 'sigprocmask' in multi-threaded processes,
+because each thread has its own signal mask and there is no single
+process signal mask.  According to POSIX, the behavior of 'sigprocmask'
+in a multi-threaded process is "unspecified".  Instead, use
+'pthread_sigmask'.
+
+ -- Function: int sigprocmask (int HOW, const sigset_t *restrict SET,
+          sigset_t *restrict OLDSET)
+     Preliminary: | MT-Unsafe race:sigprocmask/bsd(SIG_UNBLOCK) |
+     AS-Unsafe lock/hurd | AC-Unsafe lock/hurd | *Note POSIX Safety
+     Concepts::.
+
+     The 'sigprocmask' function is used to examine or change the calling
+     process's signal mask.  The HOW argument determines how the signal
+     mask is changed, and must be one of the following values:
+
+     'SIG_BLOCK'
+          Block the signals in 'set'--add them to the existing mask.  In
+          other words, the new mask is the union of the existing mask
+          and SET.
+
+     'SIG_UNBLOCK'
+          Unblock the signals in SET--remove them from the existing
+          mask.
+
+     'SIG_SETMASK'
+          Use SET for the mask; ignore the previous value of the mask.
+
+     The last argument, OLDSET, is used to return information about the
+     old process signal mask.  If you just want to change the mask
+     without looking at it, pass a null pointer as the OLDSET argument.
+     Similarly, if you want to know what's in the mask without changing
+     it, pass a null pointer for SET (in this case the HOW argument is
+     not significant).  The OLDSET argument is often used to remember
+     the previous signal mask in order to restore it later.  (Since the
+     signal mask is inherited over 'fork' and 'exec' calls, you can't
+     predict what its contents are when your program starts running.)
+
+     If invoking 'sigprocmask' causes any pending signals to be
+     unblocked, at least one of those signals is delivered to the
+     process before 'sigprocmask' returns.  The order in which pending
+     signals are delivered is not specified, but you can control the
+     order explicitly by making multiple 'sigprocmask' calls to unblock
+     various signals one at a time.
+
+     The 'sigprocmask' function returns '0' if successful, and '-1' to
+     indicate an error.  The following 'errno' error conditions are
+     defined for this function:
+
+     'EINVAL'
+          The HOW argument is invalid.
+
+     You can't block the 'SIGKILL' and 'SIGSTOP' signals, but if the
+     signal set includes these, 'sigprocmask' just ignores them instead
+     of returning an error status.
+
+     Remember, too, that blocking program error signals such as 'SIGFPE'
+     leads to undesirable results for signals generated by an actual
+     program error (as opposed to signals sent with 'raise' or 'kill').
+     This is because your program may be too broken to be able to
+     continue executing to a point where the signal is unblocked again.
+     *Note Program Error Signals::.
+
+
+File: libc.info,  Node: Testing for Delivery,  Next: Blocking for Handler,  Prev: Process Signal Mask,  Up: Blocking Signals
+
+24.7.4 Blocking to Test for Delivery of a Signal
+------------------------------------------------
+
+Now for a simple example.  Suppose you establish a handler for 'SIGALRM'
+signals that sets a flag whenever a signal arrives, and your main
+program checks this flag from time to time and then resets it.  You can
+prevent additional 'SIGALRM' signals from arriving in the meantime by
+wrapping the critical part of the code with calls to 'sigprocmask', like
+this:
+
+     /* This variable is set by the SIGALRM signal handler. */
+     volatile sig_atomic_t flag = 0;
+
+     int
+     main (void)
+     {
+       sigset_t block_alarm;
+
+       ...
+
+       /* Initialize the signal mask. */
+       sigemptyset (&block_alarm);
+       sigaddset (&block_alarm, SIGALRM);
+
+       while (1)
+         {
+           /* Check if a signal has arrived; if so, reset the flag. */
+           sigprocmask (SIG_BLOCK, &block_alarm, NULL);
+           if (flag)
+             {
+               ACTIONS-IF-NOT-ARRIVED
+               flag = 0;
+             }
+           sigprocmask (SIG_UNBLOCK, &block_alarm, NULL);
+
+           ...
+         }
+     }
+
+
+File: libc.info,  Node: Blocking for Handler,  Next: Checking for Pending Signals,  Prev: Testing for Delivery,  Up: Blocking Signals
+
+24.7.5 Blocking Signals for a Handler
+-------------------------------------
+
+When a signal handler is invoked, you usually want it to be able to
+finish without being interrupted by another signal.  From the moment the
+handler starts until the moment it finishes, you must block signals that
+might confuse it or corrupt its data.
+
+   When a handler function is invoked on a signal, that signal is
+automatically blocked (in addition to any other signals that are already
+in the process's signal mask) during the time the handler is running.
+If you set up a handler for 'SIGTSTP', for instance, then the arrival of
+that signal forces further 'SIGTSTP' signals to wait during the
+execution of the handler.
+
+   However, by default, other kinds of signals are not blocked; they can
+arrive during handler execution.
+
+   The reliable way to block other kinds of signals during the execution
+of the handler is to use the 'sa_mask' member of the 'sigaction'
+structure.
+
+   Here is an example:
+
+     #include <signal.h>
+     #include <stddef.h>
+
+     void catch_stop ();
+
+     void
+     install_handler (void)
+     {
+       struct sigaction setup_action;
+       sigset_t block_mask;
+
+       sigemptyset (&block_mask);
+       /* Block other terminal-generated signals while handler runs. */
+       sigaddset (&block_mask, SIGINT);
+       sigaddset (&block_mask, SIGQUIT);
+       setup_action.sa_handler = catch_stop;
+       setup_action.sa_mask = block_mask;
+       setup_action.sa_flags = 0;
+       sigaction (SIGTSTP, &setup_action, NULL);
+     }
+
+   This is more reliable than blocking the other signals explicitly in
+the code for the handler.  If you block signals explicitly in the
+handler, you can't avoid at least a short interval at the beginning of
+the handler where they are not yet blocked.
+
+   You cannot remove signals from the process's current mask using this
+mechanism.  However, you can make calls to 'sigprocmask' within your
+handler to block or unblock signals as you wish.
+
+   In any case, when the handler returns, the system restores the mask
+that was in place before the handler was entered.  If any signals that
+become unblocked by this restoration are pending, the process will
+receive those signals immediately, before returning to the code that was
+interrupted.
+
+
+File: libc.info,  Node: Checking for Pending Signals,  Next: Remembering a Signal,  Prev: Blocking for Handler,  Up: Blocking Signals
+
+24.7.6 Checking for Pending Signals
+-----------------------------------
+
+You can find out which signals are pending at any time by calling
+'sigpending'.  This function is declared in 'signal.h'.
+
+ -- Function: int sigpending (sigset_t *SET)
+     Preliminary: | MT-Safe | AS-Unsafe lock/hurd | AC-Unsafe lock/hurd
+     | *Note POSIX Safety Concepts::.
+
+     The 'sigpending' function stores information about pending signals
+     in SET.  If there is a pending signal that is blocked from
+     delivery, then that signal is a member of the returned set.  (You
+     can test whether a particular signal is a member of this set using
+     'sigismember'; see *note Signal Sets::.)
+
+     The return value is '0' if successful, and '-1' on failure.
+
+   Testing whether a signal is pending is not often useful.  Testing
+when that signal is not blocked is almost certainly bad design.
+
+   Here is an example.
+
+     #include <signal.h>
+     #include <stddef.h>
+
+     sigset_t base_mask, waiting_mask;
+
+     sigemptyset (&base_mask);
+     sigaddset (&base_mask, SIGINT);
+     sigaddset (&base_mask, SIGTSTP);
+
+     /* Block user interrupts while doing other processing. */
+     sigprocmask (SIG_SETMASK, &base_mask, NULL);
+     ...
+
+     /* After a while, check to see whether any signals are pending. */
+     sigpending (&waiting_mask);
+     if (sigismember (&waiting_mask, SIGINT)) {
+       /* User has tried to kill the process. */
+     }
+     else if (sigismember (&waiting_mask, SIGTSTP)) {
+       /* User has tried to stop the process. */
+     }
+
+   Remember that if there is a particular signal pending for your
+process, additional signals of that same type that arrive in the
+meantime might be discarded.  For example, if a 'SIGINT' signal is
+pending when another 'SIGINT' signal arrives, your program will probably
+only see one of them when you unblock this signal.
+
+   *Portability Note:* The 'sigpending' function is new in POSIX.1.
+Older systems have no equivalent facility.
+
+
+File: libc.info,  Node: Remembering a Signal,  Prev: Checking for Pending Signals,  Up: Blocking Signals
+
+24.7.7 Remembering a Signal to Act On Later
+-------------------------------------------
+
+Instead of blocking a signal using the library facilities, you can get
+almost the same results by making the handler set a flag to be tested
+later, when you "unblock".  Here is an example:
+
+     /* If this flag is nonzero, don't handle the signal right away. */
+     volatile sig_atomic_t signal_pending;
+
+     /* This is nonzero if a signal arrived and was not handled. */
+     volatile sig_atomic_t defer_signal;
+
+     void
+     handler (int signum)
+     {
+       if (defer_signal)
+         signal_pending = signum;
+       else
+         ... /* "Really" handle the signal. */
+     }
+
+     ...
+
+     void
+     update_mumble (int frob)
+     {
+       /* Prevent signals from having immediate effect. */
+       defer_signal++;
+       /* Now update 'mumble', without worrying about interruption. */
+       mumble.a = 1;
+       mumble.b = hack ();
+       mumble.c = frob;
+       /* We have updated 'mumble'.  Handle any signal that came in. */
+       defer_signal--;
+       if (defer_signal == 0 && signal_pending != 0)
+         raise (signal_pending);
+     }
+
+   Note how the particular signal that arrives is stored in
+'signal_pending'.  That way, we can handle several types of inconvenient
+signals with the same mechanism.
+
+   We increment and decrement 'defer_signal' so that nested critical
+sections will work properly; thus, if 'update_mumble' were called with
+'signal_pending' already nonzero, signals would be deferred not only
+within 'update_mumble', but also within the caller.  This is also why we
+do not check 'signal_pending' if 'defer_signal' is still nonzero.
+
+   The incrementing and decrementing of 'defer_signal' each require more
+than one instruction; it is possible for a signal to happen in the
+middle.  But that does not cause any problem.  If the signal happens
+early enough to see the value from before the increment or decrement,
+that is equivalent to a signal which came before the beginning of the
+increment or decrement, which is a case that works properly.
+
+   It is absolutely vital to decrement 'defer_signal' before testing
+'signal_pending', because this avoids a subtle bug.  If we did these
+things in the other order, like this,
+
+       if (defer_signal == 1 && signal_pending != 0)
+         raise (signal_pending);
+       defer_signal--;
+
+then a signal arriving in between the 'if' statement and the decrement
+would be effectively "lost" for an indefinite amount of time.  The
+handler would merely set 'defer_signal', but the program having already
+tested this variable, it would not test the variable again.
+
+   Bugs like these are called "timing errors".  They are especially bad
+because they happen only rarely and are nearly impossible to reproduce.
+You can't expect to find them with a debugger as you would find a
+reproducible bug.  So it is worth being especially careful to avoid
+them.
+
+   (You would not be tempted to write the code in this order, given the
+use of 'defer_signal' as a counter which must be tested along with
+'signal_pending'.  After all, testing for zero is cleaner than testing
+for one.  But if you did not use 'defer_signal' as a counter, and gave
+it values of zero and one only, then either order might seem equally
+simple.  This is a further advantage of using a counter for
+'defer_signal': it will reduce the chance you will write the code in the
+wrong order and create a subtle bug.)
+
+
+File: libc.info,  Node: Waiting for a Signal,  Next: Signal Stack,  Prev: Blocking Signals,  Up: Signal Handling
+
+24.8 Waiting for a Signal
+=========================
+
+If your program is driven by external events, or uses signals for
+synchronization, then when it has nothing to do it should probably wait
+until a signal arrives.
+
+* Menu:
+
+* Using Pause::                 The simple way, using 'pause'.
+* Pause Problems::              Why the simple way is often not very good.
+* Sigsuspend::                  Reliably waiting for a specific signal.
+
+
+File: libc.info,  Node: Using Pause,  Next: Pause Problems,  Up: Waiting for a Signal
+
+24.8.1 Using 'pause'
+--------------------
+
+The simple way to wait until a signal arrives is to call 'pause'.
+Please read about its disadvantages, in the following section, before
+you use it.
+
+ -- Function: int pause (void)
+     Preliminary: | MT-Unsafe race:sigprocmask/!bsd!linux | AS-Unsafe
+     lock/hurd | AC-Unsafe lock/hurd | *Note POSIX Safety Concepts::.
+
+     The 'pause' function suspends program execution until a signal
+     arrives whose action is either to execute a handler function, or to
+     terminate the process.
+
+     If the signal causes a handler function to be executed, then
+     'pause' returns.  This is considered an unsuccessful return (since
+     "successful" behavior would be to suspend the program forever), so
+     the return value is '-1'.  Even if you specify that other
+     primitives should resume when a system handler returns (*note
+     Interrupted Primitives::), this has no effect on 'pause'; it always
+     fails when a signal is handled.
+
+     The following 'errno' error conditions are defined for this
+     function:
+
+     'EINTR'
+          The function was interrupted by delivery of a signal.
+
+     If the signal causes program termination, 'pause' doesn't return
+     (obviously).
+
+     This function is a cancellation point in multithreaded programs.
+     This is a problem if the thread allocates some resources (like
+     memory, file descriptors, semaphores or whatever) at the time
+     'pause' is called.  If the thread gets cancelled these resources
+     stay allocated until the program ends.  To avoid this calls to
+     'pause' should be protected using cancellation handlers.
+
+     The 'pause' function is declared in 'unistd.h'.
+
+
+File: libc.info,  Node: Pause Problems,  Next: Sigsuspend,  Prev: Using Pause,  Up: Waiting for a Signal
+
+24.8.2 Problems with 'pause'
+----------------------------
+
+The simplicity of 'pause' can conceal serious timing errors that can
+make a program hang mysteriously.
+
+   It is safe to use 'pause' if the real work of your program is done by
+the signal handlers themselves, and the "main program" does nothing but
+call 'pause'.  Each time a signal is delivered, the handler will do the
+next batch of work that is to be done, and then return, so that the main
+loop of the program can call 'pause' again.
+
+   You can't safely use 'pause' to wait until one more signal arrives,
+and then resume real work.  Even if you arrange for the signal handler
+to cooperate by setting a flag, you still can't use 'pause' reliably.
+Here is an example of this problem:
+
+     /* 'usr_interrupt' is set by the signal handler.  */
+     if (!usr_interrupt)
+       pause ();
+
+     /* Do work once the signal arrives.  */
+     ...
+
+This has a bug: the signal could arrive after the variable
+'usr_interrupt' is checked, but before the call to 'pause'.  If no
+further signals arrive, the process would never wake up again.
+
+   You can put an upper limit on the excess waiting by using 'sleep' in
+a loop, instead of using 'pause'.  (*Note Sleeping::, for more about
+'sleep'.)  Here is what this looks like:
+
+     /* 'usr_interrupt' is set by the signal handler.
+     while (!usr_interrupt)
+       sleep (1);
+
+     /* Do work once the signal arrives.  */
+     ...
+
+   For some purposes, that is good enough.  But with a little more
+complexity, you can wait reliably until a particular signal handler is
+run, using 'sigsuspend'.  *Note Sigsuspend::.
+
+
+File: libc.info,  Node: Sigsuspend,  Prev: Pause Problems,  Up: Waiting for a Signal
+
+24.8.3 Using 'sigsuspend'
+-------------------------
+
+The clean and reliable way to wait for a signal to arrive is to block it
+and then use 'sigsuspend'.  By using 'sigsuspend' in a loop, you can
+wait for certain kinds of signals, while letting other kinds of signals
+be handled by their handlers.
+
+ -- Function: int sigsuspend (const sigset_t *SET)
+     Preliminary: | MT-Unsafe race:sigprocmask/!bsd!linux | AS-Unsafe
+     lock/hurd | AC-Unsafe lock/hurd | *Note POSIX Safety Concepts::.
+
+     This function replaces the process's signal mask with SET and then
+     suspends the process until a signal is delivered whose action is
+     either to terminate the process or invoke a signal handling
+     function.  In other words, the program is effectively suspended
+     until one of the signals that is not a member of SET arrives.
+
+     If the process is woken up by delivery of a signal that invokes a
+     handler function, and the handler function returns, then
+     'sigsuspend' also returns.
+
+     The mask remains SET only as long as 'sigsuspend' is waiting.  The
+     function 'sigsuspend' always restores the previous signal mask when
+     it returns.
+
+     The return value and error conditions are the same as for 'pause'.
+
+   With 'sigsuspend', you can replace the 'pause' or 'sleep' loop in the
+previous section with something completely reliable:
+
+     sigset_t mask, oldmask;
+
+     ...
+
+     /* Set up the mask of signals to temporarily block. */
+     sigemptyset (&mask);
+     sigaddset (&mask, SIGUSR1);
+
+     ...
+
+     /* Wait for a signal to arrive. */
+     sigprocmask (SIG_BLOCK, &mask, &oldmask);
+     while (!usr_interrupt)
+       sigsuspend (&oldmask);
+     sigprocmask (SIG_UNBLOCK, &mask, NULL);
+
+   This last piece of code is a little tricky.  The key point to
+remember here is that when 'sigsuspend' returns, it resets the process's
+signal mask to the original value, the value from before the call to
+'sigsuspend'--in this case, the 'SIGUSR1' signal is once again blocked.
+The second call to 'sigprocmask' is necessary to explicitly unblock this
+signal.
+
+   One other point: you may be wondering why the 'while' loop is
+necessary at all, since the program is apparently only waiting for one
+'SIGUSR1' signal.  The answer is that the mask passed to 'sigsuspend'
+permits the process to be woken up by the delivery of other kinds of
+signals, as well--for example, job control signals.  If the process is
+woken up by a signal that doesn't set 'usr_interrupt', it just suspends
+itself again until the "right" kind of signal eventually arrives.
+
+   This technique takes a few more lines of preparation, but that is
+needed just once for each kind of wait criterion you want to use.  The
+code that actually waits is just four lines.
+
+
+File: libc.info,  Node: Signal Stack,  Next: BSD Signal Handling,  Prev: Waiting for a Signal,  Up: Signal Handling
+
+24.9 Using a Separate Signal Stack
+==================================
+
+A signal stack is a special area of memory to be used as the execution
+stack during signal handlers.  It should be fairly large, to avoid any
+danger that it will overflow in turn; the macro 'SIGSTKSZ' is defined to
+a canonical size for signal stacks.  You can use 'malloc' to allocate
+the space for the stack.  Then call 'sigaltstack' or 'sigstack' to tell
+the system to use that space for the signal stack.
+
+   You don't need to write signal handlers differently in order to use a
+signal stack.  Switching from one stack to the other happens
+automatically.  (Some non-GNU debuggers on some machines may get
+confused if you examine a stack trace while a handler that uses the
+signal stack is running.)
+
+   There are two interfaces for telling the system to use a separate
+signal stack.  'sigstack' is the older interface, which comes from 4.2
+BSD. 'sigaltstack' is the newer interface, and comes from 4.4 BSD. The
+'sigaltstack' interface has the advantage that it does not require your
+program to know which direction the stack grows, which depends on the
+specific machine and operating system.
+
+ -- Data Type: stack_t
+     This structure describes a signal stack.  It contains the following
+     members:
+
+     'void *ss_sp'
+          This points to the base of the signal stack.
+
+     'size_t ss_size'
+          This is the size (in bytes) of the signal stack which 'ss_sp'
+          points to.  You should set this to however much space you
+          allocated for the stack.
+
+          There are two macros defined in 'signal.h' that you should use
+          in calculating this size:
+
+          'SIGSTKSZ'
+               This is the canonical size for a signal stack.  It is
+               judged to be sufficient for normal uses.
+
+          'MINSIGSTKSZ'
+               This is the amount of signal stack space the operating
+               system needs just to implement signal delivery.  The size
+               of a signal stack *must* be greater than this.
+
+               For most cases, just using 'SIGSTKSZ' for 'ss_size' is
+               sufficient.  But if you know how much stack space your
+               program's signal handlers will need, you may want to use
+               a different size.  In this case, you should allocate
+               'MINSIGSTKSZ' additional bytes for the signal stack and
+               increase 'ss_size' accordingly.
+
+     'int ss_flags'
+          This field contains the bitwise OR of these flags:
+
+          'SS_DISABLE'
+               This tells the system that it should not use the signal
+               stack.
+
+          'SS_ONSTACK'
+               This is set by the system, and indicates that the signal
+               stack is currently in use.  If this bit is not set, then
+               signals will be delivered on the normal user stack.
+
+ -- Function: int sigaltstack (const stack_t *restrict STACK, stack_t
+          *restrict OLDSTACK)
+     Preliminary: | MT-Safe | AS-Unsafe lock/hurd | AC-Unsafe lock/hurd
+     | *Note POSIX Safety Concepts::.
+
+     The 'sigaltstack' function specifies an alternate stack for use
+     during signal handling.  When a signal is received by the process
+     and its action indicates that the signal stack is used, the system
+     arranges a switch to the currently installed signal stack while the
+     handler for that signal is executed.
+
+     If OLDSTACK is not a null pointer, information about the currently
+     installed signal stack is returned in the location it points to.
+     If STACK is not a null pointer, then this is installed as the new
+     stack for use by signal handlers.
+
+     The return value is '0' on success and '-1' on failure.  If
+     'sigaltstack' fails, it sets 'errno' to one of these values:
+
+     'EINVAL'
+          You tried to disable a stack that was in fact currently in
+          use.
+
+     'ENOMEM'
+          The size of the alternate stack was too small.  It must be
+          greater than 'MINSIGSTKSZ'.
+
+   Here is the older 'sigstack' interface.  You should use 'sigaltstack'
+instead on systems that have it.
+
+ -- Data Type: struct sigstack
+     This structure describes a signal stack.  It contains the following
+     members:
+
+     'void *ss_sp'
+          This is the stack pointer.  If the stack grows downwards on
+          your machine, this should point to the top of the area you
+          allocated.  If the stack grows upwards, it should point to the
+          bottom.
+
+     'int ss_onstack'
+          This field is true if the process is currently using this
+          stack.
+
+ -- Function: int sigstack (struct sigstack *STACK, struct sigstack
+          *OLDSTACK)
+     Preliminary: | MT-Safe | AS-Unsafe lock/hurd | AC-Unsafe lock/hurd
+     | *Note POSIX Safety Concepts::.
+
+     The 'sigstack' function specifies an alternate stack for use during
+     signal handling.  When a signal is received by the process and its
+     action indicates that the signal stack is used, the system arranges
+     a switch to the currently installed signal stack while the handler
+     for that signal is executed.
+
+     If OLDSTACK is not a null pointer, information about the currently
+     installed signal stack is returned in the location it points to.
+     If STACK is not a null pointer, then this is installed as the new
+     stack for use by signal handlers.
+
+     The return value is '0' on success and '-1' on failure.
+
+
+File: libc.info,  Node: BSD Signal Handling,  Prev: Signal Stack,  Up: Signal Handling
+
+24.10 BSD Signal Handling
+=========================
+
+This section describes alternative signal handling functions derived
+from BSD Unix.  These facilities were an advance, in their time; today,
+they are mostly obsolete, and supported mainly for compatibility with
+BSD Unix.
+
+   There are many similarities between the BSD and POSIX signal handling
+facilities, because the POSIX facilities were inspired by the BSD
+facilities.  Besides having different names for all the functions to
+avoid conflicts, the main differences between the two are:
+
+   * BSD Unix represents signal masks as an 'int' bit mask, rather than
+     as a 'sigset_t' object.
+
+   * The BSD facilities use a different default for whether an
+     interrupted primitive should fail or resume.  The POSIX facilities
+     make system calls fail unless you specify that they should resume.
+     With the BSD facility, the default is to make system calls resume
+     unless you say they should fail.  *Note Interrupted Primitives::.
+
+   The BSD facilities are declared in 'signal.h'.
+
+* Menu:
+
+* BSD Handler::                 BSD Function to Establish a Handler.
+* Blocking in BSD::             BSD Functions for Blocking Signals.
+
+
+File: libc.info,  Node: BSD Handler,  Next: Blocking in BSD,  Up: BSD Signal Handling
+
+24.10.1 BSD Function to Establish a Handler
+-------------------------------------------
+
+ -- Data Type: struct sigvec
+     This data type is the BSD equivalent of 'struct sigaction' (*note
+     Advanced Signal Handling::); it is used to specify signal actions
+     to the 'sigvec' function.  It contains the following members:
+
+     'sighandler_t sv_handler'
+          This is the handler function.
+
+     'int sv_mask'
+          This is the mask of additional signals to be blocked while the
+          handler function is being called.
+
+     'int sv_flags'
+          This is a bit mask used to specify various flags which affect
+          the behavior of the signal.  You can also refer to this field
+          as 'sv_onstack'.
+
+   These symbolic constants can be used to provide values for the
+'sv_flags' field of a 'sigvec' structure.  This field is a bit mask
+value, so you bitwise-OR the flags of interest to you together.
+
+ -- Macro: int SV_ONSTACK
+     If this bit is set in the 'sv_flags' field of a 'sigvec' structure,
+     it means to use the signal stack when delivering the signal.
+
+ -- Macro: int SV_INTERRUPT
+     If this bit is set in the 'sv_flags' field of a 'sigvec' structure,
+     it means that system calls interrupted by this kind of signal
+     should not be restarted if the handler returns; instead, the system
+     calls should return with a 'EINTR' error status.  *Note Interrupted
+     Primitives::.
+
+ -- Macro: int SV_RESETHAND
+     If this bit is set in the 'sv_flags' field of a 'sigvec' structure,
+     it means to reset the action for the signal back to 'SIG_DFL' when
+     the signal is received.
+
+ -- Function: int sigvec (int SIGNUM, const struct sigvec *ACTION,
+          struct sigvec *OLD-ACTION)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This function is the equivalent of 'sigaction' (*note Advanced
+     Signal Handling::); it installs the action ACTION for the signal
+     SIGNUM, returning information about the previous action in effect
+     for that signal in OLD-ACTION.
+
+ -- Function: int siginterrupt (int SIGNUM, int FAILFLAG)
+     Preliminary: | MT-Unsafe const:sigintr | AS-Unsafe | AC-Unsafe
+     corrupt | *Note POSIX Safety Concepts::.
+
+     This function specifies which approach to use when certain
+     primitives are interrupted by handling signal SIGNUM.  If FAILFLAG
+     is false, signal SIGNUM restarts primitives.  If FAILFLAG is true,
+     handling SIGNUM causes these primitives to fail with error code
+     'EINTR'.  *Note Interrupted Primitives::.
+
+
+File: libc.info,  Node: Blocking in BSD,  Prev: BSD Handler,  Up: BSD Signal Handling
+
+24.10.2 BSD Functions for Blocking Signals
+------------------------------------------
+
+ -- Macro: int sigmask (int SIGNUM)
+     Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
+     Concepts::.
+
+     This macro returns a signal mask that has the bit for signal SIGNUM
+     set.  You can bitwise-OR the results of several calls to 'sigmask'
+     together to specify more than one signal.  For example,
+
+          (sigmask (SIGTSTP) | sigmask (SIGSTOP)
+           | sigmask (SIGTTIN) | sigmask (SIGTTOU))
+
+     specifies a mask that includes all the job-control stop signals.
+
+ -- Function: int sigblock (int MASK)
+     Preliminary: | MT-Safe | AS-Unsafe lock/hurd | AC-Unsafe lock/hurd
+     | *Note POSIX Safety Concepts::.
+
+     This function is equivalent to 'sigprocmask' (*note Process Signal
+     Mask::) with a HOW argument of 'SIG_BLOCK': it adds the signals
+     specified by MASK to the calling process's set of blocked signals.
+     The return value is the previous set of blocked signals.
+
+ -- Function: int sigsetmask (int MASK)
+     Preliminary: | MT-Safe | AS-Unsafe lock/hurd | AC-Unsafe lock/hurd
+     | *Note POSIX Safety Concepts::.
+
+     This function equivalent to 'sigprocmask' (*note Process Signal
+     Mask::) with a HOW argument of 'SIG_SETMASK': it sets the calling
+     process's signal mask to MASK.  The return value is the previous
+     set of blocked signals.
+
+ -- Function: int sigpause (int MASK)
+     Preliminary: | MT-Unsafe race:sigprocmask/!bsd!linux | AS-Unsafe
+     lock/hurd | AC-Unsafe lock/hurd | *Note POSIX Safety Concepts::.
+
+     This function is the equivalent of 'sigsuspend' (*note Waiting for
+     a Signal::): it sets the calling process's signal mask to MASK, and
+     waits for a signal to arrive.  On return the previous set of
+     blocked signals is restored.
+
+
+File: libc.info,  Node: Program Basics,  Next: Processes,  Prev: Signal Handling,  Up: Top
+
+25 The Basic Program/System Interface
+*************************************
+
+"Processes" are the primitive units for allocation of system resources.
+Each process has its own address space and (usually) one thread of
+control.  A process executes a program; you can have multiple processes
+executing the same program, but each process has its own copy of the
+program within its own address space and executes it independently of
+the other copies.  Though it may have multiple threads of control within
+the same program and a program may be composed of multiple logically
+separate modules, a process always executes exactly one program.
+
+   Note that we are using a specific definition of "program" for the
+purposes of this manual, which corresponds to a common definition in the
+context of Unix system.  In popular usage, "program" enjoys a much
+broader definition; it can refer for example to a system's kernel, an
+editor macro, a complex package of software, or a discrete section of
+code executing within a process.
+
+   Writing the program is what this manual is all about.  This chapter
+explains the most basic interface between your program and the system
+that runs, or calls, it.  This includes passing of parameters (arguments
+and environment) from the system, requesting basic services from the
+system, and telling the system the program is done.
+
+   A program starts another program with the 'exec' family of system
+calls.  This chapter looks at program startup from the execee's point of
+view.  To see the event from the execor's point of view, see *note
+Executing a File::.
+
+* Menu:
+
+* Program Arguments::           Parsing your program's command-line arguments
+* Environment Variables::       Less direct parameters affecting your program
+* Auxiliary Vector::            Least direct parameters affecting your program
+* System Calls::                Requesting service from the system
+* Program Termination::         Telling the system you're done; return status
+
+
+File: libc.info,  Node: Program Arguments,  Next: Environment Variables,  Up: Program Basics
+
+25.1 Program Arguments
+======================
+
+The system starts a C program by calling the function 'main'.  It is up
+to you to write a function named 'main'--otherwise, you won't even be
+able to link your program without errors.
+
+   In ISO C you can define 'main' either to take no arguments, or to
+take two arguments that represent the command line arguments to the
+program, like this:
+
+     int main (int ARGC, char *ARGV[])
+
+   The command line arguments are the whitespace-separated tokens given
+in the shell command used to invoke the program; thus, in 'cat foo bar',
+the arguments are 'foo' and 'bar'.  The only way a program can look at
+its command line arguments is via the arguments of 'main'.  If 'main'
+doesn't take arguments, then you cannot get at the command line.
+
+   The value of the ARGC argument is the number of command line
+arguments.  The ARGV argument is a vector of C strings; its elements are
+the individual command line argument strings.  The file name of the
+program being run is also included in the vector as the first element;
+the value of ARGC counts this element.  A null pointer always follows
+the last element: 'ARGV[ARGC]' is this null pointer.
+
+   For the command 'cat foo bar', ARGC is 3 and ARGV has three elements,
+'"cat"', '"foo"' and '"bar"'.
+
+   In Unix systems you can define 'main' a third way, using three
+arguments:
+
+     int main (int ARGC, char *ARGV[], char *ENVP[])
+
+   The first two arguments are just the same.  The third argument ENVP
+gives the program's environment; it is the same as the value of
+'environ'.  *Note Environment Variables::.  POSIX.1 does not allow this
+three-argument form, so to be portable it is best to write 'main' to
+take two arguments, and use the value of 'environ'.
+
+* Menu:
+
+* Argument Syntax::             By convention, options start with a hyphen.
+* Parsing Program Arguments::   Ways to parse program options and arguments.
+
+
+File: libc.info,  Node: Argument Syntax,  Next: Parsing Program Arguments,  Up: Program Arguments
+
+25.1.1 Program Argument Syntax Conventions
+------------------------------------------
+
+POSIX recommends these conventions for command line arguments.  'getopt'
+(*note Getopt::) and 'argp_parse' (*note Argp::) make it easy to
+implement them.
+
+   * Arguments are options if they begin with a hyphen delimiter ('-').
+
+   * Multiple options may follow a hyphen delimiter in a single token if
+     the options do not take arguments.  Thus, '-abc' is equivalent to
+     '-a -b -c'.
+
+   * Option names are single alphanumeric characters (as for 'isalnum';
+     *note Classification of Characters::).
+
+   * Certain options require an argument.  For example, the '-o' command
+     of the 'ld' command requires an argument--an output file name.
+
+   * An option and its argument may or may not appear as separate
+     tokens.  (In other words, the whitespace separating them is
+     optional.)  Thus, '-o foo' and '-ofoo' are equivalent.
+
+   * Options typically precede other non-option arguments.
+
+     The implementations of 'getopt' and 'argp_parse' in the GNU C
+     Library normally make it appear as if all the option arguments were
+     specified before all the non-option arguments for the purposes of
+     parsing, even if the user of your program intermixed option and
+     non-option arguments.  They do this by reordering the elements of
+     the ARGV array.  This behavior is nonstandard; if you want to
+     suppress it, define the '_POSIX_OPTION_ORDER' environment variable.
+     *Note Standard Environment::.
+
+   * The argument '--' terminates all options; any following arguments
+     are treated as non-option arguments, even if they begin with a
+     hyphen.
+
+   * A token consisting of a single hyphen character is interpreted as
+     an ordinary non-option argument.  By convention, it is used to
+     specify input from or output to the standard input and output
+     streams.
+
+   * Options may be supplied in any order, or appear multiple times.
+     The interpretation is left up to the particular application
+     program.
+
+   GNU adds "long options" to these conventions.  Long options consist
+of '--' followed by a name made of alphanumeric characters and dashes.
+Option names are typically one to three words long, with hyphens to
+separate words.  Users can abbreviate the option names as long as the
+abbreviations are unique.
+
+   To specify an argument for a long option, write '--NAME=VALUE'.  This
+syntax enables a long option to accept an argument that is itself
+optional.
+
+   Eventually, GNU systems will provide completion for long option names
+in the shell.
+
+
+File: libc.info,  Node: Parsing Program Arguments,  Prev: Argument Syntax,  Up: Program Arguments
+
+25.1.2 Parsing Program Arguments
+--------------------------------
+
+If the syntax for the command line arguments to your program is simple
+enough, you can simply pick the arguments off from ARGV by hand.  But
+unless your program takes a fixed number of arguments, or all of the
+arguments are interpreted in the same way (as file names, for example),
+you are usually better off using 'getopt' (*note Getopt::) or
+'argp_parse' (*note Argp::) to do the parsing.
+
+   'getopt' is more standard (the short-option only version of it is a
+part of the POSIX standard), but using 'argp_parse' is often easier,
+both for very simple and very complex option structures, because it does
+more of the dirty work for you.
+
+* Menu:
+
+* Getopt::                      Parsing program options using 'getopt'.
+* Argp::                        Parsing program options using 'argp_parse'.
+* Suboptions::                  Some programs need more detailed options.
+* Suboptions Example::          This shows how it could be done for 'mount'.
+
+
+File: libc.info,  Node: Getopt,  Next: Argp,  Up: Parsing Program Arguments
+
+25.2 Parsing program options using 'getopt'
+===========================================
+
+The 'getopt' and 'getopt_long' functions automate some of the chore
+involved in parsing typical unix command line options.
+
+* Menu:
+
+* Using Getopt::                Using the 'getopt' function.
+* Example of Getopt::           An example of parsing options with 'getopt'.
+* Getopt Long Options::         GNU suggests utilities accept long-named
+                                 options; here is one way to do.
+* Getopt Long Option Example::  An example of using 'getopt_long'.
+
+
+File: libc.info,  Node: Using Getopt,  Next: Example of Getopt,  Up: Getopt
+
+25.2.1 Using the 'getopt' function
+----------------------------------
+
+Here are the details about how to call the 'getopt' function.  To use
+this facility, your program must include the header file 'unistd.h'.
+
+ -- Variable: int opterr
+     If the value of this variable is nonzero, then 'getopt' prints an
+     error message to the standard error stream if it encounters an
+     unknown option character or an option with a missing required
+     argument.  This is the default behavior.  If you set this variable
+     to zero, 'getopt' does not print any messages, but it still returns
+     the character '?' to indicate an error.
+
+ -- Variable: int optopt
+     When 'getopt' encounters an unknown option character or an option
+     with a missing required argument, it stores that option character
+     in this variable.  You can use this for providing your own
+     diagnostic messages.
+
+ -- Variable: int optind
+     This variable is set by 'getopt' to the index of the next element
+     of the ARGV array to be processed.  Once 'getopt' has found all of
+     the option arguments, you can use this variable to determine where
+     the remaining non-option arguments begin.  The initial value of
+     this variable is '1'.
+
+ -- Variable: char * optarg
+     This variable is set by 'getopt' to point at the value of the
+     option argument, for those options that accept arguments.
+
+ -- Function: int getopt (int ARGC, char *const *ARGV, const char
+          *OPTIONS)
+     Preliminary: | MT-Unsafe race:getopt env | AS-Unsafe heap i18n lock
+     corrupt | AC-Unsafe mem lock corrupt | *Note POSIX Safety
+     Concepts::.
+
+     The 'getopt' function gets the next option argument from the
+     argument list specified by the ARGV and ARGC arguments.  Normally
+     these values come directly from the arguments received by 'main'.
+
+     The OPTIONS argument is a string that specifies the option
+     characters that are valid for this program.  An option character in
+     this string can be followed by a colon (':') to indicate that it
+     takes a required argument.  If an option character is followed by
+     two colons ('::'), its argument is optional; this is a GNU
+     extension.
+
+     'getopt' has three ways to deal with options that follow
+     non-options ARGV elements.  The special argument '--' forces in all
+     cases the end of option scanning.
+
+        * The default is to permute the contents of ARGV while scanning
+          it so that eventually all the non-options are at the end.
+          This allows options to be given in any order, even with
+          programs that were not written to expect this.
+
+        * If the OPTIONS argument string begins with a hyphen ('-'),
+          this is treated specially.  It permits arguments that are not
+          options to be returned as if they were associated with option
+          character '\1'.
+
+        * POSIX demands the following behavior: The first non-option
+          stops option processing.  This mode is selected by either
+          setting the environment variable 'POSIXLY_CORRECT' or
+          beginning the OPTIONS argument string with a plus sign ('+').
+
+     The 'getopt' function returns the option character for the next
+     command line option.  When no more option arguments are available,
+     it returns '-1'.  There may still be more non-option arguments; you
+     must compare the external variable 'optind' against the ARGC
+     parameter to check this.
+
+     If the option has an argument, 'getopt' returns the argument by
+     storing it in the variable OPTARG.  You don't ordinarily need to
+     copy the 'optarg' string, since it is a pointer into the original
+     ARGV array, not into a static area that might be overwritten.
+
+     If 'getopt' finds an option character in ARGV that was not included
+     in OPTIONS, or a missing option argument, it returns '?' and sets
+     the external variable 'optopt' to the actual option character.  If
+     the first character of OPTIONS is a colon (':'), then 'getopt'
+     returns ':' instead of '?' to indicate a missing option argument.
+     In addition, if the external variable 'opterr' is nonzero (which is
+     the default), 'getopt' prints an error message.
+
+
+File: libc.info,  Node: Example of Getopt,  Next: Getopt Long Options,  Prev: Using Getopt,  Up: Getopt
+
+25.2.2 Example of Parsing Arguments with 'getopt'
+-------------------------------------------------
+
+Here is an example showing how 'getopt' is typically used.  The key
+points to notice are:
+
+   * Normally, 'getopt' is called in a loop.  When 'getopt' returns
+     '-1', indicating no more options are present, the loop terminates.
+
+   * A 'switch' statement is used to dispatch on the return value from
+     'getopt'.  In typical use, each case just sets a variable that is
+     used later in the program.
+
+   * A second loop is used to process the remaining non-option
+     arguments.
+
+
+     #include <ctype.h>
+     #include <stdio.h>
+     #include <stdlib.h>
+     #include <unistd.h>
+
+     int
+     main (int argc, char **argv)
+     {
+       int aflag = 0;
+       int bflag = 0;
+       char *cvalue = NULL;
+       int index;
+       int c;
+
+       opterr = 0;
+
+       while ((c = getopt (argc, argv, "abc:")) != -1)
+         switch (c)
+           {
+           case 'a':
+             aflag = 1;
+             break;
+           case 'b':
+             bflag = 1;
+             break;
+           case 'c':
+             cvalue = optarg;
+             break;
+           case '?':
+             if (optopt == 'c')
+               fprintf (stderr, "Option -%c requires an argument.\n", optopt);
+             else if (isprint (optopt))
+               fprintf (stderr, "Unknown option `-%c'.\n", optopt);
+             else
+               fprintf (stderr,
+                        "Unknown option character `\\x%x'.\n",
+                        optopt);
+             return 1;
+           default:
+             abort ();
+           }
+
+       printf ("aflag = %d, bflag = %d, cvalue = %s\n",
+               aflag, bflag, cvalue);
+
+       for (index = optind; index < argc; index++)
+         printf ("Non-option argument %s\n", argv[index]);
+       return 0;
+     }
+
+   Here are some examples showing what this program prints with
+different combinations of arguments:
+
+     % testopt
+     aflag = 0, bflag = 0, cvalue = (null)
+
+     % testopt -a -b
+     aflag = 1, bflag = 1, cvalue = (null)
+
+     % testopt -ab
+     aflag = 1, bflag = 1, cvalue = (null)
+
+     % testopt -c foo
+     aflag = 0, bflag = 0, cvalue = foo
+
+     % testopt -cfoo
+     aflag = 0, bflag = 0, cvalue = foo
+
+     % testopt arg1
+     aflag = 0, bflag = 0, cvalue = (null)
+     Non-option argument arg1
+
+     % testopt -a arg1
+     aflag = 1, bflag = 0, cvalue = (null)
+     Non-option argument arg1
+
+     % testopt -c foo arg1
+     aflag = 0, bflag = 0, cvalue = foo
+     Non-option argument arg1
+
+     % testopt -a -- -b
+     aflag = 1, bflag = 0, cvalue = (null)
+     Non-option argument -b
+
+     % testopt -a -
+     aflag = 1, bflag = 0, cvalue = (null)
+     Non-option argument -
+
+
+File: libc.info,  Node: Getopt Long Options,  Next: Getopt Long Option Example,  Prev: Example of Getopt,  Up: Getopt
+
+25.2.3 Parsing Long Options with 'getopt_long'
+----------------------------------------------
+
+To accept GNU-style long options as well as single-character options,
+use 'getopt_long' instead of 'getopt'.  This function is declared in
+'getopt.h', not 'unistd.h'.  You should make every program accept long
+options if it uses any options, for this takes little extra work and
+helps beginners remember how to use the program.
+
+ -- Data Type: struct option
+     This structure describes a single long option name for the sake of
+     'getopt_long'.  The argument LONGOPTS must be an array of these
+     structures, one for each long option.  Terminate the array with an
+     element containing all zeros.
+
+     The 'struct option' structure has these fields:
+
+     'const char *name'
+          This field is the name of the option.  It is a string.
+
+     'int has_arg'
+          This field says whether the option takes an argument.  It is
+          an integer, and there are three legitimate values:
+          'no_argument', 'required_argument' and 'optional_argument'.
+
+     'int *flag'
+     'int val'
+          These fields control how to report or act on the option when
+          it occurs.
+
+          If 'flag' is a null pointer, then the 'val' is a value which
+          identifies this option.  Often these values are chosen to
+          uniquely identify particular long options.
+
+          If 'flag' is not a null pointer, it should be the address of
+          an 'int' variable which is the flag for this option.  The
+          value in 'val' is the value to store in the flag to indicate
+          that the option was seen.
+
+ -- Function: int getopt_long (int ARGC, char *const *ARGV, const char
+          *SHORTOPTS, const struct option *LONGOPTS, int *INDEXPTR)
+     Preliminary: | MT-Unsafe race:getopt env | AS-Unsafe heap i18n lock
+     corrupt | AC-Unsafe mem lock corrupt | *Note POSIX Safety
+     Concepts::.
+
+     Decode options from the vector ARGV (whose length is ARGC).  The
+     argument SHORTOPTS describes the short options to accept, just as
+     it does in 'getopt'.  The argument LONGOPTS describes the long
+     options to accept (see above).
+
+     When 'getopt_long' encounters a short option, it does the same
+     thing that 'getopt' would do: it returns the character code for the
+     option, and stores the options argument (if it has one) in
+     'optarg'.
+
+     When 'getopt_long' encounters a long option, it takes actions based
+     on the 'flag' and 'val' fields of the definition of that option.
+
+     If 'flag' is a null pointer, then 'getopt_long' returns the
+     contents of 'val' to indicate which option it found.  You should
+     arrange distinct values in the 'val' field for options with
+     different meanings, so you can decode these values after
+     'getopt_long' returns.  If the long option is equivalent to a short
+     option, you can use the short option's character code in 'val'.
+
+     If 'flag' is not a null pointer, that means this option should just
+     set a flag in the program.  The flag is a variable of type 'int'
+     that you define.  Put the address of the flag in the 'flag' field.
+     Put in the 'val' field the value you would like this option to
+     store in the flag.  In this case, 'getopt_long' returns '0'.
+
+     For any long option, 'getopt_long' tells you the index in the array
+     LONGOPTS of the options definition, by storing it into '*INDEXPTR'.
+     You can get the name of the option with 'LONGOPTS[*INDEXPTR].name'.
+     So you can distinguish among long options either by the values in
+     their 'val' fields or by their indices.  You can also distinguish
+     in this way among long options that set flags.
+
+     When a long option has an argument, 'getopt_long' puts the argument
+     value in the variable 'optarg' before returning.  When the option
+     has no argument, the value in 'optarg' is a null pointer.  This is
+     how you can tell whether an optional argument was supplied.
+
+     When 'getopt_long' has no more options to handle, it returns '-1',
+     and leaves in the variable 'optind' the index in ARGV of the next
+     remaining argument.
+
+   Since long option names were used before the 'getopt_long' options
+was invented there are program interfaces which require programs to
+recognize options like '-option value' instead of '--option value'.  To
+enable these programs to use the GNU getopt functionality there is one
+more function available.
+
+ -- Function: int getopt_long_only (int ARGC, char *const *ARGV, const
+          char *SHORTOPTS, const struct option *LONGOPTS, int *INDEXPTR)
+     Preliminary: | MT-Unsafe race:getopt env | AS-Unsafe heap i18n lock
+     corrupt | AC-Unsafe mem lock corrupt | *Note POSIX Safety
+     Concepts::.
+
+     The 'getopt_long_only' function is equivalent to the 'getopt_long'
+     function but it allows to specify the user of the application to
+     pass long options with only '-' instead of '--'.  The '--' prefix
+     is still recognized but instead of looking through the short
+     options if a '-' is seen it is first tried whether this parameter
+     names a long option.  If not, it is parsed as a short option.
+
+     Assuming 'getopt_long_only' is used starting an application with
+
+            app -foo
+
+     the 'getopt_long_only' will first look for a long option named
+     'foo'.  If this is not found, the short options 'f', 'o', and again
+     'o' are recognized.
+
+
+File: libc.info,  Node: Getopt Long Option Example,  Prev: Getopt Long Options,  Up: Getopt
+
+25.2.4 Example of Parsing Long Options with 'getopt_long'
+---------------------------------------------------------
+
+
+     #include <stdio.h>
+     #include <stdlib.h>
+     #include <getopt.h>
+
+     /* Flag set by '--verbose'. */
+     static int verbose_flag;
+
+     int
+     main (int argc, char **argv)
+     {
+       int c;
+
+       while (1)
+         {
+           static struct option long_options[] =
+             {
+               /* These options set a flag. */
+               {"verbose", no_argument,       &verbose_flag, 1},
+               {"brief",   no_argument,       &verbose_flag, 0},
+               /* These options don't set a flag.
+                  We distinguish them by their indices. */
+               {"add",     no_argument,       0, 'a'},
+               {"append",  no_argument,       0, 'b'},
+               {"delete",  required_argument, 0, 'd'},
+               {"create",  required_argument, 0, 'c'},
+               {"file",    required_argument, 0, 'f'},
+               {0, 0, 0, 0}
+             };
+           /* 'getopt_long' stores the option index here. */
+           int option_index = 0;
+
+           c = getopt_long (argc, argv, "abc:d:f:",
+                            long_options, &option_index);
+
+           /* Detect the end of the options. */
+           if (c == -1)
+             break;
+
+           switch (c)
+             {
+             case 0:
+               /* If this option set a flag, do nothing else now. */
+               if (long_options[option_index].flag != 0)
+                 break;
+               printf ("option %s", long_options[option_index].name);
+               if (optarg)
+                 printf (" with arg %s", optarg);
+               printf ("\n");
+               break;
+
+             case 'a':
+               puts ("option -a\n");
+               break;
+
+             case 'b':
+               puts ("option -b\n");
+               break;
+
+             case 'c':
+               printf ("option -c with value `%s'\n", optarg);
+               break;
+
+             case 'd':
+               printf ("option -d with value `%s'\n", optarg);
+               break;
+
+             case 'f':
+               printf ("option -f with value `%s'\n", optarg);
+               break;
+
+             case '?':
+               /* 'getopt_long' already printed an error message. */
+               break;
+
+             default:
+               abort ();
+             }
+         }
+
+       /* Instead of reporting '--verbose'
+          and '--brief' as they are encountered,
+          we report the final status resulting from them. */
+       if (verbose_flag)
+         puts ("verbose flag is set");
+
+       /* Print any remaining command line arguments (not options). */
+       if (optind < argc)
+         {
+           printf ("non-option ARGV-elements: ");
+           while (optind < argc)
+             printf ("%s ", argv[optind++]);
+           putchar ('\n');
+         }
+
+       exit (0);
+     }
+
+
+File: libc.info,  Node: Argp,  Next: Suboptions,  Prev: Getopt,  Up: Parsing Program Arguments
+
+25.3 Parsing Program Options with Argp
+======================================
+
+"Argp" is an interface for parsing unix-style argument vectors.  *Note
+Program Arguments::.
+
+   Argp provides features unavailable in the more commonly used 'getopt'
+interface.  These features include automatically producing output in
+response to the '--help' and '--version' options, as described in the
+GNU coding standards.  Using argp makes it less likely that programmers
+will neglect to implement these additional options or keep them up to
+date.
+
+   Argp also provides the ability to merge several independently defined
+option parsers into one, mediating conflicts between them and making the
+result appear seamless.  A library can export an argp option parser that
+user programs might employ in conjunction with their own option parsers,
+resulting in less work for the user programs.  Some programs may use
+only argument parsers exported by libraries, thereby achieving
+consistent and efficient option-parsing for abstractions implemented by
+the libraries.
+
+   The header file '<argp.h>' should be included to use argp.
+
+25.3.1 The 'argp_parse' Function
+--------------------------------
+
+The main interface to argp is the 'argp_parse' function.  In many cases,
+calling 'argp_parse' is the only argument-parsing code needed in 'main'.
+*Note Program Arguments::.
+
+ -- Function: error_t argp_parse (const struct argp *ARGP, int ARGC,
+          char **ARGV, unsigned FLAGS, int *ARG_INDEX, void *INPUT)
+     Preliminary: | MT-Unsafe race:argpbuf locale env | AS-Unsafe heap
+     i18n lock corrupt | AC-Unsafe mem lock corrupt | *Note POSIX Safety
+     Concepts::.
+
+     The 'argp_parse' function parses the arguments in ARGV, of length
+     ARGC, using the argp parser ARGP.  *Note Argp Parsers::.  Passing a
+     null pointer for ARGP is the same as using a 'struct argp'
+     containing all zeros.
+
+     FLAGS is a set of flag bits that modify the parsing behavior.
+     *Note Argp Flags::.  INPUT is passed through to the argp parser
+     ARGP, and has meaning defined by ARGP.  A typical usage is to pass
+     a pointer to a structure which is used for specifying parameters to
+     the parser and passing back the results.
+
+     Unless the 'ARGP_NO_EXIT' or 'ARGP_NO_HELP' flags are included in
+     FLAGS, calling 'argp_parse' may result in the program exiting.
+     This behavior is true if an error is detected, or when an unknown
+     option is encountered.  *Note Program Termination::.
+
+     If ARG_INDEX is non-null, the index of the first unparsed option in
+     ARGV is returned as a value.
+
+     The return value is zero for successful parsing, or an error code
+     (*note Error Codes::) if an error is detected.  Different argp
+     parsers may return arbitrary error codes, but the standard error
+     codes are: 'ENOMEM' if a memory allocation error occurred, or
+     'EINVAL' if an unknown option or option argument is encountered.
+
+* Menu:
+
+* Globals: Argp Global Variables.  Global argp parameters.
+* Parsers: Argp Parsers.        Defining parsers for use with 'argp_parse'.
+* Flags: Argp Flags.            Flags that modify the behavior of 'argp_parse'.
+* Help: Argp Help.              Printing help messages when not parsing.
+* Examples: Argp Examples.      Simple examples of programs using argp.
+* Customization: Argp User Customization.
+                                Users may control the '--help' output format.
+
+
+File: libc.info,  Node: Argp Global Variables,  Next: Argp Parsers,  Up: Argp
+
+25.3.2 Argp Global Variables
+----------------------------
+
+These variables make it easy for user programs to implement the
+'--version' option and provide a bug-reporting address in the '--help'
+output.  These are implemented in argp by default.
+
+ -- Variable: const char * argp_program_version
+     If defined or set by the user program to a non-zero value, then a
+     '--version' option is added when parsing with 'argp_parse', which
+     will print the '--version' string followed by a newline and exit.
+     The exception to this is if the 'ARGP_NO_EXIT' flag is used.
+
+ -- Variable: const char * argp_program_bug_address
+     If defined or set by the user program to a non-zero value,
+     'argp_program_bug_address' should point to a string that will be
+     printed at the end of the standard output for the '--help' option,
+     embedded in a sentence that says 'Report bugs to ADDRESS.'.
+
+ -- Variable: argp_program_version_hook
+     If defined or set by the user program to a non-zero value, a
+     '--version' option is added when parsing with 'arg_parse', which
+     prints the program version and exits with a status of zero.  This
+     is not the case if the 'ARGP_NO_HELP' flag is used.  If the
+     'ARGP_NO_EXIT' flag is set, the exit behavior of the program is
+     suppressed or modified, as when the argp parser is going to be used
+     by other programs.
+
+     It should point to a function with this type of signature:
+
+          void PRINT-VERSION (FILE *STREAM, struct argp_state *STATE)
+
+     *Note Argp Parsing State::, for an explanation of STATE.
+
+     This variable takes precedence over 'argp_program_version', and is
+     useful if a program has version information not easily expressed in
+     a simple string.
+
+ -- Variable: error_t argp_err_exit_status
+     This is the exit status used when argp exits due to a parsing
+     error.  If not defined or set by the user program, this defaults
+     to: 'EX_USAGE' from '<sysexits.h>'.
+
+
+File: libc.info,  Node: Argp Parsers,  Next: Argp Flags,  Prev: Argp Global Variables,  Up: Argp
+
+25.3.3 Specifying Argp Parsers
+------------------------------
+
+The first argument to the 'argp_parse' function is a pointer to a
+'struct argp', which is known as an "argp parser":
+
+ -- Data Type: struct argp
+     This structure specifies how to parse a given set of options and
+     arguments, perhaps in conjunction with other argp parsers.  It has
+     the following fields:
+
+     'const struct argp_option *options'
+          A pointer to a vector of 'argp_option' structures specifying
+          which options this argp parser understands; it may be zero if
+          there are no options at all.  *Note Argp Option Vectors::.
+
+     'argp_parser_t parser'
+          A pointer to a function that defines actions for this parser;
+          it is called for each option parsed, and at other well-defined
+          points in the parsing process.  A value of zero is the same as
+          a pointer to a function that always returns
+          'ARGP_ERR_UNKNOWN'.  *Note Argp Parser Functions::.
+
+     'const char *args_doc'
+          If non-zero, a string describing what non-option arguments are
+          called by this parser.  This is only used to print the
+          'Usage:' message.  If it contains newlines, the strings
+          separated by them are considered alternative usage patterns
+          and printed on separate lines.  Lines after the first are
+          prefixed by ' or: ' instead of 'Usage:'.
+
+     'const char *doc'
+          If non-zero, a string containing extra text to be printed
+          before and after the options in a long help message, with the
+          two sections separated by a vertical tab (''\v'', ''\013'')
+          character.  By convention, the documentation before the
+          options is just a short string explaining what the program
+          does.  Documentation printed after the options describe
+          behavior in more detail.
+
+     'const struct argp_child *children'
+          A pointer to a vector of 'argp_children' structures.  This
+          pointer specifies which additional argp parsers should be
+          combined with this one.  *Note Argp Children::.
+
+     'char *(*help_filter)(int KEY, const char *TEXT, void *INPUT)'
+          If non-zero, a pointer to a function that filters the output
+          of help messages.  *Note Argp Help Filtering::.
+
+     'const char *argp_domain'
+          If non-zero, the strings used in the argp library are
+          translated using the domain described by this string.  If
+          zero, the current default domain is used.
+
+   Of the above group, 'options', 'parser', 'args_doc', and the 'doc'
+fields are usually all that are needed.  If an argp parser is defined as
+an initialized C variable, only the fields used need be specified in the
+initializer.  The rest will default to zero due to the way C structure
+initialization works.  This design is exploited in most argp structures;
+the most-used fields are grouped near the beginning, the unused fields
+left unspecified.
+
+* Menu:
+
+* Options: Argp Option Vectors.   Specifying options in an argp parser.
+* Argp Parser Functions::         Defining actions for an argp parser.
+* Children: Argp Children.        Combining multiple argp parsers.
+* Help Filtering: Argp Help Filtering.  Customizing help output for an argp parser.
+
+
+File: libc.info,  Node: Argp Option Vectors,  Next: Argp Parser Functions,  Prev: Argp Parsers,  Up: Argp Parsers
+
+25.3.4 Specifying Options in an Argp Parser
+-------------------------------------------
+
+The 'options' field in a 'struct argp' points to a vector of 'struct
+argp_option' structures, each of which specifies an option that the argp
+parser supports.  Multiple entries may be used for a single option
+provided it has multiple names.  This should be terminated by an entry
+with zero in all fields.  Note that when using an initialized C array
+for options, writing '{ 0 }' is enough to achieve this.
+
+ -- Data Type: struct argp_option
+     This structure specifies a single option that an argp parser
+     understands, as well as how to parse and document that option.  It
+     has the following fields:
+
+     'const char *name'
+          The long name for this option, corresponding to the long
+          option '--NAME'; this field may be zero if this option _only_
+          has a short name.  To specify multiple names for an option,
+          additional entries may follow this one, with the
+          'OPTION_ALIAS' flag set.  *Note Argp Option Flags::.
+
+     'int key'
+          The integer key provided by the current option to the option
+          parser.  If KEY has a value that is a printable ASCII
+          character (i.e., 'isascii (KEY)' is true), it _also_ specifies
+          a short option '-CHAR', where CHAR is the ASCII character with
+          the code KEY.
+
+     'const char *arg'
+          If non-zero, this is the name of an argument associated with
+          this option, which must be provided (e.g., with the
+          '--NAME=VALUE' or '-CHAR VALUE' syntaxes), unless the
+          'OPTION_ARG_OPTIONAL' flag (*note Argp Option Flags::) is set,
+          in which case it _may_ be provided.
+
+     'int flags'
+          Flags associated with this option, some of which are referred
+          to above.  *Note Argp Option Flags::.
+
+     'const char *doc'
+          A documentation string for this option, for printing in help
+          messages.
+
+          If both the 'name' and 'key' fields are zero, this string will
+          be printed tabbed left from the normal option column, making
+          it useful as a group header.  This will be the first thing
+          printed in its group.  In this usage, it's conventional to end
+          the string with a ':' character.
+
+     'int group'
+          Group identity for this option.
+
+          In a long help message, options are sorted alphabetically
+          within each group, and the groups presented in the order 0, 1,
+          2, ..., N, -M, ..., -2, -1.
+
+          Every entry in an options array with this field 0 will inherit
+          the group number of the previous entry, or zero if it's the
+          first one.  If it's a group header with 'name' and 'key'
+          fields both zero, the previous entry + 1 is the default.
+          Automagic options such as '--help' are put into group -1.
+
+          Note that because of C structure initialization rules, this
+          field often need not be specified, because 0 is the correct
+          value.
+
+* Menu:
+
+* Flags: Argp Option Flags.     Flags for options.
+
+
+File: libc.info,  Node: Argp Option Flags,  Up: Argp Option Vectors
+
+25.3.4.1 Flags for Argp Options
+...............................
+
+The following flags may be or'd together in the 'flags' field of a
+'struct argp_option'.  These flags control various aspects of how that
+option is parsed or displayed in help messages:
+
+'OPTION_ARG_OPTIONAL'
+     The argument associated with this option is optional.
+
+'OPTION_HIDDEN'
+     This option isn't displayed in any help messages.
+
+'OPTION_ALIAS'
+     This option is an alias for the closest previous non-alias option.
+     This means that it will be displayed in the same help entry, and
+     will inherit fields other than 'name' and 'key' from the option
+     being aliased.
+
+'OPTION_DOC'
+     This option isn't actually an option and should be ignored by the
+     actual option parser.  It is an arbitrary section of documentation
+     that should be displayed in much the same manner as the options.
+     This is known as a "documentation option".
+
+     If this flag is set, then the option 'name' field is displayed
+     unmodified (e.g., no '--' prefix is added) at the left-margin where
+     a _short_ option would normally be displayed, and this
+     documentation string is left in it's usual place.  For purposes of
+     sorting, any leading whitespace and punctuation is ignored, unless
+     the first non-whitespace character is '-'.  This entry is displayed
+     after all options, after 'OPTION_DOC' entries with a leading '-',
+     in the same group.
+
+'OPTION_NO_USAGE'
+     This option shouldn't be included in 'long' usage messages, but
+     should still be included in other help messages.  This is intended
+     for options that are completely documented in an argp's 'args_doc'
+     field.  *Note Argp Parsers::.  Including this option in the generic
+     usage list would be redundant, and should be avoided.
+
+     For instance, if 'args_doc' is '"FOO BAR\n-x BLAH"', and the '-x'
+     option's purpose is to distinguish these two cases, '-x' should
+     probably be marked 'OPTION_NO_USAGE'.
+
+
+File: libc.info,  Node: Argp Parser Functions,  Next: Argp Children,  Prev: Argp Option Vectors,  Up: Argp Parsers
+
+25.3.5 Argp Parser Functions
+----------------------------
+
+The function pointed to by the 'parser' field in a 'struct argp' (*note
+Argp Parsers::) defines what actions take place in response to each
+option or argument parsed.  It is also used as a hook, allowing a parser
+to perform tasks at certain other points during parsing.
+
+   Argp parser functions have the following type signature:
+
+     error_t PARSER (int KEY, char *ARG, struct argp_state *STATE)
+
+where the arguments are as follows:
+
+KEY
+     For each option that is parsed, PARSER is called with a value of
+     KEY from that option's 'key' field in the option vector.  *Note
+     Argp Option Vectors::.  PARSER is also called at other times with
+     special reserved keys, such as 'ARGP_KEY_ARG' for non-option
+     arguments.  *Note Argp Special Keys::.
+
+ARG
+     If KEY is an option, ARG is its given value.  This defaults to zero
+     if no value is specified.  Only options that have a non-zero 'arg'
+     field can ever have a value.  These must _always_ have a value
+     unless the 'OPTION_ARG_OPTIONAL' flag is specified.  If the input
+     being parsed specifies a value for an option that doesn't allow
+     one, an error results before PARSER ever gets called.
+
+     If KEY is 'ARGP_KEY_ARG', ARG is a non-option argument.  Other
+     special keys always have a zero ARG.
+
+STATE
+     STATE points to a 'struct argp_state', containing useful
+     information about the current parsing state for use by PARSER.
+     *Note Argp Parsing State::.
+
+   When PARSER is called, it should perform whatever action is
+appropriate for KEY, and return '0' for success, 'ARGP_ERR_UNKNOWN' if
+the value of KEY is not handled by this parser function, or a unix error
+code if a real error occurred.  *Note Error Codes::.
+
+ -- Macro: int ARGP_ERR_UNKNOWN
+     Argp parser functions should return 'ARGP_ERR_UNKNOWN' for any KEY
+     value they do not recognize, or for non-option arguments ('KEY ==
+     ARGP_KEY_ARG') that they are not equipped to handle.
+
+   A typical parser function uses a switch statement on KEY:
+
+     error_t
+     parse_opt (int key, char *arg, struct argp_state *state)
+     {
+       switch (key)
+         {
+         case OPTION_KEY:
+           ACTION
+           break;
+         ...
+         default:
+           return ARGP_ERR_UNKNOWN;
+         }
+       return 0;
+     }
+
+* Menu:
+
+* Keys: Argp Special Keys.           Special values for the KEY argument.
+* State: Argp Parsing State.         What the STATE argument refers to.
+* Functions: Argp Helper Functions.  Functions to help during argp parsing.
+
+
+File: libc.info,  Node: Argp Special Keys,  Next: Argp Parsing State,  Up: Argp Parser Functions
+
+25.3.5.1 Special Keys for Argp Parser Functions
+...............................................
+
+In addition to key values corresponding to user options, the KEY
+argument to argp parser functions may have a number of other special
+values.  In the following example ARG and STATE refer to parser function
+arguments.  *Note Argp Parser Functions::.
+
+'ARGP_KEY_ARG'
+     This is not an option at all, but rather a command line argument,
+     whose value is pointed to by ARG.
+
+     When there are multiple parser functions in play due to argp
+     parsers being combined, it's impossible to know which one will
+     handle a specific argument.  Each is called until one returns 0 or
+     an error other than 'ARGP_ERR_UNKNOWN'; if an argument is not
+     handled, 'argp_parse' immediately returns success, without parsing
+     any more arguments.
+
+     Once a parser function returns success for this key, that fact is
+     recorded, and the 'ARGP_KEY_NO_ARGS' case won't be used.
+     _However_, if while processing the argument a parser function
+     decrements the 'next' field of its STATE argument, the option won't
+     be considered processed; this is to allow you to actually modify
+     the argument, perhaps into an option, and have it processed again.
+
+'ARGP_KEY_ARGS'
+     If a parser function returns 'ARGP_ERR_UNKNOWN' for 'ARGP_KEY_ARG',
+     it is immediately called again with the key 'ARGP_KEY_ARGS', which
+     has a similar meaning, but is slightly more convenient for
+     consuming all remaining arguments.  ARG is 0, and the tail of the
+     argument vector may be found at 'STATE->argv + STATE->next'.  If
+     success is returned for this key, and 'STATE->next' is unchanged,
+     all remaining arguments are considered to have been consumed.
+     Otherwise, the amount by which 'STATE->next' has been adjusted
+     indicates how many were used.  Here's an example that uses both,
+     for different args:
+
+          ...
+          case ARGP_KEY_ARG:
+            if (STATE->arg_num == 0)
+              /* First argument */
+              first_arg = ARG;
+            else
+              /* Let the next case parse it.  */
+              return ARGP_KEY_UNKNOWN;
+            break;
+          case ARGP_KEY_ARGS:
+            remaining_args = STATE->argv + STATE->next;
+            num_remaining_args = STATE->argc - STATE->next;
+            break;
+
+'ARGP_KEY_END'
+     This indicates that there are no more command line arguments.
+     Parser functions are called in a different order, children first.
+     This allows each parser to clean up its state for the parent.
+
+'ARGP_KEY_NO_ARGS'
+     Because it's common to do some special processing if there aren't
+     any non-option args, parser functions are called with this key if
+     they didn't successfully process any non-option arguments.  This is
+     called just before 'ARGP_KEY_END', where more general validity
+     checks on previously parsed arguments take place.
+
+'ARGP_KEY_INIT'
+     This is passed in before any parsing is done.  Afterwards, the
+     values of each element of the 'child_input' field of STATE, if any,
+     are copied to each child's state to be the initial value of the
+     'input' when _their_ parsers are called.
+
+'ARGP_KEY_SUCCESS'
+     Passed in when parsing has successfully been completed, even if
+     arguments remain.
+
+'ARGP_KEY_ERROR'
+     Passed in if an error has occurred and parsing is terminated.  In
+     this case a call with a key of 'ARGP_KEY_SUCCESS' is never made.
+
+'ARGP_KEY_FINI'
+     The final key ever seen by any parser, even after
+     'ARGP_KEY_SUCCESS' and 'ARGP_KEY_ERROR'.  Any resources allocated
+     by 'ARGP_KEY_INIT' may be freed here.  At times, certain resources
+     allocated are to be returned to the caller after a successful
+     parse.  In that case, those particular resources can be freed in
+     the 'ARGP_KEY_ERROR' case.
+
+   In all cases, 'ARGP_KEY_INIT' is the first key seen by parser
+functions, and 'ARGP_KEY_FINI' the last, unless an error was returned by
+the parser for 'ARGP_KEY_INIT'.  Other keys can occur in one the
+following orders.  OPT refers to an arbitrary option key:
+
+OPT... 'ARGP_KEY_NO_ARGS' 'ARGP_KEY_END' 'ARGP_KEY_SUCCESS'
+     The arguments being parsed did not contain any non-option
+     arguments.
+
+( OPT | 'ARGP_KEY_ARG' )... 'ARGP_KEY_END' 'ARGP_KEY_SUCCESS'
+     All non-option arguments were successfully handled by a parser
+     function.  There may be multiple parser functions if multiple argp
+     parsers were combined.
+
+( OPT | 'ARGP_KEY_ARG' )... 'ARGP_KEY_SUCCESS'
+     Some non-option argument went unrecognized.
+
+     This occurs when every parser function returns 'ARGP_KEY_UNKNOWN'
+     for an argument, in which case parsing stops at that argument if
+     ARG_INDEX is a null pointer.  Otherwise an error occurs.
+
+   In all cases, if a non-null value for ARG_INDEX gets passed to
+'argp_parse', the index of the first unparsed command-line argument is
+passed back in that value.
+
+   If an error occurs and is either detected by argp or because a parser
+function returned an error value, each parser is called with
+'ARGP_KEY_ERROR'.  No further calls are made, except the final call with
+'ARGP_KEY_FINI'.
+
+
+File: libc.info,  Node: Argp Parsing State,  Next: Argp Helper Functions,  Prev: Argp Special Keys,  Up: Argp Parser Functions
+
+25.3.5.2 Argp Parsing State
+...........................
+
+The third argument to argp parser functions (*note Argp Parser
+Functions::) is a pointer to a 'struct argp_state', which contains
+information about the state of the option parsing.
+
+ -- Data Type: struct argp_state
+     This structure has the following fields, which may be modified as
+     noted:
+
+     'const struct argp *const root_argp'
+          The top level argp parser being parsed.  Note that this is
+          often _not_ the same 'struct argp' passed into 'argp_parse' by
+          the invoking program.  *Note Argp::.  It is an internal argp
+          parser that contains options implemented by 'argp_parse'
+          itself, such as '--help'.
+
+     'int argc'
+     'char **argv'
+          The argument vector being parsed.  This may be modified.
+
+     'int next'
+          The index in 'argv' of the next argument to be parsed.  This
+          may be modified.
+
+          One way to consume all remaining arguments in the input is to
+          set 'STATE->next = STATE->argc', perhaps after recording the
+          value of the 'next' field to find the consumed arguments.  The
+          current option can be re-parsed immediately by decrementing
+          this field, then modifying 'STATE->argv[STATE->next]' to
+          reflect the option that should be reexamined.
+
+     'unsigned flags'
+          The flags supplied to 'argp_parse'.  These may be modified,
+          although some flags may only take effect when 'argp_parse' is
+          first invoked.  *Note Argp Flags::.
+
+     'unsigned arg_num'
+          While calling a parsing function with the KEY argument
+          'ARGP_KEY_ARG', this represents the number of the current arg,
+          starting at 0.  It is incremented after each 'ARGP_KEY_ARG'
+          call returns.  At all other times, this is the number of
+          'ARGP_KEY_ARG' arguments that have been processed.
+
+     'int quoted'
+          If non-zero, the index in 'argv' of the first argument
+          following a special '--' argument.  This prevents anything
+          that follows from being interpreted as an option.  It is only
+          set after argument parsing has proceeded past this point.
+
+     'void *input'
+          An arbitrary pointer passed in from the caller of
+          'argp_parse', in the INPUT argument.
+
+     'void **child_inputs'
+          These are values that will be passed to child parsers.  This
+          vector will be the same length as the number of children in
+          the current parser.  Each child parser will be given the value
+          of 'STATE->child_inputs[I]' as _its_ 'STATE->input' field,
+          where I is the index of the child in the this parser's
+          'children' field.  *Note Argp Children::.
+
+     'void *hook'
+          For the parser function's use.  Initialized to 0, but
+          otherwise ignored by argp.
+
+     'char *name'
+          The name used when printing messages.  This is initialized to
+          'argv[0]', or 'program_invocation_name' if 'argv[0]' is
+          unavailable.
+
+     'FILE *err_stream'
+     'FILE *out_stream'
+          The stdio streams used when argp prints.  Error messages are
+          printed to 'err_stream', all other output, such as '--help'
+          output) to 'out_stream'.  These are initialized to 'stderr'
+          and 'stdout' respectively.  *Note Standard Streams::.
+
+     'void *pstate'
+          Private, for use by the argp implementation.
+
+
+File: libc.info,  Node: Argp Helper Functions,  Prev: Argp Parsing State,  Up: Argp Parser Functions
+
+25.3.5.3 Functions For Use in Argp Parsers
+..........................................
+
+Argp provides a number of functions available to the user of argp (*note
+Argp Parser Functions::), mostly for producing error messages.  These
+take as their first argument the STATE argument to the parser function.
+*Note Argp Parsing State::.
+
+ -- Function: void argp_usage (const struct argp_state *STATE)
+     Preliminary: | MT-Unsafe race:argpbuf env locale | AS-Unsafe heap
+     i18n corrupt | AC-Unsafe mem corrupt lock | *Note POSIX Safety
+     Concepts::.
+
+     Outputs the standard usage message for the argp parser referred to
+     by STATE to 'STATE->err_stream' and terminate the program with
+     'exit (argp_err_exit_status)'.  *Note Argp Global Variables::.
+
+ -- Function: void argp_error (const struct argp_state *STATE, const
+          char *FMT, ...)
+     Preliminary: | MT-Unsafe race:argpbuf env locale | AS-Unsafe heap
+     i18n corrupt | AC-Unsafe mem corrupt lock | *Note POSIX Safety
+     Concepts::.
+
+     Prints the printf format string FMT and following args, preceded by
+     the program name and ':', and followed by a 'Try ... --help'
+     message, and terminates the program with an exit status of
+     'argp_err_exit_status'.  *Note Argp Global Variables::.
+
+ -- Function: void argp_failure (const struct argp_state *STATE, int
+          STATUS, int ERRNUM, const char *FMT, ...)
+     Preliminary: | MT-Safe | AS-Unsafe corrupt heap | AC-Unsafe lock
+     corrupt mem | *Note POSIX Safety Concepts::.
+
+     Similar to the standard gnu error-reporting function 'error', this
+     prints the program name and ':', the printf format string FMT, and
+     the appropriate following args.  If it is non-zero, the standard
+     unix error text for ERRNUM is printed.  If STATUS is non-zero, it
+     terminates the program with that value as its exit status.
+
+     The difference between 'argp_failure' and 'argp_error' is that
+     'argp_error' is for _parsing errors_, whereas 'argp_failure' is for
+     other problems that occur during parsing but don't reflect a
+     syntactic problem with the input, such as illegal values for
+     options, bad phase of the moon, etc.
+
+ -- Function: void argp_state_help (const struct argp_state *STATE, FILE
+          *STREAM, unsigned FLAGS)
+     Preliminary: | MT-Unsafe race:argpbuf env locale | AS-Unsafe heap
+     i18n corrupt | AC-Unsafe mem corrupt lock | *Note POSIX Safety
+     Concepts::.
+
+     Outputs a help message for the argp parser referred to by STATE, to
+     STREAM.  The FLAGS argument determines what sort of help message is
+     produced.  *Note Argp Help Flags::.
+
+   Error output is sent to 'STATE->err_stream', and the program name
+printed is 'STATE->name'.
+
+   The output or program termination behavior of these functions may be
+suppressed if the 'ARGP_NO_EXIT' or 'ARGP_NO_ERRS' flags are passed to
+'argp_parse'.  *Note Argp Flags::.
+
+   This behavior is useful if an argp parser is exported for use by
+other programs (e.g., by a library), and may be used in a context where
+it is not desirable to terminate the program in response to parsing
+errors.  In argp parsers intended for such general use, and for the case
+where the program _doesn't_ terminate, calls to any of these functions
+should be followed by code that returns the appropriate error code:
+
+     if (BAD ARGUMENT SYNTAX)
+       {
+          argp_usage (STATE);
+          return EINVAL;
+       }
+
+If a parser function will _only_ be used when 'ARGP_NO_EXIT' is not set,
+the return may be omitted.
+
+
+File: libc.info,  Node: Argp Children,  Next: Argp Help Filtering,  Prev: Argp Parser Functions,  Up: Argp Parsers
+
+25.3.6 Combining Multiple Argp Parsers
+--------------------------------------
+
+The 'children' field in a 'struct argp' enables other argp parsers to be
+combined with the referencing one for the parsing of a single set of
+arguments.  This field should point to a vector of 'struct argp_child',
+which is terminated by an entry having a value of zero in the 'argp'
+field.
+
+   Where conflicts between combined parsers arise, as when two specify
+an option with the same name, the parser conflicts are resolved in favor
+of the parent argp parser(s), or the earlier of the argp parsers in the
+list of children.
+
+ -- Data Type: struct argp_child
+     An entry in the list of subsidiary argp parsers pointed to by the
+     'children' field in a 'struct argp'.  The fields are as follows:
+
+     'const struct argp *argp'
+          The child argp parser, or zero to end of the list.
+
+     'int flags'
+          Flags for this child.
+
+     'const char *header'
+          If non-zero, this is an optional header to be printed within
+          help output before the child options.  As a side-effect, a
+          non-zero value forces the child options to be grouped
+          together.  To achieve this effect without actually printing a
+          header string, use a value of '""'.  As with header strings
+          specified in an option entry, the conventional value of the
+          last character is ':'.  *Note Argp Option Vectors::.
+
+     'int group'
+          This is where the child options are grouped relative to the
+          other 'consolidated' options in the parent argp parser.  The
+          values are the same as the 'group' field in 'struct
+          argp_option'.  *Note Argp Option Vectors::.  All
+          child-groupings follow parent options at a particular group
+          level.  If both this field and 'header' are zero, then the
+          child's options aren't grouped together, they are merged with
+          parent options at the parent option group level.
+
+
+File: libc.info,  Node: Argp Flags,  Next: Argp Help,  Prev: Argp Parsers,  Up: Argp
+
+25.3.7 Flags for 'argp_parse'
+-----------------------------
+
+The default behavior of 'argp_parse' is designed to be convenient for
+the most common case of parsing program command line argument.  To
+modify these defaults, the following flags may be or'd together in the
+FLAGS argument to 'argp_parse':
+
+'ARGP_PARSE_ARGV0'
+     Don't ignore the first element of the ARGV argument to
+     'argp_parse'.  Unless 'ARGP_NO_ERRS' is set, the first element of
+     the argument vector is skipped for option parsing purposes, as it
+     corresponds to the program name in a command line.
+
+'ARGP_NO_ERRS'
+     Don't print error messages for unknown options to 'stderr'; unless
+     this flag is set, 'ARGP_PARSE_ARGV0' is ignored, as 'argv[0]' is
+     used as the program name in the error messages.  This flag implies
+     'ARGP_NO_EXIT'.  This is based on the assumption that silent
+     exiting upon errors is bad behavior.
+
+'ARGP_NO_ARGS'
+     Don't parse any non-option args.  Normally these are parsed by
+     calling the parse functions with a key of 'ARGP_KEY_ARG', the
+     actual argument being the value.  This flag needn't normally be
+     set, as the default behavior is to stop parsing as soon as an
+     argument fails to be parsed.  *Note Argp Parser Functions::.
+
+'ARGP_IN_ORDER'
+     Parse options and arguments in the same order they occur on the
+     command line.  Normally they're rearranged so that all options come
+     first.
+
+'ARGP_NO_HELP'
+     Don't provide the standard long option '--help', which ordinarily
+     causes usage and option help information to be output to 'stdout'
+     and 'exit (0)'.
+
+'ARGP_NO_EXIT'
+     Don't exit on errors, although they may still result in error
+     messages.
+
+'ARGP_LONG_ONLY'
+     Use the gnu getopt 'long-only' rules for parsing arguments.  This
+     allows long-options to be recognized with only a single '-' (i.e.,
+     '-help').  This results in a less useful interface, and its use is
+     discouraged as it conflicts with the way most GNU programs work as
+     well as the GNU coding standards.
+
+'ARGP_SILENT'
+     Turns off any message-printing/exiting options, specifically
+     'ARGP_NO_EXIT', 'ARGP_NO_ERRS', and 'ARGP_NO_HELP'.
+
+
+File: libc.info,  Node: Argp Help Filtering,  Prev: Argp Children,  Up: Argp Parsers
+
+25.3.8 Customizing Argp Help Output
+-----------------------------------
+
+The 'help_filter' field in a 'struct argp' is a pointer to a function
+that filters the text of help messages before displaying them.  They
+have a function signature like:
+
+     char *HELP-FILTER (int KEY, const char *TEXT, void *INPUT)
+
+Where KEY is either a key from an option, in which case TEXT is that
+option's help text.  *Note Argp Option Vectors::.  Alternately, one of
+the special keys with names beginning with 'ARGP_KEY_HELP_' might be
+used, describing which other help text TEXT will contain.  *Note Argp
+Help Filter Keys::.
+
+   The function should return either TEXT if it remains as-is, or a
+replacement string allocated using 'malloc'.  This will be either be
+freed by argp or zero, which prints nothing.  The value of TEXT is
+supplied _after_ any translation has been done, so if any of the
+replacement text needs translation, it will be done by the filter
+function.  INPUT is either the input supplied to 'argp_parse' or it is
+zero, if 'argp_help' was called directly by the user.
+
+* Menu:
+
+* Keys: Argp Help Filter Keys.  Special KEY values for help filter functions.
+
+
+File: libc.info,  Node: Argp Help Filter Keys,  Up: Argp Help Filtering
+
+25.3.8.1 Special Keys for Argp Help Filter Functions
+....................................................
+
+The following special values may be passed to an argp help filter
+function as the first argument in addition to key values for user
+options.  They specify which help text the TEXT argument contains:
+
+'ARGP_KEY_HELP_PRE_DOC'
+     The help text preceding options.
+
+'ARGP_KEY_HELP_POST_DOC'
+     The help text following options.
+
+'ARGP_KEY_HELP_HEADER'
+     The option header string.
+
+'ARGP_KEY_HELP_EXTRA'
+     This is used after all other documentation; TEXT is zero for this
+     key.
+
+'ARGP_KEY_HELP_DUP_ARGS_NOTE'
+     The explanatory note printed when duplicate option arguments have
+     been suppressed.
+
+'ARGP_KEY_HELP_ARGS_DOC'
+     The argument doc string; formally the 'args_doc' field from the
+     argp parser.  *Note Argp Parsers::.
+
+
+File: libc.info,  Node: Argp Help,  Next: Argp Examples,  Prev: Argp Flags,  Up: Argp
+
+25.3.9 The 'argp_help' Function
+-------------------------------
+
+Normally programs using argp need not be written with particular
+printing argument-usage-type help messages in mind as the standard
+'--help' option is handled automatically by argp.  Typical error cases
+can be handled using 'argp_usage' and 'argp_error'.  *Note Argp Helper
+Functions::.  However, if it's desirable to print a help message in some
+context other than parsing the program options, argp offers the
+'argp_help' interface.
+
+ -- Function: void argp_help (const struct argp *ARGP, FILE *STREAM,
+          unsigned FLAGS, char *NAME)
+     Preliminary: | MT-Unsafe race:argpbuf env locale | AS-Unsafe heap
+     i18n corrupt | AC-Unsafe mem corrupt lock | *Note POSIX Safety
+     Concepts::.
+
+     This outputs a help message for the argp parser ARGP to STREAM.
+     The type of messages printed will be determined by FLAGS.
+
+     Any options such as '--help' that are implemented automatically by
+     argp itself will _not_ be present in the help output; for this
+     reason it is best to use 'argp_state_help' if calling from within
+     an argp parser function.  *Note Argp Helper Functions::.
+
+* Menu:
+
+* Flags: Argp Help Flags.       Specifying what sort of help message to print.
+
+
+File: libc.info,  Node: Argp Help Flags,  Up: Argp Help
+
+25.3.10 Flags for the 'argp_help' Function
+------------------------------------------
+
+When calling 'argp_help' (*note Argp Help::) or 'argp_state_help' (*note
+Argp Helper Functions::) the exact output is determined by the FLAGS
+argument.  This should consist of any of the following flags, or'd
+together:
+
+'ARGP_HELP_USAGE'
+     A unix 'Usage:' message that explicitly lists all options.
+
+'ARGP_HELP_SHORT_USAGE'
+     A unix 'Usage:' message that displays an appropriate placeholder to
+     indicate where the options go; useful for showing the non-option
+     argument syntax.
+
+'ARGP_HELP_SEE'
+     A 'Try ... for more help' message; '...' contains the program name
+     and '--help'.
+
+'ARGP_HELP_LONG'
+     A verbose option help message that gives each option available
+     along with its documentation string.
+
+'ARGP_HELP_PRE_DOC'
+     The part of the argp parser doc string preceding the verbose option
+     help.
+
+'ARGP_HELP_POST_DOC'
+     The part of the argp parser doc string that following the verbose
+     option help.
+
+'ARGP_HELP_DOC'
+     '(ARGP_HELP_PRE_DOC | ARGP_HELP_POST_DOC)'
+
+'ARGP_HELP_BUG_ADDR'
+     A message that prints where to report bugs for this program, if the
+     'argp_program_bug_address' variable contains this information.
+
+'ARGP_HELP_LONG_ONLY'
+     This will modify any output to reflect the 'ARGP_LONG_ONLY' mode.
+
+   The following flags are only understood when used with
+'argp_state_help'.  They control whether the function returns after
+printing its output, or terminates the program:
+
+'ARGP_HELP_EXIT_ERR'
+     This will terminate the program with 'exit (argp_err_exit_status)'.
+
+'ARGP_HELP_EXIT_OK'
+     This will terminate the program with 'exit (0)'.
+
+   The following flags are combinations of the basic flags for printing
+standard messages:
+
+'ARGP_HELP_STD_ERR'
+     Assuming that an error message for a parsing error has printed,
+     this prints a message on how to get help, and terminates the
+     program with an error.
+
+'ARGP_HELP_STD_USAGE'
+     This prints a standard usage message and terminates the program
+     with an error.  This is used when no other specific error messages
+     are appropriate or available.
+
+'ARGP_HELP_STD_HELP'
+     This prints the standard response for a '--help' option, and
+     terminates the program successfully.
 
diff --git a/bin/arm-buildroot-linux-gnueabi-addr2line b/bin/arm-buildroot-linux-gnueabi-addr2line
index 5fe5032..424e71f 100755
--- a/bin/arm-buildroot-linux-gnueabi-addr2line
+++ b/bin/arm-buildroot-linux-gnueabi-addr2line
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-ar b/bin/arm-buildroot-linux-gnueabi-ar
index f1ec35b..d92ee64 100755
--- a/bin/arm-buildroot-linux-gnueabi-ar
+++ b/bin/arm-buildroot-linux-gnueabi-ar
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-as b/bin/arm-buildroot-linux-gnueabi-as
index 46fe577..a430cac 100755
--- a/bin/arm-buildroot-linux-gnueabi-as
+++ b/bin/arm-buildroot-linux-gnueabi-as
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-c++ b/bin/arm-buildroot-linux-gnueabi-c++
index ac64228..12179aa 100755
--- a/bin/arm-buildroot-linux-gnueabi-c++
+++ b/bin/arm-buildroot-linux-gnueabi-c++
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-c++filt b/bin/arm-buildroot-linux-gnueabi-c++filt
index 4cd4ee1..857b2a4 100755
--- a/bin/arm-buildroot-linux-gnueabi-c++filt
+++ b/bin/arm-buildroot-linux-gnueabi-c++filt
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-cpp b/bin/arm-buildroot-linux-gnueabi-cpp
index 9b078aa..194011b 100755
--- a/bin/arm-buildroot-linux-gnueabi-cpp
+++ b/bin/arm-buildroot-linux-gnueabi-cpp
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-elfedit b/bin/arm-buildroot-linux-gnueabi-elfedit
index e9041ba..e27599e 100755
--- a/bin/arm-buildroot-linux-gnueabi-elfedit
+++ b/bin/arm-buildroot-linux-gnueabi-elfedit
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-g++ b/bin/arm-buildroot-linux-gnueabi-g++
index ac64228..12179aa 100755
--- a/bin/arm-buildroot-linux-gnueabi-g++
+++ b/bin/arm-buildroot-linux-gnueabi-g++
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-gcc b/bin/arm-buildroot-linux-gnueabi-gcc
index ada118b..39c2d6b 100755
--- a/bin/arm-buildroot-linux-gnueabi-gcc
+++ b/bin/arm-buildroot-linux-gnueabi-gcc
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-gcc-4.9.1 b/bin/arm-buildroot-linux-gnueabi-gcc-4.9.1
index ada118b..39c2d6b 100755
--- a/bin/arm-buildroot-linux-gnueabi-gcc-4.9.1
+++ b/bin/arm-buildroot-linux-gnueabi-gcc-4.9.1
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-gcc-ar b/bin/arm-buildroot-linux-gnueabi-gcc-ar
index a01841a..7bc6ef5 100755
--- a/bin/arm-buildroot-linux-gnueabi-gcc-ar
+++ b/bin/arm-buildroot-linux-gnueabi-gcc-ar
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-gcc-nm b/bin/arm-buildroot-linux-gnueabi-gcc-nm
index 17cc40d..9e32002 100755
--- a/bin/arm-buildroot-linux-gnueabi-gcc-nm
+++ b/bin/arm-buildroot-linux-gnueabi-gcc-nm
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-gcc-ranlib b/bin/arm-buildroot-linux-gnueabi-gcc-ranlib
index 94899b8..5847e3f 100755
--- a/bin/arm-buildroot-linux-gnueabi-gcc-ranlib
+++ b/bin/arm-buildroot-linux-gnueabi-gcc-ranlib
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-gcov b/bin/arm-buildroot-linux-gnueabi-gcov
index 61de42b..7d388b2 100755
--- a/bin/arm-buildroot-linux-gnueabi-gcov
+++ b/bin/arm-buildroot-linux-gnueabi-gcov
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-gprof b/bin/arm-buildroot-linux-gnueabi-gprof
index 1818477..332ccfe 100755
--- a/bin/arm-buildroot-linux-gnueabi-gprof
+++ b/bin/arm-buildroot-linux-gnueabi-gprof
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-ld b/bin/arm-buildroot-linux-gnueabi-ld
index 4e4f3b8..41e6350 100755
--- a/bin/arm-buildroot-linux-gnueabi-ld
+++ b/bin/arm-buildroot-linux-gnueabi-ld
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-ld.bfd b/bin/arm-buildroot-linux-gnueabi-ld.bfd
index 4e4f3b8..41e6350 100755
--- a/bin/arm-buildroot-linux-gnueabi-ld.bfd
+++ b/bin/arm-buildroot-linux-gnueabi-ld.bfd
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-nm b/bin/arm-buildroot-linux-gnueabi-nm
index b4f726e..ea9edb9 100755
--- a/bin/arm-buildroot-linux-gnueabi-nm
+++ b/bin/arm-buildroot-linux-gnueabi-nm
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-objcopy b/bin/arm-buildroot-linux-gnueabi-objcopy
index 0589d47..1068fc6 100755
--- a/bin/arm-buildroot-linux-gnueabi-objcopy
+++ b/bin/arm-buildroot-linux-gnueabi-objcopy
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-objdump b/bin/arm-buildroot-linux-gnueabi-objdump
index 6446b2d..003124d 100755
--- a/bin/arm-buildroot-linux-gnueabi-objdump
+++ b/bin/arm-buildroot-linux-gnueabi-objdump
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-ranlib b/bin/arm-buildroot-linux-gnueabi-ranlib
index 49a3a7f..377e8ba 100755
--- a/bin/arm-buildroot-linux-gnueabi-ranlib
+++ b/bin/arm-buildroot-linux-gnueabi-ranlib
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-readelf b/bin/arm-buildroot-linux-gnueabi-readelf
index 6194dc7..1288aa0 100755
--- a/bin/arm-buildroot-linux-gnueabi-readelf
+++ b/bin/arm-buildroot-linux-gnueabi-readelf
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-size b/bin/arm-buildroot-linux-gnueabi-size
index a486c4b..1690220 100755
--- a/bin/arm-buildroot-linux-gnueabi-size
+++ b/bin/arm-buildroot-linux-gnueabi-size
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-strings b/bin/arm-buildroot-linux-gnueabi-strings
index c04690a..2a71d2e 100755
--- a/bin/arm-buildroot-linux-gnueabi-strings
+++ b/bin/arm-buildroot-linux-gnueabi-strings
Binary files differ
diff --git a/bin/arm-buildroot-linux-gnueabi-strip b/bin/arm-buildroot-linux-gnueabi-strip
index 2f23bb0..ff12f53 100755
--- a/bin/arm-buildroot-linux-gnueabi-strip
+++ b/bin/arm-buildroot-linux-gnueabi-strip
Binary files differ
diff --git a/bin/gawk b/bin/gawk
index 7e43b64..27808b5 100755
--- a/bin/gawk
+++ b/bin/gawk
Binary files differ
diff --git a/bin/m4 b/bin/m4
index c4114ce..ad45350 100755
--- a/bin/m4
+++ b/bin/m4
Binary files differ
diff --git a/lib/gawk/filefuncs.a b/lib/gawk/filefuncs.a
new file mode 100644
index 0000000..97ddb39
--- /dev/null
+++ b/lib/gawk/filefuncs.a
Binary files differ
diff --git a/lib/gawk/filefuncs.la b/lib/gawk/filefuncs.la
index 8ec925a..ff7acaa 100755
--- a/lib/gawk/filefuncs.la
+++ b/lib/gawk/filefuncs.la
@@ -5,13 +5,13 @@
 # It is necessary for linking the library.
 
 # The name that we can dlopen(3).
-dlname='filefuncs.so'
+dlname=''
 
 # Names of this library.
-library_names='filefuncs.so filefuncs.so filefuncs.so'
+library_names=''
 
 # The name of the static archive.
-old_library=''
+old_library='filefuncs.a'
 
 # Linker flags that can not go in dependency_libs.
 inherited_linker_flags=''
diff --git a/lib/gawk/filefuncs.so b/lib/gawk/filefuncs.so
deleted file mode 100755
index 62b4cd5..0000000
--- a/lib/gawk/filefuncs.so
+++ /dev/null
Binary files differ
diff --git a/lib/gawk/fnmatch.a b/lib/gawk/fnmatch.a
new file mode 100644
index 0000000..49a130b
--- /dev/null
+++ b/lib/gawk/fnmatch.a
Binary files differ
diff --git a/lib/gawk/fnmatch.la b/lib/gawk/fnmatch.la
index cba6a2f..6c76f34 100755
--- a/lib/gawk/fnmatch.la
+++ b/lib/gawk/fnmatch.la
@@ -5,13 +5,13 @@
 # It is necessary for linking the library.
 
 # The name that we can dlopen(3).
-dlname='fnmatch.so'
+dlname=''
 
 # Names of this library.
-library_names='fnmatch.so fnmatch.so fnmatch.so'
+library_names=''
 
 # The name of the static archive.
-old_library=''
+old_library='fnmatch.a'
 
 # Linker flags that can not go in dependency_libs.
 inherited_linker_flags=''
diff --git a/lib/gawk/fnmatch.so b/lib/gawk/fnmatch.so
deleted file mode 100755
index 8c7662c..0000000
--- a/lib/gawk/fnmatch.so
+++ /dev/null
Binary files differ
diff --git a/lib/gawk/fork.a b/lib/gawk/fork.a
new file mode 100644
index 0000000..534c8fd
--- /dev/null
+++ b/lib/gawk/fork.a
Binary files differ
diff --git a/lib/gawk/fork.la b/lib/gawk/fork.la
index 2856cf9..8e612cb 100755
--- a/lib/gawk/fork.la
+++ b/lib/gawk/fork.la
@@ -5,13 +5,13 @@
 # It is necessary for linking the library.
 
 # The name that we can dlopen(3).
-dlname='fork.so'
+dlname=''
 
 # Names of this library.
-library_names='fork.so fork.so fork.so'
+library_names=''
 
 # The name of the static archive.
-old_library=''
+old_library='fork.a'
 
 # Linker flags that can not go in dependency_libs.
 inherited_linker_flags=''
diff --git a/lib/gawk/fork.so b/lib/gawk/fork.so
deleted file mode 100755
index 5dfccbd..0000000
--- a/lib/gawk/fork.so
+++ /dev/null
Binary files differ
diff --git a/lib/gawk/inplace.a b/lib/gawk/inplace.a
new file mode 100644
index 0000000..6b078db
--- /dev/null
+++ b/lib/gawk/inplace.a
Binary files differ
diff --git a/lib/gawk/inplace.la b/lib/gawk/inplace.la
index 6a66dfa..c67efaa 100755
--- a/lib/gawk/inplace.la
+++ b/lib/gawk/inplace.la
@@ -5,13 +5,13 @@
 # It is necessary for linking the library.
 
 # The name that we can dlopen(3).
-dlname='inplace.so'
+dlname=''
 
 # Names of this library.
-library_names='inplace.so inplace.so inplace.so'
+library_names=''
 
 # The name of the static archive.
-old_library=''
+old_library='inplace.a'
 
 # Linker flags that can not go in dependency_libs.
 inherited_linker_flags=''
diff --git a/lib/gawk/inplace.so b/lib/gawk/inplace.so
deleted file mode 100755
index 0c1d922..0000000
--- a/lib/gawk/inplace.so
+++ /dev/null
Binary files differ
diff --git a/lib/gawk/ordchr.a b/lib/gawk/ordchr.a
new file mode 100644
index 0000000..c9ce0ee
--- /dev/null
+++ b/lib/gawk/ordchr.a
Binary files differ
diff --git a/lib/gawk/ordchr.la b/lib/gawk/ordchr.la
index fdf4544..169c85a 100755
--- a/lib/gawk/ordchr.la
+++ b/lib/gawk/ordchr.la
@@ -5,13 +5,13 @@
 # It is necessary for linking the library.
 
 # The name that we can dlopen(3).
-dlname='ordchr.so'
+dlname=''
 
 # Names of this library.
-library_names='ordchr.so ordchr.so ordchr.so'
+library_names=''
 
 # The name of the static archive.
-old_library=''
+old_library='ordchr.a'
 
 # Linker flags that can not go in dependency_libs.
 inherited_linker_flags=''
diff --git a/lib/gawk/ordchr.so b/lib/gawk/ordchr.so
deleted file mode 100755
index 18ce280..0000000
--- a/lib/gawk/ordchr.so
+++ /dev/null
Binary files differ
diff --git a/lib/gawk/readdir.a b/lib/gawk/readdir.a
new file mode 100644
index 0000000..4393d21
--- /dev/null
+++ b/lib/gawk/readdir.a
Binary files differ
diff --git a/lib/gawk/readdir.la b/lib/gawk/readdir.la
index ed86162..d47dc4e 100755
--- a/lib/gawk/readdir.la
+++ b/lib/gawk/readdir.la
@@ -5,13 +5,13 @@
 # It is necessary for linking the library.
 
 # The name that we can dlopen(3).
-dlname='readdir.so'
+dlname=''
 
 # Names of this library.
-library_names='readdir.so readdir.so readdir.so'
+library_names=''
 
 # The name of the static archive.
-old_library=''
+old_library='readdir.a'
 
 # Linker flags that can not go in dependency_libs.
 inherited_linker_flags=''
diff --git a/lib/gawk/readdir.so b/lib/gawk/readdir.so
deleted file mode 100755
index de74164..0000000
--- a/lib/gawk/readdir.so
+++ /dev/null
Binary files differ
diff --git a/lib/gawk/readfile.a b/lib/gawk/readfile.a
new file mode 100644
index 0000000..8406349
--- /dev/null
+++ b/lib/gawk/readfile.a
Binary files differ
diff --git a/lib/gawk/readfile.la b/lib/gawk/readfile.la
index 39351b2..04e9671 100755
--- a/lib/gawk/readfile.la
+++ b/lib/gawk/readfile.la
@@ -5,13 +5,13 @@
 # It is necessary for linking the library.
 
 # The name that we can dlopen(3).
-dlname='readfile.so'
+dlname=''
 
 # Names of this library.
-library_names='readfile.so readfile.so readfile.so'
+library_names=''
 
 # The name of the static archive.
-old_library=''
+old_library='readfile.a'
 
 # Linker flags that can not go in dependency_libs.
 inherited_linker_flags=''
diff --git a/lib/gawk/readfile.so b/lib/gawk/readfile.so
deleted file mode 100755
index 6823c2e..0000000
--- a/lib/gawk/readfile.so
+++ /dev/null
Binary files differ
diff --git a/lib/gawk/revoutput.a b/lib/gawk/revoutput.a
new file mode 100644
index 0000000..c2366cd
--- /dev/null
+++ b/lib/gawk/revoutput.a
Binary files differ
diff --git a/lib/gawk/revoutput.la b/lib/gawk/revoutput.la
index 2098f6a..e4a17da 100755
--- a/lib/gawk/revoutput.la
+++ b/lib/gawk/revoutput.la
@@ -5,13 +5,13 @@
 # It is necessary for linking the library.
 
 # The name that we can dlopen(3).
-dlname='revoutput.so'
+dlname=''
 
 # Names of this library.
-library_names='revoutput.so revoutput.so revoutput.so'
+library_names=''
 
 # The name of the static archive.
-old_library=''
+old_library='revoutput.a'
 
 # Linker flags that can not go in dependency_libs.
 inherited_linker_flags=''
diff --git a/lib/gawk/revoutput.so b/lib/gawk/revoutput.so
deleted file mode 100755
index 48a4a1f..0000000
--- a/lib/gawk/revoutput.so
+++ /dev/null
Binary files differ
diff --git a/lib/gawk/revtwoway.a b/lib/gawk/revtwoway.a
new file mode 100644
index 0000000..bcf9577
--- /dev/null
+++ b/lib/gawk/revtwoway.a
Binary files differ
diff --git a/lib/gawk/revtwoway.la b/lib/gawk/revtwoway.la
index 65bfe6f..e5e5593 100755
--- a/lib/gawk/revtwoway.la
+++ b/lib/gawk/revtwoway.la
@@ -5,13 +5,13 @@
 # It is necessary for linking the library.
 
 # The name that we can dlopen(3).
-dlname='revtwoway.so'
+dlname=''
 
 # Names of this library.
-library_names='revtwoway.so revtwoway.so revtwoway.so'
+library_names=''
 
 # The name of the static archive.
-old_library=''
+old_library='revtwoway.a'
 
 # Linker flags that can not go in dependency_libs.
 inherited_linker_flags=''
diff --git a/lib/gawk/revtwoway.so b/lib/gawk/revtwoway.so
deleted file mode 100755
index a36c2fc..0000000
--- a/lib/gawk/revtwoway.so
+++ /dev/null
Binary files differ
diff --git a/lib/gawk/rwarray.a b/lib/gawk/rwarray.a
new file mode 100644
index 0000000..9b3b513
--- /dev/null
+++ b/lib/gawk/rwarray.a
Binary files differ
diff --git a/lib/gawk/rwarray.la b/lib/gawk/rwarray.la
index b38bcef..692f994 100755
--- a/lib/gawk/rwarray.la
+++ b/lib/gawk/rwarray.la
@@ -5,13 +5,13 @@
 # It is necessary for linking the library.
 
 # The name that we can dlopen(3).
-dlname='rwarray.so'
+dlname=''
 
 # Names of this library.
-library_names='rwarray.so rwarray.so rwarray.so'
+library_names=''
 
 # The name of the static archive.
-old_library=''
+old_library='rwarray.a'
 
 # Linker flags that can not go in dependency_libs.
 inherited_linker_flags=''
diff --git a/lib/gawk/rwarray.so b/lib/gawk/rwarray.so
deleted file mode 100755
index bf16c9b..0000000
--- a/lib/gawk/rwarray.so
+++ /dev/null
Binary files differ
diff --git a/lib/gawk/testext.a b/lib/gawk/testext.a
new file mode 100644
index 0000000..d575fa6
--- /dev/null
+++ b/lib/gawk/testext.a
Binary files differ
diff --git a/lib/gawk/testext.la b/lib/gawk/testext.la
index 90bc3f1..f74c350 100755
--- a/lib/gawk/testext.la
+++ b/lib/gawk/testext.la
@@ -5,13 +5,13 @@
 # It is necessary for linking the library.
 
 # The name that we can dlopen(3).
-dlname='testext.so'
+dlname=''
 
 # Names of this library.
-library_names='testext.so testext.so testext.so'
+library_names=''
 
 # The name of the static archive.
-old_library=''
+old_library='testext.a'
 
 # Linker flags that can not go in dependency_libs.
 inherited_linker_flags=''
diff --git a/lib/gawk/testext.so b/lib/gawk/testext.so
deleted file mode 100755
index 7ff65a0..0000000
--- a/lib/gawk/testext.so
+++ /dev/null
Binary files differ
diff --git a/lib/gawk/time.a b/lib/gawk/time.a
new file mode 100644
index 0000000..2c07d17
--- /dev/null
+++ b/lib/gawk/time.a
Binary files differ
diff --git a/lib/gawk/time.la b/lib/gawk/time.la
index f4025a6..896545c 100755
--- a/lib/gawk/time.la
+++ b/lib/gawk/time.la
@@ -5,13 +5,13 @@
 # It is necessary for linking the library.
 
 # The name that we can dlopen(3).
-dlname='time.so'
+dlname=''
 
 # Names of this library.
-library_names='time.so time.so time.so'
+library_names=''
 
 # The name of the static archive.
-old_library=''
+old_library='time.a'
 
 # Linker flags that can not go in dependency_libs.
 inherited_linker_flags=''
diff --git a/lib/gawk/time.so b/lib/gawk/time.so
deleted file mode 100755
index f3020e4..0000000
--- a/lib/gawk/time.so
+++ /dev/null
Binary files differ
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/crtbegin.o b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/crtbegin.o
index 557dcc0..16c1e46 100644
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/crtbegin.o
+++ b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/crtbegin.o
Binary files differ
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/crtbeginS.o b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/crtbeginS.o
index 099aba5..b10c7e6 100644
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/crtbeginS.o
+++ b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/crtbeginS.o
Binary files differ
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/crtbeginT.o b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/crtbeginT.o
index 4ee8c79..0c855fb 100644
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/crtbeginT.o
+++ b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/crtbeginT.o
Binary files differ
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/crtend.o b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/crtend.o
index a5d83fd..4d46428 100644
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/crtend.o
+++ b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/crtend.o
Binary files differ
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/crtendS.o b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/crtendS.o
index a5d83fd..4d46428 100644
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/crtendS.o
+++ b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/crtendS.o
Binary files differ
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/libgcc.a b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/libgcc.a
index f976481..ce939d5 100644
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/libgcc.a
+++ b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/libgcc.a
Binary files differ
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/libgcc_eh.a b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/libgcc_eh.a
index 1584086..5f936c6 100644
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/libgcc_eh.a
+++ b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/libgcc_eh.a
Binary files differ
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/libgcov.a b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/libgcov.a
index 0f930d4..3d692c0 100644
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/libgcov.a
+++ b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/libgcov.a
Binary files differ
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/gtype.state b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/gtype.state
deleted file mode 100644
index c9a7f48..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/gtype.state
+++ /dev/null
@@ -1,27827 +0,0 @@
-;;;;@@@@ GCC gengtype state
-;;; DON'T EDIT THIS FILE, since generated by GCC's gengtype
-;;; The format of this file is tied to a particular version of GCC.
-;;; Don't parse this file wihout knowing GCC gengtype internals.
-;;; This file should be parsed by the same gengtype which wrote it.
-
-(!version  "4.9.1")
-(!srcdir  "../../gcc")
-(!languages 9 ada c cp fortran go java lto objc objcp)
-(!fileslist 194
- (!srcfile 511  "../libcpp/include/line-map.h")
- (!srcfile 511  "../libcpp/include/cpplib.h")
- (!srcfile 511  "../libcpp/include/cpp-id-data.h")
- (!srcfile 511  "input.h")
- (!srcfile 511  "coretypes.h")
- (!file 511  "auto-host.h")
- (!srcfile 511  "../include/ansidecl.h")
- (!file 511  "options.h")
- (!srcfile 511  "config/dbxelf.h")
- (!srcfile 511  "config/elfos.h")
- (!srcfile 511  "config/gnu-user.h")
- (!srcfile 511  "config/linux.h")
- (!srcfile 511  "config/linux-android.h")
- (!srcfile 511  "config/glibc-stdint.h")
- (!srcfile 511  "config/arm/elf.h")
- (!srcfile 511  "config/arm/linux-gas.h")
- (!srcfile 511  "config/arm/linux-elf.h")
- (!srcfile 511  "config/arm/bpabi.h")
- (!srcfile 511  "config/arm/linux-eabi.h")
- (!srcfile 511  "config/arm/aout.h")
- (!srcfile 511  "config/vxworks-dummy.h")
- (!srcfile 511  "config/arm/arm.h")
- (!srcfile 511  "config/initfini-array.h")
- (!srcfile 511  "defaults.h")
- (!srcfile 511  "../include/hashtab.h")
- (!srcfile 511  "../include/splay-tree.h")
- (!srcfile 511  "bitmap.h")
- (!srcfile 511  "alias.h")
- (!srcfile 511  "coverage.c")
- (!srcfile 511  "rtl.h")
- (!srcfile 511  "optabs.h")
- (!srcfile 511  "tree.h")
- (!srcfile 511  "tree-core.h")
- (!srcfile 511  "libfuncs.h")
- (!srcfile 511  "../libcpp/include/symtab.h")
- (!srcfile 511  "../include/obstack.h")
- (!srcfile 511  "real.h")
- (!srcfile 511  "function.h")
- (!srcfile 511  "insn-addr.h")
- (!srcfile 511  "hwint.h")
- (!srcfile 511  "fixed-value.h")
- (!srcfile 511  "output.h")
- (!srcfile 511  "cfgloop.h")
- (!srcfile 511  "cselib.h")
- (!srcfile 511  "basic-block.h")
- (!srcfile 511  "ipa-ref.h")
- (!srcfile 511  "cgraph.h")
- (!srcfile 511  "reload.h")
- (!srcfile 511  "caller-save.c")
- (!srcfile 511  "symtab.c")
- (!srcfile 511  "alias.c")
- (!srcfile 511  "bitmap.c")
- (!srcfile 511  "cselib.c")
- (!srcfile 511  "cgraph.c")
- (!srcfile 511  "ipa-prop.c")
- (!srcfile 511  "ipa-cp.c")
- (!srcfile 511  "ipa-utils.h")
- (!srcfile 511  "dbxout.c")
- (!srcfile 511  "dwarf2out.h")
- (!srcfile 511  "dwarf2asm.c")
- (!srcfile 511  "dwarf2cfi.c")
- (!srcfile 511  "dwarf2out.c")
- (!srcfile 511  "tree-vect-generic.c")
- (!srcfile 511  "dojump.c")
- (!srcfile 511  "emit-rtl.c")
- (!srcfile 511  "except.h")
- (!srcfile 511  "explow.c")
- (!srcfile 511  "expr.c")
- (!srcfile 511  "expr.h")
- (!srcfile 511  "function.c")
- (!srcfile 511  "except.c")
- (!srcfile 511  "gcse.c")
- (!srcfile 511  "godump.c")
- (!srcfile 511  "lists.c")
- (!srcfile 511  "optabs.c")
- (!srcfile 511  "profile.c")
- (!srcfile 511  "mcf.c")
- (!srcfile 511  "reg-stack.c")
- (!srcfile 511  "cfgrtl.c")
- (!srcfile 511  "sdbout.c")
- (!srcfile 511  "stor-layout.c")
- (!srcfile 511  "stringpool.c")
- (!srcfile 511  "tree.c")
- (!srcfile 511  "varasm.c")
- (!srcfile 511  "gimple.h")
- (!srcfile 511  "gimple-ssa.h")
- (!srcfile 511  "tree-ssanames.c")
- (!srcfile 511  "tree-eh.c")
- (!srcfile 511  "tree-ssa-address.c")
- (!srcfile 511  "tree-cfg.c")
- (!srcfile 511  "tree-dfa.c")
- (!srcfile 511  "tree-iterator.c")
- (!srcfile 511  "gimple-expr.c")
- (!srcfile 511  "tree-chrec.h")
- (!srcfile 511  "tree-scalar-evolution.c")
- (!srcfile 511  "tree-ssa-operands.h")
- (!srcfile 511  "tree-profile.c")
- (!srcfile 511  "tree-nested.c")
- (!srcfile 511  "tree-parloops.c")
- (!srcfile 511  "omp-low.c")
- (!srcfile 511  "targhooks.c")
- (!srcfile 511  "config/arm/arm.c")
- (!srcfile 511  "passes.c")
- (!srcfile 511  "cgraphunit.c")
- (!srcfile 511  "cgraphclones.c")
- (!srcfile 511  "tree-ssa-propagate.c")
- (!srcfile 511  "tree-phinodes.c")
- (!srcfile 511  "tree-ssa-alias.h")
- (!srcfile 511  "tree-ssanames.h")
- (!srcfile 511  "ipa-prop.h")
- (!srcfile 511  "trans-mem.c")
- (!srcfile 511  "lto-streamer.h")
- (!srcfile 511  "target-globals.h")
- (!srcfile 511  "ipa-inline.h")
- (!srcfile 511  "vtable-verify.c")
- (!srcfile 511  "asan.c")
- (!srcfile 511  "ubsan.c")
- (!srcfile 511  "tsan.c")
- (!srcfile 511  "ipa-devirt.c")
- (!srcfile 1  "ada/gcc-interface/ada-tree.h")
- (!srcfile 1  "ada/gcc-interface/gigi.h")
- (!srcfile 1  "ada/gcc-interface/decl.c")
- (!srcfile 1  "ada/gcc-interface/trans.c")
- (!srcfile 1  "ada/gcc-interface/utils.c")
- (!srcfile 1  "ada/gcc-interface/misc.c")
- (!srcfile 2  "c/c-lang.c")
- (!srcfile 130  "c/c-tree.h")
- (!srcfile 130  "c/c-decl.c")
- (!srcfile 390  "c-family/c-common.c")
- (!srcfile 390  "c-family/c-common.h")
- (!srcfile 390  "c-family/c-objc.h")
- (!srcfile 386  "c-family/c-cppbuiltin.c")
- (!srcfile 390  "c-family/c-pragma.h")
- (!srcfile 390  "c-family/c-pragma.c")
- (!srcfile 130  "c/c-objc-common.c")
- (!srcfile 130  "c/c-parser.c")
- (!srcfile 130  "c/c-lang.h")
- (!srcfile 260  "cp/rtti.c")
- (!srcfile 260  "cp/mangle.c")
- (!srcfile 260  "cp/name-lookup.h")
- (!srcfile 260  "cp/name-lookup.c")
- (!srcfile 260  "cp/cp-tree.h")
- (!srcfile 260  "cp/decl.h")
- (!srcfile 260  "cp/call.c")
- (!srcfile 260  "cp/decl.c")
- (!srcfile 260  "cp/decl2.c")
- (!srcfile 260  "cp/pt.c")
- (!srcfile 260  "cp/repo.c")
- (!srcfile 260  "cp/semantics.c")
- (!srcfile 260  "cp/tree.c")
- (!srcfile 260  "cp/parser.h")
- (!srcfile 260  "cp/parser.c")
- (!srcfile 260  "cp/method.c")
- (!srcfile 260  "cp/typeck2.c")
- (!srcfile 260  "c-family/c-lex.c")
- (!srcfile 260  "cp/class.c")
- (!srcfile 260  "cp/cp-objcp-common.c")
- (!srcfile 4  "cp/cp-lang.c")
- (!srcfile 4  "cp/except.c")
- (!srcfile 4  "cp/vtable-class-hierarchy.c")
- (!srcfile 8  "fortran/f95-lang.c")
- (!srcfile 8  "fortran/trans-decl.c")
- (!srcfile 8  "fortran/trans-intrinsic.c")
- (!srcfile 8  "fortran/trans-io.c")
- (!srcfile 8  "fortran/trans-stmt.c")
- (!srcfile 8  "fortran/trans-types.c")
- (!srcfile 8  "fortran/trans-types.h")
- (!srcfile 8  "fortran/trans.h")
- (!srcfile 8  "fortran/trans-const.h")
- (!srcfile 16  "go/go-lang.c")
- (!srcfile 16  "go/go-c.h")
- (!srcfile 32  "java/java-tree.h")
- (!srcfile 32  "java/jcf.h")
- (!srcfile 32  "java/parse.h")
- (!srcfile 32  "java/builtins.c")
- (!srcfile 32  "java/class.c")
- (!srcfile 32  "java/constants.c")
- (!srcfile 32  "java/decl.c")
- (!srcfile 32  "java/expr.c")
- (!srcfile 32  "java/jcf-parse.c")
- (!srcfile 32  "java/lang.c")
- (!srcfile 32  "java/mangle.c")
- (!srcfile 32  "java/resource.c")
- (!srcfile 64  "lto/lto-tree.h")
- (!srcfile 64  "lto/lto-lang.c")
- (!srcfile 64  "lto/lto.c")
- (!srcfile 64  "lto/lto.h")
- (!srcfile 384  "objc/objc-map.h")
- (!srcfile 384  "objc/objc-act.h")
- (!srcfile 384  "objc/objc-act.c")
- (!srcfile 384  "objc/objc-runtime-shared-support.c")
- (!srcfile 384  "objc/objc-gnu-runtime-abi-01.c")
- (!srcfile 384  "objc/objc-next-runtime-abi-01.c")
- (!srcfile 384  "objc/objc-next-runtime-abi-02.c")
-)
-(!structures 1073
- 
- (!type user_struct 1 
-  (!type pointer 2 nil  gc_used
-   (!type already_seen 1)
-  )
-  gc_pointed_to "vec<ivarref_entry,va_gc>"
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 2765)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type undefined 3 nil  gc_unused "va_gc"
-     (!srcfileloc  "rtl.h" 238)
-    )
-    (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 2765)
-    nil )
-   (!pair  "ivarref_entry"
-    (!type struct 4 nil  gc_used "ivarref_entry"
-     (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 2763)
-     (!fields 2 
-      (!pair  "decl"
-       (!type pointer 5 
-        (!type pointer 6 nil  gc_used
-         (!type already_seen 5)
-        )
-        gc_pointed_to
-        (!type union 7 
-         (!type already_seen 5)
-         gc_pointed_to "tree_node"
-         (!srcfileloc  "tree-core.h" 1631)
-         (!fields 38 
-          (!pair  "base"
-           (!type struct 8 nil  gc_used "tree_base"
-            (!srcfileloc  "tree-core.h" 766)
-            (!fields 18 
-             (!pair  "code"
-              (!type scalar_nonchar 9 
-               (!type pointer 10 
-                (!type pointer 11 nil  gc_unused
-                 (!type already_seen 10)
-                )
-                gc_used
-                (!type already_seen 9)
-               )
-               gc_pointed_to)
-              (!srcfileloc  "tree-core.h" 711)
-              nil )
-             (!pair  "side_effects_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 713)
-              nil )
-             (!pair  "constant_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 714)
-              nil )
-             (!pair  "addressable_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 715)
-              nil )
-             (!pair  "volatile_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 716)
-              nil )
-             (!pair  "readonly_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 717)
-              nil )
-             (!pair  "asm_written_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 718)
-              nil )
-             (!pair  "nowarning_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 719)
-              nil )
-             (!pair  "visited"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 720)
-              nil )
-             (!pair  "used_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 722)
-              nil )
-             (!pair  "nothrow_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 723)
-              nil )
-             (!pair  "static_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 724)
-              nil )
-             (!pair  "public_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 725)
-              nil )
-             (!pair  "private_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 726)
-              nil )
-             (!pair  "protected_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 727)
-              nil )
-             (!pair  "deprecated_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 728)
-              nil )
-             (!pair  "default_def_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 729)
-              nil )
-             (!pair  "u"
-              (!type union 12 nil  gc_unused "anonymous:../../gcc/tree-core.h:731"
-               (!srcfileloc  "tree-core.h" 765)
-               (!fields 3 
-                (!pair  "bits"
-                 (!type struct 13 nil  gc_unused "anonymous:../../gcc/tree-core.h:734"
-                  (!srcfileloc  "tree-core.h" 757)
-                  (!fields 16 
-                   (!pair  "lang_flag_0"
-                    (!type already_seen 9)
-                    (!srcfileloc  "tree-core.h" 735)
-                    nil )
-                   (!pair  "lang_flag_1"
-                    (!type already_seen 9)
-                    (!srcfileloc  "tree-core.h" 736)
-                    nil )
-                   (!pair  "lang_flag_2"
-                    (!type already_seen 9)
-                    (!srcfileloc  "tree-core.h" 737)
-                    nil )
-                   (!pair  "lang_flag_3"
-                    (!type already_seen 9)
-                    (!srcfileloc  "tree-core.h" 738)
-                    nil )
-                   (!pair  "lang_flag_4"
-                    (!type already_seen 9)
-                    (!srcfileloc  "tree-core.h" 739)
-                    nil )
-                   (!pair  "lang_flag_5"
-                    (!type already_seen 9)
-                    (!srcfileloc  "tree-core.h" 740)
-                    nil )
-                   (!pair  "lang_flag_6"
-                    (!type already_seen 9)
-                    (!srcfileloc  "tree-core.h" 741)
-                    nil )
-                   (!pair  "saturating_flag"
-                    (!type already_seen 9)
-                    (!srcfileloc  "tree-core.h" 742)
-                    nil )
-                   (!pair  "unsigned_flag"
-                    (!type already_seen 9)
-                    (!srcfileloc  "tree-core.h" 744)
-                    nil )
-                   (!pair  "packed_flag"
-                    (!type already_seen 9)
-                    (!srcfileloc  "tree-core.h" 745)
-                    nil )
-                   (!pair  "user_align"
-                    (!type already_seen 9)
-                    (!srcfileloc  "tree-core.h" 746)
-                    nil )
-                   (!pair  "nameless_flag"
-                    (!type already_seen 9)
-                    (!srcfileloc  "tree-core.h" 747)
-                    nil )
-                   (!pair  "atomic_flag"
-                    (!type already_seen 9)
-                    (!srcfileloc  "tree-core.h" 748)
-                    nil )
-                   (!pair  "spare0"
-                    (!type already_seen 9)
-                    (!srcfileloc  "tree-core.h" 749)
-                    nil )
-                   (!pair  "spare1"
-                    (!type already_seen 9)
-                    (!srcfileloc  "tree-core.h" 751)
-                    nil )
-                   (!pair  "address_space"
-                    (!type already_seen 9)
-                    (!srcfileloc  "tree-core.h" 756)
-                    nil )
-                  )
-                  nil 511 nil nil )
-                 (!srcfileloc  "tree-core.h" 757)
-                 nil )
-                (!pair  "length"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 762)
-                 nil )
-                (!pair  "version"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 764)
-                 nil )
-               )
-               nil 511 nil )
-              (!srcfileloc  "tree-core.h" 765)
-              (!options 
-               (!option skip string  "")
-              )
-             )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1589)
-           (!options 
-            (!option tag string  "TS_BASE")
-           )
-          )
-          (!pair  "typed"
-           (!type struct 14 nil  gc_used "tree_typed"
-            (!srcfileloc  "tree-core.h" 1042)
-            (!fields 2 
-             (!pair  "base"
-              (!type already_seen 8)
-              (!srcfileloc  "tree-core.h" 1040)
-              nil )
-             (!pair  "type"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1041)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1590)
-           (!options 
-            (!option tag string  "TS_TYPED")
-           )
-          )
-          (!pair  "common"
-           (!type struct 15 nil  gc_used "tree_common"
-            (!srcfileloc  "tree-core.h" 1047)
-            (!fields 2 
-             (!pair  "typed"
-              (!type already_seen 14)
-              (!srcfileloc  "tree-core.h" 1045)
-              nil )
-             (!pair  "chain"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1046)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1591)
-           (!options 
-            (!option tag string  "TS_COMMON")
-           )
-          )
-          (!pair  "int_cst"
-           (!type struct 16 nil  gc_used "tree_int_cst"
-            (!srcfileloc  "tree-core.h" 1052)
-            (!fields 2 
-             (!pair  "typed"
-              (!type already_seen 14)
-              (!srcfileloc  "tree-core.h" 1050)
-              nil )
-             (!pair  "int_cst"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1051)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1592)
-           (!options 
-            (!option tag string  "TS_INT_CST")
-           )
-          )
-          (!pair  "real_cst"
-           (!type struct 17 nil  gc_used "tree_real_cst"
-            (!srcfileloc  "tree-core.h" 1058)
-            (!fields 2 
-             (!pair  "typed"
-              (!type already_seen 14)
-              (!srcfileloc  "tree-core.h" 1056)
-              nil )
-             (!pair  "real_cst_ptr"
-              (!type pointer 18 nil  gc_used
-               (!type struct 19 
-                (!type already_seen 18)
-                gc_pointed_to "real_value"
-                (!srcfileloc  "real.h" 52)
-                (!fields 7 
-                 (!pair  "cl"
-                  (!type already_seen 9)
-                  (!srcfileloc  "real.h" 45)
-                  nil )
-                 (!pair  "decimal"
-                  (!type already_seen 9)
-                  (!srcfileloc  "real.h" 46)
-                  nil )
-                 (!pair  "sign"
-                  (!type already_seen 9)
-                  (!srcfileloc  "real.h" 47)
-                  nil )
-                 (!pair  "signalling"
-                  (!type already_seen 9)
-                  (!srcfileloc  "real.h" 48)
-                  nil )
-                 (!pair  "canonical"
-                  (!type already_seen 9)
-                  (!srcfileloc  "real.h" 49)
-                  nil )
-                 (!pair  "uexp"
-                  (!type already_seen 9)
-                  (!srcfileloc  "real.h" 50)
-                  nil )
-                 (!pair  "sig"
-                  (!type array 20 nil  gc_used "SIGSZ" 
-                   (!type already_seen 9)
-                  )
-                  (!srcfileloc  "real.h" 51)
-                  nil )
-                )
-                nil 511 nil nil )
-              )
-              (!srcfileloc  "tree-core.h" 1057)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1593)
-           (!options 
-            (!option tag string  "TS_REAL_CST")
-           )
-          )
-          (!pair  "fixed_cst"
-           (!type struct 21 nil  gc_used "tree_fixed_cst"
-            (!srcfileloc  "tree-core.h" 1063)
-            (!fields 2 
-             (!pair  "typed"
-              (!type already_seen 14)
-              (!srcfileloc  "tree-core.h" 1061)
-              nil )
-             (!pair  "fixed_cst_ptr"
-              (!type pointer 22 nil  gc_used
-               (!type struct 23 
-                (!type already_seen 22)
-                gc_pointed_to "fixed_value"
-                (!srcfileloc  "fixed-value.h" 31)
-                (!fields 2 
-                 (!pair  "data"
-                  (!type already_seen 9)
-                  (!srcfileloc  "fixed-value.h" 29)
-                  nil )
-                 (!pair  "mode"
-                  (!type already_seen 9)
-                  (!srcfileloc  "fixed-value.h" 30)
-                  nil )
-                )
-                nil 511 nil nil )
-              )
-              (!srcfileloc  "tree-core.h" 1062)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1594)
-           (!options 
-            (!option tag string  "TS_FIXED_CST")
-           )
-          )
-          (!pair  "vector"
-           (!type struct 24 nil  gc_used "tree_vector"
-            (!srcfileloc  "tree-core.h" 1080)
-            (!fields 2 
-             (!pair  "typed"
-              (!type already_seen 14)
-              (!srcfileloc  "tree-core.h" 1078)
-              nil )
-             (!pair  "elts"
-              (!type array 25 nil  gc_used "1" 
-               (!type already_seen 5)
-              )
-              (!srcfileloc  "tree-core.h" 1079)
-              (!options 
-               (!option length string  "TYPE_VECTOR_SUBPARTS (TREE_TYPE ((tree)&%h))")
-              )
-             )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1595)
-           (!options 
-            (!option tag string  "TS_VECTOR")
-           )
-          )
-          (!pair  "string"
-           (!type struct 26 nil  gc_used "tree_string"
-            (!srcfileloc  "tree-core.h" 1069)
-            (!fields 3 
-             (!pair  "typed"
-              (!type already_seen 14)
-              (!srcfileloc  "tree-core.h" 1066)
-              nil )
-             (!pair  "length"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1067)
-              nil )
-             (!pair  "str"
-              (!type array 27 nil  gc_used "1" 
-               (!type scalar_char 28 
-                (!type pointer 29 
-                 (!type pointer 30 nil  gc_unused
-                  (!type already_seen 29)
-                 )
-                 gc_unused
-                 (!type already_seen 28)
-                )
-                gc_used)
-              )
-              (!srcfileloc  "tree-core.h" 1068)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1596)
-           (!options 
-            (!option tag string  "TS_STRING")
-           )
-          )
-          (!pair  "complex"
-           (!type struct 31 nil  gc_used "tree_complex"
-            (!srcfileloc  "tree-core.h" 1075)
-            (!fields 3 
-             (!pair  "typed"
-              (!type already_seen 14)
-              (!srcfileloc  "tree-core.h" 1072)
-              nil )
-             (!pair  "real"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1073)
-              nil )
-             (!pair  "imag"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1074)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1597)
-           (!options 
-            (!option tag string  "TS_COMPLEX")
-           )
-          )
-          (!pair  "identifier"
-           (!type struct 32 nil  gc_used "tree_identifier"
-            (!srcfileloc  "tree-core.h" 1085)
-            (!fields 2 
-             (!pair  "common"
-              (!type already_seen 15)
-              (!srcfileloc  "tree-core.h" 1083)
-              nil )
-             (!pair  "id"
-              (!type struct 33 
-               (!type pointer 34 
-                (!type pointer 35 nil  gc_unused
-                 (!type already_seen 34)
-                )
-                gc_unused
-                (!type already_seen 33)
-               )
-               gc_used "ht_identifier"
-               (!srcfileloc  "../libcpp/include/symtab.h" 35)
-               (!fields 3 
-                (!pair  "str"
-                 (!type string 36 nil  gc_used)
-                 (!srcfileloc  "../libcpp/include/symtab.h" 32)
-                 nil )
-                (!pair  "len"
-                 (!type already_seen 9)
-                 (!srcfileloc  "../libcpp/include/symtab.h" 33)
-                 nil )
-                (!pair  "hash_value"
-                 (!type already_seen 9)
-                 (!srcfileloc  "../libcpp/include/symtab.h" 34)
-                 nil )
-               )
-               nil 511 nil nil )
-              (!srcfileloc  "tree-core.h" 1084)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1598)
-           (!options 
-            (!option tag string  "TS_IDENTIFIER")
-           )
-          )
-          (!pair  "decl_minimal"
-           (!type struct 37 nil  gc_used "tree_decl_minimal"
-            (!srcfileloc  "tree-core.h" 1319)
-            (!fields 5 
-             (!pair  "common"
-              (!type already_seen 15)
-              (!srcfileloc  "tree-core.h" 1314)
-              nil )
-             (!pair  "locus"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1315)
-              nil )
-             (!pair  "uid"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1316)
-              nil )
-             (!pair  "name"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1317)
-              nil )
-             (!pair  "context"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1318)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1599)
-           (!options 
-            (!option tag string  "TS_DECL_MINIMAL")
-           )
-          )
-          (!pair  "decl_common"
-           (!type struct 38 nil  gc_used "tree_decl_common"
-            (!srcfileloc  "tree-core.h" 1385)
-            (!fields 35 
-             (!pair  "common"
-              (!type already_seen 37)
-              (!srcfileloc  "tree-core.h" 1322)
-              nil )
-             (!pair  "size"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1323)
-              nil )
-             (!pair  "mode"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1325)
-              nil )
-             (!pair  "nonlocal_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1327)
-              nil )
-             (!pair  "virtual_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1328)
-              nil )
-             (!pair  "ignored_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1329)
-              nil )
-             (!pair  "abstract_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1330)
-              nil )
-             (!pair  "artificial_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1331)
-              nil )
-             (!pair  "preserve_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1332)
-              nil )
-             (!pair  "debug_expr_is_from"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1333)
-              nil )
-             (!pair  "lang_flag_0"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1335)
-              nil )
-             (!pair  "lang_flag_1"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1336)
-              nil )
-             (!pair  "lang_flag_2"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1337)
-              nil )
-             (!pair  "lang_flag_3"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1338)
-              nil )
-             (!pair  "lang_flag_4"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1339)
-              nil )
-             (!pair  "lang_flag_5"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1340)
-              nil )
-             (!pair  "lang_flag_6"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1341)
-              nil )
-             (!pair  "lang_flag_7"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1342)
-              nil )
-             (!pair  "lang_flag_8"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1343)
-              nil )
-             (!pair  "decl_flag_0"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1346)
-              nil )
-             (!pair  "decl_flag_1"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1350)
-              nil )
-             (!pair  "decl_flag_2"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1354)
-              nil )
-             (!pair  "decl_flag_3"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1356)
-              nil )
-             (!pair  "gimple_reg_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1359)
-              nil )
-             (!pair  "decl_by_reference_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1361)
-              nil )
-             (!pair  "decl_read_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1363)
-              nil )
-             (!pair  "decl_nonshareable_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1365)
-              nil )
-             (!pair  "off_align"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1368)
-              nil )
-             (!pair  "align"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1373)
-              nil )
-             (!pair  "pt_uid"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1376)
-              nil )
-             (!pair  "size_unit"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1378)
-              nil )
-             (!pair  "initial"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1379)
-              nil )
-             (!pair  "attributes"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1380)
-              nil )
-             (!pair  "abstract_origin"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1381)
-              nil )
-             (!pair  "lang_specific"
-              (!type pointer 39 nil  gc_used
-               (!type lang_struct 40 
-                (!type already_seen 39)
-                gc_pointed_to "lang_decl"
-                (!srcfileloc  "ada/gcc-interface/ada-tree.h" 41)
-                (!fields 0 )
-                (!options 
-                 (!option variable_size string  "")
-                )
-                511 
-                (!homotypes 7
-                 (!type struct 41 nil  gc_pointed_to "lang_decl"
-                  (!srcfileloc  "lto/lto-tree.h" 34)
-                  (!fields 1 
-                   (!pair  "dummy"
-                    (!type already_seen 9)
-                    (!srcfileloc  "lto/lto-tree.h" 33)
-                    nil )
-                  )
-                  (!options 
-                   (!option variable_size string  "")
-                  )
-                  64 
-                  (!type already_seen 40)
-                  nil )
-                 
-                 (!type struct 42 nil  gc_pointed_to "lang_decl"
-                  (!srcfileloc  "java/java-tree.h" 818)
-                  (!fields 2 
-                   (!pair  "desc"
-                    (!type already_seen 9)
-                    (!srcfileloc  "java/java-tree.h" 812)
-                    nil )
-                   (!pair  "u"
-                    (!type union 43 nil  gc_used "lang_decl_u"
-                     (!srcfileloc  "java/java-tree.h" 817)
-                     (!fields 2 
-                      (!pair  "f"
-                       (!type struct 44 nil  gc_used "lang_decl_func"
-                        (!srcfileloc  "java/java-tree.h" 744)
-                        (!fields 20 
-                         (!pair  "code_offset"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 717)
-                          nil )
-                         (!pair  "code_length"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 718)
-                          nil )
-                         (!pair  "linenumbers_offset"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 719)
-                          nil )
-                         (!pair  "localvariables_offset"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 720)
-                          nil )
-                         (!pair  "arg_slots"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 721)
-                          nil )
-                         (!pair  "max_locals"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 722)
-                          nil )
-                         (!pair  "max_stack"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 723)
-                          nil )
-                         (!pair  "arg_slot_count"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 724)
-                          nil )
-                         (!pair  "last_line"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 725)
-                          nil )
-                         (!pair  "throws_list"
-                          (!type pointer 45 nil  gc_used
-                           (!type user_struct 46 
-                            (!type already_seen 45)
-                            gc_pointed_to "vec<tree,va_gc>"
-                            (!srcfileloc  "tree-core.h" 1233)
-                            (!fields 2 
-                             (!pair  "va_gc"
-                              (!type already_seen 3)
-                              (!srcfileloc  "tree-core.h" 1233)
-                              nil )
-                             (!pair  "tree"
-                              (!type already_seen 5)
-                              (!srcfileloc  "tree-core.h" 1233)
-                              nil )
-                            )
-                           )
-                          )
-                          (!srcfileloc  "java/java-tree.h" 726)
-                          nil )
-                         (!pair  "exc_obj"
-                          (!type already_seen 5)
-                          (!srcfileloc  "java/java-tree.h" 727)
-                          nil )
-                         (!pair  "init_test_table"
-                          (!type pointer 47 nil  gc_used
-                           (!type param_struct 48 
-                            (!type already_seen 47)
-                            gc_pointed_to
-                            (!type struct 49 
-                             (!type pointer 50 nil  gc_unused
-                              (!type already_seen 49)
-                             )
-                             gc_used "htab"
-                             (!srcfileloc  "../include/hashtab.h" 142)
-                             (!fields 15 
-                              (!pair  "hash_f"
-                               (!type already_seen 9)
-                               (!srcfileloc  "../include/hashtab.h" 102)
-                               nil )
-                              (!pair  "eq_f"
-                               (!type already_seen 9)
-                               (!srcfileloc  "../include/hashtab.h" 105)
-                               nil )
-                              (!pair  "del_f"
-                               (!type already_seen 9)
-                               (!srcfileloc  "../include/hashtab.h" 108)
-                               nil )
-                              (!pair  "entries"
-                               (!type already_seen 11)
-                               (!srcfileloc  "../include/hashtab.h" 111)
-                               (!options 
-                                (!option length string  "%h.size")
-                                (!option use_param string  "")
-                               )
-                              )
-                              (!pair  "size"
-                               (!type already_seen 9)
-                               (!srcfileloc  "../include/hashtab.h" 114)
-                               nil )
-                              (!pair  "n_elements"
-                               (!type already_seen 9)
-                               (!srcfileloc  "../include/hashtab.h" 117)
-                               nil )
-                              (!pair  "n_deleted"
-                               (!type already_seen 9)
-                               (!srcfileloc  "../include/hashtab.h" 120)
-                               nil )
-                              (!pair  "searches"
-                               (!type already_seen 9)
-                               (!srcfileloc  "../include/hashtab.h" 124)
-                               nil )
-                              (!pair  "collisions"
-                               (!type already_seen 9)
-                               (!srcfileloc  "../include/hashtab.h" 128)
-                               nil )
-                              (!pair  "alloc_f"
-                               (!type already_seen 9)
-                               (!srcfileloc  "../include/hashtab.h" 131)
-                               nil )
-                              (!pair  "free_f"
-                               (!type already_seen 9)
-                               (!srcfileloc  "../include/hashtab.h" 132)
-                               nil )
-                              (!pair  "alloc_arg"
-                               (!type already_seen 10)
-                               (!srcfileloc  "../include/hashtab.h" 135)
-                               (!options 
-                                (!option skip string  "")
-                               )
-                              )
-                              (!pair  "alloc_with_arg_f"
-                               (!type already_seen 9)
-                               (!srcfileloc  "../include/hashtab.h" 136)
-                               nil )
-                              (!pair  "free_with_arg_f"
-                               (!type already_seen 9)
-                               (!srcfileloc  "../include/hashtab.h" 137)
-                               nil )
-                              (!pair  "size_prime_index"
-                               (!type already_seen 9)
-                               (!srcfileloc  "../include/hashtab.h" 141)
-                               nil )
-                             )
-                             nil 511 nil nil )
-                            
-                            (!type pointer 51 nil  gc_used
-                             (!type struct 52 
-                              (!type already_seen 51)
-                              gc_pointed_to "treetreehash_entry"
-                              (!srcfileloc  "java/java-tree.h" 749)
-                              (!fields 2 
-                               (!pair  "key"
-                                (!type already_seen 5)
-                                (!srcfileloc  "java/java-tree.h" 747)
-                                nil )
-                               (!pair  "value"
-                                (!type already_seen 5)
-                                (!srcfileloc  "java/java-tree.h" 748)
-                                nil )
-                              )
-                              nil 32 nil nil )
-                            )
-                            nil nil nil nil nil nil nil nil nil nil )
-                          )
-                          (!srcfileloc  "java/java-tree.h" 730)
-                          (!options 
-                           (!option param_is type 
-                            (!type already_seen 52)
-                           )
-                          )
-                         )
-                         (!pair  "ict"
-                          (!type pointer 53 nil  gc_used
-                           (!type param_struct 54 
-                            (!type already_seen 53)
-                            gc_pointed_to
-                            (!type already_seen 49)
-                            
-                            (!type already_seen 5)
-                            nil nil nil nil nil nil nil nil nil nil )
-                          )
-                          (!srcfileloc  "java/java-tree.h" 733)
-                          (!options 
-                           (!option param_is type 
-                            (!type already_seen 7)
-                           )
-                          )
-                         )
-                         (!pair  "native"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 735)
-                          nil )
-                         (!pair  "strictfp"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 736)
-                          nil )
-                         (!pair  "invisible"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 737)
-                          nil )
-                         (!pair  "dummy"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 740)
-                          nil )
-                         (!pair  "local_cni"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 741)
-                          nil )
-                         (!pair  "bridge"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 742)
-                          nil )
-                         (!pair  "varargs"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 743)
-                          nil )
-                        )
-                        nil 32 nil nil )
-                       (!srcfileloc  "java/java-tree.h" 815)
-                       (!options 
-                        (!option tag string  "LANG_DECL_FUNC")
-                       )
-                      )
-                      (!pair  "v"
-                       (!type struct 55 nil  gc_used "lang_decl_var"
-                        (!srcfileloc  "java/java-tree.h" 805)
-                        (!fields 10 
-                         (!pair  "slot_number"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 795)
-                          nil )
-                         (!pair  "start_pc"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 796)
-                          nil )
-                         (!pair  "end_pc"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 797)
-                          nil )
-                         (!pair  "slot_chain"
-                          (!type already_seen 5)
-                          (!srcfileloc  "java/java-tree.h" 798)
-                          nil )
-                         (!pair  "owner"
-                          (!type already_seen 5)
-                          (!srcfileloc  "java/java-tree.h" 799)
-                          nil )
-                         (!pair  "freed"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 800)
-                          nil )
-                         (!pair  "local_slot"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 801)
-                          nil )
-                         (!pair  "class_field"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 802)
-                          nil )
-                         (!pair  "vtable"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 803)
-                          nil )
-                         (!pair  "field_enum"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 804)
-                          nil )
-                        )
-                        nil 32 nil nil )
-                       (!srcfileloc  "java/java-tree.h" 816)
-                       (!options 
-                        (!option tag string  "LANG_DECL_VAR")
-                       )
-                      )
-                     )
-                     nil 32 
-                     (!type lang_struct 56 nil  gc_used "lang_decl_u"
-                      (!srcfileloc  "cp/cp-tree.h" 2071)
-                      (!fields 0 )
-                      (!options 
-                       (!option desc string  "%h.base.selector")
-                      )
-                      292 
-                      (!homotypes 2
-                       (!type already_seen 43)
-                       
-                       (!type union 57 nil  gc_used "lang_decl_u"
-                        (!srcfileloc  "cp/cp-tree.h" 2071)
-                        (!fields 5 
-                         (!pair  "base"
-                          (!type struct 58 nil  gc_used "lang_decl_base"
-                           (!srcfileloc  "cp/cp-tree.h" 1950)
-                           (!fields 12 
-                            (!pair  "selector"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 1937)
-                             nil )
-                            (!pair  "language"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 1938)
-                             nil )
-                            (!pair  "use_template"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 1939)
-                             nil )
-                            (!pair  "not_really_extern"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 1940)
-                             nil )
-                            (!pair  "initialized_in_class"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 1941)
-                             nil )
-                            (!pair  "repo_available_p"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 1942)
-                             nil )
-                            (!pair  "threadprivate_or_deleted_p"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 1943)
-                             nil )
-                            (!pair  "anticipated_p"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 1944)
-                             nil )
-                            (!pair  "friend_attr"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 1945)
-                             nil )
-                            (!pair  "template_conv_p"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 1946)
-                             nil )
-                            (!pair  "odr_used"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 1947)
-                             nil )
-                            (!pair  "u2sel"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 1948)
-                             nil )
-                           )
-                           nil 260 nil nil )
-                          (!srcfileloc  "cp/cp-tree.h" 2066)
-                          (!options 
-                           (!option default string  "")
-                          )
-                         )
-                         (!pair  "min"
-                          (!type struct 59 nil  gc_used "lang_decl_min"
-                           (!srcfileloc  "cp/cp-tree.h" 1982)
-                           (!fields 3 
-                            (!pair  "base"
-                             (!type already_seen 58)
-                             (!srcfileloc  "cp/cp-tree.h" 1964)
-                             nil )
-                            (!pair  "template_info"
-                             (!type already_seen 5)
-                             (!srcfileloc  "cp/cp-tree.h" 1971)
-                             nil )
-                            (!pair  "u2"
-                             (!type union 60 nil  gc_used "lang_decl_u2"
-                              (!srcfileloc  "cp/cp-tree.h" 1981)
-                              (!fields 2 
-                               (!pair  "access"
-                                (!type already_seen 5)
-                                (!srcfileloc  "cp/cp-tree.h" 1977)
-                                (!options 
-                                 (!option tag string  "0")
-                                )
-                               )
-                               (!pair  "discriminator"
-                                (!type already_seen 9)
-                                (!srcfileloc  "cp/cp-tree.h" 1980)
-                                (!options 
-                                 (!option tag string  "1")
-                                )
-                               )
-                              )
-                              nil 260 nil )
-                             (!srcfileloc  "cp/cp-tree.h" 1981)
-                             (!options 
-                              (!option desc string  "%0.u.base.u2sel")
-                             )
-                            )
-                           )
-                           nil 260 nil nil )
-                          (!srcfileloc  "cp/cp-tree.h" 2067)
-                          (!options 
-                           (!option tag string  "0")
-                          )
-                         )
-                         (!pair  "fn"
-                          (!type struct 61 nil  gc_used "lang_decl_fn"
-                           (!srcfileloc  "cp/cp-tree.h" 2043)
-                           (!fields 22 
-                            (!pair  "min"
-                             (!type already_seen 59)
-                             (!srcfileloc  "cp/cp-tree.h" 1987)
-                             nil )
-                            (!pair  "operator_code"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 1991)
-                             nil )
-                            (!pair  "global_ctor_p"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 1993)
-                             nil )
-                            (!pair  "global_dtor_p"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 1994)
-                             nil )
-                            (!pair  "constructor_attr"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 1995)
-                             nil )
-                            (!pair  "destructor_attr"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 1996)
-                             nil )
-                            (!pair  "assignment_operator_p"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 1997)
-                             nil )
-                            (!pair  "static_function"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 1998)
-                             nil )
-                            (!pair  "pure_virtual"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 1999)
-                             nil )
-                            (!pair  "defaulted_p"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 2000)
-                             nil )
-                            (!pair  "has_in_charge_parm_p"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 2002)
-                             nil )
-                            (!pair  "has_vtt_parm_p"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 2003)
-                             nil )
-                            (!pair  "pending_inline_p"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 2004)
-                             nil )
-                            (!pair  "nonconverting"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 2005)
-                             nil )
-                            (!pair  "thunk_p"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 2006)
-                             nil )
-                            (!pair  "this_thunk_p"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 2007)
-                             nil )
-                            (!pair  "hidden_friend_p"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 2008)
-                             nil )
-                            (!pair  "omp_declare_reduction_p"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 2009)
-                             nil )
-                            (!pair  "befriending_classes"
-                             (!type already_seen 5)
-                             (!srcfileloc  "cp/cp-tree.h" 2015)
-                             nil )
-                            (!pair  "context"
-                             (!type already_seen 5)
-                             (!srcfileloc  "cp/cp-tree.h" 2023)
-                             nil )
-                            (!pair  "u5"
-                             (!type union 62 nil  gc_used "lang_decl_u5"
-                              (!srcfileloc  "cp/cp-tree.h" 2034)
-                              (!fields 2 
-                               (!pair  "cloned_function"
-                                (!type already_seen 5)
-                                (!srcfileloc  "cp/cp-tree.h" 2029)
-                                (!options 
-                                 (!option tag string  "0")
-                                )
-                               )
-                               (!pair  "fixed_offset"
-                                (!type already_seen 9)
-                                (!srcfileloc  "cp/cp-tree.h" 2033)
-                                (!options 
-                                 (!option tag string  "1")
-                                )
-                               )
-                              )
-                              nil 260 nil )
-                             (!srcfileloc  "cp/cp-tree.h" 2034)
-                             (!options 
-                              (!option desc string  "%1.thunk_p")
-                             )
-                            )
-                            (!pair  "u"
-                             (!type union 63 nil  gc_used "lang_decl_u3"
-                              (!srcfileloc  "cp/cp-tree.h" 2041)
-                              (!fields 2 
-                               (!pair  "pending_inline_info"
-                                (!type pointer 64 nil  gc_used
-                                 (!type struct 65 
-                                  (!type already_seen 64)
-                                  gc_pointed_to "cp_token_cache"
-                                  (!srcfileloc  "cp/parser.h" 125)
-                                  (!fields 2 
-                                   (!pair  "first"
-                                    (!type pointer 66 nil  gc_unused
-                                     (!type struct 67 
-                                      (!type already_seen 66)
-                                      gc_used "cp_token"
-                                      (!srcfileloc  "cp/parser.h" 71)
-                                      (!fields 9 
-                                       (!pair  "type"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "cp/parser.h" 44)
-                                        nil )
-                                       (!pair  "keyword"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "cp/parser.h" 47)
-                                        nil )
-                                       (!pair  "flags"
-                                        (!type already_seen 28)
-                                        (!srcfileloc  "cp/parser.h" 49)
-                                        nil )
-                                       (!pair  "pragma_kind"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "cp/parser.h" 51)
-                                        nil )
-                                       (!pair  "implicit_extern_c"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "cp/parser.h" 53)
-                                        nil )
-                                       (!pair  "ambiguous_p"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "cp/parser.h" 57)
-                                        nil )
-                                       (!pair  "purged_p"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "cp/parser.h" 61)
-                                        nil )
-                                       (!pair  "location"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "cp/parser.h" 63)
-                                        nil )
-                                       (!pair  "u"
-                                        (!type union 68 nil  gc_used "cp_token_value"
-                                         (!srcfileloc  "cp/parser.h" 70)
-                                         (!fields 2 
-                                          (!pair  "tree_check_value"
-                                           (!type pointer 69 nil  gc_used
-                                            (!type struct 70 
-                                             (!type already_seen 69)
-                                             gc_pointed_to "tree_check"
-                                             (!srcfileloc  "cp/parser.h" 38)
-                                             (!fields 3 
-                                              (!pair  "value"
-                                               (!type already_seen 5)
-                                               (!srcfileloc  "cp/parser.h" 32)
-                                               nil )
-                                              (!pair  "checks"
-                                               (!type pointer 71 nil  gc_used
-                                                (!type user_struct 72 
-                                                 (!type already_seen 71)
-                                                 gc_pointed_to "vec<deferred_access_check,va_gc>"
-                                                 (!srcfileloc  "cp/semantics.c" 135)
-                                                 (!fields 2 
-                                                  (!pair  "va_gc"
-                                                   (!type already_seen 3)
-                                                   (!srcfileloc  "cp/semantics.c" 135)
-                                                   nil )
-                                                  (!pair  "deferred_access_check"
-                                                   (!type struct 73 nil  gc_used "deferred_access_check"
-                                                    (!srcfileloc  "cp/cp-tree.h" 5697)
-                                                    (!fields 4 
-                                                     (!pair  "binfo"
-                                                      (!type already_seen 5)
-                                                      (!srcfileloc  "cp/cp-tree.h" 5690)
-                                                      nil )
-                                                     (!pair  "decl"
-                                                      (!type already_seen 5)
-                                                      (!srcfileloc  "cp/cp-tree.h" 5692)
-                                                      nil )
-                                                     (!pair  "diag_decl"
-                                                      (!type already_seen 5)
-                                                      (!srcfileloc  "cp/cp-tree.h" 5694)
-                                                      nil )
-                                                     (!pair  "loc"
-                                                      (!type already_seen 9)
-                                                      (!srcfileloc  "cp/cp-tree.h" 5696)
-                                                      nil )
-                                                    )
-                                                    nil 260 nil nil )
-                                                   (!srcfileloc  "cp/semantics.c" 135)
-                                                   nil )
-                                                 )
-                                                )
-                                               )
-                                               (!srcfileloc  "cp/parser.h" 34)
-                                               nil )
-                                              (!pair  "qualifying_scope"
-                                               (!type already_seen 5)
-                                               (!srcfileloc  "cp/parser.h" 37)
-                                               nil )
-                                             )
-                                             nil 260 nil nil )
-                                           )
-                                           (!srcfileloc  "cp/parser.h" 67)
-                                           (!options 
-                                            (!option tag string  "1")
-                                           )
-                                          )
-                                          (!pair  "value"
-                                           (!type already_seen 5)
-                                           (!srcfileloc  "cp/parser.h" 69)
-                                           (!options 
-                                            (!option tag string  "0")
-                                           )
-                                          )
-                                         )
-                                         nil 260 nil )
-                                        (!srcfileloc  "cp/parser.h" 70)
-                                        (!options 
-                                         (!option desc string  "(%1.type == CPP_TEMPLATE_ID) || (%1.type == CPP_NESTED_NAME_SPECIFIER)")
-                                        )
-                                       )
-                                      )
-                                      nil 260 nil nil )
-                                    )
-                                    (!srcfileloc  "cp/parser.h" 121)
-                                    (!options 
-                                     (!option skip string  "")
-                                    )
-                                   )
-                                   (!pair  "last"
-                                    (!type already_seen 66)
-                                    (!srcfileloc  "cp/parser.h" 124)
-                                    (!options 
-                                     (!option skip string  "")
-                                    )
-                                   )
-                                  )
-                                  nil 260 nil nil )
-                                )
-                                (!srcfileloc  "cp/cp-tree.h" 2038)
-                                (!options 
-                                 (!option tag string  "1")
-                                )
-                               )
-                               (!pair  "saved_language_function"
-                                (!type pointer 74 nil  gc_used
-                                 (!type lang_struct 75 
-                                  (!type already_seen 74)
-                                  gc_pointed_to "language_function"
-                                  (!srcfileloc  "ada/gcc-interface/trans.c" 139)
-                                  (!fields 0 )
-                                  nil 511 
-                                  (!homotypes 7
-                                   (!type struct 76 nil  gc_pointed_to "language_function"
-                                    (!srcfileloc  "lto/lto-tree.h" 44)
-                                    (!fields 1 
-                                     (!pair  "dummy"
-                                      (!type already_seen 9)
-                                      (!srcfileloc  "lto/lto-tree.h" 43)
-                                      nil )
-                                    )
-                                    nil 64 
-                                    (!type already_seen 75)
-                                    nil )
-                                   
-                                   (!type struct 77 nil  gc_pointed_to "language_function"
-                                    (!srcfileloc  "java/lang.c" 119)
-                                    (!fields 1 
-                                     (!pair  "unused"
-                                      (!type already_seen 9)
-                                      (!srcfileloc  "java/lang.c" 118)
-                                      nil )
-                                    )
-                                    nil 32 
-                                    (!type already_seen 75)
-                                    nil )
-                                   
-                                   (!type struct 78 nil  gc_pointed_to "language_function"
-                                    (!srcfileloc  "go/go-lang.c" 83)
-                                    (!fields 1 
-                                     (!pair  "dummy"
-                                      (!type already_seen 9)
-                                      (!srcfileloc  "go/go-lang.c" 82)
-                                      nil )
-                                    )
-                                    nil 16 
-                                    (!type already_seen 75)
-                                    nil )
-                                   
-                                   (!type struct 79 nil  gc_pointed_to "language_function"
-                                    (!srcfileloc  "fortran/f95-lang.c" 75)
-                                    (!fields 1 
-                                     (!pair  "binding_level"
-                                      (!type pointer 80 nil  gc_used
-                                       (!type lang_struct 81 
-                                        (!type already_seen 80)
-                                        gc_pointed_to "binding_level"
-                                        (!srcfileloc  "fortran/f95-lang.c" 318)
-                                        (!fields 0 )
-                                        nil 40 
-                                        (!homotypes 2
-                                         (!type struct 82 nil  gc_pointed_to "binding_level"
-                                          (!srcfileloc  "java/decl.c" 423)
-                                          (!fields 10 
-                                           (!pair  "names"
-                                            (!type already_seen 5)
-                                            (!srcfileloc  "java/decl.c" 391)
-                                            nil )
-                                           (!pair  "shadowed"
-                                            (!type already_seen 5)
-                                            (!srcfileloc  "java/decl.c" 397)
-                                            nil )
-                                           (!pair  "blocks"
-                                            (!type already_seen 5)
-                                            (!srcfileloc  "java/decl.c" 402)
-                                            nil )
-                                           (!pair  "level_chain"
-                                            (!type already_seen 80)
-                                            (!srcfileloc  "java/decl.c" 405)
-                                            nil )
-                                           (!pair  "end_pc"
-                                            (!type already_seen 9)
-                                            (!srcfileloc  "java/decl.c" 408)
-                                            nil )
-                                           (!pair  "start_pc"
-                                            (!type already_seen 9)
-                                            (!srcfileloc  "java/decl.c" 410)
-                                            nil )
-                                           (!pair  "stmts"
-                                            (!type already_seen 5)
-                                            (!srcfileloc  "java/decl.c" 413)
-                                            nil )
-                                           (!pair  "exception_range"
-                                            (!type pointer 83 nil  gc_unused
-                                             (!type struct 84 
-                                              (!type already_seen 83)
-                                              gc_unused "eh_range"nil 
-                                              (!fields 0 )
-                                              nil 0 nil nil )
-                                            )
-                                            (!srcfileloc  "java/decl.c" 416)
-                                            (!options 
-                                             (!option skip string  "")
-                                            )
-                                           )
-                                           (!pair  "binding_depth"
-                                            (!type already_seen 9)
-                                            (!srcfileloc  "java/decl.c" 419)
-                                            nil )
-                                           (!pair  "loc"
-                                            (!type already_seen 9)
-                                            (!srcfileloc  "java/decl.c" 422)
-                                            nil )
-                                          )
-                                          nil 32 
-                                          (!type already_seen 81)
-                                          nil )
-                                         
-                                         (!type struct 85 nil  gc_pointed_to "binding_level"
-                                          (!srcfileloc  "fortran/f95-lang.c" 318)
-                                          (!fields 3 
-                                           (!pair  "names"
-                                            (!type already_seen 5)
-                                            (!srcfileloc  "fortran/f95-lang.c" 312)
-                                            nil )
-                                           (!pair  "blocks"
-                                            (!type already_seen 5)
-                                            (!srcfileloc  "fortran/f95-lang.c" 315)
-                                            nil )
-                                           (!pair  "level_chain"
-                                            (!type already_seen 80)
-                                            (!srcfileloc  "fortran/f95-lang.c" 317)
-                                            nil )
-                                          )
-                                          nil 8 
-                                          (!type already_seen 81)
-                                          nil )
-                                        )
-                                       )
-                                      )
-                                      (!srcfileloc  "fortran/f95-lang.c" 74)
-                                      nil )
-                                    )
-                                    nil 8 
-                                    (!type already_seen 75)
-                                    nil )
-                                   
-                                   (!type struct 86 nil  gc_pointed_to "language_function"
-                                    (!srcfileloc  "cp/cp-tree.h" 1155)
-                                    (!fields 21 
-                                     (!pair  "base"
-                                      (!type struct 87 nil  gc_used "c_language_function"
-                                       (!srcfileloc  "c-family/c-common.h" 515)
-                                       (!fields 2 
-                                        (!pair  "x_stmt_tree"
-                                         (!type struct 88 
-                                          (!type pointer 89 nil  gc_unused
-                                           (!type already_seen 88)
-                                          )
-                                          gc_used "stmt_tree_s"
-                                          (!srcfileloc  "c-family/c-common.h" 500)
-                                          (!fields 2 
-                                           (!pair  "x_cur_stmt_list"
-                                            (!type already_seen 45)
-                                            (!srcfileloc  "c-family/c-common.h" 488)
-                                            nil )
-                                           (!pair  "stmts_are_full_exprs_p"
-                                            (!type already_seen 9)
-                                            (!srcfileloc  "c-family/c-common.h" 499)
-                                            nil )
-                                          )
-                                          nil 390 nil nil )
-                                         (!srcfileloc  "c-family/c-common.h" 510)
-                                         nil )
-                                        (!pair  "local_typedefs"
-                                         (!type already_seen 45)
-                                         (!srcfileloc  "c-family/c-common.h" 514)
-                                         nil )
-                                       )
-                                       nil 390 nil nil )
-                                      (!srcfileloc  "cp/cp-tree.h" 1127)
-                                      nil )
-                                     (!pair  "x_cdtor_label"
-                                      (!type already_seen 5)
-                                      (!srcfileloc  "cp/cp-tree.h" 1129)
-                                      nil )
-                                     (!pair  "x_current_class_ptr"
-                                      (!type already_seen 5)
-                                      (!srcfileloc  "cp/cp-tree.h" 1130)
-                                      nil )
-                                     (!pair  "x_current_class_ref"
-                                      (!type already_seen 5)
-                                      (!srcfileloc  "cp/cp-tree.h" 1131)
-                                      nil )
-                                     (!pair  "x_eh_spec_block"
-                                      (!type already_seen 5)
-                                      (!srcfileloc  "cp/cp-tree.h" 1132)
-                                      nil )
-                                     (!pair  "x_in_charge_parm"
-                                      (!type already_seen 5)
-                                      (!srcfileloc  "cp/cp-tree.h" 1133)
-                                      nil )
-                                     (!pair  "x_vtt_parm"
-                                      (!type already_seen 5)
-                                      (!srcfileloc  "cp/cp-tree.h" 1134)
-                                      nil )
-                                     (!pair  "x_return_value"
-                                      (!type already_seen 5)
-                                      (!srcfileloc  "cp/cp-tree.h" 1135)
-                                      nil )
-                                     (!pair  "x_auto_return_pattern"
-                                      (!type already_seen 5)
-                                      (!srcfileloc  "cp/cp-tree.h" 1136)
-                                      nil )
-                                     (!pair  "returns_value"
-                                      (!type already_seen 9)
-                                      (!srcfileloc  "cp/cp-tree.h" 1138)
-                                      nil )
-                                     (!pair  "returns_null"
-                                      (!type already_seen 9)
-                                      (!srcfileloc  "cp/cp-tree.h" 1139)
-                                      nil )
-                                     (!pair  "returns_abnormally"
-                                      (!type already_seen 9)
-                                      (!srcfileloc  "cp/cp-tree.h" 1140)
-                                      nil )
-                                     (!pair  "infinite_loop"
-                                      (!type already_seen 9)
-                                      (!srcfileloc  "cp/cp-tree.h" 1141)
-                                      nil )
-                                     (!pair  "x_in_function_try_handler"
-                                      (!type already_seen 9)
-                                      (!srcfileloc  "cp/cp-tree.h" 1142)
-                                      nil )
-                                     (!pair  "x_in_base_initializer"
-                                      (!type already_seen 9)
-                                      (!srcfileloc  "cp/cp-tree.h" 1143)
-                                      nil )
-                                     (!pair  "can_throw"
-                                      (!type already_seen 9)
-                                      (!srcfileloc  "cp/cp-tree.h" 1146)
-                                      nil )
-                                     (!pair  "x_named_labels"
-                                      (!type pointer 90 nil  gc_used
-                                       (!type param_struct 91 
-                                        (!type already_seen 90)
-                                        gc_pointed_to
-                                        (!type already_seen 49)
-                                        
-                                        (!type pointer 92 nil  gc_used
-                                         (!type struct 93 
-                                          (!type already_seen 92)
-                                          gc_pointed_to "named_label_entry"
-                                          (!srcfileloc  "cp/decl.c" 237)
-                                          (!fields 8 
-                                           (!pair  "label_decl"
-                                            (!type already_seen 5)
-                                            (!srcfileloc  "cp/decl.c" 214)
-                                            nil )
-                                           (!pair  "binding_level"
-                                            (!type pointer 94 nil  gc_used
-                                             (!type struct 95 
-                                              (!type already_seen 94)
-                                              gc_pointed_to "cp_binding_level"
-                                              (!srcfileloc  "cp/name-lookup.h" 266)
-                                              (!fields 20 
-                                               (!pair  "names"
-                                                (!type already_seen 5)
-                                                (!srcfileloc  "cp/name-lookup.h" 187)
-                                                nil )
-                                               (!pair  "namespaces"
-                                                (!type already_seen 5)
-                                                (!srcfileloc  "cp/name-lookup.h" 190)
-                                                nil )
-                                               (!pair  "static_decls"
-                                                (!type already_seen 45)
-                                                (!srcfileloc  "cp/name-lookup.h" 193)
-                                                nil )
-                                               (!pair  "usings"
-                                                (!type already_seen 5)
-                                                (!srcfileloc  "cp/name-lookup.h" 196)
-                                                nil )
-                                               (!pair  "using_directives"
-                                                (!type already_seen 5)
-                                                (!srcfileloc  "cp/name-lookup.h" 200)
-                                                nil )
-                                               (!pair  "class_shadowed"
-                                                (!type pointer 96 nil  gc_used
-                                                 (!type user_struct 97 
-                                                  (!type already_seen 96)
-                                                  gc_pointed_to "vec<cp_class_binding,va_gc>"
-                                                  (!srcfileloc  "cp/name-lookup.h" 204)
-                                                  (!fields 2 
-                                                   (!pair  "va_gc"
-                                                    (!type already_seen 3)
-                                                    (!srcfileloc  "cp/name-lookup.h" 204)
-                                                    nil )
-                                                   (!pair  "cp_class_binding"
-                                                    (!type struct 98 nil  gc_used "cp_class_binding"
-                                                     (!srcfileloc  "cp/name-lookup.h" 147)
-                                                     (!fields 2 
-                                                      (!pair  "base"
-                                                       (!type pointer 99 nil  gc_used
-                                                        (!type struct 100 
-                                                         (!type already_seen 99)
-                                                         gc_pointed_to "cxx_binding"
-                                                         (!srcfileloc  "cp/name-lookup.h" 76)
-                                                         (!fields 6 
-                                                          (!pair  "previous"
-                                                           (!type already_seen 99)
-                                                           (!srcfileloc  "cp/name-lookup.h" 67)
-                                                           nil )
-                                                          (!pair  "value"
-                                                           (!type already_seen 5)
-                                                           (!srcfileloc  "cp/name-lookup.h" 69)
-                                                           nil )
-                                                          (!pair  "type"
-                                                           (!type already_seen 5)
-                                                           (!srcfileloc  "cp/name-lookup.h" 71)
-                                                           nil )
-                                                          (!pair  "scope"
-                                                           (!type already_seen 94)
-                                                           (!srcfileloc  "cp/name-lookup.h" 73)
-                                                           nil )
-                                                          (!pair  "value_is_inherited"
-                                                           (!type already_seen 9)
-                                                           (!srcfileloc  "cp/name-lookup.h" 74)
-                                                           nil )
-                                                          (!pair  "is_local"
-                                                           (!type already_seen 9)
-                                                           (!srcfileloc  "cp/name-lookup.h" 75)
-                                                           nil )
-                                                         )
-                                                         nil 260 nil nil )
-                                                       )
-                                                       (!srcfileloc  "cp/name-lookup.h" 144)
-                                                       nil )
-                                                      (!pair  "identifier"
-                                                       (!type already_seen 5)
-                                                       (!srcfileloc  "cp/name-lookup.h" 146)
-                                                       nil )
-                                                     )
-                                                     nil 260 nil nil )
-                                                    (!srcfileloc  "cp/name-lookup.h" 204)
-                                                    nil )
-                                                  )
-                                                 )
-                                                )
-                                                (!srcfileloc  "cp/name-lookup.h" 204)
-                                                nil )
-                                               (!pair  "type_shadowed"
-                                                (!type already_seen 5)
-                                                (!srcfileloc  "cp/name-lookup.h" 211)
-                                                nil )
-                                               (!pair  "shadowed_labels"
-                                                (!type pointer 101 nil  gc_used
-                                                 (!type user_struct 102 
-                                                  (!type already_seen 101)
-                                                  gc_pointed_to "vec<cp_label_binding,va_gc>"
-                                                  (!srcfileloc  "cp/name-lookup.h" 215)
-                                                  (!fields 2 
-                                                   (!pair  "va_gc"
-                                                    (!type already_seen 3)
-                                                    (!srcfileloc  "cp/name-lookup.h" 215)
-                                                    nil )
-                                                   (!pair  "cp_label_binding"
-                                                    (!type struct 103 nil  gc_used "cp_label_binding"
-                                                     (!srcfileloc  "cp/name-lookup.h" 155)
-                                                     (!fields 2 
-                                                      (!pair  "label"
-                                                       (!type already_seen 5)
-                                                       (!srcfileloc  "cp/name-lookup.h" 152)
-                                                       nil )
-                                                      (!pair  "prev_value"
-                                                       (!type already_seen 5)
-                                                       (!srcfileloc  "cp/name-lookup.h" 154)
-                                                       nil )
-                                                     )
-                                                     nil 260 nil nil )
-                                                    (!srcfileloc  "cp/name-lookup.h" 215)
-                                                    nil )
-                                                  )
-                                                 )
-                                                )
-                                                (!srcfileloc  "cp/name-lookup.h" 215)
-                                                nil )
-                                               (!pair  "blocks"
-                                                (!type already_seen 5)
-                                                (!srcfileloc  "cp/name-lookup.h" 220)
-                                                nil )
-                                               (!pair  "this_entity"
-                                                (!type already_seen 5)
-                                                (!srcfileloc  "cp/name-lookup.h" 224)
-                                                nil )
-                                               (!pair  "level_chain"
-                                                (!type already_seen 94)
-                                                (!srcfileloc  "cp/name-lookup.h" 227)
-                                                nil )
-                                               (!pair  "dead_vars_from_for"
-                                                (!type already_seen 45)
-                                                (!srcfileloc  "cp/name-lookup.h" 232)
-                                                nil )
-                                               (!pair  "statement_list"
-                                                (!type already_seen 5)
-                                                (!srcfileloc  "cp/name-lookup.h" 236)
-                                                nil )
-                                               (!pair  "binding_depth"
-                                                (!type already_seen 9)
-                                                (!srcfileloc  "cp/name-lookup.h" 239)
-                                                nil )
-                                               (!pair  "kind"
-                                                (!type already_seen 9)
-                                                (!srcfileloc  "cp/name-lookup.h" 244)
-                                                nil )
-                                               (!pair  "explicit_spec_p"
-                                                (!type already_seen 9)
-                                                (!srcfileloc  "cp/name-lookup.h" 248)
-                                                nil )
-                                               (!pair  "keep"
-                                                (!type already_seen 9)
-                                                (!srcfileloc  "cp/name-lookup.h" 251)
-                                                nil )
-                                               (!pair  "more_cleanups_ok"
-                                                (!type already_seen 9)
-                                                (!srcfileloc  "cp/name-lookup.h" 255)
-                                                nil )
-                                               (!pair  "have_cleanups"
-                                                (!type already_seen 9)
-                                                (!srcfileloc  "cp/name-lookup.h" 256)
-                                                nil )
-                                               (!pair  "defining_class_p"
-                                                (!type already_seen 9)
-                                                (!srcfileloc  "cp/name-lookup.h" 263)
-                                                nil )
-                                              )
-                                              nil 260 nil nil )
-                                            )
-                                            (!srcfileloc  "cp/decl.c" 219)
-                                            nil )
-                                           (!pair  "names_in_scope"
-                                            (!type already_seen 5)
-                                            (!srcfileloc  "cp/decl.c" 223)
-                                            nil )
-                                           (!pair  "bad_decls"
-                                            (!type already_seen 45)
-                                            (!srcfileloc  "cp/decl.c" 226)
-                                            nil )
-                                           (!pair  "uses"
-                                            (!type pointer 104 nil  gc_used
-                                             (!type struct 105 
-                                              (!type already_seen 104)
-                                              gc_pointed_to "named_label_use_entry"
-                                              (!srcfileloc  "cp/decl.c" 206)
-                                              (!fields 5 
-                                               (!pair  "next"
-                                                (!type already_seen 104)
-                                                (!srcfileloc  "cp/decl.c" 191)
-                                                nil )
-                                               (!pair  "binding_level"
-                                                (!type already_seen 94)
-                                                (!srcfileloc  "cp/decl.c" 195)
-                                                nil )
-                                               (!pair  "names_in_scope"
-                                                (!type already_seen 5)
-                                                (!srcfileloc  "cp/decl.c" 199)
-                                                nil )
-                                               (!pair  "o_goto_locus"
-                                                (!type already_seen 9)
-                                                (!srcfileloc  "cp/decl.c" 201)
-                                                nil )
-                                               (!pair  "in_omp_scope"
-                                                (!type already_seen 9)
-                                                (!srcfileloc  "cp/decl.c" 205)
-                                                nil )
-                                              )
-                                              (!options 
-                                               (!option chain_next string  "%h.next")
-                                              )
-                                              260 nil nil )
-                                            )
-                                            (!srcfileloc  "cp/decl.c" 229)
-                                            nil )
-                                           (!pair  "in_try_scope"
-                                            (!type already_seen 9)
-                                            (!srcfileloc  "cp/decl.c" 234)
-                                            nil )
-                                           (!pair  "in_catch_scope"
-                                            (!type already_seen 9)
-                                            (!srcfileloc  "cp/decl.c" 235)
-                                            nil )
-                                           (!pair  "in_omp_scope"
-                                            (!type already_seen 9)
-                                            (!srcfileloc  "cp/decl.c" 236)
-                                            nil )
-                                          )
-                                          nil 260 nil nil )
-                                        )
-                                        nil nil nil nil nil nil nil nil nil nil )
-                                      )
-                                      (!srcfileloc  "cp/cp-tree.h" 1148)
-                                      (!options 
-                                       (!option param_is type 
-                                        (!type already_seen 93)
-                                       )
-                                      )
-                                     )
-                                     (!pair  "bindings"
-                                      (!type already_seen 94)
-                                      (!srcfileloc  "cp/cp-tree.h" 1149)
-                                      nil )
-                                     (!pair  "x_local_names"
-                                      (!type already_seen 45)
-                                      (!srcfileloc  "cp/cp-tree.h" 1150)
-                                      nil )
-                                     (!pair  "infinite_loops"
-                                      (!type already_seen 45)
-                                      (!srcfileloc  "cp/cp-tree.h" 1153)
-                                      nil )
-                                     (!pair  "extern_decl_map"
-                                      (!type pointer 106 nil  gc_used
-                                       (!type param_struct 107 
-                                        (!type already_seen 106)
-                                        gc_pointed_to
-                                        (!type already_seen 49)
-                                        
-                                        (!type pointer 108 nil  gc_used
-                                         (!type struct 109 
-                                          (!type already_seen 108)
-                                          gc_pointed_to "cxx_int_tree_map"
-                                          (!srcfileloc  "cp/cp-tree.h" 1119)
-                                          (!fields 2 
-                                           (!pair  "uid"
-                                            (!type already_seen 9)
-                                            (!srcfileloc  "cp/cp-tree.h" 1117)
-                                            nil )
-                                           (!pair  "to"
-                                            (!type already_seen 5)
-                                            (!srcfileloc  "cp/cp-tree.h" 1118)
-                                            nil )
-                                          )
-                                          nil 260 nil nil )
-                                        )
-                                        nil nil nil nil nil nil nil nil nil nil )
-                                      )
-                                      (!srcfileloc  "cp/cp-tree.h" 1154)
-                                      (!options 
-                                       (!option param_is type 
-                                        (!type already_seen 109)
-                                       )
-                                      )
-                                     )
-                                    )
-                                    nil 260 
-                                    (!type already_seen 75)
-                                    nil )
-                                   
-                                   (!type struct 110 nil  gc_pointed_to "language_function"
-                                    (!srcfileloc  "c/c-lang.h" 56)
-                                    (!fields 9 
-                                     (!pair  "base"
-                                      (!type already_seen 87)
-                                      (!srcfileloc  "c/c-lang.h" 47)
-                                      nil )
-                                     (!pair  "x_break_label"
-                                      (!type already_seen 5)
-                                      (!srcfileloc  "c/c-lang.h" 48)
-                                      nil )
-                                     (!pair  "x_cont_label"
-                                      (!type already_seen 5)
-                                      (!srcfileloc  "c/c-lang.h" 49)
-                                      nil )
-                                     (!pair  "x_switch_stack"
-                                      (!type pointer 111 nil  gc_unused
-                                       (!type struct 112 
-                                        (!type already_seen 111)
-                                        gc_unused "c_switch"nil 
-                                        (!fields 0 )
-                                        nil 0 nil nil )
-                                      )
-                                      (!srcfileloc  "c/c-lang.h" 50)
-                                      (!options 
-                                       (!option skip string  "")
-                                      )
-                                     )
-                                     (!pair  "arg_info"
-                                      (!type pointer 113 nil  gc_unused
-                                       (!type struct 114 
-                                        (!type already_seen 113)
-                                        gc_unused "c_arg_info"nil 
-                                        (!fields 0 )
-                                        nil 0 nil nil )
-                                      )
-                                      (!srcfileloc  "c/c-lang.h" 51)
-                                      (!options 
-                                       (!option skip string  "")
-                                      )
-                                     )
-                                     (!pair  "returns_value"
-                                      (!type already_seen 9)
-                                      (!srcfileloc  "c/c-lang.h" 52)
-                                      nil )
-                                     (!pair  "returns_null"
-                                      (!type already_seen 9)
-                                      (!srcfileloc  "c/c-lang.h" 53)
-                                      nil )
-                                     (!pair  "returns_abnormally"
-                                      (!type already_seen 9)
-                                      (!srcfileloc  "c/c-lang.h" 54)
-                                      nil )
-                                     (!pair  "warn_about_return_type"
-                                      (!type already_seen 9)
-                                      (!srcfileloc  "c/c-lang.h" 55)
-                                      nil )
-                                    )
-                                    nil 130 
-                                    (!type already_seen 75)
-                                    nil )
-                                   
-                                   (!type struct 115 nil  gc_pointed_to "language_function"
-                                    (!srcfileloc  "ada/gcc-interface/trans.c" 139)
-                                    (!fields 4 
-                                     (!pair  "parm_attr_cache"
-                                      (!type pointer 116 nil  gc_used
-                                       (!type user_struct 117 
-                                        (!type already_seen 116)
-                                        gc_pointed_to "vec<parm_attr,va_gc>"
-                                        (!srcfileloc  "ada/gcc-interface/trans.c" 135)
-                                        (!fields 2 
-                                         (!pair  "va_gc"
-                                          (!type already_seen 3)
-                                          (!srcfileloc  "ada/gcc-interface/trans.c" 135)
-                                          nil )
-                                         (!pair  "parm_attr"
-                                          (!type pointer 118 nil  gc_used
-                                           (!type struct 119 
-                                            (!type already_seen 118)
-                                            gc_pointed_to "parm_attr_d"
-                                            (!srcfileloc  "ada/gcc-interface/trans.c" 129)
-                                            (!fields 5 
-                                             (!pair  "id"
-                                              (!type already_seen 9)
-                                              (!srcfileloc  "ada/gcc-interface/trans.c" 124)
-                                              nil )
-                                             (!pair  "dim"
-                                              (!type already_seen 9)
-                                              (!srcfileloc  "ada/gcc-interface/trans.c" 125)
-                                              nil )
-                                             (!pair  "first"
-                                              (!type already_seen 5)
-                                              (!srcfileloc  "ada/gcc-interface/trans.c" 126)
-                                              nil )
-                                             (!pair  "last"
-                                              (!type already_seen 5)
-                                              (!srcfileloc  "ada/gcc-interface/trans.c" 127)
-                                              nil )
-                                             (!pair  "length"
-                                              (!type already_seen 5)
-                                              (!srcfileloc  "ada/gcc-interface/trans.c" 128)
-                                              nil )
-                                            )
-                                            nil 1 nil nil )
-                                          )
-                                          (!srcfileloc  "ada/gcc-interface/trans.c" 135)
-                                          nil )
-                                        )
-                                       )
-                                      )
-                                      (!srcfileloc  "ada/gcc-interface/trans.c" 135)
-                                      nil )
-                                     (!pair  "named_ret_val"
-                                      (!type pointer 120 nil  gc_used
-                                       (!type struct 121 
-                                        (!type already_seen 120)
-                                        gc_pointed_to "bitmap_head"
-                                        (!srcfileloc  "bitmap.h" 189)
-                                        (!fields 5 
-                                         (!pair  "indx"
-                                          (!type already_seen 9)
-                                          (!srcfileloc  "bitmap.h" 181)
-                                          nil )
-                                         (!pair  "descriptor_id"
-                                          (!type already_seen 9)
-                                          (!srcfileloc  "bitmap.h" 182)
-                                          nil )
-                                         (!pair  "first"
-                                          (!type pointer 122 nil  gc_used
-                                           (!type struct 123 
-                                            (!type already_seen 122)
-                                            gc_pointed_to "bitmap_element"
-                                            (!srcfileloc  "bitmap.h" 185)
-                                            (!fields 4 
-                                             (!pair  "next"
-                                              (!type already_seen 122)
-                                              (!srcfileloc  "bitmap.h" 171)
-                                              nil )
-                                             (!pair  "prev"
-                                              (!type already_seen 122)
-                                              (!srcfileloc  "bitmap.h" 172)
-                                              nil )
-                                             (!pair  "indx"
-                                              (!type already_seen 9)
-                                              (!srcfileloc  "bitmap.h" 173)
-                                              nil )
-                                             (!pair  "bits"
-                                              (!type array 124 nil  gc_used "BITMAP_ELEMENT_WORDS" 
-                                               (!type already_seen 9)
-                                              )
-                                              (!srcfileloc  "bitmap.h" 174)
-                                              nil )
-                                            )
-                                            (!options 
-                                             (!option chain_prev string  "%h.prev")
-                                             (!option chain_next string  "%h.next")
-                                            )
-                                            511 nil nil )
-                                          )
-                                          (!srcfileloc  "bitmap.h" 185)
-                                          nil )
-                                         (!pair  "current"
-                                          (!type already_seen 122)
-                                          (!srcfileloc  "bitmap.h" 186)
-                                          (!options 
-                                           (!option skip string  "")
-                                          )
-                                         )
-                                         (!pair  "obstack"
-                                          (!type pointer 125 nil  gc_used
-                                           (!type struct 126 
-                                            (!type already_seen 125)
-                                            gc_pointed_to "bitmap_obstack"
-                                            (!srcfileloc  "bitmap.h" 187)
-                                            (!fields 3 
-                                             (!pair  "elements"
-                                              (!type already_seen 122)
-                                              (!srcfileloc  "bitmap.h" 153)
-                                              nil )
-                                             (!pair  "heads"
-                                              (!type already_seen 120)
-                                              (!srcfileloc  "bitmap.h" 154)
-                                              nil )
-                                             (!pair  "obstack"
-                                              (!type struct 127 nil  gc_unused "obstack"nil 
-                                               (!fields 0 )
-                                               nil 0 nil nil )
-                                              (!srcfileloc  "bitmap.h" 155)
-                                              (!options 
-                                               (!option skip string  "")
-                                              )
-                                             )
-                                            )
-                                            nil 511 nil nil )
-                                          )
-                                          (!srcfileloc  "bitmap.h" 187)
-                                          nil )
-                                        )
-                                        nil 511 nil nil )
-                                      )
-                                      (!srcfileloc  "ada/gcc-interface/trans.c" 136)
-                                      nil )
-                                     (!pair  "other_ret_val"
-                                      (!type already_seen 45)
-                                      (!srcfileloc  "ada/gcc-interface/trans.c" 137)
-                                      nil )
-                                     (!pair  "gnat_ret"
-                                      (!type already_seen 9)
-                                      (!srcfileloc  "ada/gcc-interface/trans.c" 138)
-                                      nil )
-                                    )
-                                    nil 1 
-                                    (!type already_seen 75)
-                                    nil )
-                                  )
-                                 )
-                                )
-                                (!srcfileloc  "cp/cp-tree.h" 2040)
-                                (!options 
-                                 (!option tag string  "0")
-                                )
-                               )
-                              )
-                              nil 260 nil )
-                             (!srcfileloc  "cp/cp-tree.h" 2041)
-                             (!options 
-                              (!option desc string  "%1.pending_inline_p")
-                             )
-                            )
-                           )
-                           nil 260 nil nil )
-                          (!srcfileloc  "cp/cp-tree.h" 2068)
-                          (!options 
-                           (!option tag string  "1")
-                          )
-                         )
-                         (!pair  "ns"
-                          (!type struct 128 nil  gc_used "lang_decl_ns"
-                           (!srcfileloc  "cp/cp-tree.h" 2050)
-                           (!fields 2 
-                            (!pair  "base"
-                             (!type already_seen 58)
-                             (!srcfileloc  "cp/cp-tree.h" 2048)
-                             nil )
-                            (!pair  "level"
-                             (!type already_seen 94)
-                             (!srcfileloc  "cp/cp-tree.h" 2049)
-                             nil )
-                           )
-                           nil 260 nil nil )
-                          (!srcfileloc  "cp/cp-tree.h" 2069)
-                          (!options 
-                           (!option tag string  "2")
-                          )
-                         )
-                         (!pair  "parm"
-                          (!type struct 129 nil  gc_used "lang_decl_parm"
-                           (!srcfileloc  "cp/cp-tree.h" 2058)
-                           (!fields 3 
-                            (!pair  "base"
-                             (!type already_seen 58)
-                             (!srcfileloc  "cp/cp-tree.h" 2055)
-                             nil )
-                            (!pair  "level"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 2056)
-                             nil )
-                            (!pair  "index"
-                             (!type already_seen 9)
-                             (!srcfileloc  "cp/cp-tree.h" 2057)
-                             nil )
-                           )
-                           nil 260 nil nil )
-                          (!srcfileloc  "cp/cp-tree.h" 2070)
-                          (!options 
-                           (!option tag string  "3")
-                          )
-                         )
-                        )
-                        (!options 
-                         (!option desc string  "%h.base.selector")
-                        )
-                        260 
-                        (!type already_seen 56)
-                       )
-                      )
-                     )
-                    )
-                    (!srcfileloc  "java/java-tree.h" 817)
-                    (!options 
-                     (!option desc string  "%0.desc")
-                    )
-                   )
-                  )
-                  (!options 
-                   (!option variable_size string  "")
-                  )
-                  32 
-                  (!type already_seen 40)
-                  nil )
-                 
-                 (!type struct 130 nil  gc_pointed_to "lang_decl"
-                  (!srcfileloc  "go/go-lang.c" 57)
-                  (!fields 1 
-                   (!pair  "dummy"
-                    (!type already_seen 28)
-                    (!srcfileloc  "go/go-lang.c" 56)
-                    nil )
-                  )
-                  (!options 
-                   (!option variable_size string  "")
-                  )
-                  16 
-                  (!type already_seen 40)
-                  nil )
-                 
-                 (!type struct 131 nil  gc_pointed_to "lang_decl"
-                  (!srcfileloc  "fortran/trans.h" 834)
-                  (!fields 8 
-                   (!pair  "saved_descriptor"
-                    (!type already_seen 5)
-                    (!srcfileloc  "fortran/trans.h" 822)
-                    nil )
-                   (!pair  "stringlen"
-                    (!type already_seen 5)
-                    (!srcfileloc  "fortran/trans.h" 827)
-                    nil )
-                   (!pair  "addr"
-                    (!type already_seen 5)
-                    (!srcfileloc  "fortran/trans.h" 828)
-                    nil )
-                   (!pair  "span"
-                    (!type already_seen 5)
-                    (!srcfileloc  "fortran/trans.h" 829)
-                    nil )
-                   (!pair  "token"
-                    (!type already_seen 5)
-                    (!srcfileloc  "fortran/trans.h" 831)
-                    nil )
-                   (!pair  "caf_offset"
-                    (!type already_seen 5)
-                    (!srcfileloc  "fortran/trans.h" 831)
-                    nil )
-                   (!pair  "scalar_allocatable"
-                    (!type already_seen 9)
-                    (!srcfileloc  "fortran/trans.h" 832)
-                    nil )
-                   (!pair  "scalar_pointer"
-                    (!type already_seen 9)
-                    (!srcfileloc  "fortran/trans.h" 833)
-                    nil )
-                  )
-                  (!options 
-                   (!option variable_size string  "")
-                  )
-                  8 
-                  (!type already_seen 40)
-                  nil )
-                 
-                 (!type struct 132 nil  gc_pointed_to "lang_decl"
-                  (!srcfileloc  "cp/cp-tree.h" 2072)
-                  (!fields 1 
-                   (!pair  "u"
-                    (!type already_seen 56)
-                    (!srcfileloc  "cp/cp-tree.h" 2071)
-                    nil )
-                  )
-                  (!options 
-                   (!option variable_size string  "")
-                  )
-                  260 
-                  (!type already_seen 40)
-                  nil )
-                 
-                 (!type struct 133 nil  gc_pointed_to "lang_decl"
-                  (!srcfileloc  "c/c-lang.h" 40)
-                  (!fields 1 
-                   (!pair  "dummy"
-                    (!type already_seen 28)
-                    (!srcfileloc  "c/c-lang.h" 39)
-                    nil )
-                  )
-                  (!options 
-                   (!option variable_size string  "")
-                  )
-                  130 
-                  (!type already_seen 40)
-                  nil )
-                 
-                 (!type struct 134 nil  gc_pointed_to "lang_decl"
-                  (!srcfileloc  "ada/gcc-interface/ada-tree.h" 41)
-                  (!fields 1 
-                   (!pair  "t"
-                    (!type already_seen 5)
-                    (!srcfileloc  "ada/gcc-interface/ada-tree.h" 41)
-                    nil )
-                  )
-                  (!options 
-                   (!option variable_size string  "")
-                  )
-                  1 
-                  (!type already_seen 40)
-                  nil )
-                )
-               )
-              )
-              (!srcfileloc  "tree-core.h" 1384)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1600)
-           (!options 
-            (!option tag string  "TS_DECL_COMMON")
-           )
-          )
-          (!pair  "decl_with_rtl"
-           (!type struct 135 nil  gc_used "tree_decl_with_rtl"
-            (!srcfileloc  "tree-core.h" 1390)
-            (!fields 2 
-             (!pair  "common"
-              (!type already_seen 38)
-              (!srcfileloc  "tree-core.h" 1388)
-              nil )
-             (!pair  "rtl"
-              (!type pointer 136 
-               (!type pointer 137 nil  gc_used
-                (!type already_seen 136)
-               )
-               gc_pointed_to
-               (!type struct 138 
-                (!type already_seen 136)
-                gc_pointed_to "rtx_def"
-                (!srcfileloc  "rtl.h" 347)
-                (!fields 11 
-                 (!pair  "code"
-                  (!type already_seen 9)
-                  (!srcfileloc  "rtl.h" 256)
-                  nil )
-                 (!pair  "mode"
-                  (!type already_seen 9)
-                  (!srcfileloc  "rtl.h" 259)
-                  nil )
-                 (!pair  "jump"
-                  (!type already_seen 9)
-                  (!srcfileloc  "rtl.h" 269)
-                  nil )
-                 (!pair  "call"
-                  (!type already_seen 9)
-                  (!srcfileloc  "rtl.h" 274)
-                  nil )
-                 (!pair  "unchanging"
-                  (!type already_seen 9)
-                  (!srcfileloc  "rtl.h" 285)
-                  nil )
-                 (!pair  "volatil"
-                  (!type already_seen 9)
-                  (!srcfileloc  "rtl.h" 298)
-                  nil )
-                 (!pair  "in_struct"
-                  (!type already_seen 9)
-                  (!srcfileloc  "rtl.h" 312)
-                  nil )
-                 (!pair  "used"
-                  (!type already_seen 9)
-                  (!srcfileloc  "rtl.h" 321)
-                  nil )
-                 (!pair  "frame_related"
-                  (!type already_seen 9)
-                  (!srcfileloc  "rtl.h" 329)
-                  nil )
-                 (!pair  "return_val"
-                  (!type already_seen 9)
-                  (!srcfileloc  "rtl.h" 335)
-                  nil )
-                 (!pair  "u"
-                  (!type union 139 nil  gc_used "rtx_def_subunion"
-                   (!srcfileloc  "rtl.h" 346)
-                   (!fields 147 
-                    (!pair  ""
-                     (!type struct 140 nil  gc_used "rtx_def_debug_parameter_ref"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_tree"
-                        (!type already_seen 5)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "DEBUG_PARAMETER_REF")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 141 nil  gc_used "rtx_def_entry_value"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "ENTRY_VALUE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 142 nil  gc_used "rtx_def_debug_implicit_ptr"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_tree"
-                        (!type already_seen 5)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "DEBUG_IMPLICIT_PTR")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 143 nil  gc_used "rtx_def_var_location"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 3 
-                       (!pair  ".fld[2].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_tree"
-                        (!type already_seen 5)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "VAR_LOCATION")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 144 nil  gc_used "rtx_def_fma"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 3 
-                       (!pair  ".fld[2].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "FMA")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 145 nil  gc_used "rtx_def_us_truncate"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "US_TRUNCATE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 146 nil  gc_used "rtx_def_ss_truncate"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "SS_TRUNCATE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 147 nil  gc_used "rtx_def_us_minus"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "US_MINUS")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 148 nil  gc_used "rtx_def_us_ashift"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "US_ASHIFT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 149 nil  gc_used "rtx_def_ss_ashift"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "SS_ASHIFT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 150 nil  gc_used "rtx_def_ss_abs"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "SS_ABS")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 151 nil  gc_used "rtx_def_us_neg"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "US_NEG")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 152 nil  gc_used "rtx_def_ss_neg"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "SS_NEG")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 153 nil  gc_used "rtx_def_ss_minus"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "SS_MINUS")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 154 nil  gc_used "rtx_def_us_plus"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "US_PLUS")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 155 nil  gc_used "rtx_def_ss_plus"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "SS_PLUS")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 156 nil  gc_used "rtx_def_vec_duplicate"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "VEC_DUPLICATE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 157 nil  gc_used "rtx_def_vec_concat"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "VEC_CONCAT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 158 nil  gc_used "rtx_def_vec_select"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "VEC_SELECT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 159 nil  gc_used "rtx_def_vec_merge"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 3 
-                       (!pair  ".fld[2].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "VEC_MERGE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 160 nil  gc_used "rtx_def_lo_sum"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "LO_SUM")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 161 nil  gc_used "rtx_def_high"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "HIGH")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 162 nil  gc_used "rtx_def_zero_extract"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 3 
-                       (!pair  ".fld[2].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "ZERO_EXTRACT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 163 nil  gc_used "rtx_def_sign_extract"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 3 
-                       (!pair  ".fld[2].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "SIGN_EXTRACT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 164 nil  gc_used "rtx_def_parity"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "PARITY")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 165 nil  gc_used "rtx_def_popcount"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "POPCOUNT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 166 nil  gc_used "rtx_def_ctz"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "CTZ")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 167 nil  gc_used "rtx_def_clz"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "CLZ")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 168 nil  gc_used "rtx_def_clrsb"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "CLRSB")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 169 nil  gc_used "rtx_def_ffs"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "FFS")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 170 nil  gc_used "rtx_def_bswap"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "BSWAP")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 171 nil  gc_used "rtx_def_sqrt"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "SQRT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 172 nil  gc_used "rtx_def_abs"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "ABS")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 173 nil  gc_used "rtx_def_unsigned_sat_fract"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "UNSIGNED_SAT_FRACT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 174 nil  gc_used "rtx_def_sat_fract"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "SAT_FRACT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 175 nil  gc_used "rtx_def_unsigned_fract_convert"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "UNSIGNED_FRACT_CONVERT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 176 nil  gc_used "rtx_def_fract_convert"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "FRACT_CONVERT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 177 nil  gc_used "rtx_def_unsigned_fix"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "UNSIGNED_FIX")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 178 nil  gc_used "rtx_def_unsigned_float"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "UNSIGNED_FLOAT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 179 nil  gc_used "rtx_def_fix"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "FIX")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 180 nil  gc_used "rtx_def_float"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "FLOAT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 181 nil  gc_used "rtx_def_float_truncate"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "FLOAT_TRUNCATE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 182 nil  gc_used "rtx_def_float_extend"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "FLOAT_EXTEND")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 183 nil  gc_used "rtx_def_truncate"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "TRUNCATE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 184 nil  gc_used "rtx_def_zero_extend"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "ZERO_EXTEND")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 185 nil  gc_used "rtx_def_sign_extend"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "SIGN_EXTEND")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 186 nil  gc_used "rtx_def_ltgt"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "LTGT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 187 nil  gc_used "rtx_def_unlt"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "UNLT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 188 nil  gc_used "rtx_def_unle"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "UNLE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 189 nil  gc_used "rtx_def_ungt"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "UNGT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 190 nil  gc_used "rtx_def_unge"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "UNGE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 191 nil  gc_used "rtx_def_uneq"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "UNEQ")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 192 nil  gc_used "rtx_def_ordered"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "ORDERED")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 193 nil  gc_used "rtx_def_unordered"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "UNORDERED")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 194 nil  gc_used "rtx_def_ltu"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "LTU")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 195 nil  gc_used "rtx_def_leu"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "LEU")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 196 nil  gc_used "rtx_def_gtu"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "GTU")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 197 nil  gc_used "rtx_def_geu"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "GEU")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 198 nil  gc_used "rtx_def_lt"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "LT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 199 nil  gc_used "rtx_def_le"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "LE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 200 nil  gc_used "rtx_def_gt"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "GT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 201 nil  gc_used "rtx_def_ge"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "GE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 202 nil  gc_used "rtx_def_eq"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "EQ")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 203 nil  gc_used "rtx_def_ne"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "NE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 204 nil  gc_used "rtx_def_post_modify"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "POST_MODIFY")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 205 nil  gc_used "rtx_def_pre_modify"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "PRE_MODIFY")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 206 nil  gc_used "rtx_def_post_inc"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "POST_INC")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 207 nil  gc_used "rtx_def_post_dec"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "POST_DEC")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 208 nil  gc_used "rtx_def_pre_inc"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "PRE_INC")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 209 nil  gc_used "rtx_def_pre_dec"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "PRE_DEC")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 210 nil  gc_used "rtx_def_umax"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "UMAX")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 211 nil  gc_used "rtx_def_umin"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "UMIN")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 212 nil  gc_used "rtx_def_smax"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "SMAX")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 213 nil  gc_used "rtx_def_smin"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "SMIN")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 214 nil  gc_used "rtx_def_rotatert"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "ROTATERT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 215 nil  gc_used "rtx_def_lshiftrt"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "LSHIFTRT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 216 nil  gc_used "rtx_def_ashiftrt"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "ASHIFTRT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 217 nil  gc_used "rtx_def_rotate"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "ROTATE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 218 nil  gc_used "rtx_def_ashift"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "ASHIFT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 219 nil  gc_used "rtx_def_not"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "NOT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 220 nil  gc_used "rtx_def_xor"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "XOR")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 221 nil  gc_used "rtx_def_ior"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "IOR")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 222 nil  gc_used "rtx_def_and"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "AND")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 223 nil  gc_used "rtx_def_umod"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "UMOD")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 224 nil  gc_used "rtx_def_udiv"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "UDIV")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 225 nil  gc_used "rtx_def_mod"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "MOD")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 226 nil  gc_used "rtx_def_us_div"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "US_DIV")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 227 nil  gc_used "rtx_def_ss_div"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "SS_DIV")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 228 nil  gc_used "rtx_def_div"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "DIV")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 229 nil  gc_used "rtx_def_us_mult"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "US_MULT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 230 nil  gc_used "rtx_def_ss_mult"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "SS_MULT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 231 nil  gc_used "rtx_def_mult"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "MULT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 232 nil  gc_used "rtx_def_neg"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "NEG")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 233 nil  gc_used "rtx_def_minus"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "MINUS")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 234 nil  gc_used "rtx_def_plus"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "PLUS")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 235 nil  gc_used "rtx_def_compare"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "COMPARE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 236 nil  gc_used "rtx_def_if_then_else"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 3 
-                       (!pair  ".fld[2].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "IF_THEN_ELSE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 237 nil  gc_used "rtx_def_cc0"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 0 )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "CC0")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 238 nil  gc_used "rtx_def_symbol_ref"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 4 
-                       (!pair  "block_sym"
-                        (!type union 239 nil  gc_used "fake_union_1"
-                         (!srcfileloc  "rtl.h" 346)
-                         (!fields 1 
-                          (!pair  ""
-                           (!type struct 240 nil  gc_used "block_symbol"
-                            (!srcfileloc  "rtl.h" 216)
-                            (!fields 3 
-                             (!pair  "fld"
-                              (!type array 241 nil  gc_unused "3" 
-                               (!type undefined 242 nil  gc_unused "rtunion"
-                                (!srcfileloc  "rtl.h" 208)
-                               )
-                              )
-                              (!srcfileloc  "rtl.h" 208)
-                              (!options 
-                               (!option skip string  "")
-                              )
-                             )
-                             (!pair  "block"
-                              (!type pointer 243 nil  gc_used
-                               (!type struct 244 
-                                (!type already_seen 243)
-                                gc_pointed_to "object_block"
-                                (!srcfileloc  "rtl.h" 249)
-                                (!fields 5 
-                                 (!pair  "sect"
-                                  (!type pointer 245 nil  gc_used
-                                   (!type union 246 
-                                    (!type already_seen 245)
-                                    gc_pointed_to "section"
-                                    (!srcfileloc  "output.h" 492)
-                                    (!fields 4 
-                                     (!pair  "common"
-                                      (!type struct 247 nil  gc_used "section_common"
-                                       (!srcfileloc  "output.h" 434)
-                                       (!fields 1 
-                                        (!pair  "flags"
-                                         (!type already_seen 9)
-                                         (!srcfileloc  "output.h" 433)
-                                         nil )
-                                       )
-                                       nil 511 nil nil )
-                                      (!srcfileloc  "output.h" 488)
-                                      (!options 
-                                       (!option skip string  "")
-                                      )
-                                     )
-                                     (!pair  "named"
-                                      (!type struct 248 nil  gc_used "named_section"
-                                       (!srcfileloc  "output.h" 446)
-                                       (!fields 3 
-                                        (!pair  "common"
-                                         (!type already_seen 247)
-                                         (!srcfileloc  "output.h" 438)
-                                         nil )
-                                        (!pair  "name"
-                                         (!type already_seen 36)
-                                         (!srcfileloc  "output.h" 441)
-                                         nil )
-                                        (!pair  "decl"
-                                         (!type already_seen 5)
-                                         (!srcfileloc  "output.h" 445)
-                                         nil )
-                                       )
-                                       nil 511 nil nil )
-                                      (!srcfileloc  "output.h" 489)
-                                      (!options 
-                                       (!option tag string  "SECTION_NAMED")
-                                      )
-                                     )
-                                     (!pair  "unnamed"
-                                      (!type struct 249 nil  gc_used "unnamed_section"
-                                       (!srcfileloc  "output.h" 463)
-                                       (!fields 4 
-                                        (!pair  "common"
-                                         (!type already_seen 247)
-                                         (!srcfileloc  "output.h" 454)
-                                         nil )
-                                        (!pair  "callback"
-                                         (!type already_seen 9)
-                                         (!srcfileloc  "output.h" 458)
-                                         (!options 
-                                          (!option skip string  "")
-                                         )
-                                        )
-                                        (!pair  "data"
-                                         (!type already_seen 10)
-                                         (!srcfileloc  "output.h" 459)
-                                         (!options 
-                                          (!option skip string  "")
-                                         )
-                                        )
-                                        (!pair  "next"
-                                         (!type already_seen 245)
-                                         (!srcfileloc  "output.h" 462)
-                                         nil )
-                                       )
-                                       nil 511 nil nil )
-                                      (!srcfileloc  "output.h" 490)
-                                      (!options 
-                                       (!option tag string  "SECTION_UNNAMED")
-                                      )
-                                     )
-                                     (!pair  "noswitch"
-                                      (!type struct 250 nil  gc_used "noswitch_section"
-                                       (!srcfileloc  "output.h" 484)
-                                       (!fields 2 
-                                        (!pair  "common"
-                                         (!type already_seen 247)
-                                         (!srcfileloc  "output.h" 480)
-                                         nil )
-                                        (!pair  "callback"
-                                         (!type already_seen 9)
-                                         (!srcfileloc  "output.h" 483)
-                                         (!options 
-                                          (!option skip string  "")
-                                         )
-                                        )
-                                       )
-                                       nil 511 nil nil )
-                                      (!srcfileloc  "output.h" 491)
-                                      (!options 
-                                       (!option tag string  "SECTION_NOSWITCH")
-                                      )
-                                     )
-                                    )
-                                    (!options 
-                                     (!option desc string  "SECTION_STYLE (&(%h))")
-                                    )
-                                    511 nil )
-                                  )
-                                  (!srcfileloc  "rtl.h" 222)
-                                  nil )
-                                 (!pair  "alignment"
-                                  (!type already_seen 9)
-                                  (!srcfileloc  "rtl.h" 225)
-                                  nil )
-                                 (!pair  "size"
-                                  (!type already_seen 9)
-                                  (!srcfileloc  "rtl.h" 228)
-                                  nil )
-                                 (!pair  "objects"
-                                  (!type pointer 251 nil  gc_used
-                                   (!type user_struct 252 
-                                    (!type already_seen 251)
-                                    gc_pointed_to "vec<rtx,va_gc>"
-                                    (!srcfileloc  "rtl.h" 238)
-                                    (!fields 2 
-                                     (!pair  "va_gc"
-                                      (!type already_seen 3)
-                                      (!srcfileloc  "rtl.h" 238)
-                                      nil )
-                                     (!pair  "rtx"
-                                      (!type already_seen 136)
-                                      (!srcfileloc  "rtl.h" 238)
-                                      nil )
-                                    )
-                                   )
-                                  )
-                                  (!srcfileloc  "rtl.h" 238)
-                                  nil )
-                                 (!pair  "anchors"
-                                  (!type already_seen 251)
-                                  (!srcfileloc  "rtl.h" 248)
-                                  nil )
-                                )
-                                nil 511 nil nil )
-                              )
-                              (!srcfileloc  "rtl.h" 211)
-                              nil )
-                             (!pair  "offset"
-                              (!type already_seen 9)
-                              (!srcfileloc  "rtl.h" 215)
-                              nil )
-                            )
-                            nil 511 nil nil )
-                           (!srcfileloc  "gengtype.c" 995)
-                           (!options 
-                            (!option tag string  "1")
-                            (!option dot string  "")
-                           )
-                          )
-                         )
-                         nil 511 nil )
-                        (!srcfileloc  "gengtype.c" 1340)
-                        (!options 
-                         (!option desc string  "SYMBOL_REF_HAS_BLOCK_INFO_P (&%0)")
-                        )
-                       )
-                       (!pair  ".fld[2]."
-                        (!type union 253 nil  gc_used "rtx_def_symbol_subunion"
-                         (!srcfileloc  "rtl.h" 346)
-                         (!fields 2 
-                          (!pair  "rt_constant"
-                           (!type pointer 254 nil  gc_used
-                            (!type struct 255 
-                             (!type already_seen 254)
-                             gc_pointed_to "constant_descriptor_rtx"
-                             (!srcfileloc  "varasm.c" 3488)
-                             (!fields 10 
-                              (!pair  "next"
-                               (!type already_seen 254)
-                               (!srcfileloc  "varasm.c" 3478)
-                               nil )
-                              (!pair  "mem"
-                               (!type already_seen 136)
-                               (!srcfileloc  "varasm.c" 3479)
-                               nil )
-                              (!pair  "sym"
-                               (!type already_seen 136)
-                               (!srcfileloc  "varasm.c" 3480)
-                               nil )
-                              (!pair  "constant"
-                               (!type already_seen 136)
-                               (!srcfileloc  "varasm.c" 3481)
-                               nil )
-                              (!pair  "offset"
-                               (!type already_seen 9)
-                               (!srcfileloc  "varasm.c" 3482)
-                               nil )
-                              (!pair  "hash"
-                               (!type already_seen 9)
-                               (!srcfileloc  "varasm.c" 3483)
-                               nil )
-                              (!pair  "mode"
-                               (!type already_seen 9)
-                               (!srcfileloc  "varasm.c" 3484)
-                               nil )
-                              (!pair  "align"
-                               (!type already_seen 9)
-                               (!srcfileloc  "varasm.c" 3485)
-                               nil )
-                              (!pair  "labelno"
-                               (!type already_seen 9)
-                               (!srcfileloc  "varasm.c" 3486)
-                               nil )
-                              (!pair  "mark"
-                               (!type already_seen 9)
-                               (!srcfileloc  "varasm.c" 3487)
-                               nil )
-                             )
-                             (!options 
-                              (!option chain_next string  "%h.next")
-                             )
-                             511 nil nil )
-                           )
-                           (!srcfileloc  "gengtype.c" 1200)
-                           (!options 
-                            (!option tag string  "1")
-                            (!option dot string  "")
-                           )
-                          )
-                          (!pair  "rt_tree"
-                           (!type already_seen 5)
-                           (!srcfileloc  "gengtype.c" 1198)
-                           (!options 
-                            (!option default string  "")
-                            (!option dot string  "")
-                           )
-                          )
-                         )
-                         nil 511 nil )
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option desc string  "CONSTANT_POOL_ADDRESS_P (&%0)")
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[1].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_str"
-                        (!type already_seen 36)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "SYMBOL_REF")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 256 nil  gc_used "rtx_def_label_ref"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "LABEL_REF")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 257 nil  gc_used "rtx_def_mem"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_mem"
-                        (!type pointer 258 nil  gc_used
-                         (!type struct 259 
-                          (!type already_seen 258)
-                          gc_pointed_to "mem_attrs"
-                          (!srcfileloc  "rtl.h" 169)
-                          (!fields 8 
-                           (!pair  "expr"
-                            (!type already_seen 5)
-                            (!srcfileloc  "rtl.h" 143)
-                            nil )
-                           (!pair  "offset"
-                            (!type already_seen 9)
-                            (!srcfileloc  "rtl.h" 147)
-                            nil )
-                           (!pair  "size"
-                            (!type already_seen 9)
-                            (!srcfileloc  "rtl.h" 151)
-                            nil )
-                           (!pair  "alias"
-                            (!type already_seen 9)
-                            (!srcfileloc  "rtl.h" 154)
-                            nil )
-                           (!pair  "align"
-                            (!type already_seen 9)
-                            (!srcfileloc  "rtl.h" 159)
-                            nil )
-                           (!pair  "addrspace"
-                            (!type already_seen 28)
-                            (!srcfileloc  "rtl.h" 162)
-                            nil )
-                           (!pair  "offset_known_p"
-                            (!type already_seen 9)
-                            (!srcfileloc  "rtl.h" 165)
-                            nil )
-                           (!pair  "size_known_p"
-                            (!type already_seen 9)
-                            (!srcfileloc  "rtl.h" 168)
-                            nil )
-                          )
-                          nil 511 nil nil )
-                        )
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "MEM")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 260 nil  gc_used "rtx_def_concatn"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtvec"
-                        (!type pointer 261 nil  gc_used
-                         (!type struct 262 
-                          (!type already_seen 261)
-                          gc_pointed_to "rtvec_def"
-                          (!srcfileloc  "rtl.h" 388)
-                          (!fields 2 
-                           (!pair  "num_elem"
-                            (!type already_seen 9)
-                            (!srcfileloc  "rtl.h" 386)
-                            nil )
-                           (!pair  "elem"
-                            (!type array 263 nil  gc_used "1" 
-                             (!type already_seen 136)
-                            )
-                            (!srcfileloc  "rtl.h" 387)
-                            (!options 
-                             (!option length string  "%h.num_elem")
-                            )
-                           )
-                          )
-                          (!options 
-                           (!option variable_size string  "")
-                          )
-                          511 nil nil )
-                        )
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "CONCATN")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 264 nil  gc_used "rtx_def_concat"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "CONCAT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 265 nil  gc_used "rtx_def_strict_low_part"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "STRICT_LOW_PART")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 266 nil  gc_used "rtx_def_subreg"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "SUBREG")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 267 nil  gc_used "rtx_def_scratch"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "SCRATCH")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 268 nil  gc_used "rtx_def_reg"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 3 
-                       (!pair  ".fld[2].rt_reg"
-                        (!type pointer 269 nil  gc_used
-                         (!type struct 270 
-                          (!type already_seen 269)
-                          gc_pointed_to "reg_attrs"
-                          (!srcfileloc  "rtl.h" 181)
-                          (!fields 2 
-                           (!pair  "decl"
-                            (!type already_seen 5)
-                            (!srcfileloc  "rtl.h" 179)
-                            nil )
-                           (!pair  "offset"
-                            (!type already_seen 9)
-                            (!srcfileloc  "rtl.h" 180)
-                            nil )
-                          )
-                          nil 511 nil nil )
-                        )
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[1].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "REG")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 271 nil  gc_used "rtx_def_pc"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 0 )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "PC")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 272 nil  gc_used "rtx_def_const"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "CONST")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 273 nil  gc_used "rtx_def_const_string"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_str"
-                        (!type already_seen 36)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "CONST_STRING")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 274 nil  gc_used "rtx_def_const_vector"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtvec"
-                        (!type already_seen 261)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "CONST_VECTOR")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 275 nil  gc_used "rtx_def_const_double"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "CONST_DOUBLE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 276 nil  gc_used "rtx_def_const_fixed"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 3 
-                       (!pair  ".fld[2].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[1].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "CONST_FIXED")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 277 nil  gc_used "rtx_def_const_int"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "CONST_INT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 278 nil  gc_used "rtx_def_trap_if"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "TRAP_IF")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 279 nil  gc_used "rtx_def_eh_return"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 0 )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "EH_RETURN")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 280 nil  gc_used "rtx_def_simple_return"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 0 )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "SIMPLE_RETURN")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 281 nil  gc_used "rtx_def_return"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 0 )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "RETURN")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 282 nil  gc_used "rtx_def_call"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "CALL")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 283 nil  gc_used "rtx_def_clobber"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "CLOBBER")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 284 nil  gc_used "rtx_def_use"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "USE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 285 nil  gc_used "rtx_def_set"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "SET")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 286 nil  gc_used "rtx_def_prefetch"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 3 
-                       (!pair  ".fld[2].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "PREFETCH")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 287 nil  gc_used "rtx_def_addr_diff_vec"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 5 
-                       (!pair  ".fld[4].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[3].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[2].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[1].rt_rtvec"
-                        (!type already_seen 261)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "ADDR_DIFF_VEC")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 288 nil  gc_used "rtx_def_addr_vec"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtvec"
-                        (!type already_seen 261)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "ADDR_VEC")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 289 nil  gc_used "rtx_def_unspec_volatile"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtvec"
-                        (!type already_seen 261)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "UNSPEC_VOLATILE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 290 nil  gc_used "rtx_def_unspec"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtvec"
-                        (!type already_seen 261)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "UNSPEC")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 291 nil  gc_used "rtx_def_asm_operands"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 7 
-                       (!pair  ".fld[6].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[5].rt_rtvec"
-                        (!type already_seen 261)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[4].rt_rtvec"
-                        (!type already_seen 261)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[3].rt_rtvec"
-                        (!type already_seen 261)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[2].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[1].rt_str"
-                        (!type already_seen 36)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_str"
-                        (!type already_seen 36)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "ASM_OPERANDS")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 292 nil  gc_used "rtx_def_asm_input"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_str"
-                        (!type already_seen 36)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "ASM_INPUT")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 293 nil  gc_used "rtx_def_parallel"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtvec"
-                        (!type already_seen 261)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "PARALLEL")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 294 nil  gc_used "rtx_def_cond_exec"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "COND_EXEC")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 295 nil  gc_used "rtx_def_note"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 7 
-                       (!pair  ".fld[6].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[5].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[4]."
-                        (!type union 296 nil  gc_used "rtx_def_note_subunion"
-                         (!srcfileloc  "rtl.h" 346)
-                         (!fields 17 
-                          (!pair  "rt_str"
-                           (!type already_seen 36)
-                           (!srcfileloc  "gengtype.c" 1166)
-                           (!options 
-                            (!option default string  "")
-                            (!option dot string  "")
-                           )
-                          )
-                          (!pair  "rt_int"
-                           (!type already_seen 9)
-                           (!srcfileloc  "gengtype.c" 1180)
-                           (!options 
-                            (!option tag string  "NOTE_INSN_CFI_LABEL")
-                            (!option dot string  "")
-                           )
-                          )
-                          (!pair  "rt_int"
-                           (!type already_seen 9)
-                           (!srcfileloc  "gengtype.c" 1180)
-                           (!options 
-                            (!option tag string  "NOTE_INSN_CFI")
-                            (!option dot string  "")
-                           )
-                          )
-                          (!pair  "rt_int"
-                           (!type already_seen 9)
-                           (!srcfileloc  "gengtype.c" 1180)
-                           (!options 
-                            (!option tag string  "NOTE_INSN_SWITCH_TEXT_SECTIONS")
-                            (!option dot string  "")
-                           )
-                          )
-                          (!pair  "rt_int"
-                           (!type already_seen 9)
-                           (!srcfileloc  "gengtype.c" 1180)
-                           (!options 
-                            (!option tag string  "NOTE_INSN_BASIC_BLOCK")
-                            (!option dot string  "")
-                           )
-                          )
-                          (!pair  "rt_rtx"
-                           (!type already_seen 136)
-                           (!srcfileloc  "gengtype.c" 1176)
-                           (!options 
-                            (!option tag string  "NOTE_INSN_CALL_ARG_LOCATION")
-                            (!option dot string  "")
-                           )
-                          )
-                          (!pair  "rt_rtx"
-                           (!type already_seen 136)
-                           (!srcfileloc  "gengtype.c" 1176)
-                           (!options 
-                            (!option tag string  "NOTE_INSN_VAR_LOCATION")
-                            (!option dot string  "")
-                           )
-                          )
-                          (!pair  "rt_int"
-                           (!type already_seen 9)
-                           (!srcfileloc  "gengtype.c" 1180)
-                           (!options 
-                            (!option tag string  "NOTE_INSN_EH_REGION_END")
-                            (!option dot string  "")
-                           )
-                          )
-                          (!pair  "rt_int"
-                           (!type already_seen 9)
-                           (!srcfileloc  "gengtype.c" 1180)
-                           (!options 
-                            (!option tag string  "NOTE_INSN_EH_REGION_BEG")
-                            (!option dot string  "")
-                           )
-                          )
-                          (!pair  "rt_int"
-                           (!type already_seen 9)
-                           (!srcfileloc  "gengtype.c" 1180)
-                           (!options 
-                            (!option tag string  "NOTE_INSN_EPILOGUE_BEG")
-                            (!option dot string  "")
-                           )
-                          )
-                          (!pair  "rt_int"
-                           (!type already_seen 9)
-                           (!srcfileloc  "gengtype.c" 1180)
-                           (!options 
-                            (!option tag string  "NOTE_INSN_PROLOGUE_END")
-                            (!option dot string  "")
-                           )
-                          )
-                          (!pair  "rt_int"
-                           (!type already_seen 9)
-                           (!srcfileloc  "gengtype.c" 1180)
-                           (!options 
-                            (!option tag string  "NOTE_INSN_FUNCTION_BEG")
-                            (!option dot string  "")
-                           )
-                          )
-                          (!pair  "rt_tree"
-                           (!type already_seen 5)
-                           (!srcfileloc  "gengtype.c" 1171)
-                           (!options 
-                            (!option tag string  "NOTE_INSN_BLOCK_END")
-                            (!option dot string  "")
-                           )
-                          )
-                          (!pair  "rt_tree"
-                           (!type already_seen 5)
-                           (!srcfileloc  "gengtype.c" 1171)
-                           (!options 
-                            (!option tag string  "NOTE_INSN_BLOCK_BEG")
-                            (!option dot string  "")
-                           )
-                          )
-                          (!pair  "rt_str"
-                           (!type already_seen 36)
-                           (!srcfileloc  "gengtype.c" 1166)
-                           (!options 
-                            (!option tag string  "NOTE_INSN_DELETED_DEBUG_LABEL")
-                            (!option dot string  "")
-                           )
-                          )
-                          (!pair  "rt_str"
-                           (!type already_seen 36)
-                           (!srcfileloc  "gengtype.c" 1166)
-                           (!options 
-                            (!option tag string  "NOTE_INSN_DELETED_LABEL")
-                            (!option dot string  "")
-                           )
-                          )
-                          (!pair  "rt_int"
-                           (!type already_seen 9)
-                           (!srcfileloc  "gengtype.c" 1180)
-                           (!options 
-                            (!option tag string  "NOTE_INSN_DELETED")
-                            (!option dot string  "")
-                           )
-                          )
-                         )
-                         nil 511 nil )
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option desc string  "NOTE_KIND (&%0)")
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[3].rt_bb"
-                        (!type pointer 297 nil  gc_used
-                         (!type struct 298 
-                          (!type already_seen 297)
-                          gc_pointed_to "basic_block_def"
-                          (!srcfileloc  "basic-block.h" 209)
-                          (!fields 13 
-                           (!pair  "preds"
-                            (!type pointer 299 nil  gc_used
-                             (!type user_struct 300 
-                              (!type already_seen 299)
-                              gc_pointed_to "vec<edge,va_gc>"
-                              (!srcfileloc  "basic-block.h" 169)
-                              (!fields 2 
-                               (!pair  "va_gc"
-                                (!type already_seen 3)
-                                (!srcfileloc  "basic-block.h" 169)
-                                nil )
-                               (!pair  "edge"
-                                (!type pointer 301 nil  gc_used
-                                 (!type user_struct 302 
-                                  (!type already_seen 301)
-                                  gc_pointed_to "edge_def"
-                                  (!srcfileloc  "basic-block.h" 59)
-                                  (!fields 0 )
-                                 )
-                                )
-                                (!srcfileloc  "basic-block.h" 169)
-                                nil )
-                              )
-                             )
-                            )
-                            (!srcfileloc  "basic-block.h" 169)
-                            nil )
-                           (!pair  "succs"
-                            (!type already_seen 299)
-                            (!srcfileloc  "basic-block.h" 170)
-                            nil )
-                           (!pair  "aux"
-                            (!type already_seen 10)
-                            (!srcfileloc  "basic-block.h" 173)
-                            (!options 
-                             (!option skip string  "")
-                            )
-                           )
-                           (!pair  "loop_father"
-                            (!type pointer 303 nil  gc_used
-                             (!type struct 304 
-                              (!type already_seen 303)
-                              gc_pointed_to "loop"
-                              (!srcfileloc  "cfgloop.h" 195)
-                              (!fields 26 
-                               (!pair  "num"
-                                (!type already_seen 9)
-                                (!srcfileloc  "cfgloop.h" 106)
-                                nil )
-                               (!pair  "ninsns"
-                                (!type already_seen 9)
-                                (!srcfileloc  "cfgloop.h" 109)
-                                nil )
-                               (!pair  "header"
-                                (!type already_seen 297)
-                                (!srcfileloc  "cfgloop.h" 112)
-                                nil )
-                               (!pair  "latch"
-                                (!type already_seen 297)
-                                (!srcfileloc  "cfgloop.h" 115)
-                                nil )
-                               (!pair  "lpt_decision"
-                                (!type struct 305 nil  gc_used "lpt_decision"
-                                 (!srcfileloc  "cfgloop.h" 42)
-                                 (!fields 2 
-                                  (!pair  "decision"
-                                   (!type already_seen 9)
-                                   (!srcfileloc  "cfgloop.h" 40)
-                                   nil )
-                                  (!pair  "times"
-                                   (!type already_seen 9)
-                                   (!srcfileloc  "cfgloop.h" 41)
-                                   nil )
-                                 )
-                                 nil 511 nil nil )
-                                (!srcfileloc  "cfgloop.h" 118)
-                                nil )
-                               (!pair  "av_ninsns"
-                                (!type already_seen 9)
-                                (!srcfileloc  "cfgloop.h" 121)
-                                nil )
-                               (!pair  "num_nodes"
-                                (!type already_seen 9)
-                                (!srcfileloc  "cfgloop.h" 124)
-                                nil )
-                               (!pair  "superloops"
-                                (!type pointer 306 nil  gc_used
-                                 (!type user_struct 307 
-                                  (!type already_seen 306)
-                                  gc_pointed_to "vec<loop_p,va_gc>"
-                                  (!srcfileloc  "cfgloop.h" 127)
-                                  (!fields 2 
-                                   (!pair  "va_gc"
-                                    (!type already_seen 3)
-                                    (!srcfileloc  "cfgloop.h" 127)
-                                    nil )
-                                   (!pair  "loop_p"
-                                    (!type already_seen 303)
-                                    (!srcfileloc  "cfgloop.h" 127)
-                                    nil )
-                                  )
-                                 )
-                                )
-                                (!srcfileloc  "cfgloop.h" 127)
-                                nil )
-                               (!pair  "inner"
-                                (!type already_seen 303)
-                                (!srcfileloc  "cfgloop.h" 130)
-                                nil )
-                               (!pair  "next"
-                                (!type already_seen 303)
-                                (!srcfileloc  "cfgloop.h" 133)
-                                nil )
-                               (!pair  "aux"
-                                (!type already_seen 10)
-                                (!srcfileloc  "cfgloop.h" 136)
-                                (!options 
-                                 (!option skip string  "")
-                                )
-                               )
-                               (!pair  "nb_iterations"
-                                (!type already_seen 5)
-                                (!srcfileloc  "cfgloop.h" 145)
-                                nil )
-                               (!pair  "nb_iterations_upper_bound"
-                                (!type already_seen 9)
-                                (!srcfileloc  "cfgloop.h" 149)
-                                nil )
-                               (!pair  "nb_iterations_estimate"
-                                (!type already_seen 9)
-                                (!srcfileloc  "cfgloop.h" 154)
-                                nil )
-                               (!pair  "any_upper_bound"
-                                (!type already_seen 9)
-                                (!srcfileloc  "cfgloop.h" 156)
-                                nil )
-                               (!pair  "any_estimate"
-                                (!type already_seen 9)
-                                (!srcfileloc  "cfgloop.h" 157)
-                                nil )
-                               (!pair  "can_be_parallel"
-                                (!type already_seen 9)
-                                (!srcfileloc  "cfgloop.h" 160)
-                                nil )
-                               (!pair  "warned_aggressive_loop_optimizations"
-                                (!type already_seen 9)
-                                (!srcfileloc  "cfgloop.h" 164)
-                                nil )
-                               (!pair  "estimate_state"
-                                (!type already_seen 9)
-                                (!srcfileloc  "cfgloop.h" 168)
-                                nil )
-                               (!pair  "safelen"
-                                (!type already_seen 9)
-                                (!srcfileloc  "cfgloop.h" 174)
-                                nil )
-                               (!pair  "force_vect"
-                                (!type already_seen 9)
-                                (!srcfileloc  "cfgloop.h" 177)
-                                nil )
-                               (!pair  "dont_vectorize"
-                                (!type already_seen 9)
-                                (!srcfileloc  "cfgloop.h" 180)
-                                nil )
-                               (!pair  "simduid"
-                                (!type already_seen 5)
-                                (!srcfileloc  "cfgloop.h" 185)
-                                nil )
-                               (!pair  "bounds"
-                                (!type pointer 308 nil  gc_used
-                                 (!type struct 309 
-                                  (!type already_seen 308)
-                                  gc_pointed_to "nb_iter_bound"
-                                  (!srcfileloc  "cfgloop.h" 74)
-                                  (!fields 4 
-                                   (!pair  "stmt"
-                                    (!type pointer 310 nil  gc_used
-                                     (!type struct 311 
-                                      (!type already_seen 310)
-                                      gc_pointed_to "gimple_statement_base"
-                                      (!srcfileloc  "gimple.h" 202)
-                                      (!fields 15 
-                                       (!pair  "code"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "gimple.h" 143)
-                                        nil )
-                                       (!pair  "no_warning"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "gimple.h" 146)
-                                        nil )
-                                       (!pair  "visited"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "gimple.h" 150)
-                                        nil )
-                                       (!pair  "nontemporal_move"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "gimple.h" 153)
-                                        nil )
-                                       (!pair  "plf"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "gimple.h" 160)
-                                        nil )
-                                       (!pair  "modified"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "gimple.h" 164)
-                                        nil )
-                                       (!pair  "has_volatile_ops"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "gimple.h" 167)
-                                        nil )
-                                       (!pair  "pad"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "gimple.h" 170)
-                                        nil )
-                                       (!pair  "subcode"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "gimple.h" 176)
-                                        nil )
-                                       (!pair  "uid"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "gimple.h" 181)
-                                        nil )
-                                       (!pair  "location"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "gimple.h" 185)
-                                        nil )
-                                       (!pair  "num_ops"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "gimple.h" 188)
-                                        nil )
-                                       (!pair  "bb"
-                                        (!type already_seen 297)
-                                        (!srcfileloc  "gimple.h" 192)
-                                        nil )
-                                       (!pair  "next"
-                                        (!type already_seen 310)
-                                        (!srcfileloc  "gimple.h" 200)
-                                        nil )
-                                       (!pair  "prev"
-                                        (!type already_seen 310)
-                                        (!srcfileloc  "gimple.h" 201)
-                                        (!options 
-                                         (!option skip string  "")
-                                        )
-                                       )
-                                      )
-                                      (!options 
-                                       (!option variable_size string  "")
-                                       (!option chain_next string  "%h.next")
-                                       (!option tag string  "GSS_BASE")
-                                       (!option desc string  "gimple_statement_structure (&%h)")
-                                      )
-                                      511 nil nil )
-                                    )
-                                    (!srcfileloc  "cfgloop.h" 56)
-                                    nil )
-                                   (!pair  "bound"
-                                    (!type already_seen 9)
-                                    (!srcfileloc  "cfgloop.h" 65)
-                                    nil )
-                                   (!pair  "is_exit"
-                                    (!type already_seen 9)
-                                    (!srcfileloc  "cfgloop.h" 70)
-                                    nil )
-                                   (!pair  "next"
-                                    (!type already_seen 308)
-                                    (!srcfileloc  "cfgloop.h" 73)
-                                    nil )
-                                  )
-                                  (!options 
-                                   (!option chain_next string  "%h.next")
-                                  )
-                                  511 nil nil )
-                                )
-                                (!srcfileloc  "cfgloop.h" 188)
-                                nil )
-                               (!pair  "exits"
-                                (!type pointer 312 nil  gc_used
-                                 (!type struct 313 
-                                  (!type already_seen 312)
-                                  gc_pointed_to "loop_exit"
-                                  (!srcfileloc  "cfgloop.h" 88)
-                                  (!fields 4 
-                                   (!pair  "e"
-                                    (!type already_seen 301)
-                                    (!srcfileloc  "cfgloop.h" 80)
-                                    nil )
-                                   (!pair  "prev"
-                                    (!type already_seen 312)
-                                    (!srcfileloc  "cfgloop.h" 83)
-                                    nil )
-                                   (!pair  "next"
-                                    (!type already_seen 312)
-                                    (!srcfileloc  "cfgloop.h" 84)
-                                    nil )
-                                   (!pair  "next_e"
-                                    (!type already_seen 312)
-                                    (!srcfileloc  "cfgloop.h" 87)
-                                    nil )
-                                  )
-                                  nil 511 nil nil )
-                                )
-                                (!srcfileloc  "cfgloop.h" 191)
-                                nil )
-                               (!pair  "simple_loop_desc"
-                                (!type pointer 314 nil  gc_used
-                                 (!type struct 315 
-                                  (!type already_seen 314)
-                                  gc_pointed_to "niter_desc"
-                                  (!srcfileloc  "cfgloop.h" 422)
-                                  (!fields 11 
-                                   (!pair  "out_edge"
-                                    (!type already_seen 301)
-                                    (!srcfileloc  "cfgloop.h" 389)
-                                    nil )
-                                   (!pair  "in_edge"
-                                    (!type already_seen 301)
-                                    (!srcfileloc  "cfgloop.h" 392)
-                                    nil )
-                                   (!pair  "simple_p"
-                                    (!type already_seen 9)
-                                    (!srcfileloc  "cfgloop.h" 396)
-                                    nil )
-                                   (!pair  "const_iter"
-                                    (!type already_seen 9)
-                                    (!srcfileloc  "cfgloop.h" 399)
-                                    nil )
-                                   (!pair  "niter"
-                                    (!type already_seen 9)
-                                    (!srcfileloc  "cfgloop.h" 402)
-                                    nil )
-                                   (!pair  "assumptions"
-                                    (!type already_seen 136)
-                                    (!srcfileloc  "cfgloop.h" 405)
-                                    nil )
-                                   (!pair  "noloop_assumptions"
-                                    (!type already_seen 136)
-                                    (!srcfileloc  "cfgloop.h" 409)
-                                    nil )
-                                   (!pair  "infinite"
-                                    (!type already_seen 136)
-                                    (!srcfileloc  "cfgloop.h" 412)
-                                    nil )
-                                   (!pair  "signed_p"
-                                    (!type already_seen 9)
-                                    (!srcfileloc  "cfgloop.h" 415)
-                                    nil )
-                                   (!pair  "mode"
-                                    (!type already_seen 9)
-                                    (!srcfileloc  "cfgloop.h" 418)
-                                    nil )
-                                   (!pair  "niter_expr"
-                                    (!type already_seen 136)
-                                    (!srcfileloc  "cfgloop.h" 421)
-                                    nil )
-                                  )
-                                  nil 511 nil nil )
-                                )
-                                (!srcfileloc  "cfgloop.h" 194)
-                                nil )
-                              )
-                              (!options 
-                               (!option chain_next string  "%h.next")
-                              )
-                              511 nil nil )
-                            )
-                            (!srcfileloc  "basic-block.h" 176)
-                            nil )
-                           (!pair  "dom"
-                            (!type array 316 nil  gc_unused "2" 
-                             (!type pointer 317 nil  gc_unused
-                              (!type struct 318 
-                               (!type already_seen 317)
-                               gc_unused "et_node"nil 
-                               (!fields 0 )
-                               nil 0 nil nil )
-                             )
-                            )
-                            (!srcfileloc  "basic-block.h" 179)
-                            (!options 
-                             (!option skip string  "")
-                            )
-                           )
-                           (!pair  "prev_bb"
-                            (!type already_seen 297)
-                            (!srcfileloc  "basic-block.h" 182)
-                            nil )
-                           (!pair  "next_bb"
-                            (!type already_seen 297)
-                            (!srcfileloc  "basic-block.h" 183)
-                            nil )
-                           (!pair  "il"
-                            (!type union 319 nil  gc_used "basic_block_il_dependent"
-                             (!srcfileloc  "basic-block.h" 191)
-                             (!fields 2 
-                              (!pair  "gimple"
-                               (!type struct 320 nil  gc_used "gimple_bb_info"
-                                (!srcfileloc  "basic-block.h" 139)
-                                (!fields 2 
-                                 (!pair  "seq"
-                                  (!type already_seen 310)
-                                  (!srcfileloc  "basic-block.h" 135)
-                                  nil )
-                                 (!pair  "phi_nodes"
-                                  (!type already_seen 310)
-                                  (!srcfileloc  "basic-block.h" 138)
-                                  nil )
-                                )
-                                nil 511 nil nil )
-                               (!srcfileloc  "basic-block.h" 186)
-                               (!options 
-                                (!option tag string  "0")
-                               )
-                              )
-                              (!pair  "x"
-                               (!type struct 321 nil  gc_used "anonymous:../../gcc/basic-block.h:187"
-                                (!srcfileloc  "basic-block.h" 190)
-                                (!fields 2 
-                                 (!pair  "head_"
-                                  (!type already_seen 136)
-                                  (!srcfileloc  "basic-block.h" 188)
-                                  nil )
-                                 (!pair  "rtl"
-                                  (!type pointer 322 nil  gc_used
-                                   (!type struct 323 
-                                    (!type already_seen 322)
-                                    gc_pointed_to "rtl_bb_info"
-                                    (!srcfileloc  "basic-block.h" 131)
-                                    (!fields 3 
-                                     (!pair  "end_"
-                                      (!type already_seen 136)
-                                      (!srcfileloc  "basic-block.h" 125)
-                                      nil )
-                                     (!pair  "header_"
-                                      (!type already_seen 136)
-                                      (!srcfileloc  "basic-block.h" 129)
-                                      nil )
-                                     (!pair  "footer_"
-                                      (!type already_seen 136)
-                                      (!srcfileloc  "basic-block.h" 130)
-                                      nil )
-                                    )
-                                    nil 511 nil nil )
-                                  )
-                                  (!srcfileloc  "basic-block.h" 189)
-                                  nil )
-                                )
-                                nil 511 nil nil )
-                               (!srcfileloc  "basic-block.h" 190)
-                               (!options 
-                                (!option tag string  "1")
-                               )
-                              )
-                             )
-                             nil 511 nil )
-                            (!srcfileloc  "basic-block.h" 191)
-                            (!options 
-                             (!option desc string  "((%1.flags & BB_RTL) != 0)")
-                            )
-                           )
-                           (!pair  "flags"
-                            (!type already_seen 9)
-                            (!srcfileloc  "basic-block.h" 194)
-                            nil )
-                           (!pair  "index"
-                            (!type already_seen 9)
-                            (!srcfileloc  "basic-block.h" 197)
-                            nil )
-                           (!pair  "count"
-                            (!type already_seen 9)
-                            (!srcfileloc  "basic-block.h" 200)
-                            nil )
-                           (!pair  "frequency"
-                            (!type already_seen 9)
-                            (!srcfileloc  "basic-block.h" 203)
-                            nil )
-                           (!pair  "discriminator"
-                            (!type already_seen 9)
-                            (!srcfileloc  "basic-block.h" 208)
-                            nil )
-                          )
-                          (!options 
-                           (!option chain_prev string  "%h.prev_bb")
-                           (!option chain_next string  "%h.next_bb")
-                          )
-                          511 nil nil )
-                        )
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[2].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "NOTE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 324 nil  gc_used "rtx_def_code_label"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 8 
-                       (!pair  ".fld[7].rt_str"
-                        (!type already_seen 36)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[6].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[5].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[4].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[3].rt_bb"
-                        (!type already_seen 297)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[2].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "CODE_LABEL")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 325 nil  gc_used "rtx_def_barrier"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 8 
-                       (!pair  ".fld[7].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[6].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[5].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[4].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[3].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[2].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "BARRIER")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 326 nil  gc_used "rtx_def_jump_table_data"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 9 
-                       (!pair  ".fld[8].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[7].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[6].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[5].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[4].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[3].rt_bb"
-                        (!type already_seen 297)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[2].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "JUMP_TABLE_DATA")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 327 nil  gc_used "rtx_def_call_insn"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 9 
-                       (!pair  ".fld[8].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[7].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[6].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[5].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[4].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[3].rt_bb"
-                        (!type already_seen 297)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[2].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "CALL_INSN")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 328 nil  gc_used "rtx_def_jump_insn"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 9 
-                       (!pair  ".fld[8].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[7].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[6].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[5].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[4].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[3].rt_bb"
-                        (!type already_seen 297)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[2].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "JUMP_INSN")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 329 nil  gc_used "rtx_def_insn"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 8 
-                       (!pair  ".fld[7].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[6].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[5].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[4].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[3].rt_bb"
-                        (!type already_seen 297)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[2].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "INSN")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 330 nil  gc_used "rtx_def_debug_insn"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 8 
-                       (!pair  ".fld[7].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[6].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[5].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[4].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[3].rt_bb"
-                        (!type already_seen 297)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[2].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "DEBUG_INSN")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 331 nil  gc_used "rtx_def_address"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "ADDRESS")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 332 nil  gc_used "rtx_def_sequence"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_rtvec"
-                        (!type already_seen 261)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "SEQUENCE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 333 nil  gc_used "rtx_def_int_list"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "INT_LIST")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 334 nil  gc_used "rtx_def_insn_list"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "INSN_LIST")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 335 nil  gc_used "rtx_def_expr_list"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 2 
-                       (!pair  ".fld[1].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                       (!pair  ".fld[0].rt_rtx"
-                        (!type already_seen 136)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "EXPR_LIST")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 336 nil  gc_used "rtx_def_debug_expr"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_tree"
-                        (!type already_seen 5)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "DEBUG_EXPR")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 337 nil  gc_used "rtx_def_value"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "VALUE")
-                      (!option dot string  "")
-                     )
-                    )
-                    (!pair  ""
-                     (!type struct 338 nil  gc_used "rtx_def_UnKnown"
-                      (!srcfileloc  "rtl.h" 346)
-                      (!fields 1 
-                       (!pair  ".fld[0].rt_int"
-                        (!type already_seen 9)
-                        (!srcfileloc  "gengtype.c" 1321)
-                        (!options 
-                         (!option dot string  "")
-                        )
-                       )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "gengtype.c" 1350)
-                     (!options 
-                      (!option tag string  "UNKNOWN")
-                      (!option dot string  "")
-                     )
-                    )
-                   )
-                   (!options 
-                    (!option dot string  "")
-                   )
-                   511 nil )
-                  (!srcfileloc  "rtl.h" 346)
-                  (!options 
-                   (!option desc string  "GET_CODE (&%0)")
-                   (!option special string  "rtx_def")
-                  )
-                 )
-                )
-                (!options 
-                 (!option variable_size string  "")
-                 (!option chain_prev string  "RTX_PREV (&%h)")
-                 (!option chain_next string  "RTX_NEXT (&%h)")
-                )
-                511 nil nil )
-              )
-              (!srcfileloc  "tree-core.h" 1389)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1601)
-           (!options 
-            (!option tag string  "TS_DECL_WRTL")
-           )
-          )
-          (!pair  "decl_non_common"
-           (!type struct 339 nil  gc_used "tree_decl_non_common"
-            (!srcfileloc  "tree-core.h" 1473)
-            (!fields 5 
-             (!pair  "common"
-              (!type struct 340 nil  gc_used "tree_decl_with_vis"
-               (!srcfileloc  "tree-core.h" 1457)
-               (!fields 22 
-                (!pair  "common"
-                 (!type already_seen 135)
-                 (!srcfileloc  "tree-core.h" 1422)
-                 nil )
-                (!pair  "assembler_name"
-                 (!type already_seen 5)
-                 (!srcfileloc  "tree-core.h" 1423)
-                 nil )
-                (!pair  "section_name"
-                 (!type already_seen 5)
-                 (!srcfileloc  "tree-core.h" 1424)
-                 nil )
-                (!pair  "comdat_group"
-                 (!type already_seen 5)
-                 (!srcfileloc  "tree-core.h" 1425)
-                 nil )
-                (!pair  "defer_output"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1428)
-                 nil )
-                (!pair  "hard_register"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1429)
-                 nil )
-                (!pair  "common_flag"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1430)
-                 nil )
-                (!pair  "in_text_section"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1431)
-                 nil )
-                (!pair  "in_constant_pool"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1432)
-                 nil )
-                (!pair  "dllimport_flag"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1433)
-                 nil )
-                (!pair  "weak_flag"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1435)
-                 nil )
-                (!pair  "implicit_section_name_p"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1437)
-                 nil )
-                (!pair  "seen_in_bind_expr"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1439)
-                 nil )
-                (!pair  "comdat_flag"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1440)
-                 nil )
-                (!pair  "visibility"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1441)
-                 nil )
-                (!pair  "visibility_specified"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1442)
-                 nil )
-                (!pair  "tls_model"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1444)
-                 nil )
-                (!pair  "init_priority_p"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1447)
-                 nil )
-                (!pair  "shadowed_for_var_p"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1449)
-                 nil )
-                (!pair  "cxx_constructor"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1451)
-                 nil )
-                (!pair  "cxx_destructor"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1453)
-                 nil )
-                (!pair  "final"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1455)
-                 nil )
-               )
-               nil 511 nil nil )
-              (!srcfileloc  "tree-core.h" 1464)
-              nil )
-             (!pair  "saved_tree"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1466)
-              nil )
-             (!pair  "arguments"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1468)
-              nil )
-             (!pair  "result"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1470)
-              nil )
-             (!pair  "vindex"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1472)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1603)
-           (!options 
-            (!option tag string  "TS_DECL_NON_COMMON")
-           )
-          )
-          (!pair  "parm_decl"
-           (!type struct 341 nil  gc_used "tree_parm_decl"
-            (!srcfileloc  "tree-core.h" 1419)
-            (!fields 2 
-             (!pair  "common"
-              (!type already_seen 135)
-              (!srcfileloc  "tree-core.h" 1417)
-              nil )
-             (!pair  "incoming_rtl"
-              (!type already_seen 136)
-              (!srcfileloc  "tree-core.h" 1418)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1604)
-           (!options 
-            (!option tag string  "TS_PARM_DECL")
-           )
-          )
-          (!pair  "decl_with_vis"
-           (!type already_seen 340)
-           (!srcfileloc  "tree-core.h" 1605)
-           (!options 
-            (!option tag string  "TS_DECL_WITH_VIS")
-           )
-          )
-          (!pair  "var_decl"
-           (!type struct 342 nil  gc_used "tree_var_decl"
-            (!srcfileloc  "tree-core.h" 1461)
-            (!fields 1 
-             (!pair  "common"
-              (!type already_seen 340)
-              (!srcfileloc  "tree-core.h" 1460)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1606)
-           (!options 
-            (!option tag string  "TS_VAR_DECL")
-           )
-          )
-          (!pair  "field_decl"
-           (!type struct 343 nil  gc_used "tree_field_decl"
-            (!srcfileloc  "tree-core.h" 1400)
-            (!fields 6 
-             (!pair  "common"
-              (!type already_seen 38)
-              (!srcfileloc  "tree-core.h" 1393)
-              nil )
-             (!pair  "offset"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1395)
-              nil )
-             (!pair  "bit_field_type"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1396)
-              nil )
-             (!pair  "qualifier"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1397)
-              nil )
-             (!pair  "bit_offset"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1398)
-              nil )
-             (!pair  "fcontext"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1399)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1607)
-           (!options 
-            (!option tag string  "TS_FIELD_DECL")
-           )
-          )
-          (!pair  "label_decl"
-           (!type struct 344 nil  gc_used "tree_label_decl"
-            (!srcfileloc  "tree-core.h" 1406)
-            (!fields 3 
-             (!pair  "common"
-              (!type already_seen 135)
-              (!srcfileloc  "tree-core.h" 1403)
-              nil )
-             (!pair  "label_decl_uid"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1404)
-              nil )
-             (!pair  "eh_landing_pad_nr"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1405)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1608)
-           (!options 
-            (!option tag string  "TS_LABEL_DECL")
-           )
-          )
-          (!pair  "result_decl"
-           (!type struct 345 nil  gc_used "tree_result_decl"
-            (!srcfileloc  "tree-core.h" 1410)
-            (!fields 1 
-             (!pair  "common"
-              (!type already_seen 135)
-              (!srcfileloc  "tree-core.h" 1409)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1609)
-           (!options 
-            (!option tag string  "TS_RESULT_DECL")
-           )
-          )
-          (!pair  "const_decl"
-           (!type struct 346 nil  gc_used "tree_const_decl"
-            (!srcfileloc  "tree-core.h" 1414)
-            (!fields 1 
-             (!pair  "common"
-              (!type already_seen 38)
-              (!srcfileloc  "tree-core.h" 1413)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1610)
-           (!options 
-            (!option tag string  "TS_CONST_DECL")
-           )
-          )
-          (!pair  "type_decl"
-           (!type struct 347 nil  gc_used "tree_type_decl"
-            (!srcfileloc  "tree-core.h" 1534)
-            (!fields 1 
-             (!pair  "common"
-              (!type already_seen 339)
-              (!srcfileloc  "tree-core.h" 1532)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1611)
-           (!options 
-            (!option tag string  "TS_TYPE_DECL")
-           )
-          )
-          (!pair  "function_decl"
-           (!type struct 348 nil  gc_used "tree_function_decl"
-            (!srcfileloc  "tree-core.h" 1521)
-            (!fields 26 
-             (!pair  "common"
-              (!type already_seen 339)
-              (!srcfileloc  "tree-core.h" 1481)
-              nil )
-             (!pair  "f"
-              (!type pointer 349 nil  gc_used
-               (!type struct 350 
-                (!type already_seen 349)
-                gc_pointed_to "function"
-                (!srcfileloc  "function.h" 673)
-                (!fields 43 
-                 (!pair  "eh"
-                  (!type pointer 351 nil  gc_used
-                   (!type struct 352 
-                    (!type already_seen 351)
-                    gc_pointed_to "eh_status"
-                    (!srcfileloc  "except.h" 221)
-                    (!fields 6 
-                     (!pair  "region_tree"
-                      (!type pointer 353 nil  gc_used
-                       (!type struct 354 
-                        (!type already_seen 353)
-                        gc_pointed_to "eh_region_d"
-                        (!srcfileloc  "except.h" 183)
-                        (!fields 10 
-                         (!pair  "outer"
-                          (!type already_seen 353)
-                          (!srcfileloc  "except.h" 124)
-                          nil )
-                         (!pair  "inner"
-                          (!type already_seen 353)
-                          (!srcfileloc  "except.h" 127)
-                          nil )
-                         (!pair  "next_peer"
-                          (!type already_seen 353)
-                          (!srcfileloc  "except.h" 128)
-                          nil )
-                         (!pair  "index"
-                          (!type already_seen 9)
-                          (!srcfileloc  "except.h" 131)
-                          nil )
-                         (!pair  "type"
-                          (!type already_seen 9)
-                          (!srcfileloc  "except.h" 134)
-                          nil )
-                         (!pair  "u"
-                          (!type union 355 nil  gc_used "eh_region_u"
-                           (!srcfileloc  "except.h" 170)
-                           (!fields 3 
-                            (!pair  "eh_try"
-                             (!type struct 356 nil  gc_used "eh_region_u_try"
-                              (!srcfileloc  "except.h" 142)
-                              (!fields 2 
-                               (!pair  "first_catch"
-                                (!type pointer 357 nil  gc_used
-                                 (!type struct 358 
-                                  (!type already_seen 357)
-                                  gc_pointed_to "eh_catch_d"
-                                  (!srcfileloc  "except.h" 117)
-                                  (!fields 5 
-                                   (!pair  "next_catch"
-                                    (!type already_seen 357)
-                                    (!srcfileloc  "except.h" 101)
-                                    nil )
-                                   (!pair  "prev_catch"
-                                    (!type already_seen 357)
-                                    (!srcfileloc  "except.h" 102)
-                                    nil )
-                                   (!pair  "type_list"
-                                    (!type already_seen 5)
-                                    (!srcfileloc  "except.h" 106)
-                                    nil )
-                                   (!pair  "filter_list"
-                                    (!type already_seen 5)
-                                    (!srcfileloc  "except.h" 111)
-                                    nil )
-                                   (!pair  "label"
-                                    (!type already_seen 5)
-                                    (!srcfileloc  "except.h" 116)
-                                    nil )
-                                  )
-                                  nil 511 nil nil )
-                                )
-                                (!srcfileloc  "except.h" 140)
-                                nil )
-                               (!pair  "last_catch"
-                                (!type already_seen 357)
-                                (!srcfileloc  "except.h" 141)
-                                nil )
-                              )
-                              nil 511 nil nil )
-                             (!srcfileloc  "except.h" 142)
-                             (!options 
-                              (!option tag string  "ERT_TRY")
-                             )
-                            )
-                            (!pair  "allowed"
-                             (!type struct 359 nil  gc_used "eh_region_u_allowed"
-                              (!srcfileloc  "except.h" 156)
-                              (!fields 3 
-                               (!pair  "type_list"
-                                (!type already_seen 5)
-                                (!srcfileloc  "except.h" 146)
-                                nil )
-                               (!pair  "label"
-                                (!type already_seen 5)
-                                (!srcfileloc  "except.h" 150)
-                                nil )
-                               (!pair  "filter"
-                                (!type already_seen 9)
-                                (!srcfileloc  "except.h" 155)
-                                nil )
-                              )
-                              nil 511 nil nil )
-                             (!srcfileloc  "except.h" 156)
-                             (!options 
-                              (!option tag string  "ERT_ALLOWED_EXCEPTIONS")
-                             )
-                            )
-                            (!pair  "must_not_throw"
-                             (!type struct 360 nil  gc_used "eh_region_u_must_not_throw"
-                              (!srcfileloc  "except.h" 169)
-                              (!fields 2 
-                               (!pair  "failure_decl"
-                                (!type already_seen 5)
-                                (!srcfileloc  "except.h" 166)
-                                nil )
-                               (!pair  "failure_loc"
-                                (!type already_seen 9)
-                                (!srcfileloc  "except.h" 168)
-                                nil )
-                              )
-                              nil 511 nil nil )
-                             (!srcfileloc  "except.h" 169)
-                             (!options 
-                              (!option tag string  "ERT_MUST_NOT_THROW")
-                             )
-                            )
-                           )
-                           nil 511 nil )
-                          (!srcfileloc  "except.h" 170)
-                          (!options 
-                           (!option desc string  "%0.type")
-                          )
-                         )
-                         (!pair  "landing_pads"
-                          (!type pointer 361 nil  gc_used
-                           (!type struct 362 
-                            (!type already_seen 361)
-                            gc_pointed_to "eh_landing_pad_d"
-                            (!srcfileloc  "except.h" 94)
-                            (!fields 5 
-                             (!pair  "next_lp"
-                              (!type already_seen 361)
-                              (!srcfileloc  "except.h" 75)
-                              nil )
-                             (!pair  "region"
-                              (!type already_seen 353)
-                              (!srcfileloc  "except.h" 78)
-                              nil )
-                             (!pair  "post_landing_pad"
-                              (!type already_seen 5)
-                              (!srcfileloc  "except.h" 83)
-                              nil )
-                             (!pair  "landing_pad"
-                              (!type already_seen 136)
-                              (!srcfileloc  "except.h" 90)
-                              nil )
-                             (!pair  "index"
-                              (!type already_seen 9)
-                              (!srcfileloc  "except.h" 93)
-                              nil )
-                            )
-                            nil 511 nil nil )
-                          )
-                          (!srcfileloc  "except.h" 173)
-                          nil )
-                         (!pair  "exc_ptr_reg"
-                          (!type already_seen 136)
-                          (!srcfileloc  "except.h" 178)
-                          nil )
-                         (!pair  "filter_reg"
-                          (!type already_seen 136)
-                          (!srcfileloc  "except.h" 178)
-                          nil )
-                         (!pair  "use_cxa_end_cleanup"
-                          (!type already_seen 9)
-                          (!srcfileloc  "except.h" 182)
-                          nil )
-                        )
-                        nil 511 nil nil )
-                      )
-                      (!srcfileloc  "except.h" 197)
-                      nil )
-                     (!pair  "region_array"
-                      (!type pointer 363 nil  gc_used
-                       (!type user_struct 364 
-                        (!type already_seen 363)
-                        gc_pointed_to "vec<eh_region,va_gc>"
-                        (!srcfileloc  "except.h" 200)
-                        (!fields 2 
-                         (!pair  "va_gc"
-                          (!type already_seen 3)
-                          (!srcfileloc  "except.h" 200)
-                          nil )
-                         (!pair  "eh_region"
-                          (!type already_seen 353)
-                          (!srcfileloc  "except.h" 200)
-                          nil )
-                        )
-                       )
-                      )
-                      (!srcfileloc  "except.h" 200)
-                      nil )
-                     (!pair  "lp_array"
-                      (!type pointer 365 nil  gc_used
-                       (!type user_struct 366 
-                        (!type already_seen 365)
-                        gc_pointed_to "vec<eh_landing_pad,va_gc>"
-                        (!srcfileloc  "except.h" 203)
-                        (!fields 2 
-                         (!pair  "va_gc"
-                          (!type already_seen 3)
-                          (!srcfileloc  "except.h" 203)
-                          nil )
-                         (!pair  "eh_landing_pad"
-                          (!type already_seen 361)
-                          (!srcfileloc  "except.h" 203)
-                          nil )
-                        )
-                       )
-                      )
-                      (!srcfileloc  "except.h" 203)
-                      nil )
-                     (!pair  "throw_stmt_table"
-                      (!type pointer 367 nil  gc_used
-                       (!type param_struct 368 
-                        (!type already_seen 367)
-                        gc_pointed_to
-                        (!type already_seen 49)
-                        
-                        (!type pointer 369 nil  gc_used
-                         (!type struct 370 
-                          (!type already_seen 369)
-                          gc_pointed_to "throw_stmt_node"
-                          (!srcfileloc  "except.h" 292)
-                          (!fields 2 
-                           (!pair  "stmt"
-                            (!type already_seen 310)
-                            (!srcfileloc  "except.h" 290)
-                            nil )
-                           (!pair  "lp_nr"
-                            (!type already_seen 9)
-                            (!srcfileloc  "except.h" 291)
-                            nil )
-                          )
-                          nil 511 nil nil )
-                        )
-                        nil nil nil nil nil nil nil nil nil nil )
-                      )
-                      (!srcfileloc  "except.h" 207)
-                      (!options 
-                       (!option param_is type 
-                        (!type already_seen 370)
-                       )
-                      )
-                     )
-                     (!pair  "ttype_data"
-                      (!type already_seen 45)
-                      (!srcfileloc  "except.h" 211)
-                      nil )
-                     (!pair  "ehspec_data"
-                      (!type union 371 nil  gc_used "eh_status_u"
-                       (!srcfileloc  "except.h" 220)
-                       (!fields 2 
-                        (!pair  "arm_eabi"
-                         (!type already_seen 45)
-                         (!srcfileloc  "except.h" 218)
-                         (!options 
-                          (!option tag string  "1")
-                         )
-                        )
-                        (!pair  "other"
-                         (!type pointer 372 nil  gc_used
-                          (!type user_struct 373 
-                           (!type already_seen 372)
-                           gc_pointed_to "vec<uchar,va_gc>"
-                           (!srcfileloc  "function.h" 152)
-                           (!fields 2 
-                            (!pair  "va_gc"
-                             (!type already_seen 3)
-                             (!srcfileloc  "function.h" 152)
-                             nil )
-                            (!pair  "uchar"
-                             (!type already_seen 28)
-                             (!srcfileloc  "function.h" 152)
-                             nil )
-                           )
-                          )
-                         )
-                         (!srcfileloc  "except.h" 219)
-                         (!options 
-                          (!option tag string  "0")
-                         )
-                        )
-                       )
-                       nil 511 nil )
-                      (!srcfileloc  "except.h" 220)
-                      (!options 
-                       (!option desc string  "targetm.arm_eabi_unwinder")
-                      )
-                     )
-                    )
-                    nil 511 nil nil )
-                  )
-                  (!srcfileloc  "function.h" 518)
-                  nil )
-                 (!pair  "cfg"
-                  (!type pointer 374 nil  gc_used
-                   (!type struct 375 
-                    (!type already_seen 374)
-                    gc_pointed_to "control_flow_graph"
-                    (!srcfileloc  "basic-block.h" 311)
-                    (!fields 12 
-                     (!pair  "x_entry_block_ptr"
-                      (!type already_seen 297)
-                      (!srcfileloc  "basic-block.h" 278)
-                      nil )
-                     (!pair  "x_exit_block_ptr"
-                      (!type already_seen 297)
-                      (!srcfileloc  "basic-block.h" 279)
-                      nil )
-                     (!pair  "x_basic_block_info"
-                      (!type pointer 376 nil  gc_used
-                       (!type user_struct 377 
-                        (!type already_seen 376)
-                        gc_pointed_to "vec<basic_block,va_gc>"
-                        (!srcfileloc  "basic-block.h" 282)
-                        (!fields 2 
-                         (!pair  "va_gc"
-                          (!type already_seen 3)
-                          (!srcfileloc  "basic-block.h" 282)
-                          nil )
-                         (!pair  "basic_block"
-                          (!type already_seen 297)
-                          (!srcfileloc  "basic-block.h" 282)
-                          nil )
-                        )
-                       )
-                      )
-                      (!srcfileloc  "basic-block.h" 282)
-                      nil )
-                     (!pair  "x_n_basic_blocks"
-                      (!type already_seen 9)
-                      (!srcfileloc  "basic-block.h" 285)
-                      nil )
-                     (!pair  "x_n_edges"
-                      (!type already_seen 9)
-                      (!srcfileloc  "basic-block.h" 288)
-                      nil )
-                     (!pair  "x_last_basic_block"
-                      (!type already_seen 9)
-                      (!srcfileloc  "basic-block.h" 291)
-                      nil )
-                     (!pair  "last_label_uid"
-                      (!type already_seen 9)
-                      (!srcfileloc  "basic-block.h" 294)
-                      nil )
-                     (!pair  "x_label_to_block_map"
-                      (!type already_seen 376)
-                      (!srcfileloc  "basic-block.h" 298)
-                      nil )
-                     (!pair  "x_profile_status"
-                      (!type already_seen 9)
-                      (!srcfileloc  "basic-block.h" 300)
-                      nil )
-                     (!pair  "x_dom_computed"
-                      (!type array 378 nil  gc_used "2" 
-                       (!type already_seen 9)
-                      )
-                      (!srcfileloc  "basic-block.h" 303)
-                      nil )
-                     (!pair  "x_n_bbs_in_dom_tree"
-                      (!type array 379 nil  gc_used "2" 
-                       (!type already_seen 9)
-                      )
-                      (!srcfileloc  "basic-block.h" 306)
-                      nil )
-                     (!pair  "max_jumptable_ents"
-                      (!type already_seen 9)
-                      (!srcfileloc  "basic-block.h" 310)
-                      nil )
-                    )
-                    nil 511 nil nil )
-                  )
-                  (!srcfileloc  "function.h" 521)
-                  nil )
-                 (!pair  "gimple_body"
-                  (!type already_seen 310)
-                  (!srcfileloc  "function.h" 524)
-                  nil )
-                 (!pair  "gimple_df"
-                  (!type pointer 380 nil  gc_used
-                   (!type struct 381 
-                    (!type already_seen 380)
-                    gc_pointed_to "gimple_df"
-                    (!srcfileloc  "gimple-ssa.h" 84)
-                    (!fields 13 
-                     (!pair  "modified_noreturn_calls"
-                      (!type pointer 382 nil  gc_used
-                       (!type user_struct 383 
-                        (!type already_seen 382)
-                        gc_pointed_to "vec<gimple,va_gc>"
-                        (!srcfileloc  "gimple-ssa.h" 43)
-                        (!fields 2 
-                         (!pair  "va_gc"
-                          (!type already_seen 3)
-                          (!srcfileloc  "gimple-ssa.h" 43)
-                          nil )
-                         (!pair  "gimple"
-                          (!type already_seen 310)
-                          (!srcfileloc  "gimple-ssa.h" 43)
-                          nil )
-                        )
-                       )
-                      )
-                      (!srcfileloc  "gimple-ssa.h" 43)
-                      nil )
-                     (!pair  "ssa_names"
-                      (!type already_seen 45)
-                      (!srcfileloc  "gimple-ssa.h" 46)
-                      nil )
-                     (!pair  "vop"
-                      (!type already_seen 5)
-                      (!srcfileloc  "gimple-ssa.h" 49)
-                      nil )
-                     (!pair  "escaped"
-                      (!type struct 384 nil  gc_used "pt_solution"
-                       (!srcfileloc  "tree-ssa-alias.h" 61)
-                       (!fields 9 
-                        (!pair  "anything"
-                         (!type already_seen 9)
-                         (!srcfileloc  "tree-ssa-alias.h" 32)
-                         nil )
-                        (!pair  "nonlocal"
-                         (!type already_seen 9)
-                         (!srcfileloc  "tree-ssa-alias.h" 36)
-                         nil )
-                        (!pair  "escaped"
-                         (!type already_seen 9)
-                         (!srcfileloc  "tree-ssa-alias.h" 40)
-                         nil )
-                        (!pair  "ipa_escaped"
-                         (!type already_seen 9)
-                         (!srcfileloc  "tree-ssa-alias.h" 44)
-                         nil )
-                        (!pair  "null"
-                         (!type already_seen 9)
-                         (!srcfileloc  "tree-ssa-alias.h" 48)
-                         nil )
-                        (!pair  "vars_contains_nonlocal"
-                         (!type already_seen 9)
-                         (!srcfileloc  "tree-ssa-alias.h" 52)
-                         nil )
-                        (!pair  "vars_contains_escaped"
-                         (!type already_seen 9)
-                         (!srcfileloc  "tree-ssa-alias.h" 54)
-                         nil )
-                        (!pair  "vars_contains_escaped_heap"
-                         (!type already_seen 9)
-                         (!srcfileloc  "tree-ssa-alias.h" 57)
-                         nil )
-                        (!pair  "vars"
-                         (!type already_seen 120)
-                         (!srcfileloc  "tree-ssa-alias.h" 60)
-                         nil )
-                       )
-                       nil 511 nil nil )
-                      (!srcfileloc  "gimple-ssa.h" 52)
-                      nil )
-                     (!pair  "decls_to_pointers"
-                      (!type pointer 385 nil  gc_used
-                       (!type struct 386 
-                        (!type already_seen 385)
-                        gc_pointed_to "pointer_map_t"
-                        (!srcfileloc  "lto-streamer.h" 569)
-                        (!fields 0 )
-                        nil 511 nil nil )
-                      )
-                      (!srcfileloc  "gimple-ssa.h" 56)
-                      (!options 
-                       (!option skip string  "")
-                      )
-                     )
-                     (!pair  "free_ssanames"
-                      (!type already_seen 45)
-                      (!srcfileloc  "gimple-ssa.h" 59)
-                      nil )
-                     (!pair  "default_defs"
-                      (!type already_seen 53)
-                      (!srcfileloc  "gimple-ssa.h" 65)
-                      (!options 
-                       (!option param_is type 
-                        (!type already_seen 7)
-                       )
-                      )
-                     )
-                     (!pair  "ssa_renaming_needed"
-                      (!type already_seen 9)
-                      (!srcfileloc  "gimple-ssa.h" 68)
-                      nil )
-                     (!pair  "rename_vops"
-                      (!type already_seen 9)
-                      (!srcfileloc  "gimple-ssa.h" 71)
-                      nil )
-                     (!pair  "in_ssa_p"
-                      (!type already_seen 9)
-                      (!srcfileloc  "gimple-ssa.h" 74)
-                      nil )
-                     (!pair  "ipa_pta"
-                      (!type already_seen 9)
-                      (!srcfileloc  "gimple-ssa.h" 77)
-                      nil )
-                     (!pair  "ssa_operands"
-                      (!type struct 387 nil  gc_used "ssa_operands"
-                       (!srcfileloc  "tree-ssa-operands.h" 63)
-                       (!fields 5 
-                        (!pair  "operand_memory"
-                         (!type pointer 388 nil  gc_used
-                          (!type struct 389 
-                           (!type already_seen 388)
-                           gc_pointed_to "ssa_operand_memory_d"
-                           (!srcfileloc  "tree-ssa-operands.h" 51)
-                           (!fields 2 
-                            (!pair  "next"
-                             (!type already_seen 388)
-                             (!srcfileloc  "tree-ssa-operands.h" 49)
-                             nil )
-                            (!pair  "mem"
-                             (!type array 390 nil  gc_used "1" 
-                              (!type already_seen 28)
-                             )
-                             (!srcfileloc  "tree-ssa-operands.h" 50)
-                             nil )
-                           )
-                           (!options 
-                            (!option variable_size string  "")
-                            (!option chain_next string  "%h.next")
-                           )
-                           511 nil nil )
-                         )
-                         (!srcfileloc  "tree-ssa-operands.h" 55)
-                         nil )
-                        (!pair  "operand_memory_index"
-                         (!type already_seen 9)
-                         (!srcfileloc  "tree-ssa-operands.h" 56)
-                         nil )
-                        (!pair  "ssa_operand_mem_size"
-                         (!type already_seen 9)
-                         (!srcfileloc  "tree-ssa-operands.h" 58)
-                         nil )
-                        (!pair  "ops_active"
-                         (!type already_seen 9)
-                         (!srcfileloc  "tree-ssa-operands.h" 60)
-                         nil )
-                        (!pair  "free_uses"
-                         (!type pointer 391 nil  gc_unused
-                          (!type struct 392 
-                           (!type already_seen 391)
-                           gc_unused "use_optype_d"nil 
-                           (!fields 0 )
-                           nil 0 nil nil )
-                         )
-                         (!srcfileloc  "tree-ssa-operands.h" 62)
-                         (!options 
-                          (!option skip string  "")
-                         )
-                        )
-                       )
-                       nil 511 nil nil )
-                      (!srcfileloc  "gimple-ssa.h" 79)
-                      nil )
-                     (!pair  "tm_restart"
-                      (!type pointer 393 nil  gc_used
-                       (!type param_struct 394 
-                        (!type already_seen 393)
-                        gc_pointed_to
-                        (!type already_seen 49)
-                        
-                        (!type pointer 395 nil  gc_used
-                         (!type struct 396 
-                          (!type already_seen 395)
-                          gc_pointed_to "tm_restart_node"
-                          (!srcfileloc  "gimple-ssa.h" 32)
-                          (!fields 2 
-                           (!pair  "stmt"
-                            (!type already_seen 310)
-                            (!srcfileloc  "gimple-ssa.h" 30)
-                            nil )
-                           (!pair  "label_or_list"
-                            (!type already_seen 5)
-                            (!srcfileloc  "gimple-ssa.h" 31)
-                            nil )
-                          )
-                          nil 511 nil nil )
-                        )
-                        nil nil nil nil nil nil nil nil nil nil )
-                      )
-                      (!srcfileloc  "gimple-ssa.h" 83)
-                      (!options 
-                       (!option param_is type 
-                        (!type already_seen 396)
-                       )
-                      )
-                     )
-                    )
-                    nil 511 nil nil )
-                  )
-                  (!srcfileloc  "function.h" 527)
-                  nil )
-                 (!pair  "x_current_loops"
-                  (!type pointer 397 nil  gc_used
-                   (!type struct 398 
-                    (!type already_seen 397)
-                    gc_pointed_to "loops"
-                    (!srcfileloc  "cfgloop.h" 229)
-                    (!fields 4 
-                     (!pair  "state"
-                      (!type already_seen 9)
-                      (!srcfileloc  "cfgloop.h" 217)
-                      nil )
-                     (!pair  "larray"
-                      (!type already_seen 306)
-                      (!srcfileloc  "cfgloop.h" 220)
-                      nil )
-                     (!pair  "exits"
-                      (!type pointer 399 nil  gc_used
-                       (!type param_struct 400 
-                        (!type already_seen 399)
-                        gc_pointed_to
-                        (!type already_seen 49)
-                        
-                        (!type already_seen 312)
-                        nil nil nil nil nil nil nil nil nil nil )
-                      )
-                      (!srcfileloc  "cfgloop.h" 225)
-                      (!options 
-                       (!option param_is type 
-                        (!type already_seen 313)
-                       )
-                      )
-                     )
-                     (!pair  "tree_root"
-                      (!type already_seen 303)
-                      (!srcfileloc  "cfgloop.h" 228)
-                      nil )
-                    )
-                    nil 511 nil nil )
-                  )
-                  (!srcfileloc  "function.h" 530)
-                  nil )
-                 (!pair  "su"
-                  (!type pointer 401 nil  gc_used
-                   (!type struct 402 
-                    (!type already_seen 401)
-                    gc_pointed_to "stack_usage"
-                    (!srcfileloc  "function.h" 503)
-                    (!fields 4 
-                     (!pair  "static_stack_size"
-                      (!type already_seen 9)
-                      (!srcfileloc  "function.h" 490)
-                      nil )
-                     (!pair  "dynamic_stack_size"
-                      (!type already_seen 9)
-                      (!srcfileloc  "function.h" 494)
-                      nil )
-                     (!pair  "pushed_stack_size"
-                      (!type already_seen 9)
-                      (!srcfileloc  "function.h" 498)
-                      nil )
-                     (!pair  "has_unbounded_dynamic_stack_size"
-                      (!type already_seen 9)
-                      (!srcfileloc  "function.h" 502)
-                      nil )
-                    )
-                    nil 511 nil nil )
-                  )
-                  (!srcfileloc  "function.h" 533)
-                  nil )
-                 (!pair  "value_histograms"
-                  (!type already_seen 50)
-                  (!srcfileloc  "function.h" 536)
-                  (!options 
-                   (!option skip string  "")
-                  )
-                 )
-                 (!pair  "decl"
-                  (!type already_seen 5)
-                  (!srcfileloc  "function.h" 541)
-                  nil )
-                 (!pair  "static_chain_decl"
-                  (!type already_seen 5)
-                  (!srcfileloc  "function.h" 545)
-                  nil )
-                 (!pair  "nonlocal_goto_save_area"
-                  (!type already_seen 5)
-                  (!srcfileloc  "function.h" 550)
-                  nil )
-                 (!pair  "local_decls"
-                  (!type already_seen 45)
-                  (!srcfileloc  "function.h" 553)
-                  nil )
-                 (!pair  "cilk_frame_decl"
-                  (!type already_seen 5)
-                  (!srcfileloc  "function.h" 556)
-                  nil )
-                 (!pair  "machine"
-                  (!type pointer 403 nil  gc_unused
-                   (!type struct 404 
-                    (!type already_seen 403)
-                    gc_maybe_pointed_to "machine_function"
-                    (!srcfileloc  "config/arm/arm.h" 1551)
-                    (!fields 15 
-                     (!pair  "eh_epilogue_sp_ofs"
-                      (!type already_seen 136)
-                      (!srcfileloc  "config/arm/arm.h" 1519)
-                      nil )
-                     (!pair  "far_jump_used"
-                      (!type already_seen 9)
-                      (!srcfileloc  "config/arm/arm.h" 1521)
-                      nil )
-                     (!pair  "arg_pointer_live"
-                      (!type already_seen 9)
-                      (!srcfileloc  "config/arm/arm.h" 1523)
-                      nil )
-                     (!pair  "lr_save_eliminated"
-                      (!type already_seen 9)
-                      (!srcfileloc  "config/arm/arm.h" 1525)
-                      nil )
-                     (!pair  "stack_offsets"
-                      (!type struct 405 nil  gc_used "arm_stack_offsets"
-                       (!srcfileloc  "config/arm/arm.h" 1510)
-                       (!fields 7 
-                        (!pair  "saved_args"
-                         (!type already_seen 9)
-                         (!srcfileloc  "config/arm/arm.h" 1503)
-                         nil )
-                        (!pair  "frame"
-                         (!type already_seen 9)
-                         (!srcfileloc  "config/arm/arm.h" 1504)
-                         nil )
-                        (!pair  "saved_regs"
-                         (!type already_seen 9)
-                         (!srcfileloc  "config/arm/arm.h" 1505)
-                         nil )
-                        (!pair  "soft_frame"
-                         (!type already_seen 9)
-                         (!srcfileloc  "config/arm/arm.h" 1506)
-                         nil )
-                        (!pair  "locals_base"
-                         (!type already_seen 9)
-                         (!srcfileloc  "config/arm/arm.h" 1507)
-                         nil )
-                        (!pair  "outgoing_args"
-                         (!type already_seen 9)
-                         (!srcfileloc  "config/arm/arm.h" 1508)
-                         nil )
-                        (!pair  "saved_regs_mask"
-                         (!type already_seen 9)
-                         (!srcfileloc  "config/arm/arm.h" 1509)
-                         nil )
-                       )
-                       nil 511 nil nil )
-                      (!srcfileloc  "config/arm/arm.h" 1527)
-                      nil )
-                     (!pair  "func_type"
-                      (!type already_seen 9)
-                      (!srcfileloc  "config/arm/arm.h" 1529)
-                      nil )
-                     (!pair  "uses_anonymous_args"
-                      (!type already_seen 9)
-                      (!srcfileloc  "config/arm/arm.h" 1531)
-                      nil )
-                     (!pair  "sibcall_blocked"
-                      (!type already_seen 9)
-                      (!srcfileloc  "config/arm/arm.h" 1534)
-                      nil )
-                     (!pair  "pic_reg"
-                      (!type already_seen 136)
-                      (!srcfileloc  "config/arm/arm.h" 1536)
-                      nil )
-                     (!pair  "call_via"
-                      (!type array 406 nil  gc_used "14" 
-                       (!type already_seen 136)
-                      )
-                      (!srcfileloc  "config/arm/arm.h" 1540)
-                      nil )
-                     (!pair  "return_used_this_function"
-                      (!type already_seen 9)
-                      (!srcfileloc  "config/arm/arm.h" 1543)
-                      nil )
-                     (!pair  "thumb1_cc_insn"
-                      (!type already_seen 136)
-                      (!srcfileloc  "config/arm/arm.h" 1546)
-                      nil )
-                     (!pair  "thumb1_cc_op0"
-                      (!type already_seen 136)
-                      (!srcfileloc  "config/arm/arm.h" 1547)
-                      nil )
-                     (!pair  "thumb1_cc_op1"
-                      (!type already_seen 136)
-                      (!srcfileloc  "config/arm/arm.h" 1548)
-                      nil )
-                     (!pair  "thumb1_cc_mode"
-                      (!type already_seen 9)
-                      (!srcfileloc  "config/arm/arm.h" 1550)
-                      nil )
-                    )
-                    nil 511 nil nil )
-                  )
-                  (!srcfileloc  "function.h" 561)
-                  (!options 
-                   (!option maybe_undef string  "")
-                  )
-                 )
-                 (!pair  "language"
-                  (!type already_seen 74)
-                  (!srcfileloc  "function.h" 564)
-                  nil )
-                 (!pair  "used_types_hash"
-                  (!type already_seen 53)
-                  (!srcfileloc  "function.h" 567)
-                  (!options 
-                   (!option param_is type 
-                    (!type already_seen 7)
-                   )
-                  )
-                 )
-                 (!pair  "fde"
-                  (!type pointer 407 nil  gc_used
-                   (!type struct 408 
-                    (!type already_seen 407)
-                    gc_pointed_to "dw_fde_node"
-                    (!srcfileloc  "dwarf2out.h" 106)
-                    (!fields 22 
-                     (!pair  "decl"
-                      (!type already_seen 5)
-                      (!srcfileloc  "dwarf2out.h" 74)
-                      nil )
-                     (!pair  "dw_fde_begin"
-                      (!type already_seen 36)
-                      (!srcfileloc  "dwarf2out.h" 75)
-                      nil )
-                     (!pair  "dw_fde_current_label"
-                      (!type already_seen 36)
-                      (!srcfileloc  "dwarf2out.h" 76)
-                      nil )
-                     (!pair  "dw_fde_end"
-                      (!type already_seen 36)
-                      (!srcfileloc  "dwarf2out.h" 77)
-                      nil )
-                     (!pair  "dw_fde_vms_end_prologue"
-                      (!type already_seen 36)
-                      (!srcfileloc  "dwarf2out.h" 78)
-                      nil )
-                     (!pair  "dw_fde_vms_begin_epilogue"
-                      (!type already_seen 36)
-                      (!srcfileloc  "dwarf2out.h" 79)
-                      nil )
-                     (!pair  "dw_fde_second_begin"
-                      (!type already_seen 36)
-                      (!srcfileloc  "dwarf2out.h" 80)
-                      nil )
-                     (!pair  "dw_fde_second_end"
-                      (!type already_seen 36)
-                      (!srcfileloc  "dwarf2out.h" 81)
-                      nil )
-                     (!pair  "dw_fde_cfi"
-                      (!type pointer 409 nil  gc_used
-                       (!type user_struct 410 
-                        (!type already_seen 409)
-                        gc_pointed_to "vec<dw_cfi_ref,va_gc>"
-                        (!srcfileloc  "dwarf2out.h" 63)
-                        (!fields 2 
-                         (!pair  "va_gc"
-                          (!type already_seen 3)
-                          (!srcfileloc  "dwarf2out.h" 63)
-                          nil )
-                         (!pair  "dw_cfi_ref"
-                          (!type pointer 411 nil  gc_used
-                           (!type struct 412 
-                            (!type already_seen 411)
-                            gc_pointed_to "dw_cfi_node"
-                            (!srcfileloc  "dwarf2out.h" 60)
-                            (!fields 3 
-                             (!pair  "dw_cfi_opc"
-                              (!type already_seen 9)
-                              (!srcfileloc  "dwarf2out.h" 55)
-                              nil )
-                             (!pair  "dw_cfi_oprnd1"
-                              (!type union 413 nil  gc_used "anonymous:../../gcc/dwarf2out.h:47"
-                               (!srcfileloc  "dwarf2out.h" 52)
-                               (!fields 4 
-                                (!pair  "dw_cfi_reg_num"
-                                 (!type already_seen 9)
-                                 (!srcfileloc  "dwarf2out.h" 48)
-                                 (!options 
-                                  (!option tag string  "dw_cfi_oprnd_reg_num")
-                                 )
-                                )
-                                (!pair  "dw_cfi_offset"
-                                 (!type already_seen 9)
-                                 (!srcfileloc  "dwarf2out.h" 49)
-                                 (!options 
-                                  (!option tag string  "dw_cfi_oprnd_offset")
-                                 )
-                                )
-                                (!pair  "dw_cfi_addr"
-                                 (!type already_seen 36)
-                                 (!srcfileloc  "dwarf2out.h" 50)
-                                 (!options 
-                                  (!option tag string  "dw_cfi_oprnd_addr")
-                                 )
-                                )
-                                (!pair  "dw_cfi_loc"
-                                 (!type pointer 414 nil  gc_used
-                                  (!type struct 415 
-                                   (!type already_seen 414)
-                                   gc_pointed_to "dw_loc_descr_node"
-                                   (!srcfileloc  "dwarf2out.h" 213)
-                                   (!fields 6 
-                                    (!pair  "dw_loc_next"
-                                     (!type already_seen 414)
-                                     (!srcfileloc  "dwarf2out.h" 205)
-                                     nil )
-                                    (!pair  "dw_loc_opc"
-                                     (!type already_seen 9)
-                                     (!srcfileloc  "dwarf2out.h" 206)
-                                     nil )
-                                    (!pair  "dtprel"
-                                     (!type already_seen 9)
-                                     (!srcfileloc  "dwarf2out.h" 209)
-                                     nil )
-                                    (!pair  "dw_loc_addr"
-                                     (!type already_seen 9)
-                                     (!srcfileloc  "dwarf2out.h" 210)
-                                     nil )
-                                    (!pair  "dw_loc_oprnd1"
-                                     (!type struct 416 
-                                      (!type pointer 417 nil  gc_unused
-                                       (!type already_seen 416)
-                                      )
-                                      gc_used "dw_val_node"
-                                      (!srcfileloc  "dwarf2out.h" 211)
-                                      (!fields 3 
-                                       (!pair  "val_class"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "dwarf2out.h" 168)
-                                        nil )
-                                       (!pair  "val_entry"
-                                        (!type pointer 418 nil  gc_used
-                                         (!type struct 419 
-                                          (!type already_seen 418)
-                                          gc_pointed_to "addr_table_entry_struct"
-                                          (!srcfileloc  "dwarf2out.c" 1258)
-                                          (!fields 4 
-                                           (!pair  "kind"
-                                            (!type already_seen 9)
-                                            (!srcfileloc  "dwarf2out.c" 1249)
-                                            nil )
-                                           (!pair  "refcount"
-                                            (!type already_seen 9)
-                                            (!srcfileloc  "dwarf2out.c" 1250)
-                                            nil )
-                                           (!pair  "index"
-                                            (!type already_seen 9)
-                                            (!srcfileloc  "dwarf2out.c" 1251)
-                                            nil )
-                                           (!pair  "addr"
-                                            (!type union 420 nil  gc_used "addr_table_entry_struct_union"
-                                             (!srcfileloc  "dwarf2out.c" 1256)
-                                             (!fields 2 
-                                              (!pair  "rtl"
-                                               (!type already_seen 136)
-                                               (!srcfileloc  "dwarf2out.c" 1254)
-                                               (!options 
-                                                (!option tag string  "0")
-                                               )
-                                              )
-                                              (!pair  "label"
-                                               (!type already_seen 36)
-                                               (!srcfileloc  "dwarf2out.c" 1255)
-                                               (!options 
-                                                (!option tag string  "1")
-                                               )
-                                              )
-                                             )
-                                             nil 511 nil )
-                                            (!srcfileloc  "dwarf2out.c" 1257)
-                                            (!options 
-                                             (!option desc string  "%1.kind")
-                                            )
-                                           )
-                                          )
-                                          nil 511 nil nil )
-                                        )
-                                        (!srcfileloc  "dwarf2out.h" 169)
-                                        nil )
-                                       (!pair  "v"
-                                        (!type union 421 nil  gc_used "dw_val_struct_union"
-                                         (!srcfileloc  "dwarf2out.h" 197)
-                                         (!fields 17 
-                                          (!pair  "val_addr"
-                                           (!type already_seen 136)
-                                           (!srcfileloc  "dwarf2out.h" 172)
-                                           (!options 
-                                            (!option tag string  "dw_val_class_addr")
-                                           )
-                                          )
-                                          (!pair  "val_offset"
-                                           (!type already_seen 9)
-                                           (!srcfileloc  "dwarf2out.h" 173)
-                                           (!options 
-                                            (!option tag string  "dw_val_class_offset")
-                                           )
-                                          )
-                                          (!pair  "val_loc_list"
-                                           (!type pointer 422 nil  gc_used
-                                            (!type struct 423 
-                                             (!type already_seen 422)
-                                             gc_pointed_to "dw_loc_list_struct"
-                                             (!srcfileloc  "dwarf2out.c" 1283)
-                                             (!fields 12 
-                                              (!pair  "dw_loc_next"
-                                               (!type already_seen 422)
-                                               (!srcfileloc  "dwarf2out.c" 1265)
-                                               nil )
-                                              (!pair  "begin"
-                                               (!type already_seen 36)
-                                               (!srcfileloc  "dwarf2out.c" 1266)
-                                               nil )
-                                              (!pair  "begin_entry"
-                                               (!type already_seen 418)
-                                               (!srcfileloc  "dwarf2out.c" 1267)
-                                               nil )
-                                              (!pair  "end"
-                                               (!type already_seen 36)
-                                               (!srcfileloc  "dwarf2out.c" 1268)
-                                               nil )
-                                              (!pair  "ll_symbol"
-                                               (!type already_seen 36)
-                                               (!srcfileloc  "dwarf2out.c" 1269)
-                                               nil )
-                                              (!pair  "section"
-                                               (!type already_seen 36)
-                                               (!srcfileloc  "dwarf2out.c" 1271)
-                                               nil )
-                                              (!pair  "expr"
-                                               (!type already_seen 414)
-                                               (!srcfileloc  "dwarf2out.c" 1272)
-                                               nil )
-                                              (!pair  "hash"
-                                               (!type already_seen 9)
-                                               (!srcfileloc  "dwarf2out.c" 1273)
-                                               nil )
-                                              (!pair  "resolved_addr"
-                                               (!type already_seen 9)
-                                               (!srcfileloc  "dwarf2out.c" 1276)
-                                               nil )
-                                              (!pair  "replaced"
-                                               (!type already_seen 9)
-                                               (!srcfileloc  "dwarf2out.c" 1278)
-                                               nil )
-                                              (!pair  "emitted"
-                                               (!type already_seen 9)
-                                               (!srcfileloc  "dwarf2out.c" 1279)
-                                               nil )
-                                              (!pair  "force"
-                                               (!type already_seen 9)
-                                               (!srcfileloc  "dwarf2out.c" 1282)
-                                               nil )
-                                             )
-                                             nil 511 nil nil )
-                                           )
-                                           (!srcfileloc  "dwarf2out.h" 174)
-                                           (!options 
-                                            (!option tag string  "dw_val_class_loc_list")
-                                           )
-                                          )
-                                          (!pair  "val_loc"
-                                           (!type already_seen 414)
-                                           (!srcfileloc  "dwarf2out.h" 175)
-                                           (!options 
-                                            (!option tag string  "dw_val_class_loc")
-                                           )
-                                          )
-                                          (!pair  "val_int"
-                                           (!type already_seen 9)
-                                           (!srcfileloc  "dwarf2out.h" 176)
-                                           (!options 
-                                            (!option default string  "")
-                                           )
-                                          )
-                                          (!pair  "val_unsigned"
-                                           (!type already_seen 9)
-                                           (!srcfileloc  "dwarf2out.h" 177)
-                                           (!options 
-                                            (!option tag string  "dw_val_class_unsigned_const")
-                                           )
-                                          )
-                                          (!pair  "val_double"
-                                           (!type already_seen 9)
-                                           (!srcfileloc  "dwarf2out.h" 178)
-                                           (!options 
-                                            (!option tag string  "dw_val_class_const_double")
-                                           )
-                                          )
-                                          (!pair  "val_vec"
-                                           (!type struct 424 nil  gc_used "dw_vec_const"
-                                            (!srcfileloc  "dwarf2out.h" 179)
-                                            (!fields 3 
-                                             (!pair  "array"
-                                              (!type already_seen 36)
-                                              (!srcfileloc  "dwarf2out.h" 157)
-                                              (!options 
-                                               (!option atomic string  "")
-                                              )
-                                             )
-                                             (!pair  "length"
-                                              (!type already_seen 9)
-                                              (!srcfileloc  "dwarf2out.h" 158)
-                                              nil )
-                                             (!pair  "elt_size"
-                                              (!type already_seen 9)
-                                              (!srcfileloc  "dwarf2out.h" 159)
-                                              nil )
-                                            )
-                                            nil 511 nil nil )
-                                           (!srcfileloc  "dwarf2out.h" 179)
-                                           (!options 
-                                            (!option tag string  "dw_val_class_vec")
-                                           )
-                                          )
-                                          (!pair  "val_die_ref"
-                                           (!type struct 425 nil  gc_used "dw_val_die_union"
-                                            (!srcfileloc  "dwarf2out.h" 184)
-                                            (!fields 2 
-                                             (!pair  "die"
-                                              (!type pointer 426 
-                                               (!type pointer 427 nil  gc_used
-                                                (!type already_seen 426)
-                                               )
-                                               gc_pointed_to
-                                               (!type struct 428 
-                                                (!type already_seen 426)
-                                                gc_pointed_to "die_struct"
-                                                (!srcfileloc  "dwarf2out.c" 2564)
-                                                (!fields 13 
-                                                 (!pair  "die_id"
-                                                  (!type union 429 nil  gc_used "die_symbol_or_type_node"
-                                                   (!srcfileloc  "dwarf2out.c" 2548)
-                                                   (!fields 2 
-                                                    (!pair  "die_symbol"
-                                                     (!type already_seen 36)
-                                                     (!srcfileloc  "dwarf2out.c" 2546)
-                                                     (!options 
-                                                      (!option tag string  "0")
-                                                     )
-                                                    )
-                                                    (!pair  "die_type_node"
-                                                     (!type pointer 430 nil  gc_used
-                                                      (!type struct 431 
-                                                       (!type already_seen 430)
-                                                       gc_pointed_to "comdat_type_struct"
-                                                       (!srcfileloc  "dwarf2out.c" 2614)
-                                                       (!fields 5 
-                                                        (!pair  "root_die"
-                                                         (!type already_seen 426)
-                                                         (!srcfileloc  "dwarf2out.c" 2609)
-                                                         nil )
-                                                        (!pair  "type_die"
-                                                         (!type already_seen 426)
-                                                         (!srcfileloc  "dwarf2out.c" 2610)
-                                                         nil )
-                                                        (!pair  "skeleton_die"
-                                                         (!type already_seen 426)
-                                                         (!srcfileloc  "dwarf2out.c" 2611)
-                                                         nil )
-                                                        (!pair  "signature"
-                                                         (!type array 432 nil  gc_used "DWARF_TYPE_SIGNATURE_SIZE" 
-                                                          (!type already_seen 28)
-                                                         )
-                                                         (!srcfileloc  "dwarf2out.c" 2612)
-                                                         nil )
-                                                        (!pair  "next"
-                                                         (!type already_seen 430)
-                                                         (!srcfileloc  "dwarf2out.c" 2613)
-                                                         nil )
-                                                       )
-                                                       nil 511 nil nil )
-                                                     )
-                                                     (!srcfileloc  "dwarf2out.c" 2547)
-                                                     (!options 
-                                                      (!option tag string  "1")
-                                                     )
-                                                    )
-                                                   )
-                                                   nil 511 nil )
-                                                  (!srcfileloc  "dwarf2out.c" 2549)
-                                                  (!options 
-                                                   (!option desc string  "%0.comdat_type_p")
-                                                  )
-                                                 )
-                                                 (!pair  "die_attr"
-                                                  (!type pointer 433 nil  gc_used
-                                                   (!type user_struct 434 
-                                                    (!type already_seen 433)
-                                                    gc_pointed_to "vec<dw_attr_node,va_gc>"
-                                                    (!srcfileloc  "dwarf2out.c" 2550)
-                                                    (!fields 2 
-                                                     (!pair  "va_gc"
-                                                      (!type already_seen 3)
-                                                      (!srcfileloc  "dwarf2out.c" 2550)
-                                                      nil )
-                                                     (!pair  "dw_attr_node"
-                                                      (!type struct 435 
-                                                       (!type pointer 436 nil  gc_unused
-                                                        (!type already_seen 435)
-                                                       )
-                                                       gc_used "dw_attr_struct"
-                                                       (!srcfileloc  "dwarf2out.c" 2535)
-                                                       (!fields 2 
-                                                        (!pair  "dw_attr"
-                                                         (!type already_seen 9)
-                                                         (!srcfileloc  "dwarf2out.c" 2533)
-                                                         nil )
-                                                        (!pair  "dw_attr_val"
-                                                         (!type already_seen 416)
-                                                         (!srcfileloc  "dwarf2out.c" 2534)
-                                                         nil )
-                                                       )
-                                                       nil 511 nil nil )
-                                                      (!srcfileloc  "dwarf2out.c" 2550)
-                                                      nil )
-                                                    )
-                                                   )
-                                                  )
-                                                  (!srcfileloc  "dwarf2out.c" 2550)
-                                                  nil )
-                                                 (!pair  "die_parent"
-                                                  (!type already_seen 426)
-                                                  (!srcfileloc  "dwarf2out.c" 2551)
-                                                  nil )
-                                                 (!pair  "die_child"
-                                                  (!type already_seen 426)
-                                                  (!srcfileloc  "dwarf2out.c" 2552)
-                                                  nil )
-                                                 (!pair  "die_sib"
-                                                  (!type already_seen 426)
-                                                  (!srcfileloc  "dwarf2out.c" 2553)
-                                                  nil )
-                                                 (!pair  "die_definition"
-                                                  (!type already_seen 426)
-                                                  (!srcfileloc  "dwarf2out.c" 2554)
-                                                  nil )
-                                                 (!pair  "die_offset"
-                                                  (!type already_seen 9)
-                                                  (!srcfileloc  "dwarf2out.c" 2555)
-                                                  nil )
-                                                 (!pair  "die_abbrev"
-                                                  (!type already_seen 9)
-                                                  (!srcfileloc  "dwarf2out.c" 2556)
-                                                  nil )
-                                                 (!pair  "die_mark"
-                                                  (!type already_seen 9)
-                                                  (!srcfileloc  "dwarf2out.c" 2557)
-                                                  nil )
-                                                 (!pair  "decl_id"
-                                                  (!type already_seen 9)
-                                                  (!srcfileloc  "dwarf2out.c" 2558)
-                                                  nil )
-                                                 (!pair  "die_tag"
-                                                  (!type already_seen 9)
-                                                  (!srcfileloc  "dwarf2out.c" 2559)
-                                                  nil )
-                                                 (!pair  "die_perennial_p"
-                                                  (!type already_seen 9)
-                                                  (!srcfileloc  "dwarf2out.c" 2561)
-                                                  nil )
-                                                 (!pair  "comdat_type_p"
-                                                  (!type already_seen 9)
-                                                  (!srcfileloc  "dwarf2out.c" 2562)
-                                                  nil )
-                                                )
-                                                (!options 
-                                                 (!option chain_circular string  "%h.die_sib")
-                                                )
-                                                511 nil nil )
-                                              )
-                                              (!srcfileloc  "dwarf2out.h" 182)
-                                              nil )
-                                             (!pair  "external"
-                                              (!type already_seen 9)
-                                              (!srcfileloc  "dwarf2out.h" 183)
-                                              nil )
-                                            )
-                                            nil 511 nil nil )
-                                           (!srcfileloc  "dwarf2out.h" 184)
-                                           (!options 
-                                            (!option tag string  "dw_val_class_die_ref")
-                                           )
-                                          )
-                                          (!pair  "val_fde_index"
-                                           (!type already_seen 9)
-                                           (!srcfileloc  "dwarf2out.h" 185)
-                                           (!options 
-                                            (!option tag string  "dw_val_class_fde_ref")
-                                           )
-                                          )
-                                          (!pair  "val_str"
-                                           (!type pointer 437 nil  gc_used
-                                            (!type struct 438 
-                                             (!type already_seen 437)
-                                             gc_pointed_to "indirect_string_node"
-                                             (!srcfileloc  "dwarf2out.c" 211)
-                                             (!fields 5 
-                                              (!pair  "str"
-                                               (!type already_seen 36)
-                                               (!srcfileloc  "dwarf2out.c" 206)
-                                               nil )
-                                              (!pair  "refcount"
-                                               (!type already_seen 9)
-                                               (!srcfileloc  "dwarf2out.c" 207)
-                                               nil )
-                                              (!pair  "form"
-                                               (!type already_seen 9)
-                                               (!srcfileloc  "dwarf2out.c" 208)
-                                               nil )
-                                              (!pair  "label"
-                                               (!type already_seen 36)
-                                               (!srcfileloc  "dwarf2out.c" 209)
-                                               nil )
-                                              (!pair  "index"
-                                               (!type already_seen 9)
-                                               (!srcfileloc  "dwarf2out.c" 210)
-                                               nil )
-                                             )
-                                             nil 511 nil nil )
-                                           )
-                                           (!srcfileloc  "dwarf2out.h" 186)
-                                           (!options 
-                                            (!option tag string  "dw_val_class_str")
-                                           )
-                                          )
-                                          (!pair  "val_lbl_id"
-                                           (!type already_seen 36)
-                                           (!srcfileloc  "dwarf2out.h" 187)
-                                           (!options 
-                                            (!option tag string  "dw_val_class_lbl_id")
-                                           )
-                                          )
-                                          (!pair  "val_flag"
-                                           (!type already_seen 28)
-                                           (!srcfileloc  "dwarf2out.h" 188)
-                                           (!options 
-                                            (!option tag string  "dw_val_class_flag")
-                                           )
-                                          )
-                                          (!pair  "val_file"
-                                           (!type pointer 439 nil  gc_used
-                                            (!type struct 440 
-                                             (!type already_seen 439)
-                                             gc_pointed_to "dwarf_file_data"
-                                             (!srcfileloc  "dwarf2out.c" 1228)
-                                             (!fields 2 
-                                              (!pair  "filename"
-                                               (!type already_seen 36)
-                                               (!srcfileloc  "dwarf2out.c" 1226)
-                                               nil )
-                                              (!pair  "emitted_number"
-                                               (!type already_seen 9)
-                                               (!srcfileloc  "dwarf2out.c" 1227)
-                                               nil )
-                                             )
-                                             nil 511 nil nil )
-                                           )
-                                           (!srcfileloc  "dwarf2out.h" 189)
-                                           (!options 
-                                            (!option tag string  "dw_val_class_file")
-                                           )
-                                          )
-                                          (!pair  "val_data8"
-                                           (!type array 441 nil  gc_used "8" 
-                                            (!type already_seen 28)
-                                           )
-                                           (!srcfileloc  "dwarf2out.h" 190)
-                                           (!options 
-                                            (!option tag string  "dw_val_class_data8")
-                                           )
-                                          )
-                                          (!pair  "val_decl_ref"
-                                           (!type already_seen 5)
-                                           (!srcfileloc  "dwarf2out.h" 191)
-                                           (!options 
-                                            (!option tag string  "dw_val_class_decl_ref")
-                                           )
-                                          )
-                                          (!pair  "val_vms_delta"
-                                           (!type struct 442 nil  gc_used "dw_val_vms_delta_union"
-                                            (!srcfileloc  "dwarf2out.h" 196)
-                                            (!fields 2 
-                                             (!pair  "lbl1"
-                                              (!type already_seen 36)
-                                              (!srcfileloc  "dwarf2out.h" 194)
-                                              nil )
-                                             (!pair  "lbl2"
-                                              (!type already_seen 36)
-                                              (!srcfileloc  "dwarf2out.h" 195)
-                                              nil )
-                                            )
-                                            nil 511 nil nil )
-                                           (!srcfileloc  "dwarf2out.h" 196)
-                                           (!options 
-                                            (!option tag string  "dw_val_class_vms_delta")
-                                           )
-                                          )
-                                         )
-                                         nil 511 nil )
-                                        (!srcfileloc  "dwarf2out.h" 198)
-                                        (!options 
-                                         (!option desc string  "%1.val_class")
-                                        )
-                                       )
-                                      )
-                                      nil 511 nil nil )
-                                     (!srcfileloc  "dwarf2out.h" 211)
-                                     nil )
-                                    (!pair  "dw_loc_oprnd2"
-                                     (!type already_seen 416)
-                                     (!srcfileloc  "dwarf2out.h" 212)
-                                     nil )
-                                   )
-                                   nil 511 nil nil )
-                                 )
-                                 (!srcfileloc  "dwarf2out.h" 51)
-                                 (!options 
-                                  (!option tag string  "dw_cfi_oprnd_loc")
-                                 )
-                                )
-                               )
-                               nil 511 nil )
-                              (!srcfileloc  "dwarf2out.h" 57)
-                              (!options 
-                               (!option desc string  "dw_cfi_oprnd1_desc (%1.dw_cfi_opc)")
-                              )
-                             )
-                             (!pair  "dw_cfi_oprnd2"
-                              (!type already_seen 413)
-                              (!srcfileloc  "dwarf2out.h" 59)
-                              (!options 
-                               (!option desc string  "dw_cfi_oprnd2_desc (%1.dw_cfi_opc)")
-                              )
-                             )
-                            )
-                            nil 511 nil nil )
-                          )
-                          (!srcfileloc  "dwarf2out.h" 63)
-                          nil )
-                        )
-                       )
-                      )
-                      (!srcfileloc  "dwarf2out.h" 82)
-                      nil )
-                     (!pair  "dw_fde_switch_cfi_index"
-                      (!type already_seen 9)
-                      (!srcfileloc  "dwarf2out.h" 83)
-                      nil )
-                     (!pair  "stack_realignment"
-                      (!type already_seen 9)
-                      (!srcfileloc  "dwarf2out.h" 84)
-                      nil )
-                     (!pair  "funcdef_number"
-                      (!type already_seen 9)
-                      (!srcfileloc  "dwarf2out.h" 86)
-                      nil )
-                     (!pair  "fde_index"
-                      (!type already_seen 9)
-                      (!srcfileloc  "dwarf2out.h" 87)
-                      nil )
-                     (!pair  "drap_reg"
-                      (!type already_seen 9)
-                      (!srcfileloc  "dwarf2out.h" 90)
-                      nil )
-                     (!pair  "vdrap_reg"
-                      (!type already_seen 9)
-                      (!srcfileloc  "dwarf2out.h" 92)
-                      nil )
-                     (!pair  "all_throwers_are_sibcalls"
-                      (!type already_seen 9)
-                      (!srcfileloc  "dwarf2out.h" 94)
-                      nil )
-                     (!pair  "uses_eh_lsda"
-                      (!type already_seen 9)
-                      (!srcfileloc  "dwarf2out.h" 95)
-                      nil )
-                     (!pair  "nothrow"
-                      (!type already_seen 9)
-                      (!srcfileloc  "dwarf2out.h" 96)
-                      nil )
-                     (!pair  "stack_realign"
-                      (!type already_seen 9)
-                      (!srcfileloc  "dwarf2out.h" 98)
-                      nil )
-                     (!pair  "drap_reg_saved"
-                      (!type already_seen 9)
-                      (!srcfileloc  "dwarf2out.h" 100)
-                      nil )
-                     (!pair  "in_std_section"
-                      (!type already_seen 9)
-                      (!srcfileloc  "dwarf2out.h" 102)
-                      nil )
-                     (!pair  "second_in_std_section"
-                      (!type already_seen 9)
-                      (!srcfileloc  "dwarf2out.h" 105)
-                      nil )
-                    )
-                    nil 511 nil nil )
-                  )
-                  (!srcfileloc  "function.h" 572)
-                  nil )
-                 (!pair  "last_stmt_uid"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 575)
-                  nil )
-                 (!pair  "funcdef_no"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 578)
-                  nil )
-                 (!pair  "function_start_locus"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 581)
-                  nil )
-                 (!pair  "function_end_locus"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 584)
-                  nil )
-                 (!pair  "curr_properties"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 587)
-                  nil )
-                 (!pair  "last_verified"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 588)
-                  nil )
-                 (!pair  "cannot_be_copied_reason"
-                  (!type already_seen 36)
-                  (!srcfileloc  "function.h" 593)
-                  (!options 
-                   (!option skip string  "")
-                  )
-                 )
-                 (!pair  "va_list_gpr_size"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 600)
-                  nil )
-                 (!pair  "va_list_fpr_size"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 604)
-                  nil )
-                 (!pair  "calls_setjmp"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 607)
-                  nil )
-                 (!pair  "calls_alloca"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 611)
-                  nil )
-                 (!pair  "is_cilk_function"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 614)
-                  nil )
-                 (!pair  "calls_cilk_spawn"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 617)
-                  nil )
-                 (!pair  "has_nonlocal_label"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 621)
-                  nil )
-                 (!pair  "cannot_be_copied_set"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 626)
-                  nil )
-                 (!pair  "stdarg"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 629)
-                  nil )
-                 (!pair  "after_inlining"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 631)
-                  nil )
-                 (!pair  "always_inline_functions_inlined"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 632)
-                  nil )
-                 (!pair  "can_throw_non_call_exceptions"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 636)
-                  nil )
-                 (!pair  "can_delete_dead_exceptions"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 640)
-                  nil )
-                 (!pair  "returns_struct"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 647)
-                  nil )
-                 (!pair  "returns_pcc_struct"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 651)
-                  nil )
-                 (!pair  "has_local_explicit_reg_vars"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 655)
-                  nil )
-                 (!pair  "is_thunk"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 661)
-                  nil )
-                 (!pair  "has_force_vect_loops"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 665)
-                  nil )
-                 (!pair  "has_simduid_loops"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 669)
-                  nil )
-                 (!pair  "tail_call_marked"
-                  (!type already_seen 9)
-                  (!srcfileloc  "function.h" 672)
-                  nil )
-                )
-                nil 511 nil nil )
-              )
-              (!srcfileloc  "tree-core.h" 1483)
-              nil )
-             (!pair  "personality"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1486)
-              nil )
-             (!pair  "function_specific_target"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1489)
-              nil )
-             (!pair  "function_specific_optimization"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1490)
-              nil )
-             (!pair  "function_code"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1496)
-              nil )
-             (!pair  "built_in_class"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1497)
-              nil )
-             (!pair  "static_ctor_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1499)
-              nil )
-             (!pair  "static_dtor_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1500)
-              nil )
-             (!pair  "uninlinable"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1501)
-              nil )
-             (!pair  "possibly_inlined"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1503)
-              nil )
-             (!pair  "novops_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1504)
-              nil )
-             (!pair  "returns_twice_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1505)
-              nil )
-             (!pair  "malloc_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1506)
-              nil )
-             (!pair  "operator_new_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1507)
-              nil )
-             (!pair  "declared_inline_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1508)
-              nil )
-             (!pair  "regdecl_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1509)
-              nil )
-             (!pair  "no_inline_warning_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1510)
-              nil )
-             (!pair  "no_instrument_function_entry_exit"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1512)
-              nil )
-             (!pair  "no_limit_stack"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1513)
-              nil )
-             (!pair  "disregard_inline_limits"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1514)
-              nil )
-             (!pair  "pure_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1515)
-              nil )
-             (!pair  "looping_const_or_pure_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1516)
-              nil )
-             (!pair  "has_debug_args_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1517)
-              nil )
-             (!pair  "tm_clone_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1518)
-              nil )
-             (!pair  "versioned_function"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1519)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1612)
-           (!options 
-            (!option tag string  "TS_FUNCTION_DECL")
-           )
-          )
-          (!pair  "translation_unit_decl"
-           (!type struct 443 nil  gc_used "tree_translation_unit_decl"
-            (!srcfileloc  "tree-core.h" 1529)
-            (!fields 2 
-             (!pair  "common"
-              (!type already_seen 38)
-              (!srcfileloc  "tree-core.h" 1524)
-              nil )
-             (!pair  "language"
-              (!type already_seen 36)
-              (!srcfileloc  "tree-core.h" 1526)
-              (!options 
-               (!option skip string  "")
-              )
-             )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1614)
-           (!options 
-            (!option tag string  "TS_TRANSLATION_UNIT_DECL")
-           )
-          )
-          (!pair  "type_common"
-           (!type struct 444 nil  gc_used "tree_type_common"
-            (!srcfileloc  "tree-core.h" 1281)
-            (!fields 30 
-             (!pair  "common"
-              (!type already_seen 15)
-              (!srcfileloc  "tree-core.h" 1243)
-              nil )
-             (!pair  "size"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1244)
-              nil )
-             (!pair  "size_unit"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1245)
-              nil )
-             (!pair  "attributes"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1246)
-              nil )
-             (!pair  "uid"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1247)
-              nil )
-             (!pair  "precision"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1249)
-              nil )
-             (!pair  "no_force_blk_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1250)
-              nil )
-             (!pair  "needs_constructing_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1251)
-              nil )
-             (!pair  "transparent_aggr_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1252)
-              nil )
-             (!pair  "restrict_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1253)
-              nil )
-             (!pair  "contains_placeholder_bits"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1254)
-              nil )
-             (!pair  "mode"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1256)
-              nil )
-             (!pair  "string_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1258)
-              nil )
-             (!pair  "lang_flag_0"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1259)
-              nil )
-             (!pair  "lang_flag_1"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1260)
-              nil )
-             (!pair  "lang_flag_2"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1261)
-              nil )
-             (!pair  "lang_flag_3"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1262)
-              nil )
-             (!pair  "lang_flag_4"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1263)
-              nil )
-             (!pair  "lang_flag_5"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1264)
-              nil )
-             (!pair  "lang_flag_6"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1265)
-              nil )
-             (!pair  "align"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1267)
-              nil )
-             (!pair  "alias_set"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1268)
-              nil )
-             (!pair  "pointer_to"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1269)
-              nil )
-             (!pair  "reference_to"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1270)
-              nil )
-             (!pair  "symtab"
-              (!type union 445 nil  gc_used "tree_type_symtab"
-               (!srcfileloc  "tree-core.h" 1275)
-               (!fields 3 
-                (!pair  "address"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1272)
-                 (!options 
-                  (!option tag string  "TYPE_SYMTAB_IS_ADDRESS")
-                 )
-                )
-                (!pair  "pointer"
-                 (!type already_seen 36)
-                 (!srcfileloc  "tree-core.h" 1273)
-                 (!options 
-                  (!option tag string  "TYPE_SYMTAB_IS_POINTER")
-                 )
-                )
-                (!pair  "die"
-                 (!type already_seen 426)
-                 (!srcfileloc  "tree-core.h" 1274)
-                 (!options 
-                  (!option tag string  "TYPE_SYMTAB_IS_DIE")
-                 )
-                )
-               )
-               nil 511 nil )
-              (!srcfileloc  "tree-core.h" 1275)
-              (!options 
-               (!option desc string  "debug_hooks->tree_type_symtab_field")
-              )
-             )
-             (!pair  "canonical"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1276)
-              nil )
-             (!pair  "next_variant"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1277)
-              nil )
-             (!pair  "main_variant"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1278)
-              nil )
-             (!pair  "context"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1279)
-              nil )
-             (!pair  "name"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1280)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1615)
-           (!options 
-            (!option tag string  "TS_TYPE_COMMON")
-           )
-          )
-          (!pair  "type_with_lang_specific"
-           (!type struct 446 nil  gc_used "tree_type_with_lang_specific"
-            (!srcfileloc  "tree-core.h" 1287)
-            (!fields 2 
-             (!pair  "common"
-              (!type already_seen 444)
-              (!srcfileloc  "tree-core.h" 1284)
-              nil )
-             (!pair  "lang_specific"
-              (!type pointer 447 nil  gc_used
-               (!type lang_struct 448 
-                (!type already_seen 447)
-                gc_pointed_to "lang_type"
-                (!srcfileloc  "ada/gcc-interface/ada-tree.h" 40)
-                (!fields 0 )
-                (!options 
-                 (!option variable_size string  "")
-                )
-                511 
-                (!homotypes 7
-                 (!type struct 449 nil  gc_pointed_to "lang_type"
-                  (!srcfileloc  "lto/lto-tree.h" 39)
-                  (!fields 1 
-                   (!pair  "dummy"
-                    (!type already_seen 9)
-                    (!srcfileloc  "lto/lto-tree.h" 38)
-                    nil )
-                  )
-                  (!options 
-                   (!option variable_size string  "")
-                  )
-                  64 
-                  (!type already_seen 448)
-                  nil )
-                 
-                 (!type struct 450 nil  gc_pointed_to "lang_type"
-                  (!srcfileloc  "java/java-tree.h" 926)
-                  (!fields 29 
-                   (!pair  "signature"
-                    (!type already_seen 5)
-                    (!srcfileloc  "java/java-tree.h" 876)
-                    nil )
-                   (!pair  "jcf"
-                    (!type pointer 451 nil  gc_used
-                     (!type struct 452 
-                      (!type already_seen 451)
-                      gc_pointed_to "JCF"
-                      (!srcfileloc  "java/jcf.h" 123)
-                      (!fields 16 
-                       (!pair  "buffer"
-                        (!type already_seen 36)
-                        (!srcfileloc  "java/jcf.h" 106)
-                        (!options 
-                         (!option skip string  "")
-                        )
-                       )
-                       (!pair  "buffer_end"
-                        (!type already_seen 36)
-                        (!srcfileloc  "java/jcf.h" 107)
-                        (!options 
-                         (!option skip string  "")
-                        )
-                       )
-                       (!pair  "read_ptr"
-                        (!type already_seen 36)
-                        (!srcfileloc  "java/jcf.h" 108)
-                        (!options 
-                         (!option skip string  "")
-                        )
-                       )
-                       (!pair  "read_end"
-                        (!type already_seen 36)
-                        (!srcfileloc  "java/jcf.h" 109)
-                        (!options 
-                         (!option skip string  "")
-                        )
-                       )
-                       (!pair  "right_zip"
-                        (!type already_seen 9)
-                        (!srcfileloc  "java/jcf.h" 110)
-                        nil )
-                       (!pair  "finished"
-                        (!type already_seen 9)
-                        (!srcfileloc  "java/jcf.h" 111)
-                        nil )
-                       (!pair  "filbuf"
-                        (!type already_seen 9)
-                        (!srcfileloc  "java/jcf.h" 112)
-                        nil )
-                       (!pair  "read_state"
-                        (!type already_seen 10)
-                        (!srcfileloc  "java/jcf.h" 113)
-                        (!options 
-                         (!option skip string  "")
-                        )
-                       )
-                       (!pair  "filename"
-                        (!type already_seen 36)
-                        (!srcfileloc  "java/jcf.h" 114)
-                        nil )
-                       (!pair  "classname"
-                        (!type already_seen 36)
-                        (!srcfileloc  "java/jcf.h" 115)
-                        nil )
-                       (!pair  "zipd"
-                        (!type pointer 453 nil  gc_unused
-                         (!type struct 454 
-                          (!type already_seen 453)
-                          gc_unused "ZipDirectory"nil 
-                          (!fields 0 )
-                          nil 0 nil nil )
-                        )
-                        (!srcfileloc  "java/jcf.h" 117)
-                        (!options 
-                         (!option skip string  "")
-                        )
-                       )
-                       (!pair  "access_flags"
-                        (!type already_seen 9)
-                        (!srcfileloc  "java/jcf.h" 118)
-                        nil )
-                       (!pair  "this_class"
-                        (!type already_seen 9)
-                        (!srcfileloc  "java/jcf.h" 119)
-                        nil )
-                       (!pair  "super_class"
-                        (!type already_seen 9)
-                        (!srcfileloc  "java/jcf.h" 120)
-                        nil )
-                       (!pair  "cpool"
-                        (!type struct 455 
-                         (!type pointer 456 nil  gc_used
-                          (!type already_seen 455)
-                         )
-                         gc_pointed_to "CPool"
-                         (!srcfileloc  "java/jcf.h" 88)
-                         (!fields 4 
-                          (!pair  "capacity"
-                           (!type already_seen 9)
-                           (!srcfileloc  "java/jcf.h" 79)
-                           nil )
-                          (!pair  "count"
-                           (!type already_seen 9)
-                           (!srcfileloc  "java/jcf.h" 82)
-                           nil )
-                          (!pair  "tags"
-                           (!type already_seen 10)
-                           (!srcfileloc  "java/jcf.h" 84)
-                           (!options 
-                            (!option atomic string  "")
-                           )
-                          )
-                          (!pair  "data"
-                           (!type pointer 457 nil  gc_unused
-                            (!type union 458 
-                             (!type already_seen 457)
-                             gc_used "cpool_entry"
-                             (!srcfileloc  "java/jcf.h" 71)
-                             (!fields 2 
-                              (!pair  "w"
-                               (!type already_seen 9)
-                               (!srcfileloc  "java/jcf.h" 69)
-                               (!options 
-                                (!option tag string  "0")
-                               )
-                              )
-                              (!pair  "t"
-                               (!type already_seen 5)
-                               (!srcfileloc  "java/jcf.h" 70)
-                               (!options 
-                                (!option tag string  "1")
-                               )
-                              )
-                             )
-                             (!options 
-                              (!option variable_size string  "")
-                             )
-                             32 nil )
-                           )
-                           (!srcfileloc  "java/jcf.h" 87)
-                           (!options 
-                            (!option desc string  "cpool_entry_is_tree (%1.tags%a)")
-                            (!option length string  "%h.count")
-                           )
-                          )
-                         )
-                         nil 32 nil nil )
-                        (!srcfileloc  "java/jcf.h" 121)
-                        nil )
-                       (!pair  "bootstrap_methods"
-                        (!type struct 459 nil  gc_used "BootstrapMethods"
-                         (!srcfileloc  "java/jcf.h" 99)
-                         (!fields 2 
-                          (!pair  "count"
-                           (!type already_seen 9)
-                           (!srcfileloc  "java/jcf.h" 97)
-                           nil )
-                          (!pair  "methods"
-                           (!type pointer 460 nil  gc_unused
-                            (!type struct 461 
-                             (!type already_seen 460)
-                             gc_used "bootstrap_method"
-                             (!srcfileloc  "java/jcf.h" 94)
-                             (!fields 3 
-                              (!pair  "method_ref"
-                               (!type already_seen 9)
-                               (!srcfileloc  "java/jcf.h" 91)
-                               nil )
-                              (!pair  "num_arguments"
-                               (!type already_seen 9)
-                               (!srcfileloc  "java/jcf.h" 92)
-                               nil )
-                              (!pair  "bootstrap_arguments"
-                               (!type already_seen 10)
-                               (!srcfileloc  "java/jcf.h" 93)
-                               (!options 
-                                (!option atomic string  "")
-                               )
-                              )
-                             )
-                             nil 32 nil nil )
-                           )
-                           (!srcfileloc  "java/jcf.h" 98)
-                           (!options 
-                            (!option length string  "%h.count")
-                           )
-                          )
-                         )
-                         nil 32 nil nil )
-                        (!srcfileloc  "java/jcf.h" 122)
-                        nil )
-                      )
-                      nil 32 nil nil )
-                    )
-                    (!srcfileloc  "java/java-tree.h" 877)
-                    nil )
-                   (!pair  "cpool"
-                    (!type already_seen 456)
-                    (!srcfileloc  "java/java-tree.h" 878)
-                    nil )
-                   (!pair  "cpool_data_ref"
-                    (!type already_seen 5)
-                    (!srcfileloc  "java/java-tree.h" 879)
-                    nil )
-                   (!pair  "package_list"
-                    (!type already_seen 5)
-                    (!srcfileloc  "java/java-tree.h" 880)
-                    nil )
-                   (!pair  "otable_methods"
-                    (!type pointer 462 nil  gc_used
-                     (!type user_struct 463 
-                      (!type already_seen 462)
-                      gc_pointed_to "vec<method_entry,va_gc>"
-                      (!srcfileloc  "java/java-tree.h" 882)
-                      (!fields 2 
-                       (!pair  "va_gc"
-                        (!type already_seen 3)
-                        (!srcfileloc  "java/java-tree.h" 882)
-                        nil )
-                       (!pair  "method_entry"
-                        (!type struct 464 nil  gc_used "method_entry_d"
-                         (!srcfileloc  "java/java-tree.h" 869)
-                         (!fields 2 
-                          (!pair  "method"
-                           (!type already_seen 5)
-                           (!srcfileloc  "java/java-tree.h" 867)
-                           nil )
-                          (!pair  "special"
-                           (!type already_seen 5)
-                           (!srcfileloc  "java/java-tree.h" 868)
-                           nil )
-                         )
-                         nil 32 nil nil )
-                        (!srcfileloc  "java/java-tree.h" 882)
-                        nil )
-                      )
-                     )
-                    )
-                    (!srcfileloc  "java/java-tree.h" 882)
-                    nil )
-                   (!pair  "otable_decl"
-                    (!type already_seen 5)
-                    (!srcfileloc  "java/java-tree.h" 884)
-                    nil )
-                   (!pair  "otable_syms_decl"
-                    (!type already_seen 5)
-                    (!srcfileloc  "java/java-tree.h" 885)
-                    nil )
-                   (!pair  "atable_methods"
-                    (!type already_seen 462)
-                    (!srcfileloc  "java/java-tree.h" 887)
-                    nil )
-                   (!pair  "atable_decl"
-                    (!type already_seen 5)
-                    (!srcfileloc  "java/java-tree.h" 889)
-                    nil )
-                   (!pair  "atable_syms_decl"
-                    (!type already_seen 5)
-                    (!srcfileloc  "java/java-tree.h" 890)
-                    nil )
-                   (!pair  "itable_methods"
-                    (!type already_seen 462)
-                    (!srcfileloc  "java/java-tree.h" 892)
-                    nil )
-                   (!pair  "itable_decl"
-                    (!type already_seen 5)
-                    (!srcfileloc  "java/java-tree.h" 894)
-                    nil )
-                   (!pair  "itable_syms_decl"
-                    (!type already_seen 5)
-                    (!srcfileloc  "java/java-tree.h" 895)
-                    nil )
-                   (!pair  "ctable_decl"
-                    (!type already_seen 5)
-                    (!srcfileloc  "java/java-tree.h" 897)
-                    nil )
-                   (!pair  "catch_classes"
-                    (!type pointer 465 nil  gc_used
-                     (!type user_struct 466 
-                      (!type already_seen 465)
-                      gc_pointed_to "vec<constructor_elt,va_gc>"
-                      (!srcfileloc  "tree-core.h" 1109)
-                      (!fields 2 
-                       (!pair  "va_gc"
-                        (!type already_seen 3)
-                        (!srcfileloc  "tree-core.h" 1109)
-                        nil )
-                       (!pair  "constructor_elt"
-                        (!type struct 467 nil  gc_used "constructor_elt"
-                         (!srcfileloc  "tree-core.h" 1109)
-                         (!fields 2 
-                          (!pair  "index"
-                           (!type already_seen 5)
-                           (!srcfileloc  "tree-core.h" 1103)
-                           nil )
-                          (!pair  "value"
-                           (!type already_seen 5)
-                           (!srcfileloc  "tree-core.h" 1104)
-                           nil )
-                         )
-                         nil 511 nil nil )
-                        (!srcfileloc  "tree-core.h" 1109)
-                        nil )
-                      )
-                     )
-                    )
-                    (!srcfileloc  "java/java-tree.h" 899)
-                    nil )
-                   (!pair  "type_to_runtime_map"
-                    (!type already_seen 47)
-                    (!srcfileloc  "java/java-tree.h" 901)
-                    (!options 
-                     (!option param_is type 
-                      (!type already_seen 52)
-                     )
-                    )
-                   )
-                   (!pair  "type_assertions"
-                    (!type pointer 468 nil  gc_used
-                     (!type param_struct 469 
-                      (!type already_seen 468)
-                      gc_pointed_to
-                      (!type already_seen 49)
-                      
-                      (!type pointer 470 nil  gc_used
-                       (!type struct 471 
-                        (!type already_seen 470)
-                        gc_pointed_to "type_assertion"
-                        (!srcfileloc  "java/java-tree.h" 786)
-                        (!fields 3 
-                         (!pair  "assertion_code"
-                          (!type already_seen 9)
-                          (!srcfileloc  "java/java-tree.h" 783)
-                          nil )
-                         (!pair  "op1"
-                          (!type already_seen 5)
-                          (!srcfileloc  "java/java-tree.h" 784)
-                          nil )
-                         (!pair  "op2"
-                          (!type already_seen 5)
-                          (!srcfileloc  "java/java-tree.h" 785)
-                          nil )
-                        )
-                        nil 32 nil nil )
-                      )
-                      nil nil nil nil nil nil nil nil nil nil )
-                    )
-                    (!srcfileloc  "java/java-tree.h" 905)
-                    (!options 
-                     (!option param_is type 
-                      (!type already_seen 471)
-                     )
-                    )
-                   )
-                   (!pair  "package"
-                    (!type already_seen 5)
-                    (!srcfileloc  "java/java-tree.h" 909)
-                    nil )
-                   (!pair  "reflection_data"
-                    (!type already_seen 36)
-                    (!srcfileloc  "java/java-tree.h" 912)
-                    (!options 
-                     (!option skip string  "")
-                    )
-                   )
-                   (!pair  "reflection_datasize"
-                    (!type already_seen 9)
-                    (!srcfileloc  "java/java-tree.h" 915)
-                    nil )
-                   (!pair  "pic"
-                    (!type already_seen 9)
-                    (!srcfileloc  "java/java-tree.h" 918)
-                    nil )
-                   (!pair  "poic"
-                    (!type already_seen 9)
-                    (!srcfileloc  "java/java-tree.h" 919)
-                    nil )
-                   (!pair  "strictfp"
-                    (!type already_seen 9)
-                    (!srcfileloc  "java/java-tree.h" 920)
-                    nil )
-                   (!pair  "assertions"
-                    (!type already_seen 9)
-                    (!srcfileloc  "java/java-tree.h" 921)
-                    nil )
-                   (!pair  "dummy_class"
-                    (!type already_seen 9)
-                    (!srcfileloc  "java/java-tree.h" 922)
-                    nil )
-                   (!pair  "enum_class"
-                    (!type already_seen 9)
-                    (!srcfileloc  "java/java-tree.h" 923)
-                    nil )
-                   (!pair  "synthetic"
-                    (!type already_seen 9)
-                    (!srcfileloc  "java/java-tree.h" 924)
-                    nil )
-                   (!pair  "annotation"
-                    (!type already_seen 9)
-                    (!srcfileloc  "java/java-tree.h" 925)
-                    nil )
-                  )
-                  (!options 
-                   (!option variable_size string  "")
-                  )
-                  32 
-                  (!type already_seen 448)
-                  nil )
-                 
-                 (!type struct 472 nil  gc_pointed_to "lang_type"
-                  (!srcfileloc  "go/go-lang.c" 50)
-                  (!fields 1 
-                   (!pair  "dummy"
-                    (!type already_seen 28)
-                    (!srcfileloc  "go/go-lang.c" 49)
-                    nil )
-                  )
-                  nil 16 
-                  (!type already_seen 448)
-                  nil )
-                 
-                 (!type struct 473 nil  gc_pointed_to "lang_type"
-                  (!srcfileloc  "fortran/trans.h" 818)
-                  (!fields 15 
-                   (!pair  "rank"
-                    (!type already_seen 9)
-                    (!srcfileloc  "fortran/trans.h" 804)
-                    nil )
-                   (!pair  "corank"
-                    (!type already_seen 9)
-                    (!srcfileloc  "fortran/trans.h" 804)
-                    nil )
-                   (!pair  "akind"
-                    (!type already_seen 9)
-                    (!srcfileloc  "fortran/trans.h" 805)
-                    nil )
-                   (!pair  "lbound"
-                    (!type array 474 nil  gc_used "GFC_MAX_DIMENSIONS" 
-                     (!type already_seen 5)
-                    )
-                    (!srcfileloc  "fortran/trans.h" 806)
-                    nil )
-                   (!pair  "ubound"
-                    (!type array 475 nil  gc_used "GFC_MAX_DIMENSIONS" 
-                     (!type already_seen 5)
-                    )
-                    (!srcfileloc  "fortran/trans.h" 807)
-                    nil )
-                   (!pair  "stride"
-                    (!type array 476 nil  gc_used "GFC_MAX_DIMENSIONS" 
-                     (!type already_seen 5)
-                    )
-                    (!srcfileloc  "fortran/trans.h" 808)
-                    nil )
-                   (!pair  "size"
-                    (!type already_seen 5)
-                    (!srcfileloc  "fortran/trans.h" 809)
-                    nil )
-                   (!pair  "offset"
-                    (!type already_seen 5)
-                    (!srcfileloc  "fortran/trans.h" 810)
-                    nil )
-                   (!pair  "dtype"
-                    (!type already_seen 5)
-                    (!srcfileloc  "fortran/trans.h" 811)
-                    nil )
-                   (!pair  "dataptr_type"
-                    (!type already_seen 5)
-                    (!srcfileloc  "fortran/trans.h" 812)
-                    nil )
-                   (!pair  "span"
-                    (!type already_seen 5)
-                    (!srcfileloc  "fortran/trans.h" 813)
-                    nil )
-                   (!pair  "base_decl"
-                    (!type array 477 nil  gc_used "2" 
-                     (!type already_seen 5)
-                    )
-                    (!srcfileloc  "fortran/trans.h" 814)
-                    nil )
-                   (!pair  "nonrestricted_type"
-                    (!type already_seen 5)
-                    (!srcfileloc  "fortran/trans.h" 815)
-                    nil )
-                   (!pair  "caf_token"
-                    (!type already_seen 5)
-                    (!srcfileloc  "fortran/trans.h" 816)
-                    nil )
-                   (!pair  "caf_offset"
-                    (!type already_seen 5)
-                    (!srcfileloc  "fortran/trans.h" 817)
-                    nil )
-                  )
-                  (!options 
-                   (!option variable_size string  "")
-                  )
-                  8 
-                  (!type already_seen 448)
-                  nil )
-                 
-                 (!type struct 478 nil  gc_pointed_to "lang_type"
-                  (!srcfileloc  "cp/cp-tree.h" 1493)
-                  (!fields 1 
-                   (!pair  "u"
-                    (!type union 479 nil  gc_used "lang_type_u"
-                     (!srcfileloc  "cp/cp-tree.h" 1492)
-                     (!fields 3 
-                      (!pair  "h"
-                       (!type struct 480 nil  gc_used "lang_type_header"
-                        (!srcfileloc  "cp/cp-tree.h" 1377)
-                        (!fields 8 
-                         (!pair  "is_lang_type_class"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1367)
-                          nil )
-                         (!pair  "has_type_conversion"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1369)
-                          nil )
-                         (!pair  "has_copy_ctor"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1370)
-                          nil )
-                         (!pair  "has_default_ctor"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1371)
-                          nil )
-                         (!pair  "const_needs_init"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1372)
-                          nil )
-                         (!pair  "ref_needs_init"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1373)
-                          nil )
-                         (!pair  "has_const_copy_assign"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1374)
-                          nil )
-                         (!pair  "spare"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1376)
-                          nil )
-                        )
-                        nil 260 nil nil )
-                       (!srcfileloc  "cp/cp-tree.h" 1489)
-                       (!options 
-                        (!option skip string  "")
-                       )
-                      )
-                      (!pair  "c"
-                       (!type struct 481 nil  gc_used "lang_type_class"
-                        (!srcfileloc  "cp/cp-tree.h" 1479)
-                        (!fields 63 
-                         (!pair  "h"
-                          (!type already_seen 480)
-                          (!srcfileloc  "cp/cp-tree.h" 1393)
-                          nil )
-                         (!pair  "align"
-                          (!type already_seen 28)
-                          (!srcfileloc  "cp/cp-tree.h" 1395)
-                          nil )
-                         (!pair  "has_mutable"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1397)
-                          nil )
-                         (!pair  "com_interface"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1398)
-                          nil )
-                         (!pair  "non_pod_class"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1399)
-                          nil )
-                         (!pair  "nearly_empty_p"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1400)
-                          nil )
-                         (!pair  "user_align"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1401)
-                          nil )
-                         (!pair  "has_copy_assign"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1402)
-                          nil )
-                         (!pair  "has_new"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1403)
-                          nil )
-                         (!pair  "has_array_new"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1404)
-                          nil )
-                         (!pair  "gets_delete"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1406)
-                          nil )
-                         (!pair  "interface_only"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1407)
-                          nil )
-                         (!pair  "interface_unknown"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1408)
-                          nil )
-                         (!pair  "contains_empty_class_p"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1409)
-                          nil )
-                         (!pair  "anon_aggr"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1410)
-                          nil )
-                         (!pair  "non_zero_init"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1411)
-                          nil )
-                         (!pair  "empty_p"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1412)
-                          nil )
-                         (!pair  "vec_new_uses_cookie"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1414)
-                          nil )
-                         (!pair  "declared_class"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1415)
-                          nil )
-                         (!pair  "diamond_shaped"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1416)
-                          nil )
-                         (!pair  "repeated_base"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1417)
-                          nil )
-                         (!pair  "being_defined"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1418)
-                          nil )
-                         (!pair  "java_interface"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1419)
-                          nil )
-                         (!pair  "debug_requested"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1420)
-                          nil )
-                         (!pair  "fields_readonly"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1421)
-                          nil )
-                         (!pair  "use_template"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1423)
-                          nil )
-                         (!pair  "ptrmemfunc_flag"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1424)
-                          nil )
-                         (!pair  "was_anonymous"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1425)
-                          nil )
-                         (!pair  "lazy_default_ctor"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1426)
-                          nil )
-                         (!pair  "lazy_copy_ctor"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1427)
-                          nil )
-                         (!pair  "lazy_copy_assign"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1428)
-                          nil )
-                         (!pair  "lazy_destructor"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1429)
-                          nil )
-                         (!pair  "has_const_copy_ctor"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1431)
-                          nil )
-                         (!pair  "has_complex_copy_ctor"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1432)
-                          nil )
-                         (!pair  "has_complex_copy_assign"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1433)
-                          nil )
-                         (!pair  "non_aggregate"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1434)
-                          nil )
-                         (!pair  "has_complex_dflt"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1435)
-                          nil )
-                         (!pair  "has_list_ctor"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1436)
-                          nil )
-                         (!pair  "non_std_layout"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1437)
-                          nil )
-                         (!pair  "is_literal"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1438)
-                          nil )
-                         (!pair  "lazy_move_ctor"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1440)
-                          nil )
-                         (!pair  "lazy_move_assign"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1441)
-                          nil )
-                         (!pair  "has_complex_move_ctor"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1442)
-                          nil )
-                         (!pair  "has_complex_move_assign"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1443)
-                          nil )
-                         (!pair  "has_constexpr_ctor"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1444)
-                          nil )
-                         (!pair  "dummy"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 1453)
-                          nil )
-                         (!pair  "primary_base"
-                          (!type already_seen 5)
-                          (!srcfileloc  "cp/cp-tree.h" 1455)
-                          nil )
-                         (!pair  "vcall_indices"
-                          (!type pointer 482 nil  gc_used
-                           (!type user_struct 483 
-                            (!type already_seen 482)
-                            gc_pointed_to "vec<tree_pair_s,va_gc>"
-                            (!srcfileloc  "cp/cp-tree.h" 1456)
-                            (!fields 2 
-                             (!pair  "va_gc"
-                              (!type already_seen 3)
-                              (!srcfileloc  "cp/cp-tree.h" 1456)
-                              nil )
-                             (!pair  "tree_pair_s"
-                              (!type struct 484 
-                               (!type pointer 485 nil  gc_unused
-                                (!type already_seen 484)
-                               )
-                               gc_used "tree_pair_s"
-                               (!srcfileloc  "cp/cp-tree.h" 1360)
-                               (!fields 2 
-                                (!pair  "purpose"
-                                 (!type already_seen 5)
-                                 (!srcfileloc  "cp/cp-tree.h" 1358)
-                                 nil )
-                                (!pair  "value"
-                                 (!type already_seen 5)
-                                 (!srcfileloc  "cp/cp-tree.h" 1359)
-                                 nil )
-                               )
-                               nil 260 nil nil )
-                              (!srcfileloc  "cp/cp-tree.h" 1456)
-                              nil )
-                            )
-                           )
-                          )
-                          (!srcfileloc  "cp/cp-tree.h" 1456)
-                          nil )
-                         (!pair  "vtables"
-                          (!type already_seen 5)
-                          (!srcfileloc  "cp/cp-tree.h" 1457)
-                          nil )
-                         (!pair  "typeinfo_var"
-                          (!type already_seen 5)
-                          (!srcfileloc  "cp/cp-tree.h" 1458)
-                          nil )
-                         (!pair  "vbases"
-                          (!type already_seen 45)
-                          (!srcfileloc  "cp/cp-tree.h" 1459)
-                          nil )
-                         (!pair  "nested_udts"
-                          (!type pointer 486 nil  gc_used
-                           (!type struct 487 
-                            (!type already_seen 486)
-                            gc_pointed_to "binding_table_s"
-                            (!srcfileloc  "cp/name-lookup.c" 141)
-                            (!fields 3 
-                             (!pair  "chain"
-                              (!type pointer 488 nil  gc_unused
-                               (!type pointer 489 
-                                (!type already_seen 488)
-                                gc_used
-                                (!type struct 490 
-                                 (!type already_seen 489)
-                                 gc_pointed_to "binding_entry_s"
-                                 (!srcfileloc  "cp/name-lookup.h" 38)
-                                 (!fields 3 
-                                  (!pair  "chain"
-                                   (!type already_seen 489)
-                                   (!srcfileloc  "cp/name-lookup.h" 35)
-                                   nil )
-                                  (!pair  "name"
-                                   (!type already_seen 5)
-                                   (!srcfileloc  "cp/name-lookup.h" 36)
-                                   nil )
-                                  (!pair  "type"
-                                   (!type already_seen 5)
-                                   (!srcfileloc  "cp/name-lookup.h" 37)
-                                   nil )
-                                 )
-                                 nil 260 nil nil )
-                               )
-                              )
-                              (!srcfileloc  "cp/name-lookup.c" 133)
-                              (!options 
-                               (!option length string  "%h.chain_count")
-                              )
-                             )
-                             (!pair  "chain_count"
-                              (!type already_seen 9)
-                              (!srcfileloc  "cp/name-lookup.c" 137)
-                              nil )
-                             (!pair  "entry_count"
-                              (!type already_seen 9)
-                              (!srcfileloc  "cp/name-lookup.c" 140)
-                              nil )
-                            )
-                            nil 260 nil nil )
-                          )
-                          (!srcfileloc  "cp/cp-tree.h" 1460)
-                          nil )
-                         (!pair  "as_base"
-                          (!type already_seen 5)
-                          (!srcfileloc  "cp/cp-tree.h" 1461)
-                          nil )
-                         (!pair  "pure_virtuals"
-                          (!type already_seen 45)
-                          (!srcfileloc  "cp/cp-tree.h" 1462)
-                          nil )
-                         (!pair  "friend_classes"
-                          (!type already_seen 5)
-                          (!srcfileloc  "cp/cp-tree.h" 1463)
-                          nil )
-                         (!pair  "methods"
-                          (!type already_seen 45)
-                          (!srcfileloc  "cp/cp-tree.h" 1464)
-                          (!options 
-                           (!option reorder string  "resort_type_method_vec")
-                          )
-                         )
-                         (!pair  "key_method"
-                          (!type already_seen 5)
-                          (!srcfileloc  "cp/cp-tree.h" 1465)
-                          nil )
-                         (!pair  "decl_list"
-                          (!type already_seen 5)
-                          (!srcfileloc  "cp/cp-tree.h" 1466)
-                          nil )
-                         (!pair  "template_info"
-                          (!type already_seen 5)
-                          (!srcfileloc  "cp/cp-tree.h" 1467)
-                          nil )
-                         (!pair  "befriending_classes"
-                          (!type already_seen 5)
-                          (!srcfileloc  "cp/cp-tree.h" 1468)
-                          nil )
-                         (!pair  "objc_info"
-                          (!type already_seen 5)
-                          (!srcfileloc  "cp/cp-tree.h" 1472)
-                          nil )
-                         (!pair  "sorted_fields"
-                          (!type pointer 491 nil  gc_used
-                           (!type struct 492 
-                            (!type already_seen 491)
-                            gc_pointed_to "sorted_fields_type"
-                            (!srcfileloc  "c-family/c-common.h" 446)
-                            (!fields 2 
-                             (!pair  "len"
-                              (!type already_seen 9)
-                              (!srcfileloc  "c-family/c-common.h" 444)
-                              nil )
-                             (!pair  "elts"
-                              (!type array 493 nil  gc_used "1" 
-                               (!type already_seen 5)
-                              )
-                              (!srcfileloc  "c-family/c-common.h" 445)
-                              (!options 
-                               (!option length string  "%h.len")
-                              )
-                             )
-                            )
-                            (!options 
-                             (!option variable_size string  "")
-                            )
-                            390 nil nil )
-                          )
-                          (!srcfileloc  "cp/cp-tree.h" 1476)
-                          (!options 
-                           (!option reorder string  "resort_sorted_fields")
-                          )
-                         )
-                         (!pair  "lambda_expr"
-                          (!type already_seen 5)
-                          (!srcfileloc  "cp/cp-tree.h" 1478)
-                          nil )
-                        )
-                        nil 260 nil nil )
-                       (!srcfileloc  "cp/cp-tree.h" 1490)
-                       (!options 
-                        (!option tag string  "1")
-                       )
-                      )
-                      (!pair  "ptrmem"
-                       (!type struct 494 nil  gc_used "lang_type_ptrmem"
-                        (!srcfileloc  "cp/cp-tree.h" 1484)
-                        (!fields 2 
-                         (!pair  "h"
-                          (!type already_seen 480)
-                          (!srcfileloc  "cp/cp-tree.h" 1482)
-                          nil )
-                         (!pair  "record"
-                          (!type already_seen 5)
-                          (!srcfileloc  "cp/cp-tree.h" 1483)
-                          nil )
-                        )
-                        nil 260 nil nil )
-                       (!srcfileloc  "cp/cp-tree.h" 1491)
-                       (!options 
-                        (!option tag string  "0")
-                       )
-                      )
-                     )
-                     nil 260 nil )
-                    (!srcfileloc  "cp/cp-tree.h" 1492)
-                    (!options 
-                     (!option desc string  "%h.h.is_lang_type_class")
-                    )
-                   )
-                  )
-                  (!options 
-                   (!option variable_size string  "")
-                  )
-                  260 
-                  (!type already_seen 448)
-                  nil )
-                 
-                 (!type struct 495 nil  gc_pointed_to "lang_type"
-                  (!srcfileloc  "c/c-lang.h" 36)
-                  (!fields 4 
-                   (!pair  "s"
-                    (!type already_seen 491)
-                    (!srcfileloc  "c/c-lang.h" 28)
-                    (!options 
-                     (!option reorder string  "resort_sorted_fields")
-                    )
-                   )
-                   (!pair  "enum_min"
-                    (!type already_seen 5)
-                    (!srcfileloc  "c/c-lang.h" 30)
-                    nil )
-                   (!pair  "enum_max"
-                    (!type already_seen 5)
-                    (!srcfileloc  "c/c-lang.h" 31)
-                    nil )
-                   (!pair  "objc_info"
-                    (!type already_seen 5)
-                    (!srcfileloc  "c/c-lang.h" 35)
-                    nil )
-                  )
-                  (!options 
-                   (!option variable_size string  "")
-                  )
-                  130 
-                  (!type already_seen 448)
-                  nil )
-                 
-                 (!type struct 496 nil  gc_pointed_to "lang_type"
-                  (!srcfileloc  "ada/gcc-interface/ada-tree.h" 40)
-                  (!fields 1 
-                   (!pair  "t"
-                    (!type already_seen 5)
-                    (!srcfileloc  "ada/gcc-interface/ada-tree.h" 40)
-                    nil )
-                  )
-                  (!options 
-                   (!option variable_size string  "")
-                  )
-                  1 
-                  (!type already_seen 448)
-                  nil )
-                )
-               )
-              )
-              (!srcfileloc  "tree-core.h" 1286)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1617)
-           (!options 
-            (!option tag string  "TS_TYPE_WITH_LANG_SPECIFIC")
-           )
-          )
-          (!pair  "type_non_common"
-           (!type struct 497 nil  gc_used "tree_type_non_common"
-            (!srcfileloc  "tree-core.h" 1295)
-            (!fields 5 
-             (!pair  "with_lang_specific"
-              (!type already_seen 446)
-              (!srcfileloc  "tree-core.h" 1290)
-              nil )
-             (!pair  "values"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1291)
-              nil )
-             (!pair  "minval"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1292)
-              nil )
-             (!pair  "maxval"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1293)
-              nil )
-             (!pair  "binfo"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1294)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1619)
-           (!options 
-            (!option tag string  "TS_TYPE_NON_COMMON")
-           )
-          )
-          (!pair  "list"
-           (!type struct 498 nil  gc_used "tree_list"
-            (!srcfileloc  "tree-core.h" 1091)
-            (!fields 3 
-             (!pair  "common"
-              (!type already_seen 15)
-              (!srcfileloc  "tree-core.h" 1088)
-              nil )
-             (!pair  "purpose"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1089)
-              nil )
-             (!pair  "value"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1090)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1620)
-           (!options 
-            (!option tag string  "TS_LIST")
-           )
-          )
-          (!pair  "vec"
-           (!type struct 499 nil  gc_used "tree_vec"
-            (!srcfileloc  "tree-core.h" 1096)
-            (!fields 2 
-             (!pair  "common"
-              (!type already_seen 15)
-              (!srcfileloc  "tree-core.h" 1094)
-              nil )
-             (!pair  "a"
-              (!type array 500 nil  gc_used "1" 
-               (!type already_seen 5)
-              )
-              (!srcfileloc  "tree-core.h" 1095)
-              (!options 
-               (!option length string  "TREE_VEC_LENGTH ((tree)&%h)")
-              )
-             )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1621)
-           (!options 
-            (!option tag string  "TS_VEC")
-           )
-          )
-          (!pair  "exp"
-           (!type struct 501 nil  gc_used "tree_exp"
-            (!srcfileloc  "tree-core.h" 1155)
-            (!fields 3 
-             (!pair  "typed"
-              (!type already_seen 14)
-              (!srcfileloc  "tree-core.h" 1150)
-              nil )
-             (!pair  "locus"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1151)
-              nil )
-             (!pair  "operands"
-              (!type union 502 nil  gc_used "tree_exp_subunion"
-               (!srcfileloc  "tree-core.h" 1154)
-               (!fields 1 
-                (!pair  ""
-                 (!type array 503 nil  gc_used "1" 
-                  (!type already_seen 5)
-                 )
-                 (!srcfileloc  "gengtype.c" 1378)
-                 (!options 
-                  (!option default string  "")
-                  (!option length string  "TREE_OPERAND_LENGTH ((tree) &%0)")
-                  (!option dot string  "")
-                 )
-                )
-               )
-               (!options 
-                (!option dot string  "")
-               )
-               511 nil )
-              (!srcfileloc  "tree-core.h" 1154)
-              (!options 
-               (!option desc string  "TREE_CODE ((tree) &%0)")
-               (!option special string  "tree_exp")
-              )
-             )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1622)
-           (!options 
-            (!option tag string  "TS_EXP")
-           )
-          )
-          (!pair  "ssa_name"
-           (!type struct 504 nil  gc_used "tree_ssa_name"
-            (!srcfileloc  "tree-core.h" 1191)
-            (!fields 5 
-             (!pair  "typed"
-              (!type already_seen 14)
-              (!srcfileloc  "tree-core.h" 1172)
-              nil )
-             (!pair  "var"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1175)
-              nil )
-             (!pair  "def_stmt"
-              (!type already_seen 310)
-              (!srcfileloc  "tree-core.h" 1178)
-              nil )
-             (!pair  "info"
-              (!type union 505 nil  gc_used "ssa_name_info_type"
-               (!srcfileloc  "tree-core.h" 1186)
-               (!fields 2 
-                (!pair  "ptr_info"
-                 (!type pointer 506 nil  gc_used
-                  (!type struct 507 
-                   (!type already_seen 506)
-                   gc_pointed_to "ptr_info_def"
-                   (!srcfileloc  "tree-ssanames.h" 46)
-                   (!fields 3 
-                    (!pair  "pt"
-                     (!type already_seen 384)
-                     (!srcfileloc  "tree-ssanames.h" 28)
-                     nil )
-                    (!pair  "align"
-                     (!type already_seen 9)
-                     (!srcfileloc  "tree-ssanames.h" 40)
-                     nil )
-                    (!pair  "misalign"
-                     (!type already_seen 9)
-                     (!srcfileloc  "tree-ssanames.h" 45)
-                     nil )
-                   )
-                   nil 511 nil nil )
-                 )
-                 (!srcfileloc  "tree-core.h" 1183)
-                 (!options 
-                  (!option tag string  "0")
-                 )
-                )
-                (!pair  "range_info"
-                 (!type pointer 508 nil  gc_used
-                  (!type struct 509 
-                   (!type already_seen 508)
-                   gc_pointed_to "range_info_def"
-                   (!srcfileloc  "tree-ssanames.h" 57)
-                   (!fields 3 
-                    (!pair  "min"
-                     (!type already_seen 9)
-                     (!srcfileloc  "tree-ssanames.h" 52)
-                     nil )
-                    (!pair  "max"
-                     (!type already_seen 9)
-                     (!srcfileloc  "tree-ssanames.h" 54)
-                     nil )
-                    (!pair  "nonzero_bits"
-                     (!type already_seen 9)
-                     (!srcfileloc  "tree-ssanames.h" 56)
-                     nil )
-                   )
-                   nil 511 nil nil )
-                 )
-                 (!srcfileloc  "tree-core.h" 1185)
-                 (!options 
-                  (!option tag string  "1")
-                 )
-                )
-               )
-               nil 511 nil )
-              (!srcfileloc  "tree-core.h" 1187)
-              (!options 
-               (!option desc string  "%1.typed.type ?!POINTER_TYPE_P (TREE_TYPE ((tree)&%1)) : 2")
-              )
-             )
-             (!pair  "imm_uses"
-              (!type struct 510 
-               (!type pointer 511 nil  gc_unused
-                (!type already_seen 510)
-               )
-               gc_used "ssa_use_operand_t"
-               (!srcfileloc  "tree-ssa-operands.h" 30)
-               (!fields 4 
-                (!pair  "prev"
-                 (!type already_seen 511)
-                 (!srcfileloc  "tree-core.h" 1160)
-                 (!options 
-                  (!option skip string  "")
-                 )
-                )
-                (!pair  "next"
-                 (!type already_seen 511)
-                 (!srcfileloc  "tree-core.h" 1161)
-                 (!options 
-                  (!option skip string  "")
-                 )
-                )
-                (!pair  "loc"
-                 (!type union 512 nil  gc_unused "anonymous:../../gcc/tree-core.h:1167"
-                  (!srcfileloc  "tree-core.h" 1167)
-                  (!fields 2 
-                   (!pair  "stmt"
-                    (!type already_seen 310)
-                    (!srcfileloc  "tree-core.h" 1167)
-                    nil )
-                   (!pair  "ssa_name"
-                    (!type already_seen 5)
-                    (!srcfileloc  "tree-core.h" 1167)
-                    nil )
-                  )
-                  nil 511 nil )
-                 (!srcfileloc  "tree-core.h" 1167)
-                 (!options 
-                  (!option skip string  "")
-                 )
-                )
-                (!pair  "use"
-                 (!type already_seen 6)
-                 (!srcfileloc  "tree-core.h" 1168)
-                 (!options 
-                  (!option skip string  "")
-                 )
-                )
-               )
-               nil 511 nil nil )
-              (!srcfileloc  "tree-core.h" 1190)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1623)
-           (!options 
-            (!option tag string  "TS_SSA_NAME")
-           )
-          )
-          (!pair  "block"
-           (!type struct 513 nil  gc_used "tree_block"
-            (!srcfileloc  "tree-core.h" 1240)
-            (!fields 12 
-             (!pair  "base"
-              (!type already_seen 8)
-              (!srcfileloc  "tree-core.h" 1224)
-              nil )
-             (!pair  "chain"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1225)
-              nil )
-             (!pair  "abstract_flag"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1227)
-              nil )
-             (!pair  "block_num"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1228)
-              nil )
-             (!pair  "locus"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1230)
-              nil )
-             (!pair  "vars"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1232)
-              nil )
-             (!pair  "nonlocalized_vars"
-              (!type already_seen 45)
-              (!srcfileloc  "tree-core.h" 1233)
-              nil )
-             (!pair  "subblocks"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1235)
-              nil )
-             (!pair  "supercontext"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1236)
-              nil )
-             (!pair  "abstract_origin"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1237)
-              nil )
-             (!pair  "fragment_origin"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1238)
-              nil )
-             (!pair  "fragment_chain"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1239)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1624)
-           (!options 
-            (!option tag string  "TS_BLOCK")
-           )
-          )
-          (!pair  "binfo"
-           (!type struct 514 nil  gc_used "tree_binfo"
-            (!srcfileloc  "tree-core.h" 1311)
-            (!fields 10 
-             (!pair  "common"
-              (!type already_seen 15)
-              (!srcfileloc  "tree-core.h" 1298)
-              nil )
-             (!pair  "offset"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1300)
-              nil )
-             (!pair  "vtable"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1301)
-              nil )
-             (!pair  "virtuals"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1302)
-              nil )
-             (!pair  "vptr_field"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1303)
-              nil )
-             (!pair  "base_accesses"
-              (!type already_seen 45)
-              (!srcfileloc  "tree-core.h" 1304)
-              nil )
-             (!pair  "inheritance"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1305)
-              nil )
-             (!pair  "vtt_subvtt"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1307)
-              nil )
-             (!pair  "vtt_vptr"
-              (!type already_seen 5)
-              (!srcfileloc  "tree-core.h" 1308)
-              nil )
-             (!pair  "base_binfos"
-              (!type already_seen 46)
-              (!srcfileloc  "tree-core.h" 1310)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1625)
-           (!options 
-            (!option tag string  "TS_BINFO")
-           )
-          )
-          (!pair  "stmt_list"
-           (!type struct 515 nil  gc_used "tree_statement_list"
-            (!srcfileloc  "tree-core.h" 1548)
-            (!fields 3 
-             (!pair  "typed"
-              (!type already_seen 14)
-              (!srcfileloc  "tree-core.h" 1545)
-              nil )
-             (!pair  "head"
-              (!type pointer 516 nil  gc_used
-               (!type struct 517 
-                (!type already_seen 516)
-                gc_pointed_to "tree_statement_list_node"
-                (!srcfileloc  "tree-core.h" 1541)
-                (!fields 3 
-                 (!pair  "prev"
-                  (!type already_seen 516)
-                  (!srcfileloc  "tree-core.h" 1538)
-                  nil )
-                 (!pair  "next"
-                  (!type already_seen 516)
-                  (!srcfileloc  "tree-core.h" 1539)
-                  nil )
-                 (!pair  "stmt"
-                  (!type already_seen 5)
-                  (!srcfileloc  "tree-core.h" 1540)
-                  nil )
-                )
-                (!options 
-                 (!option chain_prev string  "%h.prev")
-                 (!option chain_next string  "%h.next")
-                )
-                511 nil nil )
-              )
-              (!srcfileloc  "tree-core.h" 1546)
-              nil )
-             (!pair  "tail"
-              (!type already_seen 516)
-              (!srcfileloc  "tree-core.h" 1547)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1626)
-           (!options 
-            (!option tag string  "TS_STATEMENT_LIST")
-           )
-          )
-          (!pair  "constructor"
-           (!type struct 518 nil  gc_used "tree_constructor"
-            (!srcfileloc  "tree-core.h" 1110)
-            (!fields 2 
-             (!pair  "typed"
-              (!type already_seen 14)
-              (!srcfileloc  "tree-core.h" 1108)
-              nil )
-             (!pair  "elts"
-              (!type already_seen 465)
-              (!srcfileloc  "tree-core.h" 1109)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1627)
-           (!options 
-            (!option tag string  "TS_CONSTRUCTOR")
-           )
-          )
-          (!pair  "omp_clause"
-           (!type struct 519 nil  gc_used "tree_omp_clause"
-            (!srcfileloc  "tree-core.h" 1221)
-            (!fields 7 
-             (!pair  "common"
-              (!type already_seen 15)
-              (!srcfileloc  "tree-core.h" 1202)
-              nil )
-             (!pair  "locus"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1203)
-              nil )
-             (!pair  "code"
-              (!type already_seen 9)
-              (!srcfileloc  "tree-core.h" 1204)
-              nil )
-             (!pair  "subcode"
-              (!type union 520 nil  gc_unused "omp_clause_subcode"
-               (!srcfileloc  "tree-core.h" 1212)
-               (!fields 6 
-                (!pair  "default_kind"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1206)
-                 nil )
-                (!pair  "schedule_kind"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1207)
-                 nil )
-                (!pair  "depend_kind"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1208)
-                 nil )
-                (!pair  "map_kind"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1209)
-                 nil )
-                (!pair  "proc_bind_kind"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1210)
-                 nil )
-                (!pair  "reduction_code"
-                 (!type already_seen 9)
-                 (!srcfileloc  "tree-core.h" 1211)
-                 nil )
-               )
-               nil 511 nil )
-              (!srcfileloc  "tree-core.h" 1212)
-              (!options 
-               (!option skip string  "")
-              )
-             )
-             (!pair  "gimple_reduction_init"
-              (!type already_seen 310)
-              (!srcfileloc  "tree-core.h" 1216)
-              nil )
-             (!pair  "gimple_reduction_merge"
-              (!type already_seen 310)
-              (!srcfileloc  "tree-core.h" 1217)
-              nil )
-             (!pair  "ops"
-              (!type array 521 nil  gc_used "1" 
-               (!type already_seen 5)
-              )
-              (!srcfileloc  "tree-core.h" 1220)
-              (!options 
-               (!option length string  "omp_clause_num_ops[OMP_CLAUSE_CODE ((tree)&%h)]")
-              )
-             )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1628)
-           (!options 
-            (!option tag string  "TS_OMP_CLAUSE")
-           )
-          )
-          (!pair  "optimization"
-           (!type struct 522 nil  gc_used "tree_optimization_option"
-            (!srcfileloc  "tree-core.h" 1566)
-            (!fields 4 
-             (!pair  "common"
-              (!type already_seen 15)
-              (!srcfileloc  "tree-core.h" 1554)
-              nil )
-             (!pair  "opts"
-              (!type struct 523 nil  gc_used "cl_optimization"
-               (!fileloc  "options.h" 3911)
-               (!fields 188 
-                (!pair  "x_align_functions"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3723)
-                 nil )
-                (!pair  "x_align_jumps"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3724)
-                 nil )
-                (!pair  "x_align_labels"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3725)
-                 nil )
-                (!pair  "x_align_loops"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3726)
-                 nil )
-                (!pair  "x_flag_sched_stalled_insns"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3727)
-                 nil )
-                (!pair  "x_flag_sched_stalled_insns_dep"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3728)
-                 nil )
-                (!pair  "x_flag_fp_contract_mode"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3729)
-                 nil )
-                (!pair  "x_optimize"
-                 (!type already_seen 28)
-                 (!fileloc  "options.h" 3730)
-                 nil )
-                (!pair  "x_optimize_size"
-                 (!type already_seen 28)
-                 (!fileloc  "options.h" 3731)
-                 nil )
-                (!pair  "x_flag_aggressive_loop_optimizations"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3732)
-                 nil )
-                (!pair  "x_flag_asynchronous_unwind_tables"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3733)
-                 nil )
-                (!pair  "x_flag_branch_on_count_reg"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3734)
-                 nil )
-                (!pair  "x_flag_branch_probabilities"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3735)
-                 nil )
-                (!pair  "x_flag_branch_target_load_optimize"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3736)
-                 nil )
-                (!pair  "x_flag_branch_target_load_optimize2"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3737)
-                 nil )
-                (!pair  "x_flag_btr_bb_exclusive"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3738)
-                 nil )
-                (!pair  "x_flag_caller_saves"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3739)
-                 nil )
-                (!pair  "x_flag_combine_stack_adjustments"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3740)
-                 nil )
-                (!pair  "x_flag_no_common"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3741)
-                 nil )
-                (!pair  "x_flag_compare_elim_after_reload"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3742)
-                 nil )
-                (!pair  "x_flag_conserve_stack"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3743)
-                 nil )
-                (!pair  "x_flag_cprop_registers"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3744)
-                 nil )
-                (!pair  "x_flag_crossjumping"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3745)
-                 nil )
-                (!pair  "x_flag_cse_follow_jumps"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3746)
-                 nil )
-                (!pair  "x_flag_cx_fortran_rules"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3747)
-                 nil )
-                (!pair  "x_flag_cx_limited_range"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3748)
-                 nil )
-                (!pair  "x_flag_data_sections"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3749)
-                 nil )
-                (!pair  "x_flag_dce"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3750)
-                 nil )
-                (!pair  "x_flag_defer_pop"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3751)
-                 nil )
-                (!pair  "x_flag_delayed_branch"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3752)
-                 nil )
-                (!pair  "x_flag_delete_null_pointer_checks"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3753)
-                 nil )
-                (!pair  "x_flag_devirtualize"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3754)
-                 nil )
-                (!pair  "x_flag_devirtualize_speculatively"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3755)
-                 nil )
-                (!pair  "x_flag_dse"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3756)
-                 nil )
-                (!pair  "x_flag_early_inlining"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3757)
-                 nil )
-                (!pair  "x_flag_exceptions"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3758)
-                 nil )
-                (!pair  "x_flag_expensive_optimizations"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3759)
-                 nil )
-                (!pair  "x_flag_finite_math_only"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3760)
-                 nil )
-                (!pair  "x_flag_float_store"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3761)
-                 nil )
-                (!pair  "x_flag_forward_propagate"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3762)
-                 nil )
-                (!pair  "x_flag_gcse"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3763)
-                 nil )
-                (!pair  "x_flag_gcse_after_reload"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3764)
-                 nil )
-                (!pair  "x_flag_gcse_las"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3765)
-                 nil )
-                (!pair  "x_flag_gcse_lm"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3766)
-                 nil )
-                (!pair  "x_flag_gcse_sm"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3767)
-                 nil )
-                (!pair  "x_flag_graphite_identity"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3768)
-                 nil )
-                (!pair  "x_flag_guess_branch_prob"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3769)
-                 nil )
-                (!pair  "x_flag_hoist_adjacent_loads"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3770)
-                 nil )
-                (!pair  "x_flag_if_conversion"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3771)
-                 nil )
-                (!pair  "x_flag_if_conversion2"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3772)
-                 nil )
-                (!pair  "x_flag_no_inline"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3773)
-                 nil )
-                (!pair  "x_flag_inline_atomics"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3774)
-                 nil )
-                (!pair  "x_flag_inline_functions"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3775)
-                 nil )
-                (!pair  "x_flag_inline_functions_called_once"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3776)
-                 nil )
-                (!pair  "x_flag_inline_small_functions"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3777)
-                 nil )
-                (!pair  "x_flag_ipa_cp"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3778)
-                 nil )
-                (!pair  "x_flag_ipa_cp_clone"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3779)
-                 nil )
-                (!pair  "x_flag_ipa_profile"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3780)
-                 nil )
-                (!pair  "x_flag_ipa_pta"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3781)
-                 nil )
-                (!pair  "x_flag_ipa_pure_const"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3782)
-                 nil )
-                (!pair  "x_flag_ipa_reference"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3783)
-                 nil )
-                (!pair  "x_flag_ipa_sra"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3784)
-                 nil )
-                (!pair  "x_flag_ira_hoist_pressure"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3785)
-                 nil )
-                (!pair  "x_flag_ira_loop_pressure"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3786)
-                 nil )
-                (!pair  "x_flag_isolate_erroneous_paths_attribute"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3787)
-                 nil )
-                (!pair  "x_flag_isolate_erroneous_paths_dereference"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3788)
-                 nil )
-                (!pair  "x_flag_ivopts"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3789)
-                 nil )
-                (!pair  "x_flag_jump_tables"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3790)
-                 nil )
-                (!pair  "x_flag_live_range_shrinkage"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3791)
-                 nil )
-                (!pair  "x_flag_loop_block"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3792)
-                 nil )
-                (!pair  "x_flag_loop_interchange"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3793)
-                 nil )
-                (!pair  "x_flag_loop_optimize_isl"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3794)
-                 nil )
-                (!pair  "x_flag_loop_parallelize_all"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3795)
-                 nil )
-                (!pair  "x_flag_loop_strip_mine"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3796)
-                 nil )
-                (!pair  "x_flag_errno_math"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3797)
-                 nil )
-                (!pair  "x_flag_merge_constants"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3798)
-                 nil )
-                (!pair  "x_flag_modulo_sched"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3799)
-                 nil )
-                (!pair  "x_flag_move_loop_invariants"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3800)
-                 nil )
-                (!pair  "x_flag_non_call_exceptions"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3801)
-                 nil )
-                (!pair  "x_flag_nothrow_opt"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3802)
-                 nil )
-                (!pair  "x_flag_omit_frame_pointer"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3803)
-                 nil )
-                (!pair  "x_flag_opt_info"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3804)
-                 nil )
-                (!pair  "x_flag_optimize_sibling_calls"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3805)
-                 nil )
-                (!pair  "x_flag_optimize_strlen"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3806)
-                 nil )
-                (!pair  "x_flag_pack_struct"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3807)
-                 nil )
-                (!pair  "x_flag_peel_loops"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3808)
-                 nil )
-                (!pair  "x_flag_no_peephole"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3809)
-                 nil )
-                (!pair  "x_flag_peephole2"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3810)
-                 nil )
-                (!pair  "x_flag_predictive_commoning"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3811)
-                 nil )
-                (!pair  "x_flag_prefetch_loop_arrays"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3812)
-                 nil )
-                (!pair  "x_flag_pcc_struct_return"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3813)
-                 nil )
-                (!pair  "x_flag_rename_registers"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3814)
-                 nil )
-                (!pair  "x_flag_reorder_blocks"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3815)
-                 nil )
-                (!pair  "x_flag_reorder_blocks_and_partition"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3816)
-                 nil )
-                (!pair  "x_flag_reorder_functions"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3817)
-                 nil )
-                (!pair  "x_flag_rerun_cse_after_loop"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3818)
-                 nil )
-                (!pair  "x_flag_resched_modulo_sched"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3819)
-                 nil )
-                (!pair  "x_flag_rounding_math"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3820)
-                 nil )
-                (!pair  "x_flag_rtti"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3821)
-                 nil )
-                (!pair  "x_flag_sched_critical_path_heuristic"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3822)
-                 nil )
-                (!pair  "x_flag_sched_dep_count_heuristic"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3823)
-                 nil )
-                (!pair  "x_flag_sched_group_heuristic"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3824)
-                 nil )
-                (!pair  "x_flag_schedule_interblock"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3825)
-                 nil )
-                (!pair  "x_flag_sched_last_insn_heuristic"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3826)
-                 nil )
-                (!pair  "x_flag_sched_pressure"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3827)
-                 nil )
-                (!pair  "x_flag_sched_rank_heuristic"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3828)
-                 nil )
-                (!pair  "x_flag_schedule_speculative"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3829)
-                 nil )
-                (!pair  "x_flag_sched_spec_insn_heuristic"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3830)
-                 nil )
-                (!pair  "x_flag_schedule_speculative_load"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3831)
-                 nil )
-                (!pair  "x_flag_schedule_speculative_load_dangerous"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3832)
-                 nil )
-                (!pair  "x_flag_sched2_use_superblocks"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3833)
-                 nil )
-                (!pair  "x_flag_schedule_insns"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3834)
-                 nil )
-                (!pair  "x_flag_schedule_insns_after_reload"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3835)
-                 nil )
-                (!pair  "x_flag_section_anchors"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3836)
-                 nil )
-                (!pair  "x_flag_sel_sched_pipelining"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3837)
-                 nil )
-                (!pair  "x_flag_sel_sched_pipelining_outer_loops"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3838)
-                 nil )
-                (!pair  "x_flag_sel_sched_reschedule_pipelined"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3839)
-                 nil )
-                (!pair  "x_flag_selective_scheduling"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3840)
-                 nil )
-                (!pair  "x_flag_selective_scheduling2"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3841)
-                 nil )
-                (!pair  "x_flag_short_double"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3842)
-                 nil )
-                (!pair  "x_flag_short_enums"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3843)
-                 nil )
-                (!pair  "x_flag_short_wchar"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3844)
-                 nil )
-                (!pair  "x_flag_shrink_wrap"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3845)
-                 nil )
-                (!pair  "x_flag_signaling_nans"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3846)
-                 nil )
-                (!pair  "x_flag_signed_zeros"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3847)
-                 nil )
-                (!pair  "x_flag_single_precision_constant"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3848)
-                 nil )
-                (!pair  "x_flag_split_ivs_in_unroller"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3849)
-                 nil )
-                (!pair  "x_flag_split_wide_types"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3850)
-                 nil )
-                (!pair  "x_flag_strict_aliasing"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3851)
-                 nil )
-                (!pair  "x_flag_strict_enums"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3852)
-                 nil )
-                (!pair  "x_flag_thread_jumps"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3853)
-                 nil )
-                (!pair  "x_flag_threadsafe_statics"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3854)
-                 nil )
-                (!pair  "x_flag_toplevel_reorder"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3855)
-                 nil )
-                (!pair  "x_flag_trapping_math"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3856)
-                 nil )
-                (!pair  "x_flag_trapv"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3857)
-                 nil )
-                (!pair  "x_flag_tree_bit_ccp"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3858)
-                 nil )
-                (!pair  "x_flag_tree_builtin_call_dce"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3859)
-                 nil )
-                (!pair  "x_flag_tree_ccp"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3860)
-                 nil )
-                (!pair  "x_flag_tree_ch"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3861)
-                 nil )
-                (!pair  "x_flag_ssa_coalesce_vars"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3862)
-                 nil )
-                (!pair  "x_flag_tree_copy_prop"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3863)
-                 nil )
-                (!pair  "x_flag_tree_copyrename"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3864)
-                 nil )
-                (!pair  "x_flag_tree_cselim"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3865)
-                 nil )
-                (!pair  "x_flag_tree_dce"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3866)
-                 nil )
-                (!pair  "x_flag_tree_dom"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3867)
-                 nil )
-                (!pair  "x_flag_tree_dse"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3868)
-                 nil )
-                (!pair  "x_flag_tree_forwprop"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3869)
-                 nil )
-                (!pair  "x_flag_tree_fre"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3870)
-                 nil )
-                (!pair  "x_flag_tree_loop_distribute_patterns"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3871)
-                 nil )
-                (!pair  "x_flag_tree_loop_distribution"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3872)
-                 nil )
-                (!pair  "x_flag_tree_loop_if_convert"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3873)
-                 nil )
-                (!pair  "x_flag_tree_loop_if_convert_stores"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3874)
-                 nil )
-                (!pair  "x_flag_tree_loop_im"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3875)
-                 nil )
-                (!pair  "x_flag_tree_loop_ivcanon"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3876)
-                 nil )
-                (!pair  "x_flag_tree_loop_optimize"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3877)
-                 nil )
-                (!pair  "x_flag_tree_loop_vectorize"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3878)
-                 nil )
-                (!pair  "x_flag_tree_live_range_split"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3879)
-                 nil )
-                (!pair  "x_flag_tree_partial_pre"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3880)
-                 nil )
-                (!pair  "x_flag_tree_phiprop"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3881)
-                 nil )
-                (!pair  "x_flag_tree_pre"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3882)
-                 nil )
-                (!pair  "x_flag_tree_pta"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3883)
-                 nil )
-                (!pair  "x_flag_tree_reassoc"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3884)
-                 nil )
-                (!pair  "x_flag_tree_scev_cprop"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3885)
-                 nil )
-                (!pair  "x_flag_tree_sink"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3886)
-                 nil )
-                (!pair  "x_flag_tree_slp_vectorize"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3887)
-                 nil )
-                (!pair  "x_flag_tree_slsr"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3888)
-                 nil )
-                (!pair  "x_flag_tree_sra"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3889)
-                 nil )
-                (!pair  "x_flag_tree_switch_conversion"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3890)
-                 nil )
-                (!pair  "x_flag_tree_tail_merge"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3891)
-                 nil )
-                (!pair  "x_flag_tree_ter"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3892)
-                 nil )
-                (!pair  "x_flag_tree_vectorize"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3893)
-                 nil )
-                (!pair  "x_flag_tree_vrp"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3894)
-                 nil )
-                (!pair  "x_flag_unit_at_a_time"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3895)
-                 nil )
-                (!pair  "x_flag_unroll_all_loops"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3896)
-                 nil )
-                (!pair  "x_flag_unroll_loops"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3897)
-                 nil )
-                (!pair  "x_flag_unsafe_loop_optimizations"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3898)
-                 nil )
-                (!pair  "x_flag_unsafe_math_optimizations"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3899)
-                 nil )
-                (!pair  "x_flag_unswitch_loops"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3900)
-                 nil )
-                (!pair  "x_flag_unwind_tables"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3901)
-                 nil )
-                (!pair  "x_flag_var_tracking"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3902)
-                 nil )
-                (!pair  "x_flag_var_tracking_assignments"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3903)
-                 nil )
-                (!pair  "x_flag_var_tracking_assignments_toggle"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3904)
-                 nil )
-                (!pair  "x_flag_var_tracking_uninit"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3905)
-                 nil )
-                (!pair  "x_flag_variable_expansion_in_unroller"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3906)
-                 nil )
-                (!pair  "x_flag_value_profile_transformations"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3907)
-                 nil )
-                (!pair  "x_flag_web"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3908)
-                 nil )
-                (!pair  "x_flag_whole_program"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3909)
-                 nil )
-                (!pair  "x_flag_wrapv"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3910)
-                 nil )
-               )
-               nil 511 nil nil )
-              (!srcfileloc  "tree-core.h" 1557)
-              nil )
-             (!pair  "optabs"
-              (!type already_seen 10)
-              (!srcfileloc  "tree-core.h" 1561)
-              (!options 
-               (!option atomic string  "")
-              )
-             )
-             (!pair  "base_optabs"
-              (!type pointer 524 nil  gc_unused
-               (!type struct 525 
-                (!type already_seen 524)
-                gc_unused "target_optabs"nil 
-                (!fields 0 )
-                nil 0 nil nil )
-              )
-              (!srcfileloc  "tree-core.h" 1565)
-              (!options 
-               (!option skip string  "")
-              )
-             )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1629)
-           (!options 
-            (!option tag string  "TS_OPTIMIZATION")
-           )
-          )
-          (!pair  "target_option"
-           (!type struct 526 nil  gc_used "tree_target_option"
-            (!srcfileloc  "tree-core.h" 1582)
-            (!fields 3 
-             (!pair  "common"
-              (!type already_seen 15)
-              (!srcfileloc  "tree-core.h" 1575)
-              nil )
-             (!pair  "globals"
-              (!type pointer 527 nil  gc_used
-               (!type struct 528 
-                (!type already_seen 527)
-                gc_pointed_to "target_globals"
-                (!srcfileloc  "target-globals.h" 59)
-                (!fields 16 
-                 (!pair  "flag_state"
-                  (!type pointer 529 nil  gc_unused
-                   (!type struct 530 
-                    (!type already_seen 529)
-                    gc_unused "target_flag_state"nil 
-                    (!fields 0 )
-                    nil 0 nil nil )
-                  )
-                  (!srcfileloc  "target-globals.h" 43)
-                  (!options 
-                   (!option skip string  "")
-                  )
-                 )
-                 (!pair  "regs"
-                  (!type already_seen 10)
-                  (!srcfileloc  "target-globals.h" 44)
-                  (!options 
-                   (!option atomic string  "")
-                  )
-                 )
-                 (!pair  "rtl"
-                  (!type pointer 531 nil  gc_used
-                   (!type struct 532 
-                    (!type already_seen 531)
-                    gc_pointed_to "target_rtl"
-                    (!srcfileloc  "rtl.h" 2305)
-                    (!fields 7 
-                     (!pair  "x_global_rtl"
-                      (!type array 533 nil  gc_used "GR_MAX" 
-                       (!type already_seen 136)
-                      )
-                      (!srcfileloc  "rtl.h" 2280)
-                      nil )
-                     (!pair  "x_pic_offset_table_rtx"
-                      (!type already_seen 136)
-                      (!srcfileloc  "rtl.h" 2283)
-                      nil )
-                     (!pair  "x_return_address_pointer_rtx"
-                      (!type already_seen 136)
-                      (!srcfileloc  "rtl.h" 2288)
-                      nil )
-                     (!pair  "x_initial_regno_reg_rtx"
-                      (!type array 534 nil  gc_used "FIRST_PSEUDO_REGISTER" 
-                       (!type already_seen 136)
-                      )
-                      (!srcfileloc  "rtl.h" 2294)
-                      nil )
-                     (!pair  "x_top_of_stack"
-                      (!type array 535 nil  gc_used "MAX_MACHINE_MODE" 
-                       (!type already_seen 136)
-                      )
-                      (!srcfileloc  "rtl.h" 2297)
-                      nil )
-                     (!pair  "x_static_reg_base_value"
-                      (!type array 536 nil  gc_used "FIRST_PSEUDO_REGISTER" 
-                       (!type already_seen 136)
-                      )
-                      (!srcfileloc  "rtl.h" 2301)
-                      nil )
-                     (!pair  "x_mode_mem_attrs"
-                      (!type array 537 nil  gc_used "(int) MAX_MACHINE_MODE" 
-                       (!type already_seen 258)
-                      )
-                      (!srcfileloc  "rtl.h" 2304)
-                      nil )
-                    )
-                    nil 511 nil nil )
-                  )
-                  (!srcfileloc  "target-globals.h" 45)
-                  nil )
-                 (!pair  "hard_regs"
-                  (!type already_seen 10)
-                  (!srcfileloc  "target-globals.h" 46)
-                  (!options 
-                   (!option atomic string  "")
-                  )
-                 )
-                 (!pair  "reload"
-                  (!type already_seen 10)
-                  (!srcfileloc  "target-globals.h" 47)
-                  (!options 
-                   (!option atomic string  "")
-                  )
-                 )
-                 (!pair  "expmed"
-                  (!type already_seen 10)
-                  (!srcfileloc  "target-globals.h" 48)
-                  (!options 
-                   (!option atomic string  "")
-                  )
-                 )
-                 (!pair  "optabs"
-                  (!type already_seen 524)
-                  (!srcfileloc  "target-globals.h" 49)
-                  (!options 
-                   (!option skip string  "")
-                  )
-                 )
-                 (!pair  "libfuncs"
-                  (!type pointer 538 nil  gc_used
-                   (!type struct 539 
-                    (!type already_seen 538)
-                    gc_pointed_to "target_libfuncs"
-                    (!srcfileloc  "libfuncs.h" 71)
-                    (!fields 2 
-                     (!pair  "x_libfunc_table"
-                      (!type array 540 nil  gc_used "LTI_MAX" 
-                       (!type already_seen 136)
-                      )
-                      (!srcfileloc  "libfuncs.h" 67)
-                      nil )
-                     (!pair  "x_libfunc_hash"
-                      (!type pointer 541 nil  gc_used
-                       (!type param_struct 542 
-                        (!type already_seen 541)
-                        gc_pointed_to
-                        (!type already_seen 49)
-                        
-                        (!type pointer 543 nil  gc_used
-                         (!type struct 544 
-                          (!type already_seen 543)
-                          gc_pointed_to "libfunc_entry"
-                          (!srcfileloc  "libfuncs.h" 61)
-                          (!fields 4 
-                           (!pair  "op"
-                            (!type already_seen 9)
-                            (!srcfileloc  "libfuncs.h" 59)
-                            nil )
-                           (!pair  "mode1"
-                            (!type already_seen 9)
-                            (!srcfileloc  "libfuncs.h" 59)
-                            nil )
-                           (!pair  "mode2"
-                            (!type already_seen 9)
-                            (!srcfileloc  "libfuncs.h" 59)
-                            nil )
-                           (!pair  "libfunc"
-                            (!type already_seen 136)
-                            (!srcfileloc  "libfuncs.h" 60)
-                            nil )
-                          )
-                          nil 511 nil nil )
-                        )
-                        nil nil nil nil nil nil nil nil nil nil )
-                      )
-                      (!srcfileloc  "libfuncs.h" 70)
-                      (!options 
-                       (!option param_is type 
-                        (!type already_seen 544)
-                       )
-                      )
-                     )
-                    )
-                    nil 511 nil nil )
-                  )
-                  (!srcfileloc  "target-globals.h" 50)
-                  nil )
-                 (!pair  "cfgloop"
-                  (!type pointer 545 nil  gc_unused
-                   (!type struct 546 
-                    (!type already_seen 545)
-                    gc_unused "target_cfgloop"nil 
-                    (!fields 0 )
-                    nil 0 nil nil )
-                  )
-                  (!srcfileloc  "target-globals.h" 51)
-                  (!options 
-                   (!option skip string  "")
-                  )
-                 )
-                 (!pair  "ira"
-                  (!type already_seen 10)
-                  (!srcfileloc  "target-globals.h" 52)
-                  (!options 
-                   (!option atomic string  "")
-                  )
-                 )
-                 (!pair  "ira_int"
-                  (!type already_seen 10)
-                  (!srcfileloc  "target-globals.h" 53)
-                  (!options 
-                   (!option atomic string  "")
-                  )
-                 )
-                 (!pair  "lra_int"
-                  (!type already_seen 10)
-                  (!srcfileloc  "target-globals.h" 54)
-                  (!options 
-                   (!option atomic string  "")
-                  )
-                 )
-                 (!pair  "builtins"
-                  (!type pointer 547 nil  gc_unused
-                   (!type struct 548 
-                    (!type already_seen 547)
-                    gc_unused "target_builtins"nil 
-                    (!fields 0 )
-                    nil 0 nil nil )
-                  )
-                  (!srcfileloc  "target-globals.h" 55)
-                  (!options 
-                   (!option skip string  "")
-                  )
-                 )
-                 (!pair  "gcse"
-                  (!type pointer 549 nil  gc_unused
-                   (!type struct 550 
-                    (!type already_seen 549)
-                    gc_unused "target_gcse"nil 
-                    (!fields 0 )
-                    nil 0 nil nil )
-                  )
-                  (!srcfileloc  "target-globals.h" 56)
-                  (!options 
-                   (!option skip string  "")
-                  )
-                 )
-                 (!pair  "bb_reorder"
-                  (!type pointer 551 nil  gc_unused
-                   (!type struct 552 
-                    (!type already_seen 551)
-                    gc_unused "target_bb_reorder"nil 
-                    (!fields 0 )
-                    nil 0 nil nil )
-                  )
-                  (!srcfileloc  "target-globals.h" 57)
-                  (!options 
-                   (!option skip string  "")
-                  )
-                 )
-                 (!pair  "lower_subreg"
-                  (!type pointer 553 nil  gc_unused
-                   (!type struct 554 
-                    (!type already_seen 553)
-                    gc_unused "target_lower_subreg"nil 
-                    (!fields 0 )
-                    nil 0 nil nil )
-                  )
-                  (!srcfileloc  "target-globals.h" 58)
-                  (!options 
-                   (!option skip string  "")
-                  )
-                 )
-                )
-                nil 511 nil nil )
-              )
-              (!srcfileloc  "tree-core.h" 1578)
-              nil )
-             (!pair  "opts"
-              (!type struct 555 nil  gc_used "cl_target_option"
-               (!fileloc  "options.h" 3917)
-               (!fields 1 
-                (!pair  "x_arm_lra_flag"
-                 (!type already_seen 9)
-                 (!fileloc  "options.h" 3916)
-                 nil )
-               )
-               nil 511 nil nil )
-              (!srcfileloc  "tree-core.h" 1581)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "tree-core.h" 1630)
-           (!options 
-            (!option tag string  "TS_TARGET_OPTION")
-           )
-          )
-         )
-         (!options 
-          (!option variable_size string  "")
-          (!option desc string  "tree_node_structure (&%h)")
-          (!option ptr_alias type 
-           (!type lang_struct 556 nil  gc_pointed_to "lang_tree_node"
-            (!srcfileloc  "ada/gcc-interface/ada-tree.h" 33)
-            (!fields 0 )
-            (!options 
-             (!option chain_next string  "CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_COMMON) ? ((union lang_tree_node *) TREE_CHAIN (&%h.generic)) : NULL")
-             (!option desc string  "0")
-            )
-            511 
-            (!homotypes 7
-             (!type union 557 nil  gc_pointed_to "lang_tree_node"
-              (!srcfileloc  "lto/lto-tree.h" 56)
-              (!fields 1 
-               (!pair  "generic"
-                (!type already_seen 7)
-                (!srcfileloc  "lto/lto-tree.h" 55)
-                (!options 
-                 (!option desc string  "tree_node_structure (&%h)")
-                 (!option tag string  "TS_LTO_GENERIC")
-                )
-               )
-              )
-              (!options 
-               (!option chain_next string  "CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_TYPE_COMMON) ? ((union lang_tree_node *) %h.generic.type_common.next_variant) : CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_COMMON) ? ((union lang_tree_node *) %h.generic.common.chain) : NULL")
-               (!option desc string  "lto_tree_node_structure (&%h)")
-              )
-              64 
-              (!type already_seen 556)
-             )
-             
-             (!type union 558 nil  gc_pointed_to "lang_tree_node"
-              (!srcfileloc  "java/java-tree.h" 596)
-              (!fields 2 
-               (!pair  "generic"
-                (!type already_seen 7)
-                (!srcfileloc  "java/java-tree.h" 594)
-                (!options 
-                 (!option desc string  "tree_node_structure (&%h)")
-                 (!option tag string  "0")
-                )
-               )
-               (!pair  "identifier"
-                (!type lang_struct 559 nil  gc_used "lang_identifier"
-                 (!srcfileloc  "c/c-decl.c" 242)
-                 (!fields 0 )
-                 nil 510 
-                 (!homotypes 6
-                  (!type struct 560 nil  gc_used "lang_identifier"
-                   (!srcfileloc  "lto/lto-tree.h" 29)
-                   (!fields 1 
-                    (!pair  "base"
-                     (!type already_seen 32)
-                     (!srcfileloc  "lto/lto-tree.h" 28)
-                     nil )
-                   )
-                   nil 64 
-                   (!type already_seen 559)
-                   nil )
-                  
-                  (!type struct 561 nil  gc_used "lang_identifier"
-                   (!srcfileloc  "java/java-tree.h" 585)
-                   (!fields 4 
-                    (!pair  "ignore"
-                     (!type already_seen 32)
-                     (!srcfileloc  "java/java-tree.h" 578)
-                     nil )
-                    (!pair  "global_value"
-                     (!type already_seen 5)
-                     (!srcfileloc  "java/java-tree.h" 579)
-                     nil )
-                    (!pair  "local_value"
-                     (!type already_seen 5)
-                     (!srcfileloc  "java/java-tree.h" 580)
-                     nil )
-                    (!pair  "utf8_ref"
-                     (!type already_seen 5)
-                     (!srcfileloc  "java/java-tree.h" 584)
-                     nil )
-                   )
-                   nil 32 
-                   (!type already_seen 559)
-                   nil )
-                  
-                  (!type struct 562 nil  gc_used "lang_identifier"
-                   (!srcfileloc  "go/go-lang.c" 65)
-                   (!fields 1 
-                    (!pair  "common"
-                     (!type already_seen 32)
-                     (!srcfileloc  "go/go-lang.c" 64)
-                     nil )
-                   )
-                   nil 16 
-                   (!type already_seen 559)
-                   nil )
-                  
-                  (!type struct 563 nil  gc_used "lang_identifier"
-                   (!srcfileloc  "fortran/f95-lang.c" 55)
-                   (!fields 1 
-                    (!pair  "common"
-                     (!type already_seen 32)
-                     (!srcfileloc  "fortran/f95-lang.c" 54)
-                     nil )
-                   )
-                   nil 8 
-                   (!type already_seen 559)
-                   nil )
-                  
-                  (!type struct 564 nil  gc_used "lang_identifier"
-                   (!srcfileloc  "cp/cp-tree.h" 253)
-                   (!fields 5 
-                    (!pair  "c_common"
-                     (!type struct 565 nil  gc_used "c_common_identifier"
-                      (!srcfileloc  "c-family/c-common.h" 319)
-                      (!fields 2 
-                       (!pair  "common"
-                        (!type already_seen 15)
-                        (!srcfileloc  "c-family/c-common.h" 317)
-                        nil )
-                       (!pair  "node"
-                        (!type struct 566 
-                         (!type pointer 567 
-                          (!type pointer 568 nil  gc_unused
-                           (!type already_seen 567)
-                          )
-                          gc_unused
-                          (!type already_seen 566)
-                         )
-                         gc_used "cpp_hashnode"
-                         (!srcfileloc  "../libcpp/include/cpplib.h" 710)
-                         (!fields 7 
-                          (!pair  "ident"
-                           (!type already_seen 33)
-                           (!srcfileloc  "../libcpp/include/cpplib.h" 700)
-                           nil )
-                          (!pair  "is_directive"
-                           (!type already_seen 9)
-                           (!srcfileloc  "../libcpp/include/cpplib.h" 701)
-                           nil )
-                          (!pair  "directive_index"
-                           (!type already_seen 9)
-                           (!srcfileloc  "../libcpp/include/cpplib.h" 702)
-                           nil )
-                          (!pair  "rid_code"
-                           (!type already_seen 28)
-                           (!srcfileloc  "../libcpp/include/cpplib.h" 705)
-                           nil )
-                          (!pair  "type"
-                           (!type already_seen 9)
-                           (!srcfileloc  "../libcpp/include/cpplib.h" 706)
-                           nil )
-                          (!pair  "flags"
-                           (!type already_seen 9)
-                           (!srcfileloc  "../libcpp/include/cpplib.h" 707)
-                           nil )
-                          (!pair  "value"
-                           (!type union 569 nil  gc_used "_cpp_hashnode_value"
-                            (!srcfileloc  "../libcpp/include/cpplib.h" 697)
-                            (!fields 4 
-                             (!pair  "macro"
-                              (!type pointer 570 nil  gc_used
-                               (!type struct 571 
-                                (!type already_seen 570)
-                                gc_pointed_to "cpp_macro"
-                                (!srcfileloc  "../libcpp/include/cpp-id-data.h" 80)
-                                (!fields 11 
-                                 (!pair  "params"
-                                  (!type already_seen 568)
-                                  (!srcfileloc  "../libcpp/include/cpp-id-data.h" 41)
-                                  (!options 
-                                   (!option length string  "%h.paramc")
-                                   (!option nested_ptr nested 
-                                    (!type already_seen 7)
-                                    "%h ? HT_IDENT_TO_GCC_IDENT (HT_NODE (%h)) : NULL" "%h ? CPP_HASHNODE (GCC_IDENT_TO_HT_IDENT (%h)) : NULL")
-                                  )
-                                 )
-                                 (!pair  "exp"
-                                  (!type union 572 nil  gc_used "cpp_macro_u"
-                                   (!srcfileloc  "../libcpp/include/cpp-id-data.h" 50)
-                                   (!fields 2 
-                                    (!pair  "tokens"
-                                     (!type pointer 573 nil  gc_used
-                                      (!type struct 574 
-                                       (!type already_seen 573)
-                                       gc_pointed_to "cpp_token"
-                                       (!srcfileloc  "../libcpp/include/cpplib.h" 248)
-                                       (!fields 4 
-                                        (!pair  "src_loc"
-                                         (!type already_seen 9)
-                                         (!srcfileloc  "../libcpp/include/cpplib.h" 223)
-                                         nil )
-                                        (!pair  "type"
-                                         (!type already_seen 9)
-                                         (!srcfileloc  "../libcpp/include/cpplib.h" 224)
-                                         nil )
-                                        (!pair  "flags"
-                                         (!type already_seen 9)
-                                         (!srcfileloc  "../libcpp/include/cpplib.h" 225)
-                                         nil )
-                                        (!pair  "val"
-                                         (!type union 575 nil  gc_used "cpp_token_u"
-                                          (!srcfileloc  "../libcpp/include/cpplib.h" 247)
-                                          (!fields 6 
-                                           (!pair  "node"
-                                            (!type struct 576 nil  gc_used "cpp_identifier"
-                                             (!srcfileloc  "../libcpp/include/cpplib.h" 218)
-                                             (!fields 1 
-                                              (!pair  "node"
-                                               (!type already_seen 567)
-                                               (!srcfileloc  "../libcpp/include/cpplib.h" 217)
-                                               (!options 
-                                                (!option nested_ptr nested 
-                                                 (!type already_seen 7)
-                                                 "%h ? HT_IDENT_TO_GCC_IDENT (HT_NODE (%h)) : NULL" "%h ? CPP_HASHNODE (GCC_IDENT_TO_HT_IDENT (%h)) : NULL")
-                                               )
-                                              )
-                                             )
-                                             nil 511 nil nil )
-                                            (!srcfileloc  "../libcpp/include/cpplib.h" 230)
-                                            (!options 
-                                             (!option tag string  "CPP_TOKEN_FLD_NODE")
-                                            )
-                                           )
-                                           (!pair  "source"
-                                            (!type already_seen 573)
-                                            (!srcfileloc  "../libcpp/include/cpplib.h" 233)
-                                            (!options 
-                                             (!option tag string  "CPP_TOKEN_FLD_SOURCE")
-                                            )
-                                           )
-                                           (!pair  "str"
-                                            (!type struct 577 nil  gc_used "cpp_string"
-                                             (!srcfileloc  "../libcpp/include/cpplib.h" 175)
-                                             (!fields 2 
-                                              (!pair  "len"
-                                               (!type already_seen 9)
-                                               (!srcfileloc  "../libcpp/include/cpplib.h" 173)
-                                               nil )
-                                              (!pair  "text"
-                                               (!type already_seen 36)
-                                               (!srcfileloc  "../libcpp/include/cpplib.h" 174)
-                                               nil )
-                                             )
-                                             nil 511 nil nil )
-                                            (!srcfileloc  "../libcpp/include/cpplib.h" 236)
-                                            (!options 
-                                             (!option tag string  "CPP_TOKEN_FLD_STR")
-                                            )
-                                           )
-                                           (!pair  "macro_arg"
-                                            (!type struct 578 nil  gc_used "cpp_macro_arg"
-                                             (!srcfileloc  "../libcpp/include/cpplib.h" 208)
-                                             (!fields 1 
-                                              (!pair  "arg_no"
-                                               (!type already_seen 9)
-                                               (!srcfileloc  "../libcpp/include/cpplib.h" 207)
-                                               nil )
-                                             )
-                                             nil 511 nil nil )
-                                            (!srcfileloc  "../libcpp/include/cpplib.h" 239)
-                                            (!options 
-                                             (!option tag string  "CPP_TOKEN_FLD_ARG_NO")
-                                            )
-                                           )
-                                           (!pair  "token_no"
-                                            (!type already_seen 9)
-                                            (!srcfileloc  "../libcpp/include/cpplib.h" 243)
-                                            (!options 
-                                             (!option tag string  "CPP_TOKEN_FLD_TOKEN_NO")
-                                            )
-                                           )
-                                           (!pair  "pragma"
-                                            (!type already_seen 9)
-                                            (!srcfileloc  "../libcpp/include/cpplib.h" 246)
-                                            (!options 
-                                             (!option tag string  "CPP_TOKEN_FLD_PRAGMA")
-                                            )
-                                           )
-                                          )
-                                          nil 511 nil )
-                                         (!srcfileloc  "../libcpp/include/cpplib.h" 247)
-                                         (!options 
-                                          (!option desc string  "cpp_token_val_index (&%1)")
-                                         )
-                                        )
-                                       )
-                                       nil 511 nil nil )
-                                     )
-                                     (!srcfileloc  "../libcpp/include/cpp-id-data.h" 48)
-                                     (!options 
-                                      (!option length string  "%0.count")
-                                      (!option tag string  "0")
-                                     )
-                                    )
-                                    (!pair  "text"
-                                     (!type already_seen 36)
-                                     (!srcfileloc  "../libcpp/include/cpp-id-data.h" 49)
-                                     (!options 
-                                      (!option tag string  "1")
-                                     )
-                                    )
-                                   )
-                                   nil 511 nil )
-                                  (!srcfileloc  "../libcpp/include/cpp-id-data.h" 50)
-                                  (!options 
-                                   (!option desc string  "%1.traditional")
-                                  )
-                                 )
-                                 (!pair  "line"
-                                  (!type already_seen 9)
-                                  (!srcfileloc  "../libcpp/include/cpp-id-data.h" 53)
-                                  nil )
-                                 (!pair  "count"
-                                  (!type already_seen 9)
-                                  (!srcfileloc  "../libcpp/include/cpp-id-data.h" 56)
-                                  nil )
-                                 (!pair  "paramc"
-                                  (!type already_seen 9)
-                                  (!srcfileloc  "../libcpp/include/cpp-id-data.h" 59)
-                                  nil )
-                                 (!pair  "fun_like"
-                                  (!type already_seen 9)
-                                  (!srcfileloc  "../libcpp/include/cpp-id-data.h" 62)
-                                  nil )
-                                 (!pair  "variadic"
-                                  (!type already_seen 9)
-                                  (!srcfileloc  "../libcpp/include/cpp-id-data.h" 65)
-                                  nil )
-                                 (!pair  "syshdr"
-                                  (!type already_seen 9)
-                                  (!srcfileloc  "../libcpp/include/cpp-id-data.h" 68)
-                                  nil )
-                                 (!pair  "used"
-                                  (!type already_seen 9)
-                                  (!srcfileloc  "../libcpp/include/cpp-id-data.h" 71)
-                                  nil )
-                                 (!pair  "traditional"
-                                  (!type already_seen 9)
-                                  (!srcfileloc  "../libcpp/include/cpp-id-data.h" 74)
-                                  nil )
-                                 (!pair  "extra_tokens"
-                                  (!type already_seen 9)
-                                  (!srcfileloc  "../libcpp/include/cpp-id-data.h" 79)
-                                  nil )
-                                )
-                                nil 511 nil nil )
-                              )
-                              (!srcfileloc  "../libcpp/include/cpplib.h" 690)
-                              (!options 
-                               (!option tag string  "NTV_MACRO")
-                              )
-                             )
-                             (!pair  "answers"
-                              (!type pointer 579 nil  gc_used
-                               (!type struct 580 
-                                (!type already_seen 579)
-                                gc_pointed_to "answer"
-                                (!srcfileloc  "../libcpp/include/cpp-id-data.h" 31)
-                                (!fields 3 
-                                 (!pair  "next"
-                                  (!type already_seen 579)
-                                  (!srcfileloc  "../libcpp/include/cpp-id-data.h" 28)
-                                  nil )
-                                 (!pair  "count"
-                                  (!type already_seen 9)
-                                  (!srcfileloc  "../libcpp/include/cpp-id-data.h" 29)
-                                  nil )
-                                 (!pair  "first"
-                                  (!type array 581 nil  gc_used "1" 
-                                   (!type already_seen 574)
-                                  )
-                                  (!srcfileloc  "../libcpp/include/cpp-id-data.h" 30)
-                                  (!options 
-                                   (!option length string  "%h.count")
-                                  )
-                                 )
-                                )
-                                nil 511 nil nil )
-                              )
-                              (!srcfileloc  "../libcpp/include/cpplib.h" 692)
-                              (!options 
-                               (!option tag string  "NTV_ANSWER")
-                              )
-                             )
-                             (!pair  "builtin"
-                              (!type already_seen 9)
-                              (!srcfileloc  "../libcpp/include/cpplib.h" 694)
-                              (!options 
-                               (!option tag string  "NTV_BUILTIN")
-                              )
-                             )
-                             (!pair  "arg_index"
-                              (!type already_seen 9)
-                              (!srcfileloc  "../libcpp/include/cpplib.h" 696)
-                              (!options 
-                               (!option tag string  "NTV_ARGUMENT")
-                              )
-                             )
-                            )
-                            nil 511 nil )
-                           (!srcfileloc  "../libcpp/include/cpplib.h" 709)
-                           (!options 
-                            (!option desc string  "CPP_HASHNODE_VALUE_IDX (%1)")
-                           )
-                          )
-                         )
-                         nil 511 nil nil )
-                        (!srcfileloc  "c-family/c-common.h" 318)
-                        nil )
-                      )
-                      nil 390 nil nil )
-                     (!srcfileloc  "cp/cp-tree.h" 248)
-                     nil )
-                    (!pair  "namespace_bindings"
-                     (!type already_seen 99)
-                     (!srcfileloc  "cp/cp-tree.h" 249)
-                     nil )
-                    (!pair  "bindings"
-                     (!type already_seen 99)
-                     (!srcfileloc  "cp/cp-tree.h" 250)
-                     nil )
-                    (!pair  "class_template_info"
-                     (!type already_seen 5)
-                     (!srcfileloc  "cp/cp-tree.h" 251)
-                     nil )
-                    (!pair  "label_value"
-                     (!type already_seen 5)
-                     (!srcfileloc  "cp/cp-tree.h" 252)
-                     nil )
-                   )
-                   nil 260 
-                   (!type already_seen 559)
-                   nil )
-                  
-                  (!type struct 582 nil  gc_used "lang_identifier"
-                   (!srcfileloc  "c/c-decl.c" 242)
-                   (!fields 4 
-                    (!pair  "common_id"
-                     (!type already_seen 565)
-                     (!srcfileloc  "c/c-decl.c" 238)
-                     nil )
-                    (!pair  "symbol_binding"
-                     (!type pointer 583 nil  gc_used
-                      (!type struct 584 
-                       (!type already_seen 583)
-                       gc_pointed_to "c_binding"
-                       (!srcfileloc  "c/c-decl.c" 212)
-                       (!fields 11 
-                        (!pair  "u"
-                         (!type union 585 nil  gc_used "anonymous:../../gcc/c/c-decl.c:198"
-                          (!srcfileloc  "c/c-decl.c" 201)
-                          (!fields 2 
-                           (!pair  "type"
-                            (!type already_seen 5)
-                            (!srcfileloc  "c/c-decl.c" 199)
-                            (!options 
-                             (!option tag string  "0")
-                            )
-                           )
-                           (!pair  "label"
-                            (!type pointer 586 nil  gc_used
-                             (!type struct 587 
-                              (!type already_seen 586)
-                              gc_pointed_to "c_label_vars"
-                              (!srcfileloc  "c/c-decl.c" 316)
-                              (!fields 4 
-                               (!pair  "shadowed"
-                                (!type already_seen 586)
-                                (!srcfileloc  "c/c-decl.c" 304)
-                                nil )
-                               (!pair  "label_bindings"
-                                (!type struct 588 nil  gc_used "c_spot_bindings"
-                                 (!srcfileloc  "c/c-decl.c" 283)
-                                 (!fields 4 
-                                  (!pair  "scope"
-                                   (!type pointer 589 nil  gc_used
-                                    (!type struct 590 
-                                     (!type already_seen 589)
-                                     gc_pointed_to "c_scope"
-                                     (!srcfileloc  "c/c-decl.c" 418)
-                                     (!fields 14 
-                                      (!pair  "outer"
-                                       (!type already_seen 589)
-                                       (!srcfileloc  "c/c-decl.c" 365)
-                                       nil )
-                                      (!pair  "outer_function"
-                                       (!type already_seen 589)
-                                       (!srcfileloc  "c/c-decl.c" 368)
-                                       nil )
-                                      (!pair  "bindings"
-                                       (!type already_seen 583)
-                                       (!srcfileloc  "c/c-decl.c" 371)
-                                       nil )
-                                      (!pair  "blocks"
-                                       (!type already_seen 5)
-                                       (!srcfileloc  "c/c-decl.c" 375)
-                                       nil )
-                                      (!pair  "blocks_last"
-                                       (!type already_seen 5)
-                                       (!srcfileloc  "c/c-decl.c" 376)
-                                       nil )
-                                      (!pair  "depth"
-                                       (!type already_seen 9)
-                                       (!srcfileloc  "c/c-decl.c" 380)
-                                       nil )
-                                      (!pair  "parm_flag"
-                                       (!type already_seen 9)
-                                       (!srcfileloc  "c/c-decl.c" 384)
-                                       nil )
-                                      (!pair  "had_vla_unspec"
-                                       (!type already_seen 9)
-                                       (!srcfileloc  "c/c-decl.c" 388)
-                                       nil )
-                                      (!pair  "warned_forward_parm_decls"
-                                       (!type already_seen 9)
-                                       (!srcfileloc  "c/c-decl.c" 393)
-                                       nil )
-                                      (!pair  "function_body"
-                                       (!type already_seen 9)
-                                       (!srcfileloc  "c/c-decl.c" 399)
-                                       nil )
-                                      (!pair  "keep"
-                                       (!type already_seen 9)
-                                       (!srcfileloc  "c/c-decl.c" 402)
-                                       nil )
-                                      (!pair  "float_const_decimal64"
-                                       (!type already_seen 9)
-                                       (!srcfileloc  "c/c-decl.c" 405)
-                                       nil )
-                                      (!pair  "has_label_bindings"
-                                       (!type already_seen 9)
-                                       (!srcfileloc  "c/c-decl.c" 410)
-                                       nil )
-                                      (!pair  "has_jump_unsafe_decl"
-                                       (!type already_seen 9)
-                                       (!srcfileloc  "c/c-decl.c" 417)
-                                       nil )
-                                     )
-                                     (!options 
-                                      (!option chain_next string  "%h.outer")
-                                     )
-                                     130 nil nil )
-                                   )
-                                   (!srcfileloc  "c/c-decl.c" 268)
-                                   nil )
-                                  (!pair  "bindings_in_scope"
-                                   (!type already_seen 583)
-                                   (!srcfileloc  "c/c-decl.c" 272)
-                                   nil )
-                                  (!pair  "stmt_exprs"
-                                   (!type already_seen 9)
-                                   (!srcfileloc  "c/c-decl.c" 279)
-                                   nil )
-                                  (!pair  "left_stmt_expr"
-                                   (!type already_seen 9)
-                                   (!srcfileloc  "c/c-decl.c" 282)
-                                   nil )
-                                 )
-                                 nil 130 nil nil )
-                                (!srcfileloc  "c/c-decl.c" 306)
-                                nil )
-                               (!pair  "decls_in_scope"
-                                (!type already_seen 45)
-                                (!srcfileloc  "c/c-decl.c" 311)
-                                nil )
-                               (!pair  "gotos"
-                                (!type pointer 591 nil  gc_used
-                                 (!type user_struct 592 
-                                  (!type already_seen 591)
-                                  gc_pointed_to "vec<c_goto_bindings_p,va_gc>"
-                                  (!srcfileloc  "c/c-decl.c" 315)
-                                  (!fields 2 
-                                   (!pair  "va_gc"
-                                    (!type already_seen 3)
-                                    (!srcfileloc  "c/c-decl.c" 315)
-                                    nil )
-                                   (!pair  "c_goto_bindings_p"
-                                    (!type pointer 593 nil  gc_used
-                                     (!type struct 594 
-                                      (!type already_seen 593)
-                                      gc_pointed_to "c_goto_bindings"
-                                      (!srcfileloc  "c/c-decl.c" 294)
-                                      (!fields 2 
-                                       (!pair  "loc"
-                                        (!type already_seen 9)
-                                        (!srcfileloc  "c/c-decl.c" 291)
-                                        nil )
-                                       (!pair  "goto_bindings"
-                                        (!type already_seen 588)
-                                        (!srcfileloc  "c/c-decl.c" 293)
-                                        nil )
-                                      )
-                                      nil 130 nil nil )
-                                    )
-                                    (!srcfileloc  "c/c-decl.c" 315)
-                                    nil )
-                                  )
-                                 )
-                                )
-                                (!srcfileloc  "c/c-decl.c" 315)
-                                nil )
-                              )
-                              nil 130 nil nil )
-                            )
-                            (!srcfileloc  "c/c-decl.c" 200)
-                            (!options 
-                             (!option tag string  "1")
-                            )
-                           )
-                          )
-                          nil 130 nil )
-                         (!srcfileloc  "c/c-decl.c" 201)
-                         (!options 
-                          (!option desc string  "TREE_CODE (%0.decl) == LABEL_DECL")
-                         )
-                        )
-                        (!pair  "decl"
-                         (!type already_seen 5)
-                         (!srcfileloc  "c/c-decl.c" 202)
-                         nil )
-                        (!pair  "id"
-                         (!type already_seen 5)
-                         (!srcfileloc  "c/c-decl.c" 203)
-                         nil )
-                        (!pair  "prev"
-                         (!type already_seen 583)
-                         (!srcfileloc  "c/c-decl.c" 204)
-                         nil )
-                        (!pair  "shadowed"
-                         (!type already_seen 583)
-                         (!srcfileloc  "c/c-decl.c" 205)
-                         nil )
-                        (!pair  "depth"
-                         (!type already_seen 9)
-                         (!srcfileloc  "c/c-decl.c" 206)
-                         nil )
-                        (!pair  "invisible"
-                         (!type already_seen 9)
-                         (!srcfileloc  "c/c-decl.c" 207)
-                         nil )
-                        (!pair  "nested"
-                         (!type already_seen 9)
-                         (!srcfileloc  "c/c-decl.c" 208)
-                         nil )
-                        (!pair  "inner_comp"
-                         (!type already_seen 9)
-                         (!srcfileloc  "c/c-decl.c" 209)
-                         nil )
-                        (!pair  "in_struct"
-                         (!type already_seen 9)
-                         (!srcfileloc  "c/c-decl.c" 210)
-                         nil )
-                        (!pair  "locus"
-                         (!type already_seen 9)
-                         (!srcfileloc  "c/c-decl.c" 211)
-                         nil )
-                       )
-                       (!options 
-                        (!option chain_next string  "%h.prev")
-                       )
-                       130 nil nil )
-                     )
-                     (!srcfileloc  "c/c-decl.c" 239)
-                     nil )
-                    (!pair  "tag_binding"
-                     (!type already_seen 583)
-                     (!srcfileloc  "c/c-decl.c" 240)
-                     nil )
-                    (!pair  "label_binding"
-                     (!type already_seen 583)
-                     (!srcfileloc  "c/c-decl.c" 241)
-                     nil )
-                   )
-                   nil 130 
-                   (!type already_seen 559)
-                   nil )
-                 )
-                )
-                (!srcfileloc  "java/java-tree.h" 595)
-                (!options 
-                 (!option tag string  "1")
-                )
-               )
-              )
-              (!options 
-               (!option chain_next string  "CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_COMMON) ? ((union lang_tree_node *) TREE_CHAIN (&%h.generic)) : NULL")
-               (!option desc string  "TREE_CODE (&%h.generic) == IDENTIFIER_NODE")
-              )
-              32 
-              (!type already_seen 556)
-             )
-             
-             (!type union 595 nil  gc_pointed_to "lang_tree_node"
-              (!srcfileloc  "go/go-lang.c" 76)
-              (!fields 2 
-               (!pair  "generic"
-                (!type already_seen 7)
-                (!srcfileloc  "go/go-lang.c" 74)
-                (!options 
-                 (!option desc string  "tree_node_structure (&%h)")
-                 (!option tag string  "0")
-                )
-               )
-               (!pair  "identifier"
-                (!type already_seen 559)
-                (!srcfileloc  "go/go-lang.c" 75)
-                (!options 
-                 (!option tag string  "1")
-                )
-               )
-              )
-              (!options 
-               (!option chain_next string  "CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_COMMON) ? ((union lang_tree_node *) TREE_CHAIN (&%h.generic)) : NULL")
-               (!option desc string  "TREE_CODE (&%h.generic) == IDENTIFIER_NODE")
-              )
-              16 
-              (!type already_seen 556)
-             )
-             
-             (!type union 596 nil  gc_pointed_to "lang_tree_node"
-              (!srcfileloc  "fortran/f95-lang.c" 65)
-              (!fields 2 
-               (!pair  "generic"
-                (!type already_seen 7)
-                (!srcfileloc  "fortran/f95-lang.c" 63)
-                (!options 
-                 (!option desc string  "tree_node_structure (&%h)")
-                 (!option tag string  "0")
-                )
-               )
-               (!pair  "identifier"
-                (!type already_seen 559)
-                (!srcfileloc  "fortran/f95-lang.c" 64)
-                (!options 
-                 (!option tag string  "1")
-                )
-               )
-              )
-              (!options 
-               (!option chain_next string  "CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_COMMON) ? ((union lang_tree_node *) TREE_CHAIN (&%h.generic)) : NULL")
-               (!option desc string  "TREE_CODE (&%h.generic) == IDENTIFIER_NODE")
-              )
-              8 
-              (!type already_seen 556)
-             )
-             
-             (!type union 597 nil  gc_pointed_to "lang_tree_node"
-              (!srcfileloc  "cp/cp-tree.h" 831)
-              (!fields 14 
-               (!pair  "generic"
-                (!type already_seen 7)
-                (!srcfileloc  "cp/cp-tree.h" 811)
-                (!options 
-                 (!option desc string  "tree_node_structure (&%h)")
-                 (!option tag string  "TS_CP_GENERIC")
-                )
-               )
-               (!pair  "tpi"
-                (!type struct 598 nil  gc_used "template_parm_index_s"
-                 (!srcfileloc  "cp/cp-tree.h" 280)
-                 (!fields 5 
-                  (!pair  "common"
-                   (!type already_seen 15)
-                   (!srcfileloc  "cp/cp-tree.h" 275)
-                   nil )
-                  (!pair  "index"
-                   (!type already_seen 9)
-                   (!srcfileloc  "cp/cp-tree.h" 276)
-                   nil )
-                  (!pair  "level"
-                   (!type already_seen 9)
-                   (!srcfileloc  "cp/cp-tree.h" 277)
-                   nil )
-                  (!pair  "orig_level"
-                   (!type already_seen 9)
-                   (!srcfileloc  "cp/cp-tree.h" 278)
-                   nil )
-                  (!pair  "decl"
-                   (!type already_seen 5)
-                   (!srcfileloc  "cp/cp-tree.h" 279)
-                   nil )
-                 )
-                 nil 260 nil nil )
-                (!srcfileloc  "cp/cp-tree.h" 812)
-                (!options 
-                 (!option tag string  "TS_CP_TPI")
-                )
-               )
-               (!pair  "ptrmem"
-                (!type struct 599 
-                 (!type pointer 600 nil  gc_unused
-                  (!type already_seen 599)
-                 )
-                 gc_used "ptrmem_cst"
-                 (!srcfileloc  "cp/cp-tree.h" 286)
-                 (!fields 2 
-                  (!pair  "common"
-                   (!type already_seen 15)
-                   (!srcfileloc  "cp/cp-tree.h" 284)
-                   nil )
-                  (!pair  "member"
-                   (!type already_seen 5)
-                   (!srcfileloc  "cp/cp-tree.h" 285)
-                   nil )
-                 )
-                 nil 260 nil nil )
-                (!srcfileloc  "cp/cp-tree.h" 813)
-                (!options 
-                 (!option tag string  "TS_CP_PTRMEM")
-                )
-               )
-               (!pair  "overload"
-                (!type struct 601 nil  gc_used "tree_overload"
-                 (!srcfileloc  "cp/cp-tree.h" 361)
-                 (!fields 2 
-                  (!pair  "common"
-                   (!type already_seen 15)
-                   (!srcfileloc  "cp/cp-tree.h" 359)
-                   nil )
-                  (!pair  "function"
-                   (!type already_seen 5)
-                   (!srcfileloc  "cp/cp-tree.h" 360)
-                   nil )
-                 )
-                 nil 260 nil nil )
-                (!srcfileloc  "cp/cp-tree.h" 814)
-                (!options 
-                 (!option tag string  "TS_CP_OVERLOAD")
-                )
-               )
-               (!pair  "baselink"
-                (!type struct 602 nil  gc_used "tree_baselink"
-                 (!srcfileloc  "cp/cp-tree.h" 395)
-                 (!fields 4 
-                  (!pair  "common"
-                   (!type already_seen 15)
-                   (!srcfileloc  "cp/cp-tree.h" 391)
-                   nil )
-                  (!pair  "binfo"
-                   (!type already_seen 5)
-                   (!srcfileloc  "cp/cp-tree.h" 392)
-                   nil )
-                  (!pair  "functions"
-                   (!type already_seen 5)
-                   (!srcfileloc  "cp/cp-tree.h" 393)
-                   nil )
-                  (!pair  "access_binfo"
-                   (!type already_seen 5)
-                   (!srcfileloc  "cp/cp-tree.h" 394)
-                   nil )
-                 )
-                 nil 260 nil nil )
-                (!srcfileloc  "cp/cp-tree.h" 815)
-                (!options 
-                 (!option tag string  "TS_CP_BASELINK")
-                )
-               )
-               (!pair  "default_arg"
-                (!type struct 603 nil  gc_used "tree_default_arg"
-                 (!srcfileloc  "cp/cp-tree.h" 573)
-                 (!fields 3 
-                  (!pair  "common"
-                   (!type already_seen 15)
-                   (!srcfileloc  "cp/cp-tree.h" 570)
-                   nil )
-                  (!pair  "tokens"
-                   (!type already_seen 64)
-                   (!srcfileloc  "cp/cp-tree.h" 571)
-                   nil )
-                  (!pair  "instantiations"
-                   (!type already_seen 45)
-                   (!srcfileloc  "cp/cp-tree.h" 572)
-                   nil )
-                 )
-                 nil 260 nil nil )
-                (!srcfileloc  "cp/cp-tree.h" 816)
-                (!options 
-                 (!option tag string  "TS_CP_DEFAULT_ARG")
-                )
-               )
-               (!pair  "deferred_noexcept"
-                (!type struct 604 nil  gc_used "tree_deferred_noexcept"
-                 (!srcfileloc  "cp/cp-tree.h" 589)
-                 (!fields 3 
-                  (!pair  "base"
-                   (!type already_seen 8)
-                   (!srcfileloc  "cp/cp-tree.h" 586)
-                   nil )
-                  (!pair  "pattern"
-                   (!type already_seen 5)
-                   (!srcfileloc  "cp/cp-tree.h" 587)
-                   nil )
-                  (!pair  "args"
-                   (!type already_seen 5)
-                   (!srcfileloc  "cp/cp-tree.h" 588)
-                   nil )
-                 )
-                 nil 260 nil nil )
-                (!srcfileloc  "cp/cp-tree.h" 817)
-                (!options 
-                 (!option tag string  "TS_CP_DEFERRED_NOEXCEPT")
-                )
-               )
-               (!pair  "identifier"
-                (!type already_seen 559)
-                (!srcfileloc  "cp/cp-tree.h" 818)
-                (!options 
-                 (!option tag string  "TS_CP_IDENTIFIER")
-                )
-               )
-               (!pair  "static_assertion"
-                (!type struct 605 nil  gc_used "tree_static_assert"
-                 (!srcfileloc  "cp/cp-tree.h" 612)
-                 (!fields 4 
-                  (!pair  "common"
-                   (!type already_seen 15)
-                   (!srcfileloc  "cp/cp-tree.h" 608)
-                   nil )
-                  (!pair  "condition"
-                   (!type already_seen 5)
-                   (!srcfileloc  "cp/cp-tree.h" 609)
-                   nil )
-                  (!pair  "message"
-                   (!type already_seen 5)
-                   (!srcfileloc  "cp/cp-tree.h" 610)
-                   nil )
-                  (!pair  "location"
-                   (!type already_seen 9)
-                   (!srcfileloc  "cp/cp-tree.h" 611)
-                   nil )
-                 )
-                 nil 260 nil nil )
-                (!srcfileloc  "cp/cp-tree.h" 820)
-                (!options 
-                 (!option tag string  "TS_CP_STATIC_ASSERT")
-                )
-               )
-               (!pair  "argument_pack_select"
-                (!type struct 606 nil  gc_used "tree_argument_pack_select"
-                 (!srcfileloc  "cp/cp-tree.h" 618)
-                 (!fields 3 
-                  (!pair  "common"
-                   (!type already_seen 15)
-                   (!srcfileloc  "cp/cp-tree.h" 615)
-                   nil )
-                  (!pair  "argument_pack"
-                   (!type already_seen 5)
-                   (!srcfileloc  "cp/cp-tree.h" 616)
-                   nil )
-                  (!pair  "index"
-                   (!type already_seen 9)
-                   (!srcfileloc  "cp/cp-tree.h" 617)
-                   nil )
-                 )
-                 nil 260 nil nil )
-                (!srcfileloc  "cp/cp-tree.h" 822)
-                (!options 
-                 (!option tag string  "TS_CP_ARGUMENT_PACK_SELECT")
-                )
-               )
-               (!pair  "trait_expression"
-                (!type struct 607 nil  gc_used "tree_trait_expr"
-                 (!srcfileloc  "cp/cp-tree.h" 666)
-                 (!fields 4 
-                  (!pair  "common"
-                   (!type already_seen 15)
-                   (!srcfileloc  "cp/cp-tree.h" 662)
-                   nil )
-                  (!pair  "type1"
-                   (!type already_seen 5)
-                   (!srcfileloc  "cp/cp-tree.h" 663)
-                   nil )
-                  (!pair  "type2"
-                   (!type already_seen 5)
-                   (!srcfileloc  "cp/cp-tree.h" 664)
-                   nil )
-                  (!pair  "kind"
-                   (!type already_seen 9)
-                   (!srcfileloc  "cp/cp-tree.h" 665)
-                   nil )
-                 )
-                 nil 260 nil nil )
-                (!srcfileloc  "cp/cp-tree.h" 824)
-                (!options 
-                 (!option tag string  "TS_CP_TRAIT_EXPR")
-                )
-               )
-               (!pair  "lambda_expression"
-                (!type struct 608 nil  gc_used "tree_lambda_expr"
-                 (!srcfileloc  "cp/cp-tree.h" 751)
-                 (!fields 10 
-                  (!pair  "typed"
-                   (!type already_seen 14)
-                   (!srcfileloc  "cp/cp-tree.h" 741)
-                   nil )
-                  (!pair  "capture_list"
-                   (!type already_seen 5)
-                   (!srcfileloc  "cp/cp-tree.h" 742)
-                   nil )
-                  (!pair  "this_capture"
-                   (!type already_seen 5)
-                   (!srcfileloc  "cp/cp-tree.h" 743)
-                   nil )
-                  (!pair  "return_type"
-                   (!type already_seen 5)
-                   (!srcfileloc  "cp/cp-tree.h" 744)
-                   nil )
-                  (!pair  "extra_scope"
-                   (!type already_seen 5)
-                   (!srcfileloc  "cp/cp-tree.h" 745)
-                   nil )
-                  (!pair  "closure"
-                   (!type already_seen 5)
-                   (!srcfileloc  "cp/cp-tree.h" 746)
-                   nil )
-                  (!pair  "pending_proxies"
-                   (!type already_seen 45)
-                   (!srcfileloc  "cp/cp-tree.h" 747)
-                   nil )
-                  (!pair  "locus"
-                   (!type already_seen 9)
-                   (!srcfileloc  "cp/cp-tree.h" 748)
-                   nil )
-                  (!pair  "default_capture_mode"
-                   (!type already_seen 9)
-                   (!srcfileloc  "cp/cp-tree.h" 749)
-                   nil )
-                  (!pair  "discriminator"
-                   (!type already_seen 9)
-                   (!srcfileloc  "cp/cp-tree.h" 750)
-                   nil )
-                 )
-                 nil 260 nil nil )
-                (!srcfileloc  "cp/cp-tree.h" 826)
-                (!options 
-                 (!option tag string  "TS_CP_LAMBDA_EXPR")
-                )
-               )
-               (!pair  "template_info"
-                (!type struct 609 nil  gc_used "tree_template_info"
-                 (!srcfileloc  "cp/cp-tree.h" 785)
-                 (!fields 2 
-                  (!pair  "common"
-                   (!type already_seen 15)
-                   (!srcfileloc  "cp/cp-tree.h" 783)
-                   nil )
-                  (!pair  "typedefs_needing_access_checking"
-                   (!type pointer 610 nil  gc_used
-                    (!type user_struct 611 
-                     (!type already_seen 610)
-                     gc_pointed_to "vec<qualified_typedef_usage_t,va_gc>"
-                     (!srcfileloc  "cp/cp-tree.h" 784)
-                     (!fields 2 
-                      (!pair  "va_gc"
-                       (!type already_seen 3)
-                       (!srcfileloc  "cp/cp-tree.h" 784)
-                       nil )
-                      (!pair  "qualified_typedef_usage_t"
-                       (!type struct 612 nil  gc_used "qualified_typedef_usage_s"
-                        (!srcfileloc  "cp/cp-tree.h" 771)
-                        (!fields 3 
-                         (!pair  "typedef_decl"
-                          (!type already_seen 5)
-                          (!srcfileloc  "cp/cp-tree.h" 768)
-                          nil )
-                         (!pair  "context"
-                          (!type already_seen 5)
-                          (!srcfileloc  "cp/cp-tree.h" 769)
-                          nil )
-                         (!pair  "locus"
-                          (!type already_seen 9)
-                          (!srcfileloc  "cp/cp-tree.h" 770)
-                          nil )
-                        )
-                        nil 260 nil nil )
-                       (!srcfileloc  "cp/cp-tree.h" 784)
-                       nil )
-                     )
-                    )
-                   )
-                   (!srcfileloc  "cp/cp-tree.h" 784)
-                   nil )
-                 )
-                 nil 260 nil nil )
-                (!srcfileloc  "cp/cp-tree.h" 828)
-                (!options 
-                 (!option tag string  "TS_CP_TEMPLATE_INFO")
-                )
-               )
-               (!pair  "userdef_literal"
-                (!type struct 613 nil  gc_used "tree_userdef_literal"
-                 (!srcfileloc  "c-family/c-common.h" 1268)
-                 (!fields 5 
-                  (!pair  "base"
-                   (!type already_seen 8)
-                   (!srcfileloc  "c-family/c-common.h" 1263)
-                   nil )
-                  (!pair  "suffix_id"
-                   (!type already_seen 5)
-                   (!srcfileloc  "c-family/c-common.h" 1264)
-                   nil )
-                  (!pair  "value"
-                   (!type already_seen 5)
-                   (!srcfileloc  "c-family/c-common.h" 1265)
-                   nil )
-                  (!pair  "num_string"
-                   (!type already_seen 5)
-                   (!srcfileloc  "c-family/c-common.h" 1266)
-                   nil )
-                  (!pair  "overflow"
-                   (!type already_seen 9)
-                   (!srcfileloc  "c-family/c-common.h" 1267)
-                   nil )
-                 )
-                 nil 390 nil nil )
-                (!srcfileloc  "cp/cp-tree.h" 830)
-                (!options 
-                 (!option tag string  "TS_CP_USERDEF_LITERAL")
-                )
-               )
-              )
-              (!options 
-               (!option chain_next string  "(union lang_tree_node *) c_tree_chain_next (&%h.generic)")
-               (!option desc string  "cp_tree_node_structure (&%h)")
-              )
-              260 
-              (!type already_seen 556)
-             )
-             
-             (!type union 614 nil  gc_pointed_to "lang_tree_node"
-              (!srcfileloc  "c/c-decl.c" 257)
-              (!fields 2 
-               (!pair  "generic"
-                (!type already_seen 7)
-                (!srcfileloc  "c/c-decl.c" 255)
-                (!options 
-                 (!option desc string  "tree_node_structure (&%h)")
-                 (!option tag string  "0")
-                )
-               )
-               (!pair  "identifier"
-                (!type already_seen 559)
-                (!srcfileloc  "c/c-decl.c" 256)
-                (!options 
-                 (!option tag string  "1")
-                )
-               )
-              )
-              (!options 
-               (!option chain_next string  "(union lang_tree_node *) c_tree_chain_next (&%h.generic)")
-               (!option desc string  "TREE_CODE (&%h.generic) == IDENTIFIER_NODE")
-              )
-              130 
-              (!type already_seen 556)
-             )
-             
-             (!type union 615 nil  gc_pointed_to "lang_tree_node"
-              (!srcfileloc  "ada/gcc-interface/ada-tree.h" 33)
-              (!fields 1 
-               (!pair  "generic"
-                (!type already_seen 7)
-                (!srcfileloc  "ada/gcc-interface/ada-tree.h" 32)
-                (!options 
-                 (!option desc string  "tree_node_structure (&%h)")
-                 (!option tag string  "0")
-                )
-               )
-              )
-              (!options 
-               (!option chain_next string  "CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_COMMON) ? ((union lang_tree_node *) TREE_CHAIN (&%h.generic)) : NULL")
-               (!option desc string  "0")
-              )
-              1 
-              (!type already_seen 556)
-             )
-            )
-           )
-          )
-         )
-         511 nil )
-       )
-       (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 2761)
-       nil )
-      (!pair  "offset"
-       (!type already_seen 5)
-       (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 2762)
-       nil )
-     )
-     nil 384 nil nil )
-    (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 2765)
-    nil )
-  )
- )
- 
- (!type already_seen 4)
- 
- (!type user_struct 616 
-  (!type pointer 617 nil  gc_used
-   (!type already_seen 616)
-  )
-  gc_pointed_to "vec<prot_list_entry,va_gc>"
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1259)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1259)
-    nil )
-   (!pair  "prot_list_entry"
-    (!type struct 618 nil  gc_used "prot_list_entry"
-     (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1258)
-     (!fields 2 
-      (!pair  "id"
-       (!type already_seen 5)
-       (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1256)
-       nil )
-      (!pair  "refdecl"
-       (!type already_seen 5)
-       (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1257)
-       nil )
-     )
-     nil 384 nil nil )
-    (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1259)
-    nil )
-  )
- )
- 
- (!type already_seen 618)
- 
- (!type user_struct 619 
-  (!type pointer 620 nil  gc_used
-   (!type already_seen 619)
-  )
-  gc_pointed_to "vec<msgref_entry,va_gc>"
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1205)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1205)
-    nil )
-   (!pair  "msgref_entry"
-    (!type struct 621 nil  gc_used "msgref_entry"
-     (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1203)
-     (!fields 3 
-      (!pair  "func"
-       (!type already_seen 5)
-       (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1200)
-       nil )
-      (!pair  "selname"
-       (!type already_seen 5)
-       (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1201)
-       nil )
-      (!pair  "refdecl"
-       (!type already_seen 5)
-       (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1202)
-       nil )
-     )
-     nil 384 nil nil )
-    (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1205)
-    nil )
-  )
- )
- 
- (!type already_seen 621)
- 
- (!type user_struct 622 
-  (!type pointer 623 nil  gc_used
-   (!type already_seen 622)
-  )
-  gc_pointed_to "vec<ident_data_tuple,va_gc>"
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1040)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1040)
-    nil )
-   (!pair  "ident_data_tuple"
-    (!type struct 624 nil  gc_used "ident_data_tuple"
-     (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1018)
-     (!fields 2 
-      (!pair  "ident"
-       (!type already_seen 5)
-       (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1016)
-       nil )
-      (!pair  "data"
-       (!type already_seen 5)
-       (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1017)
-       nil )
-     )
-     nil 384 nil nil )
-    (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1040)
-    nil )
-  )
- )
- 
- (!type already_seen 624)
- 
- (!type struct 625 nil  gc_unused "decl_name_hash"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 626 
-  (!type pointer 627 nil  gc_used
-   (!type already_seen 626)
-  )
-  gc_pointed_to "string_descriptor"
-  (!srcfileloc  "objc/objc-act.c" 261)
-  (!fields 2 
-   (!pair  "literal"
-    (!type already_seen 5)
-    (!srcfileloc  "objc/objc-act.c" 257)
-    nil )
-   (!pair  "constructor"
-    (!type already_seen 5)
-    (!srcfileloc  "objc/objc-act.c" 260)
-    nil )
-  )
-  nil 384 nil nil )
- 
- (!type struct 628 nil  gc_unused "objc_try_context"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 629 
-  (!type pointer 630 nil  gc_used
-   (!type already_seen 629)
-  )
-  gc_pointed_to "imp_entry"
-  (!srcfileloc  "objc/objc-act.h" 267)
-  (!fields 6 
-   (!pair  "next"
-    (!type already_seen 630)
-    (!srcfileloc  "objc/objc-act.h" 261)
-    nil )
-   (!pair  "imp_context"
-    (!type already_seen 5)
-    (!srcfileloc  "objc/objc-act.h" 262)
-    nil )
-   (!pair  "imp_template"
-    (!type already_seen 5)
-    (!srcfileloc  "objc/objc-act.h" 263)
-    nil )
-   (!pair  "class_decl"
-    (!type already_seen 5)
-    (!srcfileloc  "objc/objc-act.h" 264)
-    nil )
-   (!pair  "meta_decl"
-    (!type already_seen 5)
-    (!srcfileloc  "objc/objc-act.h" 265)
-    nil )
-   (!pair  "has_cxx_cdtors"
-    (!type already_seen 9)
-    (!srcfileloc  "objc/objc-act.h" 266)
-    nil )
-  )
-  nil 384 nil nil )
- 
- (!type struct 631 
-  (!type pointer 632 nil  gc_used
-   (!type already_seen 631)
-  )
-  gc_pointed_to "hashed_attribute"
-  (!srcfileloc  "objc/objc-act.h" 244)
-  (!fields 2 
-   (!pair  "next"
-    (!type already_seen 632)
-    (!srcfileloc  "objc/objc-act.h" 242)
-    nil )
-   (!pair  "value"
-    (!type already_seen 5)
-    (!srcfileloc  "objc/objc-act.h" 243)
-    nil )
-  )
-  nil 384 nil nil )
- 
- (!type struct 633 
-  (!type pointer 634 
-   (!type pointer 635 nil  gc_used
-    (!type already_seen 634)
-   )
-   gc_pointed_to
-   (!type already_seen 633)
-  )
-  gc_pointed_to "hashed_entry"
-  (!srcfileloc  "objc/objc-act.h" 250)
-  (!fields 3 
-   (!pair  "list"
-    (!type already_seen 632)
-    (!srcfileloc  "objc/objc-act.h" 247)
-    nil )
-   (!pair  "next"
-    (!type already_seen 634)
-    (!srcfileloc  "objc/objc-act.h" 248)
-    nil )
-   (!pair  "key"
-    (!type already_seen 5)
-    (!srcfileloc  "objc/objc-act.h" 249)
-    nil )
-  )
-  nil 384 nil nil )
- 
- (!type struct 636 
-  (!type pointer 637 nil  gc_used
-   (!type already_seen 636)
-  )
-  gc_pointed_to "objc_map_private"
-  (!srcfileloc  "objc/objc-map.h" 79)
-  (!fields 7 
-   (!pair  "number_of_slots"
-    (!type already_seen 9)
-    (!srcfileloc  "objc/objc-map.h" 54)
-    nil )
-   (!pair  "mask"
-    (!type already_seen 9)
-    (!srcfileloc  "objc/objc-map.h" 57)
-    nil )
-   (!pair  "number_of_non_empty_slots"
-    (!type already_seen 9)
-    (!srcfileloc  "objc/objc-map.h" 62)
-    nil )
-   (!pair  "max_number_of_non_empty_slots"
-    (!type already_seen 9)
-    (!srcfileloc  "objc/objc-map.h" 68)
-    nil )
-   (!pair  "maximum_load_factor"
-    (!type already_seen 9)
-    (!srcfileloc  "objc/objc-map.h" 71)
-    nil )
-   (!pair  "slots"
-    (!type already_seen 6)
-    (!srcfileloc  "objc/objc-map.h" 74)
-    (!options 
-     (!option length string  "%h.number_of_slots")
-    )
-   )
-   (!pair  "values"
-    (!type already_seen 6)
-    (!srcfileloc  "objc/objc-map.h" 78)
-    (!options 
-     (!option length string  "%h.number_of_slots")
-    )
-   )
-  )
-  nil 384 nil nil )
- 
- (!type struct 638 nil  gc_unused "lto_file_struct"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 639 nil  gc_unused "lto_section_list"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 640 nil  gc_unused "file_data_list"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 641 nil  gc_unused "tree_scc_hasher"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 642 nil  gc_unused "tree_scc"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 643 nil  gc_unused "lto_section_slot"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 644 nil  gc_unused "anonymous:../../gcc/java/expr.c:2060"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 645 nil  gc_unused "class_flag_node_struct"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 646 nil  gc_used "builtin_record"
-  (!srcfileloc  "java/builtins.c" 84)
-  (!fields 4 
-   (!pair  "class_name"
-    (!type union 647 nil  gc_used "string_or_tree"
-     (!srcfileloc  "java/builtins.c" 76)
-     (!fields 2 
-      (!pair  "s"
-       (!type already_seen 36)
-       (!srcfileloc  "java/builtins.c" 74)
-       (!options 
-        (!option tag string  "0")
-       )
-      )
-      (!pair  "t"
-       (!type already_seen 5)
-       (!srcfileloc  "java/builtins.c" 75)
-       (!options 
-        (!option tag string  "1")
-       )
-      )
-     )
-     nil 32 nil )
-    (!srcfileloc  "java/builtins.c" 80)
-    (!options 
-     (!option desc string  "1")
-    )
-   )
-   (!pair  "method_name"
-    (!type already_seen 647)
-    (!srcfileloc  "java/builtins.c" 81)
-    (!options 
-     (!option desc string  "1")
-    )
-   )
-   (!pair  "creator"
-    (!type pointer 648 nil  gc_unused
-     (!type undefined 649 
-      (!type already_seen 648)
-      gc_unused "builtin_creator_function"
-      (!srcfileloc  "java/builtins.c" 82)
-     )
-    )
-    (!srcfileloc  "java/builtins.c" 82)
-    (!options 
-     (!option skip string  "")
-    )
-   )
-   (!pair  "builtin_code"
-    (!type already_seen 9)
-    (!srcfileloc  "java/builtins.c" 83)
-    nil )
-  )
-  nil 32 nil nil )
- 
- (!type already_seen 649)
- 
- (!type already_seen 647)
- 
- (!type already_seen 454)
- 
- (!type already_seen 459)
- 
- (!type already_seen 461)
- 
- (!type already_seen 458)
- 
- (!type already_seen 84)
- 
- (!type already_seen 463)
- 
- (!type already_seen 464)
- 
- (!type already_seen 55)
- 
- (!type already_seen 471)
- 
- (!type already_seen 44)
- 
- (!type already_seen 52)
- 
- (!type already_seen 455)
- 
- (!type already_seen 452)
- 
- (!type struct 650 nil  gc_unused "stat"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 651 nil  gc_unused "gfc_interface_mapping"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 652 nil  gc_unused "gfc_interface_sym_mapping"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 653 nil  gc_used "gfc_powdecl_list"
-  (!srcfileloc  "fortran/trans.h" 728)
-  (!fields 3 
-   (!pair  "integer"
-    (!type already_seen 5)
-    (!srcfileloc  "fortran/trans.h" 725)
-    nil )
-   (!pair  "real"
-    (!type already_seen 5)
-    (!srcfileloc  "fortran/trans.h" 726)
-    nil )
-   (!pair  "cmplx"
-    (!type already_seen 5)
-    (!srcfileloc  "fortran/trans.h" 727)
-    nil )
-  )
-  nil 8 nil nil )
- 
- (!type struct 654 nil  gc_unused "gimplify_omp_ctx"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 655 nil  gc_unused "anonymous:../../gcc/fortran/trans.h:340"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 656 nil  gc_unused "anonymous:../../gcc/fortran/trans.h:328"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 657 nil  gc_unused "gfc_loopinfo"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 658 nil  gc_unused "gfc_ss"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 659 nil  gc_unused "gfc_ss_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 660 nil  gc_unused "gfc_array_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 661 nil  gc_unused "gfc_se"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 662 nil  gc_unused "anonymous:../../gcc/fortran/trans.h:33"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 663 nil  gc_unused "forall_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 664 nil  gc_unused "iter_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 665 nil  gc_used "gfc_st_parameter"
-  (!srcfileloc  "fortran/trans-io.c" 79)
-  (!fields 2 
-   (!pair  "name"
-    (!type already_seen 36)
-    (!srcfileloc  "fortran/trans-io.c" 77)
-    nil )
-   (!pair  "type"
-    (!type already_seen 5)
-    (!srcfileloc  "fortran/trans-io.c" 78)
-    nil )
-  )
-  nil 8 nil nil )
- 
- (!type struct 666 nil  gc_used "gfc_st_parameter_field"
-  (!srcfileloc  "fortran/trans-io.c" 73)
-  (!fields 6 
-   (!pair  "name"
-    (!type already_seen 36)
-    (!srcfileloc  "fortran/trans-io.c" 67)
-    nil )
-   (!pair  "mask"
-    (!type already_seen 9)
-    (!srcfileloc  "fortran/trans-io.c" 68)
-    nil )
-   (!pair  "param_type"
-    (!type already_seen 9)
-    (!srcfileloc  "fortran/trans-io.c" 69)
-    nil )
-   (!pair  "type"
-    (!type already_seen 9)
-    (!srcfileloc  "fortran/trans-io.c" 70)
-    nil )
-   (!pair  "field"
-    (!type already_seen 5)
-    (!srcfileloc  "fortran/trans-io.c" 71)
-    nil )
-   (!pair  "field_len"
-    (!type already_seen 5)
-    (!srcfileloc  "fortran/trans-io.c" 72)
-    nil )
-  )
-  nil 8 nil nil )
- 
- (!type struct 667 nil  gc_used "gfc_intrinsic_map_t"
-  (!srcfileloc  "fortran/trans-intrinsic.c" 86)
-  (!fields 19 
-   (!pair  "id"
-    (!type already_seen 9)
-    (!srcfileloc  "fortran/trans-intrinsic.c" 52)
-    nil )
-   (!pair  "float_built_in"
-    (!type already_seen 9)
-    (!srcfileloc  "fortran/trans-intrinsic.c" 56)
-    nil )
-   (!pair  "double_built_in"
-    (!type already_seen 9)
-    (!srcfileloc  "fortran/trans-intrinsic.c" 57)
-    nil )
-   (!pair  "long_double_built_in"
-    (!type already_seen 9)
-    (!srcfileloc  "fortran/trans-intrinsic.c" 58)
-    nil )
-   (!pair  "complex_float_built_in"
-    (!type already_seen 9)
-    (!srcfileloc  "fortran/trans-intrinsic.c" 59)
-    nil )
-   (!pair  "complex_double_built_in"
-    (!type already_seen 9)
-    (!srcfileloc  "fortran/trans-intrinsic.c" 60)
-    nil )
-   (!pair  "complex_long_double_built_in"
-    (!type already_seen 9)
-    (!srcfileloc  "fortran/trans-intrinsic.c" 61)
-    nil )
-   (!pair  "libm_name"
-    (!type already_seen 9)
-    (!srcfileloc  "fortran/trans-intrinsic.c" 66)
-    nil )
-   (!pair  "complex_available"
-    (!type already_seen 9)
-    (!srcfileloc  "fortran/trans-intrinsic.c" 69)
-    nil )
-   (!pair  "is_constant"
-    (!type already_seen 9)
-    (!srcfileloc  "fortran/trans-intrinsic.c" 72)
-    nil )
-   (!pair  "name"
-    (!type already_seen 36)
-    (!srcfileloc  "fortran/trans-intrinsic.c" 75)
-    nil )
-   (!pair  "real4_decl"
-    (!type already_seen 5)
-    (!srcfileloc  "fortran/trans-intrinsic.c" 78)
-    nil )
-   (!pair  "real8_decl"
-    (!type already_seen 5)
-    (!srcfileloc  "fortran/trans-intrinsic.c" 79)
-    nil )
-   (!pair  "real10_decl"
-    (!type already_seen 5)
-    (!srcfileloc  "fortran/trans-intrinsic.c" 80)
-    nil )
-   (!pair  "real16_decl"
-    (!type already_seen 5)
-    (!srcfileloc  "fortran/trans-intrinsic.c" 81)
-    nil )
-   (!pair  "complex4_decl"
-    (!type already_seen 5)
-    (!srcfileloc  "fortran/trans-intrinsic.c" 82)
-    nil )
-   (!pair  "complex8_decl"
-    (!type already_seen 5)
-    (!srcfileloc  "fortran/trans-intrinsic.c" 83)
-    nil )
-   (!pair  "complex10_decl"
-    (!type already_seen 5)
-    (!srcfileloc  "fortran/trans-intrinsic.c" 84)
-    nil )
-   (!pair  "complex16_decl"
-    (!type already_seen 5)
-    (!srcfileloc  "fortran/trans-intrinsic.c" 85)
-    nil )
-  )
-  nil 8 nil nil )
- 
- (!type struct 668 
-  (!type pointer 669 nil  gc_used
-   (!type already_seen 668)
-  )
-  gc_pointed_to "module_htab_entry"
-  (!srcfileloc  "fortran/trans.h" 574)
-  (!fields 3 
-   (!pair  "name"
-    (!type already_seen 36)
-    (!srcfileloc  "fortran/trans.h" 571)
-    nil )
-   (!pair  "namespace_decl"
-    (!type already_seen 5)
-    (!srcfileloc  "fortran/trans.h" 572)
-    nil )
-   (!pair  "decls"
-    (!type already_seen 53)
-    (!srcfileloc  "fortran/trans.h" 573)
-    (!options 
-     (!option param_is type 
-      (!type already_seen 7)
-     )
-    )
-   )
-  )
-  nil 8 nil nil )
- 
- (!type already_seen 81)
- 
- (!type struct 670 nil  gc_unused "vtv_graph_node"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 671 nil  gc_unused "work_node"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 672 
-  (!type pointer 673 nil  gc_used
-   (!type already_seen 672)
-  )
-  gc_pointed_to "vec<pending_noexcept,va_gc>"
-  (!srcfileloc  "cp/except.c" 1185)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "cp/except.c" 1185)
-    nil )
-   (!pair  "pending_noexcept"
-    (!type struct 674 nil  gc_used "pending_noexcept"
-     (!srcfileloc  "cp/except.c" 1184)
-     (!fields 2 
-      (!pair  "fn"
-       (!type already_seen 5)
-       (!srcfileloc  "cp/except.c" 1182)
-       nil )
-      (!pair  "loc"
-       (!type already_seen 9)
-       (!srcfileloc  "cp/except.c" 1183)
-       nil )
-     )
-     nil 4 nil nil )
-    (!srcfileloc  "cp/except.c" 1185)
-    nil )
-  )
- )
- 
- (!type already_seen 674)
- 
- (!type struct 675 nil  gc_unused "secondary_vptr_vtt_init_data_s"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 676 nil  gc_unused "find_final_overrider_data_s"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 677 nil  gc_unused "abi_tag_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 678 nil  gc_unused "vtbl_init_data_s"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 679 
-  (!type pointer 680 nil  gc_unused
-   (!type already_seen 679)
-  )
-  gc_unused "class_stack_node"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 681 
-  (!type pointer 682 nil  gc_used
-   (!type already_seen 681)
-  )
-  gc_pointed_to "pending_abstract_type"
-  (!srcfileloc  "cp/typeck2.c" 155)
-  (!fields 5 
-   (!pair  "decl"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/typeck2.c" 141)
-    nil )
-   (!pair  "type"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/typeck2.c" 144)
-    nil )
-   (!pair  "use"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/typeck2.c" 147)
-    nil )
-   (!pair  "locus"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/typeck2.c" 151)
-    nil )
-   (!pair  "next"
-    (!type already_seen 682)
-    (!srcfileloc  "cp/typeck2.c" 154)
-    nil )
-  )
-  (!options 
-   (!option chain_next string  "%h.next")
-  )
-  260 nil nil )
- 
- (!type struct 683 nil  gc_unused "cleanup"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 684 
-  (!type pointer 685 nil  gc_used
-   (!type already_seen 684)
-  )
-  gc_pointed_to "vec<tree_int,va_gc>"
-  (!srcfileloc  "cp/parser.c" 8652)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "cp/parser.c" 8652)
-    nil )
-   (!pair  "tree_int"
-    (!type struct 686 nil  gc_used "tree_int"
-     (!srcfileloc  "cp/parser.c" 8651)
-     (!fields 2 
-      (!pair  "t"
-       (!type already_seen 5)
-       (!srcfileloc  "cp/parser.c" 8649)
-       nil )
-      (!pair  "i"
-       (!type already_seen 9)
-       (!srcfileloc  "cp/parser.c" 8650)
-       nil )
-     )
-     nil 260 nil nil )
-    (!srcfileloc  "cp/parser.c" 8652)
-    nil )
-  )
- )
- 
- (!type already_seen 686)
- 
- (!type struct 687 nil  gc_unused "cp_parser_expression_stack_entry"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 688 nil  gc_unused "cp_parser_binary_operations_map_node"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 689 
-  (!type pointer 690 nil  gc_used
-   (!type already_seen 689)
-  )
-  gc_pointed_to "cp_parser"
-  (!srcfileloc  "cp/parser.h" 396)
-  (!fields 34 
-   (!pair  "lexer"
-    (!type pointer 691 nil  gc_used
-     (!type struct 692 
-      (!type already_seen 691)
-      gc_pointed_to "cp_lexer"
-      (!srcfileloc  "cp/parser.h" 110)
-      (!fields 7 
-       (!pair  "buffer"
-        (!type pointer 693 nil  gc_used
-         (!type user_struct 694 
-          (!type already_seen 693)
-          gc_pointed_to "vec<cp_token,va_gc>"
-          (!srcfileloc  "cp/parser.h" 85)
-          (!fields 2 
-           (!pair  "va_gc"
-            (!type already_seen 3)
-            (!srcfileloc  "cp/parser.h" 85)
-            nil )
-           (!pair  "cp_token"
-            (!type already_seen 67)
-            (!srcfileloc  "cp/parser.h" 85)
-            nil )
-          )
-         )
-        )
-        (!srcfileloc  "cp/parser.h" 85)
-        nil )
-       (!pair  "last_token"
-        (!type already_seen 66)
-        (!srcfileloc  "cp/parser.h" 89)
-        (!options 
-         (!option skip string  "")
-        )
-       )
-       (!pair  "next_token"
-        (!type already_seen 66)
-        (!srcfileloc  "cp/parser.h" 93)
-        (!options 
-         (!option skip string  "")
-        )
-       )
-       (!pair  "saved_tokens"
-        (!type user_struct 695 nil  gc_unused "vec<cp_token_position>"
-         (!srcfileloc  "cp/parser.h" 99)
-         (!fields 1 
-          (!pair  "cp_token_position"
-           (!type already_seen 66)
-           (!srcfileloc  "cp/parser.h" 99)
-           nil )
-         )
-        )
-        (!srcfileloc  "cp/parser.h" 99)
-        (!options 
-         (!option skip string  "")
-        )
-       )
-       (!pair  "next"
-        (!type already_seen 691)
-        (!srcfileloc  "cp/parser.h" 102)
-        nil )
-       (!pair  "debugging_p"
-        (!type already_seen 9)
-        (!srcfileloc  "cp/parser.h" 105)
-        nil )
-       (!pair  "in_pragma"
-        (!type already_seen 9)
-        (!srcfileloc  "cp/parser.h" 109)
-        nil )
-      )
-      nil 260 nil nil )
-    )
-    (!srcfileloc  "cp/parser.h" 211)
-    nil )
-   (!pair  "scope"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/parser.h" 226)
-    nil )
-   (!pair  "object_scope"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/parser.h" 233)
-    nil )
-   (!pair  "qualifying_scope"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/parser.h" 234)
-    nil )
-   (!pair  "context"
-    (!type pointer 696 nil  gc_used
-     (!type struct 697 
-      (!type already_seen 696)
-      gc_pointed_to "cp_parser_context"
-      (!srcfileloc  "cp/parser.h" 196)
-      (!fields 3 
-       (!pair  "status"
-        (!type already_seen 9)
-        (!srcfileloc  "cp/parser.h" 187)
-        nil )
-       (!pair  "object_type"
-        (!type already_seen 5)
-        (!srcfileloc  "cp/parser.h" 192)
-        nil )
-       (!pair  "next"
-        (!type already_seen 696)
-        (!srcfileloc  "cp/parser.h" 195)
-        nil )
-      )
-      nil 260 nil nil )
-    )
-    (!srcfileloc  "cp/parser.h" 245)
-    nil )
-   (!pair  "allow_gnu_extensions_p"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 249)
-    nil )
-   (!pair  "greater_than_is_operator_p"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 256)
-    nil )
-   (!pair  "default_arg_ok_p"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 261)
-    nil )
-   (!pair  "integral_constant_expression_p"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 265)
-    nil )
-   (!pair  "allow_non_integral_constant_expression_p"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 271)
-    nil )
-   (!pair  "non_integral_constant_expression_p"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 275)
-    nil )
-   (!pair  "local_variables_forbidden_p"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 279)
-    nil )
-   (!pair  "in_unbraced_linkage_specification_p"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 284)
-    nil )
-   (!pair  "in_declarator_p"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 288)
-    nil )
-   (!pair  "in_template_argument_list_p"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 291)
-    nil )
-   (!pair  "in_statement"
-    (!type already_seen 28)
-    (!srcfileloc  "cp/parser.h" 305)
-    nil )
-   (!pair  "in_switch_statement_p"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 311)
-    nil )
-   (!pair  "in_type_id_in_expr_p"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 316)
-    nil )
-   (!pair  "implicit_extern_c"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 320)
-    nil )
-   (!pair  "translate_strings_p"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 324)
-    nil )
-   (!pair  "in_function_body"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 328)
-    nil )
-   (!pair  "in_transaction"
-    (!type already_seen 28)
-    (!srcfileloc  "cp/parser.h" 332)
-    nil )
-   (!pair  "colon_corrects_to_scope_p"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 335)
-    nil )
-   (!pair  "colon_doesnt_start_class_def_p"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 341)
-    nil )
-   (!pair  "type_definition_forbidden_message"
-    (!type already_seen 36)
-    (!srcfileloc  "cp/parser.h" 346)
-    nil )
-   (!pair  "unparsed_queues"
-    (!type pointer 698 nil  gc_used
-     (!type user_struct 699 
-      (!type already_seen 698)
-      gc_pointed_to "vec<cp_unparsed_functions_entry,va_gc>"
-      (!srcfileloc  "cp/parser.h" 351)
-      (!fields 2 
-       (!pair  "va_gc"
-        (!type already_seen 3)
-        (!srcfileloc  "cp/parser.h" 351)
-        nil )
-       (!pair  "cp_unparsed_functions_entry"
-        (!type struct 700 nil  gc_used "cp_unparsed_functions_entry_d"
-         (!srcfileloc  "cp/parser.h" 166)
-         (!fields 3 
-          (!pair  "funs_with_default_args"
-           (!type pointer 701 nil  gc_used
-            (!type user_struct 702 
-             (!type already_seen 701)
-             gc_pointed_to "vec<cp_default_arg_entry,va_gc>"
-             (!srcfileloc  "cp/parser.h" 157)
-             (!fields 2 
-              (!pair  "va_gc"
-               (!type already_seen 3)
-               (!srcfileloc  "cp/parser.h" 157)
-               nil )
-              (!pair  "cp_default_arg_entry"
-               (!type struct 703 nil  gc_used "cp_default_arg_entry_d"
-                (!srcfileloc  "cp/parser.h" 149)
-                (!fields 2 
-                 (!pair  "class_type"
-                  (!type already_seen 5)
-                  (!srcfileloc  "cp/parser.h" 145)
-                  nil )
-                 (!pair  "decl"
-                  (!type already_seen 5)
-                  (!srcfileloc  "cp/parser.h" 148)
-                  nil )
-                )
-                nil 260 nil nil )
-               (!srcfileloc  "cp/parser.h" 157)
-               nil )
-             )
-            )
-           )
-           (!srcfileloc  "cp/parser.h" 157)
-           nil )
-          (!pair  "funs_with_definitions"
-           (!type already_seen 45)
-           (!srcfileloc  "cp/parser.h" 161)
-           nil )
-          (!pair  "nsdmis"
-           (!type already_seen 45)
-           (!srcfileloc  "cp/parser.h" 165)
-           nil )
-         )
-         nil 260 nil nil )
-        (!srcfileloc  "cp/parser.h" 351)
-        nil )
-      )
-     )
-    )
-    (!srcfileloc  "cp/parser.h" 351)
-    nil )
-   (!pair  "num_classes_being_defined"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 355)
-    nil )
-   (!pair  "num_template_parameter_lists"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 359)
-    nil )
-   (!pair  "omp_declare_simd"
-    (!type pointer 704 nil  gc_unused
-     (!type struct 705 
-      (!type already_seen 704)
-      gc_unused "cp_omp_declare_simd_data"
-      (!srcfileloc  "cp/parser.h" 363)
-      (!fields 0 )
-      nil 260 nil nil )
-    )
-    (!srcfileloc  "cp/parser.h" 363)
-    (!options 
-     (!option skip string  "")
-    )
-   )
-   (!pair  "cilk_simd_fn_info"
-    (!type already_seen 704)
-    (!srcfileloc  "cp/parser.h" 370)
-    (!options 
-     (!option skip string  "")
-    )
-   )
-   (!pair  "auto_is_implicit_function_template_parm_p"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 374)
-    nil )
-   (!pair  "fully_implicit_function_template_p"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/parser.h" 379)
-    nil )
-   (!pair  "implicit_template_parms"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/parser.h" 387)
-    nil )
-   (!pair  "implicit_template_scope"
-    (!type already_seen 94)
-    (!srcfileloc  "cp/parser.h" 394)
-    nil )
-  )
-  nil 260 nil nil )
- 
- (!type already_seen 699)
- 
- (!type already_seen 705)
- 
- (!type already_seen 697)
- 
- (!type already_seen 700)
- 
- (!type already_seen 702)
- 
- (!type already_seen 703)
- 
- (!type struct 706 nil  gc_unused "cp_token_ident_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 692)
- 
- (!type already_seen 695)
- 
- (!type already_seen 694)
- 
- (!type already_seen 67)
- 
- (!type already_seen 68)
- 
- (!type already_seen 70)
- 
- (!type struct 707 nil  gc_unused "list_proxy"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 708 nil  gc_unused "cplus_array_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 709 
-  (!type pointer 710 nil  gc_used
-   (!type already_seen 709)
-  )
-  gc_pointed_to "constexpr_call"
-  (!srcfileloc  "cp/semantics.c" 8083)
-  (!fields 4 
-   (!pair  "fundef"
-    (!type pointer 711 nil  gc_used
-     (!type struct 712 
-      (!type already_seen 711)
-      gc_pointed_to "constexpr_fundef"
-      (!srcfileloc  "cp/semantics.c" 7400)
-      (!fields 2 
-       (!pair  "decl"
-        (!type already_seen 5)
-        (!srcfileloc  "cp/semantics.c" 7398)
-        nil )
-       (!pair  "body"
-        (!type already_seen 5)
-        (!srcfileloc  "cp/semantics.c" 7399)
-        nil )
-      )
-      nil 260 nil nil )
-    )
-    (!srcfileloc  "cp/semantics.c" 8067)
-    nil )
-   (!pair  "bindings"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/semantics.c" 8074)
-    nil )
-   (!pair  "result"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/semantics.c" 8079)
-    nil )
-   (!pair  "hash"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/semantics.c" 8082)
-    nil )
-  )
-  nil 260 nil nil )
- 
- (!type already_seen 712)
- 
- (!type struct 713 nil  gc_unused "cp_check_omp_declare_reduction_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 714 
-  (!type pointer 715 nil  gc_used
-   (!type already_seen 714)
-  )
-  gc_pointed_to "vec<deferred_access,va_gc>"
-  (!srcfileloc  "cp/semantics.c" 143)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "cp/semantics.c" 143)
-    nil )
-   (!pair  "deferred_access"
-    (!type struct 716 nil  gc_used "deferred_access"
-     (!srcfileloc  "cp/semantics.c" 140)
-     (!fields 2 
-      (!pair  "deferred_access_checks"
-       (!type already_seen 71)
-       (!srcfileloc  "cp/semantics.c" 135)
-       nil )
-      (!pair  "deferring_access_checks_kind"
-       (!type already_seen 9)
-       (!srcfileloc  "cp/semantics.c" 138)
-       nil )
-     )
-     nil 260 nil nil )
-    (!srcfileloc  "cp/semantics.c" 143)
-    nil )
-  )
- )
- 
- (!type already_seen 716)
- 
- (!type already_seen 72)
- 
- (!type struct 717 nil  gc_unused "warning_sentinel"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 718 nil  gc_unused "pair_fn_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 719 nil  gc_unused "template_parm_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 720 nil  gc_unused "find_parameter_pack_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 721 
-  (!type pointer 722 nil  gc_used
-   (!type already_seen 721)
-  )
-  gc_pointed_to "spec_entry"
-  (!srcfileloc  "cp/pt.c" 89)
-  (!fields 3 
-   (!pair  "tmpl"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/pt.c" 86)
-    nil )
-   (!pair  "args"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/pt.c" 87)
-    nil )
-   (!pair  "spec"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/pt.c" 88)
-    nil )
-  )
-  nil 260 nil nil )
- 
- (!type struct 723 
-  (!type pointer 724 nil  gc_used
-   (!type already_seen 723)
-  )
-  gc_pointed_to "pending_template"
-  (!srcfileloc  "cp/pt.c" 61)
-  (!fields 2 
-   (!pair  "next"
-    (!type already_seen 724)
-    (!srcfileloc  "cp/pt.c" 59)
-    nil )
-   (!pair  "tinst"
-    (!type pointer 725 nil  gc_used
-     (!type struct 726 
-      (!type already_seen 725)
-      gc_pointed_to "tinst_level"
-      (!srcfileloc  "cp/cp-tree.h" 4995)
-      (!fields 5 
-       (!pair  "next"
-        (!type already_seen 725)
-        (!srcfileloc  "cp/cp-tree.h" 4980)
-        nil )
-       (!pair  "decl"
-        (!type already_seen 5)
-        (!srcfileloc  "cp/cp-tree.h" 4985)
-        nil )
-       (!pair  "locus"
-        (!type already_seen 9)
-        (!srcfileloc  "cp/cp-tree.h" 4988)
-        nil )
-       (!pair  "errors"
-        (!type already_seen 9)
-        (!srcfileloc  "cp/cp-tree.h" 4991)
-        nil )
-       (!pair  "in_system_header_p"
-        (!type already_seen 9)
-        (!srcfileloc  "cp/cp-tree.h" 4994)
-        nil )
-      )
-      (!options 
-       (!option chain_next string  "%h.next")
-      )
-      260 nil nil )
-    )
-    (!srcfileloc  "cp/pt.c" 60)
-    nil )
-  )
-  (!options 
-   (!option chain_next string  "%h.next")
-  )
-  260 nil nil )
- 
- (!type struct 727 
-  (!type pointer 728 nil  gc_unused
-   (!type already_seen 727)
-  )
-  gc_unused "priority_info_s"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 729 nil  gc_unused "reshape_iterator_t"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 730 nil  gc_unused "predefined_identifier"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 731 nil  gc_unused "typename_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 732 nil  gc_unused "cp_switch"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 733 
-  (!type pointer 734 nil  gc_used
-   (!type already_seen 733)
-  )
-  gc_pointed_to "vec<incomplete_var,va_gc>"
-  (!srcfileloc  "cp/decl.c" 267)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "cp/decl.c" 267)
-    nil )
-   (!pair  "incomplete_var"
-    (!type struct 735 nil  gc_used "incomplete_var_d"
-     (!srcfileloc  "cp/decl.c" 264)
-     (!fields 2 
-      (!pair  "decl"
-       (!type already_seen 5)
-       (!srcfileloc  "cp/decl.c" 262)
-       nil )
-      (!pair  "incomplete_type"
-       (!type already_seen 5)
-       (!srcfileloc  "cp/decl.c" 263)
-       nil )
-     )
-     nil 260 nil nil )
-    (!srcfileloc  "cp/decl.c" 267)
-    nil )
-  )
- )
- 
- (!type already_seen 735)
- 
- (!type already_seen 105)
- 
- (!type struct 736 nil  gc_unused "conversion_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 737 nil  gc_unused "candidate_warning"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 738 nil  gc_unused "z_candidate"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 739 nil  gc_unused "rejection_reason"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 740 nil  gc_unused "conversion"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 741 nil  gc_unused "diagnostic_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 73)
- 
- (!type struct 742 nil  gc_unused "cp_parameter_declarator"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 743 nil  gc_unused "cp_declarator"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 744 nil  gc_unused "cp_decl_specifier_seq"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 745 nil  gc_used "operator_name_info_t"
-  (!srcfileloc  "cp/cp-tree.h" 4744)
-  (!fields 4 
-   (!pair  "identifier"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/cp-tree.h" 4737)
-    nil )
-   (!pair  "name"
-    (!type already_seen 36)
-    (!srcfileloc  "cp/cp-tree.h" 4739)
-    nil )
-   (!pair  "mangled_name"
-    (!type already_seen 36)
-    (!srcfileloc  "cp/cp-tree.h" 4741)
-    nil )
-   (!pair  "arity"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/cp-tree.h" 4743)
-    nil )
-  )
-  nil 260 nil nil )
- 
- (!type struct 746 nil  gc_unused "aggr_init_expr_arg_iterator_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 56)
- 
- (!type already_seen 129)
- 
- (!type already_seen 128)
- 
- (!type already_seen 61)
- 
- (!type already_seen 63)
- 
- (!type already_seen 62)
- 
- (!type already_seen 59)
- 
- (!type already_seen 60)
- 
- (!type already_seen 58)
- 
- (!type already_seen 479)
- 
- (!type already_seen 494)
- 
- (!type already_seen 481)
- 
- (!type already_seen 483)
- 
- (!type already_seen 480)
- 
- (!type already_seen 484)
- 
- (!type already_seen 93)
- 
- (!type user_struct 747 
-  (!type pointer 748 nil  gc_used
-   (!type already_seen 747)
-  )
-  gc_pointed_to "vec<cxx_saved_binding,va_gc>"
-  (!srcfileloc  "cp/cp-tree.h" 1022)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "cp/cp-tree.h" 1022)
-    nil )
-   (!pair  "cxx_saved_binding"
-    (!type struct 749 nil  gc_used "cxx_saved_binding"
-     (!srcfileloc  "cp/name-lookup.h" 86)
-     (!fields 3 
-      (!pair  "identifier"
-       (!type already_seen 5)
-       (!srcfileloc  "cp/name-lookup.h" 82)
-       nil )
-      (!pair  "binding"
-       (!type already_seen 99)
-       (!srcfileloc  "cp/name-lookup.h" 84)
-       nil )
-      (!pair  "real_type_value"
-       (!type already_seen 5)
-       (!srcfileloc  "cp/name-lookup.h" 85)
-       nil )
-     )
-     nil 260 nil nil )
-    (!srcfileloc  "cp/cp-tree.h" 1022)
-    nil )
-  )
- )
- 
- (!type already_seen 609)
- 
- (!type already_seen 611)
- 
- (!type already_seen 612)
- 
- (!type already_seen 608)
- 
- (!type already_seen 607)
- 
- (!type already_seen 606)
- 
- (!type already_seen 605)
- 
- (!type already_seen 604)
- 
- (!type already_seen 603)
- 
- (!type already_seen 65)
- 
- (!type already_seen 602)
- 
- (!type already_seen 601)
- 
- (!type already_seen 599)
- 
- (!type already_seen 598)
- 
- (!type struct 750 
-  (!type pointer 751 nil  gc_used
-   (!type already_seen 750)
-  )
-  gc_pointed_to "saved_scope"
-  (!srcfileloc  "cp/cp-tree.h" 1058)
-  (!fields 26 
-   (!pair  "old_bindings"
-    (!type already_seen 748)
-    (!srcfileloc  "cp/cp-tree.h" 1022)
-    nil )
-   (!pair  "old_namespace"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/cp-tree.h" 1023)
-    nil )
-   (!pair  "decl_ns_list"
-    (!type already_seen 45)
-    (!srcfileloc  "cp/cp-tree.h" 1024)
-    nil )
-   (!pair  "class_name"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/cp-tree.h" 1025)
-    nil )
-   (!pair  "class_type"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/cp-tree.h" 1026)
-    nil )
-   (!pair  "access_specifier"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/cp-tree.h" 1027)
-    nil )
-   (!pair  "function_decl"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/cp-tree.h" 1028)
-    nil )
-   (!pair  "lang_base"
-    (!type already_seen 45)
-    (!srcfileloc  "cp/cp-tree.h" 1029)
-    nil )
-   (!pair  "lang_name"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/cp-tree.h" 1030)
-    nil )
-   (!pair  "template_parms"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/cp-tree.h" 1031)
-    nil )
-   (!pair  "x_previous_class_level"
-    (!type already_seen 94)
-    (!srcfileloc  "cp/cp-tree.h" 1032)
-    nil )
-   (!pair  "x_saved_tree"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/cp-tree.h" 1033)
-    nil )
-   (!pair  "x_current_class_ptr"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/cp-tree.h" 1036)
-    nil )
-   (!pair  "x_current_class_ref"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/cp-tree.h" 1037)
-    nil )
-   (!pair  "x_processing_template_decl"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/cp-tree.h" 1039)
-    nil )
-   (!pair  "x_processing_specialization"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/cp-tree.h" 1040)
-    nil )
-   (!pair  "x_processing_explicit_instantiation"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/cp-tree.h" 1041)
-    nil )
-   (!pair  "need_pop_function_context"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/cp-tree.h" 1042)
-    nil )
-   (!pair  "unevaluated_operand"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/cp-tree.h" 1044)
-    nil )
-   (!pair  "inhibit_evaluation_warnings"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/cp-tree.h" 1045)
-    nil )
-   (!pair  "omp_declare_target_attribute"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/cp-tree.h" 1048)
-    nil )
-   (!pair  "x_stmt_tree"
-    (!type already_seen 88)
-    (!srcfileloc  "cp/cp-tree.h" 1050)
-    nil )
-   (!pair  "class_bindings"
-    (!type already_seen 94)
-    (!srcfileloc  "cp/cp-tree.h" 1052)
-    nil )
-   (!pair  "bindings"
-    (!type already_seen 94)
-    (!srcfileloc  "cp/cp-tree.h" 1053)
-    nil )
-   (!pair  "x_local_specializations"
-    (!type already_seen 385)
-    (!srcfileloc  "cp/cp-tree.h" 1055)
-    nil )
-   (!pair  "prev"
-    (!type already_seen 751)
-    (!srcfileloc  "cp/cp-tree.h" 1057)
-    nil )
-  )
-  nil 260 nil nil )
- 
- (!type struct 752 nil  gc_unused "arg_lookup"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 109)
- 
- (!type struct 753 nil  gc_unused "scope_binding"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 102)
- 
- (!type already_seen 97)
- 
- (!type already_seen 103)
- 
- (!type already_seen 98)
- 
- (!type already_seen 749)
- 
- (!type already_seen 95)
- 
- (!type already_seen 100)
- 
- (!type already_seen 490)
- 
- (!type already_seen 487)
- 
- (!type already_seen 726)
- 
- (!type struct 754 nil  gc_used "globals"
-  (!srcfileloc  "cp/mangle.c" 106)
-  (!fields 4 
-   (!pair  "substitutions"
-    (!type already_seen 45)
-    (!srcfileloc  "cp/mangle.c" 95)
-    nil )
-   (!pair  "entity"
-    (!type already_seen 5)
-    (!srcfileloc  "cp/mangle.c" 98)
-    (!options 
-     (!option skip string  "")
-    )
-   )
-   (!pair  "parm_depth"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/mangle.c" 101)
-    nil )
-   (!pair  "need_abi_warning"
-    (!type already_seen 9)
-    (!srcfileloc  "cp/mangle.c" 105)
-    nil )
-  )
-  nil 260 nil nil )
- 
- (!type user_struct 755 
-  (!type pointer 756 nil  gc_used
-   (!type already_seen 755)
-  )
-  gc_pointed_to "vec<tinfo_s,va_gc>"
-  (!srcfileloc  "cp/rtti.c" 104)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "cp/rtti.c" 104)
-    nil )
-   (!pair  "tinfo_s"
-    (!type struct 757 nil  gc_used "tinfo_s"
-     (!srcfileloc  "cp/rtti.c" 73)
-     (!fields 3 
-      (!pair  "type"
-       (!type already_seen 5)
-       (!srcfileloc  "cp/rtti.c" 66)
-       nil )
-      (!pair  "vtable"
-       (!type already_seen 5)
-       (!srcfileloc  "cp/rtti.c" 68)
-       nil )
-      (!pair  "name"
-       (!type already_seen 5)
-       (!srcfileloc  "cp/rtti.c" 71)
-       nil )
-     )
-     nil 260 nil nil )
-    (!srcfileloc  "cp/rtti.c" 104)
-    nil )
-  )
- )
- 
- (!type already_seen 757)
- 
- (!type already_seen 112)
- 
- (!type struct 758 nil  gc_unused "c_generic_association"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 759 nil  gc_unused "anonymous:../../gcc/c/c-parser.c:6068"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 760 
-  (!type pointer 761 nil  gc_used
-   (!type already_seen 760)
-  )
-  gc_pointed_to "c_parser"
-  (!srcfileloc  "c/c-parser.c" 217)
-  (!fields 13 
-   (!pair  "tokens"
-    (!type pointer 762 nil  gc_unused
-     (!type struct 763 
-      (!type already_seen 762)
-      gc_used "c_token"
-      (!srcfileloc  "c/c-parser.c" 165)
-      (!fields 6 
-       (!pair  "type"
-        (!type already_seen 9)
-        (!srcfileloc  "c/c-parser.c" 151)
-        nil )
-       (!pair  "id_kind"
-        (!type already_seen 9)
-        (!srcfileloc  "c/c-parser.c" 154)
-        nil )
-       (!pair  "keyword"
-        (!type already_seen 9)
-        (!srcfileloc  "c/c-parser.c" 157)
-        nil )
-       (!pair  "pragma_kind"
-        (!type already_seen 9)
-        (!srcfileloc  "c/c-parser.c" 160)
-        nil )
-       (!pair  "location"
-        (!type already_seen 9)
-        (!srcfileloc  "c/c-parser.c" 162)
-        nil )
-       (!pair  "value"
-        (!type already_seen 5)
-        (!srcfileloc  "c/c-parser.c" 164)
-        nil )
-      )
-      nil 130 nil nil )
-    )
-    (!srcfileloc  "c/c-parser.c" 172)
-    (!options 
-     (!option skip string  "")
-    )
-   )
-   (!pair  "tokens_buf"
-    (!type array 764 nil  gc_used "2" 
-     (!type already_seen 763)
-    )
-    (!srcfileloc  "c/c-parser.c" 174)
-    nil )
-   (!pair  "tokens_avail"
-    (!type already_seen 9)
-    (!srcfileloc  "c/c-parser.c" 177)
-    nil )
-   (!pair  "error"
-    (!type already_seen 9)
-    (!srcfileloc  "c/c-parser.c" 181)
-    nil )
-   (!pair  "in_pragma"
-    (!type already_seen 9)
-    (!srcfileloc  "c/c-parser.c" 184)
-    nil )
-   (!pair  "in_if_block"
-    (!type already_seen 9)
-    (!srcfileloc  "c/c-parser.c" 186)
-    nil )
-   (!pair  "lex_untranslated_string"
-    (!type already_seen 9)
-    (!srcfileloc  "c/c-parser.c" 188)
-    nil )
-   (!pair  "objc_pq_context"
-    (!type already_seen 9)
-    (!srcfileloc  "c/c-parser.c" 194)
-    nil )
-   (!pair  "objc_could_be_foreach_context"
-    (!type already_seen 9)
-    (!srcfileloc  "c/c-parser.c" 199)
-    nil )
-   (!pair  "objc_need_raw_identifier"
-    (!type already_seen 9)
-    (!srcfileloc  "c/c-parser.c" 204)
-    nil )
-   (!pair  "in_transaction"
-    (!type already_seen 9)
-    (!srcfileloc  "c/c-parser.c" 207)
-    nil )
-   (!pair  "objc_property_attr_context"
-    (!type already_seen 9)
-    (!srcfileloc  "c/c-parser.c" 210)
-    nil )
-   (!pair  "cilk_simd_fn_tokens"
-    (!type pointer 765 nil  gc_used
-     (!type user_struct 766 
-      (!type already_seen 765)
-      gc_pointed_to "vec<c_token,va_gc>"
-      (!srcfileloc  "c/c-parser.c" 216)
-      (!fields 2 
-       (!pair  "va_gc"
-        (!type already_seen 3)
-        (!srcfileloc  "c/c-parser.c" 216)
-        nil )
-       (!pair  "c_token"
-        (!type already_seen 763)
-        (!srcfileloc  "c/c-parser.c" 216)
-        nil )
-      )
-     )
-    )
-    (!srcfileloc  "c/c-parser.c" 216)
-    nil )
-  )
-  nil 130 nil nil )
- 
- (!type already_seen 766)
- 
- (!type already_seen 763)
- 
- (!type struct 767 nil  gc_unused "omp_pragma_def"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 768 nil  gc_unused "anonymous:../../gcc/c-family/c-pragma.c:1169"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 769 
-  (!type pointer 770 nil  gc_used
-   (!type already_seen 769)
-  )
-  gc_pointed_to "opt_stack"
-  (!srcfileloc  "c-family/c-pragma.c" 902)
-  (!fields 5 
-   (!pair  "prev"
-    (!type already_seen 770)
-    (!srcfileloc  "c-family/c-pragma.c" 897)
-    nil )
-   (!pair  "target_binary"
-    (!type already_seen 5)
-    (!srcfileloc  "c-family/c-pragma.c" 898)
-    nil )
-   (!pair  "target_strings"
-    (!type already_seen 5)
-    (!srcfileloc  "c-family/c-pragma.c" 899)
-    nil )
-   (!pair  "optimize_binary"
-    (!type already_seen 5)
-    (!srcfileloc  "c-family/c-pragma.c" 900)
-    nil )
-   (!pair  "optimize_strings"
-    (!type already_seen 5)
-    (!srcfileloc  "c-family/c-pragma.c" 901)
-    nil )
-  )
-  nil 390 nil nil )
- 
- (!type user_struct 771 
-  (!type pointer 772 nil  gc_used
-   (!type already_seen 771)
-  )
-  gc_pointed_to "vec<pending_redefinition,va_gc>"
-  (!srcfileloc  "c-family/c-pragma.c" 433)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "c-family/c-pragma.c" 433)
-    nil )
-   (!pair  "pending_redefinition"
-    (!type struct 773 nil  gc_used "pending_redefinition_d"
-     (!srcfileloc  "c-family/c-pragma.c" 430)
-     (!fields 2 
-      (!pair  "oldname"
-       (!type already_seen 5)
-       (!srcfileloc  "c-family/c-pragma.c" 428)
-       nil )
-      (!pair  "newname"
-       (!type already_seen 5)
-       (!srcfileloc  "c-family/c-pragma.c" 429)
-       nil )
-     )
-     nil 390 nil nil )
-    (!srcfileloc  "c-family/c-pragma.c" 433)
-    nil )
-  )
- )
- 
- (!type already_seen 773)
- 
- (!type user_struct 774 
-  (!type pointer 775 nil  gc_used
-   (!type already_seen 774)
-  )
-  gc_pointed_to "vec<pending_weak,va_gc>"
-  (!srcfileloc  "c-family/c-pragma.c" 247)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "c-family/c-pragma.c" 247)
-    nil )
-   (!pair  "pending_weak"
-    (!type struct 776 nil  gc_used "pending_weak_d"
-     (!srcfileloc  "c-family/c-pragma.c" 244)
-     (!fields 2 
-      (!pair  "name"
-       (!type already_seen 5)
-       (!srcfileloc  "c-family/c-pragma.c" 242)
-       nil )
-      (!pair  "value"
-       (!type already_seen 5)
-       (!srcfileloc  "c-family/c-pragma.c" 243)
-       nil )
-     )
-     nil 390 nil nil )
-    (!srcfileloc  "c-family/c-pragma.c" 247)
-    nil )
-  )
- )
- 
- (!type already_seen 776)
- 
- (!type struct 777 
-  (!type pointer 778 nil  gc_used
-   (!type already_seen 777)
-  )
-  gc_pointed_to "align_stack"
-  (!srcfileloc  "c-family/c-pragma.c" 54)
-  (!fields 3 
-   (!pair  "alignment"
-    (!type already_seen 9)
-    (!srcfileloc  "c-family/c-pragma.c" 51)
-    nil )
-   (!pair  "id"
-    (!type already_seen 5)
-    (!srcfileloc  "c-family/c-pragma.c" 52)
-    nil )
-   (!pair  "prev"
-    (!type already_seen 778)
-    (!srcfileloc  "c-family/c-pragma.c" 53)
-    nil )
-  )
-  nil 390 nil nil )
- 
- (!type struct 779 nil  gc_unused "internal_pragma_handler_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type union 780 nil  gc_unused "gen_pragma_handler"nil 
-  (!fields 0 )
-  nil 0 nil )
- 
- (!type struct 781 nil  gc_used "lazy_hex_fp_value_struct"
-  (!srcfileloc  "c-family/c-cppbuiltin.c" 1130)
-  (!fields 5 
-   (!pair  "hex_str"
-    (!type already_seen 36)
-    (!srcfileloc  "c-family/c-cppbuiltin.c" 1125)
-    nil )
-   (!pair  "macro"
-    (!type already_seen 570)
-    (!srcfileloc  "c-family/c-cppbuiltin.c" 1126)
-    nil )
-   (!pair  "mode"
-    (!type already_seen 9)
-    (!srcfileloc  "c-family/c-cppbuiltin.c" 1127)
-    nil )
-   (!pair  "digits"
-    (!type already_seen 9)
-    (!srcfileloc  "c-family/c-cppbuiltin.c" 1128)
-    nil )
-   (!pair  "fp_suffix"
-    (!type already_seen 36)
-    (!srcfileloc  "c-family/c-cppbuiltin.c" 1129)
-    nil )
-  )
-  nil 386 nil nil )
- 
- (!type struct 782 nil  gc_unused "cilkplus_an_loop_parts"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 783 nil  gc_unused "cilkplus_an_parts"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 784 nil  gc_unused "inv_list"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 613)
- 
- (!type struct 785 nil  gc_unused "omp_clause_mask"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 786 nil  gc_unused "c_fileinfo"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 787 nil  gc_unused "c_common_resword"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 788 
-  (!type pointer 789 nil  gc_used
-   (!type already_seen 788)
-  )
-  gc_pointed_to "vec<tree_gc_vec,va_gc>"
-  (!srcfileloc  "c-family/c-common.c" 11546)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "c-family/c-common.c" 11546)
-    nil )
-   (!pair  "tree_gc_vec"
-    (!type already_seen 45)
-    (!srcfileloc  "c-family/c-common.c" 11546)
-    nil )
-  )
- )
- 
- (!type already_seen 87)
- 
- (!type struct 790 nil  gc_unused "reason_option_codes_t"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 791 
-  (!type pointer 792 nil  gc_used
-   (!type already_seen 791)
-  )
-  gc_pointed_to "vec<const_char_p,va_gc>"
-  (!srcfileloc  "c-family/c-common.c" 9011)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "c-family/c-common.c" 9011)
-    nil )
-   (!pair  "const_char_p"
-    (!type already_seen 36)
-    (!srcfileloc  "c-family/c-common.c" 9011)
-    nil )
-  )
- )
- 
- (!type struct 793 nil  gc_unused "disabled_builtin"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 794 nil  gc_unused "tlist_cache"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 795 nil  gc_unused "tlist"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 796 nil  gc_unused "visibility_flags"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 797 nil  gc_unused "fname_var_t"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 492)
- 
- (!type struct 798 
-  (!type pointer 799 nil  gc_used
-   (!type already_seen 798)
-  )
-  gc_pointed_to "c_inline_static"
-  (!srcfileloc  "c/c-decl.c" 489)
-  (!fields 5 
-   (!pair  "location"
-    (!type already_seen 9)
-    (!srcfileloc  "c/c-decl.c" 476)
-    nil )
-   (!pair  "function"
-    (!type already_seen 5)
-    (!srcfileloc  "c/c-decl.c" 479)
-    nil )
-   (!pair  "static_decl"
-    (!type already_seen 5)
-    (!srcfileloc  "c/c-decl.c" 482)
-    nil )
-   (!pair  "type"
-    (!type already_seen 9)
-    (!srcfileloc  "c/c-decl.c" 485)
-    nil )
-   (!pair  "next"
-    (!type already_seen 799)
-    (!srcfileloc  "c/c-decl.c" 488)
-    nil )
-  )
-  (!options 
-   (!option chain_next string  "%h.next")
-  )
-  130 nil nil )
- 
- (!type already_seen 592)
- 
- (!type already_seen 594)
- 
- (!type already_seen 590)
- 
- (!type already_seen 559)
- 
- (!type already_seen 565)
- 
- (!type already_seen 584)
- 
- (!type already_seen 585)
- 
- (!type already_seen 587)
- 
- (!type already_seen 88)
- 
- (!type struct 800 nil  gc_unused "c_struct_parse_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 588)
- 
- (!type struct 801 nil  gc_unused "c_enum_contents"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 802 nil  gc_unused "c_parm"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 803 nil  gc_unused "c_type_name"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 804 nil  gc_unused "c_declarator"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 114)
- 
- (!type struct 805 nil  gc_unused "c_arg_tag_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 806 nil  gc_unused "c_declspecs"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 807 nil  gc_unused "c_typespec"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 808 nil  gc_unused "c_expr"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 809 nil  gc_unused "lang_hooks"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 810 
-  (!type pointer 811 nil  gc_used
-   (!type already_seen 810)
-  )
-  gc_pointed_to "pad_type_hash"
-  (!srcfileloc  "ada/gcc-interface/utils.c" 228)
-  (!fields 2 
-   (!pair  "hash"
-    (!type already_seen 9)
-    (!srcfileloc  "ada/gcc-interface/utils.c" 226)
-    nil )
-   (!pair  "type"
-    (!type already_seen 5)
-    (!srcfileloc  "ada/gcc-interface/utils.c" 227)
-    nil )
-  )
-  nil 1 nil nil )
- 
- (!type struct 812 
-  (!type pointer 813 nil  gc_used
-   (!type already_seen 812)
-  )
-  gc_pointed_to "gnat_binding_level"
-  (!srcfileloc  "ada/gcc-interface/utils.c" 196)
-  (!fields 3 
-   (!pair  "chain"
-    (!type already_seen 813)
-    (!srcfileloc  "ada/gcc-interface/utils.c" 190)
-    nil )
-   (!pair  "block"
-    (!type already_seen 5)
-    (!srcfileloc  "ada/gcc-interface/utils.c" 192)
-    nil )
-   (!pair  "jmpbuf_decl"
-    (!type already_seen 5)
-    (!srcfileloc  "ada/gcc-interface/utils.c" 195)
-    nil )
-  )
-  (!options 
-   (!option chain_next string  "%h.chain")
-  )
-  1 nil nil )
- 
- (!type struct 814 nil  gc_unused "nrv_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 815 
-  (!type pointer 816 nil  gc_used
-   (!type already_seen 815)
-  )
-  gc_pointed_to "vec<loop_info,va_gc>"
-  (!srcfileloc  "ada/gcc-interface/trans.c" 224)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "ada/gcc-interface/trans.c" 224)
-    nil )
-   (!pair  "loop_info"
-    (!type pointer 817 nil  gc_used
-     (!type struct 818 
-      (!type already_seen 817)
-      gc_pointed_to "loop_info_d"
-      (!srcfileloc  "ada/gcc-interface/trans.c" 218)
-      (!fields 3 
-       (!pair  "stmt"
-        (!type already_seen 5)
-        (!srcfileloc  "ada/gcc-interface/trans.c" 215)
-        nil )
-       (!pair  "loop_var"
-        (!type already_seen 5)
-        (!srcfileloc  "ada/gcc-interface/trans.c" 216)
-        nil )
-       (!pair  "checks"
-        (!type pointer 819 nil  gc_used
-         (!type user_struct 820 
-          (!type already_seen 819)
-          gc_pointed_to "vec<range_check_info,va_gc>"
-          (!srcfileloc  "ada/gcc-interface/trans.c" 217)
-          (!fields 2 
-           (!pair  "va_gc"
-            (!type already_seen 3)
-            (!srcfileloc  "ada/gcc-interface/trans.c" 217)
-            nil )
-           (!pair  "range_check_info"
-            (!type pointer 821 nil  gc_used
-             (!type struct 822 
-              (!type already_seen 821)
-              gc_pointed_to "range_check_info_d"
-              (!srcfileloc  "ada/gcc-interface/trans.c" 208)
-              (!fields 4 
-               (!pair  "low_bound"
-                (!type already_seen 5)
-                (!srcfileloc  "ada/gcc-interface/trans.c" 204)
-                nil )
-               (!pair  "high_bound"
-                (!type already_seen 5)
-                (!srcfileloc  "ada/gcc-interface/trans.c" 205)
-                nil )
-               (!pair  "type"
-                (!type already_seen 5)
-                (!srcfileloc  "ada/gcc-interface/trans.c" 206)
-                nil )
-               (!pair  "invariant_cond"
-                (!type already_seen 5)
-                (!srcfileloc  "ada/gcc-interface/trans.c" 207)
-                nil )
-              )
-              nil 1 nil nil )
-            )
-            (!srcfileloc  "ada/gcc-interface/trans.c" 217)
-            nil )
-          )
-         )
-        )
-        (!srcfileloc  "ada/gcc-interface/trans.c" 217)
-        nil )
-      )
-      nil 1 nil nil )
-    )
-    (!srcfileloc  "ada/gcc-interface/trans.c" 224)
-    nil )
-  )
- )
- 
- (!type already_seen 818)
- 
- (!type already_seen 820)
- 
- (!type already_seen 822)
- 
- (!type struct 823 
-  (!type pointer 824 nil  gc_used
-   (!type already_seen 823)
-  )
-  gc_pointed_to "elab_info"
-  (!srcfileloc  "ada/gcc-interface/trans.c" 179)
-  (!fields 3 
-   (!pair  "next"
-    (!type already_seen 824)
-    (!srcfileloc  "ada/gcc-interface/trans.c" 176)
-    nil )
-   (!pair  "elab_proc"
-    (!type already_seen 5)
-    (!srcfileloc  "ada/gcc-interface/trans.c" 177)
-    nil )
-   (!pair  "gnat_node"
-    (!type already_seen 9)
-    (!srcfileloc  "ada/gcc-interface/trans.c" 178)
-    nil )
-  )
-  (!options 
-   (!option chain_next string  "%h.next")
-  )
-  1 nil nil )
- 
- (!type struct 825 
-  (!type pointer 826 nil  gc_used
-   (!type already_seen 825)
-  )
-  gc_pointed_to "stmt_group"
-  (!srcfileloc  "ada/gcc-interface/trans.c" 163)
-  (!fields 4 
-   (!pair  "previous"
-    (!type already_seen 826)
-    (!srcfileloc  "ada/gcc-interface/trans.c" 159)
-    nil )
-   (!pair  "stmt_list"
-    (!type already_seen 5)
-    (!srcfileloc  "ada/gcc-interface/trans.c" 160)
-    nil )
-   (!pair  "block"
-    (!type already_seen 5)
-    (!srcfileloc  "ada/gcc-interface/trans.c" 161)
-    nil )
-   (!pair  "cleanups"
-    (!type already_seen 5)
-    (!srcfileloc  "ada/gcc-interface/trans.c" 162)
-    nil )
-  )
-  (!options 
-   (!option chain_next string  "%h.previous")
-  )
-  1 nil nil )
- 
- (!type already_seen 117)
- 
- (!type already_seen 119)
- 
- (!type struct 827 nil  gc_unused "vinfo"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 828 nil  gc_unused "anonymous:../../gcc/ada/gcc-interface/decl.c:178"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 829 nil  gc_unused "variant_desc_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 830 nil  gc_unused "subst_pair_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 831 nil  gc_unused "incomplete"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 832 nil  gc_unused "attrib"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 833 nil  gc_unused "List_Header"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 834 nil  gc_unused "String_Entry"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 835 nil  gc_unused "Elmt_Item"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 836 nil  gc_unused "Elist_Header"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 837 nil  gc_unused "Flags"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 838 nil  gc_unused "Node"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 839 nil  gc_unused "File_Info_Type"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 840 nil  gc_unused "pass_ipa_devirt"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 841 nil  gc_unused "hash_table<polymorphic_call_target_hasher>"
-  (!srcfileloc  "ipa-devirt.c" 863)
-  (!fields 1 
-   (!pair  "polymorphic_call_target_hasher"
-    (!type struct 842 nil  gc_unused "polymorphic_call_target_hasher"
-     (!srcfileloc  "ipa-devirt.c" 863)
-     (!fields 0 )
-     nil 511 nil nil )
-    (!srcfileloc  "ipa-devirt.c" 863)
-    nil )
-  )
- )
- 
- (!type already_seen 842)
- 
- (!type struct 843 nil  gc_unused "polymorphic_call_target_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 844 
-  (!type pointer 845 nil  gc_used
-   (!type already_seen 844)
-  )
-  gc_pointed_to "vec<odr_type,va_gc>"
-  (!srcfileloc  "ipa-devirt.c" 276)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "ipa-devirt.c" 276)
-    nil )
-   (!pair  "odr_type"
-    (!type pointer 846 nil  gc_used
-     (!type struct 847 
-      (!type already_seen 846)
-      gc_pointed_to "odr_type_d"
-      (!srcfileloc  "ipa-devirt.c" 165)
-      (!fields 7 
-       (!pair  "type"
-        (!type already_seen 5)
-        (!srcfileloc  "ipa-devirt.c" 150)
-        nil )
-       (!pair  "bases"
-        (!type user_struct 848 nil  gc_unused "vec<odr_type>"
-         (!srcfileloc  "ipa-devirt.c" 152)
-         (!fields 1 
-          (!pair  "odr_type"
-           (!type already_seen 846)
-           (!srcfileloc  "ipa-devirt.c" 152)
-           nil )
-         )
-        )
-        (!srcfileloc  "ipa-devirt.c" 152)
-        (!options 
-         (!option skip string  "")
-        )
-       )
-       (!pair  "derived_types"
-        (!type already_seen 848)
-        (!srcfileloc  "ipa-devirt.c" 154)
-        (!options 
-         (!option skip string  "")
-        )
-       )
-       (!pair  "types"
-        (!type already_seen 45)
-        (!srcfileloc  "ipa-devirt.c" 157)
-        nil )
-       (!pair  "types_set"
-        (!type pointer 849 nil  gc_unused
-         (!type struct 850 
-          (!type already_seen 849)
-          gc_unused "pointer_set_t"
-          (!srcfileloc  "ipa-devirt.c" 159)
-          (!fields 0 )
-          nil 511 nil nil )
-        )
-        (!srcfileloc  "ipa-devirt.c" 159)
-        (!options 
-         (!option skip string  "")
-        )
-       )
-       (!pair  "id"
-        (!type already_seen 9)
-        (!srcfileloc  "ipa-devirt.c" 162)
-        nil )
-       (!pair  "anonymous_namespace"
-        (!type already_seen 9)
-        (!srcfileloc  "ipa-devirt.c" 164)
-        nil )
-      )
-      nil 511 nil nil )
-    )
-    (!srcfileloc  "ipa-devirt.c" 276)
-    nil )
-  )
- )
- 
- (!type user_struct 851 nil  gc_unused "hash_table<odr_hasher>"
-  (!srcfileloc  "ipa-devirt.c" 269)
-  (!fields 1 
-   (!pair  "odr_hasher"
-    (!type struct 852 nil  gc_unused "odr_hasher"
-     (!srcfileloc  "ipa-devirt.c" 269)
-     (!fields 0 )
-     nil 511 nil nil )
-    (!srcfileloc  "ipa-devirt.c" 269)
-    nil )
-  )
- )
- 
- (!type already_seen 852)
- 
- (!type already_seen 848)
- 
- (!type struct 853 nil  gc_unused "pass_tsan_O0"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 854 nil  gc_unused "pass_tsan"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 855 nil  gc_unused "pass_ubsan"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 856 
-  (!type pointer 857 nil  gc_used
-   (!type already_seen 856)
-  )
-  gc_pointed_to "tree_type_map"
-  (!srcfileloc  "ubsan.c" 56)
-  (!fields 2 
-   (!pair  "type"
-    (!type struct 858 nil  gc_used "tree_map_base"
-     (!srcfileloc  "tree-core.h" 1720)
-     (!fields 1 
-      (!pair  "from"
-       (!type already_seen 5)
-       (!srcfileloc  "tree-core.h" 1719)
-       nil )
-     )
-     nil 511 nil nil )
-    (!srcfileloc  "ubsan.c" 54)
-    nil )
-   (!pair  "decl"
-    (!type already_seen 5)
-    (!srcfileloc  "ubsan.c" 55)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type struct 859 nil  gc_unused "pass_sanopt"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 860 nil  gc_unused "pass_asan_O0"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 861 nil  gc_unused "pass_asan"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 862 nil  gc_unused "asan_add_string_csts_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 863 nil  gc_unused "asan_mem_ref_hasher"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 864 nil  gc_unused "asan_mem_ref"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 865 nil  gc_unused "pass_vtable_verify"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 866 nil  gc_unused "vtbl_map_node"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type undefined 867 nil  gc_unused "vtbl_map_table_type::iterator"
-  (!srcfileloc  "vtable-verify.c" 311)
- )
- 
- (!type user_struct 868 nil  gc_unused "hash_table<vtbl_map_hasher>"
-  (!srcfileloc  "vtable-verify.c" 310)
-  (!fields 1 
-   (!pair  "vtbl_map_hasher"
-    (!type struct 869 nil  gc_unused "vtbl_map_hasher"
-     (!srcfileloc  "vtable-verify.c" 310)
-     (!fields 0 )
-     nil 511 nil nil )
-    (!srcfileloc  "vtable-verify.c" 310)
-    nil )
-  )
- )
- 
- (!type already_seen 869)
- 
- (!type struct 870 nil  gc_unused "vtable_registration"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 871 nil  gc_unused "edge_growth_cache_entry"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 872 nil  gc_unused "inline_param_summary"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 873 
-  (!type pointer 874 nil  gc_used
-   (!type already_seen 873)
-  )
-  gc_pointed_to "vec<inline_summary_t,va_gc>"
-  (!srcfileloc  "ipa-inline.h" 164)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "ipa-inline.h" 164)
-    nil )
-   (!pair  "inline_summary_t"
-    (!type struct 875 nil  gc_used "inline_summary"
-     (!srcfileloc  "ipa-inline.h" 159)
-     (!fields 16 
-      (!pair  "estimated_self_stack_size"
-       (!type already_seen 9)
-       (!srcfileloc  "ipa-inline.h" 115)
-       nil )
-      (!pair  "self_size"
-       (!type already_seen 9)
-       (!srcfileloc  "ipa-inline.h" 117)
-       nil )
-      (!pair  "self_time"
-       (!type already_seen 9)
-       (!srcfileloc  "ipa-inline.h" 119)
-       nil )
-      (!pair  "min_size"
-       (!type already_seen 9)
-       (!srcfileloc  "ipa-inline.h" 121)
-       nil )
-      (!pair  "inlinable"
-       (!type already_seen 9)
-       (!srcfileloc  "ipa-inline.h" 124)
-       nil )
-      (!pair  "estimated_stack_size"
-       (!type already_seen 9)
-       (!srcfileloc  "ipa-inline.h" 131)
-       nil )
-      (!pair  "stack_frame_offset"
-       (!type already_seen 9)
-       (!srcfileloc  "ipa-inline.h" 133)
-       nil )
-      (!pair  "time"
-       (!type already_seen 9)
-       (!srcfileloc  "ipa-inline.h" 135)
-       nil )
-      (!pair  "size"
-       (!type already_seen 9)
-       (!srcfileloc  "ipa-inline.h" 136)
-       nil )
-      (!pair  "conds"
-       (!type pointer 876 nil  gc_used
-        (!type user_struct 877 
-         (!type already_seen 876)
-         gc_pointed_to "vec<condition,va_gc>"
-         (!srcfileloc  "ipa-inline.h" 76)
-         (!fields 2 
-          (!pair  "va_gc"
-           (!type already_seen 3)
-           (!srcfileloc  "ipa-inline.h" 76)
-           nil )
-          (!pair  "condition"
-           (!type struct 878 nil  gc_used "condition"
-            (!srcfileloc  "ipa-inline.h" 76)
-            (!fields 6 
-             (!pair  "offset"
-              (!type already_seen 9)
-              (!srcfileloc  "ipa-inline.h" 34)
-              nil )
-             (!pair  "val"
-              (!type already_seen 5)
-              (!srcfileloc  "ipa-inline.h" 35)
-              nil )
-             (!pair  "operand_num"
-              (!type already_seen 9)
-              (!srcfileloc  "ipa-inline.h" 36)
-              nil )
-             (!pair  "code"
-              (!type already_seen 9)
-              (!srcfileloc  "ipa-inline.h" 37)
-              nil )
-             (!pair  "agg_contents"
-              (!type already_seen 9)
-              (!srcfileloc  "ipa-inline.h" 40)
-              nil )
-             (!pair  "by_ref"
-              (!type already_seen 9)
-              (!srcfileloc  "ipa-inline.h" 43)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "ipa-inline.h" 76)
-           nil )
-         )
-        )
-       )
-       (!srcfileloc  "ipa-inline.h" 140)
-       nil )
-      (!pair  "entry"
-       (!type pointer 879 nil  gc_used
-        (!type user_struct 880 
-         (!type already_seen 879)
-         gc_pointed_to "vec<size_time_entry,va_gc>"
-         (!srcfileloc  "ipa-inline.h" 141)
-         (!fields 2 
-          (!pair  "va_gc"
-           (!type already_seen 3)
-           (!srcfileloc  "ipa-inline.h" 141)
-           nil )
-          (!pair  "size_time_entry"
-           (!type struct 881 nil  gc_used "size_time_entry"
-            (!srcfileloc  "ipa-inline.h" 141)
-            (!fields 3 
-             (!pair  "predicate"
-              (!type struct 882 
-               (!type pointer 883 nil  gc_unused
-                (!type already_seen 882)
-               )
-               gc_used "predicate"
-               (!srcfileloc  "ipa-inline.h" 92)
-               (!fields 1 
-                (!pair  "clause"
-                 (!type array 884 nil  gc_used "MAX_CLAUSES + 1" 
-                  (!type already_seen 9)
-                 )
-                 (!srcfileloc  "ipa-inline.h" 91)
-                 nil )
-               )
-               nil 511 nil nil )
-              (!srcfileloc  "ipa-inline.h" 104)
-              nil )
-             (!pair  "size"
-              (!type already_seen 9)
-              (!srcfileloc  "ipa-inline.h" 105)
-              nil )
-             (!pair  "time"
-              (!type already_seen 9)
-              (!srcfileloc  "ipa-inline.h" 106)
-              nil )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "ipa-inline.h" 141)
-           nil )
-         )
-        )
-       )
-       (!srcfileloc  "ipa-inline.h" 141)
-       nil )
-      (!pair  "loop_iterations"
-       (!type already_seen 883)
-       (!srcfileloc  "ipa-inline.h" 145)
-       (!options 
-        (!option skip string  "")
-       )
-      )
-      (!pair  "loop_stride"
-       (!type already_seen 883)
-       (!srcfileloc  "ipa-inline.h" 148)
-       (!options 
-        (!option skip string  "")
-       )
-      )
-      (!pair  "array_index"
-       (!type already_seen 883)
-       (!srcfileloc  "ipa-inline.h" 150)
-       (!options 
-        (!option skip string  "")
-       )
-      )
-      (!pair  "growth"
-       (!type already_seen 9)
-       (!srcfileloc  "ipa-inline.h" 156)
-       nil )
-      (!pair  "scc_no"
-       (!type already_seen 9)
-       (!srcfileloc  "ipa-inline.h" 158)
-       nil )
-     )
-     nil 511 nil nil )
-    (!srcfileloc  "ipa-inline.h" 164)
-    nil )
-  )
- )
- 
- (!type already_seen 880)
- 
- (!type already_seen 881)
- 
- (!type already_seen 882)
- 
- (!type already_seen 877)
- 
- (!type already_seen 878)
- 
- (!type already_seen 554)
- 
- (!type already_seen 552)
- 
- (!type already_seen 548)
- 
- (!type already_seen 530)
- 
- (!type struct 885 nil  gc_unused "string_slot_hasher"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 886 nil  gc_unused "string_slot"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 887 nil  gc_unused "lto_simple_output_block"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 888 nil  gc_unused "lto_simple_header"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 889 nil  gc_unused "lto_output_stream"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 890 nil  gc_unused "lto_char_ptr_base"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 891 nil  gc_unused "gcov_ctr_summary"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 892 nil  gc_unused "vec<res_pair>"
-  (!srcfileloc  "lto-streamer.h" 563)
-  (!fields 1 
-   (!pair  "res_pair"
-    (!type struct 893 nil  gc_unused "res_pair"
-     (!srcfileloc  "lto-streamer.h" 563)
-     (!fields 0 )
-     nil 511 nil nil )
-    (!srcfileloc  "lto-streamer.h" 563)
-    nil )
-  )
- )
- 
- (!type already_seen 893)
- 
- (!type struct 894 nil  gc_unused "lto_tree_ref_encoder"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 895 nil  gc_used "lto_tree_ref_table"
-  (!srcfileloc  "lto-streamer.h" 474)
-  (!fields 2 
-   (!pair  "trees"
-    (!type already_seen 6)
-    (!srcfileloc  "lto-streamer.h" 470)
-    (!options 
-     (!option length string  "%h.size")
-    )
-   )
-   (!pair  "size"
-    (!type already_seen 9)
-    (!srcfileloc  "lto-streamer.h" 473)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type struct 896 nil  gc_unused "lto_symtab_encoder_iterator"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 897 
-  (!type pointer 898 nil  gc_unused
-   (!type already_seen 897)
-  )
-  gc_unused "lto_symtab_encoder_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 899 nil  gc_unused "lto_encoder_entry"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 900 nil  gc_unused "lto_stats_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 901 nil  gc_unused "lto_asm_header"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 902 nil  gc_unused "lto_decl_header"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 903 nil  gc_unused "lto_function_header"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 904 nil  gc_unused "lto_header"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 905 
-  (!type pointer 906 nil  gc_used
-   (!type already_seen 905)
-  )
-  gc_pointed_to "lto_in_decl_state"
-  (!srcfileloc  "lto-streamer.h" 495)
-  (!fields 2 
-   (!pair  "streams"
-    (!type array 907 nil  gc_used "LTO_N_DECL_STREAMS" 
-     (!type already_seen 895)
-    )
-    (!srcfileloc  "lto-streamer.h" 490)
-    nil )
-   (!pair  "fn_decl"
-    (!type already_seen 5)
-    (!srcfileloc  "lto-streamer.h" 494)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type struct 908 nil  gc_unused "pass_ipa_tm"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 909 nil  gc_unused "create_version_alias_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 910 nil  gc_unused "demangle_component"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 911 nil  gc_unused "vec<cgraph_node_ptr>"
-  (!srcfileloc  "trans-mem.c" 4064)
-  (!fields 1 
-   (!pair  "cgraph_node_ptr"
-    (!type pointer 912 
-     (!type pointer 913 nil  gc_used
-      (!type already_seen 912)
-     )
-     gc_pointed_to
-     (!type struct 914 
-      (!type already_seen 912)
-      gc_pointed_to "cgraph_node"
-      (!srcfileloc  "cgraph.h" 436)
-      (!fields 34 
-       (!pair  "callees"
-        (!type pointer 915 nil  gc_used
-         (!type struct 916 
-          (!type already_seen 915)
-          gc_pointed_to "cgraph_edge"
-          (!srcfileloc  "cgraph.h" 627)
-          (!fields 19 
-           (!pair  "count"
-            (!type already_seen 9)
-            (!srcfileloc  "cgraph.h" 575)
-            nil )
-           (!pair  "caller"
-            (!type already_seen 912)
-            (!srcfileloc  "cgraph.h" 576)
-            nil )
-           (!pair  "callee"
-            (!type already_seen 912)
-            (!srcfileloc  "cgraph.h" 577)
-            nil )
-           (!pair  "prev_caller"
-            (!type already_seen 915)
-            (!srcfileloc  "cgraph.h" 578)
-            nil )
-           (!pair  "next_caller"
-            (!type already_seen 915)
-            (!srcfileloc  "cgraph.h" 579)
-            nil )
-           (!pair  "prev_callee"
-            (!type already_seen 915)
-            (!srcfileloc  "cgraph.h" 580)
-            nil )
-           (!pair  "next_callee"
-            (!type already_seen 915)
-            (!srcfileloc  "cgraph.h" 581)
-            nil )
-           (!pair  "call_stmt"
-            (!type already_seen 310)
-            (!srcfileloc  "cgraph.h" 582)
-            nil )
-           (!pair  "indirect_info"
-            (!type pointer 917 nil  gc_used
-             (!type struct 918 
-              (!type already_seen 917)
-              gc_pointed_to "cgraph_indirect_call_info"
-              (!srcfileloc  "cgraph.h" 571)
-              (!fields 14 
-               (!pair  "offset"
-                (!type already_seen 9)
-                (!srcfileloc  "cgraph.h" 544)
-                nil )
-               (!pair  "otr_token"
-                (!type already_seen 9)
-                (!srcfileloc  "cgraph.h" 546)
-                nil )
-               (!pair  "otr_type"
-                (!type already_seen 5)
-                (!srcfileloc  "cgraph.h" 548)
-                nil )
-               (!pair  "outer_type"
-                (!type already_seen 5)
-                (!srcfileloc  "cgraph.h" 548)
-                nil )
-               (!pair  "param_index"
-                (!type already_seen 9)
-                (!srcfileloc  "cgraph.h" 550)
-                nil )
-               (!pair  "ecf_flags"
-                (!type already_seen 9)
-                (!srcfileloc  "cgraph.h" 552)
-                nil )
-               (!pair  "common_target_id"
-                (!type already_seen 9)
-                (!srcfileloc  "cgraph.h" 554)
-                nil )
-               (!pair  "common_target_probability"
-                (!type already_seen 9)
-                (!srcfileloc  "cgraph.h" 556)
-                nil )
-               (!pair  "polymorphic"
-                (!type already_seen 9)
-                (!srcfileloc  "cgraph.h" 560)
-                nil )
-               (!pair  "agg_contents"
-                (!type already_seen 9)
-                (!srcfileloc  "cgraph.h" 563)
-                nil )
-               (!pair  "member_ptr"
-                (!type already_seen 9)
-                (!srcfileloc  "cgraph.h" 565)
-                nil )
-               (!pair  "by_ref"
-                (!type already_seen 9)
-                (!srcfileloc  "cgraph.h" 568)
-                nil )
-               (!pair  "maybe_in_construction"
-                (!type already_seen 9)
-                (!srcfileloc  "cgraph.h" 569)
-                nil )
-               (!pair  "maybe_derived_type"
-                (!type already_seen 9)
-                (!srcfileloc  "cgraph.h" 570)
-                nil )
-              )
-              nil 511 nil nil )
-            )
-            (!srcfileloc  "cgraph.h" 585)
-            nil )
-           (!pair  "aux"
-            (!type already_seen 10)
-            (!srcfileloc  "cgraph.h" 586)
-            (!options 
-             (!option skip string  "")
-            )
-           )
-           (!pair  "inline_failed"
-            (!type already_seen 9)
-            (!srcfileloc  "cgraph.h" 589)
-            nil )
-           (!pair  "lto_stmt_uid"
-            (!type already_seen 9)
-            (!srcfileloc  "cgraph.h" 592)
-            nil )
-           (!pair  "frequency"
-            (!type already_seen 9)
-            (!srcfileloc  "cgraph.h" 596)
-            nil )
-           (!pair  "uid"
-            (!type already_seen 9)
-            (!srcfileloc  "cgraph.h" 598)
-            nil )
-           (!pair  "indirect_inlining_edge"
-            (!type already_seen 9)
-            (!srcfileloc  "cgraph.h" 600)
-            nil )
-           (!pair  "indirect_unknown_callee"
-            (!type already_seen 9)
-            (!srcfileloc  "cgraph.h" 603)
-            nil )
-           (!pair  "call_stmt_cannot_inline_p"
-            (!type already_seen 9)
-            (!srcfileloc  "cgraph.h" 606)
-            nil )
-           (!pair  "can_throw_external"
-            (!type already_seen 9)
-            (!srcfileloc  "cgraph.h" 608)
-            nil )
-           (!pair  "speculative"
-            (!type already_seen 9)
-            (!srcfileloc  "cgraph.h" 626)
-            nil )
-          )
-          (!options 
-           (!option chain_prev string  "%h.prev_caller")
-           (!option chain_next string  "%h.next_caller")
-          )
-          511 nil nil )
-        )
-        (!srcfileloc  "cgraph.h" 360)
-        nil )
-       (!pair  "callers"
-        (!type already_seen 915)
-        (!srcfileloc  "cgraph.h" 361)
-        nil )
-       (!pair  "indirect_calls"
-        (!type already_seen 915)
-        (!srcfileloc  "cgraph.h" 364)
-        nil )
-       (!pair  "origin"
-        (!type already_seen 912)
-        (!srcfileloc  "cgraph.h" 366)
-        nil )
-       (!pair  "nested"
-        (!type already_seen 912)
-        (!srcfileloc  "cgraph.h" 368)
-        nil )
-       (!pair  "next_nested"
-        (!type already_seen 912)
-        (!srcfileloc  "cgraph.h" 370)
-        nil )
-       (!pair  "next_sibling_clone"
-        (!type already_seen 912)
-        (!srcfileloc  "cgraph.h" 372)
-        nil )
-       (!pair  "prev_sibling_clone"
-        (!type already_seen 912)
-        (!srcfileloc  "cgraph.h" 373)
-        nil )
-       (!pair  "clones"
-        (!type already_seen 912)
-        (!srcfileloc  "cgraph.h" 374)
-        nil )
-       (!pair  "clone_of"
-        (!type already_seen 912)
-        (!srcfileloc  "cgraph.h" 375)
-        nil )
-       (!pair  "call_site_hash"
-        (!type pointer 919 nil  gc_used
-         (!type param_struct 920 
-          (!type already_seen 919)
-          gc_pointed_to
-          (!type already_seen 49)
-          
-          (!type already_seen 915)
-          nil nil nil nil nil nil nil nil nil nil )
-        )
-        (!srcfileloc  "cgraph.h" 378)
-        (!options 
-         (!option param_is type 
-          (!type already_seen 916)
-         )
-        )
-       )
-       (!pair  "former_clone_of"
-        (!type already_seen 5)
-        (!srcfileloc  "cgraph.h" 380)
-        nil )
-       (!pair  "simdclone"
-        (!type pointer 921 nil  gc_used
-         (!type struct 922 
-          (!type already_seen 921)
-          gc_pointed_to "cgraph_simd_clone"
-          (!srcfileloc  "cgraph.h" 352)
-          (!fields 11 
-           (!pair  "simdlen"
-            (!type already_seen 9)
-            (!srcfileloc  "cgraph.h" 320)
-            nil )
-           (!pair  "nargs"
-            (!type already_seen 9)
-            (!srcfileloc  "cgraph.h" 324)
-            nil )
-           (!pair  "vecsize_int"
-            (!type already_seen 9)
-            (!srcfileloc  "cgraph.h" 327)
-            nil )
-           (!pair  "vecsize_float"
-            (!type already_seen 9)
-            (!srcfileloc  "cgraph.h" 330)
-            nil )
-           (!pair  "vecsize_mangle"
-            (!type already_seen 28)
-            (!srcfileloc  "cgraph.h" 335)
-            nil )
-           (!pair  "inbranch"
-            (!type already_seen 9)
-            (!srcfileloc  "cgraph.h" 339)
-            nil )
-           (!pair  "cilk_elemental"
-            (!type already_seen 9)
-            (!srcfileloc  "cgraph.h" 342)
-            nil )
-           (!pair  "prev_clone"
-            (!type already_seen 912)
-            (!srcfileloc  "cgraph.h" 345)
-            nil )
-           (!pair  "next_clone"
-            (!type already_seen 912)
-            (!srcfileloc  "cgraph.h" 345)
-            nil )
-           (!pair  "origin"
-            (!type already_seen 912)
-            (!srcfileloc  "cgraph.h" 348)
-            nil )
-           (!pair  "args"
-            (!type array 923 nil  gc_used "1" 
-             (!type struct 924 nil  gc_used "cgraph_simd_clone_arg"
-              (!srcfileloc  "cgraph.h" 314)
-              (!fields 8 
-               (!pair  "orig_arg"
-                (!type already_seen 5)
-                (!srcfileloc  "cgraph.h" 276)
-                nil )
-               (!pair  "orig_type"
-                (!type already_seen 5)
-                (!srcfileloc  "cgraph.h" 280)
-                nil )
-               (!pair  "vector_arg"
-                (!type already_seen 5)
-                (!srcfileloc  "cgraph.h" 288)
-                nil )
-               (!pair  "vector_type"
-                (!type already_seen 5)
-                (!srcfileloc  "cgraph.h" 291)
-                nil )
-               (!pair  "simd_array"
-                (!type already_seen 5)
-                (!srcfileloc  "cgraph.h" 300)
-                nil )
-               (!pair  "arg_type"
-                (!type already_seen 9)
-                (!srcfileloc  "cgraph.h" 304)
-                nil )
-               (!pair  "linear_step"
-                (!type already_seen 9)
-                (!srcfileloc  "cgraph.h" 310)
-                nil )
-               (!pair  "alignment"
-                (!type already_seen 9)
-                (!srcfileloc  "cgraph.h" 313)
-                nil )
-              )
-              nil 511 nil nil )
-            )
-            (!srcfileloc  "cgraph.h" 351)
-            (!options 
-             (!option length string  "%h.nargs")
-            )
-           )
-          )
-          nil 511 nil nil )
-        )
-        (!srcfileloc  "cgraph.h" 384)
-        nil )
-       (!pair  "simd_clones"
-        (!type already_seen 912)
-        (!srcfileloc  "cgraph.h" 386)
-        nil )
-       (!pair  "ipa_transforms_to_apply"
-        (!type user_struct 925 nil  gc_unused "vec<ipa_opt_pass>"
-         (!srcfileloc  "cgraph.h" 391)
-         (!fields 1 
-          (!pair  "ipa_opt_pass"
-           (!type pointer 926 nil  gc_unused
-            (!type struct 927 
-             (!type already_seen 926)
-             gc_unused "ipa_opt_pass_d"
-             (!srcfileloc  "function.h" 171)
-             (!fields 0 )
-             nil 511 nil nil )
-           )
-           (!srcfileloc  "cgraph.h" 391)
-           nil )
-         )
-        )
-        (!srcfileloc  "cgraph.h" 391)
-        (!options 
-         (!option skip string  "")
-        )
-       )
-       (!pair  "local"
-        (!type struct 928 nil  gc_used "cgraph_local_info"
-         (!srcfileloc  "cgraph.h" 219)
-         (!fields 5 
-          (!pair  "local"
-           (!type already_seen 9)
-           (!srcfileloc  "cgraph.h" 204)
-           nil )
-          (!pair  "versionable"
-           (!type already_seen 9)
-           (!srcfileloc  "cgraph.h" 207)
-           nil )
-          (!pair  "can_change_signature"
-           (!type already_seen 9)
-           (!srcfileloc  "cgraph.h" 211)
-           nil )
-          (!pair  "redefined_extern_inline"
-           (!type already_seen 9)
-           (!srcfileloc  "cgraph.h" 215)
-           nil )
-          (!pair  "tm_may_enter_irr"
-           (!type already_seen 9)
-           (!srcfileloc  "cgraph.h" 218)
-           nil )
-         )
-         nil 511 nil nil )
-        (!srcfileloc  "cgraph.h" 393)
-        nil )
-       (!pair  "global"
-        (!type struct 929 nil  gc_used "cgraph_global_info"
-         (!srcfileloc  "cgraph.h" 228)
-         (!fields 1 
-          (!pair  "inlined_to"
-           (!type already_seen 912)
-           (!srcfileloc  "cgraph.h" 227)
-           nil )
-         )
-         nil 511 nil nil )
-        (!srcfileloc  "cgraph.h" 394)
-        nil )
-       (!pair  "rtl"
-        (!type struct 930 nil  gc_used "cgraph_rtl_info"
-         (!srcfileloc  "cgraph.h" 235)
-         (!fields 1 
-          (!pair  "preferred_incoming_stack_boundary"
-           (!type already_seen 9)
-           (!srcfileloc  "cgraph.h" 234)
-           nil )
-         )
-         nil 511 nil nil )
-        (!srcfileloc  "cgraph.h" 395)
-        nil )
-       (!pair  "clone"
-        (!type struct 931 nil  gc_used "cgraph_clone_info"
-         (!srcfileloc  "cgraph.h" 259)
-         (!fields 3 
-          (!pair  "tree_map"
-           (!type pointer 932 nil  gc_used
-            (!type user_struct 933 
-             (!type already_seen 932)
-             gc_pointed_to "vec<ipa_replace_map_p,va_gc>"
-             (!srcfileloc  "cgraph.h" 256)
-             (!fields 2 
-              (!pair  "va_gc"
-               (!type already_seen 3)
-               (!srcfileloc  "cgraph.h" 256)
-               nil )
-              (!pair  "ipa_replace_map_p"
-               (!type pointer 934 nil  gc_used
-                (!type struct 935 
-                 (!type already_seen 934)
-                 gc_pointed_to "ipa_replace_map"
-                 (!srcfileloc  "cgraph.h" 251)
-                 (!fields 5 
-                  (!pair  "old_tree"
-                   (!type already_seen 5)
-                   (!srcfileloc  "cgraph.h" 242)
-                   nil )
-                  (!pair  "new_tree"
-                   (!type already_seen 5)
-                   (!srcfileloc  "cgraph.h" 244)
-                   nil )
-                  (!pair  "parm_num"
-                   (!type already_seen 9)
-                   (!srcfileloc  "cgraph.h" 246)
-                   nil )
-                  (!pair  "replace_p"
-                   (!type already_seen 9)
-                   (!srcfileloc  "cgraph.h" 248)
-                   nil )
-                  (!pair  "ref_p"
-                   (!type already_seen 9)
-                   (!srcfileloc  "cgraph.h" 250)
-                   nil )
-                 )
-                 nil 511 nil nil )
-               )
-               (!srcfileloc  "cgraph.h" 256)
-               nil )
-             )
-            )
-           )
-           (!srcfileloc  "cgraph.h" 256)
-           nil )
-          (!pair  "args_to_skip"
-           (!type already_seen 120)
-           (!srcfileloc  "cgraph.h" 257)
-           nil )
-          (!pair  "combined_args_to_skip"
-           (!type already_seen 120)
-           (!srcfileloc  "cgraph.h" 258)
-           nil )
-         )
-         nil 511 nil nil )
-        (!srcfileloc  "cgraph.h" 396)
-        nil )
-       (!pair  "thunk"
-        (!type struct 936 nil  gc_used "cgraph_thunk_info"
-         (!srcfileloc  "cgraph.h" 196)
-         (!fields 6 
-          (!pair  "fixed_offset"
-           (!type already_seen 9)
-           (!srcfileloc  "cgraph.h" 189)
-           nil )
-          (!pair  "virtual_value"
-           (!type already_seen 9)
-           (!srcfileloc  "cgraph.h" 190)
-           nil )
-          (!pair  "alias"
-           (!type already_seen 5)
-           (!srcfileloc  "cgraph.h" 191)
-           nil )
-          (!pair  "this_adjusting"
-           (!type already_seen 9)
-           (!srcfileloc  "cgraph.h" 192)
-           nil )
-          (!pair  "virtual_offset_p"
-           (!type already_seen 9)
-           (!srcfileloc  "cgraph.h" 193)
-           nil )
-          (!pair  "thunk_p"
-           (!type already_seen 9)
-           (!srcfileloc  "cgraph.h" 195)
-           nil )
-         )
-         nil 511 nil nil )
-        (!srcfileloc  "cgraph.h" 397)
-        nil )
-       (!pair  "count"
-        (!type already_seen 9)
-        (!srcfileloc  "cgraph.h" 400)
-        nil )
-       (!pair  "count_materialization_scale"
-        (!type already_seen 9)
-        (!srcfileloc  "cgraph.h" 403)
-        nil )
-       (!pair  "uid"
-        (!type already_seen 9)
-        (!srcfileloc  "cgraph.h" 405)
-        nil )
-       (!pair  "profile_id"
-        (!type already_seen 9)
-        (!srcfileloc  "cgraph.h" 407)
-        nil )
-       (!pair  "tp_first_run"
-        (!type already_seen 9)
-        (!srcfileloc  "cgraph.h" 409)
-        nil )
-       (!pair  "used_as_abstract_origin"
-        (!type already_seen 9)
-        (!srcfileloc  "cgraph.h" 413)
-        nil )
-       (!pair  "lowered"
-        (!type already_seen 9)
-        (!srcfileloc  "cgraph.h" 415)
-        nil )
-       (!pair  "process"
-        (!type already_seen 9)
-        (!srcfileloc  "cgraph.h" 418)
-        nil )
-       (!pair  "frequency"
-        (!type already_seen 9)
-        (!srcfileloc  "cgraph.h" 421)
-        nil )
-       (!pair  "only_called_at_startup"
-        (!type already_seen 9)
-        (!srcfileloc  "cgraph.h" 423)
-        nil )
-       (!pair  "only_called_at_exit"
-        (!type already_seen 9)
-        (!srcfileloc  "cgraph.h" 425)
-        nil )
-       (!pair  "tm_clone"
-        (!type already_seen 9)
-        (!srcfileloc  "cgraph.h" 430)
-        nil )
-       (!pair  "dispatcher_function"
-        (!type already_seen 9)
-        (!srcfileloc  "cgraph.h" 432)
-        nil )
-       (!pair  "calls_comdat_local"
-        (!type already_seen 9)
-        (!srcfileloc  "cgraph.h" 435)
-        nil )
-      )
-      (!options 
-       (!option tag string  "SYMTAB_FUNCTION")
-      )
-      511 nil 
-      (!type struct 937 
-       (!type pointer 938 nil  gc_used
-        (!type already_seen 937)
-       )
-       gc_pointed_to "symtab_node"
-       (!srcfileloc  "cgraph.h" 154)
-       (!fields 26 
-        (!pair  "type"
-         (!type already_seen 9)
-         (!srcfileloc  "cgraph.h" 54)
-         nil )
-        (!pair  "resolution"
-         (!type already_seen 9)
-         (!srcfileloc  "cgraph.h" 57)
-         nil )
-        (!pair  "definition"
-         (!type already_seen 9)
-         (!srcfileloc  "cgraph.h" 63)
-         nil )
-        (!pair  "alias"
-         (!type already_seen 9)
-         (!srcfileloc  "cgraph.h" 66)
-         nil )
-        (!pair  "weakref"
-         (!type already_seen 9)
-         (!srcfileloc  "cgraph.h" 68)
-         nil )
-        (!pair  "cpp_implicit_alias"
-         (!type already_seen 9)
-         (!srcfileloc  "cgraph.h" 75)
-         nil )
-        (!pair  "analyzed"
-         (!type already_seen 9)
-         (!srcfileloc  "cgraph.h" 78)
-         nil )
-        (!pair  "externally_visible"
-         (!type already_seen 9)
-         (!srcfileloc  "cgraph.h" 84)
-         nil )
-        (!pair  "force_output"
-         (!type already_seen 9)
-         (!srcfileloc  "cgraph.h" 87)
-         nil )
-        (!pair  "forced_by_abi"
-         (!type already_seen 9)
-         (!srcfileloc  "cgraph.h" 91)
-         nil )
-        (!pair  "unique_name"
-         (!type already_seen 9)
-         (!srcfileloc  "cgraph.h" 93)
-         nil )
-        (!pair  "body_removed"
-         (!type already_seen 9)
-         (!srcfileloc  "cgraph.h" 96)
-         nil )
-        (!pair  "used_from_other_partition"
-         (!type already_seen 9)
-         (!srcfileloc  "cgraph.h" 103)
-         nil )
-        (!pair  "in_other_partition"
-         (!type already_seen 9)
-         (!srcfileloc  "cgraph.h" 107)
-         nil )
-        (!pair  "address_taken"
-         (!type already_seen 9)
-         (!srcfileloc  "cgraph.h" 114)
-         nil )
-        (!pair  "order"
-         (!type already_seen 9)
-         (!srcfileloc  "cgraph.h" 118)
-         nil )
-        (!pair  "decl"
-         (!type already_seen 5)
-         (!srcfileloc  "cgraph.h" 121)
-         nil )
-        (!pair  "next"
-         (!type already_seen 938)
-         (!srcfileloc  "cgraph.h" 124)
-         nil )
-        (!pair  "previous"
-         (!type already_seen 938)
-         (!srcfileloc  "cgraph.h" 125)
-         nil )
-        (!pair  "next_sharing_asm_name"
-         (!type already_seen 938)
-         (!srcfileloc  "cgraph.h" 136)
-         nil )
-        (!pair  "previous_sharing_asm_name"
-         (!type already_seen 938)
-         (!srcfileloc  "cgraph.h" 137)
-         nil )
-        (!pair  "same_comdat_group"
-         (!type already_seen 938)
-         (!srcfileloc  "cgraph.h" 140)
-         nil )
-        (!pair  "ref_list"
-         (!type struct 939 nil  gc_used "ipa_ref_list"
-          (!srcfileloc  "ipa-ref.h" 59)
-          (!fields 2 
-           (!pair  "references"
-            (!type pointer 940 nil  gc_used
-             (!type user_struct 941 
-              (!type already_seen 940)
-              gc_pointed_to "vec<ipa_ref_t,va_gc>"
-              (!srcfileloc  "ipa-ref.h" 55)
-              (!fields 2 
-               (!pair  "va_gc"
-                (!type already_seen 3)
-                (!srcfileloc  "ipa-ref.h" 55)
-                nil )
-               (!pair  "ipa_ref_t"
-                (!type struct 942 
-                 (!type pointer 943 nil  gc_unused
-                  (!type already_seen 942)
-                 )
-                 gc_used "ipa_ref"
-                 (!srcfileloc  "ipa-ref.h" 45)
-                 (!fields 7 
-                  (!pair  "referring"
-                   (!type already_seen 938)
-                   (!srcfileloc  "ipa-ref.h" 38)
-                   nil )
-                  (!pair  "referred"
-                   (!type already_seen 938)
-                   (!srcfileloc  "ipa-ref.h" 39)
-                   nil )
-                  (!pair  "stmt"
-                   (!type already_seen 310)
-                   (!srcfileloc  "ipa-ref.h" 40)
-                   nil )
-                  (!pair  "lto_stmt_uid"
-                   (!type already_seen 9)
-                   (!srcfileloc  "ipa-ref.h" 41)
-                   nil )
-                  (!pair  "referred_index"
-                   (!type already_seen 9)
-                   (!srcfileloc  "ipa-ref.h" 42)
-                   nil )
-                  (!pair  "use"
-                   (!type already_seen 9)
-                   (!srcfileloc  "ipa-ref.h" 43)
-                   nil )
-                  (!pair  "speculative"
-                   (!type already_seen 9)
-                   (!srcfileloc  "ipa-ref.h" 44)
-                   nil )
-                 )
-                 nil 511 nil nil )
-                (!srcfileloc  "ipa-ref.h" 55)
-                nil )
-              )
-             )
-            )
-            (!srcfileloc  "ipa-ref.h" 55)
-            nil )
-           (!pair  "referring"
-            (!type user_struct 944 nil  gc_unused "vec<ipa_ref_ptr>"
-             (!srcfileloc  "ipa-ref.h" 58)
-             (!fields 1 
-              (!pair  "ipa_ref_ptr"
-               (!type already_seen 943)
-               (!srcfileloc  "ipa-ref.h" 58)
-               nil )
-             )
-            )
-            (!srcfileloc  "ipa-ref.h" 58)
-            (!options 
-             (!option skip string  "")
-            )
-           )
-          )
-          nil 511 nil nil )
-         (!srcfileloc  "cgraph.h" 143)
-         nil )
-        (!pair  "alias_target"
-         (!type already_seen 5)
-         (!srcfileloc  "cgraph.h" 148)
-         nil )
-        (!pair  "lto_file_data"
-         (!type pointer 945 
-          (!type pointer 946 nil  gc_used
-           (!type already_seen 945)
-          )
-          gc_pointed_to
-          (!type struct 947 
-           (!type already_seen 945)
-           gc_pointed_to "lto_file_decl_data"
-           (!srcfileloc  "lto-streamer.h" 570)
-           (!fields 13 
-            (!pair  "current_decl_state"
-             (!type already_seen 906)
-             (!srcfileloc  "lto-streamer.h" 535)
-             nil )
-            (!pair  "global_decl_state"
-             (!type already_seen 906)
-             (!srcfileloc  "lto-streamer.h" 539)
-             nil )
-            (!pair  "symtab_node_encoder"
-             (!type already_seen 898)
-             (!srcfileloc  "lto-streamer.h" 542)
-             (!options 
-              (!option skip string  "")
-             )
-            )
-            (!pair  "function_decl_states"
-             (!type pointer 948 nil  gc_used
-              (!type param_struct 949 
-               (!type already_seen 948)
-               gc_pointed_to
-               (!type already_seen 49)
-               
-               (!type already_seen 906)
-               nil nil nil nil nil nil nil nil nil nil )
-             )
-             (!srcfileloc  "lto-streamer.h" 545)
-             (!options 
-              (!option param_is type 
-               (!type already_seen 905)
-              )
-             )
-            )
-            (!pair  "file_name"
-             (!type already_seen 36)
-             (!srcfileloc  "lto-streamer.h" 548)
-             (!options 
-              (!option skip string  "")
-             )
-            )
-            (!pair  "section_hash_table"
-             (!type already_seen 50)
-             (!srcfileloc  "lto-streamer.h" 551)
-             (!options 
-              (!option skip string  "")
-             )
-            )
-            (!pair  "renaming_hash_table"
-             (!type already_seen 50)
-             (!srcfileloc  "lto-streamer.h" 554)
-             (!options 
-              (!option skip string  "")
-             )
-            )
-            (!pair  "next"
-             (!type already_seen 945)
-             (!srcfileloc  "lto-streamer.h" 557)
-             nil )
-            (!pair  "id"
-             (!type already_seen 9)
-             (!srcfileloc  "lto-streamer.h" 560)
-             nil )
-            (!pair  "respairs"
-             (!type already_seen 892)
-             (!srcfileloc  "lto-streamer.h" 563)
-             (!options 
-              (!option skip string  "")
-             )
-            )
-            (!pair  "max_index"
-             (!type already_seen 9)
-             (!srcfileloc  "lto-streamer.h" 564)
-             nil )
-            (!pair  "profile_info"
-             (!type already_seen 891)
-             (!srcfileloc  "lto-streamer.h" 566)
-             (!options 
-              (!option skip string  "")
-             )
-            )
-            (!pair  "resolution_map"
-             (!type already_seen 385)
-             (!srcfileloc  "lto-streamer.h" 569)
-             (!options 
-              (!option skip string  "")
-             )
-            )
-           )
-           nil 511 nil nil )
-         )
-         (!srcfileloc  "cgraph.h" 151)
-         nil )
-        (!pair  "aux"
-         (!type already_seen 10)
-         (!srcfileloc  "cgraph.h" 153)
-         (!options 
-          (!option skip string  "")
-         )
-        )
-       )
-       (!options 
-        (!option chain_prev string  "%h.previous")
-        (!option chain_next string  "%h.next")
-        (!option tag string  "SYMTAB_SYMBOL")
-        (!option desc string  "%h.type")
-       )
-       511 nil nil )
-     )
-    )
-    (!srcfileloc  "trans-mem.c" 4064)
-    nil )
-  )
- )
- 
- (!type struct 950 nil  gc_unused "tm_ipa_cg_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 951 nil  gc_unused "pass_tm_memopt"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 952 nil  gc_unused "tm_memopt_bitmaps"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 953 nil  gc_unused "tm_memop_hasher"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 954 
-  (!type pointer 955 nil  gc_unused
-   (!type already_seen 954)
-  )
-  gc_unused "tm_memop"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 956 nil  gc_unused "pass_tm_edges"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 957 nil  gc_unused "pass_tm_mark"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 958 nil  gc_unused "bb2reg_stuff"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 959 nil  gc_unused "pass_tm_init"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 960 
-  (!type pointer 961 nil  gc_unused
-   (!type already_seen 960)
-  )
-  gc_unused "tm_region"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 962 nil  gc_unused "pass_lower_tm"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 963 nil  gc_unused "tm_mem_map_hasher"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 964 nil  gc_unused "tm_new_mem_map"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 965 nil  gc_unused "log_entry_hasher"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 966 
-  (!type pointer 967 nil  gc_unused
-   (!type already_seen 966)
-  )
-  gc_unused "tm_log_entry"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 968 nil  gc_unused "pass_diagnose_tm_blocks"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 969 nil  gc_unused "diagnose_tm"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 970 nil  gc_unused "vec<ipa_parm_adjustment>"
-  (!srcfileloc  "ipa-prop.h" 686)
-  (!fields 1 
-   (!pair  "ipa_parm_adjustment"
-    (!type struct 971 nil  gc_unused "ipa_parm_adjustment"
-     (!srcfileloc  "ipa-prop.h" 686)
-     (!fields 0 )
-     nil 511 nil nil )
-    (!srcfileloc  "ipa-prop.h" 686)
-    nil )
-  )
- )
- 
- (!type user_struct 972 
-  (!type pointer 973 nil  gc_used
-   (!type already_seen 972)
-  )
-  gc_pointed_to "vec<ipa_edge_args,va_gc>"
-  (!srcfileloc  "ipa-prop.h" 511)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "ipa-prop.h" 511)
-    nil )
-   (!pair  "ipa_edge_args"
-    (!type struct 974 nil  gc_used "ipa_edge_args"
-     (!srcfileloc  "ipa-prop.h" 511)
-     (!fields 1 
-      (!pair  "jump_functions"
-       (!type pointer 975 nil  gc_used
-        (!type user_struct 976 
-         (!type already_seen 975)
-         gc_pointed_to "vec<ipa_jump_func,va_gc>"
-         (!srcfileloc  "ipa-prop.h" 480)
-         (!fields 2 
-          (!pair  "va_gc"
-           (!type already_seen 3)
-           (!srcfileloc  "ipa-prop.h" 480)
-           nil )
-          (!pair  "ipa_jump_func"
-           (!type struct 977 nil  gc_used "ipa_jump_func"
-            (!srcfileloc  "ipa-prop.h" 480)
-            (!fields 3 
-             (!pair  "agg"
-              (!type struct 978 
-               (!type pointer 979 nil  gc_unused
-                (!type already_seen 978)
-               )
-               gc_used "ipa_agg_jump_function"
-               (!srcfileloc  "ipa-prop.h" 176)
-               (!fields 2 
-                (!pair  "items"
-                 (!type pointer 980 nil  gc_used
-                  (!type user_struct 981 
-                   (!type already_seen 980)
-                   gc_pointed_to "vec<ipa_agg_jf_item,va_gc>"
-                   (!srcfileloc  "ipa-prop.h" 173)
-                   (!fields 2 
-                    (!pair  "va_gc"
-                     (!type already_seen 3)
-                     (!srcfileloc  "ipa-prop.h" 173)
-                     nil )
-                    (!pair  "ipa_agg_jf_item"
-                     (!type struct 982 nil  gc_used "ipa_agg_jf_item"
-                      (!srcfileloc  "ipa-prop.h" 173)
-                      (!fields 2 
-                       (!pair  "offset"
-                        (!type already_seen 9)
-                        (!srcfileloc  "ipa-prop.h" 160)
-                        nil )
-                       (!pair  "value"
-                        (!type already_seen 5)
-                        (!srcfileloc  "ipa-prop.h" 163)
-                        nil )
-                      )
-                      nil 511 nil nil )
-                     (!srcfileloc  "ipa-prop.h" 173)
-                     nil )
-                   )
-                  )
-                 )
-                 (!srcfileloc  "ipa-prop.h" 173)
-                 nil )
-                (!pair  "by_ref"
-                 (!type already_seen 9)
-                 (!srcfileloc  "ipa-prop.h" 175)
-                 nil )
-               )
-               nil 511 nil nil )
-              (!srcfileloc  "ipa-prop.h" 187)
-              nil )
-             (!pair  "type"
-              (!type already_seen 9)
-              (!srcfileloc  "ipa-prop.h" 189)
-              nil )
-             (!pair  "value"
-              (!type union 983 nil  gc_used "jump_func_value"
-               (!srcfileloc  "ipa-prop.h" 199)
-               (!fields 4 
-                (!pair  "known_type"
-                 (!type struct 984 nil  gc_used "ipa_known_type_data"
-                  (!srcfileloc  "ipa-prop.h" 85)
-                  (!fields 3 
-                   (!pair  "offset"
-                    (!type already_seen 9)
-                    (!srcfileloc  "ipa-prop.h" 80)
-                    nil )
-                   (!pair  "base_type"
-                    (!type already_seen 5)
-                    (!srcfileloc  "ipa-prop.h" 82)
-                    nil )
-                   (!pair  "component_type"
-                    (!type already_seen 5)
-                    (!srcfileloc  "ipa-prop.h" 84)
-                    nil )
-                  )
-                  nil 511 nil nil )
-                 (!srcfileloc  "ipa-prop.h" 195)
-                 (!options 
-                  (!option tag string  "IPA_JF_KNOWN_TYPE")
-                 )
-                )
-                (!pair  "constant"
-                 (!type struct 985 nil  gc_used "ipa_constant_data"
-                  (!srcfileloc  "ipa-prop.h" 96)
-                  (!fields 2 
-                   (!pair  "value"
-                    (!type already_seen 5)
-                    (!srcfileloc  "ipa-prop.h" 93)
-                    nil )
-                   (!pair  "rdesc"
-                    (!type pointer 986 nil  gc_unused
-                     (!type struct 987 
-                      (!type already_seen 986)
-                      gc_unused "ipa_cst_ref_desc"nil 
-                      (!fields 0 )
-                      nil 0 nil nil )
-                    )
-                    (!srcfileloc  "ipa-prop.h" 95)
-                    (!options 
-                     (!option skip string  "")
-                    )
-                   )
-                  )
-                  nil 511 nil nil )
-                 (!srcfileloc  "ipa-prop.h" 196)
-                 (!options 
-                  (!option tag string  "IPA_JF_CONST")
-                 )
-                )
-                (!pair  "pass_through"
-                 (!type struct 988 nil  gc_used "ipa_pass_through_data"
-                  (!srcfileloc  "ipa-prop.h" 124)
-                  (!fields 5 
-                   (!pair  "operand"
-                    (!type already_seen 5)
-                    (!srcfileloc  "ipa-prop.h" 104)
-                    nil )
-                   (!pair  "formal_id"
-                    (!type already_seen 9)
-                    (!srcfileloc  "ipa-prop.h" 106)
-                    nil )
-                   (!pair  "operation"
-                    (!type already_seen 9)
-                    (!srcfileloc  "ipa-prop.h" 111)
-                    nil )
-                   (!pair  "agg_preserved"
-                    (!type already_seen 9)
-                    (!srcfileloc  "ipa-prop.h" 118)
-                    nil )
-                   (!pair  "type_preserved"
-                    (!type already_seen 9)
-                    (!srcfileloc  "ipa-prop.h" 123)
-                    nil )
-                  )
-                  nil 511 nil nil )
-                 (!srcfileloc  "ipa-prop.h" 197)
-                 (!options 
-                  (!option tag string  "IPA_JF_PASS_THROUGH")
-                 )
-                )
-                (!pair  "ancestor"
-                 (!type struct 989 nil  gc_used "ipa_ancestor_jf_data"
-                  (!srcfileloc  "ipa-prop.h" 145)
-                  (!fields 5 
-                   (!pair  "offset"
-                    (!type already_seen 9)
-                    (!srcfileloc  "ipa-prop.h" 132)
-                    nil )
-                   (!pair  "type"
-                    (!type already_seen 5)
-                    (!srcfileloc  "ipa-prop.h" 136)
-                    nil )
-                   (!pair  "formal_id"
-                    (!type already_seen 9)
-                    (!srcfileloc  "ipa-prop.h" 138)
-                    nil )
-                   (!pair  "agg_preserved"
-                    (!type already_seen 9)
-                    (!srcfileloc  "ipa-prop.h" 140)
-                    nil )
-                   (!pair  "type_preserved"
-                    (!type already_seen 9)
-                    (!srcfileloc  "ipa-prop.h" 144)
-                    nil )
-                  )
-                  nil 511 nil nil )
-                 (!srcfileloc  "ipa-prop.h" 198)
-                 (!options 
-                  (!option tag string  "IPA_JF_ANCESTOR")
-                 )
-                )
-               )
-               nil 511 nil )
-              (!srcfileloc  "ipa-prop.h" 199)
-              (!options 
-               (!option desc string  "%1.type")
-              )
-             )
-            )
-            nil 511 nil nil )
-           (!srcfileloc  "ipa-prop.h" 480)
-           nil )
-         )
-        )
-       )
-       (!srcfileloc  "ipa-prop.h" 480)
-       nil )
-     )
-     nil 511 nil nil )
-    (!srcfileloc  "ipa-prop.h" 511)
-    nil )
-  )
- )
- 
- (!type user_struct 990 
-  (!type pointer 991 nil  gc_used
-   (!type already_seen 990)
-  )
-  gc_pointed_to "vec<ipa_agg_replacement_value_p,va_gc>"
-  (!srcfileloc  "ipa-prop.h" 509)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "ipa-prop.h" 509)
-    nil )
-   (!pair  "ipa_agg_replacement_value_p"
-    (!type pointer 992 nil  gc_used
-     (!type struct 993 
-      (!type already_seen 992)
-      gc_pointed_to "ipa_agg_replacement_value"
-      (!srcfileloc  "ipa-prop.h" 468)
-      (!fields 5 
-       (!pair  "next"
-        (!type already_seen 992)
-        (!srcfileloc  "ipa-prop.h" 459)
-        nil )
-       (!pair  "offset"
-        (!type already_seen 9)
-        (!srcfileloc  "ipa-prop.h" 461)
-        nil )
-       (!pair  "value"
-        (!type already_seen 5)
-        (!srcfileloc  "ipa-prop.h" 463)
-        nil )
-       (!pair  "index"
-        (!type already_seen 9)
-        (!srcfileloc  "ipa-prop.h" 465)
-        nil )
-       (!pair  "by_ref"
-        (!type already_seen 9)
-        (!srcfileloc  "ipa-prop.h" 467)
-        nil )
-      )
-      nil 511 nil nil )
-    )
-    (!srcfileloc  "ipa-prop.h" 509)
-    nil )
-  )
- )
- 
- (!type already_seen 976)
- 
- (!type struct 994 nil  gc_unused "ipa_param_descriptor"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 983)
- 
- (!type already_seen 981)
- 
- (!type already_seen 989)
- 
- (!type already_seen 988)
- 
- (!type already_seen 985)
- 
- (!type already_seen 984)
- 
- (!type struct 995 nil  gc_unused "ao_ref"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 996 nil  gc_unused "prop_stats_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 997 nil  gc_unused "cgraph_order_sort"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 998 
-  (!type pointer 999 nil  gc_unused
-   (!type already_seen 998)
-  )
-  gc_unused "lto_out_decl_state"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1000 nil  gc_unused "pass_list_node"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1001 
-  (!type pointer 1002 nil  gc_unused
-   (!type already_seen 1001)
-  )
-  gc_unused "uid_range"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1003 nil  gc_unused "pass_registry_hasher"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1004 nil  gc_unused "pass_registry"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1005 nil  gc_unused "pass_postreload"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1006 nil  gc_unused "pass_rest_of_compilation"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1007 nil  gc_unused "pass_all_optimizations_g"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1008 nil  gc_unused "pass_all_optimizations"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1009 nil  gc_unused "pass_all_early_optimizations"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1010 nil  gc_unused "pass_early_local_passes"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1011 nil  gc_unused "dump_file_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1012 nil  gc_unused "expand_vec_perm_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1013 nil  gc_unused "anonymous:../../gcc/config/arm/arm.c:29434"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1014 nil  gc_unused "builtin_description"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1015 nil  gc_unused "anonymous:../../gcc/config/arm/arm.c:22869"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 1016 nil  gc_unused "hash_table<libcall_hasher>"
-  (!srcfileloc  "config/arm/arm.c" 4517)
-  (!fields 1 
-   (!pair  "libcall_hasher"
-    (!type struct 1017 nil  gc_unused "libcall_hasher"
-     (!srcfileloc  "config/arm/arm.c" 4517)
-     (!fields 0 )
-     nil 511 nil nil )
-    (!srcfileloc  "config/arm/arm.c" 4517)
-    nil )
-  )
- )
- 
- (!type already_seen 1017)
- 
- (!type struct 1018 nil  gc_unused "anonymous:../../gcc/config/arm/arm.c:2847"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1019 nil  gc_unused "anonymous:../../gcc/config/arm/arm.c:1853"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1020 nil  gc_unused "processors"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1021 nil  gc_unused "gcc_target"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1022 nil  gc_unused "four_ints"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1023 nil  gc_unused "minipool_fixup"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1024 nil  gc_unused "minipool_node"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1025 nil  gc_unused "cl_option_state"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1026 nil  gc_unused "_stmt_vec_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1027 nil  gc_unused "pass_omp_simd_clone"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1028 nil  gc_unused "modify_stmt_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1029 nil  gc_unused "pass_diagnose_omp_blocks"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1030 nil  gc_unused "pass_lower_omp"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1031 nil  gc_unused "omp_taskcopy_context"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1032 nil  gc_unused "pass_expand_omp"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1033 nil  gc_unused "omp_for_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1034 nil  gc_unused "omp_for_data_loop"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1035 nil  gc_unused "omp_context"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1036 nil  gc_unused "pass_parallelize_loops"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1037 nil  gc_unused "clsn_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1038 nil  gc_unused "elv_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1039 nil  gc_unused "int_tree_map"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1040 nil  gc_unused "data_dependence_relation"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1041 
-  (!type pointer 1042 nil  gc_unused
-   (!type already_seen 1041)
-  )
-  gc_unused "lambda_trans_matrix_s"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 1043 nil  gc_unused "hash_table<name_to_copy_hasher>"
-  (!srcfileloc  "tree-parloops.c" 282)
-  (!fields 1 
-   (!pair  "name_to_copy_hasher"
-    (!type struct 1044 nil  gc_unused "name_to_copy_hasher"
-     (!srcfileloc  "tree-parloops.c" 282)
-     (!fields 0 )
-     nil 511 nil nil )
-    (!srcfileloc  "tree-parloops.c" 282)
-    nil )
-  )
- )
- 
- (!type already_seen 1044)
- 
- (!type struct 1045 nil  gc_unused "name_to_copy_elt"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 1046 nil  gc_unused "hash_table<reduction_hasher>"
-  (!srcfileloc  "tree-parloops.c" 230)
-  (!fields 1 
-   (!pair  "reduction_hasher"
-    (!type struct 1047 nil  gc_unused "reduction_hasher"
-     (!srcfileloc  "tree-parloops.c" 230)
-     (!fields 0 )
-     nil 511 nil nil )
-    (!srcfileloc  "tree-parloops.c" 230)
-    nil )
-  )
- )
- 
- (!type already_seen 1047)
- 
- (!type struct 1048 nil  gc_unused "reduction_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1049 nil  gc_unused "nesting_copy_body_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1050 nil  gc_unused "nesting_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1051 nil  gc_unused "pass_ipa_tree_profile"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 389)
- 
- (!type struct 1052 nil  gc_unused "chrec_stats"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1053 nil  gc_unused "tree_niter_desc"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1054 nil  gc_unused "instantiate_cache_type"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1055 
-  (!type pointer 1056 nil  gc_used
-   (!type already_seen 1055)
-  )
-  gc_pointed_to "scev_info_str"
-  (!srcfileloc  "tree-scalar-evolution.c" 304)
-  (!fields 3 
-   (!pair  "name_version"
-    (!type already_seen 9)
-    (!srcfileloc  "tree-scalar-evolution.c" 301)
-    nil )
-   (!pair  "instantiated_below"
-    (!type already_seen 9)
-    (!srcfileloc  "tree-scalar-evolution.c" 302)
-    nil )
-   (!pair  "chrec"
-    (!type already_seen 5)
-    (!srcfileloc  "tree-scalar-evolution.c" 303)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type struct 1057 nil  gc_unused "numbered_tree_d"
-  (!srcfileloc  "tree-dfa.c" 703)
-  (!fields 2 
-   (!pair  "t"
-    (!type already_seen 5)
-    (!srcfileloc  "tree-dfa.c" 701)
-    nil )
-   (!pair  "num"
-    (!type already_seen 9)
-    (!srcfileloc  "tree-dfa.c" 702)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type struct 1058 nil  gc_unused "dfa_stats_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1059 nil  gc_unused "pass_fixup_cfg"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1060 nil  gc_unused "pass_warn_unused_result"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1061 nil  gc_unused "pass_warn_function_return"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1062 nil  gc_unused "pass_split_crit_edges"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1063 nil  gc_unused "move_stmt_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1064 nil  gc_unused "walk_stmt_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1065 nil  gc_unused "omp_region"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1066 nil  gc_unused "pass_build_cfg"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1067 nil  gc_unused "locus_discrim_hasher"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1068 nil  gc_unused "locus_discrim_map"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1069 nil  gc_unused "cfg_stats_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1070 nil  gc_unused "mem_address"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 1071 
-  (!type pointer 1072 nil  gc_used
-   (!type already_seen 1071)
-  )
-  gc_pointed_to "vec<mem_addr_template,va_gc>"
-  (!srcfileloc  "tree-ssa-address.c" 98)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "tree-ssa-address.c" 98)
-    nil )
-   (!pair  "mem_addr_template"
-    (!type struct 1073 nil  gc_used "mem_addr_template"
-     (!srcfileloc  "tree-ssa-address.c" 91)
-     (!fields 3 
-      (!pair  "ref"
-       (!type already_seen 136)
-       (!srcfileloc  "tree-ssa-address.c" 86)
-       nil )
-      (!pair  "step_p"
-       (!type already_seen 137)
-       (!srcfileloc  "tree-ssa-address.c" 87)
-       (!options 
-        (!option skip string  "")
-       )
-      )
-      (!pair  "off_p"
-       (!type already_seen 137)
-       (!srcfileloc  "tree-ssa-address.c" 89)
-       (!options 
-        (!option skip string  "")
-       )
-      )
-     )
-     nil 511 nil nil )
-    (!srcfileloc  "tree-ssa-address.c" 98)
-    nil )
-  )
- )
- 
- (!type already_seen 1073)
- 
- (!type struct 1074 nil  gc_unused "pass_cleanup_eh"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1075 nil  gc_unused "pass_lower_eh_dispatch"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1076 nil  gc_unused "pass_lower_resx"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1077 nil  gc_unused "pass_refactor_eh"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1078 nil  gc_unused "pass_lower_eh"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1079 nil  gc_unused "labels_s"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1080 nil  gc_unused "leh_tf_state"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1081 nil  gc_unused "leh_state"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1082 nil  gc_unused "goto_queue_node"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1083 nil  gc_unused "finally_tree_hasher"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1084 nil  gc_unused "finally_tree_node"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type union 1085 nil  gc_unused "anonymous:../../gcc/tree-eh.c:59"nil 
-  (!fields 0 )
-  nil 0 nil )
- 
- (!type struct 1086 nil  gc_unused "pass_release_ssa_names"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 387)
- 
- (!type already_seen 383)
- 
- (!type already_seen 396)
- 
- (!type struct 1087 nil  gc_unused "gimple_temp_hash_elt"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1088 nil  gc_pointed_to "gimple_statement_transaction"
-  (!srcfileloc  "gimple.h" 758)
-  (!fields 2 
-   (!pair  "body"
-    (!type already_seen 310)
-    (!srcfileloc  "gimple.h" 754)
-    nil )
-   (!pair  "label"
-    (!type already_seen 5)
-    (!srcfileloc  "gimple.h" 757)
-    nil )
-  )
-  (!options 
-   (!option tag string  "GSS_TRANSACTION")
-  )
-  511 nil 
-  (!type struct 1089 nil  gc_pointed_to "gimple_statement_with_memory_ops_base"
-   (!srcfileloc  "gimple.h" 249)
-   (!fields 2 
-    (!pair  "vdef"
-     (!type already_seen 5)
-     (!srcfileloc  "gimple.h" 247)
-     (!options 
-      (!option skip string  "")
-     )
-    )
-    (!pair  "vuse"
-     (!type already_seen 5)
-     (!srcfileloc  "gimple.h" 248)
-     (!options 
-      (!option skip string  "")
-     )
-    )
-   )
-   (!options 
-    (!option tag string  "GSS_WITH_MEM_OPS_BASE")
-   )
-   511 nil 
-   (!type struct 1090 nil  gc_pointed_to "gimple_statement_with_ops_base"
-    (!srcfileloc  "gimple.h" 219)
-    (!fields 1 
-     (!pair  "use_ops"
-      (!type already_seen 391)
-      (!srcfileloc  "gimple.h" 218)
-      (!options 
-       (!option skip string  "")
-      )
-     )
-    )
-    nil 511 nil 
-    (!type already_seen 311)
-   )
-  )
- )
- 
- (!type struct 1091 nil  gc_pointed_to "gimple_statement_omp_return"
-  (!srcfileloc  "gimple.h" 718)
-  (!fields 0 )
-  (!options 
-   (!option tag string  "GSS_OMP_ATOMIC_STORE_LAYOUT")
-  )
-  511 nil 
-  (!type struct 1092 nil  gc_pointed_to "gimple_statement_omp_atomic_store_layout"
-   (!srcfileloc  "gimple.h" 702)
-   (!fields 1 
-    (!pair  "val"
-     (!type already_seen 5)
-     (!srcfileloc  "gimple.h" 701)
-     nil )
-   )
-   (!options 
-    (!option tag string  "GSS_OMP_ATOMIC_STORE_LAYOUT")
-   )
-   511 nil 
-   (!type already_seen 311)
-  )
- )
- 
- (!type struct 1093 nil  gc_pointed_to "gimple_statement_omp_atomic_store"
-  (!srcfileloc  "gimple.h" 710)
-  (!fields 0 )
-  (!options 
-   (!option tag string  "GSS_OMP_ATOMIC_STORE_LAYOUT")
-  )
-  511 nil 
-  (!type already_seen 1092)
- )
- 
- (!type already_seen 1092)
- 
- (!type struct 1094 nil  gc_pointed_to "gimple_statement_omp_atomic_load"
-  (!srcfileloc  "gimple.h" 690)
-  (!fields 2 
-   (!pair  "rhs"
-    (!type already_seen 5)
-    (!srcfileloc  "gimple.h" 689)
-    nil )
-   (!pair  "lhs"
-    (!type already_seen 5)
-    (!srcfileloc  "gimple.h" 689)
-    nil )
-  )
-  (!options 
-   (!option tag string  "GSS_OMP_ATOMIC_LOAD")
-  )
-  511 nil 
-  (!type already_seen 311)
- )
- 
- (!type struct 1095 nil  gc_pointed_to "gimple_statement_omp_teams"
-  (!srcfileloc  "gimple.h" 676)
-  (!fields 0 )
-  (!options 
-   (!option tag string  "GSS_OMP_SINGLE_LAYOUT")
-  )
-  511 nil 
-  (!type struct 1096 nil  gc_pointed_to "gimple_statement_omp_single_layout"
-   (!srcfileloc  "gimple.h" 662)
-   (!fields 1 
-    (!pair  "clauses"
-     (!type already_seen 5)
-     (!srcfileloc  "gimple.h" 661)
-     nil )
-   )
-   (!options 
-    (!option tag string  "GSS_OMP_SINGLE_LAYOUT")
-   )
-   511 nil 
-   (!type struct 1097 nil  gc_pointed_to "gimple_statement_omp"
-    (!srcfileloc  "gimple.h" 302)
-    (!fields 1 
-     (!pair  "body"
-      (!type already_seen 310)
-      (!srcfileloc  "gimple.h" 301)
-      nil )
-    )
-    (!options 
-     (!option tag string  "GSS_OMP")
-    )
-    511 nil 
-    (!type already_seen 311)
-   )
-  )
- )
- 
- (!type struct 1098 nil  gc_pointed_to "gimple_statement_omp_single"
-  (!srcfileloc  "gimple.h" 669)
-  (!fields 0 )
-  (!options 
-   (!option tag string  "GSS_OMP_SINGLE_LAYOUT")
-  )
-  511 nil 
-  (!type already_seen 1096)
- )
- 
- (!type already_seen 1096)
- 
- (!type struct 1099 nil  gc_pointed_to "gimple_statement_omp_continue"
-  (!srcfileloc  "gimple.h" 651)
-  (!fields 2 
-   (!pair  "control_def"
-    (!type already_seen 5)
-    (!srcfileloc  "gimple.h" 647)
-    nil )
-   (!pair  "control_use"
-    (!type already_seen 5)
-    (!srcfileloc  "gimple.h" 650)
-    nil )
-  )
-  (!options 
-   (!option tag string  "GSS_OMP_CONTINUE")
-  )
-  511 nil 
-  (!type already_seen 311)
- )
- 
- (!type struct 1100 nil  gc_pointed_to "gimple_statement_omp_sections"
-  (!srcfileloc  "gimple.h" 634)
-  (!fields 2 
-   (!pair  "clauses"
-    (!type already_seen 5)
-    (!srcfileloc  "gimple.h" 628)
-    nil )
-   (!pair  "control"
-    (!type already_seen 5)
-    (!srcfileloc  "gimple.h" 633)
-    nil )
-  )
-  (!options 
-   (!option tag string  "GSS_OMP_SECTIONS")
-  )
-  511 nil 
-  (!type already_seen 1097)
- )
- 
- (!type struct 1101 nil  gc_pointed_to "gimple_statement_omp_task"
-  (!srcfileloc  "gimple.h" 613)
-  (!fields 3 
-   (!pair  "copy_fn"
-    (!type already_seen 5)
-    (!srcfileloc  "gimple.h" 607)
-    nil )
-   (!pair  "arg_size"
-    (!type already_seen 5)
-    (!srcfileloc  "gimple.h" 611)
-    nil )
-   (!pair  "arg_align"
-    (!type already_seen 5)
-    (!srcfileloc  "gimple.h" 612)
-    nil )
-  )
-  (!options 
-   (!option tag string  "GSS_OMP_TASK")
-  )
-  511 nil 
-  (!type struct 1102 nil  gc_pointed_to "gimple_statement_omp_taskreg"
-   (!srcfileloc  "gimple.h" 580)
-   (!fields 0 )
-   (!options 
-    (!option tag string  "GSS_OMP_PARALLEL_LAYOUT")
-   )
-   511 nil 
-   (!type struct 1103 nil  gc_pointed_to "gimple_statement_omp_parallel_layout"
-    (!srcfileloc  "gimple.h" 571)
-    (!fields 3 
-     (!pair  "clauses"
-      (!type already_seen 5)
-      (!srcfileloc  "gimple.h" 562)
-      nil )
-     (!pair  "child_fn"
-      (!type already_seen 5)
-      (!srcfileloc  "gimple.h" 566)
-      nil )
-     (!pair  "data_arg"
-      (!type already_seen 5)
-      (!srcfileloc  "gimple.h" 570)
-      nil )
-    )
-    (!options 
-     (!option tag string  "GSS_OMP_PARALLEL_LAYOUT")
-    )
-    511 nil 
-    (!type already_seen 1097)
-   )
-  )
- )
- 
- (!type struct 1104 nil  gc_pointed_to "gimple_statement_omp_target"
-  (!srcfileloc  "gimple.h" 596)
-  (!fields 0 )
-  (!options 
-   (!option tag string  "GSS_OMP_PARALLEL_LAYOUT")
-  )
-  511 nil 
-  (!type already_seen 1103)
- )
- 
- (!type struct 1105 nil  gc_pointed_to "gimple_statement_omp_parallel"
-  (!srcfileloc  "gimple.h" 589)
-  (!fields 0 )
-  (!options 
-   (!option tag string  "GSS_OMP_PARALLEL_LAYOUT")
-  )
-  511 nil 
-  (!type already_seen 1102)
- )
- 
- (!type already_seen 1102)
- 
- (!type already_seen 1103)
- 
- (!type struct 1106 nil  gc_pointed_to "gimple_statement_omp_for"
-  (!srcfileloc  "gimple.h" 551)
-  (!fields 4 
-   (!pair  "clauses"
-    (!type already_seen 5)
-    (!srcfileloc  "gimple.h" 539)
-    nil )
-   (!pair  "collapse"
-    (!type already_seen 9)
-    (!srcfileloc  "gimple.h" 543)
-    nil )
-   (!pair  "iter"
-    (!type pointer 1107 nil  gc_unused
-     (!type struct 1108 
-      (!type already_seen 1107)
-      gc_used "gimple_omp_for_iter"
-      (!srcfileloc  "gimple.h" 529)
-      (!fields 5 
-       (!pair  "cond"
-        (!type already_seen 9)
-        (!srcfileloc  "gimple.h" 516)
-        nil )
-       (!pair  "index"
-        (!type already_seen 5)
-        (!srcfileloc  "gimple.h" 519)
-        nil )
-       (!pair  "initial"
-        (!type already_seen 5)
-        (!srcfileloc  "gimple.h" 522)
-        nil )
-       (!pair  "final"
-        (!type already_seen 5)
-        (!srcfileloc  "gimple.h" 525)
-        nil )
-       (!pair  "incr"
-        (!type already_seen 5)
-        (!srcfileloc  "gimple.h" 528)
-        nil )
-      )
-      nil 511 nil nil )
-    )
-    (!srcfileloc  "gimple.h" 546)
-    (!options 
-     (!option length string  "%h.collapse")
-    )
-   )
-   (!pair  "pre_body"
-    (!type already_seen 310)
-    (!srcfileloc  "gimple.h" 550)
-    nil )
-  )
-  (!options 
-   (!option tag string  "GSS_OMP_FOR")
-  )
-  511 nil 
-  (!type already_seen 1097)
- )
- 
- (!type already_seen 1108)
- 
- (!type struct 1109 nil  gc_pointed_to "gimple_statement_omp_critical"
-  (!srcfileloc  "gimple.h" 511)
-  (!fields 1 
-   (!pair  "name"
-    (!type already_seen 5)
-    (!srcfileloc  "gimple.h" 510)
-    nil )
-  )
-  (!options 
-   (!option tag string  "GSS_OMP_CRITICAL")
-  )
-  511 nil 
-  (!type already_seen 1097)
- )
- 
- (!type struct 1110 nil  gc_pointed_to "gimple_statement_asm"
-  (!srcfileloc  "gimple.h" 499)
-  (!fields 6 
-   (!pair  "string"
-    (!type already_seen 36)
-    (!srcfileloc  "gimple.h" 485)
-    nil )
-   (!pair  "ni"
-    (!type already_seen 28)
-    (!srcfileloc  "gimple.h" 489)
-    nil )
-   (!pair  "no"
-    (!type already_seen 28)
-    (!srcfileloc  "gimple.h" 490)
-    nil )
-   (!pair  "nc"
-    (!type already_seen 28)
-    (!srcfileloc  "gimple.h" 491)
-    nil )
-   (!pair  "nl"
-    (!type already_seen 28)
-    (!srcfileloc  "gimple.h" 492)
-    nil )
-   (!pair  "op"
-    (!type array 1111 nil  gc_used "1" 
-     (!type already_seen 5)
-    )
-    (!srcfileloc  "gimple.h" 498)
-    (!options 
-     (!option length string  "%h.num_ops")
-    )
-   )
-  )
-  (!options 
-   (!option tag string  "GSS_ASM")
-  )
-  511 nil 
-  (!type already_seen 1089)
- )
- 
- (!type struct 1112 nil  gc_pointed_to "gimple_statement_wce"
-  (!srcfileloc  "gimple.h" 473)
-  (!fields 1 
-   (!pair  "cleanup"
-    (!type already_seen 310)
-    (!srcfileloc  "gimple.h" 472)
-    nil )
-  )
-  (!options 
-   (!option tag string  "GSS_WCE")
-  )
-  511 nil 
-  (!type already_seen 311)
- )
- 
- (!type struct 1113 nil  gc_pointed_to "gimple_statement_try"
-  (!srcfileloc  "gimple.h" 442)
-  (!fields 2 
-   (!pair  "eval"
-    (!type already_seen 310)
-    (!srcfileloc  "gimple.h" 437)
-    nil )
-   (!pair  "cleanup"
-    (!type already_seen 310)
-    (!srcfileloc  "gimple.h" 441)
-    nil )
-  )
-  (!options 
-   (!option tag string  "GSS_TRY")
-  )
-  511 nil 
-  (!type already_seen 311)
- )
- 
- (!type struct 1114 nil  gc_pointed_to "gimple_statement_eh_dispatch"
-  (!srcfileloc  "gimple.h" 425)
-  (!fields 0 )
-  (!options 
-   (!option tag string  "GSS_EH_CTRL")
-  )
-  511 nil 
-  (!type struct 1115 nil  gc_pointed_to "gimple_statement_eh_ctrl"
-   (!srcfileloc  "gimple.h" 411)
-   (!fields 1 
-    (!pair  "region"
-     (!type already_seen 9)
-     (!srcfileloc  "gimple.h" 410)
-     nil )
-   )
-   (!options 
-    (!option tag string  "GSS_EH_CTRL")
-   )
-   511 nil 
-   (!type already_seen 311)
-  )
- )
- 
- (!type struct 1116 nil  gc_pointed_to "gimple_statement_resx"
-  (!srcfileloc  "gimple.h" 418)
-  (!fields 0 )
-  (!options 
-   (!option tag string  "GSS_EH_CTRL")
-  )
-  511 nil 
-  (!type already_seen 1115)
- )
- 
- (!type already_seen 1115)
- 
- (!type struct 1117 nil  gc_pointed_to "gimple_statement_phi"
-  (!srcfileloc  "gimple.h" 398)
-  (!fields 4 
-   (!pair  "capacity"
-    (!type already_seen 9)
-    (!srcfileloc  "gimple.h" 390)
-    nil )
-   (!pair  "nargs"
-    (!type already_seen 9)
-    (!srcfileloc  "gimple.h" 391)
-    nil )
-   (!pair  "result"
-    (!type already_seen 5)
-    (!srcfileloc  "gimple.h" 394)
-    nil )
-   (!pair  "args"
-    (!type array 1118 nil  gc_used "1" 
-     (!type struct 1119 nil  gc_used "phi_arg_d"
-      (!srcfileloc  "tree-core.h" 1199)
-      (!fields 3 
-       (!pair  "imm_use"
-        (!type already_seen 510)
-        (!srcfileloc  "tree-core.h" 1196)
-        nil )
-       (!pair  "def"
-        (!type already_seen 5)
-        (!srcfileloc  "tree-core.h" 1197)
-        nil )
-       (!pair  "locus"
-        (!type already_seen 9)
-        (!srcfileloc  "tree-core.h" 1198)
-        nil )
-      )
-      nil 511 nil nil )
-    )
-    (!srcfileloc  "gimple.h" 397)
-    (!options 
-     (!option length string  "%h.nargs")
-    )
-   )
-  )
-  (!options 
-   (!option tag string  "GSS_PHI")
-  )
-  511 nil 
-  (!type already_seen 311)
- )
- 
- (!type struct 1120 nil  gc_pointed_to "gimple_statement_eh_mnt"
-  (!srcfileloc  "gimple.h" 380)
-  (!fields 1 
-   (!pair  "fndecl"
-    (!type already_seen 5)
-    (!srcfileloc  "gimple.h" 379)
-    nil )
-  )
-  (!options 
-   (!option tag string  "GSS_EH_MNT")
-  )
-  511 nil 
-  (!type already_seen 311)
- )
- 
- (!type struct 1121 nil  gc_pointed_to "gimple_statement_eh_else"
-  (!srcfileloc  "gimple.h" 369)
-  (!fields 2 
-   (!pair  "n_body"
-    (!type already_seen 310)
-    (!srcfileloc  "gimple.h" 368)
-    nil )
-   (!pair  "e_body"
-    (!type already_seen 310)
-    (!srcfileloc  "gimple.h" 368)
-    nil )
-  )
-  (!options 
-   (!option tag string  "GSS_EH_ELSE")
-  )
-  511 nil 
-  (!type already_seen 311)
- )
- 
- (!type struct 1122 nil  gc_pointed_to "gimple_statement_eh_filter"
-  (!srcfileloc  "gimple.h" 358)
-  (!fields 2 
-   (!pair  "types"
-    (!type already_seen 5)
-    (!srcfileloc  "gimple.h" 353)
-    nil )
-   (!pair  "failure"
-    (!type already_seen 310)
-    (!srcfileloc  "gimple.h" 357)
-    nil )
-  )
-  (!options 
-   (!option tag string  "GSS_EH_FILTER")
-  )
-  511 nil 
-  (!type already_seen 311)
- )
- 
- (!type struct 1123 nil  gc_pointed_to "gimple_statement_catch"
-  (!srcfileloc  "gimple.h" 341)
-  (!fields 2 
-   (!pair  "types"
-    (!type already_seen 5)
-    (!srcfileloc  "gimple.h" 337)
-    nil )
-   (!pair  "handler"
-    (!type already_seen 310)
-    (!srcfileloc  "gimple.h" 340)
-    nil )
-  )
-  (!options 
-   (!option tag string  "GSS_CATCH")
-  )
-  511 nil 
-  (!type already_seen 311)
- )
- 
- (!type struct 1124 nil  gc_pointed_to "gimple_statement_bind"
-  (!srcfileloc  "gimple.h" 326)
-  (!fields 3 
-   (!pair  "vars"
-    (!type already_seen 5)
-    (!srcfileloc  "gimple.h" 314)
-    nil )
-   (!pair  "block"
-    (!type already_seen 5)
-    (!srcfileloc  "gimple.h" 322)
-    nil )
-   (!pair  "body"
-    (!type already_seen 310)
-    (!srcfileloc  "gimple.h" 325)
-    nil )
-  )
-  (!options 
-   (!option tag string  "GSS_BIND")
-  )
-  511 nil 
-  (!type already_seen 311)
- )
- 
- (!type already_seen 1097)
- 
- (!type struct 1125 nil  gc_pointed_to "gimple_statement_call"
-  (!srcfileloc  "gimple.h" 290)
-  (!fields 4 
-   (!pair  "call_used"
-    (!type already_seen 384)
-    (!srcfileloc  "gimple.h" 276)
-    nil )
-   (!pair  "call_clobbered"
-    (!type already_seen 384)
-    (!srcfileloc  "gimple.h" 277)
-    nil )
-   (!pair  "u"
-    (!type union 1126 nil  gc_used "anonymous:../../gcc/gimple.h:280"
-     (!srcfileloc  "gimple.h" 283)
-     (!fields 2 
-      (!pair  "fntype"
-       (!type already_seen 5)
-       (!srcfileloc  "gimple.h" 281)
-       (!options 
-        (!option tag string  "0")
-       )
-      )
-      (!pair  "internal_fn"
-       (!type already_seen 9)
-       (!srcfileloc  "gimple.h" 282)
-       (!options 
-        (!option tag string  "GF_CALL_INTERNAL")
-       )
-      )
-     )
-     (!options 
-      (!option desc string  "%1.subcode & GF_CALL_INTERNAL")
-     )
-     511 nil )
-    (!srcfileloc  "gimple.h" 283)
-    nil )
-   (!pair  "op"
-    (!type array 1127 nil  gc_used "1" 
-     (!type already_seen 5)
-    )
-    (!srcfileloc  "gimple.h" 289)
-    (!options 
-     (!option length string  "%h.num_ops")
-    )
-   )
-  )
-  (!options 
-   (!option tag string  "GSS_CALL")
-  )
-  511 nil 
-  (!type already_seen 1089)
- )
- 
- (!type already_seen 1126)
- 
- (!type already_seen 384)
- 
- (!type struct 1128 nil  gc_pointed_to "gimple_statement_with_memory_ops"
-  (!srcfileloc  "gimple.h" 265)
-  (!fields 1 
-   (!pair  "op"
-    (!type array 1129 nil  gc_used "1" 
-     (!type already_seen 5)
-    )
-    (!srcfileloc  "gimple.h" 264)
-    (!options 
-     (!option length string  "%h.num_ops")
-    )
-   )
-  )
-  (!options 
-   (!option tag string  "GSS_WITH_MEM_OPS")
-  )
-  511 nil 
-  (!type already_seen 1089)
- )
- 
- (!type already_seen 1089)
- 
- (!type struct 1130 nil  gc_pointed_to "gimple_statement_with_ops"
-  (!srcfileloc  "gimple.h" 234)
-  (!fields 1 
-   (!pair  "op"
-    (!type array 1131 nil  gc_used "1" 
-     (!type already_seen 5)
-    )
-    (!srcfileloc  "gimple.h" 233)
-    (!options 
-     (!option length string  "%h.num_ops")
-    )
-   )
-  )
-  (!options 
-   (!option tag string  "GSS_WITH_OPS")
-  )
-  511 nil 
-  (!type already_seen 1090)
- )
- 
- (!type already_seen 1090)
- 
- (!type already_seen 392)
- 
- (!type user_struct 1132 nil  gc_unused "vec<gimple>"
-  (!srcfileloc  "gimple.h" 29)
-  (!fields 1 
-   (!pair  "gimple"
-    (!type already_seen 310)
-    (!srcfileloc  "gimple.h" 29)
-    nil )
-  )
- )
- 
- (!type struct 1133 nil  gc_unused "tm_alias_pair"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1134 nil  gc_unused "anonymous:../../gcc/varasm.c:4818"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1135 nil  gc_unused "anonymous:../../gcc/varasm.c:4574"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1136 nil  gc_unused "asm_int_op"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1137 nil  gc_unused "addr_const"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1138 nil  gc_unused "pass_ipa_free_lang_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1139 nil  gc_unused "free_lang_data_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1140 
-  (!type pointer 1141 nil  gc_used
-   (!type already_seen 1140)
-  )
-  gc_pointed_to "type_hash"
-  (!srcfileloc  "tree.c" 178)
-  (!fields 2 
-   (!pair  "hash"
-    (!type already_seen 9)
-    (!srcfileloc  "tree.c" 176)
-    nil )
-   (!pair  "type"
-    (!type already_seen 5)
-    (!srcfileloc  "tree.c" 177)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type struct 1142 
-  (!type pointer 1143 nil  gc_used
-   (!type already_seen 1142)
-  )
-  gc_pointed_to "string_pool_data"
-  (!srcfileloc  "stringpool.c" 252)
-  (!fields 3 
-   (!pair  "entries"
-    (!type already_seen 35)
-    (!srcfileloc  "stringpool.c" 249)
-    (!options 
-     (!option nested_ptr nested 
-      (!type already_seen 7)
-      "%h ? HT_IDENT_TO_GCC_IDENT (%h) : NULL" "%h ? GCC_IDENT_TO_HT_IDENT (%h) : NULL")
-     (!option length string  "%h.nslots")
-    )
-   )
-   (!pair  "nslots"
-    (!type already_seen 9)
-    (!srcfileloc  "stringpool.c" 250)
-    nil )
-   (!pair  "nelements"
-    (!type already_seen 9)
-    (!srcfileloc  "stringpool.c" 251)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type struct 1144 nil  gc_unused "cfg_hooks"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1145 nil  gc_unused "pass_outof_cfg_layout_mode"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1146 nil  gc_unused "pass_into_cfg_layout_mode"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1147 nil  gc_unused "pass_free_cfg"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1148 nil  gc_unused "pass_stack_regs_run"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1149 nil  gc_unused "pass_stack_regs"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1150 
-  (!type pointer 1151 nil  gc_unused
-   (!type already_seen 1150)
-  )
-  gc_unused "block_info_def"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1152 
-  (!type pointer 1153 nil  gc_unused
-   (!type already_seen 1152)
-  )
-  gc_unused "stack_def"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type union 1154 nil  gc_unused "anonymous:../../gcc/mcf.c:344"nil 
-  (!fields 0 )
-  nil 0 nil )
- 
- (!type struct 1155 nil  gc_unused "augmenting_path_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1156 nil  gc_unused "queue_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1157 nil  gc_unused "fixup_graph_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1158 
-  (!type pointer 1159 nil  gc_unused
-   (!type already_seen 1158)
-  )
-  gc_unused "fixup_vertex_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1160 
-  (!type pointer 1161 nil  gc_unused
-   (!type already_seen 1160)
-  )
-  gc_unused "fixup_edge_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1162 nil  gc_unused "edge_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1163 nil  gc_unused "bb_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1164 nil  gc_unused "atomic_op_functions"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1165 nil  gc_unused "no_conflict_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1166 nil  gc_unused "godump_container"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1167 nil  gc_unused "macro_hash_value"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1168 nil  gc_unused "pass_rtl_hoist"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1169 nil  gc_unused "pass_rtl_pre"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1170 nil  gc_unused "set_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1171 nil  gc_unused "mem_conflict_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1172 nil  gc_unused "reg_avail_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 1173 nil  gc_unused "vec<modify_pair>"
-  (!srcfileloc  "gcse.c" 635)
-  (!fields 1 
-   (!pair  "modify_pair"
-    (!type struct 1174 nil  gc_unused "modify_pair_s"nil 
-     (!fields 0 )
-     nil 0 nil nil )
-    (!srcfileloc  "gcse.c" 635)
-    nil )
-  )
- )
- 
- (!type user_struct 1175 nil  gc_unused "vec<rtx>"
-  (!srcfileloc  "gcse.c" 634)
-  (!fields 1 
-   (!pair  "rtx"
-    (!type already_seen 136)
-    (!srcfileloc  "gcse.c" 634)
-    nil )
-  )
- )
- 
- (!type struct 1176 nil  gc_unused "bb_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 1174)
- 
- (!type struct 1177 nil  gc_unused "pre_ldst_expr_hasher"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1178 nil  gc_unused "ls_expr"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1179 nil  gc_unused "hash_table_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1180 
-  (!type pointer 1181 nil  gc_unused
-   (!type already_seen 1180)
-  )
-  gc_unused "occr"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1182 nil  gc_unused "expr"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 550)
- 
- (!type struct 1183 nil  gc_unused "pass_convert_to_eh_region_ranges"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1184 nil  gc_unused "pass_set_nothrow_function_flags"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 1185 nil  gc_unused "hash_table<ehspec_hasher>"
-  (!srcfileloc  "except.c" 786)
-  (!fields 1 
-   (!pair  "ehspec_hasher"
-    (!type struct 1186 nil  gc_unused "ehspec_hasher"
-     (!srcfileloc  "except.c" 786)
-     (!fields 0 )
-     nil 511 nil nil )
-    (!srcfileloc  "except.c" 786)
-    nil )
-  )
- )
- 
- (!type already_seen 1186)
- 
- (!type user_struct 1187 nil  gc_unused "hash_table<ttypes_filter_hasher>"
-  (!srcfileloc  "except.c" 749)
-  (!fields 1 
-   (!pair  "ttypes_filter_hasher"
-    (!type struct 1188 nil  gc_unused "ttypes_filter_hasher"
-     (!srcfileloc  "except.c" 749)
-     (!fields 0 )
-     nil 511 nil nil )
-    (!srcfileloc  "except.c" 749)
-    nil )
-  )
- )
- 
- (!type already_seen 1188)
- 
- (!type struct 1189 nil  gc_unused "ttypes_filter"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1190 nil  gc_unused "duplicate_eh_regions_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 1191 nil  gc_unused "hash_table<action_record_hasher>"
-  (!srcfileloc  "except.c" 211)
-  (!fields 1 
-   (!pair  "action_record_hasher"
-    (!type struct 1192 nil  gc_unused "action_record_hasher"
-     (!srcfileloc  "except.c" 211)
-     (!fields 0 )
-     nil 511 nil nil )
-    (!srcfileloc  "except.c" 211)
-    nil )
-  )
- )
- 
- (!type already_seen 1192)
- 
- (!type struct 1193 nil  gc_unused "action_record"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1194 nil  gc_unused "pass_match_asm_constraints"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1195 nil  gc_unused "pass_thread_prologue_and_epilogue"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1196 nil  gc_unused "pass_leaf_regs"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1197 nil  gc_unused "hard_reg_set_container"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1198 nil  gc_unused "assign_parm_data_one"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1199 nil  gc_unused "assign_parm_data_all"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1200 nil  gc_unused "pass_instantiate_virtual_regs"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1201 
-  (!type pointer 1202 nil  gc_unused
-   (!type already_seen 1201)
-  )
-  gc_used "initial_value_pair"
-  (!srcfileloc  "function.c" 1211)
-  (!fields 2 
-   (!pair  "hard_reg"
-    (!type already_seen 136)
-    (!srcfileloc  "function.c" 1209)
-    nil )
-   (!pair  "pseudo"
-    (!type already_seen 136)
-    (!srcfileloc  "function.c" 1210)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type struct 1203 
-  (!type pointer 1204 nil  gc_used
-   (!type already_seen 1203)
-  )
-  gc_pointed_to "temp_slot_address_entry"
-  (!srcfileloc  "function.c" 550)
-  (!fields 3 
-   (!pair  "hash"
-    (!type already_seen 9)
-    (!srcfileloc  "function.c" 547)
-    nil )
-   (!pair  "address"
-    (!type already_seen 136)
-    (!srcfileloc  "function.c" 548)
-    nil )
-   (!pair  "temp_slot"
-    (!type pointer 1205 nil  gc_used
-     (!type struct 1206 
-      (!type already_seen 1205)
-      gc_pointed_to "temp_slot"
-      (!srcfileloc  "function.c" 538)
-      (!fields 10 
-       (!pair  "next"
-        (!type already_seen 1205)
-        (!srcfileloc  "function.c" 514)
-        nil )
-       (!pair  "prev"
-        (!type already_seen 1205)
-        (!srcfileloc  "function.c" 516)
-        nil )
-       (!pair  "slot"
-        (!type already_seen 136)
-        (!srcfileloc  "function.c" 518)
-        nil )
-       (!pair  "size"
-        (!type already_seen 9)
-        (!srcfileloc  "function.c" 520)
-        nil )
-       (!pair  "type"
-        (!type already_seen 5)
-        (!srcfileloc  "function.c" 525)
-        nil )
-       (!pair  "align"
-        (!type already_seen 9)
-        (!srcfileloc  "function.c" 527)
-        nil )
-       (!pair  "in_use"
-        (!type already_seen 28)
-        (!srcfileloc  "function.c" 529)
-        nil )
-       (!pair  "level"
-        (!type already_seen 9)
-        (!srcfileloc  "function.c" 531)
-        nil )
-       (!pair  "base_offset"
-        (!type already_seen 9)
-        (!srcfileloc  "function.c" 534)
-        nil )
-       (!pair  "full_size"
-        (!type already_seen 9)
-        (!srcfileloc  "function.c" 537)
-        nil )
-      )
-      nil 511 nil nil )
-    )
-    (!srcfileloc  "function.c" 549)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type struct 1207 nil  gc_unused "saved_pending_stack_adjust"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1208 nil  gc_unused "locate_and_pad_arg_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1209 nil  gc_unused "args_size"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1210 
-  (!type pointer 1211 nil  gc_unused
-   (!type already_seen 1210)
-  )
-  gc_unused "separate_ops"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1212 nil  gc_unused "store_by_pieces_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1213 nil  gc_unused "move_by_pieces_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 371)
- 
- (!type already_seen 370)
- 
- (!type already_seen 366)
- 
- (!type already_seen 364)
- 
- (!type already_seen 355)
- 
- (!type already_seen 360)
- 
- (!type already_seen 359)
- 
- (!type already_seen 356)
- 
- (!type already_seen 358)
- 
- (!type already_seen 362)
- 
- (!type already_seen 386)
- 
- (!type already_seen 354)
- 
- (!type struct 1214 nil  gc_unused "pass_lower_vector_ssa"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1215 nil  gc_unused "pass_lower_vector"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 1216 nil  gc_unused "hash_table<loc_list_hasher>"
-  (!srcfileloc  "dwarf2out.c" 23883)
-  (!fields 1 
-   (!pair  "loc_list_hasher"
-    (!type struct 1217 nil  gc_unused "loc_list_hasher"
-     (!srcfileloc  "dwarf2out.c" 23883)
-     (!fields 0 )
-     nil 511 nil nil )
-    (!srcfileloc  "dwarf2out.c" 23883)
-    nil )
-  )
- )
- 
- (!type already_seen 1217)
- 
- (!type struct 1218 nil  gc_unused "comdat_type_hasher"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 1219 nil  gc_unused "hash_table<macinfo_entry_hasher>"
-  (!srcfileloc  "dwarf2out.c" 21699)
-  (!fields 1 
-   (!pair  "macinfo_entry_hasher"
-    (!type struct 1220 nil  gc_unused "macinfo_entry_hasher"
-     (!srcfileloc  "dwarf2out.c" 21699)
-     (!fields 0 )
-     nil 511 nil nil )
-    (!srcfileloc  "dwarf2out.c" 21699)
-    nil )
-  )
- )
- 
- (!type already_seen 1220)
- 
- (!type struct 1221 nil  gc_unused "file_name_acquire_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1222 nil  gc_unused "dir_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1223 nil  gc_unused "file_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 1224 nil  gc_unused "hash_table<external_ref_hasher>"
-  (!srcfileloc  "dwarf2out.c" 7518)
-  (!fields 1 
-   (!pair  "external_ref_hasher"
-    (!type struct 1225 nil  gc_unused "external_ref_hasher"
-     (!srcfileloc  "dwarf2out.c" 7518)
-     (!fields 0 )
-     nil 511 nil nil )
-    (!srcfileloc  "dwarf2out.c" 7518)
-    nil )
-  )
- )
- 
- (!type already_seen 1225)
- 
- (!type struct 1226 nil  gc_unused "external_ref"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 1227 nil  gc_unused "hash_table<decl_table_entry_hasher>"
-  (!srcfileloc  "dwarf2out.c" 6983)
-  (!fields 1 
-   (!pair  "decl_table_entry_hasher"
-    (!type struct 1228 nil  gc_unused "decl_table_entry_hasher"
-     (!srcfileloc  "dwarf2out.c" 6983)
-     (!fields 0 )
-     nil 511 nil nil )
-    (!srcfileloc  "dwarf2out.c" 6983)
-    nil )
-  )
- )
- 
- (!type already_seen 1228)
- 
- (!type struct 1229 nil  gc_unused "decl_table_entry"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 1230 nil  gc_unused "hash_table<cu_hash_table_entry_hasher>"
-  (!srcfileloc  "dwarf2out.c" 6658)
-  (!fields 1 
-   (!pair  "cu_hash_table_entry_hasher"
-    (!type struct 1231 nil  gc_unused "cu_hash_table_entry_hasher"
-     (!srcfileloc  "dwarf2out.c" 6658)
-     (!fields 0 )
-     nil 511 nil nil )
-    (!srcfileloc  "dwarf2out.c" 6658)
-    nil )
-  )
- )
- 
- (!type already_seen 1231)
- 
- (!type struct 1232 nil  gc_unused "cu_hash_table_entry"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1233 nil  gc_unused "checksum_attributes"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1234 nil  gc_unused "md5_ctx"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 1235 
-  (!type pointer 1236 nil  gc_used
-   (!type already_seen 1235)
-  )
-  gc_pointed_to "vec<die_arg_entry,va_gc>"
-  (!srcfileloc  "dwarf2out.c" 2920)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "dwarf2out.c" 2920)
-    nil )
-   (!pair  "die_arg_entry"
-    (!type struct 1237 nil  gc_used "die_arg_entry_struct"
-     (!srcfileloc  "dwarf2out.c" 2743)
-     (!fields 2 
-      (!pair  "die"
-       (!type already_seen 426)
-       (!srcfileloc  "dwarf2out.c" 2741)
-       nil )
-      (!pair  "arg"
-       (!type already_seen 5)
-       (!srcfileloc  "dwarf2out.c" 2742)
-       nil )
-     )
-     nil 511 nil nil )
-    (!srcfileloc  "dwarf2out.c" 2920)
-    nil )
-  )
- )
- 
- (!type user_struct 1238 
-  (!type pointer 1239 nil  gc_used
-   (!type already_seen 1238)
-  )
-  gc_pointed_to "vec<macinfo_entry,va_gc>"
-  (!srcfileloc  "dwarf2out.c" 2868)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "dwarf2out.c" 2868)
-    nil )
-   (!pair  "macinfo_entry"
-    (!type struct 1240 nil  gc_used "macinfo_struct"
-     (!srcfileloc  "dwarf2out.c" 2597)
-     (!fields 3 
-      (!pair  "code"
-       (!type already_seen 28)
-       (!srcfileloc  "dwarf2out.c" 2594)
-       nil )
-      (!pair  "lineno"
-       (!type already_seen 9)
-       (!srcfileloc  "dwarf2out.c" 2595)
-       nil )
-      (!pair  "info"
-       (!type already_seen 36)
-       (!srcfileloc  "dwarf2out.c" 2596)
-       nil )
-     )
-     nil 511 nil nil )
-    (!srcfileloc  "dwarf2out.c" 2868)
-    nil )
-  )
- )
- 
- (!type user_struct 1241 
-  (!type pointer 1242 nil  gc_used
-   (!type already_seen 1241)
-  )
-  gc_pointed_to "vec<pubname_entry,va_gc>"
-  (!srcfileloc  "dwarf2out.c" 2860)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "dwarf2out.c" 2860)
-    nil )
-   (!pair  "pubname_entry"
-    (!type struct 1243 
-     (!type pointer 1244 nil  gc_unused
-      (!type already_seen 1243)
-     )
-     gc_used "pubname_struct"
-     (!srcfileloc  "dwarf2out.c" 2581)
-     (!fields 2 
-      (!pair  "die"
-       (!type already_seen 426)
-       (!srcfileloc  "dwarf2out.c" 2579)
-       nil )
-      (!pair  "name"
-       (!type already_seen 36)
-       (!srcfileloc  "dwarf2out.c" 2580)
-       nil )
-     )
-     nil 511 nil nil )
-    (!srcfileloc  "dwarf2out.c" 2860)
-    nil )
-  )
- )
- 
- (!type user_struct 1245 
-  (!type pointer 1246 nil  gc_used
-   (!type already_seen 1245)
-  )
-  gc_pointed_to "vec<dw_line_info_table_p,va_gc>"
-  (!srcfileloc  "dwarf2out.c" 2852)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "dwarf2out.c" 2852)
-    nil )
-   (!pair  "dw_line_info_table_p"
-    (!type pointer 1247 nil  gc_used
-     (!type struct 1248 
-      (!type already_seen 1247)
-      gc_pointed_to "dw_line_info_table_struct"
-      (!srcfileloc  "dwarf2out.c" 2523)
-      (!fields 8 
-       (!pair  "end_label"
-        (!type already_seen 36)
-        (!srcfileloc  "dwarf2out.c" 2511)
-        nil )
-       (!pair  "file_num"
-        (!type already_seen 9)
-        (!srcfileloc  "dwarf2out.c" 2515)
-        nil )
-       (!pair  "line_num"
-        (!type already_seen 9)
-        (!srcfileloc  "dwarf2out.c" 2516)
-        nil )
-       (!pair  "column_num"
-        (!type already_seen 9)
-        (!srcfileloc  "dwarf2out.c" 2517)
-        nil )
-       (!pair  "discrim_num"
-        (!type already_seen 9)
-        (!srcfileloc  "dwarf2out.c" 2518)
-        nil )
-       (!pair  "is_stmt"
-        (!type already_seen 9)
-        (!srcfileloc  "dwarf2out.c" 2519)
-        nil )
-       (!pair  "in_use"
-        (!type already_seen 9)
-        (!srcfileloc  "dwarf2out.c" 2520)
-        nil )
-       (!pair  "entries"
-        (!type pointer 1249 nil  gc_used
-         (!type user_struct 1250 
-          (!type already_seen 1249)
-          gc_pointed_to "vec<dw_line_info_entry,va_gc>"
-          (!srcfileloc  "dwarf2out.c" 2522)
-          (!fields 2 
-           (!pair  "va_gc"
-            (!type already_seen 3)
-            (!srcfileloc  "dwarf2out.c" 2522)
-            nil )
-           (!pair  "dw_line_info_entry"
-            (!type struct 1251 
-             (!type pointer 1252 nil  gc_unused
-              (!type already_seen 1251)
-             )
-             gc_used "dw_line_info_struct"
-             (!srcfileloc  "dwarf2out.c" 2506)
-             (!fields 2 
-              (!pair  "opcode"
-               (!type already_seen 9)
-               (!srcfileloc  "dwarf2out.c" 2504)
-               nil )
-              (!pair  "val"
-               (!type already_seen 9)
-               (!srcfileloc  "dwarf2out.c" 2505)
-               nil )
-             )
-             nil 511 nil nil )
-            (!srcfileloc  "dwarf2out.c" 2522)
-            nil )
-          )
-         )
-        )
-        (!srcfileloc  "dwarf2out.c" 2522)
-        nil )
-      )
-      nil 511 nil nil )
-    )
-    (!srcfileloc  "dwarf2out.c" 2852)
-    nil )
-  )
- )
- 
- (!type struct 1253 
-  (!type pointer 1254 nil  gc_used
-   (!type already_seen 1253)
-  )
-  gc_pointed_to "cached_dw_loc_list_def"
-  (!srcfileloc  "dwarf2out.c" 2817)
-  (!fields 2 
-   (!pair  "decl_id"
-    (!type already_seen 9)
-    (!srcfileloc  "dwarf2out.c" 2813)
-    nil )
-   (!pair  "loc_list"
-    (!type already_seen 422)
-    (!srcfileloc  "dwarf2out.c" 2816)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type struct 1255 
-  (!type pointer 1256 nil  gc_used
-   (!type already_seen 1255)
-  )
-  gc_pointed_to "call_arg_loc_node"
-  (!srcfileloc  "dwarf2out.c" 2791)
-  (!fields 6 
-   (!pair  "call_arg_loc_note"
-    (!type already_seen 136)
-    (!srcfileloc  "dwarf2out.c" 2785)
-    nil )
-   (!pair  "label"
-    (!type already_seen 36)
-    (!srcfileloc  "dwarf2out.c" 2786)
-    nil )
-   (!pair  "block"
-    (!type already_seen 5)
-    (!srcfileloc  "dwarf2out.c" 2787)
-    nil )
-   (!pair  "tail_call_p"
-    (!type already_seen 9)
-    (!srcfileloc  "dwarf2out.c" 2788)
-    nil )
-   (!pair  "symbol_ref"
-    (!type already_seen 136)
-    (!srcfileloc  "dwarf2out.c" 2789)
-    nil )
-   (!pair  "next"
-    (!type already_seen 1256)
-    (!srcfileloc  "dwarf2out.c" 2790)
-    nil )
-  )
-  (!options 
-   (!option chain_next string  "%h.next")
-  )
-  511 nil nil )
- 
- (!type struct 1257 
-  (!type pointer 1258 nil  gc_used
-   (!type already_seen 1257)
-  )
-  gc_pointed_to "var_loc_list_def"
-  (!srcfileloc  "dwarf2out.c" 2780)
-  (!fields 4 
-   (!pair  "first"
-    (!type pointer 1259 nil  gc_used
-     (!type struct 1260 
-      (!type already_seen 1259)
-      gc_pointed_to "var_loc_node"
-      (!srcfileloc  "dwarf2out.c" 2759)
-      (!fields 3 
-       (!pair  "loc"
-        (!type already_seen 136)
-        (!srcfileloc  "dwarf2out.c" 2756)
-        nil )
-       (!pair  "label"
-        (!type already_seen 36)
-        (!srcfileloc  "dwarf2out.c" 2757)
-        nil )
-       (!pair  "next"
-        (!type already_seen 1259)
-        (!srcfileloc  "dwarf2out.c" 2758)
-        nil )
-      )
-      (!options 
-       (!option chain_next string  "%h.next")
-      )
-      511 nil nil )
-    )
-    (!srcfileloc  "dwarf2out.c" 2763)
-    nil )
-   (!pair  "last"
-    (!type already_seen 1259)
-    (!srcfileloc  "dwarf2out.c" 2771)
-    (!options 
-     (!option skip string  "%h")
-    )
-   )
-   (!pair  "last_before_switch"
-    (!type already_seen 1259)
-    (!srcfileloc  "dwarf2out.c" 2776)
-    (!options 
-     (!option skip string  "%h")
-    )
-   )
-   (!pair  "decl_id"
-    (!type already_seen 9)
-    (!srcfileloc  "dwarf2out.c" 2779)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type already_seen 1260)
- 
- (!type already_seen 1237)
- 
- (!type struct 1261 nil  gc_unused "skeleton_chain_struct"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1262 
-  (!type pointer 1263 nil  gc_used
-   (!type already_seen 1262)
-  )
-  gc_pointed_to "limbo_die_struct"
-  (!srcfileloc  "dwarf2out.c" 2622)
-  (!fields 3 
-   (!pair  "die"
-    (!type already_seen 426)
-    (!srcfileloc  "dwarf2out.c" 2619)
-    nil )
-   (!pair  "created_for"
-    (!type already_seen 5)
-    (!srcfileloc  "dwarf2out.c" 2620)
-    nil )
-   (!pair  "next"
-    (!type already_seen 1263)
-    (!srcfileloc  "dwarf2out.c" 2621)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type already_seen 1240)
- 
- (!type already_seen 434)
- 
- (!type already_seen 429)
- 
- (!type already_seen 1248)
- 
- (!type already_seen 1250)
- 
- (!type already_seen 431)
- 
- (!type struct 1264 
-  (!type pointer 1265 nil  gc_used
-   (!type already_seen 1264)
-  )
-  gc_pointed_to "dw_ranges_by_label_struct"
-  (!srcfileloc  "dwarf2out.c" 2604)
-  (!fields 2 
-   (!pair  "begin"
-    (!type already_seen 36)
-    (!srcfileloc  "dwarf2out.c" 2602)
-    nil )
-   (!pair  "end"
-    (!type already_seen 36)
-    (!srcfileloc  "dwarf2out.c" 2603)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type struct 1266 
-  (!type pointer 1267 nil  gc_used
-   (!type already_seen 1266)
-  )
-  gc_pointed_to "dw_ranges_struct"
-  (!srcfileloc  "dwarf2out.c" 2589)
-  (!fields 1 
-   (!pair  "num"
-    (!type already_seen 9)
-    (!srcfileloc  "dwarf2out.c" 2588)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type already_seen 1243)
- 
- (!type already_seen 1251)
- 
- (!type already_seen 435)
- 
- (!type already_seen 420)
- 
- (!type user_struct 1268 
-  (!type pointer 1269 nil  gc_used
-   (!type already_seen 1268)
-  )
-  gc_pointed_to "vec<deferred_locations,va_gc>"
-  (!srcfileloc  "dwarf2out.c" 1237)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "dwarf2out.c" 1237)
-    nil )
-   (!pair  "deferred_locations"
-    (!type struct 1270 nil  gc_used "deferred_locations_struct"
-     (!srcfileloc  "dwarf2out.c" 1234)
-     (!fields 2 
-      (!pair  "variable"
-       (!type already_seen 5)
-       (!srcfileloc  "dwarf2out.c" 1232)
-       nil )
-      (!pair  "die"
-       (!type already_seen 426)
-       (!srcfileloc  "dwarf2out.c" 1233)
-       nil )
-     )
-     nil 511 nil nil )
-    (!srcfileloc  "dwarf2out.c" 1237)
-    nil )
-  )
- )
- 
- (!type already_seen 1270)
- 
- (!type user_struct 1271 
-  (!type pointer 1272 nil  gc_used
-   (!type already_seen 1271)
-  )
-  gc_pointed_to "vec<dw_fde_ref,va_gc>"
-  (!srcfileloc  "dwarf2out.c" 203)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "dwarf2out.c" 203)
-    nil )
-   (!pair  "dw_fde_ref"
-    (!type already_seen 407)
-    (!srcfileloc  "dwarf2out.c" 203)
-    nil )
-  )
- )
- 
- (!type struct 1273 nil  gc_unused "pass_dwarf2_frame"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1274 nil  gc_unused "anonymous:../../gcc/dwarf2cfi.c:218"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1275 nil  gc_unused "trace_info_hasher"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1276 
-  (!type pointer 1277 nil  gc_unused
-   (!type already_seen 1276)
-  )
-  gc_unused "anonymous:../../gcc/dwarf2cfi.c:101"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1278 
-  (!type pointer 1279 nil  gc_used
-   (!type already_seen 1278)
-  )
-  gc_pointed_to "reg_saved_in_data_struct"
-  (!srcfileloc  "dwarf2cfi.c" 80)
-  (!fields 2 
-   (!pair  "orig_reg"
-    (!type already_seen 136)
-    (!srcfileloc  "dwarf2cfi.c" 78)
-    nil )
-   (!pair  "saved_in_reg"
-    (!type already_seen 136)
-    (!srcfileloc  "dwarf2cfi.c" 79)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type struct 1280 
-  (!type pointer 1281 nil  gc_used
-   (!type already_seen 1280)
-  )
-  gc_pointed_to "dw_cfi_row_struct"
-  (!srcfileloc  "dwarf2cfi.c" 74)
-  (!fields 3 
-   (!pair  "cfa"
-    (!type struct 1282 nil  gc_used "dw_cfa_location"
-     (!srcfileloc  "dwarf2cfi.c" 69)
-     (!fields 5 
-      (!pair  "offset"
-       (!type already_seen 9)
-       (!srcfileloc  "dwarf2out.h" 115)
-       nil )
-      (!pair  "base_offset"
-       (!type already_seen 9)
-       (!srcfileloc  "dwarf2out.h" 116)
-       nil )
-      (!pair  "reg"
-       (!type already_seen 9)
-       (!srcfileloc  "dwarf2out.h" 118)
-       nil )
-      (!pair  "indirect"
-       (!type already_seen 9)
-       (!srcfileloc  "dwarf2out.h" 119)
-       nil )
-      (!pair  "in_use"
-       (!type already_seen 9)
-       (!srcfileloc  "dwarf2out.h" 120)
-       nil )
-     )
-     nil 511 nil nil )
-    (!srcfileloc  "dwarf2cfi.c" 69)
-    nil )
-   (!pair  "cfa_cfi"
-    (!type already_seen 411)
-    (!srcfileloc  "dwarf2cfi.c" 70)
-    nil )
-   (!pair  "reg_save"
-    (!type already_seen 409)
-    (!srcfileloc  "dwarf2cfi.c" 73)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type struct 1283 nil  gc_unused "array_descr_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 421)
- 
- (!type already_seen 442)
- 
- (!type already_seen 440)
- 
- (!type already_seen 438)
- 
- (!type already_seen 425)
- 
- (!type already_seen 419)
- 
- (!type already_seen 424)
- 
- (!type already_seen 1282)
- 
- (!type already_seen 410)
- 
- (!type already_seen 413)
- 
- (!type already_seen 423)
- 
- (!type already_seen 415)
- 
- (!type already_seen 412)
- 
- (!type already_seen 416)
- 
- (!type struct 1284 nil  gc_unused "dbx_file"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1285 
-  (!type pointer 1286 nil  gc_used
-   (!type already_seen 1285)
-  )
-  gc_pointed_to "typeinfo"
-  (!srcfileloc  "dbxout.c" 174)
-  (!fields 3 
-   (!pair  "status"
-    (!type already_seen 9)
-    (!srcfileloc  "dbxout.c" 171)
-    nil )
-   (!pair  "file_number"
-    (!type already_seen 9)
-    (!srcfileloc  "dbxout.c" 172)
-    nil )
-   (!pair  "type_number"
-    (!type already_seen 9)
-    (!srcfileloc  "dbxout.c" 173)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type already_seen 847)
- 
- (!type struct 1287 nil  gc_unused "ipa_polymorphic_call_context"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1288 nil  gc_unused "ipa_dfs_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1289 nil  gc_unused "pass_ipa_cp"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 875)
- 
- (!type already_seen 978)
- 
- (!type struct 1290 nil  gc_unused "topo_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1291 nil  gc_unused "caller_statistics"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1292 nil  gc_unused "ipcp_param_lattices"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1293 nil  gc_unused "ipcp_agg_lattice"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1294 nil  gc_unused "ipcp_lattice"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1295 nil  gc_unused "ipcp_value_source"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1296 nil  gc_unused "ipcp_value"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1297 nil  gc_unused "lto_input_block"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1298 nil  gc_unused "output_block"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1299 nil  gc_unused "data_in"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1300 nil  gc_unused "bitpack_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 971)
- 
- (!type already_seen 993)
- 
- (!type struct 1301 nil  gc_unused "inline_edge_summary"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 974)
- 
- (!type struct 1302 nil  gc_unused "ipa_known_agg_contents_list"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1303 nil  gc_unused "type_change_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 982)
- 
- (!type already_seen 977)
- 
- (!type struct 1304 nil  gc_unused "ipa_node_params"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 987)
- 
- (!type struct 1305 nil  gc_unused "param_analysis_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1306 nil  gc_unused "cselib_record_autoinc_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1307 nil  gc_unused "cselib_hasher"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1308 nil  gc_unused "expand_value_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1309 nil  gc_unused "elt_list"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1310 nil  gc_unused "output_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1311 nil  gc_unused "bitmap_desc_hasher"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1312 nil  gc_unused "loc"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1313 
-  (!type pointer 1314 nil  gc_unused
-   (!type already_seen 1313)
-  )
-  gc_unused "bitmap_descriptor_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type user_struct 1315 
-  (!type pointer 1316 nil  gc_used
-   (!type already_seen 1315)
-  )
-  gc_pointed_to "vec<alias_set_entry,va_gc>"
-  (!srcfileloc  "alias.c" 267)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "alias.c" 267)
-    nil )
-   (!pair  "alias_set_entry"
-    (!type pointer 1317 nil  gc_used
-     (!type struct 1318 
-      (!type already_seen 1317)
-      gc_pointed_to "alias_set_entry_d"
-      (!srcfileloc  "alias.c" 148)
-      (!fields 3 
-       (!pair  "alias_set"
-        (!type already_seen 9)
-        (!srcfileloc  "alias.c" 134)
-        nil )
-       (!pair  "has_zero_child"
-        (!type already_seen 9)
-        (!srcfileloc  "alias.c" 138)
-        nil )
-       (!pair  "children"
-        (!type pointer 1319 nil  gc_used
-         (!type param_struct 1320 
-          (!type already_seen 1319)
-          gc_pointed_to
-          (!type struct 1321 
-           (!type pointer 1322 nil  gc_unused
-            (!type already_seen 1321)
-           )
-           gc_used "splay_tree_s"
-           (!srcfileloc  "../include/splay-tree.h" 123)
-           (!fields 7 
-            (!pair  "root"
-             (!type pointer 1323 nil  gc_unused
-              (!type struct 1324 
-               (!type already_seen 1323)
-               gc_used "splay_tree_node_s"
-               (!srcfileloc  "../include/splay-tree.h" 99)
-               (!fields 4 
-                (!pair  "key"
-                 (!type already_seen 9)
-                 (!srcfileloc  "../include/splay-tree.h" 91)
-                 (!options 
-                  (!option use_param1 string  "")
-                 )
-                )
-                (!pair  "value"
-                 (!type already_seen 9)
-                 (!srcfileloc  "../include/splay-tree.h" 94)
-                 (!options 
-                  (!option use_param2 string  "")
-                 )
-                )
-                (!pair  "left"
-                 (!type already_seen 1323)
-                 (!srcfileloc  "../include/splay-tree.h" 97)
-                 (!options 
-                  (!option use_params string  "")
-                 )
-                )
-                (!pair  "right"
-                 (!type already_seen 1323)
-                 (!srcfileloc  "../include/splay-tree.h" 98)
-                 (!options 
-                  (!option use_params string  "")
-                 )
-                )
-               )
-               nil 511 nil nil )
-             )
-             (!srcfileloc  "../include/splay-tree.h" 104)
-             (!options 
-              (!option use_params string  "")
-             )
-            )
-            (!pair  "comp"
-             (!type already_seen 9)
-             (!srcfileloc  "../include/splay-tree.h" 107)
-             nil )
-            (!pair  "delete_key"
-             (!type already_seen 9)
-             (!srcfileloc  "../include/splay-tree.h" 110)
-             nil )
-            (!pair  "delete_value"
-             (!type already_seen 9)
-             (!srcfileloc  "../include/splay-tree.h" 113)
-             nil )
-            (!pair  "allocate"
-             (!type already_seen 9)
-             (!srcfileloc  "../include/splay-tree.h" 116)
-             nil )
-            (!pair  "deallocate"
-             (!type already_seen 9)
-             (!srcfileloc  "../include/splay-tree.h" 119)
-             nil )
-            (!pair  "allocate_data"
-             (!type already_seen 10)
-             (!srcfileloc  "../include/splay-tree.h" 122)
-             (!options 
-              (!option skip string  "")
-             )
-            )
-           )
-           nil 511 nil nil )
-          nil 
-          (!type already_seen 9)
-          
-          (!type already_seen 9)
-          nil nil nil nil nil nil nil nil )
-        )
-        (!srcfileloc  "alias.c" 147)
-        (!options 
-         (!option param2_is type 
-          (!type already_seen 9)
-         )
-         (!option param1_is type 
-          (!type already_seen 9)
-         )
-        )
-       )
-      )
-      nil 511 nil nil )
-    )
-    (!srcfileloc  "alias.c" 267)
-    nil )
-  )
- )
- 
- (!type already_seen 1318)
- 
- (!type struct 1325 nil  gc_unused "saved_hard_reg"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1326 nil  gc_unused "insn_chain"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1327 nil  gc_unused "reg_equivs_t"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1328 nil  gc_unused "target_reload"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1329 nil  gc_unused "reload"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1330 
-  (!type pointer 1331 nil  gc_used
-   (!type already_seen 1330)
-  )
-  gc_pointed_to "constant_descriptor_tree"
-  (!srcfileloc  "cgraph.h" 1337)
-  (!fields 3 
-   (!pair  "rtl"
-    (!type already_seen 136)
-    (!srcfileloc  "cgraph.h" 1328)
-    nil )
-   (!pair  "value"
-    (!type already_seen 5)
-    (!srcfileloc  "cgraph.h" 1331)
-    nil )
-   (!pair  "hash"
-    (!type already_seen 9)
-    (!srcfileloc  "cgraph.h" 1336)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type struct 1332 nil  gc_unused "cgraph_2node_hook_list"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1333 nil  gc_unused "cgraph_2edge_hook_list"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1334 nil  gc_unused "varpool_node_hook_list"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1335 nil  gc_unused "cgraph_node_hook_list"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1336 nil  gc_unused "cgraph_edge_hook_list"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1337 
-  (!type pointer 1338 nil  gc_used
-   (!type already_seen 1337)
-  )
-  gc_pointed_to "asm_node"
-  (!srcfileloc  "cgraph.h" 657)
-  (!fields 3 
-   (!pair  "next"
-    (!type already_seen 1338)
-    (!srcfileloc  "cgraph.h" 652)
-    nil )
-   (!pair  "asm_str"
-    (!type already_seen 5)
-    (!srcfileloc  "cgraph.h" 654)
-    nil )
-   (!pair  "order"
-    (!type already_seen 9)
-    (!srcfileloc  "cgraph.h" 656)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type already_seen 918)
- 
- (!type struct 1339 nil  gc_unused "varpool_node_set_iterator"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1340 nil  gc_unused "cgraph_node_set_iterator"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1341 
-  (!type pointer 1342 nil  gc_unused
-   (!type already_seen 1341)
-  )
-  gc_unused "varpool_node_set_def"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1343 
-  (!type pointer 1344 nil  gc_unused
-   (!type already_seen 1343)
-  )
-  gc_unused "cgraph_node_set_def"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1345 
-  (!type pointer 1346 nil  gc_used
-   (!type already_seen 1345)
-  )
-  gc_pointed_to "cgraph_function_version_info"
-  (!srcfileloc  "cgraph.h" 464)
-  (!fields 4 
-   (!pair  "this_node"
-    (!type already_seen 912)
-    (!srcfileloc  "cgraph.h" 445)
-    nil )
-   (!pair  "prev"
-    (!type already_seen 1346)
-    (!srcfileloc  "cgraph.h" 449)
-    nil )
-   (!pair  "next"
-    (!type already_seen 1346)
-    (!srcfileloc  "cgraph.h" 453)
-    nil )
-   (!pair  "dispatcher_resolver"
-    (!type already_seen 5)
-    (!srcfileloc  "cgraph.h" 463)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type already_seen 925)
- 
- (!type already_seen 916)
- 
- (!type already_seen 922)
- 
- (!type already_seen 924)
- 
- (!type already_seen 931)
- 
- (!type already_seen 933)
- 
- (!type already_seen 935)
- 
- (!type already_seen 930)
- 
- (!type already_seen 929)
- 
- (!type already_seen 928)
- 
- (!type already_seen 936)
- 
- (!type already_seen 947)
- 
- (!type already_seen 939)
- 
- (!type already_seen 944)
- 
- (!type already_seen 941)
- 
- (!type already_seen 942)
- 
- (!type already_seen 937)
- 
- (!type struct 1347 
-  (!type pointer 1348 nil  gc_unused
-   (!type already_seen 1347)
-  )
-  gc_pointed_to "varpool_node"
-  (!srcfileloc  "cgraph.h" 646)
-  (!fields 2 
-   (!pair  "output"
-    (!type already_seen 9)
-    (!srcfileloc  "cgraph.h" 641)
-    nil )
-   (!pair  "dynamically_initialized"
-    (!type already_seen 9)
-    (!srcfileloc  "cgraph.h" 645)
-    nil )
-  )
-  (!options 
-   (!option tag string  "SYMTAB_VARIABLE")
-  )
-  511 nil 
-  (!type already_seen 937)
- )
- 
- (!type already_seen 914)
- 
- (!type struct 1349 nil  gc_unused "gcov_working_set_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1350 nil  gc_unused "edge_iterator"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1351 nil  gc_unused "control_dependences"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1352 nil  gc_unused "edge_list"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1353 nil  gc_unused "ce_if_block"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 377)
- 
- (!type already_seen 319)
- 
- (!type already_seen 321)
- 
- (!type already_seen 318)
- 
- (!type already_seen 300)
- 
- (!type already_seen 320)
- 
- (!type already_seen 323)
- 
- (!type struct 1354 nil  gc_unused "profile_record"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1355 nil  gc_unused "cselib_set"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1356 nil  gc_unused "elt_loc_list"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1357 nil  gc_unused "cselib_val"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 546)
- 
- (!type struct 1358 nil  gc_unused "loop_iterator"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1359 nil  gc_unused "rtx_iv"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1360 nil  gc_unused "eni_weights_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 315)
- 
- (!type already_seen 307)
- 
- (!type already_seen 304)
- 
- (!type already_seen 313)
- 
- (!type already_seen 309)
- 
- (!type already_seen 305)
- 
- (!type already_seen 250)
- 
- (!type already_seen 249)
- 
- (!type already_seen 248)
- 
- (!type already_seen 247)
- 
- (!type struct 1361 
-  (!type pointer 1362 nil  gc_used
-   (!type already_seen 1361)
-  )
-  gc_pointed_to "types_used_by_vars_entry"
-  (!srcfileloc  "function.h" 708)
-  (!fields 2 
-   (!pair  "type"
-    (!type already_seen 5)
-    (!srcfileloc  "function.h" 706)
-    nil )
-   (!pair  "var_decl"
-    (!type already_seen 5)
-    (!srcfileloc  "function.h" 707)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type already_seen 75)
- 
- (!type already_seen 398)
- 
- (!type already_seen 375)
- 
- (!type already_seen 352)
- 
- (!type already_seen 402)
- 
- (!type struct 1363 nil  gc_used "rtl_data"
-  (!srcfileloc  "function.h" 463)
-  (!fields 57 
-   (!pair  "expr"
-    (!type struct 1364 nil  gc_used "expr_status"
-     (!srcfileloc  "function.h" 139)
-     (!fields 6 
-      (!pair  "x_pending_stack_adjust"
-       (!type already_seen 9)
-       (!srcfileloc  "function.h" 104)
-       nil )
-      (!pair  "x_inhibit_defer_pop"
-       (!type already_seen 9)
-       (!srcfileloc  "function.h" 121)
-       nil )
-      (!pair  "x_stack_pointer_delta"
-       (!type already_seen 9)
-       (!srcfileloc  "function.h" 127)
-       nil )
-      (!pair  "x_saveregs_value"
-       (!type already_seen 136)
-       (!srcfileloc  "function.h" 132)
-       nil )
-      (!pair  "x_apply_args_value"
-       (!type already_seen 136)
-       (!srcfileloc  "function.h" 135)
-       nil )
-      (!pair  "x_forced_labels"
-       (!type already_seen 136)
-       (!srcfileloc  "function.h" 138)
-       nil )
-     )
-     nil 511 nil nil )
-    (!srcfileloc  "function.h" 237)
-    nil )
-   (!pair  "emit"
-    (!type struct 1365 nil  gc_used "emit_status"
-     (!srcfileloc  "function.h" 82)
-     (!fields 9 
-      (!pair  "x_reg_rtx_no"
-       (!type already_seen 9)
-       (!srcfileloc  "function.h" 45)
-       nil )
-      (!pair  "x_first_label_num"
-       (!type already_seen 9)
-       (!srcfileloc  "function.h" 48)
-       nil )
-      (!pair  "x_first_insn"
-       (!type already_seen 136)
-       (!srcfileloc  "function.h" 55)
-       nil )
-      (!pair  "x_last_insn"
-       (!type already_seen 136)
-       (!srcfileloc  "function.h" 56)
-       nil )
-      (!pair  "sequence_stack"
-       (!type pointer 1366 nil  gc_used
-        (!type struct 1367 
-         (!type already_seen 1366)
-         gc_pointed_to "sequence_stack"
-         (!srcfileloc  "function.h" 40)
-         (!fields 3 
-          (!pair  "first"
-           (!type already_seen 136)
-           (!srcfileloc  "function.h" 37)
-           nil )
-          (!pair  "last"
-           (!type already_seen 136)
-           (!srcfileloc  "function.h" 38)
-           nil )
-          (!pair  "next"
-           (!type already_seen 1366)
-           (!srcfileloc  "function.h" 39)
-           nil )
-         )
-         nil 511 nil nil )
-       )
-       (!srcfileloc  "function.h" 62)
-       nil )
-      (!pair  "x_cur_insn_uid"
-       (!type already_seen 9)
-       (!srcfileloc  "function.h" 66)
-       nil )
-      (!pair  "x_cur_debug_insn_uid"
-       (!type already_seen 9)
-       (!srcfileloc  "function.h" 70)
-       nil )
-      (!pair  "regno_pointer_align_length"
-       (!type already_seen 9)
-       (!srcfileloc  "function.h" 76)
-       nil )
-      (!pair  "regno_pointer_align"
-       (!type already_seen 36)
-       (!srcfileloc  "function.h" 81)
-       (!options 
-        (!option skip string  "")
-       )
-      )
-     )
-     nil 511 nil nil )
-    (!srcfileloc  "function.h" 238)
-    nil )
-   (!pair  "varasm"
-    (!type struct 1368 nil  gc_used "varasm_status"
-     (!srcfileloc  "function.h" 181)
-     (!fields 2 
-      (!pair  "pool"
-       (!type pointer 1369 nil  gc_used
-        (!type struct 1370 
-         (!type already_seen 1369)
-         gc_pointed_to "rtx_constant_pool"
-         (!srcfileloc  "varasm.c" 3475)
-         (!fields 4 
-          (!pair  "first"
-           (!type already_seen 254)
-           (!srcfileloc  "varasm.c" 3463)
-           nil )
-          (!pair  "last"
-           (!type already_seen 254)
-           (!srcfileloc  "varasm.c" 3464)
-           nil )
-          (!pair  "const_rtx_htab"
-           (!type pointer 1371 nil  gc_used
-            (!type param_struct 1372 
-             (!type already_seen 1371)
-             gc_pointed_to
-             (!type already_seen 49)
-             
-             (!type already_seen 254)
-             nil nil nil nil nil nil nil nil nil nil )
-           )
-           (!srcfileloc  "varasm.c" 3470)
-           (!options 
-            (!option param_is type 
-             (!type already_seen 255)
-            )
-           )
-          )
-          (!pair  "offset"
-           (!type already_seen 9)
-           (!srcfileloc  "varasm.c" 3474)
-           nil )
-         )
-         nil 511 nil nil )
-       )
-       (!srcfileloc  "function.h" 176)
-       nil )
-      (!pair  "deferred_constants"
-       (!type already_seen 9)
-       (!srcfileloc  "function.h" 180)
-       nil )
-     )
-     nil 511 nil nil )
-    (!srcfileloc  "function.h" 239)
-    nil )
-   (!pair  "args"
-    (!type struct 1373 nil  gc_used "incoming_args"
-     (!srcfileloc  "function.h" 210)
-     (!fields 6 
-      (!pair  "pops_args"
-       (!type already_seen 9)
-       (!srcfileloc  "function.h" 188)
-       nil )
-      (!pair  "size"
-       (!type already_seen 9)
-       (!srcfileloc  "function.h" 193)
-       nil )
-      (!pair  "pretend_args_size"
-       (!type already_seen 9)
-       (!srcfileloc  "function.h" 198)
-       nil )
-      (!pair  "arg_offset_rtx"
-       (!type already_seen 136)
-       (!srcfileloc  "function.h" 202)
-       nil )
-      (!pair  "info"
-       (!type already_seen 9)
-       (!srcfileloc  "function.h" 206)
-       nil )
-      (!pair  "internal_arg_pointer"
-       (!type already_seen 136)
-       (!srcfileloc  "function.h" 209)
-       nil )
-     )
-     nil 511 nil nil )
-    (!srcfileloc  "function.h" 240)
-    nil )
-   (!pair  "subsections"
-    (!type struct 1374 nil  gc_used "function_subsections"
-     (!srcfileloc  "function.h" 222)
-     (!fields 4 
-      (!pair  "hot_section_label"
-       (!type already_seen 36)
-       (!srcfileloc  "function.h" 218)
-       nil )
-      (!pair  "cold_section_label"
-       (!type already_seen 36)
-       (!srcfileloc  "function.h" 219)
-       nil )
-      (!pair  "hot_section_end_label"
-       (!type already_seen 36)
-       (!srcfileloc  "function.h" 220)
-       nil )
-      (!pair  "cold_section_end_label"
-       (!type already_seen 36)
-       (!srcfileloc  "function.h" 221)
-       nil )
-     )
-     nil 511 nil nil )
-    (!srcfileloc  "function.h" 241)
-    nil )
-   (!pair  "eh"
-    (!type struct 1375 nil  gc_used "rtl_eh"
-     (!srcfileloc  "function.h" 155)
-     (!fields 7 
-      (!pair  "ehr_stackadj"
-       (!type already_seen 136)
-       (!srcfileloc  "function.h" 145)
-       nil )
-      (!pair  "ehr_handler"
-       (!type already_seen 136)
-       (!srcfileloc  "function.h" 146)
-       nil )
-      (!pair  "ehr_label"
-       (!type already_seen 136)
-       (!srcfileloc  "function.h" 147)
-       nil )
-      (!pair  "sjlj_fc"
-       (!type already_seen 136)
-       (!srcfileloc  "function.h" 149)
-       nil )
-      (!pair  "sjlj_exit_after"
-       (!type already_seen 136)
-       (!srcfileloc  "function.h" 150)
-       nil )
-      (!pair  "action_record_data"
-       (!type already_seen 372)
-       (!srcfileloc  "function.h" 152)
-       nil )
-      (!pair  "call_site_record_v"
-       (!type array 1376 nil  gc_used "2" 
-        (!type pointer 1377 nil  gc_used
-         (!type user_struct 1378 
-          (!type already_seen 1377)
-          gc_pointed_to "vec<call_site_record,va_gc>"
-          (!srcfileloc  "function.h" 154)
-          (!fields 2 
-           (!pair  "va_gc"
-            (!type already_seen 3)
-            (!srcfileloc  "function.h" 154)
-            nil )
-           (!pair  "call_site_record"
-            (!type pointer 1379 nil  gc_used
-             (!type struct 1380 
-              (!type already_seen 1379)
-              gc_pointed_to "call_site_record_d"
-              (!srcfileloc  "except.c" 168)
-              (!fields 2 
-               (!pair  "landing_pad"
-                (!type already_seen 136)
-                (!srcfileloc  "except.c" 166)
-                nil )
-               (!pair  "action"
-                (!type already_seen 9)
-                (!srcfileloc  "except.c" 167)
-                nil )
-              )
-              nil 511 nil nil )
-            )
-            (!srcfileloc  "function.h" 154)
-            nil )
-          )
-         )
-        )
-       )
-       (!srcfileloc  "function.h" 154)
-       nil )
-     )
-     nil 511 nil nil )
-    (!srcfileloc  "function.h" 242)
-    nil )
-   (!pair  "outgoing_args_size"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 248)
-    nil )
-   (!pair  "return_rtx"
-    (!type already_seen 136)
-    (!srcfileloc  "function.h" 254)
-    nil )
-   (!pair  "hard_reg_initial_vals"
-    (!type pointer 1381 nil  gc_used
-     (!type struct 1382 
-      (!type already_seen 1381)
-      gc_pointed_to "initial_value_struct"
-      (!srcfileloc  "function.c" 1219)
-      (!fields 3 
-       (!pair  "num_entries"
-        (!type already_seen 9)
-        (!srcfileloc  "function.c" 1216)
-        nil )
-       (!pair  "max_entries"
-        (!type already_seen 9)
-        (!srcfileloc  "function.c" 1217)
-        nil )
-       (!pair  "entries"
-        (!type already_seen 1202)
-        (!srcfileloc  "function.c" 1218)
-        (!options 
-         (!option length string  "%h.num_entries")
-        )
-       )
-      )
-      nil 511 nil nil )
-    )
-    (!srcfileloc  "function.h" 261)
-    nil )
-   (!pair  "stack_protect_guard"
-    (!type already_seen 5)
-    (!srcfileloc  "function.h" 265)
-    nil )
-   (!pair  "x_nonlocal_goto_handler_labels"
-    (!type already_seen 136)
-    (!srcfileloc  "function.h" 269)
-    nil )
-   (!pair  "x_return_label"
-    (!type already_seen 136)
-    (!srcfileloc  "function.h" 274)
-    nil )
-   (!pair  "x_naked_return_label"
-    (!type already_seen 136)
-    (!srcfileloc  "function.h" 279)
-    nil )
-   (!pair  "x_stack_slot_list"
-    (!type already_seen 136)
-    (!srcfileloc  "function.h" 283)
-    nil )
-   (!pair  "frame_space_list"
-    (!type pointer 1383 nil  gc_used
-     (!type struct 1384 
-      (!type already_seen 1383)
-      gc_pointed_to "frame_space"
-      (!srcfileloc  "function.h" 233)
-      (!fields 3 
-       (!pair  "next"
-        (!type already_seen 1383)
-        (!srcfileloc  "function.h" 229)
-        nil )
-       (!pair  "start"
-        (!type already_seen 9)
-        (!srcfileloc  "function.h" 231)
-        nil )
-       (!pair  "length"
-        (!type already_seen 9)
-        (!srcfileloc  "function.h" 232)
-        nil )
-      )
-      nil 511 nil nil )
-    )
-    (!srcfileloc  "function.h" 286)
-    nil )
-   (!pair  "x_stack_check_probe_note"
-    (!type already_seen 136)
-    (!srcfileloc  "function.h" 289)
-    nil )
-   (!pair  "x_arg_pointer_save_area"
-    (!type already_seen 136)
-    (!srcfileloc  "function.h" 295)
-    nil )
-   (!pair  "drap_reg"
-    (!type already_seen 136)
-    (!srcfileloc  "function.h" 298)
-    nil )
-   (!pair  "x_frame_offset"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 303)
-    nil )
-   (!pair  "x_parm_birth_insn"
-    (!type already_seen 136)
-    (!srcfileloc  "function.h" 306)
-    nil )
-   (!pair  "x_used_temp_slots"
-    (!type pointer 1385 nil  gc_used
-     (!type user_struct 1386 
-      (!type already_seen 1385)
-      gc_pointed_to "vec<temp_slot_p,va_gc>"
-      (!srcfileloc  "function.h" 309)
-      (!fields 2 
-       (!pair  "va_gc"
-        (!type already_seen 3)
-        (!srcfileloc  "function.h" 309)
-        nil )
-       (!pair  "temp_slot_p"
-        (!type already_seen 1205)
-        (!srcfileloc  "function.h" 309)
-        nil )
-      )
-     )
-    )
-    (!srcfileloc  "function.h" 309)
-    nil )
-   (!pair  "x_avail_temp_slots"
-    (!type already_seen 1205)
-    (!srcfileloc  "function.h" 312)
-    nil )
-   (!pair  "x_temp_slot_level"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 315)
-    nil )
-   (!pair  "stack_alignment_needed"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 319)
-    nil )
-   (!pair  "preferred_stack_boundary"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 323)
-    nil )
-   (!pair  "parm_stack_boundary"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 326)
-    nil )
-   (!pair  "max_used_stack_slot_alignment"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 329)
-    nil )
-   (!pair  "stack_alignment_estimated"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 338)
-    nil )
-   (!pair  "accesses_prior_frames"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 344)
-    nil )
-   (!pair  "calls_eh_return"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 347)
-    nil )
-   (!pair  "saves_all_registers"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 351)
-    nil )
-   (!pair  "has_nonlocal_goto"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 355)
-    nil )
-   (!pair  "has_asm_statement"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 358)
-    nil )
-   (!pair  "all_throwers_are_sibcalls"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 365)
-    nil )
-   (!pair  "limit_stack"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 369)
-    nil )
-   (!pair  "profile"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 372)
-    nil )
-   (!pair  "uses_const_pool"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 375)
-    nil )
-   (!pair  "uses_pic_offset_table"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 378)
-    nil )
-   (!pair  "uses_eh_lsda"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 381)
-    nil )
-   (!pair  "tail_call_emit"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 384)
-    nil )
-   (!pair  "arg_pointer_save_area_init"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 387)
-    nil )
-   (!pair  "frame_pointer_needed"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 392)
-    nil )
-   (!pair  "maybe_hot_insn_p"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 395)
-    nil )
-   (!pair  "stack_realign_needed"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 402)
-    nil )
-   (!pair  "stack_realign_tried"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 407)
-    nil )
-   (!pair  "need_drap"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 411)
-    nil )
-   (!pair  "stack_realign_processed"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 416)
-    nil )
-   (!pair  "stack_realign_finalized"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 420)
-    nil )
-   (!pair  "dbr_scheduled_p"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 423)
-    nil )
-   (!pair  "nothrow"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 428)
-    nil )
-   (!pair  "shrink_wrapped"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 431)
-    nil )
-   (!pair  "sp_is_unchanging"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 436)
-    nil )
-   (!pair  "is_leaf"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 442)
-    nil )
-   (!pair  "uses_only_leaf_regs"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 447)
-    nil )
-   (!pair  "has_bb_partition"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 452)
-    nil )
-   (!pair  "bb_reorder_complete"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 456)
-    nil )
-   (!pair  "asm_clobbers"
-    (!type already_seen 9)
-    (!srcfileloc  "function.h" 462)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type already_seen 1386)
- 
- (!type already_seen 1382)
- 
- (!type already_seen 1384)
- 
- (!type already_seen 1374)
- 
- (!type already_seen 1373)
- 
- (!type already_seen 1368)
- 
- (!type already_seen 1370)
- 
- (!type already_seen 927)
- 
- (!type already_seen 408)
- 
- (!type already_seen 1206)
- 
- (!type already_seen 381)
- 
- (!type already_seen 1375)
- 
- (!type already_seen 1378)
- 
- (!type already_seen 373)
- 
- (!type already_seen 1380)
- 
- (!type already_seen 1364)
- 
- (!type already_seen 1365)
- 
- (!type already_seen 1367)
- 
- (!type struct 1387 nil  gc_unused "real_format"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1388 nil  gc_unused "_obstack_chunk"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1389 nil  gc_unused "ht"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 539)
- 
- (!type already_seen 544)
- 
- (!type user_struct 1390 
-  (!type pointer 1391 nil  gc_used
-   (!type already_seen 1390)
-  )
-  gc_pointed_to "vec<alias_pair,va_gc>"
-  (!srcfileloc  "tree-core.h" 1798)
-  (!fields 2 
-   (!pair  "va_gc"
-    (!type already_seen 3)
-    (!srcfileloc  "tree-core.h" 1798)
-    nil )
-   (!pair  "alias_pair"
-    (!type struct 1392 nil  gc_used "alias_pair"
-     (!srcfileloc  "tree-core.h" 1798)
-     (!fields 2 
-      (!pair  "decl"
-       (!type already_seen 5)
-       (!srcfileloc  "tree-core.h" 671)
-       nil )
-      (!pair  "target"
-       (!type already_seen 5)
-       (!srcfileloc  "tree-core.h" 672)
-       nil )
-     )
-     nil 511 nil nil )
-    (!srcfileloc  "tree-core.h" 1798)
-    nil )
-  )
- )
- 
- (!type struct 1393 nil  gc_used "builtin_info_type"
-  (!srcfileloc  "tree-core.h" 1833)
-  (!fields 2 
-   (!pair  "decl"
-    (!type array 1394 nil  gc_used "(int)END_BUILTINS" 
-     (!type already_seen 5)
-    )
-    (!srcfileloc  "tree-core.h" 1776)
-    nil )
-   (!pair  "implicit_p"
-    (!type array 1395 nil  gc_used "(int)END_BUILTINS" 
-     (!type already_seen 9)
-    )
-    (!srcfileloc  "tree-core.h" 1777)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type struct 1396 nil  gc_unused "const_call_expr_arg_iterator"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1397 nil  gc_unused "call_expr_arg_iterator"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1398 
-  (!type pointer 1399 nil  gc_used
-   (!type already_seen 1398)
-  )
-  gc_pointed_to "tree_vec_map"
-  (!srcfileloc  "tree-core.h" 1753)
-  (!fields 2 
-   (!pair  "base"
-    (!type already_seen 858)
-    (!srcfileloc  "tree-core.h" 1751)
-    nil )
-   (!pair  "to"
-    (!type already_seen 45)
-    (!srcfileloc  "tree-core.h" 1752)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type struct 1400 
-  (!type pointer 1401 nil  gc_used
-   (!type already_seen 1400)
-  )
-  gc_pointed_to "tree_priority_map"
-  (!srcfileloc  "tree-core.h" 1747)
-  (!fields 3 
-   (!pair  "base"
-    (!type already_seen 858)
-    (!srcfileloc  "tree-core.h" 1744)
-    nil )
-   (!pair  "init"
-    (!type already_seen 9)
-    (!srcfileloc  "tree-core.h" 1745)
-    nil )
-   (!pair  "fini"
-    (!type already_seen 9)
-    (!srcfileloc  "tree-core.h" 1746)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type struct 1402 
-  (!type pointer 1403 nil  gc_used
-   (!type already_seen 1402)
-  )
-  gc_pointed_to "tree_int_map"
-  (!srcfileloc  "tree-core.h" 1740)
-  (!fields 2 
-   (!pair  "base"
-    (!type already_seen 858)
-    (!srcfileloc  "tree-core.h" 1738)
-    nil )
-   (!pair  "to"
-    (!type already_seen 9)
-    (!srcfileloc  "tree-core.h" 1739)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type struct 1404 
-  (!type pointer 1405 nil  gc_used
-   (!type already_seen 1404)
-  )
-  gc_pointed_to "tree_decl_map"
-  (!srcfileloc  "tree-core.h" 1734)
-  (!fields 2 
-   (!pair  "base"
-    (!type already_seen 858)
-    (!srcfileloc  "tree-core.h" 1732)
-    nil )
-   (!pair  "to"
-    (!type already_seen 5)
-    (!srcfileloc  "tree-core.h" 1733)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type struct 1406 
-  (!type pointer 1407 nil  gc_used
-   (!type already_seen 1406)
-  )
-  gc_pointed_to "tree_map"
-  (!srcfileloc  "tree-core.h" 1728)
-  (!fields 3 
-   (!pair  "base"
-    (!type already_seen 858)
-    (!srcfileloc  "tree-core.h" 1725)
-    nil )
-   (!pair  "hash"
-    (!type already_seen 9)
-    (!srcfileloc  "tree-core.h" 1726)
-    nil )
-   (!pair  "to"
-    (!type already_seen 5)
-    (!srcfileloc  "tree-core.h" 1727)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type already_seen 858)
- 
- (!type struct 1408 nil  gc_unused "function_args_iterator"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1409 
-  (!type pointer 1410 nil  gc_unused
-   (!type already_seen 1409)
-  )
-  gc_unused "record_layout_info_s"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1411 nil  gc_unused "attribute_spec"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 556)
- 
- (!type already_seen 526)
- 
- (!type already_seen 528)
- 
- (!type already_seen 522)
- 
- (!type already_seen 515)
- 
- (!type already_seen 517)
- 
- (!type already_seen 347)
- 
- (!type already_seen 443)
- 
- (!type already_seen 348)
- 
- (!type already_seen 339)
- 
- (!type already_seen 342)
- 
- (!type already_seen 340)
- 
- (!type already_seen 341)
- 
- (!type already_seen 346)
- 
- (!type already_seen 345)
- 
- (!type already_seen 344)
- 
- (!type already_seen 343)
- 
- (!type already_seen 135)
- 
- (!type already_seen 38)
- 
- (!type already_seen 40)
- 
- (!type already_seen 37)
- 
- (!type already_seen 514)
- 
- (!type already_seen 497)
- 
- (!type already_seen 446)
- 
- (!type already_seen 448)
- 
- (!type already_seen 444)
- 
- (!type already_seen 445)
- 
- (!type already_seen 513)
- 
- (!type already_seen 46)
- 
- (!type already_seen 519)
- 
- (!type already_seen 520)
- 
- (!type already_seen 1119)
- 
- (!type already_seen 504)
- 
- (!type already_seen 505)
- 
- (!type already_seen 512)
- 
- (!type already_seen 510)
- 
- (!type already_seen 501)
- 
- (!type already_seen 502)
- 
- (!type already_seen 518)
- 
- (!type already_seen 466)
- 
- (!type already_seen 467)
- 
- (!type already_seen 499)
- 
- (!type already_seen 498)
- 
- (!type already_seen 32)
- 
- (!type already_seen 24)
- 
- (!type already_seen 31)
- 
- (!type already_seen 26)
- 
- (!type already_seen 21)
- 
- (!type already_seen 17)
- 
- (!type already_seen 16)
- 
- (!type already_seen 15)
- 
- (!type already_seen 14)
- 
- (!type already_seen 8)
- 
- (!type already_seen 12)
- 
- (!type already_seen 13)
- 
- (!type already_seen 1392)
- 
- (!type already_seen 850)
- 
- (!type already_seen 428)
- 
- (!type already_seen 509)
- 
- (!type already_seen 507)
- 
- (!type struct 1412 nil  gc_unused "expand_operand"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1413 nil  gc_unused "extraction_insn"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 525)
- 
- (!type struct 1414 nil  gc_unused "convert_optab_libcall_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1415 nil  gc_unused "optab_libcall_d"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1416 nil  gc_unused "rtl_hooks"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 532)
- 
- (!type struct 1417 nil  gc_unused "subreg_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1418 nil  gc_unused "replace_label_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 350)
- 
- (!type struct 1419 nil  gc_unused "address_info"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1420 nil  gc_unused "full_rtx_costs"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 139)
- 
- (!type already_seen 140)
- 
- (!type already_seen 141)
- 
- (!type already_seen 142)
- 
- (!type already_seen 143)
- 
- (!type already_seen 144)
- 
- (!type already_seen 145)
- 
- (!type already_seen 146)
- 
- (!type already_seen 147)
- 
- (!type already_seen 148)
- 
- (!type already_seen 149)
- 
- (!type already_seen 150)
- 
- (!type already_seen 151)
- 
- (!type already_seen 152)
- 
- (!type already_seen 153)
- 
- (!type already_seen 154)
- 
- (!type already_seen 155)
- 
- (!type already_seen 156)
- 
- (!type already_seen 157)
- 
- (!type already_seen 158)
- 
- (!type already_seen 159)
- 
- (!type already_seen 160)
- 
- (!type already_seen 161)
- 
- (!type already_seen 162)
- 
- (!type already_seen 163)
- 
- (!type already_seen 164)
- 
- (!type already_seen 165)
- 
- (!type already_seen 166)
- 
- (!type already_seen 167)
- 
- (!type already_seen 168)
- 
- (!type already_seen 169)
- 
- (!type already_seen 170)
- 
- (!type already_seen 171)
- 
- (!type already_seen 172)
- 
- (!type already_seen 173)
- 
- (!type already_seen 174)
- 
- (!type already_seen 175)
- 
- (!type already_seen 176)
- 
- (!type already_seen 177)
- 
- (!type already_seen 178)
- 
- (!type already_seen 179)
- 
- (!type already_seen 180)
- 
- (!type already_seen 181)
- 
- (!type already_seen 182)
- 
- (!type already_seen 183)
- 
- (!type already_seen 184)
- 
- (!type already_seen 185)
- 
- (!type already_seen 186)
- 
- (!type already_seen 187)
- 
- (!type already_seen 188)
- 
- (!type already_seen 189)
- 
- (!type already_seen 190)
- 
- (!type already_seen 191)
- 
- (!type already_seen 192)
- 
- (!type already_seen 193)
- 
- (!type already_seen 194)
- 
- (!type already_seen 195)
- 
- (!type already_seen 196)
- 
- (!type already_seen 197)
- 
- (!type already_seen 198)
- 
- (!type already_seen 199)
- 
- (!type already_seen 200)
- 
- (!type already_seen 201)
- 
- (!type already_seen 202)
- 
- (!type already_seen 203)
- 
- (!type already_seen 204)
- 
- (!type already_seen 205)
- 
- (!type already_seen 206)
- 
- (!type already_seen 207)
- 
- (!type already_seen 208)
- 
- (!type already_seen 209)
- 
- (!type already_seen 210)
- 
- (!type already_seen 211)
- 
- (!type already_seen 212)
- 
- (!type already_seen 213)
- 
- (!type already_seen 214)
- 
- (!type already_seen 215)
- 
- (!type already_seen 216)
- 
- (!type already_seen 217)
- 
- (!type already_seen 218)
- 
- (!type already_seen 219)
- 
- (!type already_seen 220)
- 
- (!type already_seen 221)
- 
- (!type already_seen 222)
- 
- (!type already_seen 223)
- 
- (!type already_seen 224)
- 
- (!type already_seen 225)
- 
- (!type already_seen 226)
- 
- (!type already_seen 227)
- 
- (!type already_seen 228)
- 
- (!type already_seen 229)
- 
- (!type already_seen 230)
- 
- (!type already_seen 231)
- 
- (!type already_seen 232)
- 
- (!type already_seen 233)
- 
- (!type already_seen 234)
- 
- (!type already_seen 235)
- 
- (!type already_seen 236)
- 
- (!type already_seen 237)
- 
- (!type already_seen 238)
- 
- (!type already_seen 239)
- 
- (!type already_seen 256)
- 
- (!type already_seen 257)
- 
- (!type already_seen 260)
- 
- (!type already_seen 264)
- 
- (!type already_seen 265)
- 
- (!type already_seen 266)
- 
- (!type already_seen 267)
- 
- (!type already_seen 268)
- 
- (!type already_seen 271)
- 
- (!type already_seen 272)
- 
- (!type already_seen 273)
- 
- (!type already_seen 274)
- 
- (!type already_seen 275)
- 
- (!type already_seen 276)
- 
- (!type already_seen 277)
- 
- (!type already_seen 278)
- 
- (!type already_seen 279)
- 
- (!type already_seen 280)
- 
- (!type already_seen 281)
- 
- (!type already_seen 282)
- 
- (!type already_seen 283)
- 
- (!type already_seen 284)
- 
- (!type already_seen 285)
- 
- (!type already_seen 286)
- 
- (!type already_seen 287)
- 
- (!type already_seen 288)
- 
- (!type already_seen 289)
- 
- (!type already_seen 290)
- 
- (!type already_seen 291)
- 
- (!type already_seen 292)
- 
- (!type already_seen 293)
- 
- (!type already_seen 294)
- 
- (!type already_seen 295)
- 
- (!type already_seen 324)
- 
- (!type already_seen 325)
- 
- (!type already_seen 326)
- 
- (!type already_seen 327)
- 
- (!type already_seen 328)
- 
- (!type already_seen 329)
- 
- (!type already_seen 330)
- 
- (!type already_seen 331)
- 
- (!type already_seen 332)
- 
- (!type already_seen 333)
- 
- (!type already_seen 334)
- 
- (!type already_seen 335)
- 
- (!type already_seen 336)
- 
- (!type already_seen 337)
- 
- (!type already_seen 338)
- 
- (!type already_seen 253)
- 
- (!type already_seen 296)
- 
- (!type already_seen 255)
- 
- (!type union 1421 nil  gc_unused "u"
-  (!srcfileloc  "rtl.h" 346)
-  (!fields 5 
-   (!pair  "fld"
-    (!type array 1422 nil  gc_unused "1" 
-     (!type already_seen 242)
-    )
-    (!srcfileloc  "rtl.h" 341)
-    nil )
-   (!pair  "hwint"
-    (!type array 1423 nil  gc_unused "1" 
-     (!type already_seen 9)
-    )
-    (!srcfileloc  "rtl.h" 342)
-    nil )
-   (!pair  "block_sym"
-    (!type already_seen 240)
-    (!srcfileloc  "rtl.h" 343)
-    nil )
-   (!pair  "rv"
-    (!type already_seen 19)
-    (!srcfileloc  "rtl.h" 344)
-    nil )
-   (!pair  "fv"
-    (!type already_seen 23)
-    (!srcfileloc  "rtl.h" 345)
-    nil )
-  )
-  nil 511 nil )
- 
- (!type already_seen 23)
- 
- (!type already_seen 19)
- 
- (!type already_seen 3)
- 
- (!type already_seen 252)
- 
- (!type already_seen 240)
- 
- (!type already_seen 244)
- 
- (!type already_seen 242)
- 
- (!type union 1424 nil  gc_unused "rtunion"nil 
-  (!fields 0 )
-  nil 0 nil )
- 
- (!type already_seen 270)
- 
- (!type already_seen 259)
- 
- (!type struct 1425 nil  gc_unused "addr_diff_vec_flags"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1426 nil  gc_unused "gcov_summary"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1427 nil  gc_unused "counts_entry"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1428 
-  (!type pointer 1429 nil  gc_used
-   (!type already_seen 1428)
-  )
-  gc_pointed_to "coverage_data"
-  (!srcfileloc  "coverage.c" 69)
-  (!fields 6 
-   (!pair  "next"
-    (!type already_seen 1429)
-    (!srcfileloc  "coverage.c" 63)
-    nil )
-   (!pair  "ident"
-    (!type already_seen 9)
-    (!srcfileloc  "coverage.c" 64)
-    nil )
-   (!pair  "lineno_checksum"
-    (!type already_seen 9)
-    (!srcfileloc  "coverage.c" 65)
-    nil )
-   (!pair  "cfg_checksum"
-    (!type already_seen 9)
-    (!srcfileloc  "coverage.c" 66)
-    nil )
-   (!pair  "fn_decl"
-    (!type already_seen 5)
-    (!srcfileloc  "coverage.c" 67)
-    nil )
-   (!pair  "ctr_vars"
-    (!type array 1430 nil  gc_used "GCOV_COUNTERS" 
-     (!type already_seen 5)
-    )
-    (!srcfileloc  "coverage.c" 68)
-    nil )
-  )
-  (!options 
-   (!option chain_next string  "%h.next")
-  )
-  511 nil nil )
- 
- (!type struct 1431 nil  gc_unused "bitmap_iterator"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 126)
- 
- (!type already_seen 127)
- 
- (!type already_seen 123)
- 
- (!type already_seen 1321)
- 
- (!type already_seen 1324)
- 
- (!type struct 1432 nil  gc_unused "anonymous:../../gcc/config/arm/arm.h:1582"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 404)
- 
- (!type already_seen 405)
- 
- (!type union 1433 nil  gc_unused "_dont_use_tree_here_"nil 
-  (!fields 0 )
-  nil 0 nil )
- 
- (!type struct 1434 nil  gc_unused "_dont_use_rtvec_here_"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1435 nil  gc_unused "_dont_use_rtx_here_"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1436 nil  gc_unused "context"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1437 nil  gc_unused "rtl_opt_pass"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 298)
- 
- (!type already_seen 302)
- 
- (!type struct 1438 nil  gc_unused "pretty_printer"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1439 nil  gc_unused "diagnostic_context"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1440 nil  gc_unused "cl_option_handlers"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1441 nil  gc_unused "cl_decoded_option"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1442 nil  gc_unused "cl_option"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 523)
- 
- (!type already_seen 555)
- 
- (!type struct 1443 nil  gc_unused "gcc_options"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 246)
- 
- (!type struct 1444 nil  gc_unused "gimple_stmt_iterator"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 311)
- 
- (!type already_seen 262)
- 
- (!type already_seen 138)
- 
- (!type struct 1445 
-  (!type pointer 1446 nil  gc_unused
-   (!type already_seen 1445)
-  )
-  gc_unused "simple_bitmap_def"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 121)
- 
- (!type already_seen 572)
- 
- (!type struct 1447 nil  gc_unused "save_macro_data"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1448 nil  gc_unused "anonymous:../../gcc/../libcpp/include/cpplib.h:999"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1449 nil  gc_unused "anonymous:../../gcc/../libcpp/include/cpplib.h:988"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1450 nil  gc_unused "cpp_num"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 33)
- 
- (!type already_seen 569)
- 
- (!type already_seen 575)
- 
- (!type already_seen 576)
- 
- (!type already_seen 578)
- 
- (!type struct 1451 nil  gc_unused "_cpp_file"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 580)
- 
- (!type struct 1452 nil  gc_unused "cpp_dir"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1453 nil  gc_unused "cpp_callbacks"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type already_seen 571)
- 
- (!type already_seen 577)
- 
- (!type already_seen 574)
- 
- (!type struct 1454 nil  gc_unused "cpp_options"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1455 nil  gc_unused "cpp_buffer"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1456 nil  gc_unused "cpp_reader"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1457 nil  gc_unused "linemap_stats"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1458 nil  gc_unused "anonymous:../../gcc/../libcpp/include/line-map.h:627"nil 
-  (!fields 0 )
-  nil 0 nil nil )
- 
- (!type struct 1459 
-  (!type pointer 1460 nil  gc_used
-   (!type already_seen 1459)
-  )
-  gc_pointed_to "line_maps"
-  (!srcfileloc  "../libcpp/include/line-map.h" 318)
-  (!fields 10 
-   (!pair  "info_ordinary"
-    (!type struct 1461 nil  gc_used "maps_info"
-     (!srcfileloc  "../libcpp/include/line-map.h" 259)
-     (!fields 4 
-      (!pair  "maps"
-       (!type pointer 1462 nil  gc_unused
-        (!type struct 1463 
-         (!type already_seen 1462)
-         gc_used "line_map"
-         (!srcfileloc  "../libcpp/include/line-map.h" 213)
-         (!fields 3 
-          (!pair  "start_location"
-           (!type already_seen 9)
-           (!srcfileloc  "../libcpp/include/line-map.h" 204)
-           nil )
-          (!pair  "reason"
-           (!type already_seen 9)
-           (!srcfileloc  "../libcpp/include/line-map.h" 207)
-           nil )
-          (!pair  "d"
-           (!type union 1464 nil  gc_used "map_u"
-            (!srcfileloc  "../libcpp/include/line-map.h" 212)
-            (!fields 2 
-             (!pair  "ordinary"
-              (!type struct 1465 nil  gc_used "line_map_ordinary"
-               (!srcfileloc  "../libcpp/include/line-map.h" 87)
-               (!fields 5 
-                (!pair  "to_file"
-                 (!type already_seen 36)
-                 (!srcfileloc  "../libcpp/include/line-map.h" 71)
-                 nil )
-                (!pair  "to_line"
-                 (!type already_seen 9)
-                 (!srcfileloc  "../libcpp/include/line-map.h" 72)
-                 nil )
-                (!pair  "included_from"
-                 (!type already_seen 9)
-                 (!srcfileloc  "../libcpp/include/line-map.h" 77)
-                 nil )
-                (!pair  "sysp"
-                 (!type already_seen 28)
-                 (!srcfileloc  "../libcpp/include/line-map.h" 83)
-                 nil )
-                (!pair  "column_bits"
-                 (!type already_seen 9)
-                 (!srcfileloc  "../libcpp/include/line-map.h" 86)
-                 nil )
-               )
-               nil 511 nil nil )
-              (!srcfileloc  "../libcpp/include/line-map.h" 210)
-              (!options 
-               (!option tag string  "0")
-              )
-             )
-             (!pair  "macro"
-              (!type struct 1466 nil  gc_used "line_map_macro"
-               (!srcfileloc  "../libcpp/include/line-map.h" 175)
-               (!fields 4 
-                (!pair  "macro"
-                 (!type already_seen 567)
-                 (!srcfileloc  "../libcpp/include/line-map.h" 109)
-                 (!options 
-                  (!option nested_ptr nested 
-                   (!type already_seen 7)
-                   "%h ? HT_IDENT_TO_GCC_IDENT (HT_NODE (%h)) : NULL" "%h ? CPP_HASHNODE (GCC_IDENT_TO_HT_IDENT (%h)) : NULL")
-                 )
-                )
-                (!pair  "n_tokens"
-                 (!type already_seen 9)
-                 (!srcfileloc  "../libcpp/include/line-map.h" 112)
-                 nil )
-                (!pair  "macro_locations"
-                 (!type already_seen 10)
-                 (!srcfileloc  "../libcpp/include/line-map.h" 167)
-                 (!options 
-                  (!option atomic string  "")
-                 )
-                )
-                (!pair  "expansion"
-                 (!type already_seen 9)
-                 (!srcfileloc  "../libcpp/include/line-map.h" 174)
-                 nil )
-               )
-               nil 511 nil nil )
-              (!srcfileloc  "../libcpp/include/line-map.h" 211)
-              (!options 
-               (!option tag string  "1")
-              )
-             )
-            )
-            nil 511 nil )
-           (!srcfileloc  "../libcpp/include/line-map.h" 212)
-           (!options 
-            (!option desc string  "%1.reason == LC_ENTER_MACRO")
-           )
-          )
-         )
-         nil 511 nil nil )
-       )
-       (!srcfileloc  "../libcpp/include/line-map.h" 249)
-       (!options 
-        (!option length string  "%h.used")
-       )
-      )
-      (!pair  "allocated"
-       (!type already_seen 9)
-       (!srcfileloc  "../libcpp/include/line-map.h" 252)
-       nil )
-      (!pair  "used"
-       (!type already_seen 9)
-       (!srcfileloc  "../libcpp/include/line-map.h" 256)
-       nil )
-      (!pair  "cache"
-       (!type already_seen 9)
-       (!srcfileloc  "../libcpp/include/line-map.h" 258)
-       nil )
-     )
-     nil 511 nil nil )
-    (!srcfileloc  "../libcpp/include/line-map.h" 289)
-    nil )
-   (!pair  "info_macro"
-    (!type already_seen 1461)
-    (!srcfileloc  "../libcpp/include/line-map.h" 291)
-    nil )
-   (!pair  "depth"
-    (!type already_seen 9)
-    (!srcfileloc  "../libcpp/include/line-map.h" 294)
-    nil )
-   (!pair  "trace_includes"
-    (!type already_seen 9)
-    (!srcfileloc  "../libcpp/include/line-map.h" 297)
-    nil )
-   (!pair  "highest_location"
-    (!type already_seen 9)
-    (!srcfileloc  "../libcpp/include/line-map.h" 300)
-    nil )
-   (!pair  "highest_line"
-    (!type already_seen 9)
-    (!srcfileloc  "../libcpp/include/line-map.h" 303)
-    nil )
-   (!pair  "max_column_hint"
-    (!type already_seen 9)
-    (!srcfileloc  "../libcpp/include/line-map.h" 307)
-    nil )
-   (!pair  "reallocator"
-    (!type already_seen 9)
-    (!srcfileloc  "../libcpp/include/line-map.h" 311)
-    nil )
-   (!pair  "round_alloc_size"
-    (!type already_seen 9)
-    (!srcfileloc  "../libcpp/include/line-map.h" 315)
-    nil )
-   (!pair  "location_adhoc_data_map"
-    (!type struct 1467 nil  gc_used "location_adhoc_data_map"
-     (!srcfileloc  "../libcpp/include/line-map.h" 284)
-     (!fields 4 
-      (!pair  "htab"
-       (!type already_seen 50)
-       (!srcfileloc  "../libcpp/include/line-map.h" 280)
-       (!options 
-        (!option skip string  "")
-       )
-      )
-      (!pair  "curr_loc"
-       (!type already_seen 9)
-       (!srcfileloc  "../libcpp/include/line-map.h" 281)
-       nil )
-      (!pair  "allocated"
-       (!type already_seen 9)
-       (!srcfileloc  "../libcpp/include/line-map.h" 282)
-       nil )
-      (!pair  "data"
-       (!type pointer 1468 nil  gc_unused
-        (!type struct 1469 
-         (!type already_seen 1468)
-         gc_used "location_adhoc_data"
-         (!srcfileloc  "../libcpp/include/line-map.h" 265)
-         (!fields 2 
-          (!pair  "locus"
-           (!type already_seen 9)
-           (!srcfileloc  "../libcpp/include/line-map.h" 263)
-           nil )
-          (!pair  "data"
-           (!type already_seen 10)
-           (!srcfileloc  "../libcpp/include/line-map.h" 264)
-           (!options 
-            (!option skip string  "")
-           )
-          )
-         )
-         nil 511 nil nil )
-       )
-       (!srcfileloc  "../libcpp/include/line-map.h" 283)
-       (!options 
-        (!option length string  "%h.allocated")
-       )
-      )
-     )
-     nil 511 nil nil )
-    (!srcfileloc  "../libcpp/include/line-map.h" 317)
-    nil )
-  )
-  nil 511 nil nil )
- 
- (!type already_seen 1467)
- 
- (!type already_seen 49)
- 
- (!type already_seen 1469)
- 
- (!type already_seen 1461)
- 
- (!type already_seen 1463)
- 
- (!type already_seen 1464)
- 
- (!type already_seen 1466)
- 
- (!type already_seen 7)
- 
- (!type already_seen 566)
- 
- (!type already_seen 1465)
-)
-(!typedefs 552
- (!pair  "vec<ivarref_entry,va_gc>"
-  (!type already_seen 1)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 2765)
-  nil )
- (!pair  "ivarref_entry"
-  (!type already_seen 4)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 2763)
-  nil )
- (!pair  "vec<prot_list_entry,va_gc>"
-  (!type already_seen 616)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1259)
-  nil )
- (!pair  "prot_list_entry"
-  (!type already_seen 618)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1258)
-  nil )
- (!pair  "vec<msgref_entry,va_gc>"
-  (!type already_seen 619)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1205)
-  nil )
- (!pair  "msgref_entry"
-  (!type already_seen 621)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1203)
-  nil )
- (!pair  "vec<ident_data_tuple,va_gc>"
-  (!type already_seen 622)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1040)
-  nil )
- (!pair  "ident_data_tuple"
-  (!type already_seen 624)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1018)
-  nil )
- (!pair  "string_section"
-  (!type already_seen 9)
-  (!srcfileloc  "objc/objc-act.h" 633)
-  nil )
- (!pair  "attr"
-  (!type already_seen 632)
-  (!srcfileloc  "objc/objc-act.h" 239)
-  nil )
- (!pair  "hash"
-  (!type already_seen 634)
-  (!srcfileloc  "objc/objc-act.h" 238)
-  nil )
- (!pair  "objc_property_assign_semantics"
-  (!type already_seen 9)
-  (!srcfileloc  "objc/objc-act.h" 86)
-  nil )
- (!pair  "objc_map_iterator_t"
-  (!type already_seen 9)
-  (!srcfileloc  "objc/objc-map.h" 241)
-  nil )
- (!pair  "objc_map_t"
-  (!type already_seen 637)
-  (!srcfileloc  "objc/objc-map.h" 90)
-  nil )
- (!pair  "objc_map_private_hash_t"
-  (!type already_seen 9)
-  (!srcfileloc  "objc/objc-map.h" 40)
-  nil )
- (!pair  "lto_file"
-  (!type already_seen 638)
-  (!srcfileloc  "lto/lto.h" 34)
-  nil )
- (!pair  "rewrite_rule"
-  (!type already_seen 644)
-  (!srcfileloc  "java/expr.c" 2068)
-  nil )
- (!pair  "class_flag_node"
-  (!type already_seen 645)
-  (!srcfileloc  "java/class.c" 85)
-  nil )
- (!pair  "builtin_creator_function"
-  (!type already_seen 649)
-  (!srcfileloc  "java/builtins.c" 82)
-  nil )
- (!pair  "JCF"
-  (!type already_seen 452)
-  (!srcfileloc  "java/jcf.h" 123)
-  nil )
- (!pair  "BootstrapMethods"
-  (!type already_seen 459)
-  (!srcfileloc  "java/jcf.h" 99)
-  nil )
- (!pair  "bootstrap_method"
-  (!type already_seen 461)
-  (!srcfileloc  "java/jcf.h" 94)
-  nil )
- (!pair  "CPool"
-  (!type already_seen 455)
-  (!srcfileloc  "java/jcf.h" 88)
-  nil )
- (!pair  "jcf_filbuf_t"
-  (!type already_seen 9)
-  (!srcfileloc  "java/jcf.h" 66)
-  nil )
- (!pair  "vec<method_entry,va_gc>"
-  (!type already_seen 463)
-  (!srcfileloc  "java/java-tree.h" 882)
-  nil )
- (!pair  "method_entry"
-  (!type already_seen 464)
-  (!srcfileloc  "java/java-tree.h" 869)
-  nil )
- (!pair  "type_assertion"
-  (!type already_seen 471)
-  (!srcfileloc  "java/java-tree.h" 786)
-  nil )
- (!pair  "jv_attr_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "java/java-tree.h" 780)
-  nil )
- (!pair  "jv_attr_type"
-  (!type already_seen 9)
-  (!srcfileloc  "java/java-tree.h" 770)
-  nil )
- (!pair  "constant_pool"
-  (!type already_seen 455)
-  (!srcfileloc  "java/java-tree.h" 135)
-  nil )
- (!pair  "go_char_p"
-  (!type already_seen 29)
-  (!srcfileloc  "go/go-lang.c" 163)
-  nil )
- (!pair  "gfc_interface_mapping"
-  (!type already_seen 651)
-  (!srcfileloc  "fortran/trans.h" 963)
-  nil )
- (!pair  "gfc_interface_sym_mapping"
-  (!type already_seen 652)
-  (!srcfileloc  "fortran/trans.h" 948)
-  nil )
- (!pair  "gfc_powdecl_list"
-  (!type already_seen 653)
-  (!srcfileloc  "fortran/trans.h" 729)
-  nil )
- (!pair  "gfc_wrapped_block"
-  (!type already_seen 655)
-  (!srcfileloc  "fortran/trans.h" 345)
-  nil )
- (!pair  "gfc_saved_var"
-  (!type already_seen 656)
-  (!srcfileloc  "fortran/trans.h" 332)
-  nil )
- (!pair  "gfc_loopinfo"
-  (!type already_seen 657)
-  (!srcfileloc  "fortran/trans.h" 322)
-  nil )
- (!pair  "gfc_ss"
-  (!type already_seen 658)
-  (!srcfileloc  "fortran/trans.h" 273)
-  nil )
- (!pair  "gfc_ss_info"
-  (!type already_seen 659)
-  (!srcfileloc  "fortran/trans.h" 233)
-  nil )
- (!pair  "gfc_ss_type"
-  (!type already_seen 9)
-  (!srcfileloc  "fortran/trans.h" 189)
-  nil )
- (!pair  "gfc_array_info"
-  (!type already_seen 660)
-  (!srcfileloc  "fortran/trans.h" 144)
-  nil )
- (!pair  "gfc_coarray_type"
-  (!type already_seen 9)
-  (!srcfileloc  "fortran/trans.h" 113)
-  nil )
- (!pair  "gfc_se"
-  (!type already_seen 661)
-  (!srcfileloc  "fortran/trans.h" 101)
-  nil )
- (!pair  "stmtblock_t"
-  (!type already_seen 662)
-  (!srcfileloc  "fortran/trans.h" 37)
-  nil )
- (!pair  "gfc_packed"
-  (!type already_seen 9)
-  (!srcfileloc  "fortran/trans-types.h" 52)
-  nil )
- (!pair  "forall_info"
-  (!type already_seen 663)
-  (!srcfileloc  "fortran/trans-stmt.c" 59)
-  nil )
- (!pair  "iter_info"
-  (!type already_seen 664)
-  (!srcfileloc  "fortran/trans-stmt.c" 47)
-  nil )
- (!pair  "gfc_st_parameter"
-  (!type already_seen 665)
-  (!srcfileloc  "fortran/trans-io.c" 80)
-  nil )
- (!pair  "gfc_st_parameter_field"
-  (!type already_seen 666)
-  (!srcfileloc  "fortran/trans-io.c" 74)
-  nil )
- (!pair  "gfc_intrinsic_map_t"
-  (!type already_seen 667)
-  (!srcfileloc  "fortran/trans-intrinsic.c" 87)
-  nil )
- (!pair  "vec<pending_noexcept,va_gc>"
-  (!type already_seen 672)
-  (!srcfileloc  "cp/except.c" 1185)
-  nil )
- (!pair  "pending_noexcept"
-  (!type already_seen 674)
-  (!srcfileloc  "cp/except.c" 1184)
-  nil )
- (!pair  "secondary_vptr_vtt_init_data"
-  (!type already_seen 675)
-  (!srcfileloc  "cp/class.c" 8477)
-  nil )
- (!pair  "find_final_overrider_data"
-  (!type already_seen 676)
-  (!srcfileloc  "cp/class.c" 2227)
-  nil )
- (!pair  "subobject_offset_fn"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/class.c" 104)
-  nil )
- (!pair  "vtbl_init_data"
-  (!type already_seen 678)
-  (!srcfileloc  "cp/class.c" 101)
-  nil )
- (!pair  "class_stack_node_t"
-  (!type already_seen 680)
-  (!srcfileloc  "cp/class.c" 70)
-  nil )
- (!pair  "mangling_flags"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/method.c" 57)
-  nil )
- (!pair  "vec<tree_int,va_gc>"
-  (!type already_seen 684)
-  (!srcfileloc  "cp/parser.c" 8652)
-  nil )
- (!pair  "tree_int"
-  (!type already_seen 686)
-  (!srcfileloc  "cp/parser.c" 8651)
-  nil )
- (!pair  "cp_parser_expression_stack"
-  (!type array 1470 nil  gc_unused "NUM_PREC_VALUES" 
-   (!type already_seen 687)
-  )
-  (!srcfileloc  "cp/parser.c" 1751)
-  nil )
- (!pair  "cp_parser_expression_stack_entry"
-  (!type already_seen 687)
-  (!srcfileloc  "cp/parser.c" 1745)
-  nil )
- (!pair  "cp_parser_binary_operations_map_node"
-  (!type already_seen 688)
-  (!srcfileloc  "cp/parser.c" 1729)
-  nil )
- (!pair  "cp_parser_declarator_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/parser.c" 1695)
-  nil )
- (!pair  "cp_parser_flags"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/parser.c" 1683)
-  nil )
- (!pair  "required_token"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/parser.c" 184)
-  nil )
- (!pair  "name_lookup_error"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/parser.c" 128)
-  nil )
- (!pair  "non_integral_constant"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/parser.c" 116)
-  nil )
- (!pair  "cp_parser"
-  (!type already_seen 689)
-  (!srcfileloc  "cp/parser.h" 396)
-  nil )
- (!pair  "cp_omp_declare_simd_data"
-  (!type already_seen 705)
-  (!srcfileloc  "cp/parser.h" 363)
-  nil )
- (!pair  "vec<cp_unparsed_functions_entry,va_gc>"
-  (!type already_seen 699)
-  (!srcfileloc  "cp/parser.h" 351)
-  nil )
- (!pair  "cp_parser_context"
-  (!type already_seen 697)
-  (!srcfileloc  "cp/parser.h" 196)
-  nil )
- (!pair  "cp_parser_status_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/parser.h" 180)
-  nil )
- (!pair  "cp_unparsed_functions_entry"
-  (!type already_seen 700)
-  (!srcfileloc  "cp/parser.h" 166)
-  nil )
- (!pair  "vec<cp_default_arg_entry,va_gc>"
-  (!type already_seen 702)
-  (!srcfileloc  "cp/parser.h" 157)
-  nil )
- (!pair  "cp_default_arg_entry"
-  (!type already_seen 703)
-  (!srcfileloc  "cp/parser.h" 149)
-  nil )
- (!pair  "cp_token_ident"
-  (!type already_seen 706)
-  (!srcfileloc  "cp/parser.h" 139)
-  nil )
- (!pair  "cp_token_cache_ptr"
-  (!type already_seen 64)
-  (!srcfileloc  "cp/parser.h" 127)
-  nil )
- (!pair  "cp_token_cache"
-  (!type already_seen 65)
-  (!srcfileloc  "cp/parser.h" 125)
-  nil )
- (!pair  "cp_lexer"
-  (!type already_seen 692)
-  (!srcfileloc  "cp/parser.h" 110)
-  nil )
- (!pair  "vec<cp_token_position>"
-  (!type already_seen 695)
-  (!srcfileloc  "cp/parser.h" 99)
-  nil )
- (!pair  "vec<cp_token,va_gc>"
-  (!type already_seen 694)
-  (!srcfileloc  "cp/parser.h" 85)
-  nil )
- (!pair  "cp_token_position"
-  (!type already_seen 66)
-  (!srcfileloc  "cp/parser.h" 75)
-  nil )
- (!pair  "cp_token"
-  (!type already_seen 67)
-  (!srcfileloc  "cp/parser.h" 71)
-  nil )
- (!pair  "cplus_array_info"
-  (!type already_seen 708)
-  (!srcfileloc  "cp/tree.c" 741)
-  nil )
- (!pair  "constexpr_call"
-  (!type already_seen 709)
-  (!srcfileloc  "cp/semantics.c" 8083)
-  nil )
- (!pair  "constexpr_fundef"
-  (!type already_seen 712)
-  (!srcfileloc  "cp/semantics.c" 7400)
-  nil )
- (!pair  "vec<deferred_access,va_gc>"
-  (!type already_seen 714)
-  (!srcfileloc  "cp/semantics.c" 143)
-  nil )
- (!pair  "deferred_access"
-  (!type already_seen 716)
-  (!srcfileloc  "cp/semantics.c" 140)
-  nil )
- (!pair  "vec<deferred_access_check,va_gc>"
-  (!type already_seen 72)
-  (!srcfileloc  "cp/semantics.c" 135)
-  nil )
- (!pair  "spec_entry"
-  (!type already_seen 721)
-  (!srcfileloc  "cp/pt.c" 89)
-  nil )
- (!pair  "tree_fn_t"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/pt.c" 53)
-  nil )
- (!pair  "priority_info"
-  (!type already_seen 728)
-  (!srcfileloc  "cp/decl2.c" 70)
-  nil )
- (!pair  "reshape_iter"
-  (!type already_seen 729)
-  (!srcfileloc  "cp/decl.c" 5087)
-  nil )
- (!pair  "predefined_identifier"
-  (!type already_seen 730)
-  (!srcfileloc  "cp/decl.c" 3646)
-  nil )
- (!pair  "typename_info"
-  (!type already_seen 731)
-  (!srcfileloc  "cp/decl.c" 3226)
-  nil )
- (!pair  "vec<incomplete_var,va_gc>"
-  (!type already_seen 733)
-  (!srcfileloc  "cp/decl.c" 267)
-  nil )
- (!pair  "incomplete_var"
-  (!type already_seen 735)
-  (!srcfileloc  "cp/decl.c" 264)
-  nil )
- (!pair  "candidate_warning"
-  (!type already_seen 737)
-  (!srcfileloc  "cp/call.c" 438)
-  nil )
- (!pair  "z_candidate"
-  (!type already_seen 738)
-  (!srcfileloc  "cp/call.c" 436)
-  nil )
- (!pair  "conversion"
-  (!type already_seen 740)
-  (!srcfileloc  "cp/call.c" 81)
-  nil )
- (!pair  "conversion_rank"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/call.c" 75)
-  nil )
- (!pair  "conversion_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/call.c" 61)
-  nil )
- (!pair  "deferred_access_check"
-  (!type already_seen 73)
-  (!srcfileloc  "cp/cp-tree.h" 5697)
-  nil )
- (!pair  "walk_namespaces_fn"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 5277)
-  nil )
- (!pair  "cp_parameter_declarator"
-  (!type already_seen 742)
-  (!srcfileloc  "cp/cp-tree.h" 4890)
-  nil )
- (!pair  "cp_declarator"
-  (!type already_seen 743)
-  (!srcfileloc  "cp/cp-tree.h" 4888)
-  nil )
- (!pair  "cp_declarator_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 4884)
-  nil )
- (!pair  "cp_decl_specifier_seq"
-  (!type already_seen 744)
-  (!srcfileloc  "cp/cp-tree.h" 4872)
-  nil )
- (!pair  "cp_decl_spec"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 4828)
-  nil )
- (!pair  "cp_storage_class"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 4797)
-  nil )
- (!pair  "cp_virt_specifiers"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 4767)
-  nil )
- (!pair  "operator_name_info_t"
-  (!type already_seen 745)
-  (!srcfileloc  "cp/cp-tree.h" 4744)
-  nil )
- (!pair  "unification_kind_t"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 4385)
-  nil )
- (!pair  "cp_cv_quals"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 4362)
-  nil )
- (!pair  "base_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 4340)
-  nil )
- (!pair  "deferring_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 4327)
-  nil )
- (!pair  "base_access"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 4320)
-  nil )
- (!pair  "tsubst_flags_t"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 4306)
-  nil )
- (!pair  "duration_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 4277)
-  nil )
- (!pair  "linkage_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 4270)
-  nil )
- (!pair  "special_function_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 4247)
-  nil )
- (!pair  "access_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 4226)
-  nil )
- (!pair  "tmpl_spec_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 4215)
-  nil )
- (!pair  "cp_lvalue_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 4197)
-  nil )
- (!pair  "aggr_init_expr_arg_iterator"
-  (!type already_seen 746)
-  (!srcfileloc  "cp/cp-tree.h" 3084)
-  nil )
- (!pair  "vec<tree_pair_s,va_gc>"
-  (!type already_seen 483)
-  (!srcfileloc  "cp/cp-tree.h" 1456)
-  nil )
- (!pair  "tree_pair_p"
-  (!type already_seen 485)
-  (!srcfileloc  "cp/cp-tree.h" 1361)
-  nil )
- (!pair  "tree_pair_s"
-  (!type already_seen 484)
-  (!srcfileloc  "cp/cp-tree.h" 1360)
-  nil )
- (!pair  "vec<cxx_saved_binding,va_gc>"
-  (!type already_seen 747)
-  (!srcfileloc  "cp/cp-tree.h" 1022)
-  nil )
- (!pair  "vec<qualified_typedef_usage_t,va_gc>"
-  (!type already_seen 611)
-  (!srcfileloc  "cp/cp-tree.h" 784)
-  nil )
- (!pair  "qualified_typedef_usage_t"
-  (!type already_seen 612)
-  (!srcfileloc  "cp/cp-tree.h" 772)
-  nil )
- (!pair  "cp_trait_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 648)
-  nil )
- (!pair  "abstract_class_use"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 501)
-  nil )
- (!pair  "impl_conv_void"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 488)
-  nil )
- (!pair  "impl_conv_rhs"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 477)
-  nil )
- (!pair  "expr_list_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 467)
-  nil )
- (!pair  "composite_pointer_operation"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 460)
-  nil )
- (!pair  "cpp0x_warn_str"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 448)
-  nil )
- (!pair  "cp_id_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/cp-tree.h" 411)
-  nil )
- (!pair  "ptrmem_cst_t"
-  (!type already_seen 600)
-  (!srcfileloc  "cp/cp-tree.h" 287)
-  nil )
- (!pair  "template_parm_index"
-  (!type already_seen 598)
-  (!srcfileloc  "cp/cp-tree.h" 281)
-  nil )
- (!pair  "vec<cp_label_binding,va_gc>"
-  (!type already_seen 102)
-  (!srcfileloc  "cp/name-lookup.h" 215)
-  nil )
- (!pair  "vec<cp_class_binding,va_gc>"
-  (!type already_seen 97)
-  (!srcfileloc  "cp/name-lookup.h" 204)
-  nil )
- (!pair  "cp_label_binding"
-  (!type already_seen 103)
-  (!srcfileloc  "cp/name-lookup.h" 155)
-  nil )
- (!pair  "cp_class_binding"
-  (!type already_seen 98)
-  (!srcfileloc  "cp/name-lookup.h" 147)
-  nil )
- (!pair  "tag_scope"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/name-lookup.h" 141)
-  nil )
- (!pair  "scope_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/name-lookup.h" 124)
-  nil )
- (!pair  "cxx_saved_binding"
-  (!type already_seen 749)
-  (!srcfileloc  "cp/name-lookup.h" 86)
-  nil )
- (!pair  "cp_binding_level"
-  (!type already_seen 95)
-  (!srcfileloc  "cp/name-lookup.h" 55)
-  nil )
- (!pair  "cxx_binding"
-  (!type already_seen 100)
-  (!srcfileloc  "cp/name-lookup.h" 52)
-  nil )
- (!pair  "bt_foreach_proc"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/name-lookup.h" 32)
-  nil )
- (!pair  "binding_entry"
-  (!type already_seen 489)
-  (!srcfileloc  "cp/name-lookup.h" 29)
-  nil )
- (!pair  "binding_table"
-  (!type already_seen 486)
-  (!srcfileloc  "cp/name-lookup.h" 28)
-  nil )
- (!pair  "substitution_identifier_index_t"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/mangle.c" 133)
-  nil )
- (!pair  "globals"
-  (!type already_seen 754)
-  (!srcfileloc  "cp/mangle.c" 106)
-  nil )
- (!pair  "vec<tinfo_s,va_gc>"
-  (!type already_seen 755)
-  (!srcfileloc  "cp/rtti.c" 104)
-  nil )
- (!pair  "tinfo_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/rtti.c" 90)
-  nil )
- (!pair  "tinfo_s"
-  (!type already_seen 757)
-  (!srcfileloc  "cp/rtti.c" 73)
-  nil )
- (!pair  "c_dtr_syn"
-  (!type already_seen 9)
-  (!srcfileloc  "c/c-parser.c" 1117)
-  nil )
- (!pair  "c_parser"
-  (!type already_seen 760)
-  (!srcfileloc  "c/c-parser.c" 217)
-  nil )
- (!pair  "vec<c_token,va_gc>"
-  (!type already_seen 766)
-  (!srcfileloc  "c/c-parser.c" 216)
-  nil )
- (!pair  "c_token"
-  (!type already_seen 763)
-  (!srcfileloc  "c/c-parser.c" 165)
-  nil )
- (!pair  "c_id_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "c/c-parser.c" 145)
-  nil )
- (!pair  "pragma_ns_name"
-  (!type already_seen 768)
-  (!srcfileloc  "c-family/c-pragma.c" 1172)
-  nil )
- (!pair  "opt_stack"
-  (!type already_seen 769)
-  (!srcfileloc  "c-family/c-pragma.c" 902)
-  nil )
- (!pair  "vec<pending_redefinition,va_gc>"
-  (!type already_seen 771)
-  (!srcfileloc  "c-family/c-pragma.c" 433)
-  nil )
- (!pair  "pending_redefinition"
-  (!type already_seen 773)
-  (!srcfileloc  "c-family/c-pragma.c" 430)
-  nil )
- (!pair  "vec<pending_weak,va_gc>"
-  (!type already_seen 774)
-  (!srcfileloc  "c-family/c-pragma.c" 247)
-  nil )
- (!pair  "pending_weak"
-  (!type already_seen 776)
-  (!srcfileloc  "c-family/c-pragma.c" 244)
-  nil )
- (!pair  "align_stack"
-  (!type already_seen 777)
-  (!srcfileloc  "c-family/c-pragma.c" 54)
-  nil )
- (!pair  "internal_pragma_handler"
-  (!type already_seen 779)
-  (!srcfileloc  "c-family/c-pragma.h" 151)
-  nil )
- (!pair  "pragma_handler_2arg"
-  (!type already_seen 9)
-  (!srcfileloc  "c-family/c-pragma.h" 135)
-  nil )
- (!pair  "pragma_handler_1arg"
-  (!type already_seen 9)
-  (!srcfileloc  "c-family/c-pragma.h" 132)
-  nil )
- (!pair  "pragma_omp_clause"
-  (!type already_seen 9)
-  (!srcfileloc  "c-family/c-pragma.h" 119)
-  nil )
- (!pair  "pragma_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "c-family/c-pragma.h" 62)
-  nil )
- (!pair  "objc_ivar_visibility_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "c-family/c-objc.h" 29)
-  nil )
- (!pair  "an_loop_parts"
-  (!type already_seen 782)
-  (!srcfileloc  "c-family/c-common.h" 1352)
-  nil )
- (!pair  "an_parts"
-  (!type already_seen 783)
-  (!srcfileloc  "c-family/c-common.h" 1341)
-  nil )
- (!pair  "omp_clause_mask"
-  (!type already_seen 9)
-  (!srcfileloc  "c-family/c-common.h" 1051)
-  nil )
- (!pair  "stmt_tree"
-  (!type already_seen 89)
-  (!srcfileloc  "c-family/c-common.h" 502)
-  nil )
- (!pair  "ref_operator"
-  (!type already_seen 9)
-  (!srcfileloc  "c-family/c-common.h" 482)
-  nil )
- (!pair  "c_language_kind"
-  (!type already_seen 9)
-  (!srcfileloc  "c-family/c-common.h" 459)
-  nil )
- (!pair  "vec<tree_gc_vec,va_gc>"
-  (!type already_seen 788)
-  (!srcfileloc  "c-family/c-common.c" 11546)
-  nil )
- (!pair  "tree_gc_vec"
-  (!type already_seen 45)
-  (!srcfileloc  "c-family/c-common.c" 11545)
-  nil )
- (!pair  "vec<const_char_p,va_gc>"
-  (!type already_seen 791)
-  (!srcfileloc  "c-family/c-common.c" 9011)
-  nil )
- (!pair  "const_char_p"
-  (!type already_seen 29)
-  (!srcfileloc  "c-family/c-common.c" 9010)
-  nil )
- (!pair  "disabled_builtin"
-  (!type already_seen 793)
-  (!srcfileloc  "c-family/c-common.c" 5761)
-  nil )
- (!pair  "c_binding_ptr"
-  (!type already_seen 583)
-  (!srcfileloc  "c/c-decl.c" 507)
-  nil )
- (!pair  "vec<c_goto_bindings_p,va_gc>"
-  (!type already_seen 592)
-  (!srcfileloc  "c/c-decl.c" 315)
-  nil )
- (!pair  "c_goto_bindings_p"
-  (!type already_seen 593)
-  (!srcfileloc  "c/c-decl.c" 296)
-  nil )
- (!pair  "c_arg_tag"
-  (!type already_seen 805)
-  (!srcfileloc  "c/c-tree.h" 355)
-  nil )
- (!pair  "c_expr_t"
-  (!type already_seen 808)
-  (!srcfileloc  "c/c-tree.h" 133)
-  nil )
- (!pair  "builtin_type"
-  (!type already_seen 9)
-  (!srcfileloc  "ada/gcc-interface/utils.c" 5855)
-  nil )
- (!pair  "vec<loop_info,va_gc>"
-  (!type already_seen 815)
-  (!srcfileloc  "ada/gcc-interface/trans.c" 224)
-  nil )
- (!pair  "loop_info"
-  (!type already_seen 817)
-  (!srcfileloc  "ada/gcc-interface/trans.c" 220)
-  nil )
- (!pair  "vec<range_check_info,va_gc>"
-  (!type already_seen 820)
-  (!srcfileloc  "ada/gcc-interface/trans.c" 217)
-  nil )
- (!pair  "range_check_info"
-  (!type already_seen 821)
-  (!srcfileloc  "ada/gcc-interface/trans.c" 210)
-  nil )
- (!pair  "vec<parm_attr,va_gc>"
-  (!type already_seen 117)
-  (!srcfileloc  "ada/gcc-interface/trans.c" 135)
-  nil )
- (!pair  "parm_attr"
-  (!type already_seen 118)
-  (!srcfileloc  "ada/gcc-interface/trans.c" 131)
-  nil )
- (!pair  "vinfo_t"
-  (!type already_seen 827)
-  (!srcfileloc  "ada/gcc-interface/decl.c" 6908)
-  nil )
- (!pair  "intrin_binding_t"
-  (!type already_seen 828)
-  (!srcfileloc  "ada/gcc-interface/decl.c" 182)
-  nil )
- (!pair  "variant_desc"
-  (!type already_seen 829)
-  (!srcfileloc  "ada/gcc-interface/decl.c" 127)
-  nil )
- (!pair  "subst_pair"
-  (!type already_seen 830)
-  (!srcfileloc  "ada/gcc-interface/decl.c" 112)
-  nil )
- (!pair  "polymorphic_call_target_hash_type"
-  (!type already_seen 841)
-  (!srcfileloc  "ipa-devirt.c" 864)
-  nil )
- (!pair  "polymorphic_call_target_hasher"
-  (!type already_seen 842)
-  (!srcfileloc  "ipa-devirt.c" 863)
-  nil )
- (!pair  "hash_table<polymorphic_call_target_hasher>"
-  (!type already_seen 841)
-  (!srcfileloc  "ipa-devirt.c" 863)
-  nil )
- (!pair  "vec<odr_type,va_gc>"
-  (!type already_seen 844)
-  (!srcfileloc  "ipa-devirt.c" 276)
-  nil )
- (!pair  "odr_hash_type"
-  (!type already_seen 851)
-  (!srcfileloc  "ipa-devirt.c" 269)
-  nil )
- (!pair  "odr_hasher"
-  (!type already_seen 852)
-  (!srcfileloc  "ipa-devirt.c" 269)
-  nil )
- (!pair  "hash_table<odr_hasher>"
-  (!type already_seen 851)
-  (!srcfileloc  "ipa-devirt.c" 269)
-  nil )
- (!pair  "pointer_set_t"
-  (!type already_seen 850)
-  (!srcfileloc  "ipa-devirt.c" 159)
-  nil )
- (!pair  "vec<odr_type>"
-  (!type already_seen 848)
-  (!srcfileloc  "ipa-devirt.c" 152)
-  nil )
- (!pair  "vtbl_map_iterator_type"
-  (!type already_seen 867)
-  (!srcfileloc  "vtable-verify.c" 311)
-  nil )
- (!pair  "vtbl_map_table_type::iterator"
-  (!type already_seen 867)
-  (!srcfileloc  "vtable-verify.c" 311)
-  nil )
- (!pair  "vtbl_map_table_type"
-  (!type already_seen 868)
-  (!srcfileloc  "vtable-verify.c" 310)
-  nil )
- (!pair  "vtbl_map_hasher"
-  (!type already_seen 869)
-  (!srcfileloc  "vtable-verify.c" 310)
-  nil )
- (!pair  "hash_table<vtbl_map_hasher>"
-  (!type already_seen 868)
-  (!srcfileloc  "vtable-verify.c" 310)
-  nil )
- (!pair  "inline_edge_summary_t"
-  (!type already_seen 1301)
-  (!srcfileloc  "ipa-inline.h" 196)
-  nil )
- (!pair  "vec<inline_summary_t,va_gc>"
-  (!type already_seen 873)
-  (!srcfileloc  "ipa-inline.h" 164)
-  nil )
- (!pair  "inline_summary_t"
-  (!type already_seen 875)
-  (!srcfileloc  "ipa-inline.h" 163)
-  nil )
- (!pair  "size_time_entry"
-  (!type already_seen 881)
-  (!srcfileloc  "ipa-inline.h" 141)
-  nil )
- (!pair  "vec<size_time_entry,va_gc>"
-  (!type already_seen 880)
-  (!srcfileloc  "ipa-inline.h" 141)
-  nil )
- (!pair  "clause_t"
-  (!type already_seen 9)
-  (!srcfileloc  "ipa-inline.h" 88)
-  nil )
- (!pair  "conditions"
-  (!type already_seen 876)
-  (!srcfileloc  "ipa-inline.h" 76)
-  nil )
- (!pair  "condition"
-  (!type already_seen 878)
-  (!srcfileloc  "ipa-inline.h" 76)
-  nil )
- (!pair  "vec<condition,va_gc>"
-  (!type already_seen 877)
-  (!srcfileloc  "ipa-inline.h" 76)
-  nil )
- (!pair  "inline_hints"
-  (!type already_seen 9)
-  (!srcfileloc  "ipa-inline.h" 73)
-  nil )
- (!pair  "lto_file_decl_data_ptr"
-  (!type already_seen 945)
-  (!srcfileloc  "lto-streamer.h" 572)
-  nil )
- (!pair  "pointer_map_t"
-  (!type already_seen 386)
-  (!srcfileloc  "lto-streamer.h" 569)
-  nil )
- (!pair  "res_pair"
-  (!type already_seen 893)
-  (!srcfileloc  "lto-streamer.h" 563)
-  nil )
- (!pair  "vec<res_pair>"
-  (!type already_seen 892)
-  (!srcfileloc  "lto-streamer.h" 563)
-  nil )
- (!pair  "lto_out_decl_state_ptr"
-  (!type already_seen 999)
-  (!srcfileloc  "lto-streamer.h" 516)
-  nil )
- (!pair  "lto_in_decl_state_ptr"
-  (!type already_seen 906)
-  (!srcfileloc  "lto-streamer.h" 497)
-  nil )
- (!pair  "lto_symtab_encoder_t"
-  (!type already_seen 898)
-  (!srcfileloc  "lto-streamer.h" 454)
-  nil )
- (!pair  "lto_free_section_data_f"
-  (!type already_seen 9)
-  (!srcfileloc  "lto-streamer.h" 313)
-  nil )
- (!pair  "lto_get_section_data_f"
-  (!type already_seen 9)
-  (!srcfileloc  "lto-streamer.h" 304)
-  nil )
- (!pair  "ld_plugin_symbol_resolution_t"
-  (!type already_seen 9)
-  (!srcfileloc  "lto-streamer.h" 272)
-  nil )
- (!pair  "lto_decl_flags_t"
-  (!type already_seen 28)
-  (!srcfileloc  "lto-streamer.h" 146)
-  nil )
- (!pair  "cgraph_node_queue"
-  (!type already_seen 911)
-  (!srcfileloc  "trans-mem.c" 4064)
-  nil )
- (!pair  "vec<cgraph_node_ptr>"
-  (!type already_seen 911)
-  (!srcfileloc  "trans-mem.c" 4064)
-  nil )
- (!pair  "tm_memop_t"
-  (!type already_seen 955)
-  (!srcfileloc  "trans-mem.c" 3299)
-  nil )
- (!pair  "tm_region_p"
-  (!type already_seen 961)
-  (!srcfileloc  "trans-mem.c" 1847)
-  nil )
- (!pair  "tm_new_mem_map_t"
-  (!type already_seen 964)
-  (!srcfileloc  "trans-mem.c" 1013)
-  nil )
- (!pair  "tm_log_entry_t"
-  (!type already_seen 967)
-  (!srcfileloc  "trans-mem.c" 937)
-  nil )
- (!pair  "ipa_parm_adjustment_vec"
-  (!type already_seen 970)
-  (!srcfileloc  "ipa-prop.h" 686)
-  nil )
- (!pair  "ipa_parm_adjustment"
-  (!type already_seen 971)
-  (!srcfileloc  "ipa-prop.h" 686)
-  nil )
- (!pair  "vec<ipa_parm_adjustment>"
-  (!type already_seen 970)
-  (!srcfileloc  "ipa-prop.h" 686)
-  nil )
- (!pair  "ipa_edge_args"
-  (!type already_seen 974)
-  (!srcfileloc  "ipa-prop.h" 511)
-  nil )
- (!pair  "vec<ipa_edge_args,va_gc>"
-  (!type already_seen 972)
-  (!srcfileloc  "ipa-prop.h" 511)
-  nil )
- (!pair  "vec<ipa_agg_replacement_value_p,va_gc>"
-  (!type already_seen 990)
-  (!srcfileloc  "ipa-prop.h" 509)
-  nil )
- (!pair  "ipa_jump_func"
-  (!type already_seen 977)
-  (!srcfileloc  "ipa-prop.h" 480)
-  nil )
- (!pair  "vec<ipa_jump_func,va_gc>"
-  (!type already_seen 976)
-  (!srcfileloc  "ipa-prop.h" 480)
-  nil )
- (!pair  "ipa_agg_replacement_value_p"
-  (!type already_seen 992)
-  (!srcfileloc  "ipa-prop.h" 470)
-  nil )
- (!pair  "ipa_agg_jump_function_p"
-  (!type already_seen 979)
-  (!srcfileloc  "ipa-prop.h" 178)
-  nil )
- (!pair  "ipa_agg_jf_item"
-  (!type already_seen 982)
-  (!srcfileloc  "ipa-prop.h" 173)
-  nil )
- (!pair  "vec<ipa_agg_jf_item,va_gc>"
-  (!type already_seen 981)
-  (!srcfileloc  "ipa-prop.h" 173)
-  nil )
- (!pair  "uid_range_p"
-  (!type already_seen 1002)
-  (!srcfileloc  "passes.c" 951)
-  nil )
- (!pair  "char_ptr"
-  (!type already_seen 29)
-  (!srcfileloc  "passes.c" 814)
-  nil )
- (!pair  "arm_mangle_map_entry"
-  (!type already_seen 1013)
-  (!srcfileloc  "config/arm/arm.c" 29438)
-  nil )
- (!pair  "builtin_arg"
-  (!type already_seen 9)
-  (!srcfileloc  "config/arm/arm.c" 24784)
-  nil )
- (!pair  "neon_builtin_datum"
-  (!type already_seen 1015)
-  (!srcfileloc  "config/arm/arm.c" 22875)
-  nil )
- (!pair  "neon_itype"
-  (!type already_seen 9)
-  (!srcfileloc  "config/arm/arm.c" 22867)
-  nil )
- (!pair  "neon_builtin_type_mode"
-  (!type already_seen 9)
-  (!srcfileloc  "config/arm/arm.c" 22798)
-  nil )
- (!pair  "arm_pragma_enum"
-  (!type already_seen 9)
-  (!srcfileloc  "config/arm/arm.c" 5793)
-  nil )
- (!pair  "libcall_table_type"
-  (!type already_seen 1016)
-  (!srcfileloc  "config/arm/arm.c" 4517)
-  nil )
- (!pair  "libcall_hasher"
-  (!type already_seen 1017)
-  (!srcfileloc  "config/arm/arm.c" 4517)
-  nil )
- (!pair  "hash_table<libcall_hasher>"
-  (!type already_seen 1016)
-  (!srcfileloc  "config/arm/arm.c" 4517)
-  nil )
- (!pair  "isr_attribute_arg"
-  (!type already_seen 1018)
-  (!srcfileloc  "config/arm/arm.c" 2851)
-  nil )
- (!pair  "arm_fixed_mode_set"
-  (!type already_seen 1019)
-  (!srcfileloc  "config/arm/arm.c" 1856)
-  nil )
- (!pair  "Mfix"
-  (!type already_seen 1023)
-  (!srcfileloc  "config/arm/arm.c" 65)
-  nil )
- (!pair  "Mnode"
-  (!type already_seen 1024)
-  (!srcfileloc  "config/arm/arm.c" 64)
-  nil )
- (!pair  "omp_context"
-  (!type already_seen 1035)
-  (!srcfileloc  "omp-low.c" 178)
-  nil )
- (!pair  "lambda_trans_matrix"
-  (!type already_seen 1042)
-  (!srcfileloc  "tree-parloops.c" 293)
-  nil )
- (!pair  "name_to_copy_table_type"
-  (!type already_seen 1043)
-  (!srcfileloc  "tree-parloops.c" 282)
-  nil )
- (!pair  "name_to_copy_hasher"
-  (!type already_seen 1044)
-  (!srcfileloc  "tree-parloops.c" 282)
-  nil )
- (!pair  "hash_table<name_to_copy_hasher>"
-  (!type already_seen 1043)
-  (!srcfileloc  "tree-parloops.c" 282)
-  nil )
- (!pair  "reduction_info_table_type"
-  (!type already_seen 1046)
-  (!srcfileloc  "tree-parloops.c" 230)
-  nil )
- (!pair  "reduction_hasher"
-  (!type already_seen 1047)
-  (!srcfileloc  "tree-parloops.c" 230)
-  nil )
- (!pair  "hash_table<reduction_hasher>"
-  (!type already_seen 1046)
-  (!srcfileloc  "tree-parloops.c" 230)
-  nil )
- (!pair  "use_optype_p"
-  (!type already_seen 391)
-  (!srcfileloc  "tree-ssa-operands.h" 42)
-  nil )
- (!pair  "use_operand_p"
-  (!type already_seen 511)
-  (!srcfileloc  "tree-ssa-operands.h" 30)
-  nil )
- (!pair  "ssa_use_operand_t"
-  (!type already_seen 510)
-  (!srcfileloc  "tree-ssa-operands.h" 30)
-  nil )
- (!pair  "def_operand_p"
-  (!type already_seen 6)
-  (!srcfileloc  "tree-ssa-operands.h" 27)
-  nil )
- (!pair  "t_bool"
-  (!type already_seen 9)
-  (!srcfileloc  "tree-scalar-evolution.c" 905)
-  nil )
- (!pair  "numbered_tree"
-  (!type already_seen 1057)
-  (!srcfileloc  "tree-dfa.c" 704)
-  nil )
- (!pair  "vec<mem_addr_template,va_gc>"
-  (!type already_seen 1071)
-  (!srcfileloc  "tree-ssa-address.c" 98)
-  nil )
- (!pair  "mem_addr_template"
-  (!type already_seen 1073)
-  (!srcfileloc  "tree-ssa-address.c" 91)
-  nil )
- (!pair  "treemple"
-  (!type already_seen 1085)
-  (!srcfileloc  "tree-eh.c" 59)
-  nil )
- (!pair  "vec<gimple,va_gc>"
-  (!type already_seen 383)
-  (!srcfileloc  "gimple-ssa.h" 43)
-  nil )
- (!pair  "elt_t"
-  (!type already_seen 1087)
-  (!srcfileloc  "gimple.h" 1278)
-  nil )
- (!pair  "gimple_vec"
-  (!type already_seen 1132)
-  (!srcfileloc  "gimple.h" 29)
-  nil )
- (!pair  "vec<gimple>"
-  (!type already_seen 1132)
-  (!srcfileloc  "gimple.h" 29)
-  nil )
- (!pair  "gimple_seq_node"
-  (!type already_seen 310)
-  (!srcfileloc  "gimple.h" 25)
-  nil )
- (!pair  "tm_alias_pair"
-  (!type already_seen 1133)
-  (!srcfileloc  "varasm.c" 5756)
-  nil )
- (!pair  "oc_local_state"
-  (!type already_seen 1134)
-  (!srcfileloc  "varasm.c" 4839)
-  nil )
- (!pair  "oc_outer_state"
-  (!type already_seen 1135)
-  (!srcfileloc  "varasm.c" 4577)
-  nil )
- (!pair  "block_info"
-  (!type already_seen 1151)
-  (!srcfileloc  "reg-stack.c" 215)
-  nil )
- (!pair  "stack_ptr"
-  (!type already_seen 1153)
-  (!srcfileloc  "reg-stack.c" 202)
-  nil )
- (!pair  "augmenting_path_type"
-  (!type already_seen 1155)
-  (!srcfileloc  "mcf.c" 140)
-  nil )
- (!pair  "queue_type"
-  (!type already_seen 1156)
-  (!srcfileloc  "mcf.c" 129)
-  nil )
- (!pair  "fixup_graph_type"
-  (!type already_seen 1157)
-  (!srcfileloc  "mcf.c" 121)
-  nil )
- (!pair  "fixup_vertex_p"
-  (!type already_seen 1159)
-  (!srcfileloc  "mcf.c" 104)
-  nil )
- (!pair  "fixup_vertex_type"
-  (!type already_seen 1158)
-  (!srcfileloc  "mcf.c" 102)
-  nil )
- (!pair  "fixup_edge_p"
-  (!type already_seen 1161)
-  (!srcfileloc  "mcf.c" 95)
-  nil )
- (!pair  "fixup_edge_type"
-  (!type already_seen 1160)
-  (!srcfileloc  "mcf.c" 93)
-  nil )
- (!pair  "edge_type"
-  (!type already_seen 9)
-  (!srcfileloc  "mcf.c" 74)
-  nil )
- (!pair  "vec_modify_pair_heap"
-  (!type already_seen 1173)
-  (!srcfileloc  "gcse.c" 635)
-  nil )
- (!pair  "vec<modify_pair>"
-  (!type already_seen 1173)
-  (!srcfileloc  "gcse.c" 635)
-  nil )
- (!pair  "vec_rtx_heap"
-  (!type already_seen 1175)
-  (!srcfileloc  "gcse.c" 634)
-  nil )
- (!pair  "vec<rtx>"
-  (!type already_seen 1175)
-  (!srcfileloc  "gcse.c" 634)
-  nil )
- (!pair  "modify_pair"
-  (!type already_seen 1174)
-  (!srcfileloc  "gcse.c" 405)
-  nil )
- (!pair  "occr_t"
-  (!type already_seen 1181)
-  (!srcfileloc  "gcse.c" 309)
-  nil )
- (!pair  "ehspec_hash_type"
-  (!type already_seen 1185)
-  (!srcfileloc  "except.c" 786)
-  nil )
- (!pair  "ehspec_hasher"
-  (!type already_seen 1186)
-  (!srcfileloc  "except.c" 786)
-  nil )
- (!pair  "hash_table<ehspec_hasher>"
-  (!type already_seen 1185)
-  (!srcfileloc  "except.c" 786)
-  nil )
- (!pair  "ttypes_hash_type"
-  (!type already_seen 1187)
-  (!srcfileloc  "except.c" 749)
-  nil )
- (!pair  "ttypes_filter_hasher"
-  (!type already_seen 1188)
-  (!srcfileloc  "except.c" 749)
-  nil )
- (!pair  "hash_table<ttypes_filter_hasher>"
-  (!type already_seen 1187)
-  (!srcfileloc  "except.c" 749)
-  nil )
- (!pair  "action_hash_type"
-  (!type already_seen 1191)
-  (!srcfileloc  "except.c" 211)
-  nil )
- (!pair  "action_record_hasher"
-  (!type already_seen 1192)
-  (!srcfileloc  "except.c" 211)
-  nil )
- (!pair  "hash_table<action_record_hasher>"
-  (!type already_seen 1191)
-  (!srcfileloc  "except.c" 211)
-  nil )
- (!pair  "initial_value_struct"
-  (!type already_seen 1382)
-  (!srcfileloc  "function.c" 1219)
-  nil )
- (!pair  "initial_value_pair"
-  (!type already_seen 1201)
-  (!srcfileloc  "function.c" 1211)
-  nil )
- (!pair  "function_p"
-  (!type already_seen 349)
-  (!srcfileloc  "function.c" 131)
-  nil )
- (!pair  "sepops"
-  (!type already_seen 1211)
-  (!srcfileloc  "expr.h" 142)
-  nil )
- (!pair  "duplicate_eh_regions_map"
-  (!type already_seen 9)
-  (!srcfileloc  "except.h" 251)
-  nil )
- (!pair  "vec<eh_landing_pad,va_gc>"
-  (!type already_seen 366)
-  (!srcfileloc  "except.h" 203)
-  nil )
- (!pair  "vec<eh_region,va_gc>"
-  (!type already_seen 364)
-  (!srcfileloc  "except.h" 200)
-  nil )
- (!pair  "eh_region"
-  (!type already_seen 353)
-  (!srcfileloc  "except.h" 187)
-  nil )
- (!pair  "eh_catch"
-  (!type already_seen 357)
-  (!srcfileloc  "except.h" 186)
-  nil )
- (!pair  "eh_landing_pad"
-  (!type already_seen 361)
-  (!srcfileloc  "except.h" 185)
-  nil )
- (!pair  "elem_op_func"
-  (!type already_seen 9)
-  (!srcfileloc  "tree-vect-generic.c" 114)
-  nil )
- (!pair  "loc_list_hash_type"
-  (!type already_seen 1216)
-  (!srcfileloc  "dwarf2out.c" 23883)
-  nil )
- (!pair  "loc_list_hasher"
-  (!type already_seen 1217)
-  (!srcfileloc  "dwarf2out.c" 23883)
-  nil )
- (!pair  "hash_table<loc_list_hasher>"
-  (!type already_seen 1216)
-  (!srcfileloc  "dwarf2out.c" 23883)
-  nil )
- (!pair  "macinfo_hash_type"
-  (!type already_seen 1219)
-  (!srcfileloc  "dwarf2out.c" 21699)
-  nil )
- (!pair  "macinfo_entry_hasher"
-  (!type already_seen 1220)
-  (!srcfileloc  "dwarf2out.c" 21699)
-  nil )
- (!pair  "hash_table<macinfo_entry_hasher>"
-  (!type already_seen 1219)
-  (!srcfileloc  "dwarf2out.c" 21699)
-  nil )
- (!pair  "dchar_p"
-  (!type already_seen 29)
-  (!srcfileloc  "dwarf2out.c" 19144)
-  nil )
- (!pair  "external_ref_hash_type"
-  (!type already_seen 1224)
-  (!srcfileloc  "dwarf2out.c" 7518)
-  nil )
- (!pair  "external_ref_hasher"
-  (!type already_seen 1225)
-  (!srcfileloc  "dwarf2out.c" 7518)
-  nil )
- (!pair  "hash_table<external_ref_hasher>"
-  (!type already_seen 1224)
-  (!srcfileloc  "dwarf2out.c" 7518)
-  nil )
- (!pair  "decl_hash_type"
-  (!type already_seen 1227)
-  (!srcfileloc  "dwarf2out.c" 6983)
-  nil )
- (!pair  "decl_table_entry_hasher"
-  (!type already_seen 1228)
-  (!srcfileloc  "dwarf2out.c" 6983)
-  nil )
- (!pair  "hash_table<decl_table_entry_hasher>"
-  (!type already_seen 1227)
-  (!srcfileloc  "dwarf2out.c" 6983)
-  nil )
- (!pair  "cu_hash_type"
-  (!type already_seen 1230)
-  (!srcfileloc  "dwarf2out.c" 6658)
-  nil )
- (!pair  "cu_hash_table_entry_hasher"
-  (!type already_seen 1231)
-  (!srcfileloc  "dwarf2out.c" 6658)
-  nil )
- (!pair  "hash_table<cu_hash_table_entry_hasher>"
-  (!type already_seen 1230)
-  (!srcfileloc  "dwarf2out.c" 6658)
-  nil )
- (!pair  "vec<die_arg_entry,va_gc>"
-  (!type already_seen 1235)
-  (!srcfileloc  "dwarf2out.c" 2920)
-  nil )
- (!pair  "vec<macinfo_entry,va_gc>"
-  (!type already_seen 1238)
-  (!srcfileloc  "dwarf2out.c" 2868)
-  nil )
- (!pair  "vec<pubname_entry,va_gc>"
-  (!type already_seen 1241)
-  (!srcfileloc  "dwarf2out.c" 2860)
-  nil )
- (!pair  "vec<dw_line_info_table_p,va_gc>"
-  (!type already_seen 1245)
-  (!srcfileloc  "dwarf2out.c" 2852)
-  nil )
- (!pair  "cached_dw_loc_list"
-  (!type already_seen 1253)
-  (!srcfileloc  "dwarf2out.c" 2818)
-  nil )
- (!pair  "var_loc_list"
-  (!type already_seen 1257)
-  (!srcfileloc  "dwarf2out.c" 2781)
-  nil )
- (!pair  "die_arg_entry"
-  (!type already_seen 1237)
-  (!srcfileloc  "dwarf2out.c" 2743)
-  nil )
- (!pair  "skeleton_chain_node"
-  (!type already_seen 1261)
-  (!srcfileloc  "dwarf2out.c" 2631)
-  nil )
- (!pair  "limbo_die_node"
-  (!type already_seen 1262)
-  (!srcfileloc  "dwarf2out.c" 2623)
-  nil )
- (!pair  "comdat_type_node"
-  (!type already_seen 431)
-  (!srcfileloc  "dwarf2out.c" 2615)
-  nil )
- (!pair  "macinfo_entry"
-  (!type already_seen 1240)
-  (!srcfileloc  "dwarf2out.c" 2598)
-  nil )
- (!pair  "pubname_entry"
-  (!type already_seen 1243)
-  (!srcfileloc  "dwarf2out.c" 2582)
-  nil )
- (!pair  "die_node"
-  (!type already_seen 428)
-  (!srcfileloc  "dwarf2out.c" 2565)
-  nil )
- (!pair  "vec<dw_attr_node,va_gc>"
-  (!type already_seen 434)
-  (!srcfileloc  "dwarf2out.c" 2550)
-  nil )
- (!pair  "dw_attr_node"
-  (!type already_seen 435)
-  (!srcfileloc  "dwarf2out.c" 2536)
-  nil )
- (!pair  "dw_line_info_table_p"
-  (!type already_seen 1247)
-  (!srcfileloc  "dwarf2out.c" 2525)
-  nil )
- (!pair  "dw_line_info_table"
-  (!type already_seen 1248)
-  (!srcfileloc  "dwarf2out.c" 2523)
-  nil )
- (!pair  "vec<dw_line_info_entry,va_gc>"
-  (!type already_seen 1250)
-  (!srcfileloc  "dwarf2out.c" 2522)
-  nil )
- (!pair  "dw_line_info_entry"
-  (!type already_seen 1251)
-  (!srcfileloc  "dwarf2out.c" 2506)
-  nil )
- (!pair  "comdat_type_node_ref"
-  (!type already_seen 430)
-  (!srcfileloc  "dwarf2out.c" 2470)
-  nil )
- (!pair  "dw_ranges_by_label_ref"
-  (!type already_seen 1265)
-  (!srcfileloc  "dwarf2out.c" 2469)
-  nil )
- (!pair  "dw_ranges_ref"
-  (!type already_seen 1267)
-  (!srcfileloc  "dwarf2out.c" 2468)
-  nil )
- (!pair  "pubname_ref"
-  (!type already_seen 1244)
-  (!srcfileloc  "dwarf2out.c" 2467)
-  nil )
- (!pair  "dw_line_info_ref"
-  (!type already_seen 1252)
-  (!srcfileloc  "dwarf2out.c" 2466)
-  nil )
- (!pair  "dw_attr_ref"
-  (!type already_seen 436)
-  (!srcfileloc  "dwarf2out.c" 2465)
-  nil )
- (!pair  "dw_offset"
-  (!type already_seen 9)
-  (!srcfileloc  "dwarf2out.c" 2461)
-  nil )
- (!pair  "dw_loc_list_node"
-  (!type already_seen 423)
-  (!srcfileloc  "dwarf2out.c" 1283)
-  nil )
- (!pair  "addr_table_entry"
-  (!type already_seen 419)
-  (!srcfileloc  "dwarf2out.c" 1259)
-  nil )
- (!pair  "vec<deferred_locations,va_gc>"
-  (!type already_seen 1268)
-  (!srcfileloc  "dwarf2out.c" 1237)
-  nil )
- (!pair  "deferred_locations"
-  (!type already_seen 1270)
-  (!srcfileloc  "dwarf2out.c" 1234)
-  nil )
- (!pair  "vec<dw_fde_ref,va_gc>"
-  (!type already_seen 1271)
-  (!srcfileloc  "dwarf2out.c" 203)
-  nil )
- (!pair  "queued_reg_save"
-  (!type already_seen 1274)
-  (!srcfileloc  "dwarf2cfi.c" 222)
-  nil )
- (!pair  "dw_trace_info_ref"
-  (!type already_seen 1277)
-  (!srcfileloc  "dwarf2cfi.c" 156)
-  nil )
- (!pair  "dw_trace_info"
-  (!type already_seen 1276)
-  (!srcfileloc  "dwarf2cfi.c" 153)
-  nil )
- (!pair  "reg_saved_in_data"
-  (!type already_seen 1278)
-  (!srcfileloc  "dwarf2cfi.c" 80)
-  nil )
- (!pair  "dw_cfi_row"
-  (!type already_seen 1280)
-  (!srcfileloc  "dwarf2cfi.c" 74)
-  nil )
- (!pair  "dw_cfa_location"
-  (!type already_seen 1282)
-  (!srcfileloc  "dwarf2cfi.c" 69)
-  nil )
- (!pair  "dw_val_node"
-  (!type already_seen 416)
-  (!srcfileloc  "dwarf2out.h" 211)
-  nil )
- (!pair  "dw_vec_const"
-  (!type already_seen 424)
-  (!srcfileloc  "dwarf2out.h" 179)
-  nil )
- (!pair  "dw_fde_ref"
-  (!type already_seen 407)
-  (!srcfileloc  "dwarf2out.h" 65)
-  nil )
- (!pair  "cfi_vec"
-  (!type already_seen 409)
-  (!srcfileloc  "dwarf2out.h" 63)
-  nil )
- (!pair  "vec<dw_cfi_ref,va_gc>"
-  (!type already_seen 410)
-  (!srcfileloc  "dwarf2out.h" 63)
-  nil )
- (!pair  "dw_cfi_oprnd"
-  (!type already_seen 413)
-  (!srcfileloc  "dwarf2out.h" 52)
-  nil )
- (!pair  "dw_loc_list_ref"
-  (!type already_seen 422)
-  (!srcfileloc  "dwarf2out.h" 31)
-  nil )
- (!pair  "dw_loc_descr_ref"
-  (!type already_seen 414)
-  (!srcfileloc  "dwarf2out.h" 30)
-  nil )
- (!pair  "dw_cfi_ref"
-  (!type already_seen 411)
-  (!srcfileloc  "dwarf2out.h" 29)
-  nil )
- (!pair  "dw_val_ref"
-  (!type already_seen 417)
-  (!srcfileloc  "dwarf2out.h" 28)
-  nil )
- (!pair  "const_dw_die_ref"
-  (!type already_seen 426)
-  (!srcfileloc  "dwarf2out.h" 26)
-  nil )
- (!pair  "dw_die_ref"
-  (!type already_seen 426)
-  (!srcfileloc  "dwarf2out.h" 25)
-  nil )
- (!pair  "odr_type"
-  (!type already_seen 846)
-  (!srcfileloc  "ipa-utils.h" 72)
-  nil )
- (!pair  "odr_type_d"
-  (!type already_seen 847)
-  (!srcfileloc  "ipa-utils.h" 72)
-  nil )
- (!pair  "const_bitmap_descriptor"
-  (!type already_seen 1314)
-  (!srcfileloc  "bitmap.c" 45)
-  nil )
- (!pair  "bitmap_descriptor"
-  (!type already_seen 1314)
-  (!srcfileloc  "bitmap.c" 44)
-  nil )
- (!pair  "vec<alias_set_entry,va_gc>"
-  (!type already_seen 1315)
-  (!srcfileloc  "alias.c" 267)
-  nil )
- (!pair  "alias_set_entry"
-  (!type already_seen 1317)
-  (!srcfileloc  "alias.c" 149)
-  nil )
- (!pair  "cgraph_2node_hook"
-  (!type already_seen 9)
-  (!srcfileloc  "cgraph.h" 832)
-  nil )
- (!pair  "cgraph_2edge_hook"
-  (!type already_seen 9)
-  (!srcfileloc  "cgraph.h" 830)
-  nil )
- (!pair  "varpool_node_hook"
-  (!type already_seen 9)
-  (!srcfileloc  "cgraph.h" 828)
-  nil )
- (!pair  "cgraph_node_hook"
-  (!type already_seen 9)
-  (!srcfileloc  "cgraph.h" 827)
-  nil )
- (!pair  "cgraph_edge_hook"
-  (!type already_seen 9)
-  (!srcfileloc  "cgraph.h" 826)
-  nil )
- (!pair  "cgraph_edge_p"
-  (!type already_seen 915)
-  (!srcfileloc  "cgraph.h" 632)
-  nil )
- (!pair  "varpool_node_set"
-  (!type already_seen 1342)
-  (!srcfileloc  "cgraph.h" 506)
-  nil )
- (!pair  "cgraph_node_set"
-  (!type already_seen 1344)
-  (!srcfileloc  "cgraph.h" 503)
-  nil )
- (!pair  "varpool_node_ptr"
-  (!type already_seen 1348)
-  (!srcfileloc  "cgraph.h" 492)
-  nil )
- (!pair  "varpool_node"
-  (!type already_seen 1347)
-  (!srcfileloc  "cgraph.h" 492)
-  nil )
- (!pair  "cgraph_node_ptr"
-  (!type already_seen 912)
-  (!srcfileloc  "cgraph.h" 439)
-  nil )
- (!pair  "vec<ipa_opt_pass>"
-  (!type already_seen 925)
-  (!srcfileloc  "cgraph.h" 391)
-  nil )
- (!pair  "vec<ipa_replace_map_p,va_gc>"
-  (!type already_seen 933)
-  (!srcfileloc  "cgraph.h" 256)
-  nil )
- (!pair  "ipa_replace_map_p"
-  (!type already_seen 934)
-  (!srcfileloc  "cgraph.h" 252)
-  nil )
- (!pair  "vec<ipa_ref_ptr>"
-  (!type already_seen 944)
-  (!srcfileloc  "ipa-ref.h" 58)
-  nil )
- (!pair  "vec<ipa_ref_t,va_gc>"
-  (!type already_seen 941)
-  (!srcfileloc  "ipa-ref.h" 55)
-  nil )
- (!pair  "ipa_ref_ptr"
-  (!type already_seen 943)
-  (!srcfileloc  "ipa-ref.h" 48)
-  nil )
- (!pair  "ipa_ref_t"
-  (!type already_seen 942)
-  (!srcfileloc  "ipa-ref.h" 47)
-  nil )
- (!pair  "symtab_node"
-  (!type already_seen 937)
-  (!srcfileloc  "ipa-ref.h" 38)
-  nil )
- (!pair  "gcov_working_set_t"
-  (!type already_seen 1349)
-  (!srcfileloc  "basic-block.h" 941)
-  nil )
- (!pair  "vec<basic_block,va_gc>"
-  (!type already_seen 377)
-  (!srcfileloc  "basic-block.h" 282)
-  nil )
- (!pair  "__assert_gimple_bb_smaller_rtl_bb"
-  (!type array 1471 nil  gc_unused "(int) sizeof (struct rtl_bb_info)\n               - (int) sizeof (struct gimple_bb_info)" 
-   (!type already_seen 9)
-  )
-  (!srcfileloc  "basic-block.h" 215)
-  nil )
- (!pair  "vec<edge,va_gc>"
-  (!type already_seen 300)
-  (!srcfileloc  "basic-block.h" 169)
-  nil )
- (!pair  "edge_def"
-  (!type already_seen 302)
-  (!srcfileloc  "basic-block.h" 59)
-  nil )
- (!pair  "cselib_expand_callback"
-  (!type already_seen 9)
-  (!srcfileloc  "cselib.h" 84)
-  nil )
- (!pair  "vec<loop_p,va_gc>"
-  (!type already_seen 307)
-  (!srcfileloc  "cfgloop.h" 127)
-  nil )
- (!pair  "loop_p"
-  (!type already_seen 303)
-  (!srcfileloc  "cfgloop.h" 90)
-  nil )
- (!pair  "noswitch_section_callback"
-  (!type already_seen 9)
-  (!srcfileloc  "output.h" 476)
-  nil )
- (!pair  "unnamed_section_callback"
-  (!type already_seen 9)
-  (!srcfileloc  "output.h" 450)
-  nil )
- (!pair  "__gcc_host_wide_int__"
-  (!type already_seen 9)
-  (!srcfileloc  "hwint.h" 122)
-  nil )
- (!pair  "vec<temp_slot_p,va_gc>"
-  (!type already_seen 1386)
-  (!srcfileloc  "function.h" 309)
-  nil )
- (!pair  "ipa_opt_pass"
-  (!type already_seen 926)
-  (!srcfileloc  "function.h" 171)
-  nil )
- (!pair  "ipa_opt_pass_d"
-  (!type already_seen 927)
-  (!srcfileloc  "function.h" 171)
-  nil )
- (!pair  "temp_slot_p"
-  (!type already_seen 1205)
-  (!srcfileloc  "function.h" 166)
-  nil )
- (!pair  "vec<call_site_record,va_gc>"
-  (!type already_seen 1378)
-  (!srcfileloc  "function.h" 154)
-  nil )
- (!pair  "vec<uchar,va_gc>"
-  (!type already_seen 373)
-  (!srcfileloc  "function.h" 152)
-  nil )
- (!pair  "call_site_record"
-  (!type already_seen 1379)
-  (!srcfileloc  "function.h" 141)
-  nil )
- (!pair  "ht_cb"
-  (!type already_seen 9)
-  (!srcfileloc  "../libcpp/include/symtab.h" 89)
-  nil )
- (!pair  "hashnode"
-  (!type already_seen 34)
-  (!srcfileloc  "../libcpp/include/symtab.h" 41)
-  nil )
- (!pair  "cpp_hash_table"
-  (!type already_seen 1389)
-  (!srcfileloc  "../libcpp/include/symtab.h" 40)
-  nil )
- (!pair  "ht_identifier_ptr"
-  (!type already_seen 34)
-  (!srcfileloc  "../libcpp/include/symtab.h" 30)
-  nil )
- (!pair  "ht_identifier"
-  (!type already_seen 33)
-  (!srcfileloc  "../libcpp/include/symtab.h" 29)
-  nil )
- (!pair  "builtin_info_type"
-  (!type already_seen 1393)
-  (!srcfileloc  "tree-core.h" 1833)
-  nil )
- (!pair  "alias_pair"
-  (!type already_seen 1392)
-  (!srcfileloc  "tree-core.h" 1798)
-  nil )
- (!pair  "vec<alias_pair,va_gc>"
-  (!type already_seen 1390)
-  (!srcfileloc  "tree-core.h" 1798)
-  nil )
- (!pair  "record_layout_info"
-  (!type already_seen 1410)
-  (!srcfileloc  "tree-core.h" 1710)
-  nil )
- (!pair  "vec<tree,va_gc>"
-  (!type already_seen 46)
-  (!srcfileloc  "tree-core.h" 1233)
-  nil )
- (!pair  "constructor_elt"
-  (!type already_seen 467)
-  (!srcfileloc  "tree-core.h" 1109)
-  nil )
- (!pair  "vec<constructor_elt,va_gc>"
-  (!type already_seen 466)
-  (!srcfileloc  "tree-core.h" 1109)
-  nil )
- (!pair  "walk_tree_lh"
-  (!type already_seen 9)
-  (!srcfileloc  "tree-core.h" 683)
-  nil )
- (!pair  "walk_tree_fn"
-  (!type already_seen 9)
-  (!srcfileloc  "tree-core.h" 679)
-  nil )
- (!pair  "priority_type"
-  (!type already_seen 9)
-  (!srcfileloc  "tree-core.h" 676)
-  nil )
- (!pair  "direct_optab"
-  (!type already_seen 9)
-  (!srcfileloc  "optabs.h" 28)
-  nil )
- (!pair  "convert_optab"
-  (!type already_seen 9)
-  (!srcfileloc  "optabs.h" 27)
-  nil )
- (!pair  "optab"
-  (!type already_seen 9)
-  (!srcfileloc  "optabs.h" 26)
-  nil )
- (!pair  "hash_rtx_callback_function"
-  (!type already_seen 9)
-  (!srcfileloc  "rtl.h" 2104)
-  nil )
- (!pair  "rtx_equal_p_callback_function"
-  (!type already_seen 9)
-  (!srcfileloc  "rtl.h" 2099)
-  nil )
- (!pair  "for_each_inc_dec_fn"
-  (!type already_seen 9)
-  (!srcfileloc  "rtl.h" 2095)
-  nil )
- (!pair  "rtx_function"
-  (!type already_seen 9)
-  (!srcfileloc  "rtl.h" 2084)
-  nil )
- (!pair  "va_gc"
-  (!type already_seen 3)
-  (!srcfileloc  "rtl.h" 238)
-  nil )
- (!pair  "vec<rtx,va_gc>"
-  (!type already_seen 252)
-  (!srcfileloc  "rtl.h" 238)
-  nil )
- (!pair  "rtunion"
-  (!type already_seen 242)
-  (!srcfileloc  "rtl.h" 208)
-  nil )
- (!pair  "counts_entry_t"
-  (!type already_seen 1427)
-  (!srcfileloc  "coverage.c" 90)
-  nil )
- (!pair  "alias_set_type"
-  (!type already_seen 9)
-  (!srcfileloc  "alias.h" 29)
-  nil )
- (!pair  "bitmap_obstack"
-  (!type already_seen 126)
-  (!srcfileloc  "bitmap.h" 187)
-  nil )
- (!pair  "bitmap_element"
-  (!type already_seen 123)
-  (!srcfileloc  "bitmap.h" 185)
-  nil )
- (!pair  "BITMAP_WORD"
-  (!type already_seen 9)
-  (!srcfileloc  "bitmap.h" 136)
-  nil )
- (!pair  "splay_tree"
-  (!type already_seen 1322)
-  (!srcfileloc  "../include/splay-tree.h" 125)
-  nil )
- (!pair  "splay_tree_deallocate_fn"
-  (!type already_seen 9)
-  (!srcfileloc  "../include/splay-tree.h" 86)
-  nil )
- (!pair  "splay_tree_allocate_fn"
-  (!type already_seen 9)
-  (!srcfileloc  "../include/splay-tree.h" 80)
-  nil )
- (!pair  "splay_tree_foreach_fn"
-  (!type already_seen 9)
-  (!srcfileloc  "../include/splay-tree.h" 74)
-  nil )
- (!pair  "splay_tree_delete_value_fn"
-  (!type already_seen 9)
-  (!srcfileloc  "../include/splay-tree.h" 71)
-  nil )
- (!pair  "splay_tree_delete_key_fn"
-  (!type already_seen 9)
-  (!srcfileloc  "../include/splay-tree.h" 67)
-  nil )
- (!pair  "splay_tree_compare_fn"
-  (!type already_seen 9)
-  (!srcfileloc  "../include/splay-tree.h" 63)
-  nil )
- (!pair  "splay_tree_node"
-  (!type already_seen 1323)
-  (!srcfileloc  "../include/splay-tree.h" 59)
-  nil )
- (!pair  "splay_tree_value"
-  (!type already_seen 9)
-  (!srcfileloc  "../include/splay-tree.h" 56)
-  nil )
- (!pair  "splay_tree_key"
-  (!type already_seen 9)
-  (!srcfileloc  "../include/splay-tree.h" 55)
-  nil )
- (!pair  "htab_t"
-  (!type already_seen 50)
-  (!srcfileloc  "../include/hashtab.h" 144)
-  nil )
- (!pair  "htab_free_with_arg"
-  (!type already_seen 9)
-  (!srcfileloc  "../include/hashtab.h" 83)
-  nil )
- (!pair  "htab_alloc_with_arg"
-  (!type already_seen 9)
-  (!srcfileloc  "../include/hashtab.h" 82)
-  nil )
- (!pair  "htab_free"
-  (!type already_seen 9)
-  (!srcfileloc  "../include/hashtab.h" 78)
-  nil )
- (!pair  "htab_alloc"
-  (!type already_seen 9)
-  (!srcfileloc  "../include/hashtab.h" 75)
-  nil )
- (!pair  "htab_trav"
-  (!type already_seen 9)
-  (!srcfileloc  "../include/hashtab.h" 69)
-  nil )
- (!pair  "htab_del"
-  (!type already_seen 9)
-  (!srcfileloc  "../include/hashtab.h" 63)
-  nil )
- (!pair  "htab_eq"
-  (!type already_seen 9)
-  (!srcfileloc  "../include/hashtab.h" 59)
-  nil )
- (!pair  "htab_hash"
-  (!type already_seen 9)
-  (!srcfileloc  "../include/hashtab.h" 52)
-  nil )
- (!pair  "hashval_t"
-  (!type already_seen 9)
-  (!srcfileloc  "../include/hashtab.h" 47)
-  nil )
- (!pair  "machine_function"
-  (!type already_seen 404)
-  (!srcfileloc  "config/arm/arm.h" 1552)
-  nil )
- (!pair  "arm_stack_offsets"
-  (!type already_seen 405)
-  (!srcfileloc  "config/arm/arm.h" 1511)
-  nil )
- (!pair  "arm_cc"
-  (!type already_seen 9)
-  (!srcfileloc  "config/arm/arm.h" 191)
-  nil )
- (!pair  "gt_pointer_operator"
-  (!type already_seen 9)
-  (!srcfileloc  "coretypes.h" 218)
-  nil )
- (!pair  "reg_class_t"
-  (!type already_seen 9)
-  (!srcfileloc  "coretypes.h" 169)
-  nil )
- (!pair  "const_basic_block"
-  (!type already_seen 297)
-  (!srcfileloc  "coretypes.h" 156)
-  nil )
- (!pair  "basic_block"
-  (!type already_seen 297)
-  (!srcfileloc  "coretypes.h" 155)
-  nil )
- (!pair  "const_edge"
-  (!type already_seen 301)
-  (!srcfileloc  "coretypes.h" 153)
-  nil )
- (!pair  "edge"
-  (!type already_seen 301)
-  (!srcfileloc  "coretypes.h" 152)
-  nil )
- (!pair  "addr_space_t"
-  (!type already_seen 28)
-  (!srcfileloc  "coretypes.h" 80)
-  nil )
- (!pair  "section"
-  (!type already_seen 246)
-  (!srcfileloc  "coretypes.h" 69)
-  nil )
- (!pair  "gimple_seq"
-  (!type already_seen 310)
-  (!srcfileloc  "coretypes.h" 66)
-  nil )
- (!pair  "const_gimple"
-  (!type already_seen 310)
-  (!srcfileloc  "coretypes.h" 65)
-  nil )
- (!pair  "gimple"
-  (!type already_seen 310)
-  (!srcfileloc  "coretypes.h" 64)
-  nil )
- (!pair  "const_tree"
-  (!type already_seen 5)
-  (!srcfileloc  "coretypes.h" 63)
-  nil )
- (!pair  "tree"
-  (!type already_seen 5)
-  (!srcfileloc  "coretypes.h" 62)
-  nil )
- (!pair  "const_rtvec"
-  (!type already_seen 261)
-  (!srcfileloc  "coretypes.h" 60)
-  nil )
- (!pair  "rtvec"
-  (!type already_seen 261)
-  (!srcfileloc  "coretypes.h" 59)
-  nil )
- (!pair  "const_rtx"
-  (!type already_seen 136)
-  (!srcfileloc  "coretypes.h" 57)
-  nil )
- (!pair  "rtx"
-  (!type already_seen 136)
-  (!srcfileloc  "coretypes.h" 56)
-  nil )
- (!pair  "const_sbitmap"
-  (!type already_seen 1446)
-  (!srcfileloc  "coretypes.h" 54)
-  nil )
- (!pair  "sbitmap"
-  (!type already_seen 1446)
-  (!srcfileloc  "coretypes.h" 53)
-  nil )
- (!pair  "const_bitmap"
-  (!type already_seen 120)
-  (!srcfileloc  "coretypes.h" 51)
-  nil )
- (!pair  "bitmap"
-  (!type already_seen 120)
-  (!srcfileloc  "coretypes.h" 50)
-  nil )
- (!pair  "gcov_type_unsigned"
-  (!type already_seen 9)
-  (!srcfileloc  "coretypes.h" 47)
-  nil )
- (!pair  "gcov_type"
-  (!type already_seen 9)
-  (!srcfileloc  "coretypes.h" 46)
-  nil )
- (!pair  "location_t"
-  (!type already_seen 9)
-  (!srcfileloc  "input.h" 47)
-  nil )
- (!pair  "uchar"
-  (!type already_seen 28)
-  (!srcfileloc  "../libcpp/include/cpp-id-data.h" 21)
-  nil )
- (!pair  "cpp_cb"
-  (!type already_seen 9)
-  (!srcfileloc  "../libcpp/include/cpplib.h" 1021)
-  nil )
- (!pair  "cpp_comment_table"
-  (!type already_seen 1448)
-  (!srcfileloc  "../libcpp/include/cpplib.h" 1008)
-  nil )
- (!pair  "cpp_comment"
-  (!type already_seen 1449)
-  (!srcfileloc  "../libcpp/include/cpplib.h" 994)
-  nil )
- (!pair  "cpp_num"
-  (!type already_seen 1450)
-  (!srcfileloc  "../libcpp/include/cpplib.h" 823)
-  nil )
- (!pair  "cpp_num_part"
-  (!type already_seen 9)
-  (!srcfileloc  "../libcpp/include/cpplib.h" 822)
-  nil )
- (!pair  "missing_header_cb"
-  (!type already_seen 9)
-  (!srcfileloc  "../libcpp/include/cpplib.h" 519)
-  nil )
- (!pair  "cppchar_signed_t"
-  (!type already_seen 9)
-  (!srcfileloc  "../libcpp/include/cpplib.h" 269)
-  nil )
- (!pair  "cppchar_t"
-  (!type already_seen 9)
-  (!srcfileloc  "../libcpp/include/cpplib.h" 268)
-  nil )
- (!pair  "cpp_dir"
-  (!type already_seen 1452)
-  (!srcfileloc  "../libcpp/include/cpplib.h" 37)
-  nil )
- (!pair  "cpp_callbacks"
-  (!type already_seen 1453)
-  (!srcfileloc  "../libcpp/include/cpplib.h" 36)
-  nil )
- (!pair  "cpp_macro"
-  (!type already_seen 571)
-  (!srcfileloc  "../libcpp/include/cpplib.h" 35)
-  nil )
- (!pair  "cpp_hashnode"
-  (!type already_seen 566)
-  (!srcfileloc  "../libcpp/include/cpplib.h" 34)
-  nil )
- (!pair  "cpp_string"
-  (!type already_seen 577)
-  (!srcfileloc  "../libcpp/include/cpplib.h" 33)
-  nil )
- (!pair  "cpp_token"
-  (!type already_seen 574)
-  (!srcfileloc  "../libcpp/include/cpplib.h" 32)
-  nil )
- (!pair  "cpp_options"
-  (!type already_seen 1454)
-  (!srcfileloc  "../libcpp/include/cpplib.h" 31)
-  nil )
- (!pair  "cpp_buffer"
-  (!type already_seen 1455)
-  (!srcfileloc  "../libcpp/include/cpplib.h" 30)
-  nil )
- (!pair  "cpp_reader"
-  (!type already_seen 1456)
-  (!srcfileloc  "../libcpp/include/cpplib.h" 29)
-  nil )
- (!pair  "expanded_location"
-  (!type already_seen 1458)
-  (!srcfileloc  "../libcpp/include/line-map.h" 640)
-  nil )
- (!pair  "line_map_round_alloc_size_func"
-  (!type already_seen 9)
-  (!srcfileloc  "../libcpp/include/line-map.h" 57)
-  nil )
- (!pair  "line_map_realloc"
-  (!type already_seen 9)
-  (!srcfileloc  "../libcpp/include/line-map.h" 53)
-  nil )
- (!pair  "source_location"
-  (!type already_seen 9)
-  (!srcfileloc  "../libcpp/include/line-map.h" 50)
-  nil )
- (!pair  "linenum_type"
-  (!type already_seen 9)
-  (!srcfileloc  "../libcpp/include/line-map.h" 47)
-  nil )
- (!pair  "PTR"
-  (!type already_seen 10)
-  (!srcfileloc  "gengtype.c" 5681)
-  nil )
- (!pair  "void"
-  (!type already_seen 9)
-  (!srcfileloc  "gengtype.c" 5678)
-  nil )
- (!pair  "JCF_u2"
-  (!type already_seen 9)
-  (!srcfileloc  "gengtype.c" 5677)
-  nil )
- (!pair  "jword"
-  (!type already_seen 9)
-  (!srcfileloc  "gengtype.c" 5676)
-  nil )
- (!pair  "uintptr_t"
-  (!type already_seen 9)
-  (!srcfileloc  "gengtype.c" 5675)
-  nil )
- (!pair  "uint8"
-  (!type already_seen 9)
-  (!srcfileloc  "gengtype.c" 5674)
-  nil )
- (!pair  "uint64_t"
-  (!type already_seen 9)
-  (!srcfileloc  "gengtype.c" 5673)
-  nil )
- (!pair  "double_int"
-  (!type already_seen 9)
-  (!srcfileloc  "gengtype.c" 5672)
-  nil )
- (!pair  "FIXED_VALUE_TYPE"
-  (!type already_seen 9)
-  (!srcfileloc  "gengtype.c" 5671)
-  nil )
- (!pair  "REAL_VALUE_TYPE"
-  (!type already_seen 9)
-  (!srcfileloc  "gengtype.c" 5670)
-  nil )
- (!pair  "CUMULATIVE_ARGS"
-  (!type already_seen 9)
-  (!srcfileloc  "gengtype.c" 5669)
-  nil )
-)
-(!param_structs 48
- (!type param_struct 1472 nil  gc_pointed_to
-  (!type already_seen 1324)
-  nil 
-  (!type already_seen 9)
-  
-  (!type already_seen 9)
-  nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1473 nil  gc_pointed_to
-  (!type already_seen 1324)
-  nil 
-  (!type already_seen 36)
-  
-  (!type already_seen 5)
-  nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1474 nil  gc_pointed_to
-  (!type already_seen 1324)
-  nil 
-  (!type already_seen 5)
-  
-  (!type already_seen 5)
-  nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1475 
-  (!type pointer 1476 nil  gc_used
-   (!type already_seen 1475)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 627)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type already_seen 469)
- 
- (!type already_seen 48)
- 
- (!type param_struct 1477 
-  (!type pointer 1478 nil  gc_used
-   (!type already_seen 1477)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 669)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1479 
-  (!type pointer 1480 nil  gc_used
-   (!type already_seen 1479)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 682)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1481 
-  (!type pointer 1482 nil  gc_used
-   (!type already_seen 1481)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 710)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1483 
-  (!type pointer 1484 nil  gc_used
-   (!type already_seen 1483)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 711)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1485 
-  (!type pointer 1486 nil  gc_used
-   (!type already_seen 1485)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 722)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type already_seen 107)
- 
- (!type already_seen 91)
- 
- (!type param_struct 1487 
-  (!type pointer 1488 nil  gc_used
-   (!type already_seen 1487)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 811)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1489 
-  (!type pointer 1490 nil  gc_used
-   (!type already_seen 1489)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 1403)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1491 
-  (!type pointer 1492 nil  gc_used
-   (!type already_seen 1491)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 857)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type already_seen 949)
- 
- (!type param_struct 1493 
-  (!type pointer 1494 nil  gc_used
-   (!type already_seen 1493)
-  )
-  gc_pointed_to
-  (!type already_seen 1321)
-  nil 
-  (!type already_seen 5)
-  
-  (!type already_seen 5)
-  nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1495 
-  (!type pointer 1496 nil  gc_used
-   (!type already_seen 1495)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 1056)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type already_seen 394)
- 
- (!type param_struct 1497 
-  (!type pointer 1498 nil  gc_used
-   (!type already_seen 1497)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 1407)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type already_seen 1372)
- 
- (!type param_struct 1499 
-  (!type pointer 1500 nil  gc_used
-   (!type already_seen 1499)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 1331)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1501 
-  (!type pointer 1502 nil  gc_used
-   (!type already_seen 1501)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 243)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1503 
-  (!type pointer 1504 nil  gc_used
-   (!type already_seen 1503)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 245)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1505 
-  (!type pointer 1506 nil  gc_used
-   (!type already_seen 1505)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 1401)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1507 
-  (!type pointer 1508 nil  gc_used
-   (!type already_seen 1507)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 1399)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1509 
-  (!type pointer 1510 nil  gc_used
-   (!type already_seen 1509)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 1405)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1511 
-  (!type pointer 1512 nil  gc_used
-   (!type already_seen 1511)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 1141)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1513 
-  (!type pointer 1514 nil  gc_used
-   (!type already_seen 1513)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 1204)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type already_seen 368)
- 
- (!type param_struct 1515 
-  (!type pointer 1516 nil  gc_used
-   (!type already_seen 1515)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 269)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1517 
-  (!type pointer 1518 nil  gc_used
-   (!type already_seen 1517)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 136)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1519 
-  (!type pointer 1520 nil  gc_used
-   (!type already_seen 1519)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 418)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1521 
-  (!type pointer 1522 nil  gc_used
-   (!type already_seen 1521)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 1254)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1523 
-  (!type pointer 1524 nil  gc_used
-   (!type already_seen 1523)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 1258)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1525 
-  (!type pointer 1526 nil  gc_used
-   (!type already_seen 1525)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 426)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1527 
-  (!type pointer 1528 nil  gc_used
-   (!type already_seen 1527)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 439)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1529 
-  (!type pointer 1530 nil  gc_used
-   (!type already_seen 1529)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 437)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1531 
-  (!type pointer 1532 nil  gc_used
-   (!type already_seen 1531)
-  )
-  gc_pointed_to
-  (!type already_seen 1321)
-  nil 
-  (!type already_seen 36)
-  
-  (!type already_seen 5)
-  nil nil nil nil nil nil nil nil )
- 
- (!type param_struct 1533 
-  (!type pointer 1534 nil  gc_used
-   (!type already_seen 1533)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 1346)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type already_seen 1320)
- 
- (!type param_struct 1535 
-  (!type pointer 1536 nil  gc_used
-   (!type already_seen 1535)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 938)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type already_seen 920)
- 
- (!type already_seen 400)
- 
- (!type param_struct 1537 
-  (!type pointer 1538 nil  gc_used
-   (!type already_seen 1537)
-  )
-  gc_pointed_to
-  (!type already_seen 49)
-  
-  (!type already_seen 1362)
-  nil nil nil nil nil nil nil nil nil nil )
- 
- (!type already_seen 54)
- 
- (!type already_seen 542)
-)
-(!variables 613
- (!pair  "objc_eh_personality_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 3608)
-  nil )
- (!pair  "next_v2_EHTYPE_id_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 3398)
-  nil )
- (!pair  "next_v2_ehvtable_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 3397)
-  nil )
- (!pair  "objc_v2_ehtype_template"
-  (!type already_seen 5)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 3396)
-  nil )
- (!pair  "ehtype_list"
-  (!type already_seen 623)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 3055)
-  nil )
- (!pair  "ivar_offset_refs"
-  (!type already_seen 2)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 2765)
-  nil )
- (!pair  "protlist"
-  (!type already_seen 617)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 2110)
-  nil )
- (!pair  "nonlazy_category_list"
-  (!type already_seen 45)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 2022)
-  nil )
- (!pair  "category_list"
-  (!type already_seen 45)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 2011)
-  nil )
- (!pair  "nonlazy_class_list"
-  (!type already_seen 45)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 2000)
-  nil )
- (!pair  "class_list"
-  (!type already_seen 45)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1992)
-  nil )
- (!pair  "metaclass_super_refs"
-  (!type already_seen 623)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1436)
-  nil )
- (!pair  "class_super_refs"
-  (!type already_seen 623)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1435)
-  nil )
- (!pair  "protrefs"
-  (!type already_seen 617)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1259)
-  nil )
- (!pair  "msgrefs"
-  (!type already_seen 620)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1205)
-  nil )
- (!pair  "classrefs"
-  (!type already_seen 623)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 1040)
-  nil )
- (!pair  "extern_names"
-  (!type already_seen 635)
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 236)
-  (!options 
-   (!option length string  "SIZEHASHTABLE")
-  )
- )
- (!pair  "objc_v2_global_trees"
-  (!type array 1539 nil  gc_used "OCTI_V2_MAX" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 186)
-  nil )
- (!pair  "objc_rt_trees"
-  (!type array 1540 nil  gc_used "OCTI_RT_META_MAX" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "objc/objc-next-runtime-abi-02.c" 183)
-  nil )
- (!pair  "objc_eh_personality_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "objc/objc-next-runtime-abi-01.c" 2786)
-  nil )
- (!pair  "V1_Property_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "objc/objc-next-runtime-abi-01.c" 1516)
-  nil )
- (!pair  "V1_ProtocolExt_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "objc/objc-next-runtime-abi-01.c" 1515)
-  nil )
- (!pair  "V1_Protocol_OPT_CLS_METHODS_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "objc/objc-next-runtime-abi-01.c" 1514)
-  nil )
- (!pair  "V1_Protocol_OPT_NST_METHODS_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "objc/objc-next-runtime-abi-01.c" 1513)
-  nil )
- (!pair  "objc_class_ext_template"
-  (!type already_seen 5)
-  (!srcfileloc  "objc/objc-next-runtime-abi-01.c" 1108)
-  nil )
- (!pair  "objc_protocol_extension_template"
-  (!type already_seen 5)
-  (!srcfileloc  "objc/objc-next-runtime-abi-01.c" 1074)
-  nil )
- (!pair  "objc_v1_property_template"
-  (!type already_seen 5)
-  (!srcfileloc  "objc/objc-next-runtime-abi-01.c" 1044)
-  nil )
- (!pair  "class_reference_idx"
-  (!type already_seen 9)
-  (!srcfileloc  "objc/objc-next-runtime-abi-01.c" 676)
-  nil )
- (!pair  "objc_rt_trees"
-  (!type array 1541 nil  gc_used "OCTI_RT_META_MAX" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "objc/objc-next-runtime-abi-01.c" 107)
-  nil )
- (!pair  "objc_eh_personality_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "objc/objc-gnu-runtime-abi-01.c" 2137)
-  nil )
- (!pair  "num_static_inst"
-  (!type already_seen 9)
-  (!srcfileloc  "objc/objc-gnu-runtime-abi-01.c" 858)
-  nil )
- (!pair  "meta_base"
-  (!type already_seen 5)
-  (!srcfileloc  "objc/objc-gnu-runtime-abi-01.c" 191)
-  nil )
- (!pair  "objc_meta"
-  (!type already_seen 5)
-  (!srcfileloc  "objc/objc-gnu-runtime-abi-01.c" 190)
-  nil )
- (!pair  "property_name_attr_idx"
-  (!type already_seen 9)
-  (!srcfileloc  "objc/objc-runtime-shared-support.c" 294)
-  nil )
- (!pair  "meth_var_types_idx"
-  (!type already_seen 9)
-  (!srcfileloc  "objc/objc-runtime-shared-support.c" 293)
-  nil )
- (!pair  "meth_var_names_idx"
-  (!type already_seen 9)
-  (!srcfileloc  "objc/objc-runtime-shared-support.c" 292)
-  nil )
- (!pair  "objc_rt_trees"
-  (!type array 1542 nil  gc_used "OCTI_RT_META_MAX" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "objc/objc-runtime-shared-support.c" 56)
-  nil )
- (!pair  "objc_parmlist"
-  (!type already_seen 5)
-  (!srcfileloc  "objc/objc-act.c" 8221)
-  nil )
- (!pair  "interface_map"
-  (!type already_seen 637)
-  (!srcfileloc  "objc/objc-act.c" 3759)
-  nil )
- (!pair  "string_layout_checked"
-  (!type already_seen 9)
-  (!srcfileloc  "objc/objc-act.c" 3044)
-  nil )
- (!pair  "string_htab"
-  (!type already_seen 1476)
-  (!srcfileloc  "objc/objc-act.c" 263)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 626)
-   )
-  )
- )
- (!pair  "alias_name_map"
-  (!type already_seen 637)
-  (!srcfileloc  "objc/objc-act.c" 173)
-  nil )
- (!pair  "class_name_map"
-  (!type already_seen 637)
-  (!srcfileloc  "objc/objc-act.c" 172)
-  nil )
- (!pair  "class_method_map"
-  (!type already_seen 637)
-  (!srcfileloc  "objc/objc-act.c" 168)
-  nil )
- (!pair  "instance_method_map"
-  (!type already_seen 637)
-  (!srcfileloc  "objc/objc-act.c" 167)
-  nil )
- (!pair  "objc_global_trees"
-  (!type array 1543 nil  gc_used "OCTI_MAX" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "objc/objc-act.h" 399)
-  nil )
- (!pair  "objc_ivar_visibility"
-  (!type already_seen 9)
-  (!srcfileloc  "objc/objc-act.h" 273)
-  nil )
- (!pair  "cat_count"
-  (!type already_seen 9)
-  (!srcfileloc  "objc/objc-act.h" 271)
-  nil )
- (!pair  "imp_count"
-  (!type already_seen 9)
-  (!srcfileloc  "objc/objc-act.h" 270)
-  nil )
- (!pair  "imp_list"
-  (!type already_seen 630)
-  (!srcfileloc  "objc/objc-act.h" 269)
-  nil )
- (!pair  "local_variables_to_volatilize"
-  (!type already_seen 45)
-  (!srcfileloc  "objc/objc-act.h" 256)
-  nil )
- (!pair  "lto_eh_personality_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "lto/lto.c" 3321)
-  nil )
- (!pair  "real_file_decl_data"
-  (!type already_seen 946)
-  (!srcfileloc  "lto/lto.c" 2880)
-  (!options 
-   (!option length string  "real_file_count + 1")
-  )
- )
- (!pair  "all_file_decl_data"
-  (!type already_seen 946)
-  (!srcfileloc  "lto/lto.c" 2848)
-  (!options 
-   (!option length string  "lto_stats.num_input_files + 1")
-  )
- )
- (!pair  "tree_with_vars"
-  (!type already_seen 45)
-  (!srcfileloc  "lto/lto.c" 697)
-  nil )
- (!pair  "first_personality_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "lto/lto.c" 57)
-  nil )
- (!pair  "registered_builtin_types"
-  (!type already_seen 5)
-  (!srcfileloc  "lto/lto-lang.c" 693)
-  nil )
- (!pair  "signed_size_type_node"
-  (!type already_seen 5)
-  (!srcfileloc  "lto/lto-lang.c" 190)
-  nil )
- (!pair  "uintmax_type_node"
-  (!type already_seen 5)
-  (!srcfileloc  "lto/lto-lang.c" 189)
-  nil )
- (!pair  "intmax_type_node"
-  (!type already_seen 5)
-  (!srcfileloc  "lto/lto-lang.c" 188)
-  nil )
- (!pair  "wint_type_node"
-  (!type already_seen 5)
-  (!srcfileloc  "lto/lto-lang.c" 187)
-  nil )
- (!pair  "const_string_type_node"
-  (!type already_seen 5)
-  (!srcfileloc  "lto/lto-lang.c" 186)
-  nil )
- (!pair  "string_type_node"
-  (!type already_seen 5)
-  (!srcfileloc  "lto/lto-lang.c" 185)
-  nil )
- (!pair  "builtin_types"
-  (!type array 1544 nil  gc_used "(int) BT_LAST + 1" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "lto/lto-lang.c" 183)
-  nil )
- (!pair  "built_in_attributes"
-  (!type array 1545 nil  gc_used "(int) ATTR_LAST" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "lto/lto-lang.c" 136)
-  nil )
- (!pair  "resources"
-  (!type already_seen 45)
-  (!srcfileloc  "java/resource.c" 41)
-  nil )
- (!pair  "compression_table"
-  (!type already_seen 5)
-  (!srcfileloc  "java/mangle.c" 298)
-  nil )
- (!pair  "atms"
-  (!type already_seen 5)
-  (!srcfileloc  "java/mangle.c" 72)
-  nil )
- (!pair  "java_eh_personality_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "java/lang.c" 915)
-  nil )
- (!pair  "last_error_function"
-  (!type already_seen 5)
-  (!srcfileloc  "java/lang.c" 483)
-  nil )
- (!pair  "last_error_function_context"
-  (!type already_seen 5)
-  (!srcfileloc  "java/lang.c" 482)
-  nil )
- (!pair  "all_class_list"
-  (!type already_seen 45)
-  (!srcfileloc  "java/jcf-parse.c" 88)
-  nil )
- (!pair  "main_jcf"
-  (!type already_seen 451)
-  (!srcfileloc  "java/jcf-parse.c" 85)
-  nil )
- (!pair  "parse_roots"
-  (!type array 1546 nil  gc_used "2" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "java/jcf-parse.c" 73)
-  nil )
- (!pair  "class_ident"
-  (!type already_seen 5)
-  (!srcfileloc  "java/expr.c" 2360)
-  nil )
- (!pair  "page_size"
-  (!type already_seen 5)
-  (!srcfileloc  "java/expr.c" 130)
-  nil )
- (!pair  "quick_stack"
-  (!type already_seen 45)
-  (!srcfileloc  "java/expr.c" 126)
-  nil )
- (!pair  "ncode_ident"
-  (!type already_seen 5)
-  (!srcfileloc  "java/expr.c" 92)
-  nil )
- (!pair  "methods_ident"
-  (!type already_seen 5)
-  (!srcfileloc  "java/expr.c" 91)
-  nil )
- (!pair  "operand_type"
-  (!type array 1547 nil  gc_used "59" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "java/expr.c" 89)
-  nil )
- (!pair  "global_binding_level"
-  (!type already_seen 80)
-  (!srcfileloc  "java/decl.c" 439)
-  nil )
- (!pair  "free_binding_level"
-  (!type already_seen 80)
-  (!srcfileloc  "java/decl.c" 433)
-  nil )
- (!pair  "current_binding_level"
-  (!type already_seen 80)
-  (!srcfileloc  "java/decl.c" 429)
-  nil )
- (!pair  "pending_local_decls"
-  (!type already_seen 5)
-  (!srcfileloc  "java/decl.c" 118)
-  nil )
- (!pair  "base_decl_map"
-  (!type already_seen 5)
-  (!srcfileloc  "java/decl.c" 110)
-  nil )
- (!pair  "decl_map"
-  (!type already_seen 5)
-  (!srcfileloc  "java/decl.c" 104)
-  nil )
- (!pair  "tag_nodes"
-  (!type array 1548 nil  gc_used "13" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "java/constants.c" 318)
-  nil )
- (!pair  "alias_labelno"
-  (!type already_seen 9)
-  (!srcfileloc  "java/class.c" 1372)
-  nil )
- (!pair  "this_classdollar"
-  (!type already_seen 5)
-  (!srcfileloc  "java/class.c" 106)
-  nil )
- (!pair  "registered_class"
-  (!type already_seen 45)
-  (!srcfileloc  "java/class.c" 102)
-  nil )
- (!pair  "class_roots"
-  (!type array 1549 nil  gc_used "4" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "java/class.c" 96)
-  nil )
- (!pair  "java_builtins"
-  (!type array 1550 nil  gc_used "" 
-   (!type already_seen 646)
-  )
-  (!srcfileloc  "java/builtins.c" 86)
-  nil )
- (!pair  "pending_static_fields"
-  (!type already_seen 45)
-  (!srcfileloc  "java/java-tree.h" 1182)
-  nil )
- (!pair  "soft_resolvepoolentry_node"
-  (!type already_seen 5)
-  (!srcfileloc  "java/java-tree.h" 575)
-  nil )
- (!pair  "java_global_trees"
-  (!type array 1551 nil  gc_used "JTI_MAX" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "java/java-tree.h" 319)
-  nil )
- (!pair  "constants_data_field_decl_node"
-  (!type already_seen 5)
-  (!srcfileloc  "java/java-tree.h" 178)
-  nil )
- (!pair  "constants_field_decl_node"
-  (!type already_seen 5)
-  (!srcfileloc  "java/java-tree.h" 175)
-  nil )
- (!pair  "gcj_abi_version"
-  (!type already_seen 5)
-  (!srcfileloc  "java/java-tree.h" 172)
-  nil )
- (!pair  "java_io_serializable_identifier_node"
-  (!type already_seen 5)
-  (!srcfileloc  "java/java-tree.h" 171)
-  nil )
- (!pair  "java_lang_cloneable_identifier_node"
-  (!type already_seen 5)
-  (!srcfileloc  "java/java-tree.h" 170)
-  nil )
- (!pair  "current_jcf"
-  (!type already_seen 451)
-  (!srcfileloc  "java/java-tree.h" 121)
-  nil )
- (!pair  "go_non_zero_struct"
-  (!type already_seen 5)
-  (!srcfileloc  "go/go-c.h" 64)
-  nil )
- (!pair  "go_gc_root"
-  (!type already_seen 5)
-  (!srcfileloc  "go/go-lang.c" 445)
-  nil )
- (!pair  "gfc_rank_cst"
-  (!type array 1552 nil  gc_used "GFC_MAX_DIMENSIONS + 1" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "fortran/trans-const.h" 60)
-  nil )
- (!pair  "gfor_fndecl_sr_kind"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 778)
-  nil )
- (!pair  "gfor_fndecl_si_kind"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 777)
-  nil )
- (!pair  "gfor_fndecl_sc_kind"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 776)
-  nil )
- (!pair  "gfor_fndecl_iargc"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 773)
-  nil )
- (!pair  "gfor_fndecl_size1"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 772)
-  nil )
- (!pair  "gfor_fndecl_size0"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 771)
-  nil )
- (!pair  "gfor_fndecl_convert_char4_to_char1"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 768)
-  nil )
- (!pair  "gfor_fndecl_convert_char1_to_char4"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 767)
-  nil )
- (!pair  "gfor_fndecl_select_string_char4"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 764)
-  nil )
- (!pair  "gfor_fndecl_adjustr_char4"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 763)
-  nil )
- (!pair  "gfor_fndecl_adjustl_char4"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 762)
-  nil )
- (!pair  "gfor_fndecl_string_minmax_char4"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 761)
-  nil )
- (!pair  "gfor_fndecl_string_trim_char4"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 760)
-  nil )
- (!pair  "gfor_fndecl_string_verify_char4"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 759)
-  nil )
- (!pair  "gfor_fndecl_string_scan_char4"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 758)
-  nil )
- (!pair  "gfor_fndecl_string_index_char4"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 757)
-  nil )
- (!pair  "gfor_fndecl_string_len_trim_char4"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 756)
-  nil )
- (!pair  "gfor_fndecl_concat_string_char4"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 755)
-  nil )
- (!pair  "gfor_fndecl_compare_string_char4"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 754)
-  nil )
- (!pair  "gfor_fndecl_select_string"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 753)
-  nil )
- (!pair  "gfor_fndecl_adjustr"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 752)
-  nil )
- (!pair  "gfor_fndecl_adjustl"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 751)
-  nil )
- (!pair  "gfor_fndecl_string_minmax"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 750)
-  nil )
- (!pair  "gfor_fndecl_string_trim"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 749)
-  nil )
- (!pair  "gfor_fndecl_string_verify"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 748)
-  nil )
- (!pair  "gfor_fndecl_string_scan"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 747)
-  nil )
- (!pair  "gfor_fndecl_string_index"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 746)
-  nil )
- (!pair  "gfor_fndecl_string_len_trim"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 745)
-  nil )
- (!pair  "gfor_fndecl_concat_string"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 744)
-  nil )
- (!pair  "gfor_fndecl_compare_string"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 743)
-  nil )
- (!pair  "gfor_fndecl_zgemm"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 740)
-  nil )
- (!pair  "gfor_fndecl_cgemm"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 739)
-  nil )
- (!pair  "gfor_fndecl_dgemm"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 738)
-  nil )
- (!pair  "gfor_fndecl_sgemm"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 737)
-  nil )
- (!pair  "gfor_fndecl_math_ishftc16"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 734)
-  nil )
- (!pair  "gfor_fndecl_math_ishftc8"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 733)
-  nil )
- (!pair  "gfor_fndecl_math_ishftc4"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 732)
-  nil )
- (!pair  "gfor_fndecl_math_powi"
-  (!type array 1553 nil  gc_used "4" 
-   (!type array 1554 nil  gc_used "3" 
-    (!type already_seen 653)
-   )
-  )
-  (!srcfileloc  "fortran/trans.h" 731)
-  nil )
- (!pair  "gfort_gvar_caf_this_image"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 718)
-  nil )
- (!pair  "gfort_gvar_caf_num_images"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 717)
-  nil )
- (!pair  "gfor_fndecl_caf_error_stop_str"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 714)
-  nil )
- (!pair  "gfor_fndecl_caf_error_stop"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 713)
-  nil )
- (!pair  "gfor_fndecl_caf_sync_images"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 712)
-  nil )
- (!pair  "gfor_fndecl_caf_sync_all"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 711)
-  nil )
- (!pair  "gfor_fndecl_caf_end_critical"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 710)
-  nil )
- (!pair  "gfor_fndecl_caf_critical"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 709)
-  nil )
- (!pair  "gfor_fndecl_caf_deregister"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 708)
-  nil )
- (!pair  "gfor_fndecl_caf_register"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 707)
-  nil )
- (!pair  "gfor_fndecl_caf_finalize"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 706)
-  nil )
- (!pair  "gfor_fndecl_caf_init"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 705)
-  nil )
- (!pair  "gfor_fndecl_associated"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 701)
-  nil )
- (!pair  "gfor_fndecl_in_unpack"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 700)
-  nil )
- (!pair  "gfor_fndecl_in_pack"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 699)
-  nil )
- (!pair  "gfor_fndecl_fdate"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 698)
-  nil )
- (!pair  "gfor_fndecl_ctime"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 697)
-  nil )
- (!pair  "gfor_fndecl_ttynam"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 696)
-  nil )
- (!pair  "gfor_fndecl_set_options"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 695)
-  nil )
- (!pair  "gfor_fndecl_set_fpe"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 694)
-  nil )
- (!pair  "gfor_fndecl_generate_error"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 693)
-  nil )
- (!pair  "gfor_fndecl_os_error"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 692)
-  nil )
- (!pair  "gfor_fndecl_runtime_warning_at"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 691)
-  nil )
- (!pair  "gfor_fndecl_runtime_error_at"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 690)
-  nil )
- (!pair  "gfor_fndecl_runtime_error"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 689)
-  nil )
- (!pair  "gfor_fndecl_error_stop_string"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 688)
-  nil )
- (!pair  "gfor_fndecl_error_stop_numeric"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 687)
-  nil )
- (!pair  "gfor_fndecl_stop_string"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 686)
-  nil )
- (!pair  "gfor_fndecl_stop_numeric_f08"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 685)
-  nil )
- (!pair  "gfor_fndecl_stop_numeric"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 684)
-  nil )
- (!pair  "gfor_fndecl_pause_string"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 683)
-  nil )
- (!pair  "gfor_fndecl_pause_numeric"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 682)
-  nil )
- (!pair  "gfc_static_ctors"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans.h" 585)
-  nil )
- (!pair  "gfc_charlen_type_node"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans-types.h" 40)
-  nil )
- (!pair  "complex_float128_type_node"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans-types.h" 34)
-  nil )
- (!pair  "float128_type_node"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans-types.h" 33)
-  nil )
- (!pair  "pchar_type_node"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans-types.h" 32)
-  nil )
- (!pair  "prvoid_type_node"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans-types.h" 31)
-  nil )
- (!pair  "pvoid_type_node"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans-types.h" 30)
-  nil )
- (!pair  "ppvoid_type_node"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans-types.h" 29)
-  nil )
- (!pair  "gfc_character1_type_node"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans-types.h" 28)
-  nil )
- (!pair  "gfc_array_range_type"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans-types.h" 27)
-  nil )
- (!pair  "gfc_array_index_type"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans-types.h" 26)
-  nil )
- (!pair  "gfc_pcharacter_types"
-  (!type array 1555 nil  gc_used "MAX_CHARACTER_KINDS + 1" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "fortran/trans-types.c" 103)
-  nil )
- (!pair  "gfc_character_types"
-  (!type array 1556 nil  gc_used "MAX_CHARACTER_KINDS + 1" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "fortran/trans-types.c" 102)
-  nil )
- (!pair  "gfc_complex_types"
-  (!type array 1557 nil  gc_used "MAX_REAL_KINDS + 1" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "fortran/trans-types.c" 98)
-  nil )
- (!pair  "gfc_real_types"
-  (!type array 1558 nil  gc_used "MAX_REAL_KINDS + 1" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "fortran/trans-types.c" 97)
-  nil )
- (!pair  "gfc_logical_types"
-  (!type array 1559 nil  gc_used "MAX_INT_KINDS + 1" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "fortran/trans-types.c" 93)
-  nil )
- (!pair  "gfc_integer_types"
-  (!type array 1560 nil  gc_used "MAX_INT_KINDS + 1" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "fortran/trans-types.c" 92)
-  nil )
- (!pair  "gfc_array_descriptor_base_caf"
-  (!type array 1561 nil  gc_used "2 * (GFC_MAX_DIMENSIONS+1)" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "fortran/trans-types.c" 84)
-  nil )
- (!pair  "gfc_array_descriptor_base"
-  (!type array 1562 nil  gc_used "2 * (GFC_MAX_DIMENSIONS+1)" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "fortran/trans-types.c" 83)
-  nil )
- (!pair  "gfc_max_array_element_size"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans-types.c" 82)
-  nil )
- (!pair  "gfc_desc_dim_type"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans-types.c" 81)
-  nil )
- (!pair  "select_struct"
-  (!type array 1563 nil  gc_used "2" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "fortran/trans-stmt.c" 2130)
-  nil )
- (!pair  "dt_parm"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans-io.c" 160)
-  nil )
- (!pair  "iocall"
-  (!type array 1564 nil  gc_used "IOCALL_NUM" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "fortran/trans-io.c" 151)
-  nil )
- (!pair  "st_parameter_field"
-  (!type array 1565 nil  gc_used "" 
-   (!type already_seen 666)
-  )
-  (!srcfileloc  "fortran/trans-io.c" 101)
-  nil )
- (!pair  "st_parameter"
-  (!type array 1566 nil  gc_used "" 
-   (!type already_seen 665)
-  )
-  (!srcfileloc  "fortran/trans-io.c" 90)
-  nil )
- (!pair  "gfc_intrinsic_map"
-  (!type array 1567 nil  gc_used "" 
-   (!type already_seen 667)
-  )
-  (!srcfileloc  "fortran/trans-intrinsic.c" 116)
-  nil )
- (!pair  "module_htab"
-  (!type already_seen 1478)
-  (!srcfileloc  "fortran/trans-decl.c" 4112)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 668)
-   )
-  )
- )
- (!pair  "saved_local_decls"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans-decl.c" 71)
-  nil )
- (!pair  "nonlocal_dummy_decls"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans-decl.c" 67)
-  nil )
- (!pair  "saved_parent_function_decls"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans-decl.c" 64)
-  nil )
- (!pair  "saved_function_decls"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans-decl.c" 63)
-  nil )
- (!pair  "parent_fake_result_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans-decl.c" 58)
-  nil )
- (!pair  "current_fake_result_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/trans-decl.c" 57)
-  nil )
- (!pair  "global_binding_level"
-  (!type already_seen 80)
-  (!srcfileloc  "fortran/f95-lang.c" 325)
-  nil )
- (!pair  "current_binding_level"
-  (!type already_seen 80)
-  (!srcfileloc  "fortran/f95-lang.c" 321)
-  nil )
- (!pair  "current_translation_unit"
-  (!type already_seen 5)
-  (!srcfileloc  "fortran/f95-lang.c" 186)
-  nil )
- (!pair  "free_binding_level"
-  (!type already_seen 80)
-  (!srcfileloc  "fortran/f95-lang.c" 180)
-  nil )
- (!pair  "vlt_register_set_fndecl"
-  (!type already_seen 5)
-  (!srcfileloc  "cp/vtable-class-hierarchy.c" 133)
-  nil )
- (!pair  "vlt_register_pairs_fndecl"
-  (!type already_seen 5)
-  (!srcfileloc  "cp/vtable-class-hierarchy.c" 132)
-  nil )
- (!pair  "vlt_saved_class_info"
-  (!type already_seen 45)
-  (!srcfileloc  "cp/vtable-class-hierarchy.c" 131)
-  nil )
- (!pair  "pending_noexcept_checks"
-  (!type already_seen 673)
-  (!srcfileloc  "cp/except.c" 1185)
-  nil )
- (!pair  "cp_eh_personality_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "cp/cp-lang.c" 137)
-  nil )
- (!pair  "shadowed_var_for_decl"
-  (!type already_seen 1510)
-  (!srcfileloc  "cp/cp-objcp-common.c" 186)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 1404)
-   )
-   (!option if_marked string  "tree_decl_map_marked_p")
-  )
- )
- (!pair  "abort_fndecl_addr"
-  (!type already_seen 5)
-  (!srcfileloc  "cp/class.c" 8857)
-  nil )
- (!pair  "sizeof_biggest_empty_class"
-  (!type already_seen 5)
-  (!srcfileloc  "cp/class.c" 112)
-  nil )
- (!pair  "abstract_pending_vars"
-  (!type already_seen 1480)
-  (!srcfileloc  "cp/typeck2.c" 187)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 681)
-   )
-  )
- )
- (!pair  "thunk_labelno"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/method.c" 206)
-  nil )
- (!pair  "generic_parm_count"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/parser.c" 31989)
-  nil )
- (!pair  "the_parser"
-  (!type already_seen 690)
-  (!srcfileloc  "cp/parser.c" 31412)
-  nil )
- (!pair  "lambda_scope_stack"
-  (!type already_seen 685)
-  (!srcfileloc  "cp/parser.c" 8652)
-  nil )
- (!pair  "lambda_count"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/parser.c" 8646)
-  nil )
- (!pair  "lambda_scope"
-  (!type already_seen 5)
-  (!srcfileloc  "cp/parser.c" 8645)
-  nil )
- (!pair  "cp_parser_context_free_list"
-  (!type already_seen 696)
-  (!srcfileloc  "cp/parser.c" 1762)
-  (!options 
-   (!option deletable string  "")
-  )
- )
- (!pair  "list_hash_table"
-  (!type already_seen 53)
-  (!srcfileloc  "cp/tree.c" 1609)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 7)
-   )
-  )
- )
- (!pair  "cplus_array_htab"
-  (!type already_seen 53)
-  (!srcfileloc  "cp/tree.c" 757)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 7)
-   )
-  )
- )
- (!pair  "constexpr_call_table"
-  (!type already_seen 1482)
-  (!srcfileloc  "cp/semantics.c" 8088)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 709)
-   )
-  )
- )
- (!pair  "constexpr_fundef_table"
-  (!type already_seen 1484)
-  (!srcfileloc  "cp/semantics.c" 7405)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 712)
-   )
-  )
- )
- (!pair  "deferred_access_no_check"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/semantics.c" 144)
-  nil )
- (!pair  "deferred_access_stack"
-  (!type already_seen 715)
-  (!srcfileloc  "cp/semantics.c" 143)
-  nil )
- (!pair  "pending_repo"
-  (!type already_seen 45)
-  (!srcfileloc  "cp/repo.c" 46)
-  nil )
- (!pair  "last_error_tinst_level"
-  (!type already_seen 725)
-  (!srcfileloc  "cp/pt.c" 8235)
-  nil )
- (!pair  "canonical_template_parms"
-  (!type already_seen 45)
-  (!srcfileloc  "cp/pt.c" 101)
-  nil )
- (!pair  "type_specializations"
-  (!type already_seen 1486)
-  (!srcfileloc  "cp/pt.c" 95)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 721)
-   )
-  )
- )
- (!pair  "decl_specializations"
-  (!type already_seen 1486)
-  (!srcfileloc  "cp/pt.c" 92)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 721)
-   )
-  )
- )
- (!pair  "saved_access_scope"
-  (!type already_seen 5)
-  (!srcfileloc  "cp/pt.c" 74)
-  nil )
- (!pair  "current_tinst_level"
-  (!type already_seen 725)
-  (!srcfileloc  "cp/pt.c" 72)
-  nil )
- (!pair  "saved_trees"
-  (!type already_seen 5)
-  (!srcfileloc  "cp/pt.c" 69)
-  nil )
- (!pair  "last_pending_template"
-  (!type already_seen 724)
-  (!srcfileloc  "cp/pt.c" 64)
-  nil )
- (!pair  "pending_templates"
-  (!type already_seen 724)
-  (!srcfileloc  "cp/pt.c" 63)
-  nil )
- (!pair  "ssdf_decls"
-  (!type already_seen 45)
-  (!srcfileloc  "cp/decl2.c" 3312)
-  nil )
- (!pair  "ssdf_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "cp/decl2.c" 3308)
-  nil )
- (!pair  "priority_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "cp/decl2.c" 3305)
-  nil )
- (!pair  "initialize_p_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "cp/decl2.c" 3302)
-  nil )
- (!pair  "no_linkage_decls"
-  (!type already_seen 45)
-  (!srcfileloc  "cp/decl2.c" 104)
-  nil )
- (!pair  "deferred_fns"
-  (!type already_seen 45)
-  (!srcfileloc  "cp/decl2.c" 100)
-  nil )
- (!pair  "pending_statics"
-  (!type already_seen 45)
-  (!srcfileloc  "cp/decl2.c" 96)
-  nil )
- (!pair  "start_cleanup_cnt"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/decl.c" 6746)
-  nil )
- (!pair  "typename_htab"
-  (!type already_seen 53)
-  (!srcfileloc  "cp/decl.c" 3249)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 7)
-   )
-  )
- )
- (!pair  "incomplete_vars"
-  (!type already_seen 734)
-  (!srcfileloc  "cp/decl.c" 267)
-  nil )
- (!pair  "java_iface_lookup_fn"
-  (!type already_seen 5)
-  (!srcfileloc  "cp/call.c" 7346)
-  nil )
- (!pair  "default_arg_context"
-  (!type already_seen 45)
-  (!srcfileloc  "cp/call.c" 6510)
-  nil )
- (!pair  "unemitted_tinfo_decls"
-  (!type already_seen 45)
-  (!srcfileloc  "cp/cp-tree.h" 5631)
-  nil )
- (!pair  "deferred_mark_used_calls"
-  (!type already_seen 45)
-  (!srcfileloc  "cp/cp-tree.h" 5301)
-  nil )
- (!pair  "assignment_operator_name_info"
-  (!type array 1568 nil  gc_used "(int) MAX_TREE_CODES" 
-   (!type already_seen 745)
-  )
-  (!srcfileloc  "cp/cp-tree.h" 4751)
-  nil )
- (!pair  "operator_name_info"
-  (!type array 1569 nil  gc_used "(int) MAX_TREE_CODES" 
-   (!type already_seen 745)
-  )
-  (!srcfileloc  "cp/cp-tree.h" 4748)
-  nil )
- (!pair  "tls_aggregates"
-  (!type already_seen 5)
-  (!srcfileloc  "cp/cp-tree.h" 4493)
-  nil )
- (!pair  "static_aggregates"
-  (!type already_seen 5)
-  (!srcfileloc  "cp/cp-tree.h" 4491)
-  nil )
- (!pair  "local_classes"
-  (!type already_seen 45)
-  (!srcfileloc  "cp/cp-tree.h" 4393)
-  nil )
- (!pair  "integer_two_node"
-  (!type already_seen 5)
-  (!srcfileloc  "cp/cp-tree.h" 4348)
-  nil )
- (!pair  "scope_chain"
-  (!type already_seen 751)
-  (!srcfileloc  "cp/cp-tree.h" 1114)
-  nil )
- (!pair  "cp_global_trees"
-  (!type array 1570 nil  gc_used "CPTI_MAX" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "cp/cp-tree.h" 904)
-  nil )
- (!pair  "lambda_cnt"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/name-lookup.c" 2088)
-  nil )
- (!pair  "anon_cnt"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/name-lookup.c" 2069)
-  nil )
- (!pair  "free_binding_level"
-  (!type already_seen 94)
-  (!srcfileloc  "cp/name-lookup.c" 1509)
-  (!options 
-   (!option deletable string  "")
-  )
- )
- (!pair  "free_bindings"
-  (!type already_seen 99)
-  (!srcfileloc  "cp/name-lookup.c" 277)
-  (!options 
-   (!option deletable string  "")
-  )
- )
- (!pair  "free_binding_entry"
-  (!type already_seen 489)
-  (!srcfileloc  "cp/name-lookup.c" 93)
-  (!options 
-   (!option deletable string  "")
-  )
- )
- (!pair  "anonymous_namespace_name"
-  (!type already_seen 5)
-  (!srcfileloc  "cp/name-lookup.c" 66)
-  nil )
- (!pair  "global_type_node"
-  (!type already_seen 5)
-  (!srcfileloc  "cp/name-lookup.h" 286)
-  nil )
- (!pair  "global_scope_name"
-  (!type already_seen 5)
-  (!srcfileloc  "cp/name-lookup.h" 281)
-  nil )
- (!pair  "global_namespace"
-  (!type already_seen 5)
-  (!srcfileloc  "cp/name-lookup.h" 280)
-  nil )
- (!pair  "temp_count"
-  (!type already_seen 9)
-  (!srcfileloc  "cp/mangle.c" 3862)
-  nil )
- (!pair  "conv_type_names"
-  (!type already_seen 53)
-  (!srcfileloc  "cp/mangle.c" 3734)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 7)
-   )
-  )
- )
- (!pair  "subst_identifiers"
-  (!type array 1571 nil  gc_used "SUBID_MAX" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "cp/mangle.c" 137)
-  nil )
- (!pair  "G"
-  (!type already_seen 754)
-  (!srcfileloc  "cp/mangle.c" 108)
-  nil )
- (!pair  "tinfo_descs"
-  (!type already_seen 756)
-  (!srcfileloc  "cp/rtti.c" 104)
-  nil )
- (!pair  "current_omp_declare_target_attribute"
-  (!type already_seen 9)
-  (!srcfileloc  "c/c-lang.h" 60)
-  nil )
- (!pair  "the_parser"
-  (!type already_seen 761)
-  (!srcfileloc  "c/c-parser.c" 223)
-  nil )
- (!pair  "options_stack"
-  (!type already_seen 770)
-  (!srcfileloc  "c-family/c-pragma.c" 904)
-  nil )
- (!pair  "pending_redefine_extname"
-  (!type already_seen 772)
-  (!srcfileloc  "c-family/c-pragma.c" 433)
-  nil )
- (!pair  "pending_weaks"
-  (!type already_seen 775)
-  (!srcfileloc  "c-family/c-pragma.c" 247)
-  nil )
- (!pair  "alignment_stack"
-  (!type already_seen 778)
-  (!srcfileloc  "c-family/c-pragma.c" 56)
-  nil )
- (!pair  "pragma_extern_prefix"
-  (!type already_seen 5)
-  (!srcfileloc  "c-family/c-pragma.h" 191)
-  nil )
- (!pair  "lazy_hex_fp_value_count"
-  (!type already_seen 9)
-  (!srcfileloc  "c-family/c-cppbuiltin.c" 1132)
-  nil )
- (!pair  "lazy_hex_fp_values"
-  (!type array 1572 nil  gc_used "12" 
-   (!type already_seen 781)
-  )
-  (!srcfileloc  "c-family/c-cppbuiltin.c" 1131)
-  nil )
- (!pair  "pending_lang_change"
-  (!type already_seen 9)
-  (!srcfileloc  "c-family/c-common.h" 944)
-  nil )
- (!pair  "c_global_trees"
-  (!type array 1573 nil  gc_used "CTI_MAX" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "c-family/c-common.h" 439)
-  nil )
- (!pair  "ridpointers"
-  (!type already_seen 6)
-  (!srcfileloc  "c-family/c-common.h" 232)
-  (!options 
-   (!option length string  "(int) RID_MAX")
-  )
- )
- (!pair  "tree_vector_cache"
-  (!type already_seen 789)
-  (!srcfileloc  "c-family/c-common.c" 11546)
-  (!options 
-   (!option deletable string  "")
-  )
- )
- (!pair  "optimize_args"
-  (!type already_seen 792)
-  (!srcfileloc  "c-family/c-common.c" 9011)
-  nil )
- (!pair  "compound_literal_number"
-  (!type already_seen 9)
-  (!srcfileloc  "c-family/c-common.c" 5732)
-  nil )
- (!pair  "built_in_attributes"
-  (!type array 1574 nil  gc_used "(int) ATTR_LAST" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "c-family/c-common.c" 5107)
-  nil )
- (!pair  "type_hash_table"
-  (!type already_seen 53)
-  (!srcfileloc  "c-family/c-common.c" 4811)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 7)
-   )
-  )
- )
- (!pair  "registered_builtin_types"
-  (!type already_seen 5)
-  (!srcfileloc  "c-family/c-common.c" 3472)
-  nil )
- (!pair  "ext_block"
-  (!type already_seen 5)
-  (!srcfileloc  "c/c-decl.c" 10306)
-  nil )
- (!pair  "c_inline_statics"
-  (!type already_seen 799)
-  (!srcfileloc  "c/c-decl.c" 493)
-  nil )
- (!pair  "binding_freelist"
-  (!type already_seen 583)
-  (!srcfileloc  "c/c-decl.c" 445)
-  (!options 
-   (!option deletable string  "")
-  )
- )
- (!pair  "scope_freelist"
-  (!type already_seen 589)
-  (!srcfileloc  "c/c-decl.c" 441)
-  (!options 
-   (!option deletable string  "")
-  )
- )
- (!pair  "external_scope"
-  (!type already_seen 589)
-  (!srcfileloc  "c/c-decl.c" 437)
-  nil )
- (!pair  "file_scope"
-  (!type already_seen 589)
-  (!srcfileloc  "c/c-decl.c" 432)
-  nil )
- (!pair  "current_function_scope"
-  (!type already_seen 589)
-  (!srcfileloc  "c/c-decl.c" 428)
-  nil )
- (!pair  "current_scope"
-  (!type already_seen 589)
-  (!srcfileloc  "c/c-decl.c" 422)
-  nil )
- (!pair  "visible_builtins"
-  (!type already_seen 5)
-  (!srcfileloc  "c/c-decl.c" 126)
-  nil )
- (!pair  "c_stmt_tree"
-  (!type already_seen 88)
-  (!srcfileloc  "c/c-decl.c" 119)
-  nil )
- (!pair  "gnat_eh_personality_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "ada/gcc-interface/misc.c" 834)
-  nil )
- (!pair  "built_in_attributes"
-  (!type array 1575 nil  gc_used "(int) ATTR_LAST" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "ada/gcc-interface/utils.c" 5998)
-  nil )
- (!pair  "builtin_types"
-  (!type array 1576 nil  gc_used "(int) BT_LAST + 1" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "ada/gcc-interface/utils.c" 5858)
-  nil )
- (!pair  "dummy_global"
-  (!type already_seen 5)
-  (!srcfileloc  "ada/gcc-interface/utils.c" 5646)
-  nil )
- (!pair  "pad_type_hash_table"
-  (!type already_seen 1488)
-  (!srcfileloc  "ada/gcc-interface/utils.c" 232)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 810)
-   )
-   (!option if_marked string  "pad_type_hash_marked_p")
-  )
- )
- (!pair  "free_block_chain"
-  (!type already_seen 5)
-  (!srcfileloc  "ada/gcc-interface/utils.c" 217)
-  (!options 
-   (!option deletable string  "")
-  )
- )
- (!pair  "global_renaming_pointers"
-  (!type already_seen 45)
-  (!srcfileloc  "ada/gcc-interface/utils.c" 214)
-  nil )
- (!pair  "builtin_decls"
-  (!type already_seen 45)
-  (!srcfileloc  "ada/gcc-interface/utils.c" 211)
-  nil )
- (!pair  "global_decls"
-  (!type already_seen 45)
-  (!srcfileloc  "ada/gcc-interface/utils.c" 208)
-  nil )
- (!pair  "global_context"
-  (!type already_seen 5)
-  (!srcfileloc  "ada/gcc-interface/utils.c" 205)
-  nil )
- (!pair  "free_binding_level"
-  (!type already_seen 813)
-  (!srcfileloc  "ada/gcc-interface/utils.c" 202)
-  (!options 
-   (!option deletable string  "")
-  )
- )
- (!pair  "current_binding_level"
-  (!type already_seen 813)
-  (!srcfileloc  "ada/gcc-interface/utils.c" 199)
-  nil )
- (!pair  "float_types"
-  (!type array 1577 nil  gc_used "NUM_MACHINE_MODES" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "ada/gcc-interface/utils.c" 183)
-  nil )
- (!pair  "signed_and_unsigned_types"
-  (!type array 1578 nil  gc_used "2 * MAX_BITS_PER_WORD + 1" 
-   (!type array 1579 nil  gc_used "2" 
-    (!type already_seen 5)
-   )
-  )
-  (!srcfileloc  "ada/gcc-interface/utils.c" 180)
-  nil )
- (!pair  "dummy_node_table"
-  (!type already_seen 6)
-  (!srcfileloc  "ada/gcc-interface/utils.c" 163)
-  (!options 
-   (!option length string  "max_gnat_nodes")
-  )
- )
- (!pair  "associate_gnat_to_gnu"
-  (!type already_seen 6)
-  (!srcfileloc  "ada/gcc-interface/utils.c" 151)
-  (!options 
-   (!option length string  "max_gnat_nodes")
-  )
- )
- (!pair  "gnat_vms_condition_handler_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "ada/gcc-interface/trans.c" 2871)
-  nil )
- (!pair  "vms_builtin_establish_handler_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "ada/gcc-interface/trans.c" 2870)
-  nil )
- (!pair  "gnu_program_error_label_stack"
-  (!type already_seen 45)
-  (!srcfileloc  "ada/gcc-interface/trans.c" 229)
-  nil )
- (!pair  "gnu_storage_error_label_stack"
-  (!type already_seen 45)
-  (!srcfileloc  "ada/gcc-interface/trans.c" 228)
-  nil )
- (!pair  "gnu_constraint_error_label_stack"
-  (!type already_seen 45)
-  (!srcfileloc  "ada/gcc-interface/trans.c" 227)
-  nil )
- (!pair  "gnu_loop_stack"
-  (!type already_seen 816)
-  (!srcfileloc  "ada/gcc-interface/trans.c" 224)
-  nil )
- (!pair  "gnu_return_var_stack"
-  (!type already_seen 45)
-  (!srcfileloc  "ada/gcc-interface/trans.c" 200)
-  nil )
- (!pair  "gnu_return_label_stack"
-  (!type already_seen 45)
-  (!srcfileloc  "ada/gcc-interface/trans.c" 196)
-  nil )
- (!pair  "gnu_elab_proc_stack"
-  (!type already_seen 45)
-  (!srcfileloc  "ada/gcc-interface/trans.c" 192)
-  nil )
- (!pair  "gnu_incoming_exc_ptr"
-  (!type already_seen 5)
-  (!srcfileloc  "ada/gcc-interface/trans.c" 189)
-  nil )
- (!pair  "gnu_except_ptr_stack"
-  (!type already_seen 45)
-  (!srcfileloc  "ada/gcc-interface/trans.c" 186)
-  nil )
- (!pair  "elab_info_list"
-  (!type already_seen 824)
-  (!srcfileloc  "ada/gcc-interface/trans.c" 181)
-  nil )
- (!pair  "stmt_group_free_list"
-  (!type already_seen 826)
-  (!srcfileloc  "ada/gcc-interface/trans.c" 168)
-  (!options 
-   (!option deletable string  "")
-  )
- )
- (!pair  "current_stmt_group"
-  (!type already_seen 826)
-  (!srcfileloc  "ada/gcc-interface/trans.c" 165)
-  nil )
- (!pair  "annotate_value_cache"
-  (!type already_seen 1490)
-  (!srcfileloc  "ada/gcc-interface/decl.c" 132)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 1402)
-   )
-   (!option if_marked string  "tree_int_map_marked_p")
-  )
- )
- (!pair  "gnat_raise_decls_ext"
-  (!type array 1580 nil  gc_used "(int) LAST_REASON_CODE + 1" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "ada/gcc-interface/gigi.h" 451)
-  nil )
- (!pair  "gnat_raise_decls"
-  (!type array 1581 nil  gc_used "(int) LAST_REASON_CODE + 1" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "ada/gcc-interface/gigi.h" 450)
-  nil )
- (!pair  "gnat_std_decls"
-  (!type array 1582 nil  gc_used "(int) ADT_LAST" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "ada/gcc-interface/gigi.h" 449)
-  nil )
- (!pair  "odr_types_ptr"
-  (!type already_seen 845)
-  (!srcfileloc  "ipa-devirt.c" 276)
-  nil )
- (!pair  "decl_tree_for_type"
-  (!type already_seen 1492)
-  (!srcfileloc  "ubsan.c" 70)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 856)
-   )
-   (!option if_marked string  "tree_type_map_marked_p")
-  )
- )
- (!pair  "asan_ctor_statements"
-  (!type already_seen 5)
-  (!srcfileloc  "asan.c" 2399)
-  nil )
- (!pair  "asan_detect_stack_use_after_return"
-  (!type already_seen 5)
-  (!srcfileloc  "asan.c" 243)
-  nil )
- (!pair  "shadow_ptr_types"
-  (!type array 1583 nil  gc_used "2" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "asan.c" 240)
-  nil )
- (!pair  "verify_vtbl_ptr_fndecl"
-  (!type already_seen 5)
-  (!srcfileloc  "vtable-verify.c" 160)
-  nil )
- (!pair  "inline_summary_vec"
-  (!type already_seen 874)
-  (!srcfileloc  "ipa-inline.h" 164)
-  nil )
- (!pair  "tm_wrap_map"
-  (!type already_seen 1498)
-  (!srcfileloc  "trans-mem.c" 472)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 1406)
-   )
-   (!option if_marked string  "tree_map_marked_p")
-  )
- )
- (!pair  "ipa_edge_args_vector"
-  (!type already_seen 973)
-  (!srcfileloc  "ipa-prop.h" 511)
-  nil )
- (!pair  "ipa_node_agg_replacements"
-  (!type already_seen 991)
-  (!srcfileloc  "ipa-prop.h" 509)
-  nil )
- (!pair  "ipa_escaped_pt"
-  (!type already_seen 384)
-  (!srcfileloc  "tree-ssa-alias.h" 146)
-  nil )
- (!pair  "free_phinodes"
-  (!type array 1584 nil  gc_used "NUM_BUCKETS - 2" 
-   (!type already_seen 382)
-  )
-  (!srcfileloc  "tree-phinodes.c" 79)
-  (!options 
-   (!option deletable string  "")
-  )
- )
- (!pair  "varying_ssa_edges"
-  (!type already_seen 382)
-  (!srcfileloc  "tree-ssa-propagate.c" 172)
-  nil )
- (!pair  "interesting_ssa_edges"
-  (!type already_seen 382)
-  (!srcfileloc  "tree-ssa-propagate.c" 156)
-  nil )
- (!pair  "clone_fn_id_num"
-  (!type already_seen 9)
-  (!srcfileloc  "cgraphclones.c" 491)
-  nil )
- (!pair  "vtable_entry_type"
-  (!type already_seen 5)
-  (!srcfileloc  "cgraphunit.c" 234)
-  nil )
- (!pair  "asm_last_node"
-  (!type already_seen 1338)
-  (!srcfileloc  "cgraphunit.c" 231)
-  nil )
- (!pair  "order"
-  (!type already_seen 913)
-  (!srcfileloc  "passes.c" 1599)
-  (!options 
-   (!option length string  "nnodes")
-  )
- )
- (!pair  "arm_builtin_decls"
-  (!type array 1585 nil  gc_used "ARM_BUILTIN_MAX" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "config/arm/arm.c" 23256)
-  nil )
- (!pair  "tls_get_addr_libfunc"
-  (!type already_seen 136)
-  (!srcfileloc  "config/arm/arm.c" 7135)
-  nil )
- (!pair  "pic_labelno"
-  (!type already_seen 9)
-  (!srcfileloc  "config/arm/arm.c" 6394)
-  nil )
- (!pair  "va_list_type"
-  (!type already_seen 5)
-  (!srcfileloc  "config/arm/arm.c" 2180)
-  nil )
- (!pair  "stack_chk_fail_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "targhooks.c" 687)
-  nil )
- (!pair  "stack_chk_guard_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "targhooks.c" 654)
-  nil )
- (!pair  "critical_name_mutexes"
-  (!type already_seen 1494)
-  (!srcfileloc  "omp-low.c" 8883)
-  (!options 
-   (!option param2_is type 
-    (!type already_seen 5)
-   )
-   (!option param1_is type 
-    (!type already_seen 5)
-   )
-  )
- )
- (!pair  "parallelized_functions"
-  (!type already_seen 120)
-  (!srcfileloc  "tree-parloops.c" 1424)
-  nil )
- (!pair  "trampoline_type"
-  (!type already_seen 5)
-  (!srcfileloc  "tree-nested.c" 479)
-  nil )
- (!pair  "ptr_void"
-  (!type already_seen 5)
-  (!srcfileloc  "tree-profile.c" 72)
-  nil )
- (!pair  "ic_gcov_type_ptr_var"
-  (!type already_seen 5)
-  (!srcfileloc  "tree-profile.c" 71)
-  nil )
- (!pair  "ic_void_ptr_var"
-  (!type already_seen 5)
-  (!srcfileloc  "tree-profile.c" 70)
-  nil )
- (!pair  "tree_ior_profiler_fn"
-  (!type already_seen 5)
-  (!srcfileloc  "tree-profile.c" 67)
-  nil )
- (!pair  "tree_average_profiler_fn"
-  (!type already_seen 5)
-  (!srcfileloc  "tree-profile.c" 66)
-  nil )
- (!pair  "tree_time_profiler_fn"
-  (!type already_seen 5)
-  (!srcfileloc  "tree-profile.c" 65)
-  nil )
- (!pair  "tree_indirect_call_profiler_fn"
-  (!type already_seen 5)
-  (!srcfileloc  "tree-profile.c" 64)
-  nil )
- (!pair  "tree_one_value_profiler_fn"
-  (!type already_seen 5)
-  (!srcfileloc  "tree-profile.c" 63)
-  nil )
- (!pair  "tree_pow2_profiler_fn"
-  (!type already_seen 5)
-  (!srcfileloc  "tree-profile.c" 62)
-  nil )
- (!pair  "tree_interval_profiler_fn"
-  (!type already_seen 5)
-  (!srcfileloc  "tree-profile.c" 61)
-  nil )
- (!pair  "gcov_type_node"
-  (!type already_seen 5)
-  (!srcfileloc  "tree-profile.c" 60)
-  nil )
- (!pair  "scalar_evolution_info"
-  (!type already_seen 1496)
-  (!srcfileloc  "tree-scalar-evolution.c" 325)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 1055)
-   )
-  )
- )
- (!pair  "chrec_known"
-  (!type already_seen 5)
-  (!srcfileloc  "tree-chrec.h" 30)
-  nil )
- (!pair  "chrec_dont_know"
-  (!type already_seen 5)
-  (!srcfileloc  "tree-chrec.h" 29)
-  nil )
- (!pair  "tmp_var_id_num"
-  (!type already_seen 9)
-  (!srcfileloc  "gimple-expr.c" 442)
-  nil )
- (!pair  "stmt_list_cache"
-  (!type already_seen 45)
-  (!srcfileloc  "tree-iterator.c" 32)
-  (!options 
-   (!option deletable string  "")
-  )
- )
- (!pair  "mem_addr_template_list"
-  (!type already_seen 1072)
-  (!srcfileloc  "tree-ssa-address.c" 98)
-  nil )
- (!pair  "elf_fini_array_section"
-  (!type already_seen 245)
-  (!srcfileloc  "varasm.c" 7538)
-  nil )
- (!pair  "elf_init_array_section"
-  (!type already_seen 245)
-  (!srcfileloc  "varasm.c" 7537)
-  nil )
- (!pair  "tm_clone_hash"
-  (!type already_seen 1498)
-  (!srcfileloc  "varasm.c" 5714)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 1406)
-   )
-   (!option if_marked string  "tree_map_marked_p")
-  )
- )
- (!pair  "weakref_targets"
-  (!type already_seen 5)
-  (!srcfileloc  "varasm.c" 5408)
-  nil )
- (!pair  "const_desc_htab"
-  (!type already_seen 1500)
-  (!srcfileloc  "varasm.c" 2787)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 1330)
-   )
-  )
- )
- (!pair  "initial_trampoline"
-  (!type already_seen 136)
-  (!srcfileloc  "varasm.c" 2498)
-  nil )
- (!pair  "weak_decls"
-  (!type already_seen 5)
-  (!srcfileloc  "varasm.c" 2276)
-  nil )
- (!pair  "pending_assemble_externals"
-  (!type already_seen 5)
-  (!srcfileloc  "varasm.c" 2206)
-  nil )
- (!pair  "shared_constant_pool"
-  (!type already_seen 1369)
-  (!srcfileloc  "varasm.c" 189)
-  nil )
- (!pair  "anchor_labelno"
-  (!type already_seen 9)
-  (!srcfileloc  "varasm.c" 186)
-  nil )
- (!pair  "object_block_htab"
-  (!type already_seen 1502)
-  (!srcfileloc  "varasm.c" 183)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 244)
-   )
-  )
- )
- (!pair  "section_htab"
-  (!type already_seen 1504)
-  (!srcfileloc  "varasm.c" 180)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 246)
-   )
-  )
- )
- (!pair  "unnamed_sections"
-  (!type already_seen 245)
-  (!srcfileloc  "varasm.c" 172)
-  nil )
- (!pair  "const_labelno"
-  (!type already_seen 9)
-  (!srcfileloc  "varasm.c" 79)
-  nil )
- (!pair  "weak_global_object_name"
-  (!type already_seen 36)
-  (!srcfileloc  "varasm.c" 65)
-  nil )
- (!pair  "first_global_object_name"
-  (!type already_seen 36)
-  (!srcfileloc  "varasm.c" 64)
-  nil )
- (!pair  "gcc_eh_personality_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "tree.c" 11751)
-  nil )
- (!pair  "nonstandard_integer_type_cache"
-  (!type array 1586 nil  gc_used "2 * MAX_INT_CACHED_PREC + 2" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "tree.c" 7657)
-  nil )
- (!pair  "init_priority_for_decl"
-  (!type already_seen 1506)
-  (!srcfileloc  "tree.c" 222)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 1400)
-   )
-   (!option if_marked string  "tree_priority_map_marked_p")
-  )
- )
- (!pair  "debug_args_for_decl"
-  (!type already_seen 1508)
-  (!srcfileloc  "tree.c" 218)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 1398)
-   )
-   (!option if_marked string  "tree_vec_map_marked_p")
-  )
- )
- (!pair  "value_expr_for_decl"
-  (!type already_seen 1510)
-  (!srcfileloc  "tree.c" 215)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 1404)
-   )
-   (!option if_marked string  "tree_decl_map_marked_p")
-  )
- )
- (!pair  "debug_expr_for_decl"
-  (!type already_seen 1510)
-  (!srcfileloc  "tree.c" 212)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 1404)
-   )
-   (!option if_marked string  "tree_decl_map_marked_p")
-  )
- )
- (!pair  "cl_option_hash_table"
-  (!type already_seen 53)
-  (!srcfileloc  "tree.c" 206)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 7)
-   )
-   (!option if_marked string  "ggc_marked_p")
-  )
- )
- (!pair  "cl_target_option_node"
-  (!type already_seen 5)
-  (!srcfileloc  "tree.c" 204)
-  nil )
- (!pair  "cl_optimization_node"
-  (!type already_seen 5)
-  (!srcfileloc  "tree.c" 203)
-  nil )
- (!pair  "int_cst_hash_table"
-  (!type already_seen 53)
-  (!srcfileloc  "tree.c" 196)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 7)
-   )
-   (!option if_marked string  "ggc_marked_p")
-  )
- )
- (!pair  "int_cst_node"
-  (!type already_seen 5)
-  (!srcfileloc  "tree.c" 194)
-  nil )
- (!pair  "type_hash_table"
-  (!type already_seen 1512)
-  (!srcfileloc  "tree.c" 191)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 1140)
-   )
-   (!option if_marked string  "type_hash_marked_p")
-  )
- )
- (!pair  "next_debug_decl_uid"
-  (!type already_seen 9)
-  (!srcfileloc  "tree.c" 170)
-  nil )
- (!pair  "next_type_uid"
-  (!type already_seen 9)
-  (!srcfileloc  "tree.c" 167)
-  nil )
- (!pair  "next_decl_uid"
-  (!type already_seen 9)
-  (!srcfileloc  "tree.c" 165)
-  nil )
- (!pair  "spd"
-  (!type already_seen 1143)
-  (!srcfileloc  "stringpool.c" 254)
-  nil )
- (!pair  "size_functions"
-  (!type already_seen 45)
-  (!srcfileloc  "stor-layout.c" 102)
-  nil )
- (!pair  "sdbout_initialized"
-  (!type already_seen 9)
-  (!srcfileloc  "sdbout.c" 68)
-  nil )
- (!pair  "preinit_symbols"
-  (!type already_seen 5)
-  (!srcfileloc  "sdbout.c" 67)
-  nil )
- (!pair  "deferred_global_decls"
-  (!type already_seen 45)
-  (!srcfileloc  "sdbout.c" 61)
-  nil )
- (!pair  "unnamed_struct_number"
-  (!type already_seen 9)
-  (!srcfileloc  "sdbout.c" 57)
-  nil )
- (!pair  "anonymous_types"
-  (!type already_seen 5)
-  (!srcfileloc  "sdbout.c" 53)
-  nil )
- (!pair  "cfg_layout_function_header"
-  (!type already_seen 136)
-  (!srcfileloc  "cfgrtl.c" 68)
-  nil )
- (!pair  "cfg_layout_function_footer"
-  (!type already_seen 136)
-  (!srcfileloc  "cfgrtl.c" 67)
-  nil )
- (!pair  "libfunc_decls"
-  (!type already_seen 53)
-  (!srcfileloc  "optabs.c" 6058)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 7)
-   )
-  )
- )
- (!pair  "unused_expr_list"
-  (!type already_seen 136)
-  (!srcfileloc  "lists.c" 36)
-  (!options 
-   (!option deletable string  "")
-  )
- )
- (!pair  "unused_insn_list"
-  (!type already_seen 136)
-  (!srcfileloc  "lists.c" 33)
-  (!options 
-   (!option deletable string  "")
-  )
- )
- (!pair  "queue"
-  (!type already_seen 45)
-  (!srcfileloc  "godump.c" 59)
-  nil )
- (!pair  "test_insn"
-  (!type already_seen 136)
-  (!srcfileloc  "gcse.c" 833)
-  nil )
- (!pair  "sjlj_fc_type_node"
-  (!type already_seen 5)
-  (!srcfileloc  "except.c" 156)
-  nil )
- (!pair  "type_to_runtime_map"
-  (!type already_seen 53)
-  (!srcfileloc  "except.c" 153)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 7)
-   )
-  )
- )
- (!pair  "call_site_base"
-  (!type already_seen 9)
-  (!srcfileloc  "except.c" 151)
-  nil )
- (!pair  "next_block_index"
-  (!type already_seen 9)
-  (!srcfileloc  "function.c" 4332)
-  nil )
- (!pair  "temp_slot_address_table"
-  (!type already_seen 1514)
-  (!srcfileloc  "function.c" 542)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 1203)
-   )
-  )
- )
- (!pair  "epilogue_insn_hash"
-  (!type already_seen 1518)
-  (!srcfileloc  "function.c" 105)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 138)
-   )
-   (!option if_marked string  "ggc_marked_p")
-  )
- )
- (!pair  "prologue_insn_hash"
-  (!type already_seen 1518)
-  (!srcfileloc  "function.c" 103)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 138)
-   )
-   (!option if_marked string  "ggc_marked_p")
-  )
- )
- (!pair  "funcdef_no"
-  (!type already_seen 9)
-  (!srcfileloc  "function.c" 92)
-  nil )
- (!pair  "block_clear_fn"
-  (!type already_seen 5)
-  (!srcfileloc  "expr.h" 299)
-  nil )
- (!pair  "block_move_fn"
-  (!type already_seen 5)
-  (!srcfileloc  "expr.c" 1443)
-  nil )
- (!pair  "stack_check_libfunc"
-  (!type already_seen 136)
-  (!srcfileloc  "explow.c" 1525)
-  nil )
- (!pair  "hard_reg_clobbers"
-  (!type array 1587 nil  gc_used "NUM_MACHINE_MODES" 
-   (!type array 1588 nil  gc_used "FIRST_PSEUDO_REGISTER" 
-    (!type already_seen 136)
-   )
-  )
-  (!srcfileloc  "emit-rtl.c" 5949)
-  (!options 
-   (!option deletable string  "")
-  )
- )
- (!pair  "free_sequence_stack"
-  (!type already_seen 1366)
-  (!srcfileloc  "emit-rtl.c" 5097)
-  (!options 
-   (!option deletable string  "")
-  )
- )
- (!pair  "spill_slot_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "emit-rtl.c" 2288)
-  nil )
- (!pair  "const_fixed_htab"
-  (!type already_seen 1518)
-  (!srcfileloc  "emit-rtl.c" 139)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 138)
-   )
-   (!option if_marked string  "ggc_marked_p")
-  )
- )
- (!pair  "const_double_htab"
-  (!type already_seen 1518)
-  (!srcfileloc  "emit-rtl.c" 135)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 138)
-   )
-   (!option if_marked string  "ggc_marked_p")
-  )
- )
- (!pair  "reg_attrs_htab"
-  (!type already_seen 1516)
-  (!srcfileloc  "emit-rtl.c" 131)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 270)
-   )
-   (!option if_marked string  "ggc_marked_p")
-  )
- )
- (!pair  "const_int_htab"
-  (!type already_seen 1518)
-  (!srcfileloc  "emit-rtl.c" 127)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 138)
-   )
-   (!option if_marked string  "ggc_marked_p")
-  )
- )
- (!pair  "label_num"
-  (!type already_seen 9)
-  (!srcfileloc  "emit-rtl.c" 89)
-  nil )
- (!pair  "shift_test"
-  (!type already_seen 136)
-  (!srcfileloc  "dojump.c" 159)
-  nil )
- (!pair  "and_test"
-  (!type already_seen 136)
-  (!srcfileloc  "dojump.c" 158)
-  nil )
- (!pair  "and_reg"
-  (!type already_seen 136)
-  (!srcfileloc  "dojump.c" 157)
-  nil )
- (!pair  "vector_last_nunits"
-  (!type already_seen 9)
-  (!srcfileloc  "tree-vect-generic.c" 89)
-  nil )
- (!pair  "vector_last_type"
-  (!type already_seen 5)
-  (!srcfileloc  "tree-vect-generic.c" 88)
-  nil )
- (!pair  "vector_inner_type"
-  (!type already_seen 5)
-  (!srcfileloc  "tree-vect-generic.c" 87)
-  nil )
- (!pair  "addr_index_table"
-  (!type already_seen 1520)
-  (!srcfileloc  "dwarf2out.c" 4124)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 419)
-   )
-  )
- )
- (!pair  "generic_type_instances"
-  (!type already_seen 45)
-  (!srcfileloc  "dwarf2out.c" 2926)
-  nil )
- (!pair  "tmpl_value_parm_die_table"
-  (!type already_seen 1236)
-  (!srcfileloc  "dwarf2out.c" 2920)
-  nil )
- (!pair  "file_table_last_lookup"
-  (!type already_seen 439)
-  (!srcfileloc  "dwarf2out.c" 2918)
-  nil )
- (!pair  "label_num"
-  (!type already_seen 9)
-  (!srcfileloc  "dwarf2out.c" 2915)
-  nil )
- (!pair  "last_emitted_file"
-  (!type already_seen 439)
-  (!srcfileloc  "dwarf2out.c" 2912)
-  nil )
- (!pair  "poc_label_num"
-  (!type already_seen 9)
-  (!srcfileloc  "dwarf2out.c" 2906)
-  nil )
- (!pair  "loclabel_num"
-  (!type already_seen 9)
-  (!srcfileloc  "dwarf2out.c" 2903)
-  nil )
- (!pair  "have_location_lists"
-  (!type already_seen 9)
-  (!srcfileloc  "dwarf2out.c" 2900)
-  nil )
- (!pair  "ranges_by_label_in_use"
-  (!type already_seen 9)
-  (!srcfileloc  "dwarf2out.c" 2893)
-  nil )
- (!pair  "ranges_by_label_allocated"
-  (!type already_seen 9)
-  (!srcfileloc  "dwarf2out.c" 2890)
-  nil )
- (!pair  "ranges_by_label"
-  (!type already_seen 1265)
-  (!srcfileloc  "dwarf2out.c" 2887)
-  (!options 
-   (!option length string  "ranges_by_label_allocated")
-  )
- )
- (!pair  "ranges_table_in_use"
-  (!type already_seen 9)
-  (!srcfileloc  "dwarf2out.c" 2883)
-  nil )
- (!pair  "ranges_table_allocated"
-  (!type already_seen 9)
-  (!srcfileloc  "dwarf2out.c" 2880)
-  nil )
- (!pair  "ranges_table"
-  (!type already_seen 1267)
-  (!srcfileloc  "dwarf2out.c" 2877)
-  (!options 
-   (!option length string  "ranges_table_allocated")
-  )
- )
- (!pair  "macinfo_table"
-  (!type already_seen 1239)
-  (!srcfileloc  "dwarf2out.c" 2868)
-  nil )
- (!pair  "pubtype_table"
-  (!type already_seen 1242)
-  (!srcfileloc  "dwarf2out.c" 2864)
-  nil )
- (!pair  "pubname_table"
-  (!type already_seen 1242)
-  (!srcfileloc  "dwarf2out.c" 2860)
-  nil )
- (!pair  "separate_line_info"
-  (!type already_seen 1246)
-  (!srcfileloc  "dwarf2out.c" 2852)
-  nil )
- (!pair  "cold_text_section_line_info"
-  (!type already_seen 1247)
-  (!srcfileloc  "dwarf2out.c" 2849)
-  nil )
- (!pair  "text_section_line_info"
-  (!type already_seen 1247)
-  (!srcfileloc  "dwarf2out.c" 2848)
-  nil )
- (!pair  "abbrev_die_table_in_use"
-  (!type already_seen 9)
-  (!srcfileloc  "dwarf2out.c" 2833)
-  nil )
- (!pair  "abbrev_die_table_allocated"
-  (!type already_seen 9)
-  (!srcfileloc  "dwarf2out.c" 2830)
-  nil )
- (!pair  "abbrev_die_table"
-  (!type already_seen 427)
-  (!srcfileloc  "dwarf2out.c" 2827)
-  (!options 
-   (!option length string  "abbrev_die_table_allocated")
-  )
- )
- (!pair  "cached_dw_loc_list_table"
-  (!type already_seen 1522)
-  (!srcfileloc  "dwarf2out.c" 2821)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 1253)
-   )
-  )
- )
- (!pair  "call_arg_locations"
-  (!type already_seen 1256)
-  (!srcfileloc  "dwarf2out.c" 2798)
-  nil )
- (!pair  "decl_loc_table"
-  (!type already_seen 1524)
-  (!srcfileloc  "dwarf2out.c" 2795)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 1257)
-   )
-  )
- )
- (!pair  "common_block_die_table"
-  (!type already_seen 1526)
-  (!srcfileloc  "dwarf2out.c" 2738)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 428)
-   )
-  )
- )
- (!pair  "decl_die_table"
-  (!type already_seen 1526)
-  (!srcfileloc  "dwarf2out.c" 2734)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 428)
-   )
-  )
- )
- (!pair  "file_table"
-  (!type already_seen 1528)
-  (!srcfileloc  "dwarf2out.c" 2730)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 440)
-   )
-  )
- )
- (!pair  "deferred_asm_name"
-  (!type already_seen 1263)
-  (!srcfileloc  "dwarf2out.c" 2727)
-  nil )
- (!pair  "limbo_die_list"
-  (!type already_seen 1263)
-  (!srcfileloc  "dwarf2out.c" 2723)
-  nil )
- (!pair  "comdat_type_list"
-  (!type already_seen 430)
-  (!srcfileloc  "dwarf2out.c" 2720)
-  nil )
- (!pair  "single_comp_unit_die"
-  (!type already_seen 426)
-  (!srcfileloc  "dwarf2out.c" 2717)
-  nil )
- (!pair  "deferred_locations_list"
-  (!type already_seen 1269)
-  (!srcfileloc  "dwarf2out.c" 1237)
-  nil )
- (!pair  "current_unit_personality"
-  (!type already_seen 136)
-  (!srcfileloc  "dwarf2out.c" 264)
-  nil )
- (!pair  "decltype_auto_die"
-  (!type already_seen 426)
-  (!srcfileloc  "dwarf2out.c" 254)
-  nil )
- (!pair  "auto_die"
-  (!type already_seen 426)
-  (!srcfileloc  "dwarf2out.c" 251)
-  nil )
- (!pair  "cold_text_section"
-  (!type already_seen 245)
-  (!srcfileloc  "dwarf2out.c" 248)
-  nil )
- (!pair  "cold_text_section_used"
-  (!type already_seen 9)
-  (!srcfileloc  "dwarf2out.c" 245)
-  nil )
- (!pair  "text_section_used"
-  (!type already_seen 9)
-  (!srcfileloc  "dwarf2out.c" 244)
-  nil )
- (!pair  "have_multiple_function_sections"
-  (!type already_seen 9)
-  (!srcfileloc  "dwarf2out.c" 240)
-  nil )
- (!pair  "dw2_string_counter"
-  (!type already_seen 9)
-  (!srcfileloc  "dwarf2out.c" 237)
-  nil )
- (!pair  "skeleton_debug_str_hash"
-  (!type already_seen 1530)
-  (!srcfileloc  "dwarf2out.c" 235)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 438)
-   )
-  )
- )
- (!pair  "debug_str_hash"
-  (!type already_seen 1530)
-  (!srcfileloc  "dwarf2out.c" 213)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 438)
-   )
-  )
- )
- (!pair  "fde_vec"
-  (!type already_seen 1272)
-  (!srcfileloc  "dwarf2out.c" 203)
-  nil )
- (!pair  "debug_frame_section"
-  (!type already_seen 245)
-  (!srcfileloc  "dwarf2out.c" 168)
-  nil )
- (!pair  "debug_ranges_section"
-  (!type already_seen 245)
-  (!srcfileloc  "dwarf2out.c" 167)
-  nil )
- (!pair  "debug_str_offsets_section"
-  (!type already_seen 245)
-  (!srcfileloc  "dwarf2out.c" 166)
-  nil )
- (!pair  "debug_str_dwo_section"
-  (!type already_seen 245)
-  (!srcfileloc  "dwarf2out.c" 165)
-  nil )
- (!pair  "debug_str_section"
-  (!type already_seen 245)
-  (!srcfileloc  "dwarf2out.c" 164)
-  nil )
- (!pair  "debug_pubtypes_section"
-  (!type already_seen 245)
-  (!srcfileloc  "dwarf2out.c" 163)
-  nil )
- (!pair  "debug_pubnames_section"
-  (!type already_seen 245)
-  (!srcfileloc  "dwarf2out.c" 162)
-  nil )
- (!pair  "debug_loc_section"
-  (!type already_seen 245)
-  (!srcfileloc  "dwarf2out.c" 161)
-  nil )
- (!pair  "debug_skeleton_line_section"
-  (!type already_seen 245)
-  (!srcfileloc  "dwarf2out.c" 160)
-  nil )
- (!pair  "debug_line_section"
-  (!type already_seen 245)
-  (!srcfileloc  "dwarf2out.c" 159)
-  nil )
- (!pair  "debug_macinfo_section"
-  (!type already_seen 245)
-  (!srcfileloc  "dwarf2out.c" 158)
-  nil )
- (!pair  "debug_addr_section"
-  (!type already_seen 245)
-  (!srcfileloc  "dwarf2out.c" 157)
-  nil )
- (!pair  "debug_aranges_section"
-  (!type already_seen 245)
-  (!srcfileloc  "dwarf2out.c" 156)
-  nil )
- (!pair  "debug_skeleton_abbrev_section"
-  (!type already_seen 245)
-  (!srcfileloc  "dwarf2out.c" 155)
-  nil )
- (!pair  "debug_abbrev_section"
-  (!type already_seen 245)
-  (!srcfileloc  "dwarf2out.c" 154)
-  nil )
- (!pair  "debug_skeleton_info_section"
-  (!type already_seen 245)
-  (!srcfileloc  "dwarf2out.c" 153)
-  nil )
- (!pair  "debug_info_section"
-  (!type already_seen 245)
-  (!srcfileloc  "dwarf2out.c" 152)
-  nil )
- (!pair  "decl_scope_table"
-  (!type already_seen 45)
-  (!srcfileloc  "dwarf2out.c" 149)
-  nil )
- (!pair  "incomplete_types"
-  (!type already_seen 45)
-  (!srcfileloc  "dwarf2out.c" 142)
-  nil )
- (!pair  "used_rtx_array"
-  (!type already_seen 251)
-  (!srcfileloc  "dwarf2out.c" 136)
-  nil )
- (!pair  "saved_do_cfi_asm"
-  (!type already_seen 9)
-  (!srcfileloc  "dwarf2cfi.c" 3314)
-  nil )
- (!pair  "dwarf2out_cfi_label_num"
-  (!type already_seen 9)
-  (!srcfileloc  "dwarf2cfi.c" 196)
-  nil )
- (!pair  "cie_return_save"
-  (!type already_seen 1279)
-  (!srcfileloc  "dwarf2cfi.c" 194)
-  nil )
- (!pair  "cie_cfi_row"
-  (!type already_seen 1281)
-  (!srcfileloc  "dwarf2cfi.c" 192)
-  nil )
- (!pair  "dw2_const_labelno"
-  (!type already_seen 9)
-  (!srcfileloc  "dwarf2asm.c" 797)
-  nil )
- (!pair  "indirect_pool"
-  (!type already_seen 1532)
-  (!srcfileloc  "dwarf2asm.c" 795)
-  (!options 
-   (!option param2_is type 
-    (!type already_seen 5)
-   )
-   (!option param1_is type 
-    (!type already_seen 36)
-   )
-  )
- )
- (!pair  "cie_cfi_vec"
-  (!type already_seen 409)
-  (!srcfileloc  "dwarf2out.h" 238)
-  nil )
- (!pair  "lastfile_is_base"
-  (!type already_seen 9)
-  (!srcfileloc  "dbxout.c" 251)
-  nil )
- (!pair  "lastfile"
-  (!type already_seen 36)
-  (!srcfileloc  "dbxout.c" 247)
-  nil )
- (!pair  "source_label_number"
-  (!type already_seen 9)
-  (!srcfileloc  "dbxout.c" 243)
-  nil )
- (!pair  "dbxout_source_line_counter"
-  (!type already_seen 9)
-  (!srcfileloc  "dbxout.c" 238)
-  nil )
- (!pair  "scope_labelno"
-  (!type already_seen 9)
-  (!srcfileloc  "dbxout.c" 234)
-  nil )
- (!pair  "next_file_number"
-  (!type already_seen 9)
-  (!srcfileloc  "dbxout.c" 230)
-  nil )
- (!pair  "preinit_symbols"
-  (!type already_seen 5)
-  (!srcfileloc  "dbxout.c" 197)
-  nil )
- (!pair  "next_type_number"
-  (!type already_seen 9)
-  (!srcfileloc  "dbxout.c" 191)
-  nil )
- (!pair  "typevec_len"
-  (!type already_seen 9)
-  (!srcfileloc  "dbxout.c" 185)
-  nil )
- (!pair  "typevec"
-  (!type already_seen 1286)
-  (!srcfileloc  "dbxout.c" 181)
-  (!options 
-   (!option length string  "typevec_len")
-  )
- )
- (!pair  "version_info_node"
-  (!type already_seen 1346)
-  (!srcfileloc  "cgraph.c" 174)
-  nil )
- (!pair  "cgraph_fnver_htab"
-  (!type already_seen 1534)
-  (!srcfileloc  "cgraph.c" 150)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 1345)
-   )
-  )
- )
- (!pair  "free_edges"
-  (!type already_seen 915)
-  (!srcfileloc  "cgraph.c" 140)
-  nil )
- (!pair  "free_nodes"
-  (!type already_seen 912)
-  (!srcfileloc  "cgraph.c" 137)
-  nil )
- (!pair  "callmem"
-  (!type already_seen 136)
-  (!srcfileloc  "cselib.c" 233)
-  nil )
- (!pair  "bitmap_ggc_free"
-  (!type already_seen 122)
-  (!srcfileloc  "bitmap.c" 139)
-  (!options 
-   (!option deletable string  "")
-  )
- )
- (!pair  "frame_set"
-  (!type already_seen 9)
-  (!srcfileloc  "alias.c" 1051)
-  nil )
- (!pair  "varargs_set"
-  (!type already_seen 9)
-  (!srcfileloc  "alias.c" 1029)
-  nil )
- (!pair  "alias_sets"
-  (!type already_seen 1316)
-  (!srcfileloc  "alias.c" 267)
-  nil )
- (!pair  "reg_known_value"
-  (!type already_seen 251)
-  (!srcfileloc  "alias.c" 245)
-  nil )
- (!pair  "old_reg_base_value"
-  (!type already_seen 251)
-  (!srcfileloc  "alias.c" 226)
-  (!options 
-   (!option deletable string  "")
-  )
- )
- (!pair  "arg_base_value"
-  (!type already_seen 136)
-  (!srcfileloc  "alias.c" 218)
-  nil )
- (!pair  "reg_base_value"
-  (!type already_seen 251)
-  (!srcfileloc  "alias.c" 213)
-  nil )
- (!pair  "assembler_name_hash"
-  (!type already_seen 1536)
-  (!srcfileloc  "symtab.c" 63)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 937)
-   )
-  )
- )
- (!pair  "symtab_hash"
-  (!type already_seen 1536)
-  (!srcfileloc  "symtab.c" 61)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 937)
-   )
-  )
- )
- (!pair  "restinsn"
-  (!type already_seen 136)
-  (!srcfileloc  "caller-save.c" 106)
-  nil )
- (!pair  "saveinsn"
-  (!type already_seen 136)
-  (!srcfileloc  "caller-save.c" 105)
-  nil )
- (!pair  "test_mem"
-  (!type already_seen 136)
-  (!srcfileloc  "caller-save.c" 104)
-  nil )
- (!pair  "test_reg"
-  (!type already_seen 136)
-  (!srcfileloc  "caller-save.c" 103)
-  nil )
- (!pair  "restpat"
-  (!type already_seen 136)
-  (!srcfileloc  "caller-save.c" 102)
-  nil )
- (!pair  "savepat"
-  (!type already_seen 136)
-  (!srcfileloc  "caller-save.c" 101)
-  nil )
- (!pair  "symtab_order"
-  (!type already_seen 9)
-  (!srcfileloc  "cgraph.h" 706)
-  nil )
- (!pair  "asm_nodes"
-  (!type already_seen 1338)
-  (!srcfileloc  "cgraph.h" 705)
-  nil )
- (!pair  "cgraph_edge_max_uid"
-  (!type already_seen 9)
-  (!srcfileloc  "cgraph.h" 682)
-  nil )
- (!pair  "cgraph_max_uid"
-  (!type already_seen 9)
-  (!srcfileloc  "cgraph.h" 681)
-  nil )
- (!pair  "cgraph_n_nodes"
-  (!type already_seen 9)
-  (!srcfileloc  "cgraph.h" 680)
-  nil )
- (!pair  "symtab_nodes"
-  (!type already_seen 938)
-  (!srcfileloc  "cgraph.h" 679)
-  nil )
- (!pair  "in_cold_section_p"
-  (!type already_seen 9)
-  (!srcfileloc  "output.h" 516)
-  nil )
- (!pair  "in_section"
-  (!type already_seen 245)
-  (!srcfileloc  "output.h" 515)
-  nil )
- (!pair  "bss_noswitch_section"
-  (!type already_seen 245)
-  (!srcfileloc  "output.h" 513)
-  nil )
- (!pair  "lcomm_section"
-  (!type already_seen 245)
-  (!srcfileloc  "output.h" 512)
-  nil )
- (!pair  "comm_section"
-  (!type already_seen 245)
-  (!srcfileloc  "output.h" 511)
-  nil )
- (!pair  "tls_comm_section"
-  (!type already_seen 245)
-  (!srcfileloc  "output.h" 510)
-  nil )
- (!pair  "eh_frame_section"
-  (!type already_seen 245)
-  (!srcfileloc  "output.h" 509)
-  nil )
- (!pair  "exception_section"
-  (!type already_seen 245)
-  (!srcfileloc  "output.h" 508)
-  nil )
- (!pair  "sbss_section"
-  (!type already_seen 245)
-  (!srcfileloc  "output.h" 507)
-  nil )
- (!pair  "bss_section"
-  (!type already_seen 245)
-  (!srcfileloc  "output.h" 506)
-  nil )
- (!pair  "dtors_section"
-  (!type already_seen 245)
-  (!srcfileloc  "output.h" 505)
-  nil )
- (!pair  "ctors_section"
-  (!type already_seen 245)
-  (!srcfileloc  "output.h" 504)
-  nil )
- (!pair  "sdata_section"
-  (!type already_seen 245)
-  (!srcfileloc  "output.h" 503)
-  nil )
- (!pair  "readonly_data_section"
-  (!type already_seen 245)
-  (!srcfileloc  "output.h" 502)
-  nil )
- (!pair  "data_section"
-  (!type already_seen 245)
-  (!srcfileloc  "output.h" 501)
-  nil )
- (!pair  "text_section"
-  (!type already_seen 245)
-  (!srcfileloc  "output.h" 500)
-  nil )
- (!pair  "types_used_by_cur_var_decl"
-  (!type already_seen 45)
-  (!srcfileloc  "function.h" 724)
-  nil )
- (!pair  "types_used_by_vars_hash"
-  (!type already_seen 1538)
-  (!srcfileloc  "function.h" 716)
-  (!options 
-   (!option param_is type 
-    (!type already_seen 1361)
-   )
-  )
- )
- (!pair  "cfun"
-  (!type already_seen 349)
-  (!srcfileloc  "function.h" 692)
-  nil )
- (!pair  "x_rtl"
-  (!type already_seen 1363)
-  (!srcfileloc  "function.h" 480)
-  nil )
- (!pair  "regno_reg_rtx"
-  (!type already_seen 137)
-  (!srcfileloc  "function.h" 93)
-  (!options 
-   (!option length string  "crtl->emit.x_reg_rtx_no")
-  )
- )
- (!pair  "default_target_libfuncs"
-  (!type already_seen 539)
-  (!srcfileloc  "libfuncs.h" 73)
-  nil )
- (!pair  "current_function_func_begin_label"
-  (!type already_seen 36)
-  (!srcfileloc  "tree-core.h" 1846)
-  nil )
- (!pair  "current_function_decl"
-  (!type already_seen 5)
-  (!srcfileloc  "tree-core.h" 1843)
-  nil )
- (!pair  "builtin_info"
-  (!type already_seen 1393)
-  (!srcfileloc  "tree-core.h" 1833)
-  nil )
- (!pair  "sizetype_tab"
-  (!type array 1589 nil  gc_used "(int) stk_type_kind_last" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "tree-core.h" 1821)
-  nil )
- (!pair  "integer_types"
-  (!type array 1590 nil  gc_used "itk_none" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "tree-core.h" 1818)
-  nil )
- (!pair  "global_trees"
-  (!type array 1591 nil  gc_used "TI_MAX" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "tree-core.h" 1814)
-  nil )
- (!pair  "all_translation_units"
-  (!type already_seen 45)
-  (!srcfileloc  "tree-core.h" 1811)
-  nil )
- (!pair  "alias_pairs"
-  (!type already_seen 1391)
-  (!srcfileloc  "tree-core.h" 1798)
-  nil )
- (!pair  "stack_limit_rtx"
-  (!type already_seen 136)
-  (!srcfileloc  "rtl.h" 2733)
-  nil )
- (!pair  "default_target_rtl"
-  (!type already_seen 532)
-  (!srcfileloc  "rtl.h" 2307)
-  nil )
- (!pair  "simple_return_rtx"
-  (!type already_seen 136)
-  (!srcfileloc  "rtl.h" 2208)
-  nil )
- (!pair  "ret_rtx"
-  (!type already_seen 136)
-  (!srcfileloc  "rtl.h" 2207)
-  nil )
- (!pair  "cc0_rtx"
-  (!type already_seen 136)
-  (!srcfileloc  "rtl.h" 2206)
-  nil )
- (!pair  "pc_rtx"
-  (!type already_seen 136)
-  (!srcfileloc  "rtl.h" 2205)
-  nil )
- (!pair  "const_tiny_rtx"
-  (!type array 1592 nil  gc_used "4" 
-   (!type array 1593 nil  gc_used "(int) MAX_MACHINE_MODE" 
-    (!type already_seen 136)
-   )
-  )
-  (!srcfileloc  "rtl.h" 2192)
-  nil )
- (!pair  "const_true_rtx"
-  (!type already_seen 136)
-  (!srcfileloc  "rtl.h" 2190)
-  nil )
- (!pair  "const_int_rtx"
-  (!type array 1594 nil  gc_used "MAX_SAVED_CONST_INT * 2 + 1" 
-   (!type already_seen 136)
-  )
-  (!srcfileloc  "rtl.h" 2184)
-  nil )
- (!pair  "gcov_fn_info_ptr_type"
-  (!type already_seen 5)
-  (!srcfileloc  "coverage.c" 108)
-  nil )
- (!pair  "gcov_fn_info_type"
-  (!type already_seen 5)
-  (!srcfileloc  "coverage.c" 107)
-  nil )
- (!pair  "gcov_info_var"
-  (!type already_seen 5)
-  (!srcfileloc  "coverage.c" 106)
-  nil )
- (!pair  "fn_v_ctrs"
-  (!type array 1595 nil  gc_used "GCOV_COUNTERS" 
-   (!type already_seen 5)
-  )
-  (!srcfileloc  "coverage.c" 101)
-  nil )
- (!pair  "functions_head"
-  (!type already_seen 1429)
-  (!srcfileloc  "coverage.c" 92)
-  nil )
- (!pair  "thumb_call_via_label"
-  (!type array 1596 nil  gc_used "14" 
-   (!type already_seen 136)
-  )
-  (!srcfileloc  "config/arm/arm.h" 1557)
-  nil )
- (!pair  "arm_target_insn"
-  (!type already_seen 136)
-  (!srcfileloc  "config/arm/arm.h" 204)
-  nil )
- (!pair  "line_table"
-  (!type already_seen 1460)
-  (!srcfileloc  "input.h" 26)
-  nil )
-)
-
-(!endfile)
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ada/gcc-interface/ada-tree.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ada/gcc-interface/ada-tree.def
deleted file mode 100644
index 93967b5..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ada/gcc-interface/ada-tree.def
+++ /dev/null
@@ -1,74 +0,0 @@
-/****************************************************************************
- *                                                                          *
- *                         GNAT COMPILER COMPONENTS                         *
- *                                                                          *
- *                       GNAT-SPECIFIC GCC TREE CODES                       *
- *                                                                          *
- *                              Specification                               *
- *                                                                          *
- *            Copyright (C) 1992-2009, Free Software Foundation, Inc.       *
- *                                                                          *
- * GNAT is free software;  you can  redistribute it  and/or modify it under *
- * terms of the  GNU General Public License as published  by the Free Soft- *
- * ware  Foundation;  either version 3,  or (at your option) any later ver- *
- * sion.  GNAT is distributed in the hope that it will be useful, but WITH- *
- * OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY *
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License *
- * for  more details.  You should have received a copy of the GNU General   *
- * Public License along with GCC; see the file COPYING3.  If not see        *
- * <http://www.gnu.org/licenses/>.                                          *
- *                                                                          *
- * GNAT was originally developed  by the GNAT team at  New York University. *
- * Extensive contributions were provided by Ada Core Technologies Inc.      *
- *                                                                          *
- ****************************************************************************/
-
-/* A type that is an unconstrained array.  This node is never passed to GCC.
-   TREE_TYPE is the type of the fat pointer and TYPE_OBJECT_RECORD_TYPE is
-   the type of a record containing the template and data.  */
-DEFTREECODE (UNCONSTRAINED_ARRAY_TYPE, "unconstrained_array_type", tcc_type, 0)
-
-/* A reference to an unconstrained array.  This node only exists as an
-   intermediate node during the translation of a GNAT tree to a GCC tree;
-   it is never passed to GCC.  The only field used is operand 0, which
-   is the fat pointer object.  */
-DEFTREECODE (UNCONSTRAINED_ARRAY_REF, "unconstrained_array_ref",
-	     tcc_reference, 1)
-
-/* An expression that returns an RTL suitable for its type.  Operand 0
-   is an expression to be evaluated for side effects only.  */
-DEFTREECODE (NULL_EXPR, "null_expr", tcc_expression, 1)
-
-/* Same as PLUS_EXPR, except that no modulo reduction is applied.
-   This is used for loops and never shows up in the tree.  */
-DEFTREECODE (PLUS_NOMOD_EXPR, "plus_nomod_expr", tcc_binary, 2)
-
-/* Same as MINUS_EXPR, except that no modulo reduction is applied.
-   This is used for loops and never shows up in the tree.  */
-DEFTREECODE (MINUS_NOMOD_EXPR, "minus_nomod_expr", tcc_binary, 2)
-
-/* Same as ADDR_EXPR, except that if the operand represents a bit field,
-   return the address of the byte containing the bit.  This is used
-   for the Address attribute and never shows up in the tree.  */
-DEFTREECODE (ATTR_ADDR_EXPR, "attr_addr_expr", tcc_reference, 1)
-
-/* Here are the tree codes for the statement types known to Ada.  These
-   must be at the end of this file to allow IS_ADA_STMT to work.  */
-
-/* This is how record_code_position and insert_code_for work.  The former
-   makes this tree node, whose operand is a statement.  The latter inserts
-   the actual statements into this node.  Gimplification consists of
-   just returning the inner statement.  */
-DEFTREECODE (STMT_STMT, "stmt_stmt", tcc_statement, 1)
-
-/* A loop.  LOOP_STMT_COND is the test to exit the loop.  LOOP_STMT_UPDATE
-   is the statement to update the loop iteration variable at the continue
-   point.  LOOP_STMT_BODY are the statements in the body of the loop.  And
-   LOOP_STMT_LABEL points to the LABEL_DECL of the end label of the loop.  */
-DEFTREECODE (LOOP_STMT, "loop_stmt", tcc_statement, 4)
-
-/* Conditionally exit a loop.  EXIT_STMT_COND is the condition, which, if
-   true, will cause the loop to be exited.  If no condition is specified,
-   the loop is unconditionally exited.  EXIT_STMT_LABEL is the end label
-   corresponding to the loop to exit.  */
-DEFTREECODE (EXIT_STMT, "exit_stmt", tcc_statement, 2)
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/alias.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/alias.h
deleted file mode 100644
index 58fda9d..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/alias.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Exported functions from alias.c
-   Copyright (C) 2004-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_ALIAS_H
-#define GCC_ALIAS_H
-
-/* The type of an alias set.  Code currently assumes that variables of
-   this type can take the values 0 (the alias set which aliases
-   everything) and -1 (sometimes indicating that the alias set is
-   unknown, sometimes indicating a memory barrier) and -2 (indicating
-   that the alias set should be set to a unique value but has not been
-   set yet).  */
-typedef int alias_set_type;
-
-extern alias_set_type new_alias_set (void);
-extern alias_set_type get_alias_set (tree);
-extern alias_set_type get_deref_alias_set (tree);
-extern alias_set_type get_varargs_alias_set (void);
-extern alias_set_type get_frame_alias_set (void);
-extern tree component_uses_parent_alias_set_from (const_tree);
-extern bool alias_set_subset_of (alias_set_type, alias_set_type);
-extern void record_alias_subset (alias_set_type, alias_set_type);
-extern void record_component_aliases (tree);
-extern int alias_sets_conflict_p (alias_set_type, alias_set_type);
-extern int alias_sets_must_conflict_p (alias_set_type, alias_set_type);
-extern int objects_must_conflict_p (tree, tree);
-extern int nonoverlapping_memrefs_p (const_rtx, const_rtx, bool);
-tree reference_alias_ptr_type (tree);
-bool alias_ptr_types_compatible_p (tree, tree);
-
-/* This alias set can be used to force a memory to conflict with all
-   other memories, creating a barrier across which no memory reference
-   can move.  Note that there are other legacy ways to create such
-   memory barriers, including an address of SCRATCH.  */
-#define ALIAS_SET_MEMORY_BARRIER	((alias_set_type) -1)
-
-#endif /* GCC_ALIAS_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/all-tree.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/all-tree.def
deleted file mode 100644
index 8a2da69..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/all-tree.def
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "tree.def"
-END_OF_BASE_TREE_CODES
-#include "c-family/c-common.def"
-#include "ada/gcc-interface/ada-tree.def"
-#include "cp/cp-tree.def"
-#include "java/java-tree.def"
-#include "objc/objc-tree.def"
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/alloc-pool.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/alloc-pool.h
deleted file mode 100644
index ab99cc6..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/alloc-pool.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Functions to support a pool of allocatable objects
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
-   Contributed by Daniel Berlin <dan@cgsoftware.com>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-#ifndef ALLOC_POOL_H
-#define ALLOC_POOL_H
-
-typedef unsigned long ALLOC_POOL_ID_TYPE;
-
-typedef struct alloc_pool_list_def
-{
-  struct alloc_pool_list_def *next;
-}
- *alloc_pool_list;
-
-typedef struct alloc_pool_def
-{
-  const char *name;
-#ifdef ENABLE_CHECKING
-  ALLOC_POOL_ID_TYPE id;
-#endif
-  size_t elts_per_block;
-
-  /* These are the elements that have been allocated at least once and freed.  */
-  alloc_pool_list returned_free_list;
-
-  /* These are the elements that have not yet been allocated out of
-     the last block obtained from XNEWVEC.  */
-  char* virgin_free_list;
-
-  /* The number of elements in the virgin_free_list that can be
-     allocated before needing another block.  */
-  size_t virgin_elts_remaining;
-
-  size_t elts_allocated;
-  size_t elts_free;
-  size_t blocks_allocated;
-  alloc_pool_list block_list;
-  size_t block_size;
-  size_t elt_size;
-}
- *alloc_pool;
-
-extern alloc_pool create_alloc_pool (const char *, size_t, size_t);
-extern void free_alloc_pool (alloc_pool);
-extern void empty_alloc_pool (alloc_pool);
-extern void free_alloc_pool_if_empty (alloc_pool *);
-extern void *pool_alloc (alloc_pool) ATTRIBUTE_MALLOC;
-extern void pool_free (alloc_pool, void *);
-extern void dump_alloc_pool_statistics (void);
-#endif
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ansidecl.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ansidecl.h
deleted file mode 100644
index 0fb23bb..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ansidecl.h
+++ /dev/null
@@ -1,313 +0,0 @@
-/* ANSI and traditional C compatability macros
-   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-   2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2013
-   Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-/* ANSI and traditional C compatibility macros
-
-   ANSI C is assumed if __STDC__ is #defined.
-
-   Macro		ANSI C definition	Traditional C definition
-   -----		---- - ----------	----------- - ----------
-   PTR			`void *'		`char *'
-   const		not defined		`'
-   volatile		not defined		`'
-   signed		not defined		`'
-
-   For ease of writing code which uses GCC extensions but needs to be
-   portable to other compilers, we provide the GCC_VERSION macro that
-   simplifies testing __GNUC__ and __GNUC_MINOR__ together, and various
-   wrappers around __attribute__.  Also, __extension__ will be #defined
-   to nothing if it doesn't work.  See below.  */
-
-#ifndef	_ANSIDECL_H
-#define _ANSIDECL_H	1
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Every source file includes this file,
-   so they will all get the switch for lint.  */
-/* LINTLIBRARY */
-
-/* Using MACRO(x,y) in cpp #if conditionals does not work with some
-   older preprocessors.  Thus we can't define something like this:
-
-#define HAVE_GCC_VERSION(MAJOR, MINOR) \
-  (__GNUC__ > (MAJOR) || (__GNUC__ == (MAJOR) && __GNUC_MINOR__ >= (MINOR)))
-
-and then test "#if HAVE_GCC_VERSION(2,7)".
-
-So instead we use the macro below and test it against specific values.  */
-
-/* This macro simplifies testing whether we are using gcc, and if it
-   is of a particular minimum version. (Both major & minor numbers are
-   significant.)  This macro will evaluate to 0 if we are not using
-   gcc at all.  */
-#ifndef GCC_VERSION
-#define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
-#endif /* GCC_VERSION */
-
-#if defined (__STDC__) || defined(__cplusplus) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(_WIN32)
-/* All known AIX compilers implement these things (but don't always
-   define __STDC__).  The RISC/OS MIPS compiler defines these things
-   in SVR4 mode, but does not define __STDC__.  */
-/* eraxxon@alumni.rice.edu: The Compaq C++ compiler, unlike many other
-   C++ compilers, does not define __STDC__, though it acts as if this
-   was so. (Verified versions: 5.7, 6.2, 6.3, 6.5) */
-
-#define PTR		void *
-
-#undef const
-#undef volatile
-#undef signed
-
-/* inline requires special treatment; it's in C99, and GCC >=2.7 supports
-   it too, but it's not in C89.  */
-#undef inline
-#if __STDC_VERSION__ >= 199901L || defined(__cplusplus) || (defined(__SUNPRO_C) && defined(__C99FEATURES__))
-/* it's a keyword */
-#else
-# if GCC_VERSION >= 2007
-#  define inline __inline__   /* __inline__ prevents -pedantic warnings */
-# else
-#  define inline  /* nothing */
-# endif
-#endif
-
-#else	/* Not ANSI C.  */
-
-#define PTR		char *
-
-/* some systems define these in header files for non-ansi mode */
-#undef const
-#undef volatile
-#undef signed
-#undef inline
-#define const
-#define volatile
-#define signed
-#define inline
-
-#endif	/* ANSI C.  */
-
-/* Define macros for some gcc attributes.  This permits us to use the
-   macros freely, and know that they will come into play for the
-   version of gcc in which they are supported.  */
-
-#if (GCC_VERSION < 2007)
-# define __attribute__(x)
-#endif
-
-/* Attribute __malloc__ on functions was valid as of gcc 2.96. */
-#ifndef ATTRIBUTE_MALLOC
-# if (GCC_VERSION >= 2096)
-#  define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
-# else
-#  define ATTRIBUTE_MALLOC
-# endif /* GNUC >= 2.96 */
-#endif /* ATTRIBUTE_MALLOC */
-
-/* Attributes on labels were valid as of gcc 2.93 and g++ 4.5.  For
-   g++ an attribute on a label must be followed by a semicolon.  */
-#ifndef ATTRIBUTE_UNUSED_LABEL
-# ifndef __cplusplus
-#  if GCC_VERSION >= 2093
-#   define ATTRIBUTE_UNUSED_LABEL ATTRIBUTE_UNUSED
-#  else
-#   define ATTRIBUTE_UNUSED_LABEL
-#  endif
-# else
-#  if GCC_VERSION >= 4005
-#   define ATTRIBUTE_UNUSED_LABEL ATTRIBUTE_UNUSED ;
-#  else
-#   define ATTRIBUTE_UNUSED_LABEL
-#  endif
-# endif
-#endif
-
-/* Similarly to ARG_UNUSED below.  Prior to GCC 3.4, the C++ frontend
-   couldn't parse attributes placed after the identifier name, and now
-   the entire compiler is built with C++.  */
-#ifndef ATTRIBUTE_UNUSED
-#if GCC_VERSION >= 3004
-#  define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
-#else
-#define ATTRIBUTE_UNUSED
-#endif
-#endif /* ATTRIBUTE_UNUSED */
-
-/* Before GCC 3.4, the C++ frontend couldn't parse attributes placed after the
-   identifier name.  */
-#if ! defined(__cplusplus) || (GCC_VERSION >= 3004)
-# define ARG_UNUSED(NAME) NAME ATTRIBUTE_UNUSED
-#else /* !__cplusplus || GNUC >= 3.4 */
-# define ARG_UNUSED(NAME) NAME
-#endif /* !__cplusplus || GNUC >= 3.4 */
-
-#ifndef ATTRIBUTE_NORETURN
-#define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
-#endif /* ATTRIBUTE_NORETURN */
-
-/* Attribute `nonnull' was valid as of gcc 3.3.  */
-#ifndef ATTRIBUTE_NONNULL
-# if (GCC_VERSION >= 3003)
-#  define ATTRIBUTE_NONNULL(m) __attribute__ ((__nonnull__ (m)))
-# else
-#  define ATTRIBUTE_NONNULL(m)
-# endif /* GNUC >= 3.3 */
-#endif /* ATTRIBUTE_NONNULL */
-
-/* Attribute `returns_nonnull' was valid as of gcc 4.9.  */
-#ifndef ATTRIBUTE_RETURNS_NONNULL
-# if (GCC_VERSION >= 4009)
-#  define ATTRIBUTE_RETURNS_NONNULL __attribute__ ((__returns_nonnull__))
-# else
-#  define ATTRIBUTE_RETURNS_NONNULL
-# endif /* GNUC >= 4.9 */
-#endif /* ATTRIBUTE_RETURNS_NONNULL */
-
-/* Attribute `pure' was valid as of gcc 3.0.  */
-#ifndef ATTRIBUTE_PURE
-# if (GCC_VERSION >= 3000)
-#  define ATTRIBUTE_PURE __attribute__ ((__pure__))
-# else
-#  define ATTRIBUTE_PURE
-# endif /* GNUC >= 3.0 */
-#endif /* ATTRIBUTE_PURE */
-
-/* Use ATTRIBUTE_PRINTF when the format specifier must not be NULL.
-   This was the case for the `printf' format attribute by itself
-   before GCC 3.3, but as of 3.3 we need to add the `nonnull'
-   attribute to retain this behavior.  */
-#ifndef ATTRIBUTE_PRINTF
-#define ATTRIBUTE_PRINTF(m, n) __attribute__ ((__format__ (__printf__, m, n))) ATTRIBUTE_NONNULL(m)
-#define ATTRIBUTE_PRINTF_1 ATTRIBUTE_PRINTF(1, 2)
-#define ATTRIBUTE_PRINTF_2 ATTRIBUTE_PRINTF(2, 3)
-#define ATTRIBUTE_PRINTF_3 ATTRIBUTE_PRINTF(3, 4)
-#define ATTRIBUTE_PRINTF_4 ATTRIBUTE_PRINTF(4, 5)
-#define ATTRIBUTE_PRINTF_5 ATTRIBUTE_PRINTF(5, 6)
-#endif /* ATTRIBUTE_PRINTF */
-
-/* Use ATTRIBUTE_FPTR_PRINTF when the format attribute is to be set on
-   a function pointer.  Format attributes were allowed on function
-   pointers as of gcc 3.1.  */
-#ifndef ATTRIBUTE_FPTR_PRINTF
-# if (GCC_VERSION >= 3001)
-#  define ATTRIBUTE_FPTR_PRINTF(m, n) ATTRIBUTE_PRINTF(m, n)
-# else
-#  define ATTRIBUTE_FPTR_PRINTF(m, n)
-# endif /* GNUC >= 3.1 */
-# define ATTRIBUTE_FPTR_PRINTF_1 ATTRIBUTE_FPTR_PRINTF(1, 2)
-# define ATTRIBUTE_FPTR_PRINTF_2 ATTRIBUTE_FPTR_PRINTF(2, 3)
-# define ATTRIBUTE_FPTR_PRINTF_3 ATTRIBUTE_FPTR_PRINTF(3, 4)
-# define ATTRIBUTE_FPTR_PRINTF_4 ATTRIBUTE_FPTR_PRINTF(4, 5)
-# define ATTRIBUTE_FPTR_PRINTF_5 ATTRIBUTE_FPTR_PRINTF(5, 6)
-#endif /* ATTRIBUTE_FPTR_PRINTF */
-
-/* Use ATTRIBUTE_NULL_PRINTF when the format specifier may be NULL.  A
-   NULL format specifier was allowed as of gcc 3.3.  */
-#ifndef ATTRIBUTE_NULL_PRINTF
-# if (GCC_VERSION >= 3003)
-#  define ATTRIBUTE_NULL_PRINTF(m, n) __attribute__ ((__format__ (__printf__, m, n)))
-# else
-#  define ATTRIBUTE_NULL_PRINTF(m, n)
-# endif /* GNUC >= 3.3 */
-# define ATTRIBUTE_NULL_PRINTF_1 ATTRIBUTE_NULL_PRINTF(1, 2)
-# define ATTRIBUTE_NULL_PRINTF_2 ATTRIBUTE_NULL_PRINTF(2, 3)
-# define ATTRIBUTE_NULL_PRINTF_3 ATTRIBUTE_NULL_PRINTF(3, 4)
-# define ATTRIBUTE_NULL_PRINTF_4 ATTRIBUTE_NULL_PRINTF(4, 5)
-# define ATTRIBUTE_NULL_PRINTF_5 ATTRIBUTE_NULL_PRINTF(5, 6)
-#endif /* ATTRIBUTE_NULL_PRINTF */
-
-/* Attribute `sentinel' was valid as of gcc 3.5.  */
-#ifndef ATTRIBUTE_SENTINEL
-# if (GCC_VERSION >= 3005)
-#  define ATTRIBUTE_SENTINEL __attribute__ ((__sentinel__))
-# else
-#  define ATTRIBUTE_SENTINEL
-# endif /* GNUC >= 3.5 */
-#endif /* ATTRIBUTE_SENTINEL */
-
-
-#ifndef ATTRIBUTE_ALIGNED_ALIGNOF
-# if (GCC_VERSION >= 3000)
-#  define ATTRIBUTE_ALIGNED_ALIGNOF(m) __attribute__ ((__aligned__ (__alignof__ (m))))
-# else
-#  define ATTRIBUTE_ALIGNED_ALIGNOF(m)
-# endif /* GNUC >= 3.0 */
-#endif /* ATTRIBUTE_ALIGNED_ALIGNOF */
-
-/* Useful for structures whose layout must much some binary specification
-   regardless of the alignment and padding qualities of the compiler.  */
-#ifndef ATTRIBUTE_PACKED
-# define ATTRIBUTE_PACKED __attribute__ ((packed))
-#endif
-
-/* Attribute `hot' and `cold' was valid as of gcc 4.3.  */
-#ifndef ATTRIBUTE_COLD
-# if (GCC_VERSION >= 4003)
-#  define ATTRIBUTE_COLD __attribute__ ((__cold__))
-# else
-#  define ATTRIBUTE_COLD
-# endif /* GNUC >= 4.3 */
-#endif /* ATTRIBUTE_COLD */
-#ifndef ATTRIBUTE_HOT
-# if (GCC_VERSION >= 4003)
-#  define ATTRIBUTE_HOT __attribute__ ((__hot__))
-# else
-#  define ATTRIBUTE_HOT
-# endif /* GNUC >= 4.3 */
-#endif /* ATTRIBUTE_HOT */
-
-/* We use __extension__ in some places to suppress -pedantic warnings
-   about GCC extensions.  This feature didn't work properly before
-   gcc 2.8.  */
-#if GCC_VERSION < 2008
-#define __extension__
-#endif
-
-/* This is used to declare a const variable which should be visible
-   outside of the current compilation unit.  Use it as
-     EXPORTED_CONST int i = 1;
-   This is because the semantics of const are different in C and C++.
-   "extern const" is permitted in C but it looks strange, and gcc
-   warns about it when -Wc++-compat is not used.  */
-#ifdef __cplusplus
-#define EXPORTED_CONST extern const
-#else
-#define EXPORTED_CONST const
-#endif
-
-/* Be conservative and only use enum bitfields with C++ or GCC.
-   FIXME: provide a complete autoconf test for buggy enum bitfields.  */
-
-#ifdef __cplusplus
-#define ENUM_BITFIELD(TYPE) enum TYPE
-#elif (GCC_VERSION > 2000)
-#define ENUM_BITFIELD(TYPE) __extension__ enum TYPE
-#else
-#define ENUM_BITFIELD(TYPE) unsigned int
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* ansidecl.h	*/
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/attribs.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/attribs.h
deleted file mode 100644
index 421110d..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/attribs.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Declarations and definitions dealing with attribute handling.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_ATTRIBS_H
-#define GCC_ATTRIBS_H
-
-extern const struct attribute_spec *lookup_attribute_spec (const_tree);
-extern void init_attributes (void);
-
-/* Process the attributes listed in ATTRIBUTES and install them in *NODE,
-   which is either a DECL (including a TYPE_DECL) or a TYPE.  If a DECL,
-   it should be modified in place; if a TYPE, a copy should be created
-   unless ATTR_FLAG_TYPE_IN_PLACE is set in FLAGS.  FLAGS gives further
-   information, in the form of a bitwise OR of flags in enum attribute_flags
-   from tree.h.  Depending on these flags, some attributes may be
-   returned to be applied at a later stage (for example, to apply
-   a decl attribute to the declaration rather than to its type).  */
-extern tree decl_attributes (tree *, tree, int);
-
-extern bool cxx11_attribute_p (const_tree);
-extern tree get_attribute_name (const_tree);
-extern void apply_tm_attr (tree, tree);
-
-#endif // GCC_ATTRIBS_H
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/auto-host.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/auto-host.h
deleted file mode 100644
index 7203a4a..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/auto-host.h
+++ /dev/null
@@ -1,2112 +0,0 @@
-/* auto-host.h.  Generated from config.in by configure.  */
-/* config.in.  Generated from configure.ac by autoheader.  */
-
-/* Define if building universal (internal helper macro) */
-#ifndef USED_FOR_TARGET
-/* #undef AC_APPLE_UNIVERSAL_BUILD */
-#endif
-
-
-/* Define as the number of bits in a byte, if `limits.h' doesn't. */
-#ifndef USED_FOR_TARGET
-/* #undef CHAR_BIT */
-#endif
-
-
-/* Define 0/1 to force the choice for exception handling model. */
-#ifndef USED_FOR_TARGET
-/* #undef CONFIG_SJLJ_EXCEPTIONS */
-#endif
-
-
-/* Define to enable the use of a default assembler. */
-#ifndef USED_FOR_TARGET
-/* #undef DEFAULT_ASSEMBLER */
-#endif
-
-
-/* Define to enable the use of a default linker. */
-#ifndef USED_FOR_TARGET
-/* #undef DEFAULT_LINKER */
-#endif
-
-
-/* Define if you want to use __cxa_atexit, rather than atexit, to register C++
-   destructors for local statics and global objects. This is essential for
-   fully standards-compliant handling of destructors, but requires
-   __cxa_atexit in libc. */
-#ifndef USED_FOR_TARGET
-/* #undef DEFAULT_USE_CXA_ATEXIT */
-#endif
-
-
-/* Define if you want assertions enabled. This is a cheap check. */
-#ifndef USED_FOR_TARGET
-#define ENABLE_ASSERT_CHECKING 1
-#endif
-
-
-/* Define if you want more run-time sanity checks. This one gets a grab bag of
-   miscellaneous but relatively cheap checks. */
-#ifndef USED_FOR_TARGET
-/* #undef ENABLE_CHECKING */
-#endif
-
-
-/* Define to 1 to specify that we are using the BID decimal floating point
-   format instead of DPD */
-#ifndef USED_FOR_TARGET
-#define ENABLE_DECIMAL_BID_FORMAT 0
-#endif
-
-
-/* Define to 1 to enable decimal float extension to C. */
-#ifndef USED_FOR_TARGET
-#define ENABLE_DECIMAL_FLOAT 0
-#endif
-
-
-/* Define if you want more run-time sanity checks for dataflow. */
-#ifndef USED_FOR_TARGET
-/* #undef ENABLE_DF_CHECKING */
-#endif
-
-
-/* Define to 1 to enable fixed-point arithmetic extension to C. */
-#ifndef USED_FOR_TARGET
-#define ENABLE_FIXED_POINT 1
-#endif
-
-
-/* Define if you want fold checked that it never destructs its argument. This
-   is quite expensive. */
-#ifndef USED_FOR_TARGET
-/* #undef ENABLE_FOLD_CHECKING */
-#endif
-
-
-/* Define if you want the garbage collector to operate in maximally paranoid
-   mode, validating the entire heap and collecting garbage at every
-   opportunity. This is extremely expensive. */
-#ifndef USED_FOR_TARGET
-/* #undef ENABLE_GC_ALWAYS_COLLECT */
-#endif
-
-
-/* Define if you want the garbage collector to do object poisoning and other
-   memory allocation checks. This is quite expensive. */
-#ifndef USED_FOR_TARGET
-/* #undef ENABLE_GC_CHECKING */
-#endif
-
-
-/* Define if you want operations on GIMPLE (the basic data structure of the
-   high-level optimizers) to be checked for dynamic type safety at runtime.
-   This is moderately expensive. */
-#ifndef USED_FOR_TARGET
-/* #undef ENABLE_GIMPLE_CHECKING */
-#endif
-
-
-/* Define if gcc should always pass --build-id to linker. */
-#ifndef USED_FOR_TARGET
-/* #undef ENABLE_LD_BUILDID */
-#endif
-
-
-/* Define to 1 to enable libquadmath support */
-#ifndef USED_FOR_TARGET
-#define ENABLE_LIBQUADMATH_SUPPORT 1
-#endif
-
-
-/* Define to enable LTO support. */
-#ifndef USED_FOR_TARGET
-#define ENABLE_LTO 1
-#endif
-
-
-/* Define to 1 if translation of program messages to the user's native
-   language is requested. */
-#ifndef USED_FOR_TARGET
-#define ENABLE_NLS 1
-#endif
-
-
-/* Define to enable plugin support. */
-#ifndef USED_FOR_TARGET
-#define ENABLE_PLUGIN 1
-#endif
-
-
-/* Define if you want all operations on RTL (the basic data structure of the
-   optimizer and back end) to be checked for dynamic type safety at runtime.
-   This is quite expensive. */
-#ifndef USED_FOR_TARGET
-/* #undef ENABLE_RTL_CHECKING */
-#endif
-
-
-/* Define if you want RTL flag accesses to be checked against the RTL codes
-   that are supported for each access macro. This is relatively cheap. */
-#ifndef USED_FOR_TARGET
-/* #undef ENABLE_RTL_FLAG_CHECKING */
-#endif
-
-
-/* Define if you want runtime assertions enabled. This is a cheap check. */
-#define ENABLE_RUNTIME_CHECKING 1
-
-/* Define if you want all operations on trees (the basic data structure of the
-   front ends) to be checked for dynamic type safety at runtime. This is
-   moderately expensive. The tree browser debugging routines will also be
-   enabled by this option. */
-#ifndef USED_FOR_TARGET
-/* #undef ENABLE_TREE_CHECKING */
-#endif
-
-
-/* Define if you want all gimple types to be verified after gimplifiation.
-   This is cheap. */
-#ifndef USED_FOR_TARGET
-/* #undef ENABLE_TYPES_CHECKING */
-#endif
-
-
-/* Define if you want to run subprograms and generated programs through
-   valgrind (a memory checker). This is extremely expensive. */
-#ifndef USED_FOR_TARGET
-/* #undef ENABLE_VALGRIND_CHECKING */
-#endif
-
-
-/* Define to 1 if installation paths should be looked up in the Windows
-   Registry. Ignored on non-Windows hosts. */
-#ifndef USED_FOR_TARGET
-/* #undef ENABLE_WIN32_REGISTRY */
-#endif
-
-
-/* Define to the name of a file containing a list of extra machine modes for
-   this architecture. */
-#ifndef USED_FOR_TARGET
-#define EXTRA_MODES_FILE "config/arm/arm-modes.def"
-#endif
-
-
-/* Define to enable detailed memory allocation stats gathering. */
-#ifndef USED_FOR_TARGET
-#define GATHER_STATISTICS 0
-#endif
-
-
-/* Define to 1 if `TIOCGWINSZ' requires <sys/ioctl.h>. */
-#ifndef USED_FOR_TARGET
-#define GWINSZ_IN_SYS_IOCTL 1
-#endif
-
-
-/* mcontext_t fields start with __ */
-#ifndef USED_FOR_TARGET
-/* #undef HAS_MCONTEXT_T_UNDERSCORES */
-#endif
-
-
-/* Define if your assembler supports cmpb. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_CMPB */
-#endif
-
-
-/* Define if your assembler supports the DCI/ICI instructions. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_DCI */
-#endif
-
-
-/* Define if your assembler supports the --debug-prefix-map option. */
-#ifndef USED_FOR_TARGET
-#define HAVE_AS_DEBUG_PREFIX_MAP 1
-#endif
-
-
-/* Define if your assembler supports DFP instructions. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_DFP */
-#endif
-
-
-/* Define if your assembler supports DSPR1 mult. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_DSPR1_MULT */
-#endif
-
-
-/* Define if your assembler supports .dtprelword. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_DTPRELWORD */
-#endif
-
-
-/* Define if your assembler supports dwarf2 .file/.loc directives, and
-   preserves file table indices exactly as given. */
-#ifndef USED_FOR_TARGET
-#define HAVE_AS_DWARF2_DEBUG_LINE 1
-#endif
-
-
-/* Define if your assembler supports explicit relocations. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_EXPLICIT_RELOCS */
-#endif
-
-
-/* Define if your assembler supports FMAF, HPC, and VIS 3.0 instructions. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_FMAF_HPC_VIS3 */
-#endif
-
-
-/* Define if your assembler supports fprnd. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_FPRND */
-#endif
-
-
-/* Define if your assembler supports the --gdwarf2 option. */
-#ifndef USED_FOR_TARGET
-#define HAVE_AS_GDWARF2_DEBUG_FLAG 1
-#endif
-
-
-/* Define if your assembler supports .gnu_attribute. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_GNU_ATTRIBUTE */
-#endif
-
-
-/* Define true if the assembler supports '.long foo@GOTOFF'. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_GOTOFF_IN_DATA */
-#endif
-
-
-/* Define if your assembler supports the --gstabs option. */
-#ifndef USED_FOR_TARGET
-#define HAVE_AS_GSTABS_DEBUG_FLAG 1
-#endif
-
-
-/* Define if your assembler supports the Sun syntax for cmov. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_IX86_CMOV_SUN_SYNTAX */
-#endif
-
-
-/* Define if your assembler supports the subtraction of symbols in different
-   sections. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_IX86_DIFF_SECT_DELTA */
-#endif
-
-
-/* Define if your assembler supports the ffreep mnemonic. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_IX86_FFREEP */
-#endif
-
-
-/* Define if your assembler uses fildq and fistq mnemonics. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_IX86_FILDQ */
-#endif
-
-
-/* Define if your assembler uses filds and fists mnemonics. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_IX86_FILDS */
-#endif
-
-
-/* Define if your assembler supports HLE prefixes. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_IX86_HLE */
-#endif
-
-
-/* Define if your assembler supports interunit movq mnemonic. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_IX86_INTERUNIT_MOVQ */
-#endif
-
-
-/* Define if your assembler supports the .quad directive. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_IX86_QUAD */
-#endif
-
-
-/* Define if the assembler supports 'rep <insn>, lock <insn>'. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_IX86_REP_LOCK_PREFIX */
-#endif
-
-
-/* Define if your assembler supports the sahf mnemonic in 64bit mode. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_IX86_SAHF */
-#endif
-
-
-/* Define if your assembler supports the swap suffix. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_IX86_SWAP */
-#endif
-
-
-/* Define if your assembler and linker support @tlsgdplt. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_IX86_TLSGDPLT */
-#endif
-
-
-/* Define to 1 if your assembler and linker support @tlsldm. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_IX86_TLSLDM */
-#endif
-
-
-/* Define to 1 if your assembler and linker support @tlsldmplt. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_IX86_TLSLDMPLT */
-#endif
-
-
-/* Define if your assembler supports the 'ud2' mnemonic. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_IX86_UD2 */
-#endif
-
-
-/* Define if your assembler supports the lituse_jsrdirect relocation. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_JSRDIRECT_RELOCS */
-#endif
-
-
-/* Define if your assembler supports .sleb128 and .uleb128. */
-#ifndef USED_FOR_TARGET
-#define HAVE_AS_LEB128 1
-#endif
-
-
-/* Define if your assembler supports LEON instructions. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_LEON */
-#endif
-
-
-/* Define if the assembler won't complain about a line such as # 0 "" 2. */
-#ifndef USED_FOR_TARGET
-#define HAVE_AS_LINE_ZERO 1
-#endif
-
-
-/* Define if your assembler supports ltoffx and ldxmov relocations. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_LTOFFX_LDXMOV_RELOCS */
-#endif
-
-
-/* Define if your assembler supports LWSYNC instructions. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_LWSYNC */
-#endif
-
-
-/* Define if your assembler supports the -mabi option. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_MABI_OPTION */
-#endif
-
-
-/* Define if your assembler supports mfcr field. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_MFCRF */
-#endif
-
-
-/* Define if your assembler supports mffgpr and mftgpr. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_MFPGPR */
-#endif
-
-
-/* Define if the assembler understands -mnan=. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_NAN */
-#endif
-
-
-/* Define if your assembler supports the -no-mul-bug-abort option. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_NO_MUL_BUG_ABORT_OPTION */
-#endif
-
-
-/* Define if the assembler understands -mno-shared. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_NO_SHARED */
-#endif
-
-
-/* Define if your assembler supports offsetable %lo(). */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_OFFSETABLE_LO10 */
-#endif
-
-
-/* Define if your assembler supports popcntb field. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_POPCNTB */
-#endif
-
-
-/* Define if your assembler supports POPCNTD instructions. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_POPCNTD */
-#endif
-
-
-/* Define if your assembler supports POWER8 instructions. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_POWER8 */
-#endif
-
-
-/* Define if your assembler supports .ref */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_REF */
-#endif
-
-
-/* Define if your assembler supports .register. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_REGISTER_PSEUDO_OP */
-#endif
-
-
-/* Define if your assembler supports R_PPC_REL16 relocs. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_REL16 */
-#endif
-
-
-/* Define if your assembler supports -relax option. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_RELAX_OPTION */
-#endif
-
-
-/* Define if your assembler supports SPARC4 instructions. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_SPARC4 */
-#endif
-
-
-/* Define if your assembler and linker support GOTDATA_OP relocs. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_SPARC_GOTDATA_OP */
-#endif
-
-
-/* Define to 1 if your assembler supports #nobits, 0 otherwise. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_SPARC_NOBITS */
-#endif
-
-
-/* Define if your assembler and linker support unaligned PC relative relocs.
-   */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_SPARC_UA_PCREL */
-#endif
-
-
-/* Define if your assembler and linker support unaligned PC relative relocs
-   against hidden symbols. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_SPARC_UA_PCREL_HIDDEN */
-#endif
-
-
-/* Define if your assembler and linker support thread-local storage. */
-#ifndef USED_FOR_TARGET
-#define HAVE_AS_TLS 1
-#endif
-
-
-/* Define if your assembler supports arg info for __tls_get_addr. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_TLS_MARKERS */
-#endif
-
-
-/* Define if your assembler supports VSX instructions. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_AS_VSX */
-#endif
-
-
-/* Define to 1 if you have the `atoll' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_ATOLL 1
-#endif
-
-
-/* Define to 1 if you have the `atoq' function. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_ATOQ */
-#endif
-
-
-/* Define to 1 if you have the `clearerr_unlocked' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_CLEARERR_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if you have the `clock' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_CLOCK 1
-#endif
-
-
-/* Define if <time.h> defines clock_t. */
-#ifndef USED_FOR_TARGET
-#define HAVE_CLOCK_T 1
-#endif
-
-
-/* Define 0/1 if your assembler and linker support COMDAT groups. */
-#ifndef USED_FOR_TARGET
-#define HAVE_COMDAT_GROUP 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'abort', otherwise define to 0.
-   */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_ABORT 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'asprintf', otherwise define to
-   0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_ASPRINTF 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'atof', otherwise define to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_ATOF 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'atol', otherwise define to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_ATOL 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'basename', otherwise define to
-   0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_BASENAME 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'calloc', otherwise define to 0.
-   */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_CALLOC 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'clearerr_unlocked', otherwise
-   define to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_CLEARERR_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'clock', otherwise define to 0.
-   */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_CLOCK 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'errno', otherwise define to 0.
-   */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_ERRNO 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'feof_unlocked', otherwise define
-   to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_FEOF_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'ferror_unlocked', otherwise
-   define to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_FERROR_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'fflush_unlocked', otherwise
-   define to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_FFLUSH_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'ffs', otherwise define to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_FFS 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'fgetc_unlocked', otherwise
-   define to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_FGETC_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'fgets_unlocked', otherwise
-   define to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_FGETS_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'fileno_unlocked', otherwise
-   define to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_FILENO_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'fprintf_unlocked', otherwise
-   define to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_FPRINTF_UNLOCKED 0
-#endif
-
-
-/* Define to 1 if we found a declaration for 'fputc_unlocked', otherwise
-   define to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_FPUTC_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'fputs_unlocked', otherwise
-   define to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_FPUTS_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'fread_unlocked', otherwise
-   define to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_FREAD_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'free', otherwise define to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_FREE 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'fwrite_unlocked', otherwise
-   define to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_FWRITE_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'getchar_unlocked', otherwise
-   define to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_GETCHAR_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'getcwd', otherwise define to 0.
-   */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_GETCWD 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'getc_unlocked', otherwise define
-   to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_GETC_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'getenv', otherwise define to 0.
-   */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_GETENV 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'getopt', otherwise define to 0.
-   */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_GETOPT 0
-#endif
-
-
-/* Define to 1 if we found a declaration for 'getpagesize', otherwise define
-   to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_GETPAGESIZE 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'getrlimit', otherwise define to
-   0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_GETRLIMIT 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'getrusage', otherwise define to
-   0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_GETRUSAGE 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'getwd', otherwise define to 0.
-   */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_GETWD 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'ldgetname', otherwise define to
-   0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_LDGETNAME 0
-#endif
-
-
-/* Define to 1 if we found a declaration for 'madvise', otherwise define to 0.
-   */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_MADVISE 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'malloc', otherwise define to 0.
-   */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_MALLOC 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'putchar_unlocked', otherwise
-   define to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_PUTCHAR_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'putc_unlocked', otherwise define
-   to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_PUTC_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'realloc', otherwise define to 0.
-   */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_REALLOC 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'sbrk', otherwise define to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_SBRK 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'setrlimit', otherwise define to
-   0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_SETRLIMIT 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'sigaltstack', otherwise define
-   to 0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_SIGALTSTACK 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'snprintf', otherwise define to
-   0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_SNPRINTF 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'stpcpy', otherwise define to 0.
-   */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_STPCPY 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'strsignal', otherwise define to
-   0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_STRSIGNAL 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'strstr', otherwise define to 0.
-   */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_STRSTR 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'strverscmp', otherwise define to
-   0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_STRVERSCMP 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'times', otherwise define to 0.
-   */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_TIMES 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'vasprintf', otherwise define to
-   0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_VASPRINTF 1
-#endif
-
-
-/* Define to 1 if we found a declaration for 'vsnprintf', otherwise define to
-   0. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DECL_VSNPRINTF 1
-#endif
-
-
-/* Define to 1 if you have the <direct.h> header file. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_DIRECT_H */
-#endif
-
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_DLFCN_H 1
-#endif
-
-
-/* Define to 1 if you have the <ext/hash_map> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_EXT_HASH_MAP 1
-#endif
-
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_FCNTL_H 1
-#endif
-
-
-/* Define to 1 if you have the `feof_unlocked' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_FEOF_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if you have the `ferror_unlocked' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_FERROR_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if you have the `fflush_unlocked' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_FFLUSH_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if you have the `fgetc_unlocked' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_FGETC_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if you have the `fgets_unlocked' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_FGETS_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if you have the `fileno_unlocked' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_FILENO_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if you have the `fork' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_FORK 1
-#endif
-
-
-/* Define to 1 if you have the `fprintf_unlocked' function. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_FPRINTF_UNLOCKED */
-#endif
-
-
-/* Define to 1 if you have the `fputc_unlocked' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_FPUTC_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if you have the `fputs_unlocked' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_FPUTS_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if you have the `fread_unlocked' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_FREAD_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if you have the `fwrite_unlocked' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_FWRITE_UNLOCKED 1
-#endif
-
-
-/* Define if your assembler supports specifying the alignment of objects
-   allocated using the GAS .comm command. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_GAS_ALIGNED_COMM */
-#endif
-
-
-/* Define if your assembler supports .balign and .p2align. */
-#ifndef USED_FOR_TARGET
-#define HAVE_GAS_BALIGN_AND_P2ALIGN 1
-#endif
-
-
-/* Define 0/1 if your assembler supports CFI directives. */
-#define HAVE_GAS_CFI_DIRECTIVE 1
-
-/* Define 0/1 if your assembler supports .cfi_personality. */
-#define HAVE_GAS_CFI_PERSONALITY_DIRECTIVE 1
-
-/* Define 0/1 if your assembler supports .cfi_sections. */
-#define HAVE_GAS_CFI_SECTIONS_DIRECTIVE 1
-
-/* Define if your assembler supports the .loc discriminator sub-directive. */
-#ifndef USED_FOR_TARGET
-#define HAVE_GAS_DISCRIMINATOR 1
-#endif
-
-
-/* Define if your assembler supports @gnu_unique_object. */
-#ifndef USED_FOR_TARGET
-#define HAVE_GAS_GNU_UNIQUE_OBJECT 1
-#endif
-
-
-/* Define if your assembler and linker support .hidden. */
-#define HAVE_GAS_HIDDEN 1
-
-/* Define if your assembler supports .lcomm with an alignment field. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_GAS_LCOMM_WITH_ALIGNMENT */
-#endif
-
-
-/* Define if your assembler supports .literal16. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_GAS_LITERAL16 */
-#endif
-
-
-/* Define if your assembler supports specifying the maximum number of bytes to
-   skip when using the GAS .p2align command. */
-#ifndef USED_FOR_TARGET
-#define HAVE_GAS_MAX_SKIP_P2ALIGN 1
-#endif
-
-
-/* Define if your assembler supports the .set micromips directive */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_GAS_MICROMIPS */
-#endif
-
-
-/* Define if your assembler supports .nsubspa comdat option. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_GAS_NSUBSPA_COMDAT */
-#endif
-
-
-/* Define if your assembler and linker support 32-bit section relative relocs
-   via '.secrel32 label'. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_GAS_PE_SECREL32_RELOC */
-#endif
-
-
-/* Define if your assembler supports specifying the section flag e. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_GAS_SECTION_EXCLUDE */
-#endif
-
-
-/* Define 0/1 if your assembler supports marking sections with SHF_MERGE flag.
-   */
-#ifndef USED_FOR_TARGET
-#define HAVE_GAS_SHF_MERGE 1
-#endif
-
-
-/* Define if your assembler supports .subsection and .subsection -1 starts
-   emitting at the beginning of your section. */
-#ifndef USED_FOR_TARGET
-#define HAVE_GAS_SUBSECTION_ORDERING 1
-#endif
-
-
-/* Define if your assembler supports .weak. */
-#ifndef USED_FOR_TARGET
-#define HAVE_GAS_WEAK 1
-#endif
-
-
-/* Define if your assembler supports .weakref. */
-#ifndef USED_FOR_TARGET
-#define HAVE_GAS_WEAKREF 1
-#endif
-
-
-/* Define to 1 if you have the `getchar_unlocked' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_GETCHAR_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if you have the `getc_unlocked' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_GETC_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if you have the `getrlimit' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_GETRLIMIT 1
-#endif
-
-
-/* Define to 1 if you have the `getrusage' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_GETRUSAGE 1
-#endif
-
-
-/* Define to 1 if you have the `gettimeofday' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_GETTIMEOFDAY 1
-#endif
-
-
-/* Define to 1 if using GNU as. */
-#ifndef USED_FOR_TARGET
-#define HAVE_GNU_AS 1
-#endif
-
-
-/* Define if your system supports gnu indirect functions. */
-#ifndef USED_FOR_TARGET
-#define HAVE_GNU_INDIRECT_FUNCTION 0
-#endif
-
-
-/* Define to 1 if using GNU ld. */
-#ifndef USED_FOR_TARGET
-#define HAVE_GNU_LD 1
-#endif
-
-
-/* Define if you have the iconv() function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_ICONV 1
-#endif
-
-
-/* Define to 1 if you have the <iconv.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_ICONV_H 1
-#endif
-
-
-/* Define .init_array/.fini_array sections are available and working. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_INITFINI_ARRAY_SUPPORT */
-#endif
-
-
-/* Define to 1 if the system has the type `intmax_t'. */
-#ifndef USED_FOR_TARGET
-#define HAVE_INTMAX_T 1
-#endif
-
-
-/* Define to 1 if the system has the type `intptr_t'. */
-#ifndef USED_FOR_TARGET
-#define HAVE_INTPTR_T 1
-#endif
-
-
-/* Define if you have a working <inttypes.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_INTTYPES_H 1
-#endif
-
-
-/* Define to 1 if you have the `kill' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_KILL 1
-#endif
-
-
-/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
-#ifndef USED_FOR_TARGET
-#define HAVE_LANGINFO_CODESET 1
-#endif
-
-
-/* Define to 1 if you have the <langinfo.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_LANGINFO_H 1
-#endif
-
-
-/* Define if your <locale.h> file defines LC_MESSAGES. */
-#ifndef USED_FOR_TARGET
-#define HAVE_LC_MESSAGES 1
-#endif
-
-
-/* Define to 1 if you have the <ldfcn.h> header file. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_LDFCN_H */
-#endif
-
-
-/* Define if your linker supports --as-needed/--no-as-needed or equivalent
-   options. */
-#ifndef USED_FOR_TARGET
-#define HAVE_LD_AS_NEEDED 1
-#endif
-
-
-/* Define if your linker supports --build-id. */
-#ifndef USED_FOR_TARGET
-#define HAVE_LD_BUILDID 1
-#endif
-
-
-/* Define if the linker supports clearing hardware capabilities via mapfile.
-   */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_LD_CLEARCAP */
-#endif
-
-
-/* Define if your linker supports --demangle option. */
-#ifndef USED_FOR_TARGET
-#define HAVE_LD_DEMANGLE 1
-#endif
-
-
-/* Define 0/1 if your linker supports CIE v3 in .eh_frame. */
-#ifndef USED_FOR_TARGET
-#define HAVE_LD_EH_FRAME_CIEV3 1
-#endif
-
-
-/* Define if your linker supports .eh_frame_hdr. */
-#define HAVE_LD_EH_FRAME_HDR 1
-
-/* Define if your linker supports garbage collection of sections in presence
-   of EH frames. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_LD_EH_GC_SECTIONS */
-#endif
-
-
-/* Define if your linker has buggy garbage collection of sections support when
-   .text.startup.foo like sections are used. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_LD_EH_GC_SECTIONS_BUG */
-#endif
-
-
-/* Define if your PowerPC64 linker supports a large TOC. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_LD_LARGE_TOC */
-#endif
-
-
-/* Define if your PowerPC64 linker only needs function descriptor syms. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_LD_NO_DOT_SYMS */
-#endif
-
-
-/* Define if your linker can relax absolute .eh_frame personality pointers
-   into PC-relative form. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_LD_PERSONALITY_RELAXATION */
-#endif
-
-
-/* Define if your linker supports -pie option. */
-#ifndef USED_FOR_TARGET
-#define HAVE_LD_PIE 1
-#endif
-
-
-/* Define if your linker links a mix of read-only and read-write sections into
-   a read-write section. */
-#ifndef USED_FOR_TARGET
-#define HAVE_LD_RO_RW_SECTION_MIXING 1
-#endif
-
-
-/* Define if your linker supports the *_sol2 emulations. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_LD_SOL2_EMULATION */
-#endif
-
-
-/* Define if your linker supports -Bstatic/-Bdynamic or equivalent options. */
-#ifndef USED_FOR_TARGET
-#define HAVE_LD_STATIC_DYNAMIC 1
-#endif
-
-
-/* Define if your linker supports --sysroot. */
-#ifndef USED_FOR_TARGET
-#define HAVE_LD_SYSROOT 1
-#endif
-
-
-/* Define to 1 if you have the <limits.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_LIMITS_H 1
-#endif
-
-
-/* Define to 1 if you have the <locale.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_LOCALE_H 1
-#endif
-
-
-/* Define to 1 if the system has the type `long long'. */
-#ifndef USED_FOR_TARGET
-#define HAVE_LONG_LONG 1
-#endif
-
-
-/* Define to 1 if the system has the type `long long int'. */
-#ifndef USED_FOR_TARGET
-#define HAVE_LONG_LONG_INT 1
-#endif
-
-
-/* Define to the level of your linker's plugin support. */
-#ifndef USED_FOR_TARGET
-#define HAVE_LTO_PLUGIN 2
-#endif
-
-
-/* Define to 1 if you have the `madvise' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_MADVISE 1
-#endif
-
-
-/* Define to 1 if you have the <malloc.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_MALLOC_H 1
-#endif
-
-
-/* Define to 1 if you have the `mbstowcs' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_MBSTOWCS 1
-#endif
-
-
-/* Define if valgrind's memcheck.h header is installed. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_MEMCHECK_H */
-#endif
-
-
-/* Define to 1 if you have the <memory.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_MEMORY_H 1
-#endif
-
-
-/* Define to 1 if you have the `mmap' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_MMAP 1
-#endif
-
-
-/* Define if mmap with MAP_ANON(YMOUS) works. */
-#ifndef USED_FOR_TARGET
-#define HAVE_MMAP_ANON 1
-#endif
-
-
-/* Define if mmap of /dev/zero works. */
-#ifndef USED_FOR_TARGET
-#define HAVE_MMAP_DEV_ZERO 1
-#endif
-
-
-/* Define if read-only mmap of a plain file works. */
-#ifndef USED_FOR_TARGET
-#define HAVE_MMAP_FILE 1
-#endif
-
-
-/* Define to 1 if you have the `nl_langinfo' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_NL_LANGINFO 1
-#endif
-
-
-/* Define to 1 if you have the `putchar_unlocked' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_PUTCHAR_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if you have the `putc_unlocked' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_PUTC_UNLOCKED 1
-#endif
-
-
-/* Define to 1 if you have the `setlocale' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_SETLOCALE 1
-#endif
-
-
-/* Define to 1 if you have the `setrlimit' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_SETRLIMIT 1
-#endif
-
-
-/* Define to 1 if you have the <stddef.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_STDDEF_H 1
-#endif
-
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_STDINT_H 1
-#endif
-
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_STDLIB_H 1
-#endif
-
-
-/* Define to 1 if you have the <strings.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_STRINGS_H 1
-#endif
-
-
-/* Define to 1 if you have the <string.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_STRING_H 1
-#endif
-
-
-/* Define to 1 if you have the `strsignal' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_STRSIGNAL 1
-#endif
-
-
-/* Define if <sys/times.h> defines struct tms. */
-#ifndef USED_FOR_TARGET
-#define HAVE_STRUCT_TMS 1
-#endif
-
-
-/* Define to 1 if you have the `sysconf' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_SYSCONF 1
-#endif
-
-
-/* Define to 1 if you have the <sys/file.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_SYS_FILE_H 1
-#endif
-
-
-/* Define to 1 if you have the <sys/mman.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_SYS_MMAN_H 1
-#endif
-
-
-/* Define to 1 if you have the <sys/param.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_SYS_PARAM_H 1
-#endif
-
-
-/* Define to 1 if you have the <sys/resource.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_SYS_RESOURCE_H 1
-#endif
-
-
-/* Define if your target C library provides sys/sdt.h */
-/* #undef HAVE_SYS_SDT_H */
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_SYS_STAT_H 1
-#endif
-
-
-/* Define to 1 if you have the <sys/times.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_SYS_TIMES_H 1
-#endif
-
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_SYS_TIME_H 1
-#endif
-
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_SYS_TYPES_H 1
-#endif
-
-
-/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
-#ifndef USED_FOR_TARGET
-#define HAVE_SYS_WAIT_H 1
-#endif
-
-
-/* Define to 1 if you have the `times' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_TIMES 1
-#endif
-
-
-/* Define to 1 if you have the <time.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_TIME_H 1
-#endif
-
-
-/* Define to 1 if you have the <tr1/unordered_map> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_TR1_UNORDERED_MAP 1
-#endif
-
-
-/* Define to 1 if the system has the type `uintmax_t'. */
-#ifndef USED_FOR_TARGET
-#define HAVE_UINTMAX_T 1
-#endif
-
-
-/* Define to 1 if the system has the type `uintptr_t'. */
-#ifndef USED_FOR_TARGET
-#define HAVE_UINTPTR_T 1
-#endif
-
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_UNISTD_H 1
-#endif
-
-
-/* Define to 1 if you have the <unordered_map> header file. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_UNORDERED_MAP */
-#endif
-
-
-/* Define to 1 if the system has the type `unsigned long long int'. */
-#ifndef USED_FOR_TARGET
-#define HAVE_UNSIGNED_LONG_LONG_INT 1
-#endif
-
-
-/* Define if valgrind's valgrind/memcheck.h header is installed. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_VALGRIND_MEMCHECK_H */
-#endif
-
-
-/* Define to 1 if you have the `vfork' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_VFORK 1
-#endif
-
-
-/* Define to 1 if you have the <vfork.h> header file. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_VFORK_H */
-#endif
-
-
-/* Define to 1 if you have the <wchar.h> header file. */
-#ifndef USED_FOR_TARGET
-#define HAVE_WCHAR_H 1
-#endif
-
-
-/* Define to 1 if you have the `wcswidth' function. */
-#ifndef USED_FOR_TARGET
-#define HAVE_WCSWIDTH 1
-#endif
-
-
-/* Define to 1 if `fork' works. */
-#ifndef USED_FOR_TARGET
-#define HAVE_WORKING_FORK 1
-#endif
-
-
-/* Define this macro if mbstowcs does not crash when its first argument is
-   NULL. */
-#ifndef USED_FOR_TARGET
-#define HAVE_WORKING_MBSTOWCS 1
-#endif
-
-
-/* Define to 1 if `vfork' works. */
-#ifndef USED_FOR_TARGET
-#define HAVE_WORKING_VFORK 1
-#endif
-
-
-/* Define to 1 if the system has the type `__int64'. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE___INT64 */
-#endif
-
-
-/* Define if cloog is in use. */
-#ifndef USED_FOR_TARGET
-/* #undef HAVE_cloog */
-#endif
-
-
-/* Define if F_SETLKW supported by fcntl. */
-#ifndef USED_FOR_TARGET
-#define HOST_HAS_F_SETLKW 1
-#endif
-
-
-/* Define as const if the declaration of iconv() needs const. */
-#ifndef USED_FOR_TARGET
-#define ICONV_CONST 
-#endif
-
-
-/* Define to the linker option to ignore unused dependencies. */
-#ifndef USED_FOR_TARGET
-#define LD_AS_NEEDED_OPTION "--as-needed"
-#endif
-
-
-/* Define to the linker option to enable use of shared objects. */
-#ifndef USED_FOR_TARGET
-#define LD_DYNAMIC_OPTION "-Bdynamic"
-#endif
-
-
-/* Define to the linker option to keep unused dependencies. */
-#ifndef USED_FOR_TARGET
-#define LD_NO_AS_NEEDED_OPTION "--no-as-needed"
-#endif
-
-
-/* Define to the linker option to disable use of shared objects. */
-#ifndef USED_FOR_TARGET
-#define LD_STATIC_OPTION "-Bstatic"
-#endif
-
-
-/* Define to the library containing __tls_get_addr/___tls_get_addr. */
-#ifndef USED_FOR_TARGET
-/* #undef LIB_TLS_SPEC */
-#endif
-
-
-/* The linker hash style */
-#ifndef USED_FOR_TARGET
-/* #undef LINKER_HASH_STYLE */
-#endif
-
-
-/* Define to the name of the LTO plugin DSO that must be passed to the
-   linker's -plugin=LIB option. */
-#ifndef USED_FOR_TARGET
-#define LTOPLUGINSONAME "liblto_plugin.so"
-#endif
-
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
-#ifndef USED_FOR_TARGET
-#define LT_OBJDIR ".libs/"
-#endif
-
-
-/* Define if host mkdir takes a single argument. */
-#ifndef USED_FOR_TARGET
-/* #undef MKDIR_TAKES_ONE_ARG */
-#endif
-
-
-/* Define to 1 if HOST_WIDE_INT must be 64 bits wide (see hwint.h). */
-#ifndef USED_FOR_TARGET
-#define NEED_64BIT_HOST_WIDE_INT 1
-#endif
-
-
-/* Define to the address where bug reports for this package should be sent. */
-#ifndef USED_FOR_TARGET
-#define PACKAGE_BUGREPORT ""
-#endif
-
-
-/* Define to the full name of this package. */
-#ifndef USED_FOR_TARGET
-#define PACKAGE_NAME ""
-#endif
-
-
-/* Define to the full name and version of this package. */
-#ifndef USED_FOR_TARGET
-#define PACKAGE_STRING ""
-#endif
-
-
-/* Define to the one symbol short name of this package. */
-#ifndef USED_FOR_TARGET
-#define PACKAGE_TARNAME ""
-#endif
-
-
-/* Define to the home page for this package. */
-#ifndef USED_FOR_TARGET
-#define PACKAGE_URL ""
-#endif
-
-
-/* Define to the version of this package. */
-#ifndef USED_FOR_TARGET
-#define PACKAGE_VERSION ""
-#endif
-
-
-/* Specify plugin linker */
-#ifndef USED_FOR_TARGET
-#define PLUGIN_LD_SUFFIX "ld"
-#endif
-
-
-/* Define to PREFIX/include if cpp should also search that directory. */
-#ifndef USED_FOR_TARGET
-/* #undef PREFIX_INCLUDE_DIR */
-#endif
-
-
-/* The size of `int', as computed by sizeof. */
-#ifndef USED_FOR_TARGET
-#define SIZEOF_INT 4
-#endif
-
-
-/* The size of `long', as computed by sizeof. */
-#ifndef USED_FOR_TARGET
-#define SIZEOF_LONG 8
-#endif
-
-
-/* The size of `long long', as computed by sizeof. */
-#ifndef USED_FOR_TARGET
-#define SIZEOF_LONG_LONG 8
-#endif
-
-
-/* The size of `short', as computed by sizeof. */
-#ifndef USED_FOR_TARGET
-#define SIZEOF_SHORT 2
-#endif
-
-
-/* The size of `void *', as computed by sizeof. */
-#ifndef USED_FOR_TARGET
-#define SIZEOF_VOID_P 8
-#endif
-
-
-/* The size of `__int64', as computed by sizeof. */
-#ifndef USED_FOR_TARGET
-/* #undef SIZEOF___INT64 */
-#endif
-
-
-/* Define to 1 if you have the ANSI C header files. */
-#ifndef USED_FOR_TARGET
-#define STDC_HEADERS 1
-#endif
-
-
-/* Define if you can safely include both <string.h> and <strings.h>. */
-#ifndef USED_FOR_TARGET
-#define STRING_WITH_STRINGS 1
-#endif
-
-
-/* Define if TFmode long double should be the default */
-#ifndef USED_FOR_TARGET
-/* #undef TARGET_DEFAULT_LONG_DOUBLE_128 */
-#endif
-
-
-/* Define if your target C library provides the `dl_iterate_phdr' function. */
-/* #undef TARGET_DL_ITERATE_PHDR */
-
-/* Define if your target C library provides stack protector support */
-#ifndef USED_FOR_TARGET
-#define TARGET_LIBC_PROVIDES_SSP 1
-#endif
-
-
-/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
-#ifndef USED_FOR_TARGET
-#define TIME_WITH_SYS_TIME 1
-#endif
-
-
-/* Define to the flag used to mark TLS sections if the default (`T') doesn't
-   work. */
-#ifndef USED_FOR_TARGET
-/* #undef TLS_SECTION_ASM_FLAG */
-#endif
-
-
-/* Define if your assembler mis-optimizes .eh_frame data. */
-#ifndef USED_FOR_TARGET
-/* #undef USE_AS_TRADITIONAL_FORMAT */
-#endif
-
-
-/* Define if you want to generate code by default that assumes that the Cygwin
-   DLL exports wrappers to support libstdc++ function replacement. */
-#ifndef USED_FOR_TARGET
-/* #undef USE_CYGWIN_LIBSTDCXX_WRAPPERS */
-#endif
-
-
-/* Define to 1 if the 'long long' (or '__int64') is wider than 'long' but
-   still efficiently supported by the host hardware. */
-#ifndef USED_FOR_TARGET
-/* #undef USE_LONG_LONG_FOR_WIDEST_FAST_INT */
-#endif
-
-
-/* Define if we should use leading underscore on 64 bit mingw targets */
-#ifndef USED_FOR_TARGET
-/* #undef USE_MINGW64_LEADING_UNDERSCORES */
-#endif
-
-
-/* Enable extensions on AIX 3, Interix.  */
-#ifndef _ALL_SOURCE
-# define _ALL_SOURCE 1
-#endif
-/* Enable GNU extensions on systems that have them.  */
-#ifndef _GNU_SOURCE
-# define _GNU_SOURCE 1
-#endif
-/* Enable threading extensions on Solaris.  */
-#ifndef _POSIX_PTHREAD_SEMANTICS
-# define _POSIX_PTHREAD_SEMANTICS 1
-#endif
-/* Enable extensions on HP NonStop.  */
-#ifndef _TANDEM_SOURCE
-# define _TANDEM_SOURCE 1
-#endif
-/* Enable general extensions on Solaris.  */
-#ifndef __EXTENSIONS__
-# define __EXTENSIONS__ 1
-#endif
-
-
-/* Define to be the last component of the Windows registry key under which to
-   look for installation paths. The full key used will be
-   HKEY_LOCAL_MACHINE/SOFTWARE/Free Software Foundation/{WIN32_REGISTRY_KEY}.
-   The default is the GCC version number. */
-#ifndef USED_FOR_TARGET
-/* #undef WIN32_REGISTRY_KEY */
-#endif
-
-
-/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
-   significant byte first (like Motorola and SPARC, unlike Intel). */
-#if defined AC_APPLE_UNIVERSAL_BUILD
-# if defined __BIG_ENDIAN__
-#  define WORDS_BIGENDIAN 1
-# endif
-#else
-# ifndef WORDS_BIGENDIAN
-/* #  undef WORDS_BIGENDIAN */
-# endif
-#endif
-
-/* Number of bits in a file offset, on hosts where this is settable. */
-#ifndef USED_FOR_TARGET
-/* #undef _FILE_OFFSET_BITS */
-#endif
-
-
-/* Define for large files, on AIX-style hosts. */
-#ifndef USED_FOR_TARGET
-/* #undef _LARGE_FILES */
-#endif
-
-
-/* Define to 1 if on MINIX. */
-#ifndef USED_FOR_TARGET
-/* #undef _MINIX */
-#endif
-
-
-/* Define to 2 if the system does not provide POSIX.1 features except with
-   this defined. */
-#ifndef USED_FOR_TARGET
-/* #undef _POSIX_1_SOURCE */
-#endif
-
-
-/* Define to 1 if you need to in order for `stat' and other things to work. */
-#ifndef USED_FOR_TARGET
-/* #undef _POSIX_SOURCE */
-#endif
-
-
-/* Define for Solaris 2.5.1 so the uint32_t typedef from <sys/synch.h>,
-   <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
-   #define below would cause a syntax error. */
-#ifndef USED_FOR_TARGET
-/* #undef _UINT32_T */
-#endif
-
-
-/* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>,
-   <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
-   #define below would cause a syntax error. */
-#ifndef USED_FOR_TARGET
-/* #undef _UINT64_T */
-#endif
-
-
-/* Define for Solaris 2.5.1 so the uint8_t typedef from <sys/synch.h>,
-   <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
-   #define below would cause a syntax error. */
-#ifndef USED_FOR_TARGET
-/* #undef _UINT8_T */
-#endif
-
-
-/* Define to `char *' if <sys/types.h> does not define. */
-#ifndef USED_FOR_TARGET
-/* #undef caddr_t */
-#endif
-
-
-/* Define to `__inline__' or `__inline' if that's what the C compiler
-   calls it, or to nothing if 'inline' is not supported under any name.  */
-#ifndef __cplusplus
-/* #undef inline */
-#endif
-
-/* Define to the type of a signed integer type of width exactly 16 bits if
-   such a type exists and the standard includes do not define it. */
-#ifndef USED_FOR_TARGET
-/* #undef int16_t */
-#endif
-
-
-/* Define to the type of a signed integer type of width exactly 32 bits if
-   such a type exists and the standard includes do not define it. */
-#ifndef USED_FOR_TARGET
-/* #undef int32_t */
-#endif
-
-
-/* Define to the type of a signed integer type of width exactly 64 bits if
-   such a type exists and the standard includes do not define it. */
-#ifndef USED_FOR_TARGET
-/* #undef int64_t */
-#endif
-
-
-/* Define to the type of a signed integer type of width exactly 8 bits if such
-   a type exists and the standard includes do not define it. */
-#ifndef USED_FOR_TARGET
-/* #undef int8_t */
-#endif
-
-
-/* Define to the widest signed integer type if <stdint.h> and <inttypes.h> do
-   not define. */
-#ifndef USED_FOR_TARGET
-/* #undef intmax_t */
-#endif
-
-
-/* Define to the type of a signed integer type wide enough to hold a pointer,
-   if such a type exists, and if the system does not define it. */
-#ifndef USED_FOR_TARGET
-/* #undef intptr_t */
-#endif
-
-
-/* Define to `int' if <sys/types.h> does not define. */
-#ifndef USED_FOR_TARGET
-/* #undef pid_t */
-#endif
-
-
-/* Define to `long' if <sys/resource.h> doesn't define. */
-#ifndef USED_FOR_TARGET
-/* #undef rlim_t */
-#endif
-
-
-/* Define to `int' if <sys/types.h> does not define. */
-#ifndef USED_FOR_TARGET
-/* #undef ssize_t */
-#endif
-
-
-/* Define to the type of an unsigned integer type of width exactly 16 bits if
-   such a type exists and the standard includes do not define it. */
-#ifndef USED_FOR_TARGET
-/* #undef uint16_t */
-#endif
-
-
-/* Define to the type of an unsigned integer type of width exactly 32 bits if
-   such a type exists and the standard includes do not define it. */
-#ifndef USED_FOR_TARGET
-/* #undef uint32_t */
-#endif
-
-
-/* Define to the type of an unsigned integer type of width exactly 64 bits if
-   such a type exists and the standard includes do not define it. */
-#ifndef USED_FOR_TARGET
-/* #undef uint64_t */
-#endif
-
-
-/* Define to the type of an unsigned integer type of width exactly 8 bits if
-   such a type exists and the standard includes do not define it. */
-#ifndef USED_FOR_TARGET
-/* #undef uint8_t */
-#endif
-
-
-/* Define to the widest unsigned integer type if <stdint.h> and <inttypes.h>
-   do not define. */
-#ifndef USED_FOR_TARGET
-/* #undef uintmax_t */
-#endif
-
-
-/* Define to the type of an unsigned integer type wide enough to hold a
-   pointer, if such a type exists, and if the system does not define it. */
-#ifndef USED_FOR_TARGET
-/* #undef uintptr_t */
-#endif
-
-
-/* Define as `fork' if `vfork' does not work. */
-#ifndef USED_FOR_TARGET
-/* #undef vfork */
-#endif
-
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/b-header-vars b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/b-header-vars
deleted file mode 100644
index 8d2f11a..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/b-header-vars
+++ /dev/null
@@ -1,88 +0,0 @@
-USER_H=unwind-arm-common.h
-HASHTAB_H=hashtab.h
-OBSTACK_H=obstack.h
-SPLAY_TREE_H=splay-tree.h
-XREGEX_H=xregex.h
-FNMATCH_H=fnmatch.h
-LINKER_PLUGIN_API_H=plugin-api.h
-BCONFIG_H=bconfig.h auto-host.h ansidecl.h
-CONFIG_H=config.h auto-host.h ansidecl.h
-TCONFIG_H=tconfig.h auto-host.h ansidecl.h
-TM_P_H=tm_p.h config/arm/arm-protos.h linux-protos.h tm-preds.h
-GTM_H=tm.h options.h config/dbxelf.h defaults.h insn-constants.h
-TM_H=tm.h options.h config/dbxelf.h arm-cores.def
-DUMPFILE_H=line-map.h dumpfile.h
-VEC_H=vec.h statistics.h ggc.h gtype-desc.h statistics.h
-HASH_TABLE_H=hashtab.h hash-table.h
-EXCEPT_H=except.h hashtab.h
-TARGET_H=tm.h options.h config/dbxelf.h arm-cores.def target.h target.def target-hooks-macros.h insn-modes.h insn-codes.h
-C_TARGET_H=c-family/c-target.h c-family/c-target.def target-hooks-macros.h
-COMMON_TARGET_H=common/common-target.h common-target.def target-hooks-macros.h
-MACHMODE_H=machmode.h mode-classes.def insn-modes.h
-HOOKS_H=hooks.h machmode.h mode-classes.def insn-modes.h
-HOSTHOOKS_DEF_H=hosthooks-def.h hooks.h machmode.h mode-classes.def insn-modes.h
-LANGHOOKS_DEF_H=langhooks-def.h hooks.h machmode.h mode-classes.def insn-modes.h
-TARGET_DEF_H=target-def.h target-hooks-def.h hooks.h machmode.h mode-classes.def insn-modes.h targhooks.h
-C_TARGET_DEF_H=c-family/c-target-def.h c-family/c-target-hooks-def.h tree.h tree-core.h coretypes.h all-tree.def tree.def c-family/c-common.def common-targhooks.h
-RTL_BASE_H=coretypes.h rtl.h rtl.def machmode.h mode-classes.def insn-modes.h reg-notes.def insn-notes.def hashtab.h
-FIXED_VALUE_H=fixed-value.h machmode.h mode-classes.def insn-modes.h double-int.h
-RTL_H=coretypes.h rtl.h rtl.def machmode.h mode-classes.def insn-modes.h reg-notes.def insn-notes.def arm-cores.def genrtl.h
-READ_MD_H=hashtab.h read-md.h
-PARAMS_H=params.h params.def
-INTERNAL_FN_H=internal-fn.h internal-fn.def
-TREE_CORE_H=tree-core.h coretypes.h all-tree.def tree.def c-family/c-common.def arm-cores.def real.h machmode.h mode-classes.def insn-modes.h fixed-value.h machmode.h mode-classes.def insn-modes.h double-int.h
-TREE_H=tree.h tree-core.h coretypes.h all-tree.def tree.def c-family/c-common.def arm-cores.def real.h machmode.h mode-classes.def insn-modes.h fixed-value.h machmode.h mode-classes.def insn-modes.h double-int.h tree-check.h
-REGSET_H=regset.h bitmap.h hashtab.h statistics.h hard-reg-set.h
-BASIC_BLOCK_H=basic-block.h predict.h predict.def vec.h statistics.h ggc.h gtype-desc.h statistics.h function.h line-map.h input.h machmode.h mode-classes.def insn-modes.h cfg-flags.def cfghooks.h
-GIMPLE_H=gimple.h gimple.def gsstruct.def pointer-set.h vec.h statistics.h ggc.h gtype-desc.h statistics.h ggc.h gtype-desc.h statistics.h basic-block.h predict.h predict.def vec.h statistics.h ggc.h gtype-desc.h statistics.h function.h hashtab.h hash-table.h is-a.h
-GCOV_IO_H=gcov-io.h gcov-iov.h auto-host.h
-RECOG_H=recog.h
-EMIT_RTL_H=emit-rtl.h
-FLAGS_H=flags.h flag-types.h options.h flag-types.h config/arm/arm-opts.h arm-cores.def
-OPTIONS_H=options.h flag-types.h config/arm/arm-opts.h arm-cores.def
-FUNCTION_H=function.h line-map.h input.h machmode.h mode-classes.def insn-modes.h
-EXPR_H=expr.h insn-config.h function.h arm-cores.def real.h machmode.h mode-classes.def insn-modes.h fixed-value.h machmode.h mode-classes.def insn-modes.h double-int.h tree-check.h machmode.h mode-classes.def insn-modes.h emit-rtl.h
-OPTABS_H=optabs.h insn-codes.h insn-opinit.h
-REGS_H=regs.h machmode.h mode-classes.def insn-modes.h hard-reg-set.h
-CFGLOOP_H=cfgloop.h basic-block.h predict.h predict.def vec.h statistics.h ggc.h gtype-desc.h statistics.h function.h hashtab.h statistics.h sbitmap.h
-IPA_UTILS_H=ipa-utils.h tree.h tree-core.h coretypes.h all-tree.def tree.def c-family/c-common.def plugin-api.h is-a.h
-IPA_REFERENCE_H=ipa-reference.h bitmap.h arm-cores.def real.h machmode.h mode-classes.def insn-modes.h fixed-value.h machmode.h mode-classes.def insn-modes.h double-int.h tree-check.h
-CGRAPH_H=cgraph.h vec.h statistics.h ggc.h gtype-desc.h statistics.h tree.h tree-core.h coretypes.h all-tree.def tree.def c-family/c-common.def plugin-api.h is-a.h
-DF_H=df.h bitmap.h line-map.h input.h machmode.h mode-classes.def insn-modes.h cfg-flags.def cfghooks.h alloc-pool.h timevar.h timevar.def
-RESOURCE_H=resource.h hard-reg-set.h df.h bitmap.h line-map.h input.h machmode.h mode-classes.def insn-modes.h cfg-flags.def cfghooks.h alloc-pool.h timevar.h timevar.def
-GCC_H=gcc.h version.h diagnostic-core.h line-map.h input.h bversion.h diagnostic.def
-GGC_H=ggc.h gtype-desc.h statistics.h
-TIMEVAR_H=timevar.h timevar.def
-INSN_ATTR_H=insn-attr.h insn-attr-common.h insn-addr.h
-INSN_ADDR_H=insn-addr.h
-C_COMMON_H=c-family/c-common.h c-family/c-common.def tree.h tree-core.h coretypes.h all-tree.def tree.def c-family/c-common.def line-map.h input.h bversion.h diagnostic.def
-C_PRAGMA_H=c-family/c-pragma.h cpplib.h
-C_TREE_H=c/c-tree.h c-family/c-common.h c-family/c-common.def tree.h tree-core.h coretypes.h all-tree.def tree.def c-family/c-common.def obstack.h
-SYSTEM_H=system.h hwint.h filenames.h
-PREDICT_H=predict.h predict.def
-CPPLIB_H=cpplib.h
-INPUT_H=line-map.h input.h
-OPTS_H=obstack.h
-SYMTAB_H=obstack.h
-CPP_ID_DATA_H=cpp-id-data.h
-CPP_INTERNAL_H=cpp-id-data.h
-TREE_DUMP_H=tree-dump.h line-map.h dumpfile.h
-TREE_PASS_H=tree-pass.h timevar.h timevar.def line-map.h dumpfile.h
-TREE_SSA_H=tree-ssa.h tree-ssa-operands.h bitmap.h arm-cores.def real.h machmode.h mode-classes.def insn-modes.h fixed-value.h machmode.h mode-classes.def insn-modes.h double-int.h tree-check.h tree-ssa-alias.h
-PRETTY_PRINT_H=pretty-print.h obstack.h
-TREE_PRETTY_PRINT_H=tree-pretty-print.h pretty-print.h obstack.h
-GIMPLE_PRETTY_PRINT_H=gimple-pretty-print.h tree-pretty-print.h pretty-print.h obstack.h
-DIAGNOSTIC_CORE_H=diagnostic-core.h line-map.h input.h bversion.h diagnostic.def
-DIAGNOSTIC_H=diagnostic.h diagnostic-core.h obstack.h
-C_PRETTY_PRINT_H=c-family/c-pretty-print.h pretty-print.h arm-cores.def real.h machmode.h mode-classes.def insn-modes.h fixed-value.h machmode.h mode-classes.def insn-modes.h double-int.h tree-check.h
-TREE_INLINE_H=tree-inline.h
-REAL_H=real.h machmode.h mode-classes.def insn-modes.h
-LTO_STREAMER_H=lto-streamer.h obstack.h alloc-pool.h pointer-set.h
-IPA_PROP_H=ipa-prop.h tree.h tree-core.h coretypes.h all-tree.def tree.def c-family/c-common.def hashtab.h hash-table.h is-a.h alloc-pool.h
-BITMAP_H=bitmap.h hashtab.h statistics.h
-GCC_PLUGIN_H=gcc-plugin.h highlev-plugin-common.h plugin.def config.h auto-host.h hashtab.h
-PLUGIN_H=plugin.h gcc-plugin.h highlev-plugin-common.h plugin.def config.h auto-host.h hashtab.h
-PLUGIN_VERSION_H=plugin-version.h configargs.h
-CONTEXT_H=context.h
-GTFILES_H=gt-coverage.h gt-caller-save.h gt-symtab.h gt-alias.h gt-bitmap.h gt-cselib.h gt-cgraph.h gt-ipa-prop.h gt-ipa-cp.h gt-dbxout.h gt-dwarf2asm.h gt-dwarf2cfi.h gt-dwarf2out.h gt-tree-vect-generic.h gt-dojump.h gt-emit-rtl.h gt-explow.h gt-expr.h gt-function.h gt-except.h gt-gcse.h gt-godump.h gt-lists.h gt-optabs.h gt-profile.h gt-mcf.h gt-reg-stack.h gt-cfgrtl.h gt-sdbout.h gt-stor-layout.h gt-stringpool.h gt-tree.h gt-varasm.h gt-tree-ssanames.h gt-tree-eh.h gt-tree-ssa-address.h gt-tree-cfg.h gt-tree-dfa.h gt-tree-iterator.h gt-gimple-expr.h gt-tree-scalar-evolution.h gt-tree-profile.h gt-tree-nested.h gt-tree-parloops.h gt-omp-low.h gt-targhooks.h gt-arm.h gt-passes.h gt-cgraphunit.h gt-cgraphclones.h gt-tree-ssa-propagate.h gt-tree-phinodes.h gt-trans-mem.h gt-vtable-verify.h gt-asan.h gt-ubsan.h gt-tsan.h gt-ipa-devirt.h gt-ada-decl.h gt-ada-trans.h gt-ada-utils.h gt-ada-misc.h gt-c-c-lang.h gt-c-c-decl.h gt-c-family-c-common.h gt-c-family-c-cppbuiltin.h gt-c-family-c-pragma.h gt-c-c-objc-common.h gt-c-c-parser.h gt-cp-rtti.h gt-cp-mangle.h gt-cp-name-lookup.h gt-cp-call.h gt-cp-decl.h gt-cp-decl2.h gt-cp-pt.h gt-cp-repo.h gt-cp-semantics.h gt-cp-tree.h gt-cp-parser.h gt-cp-method.h gt-cp-typeck2.h gt-c-family-c-common.h gt-c-family-c-lex.h gt-c-family-c-pragma.h gt-cp-class.h gt-cp-cp-objcp-common.h gt-cp-cp-lang.h gt-cp-except.h gt-cp-vtable-class-hierarchy.h gt-fortran-f95-lang.h gt-fortran-trans-decl.h gt-fortran-trans-intrinsic.h gt-fortran-trans-io.h gt-fortran-trans-stmt.h gt-fortran-trans-types.h gt-go-go-lang.h gt-java-builtins.h gt-java-class.h gt-java-constants.h gt-java-decl.h gt-java-expr.h gt-java-jcf-parse.h gt-java-lang.h gt-java-mangle.h gt-java-resource.h gt-lto-lto-lang.h gt-lto-lto.h gt-objc-objc-act.h gt-objc-objc-runtime-shared-support.h gt-objc-objc-gnu-runtime-abi-01.h gt-objc-objc-next-runtime-abi-01.h gt-objc-objc-next-runtime-abi-02.h gt-c-c-parser.h gt-c-c-decl.h gt-c-c-objc-common.h gt-c-family-c-common.h gt-c-family-c-cppbuiltin.h gt-c-family-c-pragma.h gt-cp-rtti.h gt-cp-mangle.h gt-cp-name-lookup.h gt-cp-call.h gt-cp-decl.h gt-cp-decl2.h gt-cp-pt.h gt-cp-repo.h gt-cp-semantics.h gt-cp-tree.h gt-cp-parser.h gt-cp-method.h gt-cp-typeck2.h gt-c-family-c-common.h gt-c-family-c-lex.h gt-c-family-c-pragma.h gt-cp-class.h gt-cp-cp-objcp-common.h gt-objc-objc-act.h gt-objc-objc-runtime-shared-support.h gt-objc-objc-gnu-runtime-abi-01.h gt-objc-objc-next-runtime-abi-01.h gt-objc-objc-next-runtime-abi-02.h gt-c-family-c-cppbuiltin.h
-GTFILES_LANG_H=gtype-ada.h gtype-c.h gtype-cp.h gtype-fortran.h gtype-go.h gtype-java.h gtype-lto.h gtype-objc.h gtype-objcp.h
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/basic-block.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/basic-block.h
deleted file mode 100644
index 82729b4..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/basic-block.h
+++ /dev/null
@@ -1,1006 +0,0 @@
-/* Define control flow data structures for the CFG.
-   Copyright (C) 1987-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_BASIC_BLOCK_H
-#define GCC_BASIC_BLOCK_H
-
-#include "predict.h"
-#include "vec.h"
-#include "function.h"
-
-/* Use gcov_type to hold basic block counters.  Should be at least
-   64bit.  Although a counter cannot be negative, we use a signed
-   type, because erroneous negative counts can be generated when the
-   flow graph is manipulated by various optimizations.  A signed type
-   makes those easy to detect.  */
-
-/* Control flow edge information.  */
-struct GTY((user)) edge_def {
-  /* The two blocks at the ends of the edge.  */
-  basic_block src;
-  basic_block dest;
-
-  /* Instructions queued on the edge.  */
-  union edge_def_insns {
-    gimple_seq g;
-    rtx r;
-  } insns;
-
-  /* Auxiliary info specific to a pass.  */
-  PTR aux;
-
-  /* Location of any goto implicit in the edge.  */
-  location_t goto_locus;
-
-  /* The index number corresponding to this edge in the edge vector
-     dest->preds.  */
-  unsigned int dest_idx;
-
-  int flags;			/* see cfg-flags.def */
-  int probability;		/* biased by REG_BR_PROB_BASE */
-  gcov_type count;		/* Expected number of executions calculated
-				   in profile.c  */
-};
-
-
-/* Garbage collection and PCH support for edge_def.  */
-extern void gt_ggc_mx (edge_def *e);
-extern void gt_pch_nx (edge_def *e);
-extern void gt_pch_nx (edge_def *e, gt_pointer_operator, void *);
-
-/* Masks for edge.flags.  */
-#define DEF_EDGE_FLAG(NAME,IDX) EDGE_##NAME = 1 << IDX ,
-enum cfg_edge_flags {
-#include "cfg-flags.def"
-  LAST_CFG_EDGE_FLAG		/* this is only used for EDGE_ALL_FLAGS */
-};
-#undef DEF_EDGE_FLAG
-
-/* Bit mask for all edge flags.  */
-#define EDGE_ALL_FLAGS		((LAST_CFG_EDGE_FLAG - 1) * 2 - 1)
-
-/* The following four flags all indicate something special about an edge.
-   Test the edge flags on EDGE_COMPLEX to detect all forms of "strange"
-   control flow transfers.  */
-#define EDGE_COMPLEX \
-  (EDGE_ABNORMAL | EDGE_ABNORMAL_CALL | EDGE_EH | EDGE_PRESERVE)
-
-/* Counter summary from the last set of coverage counts read by
-   profile.c.  */
-extern const struct gcov_ctr_summary *profile_info;
-
-/* Structure to gather statistic about profile consistency, per pass.
-   An array of this structure, indexed by pass static number, is allocated
-   in passes.c.  The structure is defined here so that different CFG modes
-   can do their book-keeping via CFG hooks.
-
-   For every field[2], field[0] is the count before the pass runs, and
-   field[1] is the post-pass count.  This allows us to monitor the effect
-   of each individual pass on the profile consistency.
-   
-   This structure is not supposed to be used by anything other than passes.c
-   and one CFG hook per CFG mode.  */
-struct profile_record
-{
-  /* The number of basic blocks where sum(freq) of the block's predecessors
-     doesn't match reasonably well with the incoming frequency.  */
-  int num_mismatched_freq_in[2];
-  /* Likewise for a basic block's successors.  */
-  int num_mismatched_freq_out[2];
-  /* The number of basic blocks where sum(count) of the block's predecessors
-     doesn't match reasonably well with the incoming frequency.  */
-  int num_mismatched_count_in[2];
-  /* Likewise for a basic block's successors.  */
-  int num_mismatched_count_out[2];
-  /* A weighted cost of the run-time of the function body.  */
-  gcov_type time[2];
-  /* A weighted cost of the size of the function body.  */
-  int size[2];
-  /* True iff this pass actually was run.  */
-  bool run;
-};
-
-/* Declared in cfgloop.h.  */
-struct loop;
-
-struct GTY(()) rtl_bb_info {
-  /* The first insn of the block is embedded into bb->il.x.  */
-  /* The last insn of the block.  */
-  rtx end_;
-
-  /* In CFGlayout mode points to insn notes/jumptables to be placed just before
-     and after the block.   */
-  rtx header_;
-  rtx footer_;
-};
-
-struct GTY(()) gimple_bb_info {
-  /* Sequence of statements in this block.  */
-  gimple_seq seq;
-
-  /* PHI nodes for this block.  */
-  gimple_seq phi_nodes;
-};
-
-/* A basic block is a sequence of instructions with only one entry and
-   only one exit.  If any one of the instructions are executed, they
-   will all be executed, and in sequence from first to last.
-
-   There may be COND_EXEC instructions in the basic block.  The
-   COND_EXEC *instructions* will be executed -- but if the condition
-   is false the conditionally executed *expressions* will of course
-   not be executed.  We don't consider the conditionally executed
-   expression (which might have side-effects) to be in a separate
-   basic block because the program counter will always be at the same
-   location after the COND_EXEC instruction, regardless of whether the
-   condition is true or not.
-
-   Basic blocks need not start with a label nor end with a jump insn.
-   For example, a previous basic block may just "conditionally fall"
-   into the succeeding basic block, and the last basic block need not
-   end with a jump insn.  Block 0 is a descendant of the entry block.
-
-   A basic block beginning with two labels cannot have notes between
-   the labels.
-
-   Data for jump tables are stored in jump_insns that occur in no
-   basic block even though these insns can follow or precede insns in
-   basic blocks.  */
-
-/* Basic block information indexed by block number.  */
-struct GTY((chain_next ("%h.next_bb"), chain_prev ("%h.prev_bb"))) basic_block_def {
-  /* The edges into and out of the block.  */
-  vec<edge, va_gc> *preds;
-  vec<edge, va_gc> *succs;
-
-  /* Auxiliary info specific to a pass.  */
-  PTR GTY ((skip (""))) aux;
-
-  /* Innermost loop containing the block.  */
-  struct loop *loop_father;
-
-  /* The dominance and postdominance information node.  */
-  struct et_node * GTY ((skip (""))) dom[2];
-
-  /* Previous and next blocks in the chain.  */
-  basic_block prev_bb;
-  basic_block next_bb;
-
-  union basic_block_il_dependent {
-      struct gimple_bb_info GTY ((tag ("0"))) gimple;
-      struct {
-        rtx head_;
-        struct rtl_bb_info * rtl;
-      } GTY ((tag ("1"))) x;
-    } GTY ((desc ("((%1.flags & BB_RTL) != 0)"))) il;
-
-  /* Various flags.  See cfg-flags.def.  */
-  int flags;
-
-  /* The index of this block.  */
-  int index;
-
-  /* Expected number of executions: calculated in profile.c.  */
-  gcov_type count;
-
-  /* Expected frequency.  Normalized to be in range 0 to BB_FREQ_MAX.  */
-  int frequency;
-
-  /* The discriminator for this block.  The discriminator distinguishes
-     among several basic blocks that share a common locus, allowing for
-     more accurate sample-based profiling.  */
-  int discriminator;
-};
-
-/* This ensures that struct gimple_bb_info is smaller than
-   struct rtl_bb_info, so that inlining the former into basic_block_def
-   is the better choice.  */
-typedef int __assert_gimple_bb_smaller_rtl_bb
-              [(int) sizeof (struct rtl_bb_info)
-               - (int) sizeof (struct gimple_bb_info)];
-
-
-#define BB_FREQ_MAX 10000
-
-/* Masks for basic_block.flags.  */
-#define DEF_BASIC_BLOCK_FLAG(NAME,IDX) BB_##NAME = 1 << IDX ,
-enum cfg_bb_flags
-{
-#include "cfg-flags.def"
-  LAST_CFG_BB_FLAG		/* this is only used for BB_ALL_FLAGS */
-};
-#undef DEF_BASIC_BLOCK_FLAG
-
-/* Bit mask for all basic block flags.  */
-#define BB_ALL_FLAGS		((LAST_CFG_BB_FLAG - 1) * 2 - 1)
-
-/* Bit mask for all basic block flags that must be preserved.  These are
-   the bit masks that are *not* cleared by clear_bb_flags.  */
-#define BB_FLAGS_TO_PRESERVE					\
-  (BB_DISABLE_SCHEDULE | BB_RTL | BB_NON_LOCAL_GOTO_TARGET	\
-   | BB_HOT_PARTITION | BB_COLD_PARTITION)
-
-/* Dummy bitmask for convenience in the hot/cold partitioning code.  */
-#define BB_UNPARTITIONED	0
-
-/* Partitions, to be used when partitioning hot and cold basic blocks into
-   separate sections.  */
-#define BB_PARTITION(bb) ((bb)->flags & (BB_HOT_PARTITION|BB_COLD_PARTITION))
-#define BB_SET_PARTITION(bb, part) do {					\
-  basic_block bb_ = (bb);						\
-  bb_->flags = ((bb_->flags & ~(BB_HOT_PARTITION|BB_COLD_PARTITION))	\
-		| (part));						\
-} while (0)
-
-#define BB_COPY_PARTITION(dstbb, srcbb) \
-  BB_SET_PARTITION (dstbb, BB_PARTITION (srcbb))
-
-/* State of dominance information.  */
-
-enum dom_state
-{
-  DOM_NONE,		/* Not computed at all.  */
-  DOM_NO_FAST_QUERY,	/* The data is OK, but the fast query data are not usable.  */
-  DOM_OK		/* Everything is ok.  */
-};
-
-/* What sort of profiling information we have.  */
-enum profile_status_d
-{
-  PROFILE_ABSENT,
-  PROFILE_GUESSED,
-  PROFILE_READ,
-  PROFILE_LAST	/* Last value, used by profile streaming.  */
-};
-
-/* A structure to group all the per-function control flow graph data.
-   The x_* prefixing is necessary because otherwise references to the
-   fields of this struct are interpreted as the defines for backward
-   source compatibility following the definition of this struct.  */
-struct GTY(()) control_flow_graph {
-  /* Block pointers for the exit and entry of a function.
-     These are always the head and tail of the basic block list.  */
-  basic_block x_entry_block_ptr;
-  basic_block x_exit_block_ptr;
-
-  /* Index by basic block number, get basic block struct info.  */
-  vec<basic_block, va_gc> *x_basic_block_info;
-
-  /* Number of basic blocks in this flow graph.  */
-  int x_n_basic_blocks;
-
-  /* Number of edges in this flow graph.  */
-  int x_n_edges;
-
-  /* The first free basic block number.  */
-  int x_last_basic_block;
-
-  /* UIDs for LABEL_DECLs.  */
-  int last_label_uid;
-
-  /* Mapping of labels to their associated blocks.  At present
-     only used for the gimple CFG.  */
-  vec<basic_block, va_gc> *x_label_to_block_map;
-
-  enum profile_status_d x_profile_status;
-
-  /* Whether the dominators and the postdominators are available.  */
-  enum dom_state x_dom_computed[2];
-
-  /* Number of basic blocks in the dominance tree.  */
-  unsigned x_n_bbs_in_dom_tree[2];
-
-  /* Maximal number of entities in the single jumptable.  Used to estimate
-     final flowgraph size.  */
-  int max_jumptable_ents;
-};
-
-/* Defines for accessing the fields of the CFG structure for function FN.  */
-#define ENTRY_BLOCK_PTR_FOR_FN(FN)	     ((FN)->cfg->x_entry_block_ptr)
-#define EXIT_BLOCK_PTR_FOR_FN(FN)	     ((FN)->cfg->x_exit_block_ptr)
-#define basic_block_info_for_fn(FN)	     ((FN)->cfg->x_basic_block_info)
-#define n_basic_blocks_for_fn(FN)	     ((FN)->cfg->x_n_basic_blocks)
-#define n_edges_for_fn(FN)		     ((FN)->cfg->x_n_edges)
-#define last_basic_block_for_fn(FN)	     ((FN)->cfg->x_last_basic_block)
-#define label_to_block_map_for_fn(FN)	     ((FN)->cfg->x_label_to_block_map)
-#define profile_status_for_fn(FN)	     ((FN)->cfg->x_profile_status)
-
-#define BASIC_BLOCK_FOR_FN(FN,N) \
-  ((*basic_block_info_for_fn (FN))[(N)])
-#define SET_BASIC_BLOCK_FOR_FN(FN,N,BB) \
-  ((*basic_block_info_for_fn (FN))[(N)] = (BB))
-
-/* For iterating over basic blocks.  */
-#define FOR_BB_BETWEEN(BB, FROM, TO, DIR) \
-  for (BB = FROM; BB != TO; BB = BB->DIR)
-
-#define FOR_EACH_BB_FN(BB, FN) \
-  FOR_BB_BETWEEN (BB, (FN)->cfg->x_entry_block_ptr->next_bb, (FN)->cfg->x_exit_block_ptr, next_bb)
-
-#define FOR_EACH_BB_REVERSE_FN(BB, FN) \
-  FOR_BB_BETWEEN (BB, (FN)->cfg->x_exit_block_ptr->prev_bb, (FN)->cfg->x_entry_block_ptr, prev_bb)
-
-/* For iterating over insns in basic block.  */
-#define FOR_BB_INSNS(BB, INSN)			\
-  for ((INSN) = BB_HEAD (BB);			\
-       (INSN) && (INSN) != NEXT_INSN (BB_END (BB));	\
-       (INSN) = NEXT_INSN (INSN))
-
-/* For iterating over insns in basic block when we might remove the
-   current insn.  */
-#define FOR_BB_INSNS_SAFE(BB, INSN, CURR)			\
-  for ((INSN) = BB_HEAD (BB), (CURR) = (INSN) ? NEXT_INSN ((INSN)): NULL;	\
-       (INSN) && (INSN) != NEXT_INSN (BB_END (BB));	\
-       (INSN) = (CURR), (CURR) = (INSN) ? NEXT_INSN ((INSN)) : NULL)
-
-#define FOR_BB_INSNS_REVERSE(BB, INSN)		\
-  for ((INSN) = BB_END (BB);			\
-       (INSN) && (INSN) != PREV_INSN (BB_HEAD (BB));	\
-       (INSN) = PREV_INSN (INSN))
-
-#define FOR_BB_INSNS_REVERSE_SAFE(BB, INSN, CURR)	\
-  for ((INSN) = BB_END (BB),(CURR) = (INSN) ? PREV_INSN ((INSN)) : NULL;	\
-       (INSN) && (INSN) != PREV_INSN (BB_HEAD (BB));	\
-       (INSN) = (CURR), (CURR) = (INSN) ? PREV_INSN ((INSN)) : NULL)
-
-/* Cycles through _all_ basic blocks, even the fake ones (entry and
-   exit block).  */
-
-#define FOR_ALL_BB_FN(BB, FN) \
-  for (BB = ENTRY_BLOCK_PTR_FOR_FN (FN); BB; BB = BB->next_bb)
-
-
-/* Stuff for recording basic block info.  */
-
-#define BB_HEAD(B)      (B)->il.x.head_
-#define BB_END(B)       (B)->il.x.rtl->end_
-#define BB_HEADER(B)    (B)->il.x.rtl->header_
-#define BB_FOOTER(B)    (B)->il.x.rtl->footer_
-
-/* Special block numbers [markers] for entry and exit.
-   Neither of them is supposed to hold actual statements.  */
-#define ENTRY_BLOCK (0)
-#define EXIT_BLOCK (1)
-
-/* The two blocks that are always in the cfg.  */
-#define NUM_FIXED_BLOCKS (2)
-
-#define set_block_for_insn(INSN, BB)  (BLOCK_FOR_INSN (INSN) = BB)
-
-extern void compute_bb_for_insn (void);
-extern unsigned int free_bb_for_insn (void);
-extern void update_bb_for_insn (basic_block);
-
-extern void insert_insn_on_edge (rtx, edge);
-basic_block split_edge_and_insert (edge, rtx);
-
-extern void commit_one_edge_insertion (edge e);
-extern void commit_edge_insertions (void);
-
-extern edge unchecked_make_edge (basic_block, basic_block, int);
-extern edge cached_make_edge (sbitmap, basic_block, basic_block, int);
-extern edge make_edge (basic_block, basic_block, int);
-extern edge make_single_succ_edge (basic_block, basic_block, int);
-extern void remove_edge_raw (edge);
-extern void redirect_edge_succ (edge, basic_block);
-extern edge redirect_edge_succ_nodup (edge, basic_block);
-extern void redirect_edge_pred (edge, basic_block);
-extern basic_block create_basic_block_structure (rtx, rtx, rtx, basic_block);
-extern void clear_bb_flags (void);
-extern void dump_bb_info (FILE *, basic_block, int, int, bool, bool);
-extern void dump_edge_info (FILE *, edge, int, int);
-extern void debug (edge_def &ref);
-extern void debug (edge_def *ptr);
-extern void brief_dump_cfg (FILE *, int);
-extern void clear_edges (void);
-extern void scale_bbs_frequencies_int (basic_block *, int, int, int);
-extern void scale_bbs_frequencies_gcov_type (basic_block *, int, gcov_type,
-					     gcov_type);
-
-/* Structure to group all of the information to process IF-THEN and
-   IF-THEN-ELSE blocks for the conditional execution support.  This
-   needs to be in a public file in case the IFCVT macros call
-   functions passing the ce_if_block data structure.  */
-
-struct ce_if_block
-{
-  basic_block test_bb;			/* First test block.  */
-  basic_block then_bb;			/* THEN block.  */
-  basic_block else_bb;			/* ELSE block or NULL.  */
-  basic_block join_bb;			/* Join THEN/ELSE blocks.  */
-  basic_block last_test_bb;		/* Last bb to hold && or || tests.  */
-  int num_multiple_test_blocks;		/* # of && and || basic blocks.  */
-  int num_and_and_blocks;		/* # of && blocks.  */
-  int num_or_or_blocks;			/* # of || blocks.  */
-  int num_multiple_test_insns;		/* # of insns in && and || blocks.  */
-  int and_and_p;			/* Complex test is &&.  */
-  int num_then_insns;			/* # of insns in THEN block.  */
-  int num_else_insns;			/* # of insns in ELSE block.  */
-  int pass;				/* Pass number.  */
-};
-
-/* This structure maintains an edge list vector.  */
-/* FIXME: Make this a vec<edge>.  */
-struct edge_list
-{
-  int num_edges;
-  edge *index_to_edge;
-};
-
-/* Class to compute and manage control dependences on an edge-list.  */
-class control_dependences
-{
-public:
-  control_dependences (edge_list *);
-  ~control_dependences ();
-  bitmap get_edges_dependent_on (int);
-  edge get_edge (int);
-
-private:
-  void set_control_dependence_map_bit (basic_block, int);
-  void clear_control_dependence_bitmap (basic_block);
-  void find_control_dependence (int);
-  vec<bitmap> control_dependence_map;
-  edge_list *m_el;
-};
-
-/* The base value for branch probability notes and edge probabilities.  */
-#define REG_BR_PROB_BASE  10000
-
-/* This is the value which indicates no edge is present.  */
-#define EDGE_INDEX_NO_EDGE	-1
-
-/* EDGE_INDEX returns an integer index for an edge, or EDGE_INDEX_NO_EDGE
-   if there is no edge between the 2 basic blocks.  */
-#define EDGE_INDEX(el, pred, succ) (find_edge_index ((el), (pred), (succ)))
-
-/* INDEX_EDGE_PRED_BB and INDEX_EDGE_SUCC_BB return a pointer to the basic
-   block which is either the pred or succ end of the indexed edge.  */
-#define INDEX_EDGE_PRED_BB(el, index)	((el)->index_to_edge[(index)]->src)
-#define INDEX_EDGE_SUCC_BB(el, index)	((el)->index_to_edge[(index)]->dest)
-
-/* INDEX_EDGE returns a pointer to the edge.  */
-#define INDEX_EDGE(el, index)           ((el)->index_to_edge[(index)])
-
-/* Number of edges in the compressed edge list.  */
-#define NUM_EDGES(el)			((el)->num_edges)
-
-/* BB is assumed to contain conditional jump.  Return the fallthru edge.  */
-#define FALLTHRU_EDGE(bb)		(EDGE_SUCC ((bb), 0)->flags & EDGE_FALLTHRU \
-					 ? EDGE_SUCC ((bb), 0) : EDGE_SUCC ((bb), 1))
-
-/* BB is assumed to contain conditional jump.  Return the branch edge.  */
-#define BRANCH_EDGE(bb)			(EDGE_SUCC ((bb), 0)->flags & EDGE_FALLTHRU \
-					 ? EDGE_SUCC ((bb), 1) : EDGE_SUCC ((bb), 0))
-
-#define RDIV(X,Y) (((X) + (Y) / 2) / (Y))
-/* Return expected execution frequency of the edge E.  */
-#define EDGE_FREQUENCY(e)		RDIV ((e)->src->frequency * (e)->probability, \
-					      REG_BR_PROB_BASE)
-
-/* Compute a scale factor (or probability) suitable for scaling of
-   gcov_type values via apply_probability() and apply_scale().  */
-#define GCOV_COMPUTE_SCALE(num,den) \
-  ((den) ? RDIV ((num) * REG_BR_PROB_BASE, (den)) : REG_BR_PROB_BASE)
-
-/* Return nonzero if edge is critical.  */
-#define EDGE_CRITICAL_P(e)		(EDGE_COUNT ((e)->src->succs) >= 2 \
-					 && EDGE_COUNT ((e)->dest->preds) >= 2)
-
-#define EDGE_COUNT(ev)			vec_safe_length (ev)
-#define EDGE_I(ev,i)			(*ev)[(i)]
-#define EDGE_PRED(bb,i)			(*(bb)->preds)[(i)]
-#define EDGE_SUCC(bb,i)			(*(bb)->succs)[(i)]
-
-/* Returns true if BB has precisely one successor.  */
-
-static inline bool
-single_succ_p (const_basic_block bb)
-{
-  return EDGE_COUNT (bb->succs) == 1;
-}
-
-/* Returns true if BB has precisely one predecessor.  */
-
-static inline bool
-single_pred_p (const_basic_block bb)
-{
-  return EDGE_COUNT (bb->preds) == 1;
-}
-
-/* Returns the single successor edge of basic block BB.  Aborts if
-   BB does not have exactly one successor.  */
-
-static inline edge
-single_succ_edge (const_basic_block bb)
-{
-  gcc_checking_assert (single_succ_p (bb));
-  return EDGE_SUCC (bb, 0);
-}
-
-/* Returns the single predecessor edge of basic block BB.  Aborts
-   if BB does not have exactly one predecessor.  */
-
-static inline edge
-single_pred_edge (const_basic_block bb)
-{
-  gcc_checking_assert (single_pred_p (bb));
-  return EDGE_PRED (bb, 0);
-}
-
-/* Returns the single successor block of basic block BB.  Aborts
-   if BB does not have exactly one successor.  */
-
-static inline basic_block
-single_succ (const_basic_block bb)
-{
-  return single_succ_edge (bb)->dest;
-}
-
-/* Returns the single predecessor block of basic block BB.  Aborts
-   if BB does not have exactly one predecessor.*/
-
-static inline basic_block
-single_pred (const_basic_block bb)
-{
-  return single_pred_edge (bb)->src;
-}
-
-/* Iterator object for edges.  */
-
-struct edge_iterator {
-  unsigned index;
-  vec<edge, va_gc> **container;
-};
-
-static inline vec<edge, va_gc> *
-ei_container (edge_iterator i)
-{
-  gcc_checking_assert (i.container);
-  return *i.container;
-}
-
-#define ei_start(iter) ei_start_1 (&(iter))
-#define ei_last(iter) ei_last_1 (&(iter))
-
-/* Return an iterator pointing to the start of an edge vector.  */
-static inline edge_iterator
-ei_start_1 (vec<edge, va_gc> **ev)
-{
-  edge_iterator i;
-
-  i.index = 0;
-  i.container = ev;
-
-  return i;
-}
-
-/* Return an iterator pointing to the last element of an edge
-   vector.  */
-static inline edge_iterator
-ei_last_1 (vec<edge, va_gc> **ev)
-{
-  edge_iterator i;
-
-  i.index = EDGE_COUNT (*ev) - 1;
-  i.container = ev;
-
-  return i;
-}
-
-/* Is the iterator `i' at the end of the sequence?  */
-static inline bool
-ei_end_p (edge_iterator i)
-{
-  return (i.index == EDGE_COUNT (ei_container (i)));
-}
-
-/* Is the iterator `i' at one position before the end of the
-   sequence?  */
-static inline bool
-ei_one_before_end_p (edge_iterator i)
-{
-  return (i.index + 1 == EDGE_COUNT (ei_container (i)));
-}
-
-/* Advance the iterator to the next element.  */
-static inline void
-ei_next (edge_iterator *i)
-{
-  gcc_checking_assert (i->index < EDGE_COUNT (ei_container (*i)));
-  i->index++;
-}
-
-/* Move the iterator to the previous element.  */
-static inline void
-ei_prev (edge_iterator *i)
-{
-  gcc_checking_assert (i->index > 0);
-  i->index--;
-}
-
-/* Return the edge pointed to by the iterator `i'.  */
-static inline edge
-ei_edge (edge_iterator i)
-{
-  return EDGE_I (ei_container (i), i.index);
-}
-
-/* Return an edge pointed to by the iterator.  Do it safely so that
-   NULL is returned when the iterator is pointing at the end of the
-   sequence.  */
-static inline edge
-ei_safe_edge (edge_iterator i)
-{
-  return !ei_end_p (i) ? ei_edge (i) : NULL;
-}
-
-/* Return 1 if we should continue to iterate.  Return 0 otherwise.
-   *Edge P is set to the next edge if we are to continue to iterate
-   and NULL otherwise.  */
-
-static inline bool
-ei_cond (edge_iterator ei, edge *p)
-{
-  if (!ei_end_p (ei))
-    {
-      *p = ei_edge (ei);
-      return 1;
-    }
-  else
-    {
-      *p = NULL;
-      return 0;
-    }
-}
-
-/* This macro serves as a convenient way to iterate each edge in a
-   vector of predecessor or successor edges.  It must not be used when
-   an element might be removed during the traversal, otherwise
-   elements will be missed.  Instead, use a for-loop like that shown
-   in the following pseudo-code:
-
-   FOR (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
-     {
-	IF (e != taken_edge)
-	  remove_edge (e);
-	ELSE
-	  ei_next (&ei);
-     }
-*/
-
-#define FOR_EACH_EDGE(EDGE,ITER,EDGE_VEC)	\
-  for ((ITER) = ei_start ((EDGE_VEC));		\
-       ei_cond ((ITER), &(EDGE));		\
-       ei_next (&(ITER)))
-
-#define CLEANUP_EXPENSIVE	1	/* Do relatively expensive optimizations
-					   except for edge forwarding */
-#define CLEANUP_CROSSJUMP	2	/* Do crossjumping.  */
-#define CLEANUP_POST_REGSTACK	4	/* We run after reg-stack and need
-					   to care REG_DEAD notes.  */
-#define CLEANUP_THREADING	8	/* Do jump threading.  */
-#define CLEANUP_NO_INSN_DEL	16	/* Do not try to delete trivially dead
-					   insns.  */
-#define CLEANUP_CFGLAYOUT	32	/* Do cleanup in cfglayout mode.  */
-#define CLEANUP_CFG_CHANGED	64      /* The caller changed the CFG.  */
-
-/* In cfganal.c */
-extern void bitmap_intersection_of_succs (sbitmap, sbitmap *, basic_block);
-extern void bitmap_intersection_of_preds (sbitmap, sbitmap *, basic_block);
-extern void bitmap_union_of_succs (sbitmap, sbitmap *, basic_block);
-extern void bitmap_union_of_preds (sbitmap, sbitmap *, basic_block);
-
-/* In lcm.c */
-extern struct edge_list *pre_edge_lcm (int, sbitmap *, sbitmap *,
-				       sbitmap *, sbitmap *, sbitmap **,
-				       sbitmap **);
-extern struct edge_list *pre_edge_rev_lcm (int, sbitmap *,
-					   sbitmap *, sbitmap *,
-					   sbitmap *, sbitmap **,
-					   sbitmap **);
-extern void compute_available (sbitmap *, sbitmap *, sbitmap *, sbitmap *);
-
-/* In predict.c */
-extern bool maybe_hot_bb_p (struct function *, const_basic_block);
-extern bool maybe_hot_edge_p (edge);
-extern bool probably_never_executed_bb_p (struct function *, const_basic_block);
-extern bool probably_never_executed_edge_p (struct function *, edge);
-extern bool optimize_bb_for_size_p (const_basic_block);
-extern bool optimize_bb_for_speed_p (const_basic_block);
-extern bool optimize_edge_for_size_p (edge);
-extern bool optimize_edge_for_speed_p (edge);
-extern bool optimize_loop_for_size_p (struct loop *);
-extern bool optimize_loop_for_speed_p (struct loop *);
-extern bool optimize_loop_nest_for_size_p (struct loop *);
-extern bool optimize_loop_nest_for_speed_p (struct loop *);
-extern bool gimple_predicted_by_p (const_basic_block, enum br_predictor);
-extern bool rtl_predicted_by_p (const_basic_block, enum br_predictor);
-extern void gimple_predict_edge (edge, enum br_predictor, int);
-extern void rtl_predict_edge (edge, enum br_predictor, int);
-extern void predict_edge_def (edge, enum br_predictor, enum prediction);
-extern void guess_outgoing_edge_probabilities (basic_block);
-extern void remove_predictions_associated_with_edge (edge);
-extern bool edge_probability_reliable_p (const_edge);
-extern bool br_prob_note_reliable_p (const_rtx);
-extern bool predictable_edge_p (edge);
-
-/* In cfg.c  */
-extern void init_flow (struct function *);
-extern void debug_bb (basic_block);
-extern basic_block debug_bb_n (int);
-extern void dump_flow_info (FILE *, int);
-extern void expunge_block (basic_block);
-extern void link_block (basic_block, basic_block);
-extern void unlink_block (basic_block);
-extern void compact_blocks (void);
-extern basic_block alloc_block (void);
-extern void alloc_aux_for_blocks (int);
-extern void clear_aux_for_blocks (void);
-extern void free_aux_for_blocks (void);
-extern void alloc_aux_for_edge (edge, int);
-extern void alloc_aux_for_edges (int);
-extern void clear_aux_for_edges (void);
-extern void free_aux_for_edges (void);
-
-/* In cfganal.c  */
-extern void find_unreachable_blocks (void);
-extern bool mark_dfs_back_edges (void);
-struct edge_list * create_edge_list (void);
-void free_edge_list (struct edge_list *);
-void print_edge_list (FILE *, struct edge_list *);
-void verify_edge_list (FILE *, struct edge_list *);
-int find_edge_index (struct edge_list *, basic_block, basic_block);
-edge find_edge (basic_block, basic_block);
-extern void remove_fake_edges (void);
-extern void remove_fake_exit_edges (void);
-extern void add_noreturn_fake_exit_edges (void);
-extern void connect_infinite_loops_to_exit (void);
-extern int post_order_compute (int *, bool, bool);
-extern basic_block dfs_find_deadend (basic_block);
-extern int inverted_post_order_compute (int *);
-extern int pre_and_rev_post_order_compute_fn (struct function *,
-					      int *, int *, bool);
-extern int pre_and_rev_post_order_compute (int *, int *, bool);
-extern int dfs_enumerate_from (basic_block, int,
-			       bool (*)(const_basic_block, const void *),
-			       basic_block *, int, const void *);
-extern void compute_dominance_frontiers (struct bitmap_head *);
-extern bitmap compute_idf (bitmap, struct bitmap_head *);
-extern basic_block * single_pred_before_succ_order (void);
-
-/* In cfgrtl.c  */
-extern rtx block_label (basic_block);
-extern rtx bb_note (basic_block);
-extern bool purge_all_dead_edges (void);
-extern bool purge_dead_edges (basic_block);
-extern bool fixup_abnormal_edges (void);
-extern basic_block force_nonfallthru_and_redirect (edge, basic_block, rtx);
-extern bool contains_no_active_insn_p (const_basic_block);
-extern bool forwarder_block_p (const_basic_block);
-extern bool can_fallthru (basic_block, basic_block);
-extern void emit_barrier_after_bb (basic_block bb);
-extern void fixup_partitions (void);
-
-/* In cfgbuild.c.  */
-extern void find_many_sub_basic_blocks (sbitmap);
-extern void rtl_make_eh_edge (sbitmap, basic_block, rtx);
-
-enum replace_direction { dir_none, dir_forward, dir_backward, dir_both };
-
-/* In cfgcleanup.c.  */
-extern bool cleanup_cfg (int);
-extern int flow_find_cross_jump (basic_block, basic_block, rtx *, rtx *,
-                                 enum replace_direction*);
-extern int flow_find_head_matching_sequence (basic_block, basic_block,
-					     rtx *, rtx *, int);
-
-extern bool delete_unreachable_blocks (void);
-
-extern void update_br_prob_note (basic_block);
-extern bool inside_basic_block_p (const_rtx);
-extern bool control_flow_insn_p (const_rtx);
-extern rtx get_last_bb_insn (basic_block);
-
-/* In dominance.c */
-
-enum cdi_direction
-{
-  CDI_DOMINATORS = 1,
-  CDI_POST_DOMINATORS = 2
-};
-
-extern enum dom_state dom_info_state (enum cdi_direction);
-extern void set_dom_info_availability (enum cdi_direction, enum dom_state);
-extern bool dom_info_available_p (enum cdi_direction);
-extern void calculate_dominance_info (enum cdi_direction);
-extern void free_dominance_info (enum cdi_direction);
-extern basic_block nearest_common_dominator (enum cdi_direction,
-					     basic_block, basic_block);
-extern basic_block nearest_common_dominator_for_set (enum cdi_direction,
-						     bitmap);
-extern void set_immediate_dominator (enum cdi_direction, basic_block,
-				     basic_block);
-extern basic_block get_immediate_dominator (enum cdi_direction, basic_block);
-extern bool dominated_by_p (enum cdi_direction, const_basic_block, const_basic_block);
-extern vec<basic_block> get_dominated_by (enum cdi_direction, basic_block);
-extern vec<basic_block> get_dominated_by_region (enum cdi_direction,
-							 basic_block *,
-							 unsigned);
-extern vec<basic_block> get_dominated_to_depth (enum cdi_direction,
-							basic_block, int);
-extern vec<basic_block> get_all_dominated_blocks (enum cdi_direction,
-							  basic_block);
-extern void add_to_dominance_info (enum cdi_direction, basic_block);
-extern void delete_from_dominance_info (enum cdi_direction, basic_block);
-basic_block recompute_dominator (enum cdi_direction, basic_block);
-extern void redirect_immediate_dominators (enum cdi_direction, basic_block,
-					   basic_block);
-extern void iterate_fix_dominators (enum cdi_direction,
-				    vec<basic_block> , bool);
-extern void verify_dominators (enum cdi_direction);
-extern basic_block first_dom_son (enum cdi_direction, basic_block);
-extern basic_block next_dom_son (enum cdi_direction, basic_block);
-unsigned bb_dom_dfs_in (enum cdi_direction, basic_block);
-unsigned bb_dom_dfs_out (enum cdi_direction, basic_block);
-
-extern edge try_redirect_by_replacing_jump (edge, basic_block, bool);
-extern void break_superblocks (void);
-extern void relink_block_chain (bool);
-extern void update_bb_profile_for_threading (basic_block, int, gcov_type, edge);
-extern void init_rtl_bb_info (basic_block);
-
-extern void initialize_original_copy_tables (void);
-extern void free_original_copy_tables (void);
-extern void set_bb_original (basic_block, basic_block);
-extern basic_block get_bb_original (basic_block);
-extern void set_bb_copy (basic_block, basic_block);
-extern basic_block get_bb_copy (basic_block);
-void set_loop_copy (struct loop *, struct loop *);
-struct loop *get_loop_copy (struct loop *);
-
-#include "cfghooks.h"
-
-/* Return true if BB is in a transaction.  */
-
-static inline bool
-bb_in_transaction (basic_block bb)
-{
-  return bb->flags & BB_IN_TRANSACTION;
-}
-
-/* Return true when one of the predecessor edges of BB is marked with EDGE_EH.  */
-static inline bool
-bb_has_eh_pred (basic_block bb)
-{
-  edge e;
-  edge_iterator ei;
-
-  FOR_EACH_EDGE (e, ei, bb->preds)
-    {
-      if (e->flags & EDGE_EH)
-	return true;
-    }
-  return false;
-}
-
-/* Return true when one of the predecessor edges of BB is marked with EDGE_ABNORMAL.  */
-static inline bool
-bb_has_abnormal_pred (basic_block bb)
-{
-  edge e;
-  edge_iterator ei;
-
-  FOR_EACH_EDGE (e, ei, bb->preds)
-    {
-      if (e->flags & EDGE_ABNORMAL)
-	return true;
-    }
-  return false;
-}
-
-/* Return the fallthru edge in EDGES if it exists, NULL otherwise.  */
-static inline edge
-find_fallthru_edge (vec<edge, va_gc> *edges)
-{
-  edge e;
-  edge_iterator ei;
-
-  FOR_EACH_EDGE (e, ei, edges)
-    if (e->flags & EDGE_FALLTHRU)
-      break;
-
-  return e;
-}
-
-/* In cfgloopmanip.c.  */
-extern edge mfb_kj_edge;
-extern bool mfb_keep_just (edge);
-
-/* In cfgexpand.c.  */
-extern void rtl_profile_for_bb (basic_block);
-extern void rtl_profile_for_edge (edge);
-extern void default_rtl_profile (void);
-
-/* In profile.c.  */
-typedef struct gcov_working_set_info gcov_working_set_t;
-extern gcov_working_set_t *find_working_set (unsigned pct_times_10);
-
-/* Check tha probability is sane.  */
-
-static inline void
-check_probability (int prob)
-{
-  gcc_checking_assert (prob >= 0 && prob <= REG_BR_PROB_BASE);
-}
-
-/* Given PROB1 and PROB2, return PROB1*PROB2/REG_BR_PROB_BASE. 
-   Used to combine BB probabilities.  */
-
-static inline int
-combine_probabilities (int prob1, int prob2)
-{
-  check_probability (prob1);
-  check_probability (prob2);
-  return RDIV (prob1 * prob2, REG_BR_PROB_BASE);
-}
-
-/* Apply scale factor SCALE on frequency or count FREQ. Use this
-   interface when potentially scaling up, so that SCALE is not
-   constrained to be < REG_BR_PROB_BASE.  */
-
-static inline gcov_type
-apply_scale (gcov_type freq, gcov_type scale)
-{
-  return RDIV (freq * scale, REG_BR_PROB_BASE);
-}
-
-/* Apply probability PROB on frequency or count FREQ.  */
-
-static inline gcov_type
-apply_probability (gcov_type freq, int prob)
-{
-  check_probability (prob);
-  return apply_scale (freq, prob);
-}
-
-/* Return inverse probability for PROB.  */
-
-static inline int
-inverse_probability (int prob1)
-{
-  check_probability (prob1);
-  return REG_BR_PROB_BASE - prob1;
-}
-
-/* Return true if BB has at least one abnormal outgoing edge.  */
-
-static inline bool
-has_abnormal_or_eh_outgoing_edge_p (basic_block bb)
-{
-  edge e;
-  edge_iterator ei;
-
-  FOR_EACH_EDGE (e, ei, bb->succs)
-    if (e->flags & (EDGE_ABNORMAL | EDGE_EH))
-      return true;
-
-  return false;
-}
-#endif /* GCC_BASIC_BLOCK_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/bitmap.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/bitmap.h
deleted file mode 100644
index 6fa25ab..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/bitmap.h
+++ /dev/null
@@ -1,715 +0,0 @@
-/* Functions to support general ended bitmaps.
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_BITMAP_H
-#define GCC_BITMAP_H
-
-/* Implementation of sparse integer sets as a linked list.
-
-   This sparse set representation is suitable for sparse sets with an
-   unknown (a priori) universe.  The set is represented as a double-linked
-   list of container nodes (struct bitmap_element).  Each node consists
-   of an index for the first member that could be held in the container,
-   a small array of integers that represent the members in the container,
-   and pointers to the next and previous element in the linked list.  The
-   elements in the list are sorted in ascending order, i.e. the head of
-   the list holds the element with the smallest member of the set.
-
-   For a given member I in the set:
-     - the element for I will have index is I / (bits per element)
-     - the position for I within element is I % (bits per element)
-
-   This representation is very space-efficient for large sparse sets, and
-   the size of the set can be changed dynamically without much overhead.
-   An important parameter is the number of bits per element.  In this
-   implementation, there are 128 bits per element.  This results in a
-   high storage overhead *per element*, but a small overall overhead if
-   the set is very sparse.
-
-   The downside is that many operations are relatively slow because the
-   linked list has to be traversed to test membership (i.e. member_p/
-   add_member/remove_member).  To improve the performance of this set
-   representation, the last accessed element and its index are cached.
-   For membership tests on members close to recently accessed members,
-   the cached last element improves membership test to a constant-time
-   operation.
-
-   The following operations can always be performed in O(1) time:
-
-     * clear			: bitmap_clear
-     * choose_one		: (not implemented, but could be
-				   implemented in constant time)
-
-   The following operations can be performed in O(E) time worst-case (with
-   E the number of elements in the linked list), but in O(1) time with a
-   suitable access patterns:
-
-     * member_p			: bitmap_bit_p
-     * add_member		: bitmap_set_bit
-     * remove_member		: bitmap_clear_bit
-
-   The following operations can be performed in O(E) time:
-
-     * cardinality		: bitmap_count_bits
-     * set_size			: bitmap_last_set_bit (but this could
-				  in constant time with a pointer to
-				  the last element in the chain)
-
-   Additionally, the linked-list sparse set representation supports
-   enumeration of the members in O(E) time:
-
-     * forall			: EXECUTE_IF_SET_IN_BITMAP
-     * set_copy			: bitmap_copy
-     * set_intersection		: bitmap_intersect_p /
-				  bitmap_and / bitmap_and_into /
-				  EXECUTE_IF_AND_IN_BITMAP
-     * set_union		: bitmap_ior / bitmap_ior_into
-     * set_difference		: bitmap_intersect_compl_p /
-				  bitmap_and_comp / bitmap_and_comp_into /
-				  EXECUTE_IF_AND_COMPL_IN_BITMAP
-     * set_disjuction		: bitmap_xor_comp / bitmap_xor_comp_into
-     * set_compare		: bitmap_equal_p
-
-   Some operations on 3 sets that occur frequently in in data flow problems
-   are also implemented:
-
-     * A | (B & C)		: bitmap_ior_and_into
-     * A | (B & ~C)		: bitmap_ior_and_compl /
-				  bitmap_ior_and_compl_into
-
-   The storage requirements for linked-list sparse sets are O(E), with E->N
-   in the worst case (a sparse set with large distances between the values
-   of the set members).
-
-   The linked-list set representation works well for problems involving very
-   sparse sets.  The canonical example in GCC is, of course, the "set of
-   sets" for some CFG-based data flow problems (liveness analysis, dominance
-   frontiers, etc.).
-   
-   This representation also works well for data flow problems where the size
-   of the set may grow dynamically, but care must be taken that the member_p,
-   add_member, and remove_member operations occur with a suitable access
-   pattern.
-   
-   For random-access sets with a known, relatively small universe size, the
-   SparseSet or simple bitmap representations may be more efficient than a
-   linked-list set.  For random-access sets of unknown universe, a hash table
-   or a balanced binary tree representation is likely to be a more suitable
-   choice.
-
-   Traversing linked lists is usually cache-unfriendly, even with the last
-   accessed element cached.
-   
-   Cache performance can be improved by keeping the elements in the set
-   grouped together in memory, using a dedicated obstack for a set (or group
-   of related sets).  Elements allocated on obstacks are released to a
-   free-list and taken off the free list.  If multiple sets are allocated on
-   the same obstack, elements freed from one set may be re-used for one of
-   the other sets.  This usually helps avoid cache misses.
-
-   A single free-list is used for all sets allocated in GGC space.  This is
-   bad for persistent sets, so persistent sets should be allocated on an
-   obstack whenever possible.  */
-
-#include "hashtab.h"
-#include "statistics.h"
-#include "obstack.h"
-
-/* Fundamental storage type for bitmap.  */
-
-typedef unsigned long BITMAP_WORD;
-/* BITMAP_WORD_BITS needs to be unsigned, but cannot contain casts as
-   it is used in preprocessor directives -- hence the 1u.  */
-#define BITMAP_WORD_BITS (CHAR_BIT * SIZEOF_LONG * 1u)
-
-/* Number of words to use for each element in the linked list.  */
-
-#ifndef BITMAP_ELEMENT_WORDS
-#define BITMAP_ELEMENT_WORDS ((128 + BITMAP_WORD_BITS - 1) / BITMAP_WORD_BITS)
-#endif
-
-/* Number of bits in each actual element of a bitmap.  */
-
-#define BITMAP_ELEMENT_ALL_BITS (BITMAP_ELEMENT_WORDS * BITMAP_WORD_BITS)
-
-/* Obstack for allocating bitmaps and elements from.  */
-struct GTY (()) bitmap_obstack {
-  struct bitmap_element *elements;
-  struct bitmap_head *heads;
-  struct obstack GTY ((skip)) obstack;
-};
-
-/* Bitmap set element.  We use a linked list to hold only the bits that
-   are set.  This allows for use to grow the bitset dynamically without
-   having to realloc and copy a giant bit array.
-
-   The free list is implemented as a list of lists.  There is one
-   outer list connected together by prev fields.  Each element of that
-   outer is an inner list (that may consist only of the outer list
-   element) that are connected by the next fields.  The prev pointer
-   is undefined for interior elements.  This allows
-   bitmap_elt_clear_from to be implemented in unit time rather than
-   linear in the number of elements to be freed.  */
-
-struct GTY((chain_next ("%h.next"), chain_prev ("%h.prev"))) bitmap_element {
-  struct bitmap_element *next;	/* Next element.  */
-  struct bitmap_element *prev;	/* Previous element.  */
-  unsigned int indx;			/* regno/BITMAP_ELEMENT_ALL_BITS.  */
-  BITMAP_WORD bits[BITMAP_ELEMENT_WORDS]; /* Bits that are set.  */
-};
-
-/* Head of bitmap linked list.  The 'current' member points to something
-   already pointed to by the chain started by first, so GTY((skip)) it.  */
-
-struct GTY(()) bitmap_head {
-  unsigned int indx;			/* Index of last element looked at.  */
-  unsigned int descriptor_id;		/* Unique identifier for the allocation
-					   site of this bitmap, for detailed
-					   statistics gathering.  */
-  bitmap_element *first;		/* First element in linked list.  */
-  bitmap_element * GTY((skip(""))) current; /* Last element looked at.  */
-  bitmap_obstack *obstack;		/* Obstack to allocate elements from.
-					   If NULL, then use GGC allocation.  */
-};
-
-/* Global data */
-extern bitmap_element bitmap_zero_bits;	/* Zero bitmap element */
-extern bitmap_obstack bitmap_default_obstack;   /* Default bitmap obstack */
-
-/* Clear a bitmap by freeing up the linked list.  */
-extern void bitmap_clear (bitmap);
-
-/* Copy a bitmap to another bitmap.  */
-extern void bitmap_copy (bitmap, const_bitmap);
-
-/* True if two bitmaps are identical.  */
-extern bool bitmap_equal_p (const_bitmap, const_bitmap);
-
-/* True if the bitmaps intersect (their AND is non-empty).  */
-extern bool bitmap_intersect_p (const_bitmap, const_bitmap);
-
-/* True if the complement of the second intersects the first (their
-   AND_COMPL is non-empty).  */
-extern bool bitmap_intersect_compl_p (const_bitmap, const_bitmap);
-
-/* True if MAP is an empty bitmap.  */
-inline bool bitmap_empty_p (const_bitmap map)
-{
-  return !map->first;
-}
-
-/* True if the bitmap has only a single bit set.  */
-extern bool bitmap_single_bit_set_p (const_bitmap);
-
-/* Count the number of bits set in the bitmap.  */
-extern unsigned long bitmap_count_bits (const_bitmap);
-
-/* Boolean operations on bitmaps.  The _into variants are two operand
-   versions that modify the first source operand.  The other variants
-   are three operand versions that to not destroy the source bitmaps.
-   The operations supported are &, & ~, |, ^.  */
-extern void bitmap_and (bitmap, const_bitmap, const_bitmap);
-extern bool bitmap_and_into (bitmap, const_bitmap);
-extern bool bitmap_and_compl (bitmap, const_bitmap, const_bitmap);
-extern bool bitmap_and_compl_into (bitmap, const_bitmap);
-#define bitmap_compl_and(DST, A, B) bitmap_and_compl (DST, B, A)
-extern void bitmap_compl_and_into (bitmap, const_bitmap);
-extern void bitmap_clear_range (bitmap, unsigned int, unsigned int);
-extern void bitmap_set_range (bitmap, unsigned int, unsigned int);
-extern bool bitmap_ior (bitmap, const_bitmap, const_bitmap);
-extern bool bitmap_ior_into (bitmap, const_bitmap);
-extern void bitmap_xor (bitmap, const_bitmap, const_bitmap);
-extern void bitmap_xor_into (bitmap, const_bitmap);
-
-/* DST = A | (B & C).  Return true if DST changes.  */
-extern bool bitmap_ior_and_into (bitmap DST, const_bitmap B, const_bitmap C);
-/* DST = A | (B & ~C).  Return true if DST changes.  */
-extern bool bitmap_ior_and_compl (bitmap DST, const_bitmap A,
-				  const_bitmap B, const_bitmap C);
-/* A |= (B & ~C).  Return true if A changes.  */
-extern bool bitmap_ior_and_compl_into (bitmap A,
-				       const_bitmap B, const_bitmap C);
-
-/* Clear a single bit in a bitmap.  Return true if the bit changed.  */
-extern bool bitmap_clear_bit (bitmap, int);
-
-/* Set a single bit in a bitmap.  Return true if the bit changed.  */
-extern bool bitmap_set_bit (bitmap, int);
-
-/* Return true if a register is set in a register set.  */
-extern int bitmap_bit_p (bitmap, int);
-
-/* Debug functions to print a bitmap linked list.  */
-extern void debug_bitmap (const_bitmap);
-extern void debug_bitmap_file (FILE *, const_bitmap);
-
-/* Print a bitmap.  */
-extern void bitmap_print (FILE *, const_bitmap, const char *, const char *);
-
-/* Initialize and release a bitmap obstack.  */
-extern void bitmap_obstack_initialize (bitmap_obstack *);
-extern void bitmap_obstack_release (bitmap_obstack *);
-extern void bitmap_register (bitmap MEM_STAT_DECL);
-extern void dump_bitmap_statistics (void);
-
-/* Initialize a bitmap header.  OBSTACK indicates the bitmap obstack
-   to allocate from, NULL for GC'd bitmap.  */
-
-static inline void
-bitmap_initialize_stat (bitmap head, bitmap_obstack *obstack MEM_STAT_DECL)
-{
-  head->first = head->current = NULL;
-  head->obstack = obstack;
-  if (GATHER_STATISTICS)
-    bitmap_register (head PASS_MEM_STAT);
-}
-#define bitmap_initialize(h,o) bitmap_initialize_stat (h,o MEM_STAT_INFO)
-
-/* Allocate and free bitmaps from obstack, malloc and gc'd memory.  */
-extern bitmap bitmap_obstack_alloc_stat (bitmap_obstack *obstack MEM_STAT_DECL);
-#define bitmap_obstack_alloc(t) bitmap_obstack_alloc_stat (t MEM_STAT_INFO)
-extern bitmap bitmap_gc_alloc_stat (ALONE_MEM_STAT_DECL);
-#define bitmap_gc_alloc() bitmap_gc_alloc_stat (ALONE_MEM_STAT_INFO)
-extern void bitmap_obstack_free (bitmap);
-
-/* A few compatibility/functions macros for compatibility with sbitmaps */
-inline void dump_bitmap (FILE *file, const_bitmap map)
-{
-  bitmap_print (file, map, "", "\n");
-}
-extern void debug (const bitmap_head &ref);
-extern void debug (const bitmap_head *ptr);
-
-extern unsigned bitmap_first_set_bit (const_bitmap);
-extern unsigned bitmap_last_set_bit (const_bitmap);
-
-/* Compute bitmap hash (for purposes of hashing etc.)  */
-extern hashval_t bitmap_hash (const_bitmap);
-
-/* Allocate a bitmap from a bit obstack.  */
-#define BITMAP_ALLOC(OBSTACK) bitmap_obstack_alloc (OBSTACK)
-
-/* Allocate a gc'd bitmap.  */
-#define BITMAP_GGC_ALLOC() bitmap_gc_alloc ()
-
-/* Do any cleanup needed on a bitmap when it is no longer used.  */
-#define BITMAP_FREE(BITMAP) \
-       ((void) (bitmap_obstack_free ((bitmap) BITMAP), (BITMAP) = (bitmap) NULL))
-
-/* Iterator for bitmaps.  */
-
-struct bitmap_iterator
-{
-  /* Pointer to the current bitmap element.  */
-  bitmap_element *elt1;
-
-  /* Pointer to 2nd bitmap element when two are involved.  */
-  bitmap_element *elt2;
-
-  /* Word within the current element.  */
-  unsigned word_no;
-
-  /* Contents of the actually processed word.  When finding next bit
-     it is shifted right, so that the actual bit is always the least
-     significant bit of ACTUAL.  */
-  BITMAP_WORD bits;
-};
-
-/* Initialize a single bitmap iterator.  START_BIT is the first bit to
-   iterate from.  */
-
-static inline void
-bmp_iter_set_init (bitmap_iterator *bi, const_bitmap map,
-		   unsigned start_bit, unsigned *bit_no)
-{
-  bi->elt1 = map->first;
-  bi->elt2 = NULL;
-
-  /* Advance elt1 until it is not before the block containing start_bit.  */
-  while (1)
-    {
-      if (!bi->elt1)
-	{
-	  bi->elt1 = &bitmap_zero_bits;
-	  break;
-	}
-
-      if (bi->elt1->indx >= start_bit / BITMAP_ELEMENT_ALL_BITS)
-	break;
-      bi->elt1 = bi->elt1->next;
-    }
-
-  /* We might have gone past the start bit, so reinitialize it.  */
-  if (bi->elt1->indx != start_bit / BITMAP_ELEMENT_ALL_BITS)
-    start_bit = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
-
-  /* Initialize for what is now start_bit.  */
-  bi->word_no = start_bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
-  bi->bits = bi->elt1->bits[bi->word_no];
-  bi->bits >>= start_bit % BITMAP_WORD_BITS;
-
-  /* If this word is zero, we must make sure we're not pointing at the
-     first bit, otherwise our incrementing to the next word boundary
-     will fail.  It won't matter if this increment moves us into the
-     next word.  */
-  start_bit += !bi->bits;
-
-  *bit_no = start_bit;
-}
-
-/* Initialize an iterator to iterate over the intersection of two
-   bitmaps.  START_BIT is the bit to commence from.  */
-
-static inline void
-bmp_iter_and_init (bitmap_iterator *bi, const_bitmap map1, const_bitmap map2,
-		   unsigned start_bit, unsigned *bit_no)
-{
-  bi->elt1 = map1->first;
-  bi->elt2 = map2->first;
-
-  /* Advance elt1 until it is not before the block containing
-     start_bit.  */
-  while (1)
-    {
-      if (!bi->elt1)
-	{
-	  bi->elt2 = NULL;
-	  break;
-	}
-
-      if (bi->elt1->indx >= start_bit / BITMAP_ELEMENT_ALL_BITS)
-	break;
-      bi->elt1 = bi->elt1->next;
-    }
-
-  /* Advance elt2 until it is not before elt1.  */
-  while (1)
-    {
-      if (!bi->elt2)
-	{
-	  bi->elt1 = bi->elt2 = &bitmap_zero_bits;
-	  break;
-	}
-
-      if (bi->elt2->indx >= bi->elt1->indx)
-	break;
-      bi->elt2 = bi->elt2->next;
-    }
-
-  /* If we're at the same index, then we have some intersecting bits.  */
-  if (bi->elt1->indx == bi->elt2->indx)
-    {
-      /* We might have advanced beyond the start_bit, so reinitialize
-	 for that.  */
-      if (bi->elt1->indx != start_bit / BITMAP_ELEMENT_ALL_BITS)
-	start_bit = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
-
-      bi->word_no = start_bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
-      bi->bits = bi->elt1->bits[bi->word_no] & bi->elt2->bits[bi->word_no];
-      bi->bits >>= start_bit % BITMAP_WORD_BITS;
-    }
-  else
-    {
-      /* Otherwise we must immediately advance elt1, so initialize for
-	 that.  */
-      bi->word_no = BITMAP_ELEMENT_WORDS - 1;
-      bi->bits = 0;
-    }
-
-  /* If this word is zero, we must make sure we're not pointing at the
-     first bit, otherwise our incrementing to the next word boundary
-     will fail.  It won't matter if this increment moves us into the
-     next word.  */
-  start_bit += !bi->bits;
-
-  *bit_no = start_bit;
-}
-
-/* Initialize an iterator to iterate over the bits in MAP1 & ~MAP2.
-   */
-
-static inline void
-bmp_iter_and_compl_init (bitmap_iterator *bi,
-			 const_bitmap map1, const_bitmap map2,
-			 unsigned start_bit, unsigned *bit_no)
-{
-  bi->elt1 = map1->first;
-  bi->elt2 = map2->first;
-
-  /* Advance elt1 until it is not before the block containing start_bit.  */
-  while (1)
-    {
-      if (!bi->elt1)
-	{
-	  bi->elt1 = &bitmap_zero_bits;
-	  break;
-	}
-
-      if (bi->elt1->indx >= start_bit / BITMAP_ELEMENT_ALL_BITS)
-	break;
-      bi->elt1 = bi->elt1->next;
-    }
-
-  /* Advance elt2 until it is not before elt1.  */
-  while (bi->elt2 && bi->elt2->indx < bi->elt1->indx)
-    bi->elt2 = bi->elt2->next;
-
-  /* We might have advanced beyond the start_bit, so reinitialize for
-     that.  */
-  if (bi->elt1->indx != start_bit / BITMAP_ELEMENT_ALL_BITS)
-    start_bit = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
-
-  bi->word_no = start_bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
-  bi->bits = bi->elt1->bits[bi->word_no];
-  if (bi->elt2 && bi->elt1->indx == bi->elt2->indx)
-    bi->bits &= ~bi->elt2->bits[bi->word_no];
-  bi->bits >>= start_bit % BITMAP_WORD_BITS;
-
-  /* If this word is zero, we must make sure we're not pointing at the
-     first bit, otherwise our incrementing to the next word boundary
-     will fail.  It won't matter if this increment moves us into the
-     next word.  */
-  start_bit += !bi->bits;
-
-  *bit_no = start_bit;
-}
-
-/* Advance to the next bit in BI.  We don't advance to the next
-   nonzero bit yet.  */
-
-static inline void
-bmp_iter_next (bitmap_iterator *bi, unsigned *bit_no)
-{
-  bi->bits >>= 1;
-  *bit_no += 1;
-}
-
-/* Advance to first set bit in BI.  */
-
-static inline void
-bmp_iter_next_bit (bitmap_iterator * bi, unsigned *bit_no)
-{
-#if (GCC_VERSION >= 3004)
-  {
-    unsigned int n = __builtin_ctzl (bi->bits);
-    gcc_assert (sizeof (unsigned long) == sizeof (BITMAP_WORD));
-    bi->bits >>= n;
-    *bit_no += n;
-  }
-#else
-  while (!(bi->bits & 1))
-    {
-      bi->bits >>= 1;
-      *bit_no += 1;
-    }
-#endif
-}
-
-/* Advance to the next nonzero bit of a single bitmap, we will have
-   already advanced past the just iterated bit.  Return true if there
-   is a bit to iterate.  */
-
-static inline bool
-bmp_iter_set (bitmap_iterator *bi, unsigned *bit_no)
-{
-  /* If our current word is nonzero, it contains the bit we want.  */
-  if (bi->bits)
-    {
-    next_bit:
-      bmp_iter_next_bit (bi, bit_no);
-      return true;
-    }
-
-  /* Round up to the word boundary.  We might have just iterated past
-     the end of the last word, hence the -1.  It is not possible for
-     bit_no to point at the beginning of the now last word.  */
-  *bit_no = ((*bit_no + BITMAP_WORD_BITS - 1)
-	     / BITMAP_WORD_BITS * BITMAP_WORD_BITS);
-  bi->word_no++;
-
-  while (1)
-    {
-      /* Find the next nonzero word in this elt.  */
-      while (bi->word_no != BITMAP_ELEMENT_WORDS)
-	{
-	  bi->bits = bi->elt1->bits[bi->word_no];
-	  if (bi->bits)
-	    goto next_bit;
-	  *bit_no += BITMAP_WORD_BITS;
-	  bi->word_no++;
-	}
-
-      /* Advance to the next element.  */
-      bi->elt1 = bi->elt1->next;
-      if (!bi->elt1)
-	return false;
-      *bit_no = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
-      bi->word_no = 0;
-    }
-}
-
-/* Advance to the next nonzero bit of an intersecting pair of
-   bitmaps.  We will have already advanced past the just iterated bit.
-   Return true if there is a bit to iterate.  */
-
-static inline bool
-bmp_iter_and (bitmap_iterator *bi, unsigned *bit_no)
-{
-  /* If our current word is nonzero, it contains the bit we want.  */
-  if (bi->bits)
-    {
-    next_bit:
-      bmp_iter_next_bit (bi, bit_no);
-      return true;
-    }
-
-  /* Round up to the word boundary.  We might have just iterated past
-     the end of the last word, hence the -1.  It is not possible for
-     bit_no to point at the beginning of the now last word.  */
-  *bit_no = ((*bit_no + BITMAP_WORD_BITS - 1)
-	     / BITMAP_WORD_BITS * BITMAP_WORD_BITS);
-  bi->word_no++;
-
-  while (1)
-    {
-      /* Find the next nonzero word in this elt.  */
-      while (bi->word_no != BITMAP_ELEMENT_WORDS)
-	{
-	  bi->bits = bi->elt1->bits[bi->word_no] & bi->elt2->bits[bi->word_no];
-	  if (bi->bits)
-	    goto next_bit;
-	  *bit_no += BITMAP_WORD_BITS;
-	  bi->word_no++;
-	}
-
-      /* Advance to the next identical element.  */
-      do
-	{
-	  /* Advance elt1 while it is less than elt2.  We always want
-	     to advance one elt.  */
-	  do
-	    {
-	      bi->elt1 = bi->elt1->next;
-	      if (!bi->elt1)
-		return false;
-	    }
-	  while (bi->elt1->indx < bi->elt2->indx);
-
-	  /* Advance elt2 to be no less than elt1.  This might not
-	     advance.  */
-	  while (bi->elt2->indx < bi->elt1->indx)
-	    {
-	      bi->elt2 = bi->elt2->next;
-	      if (!bi->elt2)
-		return false;
-	    }
-	}
-      while (bi->elt1->indx != bi->elt2->indx);
-
-      *bit_no = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
-      bi->word_no = 0;
-    }
-}
-
-/* Advance to the next nonzero bit in the intersection of
-   complemented bitmaps.  We will have already advanced past the just
-   iterated bit.  */
-
-static inline bool
-bmp_iter_and_compl (bitmap_iterator *bi, unsigned *bit_no)
-{
-  /* If our current word is nonzero, it contains the bit we want.  */
-  if (bi->bits)
-    {
-    next_bit:
-      bmp_iter_next_bit (bi, bit_no);
-      return true;
-    }
-
-  /* Round up to the word boundary.  We might have just iterated past
-     the end of the last word, hence the -1.  It is not possible for
-     bit_no to point at the beginning of the now last word.  */
-  *bit_no = ((*bit_no + BITMAP_WORD_BITS - 1)
-	     / BITMAP_WORD_BITS * BITMAP_WORD_BITS);
-  bi->word_no++;
-
-  while (1)
-    {
-      /* Find the next nonzero word in this elt.  */
-      while (bi->word_no != BITMAP_ELEMENT_WORDS)
-	{
-	  bi->bits = bi->elt1->bits[bi->word_no];
-	  if (bi->elt2 && bi->elt2->indx == bi->elt1->indx)
-	    bi->bits &= ~bi->elt2->bits[bi->word_no];
-	  if (bi->bits)
-	    goto next_bit;
-	  *bit_no += BITMAP_WORD_BITS;
-	  bi->word_no++;
-	}
-
-      /* Advance to the next element of elt1.  */
-      bi->elt1 = bi->elt1->next;
-      if (!bi->elt1)
-	return false;
-
-      /* Advance elt2 until it is no less than elt1.  */
-      while (bi->elt2 && bi->elt2->indx < bi->elt1->indx)
-	bi->elt2 = bi->elt2->next;
-
-      *bit_no = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
-      bi->word_no = 0;
-    }
-}
-
-/* Loop over all bits set in BITMAP, starting with MIN and setting
-   BITNUM to the bit number.  ITER is a bitmap iterator.  BITNUM
-   should be treated as a read-only variable as it contains loop
-   state.  */
-
-#ifndef EXECUTE_IF_SET_IN_BITMAP
-/* See sbitmap.h for the other definition of EXECUTE_IF_SET_IN_BITMAP.  */
-#define EXECUTE_IF_SET_IN_BITMAP(BITMAP, MIN, BITNUM, ITER)		\
-  for (bmp_iter_set_init (&(ITER), (BITMAP), (MIN), &(BITNUM));		\
-       bmp_iter_set (&(ITER), &(BITNUM));				\
-       bmp_iter_next (&(ITER), &(BITNUM)))
-#endif
-
-/* Loop over all the bits set in BITMAP1 & BITMAP2, starting with MIN
-   and setting BITNUM to the bit number.  ITER is a bitmap iterator.
-   BITNUM should be treated as a read-only variable as it contains
-   loop state.  */
-
-#define EXECUTE_IF_AND_IN_BITMAP(BITMAP1, BITMAP2, MIN, BITNUM, ITER)	\
-  for (bmp_iter_and_init (&(ITER), (BITMAP1), (BITMAP2), (MIN),		\
-			  &(BITNUM));					\
-       bmp_iter_and (&(ITER), &(BITNUM));				\
-       bmp_iter_next (&(ITER), &(BITNUM)))
-
-/* Loop over all the bits set in BITMAP1 & ~BITMAP2, starting with MIN
-   and setting BITNUM to the bit number.  ITER is a bitmap iterator.
-   BITNUM should be treated as a read-only variable as it contains
-   loop state.  */
-
-#define EXECUTE_IF_AND_COMPL_IN_BITMAP(BITMAP1, BITMAP2, MIN, BITNUM, ITER) \
-  for (bmp_iter_and_compl_init (&(ITER), (BITMAP1), (BITMAP2), (MIN),	\
-				&(BITNUM));				\
-       bmp_iter_and_compl (&(ITER), &(BITNUM));				\
-       bmp_iter_next (&(ITER), &(BITNUM)))
-
-#endif /* GCC_BITMAP_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/builtins.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/builtins.def
deleted file mode 100644
index 5a76ba3..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/builtins.def
+++ /dev/null
@@ -1,872 +0,0 @@
-/* This file contains the definitions and documentation for the
-   builtins used in the GNU compiler.
-   Copyright (C) 2000-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* Before including this file, you should define a macro:
-
-     DEF_BUILTIN (ENUM, NAME, CLASS, TYPE, LIBTYPE, BOTH_P,
-                  FALLBACK_P, NONANSI_P, ATTRS, IMPLICIT, COND)
-
-   This macro will be called once for each builtin function.  The
-   ENUM will be of type `enum built_in_function', and will indicate
-   which builtin function is being processed.  The NAME of the builtin
-   function (which will always start with `__builtin_') is a string
-   literal.  The CLASS is of type `enum built_in_class' and indicates
-   what kind of builtin is being processed.
-
-   Some builtins are actually two separate functions.  For example,
-   for `strcmp' there are two builtin functions; `__builtin_strcmp'
-   and `strcmp' itself.  Both behave identically.  Other builtins
-   define only the `__builtin' variant.  If BOTH_P is TRUE, then this
-   builtin has both variants; otherwise, it is has only the first
-   variant.
-
-   TYPE indicates the type of the function.  The symbols correspond to
-   enumerals from builtin-types.def.  If BOTH_P is true, then LIBTYPE
-   is the type of the non-`__builtin_' variant.  Otherwise, LIBTYPE
-   should be ignored.
-
-   If FALLBACK_P is true then, if for some reason, the compiler cannot
-   expand the builtin function directly, it will call the
-   corresponding library function (which does not have the
-   `__builtin_' prefix.
-
-   If NONANSI_P is true, then the non-`__builtin_' variant is not an
-   ANSI/ISO library function, and so we should pretend it does not
-   exist when compiling in ANSI conformant mode.
-
-   ATTRs is an attribute list as defined in builtin-attrs.def that
-   describes the attributes of this builtin function.
-
-   IMPLICIT specifies condition when the builtin can be produced by
-   compiler.  For instance C90 reserves floorf function, but does not
-   define it's meaning.  When user uses floorf we may assume that the
-   floorf has the meaning we expect, but we can't produce floorf by
-   simplifying floor((double)float) since the runtime need not implement
-   it.
-
-   The builtins is registered only if COND is true.  */
-
-/* A GCC builtin (like __builtin_saveregs) is provided by the
-   compiler, but does not correspond to a function in the standard
-   library.  */
-#undef DEF_GCC_BUILTIN
-#define DEF_GCC_BUILTIN(ENUM, NAME, TYPE, ATTRS)		\
-  DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, BT_LAST,	\
-	       false, false, false, ATTRS, true, true)
-
-/* Like DEF_GCC_BUILTIN, except we don't prepend "__builtin_".  */
-#undef DEF_SYNC_BUILTIN
-#define DEF_SYNC_BUILTIN(ENUM, NAME, TYPE, ATTRS)		\
-  DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, TYPE, BT_LAST,	\
-	       false, false, false, ATTRS, true, true)
-
-/* A library builtin (like __builtin_strchr) is a builtin equivalent
-   of an ANSI/ISO standard library function.  In addition to the
-   `__builtin' version, we will create an ordinary version (e.g,
-   `strchr') as well.  If we cannot compute the answer using the
-   builtin function, we will fall back to the standard library
-   version.  */
-#undef DEF_LIB_BUILTIN
-#define DEF_LIB_BUILTIN(ENUM, NAME, TYPE, ATTRS)	\
-  DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE,	\
-	       true, true, false, ATTRS, true, true)
-
-/* Like DEF_LIB_BUILTIN, except that the function is not one that is
-   specified by ANSI/ISO C.  So, when we're being fully conformant we
-   ignore the version of these builtins that does not begin with
-   __builtin.  */
-#undef DEF_EXT_LIB_BUILTIN
-#define DEF_EXT_LIB_BUILTIN(ENUM, NAME, TYPE, ATTRS)	\
-  DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE,	\
-	       true, true, true, ATTRS, false, true)
-
-/* Like DEF_LIB_BUILTIN, except that the function is only a part of
-   the standard in C94 or above.  */
-#undef DEF_C94_BUILTIN
-#define DEF_C94_BUILTIN(ENUM, NAME, TYPE, ATTRS)	\
-  DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE,	\
-	       true, true, !flag_isoc94, ATTRS, targetm.libc_has_function (function_c94), true)
-
-/* Like DEF_LIB_BUILTIN, except that the function is only a part of
-   the standard in C99 or above.  */
-#undef DEF_C99_BUILTIN
-#define DEF_C99_BUILTIN(ENUM, NAME, TYPE, ATTRS)	\
-  DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE,	\
-	       true, true, !flag_isoc99, ATTRS, targetm.libc_has_function (function_c99_misc), true)
-
-/* Like DEF_C99_BUILTIN, but for complex math functions.  */
-#undef DEF_C99_COMPL_BUILTIN
-#define DEF_C99_COMPL_BUILTIN(ENUM, NAME, TYPE, ATTRS)	\
-  DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE,	\
-	       true, true, !flag_isoc99, ATTRS, targetm.libc_has_function (function_c99_math_complex), true)
-
-/* Builtin that is specified by C99 and C90 reserve the name for future use.
-   We can still recognize the builtin in C90 mode but we can't produce it
-   implicitly.  */
-#undef DEF_C99_C90RES_BUILTIN
-#define DEF_C99_C90RES_BUILTIN(ENUM, NAME, TYPE, ATTRS)	\
-  DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE,	\
-	       true, true, !flag_isoc99, ATTRS, targetm.libc_has_function (function_c99_misc), true)
-
-/* Builtin that C99 reserve the name for future use. We can still recognize
-   the builtin in C99 mode but we can't produce it implicitly.  */
-#undef DEF_EXT_C99RES_BUILTIN
-#define DEF_EXT_C99RES_BUILTIN(ENUM, NAME, TYPE, ATTRS)        \
-  DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE,   \
-	      true, true, true, ATTRS, false, true)
-
-/* Allocate the enum and the name for a builtin, but do not actually
-   define it here at all.  */
-#undef DEF_BUILTIN_STUB
-#define DEF_BUILTIN_STUB(ENUM, NAME) \
-  DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, BT_LAST, BT_LAST, false, false, \
-	       false, ATTR_LAST, false, false)
-
-/* Builtin used by the implementation of GNU OpenMP.  None of these are
-   actually implemented in the compiler; they're all in libgomp.  */
-#undef DEF_GOMP_BUILTIN
-#define DEF_GOMP_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
-  DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE,    \
-               false, true, true, ATTRS, false, \
-	       (flag_openmp || flag_tree_parallelize_loops))
-
-/* Builtin used by implementation of Cilk Plus.  Most of these are decomposed
-   by the compiler but a few are implemented in libcilkrts.  */ 
-#undef DEF_CILK_BUILTIN_STUB
-#define DEF_CILK_BUILTIN_STUB(ENUM, NAME) \
-  DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, BT_LAST, BT_LAST, false, false, \
-	       false, ATTR_LAST, false, false)
-
-/* Builtin used by the implementation of GNU TM.  These
-   functions are mapped to the actual implementation of the STM library. */
-#undef DEF_TM_BUILTIN
-#define DEF_TM_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
-  DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE,    \
-	       true, true, true, ATTRS, false, flag_tm)
-
-/* Builtin used by the implementation of libsanitizer. These
-   functions are mapped to the actual implementation of the 
-   libtsan library. */
-#undef DEF_SANITIZER_BUILTIN
-#define DEF_SANITIZER_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
-  DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE,    \
-	       true, true, true, ATTRS, true, \
-	      (flag_sanitize & (SANITIZE_ADDRESS | SANITIZE_THREAD \
-				| SANITIZE_UNDEFINED)))
-
-#undef DEF_CILKPLUS_BUILTIN
-#define DEF_CILKPLUS_BUILTIN(ENUM, NAME, TYPE, ATTRS)  \
-  DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, BT_FN_INT_VAR, BT_LAST, \
-  	       false, false, false, ATTRS, false, flag_cilkplus) 
-
-/* Define an attribute list for math functions that are normally
-   "impure" because some of them may write into global memory for
-   `errno'.  If !flag_errno_math they are instead "const".  */
-#undef ATTR_MATHFN_ERRNO
-#define ATTR_MATHFN_ERRNO (flag_errno_math ? \
-	ATTR_NOTHROW_LEAF_LIST : ATTR_CONST_NOTHROW_LEAF_LIST)
-
-/* Define an attribute list for math functions that are normally
-   "const" but if flag_rounding_math is set they are instead "pure".
-   This distinction accounts for the fact that some math functions
-   check the rounding mode which is akin to examining global
-   memory.  */
-#undef ATTR_MATHFN_FPROUNDING
-#define ATTR_MATHFN_FPROUNDING (flag_rounding_math ? \
-	ATTR_PURE_NOTHROW_LEAF_LIST : ATTR_CONST_NOTHROW_LEAF_LIST)
-
-/* Define an attribute list for math functions that are normally
-   "impure" because some of them may write into global memory for
-   `errno'.  If !flag_errno_math, we can possibly use "pure" or
-   "const" depending on whether we care about FP rounding.  */
-#undef ATTR_MATHFN_FPROUNDING_ERRNO
-#define ATTR_MATHFN_FPROUNDING_ERRNO (flag_errno_math ? \
-	ATTR_NOTHROW_LEAF_LIST : ATTR_MATHFN_FPROUNDING)
-
-/* Define an attribute list for math functions that need to mind FP
-   rounding, but because they store into memory they are never "const"
-   or "pure".  Use of this macro is mainly for documentation and
-   maintenance purposes.  */
-#undef ATTR_MATHFN_FPROUNDING_STORE
-#define ATTR_MATHFN_FPROUNDING_STORE ATTR_NOTHROW_LEAF_LIST
-
-/* Define an attribute list for leaf functions that do not throw
-   exceptions normally, but may throw exceptions when using
-   -fnon-call-exceptions.  */
-#define ATTR_NOTHROWCALL_LEAF_LIST (flag_non_call_exceptions ? \
-	ATTR_LEAF_LIST : ATTR_NOTHROW_LEAF_LIST)
-
-/* Make sure 0 is not a legitimate builtin.  */
-DEF_BUILTIN_STUB(BUILT_IN_NONE, (const char *)0)
-
-/* Category: math builtins.  */
-DEF_LIB_BUILTIN        (BUILT_IN_ACOS, "acos", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_ACOSF, "acosf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_ACOSH, "acosh", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_ACOSHF, "acoshf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_ACOSHL, "acoshl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_ACOSL, "acosl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_LIB_BUILTIN        (BUILT_IN_ASIN, "asin", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_ASINF, "asinf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_ASINH, "asinh", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_BUILTIN        (BUILT_IN_ASINHF, "asinhf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_BUILTIN        (BUILT_IN_ASINHL, "asinhl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_ASINL, "asinl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_LIB_BUILTIN        (BUILT_IN_ATAN, "atan", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_LIB_BUILTIN        (BUILT_IN_ATAN2, "atan2", BT_FN_DOUBLE_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_ATAN2F, "atan2f", BT_FN_FLOAT_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_ATAN2L, "atan2l", BT_FN_LONGDOUBLE_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_ATANF, "atanf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_BUILTIN        (BUILT_IN_ATANH, "atanh", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_ATANHF, "atanhf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_ATANHL, "atanhl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_ATANL, "atanl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_BUILTIN        (BUILT_IN_CBRT, "cbrt", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_BUILTIN        (BUILT_IN_CBRTF, "cbrtf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_BUILTIN        (BUILT_IN_CBRTL, "cbrtl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_LIB_BUILTIN        (BUILT_IN_CEIL, "ceil", BT_FN_DOUBLE_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_CEILF, "ceilf", BT_FN_FLOAT_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_CEILL, "ceill", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_COPYSIGN, "copysign", BT_FN_DOUBLE_DOUBLE_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_COPYSIGNF, "copysignf", BT_FN_FLOAT_FLOAT_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_COPYSIGNL, "copysignl", BT_FN_LONGDOUBLE_LONGDOUBLE_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_COS, "cos", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_COSF, "cosf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_LIB_BUILTIN        (BUILT_IN_COSH, "cosh", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_COSHF, "coshf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_COSHL, "coshl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_COSL, "cosl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_DREM, "drem", BT_FN_DOUBLE_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_DREMF, "dremf", BT_FN_FLOAT_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_DREML, "dreml", BT_FN_LONGDOUBLE_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_ERF, "erf", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_BUILTIN        (BUILT_IN_ERFC, "erfc", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_ERFCF, "erfcf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_ERFCL, "erfcl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_ERFF, "erff", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_BUILTIN        (BUILT_IN_ERFL, "erfl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_LIB_BUILTIN        (BUILT_IN_EXP, "exp", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_EXP10, "exp10", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_EXP10F, "exp10f", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_EXP10L, "exp10l", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_EXP2, "exp2", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_EXP2F, "exp2f", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_EXP2L, "exp2l", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_EXPF, "expf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_EXPL, "expl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_EXPM1, "expm1", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_EXPM1F, "expm1f", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_EXPM1L, "expm1l", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_LIB_BUILTIN        (BUILT_IN_FABS, "fabs", BT_FN_DOUBLE_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_FABSF, "fabsf", BT_FN_FLOAT_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_FABSL, "fabsl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_FABSD32, "fabsd32", BT_FN_DFLOAT32_DFLOAT32, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_FABSD64, "fabsd64", BT_FN_DFLOAT64_DFLOAT64, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_FABSD128, "fabsd128", BT_FN_DFLOAT128_DFLOAT128, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_FDIM, "fdim", BT_FN_DOUBLE_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_FDIMF, "fdimf", BT_FN_FLOAT_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_FDIML, "fdiml", BT_FN_LONGDOUBLE_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_LIB_BUILTIN        (BUILT_IN_FLOOR, "floor", BT_FN_DOUBLE_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_FLOORF, "floorf", BT_FN_FLOAT_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_FLOORL, "floorl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_FMA, "fma", BT_FN_DOUBLE_DOUBLE_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_BUILTIN        (BUILT_IN_FMAF, "fmaf", BT_FN_FLOAT_FLOAT_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_BUILTIN        (BUILT_IN_FMAL, "fmal", BT_FN_LONGDOUBLE_LONGDOUBLE_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_BUILTIN        (BUILT_IN_FMAX, "fmax", BT_FN_DOUBLE_DOUBLE_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_FMAXF, "fmaxf", BT_FN_FLOAT_FLOAT_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_FMAXL, "fmaxl", BT_FN_LONGDOUBLE_LONGDOUBLE_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_FMIN, "fmin", BT_FN_DOUBLE_DOUBLE_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_FMINF, "fminf", BT_FN_FLOAT_FLOAT_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_FMINL, "fminl", BT_FN_LONGDOUBLE_LONGDOUBLE_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_FMOD, "fmod", BT_FN_DOUBLE_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_FMODF, "fmodf", BT_FN_FLOAT_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_FMODL, "fmodl", BT_FN_LONGDOUBLE_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_LIB_BUILTIN        (BUILT_IN_FREXP, "frexp", BT_FN_DOUBLE_DOUBLE_INTPTR, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_FREXPF, "frexpf", BT_FN_FLOAT_FLOAT_INTPTR, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_FREXPL, "frexpl", BT_FN_LONGDOUBLE_LONGDOUBLE_INTPTR, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_GAMMA, "gamma", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_GAMMAF, "gammaf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_GAMMAL, "gammal", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_GAMMA_R, "gamma_r", BT_FN_DOUBLE_DOUBLE_INTPTR, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_GAMMAF_R, "gammaf_r", BT_FN_FLOAT_FLOAT_INTPTR, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_GAMMAL_R, "gammal_r", BT_FN_LONGDOUBLE_LONGDOUBLE_INTPTR, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_GCC_BUILTIN        (BUILT_IN_HUGE_VAL, "huge_val", BT_FN_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_HUGE_VALF, "huge_valf", BT_FN_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_HUGE_VALL, "huge_vall", BT_FN_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_HYPOT, "hypot", BT_FN_DOUBLE_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_HYPOTF, "hypotf", BT_FN_FLOAT_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_HYPOTL, "hypotl", BT_FN_LONGDOUBLE_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_GCC_BUILTIN        (BUILT_IN_ICEIL, "iceil", BT_FN_INT_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_ICEILF, "iceilf", BT_FN_INT_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_ICEILL, "iceill", BT_FN_INT_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_IFLOOR, "ifloor", BT_FN_INT_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_IFLOORF, "ifloorf", BT_FN_INT_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_IFLOORL, "ifloorl", BT_FN_INT_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_ILOGB, "ilogb", BT_FN_INT_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_ILOGBF, "ilogbf", BT_FN_INT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_ILOGBL, "ilogbl", BT_FN_INT_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_GCC_BUILTIN        (BUILT_IN_INF, "inf", BT_FN_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_INFF, "inff", BT_FN_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_INFL, "infl", BT_FN_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN	       (BUILT_IN_INFD32, "infd32", BT_FN_DFLOAT32, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_INFD64, "infd64", BT_FN_DFLOAT64, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_INFD128, "infd128", BT_FN_DFLOAT128, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_IRINT, "irint", BT_FN_INT_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_GCC_BUILTIN        (BUILT_IN_IRINTF, "irintf", BT_FN_INT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_GCC_BUILTIN        (BUILT_IN_IRINTL, "irintl", BT_FN_INT_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_GCC_BUILTIN        (BUILT_IN_IROUND, "iround", BT_FN_INT_DOUBLE, ATTR_MATHFN_ERRNO)
-DEF_GCC_BUILTIN        (BUILT_IN_IROUNDF, "iroundf", BT_FN_INT_FLOAT, ATTR_MATHFN_ERRNO)
-DEF_GCC_BUILTIN        (BUILT_IN_IROUNDL, "iroundl", BT_FN_INT_LONGDOUBLE, ATTR_MATHFN_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_J0, "j0", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_J0F, "j0f", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_J0L, "j0l", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_J1, "j1", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_J1F, "j1f", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_J1L, "j1l", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_JN, "jn", BT_FN_DOUBLE_INT_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_JNF, "jnf", BT_FN_FLOAT_INT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_JNL, "jnl", BT_FN_LONGDOUBLE_INT_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_GCC_BUILTIN        (BUILT_IN_LCEIL, "lceil", BT_FN_LONG_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_LCEILF, "lceilf", BT_FN_LONG_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_LCEILL, "lceill", BT_FN_LONG_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_LDEXP, "ldexp", BT_FN_DOUBLE_DOUBLE_INT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_LDEXPF, "ldexpf", BT_FN_FLOAT_FLOAT_INT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_LDEXPL, "ldexpl", BT_FN_LONGDOUBLE_LONGDOUBLE_INT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_GCC_BUILTIN        (BUILT_IN_LFLOOR, "lfloor", BT_FN_LONG_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_LFLOORF, "lfloorf", BT_FN_LONG_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_LFLOORL, "lfloorl", BT_FN_LONG_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_LGAMMA, "lgamma", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_C99_BUILTIN        (BUILT_IN_LGAMMAF, "lgammaf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_C99_BUILTIN        (BUILT_IN_LGAMMAL, "lgammal", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_LGAMMA_R, "lgamma_r", BT_FN_DOUBLE_DOUBLE_INTPTR, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_LGAMMAF_R, "lgammaf_r", BT_FN_FLOAT_FLOAT_INTPTR, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_LGAMMAL_R, "lgammal_r", BT_FN_LONGDOUBLE_LONGDOUBLE_INTPTR, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_GCC_BUILTIN        (BUILT_IN_LLCEIL, "llceil", BT_FN_LONGLONG_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_LLCEILF, "llceilf", BT_FN_LONGLONG_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_LLCEILL, "llceill", BT_FN_LONGLONG_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_LLFLOOR, "llfloor", BT_FN_LONGLONG_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_LLFLOORF, "llfloorf", BT_FN_LONGLONG_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_LLFLOORL, "llfloorl", BT_FN_LONGLONG_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_LLRINT, "llrint", BT_FN_LONGLONG_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_LLRINTF, "llrintf", BT_FN_LONGLONG_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_LLRINTL, "llrintl", BT_FN_LONGLONG_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_LLROUND, "llround", BT_FN_LONGLONG_DOUBLE, ATTR_MATHFN_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_LLROUNDF, "llroundf", BT_FN_LONGLONG_FLOAT, ATTR_MATHFN_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_LLROUNDL, "llroundl", BT_FN_LONGLONG_LONGDOUBLE, ATTR_MATHFN_ERRNO)
-DEF_LIB_BUILTIN        (BUILT_IN_LOG, "log", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_LIB_BUILTIN        (BUILT_IN_LOG10, "log10", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_LOG10F, "log10f", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_LOG10L, "log10l", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_LOG1P, "log1p", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_LOG1PF, "log1pf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_LOG1PL, "log1pl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_LOG2, "log2", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_LOG2F, "log2f", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_LOG2L, "log2l", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_LOGB, "logb", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_LOGBF, "logbf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_LOGBL, "logbl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_LOGF, "logf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_LOGL, "logl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_LRINT, "lrint", BT_FN_LONG_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_LRINTF, "lrintf", BT_FN_LONG_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_LRINTL, "lrintl", BT_FN_LONG_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_LROUND, "lround", BT_FN_LONG_DOUBLE, ATTR_MATHFN_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_LROUNDF, "lroundf", BT_FN_LONG_FLOAT, ATTR_MATHFN_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_LROUNDL, "lroundl", BT_FN_LONG_LONGDOUBLE, ATTR_MATHFN_ERRNO)
-DEF_LIB_BUILTIN        (BUILT_IN_MODF, "modf", BT_FN_DOUBLE_DOUBLE_DOUBLEPTR, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_MODFF, "modff", BT_FN_FLOAT_FLOAT_FLOATPTR, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_MODFL, "modfl", BT_FN_LONGDOUBLE_LONGDOUBLE_LONGDOUBLEPTR, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_C99_BUILTIN        (BUILT_IN_NAN, "nan", BT_FN_DOUBLE_CONST_STRING, ATTR_CONST_NOTHROW_NONNULL)
-DEF_C99_BUILTIN        (BUILT_IN_NANF, "nanf", BT_FN_FLOAT_CONST_STRING, ATTR_CONST_NOTHROW_NONNULL)
-DEF_C99_BUILTIN        (BUILT_IN_NANL, "nanl", BT_FN_LONGDOUBLE_CONST_STRING, ATTR_CONST_NOTHROW_NONNULL)
-DEF_GCC_BUILTIN        (BUILT_IN_NAND32, "nand32", BT_FN_DFLOAT32_CONST_STRING, ATTR_CONST_NOTHROW_NONNULL)
-DEF_GCC_BUILTIN        (BUILT_IN_NAND64, "nand64", BT_FN_DFLOAT64_CONST_STRING, ATTR_CONST_NOTHROW_NONNULL)
-DEF_GCC_BUILTIN        (BUILT_IN_NAND128, "nand128", BT_FN_DFLOAT128_CONST_STRING, ATTR_CONST_NOTHROW_NONNULL)
-DEF_GCC_BUILTIN        (BUILT_IN_NANS, "nans", BT_FN_DOUBLE_CONST_STRING, ATTR_CONST_NOTHROW_NONNULL)
-DEF_GCC_BUILTIN        (BUILT_IN_NANSF, "nansf", BT_FN_FLOAT_CONST_STRING, ATTR_CONST_NOTHROW_NONNULL)
-DEF_GCC_BUILTIN        (BUILT_IN_NANSL, "nansl", BT_FN_LONGDOUBLE_CONST_STRING, ATTR_CONST_NOTHROW_NONNULL)
-DEF_C99_BUILTIN        (BUILT_IN_NEARBYINT, "nearbyint", BT_FN_DOUBLE_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_NEARBYINTF, "nearbyintf", BT_FN_FLOAT_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_NEARBYINTL, "nearbyintl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_NEXTAFTER, "nextafter", BT_FN_DOUBLE_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_NEXTAFTERF, "nextafterf", BT_FN_FLOAT_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_NEXTAFTERL, "nextafterl", BT_FN_LONGDOUBLE_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_NEXTTOWARD, "nexttoward", BT_FN_DOUBLE_DOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_NEXTTOWARDF, "nexttowardf", BT_FN_FLOAT_FLOAT_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_NEXTTOWARDL, "nexttowardl", BT_FN_LONGDOUBLE_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_LIB_BUILTIN        (BUILT_IN_POW, "pow", BT_FN_DOUBLE_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_POW10, "pow10", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_POW10F, "pow10f", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_POW10L, "pow10l", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_POWF, "powf", BT_FN_FLOAT_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_GCC_BUILTIN        (BUILT_IN_POWI, "powi", BT_FN_DOUBLE_DOUBLE_INT, ATTR_MATHFN_FPROUNDING)
-DEF_GCC_BUILTIN        (BUILT_IN_POWIF, "powif", BT_FN_FLOAT_FLOAT_INT, ATTR_MATHFN_FPROUNDING)
-DEF_GCC_BUILTIN        (BUILT_IN_POWIL, "powil", BT_FN_LONGDOUBLE_LONGDOUBLE_INT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_POWL, "powl", BT_FN_LONGDOUBLE_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_REMAINDER, "remainder", BT_FN_DOUBLE_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_REMAINDERF, "remainderf", BT_FN_FLOAT_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_REMAINDERL, "remainderl", BT_FN_LONGDOUBLE_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_REMQUO, "remquo", BT_FN_DOUBLE_DOUBLE_DOUBLE_INTPTR, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_C99_BUILTIN        (BUILT_IN_REMQUOF, "remquof", BT_FN_FLOAT_FLOAT_FLOAT_INTPTR, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_C99_BUILTIN        (BUILT_IN_REMQUOL, "remquol", BT_FN_LONGDOUBLE_LONGDOUBLE_LONGDOUBLE_INTPTR, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_C99_BUILTIN        (BUILT_IN_RINT, "rint", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_RINTF, "rintf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_RINTL, "rintl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_ROUND, "round", BT_FN_DOUBLE_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_ROUNDF, "roundf", BT_FN_FLOAT_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_ROUNDL, "roundl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_SCALB, "scalb", BT_FN_DOUBLE_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_SCALBF, "scalbf", BT_FN_FLOAT_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_SCALBL, "scalbl", BT_FN_LONGDOUBLE_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_SCALBLN, "scalbln", BT_FN_DOUBLE_DOUBLE_LONG, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_SCALBLNF, "scalblnf", BT_FN_FLOAT_FLOAT_LONG, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_SCALBLNL, "scalblnl", BT_FN_LONGDOUBLE_LONGDOUBLE_LONG, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_SCALBN, "scalbn", BT_FN_DOUBLE_DOUBLE_INT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_SCALBNF, "scalbnf", BT_FN_FLOAT_FLOAT_INT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_SCALBNL, "scalbnl", BT_FN_LONGDOUBLE_LONGDOUBLE_INT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_SIGNBIT, "signbit", BT_FN_INT_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_SIGNBITF, "signbitf", BT_FN_INT_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_SIGNBITL, "signbitl", BT_FN_INT_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_SIGNBITD32, "signbitd32", BT_FN_INT_DFLOAT32, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_SIGNBITD64, "signbitd64", BT_FN_INT_DFLOAT64, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_SIGNBITD128, "signbitd128", BT_FN_INT_DFLOAT128, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_SIGNIFICAND, "significand", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_SIGNIFICANDF, "significandf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_SIGNIFICANDL, "significandl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_LIB_BUILTIN        (BUILT_IN_SIN, "sin", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_SINCOS, "sincos", BT_FN_VOID_DOUBLE_DOUBLEPTR_DOUBLEPTR, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_SINCOSF, "sincosf", BT_FN_VOID_FLOAT_FLOATPTR_FLOATPTR, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_SINCOSL, "sincosl", BT_FN_VOID_LONGDOUBLE_LONGDOUBLEPTR_LONGDOUBLEPTR, ATTR_MATHFN_FPROUNDING_STORE)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_SINF, "sinf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_LIB_BUILTIN        (BUILT_IN_SINH, "sinh", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_SINHF, "sinhf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_SINHL, "sinhl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_SINL, "sinl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_LIB_BUILTIN        (BUILT_IN_SQRT, "sqrt", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_SQRTF, "sqrtf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_SQRTL, "sqrtl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_LIB_BUILTIN        (BUILT_IN_TAN, "tan", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_TANF, "tanf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_LIB_BUILTIN        (BUILT_IN_TANH, "tanh", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_TANHF, "tanhf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_TANHL, "tanhl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_TANL, "tanl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_BUILTIN        (BUILT_IN_TGAMMA, "tgamma", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_TGAMMAF, "tgammaf", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_TGAMMAL, "tgammal", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_C99_BUILTIN        (BUILT_IN_TRUNC, "trunc", BT_FN_DOUBLE_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_TRUNCF, "truncf", BT_FN_FLOAT_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_TRUNCL, "truncl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_Y0, "y0", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_Y0F, "y0f", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_Y0L, "y0l", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_Y1, "y1", BT_FN_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_Y1F, "y1f", BT_FN_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_Y1L, "y1l", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_YN, "yn", BT_FN_DOUBLE_INT_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_YNF, "ynf", BT_FN_FLOAT_INT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_YNL, "ynl", BT_FN_LONGDOUBLE_INT_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
-
-/* Category: _Complex math builtins.  */
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CABS, "cabs", BT_FN_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CABSF, "cabsf", BT_FN_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CABSL, "cabsl", BT_FN_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CACOS, "cacos", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CACOSF, "cacosf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CACOSH, "cacosh", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CACOSHF, "cacoshf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CACOSHL, "cacoshl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CACOSL, "cacosl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CARG, "carg", BT_FN_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CARGF, "cargf", BT_FN_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CARGL, "cargl", BT_FN_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CASIN, "casin", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CASINF, "casinf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CASINH, "casinh", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CASINHF, "casinhf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CASINHL, "casinhl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CASINL, "casinl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CATAN, "catan", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CATANF, "catanf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CATANH, "catanh", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CATANHF, "catanhf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CATANHL, "catanhl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CATANL, "catanl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CCOS, "ccos", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CCOSF, "ccosf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CCOSH, "ccosh", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CCOSHF, "ccoshf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CCOSHL, "ccoshl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CCOSL, "ccosl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CEXP, "cexp", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CEXPF, "cexpf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CEXPL, "cexpl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_GCC_BUILTIN        (BUILT_IN_CEXPI, "cexpi", BT_FN_COMPLEX_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_GCC_BUILTIN        (BUILT_IN_CEXPIF, "cexpif", BT_FN_COMPLEX_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_GCC_BUILTIN        (BUILT_IN_CEXPIL, "cexpil", BT_FN_COMPLEX_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CIMAG, "cimag", BT_FN_DOUBLE_COMPLEX_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CIMAGF, "cimagf", BT_FN_FLOAT_COMPLEX_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CIMAGL, "cimagl", BT_FN_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CLOG, "clog", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CLOGF, "clogf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CLOGL, "clogl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_EXT_C99RES_BUILTIN (BUILT_IN_CLOG10, "clog10", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_EXT_C99RES_BUILTIN (BUILT_IN_CLOG10F, "clog10f", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_EXT_C99RES_BUILTIN (BUILT_IN_CLOG10L, "clog10l", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CONJ, "conj", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CONJF, "conjf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CONJL, "conjl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CPOW, "cpow", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CPOWF, "cpowf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CPOWL, "cpowl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CPROJ, "cproj", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CPROJF, "cprojf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CPROJL, "cprojl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CREAL, "creal", BT_FN_DOUBLE_COMPLEX_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CREALF, "crealf", BT_FN_FLOAT_COMPLEX_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CREALL, "creall", BT_FN_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CSIN, "csin", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CSINF, "csinf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CSINH, "csinh", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CSINHF, "csinhf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CSINHL, "csinhl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CSINL, "csinl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CSQRT, "csqrt", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CSQRTF, "csqrtf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CSQRTL, "csqrtl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CTAN, "ctan", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CTANF, "ctanf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CTANH, "ctanh", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CTANHF, "ctanhf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CTANHL, "ctanhl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-DEF_C99_COMPL_BUILTIN        (BUILT_IN_CTANL, "ctanl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
-
-/* Category: string/memory builtins.  */
-/* bcmp, bcopy and bzero have traditionally accepted NULL pointers
-   when the length parameter is zero, so don't apply attribute "nonnull".  */
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_BCMP, "bcmp", BT_FN_INT_CONST_PTR_CONST_PTR_SIZE, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_BCOPY, "bcopy", BT_FN_VOID_CONST_PTR_PTR_SIZE, ATTR_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_BZERO, "bzero", BT_FN_VOID_PTR_SIZE, ATTR_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_INDEX, "index", BT_FN_STRING_CONST_STRING_INT, ATTR_PURE_NOTHROW_NONNULL_LEAF)
-DEF_LIB_BUILTIN        (BUILT_IN_MEMCHR, "memchr", BT_FN_PTR_CONST_PTR_INT_SIZE, ATTR_PURE_NOTHROW_NONNULL_LEAF)
-DEF_LIB_BUILTIN        (BUILT_IN_MEMCMP, "memcmp", BT_FN_INT_CONST_PTR_CONST_PTR_SIZE, ATTR_PURE_NOTHROW_NONNULL_LEAF)
-DEF_LIB_BUILTIN        (BUILT_IN_MEMCPY, "memcpy", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
-DEF_LIB_BUILTIN        (BUILT_IN_MEMMOVE, "memmove", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_MEMPCPY, "mempcpy", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_NOTHROW_NONNULL_LEAF)
-DEF_LIB_BUILTIN        (BUILT_IN_MEMSET, "memset", BT_FN_PTR_PTR_INT_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_RINDEX, "rindex", BT_FN_STRING_CONST_STRING_INT, ATTR_PURE_NOTHROW_NONNULL_LEAF)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_STPCPY, "stpcpy", BT_FN_STRING_STRING_CONST_STRING, ATTR_NOTHROW_NONNULL_LEAF)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_STPNCPY, "stpncpy", BT_FN_STRING_STRING_CONST_STRING_SIZE, ATTR_NOTHROW_NONNULL_LEAF)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_STRCASECMP, "strcasecmp", BT_FN_INT_CONST_STRING_CONST_STRING, ATTR_PURE_NOTHROW_NONNULL_LEAF)
-DEF_LIB_BUILTIN        (BUILT_IN_STRCAT, "strcat", BT_FN_STRING_STRING_CONST_STRING, ATTR_NOTHROW_NONNULL_LEAF)
-DEF_LIB_BUILTIN        (BUILT_IN_STRCHR, "strchr", BT_FN_STRING_CONST_STRING_INT, ATTR_PURE_NOTHROW_NONNULL_LEAF)
-DEF_LIB_BUILTIN        (BUILT_IN_STRCMP, "strcmp", BT_FN_INT_CONST_STRING_CONST_STRING, ATTR_PURE_NOTHROW_NONNULL_LEAF)
-DEF_LIB_BUILTIN        (BUILT_IN_STRCPY, "strcpy", BT_FN_STRING_STRING_CONST_STRING, ATTR_RET1_NOTHROW_NONNULL_LEAF)
-DEF_LIB_BUILTIN        (BUILT_IN_STRCSPN, "strcspn", BT_FN_SIZE_CONST_STRING_CONST_STRING, ATTR_PURE_NOTHROW_NONNULL_LEAF)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_STRDUP, "strdup", BT_FN_STRING_CONST_STRING, ATTR_MALLOC_NOTHROW_NONNULL_LEAF)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_STRNDUP, "strndup", BT_FN_STRING_CONST_STRING_SIZE, ATTR_MALLOC_NOTHROW_NONNULL_LEAF)
-DEF_LIB_BUILTIN        (BUILT_IN_STRLEN, "strlen", BT_FN_SIZE_CONST_STRING, ATTR_PURE_NOTHROW_NONNULL_LEAF)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_STRNCASECMP, "strncasecmp", BT_FN_INT_CONST_STRING_CONST_STRING_SIZE, ATTR_PURE_NOTHROW_NONNULL_LEAF)
-DEF_LIB_BUILTIN        (BUILT_IN_STRNCAT, "strncat", BT_FN_STRING_STRING_CONST_STRING_SIZE, ATTR_NOTHROW_NONNULL_LEAF)
-DEF_LIB_BUILTIN        (BUILT_IN_STRNCMP, "strncmp", BT_FN_INT_CONST_STRING_CONST_STRING_SIZE, ATTR_PURE_NOTHROW_NONNULL_LEAF)
-DEF_LIB_BUILTIN        (BUILT_IN_STRNCPY, "strncpy", BT_FN_STRING_STRING_CONST_STRING_SIZE, ATTR_NOTHROW_NONNULL_LEAF)
-DEF_LIB_BUILTIN        (BUILT_IN_STRPBRK, "strpbrk", BT_FN_STRING_CONST_STRING_CONST_STRING, ATTR_PURE_NOTHROW_NONNULL_LEAF)
-DEF_LIB_BUILTIN        (BUILT_IN_STRRCHR, "strrchr", BT_FN_STRING_CONST_STRING_INT, ATTR_PURE_NOTHROW_NONNULL_LEAF)
-DEF_LIB_BUILTIN        (BUILT_IN_STRSPN, "strspn", BT_FN_SIZE_CONST_STRING_CONST_STRING, ATTR_PURE_NOTHROW_NONNULL_LEAF)
-DEF_LIB_BUILTIN        (BUILT_IN_STRSTR, "strstr", BT_FN_STRING_CONST_STRING_CONST_STRING, ATTR_PURE_NOTHROW_NONNULL_LEAF)
-
-/* Category: stdio builtins.  */
-DEF_LIB_BUILTIN        (BUILT_IN_FPRINTF, "fprintf", BT_FN_INT_FILEPTR_CONST_STRING_VAR, ATTR_FORMAT_PRINTF_2_3)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_FPRINTF_UNLOCKED, "fprintf_unlocked", BT_FN_INT_FILEPTR_CONST_STRING_VAR, ATTR_FORMAT_PRINTF_2_3)
-DEF_LIB_BUILTIN        (BUILT_IN_PUTC, "putc", BT_FN_INT_INT_FILEPTR, ATTR_NONNULL_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_PUTC_UNLOCKED, "putc_unlocked", BT_FN_INT_INT_FILEPTR, ATTR_NONNULL_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_FPUTC, "fputc", BT_FN_INT_INT_FILEPTR, ATTR_NONNULL_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_FPUTC_UNLOCKED, "fputc_unlocked", BT_FN_INT_INT_FILEPTR, ATTR_NONNULL_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_FPUTS, "fputs", BT_FN_INT_CONST_STRING_FILEPTR, ATTR_NONNULL_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_FPUTS_UNLOCKED, "fputs_unlocked", BT_FN_INT_CONST_STRING_FILEPTR, ATTR_NONNULL_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_FSCANF, "fscanf", BT_FN_INT_FILEPTR_CONST_STRING_VAR, ATTR_FORMAT_SCANF_2_3)
-DEF_LIB_BUILTIN        (BUILT_IN_FWRITE, "fwrite", BT_FN_SIZE_CONST_PTR_SIZE_SIZE_FILEPTR, ATTR_NONNULL_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_FWRITE_UNLOCKED, "fwrite_unlocked", BT_FN_SIZE_CONST_PTR_SIZE_SIZE_FILEPTR, ATTR_NONNULL_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_PRINTF, "printf", BT_FN_INT_CONST_STRING_VAR, ATTR_FORMAT_PRINTF_1_2)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_PRINTF_UNLOCKED, "printf_unlocked", BT_FN_INT_CONST_STRING_VAR, ATTR_FORMAT_PRINTF_1_2)
-DEF_LIB_BUILTIN        (BUILT_IN_PUTCHAR, "putchar", BT_FN_INT_INT, ATTR_NULL)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_PUTCHAR_UNLOCKED, "putchar_unlocked", BT_FN_INT_INT, ATTR_NULL)
-DEF_LIB_BUILTIN        (BUILT_IN_PUTS, "puts", BT_FN_INT_CONST_STRING, ATTR_NONNULL_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_PUTS_UNLOCKED, "puts_unlocked", BT_FN_INT_CONST_STRING, ATTR_NONNULL_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_SCANF, "scanf", BT_FN_INT_CONST_STRING_VAR, ATTR_FORMAT_SCANF_1_2)
-DEF_C99_BUILTIN        (BUILT_IN_SNPRINTF, "snprintf", BT_FN_INT_STRING_SIZE_CONST_STRING_VAR, ATTR_FORMAT_PRINTF_NOTHROW_3_4)
-DEF_LIB_BUILTIN        (BUILT_IN_SPRINTF, "sprintf", BT_FN_INT_STRING_CONST_STRING_VAR, ATTR_FORMAT_PRINTF_NOTHROW_2_3)
-DEF_LIB_BUILTIN        (BUILT_IN_SSCANF, "sscanf", BT_FN_INT_CONST_STRING_CONST_STRING_VAR, ATTR_FORMAT_SCANF_NOTHROW_2_3)
-DEF_LIB_BUILTIN        (BUILT_IN_VFPRINTF, "vfprintf", BT_FN_INT_FILEPTR_CONST_STRING_VALIST_ARG, ATTR_FORMAT_PRINTF_2_0)
-DEF_C99_BUILTIN        (BUILT_IN_VFSCANF, "vfscanf", BT_FN_INT_FILEPTR_CONST_STRING_VALIST_ARG, ATTR_FORMAT_SCANF_2_0)
-DEF_LIB_BUILTIN        (BUILT_IN_VPRINTF, "vprintf", BT_FN_INT_CONST_STRING_VALIST_ARG, ATTR_FORMAT_PRINTF_1_0)
-DEF_C99_BUILTIN        (BUILT_IN_VSCANF, "vscanf", BT_FN_INT_CONST_STRING_VALIST_ARG, ATTR_FORMAT_SCANF_1_0)
-DEF_C99_BUILTIN        (BUILT_IN_VSNPRINTF, "vsnprintf", BT_FN_INT_STRING_SIZE_CONST_STRING_VALIST_ARG, ATTR_FORMAT_PRINTF_NOTHROW_3_0)
-DEF_LIB_BUILTIN        (BUILT_IN_VSPRINTF, "vsprintf", BT_FN_INT_STRING_CONST_STRING_VALIST_ARG, ATTR_FORMAT_PRINTF_NOTHROW_2_0)
-DEF_C99_BUILTIN        (BUILT_IN_VSSCANF, "vsscanf", BT_FN_INT_CONST_STRING_CONST_STRING_VALIST_ARG, ATTR_FORMAT_SCANF_NOTHROW_2_0)
-
-/* Category: ctype builtins.  */
-DEF_LIB_BUILTIN        (BUILT_IN_ISALNUM, "isalnum", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_ISALPHA, "isalpha", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_ISASCII, "isascii", BT_FN_INT_INT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_ISBLANK, "isblank", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_ISCNTRL, "iscntrl", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_ISDIGIT, "isdigit", BT_FN_INT_INT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_ISGRAPH, "isgraph", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_ISLOWER, "islower", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_ISPRINT, "isprint", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_ISPUNCT, "ispunct", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_ISSPACE, "isspace", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_ISUPPER, "isupper", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_ISXDIGIT, "isxdigit", BT_FN_INT_INT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_TOASCII, "toascii", BT_FN_INT_INT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_TOLOWER, "tolower", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_TOUPPER, "toupper", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LEAF_LIST)
-
-/* Category: wctype builtins.  */
-DEF_C94_BUILTIN        (BUILT_IN_ISWALNUM, "iswalnum", BT_FN_INT_WINT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_C94_BUILTIN        (BUILT_IN_ISWALPHA, "iswalpha", BT_FN_INT_WINT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_ISWBLANK, "iswblank", BT_FN_INT_WINT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_C94_BUILTIN        (BUILT_IN_ISWCNTRL, "iswcntrl", BT_FN_INT_WINT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_C94_BUILTIN        (BUILT_IN_ISWDIGIT, "iswdigit", BT_FN_INT_WINT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_C94_BUILTIN        (BUILT_IN_ISWGRAPH, "iswgraph", BT_FN_INT_WINT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_C94_BUILTIN        (BUILT_IN_ISWLOWER, "iswlower", BT_FN_INT_WINT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_C94_BUILTIN        (BUILT_IN_ISWPRINT, "iswprint", BT_FN_INT_WINT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_C94_BUILTIN        (BUILT_IN_ISWPUNCT, "iswpunct", BT_FN_INT_WINT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_C94_BUILTIN        (BUILT_IN_ISWSPACE, "iswspace", BT_FN_INT_WINT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_C94_BUILTIN        (BUILT_IN_ISWUPPER, "iswupper", BT_FN_INT_WINT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_C94_BUILTIN        (BUILT_IN_ISWXDIGIT, "iswxdigit", BT_FN_INT_WINT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_C94_BUILTIN        (BUILT_IN_TOWLOWER, "towlower", BT_FN_WINT_WINT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_C94_BUILTIN        (BUILT_IN_TOWUPPER, "towupper", BT_FN_WINT_WINT, ATTR_PURE_NOTHROW_LEAF_LIST)
-
-/* Category: miscellaneous builtins.  */
-DEF_LIB_BUILTIN        (BUILT_IN_ABORT, "abort", BT_FN_VOID, ATTR_NORETURN_NOTHROW_LEAF_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_ABS, "abs", BT_FN_INT_INT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_AGGREGATE_INCOMING_ADDRESS, "aggregate_incoming_address", BT_FN_PTR_VAR, ATTR_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_ALLOCA, "alloca", BT_FN_PTR_SIZE, ATTR_MALLOC_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_APPLY, "apply", BT_FN_PTR_PTR_FN_VOID_VAR_PTR_SIZE, ATTR_NULL)
-DEF_GCC_BUILTIN        (BUILT_IN_APPLY_ARGS, "apply_args", BT_FN_PTR_VAR, ATTR_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_BSWAP16, "bswap16", BT_FN_UINT16_UINT16, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_BSWAP32, "bswap32", BT_FN_UINT32_UINT32, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_BSWAP64, "bswap64", BT_FN_UINT64_UINT64, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_CLEAR_CACHE, "__clear_cache", BT_FN_VOID_PTR_PTR, ATTR_NOTHROW_LEAF_LIST)
-/* [trans-mem]: Adjust BUILT_IN_TM_CALLOC if BUILT_IN_CALLOC is changed.  */
-DEF_LIB_BUILTIN        (BUILT_IN_CALLOC, "calloc", BT_FN_PTR_SIZE_SIZE, ATTR_MALLOC_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_CLASSIFY_TYPE, "classify_type", BT_FN_INT_VAR, ATTR_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_CLZ, "clz", BT_FN_INT_UINT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_CLZIMAX, "clzimax", BT_FN_INT_UINTMAX, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_CLZL, "clzl", BT_FN_INT_ULONG, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_CLZLL, "clzll", BT_FN_INT_ULONGLONG, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_CONSTANT_P, "constant_p", BT_FN_INT_VAR, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_CTZ, "ctz", BT_FN_INT_UINT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_CTZIMAX, "ctzimax", BT_FN_INT_UINTMAX, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_CTZL, "ctzl", BT_FN_INT_ULONG, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_CTZLL, "ctzll", BT_FN_INT_ULONGLONG, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_CLRSB, "clrsb", BT_FN_INT_INT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_CLRSBIMAX, "clrsbimax", BT_FN_INT_INTMAX, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_CLRSBL, "clrsbl", BT_FN_INT_LONG, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_CLRSBLL, "clrsbll", BT_FN_INT_LONGLONG, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_DCGETTEXT, "dcgettext", BT_FN_STRING_CONST_STRING_CONST_STRING_INT, ATTR_FORMAT_ARG_2)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_DGETTEXT, "dgettext", BT_FN_STRING_CONST_STRING_CONST_STRING, ATTR_FORMAT_ARG_2)
-DEF_GCC_BUILTIN        (BUILT_IN_DWARF_CFA, "dwarf_cfa", BT_FN_PTR, ATTR_NULL)
-DEF_GCC_BUILTIN        (BUILT_IN_DWARF_SP_COLUMN, "dwarf_sp_column", BT_FN_UINT, ATTR_NULL)
-DEF_GCC_BUILTIN        (BUILT_IN_EH_RETURN, "eh_return", BT_FN_VOID_PTRMODE_PTR, ATTR_NORETURN_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_EH_RETURN_DATA_REGNO, "eh_return_data_regno", BT_FN_INT_INT, ATTR_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN        (BUILT_IN_EXECL, "execl", BT_FN_INT_CONST_STRING_CONST_STRING_VAR, ATTR_SENTINEL_NOTHROW_LIST)
-DEF_EXT_LIB_BUILTIN        (BUILT_IN_EXECLP, "execlp", BT_FN_INT_CONST_STRING_CONST_STRING_VAR, ATTR_SENTINEL_NOTHROW_LIST)
-DEF_EXT_LIB_BUILTIN        (BUILT_IN_EXECLE, "execle", BT_FN_INT_CONST_STRING_CONST_STRING_VAR, ATTR_NOTHROW_SENTINEL_1)
-DEF_EXT_LIB_BUILTIN        (BUILT_IN_EXECV, "execv", BT_FN_INT_CONST_STRING_PTR_CONST_STRING, ATTR_NOTHROW_LIST)
-DEF_EXT_LIB_BUILTIN        (BUILT_IN_EXECVP, "execvp", BT_FN_INT_CONST_STRING_PTR_CONST_STRING, ATTR_NOTHROW_LIST)
-DEF_EXT_LIB_BUILTIN        (BUILT_IN_EXECVE, "execve", BT_FN_INT_CONST_STRING_PTR_CONST_STRING_PTR_CONST_STRING, ATTR_NOTHROW_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_EXIT, "exit", BT_FN_VOID_INT, ATTR_NORETURN_NOTHROW_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_EXPECT, "expect", BT_FN_LONG_LONG_LONG, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_ASSUME_ALIGNED, "assume_aligned", BT_FN_PTR_CONST_PTR_SIZE_VAR, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_EXTEND_POINTER, "extend_pointer", BT_FN_UNWINDWORD_PTR, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_EXTRACT_RETURN_ADDR, "extract_return_addr", BT_FN_PTR_PTR, ATTR_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_FFS, "ffs", BT_FN_INT_INT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_FFSIMAX, "ffsimax", BT_FN_INT_INTMAX, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_FFSL, "ffsl", BT_FN_INT_LONG, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_FFSLL, "ffsll", BT_FN_INT_LONGLONG, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN        (BUILT_IN_FORK, "fork", BT_FN_PID, ATTR_NOTHROW_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_FRAME_ADDRESS, "frame_address", BT_FN_PTR_UINT, ATTR_NULL)
-/* [trans-mem]: Adjust BUILT_IN_TM_FREE if BUILT_IN_FREE is changed.  */
-DEF_LIB_BUILTIN        (BUILT_IN_FREE, "free", BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_FROB_RETURN_ADDR, "frob_return_addr", BT_FN_PTR_PTR, ATTR_NULL)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_GETTEXT, "gettext", BT_FN_STRING_CONST_STRING, ATTR_FORMAT_ARG_1)
-DEF_C99_BUILTIN        (BUILT_IN_IMAXABS, "imaxabs", BT_FN_INTMAX_INTMAX, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_INIT_DWARF_REG_SIZES, "init_dwarf_reg_size_table", BT_FN_VOID_PTR, ATTR_NULL)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_FINITE, "finite", BT_FN_INT_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_FINITEF, "finitef", BT_FN_INT_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_FINITEL, "finitel", BT_FN_INT_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_FINITED32, "finited32", BT_FN_INT_DFLOAT32, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_FINITED64, "finited64", BT_FN_INT_DFLOAT64, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_FINITED128, "finited128", BT_FN_INT_DFLOAT128, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_FPCLASSIFY, "fpclassify", BT_FN_INT_INT_INT_INT_INT_INT_VAR, ATTR_CONST_NOTHROW_TYPEGENERIC_LEAF)
-DEF_GCC_BUILTIN        (BUILT_IN_ISFINITE, "isfinite", BT_FN_INT_VAR, ATTR_CONST_NOTHROW_TYPEGENERIC_LEAF)
-DEF_GCC_BUILTIN        (BUILT_IN_ISINF_SIGN, "isinf_sign", BT_FN_INT_VAR, ATTR_CONST_NOTHROW_TYPEGENERIC_LEAF)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_ISINF, "isinf", BT_FN_INT_VAR, ATTR_CONST_NOTHROW_TYPEGENERIC)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_ISINFF, "isinff", BT_FN_INT_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_ISINFL, "isinfl", BT_FN_INT_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_ISINFD32, "isinfd32", BT_FN_INT_DFLOAT32, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_ISINFD64, "isinfd64", BT_FN_INT_DFLOAT64, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_ISINFD128, "isinfd128", BT_FN_INT_DFLOAT128, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_C90RES_BUILTIN (BUILT_IN_ISNAN, "isnan", BT_FN_INT_VAR, ATTR_CONST_NOTHROW_TYPEGENERIC_LEAF)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_ISNANF, "isnanf", BT_FN_INT_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_ISNANL, "isnanl", BT_FN_INT_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_ISNAND32, "isnand32", BT_FN_INT_DFLOAT32, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_ISNAND64, "isnand64", BT_FN_INT_DFLOAT64, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_ISNAND128, "isnand128", BT_FN_INT_DFLOAT128, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_ISNORMAL, "isnormal", BT_FN_INT_VAR, ATTR_CONST_NOTHROW_TYPEGENERIC_LEAF)
-DEF_GCC_BUILTIN        (BUILT_IN_ISGREATER, "isgreater", BT_FN_INT_VAR, ATTR_CONST_NOTHROW_TYPEGENERIC_LEAF)
-DEF_GCC_BUILTIN        (BUILT_IN_ISGREATEREQUAL, "isgreaterequal", BT_FN_INT_VAR, ATTR_CONST_NOTHROW_TYPEGENERIC_LEAF)
-DEF_GCC_BUILTIN        (BUILT_IN_ISLESS, "isless", BT_FN_INT_VAR, ATTR_CONST_NOTHROW_TYPEGENERIC_LEAF)
-DEF_GCC_BUILTIN        (BUILT_IN_ISLESSEQUAL, "islessequal", BT_FN_INT_VAR, ATTR_CONST_NOTHROW_TYPEGENERIC_LEAF)
-DEF_GCC_BUILTIN        (BUILT_IN_ISLESSGREATER, "islessgreater", BT_FN_INT_VAR, ATTR_CONST_NOTHROW_TYPEGENERIC_LEAF)
-DEF_GCC_BUILTIN        (BUILT_IN_ISUNORDERED, "isunordered", BT_FN_INT_VAR, ATTR_CONST_NOTHROW_TYPEGENERIC_LEAF)
-DEF_LIB_BUILTIN        (BUILT_IN_LABS, "labs", BT_FN_LONG_LONG, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN_LLABS, "llabs", BT_FN_LONGLONG_LONGLONG, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_LONGJMP, "longjmp", BT_FN_VOID_PTR_INT, ATTR_NORETURN_NOTHROW_LIST)
-/* [trans-mem]: Adjust BUILT_IN_TM_MALLOC if BUILT_IN_MALLOC is changed.  */
-DEF_LIB_BUILTIN        (BUILT_IN_MALLOC, "malloc", BT_FN_PTR_SIZE, ATTR_MALLOC_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_NEXT_ARG, "next_arg", BT_FN_PTR_VAR, ATTR_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_PARITY, "parity", BT_FN_INT_UINT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_PARITYIMAX, "parityimax", BT_FN_INT_UINTMAX, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_PARITYL, "parityl", BT_FN_INT_ULONG, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_PARITYLL, "parityll", BT_FN_INT_ULONGLONG, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_POPCOUNT, "popcount", BT_FN_INT_UINT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_POPCOUNTIMAX, "popcountimax", BT_FN_INT_UINTMAX, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_POPCOUNTL, "popcountl", BT_FN_INT_ULONG, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_POPCOUNTLL, "popcountll", BT_FN_INT_ULONGLONG, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_POSIX_MEMALIGN, "posix_memalign", BT_FN_INT_PTRPTR_SIZE_SIZE, ATTR_NOTHROW_NONNULL_LEAF)
-DEF_GCC_BUILTIN        (BUILT_IN_PREFETCH, "prefetch", BT_FN_VOID_CONST_PTR_VAR, ATTR_NOVOPS_LEAF_LIST)
-DEF_LIB_BUILTIN        (BUILT_IN_REALLOC, "realloc", BT_FN_PTR_PTR_SIZE, ATTR_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_RETURN, "return", BT_FN_VOID_PTR, ATTR_NORETURN_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_RETURN_ADDRESS, "return_address", BT_FN_PTR_UINT, ATTR_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_SAVEREGS, "saveregs", BT_FN_PTR_VAR, ATTR_NULL)
-DEF_GCC_BUILTIN        (BUILT_IN_SETJMP, "setjmp", BT_FN_INT_PTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_STRFMON, "strfmon", BT_FN_SSIZE_STRING_SIZE_CONST_STRING_VAR, ATTR_FORMAT_STRFMON_NOTHROW_3_4)
-DEF_LIB_BUILTIN        (BUILT_IN_STRFTIME, "strftime", BT_FN_SIZE_STRING_SIZE_CONST_STRING_CONST_PTR, ATTR_FORMAT_STRFTIME_NOTHROW_3_0)
-DEF_GCC_BUILTIN        (BUILT_IN_TRAP, "trap", BT_FN_VOID, ATTR_NORETURN_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_UNREACHABLE, "unreachable", BT_FN_VOID, ATTR_CONST_NORETURN_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_UNWIND_INIT, "unwind_init", BT_FN_VOID, ATTR_NULL)
-DEF_GCC_BUILTIN        (BUILT_IN_UPDATE_SETJMP_BUF, "update_setjmp_buf", BT_FN_VOID_PTR_INT, ATTR_NULL)
-DEF_GCC_BUILTIN        (BUILT_IN_VA_COPY, "va_copy", BT_FN_VOID_VALIST_REF_VALIST_ARG, ATTR_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_VA_END, "va_end", BT_FN_VOID_VALIST_REF, ATTR_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_VA_START, "va_start", BT_FN_VOID_VALIST_REF_VAR, ATTR_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_VA_ARG_PACK, "va_arg_pack", BT_FN_INT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN        (BUILT_IN_VA_ARG_PACK_LEN, "va_arg_pack_len", BT_FN_INT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN__EXIT, "_exit", BT_FN_VOID_INT, ATTR_NORETURN_NOTHROW_LEAF_LIST)
-DEF_C99_BUILTIN        (BUILT_IN__EXIT2, "_Exit", BT_FN_VOID_INT, ATTR_NORETURN_NOTHROW_LEAF_LIST)
-
-/* Implementing nested functions.  */
-DEF_BUILTIN_STUB (BUILT_IN_INIT_TRAMPOLINE, "__builtin_init_trampoline")
-DEF_BUILTIN_STUB (BUILT_IN_INIT_HEAP_TRAMPOLINE, "__builtin_init_heap_trampoline")
-DEF_BUILTIN_STUB (BUILT_IN_ADJUST_TRAMPOLINE, "__builtin_adjust_trampoline")
-DEF_BUILTIN_STUB (BUILT_IN_NONLOCAL_GOTO, "__builtin_nonlocal_goto")
-
-/* Implementing __builtin_setjmp.  */
-DEF_BUILTIN_STUB (BUILT_IN_SETJMP_SETUP, "__builtin_setjmp_setup")
-DEF_BUILTIN_STUB (BUILT_IN_SETJMP_RECEIVER, "__builtin_setjmp_receiver")
-
-/* Implementing variable sized local variables.  */
-DEF_BUILTIN_STUB (BUILT_IN_STACK_SAVE, "__builtin_stack_save")
-DEF_BUILTIN_STUB (BUILT_IN_STACK_RESTORE, "__builtin_stack_restore")
-DEF_BUILTIN_STUB (BUILT_IN_ALLOCA_WITH_ALIGN, "__builtin_alloca_with_align")
-
-/* Object size checking builtins.  */
-DEF_GCC_BUILTIN	       (BUILT_IN_OBJECT_SIZE, "object_size", BT_FN_SIZE_CONST_PTR_INT, ATTR_PURE_NOTHROW_LEAF_LIST)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_MEMCPY_CHK, "__memcpy_chk", BT_FN_PTR_PTR_CONST_PTR_SIZE_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_MEMMOVE_CHK, "__memmove_chk", BT_FN_PTR_PTR_CONST_PTR_SIZE_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_MEMPCPY_CHK, "__mempcpy_chk", BT_FN_PTR_PTR_CONST_PTR_SIZE_SIZE, ATTR_NOTHROW_NONNULL_LEAF)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_MEMSET_CHK, "__memset_chk", BT_FN_PTR_PTR_INT_SIZE_SIZE, ATTR_NOTHROW_NONNULL_LEAF)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_STPCPY_CHK, "__stpcpy_chk", BT_FN_STRING_STRING_CONST_STRING_SIZE, ATTR_NOTHROW_NONNULL_LEAF)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_STPNCPY_CHK, "__stpncpy_chk", BT_FN_STRING_STRING_CONST_STRING_SIZE_SIZE, ATTR_NOTHROW_NONNULL_LEAF)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_STRCAT_CHK, "__strcat_chk", BT_FN_STRING_STRING_CONST_STRING_SIZE, ATTR_NOTHROW_NONNULL_LEAF)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_STRCPY_CHK, "__strcpy_chk", BT_FN_STRING_STRING_CONST_STRING_SIZE, ATTR_NOTHROW_NONNULL_LEAF)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_STRNCAT_CHK, "__strncat_chk", BT_FN_STRING_STRING_CONST_STRING_SIZE_SIZE, ATTR_NOTHROW_NONNULL_LEAF)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_STRNCPY_CHK, "__strncpy_chk", BT_FN_STRING_STRING_CONST_STRING_SIZE_SIZE, ATTR_NOTHROW_NONNULL_LEAF)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_SNPRINTF_CHK, "__snprintf_chk", BT_FN_INT_STRING_SIZE_INT_SIZE_CONST_STRING_VAR, ATTR_FORMAT_PRINTF_NOTHROW_5_6)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_SPRINTF_CHK, "__sprintf_chk", BT_FN_INT_STRING_INT_SIZE_CONST_STRING_VAR, ATTR_FORMAT_PRINTF_NOTHROW_4_5)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_VSNPRINTF_CHK, "__vsnprintf_chk", BT_FN_INT_STRING_SIZE_INT_SIZE_CONST_STRING_VALIST_ARG, ATTR_FORMAT_PRINTF_NOTHROW_5_0)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_VSPRINTF_CHK, "__vsprintf_chk", BT_FN_INT_STRING_INT_SIZE_CONST_STRING_VALIST_ARG, ATTR_FORMAT_PRINTF_NOTHROW_4_0)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_FPRINTF_CHK, "__fprintf_chk", BT_FN_INT_FILEPTR_INT_CONST_STRING_VAR, ATTR_FORMAT_PRINTF_3_4)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_PRINTF_CHK, "__printf_chk", BT_FN_INT_INT_CONST_STRING_VAR, ATTR_FORMAT_PRINTF_2_3)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_VFPRINTF_CHK, "__vfprintf_chk", BT_FN_INT_FILEPTR_INT_CONST_STRING_VALIST_ARG, ATTR_FORMAT_PRINTF_3_0)
-DEF_EXT_LIB_BUILTIN    (BUILT_IN_VPRINTF_CHK, "__vprintf_chk", BT_FN_INT_INT_CONST_STRING_VALIST_ARG, ATTR_FORMAT_PRINTF_2_0)
-
-/* Profiling hooks.  */
-DEF_BUILTIN (BUILT_IN_PROFILE_FUNC_ENTER, "__cyg_profile_func_enter", BUILT_IN_NORMAL, BT_FN_VOID_PTR_PTR, BT_LAST,
-	     false, false, false, ATTR_NULL, true, true)
-DEF_BUILTIN (BUILT_IN_PROFILE_FUNC_EXIT, "__cyg_profile_func_exit", BUILT_IN_NORMAL, BT_FN_VOID_PTR_PTR, BT_LAST,
-	     false, false, false, ATTR_NULL, true, true)
-
-/* TLS thread pointer related builtins.  */
-DEF_BUILTIN (BUILT_IN_THREAD_POINTER, "__builtin_thread_pointer",
-	     BUILT_IN_NORMAL, BT_FN_PTR, BT_LAST,
-	     false, false, true, ATTR_CONST_NOTHROW_LIST, true,
-	     targetm.have_tls)
-
-DEF_BUILTIN (BUILT_IN_SET_THREAD_POINTER, "__builtin_set_thread_pointer",
-	     BUILT_IN_NORMAL, BT_FN_VOID_PTR, BT_LAST,
-	     false, false, true, ATTR_NOTHROW_LIST, true,
-	     targetm.have_tls)
-
-/* TLS emulation.  */
-DEF_BUILTIN (BUILT_IN_EMUTLS_GET_ADDRESS, targetm.emutls.get_address,
-	     BUILT_IN_NORMAL,
-	     BT_FN_PTR_PTR,  BT_FN_PTR_PTR,
-	     true, true, true, ATTR_CONST_NOTHROW_NONNULL_LEAF, false,
-	     !targetm.have_tls)
-DEF_BUILTIN (BUILT_IN_EMUTLS_REGISTER_COMMON,
-	     targetm.emutls.register_common, BUILT_IN_NORMAL,
-	     BT_FN_VOID_PTR_WORD_WORD_PTR, BT_FN_VOID_PTR_WORD_WORD_PTR,
-	     true, true, true, ATTR_NOTHROW_LEAF_LIST, false,
-	     !targetm.have_tls)
-
-/* Exception support.  */
-DEF_BUILTIN_STUB (BUILT_IN_UNWIND_RESUME, "__builtin_unwind_resume")
-DEF_BUILTIN_STUB (BUILT_IN_CXA_END_CLEANUP, "__builtin_cxa_end_cleanup")
-DEF_BUILTIN_STUB (BUILT_IN_EH_POINTER, "__builtin_eh_pointer")
-DEF_BUILTIN_STUB (BUILT_IN_EH_FILTER, "__builtin_eh_filter")
-DEF_BUILTIN_STUB (BUILT_IN_EH_COPY_VALUES, "__builtin_eh_copy_values")
-
-/* __FILE__, __LINE__, __FUNCTION__ as builtins.  */
-DEF_GCC_BUILTIN (BUILT_IN_FILE, "FILE", BT_FN_CONST_STRING, ATTR_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN (BUILT_IN_FUNCTION, "FUNCTION", BT_FN_CONST_STRING, ATTR_NOTHROW_LEAF_LIST)
-DEF_GCC_BUILTIN (BUILT_IN_LINE, "LINE", BT_FN_INT, ATTR_NOTHROW_LEAF_LIST)
-
-/* Synchronization Primitives.  */
-#include "sync-builtins.def"
-
-/* OpenMP builtins.  */
-#include "omp-builtins.def"
-
-/* Cilk keywords builtins.  */
-#include "cilk-builtins.def"
-
-/* GTM builtins. */
-#include "gtm-builtins.def"
-
-/* Sanitizer builtins. */
-#include "sanitizer.def"
-
-/* Cilk Plus builtins.  */
-#include "cilkplus.def"
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/bversion.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/bversion.h
deleted file mode 100644
index 8fee9b3..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/bversion.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#define BUILDING_GCC_MAJOR 4
-#define BUILDING_GCC_MINOR 9
-#define BUILDING_GCC_PATCHLEVEL 1
-#define BUILDING_GCC_VERSION (BUILDING_GCC_MAJOR * 1000 + BUILDING_GCC_MINOR)
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/c-family/c-common.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/c-family/c-common.def
deleted file mode 100644
index a181475..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/c-family/c-common.def
+++ /dev/null
@@ -1,69 +0,0 @@
-/* This file contains the definitions and documentation for the
-   additional tree codes used in the GNU C compiler (see tree.def
-   for the standard codes).
-   Copyright (C) 1987-2014 Free Software Foundation, Inc.
-   Written by Benjamin Chelf <chelf@codesourcery.com>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* Tree nodes used in the C frontend.  These are also shared with the
-   C++ and Objective C frontends.  */
-
-/* A C_MAYBE_CONST_EXPR, currently only used for C and Objective C,
-   tracks information about constancy of an expression and VLA type
-   sizes or VM expressions from typeof that need to be evaluated
-   before the main expression.  It is used during parsing and removed
-   in c_fully_fold.  C_MAYBE_CONST_EXPR_PRE is the expression to
-   evaluate first, if not NULL; C_MAYBE_CONST_EXPR_EXPR is the main
-   expression.  If C_MAYBE_CONST_EXPR_INT_OPERANDS is set then the
-   expression may be used in an unevaluated part of an integer
-   constant expression, but not in an evaluated part.  If
-   C_MAYBE_CONST_EXPR_NON_CONST is set then the expression contains
-   something that cannot occur in an evaluated part of a constant
-   expression (or outside of sizeof in C90 mode); otherwise it does
-   not.  */
-DEFTREECODE (C_MAYBE_CONST_EXPR, "c_maybe_const_expr", tcc_expression, 2)
-
-/* An EXCESS_PRECISION_EXPR, currently only used for C and Objective
-   C, represents an expression evaluated in greater range or precision
-   than its type.  The type of the EXCESS_PRECISION_EXPR is the
-   semantic type while the operand represents what is actually being
-   evaluated.  */
-DEFTREECODE (EXCESS_PRECISION_EXPR, "excess_precision_expr", tcc_expression, 1)
-
-/* Used to represent a user-defined literal.
-   The operands are an IDENTIFIER for the suffix, the VALUE of the literal,
-   and for numeric literals the original string representation of the
-   number.  */
-DEFTREECODE (USERDEF_LITERAL, "userdef_literal", tcc_exceptional, 3)
-
-/* Represents a 'sizeof' expression during C++ template expansion,
-   or for the purpose of -Wsizeof-pointer-memaccess warning.  */
-DEFTREECODE (SIZEOF_EXPR, "sizeof_expr", tcc_expression, 1)
-
-/* Array Notation expression.
-   Operand 0 is the array.
-   Operand 1 is the starting array index.
-   Operand 2 contains the number of elements you need to access.
-   Operand 3 is the stride.  */
-DEFTREECODE (ARRAY_NOTATION_REF, "array_notation_ref", tcc_reference, 4) 
-
-/*
-Local variables:
-mode:c
-End:
-*/
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/c-family/c-common.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/c-family/c-common.h
deleted file mode 100644
index 06dcb7c..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/c-family/c-common.h
+++ /dev/null
@@ -1,1392 +0,0 @@
-/* Definitions for c-common.c.
-   Copyright (C) 1987-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_C_COMMON_H
-#define GCC_C_COMMON_H
-
-#include "splay-tree.h"
-#include "cpplib.h"
-#include "ggc.h"
-#include "tree.h"
-
-/* In order for the format checking to accept the C frontend
-   diagnostic framework extensions, you must include this file before
-   diagnostic-core.h, not after.  The C front end formats are a subset of those
-   for C++, so they are the appropriate set to use in common code;
-   cp-tree.h overrides this for C++.  */
-#if defined(GCC_DIAGNOSTIC_CORE_H)
-#error \
-In order for the format checking to accept the C front end diagnostic \
-framework extensions, you must include this file before diagnostic-core.h \
-never after.
-#endif
-#ifndef GCC_DIAG_STYLE
-#define GCC_DIAG_STYLE __gcc_cdiag__
-#endif
-#include "diagnostic-core.h"
-
-/* Usage of TREE_LANG_FLAG_?:
-   0: IDENTIFIER_MARKED (used by search routines).
-      C_MAYBE_CONST_EXPR_INT_OPERANDS (in C_MAYBE_CONST_EXPR, for C)
-   1: C_DECLARED_LABEL_FLAG (in LABEL_DECL)
-      STATEMENT_LIST_STMT_EXPR (in STATEMENT_LIST)
-      C_MAYBE_CONST_EXPR_NON_CONST (in C_MAYBE_CONST_EXPR, for C)
-   2: unused
-   3: STATEMENT_LIST_HAS_LABEL (in STATEMENT_LIST)
-   4: unused
-*/
-
-/* Reserved identifiers.  This is the union of all the keywords for C,
-   C++, and Objective-C.  All the type modifiers have to be in one
-   block at the beginning, because they are used as mask bits.  There
-   are 28 type modifiers; if we add many more we will have to redesign
-   the mask mechanism.  */
-
-enum rid
-{
-  /* Modifiers: */
-  /* C, in empirical order of frequency.  */
-  RID_STATIC = 0,
-  RID_UNSIGNED, RID_LONG,    RID_CONST, RID_EXTERN,
-  RID_REGISTER, RID_TYPEDEF, RID_SHORT, RID_INLINE,
-  RID_VOLATILE, RID_SIGNED,  RID_AUTO,  RID_RESTRICT,
-  RID_NORETURN, RID_ATOMIC,
-
-  /* C extensions */
-  RID_COMPLEX, RID_THREAD, RID_SAT,
-
-  /* C++ */
-  RID_FRIEND, RID_VIRTUAL, RID_EXPLICIT, RID_EXPORT, RID_MUTABLE,
-
-  /* ObjC ("PQ" reserved words - they do not appear after a '@' and
-     are keywords only in specific contexts)  */
-  RID_IN, RID_OUT, RID_INOUT, RID_BYCOPY, RID_BYREF, RID_ONEWAY,
-
-  /* ObjC ("PATTR" reserved words - they do not appear after a '@' 
-     and are keywords only as property attributes)  */
-  RID_GETTER, RID_SETTER,
-  RID_READONLY, RID_READWRITE,
-  RID_ASSIGN, RID_RETAIN, RID_COPY,
-  RID_NONATOMIC,
-
-  /* C (reserved and imaginary types not implemented, so any use is a
-     syntax error) */
-  RID_IMAGINARY,
-
-  /* C */
-  RID_INT,     RID_CHAR,   RID_FLOAT,    RID_DOUBLE, RID_VOID,
-  RID_INT128,
-  RID_ENUM,    RID_STRUCT, RID_UNION,    RID_IF,     RID_ELSE,
-  RID_WHILE,   RID_DO,     RID_FOR,      RID_SWITCH, RID_CASE,
-  RID_DEFAULT, RID_BREAK,  RID_CONTINUE, RID_RETURN, RID_GOTO,
-  RID_SIZEOF,
-
-  /* C extensions */
-  RID_ASM,       RID_TYPEOF,   RID_ALIGNOF,  RID_ATTRIBUTE,  RID_VA_ARG,
-  RID_EXTENSION, RID_IMAGPART, RID_REALPART, RID_LABEL,      RID_CHOOSE_EXPR,
-  RID_TYPES_COMPATIBLE_P,      RID_BUILTIN_COMPLEX,	     RID_BUILTIN_SHUFFLE,
-  RID_DFLOAT32, RID_DFLOAT64, RID_DFLOAT128,
-  RID_FRACT, RID_ACCUM, RID_AUTO_TYPE,
-
-  /* C11 */
-  RID_ALIGNAS, RID_GENERIC,
-
-  /* This means to warn that this is a C++ keyword, and then treat it
-     as a normal identifier.  */
-  RID_CXX_COMPAT_WARN,
-
-  /* GNU transactional memory extension */
-  RID_TRANSACTION_ATOMIC, RID_TRANSACTION_RELAXED, RID_TRANSACTION_CANCEL,
-
-  /* Too many ways of getting the name of a function as a string */
-  RID_FUNCTION_NAME, RID_PRETTY_FUNCTION_NAME, RID_C99_FUNCTION_NAME,
-
-  /* C++ (some of these are keywords in Objective-C as well, but only
-     if they appear after a '@') */
-  RID_BOOL,     RID_WCHAR,    RID_CLASS,
-  RID_PUBLIC,   RID_PRIVATE,  RID_PROTECTED,
-  RID_TEMPLATE, RID_NULL,     RID_CATCH,
-  RID_DELETE,   RID_FALSE,    RID_NAMESPACE,
-  RID_NEW,      RID_OFFSETOF, RID_OPERATOR,
-  RID_THIS,     RID_THROW,    RID_TRUE,
-  RID_TRY,      RID_TYPENAME, RID_TYPEID,
-  RID_USING,    RID_CHAR16,   RID_CHAR32,
-
-  /* casts */
-  RID_CONSTCAST, RID_DYNCAST, RID_REINTCAST, RID_STATCAST,
-
-  /* C++ extensions */
-  RID_BASES,                   RID_DIRECT_BASES,
-  RID_HAS_NOTHROW_ASSIGN,      RID_HAS_NOTHROW_CONSTRUCTOR,
-  RID_HAS_NOTHROW_COPY,        RID_HAS_TRIVIAL_ASSIGN,
-  RID_HAS_TRIVIAL_CONSTRUCTOR, RID_HAS_TRIVIAL_COPY,
-  RID_HAS_TRIVIAL_DESTRUCTOR,  RID_HAS_VIRTUAL_DESTRUCTOR,
-  RID_IS_ABSTRACT,             RID_IS_BASE_OF,
-  RID_IS_CLASS,                RID_IS_CONVERTIBLE_TO,
-  RID_IS_EMPTY,                RID_IS_ENUM,
-  RID_IS_FINAL,                RID_IS_LITERAL_TYPE,
-  RID_IS_POD,                  RID_IS_POLYMORPHIC,
-  RID_IS_STD_LAYOUT,           RID_IS_TRIVIAL,
-  RID_IS_UNION,                RID_UNDERLYING_TYPE,
-
-  /* C++11 */
-  RID_CONSTEXPR, RID_DECLTYPE, RID_NOEXCEPT, RID_NULLPTR, RID_STATIC_ASSERT,
-
-  /* Cilk Plus keywords.  */
-  RID_CILK_SPAWN, RID_CILK_SYNC,
-  
-  /* Objective-C ("AT" reserved words - they are only keywords when
-     they follow '@')  */
-  RID_AT_ENCODE,   RID_AT_END,
-  RID_AT_CLASS,    RID_AT_ALIAS,     RID_AT_DEFS,
-  RID_AT_PRIVATE,  RID_AT_PROTECTED, RID_AT_PUBLIC,  RID_AT_PACKAGE,
-  RID_AT_PROTOCOL, RID_AT_SELECTOR,
-  RID_AT_THROW,	   RID_AT_TRY,       RID_AT_CATCH,
-  RID_AT_FINALLY,  RID_AT_SYNCHRONIZED, 
-  RID_AT_OPTIONAL, RID_AT_REQUIRED, RID_AT_PROPERTY,
-  RID_AT_SYNTHESIZE, RID_AT_DYNAMIC,
-  RID_AT_INTERFACE,
-  RID_AT_IMPLEMENTATION,
-
-  /* Named address support, mapping the keyword to a particular named address
-     number.  Named address space 0 is reserved for the generic address.  If
-     there are more than 254 named addresses, the addr_space_t type will need
-     to be grown from an unsigned char to unsigned short.  */
-  RID_ADDR_SPACE_0,		/* generic address */
-  RID_ADDR_SPACE_1,
-  RID_ADDR_SPACE_2,
-  RID_ADDR_SPACE_3,
-  RID_ADDR_SPACE_4,
-  RID_ADDR_SPACE_5,
-  RID_ADDR_SPACE_6,
-  RID_ADDR_SPACE_7,
-  RID_ADDR_SPACE_8,
-  RID_ADDR_SPACE_9,
-  RID_ADDR_SPACE_10,
-  RID_ADDR_SPACE_11,
-  RID_ADDR_SPACE_12,
-  RID_ADDR_SPACE_13,
-  RID_ADDR_SPACE_14,
-  RID_ADDR_SPACE_15,
-
-  RID_FIRST_ADDR_SPACE = RID_ADDR_SPACE_0,
-  RID_LAST_ADDR_SPACE = RID_ADDR_SPACE_15,
-
-  RID_MAX,
-
-  RID_FIRST_MODIFIER = RID_STATIC,
-  RID_LAST_MODIFIER = RID_ONEWAY,
-
-  RID_FIRST_CXX0X = RID_CONSTEXPR,
-  RID_LAST_CXX0X = RID_STATIC_ASSERT,
-  RID_FIRST_AT = RID_AT_ENCODE,
-  RID_LAST_AT = RID_AT_IMPLEMENTATION,
-  RID_FIRST_PQ = RID_IN,
-  RID_LAST_PQ = RID_ONEWAY,
-  RID_FIRST_PATTR = RID_GETTER,
-  RID_LAST_PATTR = RID_NONATOMIC
-};
-
-#define OBJC_IS_AT_KEYWORD(rid) \
-  ((unsigned int) (rid) >= (unsigned int) RID_FIRST_AT && \
-   (unsigned int) (rid) <= (unsigned int) RID_LAST_AT)
-
-#define OBJC_IS_PQ_KEYWORD(rid) \
-  ((unsigned int) (rid) >= (unsigned int) RID_FIRST_PQ && \
-   (unsigned int) (rid) <= (unsigned int) RID_LAST_PQ)
-
-#define OBJC_IS_PATTR_KEYWORD(rid) \
-  ((unsigned int) (rid) >= (unsigned int) RID_FIRST_PATTR && \
-   (unsigned int) (rid) <= (unsigned int) RID_LAST_PATTR)
-
-/* OBJC_IS_CXX_KEYWORD recognizes the 'CXX_OBJC' keywords (such as
-   'class') which are shared in a subtle way between Objective-C and
-   C++.  When the lexer is lexing in Objective-C/Objective-C++, if it
-   finds '@' followed by one of these identifiers (eg, '@class'), it
-   recognizes the whole as an Objective-C keyword.  If the identifier
-   is found elsewhere, it follows the rules of the C/C++ language.
- */
-#define OBJC_IS_CXX_KEYWORD(rid) \
-  (rid == RID_CLASS							\
-   || rid == RID_PUBLIC || rid == RID_PROTECTED || rid == RID_PRIVATE	\
-   || rid == RID_TRY || rid == RID_THROW || rid == RID_CATCH)
-
-/* The elements of `ridpointers' are identifier nodes for the reserved
-   type names and storage classes.  It is indexed by a RID_... value.  */
-extern GTY ((length ("(int) RID_MAX"))) tree *ridpointers;
-
-/* Standard named or nameless data types of the C compiler.  */
-
-enum c_tree_index
-{
-    CTI_CHAR16_TYPE,
-    CTI_CHAR32_TYPE,
-    CTI_WCHAR_TYPE,
-    CTI_UNDERLYING_WCHAR_TYPE,
-    CTI_WINT_TYPE,
-    CTI_SIGNED_SIZE_TYPE, /* For format checking only.  */
-    CTI_UNSIGNED_PTRDIFF_TYPE, /* For format checking only.  */
-    CTI_INTMAX_TYPE,
-    CTI_UINTMAX_TYPE,
-    CTI_WIDEST_INT_LIT_TYPE,
-    CTI_WIDEST_UINT_LIT_TYPE,
-
-    /* Types for <stdint.h>, that may not be defined on all
-       targets.  */
-    CTI_SIG_ATOMIC_TYPE,
-    CTI_INT8_TYPE,
-    CTI_INT16_TYPE,
-    CTI_INT32_TYPE,
-    CTI_INT64_TYPE,
-    CTI_UINT8_TYPE,
-    CTI_UINT16_TYPE,
-    CTI_UINT32_TYPE,
-    CTI_UINT64_TYPE,
-    CTI_INT_LEAST8_TYPE,
-    CTI_INT_LEAST16_TYPE,
-    CTI_INT_LEAST32_TYPE,
-    CTI_INT_LEAST64_TYPE,
-    CTI_UINT_LEAST8_TYPE,
-    CTI_UINT_LEAST16_TYPE,
-    CTI_UINT_LEAST32_TYPE,
-    CTI_UINT_LEAST64_TYPE,
-    CTI_INT_FAST8_TYPE,
-    CTI_INT_FAST16_TYPE,
-    CTI_INT_FAST32_TYPE,
-    CTI_INT_FAST64_TYPE,
-    CTI_UINT_FAST8_TYPE,
-    CTI_UINT_FAST16_TYPE,
-    CTI_UINT_FAST32_TYPE,
-    CTI_UINT_FAST64_TYPE,
-    CTI_INTPTR_TYPE,
-    CTI_UINTPTR_TYPE,
-
-    CTI_CHAR_ARRAY_TYPE,
-    CTI_CHAR16_ARRAY_TYPE,
-    CTI_CHAR32_ARRAY_TYPE,
-    CTI_WCHAR_ARRAY_TYPE,
-    CTI_STRING_TYPE,
-    CTI_CONST_STRING_TYPE,
-
-    /* Type for boolean expressions (bool in C++, int in C).  */
-    CTI_TRUTHVALUE_TYPE,
-    CTI_TRUTHVALUE_TRUE,
-    CTI_TRUTHVALUE_FALSE,
-
-    CTI_DEFAULT_FUNCTION_TYPE,
-
-    /* These are not types, but we have to look them up all the time.  */
-    CTI_FUNCTION_NAME_DECL,
-    CTI_PRETTY_FUNCTION_NAME_DECL,
-    CTI_C99_FUNCTION_NAME_DECL,
-    CTI_SAVED_FUNCTION_NAME_DECLS,
-
-    CTI_VOID_ZERO,
-
-    CTI_NULL,
-
-    CTI_MAX
-};
-
-#define C_CPP_HASHNODE(id) \
-  (&(((struct c_common_identifier *) (id))->node))
-#define C_RID_CODE(id) \
-  ((enum rid) (((struct c_common_identifier *) (id))->node.rid_code))
-#define C_SET_RID_CODE(id, code) \
-  (((struct c_common_identifier *) (id))->node.rid_code = (unsigned char) code)
-
-/* Identifier part common to the C front ends.  Inherits from
-   tree_identifier, despite appearances.  */
-struct GTY(()) c_common_identifier {
-  struct tree_common common;
-  struct cpp_hashnode node;
-};
-
-/* An entry in the reserved keyword table.  */
-
-struct c_common_resword
-{
-  const char *const word;
-  ENUM_BITFIELD(rid) const rid : 16;
-  const unsigned int disable   : 16;
-};
-
-/* Extra cpp_ttype values for C++.  */
-
-/* A token type for keywords, as opposed to ordinary identifiers.  */
-#define CPP_KEYWORD ((enum cpp_ttype) (N_TTYPES + 1))
-
-/* A token type for template-ids.  If a template-id is processed while
-   parsing tentatively, it is replaced with a CPP_TEMPLATE_ID token;
-   the value of the CPP_TEMPLATE_ID is whatever was returned by
-   cp_parser_template_id.  */
-#define CPP_TEMPLATE_ID ((enum cpp_ttype) (CPP_KEYWORD + 1))
-
-/* A token type for nested-name-specifiers.  If a
-   nested-name-specifier is processed while parsing tentatively, it is
-   replaced with a CPP_NESTED_NAME_SPECIFIER token; the value of the
-   CPP_NESTED_NAME_SPECIFIER is whatever was returned by
-   cp_parser_nested_name_specifier_opt.  */
-#define CPP_NESTED_NAME_SPECIFIER ((enum cpp_ttype) (CPP_TEMPLATE_ID + 1))
-
-/* A token type for pre-parsed C++0x decltype.  */
-#define CPP_DECLTYPE ((enum cpp_ttype) (CPP_NESTED_NAME_SPECIFIER + 1))
-
-/* The number of token types, including C++-specific ones.  */
-#define N_CP_TTYPES ((int) (CPP_DECLTYPE + 1))
-
-/* Disable mask.  Keywords are disabled if (reswords[i].disable &
-   mask) is _true_.  Thus for keywords which are present in all
-   languages the disable field is zero.  */
-
-#define D_CONLY		0x001	/* C only (not in C++).  */
-#define D_CXXONLY	0x002	/* C++ only (not in C).  */
-#define D_C99		0x004	/* In C, C99 only.  */
-#define D_CXX0X         0x008	/* In C++, C++0X only.  */
-#define D_EXT		0x010	/* GCC extension.  */
-#define D_EXT89		0x020	/* GCC extension incorporated in C99.  */
-#define D_ASM		0x040	/* Disabled by -fno-asm.  */
-#define D_OBJC		0x080	/* In Objective C and neither C nor C++.  */
-#define D_CXX_OBJC	0x100	/* In Objective C, and C++, but not C.  */
-#define D_CXXWARN	0x200	/* In C warn with -Wcxx-compat.  */
-
-/* The reserved keyword table.  */
-extern const struct c_common_resword c_common_reswords[];
-
-/* The number of items in the reserved keyword table.  */
-extern const unsigned int num_c_common_reswords;
-
-#define char16_type_node		c_global_trees[CTI_CHAR16_TYPE]
-#define char32_type_node		c_global_trees[CTI_CHAR32_TYPE]
-#define wchar_type_node			c_global_trees[CTI_WCHAR_TYPE]
-#define underlying_wchar_type_node	c_global_trees[CTI_UNDERLYING_WCHAR_TYPE]
-#define wint_type_node			c_global_trees[CTI_WINT_TYPE]
-#define signed_size_type_node		c_global_trees[CTI_SIGNED_SIZE_TYPE]
-#define unsigned_ptrdiff_type_node	c_global_trees[CTI_UNSIGNED_PTRDIFF_TYPE]
-#define intmax_type_node		c_global_trees[CTI_INTMAX_TYPE]
-#define uintmax_type_node		c_global_trees[CTI_UINTMAX_TYPE]
-#define widest_integer_literal_type_node c_global_trees[CTI_WIDEST_INT_LIT_TYPE]
-#define widest_unsigned_literal_type_node c_global_trees[CTI_WIDEST_UINT_LIT_TYPE]
-
-#define sig_atomic_type_node		c_global_trees[CTI_SIG_ATOMIC_TYPE]
-#define int8_type_node			c_global_trees[CTI_INT8_TYPE]
-#define int16_type_node			c_global_trees[CTI_INT16_TYPE]
-#define int32_type_node			c_global_trees[CTI_INT32_TYPE]
-#define int64_type_node			c_global_trees[CTI_INT64_TYPE]
-#define uint8_type_node			c_global_trees[CTI_UINT8_TYPE]
-#define c_uint16_type_node		c_global_trees[CTI_UINT16_TYPE]
-#define c_uint32_type_node		c_global_trees[CTI_UINT32_TYPE]
-#define c_uint64_type_node		c_global_trees[CTI_UINT64_TYPE]
-#define int_least8_type_node		c_global_trees[CTI_INT_LEAST8_TYPE]
-#define int_least16_type_node		c_global_trees[CTI_INT_LEAST16_TYPE]
-#define int_least32_type_node		c_global_trees[CTI_INT_LEAST32_TYPE]
-#define int_least64_type_node		c_global_trees[CTI_INT_LEAST64_TYPE]
-#define uint_least8_type_node		c_global_trees[CTI_UINT_LEAST8_TYPE]
-#define uint_least16_type_node		c_global_trees[CTI_UINT_LEAST16_TYPE]
-#define uint_least32_type_node		c_global_trees[CTI_UINT_LEAST32_TYPE]
-#define uint_least64_type_node		c_global_trees[CTI_UINT_LEAST64_TYPE]
-#define int_fast8_type_node		c_global_trees[CTI_INT_FAST8_TYPE]
-#define int_fast16_type_node		c_global_trees[CTI_INT_FAST16_TYPE]
-#define int_fast32_type_node		c_global_trees[CTI_INT_FAST32_TYPE]
-#define int_fast64_type_node		c_global_trees[CTI_INT_FAST64_TYPE]
-#define uint_fast8_type_node		c_global_trees[CTI_UINT_FAST8_TYPE]
-#define uint_fast16_type_node		c_global_trees[CTI_UINT_FAST16_TYPE]
-#define uint_fast32_type_node		c_global_trees[CTI_UINT_FAST32_TYPE]
-#define uint_fast64_type_node		c_global_trees[CTI_UINT_FAST64_TYPE]
-#define intptr_type_node		c_global_trees[CTI_INTPTR_TYPE]
-#define uintptr_type_node		c_global_trees[CTI_UINTPTR_TYPE]
-
-#define truthvalue_type_node		c_global_trees[CTI_TRUTHVALUE_TYPE]
-#define truthvalue_true_node		c_global_trees[CTI_TRUTHVALUE_TRUE]
-#define truthvalue_false_node		c_global_trees[CTI_TRUTHVALUE_FALSE]
-
-#define char_array_type_node		c_global_trees[CTI_CHAR_ARRAY_TYPE]
-#define char16_array_type_node		c_global_trees[CTI_CHAR16_ARRAY_TYPE]
-#define char32_array_type_node		c_global_trees[CTI_CHAR32_ARRAY_TYPE]
-#define wchar_array_type_node		c_global_trees[CTI_WCHAR_ARRAY_TYPE]
-#define string_type_node		c_global_trees[CTI_STRING_TYPE]
-#define const_string_type_node		c_global_trees[CTI_CONST_STRING_TYPE]
-
-#define default_function_type		c_global_trees[CTI_DEFAULT_FUNCTION_TYPE]
-
-#define function_name_decl_node		c_global_trees[CTI_FUNCTION_NAME_DECL]
-#define pretty_function_name_decl_node	c_global_trees[CTI_PRETTY_FUNCTION_NAME_DECL]
-#define c99_function_name_decl_node		c_global_trees[CTI_C99_FUNCTION_NAME_DECL]
-#define saved_function_name_decls	c_global_trees[CTI_SAVED_FUNCTION_NAME_DECLS]
-
-/* A node for `((void) 0)'.  */
-#define void_zero_node                  c_global_trees[CTI_VOID_ZERO]
-
-/* The node for C++ `__null'.  */
-#define null_node                       c_global_trees[CTI_NULL]
-
-extern GTY(()) tree c_global_trees[CTI_MAX];
-
-/* In a RECORD_TYPE, a sorted array of the fields of the type, not a
-   tree for size reasons.  */
-struct GTY((variable_size)) sorted_fields_type {
-  int len;
-  tree GTY((length ("%h.len"))) elts[1];
-};
-
-/* Mark which labels are explicitly declared.
-   These may be shadowed, and may be referenced from nested functions.  */
-#define C_DECLARED_LABEL_FLAG(label) TREE_LANG_FLAG_1 (label)
-
-typedef enum c_language_kind
-{
-  clk_c		= 0,		/* C90, C94 or C99 */
-  clk_objc	= 1,		/* clk_c with ObjC features.  */
-  clk_cxx	= 2,		/* ANSI/ISO C++ */
-  clk_objcxx	= 3		/* clk_cxx with ObjC features.  */
-}
-c_language_kind;
-
-/* To test for a specific language use c_language, defined by each
-   front end.  For "ObjC features" or "not C++" use the macros.  */
-extern c_language_kind c_language;
-
-#define c_dialect_cxx()		((c_language & clk_cxx) != 0)
-#define c_dialect_objc()	((c_language & clk_objc) != 0)
-
-/* The various name of operator that appears in error messages. */
-typedef enum ref_operator {
-  /* NULL */
-  RO_NULL,
-  /* array indexing */
-  RO_ARRAY_INDEXING,
-  /* unary * */
-  RO_UNARY_STAR,
-  /* -> */
-  RO_ARROW,
-  /* implicit conversion */
-  RO_IMPLICIT_CONVERSION,
-  /* ->* */
-  RO_ARROW_STAR
-} ref_operator;
-
-/* Information about a statement tree.  */
-
-struct GTY(()) stmt_tree_s {
-  /* A stack of statement lists being collected.  */
-  vec<tree, va_gc> *x_cur_stmt_list;
-
-  /* In C++, Nonzero if we should treat statements as full
-     expressions.  In particular, this variable is non-zero if at the
-     end of a statement we should destroy any temporaries created
-     during that statement.  Similarly, if, at the end of a block, we
-     should destroy any local variables in this block.  Normally, this
-     variable is nonzero, since those are the normal semantics of
-     C++.
-
-     This flag has no effect in C.  */
-  int stmts_are_full_exprs_p;
-};
-
-typedef struct stmt_tree_s *stmt_tree;
-
-/* Global state pertinent to the current function.  Some C dialects
-   extend this structure with additional fields.  */
-
-struct GTY(()) c_language_function {
-  /* While we are parsing the function, this contains information
-     about the statement-tree that we are building.  */
-  struct stmt_tree_s x_stmt_tree;
-
-  /* Vector of locally defined typedefs, for
-     -Wunused-local-typedefs.  */
-  vec<tree, va_gc> *local_typedefs;
-};
-
-#define stmt_list_stack (current_stmt_tree ()->x_cur_stmt_list)
-
-/* When building a statement-tree, this is the current statement list
-   being collected.  */
-#define cur_stmt_list	(stmt_list_stack->last ())
-
-#define building_stmt_list_p() (stmt_list_stack && !stmt_list_stack->is_empty())
-
-/* Language-specific hooks.  */
-
-/* If non-NULL, this function is called after a precompile header file
-   is loaded.  */
-extern void (*lang_post_pch_load) (void);
-
-extern void push_file_scope (void);
-extern void pop_file_scope (void);
-extern stmt_tree current_stmt_tree (void);
-extern tree push_stmt_list (void);
-extern tree pop_stmt_list (tree);
-extern tree add_stmt (tree);
-extern void push_cleanup (tree, tree, bool);
-extern tree pushdecl_top_level (tree);
-extern tree pushdecl (tree);
-extern tree build_modify_expr (location_t, tree, tree, enum tree_code,
-			       location_t, tree, tree);
-extern tree build_array_notation_expr (location_t, tree, tree, enum tree_code,
-				       location_t, tree, tree);
-extern tree build_array_notation_ref (location_t, tree, tree, tree, tree, tree);
-extern tree build_indirect_ref (location_t, tree, ref_operator);
-
-extern int field_decl_cmp (const void *, const void *);
-extern void resort_sorted_fields (void *, void *, gt_pointer_operator,
-				  void *);
-extern bool has_c_linkage (const_tree decl);
-
-/* Switches common to the C front ends.  */
-
-/* Nonzero means don't output line number information.  */
-
-extern char flag_no_line_commands;
-
-/* Nonzero causes -E output not to be done, but directives such as
-   #define that have side effects are still obeyed.  */
-
-extern char flag_no_output;
-
-/* Nonzero means dump macros in some fashion; contains the 'D', 'M',
-   'N' or 'U' of the command line switch.  */
-
-extern char flag_dump_macros;
-
-/* Nonzero means pass #include lines through to the output.  */
-
-extern char flag_dump_includes;
-
-/* Nonzero means process PCH files while preprocessing.  */
-
-extern bool flag_pch_preprocess;
-
-/* The file name to which we should write a precompiled header, or
-   NULL if no header will be written in this compile.  */
-
-extern const char *pch_file;
-
-/* Nonzero if an ISO standard was selected.  It rejects macros in the
-   user's namespace.  */
-
-extern int flag_iso;
-
-/* C/ObjC language option variables.  */
-
-
-/* Nonzero means allow type mismatches in conditional expressions;
-   just make their values `void'.  */
-
-extern int flag_cond_mismatch;
-
-/* Nonzero means enable C89 Amendment 1 features.  */
-
-extern int flag_isoc94;
-
-/* Nonzero means use the ISO C99 (or C11) dialect of C.  */
-
-extern int flag_isoc99;
-
-/* Nonzero means use the ISO C11 dialect of C.  */
-
-extern int flag_isoc11;
-
-/* Nonzero means that we have builtin functions, and main is an int.  */
-
-extern int flag_hosted;
-
-/* ObjC language option variables.  */
-
-
-/* Tells the compiler that this is a special run.  Do not perform any
-   compiling, instead we are to test some platform dependent features
-   and output a C header file with appropriate definitions.  */
-
-extern int print_struct_values;
-
-/* Tells the compiler what is the constant string class for ObjC.  */
-
-extern const char *constant_string_class_name;
-
-
-/* C++ language option variables.  */
-
-
-/* Nonzero means generate separate instantiation control files and
-   juggle them at link time.  */
-
-extern int flag_use_repository;
-
-/* The supported C++ dialects.  */
-
-enum cxx_dialect {
-  /* C++98 with TC1  */
-  cxx98,
-  cxx03 = cxx98,
-  /* C++11  */
-  cxx0x,
-  cxx11 = cxx0x,
-  /* C++1y (C++17?) */
-  cxx1y
-};
-
-/* The C++ dialect being used. C++98 is the default.  */
-extern enum cxx_dialect cxx_dialect;
-
-/* Maximum template instantiation depth.  This limit is rather
-   arbitrary, but it exists to limit the time it takes to notice
-   excessively recursive template instantiations.  */
-
-extern int max_tinst_depth;
-
-/* Nonzero means that we should not issue warnings about problems that
-   occur when the code is executed, because the code being processed
-   is not expected to be executed.  This is set during parsing.  This
-   is used for cases like sizeof() and "0 ? a : b".  This is a count,
-   not a bool, because unexecuted expressions can nest.  */
-
-extern int c_inhibit_evaluation_warnings;
-
-/* Whether lexing has been completed, so subsequent preprocessor
-   errors should use the compiler's input_location.  */
-
-extern bool done_lexing;
-
-/* C types are partitioned into three subsets: object, function, and
-   incomplete types.  */
-#define C_TYPE_OBJECT_P(type) \
-  (TREE_CODE (type) != FUNCTION_TYPE && TYPE_SIZE (type))
-
-#define C_TYPE_INCOMPLETE_P(type) \
-  (TREE_CODE (type) != FUNCTION_TYPE && TYPE_SIZE (type) == 0)
-
-#define C_TYPE_FUNCTION_P(type) \
-  (TREE_CODE (type) == FUNCTION_TYPE)
-
-/* For convenience we define a single macro to identify the class of
-   object or incomplete types.  */
-#define C_TYPE_OBJECT_OR_INCOMPLETE_P(type) \
-  (!C_TYPE_FUNCTION_P (type))
-
-struct visibility_flags
-{
-  unsigned inpragma : 1;	/* True when in #pragma GCC visibility.  */
-  unsigned inlines_hidden : 1;	/* True when -finlineshidden in effect.  */
-};
-
-/* These enumerators are possible types of unsafe conversions.
-   SAFE_CONVERSION The conversion is safe
-   UNSAFE_OTHER Another type of conversion with problems
-   UNSAFE_SIGN Conversion between signed and unsigned integers
-    which are all warned about immediately, so this is unused
-   UNSAFE_REAL Conversions that reduce the precision of reals
-    including conversions from reals to integers
- */
-enum conversion_safety { SAFE_CONVERSION = 0, UNSAFE_OTHER, UNSAFE_SIGN, UNSAFE_REAL };
-
-/* Global visibility options.  */
-extern struct visibility_flags visibility_options;
-
-/* Attribute table common to the C front ends.  */
-extern const struct attribute_spec c_common_attribute_table[];
-extern const struct attribute_spec c_common_format_attribute_table[];
-
-/* Pointer to function to lazily generate the VAR_DECL for __FUNCTION__ etc.
-   ID is the identifier to use, NAME is the string.
-   TYPE_DEP indicates whether it depends on type of the function or not
-   (i.e. __PRETTY_FUNCTION__).  */
-
-extern tree (*make_fname_decl) (location_t, tree, int);
-
-/* In c-decl.c and cp/tree.c.  FIXME.  */
-extern void c_register_addr_space (const char *str, addr_space_t as);
-
-/* In c-common.c.  */
-extern bool in_late_binary_op;
-extern const char *c_addr_space_name (addr_space_t as);
-extern tree identifier_global_value (tree);
-extern tree c_linkage_bindings (tree);
-extern void record_builtin_type (enum rid, const char *, tree);
-extern tree build_void_list_node (void);
-extern void start_fname_decls (void);
-extern void finish_fname_decls (void);
-extern const char *fname_as_string (int);
-extern tree fname_decl (location_t, unsigned, tree);
-
-extern int check_user_alignment (const_tree, bool);
-extern void check_function_arguments (const_tree, int, tree *);
-extern void check_function_arguments_recurse (void (*)
-					      (void *, tree,
-					       unsigned HOST_WIDE_INT),
-					      void *, tree,
-					      unsigned HOST_WIDE_INT);
-extern bool check_builtin_function_arguments (tree, int, tree *);
-extern void check_function_format (tree, int, tree *);
-extern tree handle_format_attribute (tree *, tree, tree, int, bool *);
-extern tree handle_format_arg_attribute (tree *, tree, tree, int, bool *);
-extern bool attribute_takes_identifier_p (const_tree);
-extern bool c_common_handle_option (size_t, const char *, int, int, location_t,
-				    const struct cl_option_handlers *);
-extern bool default_handle_c_option (size_t, const char *, int);
-extern tree c_common_type_for_mode (enum machine_mode, int);
-extern tree c_common_type_for_size (unsigned int, int);
-extern tree c_common_fixed_point_type_for_size (unsigned int, unsigned int,
-						int, int);
-extern tree c_common_unsigned_type (tree);
-extern tree c_common_signed_type (tree);
-extern tree c_common_signed_or_unsigned_type (int, tree);
-extern void c_common_init_ts (void);
-extern tree c_build_bitfield_integer_type (unsigned HOST_WIDE_INT, int);
-extern enum conversion_safety unsafe_conversion_p (location_t, tree, tree,
-						   bool);
-extern bool decl_with_nonnull_addr_p (const_tree);
-extern tree c_fully_fold (tree, bool, bool *);
-extern tree decl_constant_value_for_optimization (tree);
-extern tree c_wrap_maybe_const (tree, bool);
-extern tree c_save_expr (tree);
-extern tree c_common_truthvalue_conversion (location_t, tree);
-extern void c_apply_type_quals_to_decl (int, tree);
-extern unsigned int min_align_of_type (tree);
-extern tree c_sizeof_or_alignof_type (location_t, tree, bool, bool, int);
-extern tree c_alignof_expr (location_t, tree);
-/* Print an error message for invalid operands to arith operation CODE.
-   NOP_EXPR is used as a special case (see truthvalue_conversion).  */
-extern void binary_op_error (location_t, enum tree_code, tree, tree);
-extern tree fix_string_type (tree);
-extern void constant_expression_warning (tree);
-extern void constant_expression_error (tree);
-extern bool strict_aliasing_warning (tree, tree, tree);
-extern void sizeof_pointer_memaccess_warning (location_t *, tree,
-					      vec<tree, va_gc> *, tree *,
-					      bool (*) (tree, tree));
-extern void warnings_for_convert_and_check (location_t, tree, tree, tree);
-extern tree convert_and_check (location_t, tree, tree);
-extern void overflow_warning (location_t, tree);
-extern bool warn_if_unused_value (const_tree, location_t);
-extern void warn_logical_operator (location_t, enum tree_code, tree,
-				   enum tree_code, tree, enum tree_code, tree);
-extern void check_main_parameter_types (tree decl);
-extern bool c_determine_visibility (tree);
-extern bool vector_types_compatible_elements_p (tree, tree);
-extern void mark_valid_location_for_stdc_pragma (bool);
-extern bool valid_location_for_stdc_pragma_p (void);
-extern void set_float_const_decimal64 (void);
-extern void clear_float_const_decimal64 (void);
-extern bool float_const_decimal64_p (void);
-
-extern bool keyword_begins_type_specifier (enum rid);
-extern bool keyword_is_storage_class_specifier (enum rid);
-extern bool keyword_is_type_qualifier (enum rid);
-extern bool keyword_is_decl_specifier (enum rid);
-extern bool cxx_fundamental_alignment_p (unsigned);
-extern bool pointer_to_zero_sized_aggr_p (tree);
-
-#define c_sizeof(LOC, T)  c_sizeof_or_alignof_type (LOC, T, true, false, 1)
-#define c_alignof(LOC, T) c_sizeof_or_alignof_type (LOC, T, false, false, 1)
-
-/* Subroutine of build_binary_op, used for certain operations.  */
-extern tree shorten_binary_op (tree result_type, tree op0, tree op1, bool bitwise);
-
-/* Subroutine of build_binary_op, used for comparison operations.
-   See if the operands have both been converted from subword integer types
-   and, if so, perhaps change them both back to their original type.  */
-extern tree shorten_compare (location_t, tree *, tree *, tree *,
-			     enum tree_code *);
-
-extern tree pointer_int_sum (location_t, enum tree_code, tree, tree,
-			     bool = true);
-
-/* Add qualifiers to a type, in the fashion for C.  */
-extern tree c_build_qualified_type (tree, int);
-
-/* Build tree nodes and builtin functions common to both C and C++ language
-   frontends.  */
-extern void c_common_nodes_and_builtins (void);
-
-extern void disable_builtin_function (const char *);
-
-extern void set_compound_literal_name (tree decl);
-
-extern tree build_va_arg (location_t, tree, tree);
-
-extern const unsigned int c_family_lang_mask;
-extern unsigned int c_common_option_lang_mask (void);
-extern void c_common_initialize_diagnostics (diagnostic_context *);
-extern bool c_common_complain_wrong_lang_p (const struct cl_option *);
-extern void c_common_init_options_struct (struct gcc_options *);
-extern void c_common_init_options (unsigned int, struct cl_decoded_option *);
-extern bool c_common_post_options (const char **);
-extern bool c_common_init (void);
-extern void c_common_finish (void);
-extern void c_common_parse_file (void);
-extern alias_set_type c_common_get_alias_set (tree);
-extern void c_register_builtin_type (tree, const char*);
-extern bool c_promoting_integer_type_p (const_tree);
-extern int self_promoting_args_p (const_tree);
-extern tree strip_pointer_operator (tree);
-extern tree strip_pointer_or_array_types (tree);
-extern HOST_WIDE_INT c_common_to_target_charset (HOST_WIDE_INT);
-
-/* This is the basic parsing function.  */
-extern void c_parse_file (void);
-
-extern void warn_for_omitted_condop (location_t, tree);
-
-/* These macros provide convenient access to the various _STMT nodes.  */
-
-/* Nonzero if a given STATEMENT_LIST represents the outermost binding
-   if a statement expression.  */
-#define STATEMENT_LIST_STMT_EXPR(NODE) \
-  TREE_LANG_FLAG_1 (STATEMENT_LIST_CHECK (NODE))
-
-/* Nonzero if a label has been added to the statement list.  */
-#define STATEMENT_LIST_HAS_LABEL(NODE) \
-  TREE_LANG_FLAG_3 (STATEMENT_LIST_CHECK (NODE))
-
-/* C_MAYBE_CONST_EXPR accessors.  */
-#define C_MAYBE_CONST_EXPR_PRE(NODE)			\
-  TREE_OPERAND (C_MAYBE_CONST_EXPR_CHECK (NODE), 0)
-#define C_MAYBE_CONST_EXPR_EXPR(NODE)			\
-  TREE_OPERAND (C_MAYBE_CONST_EXPR_CHECK (NODE), 1)
-#define C_MAYBE_CONST_EXPR_INT_OPERANDS(NODE)		\
-  TREE_LANG_FLAG_0 (C_MAYBE_CONST_EXPR_CHECK (NODE))
-#define C_MAYBE_CONST_EXPR_NON_CONST(NODE)		\
-  TREE_LANG_FLAG_1 (C_MAYBE_CONST_EXPR_CHECK (NODE))
-#define EXPR_INT_CONST_OPERANDS(EXPR)			\
-  (INTEGRAL_TYPE_P (TREE_TYPE (EXPR))			\
-   && (TREE_CODE (EXPR) == INTEGER_CST			\
-       || (TREE_CODE (EXPR) == C_MAYBE_CONST_EXPR	\
-	   && C_MAYBE_CONST_EXPR_INT_OPERANDS (EXPR))))
-
-/* In a FIELD_DECL, nonzero if the decl was originally a bitfield.  */
-#define DECL_C_BIT_FIELD(NODE) \
-  (DECL_LANG_FLAG_4 (FIELD_DECL_CHECK (NODE)) == 1)
-#define SET_DECL_C_BIT_FIELD(NODE) \
-  (DECL_LANG_FLAG_4 (FIELD_DECL_CHECK (NODE)) = 1)
-#define CLEAR_DECL_C_BIT_FIELD(NODE) \
-  (DECL_LANG_FLAG_4 (FIELD_DECL_CHECK (NODE)) = 0)
-
-extern tree do_case (location_t, tree, tree);
-extern tree build_stmt (location_t, enum tree_code, ...);
-extern tree build_real_imag_expr (location_t, enum tree_code, tree);
-
-/* These functions must be defined by each front-end which implements
-   a variant of the C language.  They are used in c-common.c.  */
-
-extern tree build_unary_op (location_t, enum tree_code, tree, int);
-extern tree build_binary_op (location_t, enum tree_code, tree, tree, int);
-extern tree perform_integral_promotions (tree);
-
-/* These functions must be defined by each front-end which implements
-   a variant of the C language.  They are used by port files.  */
-
-extern tree default_conversion (tree);
-
-/* Given two integer or real types, return the type for their sum.
-   Given two compatible ANSI C types, returns the merged type.  */
-
-extern tree common_type (tree, tree);
-
-extern tree decl_constant_value (tree);
-
-/* Handle increment and decrement of boolean types.  */
-extern tree boolean_increment (enum tree_code, tree);
-
-extern int case_compare (splay_tree_key, splay_tree_key);
-
-extern tree c_add_case_label (location_t, splay_tree, tree, tree, tree, tree);
-
-extern void c_do_switch_warnings (splay_tree, location_t, tree, tree);
-
-extern tree build_function_call (location_t, tree, tree);
-
-extern tree build_function_call_vec (location_t, vec<location_t>, tree,
-				     vec<tree, va_gc> *, vec<tree, va_gc> *);
-
-extern tree resolve_overloaded_builtin (location_t, tree, vec<tree, va_gc> *);
-
-extern tree finish_label_address_expr (tree, location_t);
-
-/* Same function prototype, but the C and C++ front ends have
-   different implementations.  Used in c-common.c.  */
-extern tree lookup_label (tree);
-extern tree lookup_name (tree);
-extern bool lvalue_p (const_tree);
-
-extern bool vector_targets_convertible_p (const_tree t1, const_tree t2);
-extern bool vector_types_convertible_p (const_tree t1, const_tree t2, bool emit_lax_note);
-extern tree c_build_vec_perm_expr (location_t, tree, tree, tree, bool = true);
-
-extern void init_c_lex (void);
-
-extern void c_cpp_builtins (cpp_reader *);
-extern void c_cpp_builtins_optimize_pragma (cpp_reader *, tree, tree);
-extern bool c_cpp_error (cpp_reader *, int, int, location_t, unsigned int,
-			 const char *, va_list *)
-     ATTRIBUTE_GCC_DIAG(6,0);
-
-extern bool parse_optimize_options (tree, bool);
-
-/* Positive if an implicit `extern "C"' scope has just been entered;
-   negative if such a scope has just been exited.  */
-extern GTY(()) int pending_lang_change;
-
-/* Information recorded about each file examined during compilation.  */
-
-struct c_fileinfo
-{
-  int time;	/* Time spent in the file.  */
-
-  /* Flags used only by C++.
-     INTERFACE_ONLY nonzero means that we are in an "interface" section
-     of the compiler.  INTERFACE_UNKNOWN nonzero means we cannot trust
-     the value of INTERFACE_ONLY.  If INTERFACE_UNKNOWN is zero and
-     INTERFACE_ONLY is zero, it means that we are responsible for
-     exporting definitions that others might need.  */
-  short interface_only;
-  short interface_unknown;
-};
-
-struct c_fileinfo *get_fileinfo (const char *);
-extern void dump_time_statistics (void);
-
-extern bool c_dump_tree (void *, tree);
-
-extern void verify_sequence_points (tree);
-
-extern tree fold_offsetof_1 (tree);
-extern tree fold_offsetof (tree);
-
-/* Places where an lvalue, or modifiable lvalue, may be required.
-   Used to select diagnostic messages in lvalue_error and
-   readonly_error.  */
-enum lvalue_use {
-  lv_assign,
-  lv_increment,
-  lv_decrement,
-  lv_addressof,
-  lv_asm
-};
-
-extern void readonly_error (location_t, tree, enum lvalue_use);
-extern void lvalue_error (location_t, enum lvalue_use);
-extern void invalid_indirection_error (location_t, tree, ref_operator);
-
-extern int complete_array_type (tree *, tree, bool);
-
-extern tree builtin_type_for_size (int, bool);
-
-extern void c_common_mark_addressable_vec (tree);
-
-extern void warn_array_subscript_with_type_char (tree);
-extern void warn_about_parentheses (location_t,
-				    enum tree_code,
-				    enum tree_code, tree,
-				    enum tree_code, tree);
-extern void warn_for_unused_label (tree label);
-extern void warn_for_div_by_zero (location_t, tree divisor);
-extern void warn_for_sign_compare (location_t,
-				   tree orig_op0, tree orig_op1,
-				   tree op0, tree op1,
-				   tree result_type,
-				   enum tree_code resultcode);
-extern void do_warn_double_promotion (tree, tree, tree, const char *, 
-				      location_t);
-extern void set_underlying_type (tree);
-extern void record_locally_defined_typedef (tree);
-extern void maybe_record_typedef_use (tree);
-extern void maybe_warn_unused_local_typedefs (void);
-extern vec<tree, va_gc> *make_tree_vector (void);
-extern void release_tree_vector (vec<tree, va_gc> *);
-extern vec<tree, va_gc> *make_tree_vector_single (tree);
-extern vec<tree, va_gc> *make_tree_vector_from_list (tree);
-extern vec<tree, va_gc> *make_tree_vector_copy (const vec<tree, va_gc> *);
-
-/* In c-gimplify.c  */
-extern void c_genericize (tree);
-extern int c_gimplify_expr (tree *, gimple_seq *, gimple_seq *);
-extern tree c_build_bind_expr (location_t, tree, tree);
-
-/* In c-pch.c  */
-extern void pch_init (void);
-extern void pch_cpp_save_state (void);
-extern int c_common_valid_pch (cpp_reader *pfile, const char *name, int fd);
-extern void c_common_read_pch (cpp_reader *pfile, const char *name, int fd,
-			       const char *orig);
-extern void c_common_write_pch (void);
-extern void c_common_no_more_pch (void);
-extern void c_common_pch_pragma (cpp_reader *pfile, const char *);
-
-/* In *-checksum.c */
-extern const unsigned char executable_checksum[16];
-
-/* In c-cppbuiltin.c  */
-extern void builtin_define_std (const char *macro);
-extern void builtin_define_with_value (const char *, const char *, int);
-extern void c_stddef_cpp_builtins (void);
-extern void fe_file_change (const struct line_map *);
-extern void c_parse_error (const char *, enum cpp_ttype, tree, unsigned char);
-
-/* In c-ppoutput.c  */
-extern void init_pp_output (FILE *);
-extern void preprocess_file (cpp_reader *);
-extern void pp_file_change (const struct line_map *);
-extern void pp_dir_change (cpp_reader *, const char *);
-extern bool check_missing_format_attribute (tree, tree);
-
-/* In c-omp.c  */
-#if HOST_BITS_PER_WIDE_INT >= 64
-typedef unsigned HOST_WIDE_INT omp_clause_mask;
-# define OMP_CLAUSE_MASK_1 ((omp_clause_mask) 1)
-#else
-struct omp_clause_mask
-{
-  inline omp_clause_mask ();
-  inline omp_clause_mask (unsigned HOST_WIDE_INT l);
-  inline omp_clause_mask (unsigned HOST_WIDE_INT l,
-			  unsigned HOST_WIDE_INT h);
-  inline omp_clause_mask &operator &= (omp_clause_mask);
-  inline omp_clause_mask &operator |= (omp_clause_mask);
-  inline omp_clause_mask operator ~ () const;
-  inline omp_clause_mask operator & (omp_clause_mask) const;
-  inline omp_clause_mask operator | (omp_clause_mask) const;
-  inline omp_clause_mask operator >> (int);
-  inline omp_clause_mask operator << (int);
-  inline bool operator == (omp_clause_mask) const;
-  inline bool operator != (omp_clause_mask) const;
-  unsigned HOST_WIDE_INT low, high;
-};
-
-inline
-omp_clause_mask::omp_clause_mask ()
-{
-}
-
-inline
-omp_clause_mask::omp_clause_mask (unsigned HOST_WIDE_INT l)
-: low (l), high (0)
-{
-}
-
-inline
-omp_clause_mask::omp_clause_mask (unsigned HOST_WIDE_INT l,
-				  unsigned HOST_WIDE_INT h)
-: low (l), high (h)
-{
-}
-
-inline omp_clause_mask &
-omp_clause_mask::operator &= (omp_clause_mask b)
-{
-  low &= b.low;
-  high &= b.high;
-  return *this;
-}
-
-inline omp_clause_mask &
-omp_clause_mask::operator |= (omp_clause_mask b)
-{
-  low |= b.low;
-  high |= b.high;
-  return *this;
-}
-
-inline omp_clause_mask
-omp_clause_mask::operator ~ () const
-{
-  omp_clause_mask ret (~low, ~high);
-  return ret;
-}
-
-inline omp_clause_mask
-omp_clause_mask::operator | (omp_clause_mask b) const
-{
-  omp_clause_mask ret (low | b.low, high | b.high);
-  return ret;
-}
-
-inline omp_clause_mask
-omp_clause_mask::operator & (omp_clause_mask b) const
-{
-  omp_clause_mask ret (low & b.low, high & b.high);
-  return ret;
-}
-
-inline omp_clause_mask
-omp_clause_mask::operator << (int amount)
-{
-  omp_clause_mask ret;
-  if (amount >= HOST_BITS_PER_WIDE_INT)
-    {
-      ret.low = 0;
-      ret.high = low << (amount - HOST_BITS_PER_WIDE_INT);
-    }
-  else if (amount == 0)
-    ret = *this;
-  else
-    {
-      ret.low = low << amount;
-      ret.high = (low >> (HOST_BITS_PER_WIDE_INT - amount))
-		 | (high << amount);
-    }
-  return ret;
-}
-
-inline omp_clause_mask
-omp_clause_mask::operator >> (int amount)
-{
-  omp_clause_mask ret;
-  if (amount >= HOST_BITS_PER_WIDE_INT)
-    {
-      ret.low = high >> (amount - HOST_BITS_PER_WIDE_INT);
-      ret.high = 0;
-    }
-  else if (amount == 0)
-    ret = *this;
-  else
-    {
-      ret.low = (high << (HOST_BITS_PER_WIDE_INT - amount))
-		 | (low >> amount);
-      ret.high = high >> amount;
-    }
-  return ret;
-}
-
-inline bool
-omp_clause_mask::operator == (omp_clause_mask b) const
-{
-  return low == b.low && high == b.high;
-}
-
-inline bool
-omp_clause_mask::operator != (omp_clause_mask b) const
-{
-  return low != b.low || high != b.high;
-}
-
-# define OMP_CLAUSE_MASK_1 omp_clause_mask (1)
-#endif
-
-enum c_omp_clause_split
-{
-  C_OMP_CLAUSE_SPLIT_TARGET = 0,
-  C_OMP_CLAUSE_SPLIT_TEAMS,
-  C_OMP_CLAUSE_SPLIT_DISTRIBUTE,
-  C_OMP_CLAUSE_SPLIT_PARALLEL,
-  C_OMP_CLAUSE_SPLIT_FOR,
-  C_OMP_CLAUSE_SPLIT_SIMD,
-  C_OMP_CLAUSE_SPLIT_COUNT,
-  C_OMP_CLAUSE_SPLIT_SECTIONS = C_OMP_CLAUSE_SPLIT_FOR
-};
-
-extern tree c_finish_omp_master (location_t, tree);
-extern tree c_finish_omp_taskgroup (location_t, tree);
-extern tree c_finish_omp_critical (location_t, tree, tree);
-extern tree c_finish_omp_ordered (location_t, tree);
-extern void c_finish_omp_barrier (location_t);
-extern tree c_finish_omp_atomic (location_t, enum tree_code, enum tree_code,
-				 tree, tree, tree, tree, tree, bool, bool);
-extern void c_finish_omp_flush (location_t);
-extern void c_finish_omp_taskwait (location_t);
-extern void c_finish_omp_taskyield (location_t);
-extern tree c_finish_omp_for (location_t, enum tree_code, tree, tree, tree,
-			      tree, tree, tree);
-extern void c_omp_split_clauses (location_t, enum tree_code, omp_clause_mask,
-				 tree, tree *);
-extern tree c_omp_declare_simd_clauses_to_numbers (tree, tree);
-extern void c_omp_declare_simd_clauses_to_decls (tree, tree);
-extern enum omp_clause_default_kind c_omp_predetermined_sharing (tree);
-
-/* Not in c-omp.c; provided by the front end.  */
-extern bool c_omp_sharing_predetermined (tree);
-extern tree c_omp_remap_decl (tree, bool);
-extern void record_types_used_by_current_var_decl (tree);
-
-/* Return next tree in the chain for chain_next walking of tree nodes.  */
-static inline tree
-c_tree_chain_next (tree t)
-{
-  /* TREE_CHAIN of a type is TYPE_STUB_DECL, which is different
-     kind of object, never a long chain of nodes.  Prefer
-     TYPE_NEXT_VARIANT for types.  */
-  if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_TYPE_COMMON))
-    return TYPE_NEXT_VARIANT (t);
-  /* Otherwise, if there is TREE_CHAIN, return it.  */
-  if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_COMMON))
-    return TREE_CHAIN (t);
-  return NULL;
-}
-
-/* Mask used by tm_stmt_attr.  */
-#define TM_STMT_ATTR_OUTER	2
-#define TM_STMT_ATTR_ATOMIC	4
-#define TM_STMT_ATTR_RELAXED	8
-
-extern int parse_tm_stmt_attr (tree, int);
-
-/* Mask used by tm_attr_to_mask and tm_mask_to_attr.  Note that these
-   are ordered specifically such that more restrictive attributes are
-   at lower bit positions.  This fact is known by the C++ tm attribute
-   inheritance code such that least bit extraction (mask & -mask) results
-   in the most restrictive attribute.  */
-#define TM_ATTR_SAFE			1
-#define TM_ATTR_CALLABLE		2
-#define TM_ATTR_PURE			4
-#define TM_ATTR_IRREVOCABLE		8
-#define TM_ATTR_MAY_CANCEL_OUTER	16
-
-extern int tm_attr_to_mask (tree);
-extern tree tm_mask_to_attr (int);
-extern tree find_tm_attribute (tree);
-
-/* A suffix-identifier value doublet that represents user-defined literals
-   for C++-0x.  */
-enum overflow_type {
-  OT_UNDERFLOW = -1,
-  OT_NONE,
-  OT_OVERFLOW
-};
-
-struct GTY(()) tree_userdef_literal {
-  struct tree_base base;
-  tree suffix_id;
-  tree value;
-  tree num_string;
-  enum overflow_type overflow;
-};
-
-#define USERDEF_LITERAL_SUFFIX_ID(NODE) \
-  (((struct tree_userdef_literal *)USERDEF_LITERAL_CHECK (NODE))->suffix_id)
-
-#define USERDEF_LITERAL_VALUE(NODE) \
-  (((struct tree_userdef_literal *)USERDEF_LITERAL_CHECK (NODE))->value)
-
-#define USERDEF_LITERAL_OVERFLOW(NODE) \
-  (((struct tree_userdef_literal *)USERDEF_LITERAL_CHECK (NODE))->overflow)
-
-#define USERDEF_LITERAL_NUM_STRING(NODE) \
-  (((struct tree_userdef_literal *)USERDEF_LITERAL_CHECK (NODE))->num_string)
-
-#define USERDEF_LITERAL_TYPE(NODE) \
-  (TREE_TYPE (USERDEF_LITERAL_VALUE (NODE)))
-
-extern tree build_userdef_literal (tree suffix_id, tree value,
-				   enum overflow_type overflow,
-				   tree num_string);
-
-extern void convert_vector_to_pointer_for_subscript (location_t, tree*, tree);
-
-/* Possibe cases of scalar_to_vector conversion.  */
-enum stv_conv {
-  stv_error,        /* Error occurred.  */
-  stv_nothing,      /* Nothing happened.  */
-  stv_firstarg,     /* First argument must be expanded.  */
-  stv_secondarg     /* Second argument must be expanded.  */
-};
-
-extern enum stv_conv scalar_to_vector (location_t loc, enum tree_code code,
-				       tree op0, tree op1, bool);
-
-/* In c-cilkplus.c  */
-extern tree c_finish_cilk_clauses (tree);
-extern tree c_validate_cilk_plus_loop (tree *, int *, void *);
-extern bool c_check_cilk_loop (location_t, tree);
-
-/* These #defines allow users to access different operands of the
-   array notation tree.  */
-
-#define ARRAY_NOTATION_CHECK(NODE) TREE_CHECK (NODE, ARRAY_NOTATION_REF)
-#define ARRAY_NOTATION_ARRAY(NODE) \
-  TREE_OPERAND (ARRAY_NOTATION_CHECK (NODE), 0)
-#define ARRAY_NOTATION_START(NODE) \
-  TREE_OPERAND (ARRAY_NOTATION_CHECK (NODE), 1)
-#define ARRAY_NOTATION_LENGTH(NODE) \
-  TREE_OPERAND (ARRAY_NOTATION_CHECK (NODE), 2)
-#define ARRAY_NOTATION_STRIDE(NODE) \
-  TREE_OPERAND (ARRAY_NOTATION_CHECK (NODE), 3)
-
-/* This structure holds all the scalar values and its appropriate variable 
-   replacment.  It is mainly used by the function that pulls all the invariant
-   parts that should be executed only once, which comes with array notation 
-   expressions.  */
-struct inv_list
-{
-  vec<tree, va_gc> *list_values;
-  vec<tree, va_gc> *replacement;
-  vec<enum tree_code, va_gc> *additional_tcodes; 
-};
-
-/* This structure holds all the important components that can be extracted
-   from an ARRAY_NOTATION_REF expression.  It is used to pass array notation
-   information between the functions that are responsible for expansion.  */
-typedef struct cilkplus_an_parts
-{
-  tree value;
-  tree start;
-  tree length;
-  tree stride;
-  bool is_vector;
-} an_parts;
-
-/* This structure holds the components necessary to create the loop around
-   the ARRAY_REF that is created using the ARRAY_NOTATION information.  */
-
-typedef struct cilkplus_an_loop_parts
-{
-  tree var;         /* Loop induction variable.  */
-  tree incr;        /* Loop increment/decrement expression.  */
-  tree cmp;         /* Loop condition.  */
-  tree ind_init;    /* Initialization of the loop induction variable.  */
-} an_loop_parts; 
-
-/* In array-notation-common.c.  */
-extern HOST_WIDE_INT extract_sec_implicit_index_arg (location_t, tree);
-extern bool is_sec_implicit_index_fn (tree);
-extern void array_notation_init_builtins (void);
-extern struct c_expr fix_array_notation_expr (location_t, enum tree_code, 
-					      struct c_expr);
-extern bool contains_array_notation_expr (tree);
-extern tree expand_array_notation_exprs (tree);
-extern tree fix_conditional_array_notations (tree);
-extern tree find_correct_array_notation_type (tree);
-extern bool length_mismatch_in_expr_p (location_t, vec<vec<an_parts> >);
-extern enum built_in_function is_cilkplus_reduce_builtin (tree);
-extern bool find_rank (location_t, tree, tree, bool, size_t *);
-extern void extract_array_notation_exprs (tree, bool, vec<tree, va_gc> **);
-extern void replace_array_notations (tree *, bool, vec<tree, va_gc> *,
-				     vec<tree, va_gc> *);
-extern tree find_inv_trees (tree *, int *, void *);
-extern tree replace_inv_trees (tree *, int *, void *);
-extern tree find_correct_array_notation_type (tree op);
-extern void cilkplus_extract_an_triplets (vec<tree, va_gc> *, size_t, size_t,
-					  vec<vec<an_parts> > *);
-extern vec <tree, va_gc> *fix_sec_implicit_args
-  (location_t, vec <tree, va_gc> *, vec<an_loop_parts>, size_t, tree);
-
-/* In cilk.c.  */
-extern tree insert_cilk_frame (tree);
-extern void cilk_init_builtins (void);
-extern int gimplify_cilk_spawn (tree *);
-extern void cilk_install_body_with_frame_cleanup (tree, tree, void *);
-extern bool cilk_detect_spawn_and_unwrap (tree *);
-extern bool cilk_set_spawn_marker (location_t, tree);
-extern tree build_cilk_sync (void);
-extern tree build_cilk_spawn (location_t, tree);
-extern tree make_cilk_frame (tree);
-extern tree create_cilk_function_exit (tree, bool, bool);
-extern tree cilk_install_body_pedigree_operations (tree);
-extern void cilk_outline (tree, tree *, void *);
-extern bool contains_cilk_spawn_stmt (tree);
-#endif /* ! GCC_C_COMMON_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/c-family/c-objc.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/c-family/c-objc.h
deleted file mode 100644
index f7fc9c4..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/c-family/c-objc.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/* Definitions of Objective-C front-end entry points used for C and C++.
-   Copyright (C) 1987-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_C_COMMON_OBJC_H
-#define GCC_C_COMMON_OBJC_H
-
-/* ObjC ivar visibility types.  */
-typedef enum objc_ivar_visibility_kind {
-  OBJC_IVAR_VIS_PROTECTED = 0,
-  OBJC_IVAR_VIS_PUBLIC    = 1,
-  OBJC_IVAR_VIS_PRIVATE   = 2,
-  OBJC_IVAR_VIS_PACKAGE   = 3
-} objc_ivar_visibility_kind;
-
-/* Objective-C / Objective-C++ entry points.  */
-
-/* The following ObjC/ObjC++ functions are called by the C and/or C++
-   front-ends; they all must have corresponding stubs in stub-objc.c.  */
-extern void objc_write_global_declarations (void);
-extern tree objc_is_class_name (tree);
-extern tree objc_is_object_ptr (tree);
-extern void objc_check_decl (tree);
-extern void objc_check_global_decl (tree);
-extern tree objc_common_type (tree, tree);
-extern bool objc_compare_types (tree, tree, int, tree);
-extern bool objc_have_common_type (tree, tree, int, tree);
-extern bool objc_diagnose_private_ivar (tree);
-extern void objc_volatilize_decl (tree);
-extern tree objc_rewrite_function_call (tree, tree);
-extern tree objc_message_selector (void);
-extern tree objc_lookup_ivar (tree, tree);
-extern void objc_clear_super_receiver (void);
-extern int objc_is_public (tree, tree);
-extern tree objc_is_id (tree);
-extern void objc_declare_alias (tree, tree);
-extern void objc_declare_class (tree);
-extern void objc_declare_protocol (tree, tree);
-extern tree objc_build_message_expr (tree, tree);
-extern tree objc_finish_message_expr (tree, tree, tree, tree*);
-extern tree objc_build_selector_expr (location_t, tree);
-extern tree objc_build_protocol_expr (tree);
-extern tree objc_build_encode_expr (tree);
-extern tree objc_build_string_object (tree);
-extern tree objc_get_protocol_qualified_type (tree, tree);
-extern tree objc_get_class_reference (tree);
-extern tree objc_get_class_ivars (tree);
-extern bool objc_detect_field_duplicates (bool);
-extern void objc_start_class_interface (tree, tree, tree, tree);
-extern void objc_start_category_interface (tree, tree, tree, tree);
-extern void objc_start_protocol (tree, tree, tree);
-extern void objc_continue_interface (void);
-extern void objc_finish_interface (void);
-extern void objc_start_class_implementation (tree, tree);
-extern void objc_start_category_implementation (tree, tree);
-extern void objc_continue_implementation (void);
-extern void objc_finish_implementation (void);
-extern void objc_set_visibility (objc_ivar_visibility_kind);
-extern tree objc_build_method_signature (bool, tree, tree, tree, bool);
-extern void objc_add_method_declaration (bool, tree, tree);
-extern bool objc_start_method_definition (bool, tree, tree, tree);
-extern void objc_finish_method_definition (tree);
-extern void objc_add_instance_variable (tree);
-extern tree objc_build_keyword_decl (tree, tree, tree, tree);
-extern tree objc_build_throw_stmt (location_t, tree);
-extern void objc_begin_try_stmt (location_t, tree);
-extern tree objc_finish_try_stmt (void);
-extern void objc_begin_catch_clause (tree);
-extern void objc_finish_catch_clause (void);
-extern void objc_build_finally_clause (location_t, tree);
-extern tree objc_build_synchronized (location_t, tree, tree);
-extern int objc_static_init_needed_p (void);
-extern tree objc_generate_static_init_call (tree);
-extern tree objc_generate_write_barrier (tree, enum tree_code, tree);
-extern void objc_set_method_opt (bool);
-extern void objc_finish_foreach_loop (location_t, tree, tree, tree, tree, tree);
-extern bool  objc_method_decl (enum tree_code);
-extern void objc_add_property_declaration (location_t, tree, bool, bool, bool, 
-					   bool, bool, bool, tree, tree);
-extern tree objc_maybe_build_component_ref (tree, tree);
-extern tree objc_build_class_component_ref (tree, tree);
-extern tree objc_maybe_build_modify_expr (tree, tree);
-extern tree objc_build_incr_expr_for_property_ref (location_t, enum tree_code, 
-						   tree, tree);
-extern void objc_add_synthesize_declaration (location_t, tree);
-extern void objc_add_dynamic_declaration (location_t, tree);
-extern const char * objc_maybe_printable_name (tree, int);
-extern bool objc_is_property_ref (tree);
-extern bool objc_string_ref_type_p (tree);
-extern void objc_check_format_arg (tree, tree);
-extern void objc_finish_function (void);
-extern void objc_maybe_warn_exceptions (location_t);
-
-/* The following are provided by the C and C++ front-ends, and called by
-   ObjC/ObjC++.  */
-extern void *objc_get_current_scope (void);
-extern void objc_mark_locals_volatile (void *);
-
-#endif /* ! GCC_C_COMMON_OBJC_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/c-family/c-pragma.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/c-family/c-pragma.h
deleted file mode 100644
index 6f1bf74..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/c-family/c-pragma.h
+++ /dev/null
@@ -1,193 +0,0 @@
-/* Pragma related interfaces.
-   Copyright (C) 1995-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_C_PRAGMA_H
-#define GCC_C_PRAGMA_H
-
-#include "cpplib.h" /* For enum cpp_ttype.  */
-
-/* Pragma identifiers built in to the front end parsers.  Identifiers
-   for ancillary handlers will follow these.  */
-typedef enum pragma_kind {
-  PRAGMA_NONE = 0,
-
-  PRAGMA_OMP_ATOMIC,
-  PRAGMA_OMP_BARRIER,
-  PRAGMA_OMP_CANCEL,
-  PRAGMA_OMP_CANCELLATION_POINT,
-  PRAGMA_OMP_CRITICAL,
-  PRAGMA_OMP_DECLARE_REDUCTION,
-  PRAGMA_OMP_DISTRIBUTE,
-  PRAGMA_OMP_END_DECLARE_TARGET,
-  PRAGMA_OMP_FLUSH,
-  PRAGMA_OMP_FOR,
-  PRAGMA_OMP_MASTER,
-  PRAGMA_OMP_ORDERED,
-  PRAGMA_OMP_PARALLEL,
-  PRAGMA_OMP_SECTION,
-  PRAGMA_OMP_SECTIONS,
-  PRAGMA_OMP_SIMD,
-  PRAGMA_OMP_SINGLE,
-  PRAGMA_OMP_TARGET,
-  PRAGMA_OMP_TASK,
-  PRAGMA_OMP_TASKGROUP,
-  PRAGMA_OMP_TASKWAIT,
-  PRAGMA_OMP_TASKYIELD,
-  PRAGMA_OMP_THREADPRIVATE,
-  PRAGMA_OMP_TEAMS,
-
-  /* Top level clause to handle all Cilk Plus pragma simd clauses.  */
-  PRAGMA_CILK_SIMD,
-
-  PRAGMA_GCC_PCH_PREPROCESS,
-  PRAGMA_IVDEP,
-
-  PRAGMA_FIRST_EXTERNAL
-} pragma_kind;
-
-
-/* All clauses defined by OpenMP 2.5, 3.0, 3.1 and 4.0.
-   Used internally by both C and C++ parsers.  */
-typedef enum pragma_omp_clause {
-  PRAGMA_OMP_CLAUSE_NONE = 0,
-
-  PRAGMA_OMP_CLAUSE_ALIGNED,
-  PRAGMA_OMP_CLAUSE_COLLAPSE,
-  PRAGMA_OMP_CLAUSE_COPYIN,
-  PRAGMA_OMP_CLAUSE_COPYPRIVATE,
-  PRAGMA_OMP_CLAUSE_DEFAULT,
-  PRAGMA_OMP_CLAUSE_DEPEND,
-  PRAGMA_OMP_CLAUSE_DEVICE,
-  PRAGMA_OMP_CLAUSE_DIST_SCHEDULE,
-  PRAGMA_OMP_CLAUSE_FINAL,
-  PRAGMA_OMP_CLAUSE_FIRSTPRIVATE,
-  PRAGMA_OMP_CLAUSE_FOR,
-  PRAGMA_OMP_CLAUSE_FROM,
-  PRAGMA_OMP_CLAUSE_IF,
-  PRAGMA_OMP_CLAUSE_INBRANCH,
-  PRAGMA_OMP_CLAUSE_LASTPRIVATE,
-  PRAGMA_OMP_CLAUSE_LINEAR,
-  PRAGMA_OMP_CLAUSE_MAP,
-  PRAGMA_OMP_CLAUSE_MERGEABLE,
-  PRAGMA_OMP_CLAUSE_NOTINBRANCH,
-  PRAGMA_OMP_CLAUSE_NOWAIT,
-  PRAGMA_OMP_CLAUSE_NUM_TEAMS,
-  PRAGMA_OMP_CLAUSE_NUM_THREADS,
-  PRAGMA_OMP_CLAUSE_ORDERED,
-  PRAGMA_OMP_CLAUSE_PARALLEL,
-  PRAGMA_OMP_CLAUSE_PRIVATE,
-  PRAGMA_OMP_CLAUSE_PROC_BIND,
-  PRAGMA_OMP_CLAUSE_REDUCTION,
-  PRAGMA_OMP_CLAUSE_SAFELEN,
-  PRAGMA_OMP_CLAUSE_SCHEDULE,
-  PRAGMA_OMP_CLAUSE_SECTIONS,
-  PRAGMA_OMP_CLAUSE_SHARED,
-  PRAGMA_OMP_CLAUSE_SIMDLEN,
-  PRAGMA_OMP_CLAUSE_TASKGROUP,
-  PRAGMA_OMP_CLAUSE_THREAD_LIMIT,
-  PRAGMA_OMP_CLAUSE_TO,
-  PRAGMA_OMP_CLAUSE_UNIFORM,
-  PRAGMA_OMP_CLAUSE_UNTIED,
-  
-  /* Clauses for Cilk Plus SIMD-enabled function.  */
-  PRAGMA_CILK_CLAUSE_NOMASK,
-  PRAGMA_CILK_CLAUSE_MASK,
-  PRAGMA_CILK_CLAUSE_VECTORLENGTH,
-  PRAGMA_CILK_CLAUSE_NONE = PRAGMA_OMP_CLAUSE_NONE,
-  PRAGMA_CILK_CLAUSE_LINEAR = PRAGMA_OMP_CLAUSE_LINEAR,
-  PRAGMA_CILK_CLAUSE_PRIVATE = PRAGMA_OMP_CLAUSE_PRIVATE,
-  PRAGMA_CILK_CLAUSE_FIRSTPRIVATE = PRAGMA_OMP_CLAUSE_FIRSTPRIVATE,
-  PRAGMA_CILK_CLAUSE_LASTPRIVATE = PRAGMA_OMP_CLAUSE_LASTPRIVATE,
-  PRAGMA_CILK_CLAUSE_REDUCTION = PRAGMA_OMP_CLAUSE_REDUCTION,
-  PRAGMA_CILK_CLAUSE_UNIFORM = PRAGMA_OMP_CLAUSE_UNIFORM
-} pragma_omp_clause;
-
-extern struct cpp_reader* parse_in;
-
-/* It's safe to always leave visibility pragma enabled as if
-   visibility is not supported on the host OS platform the
-   statements are ignored.  */
-extern void push_visibility (const char *, int);
-extern bool pop_visibility (int);
-
-extern void init_pragma (void);
-
-/* Front-end wrappers for pragma registration.  */
-typedef void (*pragma_handler_1arg)(struct cpp_reader *);
-/* A second pragma handler, which adds a void * argument allowing to pass extra
-   data to the handler.  */
-typedef void (*pragma_handler_2arg)(struct cpp_reader *, void *);
-
-/* This union allows to abstract the different handlers.  */
-union gen_pragma_handler {
-  pragma_handler_1arg handler_1arg;
-  pragma_handler_2arg handler_2arg;
-};
-/* Internally used to keep the data of the handler.  */
-struct internal_pragma_handler_d {
-  union gen_pragma_handler handler;
-  /* Permits to know if handler is a pragma_handler_1arg (extra_data is false)
-     or a pragma_handler_2arg (extra_data is true).  */
-  bool extra_data;
-  /* A data field which can be used when extra_data is true.  */
-  void * data;
-};
-typedef struct internal_pragma_handler_d internal_pragma_handler;
-
-extern void c_register_pragma (const char *space, const char *name,
-                               pragma_handler_1arg handler);
-extern void c_register_pragma_with_data (const char *space, const char *name,
-                                         pragma_handler_2arg handler,
-                                         void *data);
-
-extern void c_register_pragma_with_expansion (const char *space,
-                                              const char *name,
-                                              pragma_handler_1arg handler);
-extern void c_register_pragma_with_expansion_and_data (const char *space,
-                                                       const char *name,
-                                                   pragma_handler_2arg handler,
-                                                       void *data);
-extern void c_invoke_pragma_handler (unsigned int);
-
-extern void maybe_apply_pragma_weak (tree);
-extern void maybe_apply_pending_pragma_weaks (void);
-extern tree maybe_apply_renaming_pragma (tree, tree);
-extern void add_to_renaming_pragma_list (tree, tree);
-
-extern enum cpp_ttype pragma_lex (tree *);
-
-/* Flags for use with c_lex_with_flags.  The values here were picked
-   so that 0 means to translate and join strings.  */
-#define C_LEX_STRING_NO_TRANSLATE 1 /* Do not lex strings into
-				       execution character set.  */
-#define C_LEX_STRING_NO_JOIN	  2 /* Do not concatenate strings
-				       nor translate them into execution
-				       character set.  */
-
-/* This is not actually available to pragma parsers.  It's merely a
-   convenient location to declare this function for c-lex, after
-   having enum cpp_ttype declared.  */
-extern enum cpp_ttype c_lex_with_flags (tree *, location_t *, unsigned char *,
-					int);
-
-extern void c_pp_lookup_pragma (unsigned int, const char **, const char **);
-
-extern GTY(()) tree pragma_extern_prefix;
-
-#endif /* GCC_C_PRAGMA_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/c-family/c-pretty-print.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/c-family/c-pretty-print.h
deleted file mode 100644
index 7ad6dfb..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/c-family/c-pretty-print.h
+++ /dev/null
@@ -1,139 +0,0 @@
-/* Various declarations for the C and C++ pretty-printers.
-   Copyright (C) 2002-2014 Free Software Foundation, Inc.
-   Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_C_PRETTY_PRINTER
-#define GCC_C_PRETTY_PRINTER
-
-#include "tree.h"
-#include "c-family/c-common.h"
-#include "pretty-print.h"
-
-
-enum pp_c_pretty_print_flags
-  {
-     pp_c_flag_abstract = 1 << 1,
-     pp_c_flag_gnu_v3 = 1 << 2,
-     pp_c_flag_last_bit = 3
-  };
-
-
-/* The data type used to bundle information necessary for pretty-printing
-   a C or C++ entity.  */
-struct c_pretty_printer;
-
-/* The type of a C pretty-printer 'member' function.  */
-typedef void (*c_pretty_print_fn) (c_pretty_printer *, tree);
-
-/* The datatype that contains information necessary for pretty-printing
-   a tree that represents a C construct.  Any pretty-printer for a
-   language using C syntax can derive from this datatype and reuse
-   facilities provided here.  A derived pretty-printer can override
-   any function listed in the vtable below.  See cp/cxx-pretty-print.h
-   and cp/cxx-pretty-print.c for an example of derivation.  */
-struct c_pretty_printer : pretty_printer
-{
-  c_pretty_printer ();
-
-  // Format string, possibly translated.
-  void translate_string (const char *);
-
-  virtual void constant (tree);
-  virtual void id_expression (tree);
-  virtual void primary_expression (tree);
-  virtual void postfix_expression (tree);
-  virtual void unary_expression (tree);
-  virtual void multiplicative_expression (tree);
-  virtual void conditional_expression (tree);
-  virtual void assignment_expression (tree);
-  virtual void expression (tree);
-
-  virtual void type_id (tree);
-  virtual void statement (tree);
-
-  virtual void declaration (tree);
-  virtual void declaration_specifiers (tree);
-  virtual void simple_type_specifier (tree);
-  virtual void function_specifier (tree);
-  virtual void storage_class_specifier (tree);
-  virtual void declarator (tree);
-  virtual void direct_declarator (tree);
-  virtual void abstract_declarator (tree);
-  virtual void direct_abstract_declarator (tree);
-
-  virtual void initializer (tree);
-  /* Points to the first element of an array of offset-list.
-     Not used yet.  */
-  int *offset_list;
-
-  pp_flags flags;
-
-  /* These must be overridden by each of the C and C++ front-end to
-     reflect their understanding of syntactic productions when they differ.  */
-  c_pretty_print_fn type_specifier_seq;
-  c_pretty_print_fn ptr_operator;
-  c_pretty_print_fn parameter_list;
-};
-
-#define pp_c_tree_identifier(PPI, ID)              \
-   pp_c_identifier (PPI, IDENTIFIER_POINTER (ID))
-
-#define pp_type_specifier_seq(PP, D)    (PP)->type_specifier_seq (PP, D)
-#define pp_ptr_operator(PP, D)          (PP)->ptr_operator (PP, D)
-#define pp_parameter_list(PP, T)        (PP)->parameter_list (PP, T)
-
-void pp_c_whitespace (c_pretty_printer *);
-void pp_c_left_paren (c_pretty_printer *);
-void pp_c_right_paren (c_pretty_printer *);
-void pp_c_left_brace (c_pretty_printer *);
-void pp_c_right_brace (c_pretty_printer *);
-void pp_c_left_bracket (c_pretty_printer *);
-void pp_c_right_bracket (c_pretty_printer *);
-void pp_c_dot (c_pretty_printer *);
-void pp_c_ampersand (c_pretty_printer *);
-void pp_c_star (c_pretty_printer *);
-void pp_c_arrow (c_pretty_printer *);
-void pp_c_semicolon (c_pretty_printer *);
-void pp_c_complement (c_pretty_printer *);
-void pp_c_exclamation (c_pretty_printer *);
-void pp_c_space_for_pointer_operator (c_pretty_printer *, tree);
-
-/* Declarations.  */
-void pp_c_tree_decl_identifier (c_pretty_printer *, tree);
-void pp_c_function_definition (c_pretty_printer *, tree);
-void pp_c_attributes (c_pretty_printer *, tree);
-void pp_c_attributes_display (c_pretty_printer *, tree);
-void pp_c_cv_qualifiers (c_pretty_printer *pp, int qualifiers, bool func_type);
-void pp_c_type_qualifier_list (c_pretty_printer *, tree);
-void pp_c_parameter_type_list (c_pretty_printer *, tree);
-void pp_c_specifier_qualifier_list (c_pretty_printer *, tree);
-/* Expressions.  */
-void pp_c_logical_or_expression (c_pretty_printer *, tree);
-void pp_c_expression_list (c_pretty_printer *, tree);
-void pp_c_constructor_elts (c_pretty_printer *, vec<constructor_elt, va_gc> *);
-void pp_c_call_argument_list (c_pretty_printer *, tree);
-void pp_c_cast_expression (c_pretty_printer *, tree);
-void pp_c_init_declarator (c_pretty_printer *, tree);
-void pp_c_ws_string (c_pretty_printer *, const char *);
-void pp_c_identifier (c_pretty_printer *, const char *);
-void pp_c_string_literal (c_pretty_printer *, tree);
-
-void print_c_tree (FILE *file, tree t);
-
-#endif /* GCC_C_PRETTY_PRINTER */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/c-tree.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/c-tree.h
deleted file mode 100644
index 85df885..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/c-tree.h
+++ /dev/null
@@ -1,680 +0,0 @@
-/* Definitions for C parsing and type checking.
-   Copyright (C) 1987-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_C_TREE_H
-#define GCC_C_TREE_H
-
-#include "c-family/c-common.h"
-#include "diagnostic.h"
-
-/* struct lang_identifier is private to c-decl.c, but langhooks.c needs to
-   know how big it is.  This is sanity-checked in c-decl.c.  */
-#define C_SIZEOF_STRUCT_LANG_IDENTIFIER \
-  (sizeof (struct c_common_identifier) + 3 * sizeof (void *))
-
-/* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is read-only.  */
-#define C_TYPE_FIELDS_READONLY(TYPE) TREE_LANG_FLAG_1 (TYPE)
-
-/* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is volatile.  */
-#define C_TYPE_FIELDS_VOLATILE(TYPE) TREE_LANG_FLAG_2 (TYPE)
-
-/* In a RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE
-   nonzero if the definition of the type has already started.  */
-#define C_TYPE_BEING_DEFINED(TYPE) TYPE_LANG_FLAG_0 (TYPE)
-
-/* In an incomplete RECORD_TYPE or UNION_TYPE, a list of variable
-   declarations whose type would be completed by completing that type.  */
-#define C_TYPE_INCOMPLETE_VARS(TYPE) TYPE_VFIELD (TYPE)
-
-/* In an IDENTIFIER_NODE, nonzero if this identifier is actually a
-   keyword.  C_RID_CODE (node) is then the RID_* value of the keyword,
-   and C_RID_YYCODE is the token number wanted by Yacc.  */
-#define C_IS_RESERVED_WORD(ID) TREE_LANG_FLAG_0 (ID)
-
-/* Record whether a type or decl was written with nonconstant size.
-   Note that TYPE_SIZE may have simplified to a constant.  */
-#define C_TYPE_VARIABLE_SIZE(TYPE) TYPE_LANG_FLAG_1 (TYPE)
-#define C_DECL_VARIABLE_SIZE(TYPE) DECL_LANG_FLAG_0 (TYPE)
-
-/* Record whether a type is defined inside a struct or union type.
-   This is used for -Wc++-compat. */
-#define C_TYPE_DEFINED_IN_STRUCT(TYPE) TYPE_LANG_FLAG_2 (TYPE)
-
-/* Record whether a typedef for type `int' was actually `signed int'.  */
-#define C_TYPEDEF_EXPLICITLY_SIGNED(EXP) DECL_LANG_FLAG_1 (EXP)
-
-/* For a FUNCTION_DECL, nonzero if it was defined without an explicit
-   return type.  */
-#define C_FUNCTION_IMPLICIT_INT(EXP) DECL_LANG_FLAG_1 (EXP)
-
-/* For a FUNCTION_DECL, nonzero if it was an implicit declaration.  */
-#define C_DECL_IMPLICIT(EXP) DECL_LANG_FLAG_2 (EXP)
-
-/* For FUNCTION_DECLs, evaluates true if the decl is built-in but has
-   been declared.  */
-#define C_DECL_DECLARED_BUILTIN(EXP)		\
-  DECL_LANG_FLAG_3 (FUNCTION_DECL_CHECK (EXP))
-
-/* For FUNCTION_DECLs, evaluates true if the decl is built-in, has a
-   built-in prototype and does not have a non-built-in prototype.  */
-#define C_DECL_BUILTIN_PROTOTYPE(EXP)		\
-  DECL_LANG_FLAG_6 (FUNCTION_DECL_CHECK (EXP))
-
-/* Record whether a decl was declared register.  This is strictly a
-   front-end flag, whereas DECL_REGISTER is used for code generation;
-   they may differ for structures with volatile fields.  */
-#define C_DECL_REGISTER(EXP) DECL_LANG_FLAG_4 (EXP)
-
-/* Record whether a decl was used in an expression anywhere except an
-   unevaluated operand of sizeof / typeof / alignof.  This is only
-   used for functions declared static but not defined, though outside
-   sizeof and typeof it is set for other function decls as well.  */
-#define C_DECL_USED(EXP) DECL_LANG_FLAG_5 (FUNCTION_DECL_CHECK (EXP))
-
-/* Record whether a variable has been declared threadprivate by
-   #pragma omp threadprivate.  */
-#define C_DECL_THREADPRIVATE_P(DECL) DECL_LANG_FLAG_3 (VAR_DECL_CHECK (DECL))
-
-/* Nonzero for a decl which either doesn't exist or isn't a prototype.
-   N.B. Could be simplified if all built-in decls had complete prototypes
-   (but this is presently difficult because some of them need FILE*).  */
-#define C_DECL_ISNT_PROTOTYPE(EXP)			\
-       (EXP == 0					\
-	|| (!prototype_p (TREE_TYPE (EXP))	\
-	    && !DECL_BUILT_IN (EXP)))
-
-/* For FUNCTION_TYPE, a hidden list of types of arguments.  The same as
-   TYPE_ARG_TYPES for functions with prototypes, but created for functions
-   without prototypes.  */
-#define TYPE_ACTUAL_ARG_TYPES(NODE) TYPE_LANG_SLOT_1 (NODE)
-
-/* For a CONSTRUCTOR, whether some initializer contains a
-   subexpression meaning it is not a constant expression.  */
-#define CONSTRUCTOR_NON_CONST(EXPR) TREE_LANG_FLAG_1 (CONSTRUCTOR_CHECK (EXPR))
-
-/* Record parser information about an expression that is irrelevant
-   for code generation alongside a tree representing its value.  */
-struct c_expr
-{
-  /* The value of the expression.  */
-  tree value;
-  /* Record the original unary/binary operator of an expression, which may
-     have been changed by fold, STRING_CST for unparenthesized string
-     constants, C_MAYBE_CONST_EXPR for __builtin_constant_p calls
-     (even if parenthesized), for subexpressions, and for non-constant
-     initializers, or ERROR_MARK for other expressions (including
-     parenthesized expressions).  */
-  enum tree_code original_code;
-  /* If not NULL, the original type of an expression.  This will
-     differ from the type of the value field for an enum constant.
-     The type of an enum constant is a plain integer type, but this
-     field will be the enum type.  */
-  tree original_type;
-};
-
-/* Type alias for struct c_expr. This allows to use the structure
-   inside the VEC types.  */
-typedef struct c_expr c_expr_t;
-
-/* A kind of type specifier.  Note that this information is currently
-   only used to distinguish tag definitions, tag references and typeof
-   uses.  */
-enum c_typespec_kind {
-  /* No typespec.  This appears only in struct c_declspec.  */
-  ctsk_none,
-  /* A reserved keyword type specifier.  */
-  ctsk_resword,
-  /* A reference to a tag, previously declared, such as "struct foo".
-     This includes where the previous declaration was as a different
-     kind of tag, in which case this is only valid if shadowing that
-     tag in an inner scope.  */
-  ctsk_tagref,
-  /* A reference to a tag, not previously declared in a visible
-     scope.  */
-  ctsk_tagfirstref,
-  /* A definition of a tag such as "struct foo { int a; }".  */
-  ctsk_tagdef,
-  /* A typedef name.  */
-  ctsk_typedef,
-  /* An ObjC-specific kind of type specifier.  */
-  ctsk_objc,
-  /* A typeof specifier, or _Atomic ( type-name ).  */
-  ctsk_typeof
-};
-
-/* A type specifier: this structure is created in the parser and
-   passed to declspecs_add_type only.  */
-struct c_typespec {
-  /* What kind of type specifier this is.  */
-  enum c_typespec_kind kind;
-  /* Whether the expression has operands suitable for use in constant
-     expressions.  */
-  bool expr_const_operands;
-  /* The specifier itself.  */
-  tree spec;
-  /* An expression to be evaluated before the type specifier, in the
-     case of typeof specifiers, or NULL otherwise or if no such
-     expression is required for a particular typeof specifier.  In
-     particular, when typeof is applied to an expression of variably
-     modified type, that expression must be evaluated in order to
-     determine array sizes that form part of the type, but the
-     expression itself (as opposed to the array sizes) forms no part
-     of the type and so needs to be recorded separately.  */
-  tree expr;
-};
-
-/* A storage class specifier.  */
-enum c_storage_class {
-  csc_none,
-  csc_auto,
-  csc_extern,
-  csc_register,
-  csc_static,
-  csc_typedef
-};
-
-/* A type specifier keyword "void", "_Bool", "char", "int", "float",
-   "double", "_Decimal32", "_Decimal64", "_Decimal128", "_Fract", "_Accum",
-   or none of these.  */
-enum c_typespec_keyword {
-  cts_none,
-  cts_void,
-  cts_bool,
-  cts_char,
-  cts_int,
-  cts_float,
-  cts_int128,
-  cts_double,
-  cts_dfloat32,
-  cts_dfloat64,
-  cts_dfloat128,
-  cts_fract,
-  cts_accum,
-  cts_auto_type
-};
-
-/* This enum lists all the possible declarator specifiers, storage
-   class or attribute that a user can write.  There is at least one
-   enumerator per possible declarator specifier in the struct
-   c_declspecs below.
-
-   It is used to index the array of declspec locations in struct
-   c_declspecs.  */
-enum c_declspec_word {
-  cdw_typespec /* A catch-all for a typespec.  */,
-  cdw_storage_class  /* A catch-all for a storage class */,
-  cdw_attributes,
-  cdw_typedef,
-  cdw_explicit_signed,
-  cdw_deprecated,
-  cdw_default_int,
-  cdw_long,
-  cdw_long_long,
-  cdw_short,
-  cdw_signed,
-  cdw_unsigned,
-  cdw_complex,
-  cdw_inline,
-  cdw_noreturn,
-  cdw_thread,
-  cdw_const,
-  cdw_volatile,
-  cdw_restrict,
-  cdw_saturating,
-  cdw_alignas,
-  cdw_address_space,
-  cdw_number_of_elements /* This one must always be the last
-			    enumerator.  */
-};
-
-/* A sequence of declaration specifiers in C.  When a new declaration
-   specifier is added, please update the enum c_declspec_word above
-   accordingly.  */
-struct c_declspecs {
-  source_location locations[cdw_number_of_elements];
-  /* The type specified, if a single type specifier such as a struct,
-     union or enum specifier, typedef name or typeof specifies the
-     whole type, or NULL_TREE if none or a keyword such as "void" or
-     "char" is used.  Does not include qualifiers.  */
-  tree type;
-  /* Any expression to be evaluated before the type, from a typeof
-     specifier.  */
-  tree expr;
-  /* The attributes from a typedef decl.  */
-  tree decl_attr;
-  /* When parsing, the attributes.  Outside the parser, this will be
-     NULL; attributes (possibly from multiple lists) will be passed
-     separately.  */
-  tree attrs;
-  /* The base-2 log of the greatest alignment required by an _Alignas
-     specifier, in bytes, or -1 if no such specifiers with nonzero
-     alignment.  */
-  int align_log;
-  /* The storage class specifier, or csc_none if none.  */
-  enum c_storage_class storage_class;
-  /* Any type specifier keyword used such as "int", not reflecting
-     modifiers such as "short", or cts_none if none.  */
-  ENUM_BITFIELD (c_typespec_keyword) typespec_word : 8;
-  /* The kind of type specifier if one has been seen, ctsk_none
-     otherwise.  */
-  ENUM_BITFIELD (c_typespec_kind) typespec_kind : 3;
-  /* Whether any expressions in typeof specifiers may appear in
-     constant expressions.  */
-  BOOL_BITFIELD expr_const_operands : 1;
-  /* Whether any declaration specifiers have been seen at all.  */
-  BOOL_BITFIELD declspecs_seen_p : 1;
-  /* Whether something other than a storage class specifier or
-     attribute has been seen.  This is used to warn for the
-     obsolescent usage of storage class specifiers other than at the
-     start of the list.  (Doing this properly would require function
-     specifiers to be handled separately from storage class
-     specifiers.)  */
-  BOOL_BITFIELD non_sc_seen_p : 1;
-  /* Whether the type is specified by a typedef or typeof name.  */
-  BOOL_BITFIELD typedef_p : 1;
-  /* Whether the type is explicitly "signed" or specified by a typedef
-     whose type is explicitly "signed".  */
-  BOOL_BITFIELD explicit_signed_p : 1;
-  /* Whether the specifiers include a deprecated typedef.  */
-  BOOL_BITFIELD deprecated_p : 1;
-  /* Whether the type defaulted to "int" because there were no type
-     specifiers.  */
-  BOOL_BITFIELD default_int_p : 1;
-  /* Whether "long" was specified.  */
-  BOOL_BITFIELD long_p : 1;
-  /* Whether "long" was specified more than once.  */
-  BOOL_BITFIELD long_long_p : 1;
-  /* Whether "short" was specified.  */
-  BOOL_BITFIELD short_p : 1;
-  /* Whether "signed" was specified.  */
-  BOOL_BITFIELD signed_p : 1;
-  /* Whether "unsigned" was specified.  */
-  BOOL_BITFIELD unsigned_p : 1;
-  /* Whether "complex" was specified.  */
-  BOOL_BITFIELD complex_p : 1;
-  /* Whether "inline" was specified.  */
-  BOOL_BITFIELD inline_p : 1;
-  /* Whether "_Noreturn" was speciied.  */
-  BOOL_BITFIELD noreturn_p : 1;
-  /* Whether "__thread" or "_Thread_local" was specified.  */
-  BOOL_BITFIELD thread_p : 1;
-  /* Whether "__thread" rather than "_Thread_local" was specified.  */
-  BOOL_BITFIELD thread_gnu_p : 1;
-  /* Whether "const" was specified.  */
-  BOOL_BITFIELD const_p : 1;
-  /* Whether "volatile" was specified.  */
-  BOOL_BITFIELD volatile_p : 1;
-  /* Whether "restrict" was specified.  */
-  BOOL_BITFIELD restrict_p : 1;
-  /* Whether "_Atomic" was specified.  */
-  BOOL_BITFIELD atomic_p : 1;
-  /* Whether "_Sat" was specified.  */
-  BOOL_BITFIELD saturating_p : 1;
-  /* Whether any alignment specifier (even with zero alignment) was
-     specified.  */
-  BOOL_BITFIELD alignas_p : 1;
-  /* The address space that the declaration belongs to.  */
-  addr_space_t address_space;
-};
-
-/* The various kinds of declarators in C.  */
-enum c_declarator_kind {
-  /* An identifier.  */
-  cdk_id,
-  /* A function.  */
-  cdk_function,
-  /* An array.  */
-  cdk_array,
-  /* A pointer.  */
-  cdk_pointer,
-  /* Parenthesized declarator with nested attributes.  */
-  cdk_attrs
-};
-
-typedef struct c_arg_tag_d {
-  /* The argument name.  */
-  tree id;
-  /* The type of the argument.  */
-  tree type;
-} c_arg_tag;
-
-
-/* Information about the parameters in a function declarator.  */
-struct c_arg_info {
-  /* A list of parameter decls.  */
-  tree parms;
-  /* A list of structure, union and enum tags defined.  */
-  vec<c_arg_tag, va_gc> *tags;
-  /* A list of argument types to go in the FUNCTION_TYPE.  */
-  tree types;
-  /* A list of non-parameter decls (notably enumeration constants)
-     defined with the parameters.  */
-  tree others;
-  /* A compound expression of VLA sizes from the parameters, or NULL.
-     In a function definition, these are used to ensure that
-     side-effects in sizes of arrays converted to pointers (such as a
-     parameter int i[n++]) take place; otherwise, they are
-     ignored.  */
-  tree pending_sizes;
-  /* True when these arguments had [*].  */
-  BOOL_BITFIELD had_vla_unspec : 1;
-};
-
-/* A declarator.  */
-struct c_declarator {
-  /* The kind of declarator.  */
-  enum c_declarator_kind kind;
-  location_t id_loc; /* Currently only set for cdk_id, cdk_array. */
-  /* Except for cdk_id, the contained declarator.  For cdk_id, NULL.  */
-  struct c_declarator *declarator;
-  union {
-    /* For identifiers, an IDENTIFIER_NODE or NULL_TREE if an abstract
-       declarator.  */
-    tree id;
-    /* For functions.  */
-    struct c_arg_info *arg_info;
-    /* For arrays.  */
-    struct {
-      /* The array dimension, or NULL for [] and [*].  */
-      tree dimen;
-      /* The qualifiers inside [].  */
-      int quals;
-      /* The attributes (currently ignored) inside [].  */
-      tree attrs;
-      /* Whether [static] was used.  */
-      BOOL_BITFIELD static_p : 1;
-      /* Whether [*] was used.  */
-      BOOL_BITFIELD vla_unspec_p : 1;
-    } array;
-    /* For pointers, the qualifiers on the pointer type.  */
-    int pointer_quals;
-    /* For attributes.  */
-    tree attrs;
-  } u;
-};
-
-/* A type name.  */
-struct c_type_name {
-  /* The declaration specifiers.  */
-  struct c_declspecs *specs;
-  /* The declarator.  */
-  struct c_declarator *declarator;
-};
-
-/* A parameter.  */
-struct c_parm {
-  /* The declaration specifiers, minus any prefix attributes.  */
-  struct c_declspecs *specs;
-  /* The attributes.  */
-  tree attrs;
-  /* The declarator.  */
-  struct c_declarator *declarator;
-};
-
-/* Used when parsing an enum.  Initialized by start_enum.  */
-struct c_enum_contents
-{
-  /* While defining an enum type, this is 1 plus the last enumerator
-     constant value.  */
-  tree enum_next_value;
-
-  /* Nonzero means that there was overflow computing enum_next_value.  */
-  int enum_overflow;
-};
-
-/* A type of reference to a static identifier in an inline
-   function.  */
-enum c_inline_static_type {
-  /* Identifier with internal linkage used in function that may be an
-     inline definition (i.e., file-scope static).  */
-  csi_internal,
-  /* Modifiable object with static storage duration defined in
-     function that may be an inline definition (i.e., local
-     static).  */
-  csi_modifiable
-};
-
-
-/* in c-parser.c */
-extern void c_parse_init (void);
-
-/* in c-aux-info.c */
-extern void gen_aux_info_record (tree, int, int, int);
-
-/* in c-decl.c */
-struct c_spot_bindings;
-struct c_struct_parse_info;
-extern struct obstack parser_obstack;
-extern tree c_break_label;
-extern tree c_cont_label;
-
-extern bool global_bindings_p (void);
-extern void push_scope (void);
-extern tree pop_scope (void);
-extern void c_bindings_start_stmt_expr (struct c_spot_bindings *);
-extern void c_bindings_end_stmt_expr (struct c_spot_bindings *);
-
-extern void record_inline_static (location_t, tree, tree,
-				  enum c_inline_static_type);
-extern void c_init_decl_processing (void);
-extern void c_print_identifier (FILE *, tree, int);
-extern int quals_from_declspecs (const struct c_declspecs *);
-extern struct c_declarator *build_array_declarator (location_t, tree,
-    						    struct c_declspecs *,
-						    bool, bool);
-extern tree build_enumerator (location_t, location_t, struct c_enum_contents *,
-			      tree, tree);
-extern tree check_for_loop_decls (location_t, bool);
-extern void mark_forward_parm_decls (void);
-extern void declare_parm_level (void);
-extern void undeclared_variable (location_t, tree);
-extern tree lookup_label_for_goto (location_t, tree);
-extern tree declare_label (tree);
-extern tree define_label (location_t, tree);
-extern struct c_spot_bindings *c_get_switch_bindings (void);
-extern void c_release_switch_bindings (struct c_spot_bindings *);
-extern bool c_check_switch_jump_warnings (struct c_spot_bindings *,
-					  location_t, location_t);
-extern void finish_decl (tree, location_t, tree, tree, tree);
-extern tree finish_enum (tree, tree, tree);
-extern void finish_function (void);
-extern tree finish_struct (location_t, tree, tree, tree,
-			   struct c_struct_parse_info *);
-extern struct c_arg_info *build_arg_info (void);
-extern struct c_arg_info *get_parm_info (bool, tree);
-extern tree grokfield (location_t, struct c_declarator *,
-		       struct c_declspecs *, tree, tree *);
-extern tree groktypename (struct c_type_name *, tree *, bool *);
-extern tree grokparm (const struct c_parm *, tree *);
-extern tree implicitly_declare (location_t, tree);
-extern void keep_next_level (void);
-extern void pending_xref_error (void);
-extern void c_push_function_context (void);
-extern void c_pop_function_context (void);
-extern void push_parm_decl (const struct c_parm *, tree *);
-extern struct c_declarator *set_array_declarator_inner (struct c_declarator *,
-							struct c_declarator *);
-extern tree c_builtin_function (tree);
-extern tree c_builtin_function_ext_scope (tree);
-extern void shadow_tag (const struct c_declspecs *);
-extern void shadow_tag_warned (const struct c_declspecs *, int);
-extern tree start_enum (location_t, struct c_enum_contents *, tree);
-extern int  start_function (struct c_declspecs *, struct c_declarator *, tree);
-extern tree start_decl (struct c_declarator *, struct c_declspecs *, bool,
-			tree);
-extern tree start_struct (location_t, enum tree_code, tree,
-			  struct c_struct_parse_info **);
-extern void store_parm_decls (void);
-extern void store_parm_decls_from (struct c_arg_info *);
-extern void temp_store_parm_decls (tree, tree);
-extern void temp_pop_parm_decls (void);
-extern tree xref_tag (enum tree_code, tree);
-extern struct c_typespec parser_xref_tag (location_t, enum tree_code, tree);
-extern struct c_parm *build_c_parm (struct c_declspecs *, tree,
-				    struct c_declarator *);
-extern struct c_declarator *build_attrs_declarator (tree,
-						    struct c_declarator *);
-extern struct c_declarator *build_function_declarator (struct c_arg_info *,
-						       struct c_declarator *);
-extern struct c_declarator *build_id_declarator (tree);
-extern struct c_declarator *make_pointer_declarator (struct c_declspecs *,
-						     struct c_declarator *);
-extern struct c_declspecs *build_null_declspecs (void);
-extern struct c_declspecs *declspecs_add_qual (source_location,
-					       struct c_declspecs *, tree);
-extern struct c_declspecs *declspecs_add_type (location_t,
-					       struct c_declspecs *,
-					       struct c_typespec);
-extern struct c_declspecs *declspecs_add_scspec (source_location,
-						 struct c_declspecs *, tree);
-extern struct c_declspecs *declspecs_add_attrs (source_location,
-						struct c_declspecs *, tree);
-extern struct c_declspecs *declspecs_add_addrspace (source_location,
-						    struct c_declspecs *,
-						    addr_space_t);
-extern struct c_declspecs *declspecs_add_alignas (source_location,
-						  struct c_declspecs *, tree);
-extern struct c_declspecs *finish_declspecs (struct c_declspecs *);
-
-/* in c-objc-common.c */
-extern bool c_objc_common_init (void);
-extern bool c_missing_noreturn_ok_p (tree);
-extern bool c_warn_unused_global_decl (const_tree);
-extern void c_initialize_diagnostics (diagnostic_context *);
-extern bool c_vla_unspec_p (tree x, tree fn);
-
-/* in c-typeck.c */
-extern int in_alignof;
-extern int in_sizeof;
-extern int in_typeof;
-
-extern tree c_last_sizeof_arg;
-
-extern struct c_switch *c_switch_stack;
-
-extern tree c_objc_common_truthvalue_conversion (location_t, tree);
-extern tree require_complete_type (tree);
-extern int same_translation_unit_p (const_tree, const_tree);
-extern int comptypes (tree, tree);
-extern int comptypes_check_different_types (tree, tree, bool *);
-extern bool c_vla_type_p (const_tree);
-extern bool c_mark_addressable (tree);
-extern void c_incomplete_type_error (const_tree, const_tree);
-extern tree c_type_promotes_to (tree);
-extern struct c_expr default_function_array_conversion (location_t,
-							struct c_expr);
-extern struct c_expr default_function_array_read_conversion (location_t,
-							     struct c_expr);
-extern struct c_expr convert_lvalue_to_rvalue (location_t, struct c_expr,
-					       bool, bool);
-extern void mark_exp_read (tree);
-extern tree composite_type (tree, tree);
-extern tree build_component_ref (location_t, tree, tree);
-extern tree build_array_ref (location_t, tree, tree);
-extern tree build_external_ref (location_t, tree, int, tree *);
-extern void pop_maybe_used (bool);
-extern struct c_expr c_expr_sizeof_expr (location_t, struct c_expr);
-extern struct c_expr c_expr_sizeof_type (location_t, struct c_type_name *);
-extern struct c_expr parser_build_unary_op (location_t, enum tree_code,
-    					    struct c_expr);
-extern struct c_expr parser_build_binary_op (location_t,
-    					     enum tree_code, struct c_expr,
-					     struct c_expr);
-extern tree build_conditional_expr (location_t, tree, bool, tree, tree,
-				    tree, tree);
-extern tree build_compound_expr (location_t, tree, tree);
-extern tree c_cast_expr (location_t, struct c_type_name *, tree);
-extern tree build_c_cast (location_t, tree, tree);
-extern void store_init_value (location_t, tree, tree, tree);
-extern void error_init (const char *);
-extern void pedwarn_init (location_t, int opt, const char *);
-extern void maybe_warn_string_init (tree, struct c_expr);
-extern void start_init (tree, tree, int);
-extern void finish_init (void);
-extern void really_start_incremental_init (tree);
-extern void push_init_level (int, struct obstack *);
-extern struct c_expr pop_init_level (int, struct obstack *);
-extern void set_init_index (tree, tree, struct obstack *);
-extern void set_init_label (tree, struct obstack *);
-extern void process_init_element (struct c_expr, bool, struct obstack *);
-extern tree build_compound_literal (location_t, tree, tree, bool);
-extern void check_compound_literal_type (location_t, struct c_type_name *);
-extern tree c_start_case (location_t, location_t, tree);
-extern void c_finish_case (tree);
-extern tree build_asm_expr (location_t, tree, tree, tree, tree, tree, bool);
-extern tree build_asm_stmt (tree, tree);
-extern int c_types_compatible_p (tree, tree);
-extern tree c_begin_compound_stmt (bool);
-extern tree c_end_compound_stmt (location_t, tree, bool);
-extern void c_finish_if_stmt (location_t, tree, tree, tree, bool);
-extern void c_finish_loop (location_t, tree, tree, tree, tree, tree, bool);
-extern tree c_begin_stmt_expr (void);
-extern tree c_finish_stmt_expr (location_t, tree);
-extern tree c_process_expr_stmt (location_t, tree);
-extern tree c_finish_expr_stmt (location_t, tree);
-extern tree c_finish_return (location_t, tree, tree);
-extern tree c_finish_bc_stmt (location_t, tree *, bool);
-extern tree c_finish_goto_label (location_t, tree);
-extern tree c_finish_goto_ptr (location_t, tree);
-extern tree c_expr_to_decl (tree, bool *, bool *);
-extern tree c_begin_omp_parallel (void);
-extern tree c_finish_omp_parallel (location_t, tree, tree);
-extern tree c_begin_omp_task (void);
-extern tree c_finish_omp_task (location_t, tree, tree);
-extern void c_finish_omp_cancel (location_t, tree);
-extern void c_finish_omp_cancellation_point (location_t, tree);
-extern tree c_finish_omp_clauses (tree);
-extern tree c_build_va_arg (location_t, tree, tree);
-extern tree c_finish_transaction (location_t, tree, int);
-extern bool c_tree_equal (tree, tree);
-extern tree c_build_function_call_vec (location_t, vec<location_t>, tree,
-				       vec<tree, va_gc> *, vec<tree, va_gc> *);
-
-/* Set to 0 at beginning of a function definition, set to 1 if
-   a return statement that specifies a return value is seen.  */
-
-extern int current_function_returns_value;
-
-/* Set to 0 at beginning of a function definition, set to 1 if
-   a return statement with no argument is seen.  */
-
-extern int current_function_returns_null;
-
-/* Set to 0 at beginning of a function definition, set to 1 if
-   a call to a noreturn function is seen.  */
-
-extern int current_function_returns_abnormally;
-
-/* Mode used to build pointers (VOIDmode means ptr_mode).  */
-
-extern enum machine_mode c_default_pointer_mode;
-
-/* In c-decl.c */
-extern void c_finish_incomplete_decl (tree);
-extern void c_write_global_declarations (void);
-extern tree c_omp_reduction_id (enum tree_code, tree);
-extern tree c_omp_reduction_decl (tree);
-extern tree c_omp_reduction_lookup (tree, tree);
-extern tree c_check_omp_declare_reduction_r (tree *, int *, void *);
-
-/* In c-errors.c */
-extern void pedwarn_c90 (location_t, int opt, const char *, ...) ATTRIBUTE_GCC_DIAG(3,4);
-extern void pedwarn_c99 (location_t, int opt, const char *, ...) ATTRIBUTE_GCC_DIAG(3,4);
-
-#endif /* ! GCC_C_TREE_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/calls.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/calls.h
deleted file mode 100644
index e240908..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/calls.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Declarations and data types for RTL call insn generation.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_CALLS_H
-#define GCC_CALLS_H
-
-extern int flags_from_decl_or_type (const_tree);
-extern int call_expr_flags (const_tree);
-extern int setjmp_call_p (const_tree);
-extern bool gimple_alloca_call_p (const_gimple);
-extern bool alloca_call_p (const_tree);
-extern bool must_pass_in_stack_var_size (enum machine_mode, const_tree);
-extern bool must_pass_in_stack_var_size_or_pad (enum machine_mode, const_tree);
-
-#endif // GCC_CALLS_H
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cfg-flags.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cfg-flags.def
deleted file mode 100644
index 8422c2b..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cfg-flags.def
+++ /dev/null
@@ -1,186 +0,0 @@
-/* Flags on basic blocks and edges.
-   Copyright (C) 2012-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* This file defines flags that may appear on basic blocks or on
-   edges.  Source files define DEF_BASIC_BLOCK_FLAG or DEF_EDGE_FLAG
-   appropriately before including this file.  */
-
-#if !defined(DEF_BASIC_BLOCK_FLAG) && !defined(DEF_EDGE_FLAG)
-#error "You must define DEF_BASIC_BLOCK_FLAG or DEF_EDGE_FLAG"
-#endif
-
-#ifdef DEF_BASIC_BLOCK_FLAG
-
-/* Masks for basic_block.flags.
-
-   The format of this file is: DEF_BASIC_BLOCK_FLAG(NAME, IDX).
-   NAME is the name of the basic block flag.  A flag BB_#NAME will be
-   created and the name is used in dump_edge_info.
-   IDX is a sequence number that is used to determine the value
-   of the flag, which is 1 << IDX).
-
-   BB_HOT_PARTITION and BB_COLD_PARTITION should be preserved throughout
-   the compilation, so they are never cleared.
-
-   All other flags may be cleared by clear_bb_flags().  It is generally
-   a bad idea to rely on any flags being up-to-date.  */
-
-/* Only set on blocks that have just been created by create_bb.  */
-DEF_BASIC_BLOCK_FLAG(NEW, 0)
-
-/* Set by find_unreachable_blocks.  Do not rely on this being set in any
-   pass.  */
-DEF_BASIC_BLOCK_FLAG(REACHABLE, 1)
-
-/* Set for blocks in an irreducible loop by loop analysis.  */
-DEF_BASIC_BLOCK_FLAG(IRREDUCIBLE_LOOP, 2)
-
-/* Set on blocks that may actually not be single-entry single-exit block.  */
-DEF_BASIC_BLOCK_FLAG(SUPERBLOCK, 3)
-
-/* Set on basic blocks that the scheduler should not touch.  This is used
-   by SMS to prevent other schedulers from messing with the loop schedule.  */
-DEF_BASIC_BLOCK_FLAG(DISABLE_SCHEDULE, 4)
-
-/* Set on blocks that should be put in a hot section.  */
-DEF_BASIC_BLOCK_FLAG(HOT_PARTITION, 5)
-
-/* Set on blocks that should be put in a cold section.  */
-DEF_BASIC_BLOCK_FLAG(COLD_PARTITION, 6)
-
-/* Set on block that was duplicated.  */
-DEF_BASIC_BLOCK_FLAG(DUPLICATED, 7)
-
-/* Set if the label at the top of this block is the target of a non-local goto.  */
-DEF_BASIC_BLOCK_FLAG(NON_LOCAL_GOTO_TARGET, 8)
-
-/* Set on blocks that are in RTL format.  */
-DEF_BASIC_BLOCK_FLAG(RTL, 9) 
-
-/* Set on blocks that are forwarder blocks.
-   Only used in cfgcleanup.c.  */
-DEF_BASIC_BLOCK_FLAG(FORWARDER_BLOCK, 10)
-
-/* Set on blocks that cannot be threaded through.
-   Only used in cfgcleanup.c.  */
-DEF_BASIC_BLOCK_FLAG(NONTHREADABLE_BLOCK, 11)
-
-/* Set on blocks that were modified in some way.  This bit is set in
-   df_set_bb_dirty, but not cleared by df_analyze, so it can be used
-   to test whether a block has been modified prior to a df_analyze call.  */
-DEF_BASIC_BLOCK_FLAG(MODIFIED, 12)
-
-/* A general visited flag for passes to use.  */
-DEF_BASIC_BLOCK_FLAG(VISITED, 13)
-
-/* Set on blocks that are in a transaction.  This is calculated on
-   demand, and is available after calling compute_transaction_bits().  */
-DEF_BASIC_BLOCK_FLAG(IN_TRANSACTION, 14)
-
-#endif
-
-#ifdef DEF_EDGE_FLAG
-
-/* Masks for edge.flags.
-
-   The format of this file is: DEF_EDGE_FLAG(NAME, IDX, STRING).
-   NAME is the name of the edge flag.  A flag EDGE_#NAME will be
-   created and the name is used in dump_edge_info.
-   IDX is a sequence number that is used to determine the value
-   of the flag, which is 1 << IDX).  */
-
-/* 'Straight line' flow.  In GIMPLE and in cfglayout mode, all normal
-   edges are fallthru edges.  In cfgrtl mode, this flag really means
-   that control flow falls through to the next basic block in the line.  */
-DEF_EDGE_FLAG(FALLTHRU, 0)
-
-/* Strange flow, like a computed jump or exception handling.  Usually
-   this means that the edge cannot be split.  */
-DEF_EDGE_FLAG(ABNORMAL, 1)
-
-/* Edge out of a basic block that ends with a CALL_INSN with abnormal
-   exit, like an exception or a non-local goto.
-   ABNORMAL_CALL edges also have ABNORMAL set.
-   This flag is only used for the RTL CFG.  */
-DEF_EDGE_FLAG(ABNORMAL_CALL, 2)
-
-/* Exception edge.  Exception handling edges represent possible control
-   transfers from a trapping instruction to an exception handler.
-   EH edges also have ABNORMAL set for the RTL CFG.  */
-DEF_EDGE_FLAG(EH, 3)
-
-/* Never merge blocks via this edge.  This is used for exception handling,
-   to prevent merging away edges to the post-landing-pad basic block.
-   This flag is only used for the RTL CFG.  */
-DEF_EDGE_FLAG(PRESERVE, 4)
-
-/* Not a real edge.  This is used to connect parts of the CFG that do
-   not halt, such as infinite loops and noreturn functions, to the
-   EXIT_BLOCK, so that traversing of the reverse CFG is possible.  */
-DEF_EDGE_FLAG(FAKE, 5)
-
-/* A back edge, marked in a depth-first search of the CFG.  Back edges
-   are hints that this edge may be part of a loop in the CFG.  */
-DEF_EDGE_FLAG(DFS_BACK, 6)
-
-/* Edge in a part of the CFG that is an irreducible loop.  */
-DEF_EDGE_FLAG(IRREDUCIBLE_LOOP, 7)
-
-/* Edge taken when controlling predicate is nonzero.
-   This is only used for the GIMPLE CFG.  */
-DEF_EDGE_FLAG(TRUE_VALUE, 8)
-
-/* Edge taken when controlling predicate is zero.
-   This is only used for the GIMPLE CFG.  */
-DEF_EDGE_FLAG(FALSE_VALUE, 9)
-
-/* Edge is executable.  This is only used in GIMPLE SSA-CCP and VRP.
-   This is only used for the GIMPLE CFG.  */
-DEF_EDGE_FLAG(EXECUTABLE, 10)
-
-/* Edge crosses between hot and cold sections, when we do partitioning.
-   This flag is only used for the RTL CFG.  */
-DEF_EDGE_FLAG(CROSSING, 11)
-
-/* Edge from a sibcall CALL_INSN to exit.
-   SIBCALL edges also have ABNORMAL set.
-   This flag is only used for the RTL CFG.  */
-DEF_EDGE_FLAG(SIBCALL, 12)
-
-/* Candidate for straight line flow.  Only used in bb-reorder.c.
-   This flag is only used for the RTL CFG.  */
-DEF_EDGE_FLAG(CAN_FALLTHRU, 13)
-
-/* Exit of a loop.  This is only used in ifcvt.c.
-   This flag is only used for the RTL CFG.  */
-DEF_EDGE_FLAG(LOOP_EXIT, 14)
-
-/* Uninstrumented edge out of a GIMPLE_TRANSACTION statement.  */
-DEF_EDGE_FLAG(TM_UNINSTRUMENTED, 15)
-
-/* Abort (over) edge out of a GIMPLE_TRANSACTION statement.  */
-DEF_EDGE_FLAG(TM_ABORT, 16)
-
-#endif
-
-/*
-Local variables:
-mode:c
-End:
-*/
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cfgexpand.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cfgexpand.h
deleted file mode 100644
index 6314b83..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cfgexpand.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Header file for lowering trees to RTL.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_CFGEXPAND_H
-#define GCC_CFGEXPAND_H
-
-extern tree gimple_assign_rhs_to_tree (gimple);
-extern HOST_WIDE_INT estimated_stack_frame_size (struct cgraph_node *);
-
-#endif /* GCC_CFGEXPAND_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cfghooks.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cfghooks.h
deleted file mode 100644
index 8ff808c..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cfghooks.h
+++ /dev/null
@@ -1,223 +0,0 @@
-/* Hooks for cfg representation specific functions.
-   Copyright (C) 2003-2014 Free Software Foundation, Inc.
-   Contributed by Sebastian Pop <s.pop@laposte.net>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* Only basic-block.h includes this.  */
-
-struct cfg_hooks
-{
-  /* Name of the corresponding ir.  */
-  const char *name;
-
-  /* Debugging.  */
-  int (*verify_flow_info) (void);
-  void (*dump_bb) (FILE *, basic_block, int, int);
-  void (*dump_bb_for_graph) (pretty_printer *, basic_block);
-
-  /* Basic CFG manipulation.  */
-
-  /* Return new basic block.  */
-  basic_block (*create_basic_block) (void *head, void *end, basic_block after);
-
-  /* Redirect edge E to the given basic block B and update underlying program
-     representation.  Returns edge representing redirected branch (that may not
-     be equivalent to E in the case of duplicate edges being removed) or NULL
-     if edge is not easily redirectable for whatever reason.  */
-  edge (*redirect_edge_and_branch) (edge e, basic_block b);
-
-  /* Same as the above but allows redirecting of fallthru edges.  In that case
-     newly created forwarder basic block is returned.  The edge must
-     not be abnormal.  */
-  basic_block (*redirect_edge_and_branch_force) (edge, basic_block);
-
-  /* Returns true if it is possible to remove the edge by redirecting it
-     to the destination of the other edge going from its source.  */
-  bool (*can_remove_branch_p) (const_edge);
-
-  /* Remove statements corresponding to a given basic block.  */
-  void (*delete_basic_block) (basic_block);
-
-  /* Creates a new basic block just after basic block B by splitting
-     everything after specified instruction I.  */
-  basic_block (*split_block) (basic_block b, void * i);
-
-  /* Move block B immediately after block A.  */
-  bool (*move_block_after) (basic_block b, basic_block a);
-
-  /* Return true when blocks A and B can be merged into single basic block.  */
-  bool (*can_merge_blocks_p) (basic_block a, basic_block b);
-
-  /* Merge blocks A and B.  */
-  void (*merge_blocks) (basic_block a, basic_block b);
-
-  /* Predict edge E using PREDICTOR to given PROBABILITY.  */
-  void (*predict_edge) (edge e, enum br_predictor predictor, int probability);
-
-  /* Return true if the one of outgoing edges is already predicted by
-     PREDICTOR.  */
-  bool (*predicted_by_p) (const_basic_block bb, enum br_predictor predictor);
-
-  /* Return true when block A can be duplicated.  */
-  bool (*can_duplicate_block_p) (const_basic_block a);
-
-  /* Duplicate block A.  */
-  basic_block (*duplicate_block) (basic_block a);
-
-  /* Higher level functions representable by primitive operations above if
-     we didn't have some oddities in RTL and Tree representations.  */
-  basic_block (*split_edge) (edge);
-  void (*make_forwarder_block) (edge);
-
-  /* Try to make the edge fallthru.  */
-  void (*tidy_fallthru_edge) (edge);
-
-  /* Make the edge non-fallthru.  */
-  basic_block (*force_nonfallthru) (edge);
-
-  /* Say whether a block ends with a call, possibly followed by some
-     other code that must stay with the call.  */
-  bool (*block_ends_with_call_p) (basic_block);
-
-  /* Say whether a block ends with a conditional branch.  Switches
-     and unconditional branches do not qualify.  */
-  bool (*block_ends_with_condjump_p) (const_basic_block);
-
-  /* Add fake edges to the function exit for any non constant and non noreturn
-     calls, volatile inline assembly in the bitmap of blocks specified by
-     BLOCKS or to the whole CFG if BLOCKS is zero.  Return the number of blocks
-     that were split.
-
-     The goal is to expose cases in which entering a basic block does not imply
-     that all subsequent instructions must be executed.  */
-  int (*flow_call_edges_add) (sbitmap);
-
-  /* This function is called immediately after edge E is added to the
-     edge vector E->dest->preds.  */
-  void (*execute_on_growing_pred) (edge);
-
-  /* This function is called immediately before edge E is removed from
-     the edge vector E->dest->preds.  */
-  void (*execute_on_shrinking_pred) (edge);
-
-  /* A hook for duplicating loop in CFG, currently this is used
-     in loop versioning.  */
-  bool (*cfg_hook_duplicate_loop_to_header_edge) (struct loop *, edge,
-						  unsigned, sbitmap,
-						  edge, vec<edge> *,
-						  int);
-
-  /* Add condition to new basic block and update CFG used in loop
-     versioning.  */
-  void (*lv_add_condition_to_bb) (basic_block, basic_block, basic_block,
-				  void *);
-  /* Update the PHI nodes in case of loop versioning.  */
-  void (*lv_adjust_loop_header_phi) (basic_block, basic_block,
-				     basic_block, edge);
-
-  /* Given a condition BB extract the true/false taken/not taken edges
-     (depending if we are on tree's or RTL). */
-  void (*extract_cond_bb_edges) (basic_block, edge *, edge *);
-
-
-  /* Add PHI arguments queued in PENDINT_STMT list on edge E to edge
-     E->dest (only in tree-ssa loop versioning.  */
-  void (*flush_pending_stmts) (edge);
-  
-  /* True if a block contains no executable instructions.  */
-  bool (*empty_block_p) (basic_block);
-
-  /* Split a basic block if it ends with a conditional branch and if
-     the other part of the block is not empty.  */
-  basic_block (*split_block_before_cond_jump) (basic_block);
-
-  /* Do book-keeping of a basic block for the profile consistency checker.  */
-  void (*account_profile_record) (basic_block, int, struct profile_record *);
-};
-
-extern void verify_flow_info (void);
-extern void dump_bb (FILE *, basic_block, int, int);
-extern void dump_bb_for_graph (pretty_printer *, basic_block);
-
-extern edge redirect_edge_and_branch (edge, basic_block);
-extern basic_block redirect_edge_and_branch_force (edge, basic_block);
-extern bool can_remove_branch_p (const_edge);
-extern void remove_branch (edge);
-extern void remove_edge (edge);
-extern edge split_block (basic_block, void *);
-extern edge split_block_after_labels (basic_block);
-extern bool move_block_after (basic_block, basic_block);
-extern void delete_basic_block (basic_block);
-extern basic_block split_edge (edge);
-extern basic_block create_basic_block (void *, void *, basic_block);
-extern basic_block create_empty_bb (basic_block);
-extern bool can_merge_blocks_p (basic_block, basic_block);
-extern void merge_blocks (basic_block, basic_block);
-extern edge make_forwarder_block (basic_block, bool (*)(edge),
-				  void (*) (basic_block));
-extern basic_block force_nonfallthru (edge);
-extern void tidy_fallthru_edge (edge);
-extern void tidy_fallthru_edges (void);
-extern void predict_edge (edge e, enum br_predictor predictor, int probability);
-extern bool predicted_by_p (const_basic_block bb, enum br_predictor predictor);
-extern bool can_duplicate_block_p (const_basic_block);
-extern basic_block duplicate_block (basic_block, edge, basic_block);
-extern bool block_ends_with_call_p (basic_block bb);
-extern bool empty_block_p (basic_block);
-extern basic_block split_block_before_cond_jump (basic_block);
-extern bool block_ends_with_condjump_p (const_basic_block bb);
-extern int flow_call_edges_add (sbitmap);
-extern void execute_on_growing_pred (edge);
-extern void execute_on_shrinking_pred (edge);
-extern bool cfg_hook_duplicate_loop_to_header_edge (struct loop *loop, edge,
-						    unsigned int ndupl,
-						    sbitmap wont_exit,
-						    edge orig,
-						    vec<edge> *to_remove,
-						    int flags);
-
-extern void lv_flush_pending_stmts (edge);
-extern void extract_cond_bb_edges (basic_block, edge *, edge*);
-extern void lv_adjust_loop_header_phi (basic_block, basic_block, basic_block,
-				       edge);
-extern void lv_add_condition_to_bb (basic_block, basic_block, basic_block,
-				    void *);
-
-extern bool can_copy_bbs_p (basic_block *, unsigned);
-extern void copy_bbs (basic_block *, unsigned, basic_block *,
-		      edge *, unsigned, edge *, struct loop *,
-		      basic_block, bool);
-
-void account_profile_record (struct profile_record *, int);
-
-extern void cfg_layout_initialize (unsigned int);
-extern void cfg_layout_finalize (void);
-
-/* Hooks containers.  */
-extern struct cfg_hooks gimple_cfg_hooks;
-extern struct cfg_hooks rtl_cfg_hooks;
-extern struct cfg_hooks cfg_layout_rtl_cfg_hooks;
-
-/* Declarations.  */
-extern enum ir_type current_ir_type (void);
-extern void rtl_register_cfg_hooks (void);
-extern void cfg_layout_rtl_register_cfg_hooks (void);
-extern void gimple_register_cfg_hooks (void);
-extern struct cfg_hooks get_cfg_hooks (void);
-extern void set_cfg_hooks (struct cfg_hooks);
-
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cfgloop.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cfgloop.h
deleted file mode 100644
index 4b7c3d3..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cfgloop.h
+++ /dev/null
@@ -1,763 +0,0 @@
-/* Natural loop functions
-   Copyright (C) 1987-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_CFGLOOP_H
-#define GCC_CFGLOOP_H
-
-#include "double-int.h"
-#include "bitmap.h"
-#include "sbitmap.h"
-#include "function.h"
-
-/* Structure to hold decision about unrolling/peeling.  */
-enum lpt_dec
-{
-  LPT_NONE,
-  LPT_PEEL_COMPLETELY,
-  LPT_PEEL_SIMPLE,
-  LPT_UNROLL_CONSTANT,
-  LPT_UNROLL_RUNTIME,
-  LPT_UNROLL_STUPID
-};
-
-struct GTY (()) lpt_decision {
-  enum lpt_dec decision;
-  unsigned times;
-};
-
-/* The type of extend applied to an IV.  */
-enum iv_extend_code
-{
-  IV_SIGN_EXTEND,
-  IV_ZERO_EXTEND,
-  IV_UNKNOWN_EXTEND
-};
-
-/* The structure describing a bound on number of iterations of a loop.  */
-
-struct GTY ((chain_next ("%h.next"))) nb_iter_bound {
-  /* The statement STMT is executed at most ...  */
-  gimple stmt;
-
-  /* ... BOUND + 1 times (BOUND must be an unsigned constant).
-     The + 1 is added for the following reasons:
-
-     a) 0 would otherwise be unused, while we would need to care more about
-        overflows (as MAX + 1 is sometimes produced as the estimate on number
-	of executions of STMT).
-     b) it is consistent with the result of number_of_iterations_exit.  */
-  double_int bound;
-
-  /* True if the statement will cause the loop to be leaved the (at most)
-     BOUND + 1-st time it is executed, that is, all the statements after it
-     are executed at most BOUND times.  */
-  bool is_exit;
-
-  /* The next bound in the list.  */
-  struct nb_iter_bound *next;
-};
-
-/* Description of the loop exit.  */
-
-struct GTY (()) loop_exit {
-  /* The exit edge.  */
-  edge e;
-
-  /* Previous and next exit in the list of the exits of the loop.  */
-  struct loop_exit *prev;
-  struct loop_exit *next;
-
-  /* Next element in the list of loops from that E exits.  */
-  struct loop_exit *next_e;
-};
-
-typedef struct loop *loop_p;
-
-/* An integer estimation of the number of iterations.  Estimate_state
-   describes what is the state of the estimation.  */
-enum loop_estimation
-{
-  /* Estimate was not computed yet.  */
-  EST_NOT_COMPUTED,
-  /* Estimate is ready.  */
-  EST_AVAILABLE,
-  EST_LAST
-};
-
-/* Structure to hold information for each natural loop.  */
-struct GTY ((chain_next ("%h.next"))) loop {
-  /* Index into loops array.  */
-  int num;
-
-  /* Number of loop insns.  */
-  unsigned ninsns;
-
-  /* Basic block of loop header.  */
-  basic_block header;
-
-  /* Basic block of loop latch.  */
-  basic_block latch;
-
-  /* For loop unrolling/peeling decision.  */
-  struct lpt_decision lpt_decision;
-
-  /* Average number of executed insns per iteration.  */
-  unsigned av_ninsns;
-
-  /* Number of blocks contained within the loop.  */
-  unsigned num_nodes;
-
-  /* Superloops of the loop, starting with the outermost loop.  */
-  vec<loop_p, va_gc> *superloops;
-
-  /* The first inner (child) loop or NULL if innermost loop.  */
-  struct loop *inner;
-
-  /* Link to the next (sibling) loop.  */
-  struct loop *next;
-
-  /* Auxiliary info specific to a pass.  */
-  PTR GTY ((skip (""))) aux;
-
-  /* The number of times the latch of the loop is executed.  This can be an
-     INTEGER_CST, or a symbolic expression representing the number of
-     iterations like "N - 1", or a COND_EXPR containing the runtime
-     conditions under which the number of iterations is non zero.
-
-     Don't access this field directly: number_of_latch_executions
-     computes and caches the computed information in this field.  */
-  tree nb_iterations;
-
-  /* An integer guaranteed to be greater or equal to nb_iterations.  Only
-     valid if any_upper_bound is true.  */
-  double_int nb_iterations_upper_bound;
-
-  /* An integer giving an estimate on nb_iterations.  Unlike
-     nb_iterations_upper_bound, there is no guarantee that it is at least
-     nb_iterations.  */
-  double_int nb_iterations_estimate;
-
-  bool any_upper_bound;
-  bool any_estimate;
-
-  /* True if the loop can be parallel.  */
-  bool can_be_parallel;
-
-  /* True if -Waggressive-loop-optimizations warned about this loop
-     already.  */
-  bool warned_aggressive_loop_optimizations;
-
-  /* An integer estimation of the number of iterations.  Estimate_state
-     describes what is the state of the estimation.  */
-  enum loop_estimation estimate_state;
-
-  /* If > 0, an integer, where the user asserted that for any
-     I in [ 0, nb_iterations ) and for any J in
-     [ I, min ( I + safelen, nb_iterations ) ), the Ith and Jth iterations
-     of the loop can be safely evaluated concurrently.  */
-  int safelen;
-
-  /* True if we should try harder to vectorize this loop.  */
-  bool force_vect;
-
-  /* True if this loop should never be vectorized.  */
-  bool dont_vectorize;
-
-  /* For SIMD loops, this is a unique identifier of the loop, referenced
-     by IFN_GOMP_SIMD_VF, IFN_GOMP_SIMD_LANE and IFN_GOMP_SIMD_LAST_LANE
-     builtins.  */
-  tree simduid;
-
-  /* Upper bound on number of iterations of a loop.  */
-  struct nb_iter_bound *bounds;
-
-  /* Head of the cyclic list of the exits of the loop.  */
-  struct loop_exit *exits;
-
-  /* Number of iteration analysis data for RTL.  */
-  struct niter_desc *simple_loop_desc;
-};
-
-/* Flags for state of loop structure.  */
-enum
-{
-  LOOPS_HAVE_PREHEADERS = 1,
-  LOOPS_HAVE_SIMPLE_LATCHES = 2,
-  LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS = 4,
-  LOOPS_HAVE_RECORDED_EXITS = 8,
-  LOOPS_MAY_HAVE_MULTIPLE_LATCHES = 16,
-  LOOP_CLOSED_SSA = 32,
-  LOOPS_NEED_FIXUP = 64,
-  LOOPS_HAVE_FALLTHRU_PREHEADERS = 128
-};
-
-#define LOOPS_NORMAL (LOOPS_HAVE_PREHEADERS | LOOPS_HAVE_SIMPLE_LATCHES \
-		      | LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
-#define AVOID_CFG_MODIFICATIONS (LOOPS_MAY_HAVE_MULTIPLE_LATCHES)
-
-/* Structure to hold CFG information about natural loops within a function.  */
-struct GTY (()) loops {
-  /* State of loops.  */
-  int state;
-
-  /* Array of the loops.  */
-  vec<loop_p, va_gc> *larray;
-
-  /* Maps edges to the list of their descriptions as loop exits.  Edges
-     whose sources or destinations have loop_father == NULL (which may
-     happen during the cfg manipulations) should not appear in EXITS.  */
-  htab_t GTY((param_is (struct loop_exit))) exits;
-
-  /* Pointer to root of loop hierarchy tree.  */
-  struct loop *tree_root;
-};
-
-/* Loop recognition.  */
-bool bb_loop_header_p (basic_block);
-void init_loops_structure (struct function *, struct loops *, unsigned);
-extern struct loops *flow_loops_find (struct loops *);
-extern void disambiguate_loops_with_multiple_latches (void);
-extern void flow_loops_free (struct loops *);
-extern void flow_loops_dump (FILE *,
-			     void (*)(const struct loop *, FILE *, int), int);
-extern void flow_loop_dump (const struct loop *, FILE *,
-			    void (*)(const struct loop *, FILE *, int), int);
-struct loop *alloc_loop (void);
-extern void flow_loop_free (struct loop *);
-int flow_loop_nodes_find (basic_block, struct loop *);
-unsigned fix_loop_structure (bitmap changed_bbs);
-bool mark_irreducible_loops (void);
-void release_recorded_exits (void);
-void record_loop_exits (void);
-void rescan_loop_exit (edge, bool, bool);
-
-/* Loop data structure manipulation/querying.  */
-extern void flow_loop_tree_node_add (struct loop *, struct loop *);
-extern void flow_loop_tree_node_remove (struct loop *);
-extern void place_new_loop (struct function *, struct loop *);
-extern void add_loop (struct loop *, struct loop *);
-extern bool flow_loop_nested_p	(const struct loop *, const struct loop *);
-extern bool flow_bb_inside_loop_p (const struct loop *, const_basic_block);
-extern struct loop * find_common_loop (struct loop *, struct loop *);
-struct loop *superloop_at_depth (struct loop *, unsigned);
-struct eni_weights_d;
-extern int num_loop_insns (const struct loop *);
-extern int average_num_loop_insns (const struct loop *);
-extern unsigned get_loop_level (const struct loop *);
-extern bool loop_exit_edge_p (const struct loop *, const_edge);
-extern bool loop_exits_to_bb_p (struct loop *, basic_block);
-extern bool loop_exits_from_bb_p (struct loop *, basic_block);
-extern void mark_loop_exit_edges (void);
-extern location_t get_loop_location (struct loop *loop);
-
-/* Loops & cfg manipulation.  */
-extern basic_block *get_loop_body (const struct loop *);
-extern unsigned get_loop_body_with_size (const struct loop *, basic_block *,
-					 unsigned);
-extern basic_block *get_loop_body_in_dom_order (const struct loop *);
-extern basic_block *get_loop_body_in_bfs_order (const struct loop *);
-extern basic_block *get_loop_body_in_custom_order (const struct loop *,
-			       int (*) (const void *, const void *));
-
-extern vec<edge> get_loop_exit_edges (const struct loop *);
-extern edge single_exit (const struct loop *);
-extern edge single_likely_exit (struct loop *loop);
-extern unsigned num_loop_branches (const struct loop *);
-
-extern edge loop_preheader_edge (const struct loop *);
-extern edge loop_latch_edge (const struct loop *);
-
-extern void add_bb_to_loop (basic_block, struct loop *);
-extern void remove_bb_from_loops (basic_block);
-
-extern void cancel_loop_tree (struct loop *);
-extern void delete_loop (struct loop *);
-
-enum
-{
-  CP_SIMPLE_PREHEADERS = 1,
-  CP_FALLTHRU_PREHEADERS = 2
-};
-
-basic_block create_preheader (struct loop *, int);
-extern void create_preheaders (int);
-extern void force_single_succ_latches (void);
-
-extern void verify_loop_structure (void);
-
-/* Loop analysis.  */
-extern bool just_once_each_iteration_p (const struct loop *, const_basic_block);
-gcov_type expected_loop_iterations_unbounded (const struct loop *);
-extern unsigned expected_loop_iterations (const struct loop *);
-extern rtx doloop_condition_get (rtx);
-
-
-/* Loop manipulation.  */
-extern bool can_duplicate_loop_p (const struct loop *loop);
-
-#define DLTHE_FLAG_UPDATE_FREQ	1	/* Update frequencies in
-					   duplicate_loop_to_header_edge.  */
-#define DLTHE_RECORD_COPY_NUMBER 2	/* Record copy number in the aux
-					   field of newly create BB.  */
-#define DLTHE_FLAG_COMPLETTE_PEEL 4	/* Update frequencies expecting
-					   a complete peeling.  */
-
-extern edge create_empty_if_region_on_edge (edge, tree);
-extern struct loop *create_empty_loop_on_edge (edge, tree, tree, tree, tree,
-					       tree *, tree *, struct loop *);
-extern struct loop * duplicate_loop (struct loop *, struct loop *);
-extern void copy_loop_info (struct loop *loop, struct loop *target);
-extern void duplicate_subloops (struct loop *, struct loop *);
-extern bool duplicate_loop_to_header_edge (struct loop *, edge,
-					   unsigned, sbitmap, edge,
- 					   vec<edge> *, int);
-extern struct loop *loopify (edge, edge,
-			     basic_block, edge, edge, bool,
-			     unsigned, unsigned);
-struct loop * loop_version (struct loop *, void *,
-			    basic_block *, unsigned, unsigned, unsigned, bool);
-extern bool remove_path (edge);
-extern void unloop (struct loop *, bool *, bitmap);
-extern void scale_loop_frequencies (struct loop *, int, int);
-
-/* Induction variable analysis.  */
-
-/* The description of induction variable.  The things are a bit complicated
-   due to need to handle subregs and extends.  The value of the object described
-   by it can be obtained as follows (all computations are done in extend_mode):
-
-   Value in i-th iteration is
-     delta + mult * extend_{extend_mode} (subreg_{mode} (base + i * step)).
-
-   If first_special is true, the value in the first iteration is
-     delta + mult * base
-
-   If extend = UNKNOWN, first_special must be false, delta 0, mult 1 and value is
-     subreg_{mode} (base + i * step)
-
-   The get_iv_value function can be used to obtain these expressions.
-
-   ??? Add a third mode field that would specify the mode in that inner
-   computation is done, which would enable it to be different from the
-   outer one?  */
-
-struct rtx_iv
-{
-  /* Its base and step (mode of base and step is supposed to be extend_mode,
-     see the description above).  */
-  rtx base, step;
-
-  /* The type of extend applied to it (IV_SIGN_EXTEND, IV_ZERO_EXTEND,
-     or IV_UNKNOWN_EXTEND).  */
-  enum iv_extend_code extend;
-
-  /* Operations applied in the extended mode.  */
-  rtx delta, mult;
-
-  /* The mode it is extended to.  */
-  enum machine_mode extend_mode;
-
-  /* The mode the variable iterates in.  */
-  enum machine_mode mode;
-
-  /* Whether the first iteration needs to be handled specially.  */
-  unsigned first_special : 1;
-};
-
-/* The description of an exit from the loop and of the number of iterations
-   till we take the exit.  */
-
-struct GTY(()) niter_desc
-{
-  /* The edge out of the loop.  */
-  edge out_edge;
-
-  /* The other edge leading from the condition.  */
-  edge in_edge;
-
-  /* True if we are able to say anything about number of iterations of the
-     loop.  */
-  bool simple_p;
-
-  /* True if the loop iterates the constant number of times.  */
-  bool const_iter;
-
-  /* Number of iterations if constant.  */
-  unsigned HOST_WIDEST_INT niter;
-
-  /* Assumptions under that the rest of the information is valid.  */
-  rtx assumptions;
-
-  /* Assumptions under that the loop ends before reaching the latch,
-     even if value of niter_expr says otherwise.  */
-  rtx noloop_assumptions;
-
-  /* Condition under that the loop is infinite.  */
-  rtx infinite;
-
-  /* Whether the comparison is signed.  */
-  bool signed_p;
-
-  /* The mode in that niter_expr should be computed.  */
-  enum machine_mode mode;
-
-  /* The number of iterations of the loop.  */
-  rtx niter_expr;
-};
-
-extern void iv_analysis_loop_init (struct loop *);
-extern bool iv_analyze (rtx, rtx, struct rtx_iv *);
-extern bool iv_analyze_result (rtx, rtx, struct rtx_iv *);
-extern bool iv_analyze_expr (rtx, rtx, enum machine_mode, struct rtx_iv *);
-extern rtx get_iv_value (struct rtx_iv *, rtx);
-extern bool biv_p (rtx, rtx);
-extern void find_simple_exit (struct loop *, struct niter_desc *);
-extern void iv_analysis_done (void);
-
-extern struct niter_desc *get_simple_loop_desc (struct loop *loop);
-extern void free_simple_loop_desc (struct loop *loop);
-
-static inline struct niter_desc *
-simple_loop_desc (struct loop *loop)
-{
-  return loop->simple_loop_desc;
-}
-
-/* Accessors for the loop structures.  */
-
-/* Returns the loop with index NUM from FNs loop tree.  */
-
-static inline struct loop *
-get_loop (struct function *fn, unsigned num)
-{
-  return (*loops_for_fn (fn)->larray)[num];
-}
-
-/* Returns the number of superloops of LOOP.  */
-
-static inline unsigned
-loop_depth (const struct loop *loop)
-{
-  return vec_safe_length (loop->superloops);
-}
-
-/* Returns the immediate superloop of LOOP, or NULL if LOOP is the outermost
-   loop.  */
-
-static inline struct loop *
-loop_outer (const struct loop *loop)
-{
-  unsigned n = vec_safe_length (loop->superloops);
-
-  if (n == 0)
-    return NULL;
-
-  return (*loop->superloops)[n - 1];
-}
-
-/* Returns true if LOOP has at least one exit edge.  */
-
-static inline bool
-loop_has_exit_edges (const struct loop *loop)
-{
-  return loop->exits->next->e != NULL;
-}
-
-/* Returns the list of loops in FN.  */
-
-inline vec<loop_p, va_gc> *
-get_loops (struct function *fn)
-{
-  struct loops *loops = loops_for_fn (fn);
-  if (!loops)
-    return NULL;
-
-  return loops->larray;
-}
-
-/* Returns the number of loops in FN (including the removed
-   ones and the fake loop that forms the root of the loop tree).  */
-
-static inline unsigned
-number_of_loops (struct function *fn)
-{
-  struct loops *loops = loops_for_fn (fn);
-  if (!loops)
-    return 0;
-
-  return vec_safe_length (loops->larray);
-}
-
-/* Returns true if state of the loops satisfies all properties
-   described by FLAGS.  */
-
-static inline bool
-loops_state_satisfies_p (unsigned flags)
-{
-  return (current_loops->state & flags) == flags;
-}
-
-/* Sets FLAGS to the loops state.  */
-
-static inline void
-loops_state_set (unsigned flags)
-{
-  current_loops->state |= flags;
-}
-
-/* Clears FLAGS from the loops state.  */
-
-static inline void
-loops_state_clear (unsigned flags)
-{
-  if (!current_loops)
-    return;
-  current_loops->state &= ~flags;
-}
-
-/* Loop iterators.  */
-
-/* Flags for loop iteration.  */
-
-enum li_flags
-{
-  LI_INCLUDE_ROOT = 1,		/* Include the fake root of the loop tree.  */
-  LI_FROM_INNERMOST = 2,	/* Iterate over the loops in the reverse order,
-				   starting from innermost ones.  */
-  LI_ONLY_INNERMOST = 4		/* Iterate only over innermost loops.  */
-};
-
-/* The iterator for loops.  */
-
-struct loop_iterator
-{
-  loop_iterator (loop_p *loop, unsigned flags);
-  ~loop_iterator ();
-
-  inline loop_p next ();
-
-  /* The list of loops to visit.  */
-  vec<int> to_visit;
-
-  /* The index of the actual loop.  */
-  unsigned idx;
-};
-
-inline loop_p
-loop_iterator::next ()
-{
-  int anum;
-
-  while (this->to_visit.iterate (this->idx, &anum))
-    {
-      this->idx++;
-      loop_p loop = get_loop (cfun, anum);
-      if (loop)
-	return loop;
-    }
-
-  return NULL;
-}
-
-inline
-loop_iterator::loop_iterator (loop_p *loop, unsigned flags)
-{
-  struct loop *aloop;
-  unsigned i;
-  int mn;
-
-  this->idx = 0;
-  if (!current_loops)
-    {
-      this->to_visit.create (0);
-      *loop = NULL;
-      return;
-    }
-
-  this->to_visit.create (number_of_loops (cfun));
-  mn = (flags & LI_INCLUDE_ROOT) ? 0 : 1;
-
-  if (flags & LI_ONLY_INNERMOST)
-    {
-      for (i = 0; vec_safe_iterate (current_loops->larray, i, &aloop); i++)
-	if (aloop != NULL
-	    && aloop->inner == NULL
-	    && aloop->num >= mn)
-	  this->to_visit.quick_push (aloop->num);
-    }
-  else if (flags & LI_FROM_INNERMOST)
-    {
-      /* Push the loops to LI->TO_VISIT in postorder.  */
-      for (aloop = current_loops->tree_root;
-	   aloop->inner != NULL;
-	   aloop = aloop->inner)
-	continue;
-
-      while (1)
-	{
-	  if (aloop->num >= mn)
-	    this->to_visit.quick_push (aloop->num);
-
-	  if (aloop->next)
-	    {
-	      for (aloop = aloop->next;
-		   aloop->inner != NULL;
-		   aloop = aloop->inner)
-		continue;
-	    }
-	  else if (!loop_outer (aloop))
-	    break;
-	  else
-	    aloop = loop_outer (aloop);
-	}
-    }
-  else
-    {
-      /* Push the loops to LI->TO_VISIT in preorder.  */
-      aloop = current_loops->tree_root;
-      while (1)
-	{
-	  if (aloop->num >= mn)
-	    this->to_visit.quick_push (aloop->num);
-
-	  if (aloop->inner != NULL)
-	    aloop = aloop->inner;
-	  else
-	    {
-	      while (aloop != NULL && aloop->next == NULL)
-		aloop = loop_outer (aloop);
-	      if (aloop == NULL)
-		break;
-	      aloop = aloop->next;
-	    }
-	}
-    }
-
-  *loop = this->next ();
-}
-
-inline
-loop_iterator::~loop_iterator ()
-{
-  this->to_visit.release ();
-}
-
-#define FOR_EACH_LOOP(LOOP, FLAGS) \
-  for (loop_iterator li(&(LOOP), FLAGS); \
-       (LOOP); \
-       (LOOP) = li.next ())
-
-/* The properties of the target.  */
-struct target_cfgloop {
-  /* Number of available registers.  */
-  unsigned x_target_avail_regs;
-
-  /* Number of available registers that are call-clobbered.  */
-  unsigned x_target_clobbered_regs;
-
-  /* Number of registers reserved for temporary expressions.  */
-  unsigned x_target_res_regs;
-
-  /* The cost for register when there still is some reserve, but we are
-     approaching the number of available registers.  */
-  unsigned x_target_reg_cost[2];
-
-  /* The cost for register when we need to spill.  */
-  unsigned x_target_spill_cost[2];
-};
-
-extern struct target_cfgloop default_target_cfgloop;
-#if SWITCHABLE_TARGET
-extern struct target_cfgloop *this_target_cfgloop;
-#else
-#define this_target_cfgloop (&default_target_cfgloop)
-#endif
-
-#define target_avail_regs \
-  (this_target_cfgloop->x_target_avail_regs)
-#define target_clobbered_regs \
-  (this_target_cfgloop->x_target_clobbered_regs)
-#define target_res_regs \
-  (this_target_cfgloop->x_target_res_regs)
-#define target_reg_cost \
-  (this_target_cfgloop->x_target_reg_cost)
-#define target_spill_cost \
-  (this_target_cfgloop->x_target_spill_cost)
-
-/* Register pressure estimation for induction variable optimizations & loop
-   invariant motion.  */
-extern unsigned estimate_reg_pressure_cost (unsigned, unsigned, bool, bool);
-extern void init_set_costs (void);
-
-/* Loop optimizer initialization.  */
-extern void loop_optimizer_init (unsigned);
-extern void loop_optimizer_finalize (void);
-
-/* Optimization passes.  */
-extern void unswitch_loops (void);
-
-enum
-{
-  UAP_PEEL = 1,		/* Enables loop peeling.  */
-  UAP_UNROLL = 2,	/* Enables unrolling of loops if it seems profitable.  */
-  UAP_UNROLL_ALL = 4	/* Enables unrolling of all loops.  */
-};
-
-extern void unroll_and_peel_loops (int);
-extern void doloop_optimize_loops (void);
-extern void move_loop_invariants (void);
-extern void scale_loop_profile (struct loop *loop, int scale, gcov_type iteration_bound);
-extern vec<basic_block> get_loop_hot_path (const struct loop *loop);
-
-/* Returns the outermost loop of the loop nest that contains LOOP.*/
-static inline struct loop *
-loop_outermost (struct loop *loop)
-{
-  unsigned n = vec_safe_length (loop->superloops);
-
-  if (n <= 1)
-    return loop;
-
-  return (*loop->superloops)[1];
-}
-
-extern void record_niter_bound (struct loop *, double_int, bool, bool);
-extern HOST_WIDE_INT get_estimated_loop_iterations_int (struct loop *);
-extern HOST_WIDE_INT get_max_loop_iterations_int (struct loop *);
-extern bool get_estimated_loop_iterations (struct loop *loop, double_int *nit);
-extern bool get_max_loop_iterations (struct loop *loop, double_int *nit);
-extern int bb_loop_depth (const_basic_block);
-
-/* Converts VAL to double_int.  */
-
-static inline double_int
-gcov_type_to_double_int (gcov_type val)
-{
-  double_int ret;
-
-  ret.low = (unsigned HOST_WIDE_INT) val;
-  /* If HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_WIDEST_INT, avoid shifting by
-     the size of type.  */
-  val >>= HOST_BITS_PER_WIDE_INT - 1;
-  val >>= 1;
-  ret.high = (unsigned HOST_WIDE_INT) val;
-
-  return ret;
-}
-#endif /* GCC_CFGLOOP_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cgraph.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cgraph.h
deleted file mode 100644
index 6c3be6d..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cgraph.h
+++ /dev/null
@@ -1,1543 +0,0 @@
-/* Callgraph handling code.
-   Copyright (C) 2003-2014 Free Software Foundation, Inc.
-   Contributed by Jan Hubicka
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_CGRAPH_H
-#define GCC_CGRAPH_H
-
-#include "is-a.h"
-#include "plugin-api.h"
-#include "vec.h"
-#include "basic-block.h"
-#include "function.h"
-#include "ipa-ref.h"
-
-/* Symbol table consists of functions and variables.
-   TODO: add labels and CONST_DECLs.  */
-enum symtab_type
-{
-  SYMTAB_SYMBOL,
-  SYMTAB_FUNCTION,
-  SYMTAB_VARIABLE
-};
-
-/* Base of all entries in the symbol table.
-   The symtab_node is inherited by cgraph and varpol nodes.  */
-class GTY((desc ("%h.type"), tag ("SYMTAB_SYMBOL"),
-	   chain_next ("%h.next"), chain_prev ("%h.previous")))
-  symtab_node
-{
-public:
-  /* Return name.  */
-  const char *name () const;
-
-  /* Return asm name.  */
-  const char * asm_name () const;
-
-  /* Type of the symbol.  */
-  ENUM_BITFIELD (symtab_type) type : 8;
-
-  /* The symbols resolution.  */
-  ENUM_BITFIELD (ld_plugin_symbol_resolution) resolution : 8;
-
-  /*** Flags representing the symbol type.  ***/
-
-  /* True when symbol corresponds to a definition in current unit.
-     set via cgraph_finalize_function or varpool_finalize_decl  */
-  unsigned definition : 1;
-  /* True when symbol is an alias.  
-     Set by assemble_alias.  */
-  unsigned alias : 1;
-  /* True when alias is a weakref.  */
-  unsigned weakref : 1;
-  /* C++ frontend produce same body aliases and extra name aliases for
-     virtual functions and vtables that are obviously equivalent.
-     Those aliases are bit special, especially because C++ frontend
-     visibility code is so ugly it can not get them right at first time
-     and their visibility needs to be copied from their "masters" at
-     the end of parsing.  */
-  unsigned cpp_implicit_alias : 1;
-  /* Set once the definition was analyzed.  The list of references and
-     other properties are built during analysis.  */
-  unsigned analyzed : 1;
-
-
-  /*** Visibility and linkage flags.  ***/
-
-  /* Set when function is visible by other units.  */
-  unsigned externally_visible : 1;
-  /* The symbol will be assumed to be used in an invisible way (like
-     by an toplevel asm statement).  */
-  unsigned force_output : 1;
-  /* Like FORCE_OUTPUT, but in the case it is ABI requiring the symbol to be
-     exported.  Unlike FORCE_OUTPUT this flag gets cleared to symbols promoted
-     to static and it does not inhibit optimization.  */
-  unsigned forced_by_abi : 1;
-  /* True when the name is known to be unique and thus it does not need mangling.  */
-  unsigned unique_name : 1;
-  /* True when body and other characteristics have been removed by
-     symtab_remove_unreachable_nodes. */
-  unsigned body_removed : 1;
-
-  /*** WHOPR Partitioning flags.
-       These flags are used at ltrans stage when only part of the callgraph is
-       available. ***/
-
-  /* Set when variable is used from other LTRANS partition.  */
-  unsigned used_from_other_partition : 1;
-  /* Set when function is available in the other LTRANS partition.  
-     During WPA output it is used to mark nodes that are present in
-     multiple partitions.  */
-  unsigned in_other_partition : 1;
-
-
-
-  /*** other flags.  ***/
-
-  /* Set when symbol has address taken. */
-  unsigned address_taken : 1;
-
-
-  /* Ordering of all symtab entries.  */
-  int order;
-
-  /* Declaration representing the symbol.  */
-  tree decl;
-
-  /* Linked list of symbol table entries starting with symtab_nodes.  */
-  symtab_node *next;
-  symtab_node *previous;
-
-  /* Linked list of symbols with the same asm name.  There may be multiple
-     entries for single symbol name during LTO, because symbols are renamed
-     only after partitioning.
-
-     Because inline clones are kept in the assembler name has, they also produce
-     duplicate entries.
-
-     There are also several long standing bugs where frontends and builtin
-     code produce duplicated decls.  */
-  symtab_node *next_sharing_asm_name;
-  symtab_node *previous_sharing_asm_name;
-
-  /* Circular list of nodes in the same comdat group if non-NULL.  */
-  symtab_node *same_comdat_group;
-
-  /* Vectors of referring and referenced entities.  */
-  struct ipa_ref_list ref_list;
-
-  /* Alias target. May be either DECL pointer or ASSEMBLER_NAME pointer
-     depending to what was known to frontend on the creation time.
-     Once alias is resolved, this pointer become NULL.  */
-  tree alias_target;
-
-  /* File stream where this node is being written to.  */
-  struct lto_file_decl_data * lto_file_data;
-
-  PTR GTY ((skip)) aux;
-};
-
-enum availability
-{
-  /* Not yet set by cgraph_function_body_availability.  */
-  AVAIL_UNSET,
-  /* Function body/variable initializer is unknown.  */
-  AVAIL_NOT_AVAILABLE,
-  /* Function body/variable initializer is known but might be replaced
-     by a different one from other compilation unit and thus needs to
-     be dealt with a care.  Like AVAIL_NOT_AVAILABLE it can have
-     arbitrary side effects on escaping variables and functions, while
-     like AVAILABLE it might access static variables.  */
-  AVAIL_OVERWRITABLE,
-  /* Function body/variable initializer is known and will be used in final
-     program.  */
-  AVAIL_AVAILABLE,
-  /* Function body/variable initializer is known and all it's uses are explicitly
-     visible within current unit (ie it's address is never taken and it is not
-     exported to other units).
-     Currently used only for functions.  */
-  AVAIL_LOCAL
-};
-
-/* This is the information that is put into the cgraph local structure
-   to recover a function.  */
-struct lto_file_decl_data;
-
-extern const char * const cgraph_availability_names[];
-extern const char * const ld_plugin_symbol_resolution_names[];
-
-/* Information about thunk, used only for same body aliases.  */
-
-struct GTY(()) cgraph_thunk_info {
-  /* Information about the thunk.  */
-  HOST_WIDE_INT fixed_offset;
-  HOST_WIDE_INT virtual_value;
-  tree alias;
-  bool this_adjusting;
-  bool virtual_offset_p;
-  /* Set to true when alias node is thunk.  */
-  bool thunk_p;
-};
-
-/* Information about the function collected locally.
-   Available after function is analyzed.  */
-
-struct GTY(()) cgraph_local_info {
-  /* Set when function function is visible in current compilation unit only
-     and its address is never taken.  */
-  unsigned local : 1;
-
-  /* False when there is something makes versioning impossible.  */
-  unsigned versionable : 1;
-
-  /* False when function calling convention and signature can not be changed.
-     This is the case when __builtin_apply_args is used.  */
-  unsigned can_change_signature : 1;
-
-  /* True when the function has been originally extern inline, but it is
-     redefined now.  */
-  unsigned redefined_extern_inline : 1;
-
-  /* True if the function may enter serial irrevocable mode.  */
-  unsigned tm_may_enter_irr : 1;
-};
-
-/* Information about the function that needs to be computed globally
-   once compilation is finished.  Available only with -funit-at-a-time.  */
-
-struct GTY(()) cgraph_global_info {
-  /* For inline clones this points to the function they will be
-     inlined into.  */
-  struct cgraph_node *inlined_to;
-};
-
-/* Information about the function that is propagated by the RTL backend.
-   Available only for functions that has been already assembled.  */
-
-struct GTY(()) cgraph_rtl_info {
-   unsigned int preferred_incoming_stack_boundary;
-};
-
-/* Represent which DECL tree (or reference to such tree)
-   will be replaced by another tree while versioning.  */
-struct GTY(()) ipa_replace_map
-{
-  /* The tree that will be replaced.  */
-  tree old_tree;
-  /* The new (replacing) tree.  */
-  tree new_tree;
-  /* Parameter number to replace, when old_tree is NULL.  */
-  int parm_num;
-  /* True when a substitution should be done, false otherwise.  */
-  bool replace_p;
-  /* True when we replace a reference to old_tree.  */
-  bool ref_p;
-};
-typedef struct ipa_replace_map *ipa_replace_map_p;
-
-struct GTY(()) cgraph_clone_info
-{
-  vec<ipa_replace_map_p, va_gc> *tree_map;
-  bitmap args_to_skip;
-  bitmap combined_args_to_skip;
-};
-
-enum cgraph_simd_clone_arg_type
-{
-  SIMD_CLONE_ARG_TYPE_VECTOR,
-  SIMD_CLONE_ARG_TYPE_UNIFORM,
-  SIMD_CLONE_ARG_TYPE_LINEAR_CONSTANT_STEP,
-  SIMD_CLONE_ARG_TYPE_LINEAR_VARIABLE_STEP,
-  SIMD_CLONE_ARG_TYPE_MASK
-};
-
-/* Function arguments in the original function of a SIMD clone.
-   Supplementary data for `struct simd_clone'.  */
-
-struct GTY(()) cgraph_simd_clone_arg {
-  /* Original function argument as it originally existed in
-     DECL_ARGUMENTS.  */
-  tree orig_arg;
-
-  /* orig_arg's function (or for extern functions type from
-     TYPE_ARG_TYPES).  */
-  tree orig_type;
-
-  /* If argument is a vector, this holds the vector version of
-     orig_arg that after adjusting the argument types will live in
-     DECL_ARGUMENTS.  Otherwise, this is NULL.
-
-     This basically holds:
-       vector(simdlen) __typeof__(orig_arg) new_arg.  */
-  tree vector_arg;
-
-  /* vector_arg's type (or for extern functions new vector type.  */
-  tree vector_type;
-
-  /* If argument is a vector, this holds the array where the simd
-     argument is held while executing the simd clone function.  This
-     is a local variable in the cloned function.  Its content is
-     copied from vector_arg upon entry to the clone.
-
-     This basically holds:
-       __typeof__(orig_arg) simd_array[simdlen].  */
-  tree simd_array;
-
-  /* A SIMD clone's argument can be either linear (constant or
-     variable), uniform, or vector.  */
-  enum cgraph_simd_clone_arg_type arg_type;
-
-  /* For arg_type SIMD_CLONE_ARG_TYPE_LINEAR_CONSTANT_STEP this is
-     the constant linear step, if arg_type is
-     SIMD_CLONE_ARG_TYPE_LINEAR_VARIABLE_STEP, this is index of
-     the uniform argument holding the step, otherwise 0.  */
-  HOST_WIDE_INT linear_step;
-
-  /* Variable alignment if available, otherwise 0.  */
-  unsigned int alignment;
-};
-
-/* Specific data for a SIMD function clone.  */
-
-struct GTY(()) cgraph_simd_clone {
-  /* Number of words in the SIMD lane associated with this clone.  */
-  unsigned int simdlen;
-
-  /* Number of annotated function arguments in `args'.  This is
-     usually the number of named arguments in FNDECL.  */
-  unsigned int nargs;
-
-  /* Max hardware vector size in bits for integral vectors.  */
-  unsigned int vecsize_int;
-
-  /* Max hardware vector size in bits for floating point vectors.  */
-  unsigned int vecsize_float;
-
-  /* The mangling character for a given vector size.  This is is used
-     to determine the ISA mangling bit as specified in the Intel
-     Vector ABI.  */
-  unsigned char vecsize_mangle;
-
-  /* True if this is the masked, in-branch version of the clone,
-     otherwise false.  */
-  unsigned int inbranch : 1;
-
-  /* True if this is a Cilk Plus variant.  */
-  unsigned int cilk_elemental : 1;
-
-  /* Doubly linked list of SIMD clones.  */
-  struct cgraph_node *prev_clone, *next_clone;
-
-  /* Original cgraph node the SIMD clones were created for.  */
-  struct cgraph_node *origin;
-
-  /* Annotated function arguments for the original function.  */
-  struct cgraph_simd_clone_arg GTY((length ("%h.nargs"))) args[1];
-};
-
-
-/* The cgraph data structure.
-   Each function decl has assigned cgraph_node listing callees and callers.  */
-
-struct GTY((tag ("SYMTAB_FUNCTION"))) cgraph_node : public symtab_node {
-public:
-  struct cgraph_edge *callees;
-  struct cgraph_edge *callers;
-  /* List of edges representing indirect calls with a yet undetermined
-     callee.  */
-  struct cgraph_edge *indirect_calls;
-  /* For nested functions points to function the node is nested in.  */
-  struct cgraph_node *origin;
-  /* Points to first nested function, if any.  */
-  struct cgraph_node *nested;
-  /* Pointer to the next function with same origin, if any.  */
-  struct cgraph_node *next_nested;
-  /* Pointer to the next clone.  */
-  struct cgraph_node *next_sibling_clone;
-  struct cgraph_node *prev_sibling_clone;
-  struct cgraph_node *clones;
-  struct cgraph_node *clone_of;
-  /* For functions with many calls sites it holds map from call expression
-     to the edge to speed up cgraph_edge function.  */
-  htab_t GTY((param_is (struct cgraph_edge))) call_site_hash;
-  /* Declaration node used to be clone of. */
-  tree former_clone_of;
-
-  /* If this is a SIMD clone, this points to the SIMD specific
-     information for it.  */
-  struct cgraph_simd_clone *simdclone;
-  /* If this function has SIMD clones, this points to the first clone.  */
-  struct cgraph_node *simd_clones;
-
-  /* Interprocedural passes scheduled to have their transform functions
-     applied next time we execute local pass on them.  We maintain it
-     per-function in order to allow IPA passes to introduce new functions.  */
-  vec<ipa_opt_pass> GTY((skip)) ipa_transforms_to_apply;
-
-  struct cgraph_local_info local;
-  struct cgraph_global_info global;
-  struct cgraph_rtl_info rtl;
-  struct cgraph_clone_info clone;
-  struct cgraph_thunk_info thunk;
-
-  /* Expected number of executions: calculated in profile.c.  */
-  gcov_type count;
-  /* How to scale counts at materialization time; used to merge
-     LTO units with different number of profile runs.  */
-  int count_materialization_scale;
-  /* Unique id of the node.  */
-  int uid;
-  /* ID assigned by the profiling.  */
-  unsigned int profile_id;
-  /* Time profiler: first run of function.  */
-  int tp_first_run;
-
-  /* Set when decl is an abstract function pointed to by the
-     ABSTRACT_DECL_ORIGIN of a reachable function.  */
-  unsigned used_as_abstract_origin : 1;
-  /* Set once the function is lowered (i.e. its CFG is built).  */
-  unsigned lowered : 1;
-  /* Set once the function has been instantiated and its callee
-     lists created.  */
-  unsigned process : 1;
-  /* How commonly executed the node is.  Initialized during branch
-     probabilities pass.  */
-  ENUM_BITFIELD (node_frequency) frequency : 2;
-  /* True when function can only be called at startup (from static ctor).  */
-  unsigned only_called_at_startup : 1;
-  /* True when function can only be called at startup (from static dtor).  */
-  unsigned only_called_at_exit : 1;
-  /* True when function is the transactional clone of a function which
-     is called only from inside transactions.  */
-  /* ?? We should be able to remove this.  We have enough bits in
-     cgraph to calculate it.  */
-  unsigned tm_clone : 1;
-  /* True if this decl is a dispatcher for function versions.  */
-  unsigned dispatcher_function : 1;
-  /* True if this decl calls a COMDAT-local function.  This is set up in
-     compute_inline_parameters and inline_call.  */
-  unsigned calls_comdat_local : 1;
-};
-
-
-typedef struct cgraph_node *cgraph_node_ptr;
-
-
-/* Function Multiversioning info.  */
-struct GTY(()) cgraph_function_version_info {
-  /* The cgraph_node for which the function version info is stored.  */
-  struct cgraph_node *this_node;
-  /* Chains all the semantically identical function versions.  The
-     first function in this chain is the version_info node of the
-     default function.  */
-  struct cgraph_function_version_info *prev;
-  /* If this version node corresponds to a dispatcher for function
-     versions, this points to the version info node of the default
-     function, the first node in the chain.  */
-  struct cgraph_function_version_info *next;
-  /* If this node corresponds to a function version, this points
-     to the dispatcher function decl, which is the function that must
-     be called to execute the right function version at run-time.
-
-     If this cgraph node is a dispatcher (if dispatcher_function is
-     true, in the cgraph_node struct) for function versions, this
-     points to resolver function, which holds the function body of the
-     dispatcher. The dispatcher decl is an alias to the resolver
-     function decl.  */
-  tree dispatcher_resolver;
-};
-
-/* Get the cgraph_function_version_info node corresponding to node.  */
-struct cgraph_function_version_info *
-  get_cgraph_node_version (struct cgraph_node *node);
-
-/* Insert a new cgraph_function_version_info node into cgraph_fnver_htab
-   corresponding to cgraph_node NODE.  */
-struct cgraph_function_version_info *
-  insert_new_cgraph_node_version (struct cgraph_node *node);
-
-/* Record that DECL1 and DECL2 are semantically identical function
-   versions.  */
-void record_function_versions (tree decl1, tree decl2);
-
-/* Remove the cgraph_function_version_info and cgraph_node for DECL.  This
-   DECL is a duplicate declaration.  */
-void delete_function_version (tree decl);
-
-/* A cgraph node set is a collection of cgraph nodes.  A cgraph node
-   can appear in multiple sets.  */
-struct cgraph_node_set_def
-{
-  struct pointer_map_t *map;
-  vec<cgraph_node_ptr> nodes;
-};
-
-class varpool_node;
-typedef varpool_node *varpool_node_ptr;
-
-
-/* A varpool node set is a collection of varpool nodes.  A varpool node
-   can appear in multiple sets.  */
-struct varpool_node_set_def
-{
-  struct pointer_map_t * map;
-  vec<varpool_node_ptr> nodes;
-};
-
-typedef struct cgraph_node_set_def *cgraph_node_set;
-
-
-typedef struct varpool_node_set_def *varpool_node_set;
-
-
-/* Iterator structure for cgraph node sets.  */
-struct cgraph_node_set_iterator
-{
-  cgraph_node_set set;
-  unsigned index;
-};
-
-/* Iterator structure for varpool node sets.  */
-struct varpool_node_set_iterator
-{
-  varpool_node_set set;
-  unsigned index;
-};
-
-#define DEFCIFCODE(code, type, string)	CIF_ ## code,
-/* Reasons for inlining failures.  */
-enum cgraph_inline_failed_t {
-#include "cif-code.def"
-  CIF_N_REASONS
-};
-
-enum cgraph_inline_failed_type_t
-{
-  CIF_FINAL_NORMAL = 0,
-  CIF_FINAL_ERROR
-};
-
-/* Structure containing additional information about an indirect call.  */
-
-struct GTY(()) cgraph_indirect_call_info
-{
-  /* When polymorphic is set, this field contains offset where the object which
-     was actually used in the polymorphic resides within a larger structure.
-     If agg_contents is set, the field contains the offset within the aggregate
-     from which the address to call was loaded.  */
-  HOST_WIDE_INT offset;
-  /* OBJ_TYPE_REF_TOKEN of a polymorphic call (if polymorphic is set).  */
-  HOST_WIDE_INT otr_token;
-  /* Type of the object from OBJ_TYPE_REF_OBJECT. */
-  tree otr_type, outer_type;
-  /* Index of the parameter that is called.  */
-  int param_index;
-  /* ECF flags determined from the caller.  */
-  int ecf_flags;
-  /* Profile_id of common target obtrained from profile.  */
-  int common_target_id;
-  /* Probability that call will land in function with COMMON_TARGET_ID.  */
-  int common_target_probability;
-
-  /* Set when the call is a virtual call with the parameter being the
-     associated object pointer rather than a simple direct call.  */
-  unsigned polymorphic : 1;
-  /* Set when the call is a call of a pointer loaded from contents of an
-     aggregate at offset.  */
-  unsigned agg_contents : 1;
-  /* Set when this is a call through a member pointer.  */
-  unsigned member_ptr : 1;
-  /* When the previous bit is set, this one determines whether the destination
-     is loaded from a parameter passed by reference. */
-  unsigned by_ref : 1;
-  unsigned int maybe_in_construction : 1;
-  unsigned int maybe_derived_type : 1;
-};
-
-struct GTY((chain_next ("%h.next_caller"), chain_prev ("%h.prev_caller"))) cgraph_edge {
-  /* Expected number of executions: calculated in profile.c.  */
-  gcov_type count;
-  struct cgraph_node *caller;
-  struct cgraph_node *callee;
-  struct cgraph_edge *prev_caller;
-  struct cgraph_edge *next_caller;
-  struct cgraph_edge *prev_callee;
-  struct cgraph_edge *next_callee;
-  gimple call_stmt;
-  /* Additional information about an indirect call.  Not cleared when an edge
-     becomes direct.  */
-  struct cgraph_indirect_call_info *indirect_info;
-  PTR GTY ((skip (""))) aux;
-  /* When equal to CIF_OK, inline this call.  Otherwise, points to the
-     explanation why function was not inlined.  */
-  enum cgraph_inline_failed_t inline_failed;
-  /* The stmt_uid of call_stmt.  This is used by LTO to recover the call_stmt
-     when the function is serialized in.  */
-  unsigned int lto_stmt_uid;
-  /* Expected frequency of executions within the function.
-     When set to CGRAPH_FREQ_BASE, the edge is expected to be called once
-     per function call.  The range is 0 to CGRAPH_FREQ_MAX.  */
-  int frequency;
-  /* Unique id of the edge.  */
-  int uid;
-  /* Whether this edge was made direct by indirect inlining.  */
-  unsigned int indirect_inlining_edge : 1;
-  /* Whether this edge describes an indirect call with an undetermined
-     callee.  */
-  unsigned int indirect_unknown_callee : 1;
-  /* Whether this edge is still a dangling  */
-  /* True if the corresponding CALL stmt cannot be inlined.  */
-  unsigned int call_stmt_cannot_inline_p : 1;
-  /* Can this call throw externally?  */
-  unsigned int can_throw_external : 1;
-  /* Edges with SPECULATIVE flag represents indirect calls that was
-     speculatively turned into direct (i.e. by profile feedback).
-     The final code sequence will have form:
-
-     if (call_target == expected_fn)
-       expected_fn ();
-     else
-       call_target ();
-
-     Every speculative call is represented by three components attached
-     to a same call statement:
-     1) a direct call (to expected_fn)
-     2) an indirect call (to call_target)
-     3) a IPA_REF_ADDR refrence to expected_fn.
-
-     Optimizers may later redirect direct call to clone, so 1) and 3)
-     do not need to necesarily agree with destination.  */
-  unsigned int speculative : 1;
-};
-
-#define CGRAPH_FREQ_BASE 1000
-#define CGRAPH_FREQ_MAX 100000
-
-typedef struct cgraph_edge *cgraph_edge_p;
-
-
-/* The varpool data structure.
-   Each static variable decl has assigned varpool_node.  */
-
-class GTY((tag ("SYMTAB_VARIABLE"))) varpool_node : public symtab_node {
-public:
-  /* Set when variable is scheduled to be assembled.  */
-  unsigned output : 1;
-
-  /* Set if the variable is dynamically initialized, except for
-     function local statics.   */
-  unsigned dynamically_initialized : 1;
-};
-
-/* Every top level asm statement is put into a asm_node.  */
-
-struct GTY(()) asm_node {
-  /* Next asm node.  */
-  struct asm_node *next;
-  /* String for this asm node.  */
-  tree asm_str;
-  /* Ordering of all cgraph nodes.  */
-  int order;
-};
-
-/* Report whether or not THIS symtab node is a function, aka cgraph_node.  */
-
-template <>
-template <>
-inline bool
-is_a_helper <cgraph_node>::test (symtab_node *p)
-{
-  return p->type == SYMTAB_FUNCTION;
-}
-
-/* Report whether or not THIS symtab node is a vriable, aka varpool_node.  */
-
-template <>
-template <>
-inline bool
-is_a_helper <varpool_node>::test (symtab_node *p)
-{
-  return p->type == SYMTAB_VARIABLE;
-}
-
-extern GTY(()) symtab_node *symtab_nodes;
-extern GTY(()) int cgraph_n_nodes;
-extern GTY(()) int cgraph_max_uid;
-extern GTY(()) int cgraph_edge_max_uid;
-extern bool cgraph_global_info_ready;
-enum cgraph_state
-{
-  /* Frontend is parsing and finalizing functions.  */
-  CGRAPH_STATE_PARSING,
-  /* Callgraph is being constructed.  It is safe to add new functions.  */
-  CGRAPH_STATE_CONSTRUCTION,
-  /* Callgraph is being at LTO time.  */
-  CGRAPH_LTO_STREAMING,
-  /* Callgraph is built and IPA passes are being run.  */
-  CGRAPH_STATE_IPA,
-  /* Callgraph is built and all functions are transformed to SSA form.  */
-  CGRAPH_STATE_IPA_SSA,
-  /* Functions are now ordered and being passed to RTL expanders.  */
-  CGRAPH_STATE_EXPANSION,
-  /* All cgraph expansion is done.  */
-  CGRAPH_STATE_FINISHED
-};
-extern enum cgraph_state cgraph_state;
-extern bool cgraph_function_flags_ready;
-extern cgraph_node_set cgraph_new_nodes;
-
-extern GTY(()) struct asm_node *asm_nodes;
-extern GTY(()) int symtab_order;
-extern bool cpp_implicit_aliases_done;
-
-/* Classifcation of symbols WRT partitioning.  */
-enum symbol_partitioning_class
-{
-   /* External declarations are ignored by partitioning algorithms and they are
-      added into the boundary later via compute_ltrans_boundary.  */
-   SYMBOL_EXTERNAL,
-   /* Partitioned symbols are pur into one of partitions.  */
-   SYMBOL_PARTITION,
-   /* Duplicated symbols (such as comdat or constant pool references) are
-      copied into every node needing them via add_symbol_to_partition.  */
-   SYMBOL_DUPLICATE
-};
-
-
-/* In symtab.c  */
-void symtab_register_node (symtab_node *);
-void symtab_unregister_node (symtab_node *);
-void symtab_remove_from_same_comdat_group (symtab_node *);
-void symtab_remove_node (symtab_node *);
-symtab_node *symtab_get_node (const_tree);
-symtab_node *symtab_node_for_asm (const_tree asmname);
-void symtab_insert_node_to_hashtable (symtab_node *);
-void symtab_add_to_same_comdat_group (symtab_node *, symtab_node *);
-void symtab_dissolve_same_comdat_group_list (symtab_node *node);
-void dump_symtab (FILE *);
-void debug_symtab (void);
-void dump_symtab_node (FILE *, symtab_node *);
-void debug_symtab_node (symtab_node *);
-void dump_symtab_base (FILE *, symtab_node *);
-void verify_symtab (void);
-void verify_symtab_node (symtab_node *);
-bool verify_symtab_base (symtab_node *);
-bool symtab_used_from_object_file_p (symtab_node *);
-void symtab_make_decl_local (tree);
-symtab_node *symtab_alias_ultimate_target (symtab_node *,
-					  enum availability *avail = NULL);
-bool symtab_resolve_alias (symtab_node *node, symtab_node *target);
-void fixup_same_cpp_alias_visibility (symtab_node *node, symtab_node *target);
-bool symtab_for_node_and_aliases (symtab_node *,
-				  bool (*) (symtab_node *, void *),
-				  void *,
-				  bool);
-symtab_node *symtab_nonoverwritable_alias (symtab_node *);
-enum availability symtab_node_availability (symtab_node *);
-bool symtab_semantically_equivalent_p (symtab_node *, symtab_node *);
-enum symbol_partitioning_class symtab_get_symbol_partitioning_class (symtab_node *);
-
-/* In cgraph.c  */
-void dump_cgraph (FILE *);
-void debug_cgraph (void);
-void dump_cgraph_node (FILE *, struct cgraph_node *);
-void debug_cgraph_node (struct cgraph_node *);
-void cgraph_remove_edge (struct cgraph_edge *);
-void cgraph_remove_node (struct cgraph_node *);
-void cgraph_release_function_body (struct cgraph_node *);
-void release_function_body (tree);
-void cgraph_node_remove_callees (struct cgraph_node *node);
-struct cgraph_edge *cgraph_create_edge (struct cgraph_node *,
-					struct cgraph_node *,
-					gimple, gcov_type, int);
-struct cgraph_edge *cgraph_create_indirect_edge (struct cgraph_node *, gimple,
-						 int, gcov_type, int);
-struct cgraph_indirect_call_info *cgraph_allocate_init_indirect_info (void);
-struct cgraph_node * cgraph_create_node (tree);
-struct cgraph_node * cgraph_create_empty_node (void);
-struct cgraph_node * cgraph_get_create_node (tree);
-struct cgraph_node * cgraph_same_body_alias (struct cgraph_node *, tree, tree);
-struct cgraph_node * cgraph_add_thunk (struct cgraph_node *, tree, tree, bool, HOST_WIDE_INT,
-				       HOST_WIDE_INT, tree, tree);
-struct cgraph_node *cgraph_node_for_asm (tree);
-struct cgraph_edge *cgraph_edge (struct cgraph_node *, gimple);
-void cgraph_set_call_stmt (struct cgraph_edge *, gimple, bool update_speculative = true);
-void cgraph_update_edges_for_call_stmt (gimple, tree, gimple);
-struct cgraph_local_info *cgraph_local_info (tree);
-struct cgraph_global_info *cgraph_global_info (tree);
-struct cgraph_rtl_info *cgraph_rtl_info (tree);
-struct cgraph_node *cgraph_create_function_alias (tree, tree);
-void cgraph_call_node_duplication_hooks (struct cgraph_node *,
-					 struct cgraph_node *);
-void cgraph_call_edge_duplication_hooks (struct cgraph_edge *,
-				         struct cgraph_edge *);
-
-void cgraph_redirect_edge_callee (struct cgraph_edge *, struct cgraph_node *);
-struct cgraph_edge *cgraph_make_edge_direct (struct cgraph_edge *, struct cgraph_node *);
-bool cgraph_only_called_directly_p (struct cgraph_node *);
-
-bool cgraph_function_possibly_inlined_p (tree);
-void cgraph_unnest_node (struct cgraph_node *);
-
-enum availability cgraph_function_body_availability (struct cgraph_node *);
-void cgraph_add_new_function (tree, bool);
-const char* cgraph_inline_failed_string (cgraph_inline_failed_t);
-cgraph_inline_failed_type_t cgraph_inline_failed_type (cgraph_inline_failed_t);
-
-void cgraph_set_nothrow_flag (struct cgraph_node *, bool);
-void cgraph_set_const_flag (struct cgraph_node *, bool, bool);
-void cgraph_set_pure_flag (struct cgraph_node *, bool, bool);
-bool cgraph_node_cannot_return (struct cgraph_node *);
-bool cgraph_edge_cannot_lead_to_return (struct cgraph_edge *);
-bool cgraph_will_be_removed_from_program_if_no_direct_calls
-  (struct cgraph_node *node);
-bool cgraph_can_remove_if_no_direct_calls_and_refs_p
-  (struct cgraph_node *node);
-bool cgraph_can_remove_if_no_direct_calls_p (struct cgraph_node *node);
-bool resolution_used_from_other_file_p (enum ld_plugin_symbol_resolution);
-bool cgraph_for_node_thunks_and_aliases (struct cgraph_node *,
-			                 bool (*) (struct cgraph_node *, void *),
-			                 void *,
-					 bool);
-bool cgraph_for_node_and_aliases (struct cgraph_node *,
-		                  bool (*) (struct cgraph_node *, void *),
-			          void *, bool);
-vec<cgraph_edge_p>  collect_callers_of_node (struct cgraph_node *node);
-void verify_cgraph (void);
-void verify_cgraph_node (struct cgraph_node *);
-void cgraph_mark_address_taken_node (struct cgraph_node *);
-
-typedef void (*cgraph_edge_hook)(struct cgraph_edge *, void *);
-typedef void (*cgraph_node_hook)(struct cgraph_node *, void *);
-typedef void (*varpool_node_hook)(varpool_node *, void *);
-typedef void (*cgraph_2edge_hook)(struct cgraph_edge *, struct cgraph_edge *,
-				  void *);
-typedef void (*cgraph_2node_hook)(struct cgraph_node *, struct cgraph_node *,
-				  void *);
-struct cgraph_edge_hook_list;
-struct cgraph_node_hook_list;
-struct varpool_node_hook_list;
-struct cgraph_2edge_hook_list;
-struct cgraph_2node_hook_list;
-struct cgraph_edge_hook_list *cgraph_add_edge_removal_hook (cgraph_edge_hook, void *);
-void cgraph_remove_edge_removal_hook (struct cgraph_edge_hook_list *);
-struct cgraph_node_hook_list *cgraph_add_node_removal_hook (cgraph_node_hook,
-							    void *);
-void cgraph_remove_node_removal_hook (struct cgraph_node_hook_list *);
-struct varpool_node_hook_list *varpool_add_node_removal_hook (varpool_node_hook,
-							      void *);
-void varpool_remove_node_removal_hook (struct varpool_node_hook_list *);
-struct cgraph_node_hook_list *cgraph_add_function_insertion_hook (cgraph_node_hook,
-							          void *);
-void cgraph_remove_function_insertion_hook (struct cgraph_node_hook_list *);
-struct varpool_node_hook_list *varpool_add_variable_insertion_hook (varpool_node_hook,
-							            void *);
-void varpool_remove_variable_insertion_hook (struct varpool_node_hook_list *);
-void cgraph_call_function_insertion_hooks (struct cgraph_node *node);
-struct cgraph_2edge_hook_list *cgraph_add_edge_duplication_hook (cgraph_2edge_hook, void *);
-void cgraph_remove_edge_duplication_hook (struct cgraph_2edge_hook_list *);
-struct cgraph_2node_hook_list *cgraph_add_node_duplication_hook (cgraph_2node_hook, void *);
-void cgraph_remove_node_duplication_hook (struct cgraph_2node_hook_list *);
-gimple cgraph_redirect_edge_call_stmt_to_callee (struct cgraph_edge *);
-struct cgraph_node * cgraph_function_node (struct cgraph_node *,
-					   enum availability *avail = NULL);
-bool cgraph_get_body (struct cgraph_node *node);
-struct cgraph_edge *
-cgraph_turn_edge_to_speculative (struct cgraph_edge *,
-				 struct cgraph_node *,
-				 gcov_type, int);
-void cgraph_speculative_call_info (struct cgraph_edge *,
-				   struct cgraph_edge *&,
-				   struct cgraph_edge *&,
-				   struct ipa_ref *&);
-extern bool gimple_check_call_matching_types (gimple, tree, bool);
-
-/* In cgraphunit.c  */
-struct asm_node *add_asm_node (tree);
-extern FILE *cgraph_dump_file;
-void cgraph_finalize_function (tree, bool);
-void finalize_compilation_unit (void);
-void compile (void);
-void init_cgraph (void);
-void cgraph_process_new_functions (void);
-void cgraph_process_same_body_aliases (void);
-void fixup_same_cpp_alias_visibility (symtab_node *, symtab_node *target, tree);
-/*  Initialize datastructures so DECL is a function in lowered gimple form.
-    IN_SSA is true if the gimple is in SSA.  */
-basic_block init_lowered_empty_function (tree, bool);
-void cgraph_reset_node (struct cgraph_node *);
-bool expand_thunk (struct cgraph_node *, bool);
-
-/* In cgraphclones.c  */
-
-struct cgraph_edge * cgraph_clone_edge (struct cgraph_edge *,
-					struct cgraph_node *, gimple,
-					unsigned, gcov_type, int, bool);
-struct cgraph_node * cgraph_clone_node (struct cgraph_node *, tree, gcov_type,
-					int, bool, vec<cgraph_edge_p>,
-					bool, struct cgraph_node *, bitmap);
-tree clone_function_name (tree decl, const char *);
-struct cgraph_node * cgraph_create_virtual_clone (struct cgraph_node *old_node,
-			                          vec<cgraph_edge_p>,
-			                          vec<ipa_replace_map_p, va_gc> *tree_map,
-			                          bitmap args_to_skip,
-						  const char *clone_name);
-struct cgraph_node *cgraph_find_replacement_node (struct cgraph_node *);
-bool cgraph_remove_node_and_inline_clones (struct cgraph_node *, struct cgraph_node *);
-void cgraph_set_call_stmt_including_clones (struct cgraph_node *, gimple, gimple,
-					    bool update_speculative = true);
-void cgraph_create_edge_including_clones (struct cgraph_node *,
-					  struct cgraph_node *,
-					  gimple, gimple, gcov_type, int,
-					  cgraph_inline_failed_t);
-void cgraph_materialize_all_clones (void);
-struct cgraph_node * cgraph_copy_node_for_versioning (struct cgraph_node *,
-		tree, vec<cgraph_edge_p>, bitmap);
-struct cgraph_node *cgraph_function_versioning (struct cgraph_node *,
-						vec<cgraph_edge_p>,
-						vec<ipa_replace_map_p, va_gc> *,
-						bitmap, bool, bitmap,
-						basic_block, const char *);
-void tree_function_versioning (tree, tree, vec<ipa_replace_map_p, va_gc> *,
-			       bool, bitmap, bool, bitmap, basic_block);
-struct cgraph_edge *cgraph_resolve_speculation (struct cgraph_edge *, tree);
-
-/* In cgraphbuild.c  */
-unsigned int rebuild_cgraph_edges (void);
-void cgraph_rebuild_references (void);
-int compute_call_stmt_bb_frequency (tree, basic_block bb);
-void record_references_in_initializer (tree, bool);
-void ipa_record_stmt_references (struct cgraph_node *, gimple);
-
-/* In ipa.c  */
-bool symtab_remove_unreachable_nodes (bool, FILE *);
-cgraph_node_set cgraph_node_set_new (void);
-cgraph_node_set_iterator cgraph_node_set_find (cgraph_node_set,
-					       struct cgraph_node *);
-void cgraph_node_set_add (cgraph_node_set, struct cgraph_node *);
-void cgraph_node_set_remove (cgraph_node_set, struct cgraph_node *);
-void dump_cgraph_node_set (FILE *, cgraph_node_set);
-void debug_cgraph_node_set (cgraph_node_set);
-void free_cgraph_node_set (cgraph_node_set);
-void cgraph_build_static_cdtor (char which, tree body, int priority);
-
-varpool_node_set varpool_node_set_new (void);
-varpool_node_set_iterator varpool_node_set_find (varpool_node_set,
-						 varpool_node *);
-void varpool_node_set_add (varpool_node_set, varpool_node *);
-void varpool_node_set_remove (varpool_node_set, varpool_node *);
-void dump_varpool_node_set (FILE *, varpool_node_set);
-void debug_varpool_node_set (varpool_node_set);
-void free_varpool_node_set (varpool_node_set);
-void ipa_discover_readonly_nonaddressable_vars (void);
-bool varpool_externally_visible_p (varpool_node *);
-
-/* In predict.c  */
-bool cgraph_maybe_hot_edge_p (struct cgraph_edge *e);
-bool cgraph_optimize_for_size_p (struct cgraph_node *);
-
-/* In varpool.c  */
-varpool_node *varpool_create_empty_node (void);
-varpool_node *varpool_node_for_decl (tree);
-varpool_node *varpool_node_for_asm (tree asmname);
-void varpool_mark_needed_node (varpool_node *);
-void debug_varpool (void);
-void dump_varpool (FILE *);
-void dump_varpool_node (FILE *, varpool_node *);
-
-void varpool_finalize_decl (tree);
-enum availability cgraph_variable_initializer_availability (varpool_node *);
-void cgraph_make_node_local (struct cgraph_node *);
-bool cgraph_node_can_be_local_p (struct cgraph_node *);
-
-
-void varpool_remove_node (varpool_node *node);
-void varpool_finalize_named_section_flags (varpool_node *node);
-bool varpool_output_variables (void);
-bool varpool_assemble_decl (varpool_node *node);
-void varpool_analyze_node (varpool_node *);
-varpool_node * varpool_extra_name_alias (tree, tree);
-varpool_node * varpool_create_variable_alias (tree, tree);
-void varpool_reset_queue (void);
-tree ctor_for_folding (tree);
-bool varpool_for_node_and_aliases (varpool_node *,
-		                   bool (*) (varpool_node *, void *),
-			           void *, bool);
-void varpool_add_new_variable (tree);
-void symtab_initialize_asm_name_hash (void);
-void symtab_prevail_in_asm_name_hash (symtab_node *node);
-void varpool_remove_initializer (varpool_node *);
-
-/* In cgraph.c */
-extern void change_decl_assembler_name (tree, tree);
-
-/* Return callgraph node for given symbol and check it is a function. */
-static inline struct cgraph_node *
-cgraph (symtab_node *node)
-{
-  gcc_checking_assert (!node || node->type == SYMTAB_FUNCTION);
-  return (struct cgraph_node *)node;
-}
-
-/* Return varpool node for given symbol and check it is a variable.  */
-static inline varpool_node *
-varpool (symtab_node *node)
-{
-  gcc_checking_assert (!node || node->type == SYMTAB_VARIABLE);
-  return (varpool_node *)node;
-}
-
-/* Return callgraph node for given symbol and check it is a function. */
-static inline struct cgraph_node *
-cgraph_get_node (const_tree decl)
-{
-  gcc_checking_assert (TREE_CODE (decl) == FUNCTION_DECL);
-  return cgraph (symtab_get_node (decl));
-}
-
-/* Return varpool node for given symbol and check it is a function. */
-static inline varpool_node *
-varpool_get_node (const_tree decl)
-{
-  gcc_checking_assert (TREE_CODE (decl) == VAR_DECL);
-  return varpool (symtab_get_node (decl));
-}
-
-/* Walk all symbols.  */
-#define FOR_EACH_SYMBOL(node) \
-   for ((node) = symtab_nodes; (node); (node) = (node)->next)
-
-
-/* Return first variable.  */
-static inline varpool_node *
-varpool_first_variable (void)
-{
-  symtab_node *node;
-  for (node = symtab_nodes; node; node = node->next)
-    if (varpool_node *vnode = dyn_cast <varpool_node> (node))
-      return vnode;
-  return NULL;
-}
-
-/* Return next variable after NODE.  */
-static inline varpool_node *
-varpool_next_variable (varpool_node *node)
-{
-  symtab_node *node1 = node->next;
-  for (; node1; node1 = node1->next)
-    if (varpool_node *vnode1 = dyn_cast <varpool_node> (node1))
-      return vnode1;
-  return NULL;
-}
-/* Walk all variables.  */
-#define FOR_EACH_VARIABLE(node) \
-   for ((node) = varpool_first_variable (); \
-        (node); \
-	(node) = varpool_next_variable ((node)))
-
-/* Return first reachable static variable with initializer.  */
-static inline varpool_node *
-varpool_first_static_initializer (void)
-{
-  symtab_node *node;
-  for (node = symtab_nodes; node; node = node->next)
-    {
-      varpool_node *vnode = dyn_cast <varpool_node> (node);
-      if (vnode && DECL_INITIAL (node->decl))
-	return vnode;
-    }
-  return NULL;
-}
-
-/* Return next reachable static variable with initializer after NODE.  */
-static inline varpool_node *
-varpool_next_static_initializer (varpool_node *node)
-{
-  symtab_node *node1 = node->next;
-  for (; node1; node1 = node1->next)
-    {
-      varpool_node *vnode1 = dyn_cast <varpool_node> (node1);
-      if (vnode1 && DECL_INITIAL (node1->decl))
-	return vnode1;
-    }
-  return NULL;
-}
-
-/* Walk all static variables with initializer set.  */
-#define FOR_EACH_STATIC_INITIALIZER(node) \
-   for ((node) = varpool_first_static_initializer (); (node); \
-        (node) = varpool_next_static_initializer (node))
-
-/* Return first reachable static variable with initializer.  */
-static inline varpool_node *
-varpool_first_defined_variable (void)
-{
-  symtab_node *node;
-  for (node = symtab_nodes; node; node = node->next)
-    {
-      varpool_node *vnode = dyn_cast <varpool_node> (node);
-      if (vnode && vnode->definition)
-	return vnode;
-    }
-  return NULL;
-}
-
-/* Return next reachable static variable with initializer after NODE.  */
-static inline varpool_node *
-varpool_next_defined_variable (varpool_node *node)
-{
-  symtab_node *node1 = node->next;
-  for (; node1; node1 = node1->next)
-    {
-      varpool_node *vnode1 = dyn_cast <varpool_node> (node1);
-      if (vnode1 && vnode1->definition)
-	return vnode1;
-    }
-  return NULL;
-}
-/* Walk all variables with definitions in current unit.  */
-#define FOR_EACH_DEFINED_VARIABLE(node) \
-   for ((node) = varpool_first_defined_variable (); (node); \
-        (node) = varpool_next_defined_variable (node))
-
-/* Return first function with body defined.  */
-static inline struct cgraph_node *
-cgraph_first_defined_function (void)
-{
-  symtab_node *node;
-  for (node = symtab_nodes; node; node = node->next)
-    {
-      cgraph_node *cn = dyn_cast <cgraph_node> (node);
-      if (cn && cn->definition)
-	return cn;
-    }
-  return NULL;
-}
-
-/* Return next function with body defined after NODE.  */
-static inline struct cgraph_node *
-cgraph_next_defined_function (struct cgraph_node *node)
-{
-  symtab_node *node1 = node->next;
-  for (; node1; node1 = node1->next)
-    {
-      cgraph_node *cn1 = dyn_cast <cgraph_node> (node1);
-      if (cn1 && cn1->definition)
-	return cn1;
-    }
-  return NULL;
-}
-
-/* Walk all functions with body defined.  */
-#define FOR_EACH_DEFINED_FUNCTION(node) \
-   for ((node) = cgraph_first_defined_function (); (node); \
-        (node) = cgraph_next_defined_function ((node)))
-
-/* Return first function.  */
-static inline struct cgraph_node *
-cgraph_first_function (void)
-{
-  symtab_node *node;
-  for (node = symtab_nodes; node; node = node->next)
-    if (cgraph_node *cn = dyn_cast <cgraph_node> (node))
-      return cn;
-  return NULL;
-}
-
-/* Return next function.  */
-static inline struct cgraph_node *
-cgraph_next_function (struct cgraph_node *node)
-{
-  symtab_node *node1 = node->next;
-  for (; node1; node1 = node1->next)
-    if (cgraph_node *cn1 = dyn_cast <cgraph_node> (node1))
-      return cn1;
-  return NULL;
-}
-/* Walk all functions.  */
-#define FOR_EACH_FUNCTION(node) \
-   for ((node) = cgraph_first_function (); (node); \
-        (node) = cgraph_next_function ((node)))
-
-/* Return true when NODE is a function with Gimple body defined
-   in current unit.  Functions can also be define externally or they
-   can be thunks with no Gimple representation.
-
-   Note that at WPA stage, the function body may not be present in memory.  */
-
-static inline bool
-cgraph_function_with_gimple_body_p (struct cgraph_node *node)
-{
-  return node->definition && !node->thunk.thunk_p && !node->alias;
-}
-
-/* Return first function with body defined.  */
-static inline struct cgraph_node *
-cgraph_first_function_with_gimple_body (void)
-{
-  symtab_node *node;
-  for (node = symtab_nodes; node; node = node->next)
-    {
-      cgraph_node *cn = dyn_cast <cgraph_node> (node);
-      if (cn && cgraph_function_with_gimple_body_p (cn))
-	return cn;
-    }
-  return NULL;
-}
-
-/* Return next reachable static variable with initializer after NODE.  */
-static inline struct cgraph_node *
-cgraph_next_function_with_gimple_body (struct cgraph_node *node)
-{
-  symtab_node *node1 = node->next;
-  for (; node1; node1 = node1->next)
-    {
-      cgraph_node *cn1 = dyn_cast <cgraph_node> (node1);
-      if (cn1 && cgraph_function_with_gimple_body_p (cn1))
-	return cn1;
-    }
-  return NULL;
-}
-
-/* Walk all functions with body defined.  */
-#define FOR_EACH_FUNCTION_WITH_GIMPLE_BODY(node) \
-   for ((node) = cgraph_first_function_with_gimple_body (); (node); \
-        (node) = cgraph_next_function_with_gimple_body (node))
-
-/* Create a new static variable of type TYPE.  */
-tree add_new_static_var (tree type);
-
-/* Return true if iterator CSI points to nothing.  */
-static inline bool
-csi_end_p (cgraph_node_set_iterator csi)
-{
-  return csi.index >= csi.set->nodes.length ();
-}
-
-/* Advance iterator CSI.  */
-static inline void
-csi_next (cgraph_node_set_iterator *csi)
-{
-  csi->index++;
-}
-
-/* Return the node pointed to by CSI.  */
-static inline struct cgraph_node *
-csi_node (cgraph_node_set_iterator csi)
-{
-  return csi.set->nodes[csi.index];
-}
-
-/* Return an iterator to the first node in SET.  */
-static inline cgraph_node_set_iterator
-csi_start (cgraph_node_set set)
-{
-  cgraph_node_set_iterator csi;
-
-  csi.set = set;
-  csi.index = 0;
-  return csi;
-}
-
-/* Return true if SET contains NODE.  */
-static inline bool
-cgraph_node_in_set_p (struct cgraph_node *node, cgraph_node_set set)
-{
-  cgraph_node_set_iterator csi;
-  csi = cgraph_node_set_find (set, node);
-  return !csi_end_p (csi);
-}
-
-/* Return number of nodes in SET.  */
-static inline size_t
-cgraph_node_set_size (cgraph_node_set set)
-{
-  return set->nodes.length ();
-}
-
-/* Return true if iterator VSI points to nothing.  */
-static inline bool
-vsi_end_p (varpool_node_set_iterator vsi)
-{
-  return vsi.index >= vsi.set->nodes.length ();
-}
-
-/* Advance iterator VSI.  */
-static inline void
-vsi_next (varpool_node_set_iterator *vsi)
-{
-  vsi->index++;
-}
-
-/* Return the node pointed to by VSI.  */
-static inline varpool_node *
-vsi_node (varpool_node_set_iterator vsi)
-{
-  return vsi.set->nodes[vsi.index];
-}
-
-/* Return an iterator to the first node in SET.  */
-static inline varpool_node_set_iterator
-vsi_start (varpool_node_set set)
-{
-  varpool_node_set_iterator vsi;
-
-  vsi.set = set;
-  vsi.index = 0;
-  return vsi;
-}
-
-/* Return true if SET contains NODE.  */
-static inline bool
-varpool_node_in_set_p (varpool_node *node, varpool_node_set set)
-{
-  varpool_node_set_iterator vsi;
-  vsi = varpool_node_set_find (set, node);
-  return !vsi_end_p (vsi);
-}
-
-/* Return number of nodes in SET.  */
-static inline size_t
-varpool_node_set_size (varpool_node_set set)
-{
-  return set->nodes.length ();
-}
-
-/* Uniquize all constants that appear in memory.
-   Each constant in memory thus far output is recorded
-   in `const_desc_table'.  */
-
-struct GTY(()) constant_descriptor_tree {
-  /* A MEM for the constant.  */
-  rtx rtl;
-
-  /* The value of the constant.  */
-  tree value;
-
-  /* Hash of value.  Computing the hash from value each time
-     hashfn is called can't work properly, as that means recursive
-     use of the hash table during hash table expansion.  */
-  hashval_t hash;
-};
-
-/* Return true if set is nonempty.  */
-static inline bool
-cgraph_node_set_nonempty_p (cgraph_node_set set)
-{
-  return !set->nodes.is_empty ();
-}
-
-/* Return true if set is nonempty.  */
-static inline bool
-varpool_node_set_nonempty_p (varpool_node_set set)
-{
-  return !set->nodes.is_empty ();
-}
-
-/* Return true when function NODE is only called directly or it has alias.
-   i.e. it is not externally visible, address was not taken and
-   it is not used in any other non-standard way.  */
-
-static inline bool
-cgraph_only_called_directly_or_aliased_p (struct cgraph_node *node)
-{
-  gcc_assert (!node->global.inlined_to);
-  return (!node->force_output && !node->address_taken
-	  && !node->used_from_other_partition
-	  && !DECL_VIRTUAL_P (node->decl)
-	  && !DECL_STATIC_CONSTRUCTOR (node->decl)
-	  && !DECL_STATIC_DESTRUCTOR (node->decl)
-	  && !node->externally_visible);
-}
-
-/* Return true when function NODE can be removed from callgraph
-   if all direct calls are eliminated.  */
-
-static inline bool
-varpool_can_remove_if_no_refs (varpool_node *node)
-{
-  if (DECL_EXTERNAL (node->decl))
-    return true;
-  return (!node->force_output && !node->used_from_other_partition
-  	  && ((DECL_COMDAT (node->decl)
-	       && !node->forced_by_abi
-	       && !symtab_used_from_object_file_p (node))
-	      || !node->externally_visible
-	      || DECL_HAS_VALUE_EXPR_P (node->decl)));
-}
-
-/* Return true when all references to VNODE must be visible in ipa_ref_list.
-   i.e. if the variable is not externally visible or not used in some magic
-   way (asm statement or such).
-   The magic uses are all summarized in force_output flag.  */
-
-static inline bool
-varpool_all_refs_explicit_p (varpool_node *vnode)
-{
-  return (vnode->definition
-	  && !vnode->externally_visible
-	  && !vnode->used_from_other_partition
-	  && !vnode->force_output);
-}
-
-/* Constant pool accessor function.  */
-htab_t constant_pool_htab (void);
-
-/* FIXME: inappropriate dependency of cgraph on IPA.  */
-#include "ipa-ref-inline.h"
-
-/* Return node that alias N is aliasing.  */
-
-static inline symtab_node *
-symtab_alias_target (symtab_node *n)
-{
-  struct ipa_ref *ref;
-  ipa_ref_list_reference_iterate (&n->ref_list, 0, ref);
-  gcc_checking_assert (ref->use == IPA_REF_ALIAS);
-  return ref->referred;
-}
-
-static inline struct cgraph_node *
-cgraph_alias_target (struct cgraph_node *n)
-{
-  return dyn_cast <cgraph_node> (symtab_alias_target (n));
-}
-
-static inline varpool_node *
-varpool_alias_target (varpool_node *n)
-{
-  return dyn_cast <varpool_node> (symtab_alias_target (n));
-}
-
-/* Given NODE, walk the alias chain to return the function NODE is alias of.
-   Do not walk through thunks.
-   When AVAILABILITY is non-NULL, get minimal availability in the chain.  */
-
-static inline struct cgraph_node *
-cgraph_function_or_thunk_node (struct cgraph_node *node,
-			       enum availability *availability = NULL)
-{
-  struct cgraph_node *n;
-
-  n = dyn_cast <cgraph_node> (symtab_alias_ultimate_target (node,
-							    availability));
-  if (!n && availability)
-    *availability = AVAIL_NOT_AVAILABLE;
-  return n;
-}
-/* Given NODE, walk the alias chain to return the function NODE is alias of.
-   Do not walk through thunks.
-   When AVAILABILITY is non-NULL, get minimal availability in the chain.  */
-
-static inline varpool_node *
-varpool_variable_node (varpool_node *node,
-		       enum availability *availability = NULL)
-{
-  varpool_node *n;
-
-  if (node)
-    n = dyn_cast <varpool_node> (symtab_alias_ultimate_target (node,
-							       availability));
-  else
-    n = NULL;
-
-  if (!n && availability)
-    *availability = AVAIL_NOT_AVAILABLE;
-  return n;
-}
-
-/* Return true when the edge E represents a direct recursion.  */
-static inline bool
-cgraph_edge_recursive_p (struct cgraph_edge *e)
-{
-  struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL);
-  if (e->caller->global.inlined_to)
-    return e->caller->global.inlined_to->decl == callee->decl;
-  else
-    return e->caller->decl == callee->decl;
-}
-
-/* Return true if the TM_CLONE bit is set for a given FNDECL.  */
-static inline bool
-decl_is_tm_clone (const_tree fndecl)
-{
-  struct cgraph_node *n = cgraph_get_node (fndecl);
-  if (n)
-    return n->tm_clone;
-  return false;
-}
-
-/* Likewise indicate that a node is needed, i.e. reachable via some
-   external means.  */
-
-static inline void
-cgraph_mark_force_output_node (struct cgraph_node *node)
-{
-  node->force_output = 1;
-  gcc_checking_assert (!node->global.inlined_to);
-}
-
-/* Return true when the symbol is real symbol, i.e. it is not inline clone
-   or abstract function kept for debug info purposes only.  */
-
-static inline bool
-symtab_real_symbol_p (symtab_node *node)
-{
-  struct cgraph_node *cnode;
-
-  if (DECL_ABSTRACT (node->decl))
-    return false;
-  if (!is_a <cgraph_node> (node))
-    return true;
-  cnode = cgraph (node);
-  if (cnode->global.inlined_to)
-    return false;
-  return true;
-}
-
-/* Return true if NODE can be discarded by linker from the binary.  */
-
-static inline bool
-symtab_can_be_discarded (symtab_node *node)
-{
-  return (DECL_EXTERNAL (node->decl)
-	  || (DECL_ONE_ONLY (node->decl)
-	      && node->resolution != LDPR_PREVAILING_DEF
-	      && node->resolution != LDPR_PREVAILING_DEF_IRONLY
-	      && node->resolution != LDPR_PREVAILING_DEF_IRONLY_EXP));
-}
-
-/* Return true if NODE is local to a particular COMDAT group, and must not
-   be named from outside the COMDAT.  This is used for C++ decloned
-   constructors.  */
-
-static inline bool
-symtab_comdat_local_p (symtab_node *node)
-{
-  return (node->same_comdat_group && !TREE_PUBLIC (node->decl));
-}
-
-/* Return true if ONE and TWO are part of the same COMDAT group.  */
-
-static inline bool
-symtab_in_same_comdat_p (symtab_node *one, symtab_node *two)
-{
-  return DECL_COMDAT_GROUP (one->decl) == DECL_COMDAT_GROUP (two->decl);
-}
-#endif  /* GCC_CGRAPH_H  */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cif-code.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cif-code.def
deleted file mode 100644
index ce64d96..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cif-code.def
+++ /dev/null
@@ -1,133 +0,0 @@
-/* This file contains the definitions of the cgraph_inline_failed_t
-   enums used in GCC.
-
-   Copyright (C) 2008-2014 Free Software Foundation, Inc.
-   Contributed by Doug Kwan <dougkwan@google.com>
-
-This file is part of GCC.
-
-GCC is free software you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* The format of this file is
-   DEFCIFCODE(code, string).
-
-   Where symbol is the enumeration name without the ``''.
-   The argument STRING is a explain the failure.  Except for OK,
-   which is a NULL pointer.  */
-
-/* Inlining successful.  This must be the first code.  */
-DEFCIFCODE(OK, CIF_FINAL_NORMAL, NULL)
-
-/* Inlining failed for an unspecified reason.  */
-DEFCIFCODE(UNSPECIFIED, CIF_FINAL_ERROR, "")
-
-/* Function has not be considered for inlining.  This is the code for
-   functions that have not been rejected for inlining yet.  */
-DEFCIFCODE(FUNCTION_NOT_CONSIDERED, CIF_FINAL_NORMAL,
-	   N_("function not considered for inlining"))
-
-/* Caller is compiled with optimizations disabled.  */
-DEFCIFCODE(FUNCTION_NOT_OPTIMIZED, CIF_FINAL_NORMAL,
-	   N_("caller is not optimized"))
-
-/* Inlining failed owing to unavailable function body.  */
-DEFCIFCODE(BODY_NOT_AVAILABLE, CIF_FINAL_ERROR,
-	   N_("function body not available"))
-
-/* Extern inline function that has been redefined.  */
-DEFCIFCODE(REDEFINED_EXTERN_INLINE, CIF_FINAL_NORMAL,
-	   N_("redefined extern inline functions are not considered for "
-	      "inlining"))
-
-/* Function is not inlinable.  */
-DEFCIFCODE(FUNCTION_NOT_INLINABLE, CIF_FINAL_ERROR,
-	   N_("function not inlinable"))
-
-/* Function is overwritable.  */
-DEFCIFCODE(OVERWRITABLE, CIF_FINAL_ERROR,
-	   N_("function body can be overwritten at link time"))
-
-/* Function is not an inlining candidate.  */
-DEFCIFCODE(FUNCTION_NOT_INLINE_CANDIDATE, CIF_FINAL_NORMAL,
-	   N_("function not inline candidate"))
-
-/* Inlining failed because of various limit parameters.  */
-DEFCIFCODE(LARGE_FUNCTION_GROWTH_LIMIT, CIF_FINAL_NORMAL,
-	   N_("--param large-function-growth limit reached"))
-DEFCIFCODE(LARGE_STACK_FRAME_GROWTH_LIMIT, CIF_FINAL_NORMAL,
-	   N_("--param large-stack-frame-growth limit reached"))
-DEFCIFCODE(MAX_INLINE_INSNS_SINGLE_LIMIT, CIF_FINAL_NORMAL,
-	   N_("--param max-inline-insns-single limit reached"))
-DEFCIFCODE(MAX_INLINE_INSNS_AUTO_LIMIT, CIF_FINAL_NORMAL,
-	   N_("--param max-inline-insns-auto limit reached"))
-DEFCIFCODE(INLINE_UNIT_GROWTH_LIMIT, CIF_FINAL_NORMAL,
-	   N_("--param inline-unit-growth limit reached"))
-
-/* Recursive inlining.  */
-DEFCIFCODE(RECURSIVE_INLINING, CIF_FINAL_NORMAL,
-	   N_("recursive inlining"))
-
-/* Call is unlikely.  */
-DEFCIFCODE(UNLIKELY_CALL, CIF_FINAL_NORMAL,
-	   N_("call is unlikely and code size would grow"))
-
-/* Function is not declared as inline.  */
-DEFCIFCODE(NOT_DECLARED_INLINED, CIF_FINAL_NORMAL,
-	   N_("function not declared inline and code size would grow"))
-
-/* Inlining suppressed due to size optimization.  */
-DEFCIFCODE(OPTIMIZING_FOR_SIZE, CIF_FINAL_NORMAL,
-	   N_("optimizing for size and code size would grow"))
-
-/* Caller and callee disagree on the arguments.  */
-DEFCIFCODE(MISMATCHED_ARGUMENTS, CIF_FINAL_ERROR,
-	   N_("mismatched arguments"))
-
-/* Call was originally indirect.  */
-DEFCIFCODE(ORIGINALLY_INDIRECT_CALL, CIF_FINAL_NORMAL,
-	   N_("originally indirect function call not considered for inlining"))
-
-/* Ths edge represents an indirect edge with a yet-undetermined callee .  */
-DEFCIFCODE(INDIRECT_UNKNOWN_CALL, CIF_FINAL_NORMAL,
-	   N_("indirect function call with a yet undetermined callee"))
-
-/* We can't inline different EH personalities together.  */
-DEFCIFCODE(EH_PERSONALITY, CIF_FINAL_ERROR,
-	   N_("exception handling personality mismatch"))
-
-/* We can't inline if the callee can throw non-call exceptions but the
-   caller cannot.  */
-DEFCIFCODE(NON_CALL_EXCEPTIONS, CIF_FINAL_ERROR,
-	   N_("non-call exception handling mismatch"))
-
-/* We can't inline because of mismatched target specific options.  */
-DEFCIFCODE(TARGET_OPTION_MISMATCH, CIF_FINAL_ERROR,
-	   N_("target specific option mismatch"))
-
-/* We can't inline because of mismatched optimization levels.  */
-DEFCIFCODE(OPTIMIZATION_MISMATCH, CIF_FINAL_ERROR,
-	   N_("optimization level attribute mismatch"))
-
-/* We can't inline because the callee refers to comdat-local symbols.  */
-DEFCIFCODE(USES_COMDAT_LOCAL, CIF_FINAL_NORMAL,
-	   N_("callee refers to comdat-local symbols"))
-
-/* We can't inline because of mismatched caller/callee attributes.  */
-DEFCIFCODE(ATTRIBUTE_MISMATCH, CIF_FINAL_NORMAL,
-	   N_("function attribute mismatch"))
-
-/* We proved that the call is unreachable.  */
-DEFCIFCODE(UNREACHABLE, CIF_FINAL_NORMAL,
-	   N_("unreachable"))
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cilk-builtins.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cilk-builtins.def
deleted file mode 100644
index 9f3240a..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cilk-builtins.def
+++ /dev/null
@@ -1,33 +0,0 @@
-/* This file contains the definitions and documentation for the
-   Cilk Plus builtins used in the GNU compiler.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-   Contributed by Balaji V. Iyer <balaji.v.iyer@intel.com>
-   	          Intel Corporation.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-DEF_CILK_BUILTIN_STUB (BUILT_IN_CILK_ENTER_FRAME, "__cilkrts_enter_frame_1")
-DEF_CILK_BUILTIN_STUB (BUILT_IN_CILK_ENTER_FRAME_FAST, 
-		       "__cilkrts_enter_frame_fast_1")
-DEF_CILK_BUILTIN_STUB (BUILT_IN_CILK_DETACH, "__cilkrts_detach")
-DEF_CILK_BUILTIN_STUB (BUILT_IN_CILK_RETHROW, "__cilkrts_rethrow")
-DEF_CILK_BUILTIN_STUB (BUILT_IN_CILK_SYNCHED, "__cilkrts_synched")
-DEF_CILK_BUILTIN_STUB (BUILT_IN_CILK_SYNC, "__cilkrts_sync")
-DEF_CILK_BUILTIN_STUB (BUILT_IN_CILK_LEAVE_FRAME, "__cilkrts_leave_frame")
-DEF_CILK_BUILTIN_STUB (BUILT_IN_CILK_POP_FRAME, "__cilkrts_pop_frame")
-DEF_CILK_BUILTIN_STUB (BUILT_IN_CILK_SAVE_FP, "__cilkrts_save_fp_ctrl_state")
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cilkplus.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cilkplus.def
deleted file mode 100644
index ddf93f2..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cilkplus.def
+++ /dev/null
@@ -1,59 +0,0 @@
-/* This file contains the definitions and documentation for the
-   CilkPlus builtins used in the GNU compiler.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* Before including this file, you should define a macro:
-
-     DEF_CILKPLUS_BUILTIN (ENUM, NAME, TYPE, ATTRS)
-
-   See builtins.def for details.  */
-
-DEF_CILKPLUS_BUILTIN (BUILT_IN_CILKPLUS_SEC_REDUCE_ADD,
-		      "__sec_reduce_add", BT_FN_INT_PTR, ATTR_NULL)
-DEF_CILKPLUS_BUILTIN (BUILT_IN_CILKPLUS_SEC_REDUCE_MUL,
-		      "__sec_reduce_mul", BT_FN_INT_PTR, ATTR_NULL)
-DEF_CILKPLUS_BUILTIN (BUILT_IN_CILKPLUS_SEC_REDUCE_ALL_ZERO,
-		      "__sec_reduce_all_zero", BT_FN_INT_PTR, ATTR_NULL)
-DEF_CILKPLUS_BUILTIN (BUILT_IN_CILKPLUS_SEC_REDUCE_ANY_ZERO,
-		      "__sec_reduce_any_zero", BT_FN_INT_PTR, ATTR_NULL)
-DEF_CILKPLUS_BUILTIN (BUILT_IN_CILKPLUS_SEC_REDUCE_MAX,
-		      "__sec_reduce_max", BT_FN_INT_PTR, ATTR_NULL)
-DEF_CILKPLUS_BUILTIN (BUILT_IN_CILKPLUS_SEC_REDUCE_MIN,
-		      "__sec_reduce_min", BT_FN_INT_PTR, ATTR_NULL)
-DEF_CILKPLUS_BUILTIN (BUILT_IN_CILKPLUS_SEC_REDUCE_MIN_IND,
-		      "__sec_reduce_min_ind", BT_FN_INT_PTR, ATTR_NULL)
-DEF_CILKPLUS_BUILTIN (BUILT_IN_CILKPLUS_SEC_REDUCE_MAX_IND,
-		      "__sec_reduce_max_ind", BT_FN_INT_PTR, ATTR_NULL)
-DEF_CILKPLUS_BUILTIN (BUILT_IN_CILKPLUS_SEC_REDUCE_ANY_NONZERO,
-		      "__sec_reduce_any_nonzero", BT_FN_INT_PTR, ATTR_NULL)
-DEF_CILKPLUS_BUILTIN (BUILT_IN_CILKPLUS_SEC_REDUCE_ALL_NONZERO,
-		      "__sec_reduce_all_nonzero", BT_FN_INT_PTR, ATTR_NULL)
-DEF_CILKPLUS_BUILTIN (BUILT_IN_CILKPLUS_SEC_REDUCE,
-		      "__sec_reduce", BT_FN_INT_PTR_PTR_PTR, ATTR_NULL)
-DEF_CILKPLUS_BUILTIN (BUILT_IN_CILKPLUS_SEC_REDUCE_MUTATING,
-		      "__sec_reduce_mutating", BT_FN_INT_PTR_PTR_PTR, ATTR_NULL)
-// FIXME: This probably needs to be rewritten as a keyword.
-DEF_CILKPLUS_BUILTIN (BUILT_IN_CILKPLUS_SEC_IMPLICIT_INDEX,
-		      "__sec_implicit_index", BT_FN_INT_INT, ATTR_NULL)
-
-/*
-Local variables:
-mode:c
-End:
-*/
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config.h
deleted file mode 100644
index aa6dd6b..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef GCC_CONFIG_H
-#define GCC_CONFIG_H
-#ifdef GENERATOR_FILE
-#error config.h is for the host, not build, machine.
-#endif
-#include "auto-host.h"
-#ifdef IN_GCC
-# include "ansidecl.h"
-#endif
-#endif /* GCC_CONFIG_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/aarch-common-protos.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/aarch-common-protos.h
deleted file mode 100644
index 3e6e242..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/aarch-common-protos.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/* Functions and structures shared between arm and aarch64.
-
-   Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   Contributed by ARM Ltd.
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3, or (at your
-   option) any later version.
-
-   GCC 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 General Public
-   License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with GCC; see the file COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-
-#ifndef GCC_AARCH_COMMON_PROTOS_H
-#define GCC_AARCH_COMMON_PROTOS_H
-
-extern int aarch_crypto_can_dual_issue (rtx, rtx);
-extern int arm_early_load_addr_dep (rtx, rtx);
-extern int arm_early_store_addr_dep (rtx, rtx);
-extern int arm_mac_accumulator_is_mul_result (rtx, rtx);
-extern int arm_mac_accumulator_is_result (rtx, rtx);
-extern int arm_no_early_alu_shift_dep (rtx, rtx);
-extern int arm_no_early_alu_shift_value_dep (rtx, rtx);
-extern int arm_no_early_mul_dep (rtx, rtx);
-extern int arm_no_early_store_addr_dep (rtx, rtx);
-extern bool arm_rtx_shift_left_p (rtx);
-
-/* RTX cost table definitions.  These are used when tuning for speed rather
-   than for size and should reflect the _additional_ cost over the cost
-   of the fastest instruction in the machine, which is COSTS_N_INSNS (1).
-   Therefore it's okay for some costs to be 0.
-   Costs may not have a negative value.  */
-struct alu_cost_table
-{
-  const int arith;		/* ADD/SUB.  */
-  const int logical;		/* AND/ORR/EOR/BIC, etc.  */
-  const int shift;		/* Simple shift.  */
-  const int shift_reg;		/* Simple shift by reg.  */
-  const int arith_shift;	/* Additional when arith also shifts...  */
-  const int arith_shift_reg;	/* ... and when the shift is by a reg.  */
-  const int log_shift;		/* Additional when logic also shifts...  */
-  const int log_shift_reg;	/* ... and when the shift is by a reg.  */
-  const int extend;		/* Zero/sign extension.  */
-  const int extend_arith;	/* Extend and arith.  */
-  const int bfi;		/* Bit-field insert.  */
-  const int bfx;		/* Bit-field extraction.  */
-  const int clz;		/* Count Leading Zeros.  */
-  const int non_exec;		/* Extra cost when not executing insn.  */
-  const bool non_exec_costs_exec; /* True if non-execution must add the exec
-				     cost.  */
-};
-
-struct mult_cost_table
-{
-  const int simple;
-  const int flag_setting;	/* Additional cost if multiply sets flags. */
-  const int extend;
-  const int add;
-  const int extend_add;
-  const int idiv;
-};
-
-/* Calculations of LDM costs are complex.  We assume an initial cost
-   (ldm_1st) which will load the number of registers mentioned in
-   ldm_regs_per_insn_1st registers; then each additional
-   ldm_regs_per_insn_subsequent registers cost one more insn.
-   Similarly for STM operations.
-   Therefore the ldm_regs_per_insn_1st/stm_regs_per_insn_1st and
-   ldm_regs_per_insn_subsequent/stm_regs_per_insn_subsequent fields indicate
-   the number of registers loaded/stored and are expressed by a simple integer
-   and not by a COSTS_N_INSNS (N) expression.
-   */
-struct mem_cost_table
-{
-  const int load;
-  const int load_sign_extend;	/* Additional to load cost.  */
-  const int ldrd;		/* Cost of LDRD.  */
-  const int ldm_1st;
-  const int ldm_regs_per_insn_1st;
-  const int ldm_regs_per_insn_subsequent;
-  const int loadf;		/* SFmode.  */
-  const int loadd;		/* DFmode.  */
-  const int load_unaligned;	/* Extra for unaligned loads.  */
-  const int store;
-  const int strd;
-  const int stm_1st;
-  const int stm_regs_per_insn_1st;
-  const int stm_regs_per_insn_subsequent;
-  const int storef;		/* SFmode.  */
-  const int stored;		/* DFmode.  */
-  const int store_unaligned;	/* Extra for unaligned stores.  */
-};
-
-struct fp_cost_table
-{
-  const int div;
-  const int mult;
-  const int mult_addsub;	/* Non-fused.  */
-  const int fma;		/* Fused.  */
-  const int addsub;
-  const int fpconst;		/* Immediate.  */
-  const int neg;		/* NEG and ABS.  */
-  const int compare;
-  const int widen;		/* Widen to this size.  */
-  const int narrow;		/* Narrow from this size.  */
-  const int toint;
-  const int fromint;
-  const int roundint;		/* V8 round to integral, remains FP format.  */
-};
-
-struct vector_cost_table
-{
-  const int alu;
-};
-
-struct cpu_cost_table
-{
-  const struct alu_cost_table alu;
-  const struct mult_cost_table mult[2]; /* SImode and DImode.  */
-  const struct mem_cost_table ldst;
-  const struct fp_cost_table fp[2]; /* SFmode and DFmode.  */
-  const struct vector_cost_table vect;
-};
-
-
-#endif /* GCC_AARCH_COMMON_PROTOS_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/aout.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/aout.h
deleted file mode 100644
index c8f4e45..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/aout.h
+++ /dev/null
@@ -1,308 +0,0 @@
-/* Definitions of target machine for GNU compiler, for ARM with a.out
-   Copyright (C) 1995-2014 Free Software Foundation, Inc.
-   Contributed by Richard Earnshaw (rearnsha@armltd.co.uk).
-   
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3, or (at your
-   option) any later version.
-
-   GCC 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 General Public
-   License for more details.
-
-   Under Section 7 of GPL version 3, you are granted additional
-   permissions described in the GCC Runtime Library Exception, version
-   3.1, as published by the Free Software Foundation.
-
-   You should have received a copy of the GNU General Public License and
-   a copy of the GCC Runtime Library Exception along with this program;
-   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef ASM_APP_ON
-#define ASM_APP_ON  		""
-#endif
-#ifndef ASM_APP_OFF
-#define ASM_APP_OFF  		""
-#endif
-
-/* Switch to the text or data segment.  */
-#define TEXT_SECTION_ASM_OP  	"\t.text"
-#define DATA_SECTION_ASM_OP  	"\t.data"
-#define BSS_SECTION_ASM_OP   	"\t.bss"
-
-/* Note: If USER_LABEL_PREFIX or LOCAL_LABEL_PREFIX are changed,
-   make sure that this change is reflected in the function
-   coff_arm_is_local_label_name() in bfd/coff-arm.c.  */
-#ifndef REGISTER_PREFIX
-#define REGISTER_PREFIX 	""
-#endif
-
-#ifndef USER_LABEL_PREFIX
-#define USER_LABEL_PREFIX 	"_"
-#endif
-
-#ifndef LOCAL_LABEL_PREFIX
-#define LOCAL_LABEL_PREFIX 	""
-#endif
-
-/* The assembler's names for the registers.  Note that the ?xx registers are
-   there so that VFPv3/NEON registers D16-D31 have the same spacing as D0-D15
-   (each of which is overlaid on two S registers), although there are no
-   actual single-precision registers which correspond to D16-D31.  */
-#ifndef REGISTER_NAMES
-#define REGISTER_NAMES						\
-{								\
-  "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",		\
-  "r8", "r9", "r10", "fp", "ip", "sp", "lr", "pc",		\
-  "s0",  "s1",  "s2",  "s3",  "s4",  "s5",  "s6",  "s7",	\
-  "s8",  "s9",  "s10", "s11", "s12", "s13", "s14", "s15",	\
-  "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",	\
-  "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",	\
-  "d16", "?16", "d17", "?17", "d18", "?18", "d19", "?19",	\
-  "d20", "?20", "d21", "?21", "d22", "?22", "d23", "?23",	\
-  "d24", "?24", "d25", "?25", "d26", "?26", "d27", "?27",	\
-  "d28", "?28", "d29", "?29", "d30", "?30", "d31", "?31",	\
-  "wr0",   "wr1",   "wr2",   "wr3",				\
-  "wr4",   "wr5",   "wr6",   "wr7",				\
-  "wr8",   "wr9",   "wr10",  "wr11",				\
-  "wr12",  "wr13",  "wr14",  "wr15",				\
-  "wcgr0", "wcgr1", "wcgr2", "wcgr3",				\
-  "cc", "vfpcc", "sfp", "afp"					\
-}
-#endif
-
-#ifndef ADDITIONAL_REGISTER_NAMES
-#define ADDITIONAL_REGISTER_NAMES		\
-{						\
-  {"a1", 0},					\
-  {"a2", 1},					\
-  {"a3", 2},					\
-  {"a4", 3},					\
-  {"v1", 4},					\
-  {"v2", 5},					\
-  {"v3", 6},					\
-  {"v4", 7},					\
-  {"v5", 8},					\
-  {"v6", 9},					\
-  {"rfp", 9}, /* Historical.  */		\
-  {"sb", 9}, /* Historical.  */			\
-  {"v7", 10},					\
-  {"sl", 10},	/* Historical.  */		\
-  {"r11", 11},	/* fp */			\
-  {"r12", 12},	/* ip */			\
-  {"r13", 13},	/* sp */			\
-  {"r14", 14},	/* lr */			\
-  {"r15", 15}	/* pc */			\
-}
-#endif
-
-#ifndef OVERLAPPING_REGISTER_NAMES
-#define OVERLAPPING_REGISTER_NAMES		\
-{						\
-  {"d0",  FIRST_VFP_REGNUM + 0,  2},		\
-  {"d1",  FIRST_VFP_REGNUM + 2,  2},		\
-  {"d2",  FIRST_VFP_REGNUM + 4,  2},		\
-  {"d3",  FIRST_VFP_REGNUM + 6,  2},		\
-  {"d4",  FIRST_VFP_REGNUM + 8,  2},		\
-  {"d5",  FIRST_VFP_REGNUM + 10, 2},		\
-  {"d6",  FIRST_VFP_REGNUM + 12, 2},		\
-  {"d7",  FIRST_VFP_REGNUM + 14, 2},		\
-  {"d8",  FIRST_VFP_REGNUM + 16, 2},		\
-  {"d9",  FIRST_VFP_REGNUM + 18, 2},		\
-  {"d10", FIRST_VFP_REGNUM + 20, 2},		\
-  {"d11", FIRST_VFP_REGNUM + 22, 2},		\
-  {"d12", FIRST_VFP_REGNUM + 24, 2},		\
-  {"d13", FIRST_VFP_REGNUM + 26, 2},		\
-  {"d14", FIRST_VFP_REGNUM + 28, 2},		\
-  {"d15", FIRST_VFP_REGNUM + 30, 2},		\
-  {"q0",  FIRST_VFP_REGNUM + 0,  4},		\
-  {"q1",  FIRST_VFP_REGNUM + 4,  4},		\
-  {"q2",  FIRST_VFP_REGNUM + 8,  4},		\
-  {"q3",  FIRST_VFP_REGNUM + 12, 4},		\
-  {"q4",  FIRST_VFP_REGNUM + 16, 4},		\
-  {"q5",  FIRST_VFP_REGNUM + 20, 4},		\
-  {"q6",  FIRST_VFP_REGNUM + 24, 4},		\
-  {"q7",  FIRST_VFP_REGNUM + 28, 4},		\
-  {"q8",  FIRST_VFP_REGNUM + 32, 4},		\
-  {"q9",  FIRST_VFP_REGNUM + 36, 4},		\
-  {"q10", FIRST_VFP_REGNUM + 40, 4},		\
-  {"q11", FIRST_VFP_REGNUM + 44, 4},		\
-  {"q12", FIRST_VFP_REGNUM + 48, 4},		\
-  {"q13", FIRST_VFP_REGNUM + 52, 4},		\
-  {"q14", FIRST_VFP_REGNUM + 56, 4},		\
-  {"q15", FIRST_VFP_REGNUM + 60, 4}		\
-}
-#endif
-
-#ifndef NO_DOLLAR_IN_LABEL
-#define NO_DOLLAR_IN_LABEL 1
-#endif
-
-/* Generate DBX debugging information.  riscix.h will undefine this because
-   the native assembler does not support stabs.  */
-#define DBX_DEBUGGING_INFO 1
-
-/* Acorn dbx moans about continuation chars, so don't use any.  */
-#ifndef DBX_CONTIN_LENGTH
-#define DBX_CONTIN_LENGTH  0
-#endif
-
-/* Output a function label definition.  */
-#ifndef ASM_DECLARE_FUNCTION_NAME
-#define ASM_DECLARE_FUNCTION_NAME(STREAM, NAME, DECL)	\
-  do							\
-    {							\
-      ARM_DECLARE_FUNCTION_NAME (STREAM, NAME, DECL);   \
-      ASM_OUTPUT_LABEL (STREAM, NAME);			\
-    }							\
-  while (0)
-#endif
-
-/* Globalizing directive for a label.  */
-#define GLOBAL_ASM_OP "\t.global\t"
-
-/* Make an internal label into a string.  */
-#ifndef ASM_GENERATE_INTERNAL_LABEL
-#define ASM_GENERATE_INTERNAL_LABEL(STRING, PREFIX, NUM)  \
-  sprintf (STRING, "*%s%s%u", LOCAL_LABEL_PREFIX, PREFIX, (unsigned int)(NUM))
-#endif
-     
-/* Output an element of a dispatch table.  */
-#define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE)			\
-  do								\
-    {								\
-      gcc_assert (!TARGET_THUMB2);				\
-      asm_fprintf (STREAM, "\t.word\t%LL%d\n", VALUE);		\
-    }								\
-  while (0)
-	  
-
-/* Thumb-2 always uses addr_diff_elf so that the Table Branch instructions
-   can be used.  For non-pic code where the offsets do not suitable for
-   TBB/TBH the elements are output as absolute labels.  */
-#define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM, BODY, VALUE, REL)		\
-  do									\
-    {									\
-      if (TARGET_ARM)							\
-	asm_fprintf (STREAM, "\tb\t%LL%d\n", VALUE);			\
-      else if (TARGET_THUMB1)						\
-	{								\
-	  if (flag_pic || optimize_size)				\
-	    {								\
-	      switch (GET_MODE(body))					\
-		{							\
-		case QImode:						\
-		  asm_fprintf (STREAM, "\t.byte\t(%LL%d-%LL%d)/2\n",	\
-			       VALUE, REL);				\
-		  break;						\
-		case HImode: /* TBH */					\
-		  asm_fprintf (STREAM, "\t.2byte\t(%LL%d-%LL%d)/2\n",	\
-			       VALUE, REL);				\
-		  break;						\
-		case SImode:						\
-		  asm_fprintf (STREAM, "\t.word\t%LL%d-%LL%d\n",	\
-			       VALUE, REL);				\
-		  break;						\
-		default:						\
-		  gcc_unreachable();					\
-		}							\
-	    }								\
-	  else								\
-	    asm_fprintf (STREAM, "\t.word\t%LL%d+1\n", VALUE);		\
-	}								\
-      else /* Thumb-2 */						\
-	{								\
-	  switch (GET_MODE(body))					\
-	    {								\
-	    case QImode: /* TBB */					\
-	      asm_fprintf (STREAM, "\t.byte\t(%LL%d-%LL%d)/2\n",	\
-			   VALUE, REL);					\
-	      break;							\
-	    case HImode: /* TBH */					\
-	      asm_fprintf (STREAM, "\t.2byte\t(%LL%d-%LL%d)/2\n",	\
-			   VALUE, REL);					\
-	      break;							\
-	    case SImode:						\
-	      if (flag_pic)						\
-		asm_fprintf (STREAM, "\t.word\t%LL%d+1-%LL%d\n", VALUE, REL); \
-	      else							\
-		asm_fprintf (STREAM, "\t.word\t%LL%d+1\n", VALUE);	\
-	      break;							\
-	    default:							\
-	      gcc_unreachable();					\
-	    }								\
-	}								\
-    }									\
-  while (0)
-
-
-#undef  ASM_OUTPUT_ASCII
-#define ASM_OUTPUT_ASCII(STREAM, PTR, LEN)  \
-  output_ascii_pseudo_op (STREAM, (const unsigned char *) (PTR), LEN)
-
-/* Output a gap.  In fact we fill it with nulls.  */
-#undef  ASM_OUTPUT_SKIP
-#define ASM_OUTPUT_SKIP(STREAM, NBYTES) 	\
-  fprintf (STREAM, "\t.space\t%d\n", (int) (NBYTES))
-
-/* Align output to a power of two.  Horrible /bin/as.  */
-#ifndef ASM_OUTPUT_ALIGN  
-#define ASM_OUTPUT_ALIGN(STREAM, POWER)			\
-  do							\
-    {							\
-      register int amount = 1 << (POWER);		\
-							\
-      if (amount == 2)					\
-	fprintf (STREAM, "\t.even\n");			\
-      else if (amount != 1)				\
-	fprintf (STREAM, "\t.align\t%d\n", amount - 4);	\
-    }							\
-  while (0)
-#endif
-
-/* Output a common block.  */
-#ifndef ASM_OUTPUT_COMMON
-#define ASM_OUTPUT_COMMON(STREAM, NAME, SIZE, ROUNDED)	\
-  do							\
-    {							\
-      fprintf (STREAM, "\t.comm\t");			\
-      assemble_name (STREAM, NAME);			\
-      asm_fprintf (STREAM, ", %d\t%@ %d\n", 		\
-	           (int)(ROUNDED), (int)(SIZE));	\
-    }							\
-  while (0)
-#endif
-     
-/* Output a local common block.  /bin/as can't do this, so hack a
-   `.space' into the bss segment.  Note that this is *bad* practice,
-   which is guaranteed NOT to work since it doesn't define STATIC
-   COMMON space but merely STATIC BSS space.  */
-#ifndef ASM_OUTPUT_ALIGNED_LOCAL
-#define ASM_OUTPUT_ALIGNED_LOCAL(STREAM, NAME, SIZE, ALIGN)		\
-  do									\
-    {									\
-      switch_to_section (bss_section);					\
-      ASM_OUTPUT_ALIGN (STREAM, floor_log2 (ALIGN / BITS_PER_UNIT));	\
-      ASM_OUTPUT_LABEL (STREAM, NAME);					\
-      fprintf (STREAM, "\t.space\t%d\n", (int)(SIZE));			\
-    }									\
-  while (0)
-#endif
-     
-/* Output a zero-initialized block.  */
-#ifndef ASM_OUTPUT_ALIGNED_BSS
-#define ASM_OUTPUT_ALIGNED_BSS(STREAM, DECL, NAME, SIZE, ALIGN) \
-  asm_output_aligned_bss (STREAM, DECL, NAME, SIZE, ALIGN)
-#endif
-
-#ifndef ASM_COMMENT_START
-#define ASM_COMMENT_START 	"@"
-#endif
-
-/* This works for GAS and some other assemblers.  */
-#define SET_ASM_OP		"\t.set\t"
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/arm-cores.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/arm-cores.def
deleted file mode 100644
index 56041ec..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/arm-cores.def
+++ /dev/null
@@ -1,164 +0,0 @@
-/* ARM CPU Cores
-   Copyright (C) 2003-2014 Free Software Foundation, Inc.
-   Written by CodeSourcery, LLC
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
-
-   GCC 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
-   General Public License for more details.
-
-   Under Section 7 of GPL version 3, you are granted additional
-   permissions described in the GCC Runtime Library Exception, version
-   3.1, as published by the Free Software Foundation.
-
-   You should have received a copy of the GNU General Public License and
-   a copy of the GCC Runtime Library Exception along with this program;
-   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* Before using #include to read this file, define a macro:
-
-      ARM_CORE(CORE_NAME, INTERNAL_IDENT, TUNE_IDENT, ARCH, FLAGS, COSTS)
-
-   The CORE_NAME is the name of the core, represented as a string constant.
-   The INTERNAL_IDENT is the name of the core represented as an identifier.
-   This must be unique for each entry in this table.
-   The TUNE_IDENT is the name of the core for which scheduling decisions
-   should be made, represented as an identifier.
-   ARCH is the architecture revision implemented by the chip.
-   FLAGS are the bitwise-or of the traits that apply to that core.
-   This need not include flags implied by the architecture.
-   COSTS is the name of the rtx_costs routine to use.
-
-   If you update this table, you must update the "tune" attribute in
-   arm.md.
-   
-   Some tools assume no whitespace up to the first "," in each entry.  */
-
-/* V2/V2A Architecture Processors */
-ARM_CORE("arm2", 	arm2, arm2,	2, FL_CO_PROC | FL_MODE26, slowmul)
-ARM_CORE("arm250", 	arm250, arm250,	2, FL_CO_PROC | FL_MODE26, slowmul)
-ARM_CORE("arm3",	arm3, arm3,	2, FL_CO_PROC | FL_MODE26, slowmul)
-
-/* V3 Architecture Processors */
-ARM_CORE("arm6",	arm6, arm6,		3, FL_CO_PROC | FL_MODE26, slowmul)
-ARM_CORE("arm60",	arm60, arm60,		3, FL_CO_PROC | FL_MODE26, slowmul)
-ARM_CORE("arm600",	arm600, arm600,		3, FL_CO_PROC | FL_MODE26 | FL_WBUF, slowmul)
-ARM_CORE("arm610",	arm610, arm610,		3, FL_MODE26 | FL_WBUF, slowmul)
-ARM_CORE("arm620",	arm620, arm620,		3, FL_CO_PROC | FL_MODE26 | FL_WBUF, slowmul)
-ARM_CORE("arm7",	arm7, arm7,		3, FL_CO_PROC | FL_MODE26, slowmul)
-ARM_CORE("arm7d",	arm7d, arm7d,		3, FL_CO_PROC | FL_MODE26, slowmul)
-ARM_CORE("arm7di",	arm7di, arm7di,		3, FL_CO_PROC | FL_MODE26, slowmul)
-ARM_CORE("arm70",	arm70, arm70,		3, FL_CO_PROC | FL_MODE26, slowmul)
-ARM_CORE("arm700",	arm700, arm700,		3, FL_CO_PROC | FL_MODE26 | FL_WBUF, slowmul)
-ARM_CORE("arm700i",	arm700i, arm700i,	3, FL_CO_PROC | FL_MODE26 | FL_WBUF, slowmul)
-ARM_CORE("arm710",	arm710, arm710,		3, FL_MODE26 | FL_WBUF, slowmul)
-ARM_CORE("arm720",	arm720, arm720,		3, FL_MODE26 | FL_WBUF, slowmul)
-ARM_CORE("arm710c",	arm710c, arm710c,	3, FL_MODE26 | FL_WBUF, slowmul)
-ARM_CORE("arm7100",	arm7100, arm7100,	3, FL_MODE26 | FL_WBUF, slowmul)
-ARM_CORE("arm7500",	arm7500, arm7500,	3, FL_MODE26 | FL_WBUF, slowmul)
-/* Doesn't have an external co-proc, but does have embedded fpa. */
-ARM_CORE("arm7500fe", arm7500fe, arm7500fe,	3, FL_CO_PROC | FL_MODE26 | FL_WBUF, slowmul)
-
-/* V3M Architecture Processors */
-/* arm7m doesn't exist on its own, but only with D, ("and", and I), but
-   those don't alter the code, so arm7m is sometimes used.  */
-ARM_CORE("arm7m",   arm7m, arm7m,	3M, FL_CO_PROC | FL_MODE26, fastmul)
-ARM_CORE("arm7dm",  arm7dm, arm7dm,	3M, FL_CO_PROC | FL_MODE26, fastmul)
-ARM_CORE("arm7dmi", arm7dmi, arm7dmi,	3M, FL_CO_PROC | FL_MODE26, fastmul)
-
-/* V4 Architecture Processors */
-ARM_CORE("arm8",          arm8, arm8,			4, FL_MODE26 | FL_LDSCHED, fastmul)
-ARM_CORE("arm810",        arm810, arm810,		4, FL_MODE26 | FL_LDSCHED, fastmul)
-ARM_CORE("strongarm",     strongarm, strongarm,		4, FL_MODE26 | FL_LDSCHED | FL_STRONG, strongarm)
-ARM_CORE("strongarm110",  strongarm110, strongarm110,	4, FL_MODE26 | FL_LDSCHED | FL_STRONG, strongarm)
-ARM_CORE("strongarm1100", strongarm1100, strongarm1100, 4, FL_MODE26 | FL_LDSCHED | FL_STRONG, strongarm)
-ARM_CORE("strongarm1110", strongarm1110, strongarm1110, 4, FL_MODE26 | FL_LDSCHED | FL_STRONG, strongarm)
-ARM_CORE("fa526",         fa526, fa526,			4, FL_LDSCHED, fastmul)
-ARM_CORE("fa626",         fa626, fa626,			4, FL_LDSCHED, fastmul)
-
-/* V4T Architecture Processors */
-ARM_CORE("arm7tdmi",	arm7tdmi, arm7tdmi,	4T, FL_CO_PROC, fastmul)
-ARM_CORE("arm7tdmi-s",	arm7tdmis, arm7tdmis,	4T, FL_CO_PROC, fastmul)
-ARM_CORE("arm710t",	arm710t, arm710t,	4T, FL_WBUF,    fastmul)
-ARM_CORE("arm720t",	arm720t, arm720t,	4T, FL_WBUF,    fastmul)
-ARM_CORE("arm740t",	arm740t, arm740t,	4T, FL_WBUF,    fastmul)
-ARM_CORE("arm9",	arm9, arm9,		4T, FL_LDSCHED, fastmul)
-ARM_CORE("arm9tdmi",	arm9tdmi, arm9tdmi,	4T, FL_LDSCHED, fastmul)
-ARM_CORE("arm920",	arm920, arm920,		4T, FL_LDSCHED, fastmul)
-ARM_CORE("arm920t",	arm920t, arm920t,	4T, FL_LDSCHED, fastmul)
-ARM_CORE("arm922t",	arm922t, arm922t,	4T, FL_LDSCHED, fastmul)
-ARM_CORE("arm940t",	arm940t, arm940t,	4T, FL_LDSCHED, fastmul)
-ARM_CORE("ep9312",	ep9312, ep9312,		4T, FL_LDSCHED, fastmul)
-
-/* V5T Architecture Processors */
-ARM_CORE("arm10tdmi",	arm10tdmi, arm10tdmi,	5T, FL_LDSCHED, fastmul)
-ARM_CORE("arm1020t",	arm1020t, arm1020t,	5T, FL_LDSCHED, fastmul)
-
-/* V5TE Architecture Processors */
-ARM_CORE("arm9e",	arm9e, arm9e,		5TE, FL_LDSCHED, 9e)
-ARM_CORE("arm946e-s",	arm946es, arm946es,	5TE, FL_LDSCHED, 9e)
-ARM_CORE("arm966e-s",	arm966es, arm966es,	5TE, FL_LDSCHED, 9e)
-ARM_CORE("arm968e-s",	arm968es, arm968es,	5TE, FL_LDSCHED, 9e)
-ARM_CORE("arm10e",	arm10e, arm10e,		5TE, FL_LDSCHED, fastmul)
-ARM_CORE("arm1020e",	arm1020e, arm1020e,	5TE, FL_LDSCHED, fastmul)
-ARM_CORE("arm1022e",	arm1022e, arm1022e,	5TE, FL_LDSCHED, fastmul)
-ARM_CORE("xscale",	xscale, xscale,		5TE, FL_LDSCHED | FL_STRONG | FL_XSCALE, xscale)
-ARM_CORE("iwmmxt",	iwmmxt, iwmmxt,		5TE, FL_LDSCHED | FL_STRONG | FL_XSCALE | FL_IWMMXT, xscale)
-ARM_CORE("iwmmxt2",	iwmmxt2, iwmmxt2,	5TE, FL_LDSCHED | FL_STRONG | FL_XSCALE | FL_IWMMXT | FL_IWMMXT2, xscale)
-ARM_CORE("fa606te",	fa606te, fa606te,	5TE, FL_LDSCHED, 9e)
-ARM_CORE("fa626te",	fa626te, fa626te,	5TE, FL_LDSCHED, 9e)
-ARM_CORE("fmp626",	fmp626, fmp626,		5TE, FL_LDSCHED, 9e)
-ARM_CORE("fa726te",	fa726te, fa726te,	5TE, FL_LDSCHED, fa726te)
-
-/* V5TEJ Architecture Processors */
-ARM_CORE("arm926ej-s",	arm926ejs, arm926ejs,	5TEJ, FL_LDSCHED, 9e)
-ARM_CORE("arm1026ej-s",	arm1026ejs, arm1026ejs,	5TEJ, FL_LDSCHED, 9e)
-
-/* V6 Architecture Processors */
-ARM_CORE("arm1136j-s",		arm1136js, arm1136js,		6J,  FL_LDSCHED, 9e)
-ARM_CORE("arm1136jf-s",		arm1136jfs, arm1136jfs,		6J,  FL_LDSCHED | FL_VFPV2, 9e)
-ARM_CORE("arm1176jz-s",		arm1176jzs, arm1176jzs,		6ZK, FL_LDSCHED, 9e)
-ARM_CORE("arm1176jzf-s",	arm1176jzfs, arm1176jzfs,	6ZK, FL_LDSCHED | FL_VFPV2, 9e)
-ARM_CORE("mpcorenovfp",		mpcorenovfp, mpcorenovfp,	6K,  FL_LDSCHED, 9e)
-ARM_CORE("mpcore",		mpcore, mpcore,			6K,  FL_LDSCHED | FL_VFPV2, 9e)
-ARM_CORE("arm1156t2-s",		arm1156t2s, arm1156t2s,		6T2, FL_LDSCHED, v6t2)
-ARM_CORE("arm1156t2f-s",	arm1156t2fs, arm1156t2fs,	6T2, FL_LDSCHED | FL_VFPV2, v6t2)
-
-/* V6M Architecture Processors */
-ARM_CORE("cortex-m1",		cortexm1, cortexm1,		6M, FL_LDSCHED, v6m)
-ARM_CORE("cortex-m0",		cortexm0, cortexm0,		6M, FL_LDSCHED, v6m)
-ARM_CORE("cortex-m0plus",	cortexm0plus, cortexm0plus,	6M, FL_LDSCHED, v6m)
-
-/* V7 Architecture Processors */
-ARM_CORE("generic-armv7-a",	genericv7a, genericv7a,		7A,  FL_LDSCHED, cortex)
-ARM_CORE("cortex-a5",		cortexa5, cortexa5,		7A,  FL_LDSCHED, cortex_a5)
-ARM_CORE("cortex-a7",		cortexa7, cortexa7,		7A,  FL_LDSCHED | FL_THUMB_DIV | FL_ARM_DIV, cortex_a7)
-ARM_CORE("cortex-a8",		cortexa8, cortexa8,		7A,  FL_LDSCHED, cortex)
-ARM_CORE("cortex-a9",		cortexa9, cortexa9,		7A,  FL_LDSCHED, cortex_a9)
-ARM_CORE("cortex-a12",	  	cortexa12, cortexa15,		7A,  FL_LDSCHED | FL_THUMB_DIV | FL_ARM_DIV, cortex_a12)
-ARM_CORE("cortex-a15",		cortexa15, cortexa15,		7A,  FL_LDSCHED | FL_THUMB_DIV | FL_ARM_DIV, cortex_a15)
-ARM_CORE("cortex-r4",		cortexr4, cortexr4,		7R,  FL_LDSCHED, cortex)
-ARM_CORE("cortex-r4f",		cortexr4f, cortexr4f,		7R,  FL_LDSCHED, cortex)
-ARM_CORE("cortex-r5",		cortexr5, cortexr5,		7R,  FL_LDSCHED | FL_ARM_DIV, cortex)
-ARM_CORE("cortex-r7",		cortexr7, cortexr7,		7R,  FL_LDSCHED | FL_ARM_DIV, cortex)
-ARM_CORE("cortex-m4",		cortexm4, cortexm4,		7EM, FL_LDSCHED, v7m)
-ARM_CORE("cortex-m3",		cortexm3, cortexm3,		7M,  FL_LDSCHED, v7m)
-ARM_CORE("marvell-pj4",		marvell_pj4, marvell_pj4,	7A,  FL_LDSCHED, 9e)
-
-/* V7 big.LITTLE implementations */
-ARM_CORE("cortex-a15.cortex-a7", cortexa15cortexa7, cortexa7,	7A,  FL_LDSCHED | FL_THUMB_DIV | FL_ARM_DIV, cortex_a15)
-
-/* V8 Architecture Processors */
-ARM_CORE("cortex-a53",	cortexa53, cortexa53,	8A, FL_LDSCHED | FL_CRC32, cortex_a53)
-ARM_CORE("cortex-a57",	cortexa57, cortexa15,	8A, FL_LDSCHED | FL_CRC32, cortex_a57)
-
-/* V8 big.LITTLE implementations */
-ARM_CORE("cortex-a57.cortex-a53", cortexa57cortexa53, cortexa53, 8A,  FL_LDSCHED | FL_CRC32, cortex_a57)
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/arm-opts.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/arm-opts.h
deleted file mode 100644
index 2190294..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/arm-opts.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/* Definitions for option handling for ARM.
-   Copyright (C) 1991-2014 Free Software Foundation, Inc.
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3, or (at your
-   option) any later version.
-
-   GCC 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 General Public
-   License for more details.
-
-   Under Section 7 of GPL version 3, you are granted additional
-   permissions described in the GCC Runtime Library Exception, version
-   3.1, as published by the Free Software Foundation.
-
-   You should have received a copy of the GNU General Public License and
-   a copy of the GCC Runtime Library Exception along with this program;
-   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef ARM_OPTS_H
-#define ARM_OPTS_H
-
-/* The various ARM cores.  */
-enum processor_type
-{
-#undef ARM_CORE
-#define ARM_CORE(NAME, INTERNAL_IDENT, IDENT, ARCH, FLAGS, COSTS) \
-  INTERNAL_IDENT,
-#include "arm-cores.def"
-#undef ARM_CORE
-  /* Used to indicate that no processor has been specified.  */
-  arm_none
-};
-
-/* Which __fp16 format to use.
-   The enumeration values correspond to the numbering for the
-   Tag_ABI_FP_16bit_format attribute.
- */
-enum arm_fp16_format_type
-{
-  ARM_FP16_FORMAT_NONE = 0,
-  ARM_FP16_FORMAT_IEEE = 1,
-  ARM_FP16_FORMAT_ALTERNATIVE = 2
-};
-
-/* Which ABI to use.  */
-enum arm_abi_type
-{
-  ARM_ABI_APCS,
-  ARM_ABI_ATPCS,
-  ARM_ABI_AAPCS,
-  ARM_ABI_IWMMXT,
-  ARM_ABI_AAPCS_LINUX
-};
-
-enum float_abi_type
-{
-  ARM_FLOAT_ABI_SOFT,
-  ARM_FLOAT_ABI_SOFTFP,
-  ARM_FLOAT_ABI_HARD
-};
-
-/* Which thread pointer access sequence to use.  */
-enum arm_tp_type {
-  TP_AUTO,
-  TP_SOFT,
-  TP_CP15
-};
-
-/* Which TLS scheme to use.  */
-enum arm_tls_type {
-  TLS_GNU,
-  TLS_GNU2
-};
-#endif
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/arm-protos.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/arm-protos.h
deleted file mode 100644
index 13874ee..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/arm-protos.h
+++ /dev/null
@@ -1,297 +0,0 @@
-/* Prototypes for exported functions defined in arm.c and pe.c
-   Copyright (C) 1999-2014 Free Software Foundation, Inc.
-   Contributed by Richard Earnshaw (rearnsha@arm.com)
-   Minor hacks by Nick Clifton (nickc@cygnus.com)
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
-
-   GCC 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with GCC; see the file COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_ARM_PROTOS_H
-#define GCC_ARM_PROTOS_H
-
-extern enum unwind_info_type arm_except_unwind_info (struct gcc_options *);
-extern int use_return_insn (int, rtx);
-extern bool use_simple_return_p (void);
-extern enum reg_class arm_regno_class (int);
-extern void arm_load_pic_register (unsigned long);
-extern int arm_volatile_func (void);
-extern void arm_expand_prologue (void);
-extern void arm_expand_epilogue (bool);
-extern void thumb2_expand_return (bool);
-extern const char *arm_strip_name_encoding (const char *);
-extern void arm_asm_output_labelref (FILE *, const char *);
-extern void thumb2_asm_output_opcode (FILE *);
-extern unsigned long arm_current_func_type (void);
-extern HOST_WIDE_INT arm_compute_initial_elimination_offset (unsigned int,
-							     unsigned int);
-extern HOST_WIDE_INT thumb_compute_initial_elimination_offset (unsigned int,
-							       unsigned int);
-extern unsigned int arm_dbx_register_number (unsigned int);
-extern void arm_output_fn_unwind (FILE *, bool);
-  
-
-#ifdef RTX_CODE
-extern bool arm_vector_mode_supported_p (enum machine_mode);
-extern bool arm_small_register_classes_for_mode_p (enum machine_mode);
-extern int arm_hard_regno_mode_ok (unsigned int, enum machine_mode);
-extern bool arm_modes_tieable_p (enum machine_mode, enum machine_mode);
-extern int const_ok_for_arm (HOST_WIDE_INT);
-extern int const_ok_for_op (HOST_WIDE_INT, enum rtx_code);
-extern int const_ok_for_dimode_op (HOST_WIDE_INT, enum rtx_code);
-extern int arm_split_constant (RTX_CODE, enum machine_mode, rtx,
-			       HOST_WIDE_INT, rtx, rtx, int);
-extern int legitimate_pic_operand_p (rtx);
-extern rtx legitimize_pic_address (rtx, enum machine_mode, rtx);
-extern rtx legitimize_tls_address (rtx, rtx);
-extern int arm_legitimate_address_outer_p (enum machine_mode, rtx, RTX_CODE, int);
-extern int thumb_legitimate_offset_p (enum machine_mode, HOST_WIDE_INT);
-extern bool arm_legitimize_reload_address (rtx *, enum machine_mode, int, int,
-					   int);
-extern rtx thumb_legitimize_reload_address (rtx *, enum machine_mode, int, int,
-					    int);
-extern int thumb1_legitimate_address_p (enum machine_mode, rtx, int);
-extern bool ldm_stm_operation_p (rtx, bool, enum machine_mode mode,
-                                 bool, bool);
-extern int arm_const_double_rtx (rtx);
-extern int vfp3_const_double_rtx (rtx);
-extern int neon_immediate_valid_for_move (rtx, enum machine_mode, rtx *, int *);
-extern int neon_immediate_valid_for_logic (rtx, enum machine_mode, int, rtx *,
-					   int *);
-extern int neon_immediate_valid_for_shift (rtx, enum machine_mode, rtx *,
-					   int *, bool);
-extern char *neon_output_logic_immediate (const char *, rtx *,
-					  enum machine_mode, int, int);
-extern char *neon_output_shift_immediate (const char *, char, rtx *,
-					  enum machine_mode, int, bool);
-extern void neon_pairwise_reduce (rtx, rtx, enum machine_mode,
-				  rtx (*) (rtx, rtx, rtx));
-extern rtx neon_make_constant (rtx);
-extern tree arm_builtin_vectorized_function (tree, tree, tree);
-extern void neon_expand_vector_init (rtx, rtx);
-extern void neon_lane_bounds (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
-extern void neon_const_bounds (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
-extern HOST_WIDE_INT neon_element_bits (enum machine_mode);
-extern void neon_reinterpret (rtx, rtx);
-extern void neon_emit_pair_result_insn (enum machine_mode,
-					rtx (*) (rtx, rtx, rtx, rtx),
-					rtx, rtx, rtx);
-extern void neon_disambiguate_copy (rtx *, rtx *, rtx *, unsigned int);
-extern void neon_split_vcombine (rtx op[3]);
-extern enum reg_class coproc_secondary_reload_class (enum machine_mode, rtx,
-						     bool);
-extern bool arm_tls_referenced_p (rtx);
-
-extern int arm_coproc_mem_operand (rtx, bool);
-extern int neon_vector_mem_operand (rtx, int, bool);
-extern int neon_struct_mem_operand (rtx);
-
-extern int tls_mentioned_p (rtx);
-extern int symbol_mentioned_p (rtx);
-extern int label_mentioned_p (rtx);
-extern RTX_CODE minmax_code (rtx);
-extern bool arm_sat_operator_match (rtx, rtx, int *, bool *);
-extern int adjacent_mem_locations (rtx, rtx);
-extern bool gen_ldm_seq (rtx *, int, bool);
-extern bool gen_stm_seq (rtx *, int);
-extern bool gen_const_stm_seq (rtx *, int);
-extern rtx arm_gen_load_multiple (int *, int, rtx, int, rtx, HOST_WIDE_INT *);
-extern rtx arm_gen_store_multiple (int *, int, rtx, int, rtx, HOST_WIDE_INT *);
-extern bool offset_ok_for_ldrd_strd (HOST_WIDE_INT);
-extern bool operands_ok_ldrd_strd (rtx, rtx, rtx, HOST_WIDE_INT, bool, bool);
-extern bool gen_operands_ldrd_strd (rtx *, bool, bool, bool);
-extern int arm_gen_movmemqi (rtx *);
-extern bool gen_movmem_ldrd_strd (rtx *);
-extern enum machine_mode arm_select_cc_mode (RTX_CODE, rtx, rtx);
-extern enum machine_mode arm_select_dominance_cc_mode (rtx, rtx,
-						       HOST_WIDE_INT);
-extern rtx arm_gen_compare_reg (RTX_CODE, rtx, rtx, rtx);
-extern rtx arm_gen_return_addr_mask (void);
-extern void arm_reload_in_hi (rtx *);
-extern void arm_reload_out_hi (rtx *);
-extern int arm_max_const_double_inline_cost (void);
-extern int arm_const_double_inline_cost (rtx);
-extern bool arm_const_double_by_parts (rtx);
-extern bool arm_const_double_by_immediates (rtx);
-extern const char *fp_immediate_constant (rtx);
-extern void arm_emit_call_insn (rtx, rtx);
-extern const char *output_call (rtx *);
-extern const char *output_call_mem (rtx *);
-void arm_emit_movpair (rtx, rtx);
-extern const char *output_mov_long_double_arm_from_arm (rtx *);
-extern const char *output_move_double (rtx *, bool, int *count);
-extern const char *output_move_quad (rtx *);
-extern int arm_count_output_move_double_insns (rtx *);
-extern const char *output_move_vfp (rtx *operands);
-extern const char *output_move_neon (rtx *operands);
-extern int arm_attr_length_move_neon (rtx);
-extern int arm_address_offset_is_imm (rtx);
-extern const char *output_add_immediate (rtx *);
-extern const char *arithmetic_instr (rtx, int);
-extern void output_ascii_pseudo_op (FILE *, const unsigned char *, int);
-extern const char *output_return_instruction (rtx, bool, bool, bool);
-extern void arm_poke_function_name (FILE *, const char *);
-extern void arm_final_prescan_insn (rtx);
-extern int arm_debugger_arg_offset (int, rtx);
-extern bool arm_is_long_call_p (tree);
-extern int    arm_emit_vector_const (FILE *, rtx);
-extern void arm_emit_fp16_const (rtx c);
-extern const char * arm_output_load_gr (rtx *);
-extern const char *vfp_output_fstmd (rtx *);
-extern void arm_output_multireg_pop (rtx *, bool, rtx, bool, bool);
-extern void arm_set_return_address (rtx, rtx);
-extern int arm_eliminable_register (rtx);
-extern const char *arm_output_shift(rtx *, int);
-extern const char *arm_output_iwmmxt_shift_immediate (const char *, rtx *, bool);
-extern const char *arm_output_iwmmxt_tinsr (rtx *);
-extern unsigned int arm_sync_loop_insns (rtx , rtx *);
-extern int arm_attr_length_push_multi(rtx, rtx);
-extern void arm_expand_compare_and_swap (rtx op[]);
-extern void arm_split_compare_and_swap (rtx op[]);
-extern void arm_split_atomic_op (enum rtx_code, rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx arm_load_tp (rtx);
-
-#if defined TREE_CODE
-extern void arm_init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree);
-extern bool arm_pad_arg_upward (enum machine_mode, const_tree);
-extern bool arm_pad_reg_upward (enum machine_mode, tree, int);
-#endif
-extern int arm_apply_result_size (void);
-
-#endif /* RTX_CODE */
-
-/* Thumb functions.  */
-extern void arm_init_expanders (void);
-extern const char *thumb1_unexpanded_epilogue (void);
-extern void thumb1_expand_prologue (void);
-extern void thumb1_expand_epilogue (void);
-extern const char *thumb1_output_interwork (void);
-#ifdef TREE_CODE
-extern int is_called_in_ARM_mode (tree);
-#endif
-extern int thumb_shiftable_const (unsigned HOST_WIDE_INT);
-#ifdef RTX_CODE
-extern enum arm_cond_code maybe_get_arm_condition_code (rtx);
-extern void thumb1_final_prescan_insn (rtx);
-extern void thumb2_final_prescan_insn (rtx);
-extern const char *thumb_load_double_from_address (rtx *);
-extern const char *thumb_output_move_mem_multiple (int, rtx *);
-extern const char *thumb_call_via_reg (rtx);
-extern void thumb_expand_movmemqi (rtx *);
-extern rtx arm_return_addr (int, rtx);
-extern void thumb_reload_out_hi (rtx *);
-extern void thumb_reload_in_hi (rtx *);
-extern void thumb_set_return_address (rtx, rtx);
-extern const char *thumb1_output_casesi (rtx *);
-extern const char *thumb2_output_casesi (rtx *);
-#endif
-
-/* Defined in pe.c.  */
-extern int arm_dllexport_name_p (const char *);
-extern int arm_dllimport_name_p (const char *);
-
-#ifdef TREE_CODE
-extern void arm_pe_unique_section (tree, int);
-extern void arm_pe_encode_section_info (tree, rtx, int);
-extern int arm_dllexport_p (tree);
-extern int arm_dllimport_p (tree);
-extern void arm_mark_dllexport (tree);
-extern void arm_mark_dllimport (tree);
-#endif
-
-extern void arm_pr_long_calls (struct cpp_reader *);
-extern void arm_pr_no_long_calls (struct cpp_reader *);
-extern void arm_pr_long_calls_off (struct cpp_reader *);
-
-extern void arm_lang_object_attributes_init(void);
-
-extern const char *arm_mangle_type (const_tree);
-
-extern void arm_order_regs_for_local_alloc (void);
-
-extern int arm_max_conditional_execute ();
-
-/* Vectorizer cost model implementation.  */
-struct cpu_vec_costs {
-  const int scalar_stmt_cost;   /* Cost of any scalar operation, excluding
-				   load and store.  */
-  const int scalar_load_cost;   /* Cost of scalar load.  */
-  const int scalar_store_cost;  /* Cost of scalar store.  */
-  const int vec_stmt_cost;      /* Cost of any vector operation, excluding
-                                   load, store, vector-to-scalar and
-                                   scalar-to-vector operation.  */
-  const int vec_to_scalar_cost;    /* Cost of vect-to-scalar operation.  */
-  const int scalar_to_vec_cost;    /* Cost of scalar-to-vector operation.  */
-  const int vec_align_load_cost;   /* Cost of aligned vector load.  */
-  const int vec_unalign_load_cost; /* Cost of unaligned vector load.  */
-  const int vec_unalign_store_cost; /* Cost of unaligned vector load.  */
-  const int vec_store_cost;        /* Cost of vector store.  */
-  const int cond_taken_branch_cost;    /* Cost of taken branch for vectorizer
-					  cost model.  */
-  const int cond_not_taken_branch_cost;/* Cost of not taken branch for
-					  vectorizer cost model.  */
-};
-
-#ifdef RTX_CODE
-/* This needs to be here because we need RTX_CODE and similar.  */
-
-struct cpu_cost_table;
-
-struct tune_params
-{
-  bool (*rtx_costs) (rtx, RTX_CODE, RTX_CODE, int *, bool);
-  const struct cpu_cost_table *insn_extra_cost;
-  bool (*sched_adjust_cost) (rtx, rtx, rtx, int *);
-  int constant_limit;
-  /* Maximum number of instructions to conditionalise.  */
-  int max_insns_skipped;
-  int num_prefetch_slots;
-  int l1_cache_size;
-  int l1_cache_line_size;
-  bool prefer_constant_pool;
-  int (*branch_cost) (bool, bool);
-  /* Prefer STRD/LDRD instructions over PUSH/POP/LDM/STM.  */
-  bool prefer_ldrd_strd;
-  /* The preference for non short cirtcuit operation when optimizing for
-     performance. The first element covers Thumb state and the second one
-     is for ARM state.  */
-  bool logical_op_non_short_circuit[2];
-  /* Vectorizer costs.  */
-  const struct cpu_vec_costs* vec_costs;
-  /* Prefer Neon for 64-bit bitops.  */
-  bool prefer_neon_for_64bits;
-};
-
-extern const struct tune_params *current_tune;
-extern int vfp3_const_double_for_fract_bits (rtx);
-/* return power of two from operand, otherwise 0.  */
-extern int vfp3_const_double_for_bits (rtx);
-
-extern void arm_emit_coreregs_64bit_shift (enum rtx_code, rtx, rtx, rtx, rtx,
-					   rtx);
-extern bool arm_validize_comparison (rtx *, rtx *, rtx *);
-#endif /* RTX_CODE */
-
-extern void arm_expand_vec_perm (rtx target, rtx op0, rtx op1, rtx sel);
-extern bool arm_expand_vec_perm_const (rtx target, rtx op0, rtx op1, rtx sel);
-
-extern bool arm_autoinc_modes_ok_p (enum machine_mode, enum arm_auto_incmodes);
-
-extern void arm_emit_eabi_attribute (const char *, int, int);
-
-/* Defined in gcc/common/config/arm-common.c.  */
-extern const char *arm_rewrite_selected_cpu (const char *name);
-
-#endif /* ! GCC_ARM_PROTOS_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/arm.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/arm.h
deleted file mode 100644
index c60d9a4..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/arm.h
+++ /dev/null
@@ -1,2398 +0,0 @@
-/* Definitions of target machine for GNU compiler, for ARM.
-   Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   Contributed by Pieter `Tiggr' Schoenmakers (rcpieter@win.tue.nl)
-   and Martin Simmons (@harleqn.co.uk).
-   More major hacks by Richard Earnshaw (rearnsha@arm.com)
-   Minor hacks by Nick Clifton (nickc@cygnus.com)
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3, or (at your
-   option) any later version.
-
-   GCC 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 General Public
-   License for more details.
-
-   Under Section 7 of GPL version 3, you are granted additional
-   permissions described in the GCC Runtime Library Exception, version
-   3.1, as published by the Free Software Foundation.
-
-   You should have received a copy of the GNU General Public License and
-   a copy of the GCC Runtime Library Exception along with this program;
-   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_ARM_H
-#define GCC_ARM_H
-
-/* We can't use enum machine_mode inside a generator file because it
-   hasn't been created yet; we shouldn't be using any code that
-   needs the real definition though, so this ought to be safe.  */
-#ifdef GENERATOR_FILE
-#define MACHMODE int
-#else
-#include "insn-modes.h"
-#define MACHMODE enum machine_mode
-#endif
-
-#include "config/vxworks-dummy.h"
-
-/* The architecture define.  */
-extern char arm_arch_name[];
-
-/* Target CPU builtins.  */
-#define TARGET_CPU_CPP_BUILTINS()			\
-  do							\
-    {							\
-	if (TARGET_DSP_MULTIPLY)			\
-	   builtin_define ("__ARM_FEATURE_DSP");	\
-        if (TARGET_ARM_QBIT)				\
-           builtin_define ("__ARM_FEATURE_QBIT");	\
-        if (TARGET_ARM_SAT)				\
-           builtin_define ("__ARM_FEATURE_SAT");	\
-        if (TARGET_CRYPTO)				\
-	   builtin_define ("__ARM_FEATURE_CRYPTO");	\
-	if (unaligned_access)				\
-	  builtin_define ("__ARM_FEATURE_UNALIGNED");	\
-	if (TARGET_CRC32)				\
-	  builtin_define ("__ARM_FEATURE_CRC32");	\
-	if (TARGET_32BIT)				\
-	  builtin_define ("__ARM_32BIT_STATE");		\
-	if (TARGET_ARM_FEATURE_LDREX)				\
-	  builtin_define_with_int_value (			\
-	    "__ARM_FEATURE_LDREX", TARGET_ARM_FEATURE_LDREX);	\
-	if ((TARGET_ARM_ARCH >= 5 && !TARGET_THUMB)		\
-	     || TARGET_ARM_ARCH_ISA_THUMB >=2)			\
-	  builtin_define ("__ARM_FEATURE_CLZ");			\
-	if (TARGET_INT_SIMD)					\
-	  builtin_define ("__ARM_FEATURE_SIMD32");		\
-								\
-	builtin_define_with_int_value (				\
-	  "__ARM_SIZEOF_MINIMAL_ENUM",				\
-	  flag_short_enums ? 1 : 4);				\
-	builtin_define_with_int_value (				\
-	  "__ARM_SIZEOF_WCHAR_T", WCHAR_TYPE_SIZE);		\
-	if (TARGET_ARM_ARCH_PROFILE)				\
-	  builtin_define_with_int_value (			\
-	    "__ARM_ARCH_PROFILE", TARGET_ARM_ARCH_PROFILE);	\
-								\
-	/* Define __arm__ even when in thumb mode, for	\
-	   consistency with armcc.  */			\
-	builtin_define ("__arm__");			\
-	if (TARGET_ARM_ARCH)				\
-	  builtin_define_with_int_value (		\
-	    "__ARM_ARCH", TARGET_ARM_ARCH);		\
-	if (arm_arch_notm)				\
-	  builtin_define ("__ARM_ARCH_ISA_ARM");	\
-	builtin_define ("__APCS_32__");			\
-	if (TARGET_THUMB)				\
-	  builtin_define ("__thumb__");			\
-	if (TARGET_THUMB2)				\
-	  builtin_define ("__thumb2__");		\
-	if (TARGET_ARM_ARCH_ISA_THUMB)			\
-	  builtin_define_with_int_value (		\
-	    "__ARM_ARCH_ISA_THUMB",			\
-	    TARGET_ARM_ARCH_ISA_THUMB);			\
-							\
-	if (TARGET_BIG_END)				\
-	  {						\
-	    builtin_define ("__ARMEB__");		\
-	    builtin_define ("__ARM_BIG_ENDIAN");	\
-	    if (TARGET_THUMB)				\
-	      builtin_define ("__THUMBEB__");		\
-	    if (TARGET_LITTLE_WORDS)			\
-	      builtin_define ("__ARMWEL__");		\
-	  }						\
-        else						\
-	  {						\
-	    builtin_define ("__ARMEL__");		\
-	    if (TARGET_THUMB)				\
-	      builtin_define ("__THUMBEL__");		\
-	  }						\
-							\
-	if (TARGET_SOFT_FLOAT)				\
-	  builtin_define ("__SOFTFP__");		\
-							\
-	if (TARGET_VFP)					\
-	  builtin_define ("__VFP_FP__");		\
-							\
-	if (TARGET_ARM_FP)				\
-	  builtin_define_with_int_value (		\
-	    "__ARM_FP", TARGET_ARM_FP);			\
-	if (arm_fp16_format == ARM_FP16_FORMAT_IEEE)		\
-	  builtin_define ("__ARM_FP16_FORMAT_IEEE");		\
-	if (arm_fp16_format == ARM_FP16_FORMAT_ALTERNATIVE)	\
-	  builtin_define ("__ARM_FP16_FORMAT_ALTERNATIVE");	\
-        if (TARGET_FMA)					\
-          builtin_define ("__ARM_FEATURE_FMA");		\
-							\
-	if (TARGET_NEON)				\
-	  {						\
-	    builtin_define ("__ARM_NEON__");		\
-	    builtin_define ("__ARM_NEON");		\
-	  }						\
-	if (TARGET_NEON_FP)				\
-	  builtin_define_with_int_value (		\
-	    "__ARM_NEON_FP", TARGET_NEON_FP);		\
-							\
-	/* Add a define for interworking.		\
-	   Needed when building libgcc.a.  */		\
-	if (arm_cpp_interwork)				\
-	  builtin_define ("__THUMB_INTERWORK__");	\
-							\
-	builtin_assert ("cpu=arm");			\
-	builtin_assert ("machine=arm");			\
-							\
-	builtin_define (arm_arch_name);			\
-	if (arm_arch_xscale)				\
-	  builtin_define ("__XSCALE__");		\
-	if (arm_arch_iwmmxt)				\
-          {						\
-	    builtin_define ("__IWMMXT__");		\
-	    builtin_define ("__ARM_WMMX");		\
-	  }						\
-	if (arm_arch_iwmmxt2)				\
-	  builtin_define ("__IWMMXT2__");		\
-	if (TARGET_AAPCS_BASED)				\
-	  {						\
-	    if (arm_pcs_default == ARM_PCS_AAPCS_VFP)	\
-	      builtin_define ("__ARM_PCS_VFP");		\
-	    else if (arm_pcs_default == ARM_PCS_AAPCS)	\
-	      builtin_define ("__ARM_PCS");		\
-	    builtin_define ("__ARM_EABI__");		\
-	  }						\
-	if (TARGET_IDIV)				\
-	  builtin_define ("__ARM_ARCH_EXT_IDIV__");	\
-    } while (0)
-
-#include "config/arm/arm-opts.h"
-
-enum target_cpus
-{
-#define ARM_CORE(NAME, INTERNAL_IDENT, IDENT, ARCH, FLAGS, COSTS) \
-  TARGET_CPU_##INTERNAL_IDENT,
-#include "arm-cores.def"
-#undef ARM_CORE
-  TARGET_CPU_generic
-};
-
-/* The processor for which instructions should be scheduled.  */
-extern enum processor_type arm_tune;
-
-typedef enum arm_cond_code
-{
-  ARM_EQ = 0, ARM_NE, ARM_CS, ARM_CC, ARM_MI, ARM_PL, ARM_VS, ARM_VC,
-  ARM_HI, ARM_LS, ARM_GE, ARM_LT, ARM_GT, ARM_LE, ARM_AL, ARM_NV
-}
-arm_cc;
-
-extern arm_cc arm_current_cc;
-
-#define ARM_INVERSE_CONDITION_CODE(X)  ((arm_cc) (((int)X) ^ 1))
-
-/* The maximum number of instructions that is beneficial to
-   conditionally execute. */
-#undef MAX_CONDITIONAL_EXECUTE
-#define MAX_CONDITIONAL_EXECUTE arm_max_conditional_execute ()
-
-extern int arm_target_label;
-extern int arm_ccfsm_state;
-extern GTY(()) rtx arm_target_insn;
-/* The label of the current constant pool.  */
-extern rtx pool_vector_label;
-/* Set to 1 when a return insn is output, this means that the epilogue
-   is not needed.  */
-extern int return_used_this_function;
-/* Callback to output language specific object attributes.  */
-extern void (*arm_lang_output_object_attributes_hook)(void);
-
-/* Just in case configure has failed to define anything.  */
-#ifndef TARGET_CPU_DEFAULT
-#define TARGET_CPU_DEFAULT TARGET_CPU_generic
-#endif
-
-
-#undef  CPP_SPEC
-#define CPP_SPEC "%(subtarget_cpp_spec)					\
-%{mfloat-abi=soft:%{mfloat-abi=hard:					\
-	%e-mfloat-abi=soft and -mfloat-abi=hard may not be used together}} \
-%{mbig-endian:%{mlittle-endian:						\
-	%e-mbig-endian and -mlittle-endian may not be used together}}"
-
-#ifndef CC1_SPEC
-#define CC1_SPEC ""
-#endif
-
-/* This macro defines names of additional specifications to put in the specs
-   that can be used in various specifications like CC1_SPEC.  Its definition
-   is an initializer with a subgrouping for each command option.
-
-   Each subgrouping contains a string constant, that defines the
-   specification name, and a string constant that used by the GCC driver
-   program.
-
-   Do not define this macro if it does not need to do anything.  */
-#define EXTRA_SPECS						\
-  { "subtarget_cpp_spec",	SUBTARGET_CPP_SPEC },           \
-  { "asm_cpu_spec",		ASM_CPU_SPEC },			\
-  SUBTARGET_EXTRA_SPECS
-
-#ifndef SUBTARGET_EXTRA_SPECS
-#define SUBTARGET_EXTRA_SPECS
-#endif
-
-#ifndef SUBTARGET_CPP_SPEC
-#define SUBTARGET_CPP_SPEC      ""
-#endif
-
-/* Run-time Target Specification.  */
-#define TARGET_SOFT_FLOAT		(arm_float_abi == ARM_FLOAT_ABI_SOFT)
-/* Use hardware floating point instructions. */
-#define TARGET_HARD_FLOAT		(arm_float_abi != ARM_FLOAT_ABI_SOFT)
-/* Use hardware floating point calling convention.  */
-#define TARGET_HARD_FLOAT_ABI		(arm_float_abi == ARM_FLOAT_ABI_HARD)
-#define TARGET_VFP		(arm_fpu_desc->model == ARM_FP_MODEL_VFP)
-#define TARGET_IWMMXT			(arm_arch_iwmmxt)
-#define TARGET_IWMMXT2			(arm_arch_iwmmxt2)
-#define TARGET_REALLY_IWMMXT		(TARGET_IWMMXT && TARGET_32BIT)
-#define TARGET_REALLY_IWMMXT2		(TARGET_IWMMXT2 && TARGET_32BIT)
-#define TARGET_IWMMXT_ABI (TARGET_32BIT && arm_abi == ARM_ABI_IWMMXT)
-#define TARGET_ARM                      (! TARGET_THUMB)
-#define TARGET_EITHER			1 /* (TARGET_ARM | TARGET_THUMB) */
-#define TARGET_BACKTRACE	        (leaf_function_p () \
-				         ? TARGET_TPCS_LEAF_FRAME \
-				         : TARGET_TPCS_FRAME)
-#define TARGET_AAPCS_BASED \
-    (arm_abi != ARM_ABI_APCS && arm_abi != ARM_ABI_ATPCS)
-
-#define TARGET_HARD_TP			(target_thread_pointer == TP_CP15)
-#define TARGET_SOFT_TP			(target_thread_pointer == TP_SOFT)
-#define TARGET_GNU2_TLS			(target_tls_dialect == TLS_GNU2)
-
-/* Only 16-bit thumb code.  */
-#define TARGET_THUMB1			(TARGET_THUMB && !arm_arch_thumb2)
-/* Arm or Thumb-2 32-bit code.  */
-#define TARGET_32BIT			(TARGET_ARM || arm_arch_thumb2)
-/* 32-bit Thumb-2 code.  */
-#define TARGET_THUMB2			(TARGET_THUMB && arm_arch_thumb2)
-/* Thumb-1 only.  */
-#define TARGET_THUMB1_ONLY		(TARGET_THUMB1 && !arm_arch_notm)
-
-#define TARGET_LDRD			(arm_arch5e && ARM_DOUBLEWORD_ALIGN \
-                                         && !TARGET_THUMB1)
-
-#define TARGET_CRC32			(arm_arch_crc)
-
-/* The following two macros concern the ability to execute coprocessor
-   instructions for VFPv3 or NEON.  TARGET_VFP3/TARGET_VFPD32 are currently
-   only ever tested when we know we are generating for VFP hardware; we need
-   to be more careful with TARGET_NEON as noted below.  */
-
-/* FPU is has the full VFPv3/NEON register file of 32 D registers.  */
-#define TARGET_VFPD32 (TARGET_VFP && arm_fpu_desc->regs == VFP_REG_D32)
-
-/* FPU supports VFPv3 instructions.  */
-#define TARGET_VFP3 (TARGET_VFP && arm_fpu_desc->rev >= 3)
-
-/* FPU only supports VFP single-precision instructions.  */
-#define TARGET_VFP_SINGLE (TARGET_VFP && arm_fpu_desc->regs == VFP_REG_SINGLE)
-
-/* FPU supports VFP double-precision instructions.  */
-#define TARGET_VFP_DOUBLE (TARGET_VFP && arm_fpu_desc->regs != VFP_REG_SINGLE)
-
-/* FPU supports half-precision floating-point with NEON element load/store.  */
-#define TARGET_NEON_FP16 \
-  (TARGET_VFP && arm_fpu_desc->neon && arm_fpu_desc->fp16)
-
-/* FPU supports VFP half-precision floating-point.  */
-#define TARGET_FP16 (TARGET_VFP && arm_fpu_desc->fp16)
-
-/* FPU supports fused-multiply-add operations.  */
-#define TARGET_FMA (TARGET_VFP && arm_fpu_desc->rev >= 4)
-
-/* FPU is ARMv8 compatible.  */
-#define TARGET_FPU_ARMV8 (TARGET_VFP && arm_fpu_desc->rev >= 8)
-
-/* FPU supports Crypto extensions.  */
-#define TARGET_CRYPTO (TARGET_VFP && arm_fpu_desc->crypto)
-
-/* FPU supports Neon instructions.  The setting of this macro gets
-   revealed via __ARM_NEON__ so we add extra guards upon TARGET_32BIT
-   and TARGET_HARD_FLOAT to ensure that NEON instructions are
-   available.  */
-#define TARGET_NEON (TARGET_32BIT && TARGET_HARD_FLOAT \
-		     && TARGET_VFP && arm_fpu_desc->neon)
-
-/* Q-bit is present.  */
-#define TARGET_ARM_QBIT \
-  (TARGET_32BIT && arm_arch5e && (arm_arch_notm || arm_arch7))
-/* Saturation operation, e.g. SSAT.  */
-#define TARGET_ARM_SAT \
-  (TARGET_32BIT && arm_arch6 && (arm_arch_notm || arm_arch7))
-/* "DSP" multiply instructions, eg. SMULxy.  */
-#define TARGET_DSP_MULTIPLY \
-  (TARGET_32BIT && arm_arch5e && (arm_arch_notm || arm_arch7em))
-/* Integer SIMD instructions, and extend-accumulate instructions.  */
-#define TARGET_INT_SIMD \
-  (TARGET_32BIT && arm_arch6 && (arm_arch_notm || arm_arch7em))
-
-/* Should MOVW/MOVT be used in preference to a constant pool.  */
-#define TARGET_USE_MOVT \
-  (arm_arch_thumb2 \
-   && (arm_disable_literal_pool \
-       || (!optimize_size && !current_tune->prefer_constant_pool)))
-
-/* We could use unified syntax for arm mode, but for now we just use it
-   for Thumb-2.  */
-#define TARGET_UNIFIED_ASM TARGET_THUMB2
-
-/* Nonzero if this chip provides the DMB instruction.  */
-#define TARGET_HAVE_DMB		(arm_arch6m || arm_arch7)
-
-/* Nonzero if this chip implements a memory barrier via CP15.  */
-#define TARGET_HAVE_DMB_MCR	(arm_arch6 && ! TARGET_HAVE_DMB \
-				 && ! TARGET_THUMB1)
-
-/* Nonzero if this chip implements a memory barrier instruction.  */
-#define TARGET_HAVE_MEMORY_BARRIER (TARGET_HAVE_DMB || TARGET_HAVE_DMB_MCR)
-
-/* Nonzero if this chip supports ldrex and strex */
-#define TARGET_HAVE_LDREX	((arm_arch6 && TARGET_ARM) || arm_arch7)
-
-/* Nonzero if this chip supports ldrex{bh} and strex{bh}.  */
-#define TARGET_HAVE_LDREXBH	((arm_arch6k && TARGET_ARM) || arm_arch7)
-
-/* Nonzero if this chip supports ldrexd and strexd.  */
-#define TARGET_HAVE_LDREXD	(((arm_arch6k && TARGET_ARM) || arm_arch7) \
-				 && arm_arch_notm)
-
-/* Nonzero if this chip supports load-acquire and store-release.  */
-#define TARGET_HAVE_LDACQ	(TARGET_ARM_ARCH >= 8)
-
-/* Nonzero if integer division instructions supported.  */
-#define TARGET_IDIV		((TARGET_ARM && arm_arch_arm_hwdiv) \
-				 || (TARGET_THUMB2 && arm_arch_thumb_hwdiv))
-
-/* Should NEON be used for 64-bits bitops.  */
-#define TARGET_PREFER_NEON_64BITS (prefer_neon_for_64bits)
-
-/* True iff the full BPABI is being used.  If TARGET_BPABI is true,
-   then TARGET_AAPCS_BASED must be true -- but the converse does not
-   hold.  TARGET_BPABI implies the use of the BPABI runtime library,
-   etc., in addition to just the AAPCS calling conventions.  */
-#ifndef TARGET_BPABI
-#define TARGET_BPABI false
-#endif
-
-/* Support for a compile-time default CPU, et cetera.  The rules are:
-   --with-arch is ignored if -march or -mcpu are specified.
-   --with-cpu is ignored if -march or -mcpu are specified, and is overridden
-    by --with-arch.
-   --with-tune is ignored if -mtune or -mcpu are specified (but not affected
-     by -march).
-   --with-float is ignored if -mfloat-abi is specified.
-   --with-fpu is ignored if -mfpu is specified.
-   --with-abi is ignored if -mabi is specified.
-   --with-tls is ignored if -mtls-dialect is specified. */
-#define OPTION_DEFAULT_SPECS \
-  {"arch", "%{!march=*:%{!mcpu=*:-march=%(VALUE)}}" }, \
-  {"cpu", "%{!march=*:%{!mcpu=*:-mcpu=%(VALUE)}}" }, \
-  {"tune", "%{!mcpu=*:%{!mtune=*:-mtune=%(VALUE)}}" }, \
-  {"float", "%{!mfloat-abi=*:-mfloat-abi=%(VALUE)}" }, \
-  {"fpu", "%{!mfpu=*:-mfpu=%(VALUE)}"}, \
-  {"abi", "%{!mabi=*:-mabi=%(VALUE)}"}, \
-  {"mode", "%{!marm:%{!mthumb:-m%(VALUE)}}"}, \
-  {"tls", "%{!mtls-dialect=*:-mtls-dialect=%(VALUE)}"},
-
-/* Which floating point model to use.  */
-enum arm_fp_model
-{
-  ARM_FP_MODEL_UNKNOWN,
-  /* VFP floating point model.  */
-  ARM_FP_MODEL_VFP
-};
-
-enum vfp_reg_type
-{
-  VFP_NONE = 0,
-  VFP_REG_D16,
-  VFP_REG_D32,
-  VFP_REG_SINGLE
-};
-
-extern const struct arm_fpu_desc
-{
-  const char *name;
-  enum arm_fp_model model;
-  int rev;
-  enum vfp_reg_type regs;
-  int neon;
-  int fp16;
-  int crypto;
-} *arm_fpu_desc;
-
-/* Which floating point hardware to schedule for.  */
-extern int arm_fpu_attr;
-
-#ifndef TARGET_DEFAULT_FLOAT_ABI
-#define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_SOFT
-#endif
-
-#define LARGEST_EXPONENT_IS_NORMAL(bits) \
-    ((bits) == 16 && arm_fp16_format == ARM_FP16_FORMAT_ALTERNATIVE)
-
-#ifndef ARM_DEFAULT_ABI
-#define ARM_DEFAULT_ABI ARM_ABI_APCS
-#endif
-
-/* Map each of the micro-architecture variants to their corresponding
-   major architecture revision.  */
-
-enum base_architecture
-{
-  BASE_ARCH_0 = 0,
-  BASE_ARCH_2 = 2,
-  BASE_ARCH_3 = 3,
-  BASE_ARCH_3M = 3,
-  BASE_ARCH_4 = 4,
-  BASE_ARCH_4T = 4,
-  BASE_ARCH_5 = 5,
-  BASE_ARCH_5E = 5,
-  BASE_ARCH_5T = 5,
-  BASE_ARCH_5TE = 5,
-  BASE_ARCH_5TEJ = 5,
-  BASE_ARCH_6 = 6,
-  BASE_ARCH_6J = 6,
-  BASE_ARCH_6ZK = 6,
-  BASE_ARCH_6K = 6,
-  BASE_ARCH_6T2 = 6,
-  BASE_ARCH_6M = 6,
-  BASE_ARCH_6Z = 6,
-  BASE_ARCH_7 = 7,
-  BASE_ARCH_7A = 7,
-  BASE_ARCH_7R = 7,
-  BASE_ARCH_7M = 7,
-  BASE_ARCH_7EM = 7,
-  BASE_ARCH_8A = 8
-};
-
-/* The major revision number of the ARM Architecture implemented by the target.  */
-extern enum base_architecture arm_base_arch;
-
-/* Nonzero if this chip supports the ARM Architecture 3M extensions.  */
-extern int arm_arch3m;
-
-/* Nonzero if this chip supports the ARM Architecture 4 extensions.  */
-extern int arm_arch4;
-
-/* Nonzero if this chip supports the ARM Architecture 4T extensions.  */
-extern int arm_arch4t;
-
-/* Nonzero if this chip supports the ARM Architecture 5 extensions.  */
-extern int arm_arch5;
-
-/* Nonzero if this chip supports the ARM Architecture 5E extensions.  */
-extern int arm_arch5e;
-
-/* Nonzero if this chip supports the ARM Architecture 6 extensions.  */
-extern int arm_arch6;
-
-/* Nonzero if this chip supports the ARM Architecture 6k extensions.  */
-extern int arm_arch6k;
-
-/* Nonzero if instructions present in ARMv6-M can be used.  */
-extern int arm_arch6m;
-
-/* Nonzero if this chip supports the ARM Architecture 7 extensions.  */
-extern int arm_arch7;
-
-/* Nonzero if instructions not present in the 'M' profile can be used.  */
-extern int arm_arch_notm;
-
-/* Nonzero if instructions present in ARMv7E-M can be used.  */
-extern int arm_arch7em;
-
-/* Nonzero if this chip supports the ARM Architecture 8 extensions.  */
-extern int arm_arch8;
-
-/* Nonzero if this chip can benefit from load scheduling.  */
-extern int arm_ld_sched;
-
-/* Nonzero if generating Thumb code, either Thumb-1 or Thumb-2.  */
-extern int thumb_code;
-
-/* Nonzero if generating Thumb-1 code.  */
-extern int thumb1_code;
-
-/* Nonzero if this chip is a StrongARM.  */
-extern int arm_tune_strongarm;
-
-/* Nonzero if this chip supports Intel XScale with Wireless MMX technology.  */
-extern int arm_arch_iwmmxt;
-
-/* Nonzero if this chip supports Intel Wireless MMX2 technology.  */
-extern int arm_arch_iwmmxt2;
-
-/* Nonzero if this chip is an XScale.  */
-extern int arm_arch_xscale;
-
-/* Nonzero if tuning for XScale.  */
-extern int arm_tune_xscale;
-
-/* Nonzero if tuning for stores via the write buffer.  */
-extern int arm_tune_wbuf;
-
-/* Nonzero if tuning for Cortex-A9.  */
-extern int arm_tune_cortex_a9;
-
-/* Nonzero if we should define __THUMB_INTERWORK__ in the
-   preprocessor.
-   XXX This is a bit of a hack, it's intended to help work around
-   problems in GLD which doesn't understand that armv5t code is
-   interworking clean.  */
-extern int arm_cpp_interwork;
-
-/* Nonzero if chip supports Thumb 2.  */
-extern int arm_arch_thumb2;
-
-/* Nonzero if chip supports integer division instruction in ARM mode.  */
-extern int arm_arch_arm_hwdiv;
-
-/* Nonzero if chip supports integer division instruction in Thumb mode.  */
-extern int arm_arch_thumb_hwdiv;
-
-/* Nonzero if we should use Neon to handle 64-bits operations rather
-   than core registers.  */
-extern int prefer_neon_for_64bits;
-
-/* Nonzero if we shouldn't use literal pools.  */
-#ifndef USED_FOR_TARGET
-extern bool arm_disable_literal_pool;
-#endif
-
-/* Nonzero if chip supports the ARMv8 CRC instructions.  */
-extern int arm_arch_crc;
-
-#ifndef TARGET_DEFAULT
-#define TARGET_DEFAULT  (MASK_APCS_FRAME)
-#endif
-
-/* Nonzero if PIC code requires explicit qualifiers to generate
-   PLT and GOT relocs rather than the assembler doing so implicitly.
-   Subtargets can override these if required.  */
-#ifndef NEED_GOT_RELOC
-#define NEED_GOT_RELOC	0
-#endif
-#ifndef NEED_PLT_RELOC
-#define NEED_PLT_RELOC	0
-#endif
-
-#ifndef TARGET_DEFAULT_PIC_DATA_IS_TEXT_RELATIVE
-#define TARGET_DEFAULT_PIC_DATA_IS_TEXT_RELATIVE 1
-#endif
-
-/* Nonzero if we need to refer to the GOT with a PC-relative
-   offset.  In other words, generate
-
-   .word	_GLOBAL_OFFSET_TABLE_ - [. - (.Lxx + 8)]
-
-   rather than
-
-   .word	_GLOBAL_OFFSET_TABLE_ - (.Lxx + 8)
-
-   The default is true, which matches NetBSD.  Subtargets can
-   override this if required.  */
-#ifndef GOT_PCREL
-#define GOT_PCREL   1
-#endif
-
-/* Target machine storage Layout.  */
-
-
-/* Define this macro if it is advisable to hold scalars in registers
-   in a wider mode than that declared by the program.  In such cases,
-   the value is constrained to be within the bounds of the declared
-   type, but kept valid in the wider mode.  The signedness of the
-   extension may differ from that of the type.  */
-
-/* It is far faster to zero extend chars than to sign extend them */
-
-#define PROMOTE_MODE(MODE, UNSIGNEDP, TYPE)	\
-  if (GET_MODE_CLASS (MODE) == MODE_INT		\
-      && GET_MODE_SIZE (MODE) < 4)      	\
-    {						\
-      if (MODE == QImode)			\
-	UNSIGNEDP = 1;				\
-      else if (MODE == HImode)			\
-	UNSIGNEDP = 1;				\
-      (MODE) = SImode;				\
-    }
-
-/* Define this if most significant bit is lowest numbered
-   in instructions that operate on numbered bit-fields.  */
-#define BITS_BIG_ENDIAN  0
-
-/* Define this if most significant byte of a word is the lowest numbered.
-   Most ARM processors are run in little endian mode, so that is the default.
-   If you want to have it run-time selectable, change the definition in a
-   cover file to be TARGET_BIG_ENDIAN.  */
-#define BYTES_BIG_ENDIAN  (TARGET_BIG_END != 0)
-
-/* Define this if most significant word of a multiword number is the lowest
-   numbered.
-   This is always false, even when in big-endian mode.  */
-#define WORDS_BIG_ENDIAN  (BYTES_BIG_ENDIAN && ! TARGET_LITTLE_WORDS)
-
-#define UNITS_PER_WORD	4
-
-/* True if natural alignment is used for doubleword types.  */
-#define ARM_DOUBLEWORD_ALIGN	TARGET_AAPCS_BASED
-
-#define DOUBLEWORD_ALIGNMENT 64
-
-#define PARM_BOUNDARY  	32
-
-#define STACK_BOUNDARY  (ARM_DOUBLEWORD_ALIGN ? DOUBLEWORD_ALIGNMENT : 32)
-
-#define PREFERRED_STACK_BOUNDARY \
-    (arm_abi == ARM_ABI_ATPCS ? 64 : STACK_BOUNDARY)
-
-#define FUNCTION_BOUNDARY  ((TARGET_THUMB && optimize_size) ? 16 : 32)
-
-/* The lowest bit is used to indicate Thumb-mode functions, so the
-   vbit must go into the delta field of pointers to member
-   functions.  */
-#define TARGET_PTRMEMFUNC_VBIT_LOCATION ptrmemfunc_vbit_in_delta
-
-#define EMPTY_FIELD_BOUNDARY  32
-
-#define BIGGEST_ALIGNMENT (ARM_DOUBLEWORD_ALIGN ? DOUBLEWORD_ALIGNMENT : 32)
-
-#define MALLOC_ABI_ALIGNMENT  BIGGEST_ALIGNMENT
-
-/* XXX Blah -- this macro is used directly by libobjc.  Since it
-   supports no vector modes, cut out the complexity and fall back
-   on BIGGEST_FIELD_ALIGNMENT.  */
-#ifdef IN_TARGET_LIBS
-#define BIGGEST_FIELD_ALIGNMENT 64
-#endif
-
-/* Make strings word-aligned so strcpy from constants will be faster.  */
-#define CONSTANT_ALIGNMENT_FACTOR (TARGET_THUMB || ! arm_tune_xscale ? 1 : 2)
-
-#define CONSTANT_ALIGNMENT(EXP, ALIGN)				\
-   ((TREE_CODE (EXP) == STRING_CST				\
-     && !optimize_size						\
-     && (ALIGN) < BITS_PER_WORD * CONSTANT_ALIGNMENT_FACTOR)	\
-    ? BITS_PER_WORD * CONSTANT_ALIGNMENT_FACTOR : (ALIGN))
-
-/* Align definitions of arrays, unions and structures so that
-   initializations and copies can be made more efficient.  This is not
-   ABI-changing, so it only affects places where we can see the
-   definition. Increasing the alignment tends to introduce padding,
-   so don't do this when optimizing for size/conserving stack space. */
-#define ARM_EXPAND_ALIGNMENT(COND, EXP, ALIGN)				\
-  (((COND) && ((ALIGN) < BITS_PER_WORD)					\
-    && (TREE_CODE (EXP) == ARRAY_TYPE					\
-	|| TREE_CODE (EXP) == UNION_TYPE				\
-	|| TREE_CODE (EXP) == RECORD_TYPE)) ? BITS_PER_WORD : (ALIGN))
-
-/* Align global data. */
-#define DATA_ALIGNMENT(EXP, ALIGN)			\
-  ARM_EXPAND_ALIGNMENT(!optimize_size, EXP, ALIGN)
-
-/* Similarly, make sure that objects on the stack are sensibly aligned.  */
-#define LOCAL_ALIGNMENT(EXP, ALIGN)				\
-  ARM_EXPAND_ALIGNMENT(!flag_conserve_stack, EXP, ALIGN)
-
-/* Setting STRUCTURE_SIZE_BOUNDARY to 32 produces more efficient code, but the
-   value set in previous versions of this toolchain was 8, which produces more
-   compact structures.  The command line option -mstructure_size_boundary=<n>
-   can be used to change this value.  For compatibility with the ARM SDK
-   however the value should be left at 32.  ARM SDT Reference Manual (ARM DUI
-   0020D) page 2-20 says "Structures are aligned on word boundaries".
-   The AAPCS specifies a value of 8.  */
-#define STRUCTURE_SIZE_BOUNDARY arm_structure_size_boundary
-
-/* This is the value used to initialize arm_structure_size_boundary.  If a
-   particular arm target wants to change the default value it should change
-   the definition of this macro, not STRUCTURE_SIZE_BOUNDARY.  See netbsd.h
-   for an example of this.  */
-#ifndef DEFAULT_STRUCTURE_SIZE_BOUNDARY
-#define DEFAULT_STRUCTURE_SIZE_BOUNDARY 32
-#endif
-
-/* Nonzero if move instructions will actually fail to work
-   when given unaligned data.  */
-#define STRICT_ALIGNMENT 1
-
-/* wchar_t is unsigned under the AAPCS.  */
-#ifndef WCHAR_TYPE
-#define WCHAR_TYPE (TARGET_AAPCS_BASED ? "unsigned int" : "int")
-
-#define WCHAR_TYPE_SIZE BITS_PER_WORD
-#endif
-
-/* Sized for fixed-point types.  */
-
-#define SHORT_FRACT_TYPE_SIZE 8
-#define FRACT_TYPE_SIZE 16
-#define LONG_FRACT_TYPE_SIZE 32
-#define LONG_LONG_FRACT_TYPE_SIZE 64
-
-#define SHORT_ACCUM_TYPE_SIZE 16
-#define ACCUM_TYPE_SIZE 32
-#define LONG_ACCUM_TYPE_SIZE 64
-#define LONG_LONG_ACCUM_TYPE_SIZE 64
-
-#define MAX_FIXED_MODE_SIZE 64
-
-#ifndef SIZE_TYPE
-#define SIZE_TYPE (TARGET_AAPCS_BASED ? "unsigned int" : "long unsigned int")
-#endif
-
-#ifndef PTRDIFF_TYPE
-#define PTRDIFF_TYPE (TARGET_AAPCS_BASED ? "int" : "long int")
-#endif
-
-/* AAPCS requires that structure alignment is affected by bitfields.  */
-#ifndef PCC_BITFIELD_TYPE_MATTERS
-#define PCC_BITFIELD_TYPE_MATTERS TARGET_AAPCS_BASED
-#endif
-
-
-/* Standard register usage.  */
-
-/* Register allocation in ARM Procedure Call Standard
-   (S - saved over call).
-
-	r0	   *	argument word/integer result
-	r1-r3		argument word
-
-	r4-r8	     S	register variable
-	r9	     S	(rfp) register variable (real frame pointer)
-
-	r10  	   F S	(sl) stack limit (used by -mapcs-stack-check)
-	r11 	   F S	(fp) argument pointer
-	r12		(ip) temp workspace
-	r13  	   F S	(sp) lower end of current stack frame
-	r14		(lr) link address/workspace
-	r15	   F	(pc) program counter
-
-	cc		This is NOT a real register, but is used internally
-	                to represent things that use or set the condition
-			codes.
-	sfp             This isn't either.  It is used during rtl generation
-	                since the offset between the frame pointer and the
-			auto's isn't known until after register allocation.
-	afp		Nor this, we only need this because of non-local
-	                goto.  Without it fp appears to be used and the
-			elimination code won't get rid of sfp.  It tracks
-			fp exactly at all times.
-
-   *: See TARGET_CONDITIONAL_REGISTER_USAGE  */
-
-/*	s0-s15		VFP scratch (aka d0-d7).
-	s16-s31	      S	VFP variable (aka d8-d15).
-	vfpcc		Not a real register.  Represents the VFP condition
-			code flags.  */
-
-/* The stack backtrace structure is as follows:
-  fp points to here:  |  save code pointer  |      [fp]
-                      |  return link value  |      [fp, #-4]
-                      |  return sp value    |      [fp, #-8]
-                      |  return fp value    |      [fp, #-12]
-                     [|  saved r10 value    |]
-                     [|  saved r9 value     |]
-                     [|  saved r8 value     |]
-                     [|  saved r7 value     |]
-                     [|  saved r6 value     |]
-                     [|  saved r5 value     |]
-                     [|  saved r4 value     |]
-                     [|  saved r3 value     |]
-                     [|  saved r2 value     |]
-                     [|  saved r1 value     |]
-                     [|  saved r0 value     |]
-  r0-r3 are not normally saved in a C function.  */
-
-/* 1 for registers that have pervasive standard uses
-   and are not available for the register allocator.  */
-#define FIXED_REGISTERS 	\
-{				\
-  /* Core regs.  */		\
-  0,0,0,0,0,0,0,0,		\
-  0,0,0,0,0,1,0,1,		\
-  /* VFP regs.  */		\
-  1,1,1,1,1,1,1,1,		\
-  1,1,1,1,1,1,1,1,		\
-  1,1,1,1,1,1,1,1,		\
-  1,1,1,1,1,1,1,1,		\
-  1,1,1,1,1,1,1,1,		\
-  1,1,1,1,1,1,1,1,		\
-  1,1,1,1,1,1,1,1,		\
-  1,1,1,1,1,1,1,1,		\
-  /* IWMMXT regs.  */		\
-  1,1,1,1,1,1,1,1,		\
-  1,1,1,1,1,1,1,1,		\
-  1,1,1,1,			\
-  /* Specials.  */		\
-  1,1,1,1			\
-}
-
-/* 1 for registers not available across function calls.
-   These must include the FIXED_REGISTERS and also any
-   registers that can be used without being saved.
-   The latter must include the registers where values are returned
-   and the register where structure-value addresses are passed.
-   Aside from that, you can include as many other registers as you like.
-   The CC is not preserved over function calls on the ARM 6, so it is
-   easier to assume this for all.  SFP is preserved, since FP is.  */
-#define CALL_USED_REGISTERS	\
-{				\
-  /* Core regs.  */		\
-  1,1,1,1,0,0,0,0,		\
-  0,0,0,0,1,1,1,1,		\
-  /* VFP Regs.  */		\
-  1,1,1,1,1,1,1,1,		\
-  1,1,1,1,1,1,1,1,		\
-  1,1,1,1,1,1,1,1,		\
-  1,1,1,1,1,1,1,1,		\
-  1,1,1,1,1,1,1,1,		\
-  1,1,1,1,1,1,1,1,		\
-  1,1,1,1,1,1,1,1,		\
-  1,1,1,1,1,1,1,1,		\
-  /* IWMMXT regs.  */		\
-  1,1,1,1,1,1,1,1,		\
-  1,1,1,1,1,1,1,1,		\
-  1,1,1,1,			\
-  /* Specials.  */		\
-  1,1,1,1			\
-}
-
-#ifndef SUBTARGET_CONDITIONAL_REGISTER_USAGE
-#define SUBTARGET_CONDITIONAL_REGISTER_USAGE
-#endif
-
-/* These are a couple of extensions to the formats accepted
-   by asm_fprintf:
-     %@ prints out ASM_COMMENT_START
-     %r prints out REGISTER_PREFIX reg_names[arg]  */
-#define ASM_FPRINTF_EXTENSIONS(FILE, ARGS, P)		\
-  case '@':						\
-    fputs (ASM_COMMENT_START, FILE);			\
-    break;						\
-							\
-  case 'r':						\
-    fputs (REGISTER_PREFIX, FILE);			\
-    fputs (reg_names [va_arg (ARGS, int)], FILE);	\
-    break;
-
-/* Round X up to the nearest word.  */
-#define ROUND_UP_WORD(X) (((X) + 3) & ~3)
-
-/* Convert fron bytes to ints.  */
-#define ARM_NUM_INTS(X) (((X) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
-
-/* The number of (integer) registers required to hold a quantity of type MODE.
-   Also used for VFP registers.  */
-#define ARM_NUM_REGS(MODE)				\
-  ARM_NUM_INTS (GET_MODE_SIZE (MODE))
-
-/* The number of (integer) registers required to hold a quantity of TYPE MODE.  */
-#define ARM_NUM_REGS2(MODE, TYPE)                   \
-  ARM_NUM_INTS ((MODE) == BLKmode ? 		\
-  int_size_in_bytes (TYPE) : GET_MODE_SIZE (MODE))
-
-/* The number of (integer) argument register available.  */
-#define NUM_ARG_REGS		4
-
-/* And similarly for the VFP.  */
-#define NUM_VFP_ARG_REGS	16
-
-/* Return the register number of the N'th (integer) argument.  */
-#define ARG_REGISTER(N) 	(N - 1)
-
-/* Specify the registers used for certain standard purposes.
-   The values of these macros are register numbers.  */
-
-/* The number of the last argument register.  */
-#define LAST_ARG_REGNUM 	ARG_REGISTER (NUM_ARG_REGS)
-
-/* The numbers of the Thumb register ranges.  */
-#define FIRST_LO_REGNUM  	0
-#define LAST_LO_REGNUM  	7
-#define FIRST_HI_REGNUM		8
-#define LAST_HI_REGNUM		11
-
-/* Overridden by config/arm/bpabi.h.  */
-#ifndef ARM_UNWIND_INFO
-#define ARM_UNWIND_INFO  0
-#endif
-
-/* Use r0 and r1 to pass exception handling information.  */
-#define EH_RETURN_DATA_REGNO(N) (((N) < 2) ? N : INVALID_REGNUM)
-
-/* The register that holds the return address in exception handlers.  */
-#define ARM_EH_STACKADJ_REGNUM	2
-#define EH_RETURN_STACKADJ_RTX	gen_rtx_REG (SImode, ARM_EH_STACKADJ_REGNUM)
-
-#ifndef ARM_TARGET2_DWARF_FORMAT
-#define ARM_TARGET2_DWARF_FORMAT DW_EH_PE_pcrel
-#endif
-
-/* ttype entries (the only interesting data references used)
-   use TARGET2 relocations.  */
-#define ASM_PREFERRED_EH_DATA_FORMAT(code, data) \
-  (((code) == 0 && (data) == 1 && ARM_UNWIND_INFO) ? ARM_TARGET2_DWARF_FORMAT \
-			       : DW_EH_PE_absptr)
-
-/* The native (Norcroft) Pascal compiler for the ARM passes the static chain
-   as an invisible last argument (possible since varargs don't exist in
-   Pascal), so the following is not true.  */
-#define STATIC_CHAIN_REGNUM	12
-
-/* Define this to be where the real frame pointer is if it is not possible to
-   work out the offset between the frame pointer and the automatic variables
-   until after register allocation has taken place.  FRAME_POINTER_REGNUM
-   should point to a special register that we will make sure is eliminated.
-
-   For the Thumb we have another problem.  The TPCS defines the frame pointer
-   as r11, and GCC believes that it is always possible to use the frame pointer
-   as base register for addressing purposes.  (See comments in
-   find_reloads_address()).  But - the Thumb does not allow high registers,
-   including r11, to be used as base address registers.  Hence our problem.
-
-   The solution used here, and in the old thumb port is to use r7 instead of
-   r11 as the hard frame pointer and to have special code to generate
-   backtrace structures on the stack (if required to do so via a command line
-   option) using r11.  This is the only 'user visible' use of r11 as a frame
-   pointer.  */
-#define ARM_HARD_FRAME_POINTER_REGNUM	11
-#define THUMB_HARD_FRAME_POINTER_REGNUM	 7
-
-#define HARD_FRAME_POINTER_REGNUM		\
-  (TARGET_ARM					\
-   ? ARM_HARD_FRAME_POINTER_REGNUM		\
-   : THUMB_HARD_FRAME_POINTER_REGNUM)
-
-#define HARD_FRAME_POINTER_IS_FRAME_POINTER 0
-#define HARD_FRAME_POINTER_IS_ARG_POINTER 0
-
-#define FP_REGNUM	                HARD_FRAME_POINTER_REGNUM
-
-/* Register to use for pushing function arguments.  */
-#define STACK_POINTER_REGNUM	SP_REGNUM
-
-#define FIRST_IWMMXT_REGNUM	(LAST_HI_VFP_REGNUM + 1)
-#define LAST_IWMMXT_REGNUM	(FIRST_IWMMXT_REGNUM + 15)
-
-/* Need to sync with WCGR in iwmmxt.md.  */
-#define FIRST_IWMMXT_GR_REGNUM	(LAST_IWMMXT_REGNUM + 1)
-#define LAST_IWMMXT_GR_REGNUM	(FIRST_IWMMXT_GR_REGNUM + 3)
-
-#define IS_IWMMXT_REGNUM(REGNUM) \
-  (((REGNUM) >= FIRST_IWMMXT_REGNUM) && ((REGNUM) <= LAST_IWMMXT_REGNUM))
-#define IS_IWMMXT_GR_REGNUM(REGNUM) \
-  (((REGNUM) >= FIRST_IWMMXT_GR_REGNUM) && ((REGNUM) <= LAST_IWMMXT_GR_REGNUM))
-
-/* Base register for access to local variables of the function.  */
-#define FRAME_POINTER_REGNUM	102
-
-/* Base register for access to arguments of the function.  */
-#define ARG_POINTER_REGNUM	103
-
-#define FIRST_VFP_REGNUM	16
-#define D7_VFP_REGNUM		(FIRST_VFP_REGNUM + 15)
-#define LAST_VFP_REGNUM	\
-  (TARGET_VFPD32 ? LAST_HI_VFP_REGNUM : LAST_LO_VFP_REGNUM)
-
-#define IS_VFP_REGNUM(REGNUM) \
-  (((REGNUM) >= FIRST_VFP_REGNUM) && ((REGNUM) <= LAST_VFP_REGNUM))
-
-/* VFP registers are split into two types: those defined by VFP versions < 3
-   have D registers overlaid on consecutive pairs of S registers. VFP version 3
-   defines 16 new D registers (d16-d31) which, for simplicity and correctness
-   in various parts of the backend, we implement as "fake" single-precision
-   registers (which would be S32-S63, but cannot be used in that way).  The
-   following macros define these ranges of registers.  */
-#define LAST_LO_VFP_REGNUM	(FIRST_VFP_REGNUM + 31)
-#define FIRST_HI_VFP_REGNUM	(LAST_LO_VFP_REGNUM + 1)
-#define LAST_HI_VFP_REGNUM	(FIRST_HI_VFP_REGNUM + 31)
-
-#define VFP_REGNO_OK_FOR_SINGLE(REGNUM) \
-  ((REGNUM) <= LAST_LO_VFP_REGNUM)
-
-/* DFmode values are only valid in even register pairs.  */
-#define VFP_REGNO_OK_FOR_DOUBLE(REGNUM) \
-  ((((REGNUM) - FIRST_VFP_REGNUM) & 1) == 0)
-
-/* Neon Quad values must start at a multiple of four registers.  */
-#define NEON_REGNO_OK_FOR_QUAD(REGNUM) \
-  ((((REGNUM) - FIRST_VFP_REGNUM) & 3) == 0)
-
-/* Neon structures of vectors must be in even register pairs and there
-   must be enough registers available.  Because of various patterns
-   requiring quad registers, we require them to start at a multiple of
-   four.  */
-#define NEON_REGNO_OK_FOR_NREGS(REGNUM, N) \
-  ((((REGNUM) - FIRST_VFP_REGNUM) & 3) == 0 \
-   && (LAST_VFP_REGNUM - (REGNUM) >= 2 * (N) - 1))
-
-/* The number of hard registers is 16 ARM + 1 CC + 1 SFP + 1 AFP.  */
-/* Intel Wireless MMX Technology registers add 16 + 4 more.  */
-/* VFP (VFP3) adds 32 (64) + 1 VFPCC.  */
-#define FIRST_PSEUDO_REGISTER   104
-
-#define DBX_REGISTER_NUMBER(REGNO) arm_dbx_register_number (REGNO)
-
-/* Value should be nonzero if functions must have frame pointers.
-   Zero means the frame pointer need not be set up (and parms may be accessed
-   via the stack pointer) in functions that seem suitable.
-   If we have to have a frame pointer we might as well make use of it.
-   APCS says that the frame pointer does not need to be pushed in leaf
-   functions, or simple tail call functions.  */
-
-#ifndef SUBTARGET_FRAME_POINTER_REQUIRED
-#define SUBTARGET_FRAME_POINTER_REQUIRED 0
-#endif
-
-/* Return number of consecutive hard regs needed starting at reg REGNO
-   to hold something of mode MODE.
-   This is ordinarily the length in words of a value of mode MODE
-   but can be less for certain modes in special long registers.
-
-   On the ARM core regs are UNITS_PER_WORD bits wide.  */
-#define HARD_REGNO_NREGS(REGNO, MODE)  	\
-  ((TARGET_32BIT			\
-    && REGNO > PC_REGNUM		\
-    && REGNO != FRAME_POINTER_REGNUM	\
-    && REGNO != ARG_POINTER_REGNUM)	\
-    && !IS_VFP_REGNUM (REGNO)		\
-   ? 1 : ARM_NUM_REGS (MODE))
-
-/* Return true if REGNO is suitable for holding a quantity of type MODE.  */
-#define HARD_REGNO_MODE_OK(REGNO, MODE)					\
-  arm_hard_regno_mode_ok ((REGNO), (MODE))
-
-#define MODES_TIEABLE_P(MODE1, MODE2) arm_modes_tieable_p (MODE1, MODE2)
-
-#define VALID_IWMMXT_REG_MODE(MODE) \
- (arm_vector_mode_supported_p (MODE) || (MODE) == DImode)
-
-/* Modes valid for Neon D registers.  */
-#define VALID_NEON_DREG_MODE(MODE) \
-  ((MODE) == V2SImode || (MODE) == V4HImode || (MODE) == V8QImode \
-   || (MODE) == V4HFmode || (MODE) == V2SFmode || (MODE) == DImode)
-
-/* Modes valid for Neon Q registers.  */
-#define VALID_NEON_QREG_MODE(MODE) \
-  ((MODE) == V4SImode || (MODE) == V8HImode || (MODE) == V16QImode \
-   || (MODE) == V4SFmode || (MODE) == V2DImode)
-
-/* Structure modes valid for Neon registers.  */
-#define VALID_NEON_STRUCT_MODE(MODE) \
-  ((MODE) == TImode || (MODE) == EImode || (MODE) == OImode \
-   || (MODE) == CImode || (MODE) == XImode)
-
-/* The register numbers in sequence, for passing to arm_gen_load_multiple.  */
-extern int arm_regs_in_sequence[];
-
-/* The order in which register should be allocated.  It is good to use ip
-   since no saving is required (though calls clobber it) and it never contains
-   function parameters.  It is quite good to use lr since other calls may
-   clobber it anyway.  Allocate r0 through r3 in reverse order since r3 is
-   least likely to contain a function parameter; in addition results are
-   returned in r0.
-   For VFP/VFPv3, allocate D16-D31 first, then caller-saved registers (D0-D7),
-   then D8-D15.  The reason for doing this is to attempt to reduce register
-   pressure when both single- and double-precision registers are used in a
-   function.  */
-
-#define VREG(X)  (FIRST_VFP_REGNUM + (X))
-#define WREG(X)  (FIRST_IWMMXT_REGNUM + (X))
-#define WGREG(X) (FIRST_IWMMXT_GR_REGNUM + (X))
-
-#define REG_ALLOC_ORDER				\
-{						\
-  /* General registers.  */			\
-  3,  2,  1,  0,  12, 14,  4,  5,		\
-  6,  7,  8,  9,  10, 11,			\
-  /* High VFP registers.  */			\
-  VREG(32), VREG(33), VREG(34), VREG(35),	\
-  VREG(36), VREG(37), VREG(38), VREG(39),	\
-  VREG(40), VREG(41), VREG(42), VREG(43),	\
-  VREG(44), VREG(45), VREG(46), VREG(47),	\
-  VREG(48), VREG(49), VREG(50), VREG(51),	\
-  VREG(52), VREG(53), VREG(54), VREG(55),	\
-  VREG(56), VREG(57), VREG(58), VREG(59),	\
-  VREG(60), VREG(61), VREG(62), VREG(63),	\
-  /* VFP argument registers.  */		\
-  VREG(15), VREG(14), VREG(13), VREG(12),	\
-  VREG(11), VREG(10), VREG(9),  VREG(8),	\
-  VREG(7),  VREG(6),  VREG(5),  VREG(4),	\
-  VREG(3),  VREG(2),  VREG(1),  VREG(0),	\
-  /* VFP call-saved registers.  */		\
-  VREG(16), VREG(17), VREG(18), VREG(19),	\
-  VREG(20), VREG(21), VREG(22), VREG(23),	\
-  VREG(24), VREG(25), VREG(26), VREG(27),	\
-  VREG(28), VREG(29), VREG(30), VREG(31),	\
-  /* IWMMX registers.  */			\
-  WREG(0),  WREG(1),  WREG(2),  WREG(3),	\
-  WREG(4),  WREG(5),  WREG(6),  WREG(7),	\
-  WREG(8),  WREG(9),  WREG(10), WREG(11),	\
-  WREG(12), WREG(13), WREG(14), WREG(15),	\
-  WGREG(0), WGREG(1), WGREG(2), WGREG(3),	\
-  /* Registers not for general use.  */		\
-  CC_REGNUM, VFPCC_REGNUM,			\
-  FRAME_POINTER_REGNUM, ARG_POINTER_REGNUM,	\
-  SP_REGNUM, PC_REGNUM 				\
-}
-
-/* Use different register alloc ordering for Thumb.  */
-#define ADJUST_REG_ALLOC_ORDER arm_order_regs_for_local_alloc ()
-
-/* Tell IRA to use the order we define rather than messing it up with its
-   own cost calculations.  */
-#define HONOR_REG_ALLOC_ORDER
-
-/* Interrupt functions can only use registers that have already been
-   saved by the prologue, even if they would normally be
-   call-clobbered.  */
-#define HARD_REGNO_RENAME_OK(SRC, DST)					\
-	(! IS_INTERRUPT (cfun->machine->func_type) ||			\
-	 df_regs_ever_live_p (DST))
-
-/* Register and constant classes.  */
-
-/* Register classes.  */
-enum reg_class
-{
-  NO_REGS,
-  LO_REGS,
-  STACK_REG,
-  BASE_REGS,
-  HI_REGS,
-  CALLER_SAVE_REGS,
-  GENERAL_REGS,
-  CORE_REGS,
-  VFP_D0_D7_REGS,
-  VFP_LO_REGS,
-  VFP_HI_REGS,
-  VFP_REGS,
-  IWMMXT_REGS,
-  IWMMXT_GR_REGS,
-  CC_REG,
-  VFPCC_REG,
-  SFP_REG,
-  AFP_REG,
-  ALL_REGS,
-  LIM_REG_CLASSES
-};
-
-#define N_REG_CLASSES  (int) LIM_REG_CLASSES
-
-/* Give names of register classes as strings for dump file.  */
-#define REG_CLASS_NAMES  \
-{			\
-  "NO_REGS",		\
-  "LO_REGS",		\
-  "STACK_REG",		\
-  "BASE_REGS",		\
-  "HI_REGS",		\
-  "CALLER_SAVE_REGS",	\
-  "GENERAL_REGS",	\
-  "CORE_REGS",		\
-  "VFP_D0_D7_REGS",	\
-  "VFP_LO_REGS",	\
-  "VFP_HI_REGS",	\
-  "VFP_REGS",		\
-  "IWMMXT_REGS",	\
-  "IWMMXT_GR_REGS",	\
-  "CC_REG",		\
-  "VFPCC_REG",		\
-  "SFP_REG",		\
-  "AFP_REG",		\
-  "ALL_REGS"		\
-}
-
-/* Define which registers fit in which classes.
-   This is an initializer for a vector of HARD_REG_SET
-   of length N_REG_CLASSES.  */
-#define REG_CLASS_CONTENTS						\
-{									\
-  { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, /* NO_REGS  */	\
-  { 0x000000FF, 0x00000000, 0x00000000, 0x00000000 }, /* LO_REGS */	\
-  { 0x00002000, 0x00000000, 0x00000000, 0x00000000 }, /* STACK_REG */	\
-  { 0x000020FF, 0x00000000, 0x00000000, 0x00000000 }, /* BASE_REGS */	\
-  { 0x00005F00, 0x00000000, 0x00000000, 0x00000000 }, /* HI_REGS */	\
-  { 0x0000100F, 0x00000000, 0x00000000, 0x00000000 }, /* CALLER_SAVE_REGS */ \
-  { 0x00005FFF, 0x00000000, 0x00000000, 0x00000000 }, /* GENERAL_REGS */ \
-  { 0x00007FFF, 0x00000000, 0x00000000, 0x00000000 }, /* CORE_REGS */	\
-  { 0xFFFF0000, 0x00000000, 0x00000000, 0x00000000 }, /* VFP_D0_D7_REGS  */ \
-  { 0xFFFF0000, 0x0000FFFF, 0x00000000, 0x00000000 }, /* VFP_LO_REGS  */ \
-  { 0x00000000, 0xFFFF0000, 0x0000FFFF, 0x00000000 }, /* VFP_HI_REGS  */ \
-  { 0xFFFF0000, 0xFFFFFFFF, 0x0000FFFF, 0x00000000 }, /* VFP_REGS  */	\
-  { 0x00000000, 0x00000000, 0xFFFF0000, 0x00000000 }, /* IWMMXT_REGS */	\
-  { 0x00000000, 0x00000000, 0x00000000, 0x0000000F }, /* IWMMXT_GR_REGS */ \
-  { 0x00000000, 0x00000000, 0x00000000, 0x00000010 }, /* CC_REG */	\
-  { 0x00000000, 0x00000000, 0x00000000, 0x00000020 }, /* VFPCC_REG */	\
-  { 0x00000000, 0x00000000, 0x00000000, 0x00000040 }, /* SFP_REG */	\
-  { 0x00000000, 0x00000000, 0x00000000, 0x00000080 }, /* AFP_REG */	\
-  { 0xFFFF7FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F }  /* ALL_REGS */	\
-}
-
-/* Any of the VFP register classes.  */
-#define IS_VFP_CLASS(X) \
-  ((X) == VFP_D0_D7_REGS || (X) == VFP_LO_REGS \
-   || (X) == VFP_HI_REGS || (X) == VFP_REGS)
-
-/* The same information, inverted:
-   Return the class number of the smallest class containing
-   reg number REGNO.  This could be a conditional expression
-   or could index an array.  */
-#define REGNO_REG_CLASS(REGNO)  arm_regno_class (REGNO)
-
-/* In VFPv1, VFP registers could only be accessed in the mode they
-   were set, so subregs would be invalid there.  However, we don't
-   support VFPv1 at the moment, and the restriction was lifted in
-   VFPv2.
-   In big-endian mode, modes greater than word size (i.e. DFmode) are stored in
-   VFP registers in little-endian order.  We can't describe that accurately to
-   GCC, so avoid taking subregs of such values.
-   The only exception is going from a 128-bit to a 64-bit type.  In that case
-   the data layout happens to be consistent for big-endian, so we explicitly allow
-   that case.  */
-#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS)		\
-  (TARGET_VFP && TARGET_BIG_END					\
-   && !(GET_MODE_SIZE (FROM) == 16 && GET_MODE_SIZE (TO) == 8)	\
-   && (GET_MODE_SIZE (FROM) > UNITS_PER_WORD			\
-       || GET_MODE_SIZE (TO) > UNITS_PER_WORD)			\
-   && reg_classes_intersect_p (VFP_REGS, (CLASS)))
-
-/* The class value for index registers, and the one for base regs.  */
-#define INDEX_REG_CLASS  (TARGET_THUMB1 ? LO_REGS : GENERAL_REGS)
-#define BASE_REG_CLASS   (TARGET_THUMB1 ? LO_REGS : CORE_REGS)
-
-/* For the Thumb the high registers cannot be used as base registers
-   when addressing quantities in QI or HI mode; if we don't know the
-   mode, then we must be conservative.  */
-#define MODE_BASE_REG_CLASS(MODE)					\
-  (arm_lra_flag								\
-   ? (TARGET_32BIT ? CORE_REGS						\
-      : GET_MODE_SIZE (MODE) >= 4 ? BASE_REGS				\
-      : LO_REGS)							\
-   : ((TARGET_ARM || (TARGET_THUMB2 && !optimize_size)) ? CORE_REGS	\
-      : ((MODE) == SImode) ? BASE_REGS					\
-      : LO_REGS))
-
-/* For Thumb we can not support SP+reg addressing, so we return LO_REGS
-   instead of BASE_REGS.  */
-#define MODE_BASE_REG_REG_CLASS(MODE) BASE_REG_CLASS
-
-/* When this hook returns true for MODE, the compiler allows
-   registers explicitly used in the rtl to be used as spill registers
-   but prevents the compiler from extending the lifetime of these
-   registers.  */
-#define TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P \
-  arm_small_register_classes_for_mode_p 
-
-/* Must leave BASE_REGS reloads alone */
-#define THUMB_SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, X)		\
-  (lra_in_progress ? NO_REGS						\
-   : ((CLASS) != LO_REGS && (CLASS) != BASE_REGS			\
-      ? ((true_regnum (X) == -1 ? LO_REGS				\
-         : (true_regnum (X) + HARD_REGNO_NREGS (0, MODE) > 8) ? LO_REGS	\
-         : NO_REGS)) 							\
-      : NO_REGS))
-
-#define THUMB_SECONDARY_OUTPUT_RELOAD_CLASS(CLASS, MODE, X)		\
-  (lra_in_progress ? NO_REGS						\
-   : (CLASS) != LO_REGS && (CLASS) != BASE_REGS				\
-      ? ((true_regnum (X) == -1 ? LO_REGS				\
-         : (true_regnum (X) + HARD_REGNO_NREGS (0, MODE) > 8) ? LO_REGS	\
-         : NO_REGS)) 							\
-      : NO_REGS)
-
-/* Return the register class of a scratch register needed to copy IN into
-   or out of a register in CLASS in MODE.  If it can be done directly,
-   NO_REGS is returned.  */
-#define SECONDARY_OUTPUT_RELOAD_CLASS(CLASS, MODE, X)		\
-  /* Restrict which direct reloads are allowed for VFP/iWMMXt regs.  */ \
-  ((TARGET_VFP && TARGET_HARD_FLOAT				\
-    && IS_VFP_CLASS (CLASS))					\
-   ? coproc_secondary_reload_class (MODE, X, FALSE)		\
-   : (TARGET_IWMMXT && (CLASS) == IWMMXT_REGS)			\
-   ? coproc_secondary_reload_class (MODE, X, TRUE)		\
-   : TARGET_32BIT						\
-   ? (((MODE) == HImode && ! arm_arch4 && true_regnum (X) == -1) \
-    ? GENERAL_REGS : NO_REGS)					\
-   : THUMB_SECONDARY_OUTPUT_RELOAD_CLASS (CLASS, MODE, X))
-
-/* If we need to load shorts byte-at-a-time, then we need a scratch.  */
-#define SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, X)		\
-  /* Restrict which direct reloads are allowed for VFP/iWMMXt regs.  */ \
-  ((TARGET_VFP && TARGET_HARD_FLOAT				\
-    && IS_VFP_CLASS (CLASS))					\
-    ? coproc_secondary_reload_class (MODE, X, FALSE) :		\
-    (TARGET_IWMMXT && (CLASS) == IWMMXT_REGS) ?			\
-    coproc_secondary_reload_class (MODE, X, TRUE) :		\
-   (TARGET_32BIT ?						\
-    (((CLASS) == IWMMXT_REGS || (CLASS) == IWMMXT_GR_REGS)	\
-     && CONSTANT_P (X))						\
-    ? GENERAL_REGS :						\
-    (((MODE) == HImode && ! arm_arch4				\
-      && (MEM_P (X)					\
-	  || ((REG_P (X) || GET_CODE (X) == SUBREG)	\
-	      && true_regnum (X) == -1)))			\
-     ? GENERAL_REGS : NO_REGS)					\
-    : THUMB_SECONDARY_INPUT_RELOAD_CLASS (CLASS, MODE, X)))
-
-/* Try a machine-dependent way of reloading an illegitimate address
-   operand.  If we find one, push the reload and jump to WIN.  This
-   macro is used in only one place: `find_reloads_address' in reload.c.
-
-   For the ARM, we wish to handle large displacements off a base
-   register by splitting the addend across a MOV and the mem insn.
-   This can cut the number of reloads needed.  */
-#define ARM_LEGITIMIZE_RELOAD_ADDRESS(X, MODE, OPNUM, TYPE, IND, WIN)	   \
-  do									   \
-    {									   \
-      if (arm_legitimize_reload_address (&X, MODE, OPNUM, TYPE, IND))	   \
-	goto WIN;							   \
-    }									   \
-  while (0)
-
-/* XXX If an HImode FP+large_offset address is converted to an HImode
-   SP+large_offset address, then reload won't know how to fix it.  It sees
-   only that SP isn't valid for HImode, and so reloads the SP into an index
-   register, but the resulting address is still invalid because the offset
-   is too big.  We fix it here instead by reloading the entire address.  */
-/* We could probably achieve better results by defining PROMOTE_MODE to help
-   cope with the variances between the Thumb's signed and unsigned byte and
-   halfword load instructions.  */
-/* ??? This should be safe for thumb2, but we may be able to do better.  */
-#define THUMB_LEGITIMIZE_RELOAD_ADDRESS(X, MODE, OPNUM, TYPE, IND_L, WIN)     \
-do {									      \
-  rtx new_x = thumb_legitimize_reload_address (&X, MODE, OPNUM, TYPE, IND_L); \
-  if (new_x)								      \
-    {									      \
-      X = new_x;							      \
-      goto WIN;								      \
-    }									      \
-} while (0)
-
-#define LEGITIMIZE_RELOAD_ADDRESS(X, MODE, OPNUM, TYPE, IND_LEVELS, WIN)   \
-  if (TARGET_ARM)							   \
-    ARM_LEGITIMIZE_RELOAD_ADDRESS (X, MODE, OPNUM, TYPE, IND_LEVELS, WIN); \
-  else									   \
-    THUMB_LEGITIMIZE_RELOAD_ADDRESS (X, MODE, OPNUM, TYPE, IND_LEVELS, WIN)
-
-/* Return the maximum number of consecutive registers
-   needed to represent mode MODE in a register of class CLASS.
-   ARM regs are UNITS_PER_WORD bits.  
-   FIXME: Is this true for iWMMX?  */
-#define CLASS_MAX_NREGS(CLASS, MODE)  \
-  (ARM_NUM_REGS (MODE))
-
-/* If defined, gives a class of registers that cannot be used as the
-   operand of a SUBREG that changes the mode of the object illegally.  */
-
-/* Stack layout; function entry, exit and calling.  */
-
-/* Define this if pushing a word on the stack
-   makes the stack pointer a smaller address.  */
-#define STACK_GROWS_DOWNWARD  1
-
-/* Define this to nonzero if the nominal address of the stack frame
-   is at the high-address end of the local variables;
-   that is, each additional local variable allocated
-   goes at a more negative offset in the frame.  */
-#define FRAME_GROWS_DOWNWARD 1
-
-/* The amount of scratch space needed by _interwork_{r7,r11}_call_via_rN().
-   When present, it is one word in size, and sits at the top of the frame,
-   between the soft frame pointer and either r7 or r11.
-
-   We only need _interwork_rM_call_via_rN() for -mcaller-super-interworking,
-   and only then if some outgoing arguments are passed on the stack.  It would
-   be tempting to also check whether the stack arguments are passed by indirect
-   calls, but there seems to be no reason in principle why a post-reload pass
-   couldn't convert a direct call into an indirect one.  */
-#define CALLER_INTERWORKING_SLOT_SIZE			\
-  (TARGET_CALLER_INTERWORKING				\
-   && crtl->outgoing_args_size != 0		\
-   ? UNITS_PER_WORD : 0)
-
-/* Offset within stack frame to start allocating local variables at.
-   If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
-   first local allocated.  Otherwise, it is the offset to the BEGINNING
-   of the first local allocated.  */
-#define STARTING_FRAME_OFFSET  0
-
-/* If we generate an insn to push BYTES bytes,
-   this says how many the stack pointer really advances by.  */
-/* The push insns do not do this rounding implicitly.
-   So don't define this.  */
-/* #define PUSH_ROUNDING(NPUSHED)  ROUND_UP_WORD (NPUSHED) */
-
-/* Define this if the maximum size of all the outgoing args is to be
-   accumulated and pushed during the prologue.  The amount can be
-   found in the variable crtl->outgoing_args_size.  */
-#define ACCUMULATE_OUTGOING_ARGS 1
-
-/* Offset of first parameter from the argument pointer register value.  */
-#define FIRST_PARM_OFFSET(FNDECL)  (TARGET_ARM ? 4 : 0)
-
-/* Amount of memory needed for an untyped call to save all possible return
-   registers.  */
-#define APPLY_RESULT_SIZE arm_apply_result_size()
-
-/* Define DEFAULT_PCC_STRUCT_RETURN to 1 if all structure and union return
-   values must be in memory.  On the ARM, they need only do so if larger
-   than a word, or if they contain elements offset from zero in the struct.  */
-#define DEFAULT_PCC_STRUCT_RETURN 0
-
-/* These bits describe the different types of function supported
-   by the ARM backend.  They are exclusive.  i.e. a function cannot be both a
-   normal function and an interworked function, for example.  Knowing the
-   type of a function is important for determining its prologue and
-   epilogue sequences.
-   Note value 7 is currently unassigned.  Also note that the interrupt
-   function types all have bit 2 set, so that they can be tested for easily.
-   Note that 0 is deliberately chosen for ARM_FT_UNKNOWN so that when the
-   machine_function structure is initialized (to zero) func_type will
-   default to unknown.  This will force the first use of arm_current_func_type
-   to call arm_compute_func_type.  */
-#define ARM_FT_UNKNOWN		 0 /* Type has not yet been determined.  */
-#define ARM_FT_NORMAL		 1 /* Your normal, straightforward function.  */
-#define ARM_FT_INTERWORKED	 2 /* A function that supports interworking.  */
-#define ARM_FT_ISR		 4 /* An interrupt service routine.  */
-#define ARM_FT_FIQ		 5 /* A fast interrupt service routine.  */
-#define ARM_FT_EXCEPTION	 6 /* An ARM exception handler (subcase of ISR).  */
-
-#define ARM_FT_TYPE_MASK	((1 << 3) - 1)
-
-/* In addition functions can have several type modifiers,
-   outlined by these bit masks:  */
-#define ARM_FT_INTERRUPT	(1 << 2) /* Note overlap with FT_ISR and above.  */
-#define ARM_FT_NAKED		(1 << 3) /* No prologue or epilogue.  */
-#define ARM_FT_VOLATILE		(1 << 4) /* Does not return.  */
-#define ARM_FT_NESTED		(1 << 5) /* Embedded inside another func.  */
-#define ARM_FT_STACKALIGN	(1 << 6) /* Called with misaligned stack.  */
-
-/* Some macros to test these flags.  */
-#define ARM_FUNC_TYPE(t)	(t & ARM_FT_TYPE_MASK)
-#define IS_INTERRUPT(t)		(t & ARM_FT_INTERRUPT)
-#define IS_VOLATILE(t)     	(t & ARM_FT_VOLATILE)
-#define IS_NAKED(t)        	(t & ARM_FT_NAKED)
-#define IS_NESTED(t)       	(t & ARM_FT_NESTED)
-#define IS_STACKALIGN(t)       	(t & ARM_FT_STACKALIGN)
-
-
-/* Structure used to hold the function stack frame layout.  Offsets are
-   relative to the stack pointer on function entry.  Positive offsets are
-   in the direction of stack growth.
-   Only soft_frame is used in thumb mode.  */
-
-typedef struct GTY(()) arm_stack_offsets
-{
-  int saved_args;	/* ARG_POINTER_REGNUM.  */
-  int frame;		/* ARM_HARD_FRAME_POINTER_REGNUM.  */
-  int saved_regs;
-  int soft_frame;	/* FRAME_POINTER_REGNUM.  */
-  int locals_base;	/* THUMB_HARD_FRAME_POINTER_REGNUM.  */
-  int outgoing_args;	/* STACK_POINTER_REGNUM.  */
-  unsigned int saved_regs_mask;
-}
-arm_stack_offsets;
-
-#ifndef GENERATOR_FILE
-/* A C structure for machine-specific, per-function data.
-   This is added to the cfun structure.  */
-typedef struct GTY(()) machine_function
-{
-  /* Additional stack adjustment in __builtin_eh_throw.  */
-  rtx eh_epilogue_sp_ofs;
-  /* Records if LR has to be saved for far jumps.  */
-  int far_jump_used;
-  /* Records if ARG_POINTER was ever live.  */
-  int arg_pointer_live;
-  /* Records if the save of LR has been eliminated.  */
-  int lr_save_eliminated;
-  /* The size of the stack frame.  Only valid after reload.  */
-  arm_stack_offsets stack_offsets;
-  /* Records the type of the current function.  */
-  unsigned long func_type;
-  /* Record if the function has a variable argument list.  */
-  int uses_anonymous_args;
-  /* Records if sibcalls are blocked because an argument
-     register is needed to preserve stack alignment.  */
-  int sibcall_blocked;
-  /* The PIC register for this function.  This might be a pseudo.  */
-  rtx pic_reg;
-  /* Labels for per-function Thumb call-via stubs.  One per potential calling
-     register.  We can never call via LR or PC.  We can call via SP if a
-     trampoline happens to be on the top of the stack.  */
-  rtx call_via[14];
-  /* Set to 1 when a return insn is output, this means that the epilogue
-     is not needed.  */
-  int return_used_this_function;
-  /* When outputting Thumb-1 code, record the last insn that provides
-     information about condition codes, and the comparison operands.  */
-  rtx thumb1_cc_insn;
-  rtx thumb1_cc_op0;
-  rtx thumb1_cc_op1;
-  /* Also record the CC mode that is supported.  */
-  enum machine_mode thumb1_cc_mode;
-}
-machine_function;
-#endif
-
-/* As in the machine_function, a global set of call-via labels, for code 
-   that is in text_section.  */
-extern GTY(()) rtx thumb_call_via_label[14];
-
-/* The number of potential ways of assigning to a co-processor.  */
-#define ARM_NUM_COPROC_SLOTS 1
-
-/* Enumeration of procedure calling standard variants.  We don't really 
-   support all of these yet.  */
-enum arm_pcs
-{
-  ARM_PCS_AAPCS,	/* Base standard AAPCS.  */
-  ARM_PCS_AAPCS_VFP,	/* Use VFP registers for floating point values.  */
-  ARM_PCS_AAPCS_IWMMXT, /* Use iWMMXT registers for vectors.  */
-  /* This must be the last AAPCS variant.  */
-  ARM_PCS_AAPCS_LOCAL,	/* Private call within this compilation unit.  */
-  ARM_PCS_ATPCS,	/* ATPCS.  */
-  ARM_PCS_APCS,		/* APCS (legacy Linux etc).  */
-  ARM_PCS_UNKNOWN
-};
-
-/* Default procedure calling standard of current compilation unit. */
-extern enum arm_pcs arm_pcs_default;
-
-/* A C type for declaring a variable that is used as the first argument of
-   `FUNCTION_ARG' and other related values.  */
-typedef struct
-{
-  /* This is the number of registers of arguments scanned so far.  */
-  int nregs;
-  /* This is the number of iWMMXt register arguments scanned so far.  */
-  int iwmmxt_nregs;
-  int named_count;
-  int nargs;
-  /* Which procedure call variant to use for this call.  */
-  enum arm_pcs pcs_variant;
-
-  /* AAPCS related state tracking.  */
-  int aapcs_arg_processed;  /* No need to lay out this argument again.  */
-  int aapcs_cprc_slot;      /* Index of co-processor rules to handle
-			       this argument, or -1 if using core
-			       registers.  */
-  int aapcs_ncrn;
-  int aapcs_next_ncrn;
-  rtx aapcs_reg;	    /* Register assigned to this argument.  */
-  int aapcs_partial;	    /* How many bytes are passed in regs (if
-			       split between core regs and stack.
-			       Zero otherwise.  */
-  int aapcs_cprc_failed[ARM_NUM_COPROC_SLOTS];
-  int can_split;	    /* Argument can be split between core regs
-			       and the stack.  */
-  /* Private data for tracking VFP register allocation */
-  unsigned aapcs_vfp_regs_free;
-  unsigned aapcs_vfp_reg_alloc;
-  int aapcs_vfp_rcount;
-  MACHMODE aapcs_vfp_rmode;
-} CUMULATIVE_ARGS;
-
-#define FUNCTION_ARG_PADDING(MODE, TYPE) \
-  (arm_pad_arg_upward (MODE, TYPE) ? upward : downward)
-
-#define BLOCK_REG_PADDING(MODE, TYPE, FIRST) \
-  (arm_pad_reg_upward (MODE, TYPE, FIRST) ? upward : downward)
-
-/* For AAPCS, padding should never be below the argument. For other ABIs,
- * mimic the default.  */
-#define PAD_VARARGS_DOWN \
-  ((TARGET_AAPCS_BASED) ? 0 : BYTES_BIG_ENDIAN)
-
-/* Initialize a variable CUM of type CUMULATIVE_ARGS
-   for a call to a function whose data type is FNTYPE.
-   For a library call, FNTYPE is 0.
-   On the ARM, the offset starts at 0.  */
-#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \
-  arm_init_cumulative_args (&(CUM), (FNTYPE), (LIBNAME), (FNDECL))
-
-/* 1 if N is a possible register number for function argument passing.
-   On the ARM, r0-r3 are used to pass args.  */
-#define FUNCTION_ARG_REGNO_P(REGNO)					\
-   (IN_RANGE ((REGNO), 0, 3)						\
-    || (TARGET_AAPCS_BASED && TARGET_VFP && TARGET_HARD_FLOAT		\
-	&& IN_RANGE ((REGNO), FIRST_VFP_REGNUM, FIRST_VFP_REGNUM + 15))	\
-    || (TARGET_IWMMXT_ABI						\
-	&& IN_RANGE ((REGNO), FIRST_IWMMXT_REGNUM, FIRST_IWMMXT_REGNUM + 9)))
-
-
-/* If your target environment doesn't prefix user functions with an
-   underscore, you may wish to re-define this to prevent any conflicts.  */
-#ifndef ARM_MCOUNT_NAME
-#define ARM_MCOUNT_NAME "*mcount"
-#endif
-
-/* Call the function profiler with a given profile label.  The Acorn
-   compiler puts this BEFORE the prolog but gcc puts it afterwards.
-   On the ARM the full profile code will look like:
-	.data
-	LP1
-		.word	0
-	.text
-		mov	ip, lr
-		bl	mcount
-		.word	LP1
-
-   profile_function() in final.c outputs the .data section, FUNCTION_PROFILER
-   will output the .text section.
-
-   The ``mov ip,lr'' seems like a good idea to stick with cc convention.
-   ``prof'' doesn't seem to mind about this!
-
-   Note - this version of the code is designed to work in both ARM and
-   Thumb modes.  */
-#ifndef ARM_FUNCTION_PROFILER
-#define ARM_FUNCTION_PROFILER(STREAM, LABELNO)  	\
-{							\
-  char temp[20];					\
-  rtx sym;						\
-							\
-  asm_fprintf (STREAM, "\tmov\t%r, %r\n\tbl\t",		\
-	   IP_REGNUM, LR_REGNUM);			\
-  assemble_name (STREAM, ARM_MCOUNT_NAME);		\
-  fputc ('\n', STREAM);					\
-  ASM_GENERATE_INTERNAL_LABEL (temp, "LP", LABELNO);	\
-  sym = gen_rtx_SYMBOL_REF (Pmode, temp);		\
-  assemble_aligned_integer (UNITS_PER_WORD, sym);	\
-}
-#endif
-
-#ifdef THUMB_FUNCTION_PROFILER
-#define FUNCTION_PROFILER(STREAM, LABELNO)		\
-  if (TARGET_ARM)					\
-    ARM_FUNCTION_PROFILER (STREAM, LABELNO)		\
-  else							\
-    THUMB_FUNCTION_PROFILER (STREAM, LABELNO)
-#else
-#define FUNCTION_PROFILER(STREAM, LABELNO)		\
-    ARM_FUNCTION_PROFILER (STREAM, LABELNO)
-#endif
-
-/* EXIT_IGNORE_STACK should be nonzero if, when returning from a function,
-   the stack pointer does not matter.  The value is tested only in
-   functions that have frame pointers.
-   No definition is equivalent to always zero.
-
-   On the ARM, the function epilogue recovers the stack pointer from the
-   frame.  */
-#define EXIT_IGNORE_STACK 1
-
-#define EPILOGUE_USES(REGNO) (epilogue_completed && (REGNO) == LR_REGNUM)
-
-/* Determine if the epilogue should be output as RTL.
-   You should override this if you define FUNCTION_EXTRA_EPILOGUE.  */
-#define USE_RETURN_INSN(ISCOND)				\
-  (TARGET_32BIT ? use_return_insn (ISCOND, NULL) : 0)
-
-/* Definitions for register eliminations.
-
-   This is an array of structures.  Each structure initializes one pair
-   of eliminable registers.  The "from" register number is given first,
-   followed by "to".  Eliminations of the same "from" register are listed
-   in order of preference.
-
-   We have two registers that can be eliminated on the ARM.  First, the
-   arg pointer register can often be eliminated in favor of the stack
-   pointer register.  Secondly, the pseudo frame pointer register can always
-   be eliminated; it is replaced with either the stack or the real frame
-   pointer.  Note we have to use {ARM|THUMB}_HARD_FRAME_POINTER_REGNUM
-   because the definition of HARD_FRAME_POINTER_REGNUM is not a constant.  */
-
-#define ELIMINABLE_REGS						\
-{{ ARG_POINTER_REGNUM,        STACK_POINTER_REGNUM            },\
- { ARG_POINTER_REGNUM,        FRAME_POINTER_REGNUM            },\
- { ARG_POINTER_REGNUM,        ARM_HARD_FRAME_POINTER_REGNUM   },\
- { ARG_POINTER_REGNUM,        THUMB_HARD_FRAME_POINTER_REGNUM },\
- { FRAME_POINTER_REGNUM,      STACK_POINTER_REGNUM            },\
- { FRAME_POINTER_REGNUM,      ARM_HARD_FRAME_POINTER_REGNUM   },\
- { FRAME_POINTER_REGNUM,      THUMB_HARD_FRAME_POINTER_REGNUM }}
-
-/* Define the offset between two registers, one to be eliminated, and the
-   other its replacement, at the start of a routine.  */
-#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET)			\
-  if (TARGET_ARM)							\
-    (OFFSET) = arm_compute_initial_elimination_offset (FROM, TO);	\
-  else									\
-    (OFFSET) = thumb_compute_initial_elimination_offset (FROM, TO)
-
-/* Special case handling of the location of arguments passed on the stack.  */
-#define DEBUGGER_ARG_OFFSET(value, addr) value ? value : arm_debugger_arg_offset (value, addr)
-
-/* Initialize data used by insn expanders.  This is called from insn_emit,
-   once for every function before code is generated.  */
-#define INIT_EXPANDERS  arm_init_expanders ()
-
-/* Length in units of the trampoline for entering a nested function.  */
-#define TRAMPOLINE_SIZE  (TARGET_32BIT ? 16 : 20)
-
-/* Alignment required for a trampoline in bits.  */
-#define TRAMPOLINE_ALIGNMENT  32
-
-/* Addressing modes, and classification of registers for them.  */
-#define HAVE_POST_INCREMENT   1
-#define HAVE_PRE_INCREMENT    TARGET_32BIT
-#define HAVE_POST_DECREMENT   TARGET_32BIT
-#define HAVE_PRE_DECREMENT    TARGET_32BIT
-#define HAVE_PRE_MODIFY_DISP  TARGET_32BIT
-#define HAVE_POST_MODIFY_DISP TARGET_32BIT
-#define HAVE_PRE_MODIFY_REG   TARGET_32BIT
-#define HAVE_POST_MODIFY_REG  TARGET_32BIT
-
-enum arm_auto_incmodes
-  {
-    ARM_POST_INC,
-    ARM_PRE_INC,
-    ARM_POST_DEC,
-    ARM_PRE_DEC
-  };
-
-#define ARM_AUTOINC_VALID_FOR_MODE_P(mode, code) \
-  (TARGET_32BIT && arm_autoinc_modes_ok_p (mode, code))
-#define USE_LOAD_POST_INCREMENT(mode) \
-  ARM_AUTOINC_VALID_FOR_MODE_P(mode, ARM_POST_INC)
-#define USE_LOAD_PRE_INCREMENT(mode)  \
-  ARM_AUTOINC_VALID_FOR_MODE_P(mode, ARM_PRE_INC)
-#define USE_LOAD_POST_DECREMENT(mode) \
-  ARM_AUTOINC_VALID_FOR_MODE_P(mode, ARM_POST_DEC)
-#define USE_LOAD_PRE_DECREMENT(mode)  \
-  ARM_AUTOINC_VALID_FOR_MODE_P(mode, ARM_PRE_DEC)
-
-#define USE_STORE_PRE_DECREMENT(mode) USE_LOAD_PRE_DECREMENT(mode)
-#define USE_STORE_PRE_INCREMENT(mode) USE_LOAD_PRE_INCREMENT(mode)
-#define USE_STORE_POST_DECREMENT(mode) USE_LOAD_POST_DECREMENT(mode)
-#define USE_STORE_POST_INCREMENT(mode) USE_LOAD_POST_INCREMENT(mode)
-
-/* Macros to check register numbers against specific register classes.  */
-
-/* These assume that REGNO is a hard or pseudo reg number.
-   They give nonzero only if REGNO is a hard reg of the suitable class
-   or a pseudo reg currently allocated to a suitable hard reg.
-   Since they use reg_renumber, they are safe only once reg_renumber
-   has been allocated, which happens in reginfo.c during register
-   allocation.  */
-#define TEST_REGNO(R, TEST, VALUE) \
-  ((R TEST VALUE) || ((unsigned) reg_renumber[R] TEST VALUE))
-
-/* Don't allow the pc to be used.  */
-#define ARM_REGNO_OK_FOR_BASE_P(REGNO)			\
-  (TEST_REGNO (REGNO, <, PC_REGNUM)			\
-   || TEST_REGNO (REGNO, ==, FRAME_POINTER_REGNUM)	\
-   || TEST_REGNO (REGNO, ==, ARG_POINTER_REGNUM))
-
-#define THUMB1_REGNO_MODE_OK_FOR_BASE_P(REGNO, MODE)		\
-  (TEST_REGNO (REGNO, <=, LAST_LO_REGNUM)			\
-   || (GET_MODE_SIZE (MODE) >= 4				\
-       && TEST_REGNO (REGNO, ==, STACK_POINTER_REGNUM)))
-
-#define REGNO_MODE_OK_FOR_BASE_P(REGNO, MODE)		\
-  (TARGET_THUMB1					\
-   ? THUMB1_REGNO_MODE_OK_FOR_BASE_P (REGNO, MODE)	\
-   : ARM_REGNO_OK_FOR_BASE_P (REGNO))
-
-/* Nonzero if X can be the base register in a reg+reg addressing mode.
-   For Thumb, we can not use SP + reg, so reject SP.  */
-#define REGNO_MODE_OK_FOR_REG_BASE_P(X, MODE)	\
-  REGNO_MODE_OK_FOR_BASE_P (X, QImode)
-
-/* For ARM code, we don't care about the mode, but for Thumb, the index
-   must be suitable for use in a QImode load.  */
-#define REGNO_OK_FOR_INDEX_P(REGNO)	\
-  (REGNO_MODE_OK_FOR_BASE_P (REGNO, QImode) \
-   && !TEST_REGNO (REGNO, ==, STACK_POINTER_REGNUM))
-
-/* Maximum number of registers that can appear in a valid memory address.
-   Shifts in addresses can't be by a register.  */
-#define MAX_REGS_PER_ADDRESS 2
-
-/* Recognize any constant value that is a valid address.  */
-/* XXX We can address any constant, eventually...  */
-/* ??? Should the TARGET_ARM here also apply to thumb2?  */
-#define CONSTANT_ADDRESS_P(X)  			\
-  (GET_CODE (X) == SYMBOL_REF 			\
-   && (CONSTANT_POOL_ADDRESS_P (X)		\
-       || (TARGET_ARM && optimize > 0 && SYMBOL_REF_FLAG (X))))
-
-/* True if SYMBOL + OFFSET constants must refer to something within
-   SYMBOL's section.  */
-#define ARM_OFFSETS_MUST_BE_WITHIN_SECTIONS_P 0
-
-/* Nonzero if all target requires all absolute relocations be R_ARM_ABS32.  */
-#ifndef TARGET_DEFAULT_WORD_RELOCATIONS
-#define TARGET_DEFAULT_WORD_RELOCATIONS 0
-#endif
-
-#ifndef SUBTARGET_NAME_ENCODING_LENGTHS
-#define SUBTARGET_NAME_ENCODING_LENGTHS
-#endif
-
-/* This is a C fragment for the inside of a switch statement.
-   Each case label should return the number of characters to
-   be stripped from the start of a function's name, if that
-   name starts with the indicated character.  */
-#define ARM_NAME_ENCODING_LENGTHS		\
-  case '*':  return 1;				\
-  SUBTARGET_NAME_ENCODING_LENGTHS
-
-/* This is how to output a reference to a user-level label named NAME.
-   `assemble_name' uses this.  */
-#undef  ASM_OUTPUT_LABELREF
-#define ASM_OUTPUT_LABELREF(FILE, NAME)		\
-   arm_asm_output_labelref (FILE, NAME)
-
-/* Output IT instructions for conditionally executed Thumb-2 instructions.  */
-#define ASM_OUTPUT_OPCODE(STREAM, PTR)	\
-  if (TARGET_THUMB2)			\
-    thumb2_asm_output_opcode (STREAM);
-
-/* The EABI specifies that constructors should go in .init_array.
-   Other targets use .ctors for compatibility.  */
-#ifndef ARM_EABI_CTORS_SECTION_OP
-#define ARM_EABI_CTORS_SECTION_OP \
-  "\t.section\t.init_array,\"aw\",%init_array"
-#endif
-#ifndef ARM_EABI_DTORS_SECTION_OP
-#define ARM_EABI_DTORS_SECTION_OP \
-  "\t.section\t.fini_array,\"aw\",%fini_array"
-#endif
-#define ARM_CTORS_SECTION_OP \
-  "\t.section\t.ctors,\"aw\",%progbits"
-#define ARM_DTORS_SECTION_OP \
-  "\t.section\t.dtors,\"aw\",%progbits"
-
-/* Define CTORS_SECTION_ASM_OP.  */
-#undef CTORS_SECTION_ASM_OP
-#undef DTORS_SECTION_ASM_OP
-#ifndef IN_LIBGCC2
-# define CTORS_SECTION_ASM_OP \
-   (TARGET_AAPCS_BASED ? ARM_EABI_CTORS_SECTION_OP : ARM_CTORS_SECTION_OP)
-# define DTORS_SECTION_ASM_OP \
-   (TARGET_AAPCS_BASED ? ARM_EABI_DTORS_SECTION_OP : ARM_DTORS_SECTION_OP)
-#else /* !defined (IN_LIBGCC2) */
-/* In libgcc, CTORS_SECTION_ASM_OP must be a compile-time constant,
-   so we cannot use the definition above.  */
-# ifdef __ARM_EABI__
-/* The .ctors section is not part of the EABI, so we do not define
-   CTORS_SECTION_ASM_OP when in libgcc; that prevents crtstuff
-   from trying to use it.  We do define it when doing normal
-   compilation, as .init_array can be used instead of .ctors.  */
-/* There is no need to emit begin or end markers when using
-   init_array; the dynamic linker will compute the size of the
-   array itself based on special symbols created by the static
-   linker.  However, we do need to arrange to set up
-   exception-handling here.  */
-#   define CTOR_LIST_BEGIN asm (ARM_EABI_CTORS_SECTION_OP)
-#   define CTOR_LIST_END /* empty */
-#   define DTOR_LIST_BEGIN asm (ARM_EABI_DTORS_SECTION_OP)
-#   define DTOR_LIST_END /* empty */
-# else /* !defined (__ARM_EABI__) */
-#   define CTORS_SECTION_ASM_OP ARM_CTORS_SECTION_OP
-#   define DTORS_SECTION_ASM_OP ARM_DTORS_SECTION_OP
-# endif /* !defined (__ARM_EABI__) */
-#endif /* !defined (IN_LIBCC2) */
-
-/* True if the operating system can merge entities with vague linkage
-   (e.g., symbols in COMDAT group) during dynamic linking.  */
-#ifndef TARGET_ARM_DYNAMIC_VAGUE_LINKAGE_P
-#define TARGET_ARM_DYNAMIC_VAGUE_LINKAGE_P true
-#endif
-
-#define ARM_OUTPUT_FN_UNWIND(F, PROLOGUE) arm_output_fn_unwind (F, PROLOGUE)
-
-/* The macros REG_OK_FOR..._P assume that the arg is a REG rtx
-   and check its validity for a certain class.
-   We have two alternate definitions for each of them.
-   The usual definition accepts all pseudo regs; the other rejects
-   them unless they have been allocated suitable hard regs.
-   The symbol REG_OK_STRICT causes the latter definition to be used.
-   Thumb-2 has the same restrictions as arm.  */
-#ifndef REG_OK_STRICT
-
-#define ARM_REG_OK_FOR_BASE_P(X)		\
-  (REGNO (X) <= LAST_ARM_REGNUM			\
-   || REGNO (X) >= FIRST_PSEUDO_REGISTER	\
-   || REGNO (X) == FRAME_POINTER_REGNUM		\
-   || REGNO (X) == ARG_POINTER_REGNUM)
-
-#define ARM_REG_OK_FOR_INDEX_P(X)		\
-  ((REGNO (X) <= LAST_ARM_REGNUM		\
-    && REGNO (X) != STACK_POINTER_REGNUM)	\
-   || REGNO (X) >= FIRST_PSEUDO_REGISTER	\
-   || REGNO (X) == FRAME_POINTER_REGNUM		\
-   || REGNO (X) == ARG_POINTER_REGNUM)
-
-#define THUMB1_REG_MODE_OK_FOR_BASE_P(X, MODE)	\
-  (REGNO (X) <= LAST_LO_REGNUM			\
-   || REGNO (X) >= FIRST_PSEUDO_REGISTER	\
-   || (GET_MODE_SIZE (MODE) >= 4		\
-       && (REGNO (X) == STACK_POINTER_REGNUM	\
-	   || (X) == hard_frame_pointer_rtx	\
-	   || (X) == arg_pointer_rtx)))
-
-#define REG_STRICT_P 0
-
-#else /* REG_OK_STRICT */
-
-#define ARM_REG_OK_FOR_BASE_P(X) 		\
-  ARM_REGNO_OK_FOR_BASE_P (REGNO (X))
-
-#define ARM_REG_OK_FOR_INDEX_P(X) 		\
-  ARM_REGNO_OK_FOR_INDEX_P (REGNO (X))
-
-#define THUMB1_REG_MODE_OK_FOR_BASE_P(X, MODE)	\
-  THUMB1_REGNO_MODE_OK_FOR_BASE_P (REGNO (X), MODE)
-
-#define REG_STRICT_P 1
-
-#endif /* REG_OK_STRICT */
-
-/* Now define some helpers in terms of the above.  */
-
-#define REG_MODE_OK_FOR_BASE_P(X, MODE)		\
-  (TARGET_THUMB1				\
-   ? THUMB1_REG_MODE_OK_FOR_BASE_P (X, MODE)	\
-   : ARM_REG_OK_FOR_BASE_P (X))
-
-/* For 16-bit Thumb, a valid index register is anything that can be used in
-   a byte load instruction.  */
-#define THUMB1_REG_OK_FOR_INDEX_P(X) \
-  THUMB1_REG_MODE_OK_FOR_BASE_P (X, QImode)
-
-/* Nonzero if X is a hard reg that can be used as an index
-   or if it is a pseudo reg.  On the Thumb, the stack pointer
-   is not suitable.  */
-#define REG_OK_FOR_INDEX_P(X)			\
-  (TARGET_THUMB1				\
-   ? THUMB1_REG_OK_FOR_INDEX_P (X)		\
-   : ARM_REG_OK_FOR_INDEX_P (X))
-
-/* Nonzero if X can be the base register in a reg+reg addressing mode.
-   For Thumb, we can not use SP + reg, so reject SP.  */
-#define REG_MODE_OK_FOR_REG_BASE_P(X, MODE)	\
-  REG_OK_FOR_INDEX_P (X)
-
-#define ARM_BASE_REGISTER_RTX_P(X)  \
-  (REG_P (X) && ARM_REG_OK_FOR_BASE_P (X))
-
-#define ARM_INDEX_REGISTER_RTX_P(X)  \
-  (REG_P (X) && ARM_REG_OK_FOR_INDEX_P (X))
-
-/* Specify the machine mode that this machine uses
-   for the index in the tablejump instruction.  */
-#define CASE_VECTOR_MODE Pmode
-
-#define CASE_VECTOR_PC_RELATIVE (TARGET_THUMB2				\
-				 || (TARGET_THUMB1			\
-				     && (optimize_size || flag_pic)))
-
-#define CASE_VECTOR_SHORTEN_MODE(min, max, body)			\
-  (TARGET_THUMB1							\
-   ? (min >= 0 && max < 512						\
-      ? (ADDR_DIFF_VEC_FLAGS (body).offset_unsigned = 1, QImode)	\
-      : min >= -256 && max < 256					\
-      ? (ADDR_DIFF_VEC_FLAGS (body).offset_unsigned = 0, QImode)	\
-      : min >= 0 && max < 8192						\
-      ? (ADDR_DIFF_VEC_FLAGS (body).offset_unsigned = 1, HImode)	\
-      : min >= -4096 && max < 4096					\
-      ? (ADDR_DIFF_VEC_FLAGS (body).offset_unsigned = 0, HImode)	\
-      : SImode)								\
-   : ((min < 0 || max >= 0x20000 || !TARGET_THUMB2) ? SImode		\
-      : (max >= 0x200) ? HImode						\
-      : QImode))
-
-/* signed 'char' is most compatible, but RISC OS wants it unsigned.
-   unsigned is probably best, but may break some code.  */
-#ifndef DEFAULT_SIGNED_CHAR
-#define DEFAULT_SIGNED_CHAR  0
-#endif
-
-/* Max number of bytes we can move from memory to memory
-   in one reasonably fast instruction.  */
-#define MOVE_MAX 4
-
-#undef  MOVE_RATIO
-#define MOVE_RATIO(speed) (arm_tune_xscale ? 4 : 2)
-
-/* Define if operations between registers always perform the operation
-   on the full register even if a narrower mode is specified.  */
-#define WORD_REGISTER_OPERATIONS
-
-/* Define if loading in MODE, an integral mode narrower than BITS_PER_WORD
-   will either zero-extend or sign-extend.  The value of this macro should
-   be the code that says which one of the two operations is implicitly
-   done, UNKNOWN if none.  */
-#define LOAD_EXTEND_OP(MODE)						\
-  (TARGET_THUMB ? ZERO_EXTEND :						\
-   ((arm_arch4 || (MODE) == QImode) ? ZERO_EXTEND			\
-    : ((BYTES_BIG_ENDIAN && (MODE) == HImode) ? SIGN_EXTEND : UNKNOWN)))
-
-/* Nonzero if access to memory by bytes is slow and undesirable.  */
-#define SLOW_BYTE_ACCESS 0
-
-#define SLOW_UNALIGNED_ACCESS(MODE, ALIGN) 1
-
-/* Immediate shift counts are truncated by the output routines (or was it
-   the assembler?).  Shift counts in a register are truncated by ARM.  Note
-   that the native compiler puts too large (> 32) immediate shift counts
-   into a register and shifts by the register, letting the ARM decide what
-   to do instead of doing that itself.  */
-/* This is all wrong.  Defining SHIFT_COUNT_TRUNCATED tells combine that
-   code like (X << (Y % 32)) for register X, Y is equivalent to (X << Y).
-   On the arm, Y in a register is used modulo 256 for the shift. Only for
-   rotates is modulo 32 used.  */
-/* #define SHIFT_COUNT_TRUNCATED 1 */
-
-/* All integers have the same format so truncation is easy.  */
-#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC)  1
-
-/* Calling from registers is a massive pain.  */
-#define NO_FUNCTION_CSE 1
-
-/* The machine modes of pointers and functions */
-#define Pmode  SImode
-#define FUNCTION_MODE  Pmode
-
-#define ARM_FRAME_RTX(X)					\
-  (   (X) == frame_pointer_rtx || (X) == stack_pointer_rtx	\
-   || (X) == arg_pointer_rtx)
-
-/* Try to generate sequences that don't involve branches, we can then use
-   conditional instructions.  */
-#define BRANCH_COST(speed_p, predictable_p) \
-  (current_tune->branch_cost (speed_p, predictable_p))
-
-/* False if short circuit operation is preferred.  */
-#define LOGICAL_OP_NON_SHORT_CIRCUIT				\
-  ((optimize_size)						\
-   ? (TARGET_THUMB ? false : true)				\
-   : (current_tune->logical_op_non_short_circuit[TARGET_ARM]))
-
-
-/* Position Independent Code.  */
-/* We decide which register to use based on the compilation options and
-   the assembler in use; this is more general than the APCS restriction of
-   using sb (r9) all the time.  */
-extern unsigned arm_pic_register;
-
-/* The register number of the register used to address a table of static
-   data addresses in memory.  */
-#define PIC_OFFSET_TABLE_REGNUM arm_pic_register
-
-/* We can't directly access anything that contains a symbol,
-   nor can we indirect via the constant pool.  One exception is
-   UNSPEC_TLS, which is always PIC.  */
-#define LEGITIMATE_PIC_OPERAND_P(X)					\
-	(!(symbol_mentioned_p (X)					\
-	   || label_mentioned_p (X)					\
-	   || (GET_CODE (X) == SYMBOL_REF				\
-	       && CONSTANT_POOL_ADDRESS_P (X)				\
-	       && (symbol_mentioned_p (get_pool_constant (X))		\
-		   || label_mentioned_p (get_pool_constant (X)))))	\
-	 || tls_mentioned_p (X))
-
-/* We need to know when we are making a constant pool; this determines
-   whether data needs to be in the GOT or can be referenced via a GOT
-   offset.  */
-extern int making_const_table;
-
-/* Handle pragmas for compatibility with Intel's compilers.  */
-/* Also abuse this to register additional C specific EABI attributes.  */
-#define REGISTER_TARGET_PRAGMAS() do {					\
-  c_register_pragma (0, "long_calls", arm_pr_long_calls);		\
-  c_register_pragma (0, "no_long_calls", arm_pr_no_long_calls);		\
-  c_register_pragma (0, "long_calls_off", arm_pr_long_calls_off);	\
-  arm_lang_object_attributes_init(); \
-} while (0)
-
-/* Condition code information.  */
-/* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE,
-   return the mode to be used for the comparison.  */
-
-#define SELECT_CC_MODE(OP, X, Y)  arm_select_cc_mode (OP, X, Y)
-
-#define REVERSIBLE_CC_MODE(MODE) 1
-
-#define REVERSE_CONDITION(CODE,MODE) \
-  (((MODE) == CCFPmode || (MODE) == CCFPEmode) \
-   ? reverse_condition_maybe_unordered (code) \
-   : reverse_condition (code))
-
-/* The arm5 clz instruction returns 32.  */
-#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE)  ((VALUE) = 32, 1)
-#define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE)  ((VALUE) = 32, 1)
-
-#define CC_STATUS_INIT \
-  do { cfun->machine->thumb1_cc_insn = NULL_RTX; } while (0)
-
-#undef  ASM_APP_OFF
-#define ASM_APP_OFF (TARGET_THUMB1 ? "\t.code\t16\n" : \
-		     TARGET_THUMB2 ? "\t.thumb\n" : "")
-
-/* Output a push or a pop instruction (only used when profiling).
-   We can't push STATIC_CHAIN_REGNUM (r12) directly with Thumb-1.  We know
-   that ASM_OUTPUT_REG_PUSH will be matched with ASM_OUTPUT_REG_POP, and
-   that r7 isn't used by the function profiler, so we can use it as a
-   scratch reg.  WARNING: This isn't safe in the general case!  It may be
-   sensitive to future changes in final.c:profile_function.  */
-#define ASM_OUTPUT_REG_PUSH(STREAM, REGNO)		\
-  do							\
-    {							\
-      if (TARGET_ARM)					\
-	asm_fprintf (STREAM,"\tstmfd\t%r!,{%r}\n",	\
-		     STACK_POINTER_REGNUM, REGNO);	\
-      else if (TARGET_THUMB1				\
-	       && (REGNO) == STATIC_CHAIN_REGNUM)	\
-	{						\
-	  asm_fprintf (STREAM, "\tpush\t{r7}\n");	\
-	  asm_fprintf (STREAM, "\tmov\tr7, %r\n", REGNO);\
-	  asm_fprintf (STREAM, "\tpush\t{r7}\n");	\
-	}						\
-      else						\
-	asm_fprintf (STREAM, "\tpush {%r}\n", REGNO);	\
-    } while (0)
-
-
-/* See comment for ASM_OUTPUT_REG_PUSH concerning Thumb-1 issue.  */
-#define ASM_OUTPUT_REG_POP(STREAM, REGNO)		\
-  do							\
-    {							\
-      if (TARGET_ARM)					\
-	asm_fprintf (STREAM, "\tldmfd\t%r!,{%r}\n",	\
-		     STACK_POINTER_REGNUM, REGNO);	\
-      else if (TARGET_THUMB1				\
-	       && (REGNO) == STATIC_CHAIN_REGNUM)	\
-	{						\
-	  asm_fprintf (STREAM, "\tpop\t{r7}\n");	\
-	  asm_fprintf (STREAM, "\tmov\t%r, r7\n", REGNO);\
-	  asm_fprintf (STREAM, "\tpop\t{r7}\n");	\
-	}						\
-      else						\
-	asm_fprintf (STREAM, "\tpop {%r}\n", REGNO);	\
-    } while (0)
-
-#define ADDR_VEC_ALIGN(JUMPTABLE)	\
-  ((TARGET_THUMB && GET_MODE (PATTERN (JUMPTABLE)) == SImode) ? 2 : 0)
-
-/* Alignment for case labels comes from ADDR_VEC_ALIGN; avoid the
-   default alignment from elfos.h.  */
-#undef ASM_OUTPUT_BEFORE_CASE_LABEL
-#define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE, PREFIX, NUM, TABLE) /* Empty.  */
-
-#define LABEL_ALIGN_AFTER_BARRIER(LABEL)                \
-   (GET_CODE (PATTERN (prev_active_insn (LABEL))) == ADDR_DIFF_VEC \
-   ? 1 : 0)
-
-#define ARM_DECLARE_FUNCTION_NAME(STREAM, NAME, DECL) 	\
-  do							\
-    {							\
-      if (TARGET_THUMB) 				\
-        {						\
-          if (is_called_in_ARM_mode (DECL)		\
-	      || (TARGET_THUMB1 && !TARGET_THUMB1_ONLY	\
-		  && cfun->is_thunk))	\
-            fprintf (STREAM, "\t.code 32\n") ;		\
-          else if (TARGET_THUMB1)			\
-           fprintf (STREAM, "\t.code\t16\n\t.thumb_func\n") ;	\
-          else						\
-           fprintf (STREAM, "\t.thumb\n\t.thumb_func\n") ;	\
-        }						\
-      if (TARGET_POKE_FUNCTION_NAME)			\
-        arm_poke_function_name (STREAM, (const char *) NAME);	\
-    }							\
-  while (0)
-
-/* For aliases of functions we use .thumb_set instead.  */
-#define ASM_OUTPUT_DEF_FROM_DECLS(FILE, DECL1, DECL2)		\
-  do						   		\
-    {								\
-      const char *const LABEL1 = XSTR (XEXP (DECL_RTL (decl), 0), 0); \
-      const char *const LABEL2 = IDENTIFIER_POINTER (DECL2);	\
-								\
-      if (TARGET_THUMB && TREE_CODE (DECL1) == FUNCTION_DECL)	\
-	{							\
-	  fprintf (FILE, "\t.thumb_set ");			\
-	  assemble_name (FILE, LABEL1);			   	\
-	  fprintf (FILE, ",");			   		\
-	  assemble_name (FILE, LABEL2);		   		\
-	  fprintf (FILE, "\n");					\
-	}							\
-      else							\
-	ASM_OUTPUT_DEF (FILE, LABEL1, LABEL2);			\
-    }								\
-  while (0)
-
-#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN
-/* To support -falign-* switches we need to use .p2align so
-   that alignment directives in code sections will be padded
-   with no-op instructions, rather than zeroes.  */
-#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE, LOG, MAX_SKIP)		\
-  if ((LOG) != 0)						\
-    {								\
-      if ((MAX_SKIP) == 0)					\
-        fprintf ((FILE), "\t.p2align %d\n", (int) (LOG));	\
-      else							\
-        fprintf ((FILE), "\t.p2align %d,,%d\n",			\
-                 (int) (LOG), (int) (MAX_SKIP));		\
-    }
-#endif
-
-/* Add two bytes to the length of conditionally executed Thumb-2
-   instructions for the IT instruction.  */
-#define ADJUST_INSN_LENGTH(insn, length) \
-  if (TARGET_THUMB2 && GET_CODE (PATTERN (insn)) == COND_EXEC) \
-    length += 2;
-
-/* Only perform branch elimination (by making instructions conditional) if
-   we're optimizing.  For Thumb-2 check if any IT instructions need
-   outputting.  */
-#define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS)	\
-  if (TARGET_ARM && optimize)				\
-    arm_final_prescan_insn (INSN);			\
-  else if (TARGET_THUMB2)				\
-    thumb2_final_prescan_insn (INSN);			\
-  else if (TARGET_THUMB1)				\
-    thumb1_final_prescan_insn (INSN)
-
-#define ARM_SIGN_EXTEND(x)  ((HOST_WIDE_INT)			\
-  (HOST_BITS_PER_WIDE_INT <= 32 ? (unsigned HOST_WIDE_INT) (x)	\
-   : ((((unsigned HOST_WIDE_INT)(x)) & (unsigned HOST_WIDE_INT) 0xffffffff) |\
-      ((((unsigned HOST_WIDE_INT)(x)) & (unsigned HOST_WIDE_INT) 0x80000000) \
-       ? ((~ (unsigned HOST_WIDE_INT) 0)			\
-	  & ~ (unsigned HOST_WIDE_INT) 0xffffffff)		\
-       : 0))))
-
-/* A C expression whose value is RTL representing the value of the return
-   address for the frame COUNT steps up from the current frame.  */
-
-#define RETURN_ADDR_RTX(COUNT, FRAME) \
-  arm_return_addr (COUNT, FRAME)
-
-/* Mask of the bits in the PC that contain the real return address
-   when running in 26-bit mode.  */
-#define RETURN_ADDR_MASK26 (0x03fffffc)
-
-/* Pick up the return address upon entry to a procedure. Used for
-   dwarf2 unwind information.  This also enables the table driven
-   mechanism.  */
-#define INCOMING_RETURN_ADDR_RTX	gen_rtx_REG (Pmode, LR_REGNUM)
-#define DWARF_FRAME_RETURN_COLUMN	DWARF_FRAME_REGNUM (LR_REGNUM)
-
-/* Used to mask out junk bits from the return address, such as
-   processor state, interrupt status, condition codes and the like.  */
-#define MASK_RETURN_ADDR \
-  /* If we are generating code for an ARM2/ARM3 machine or for an ARM6	\
-     in 26 bit mode, the condition codes must be masked out of the	\
-     return address.  This does not apply to ARM6 and later processors	\
-     when running in 32 bit mode.  */					\
-  ((arm_arch4 || TARGET_THUMB)						\
-   ? (gen_int_mode ((unsigned long)0xffffffff, Pmode))			\
-   : arm_gen_return_addr_mask ())
-
-
-/* Do not emit .note.GNU-stack by default.  */
-#ifndef NEED_INDICATE_EXEC_STACK
-#define NEED_INDICATE_EXEC_STACK	0
-#endif
-
-#define TARGET_ARM_ARCH	\
-  (arm_base_arch)	\
-
-#define TARGET_ARM_V6M (!arm_arch_notm && !arm_arch_thumb2)
-#define TARGET_ARM_V7M (!arm_arch_notm && arm_arch_thumb2)
-
-/* The highest Thumb instruction set version supported by the chip.  */
-#define TARGET_ARM_ARCH_ISA_THUMB 		\
-  (arm_arch_thumb2 ? 2				\
-	           : ((TARGET_ARM_ARCH >= 5 || arm_arch4t) ? 1 : 0))
-
-/* Expands to an upper-case char of the target's architectural
-   profile.  */
-#define TARGET_ARM_ARCH_PROFILE				\
-  (!arm_arch_notm					\
-    ? 'M'						\
-    : (arm_arch7					\
-      ? (strlen (arm_arch_name) >=3			\
-	? (arm_arch_name[strlen (arm_arch_name) - 3])	\
-      	: 0)						\
-      : 0))
-
-/* Bit-field indicating what size LDREX/STREX loads/stores are available.
-   Bit 0 for bytes, up to bit 3 for double-words.  */
-#define TARGET_ARM_FEATURE_LDREX				\
-  ((TARGET_HAVE_LDREX ? 4 : 0)					\
-   | (TARGET_HAVE_LDREXBH ? 3 : 0)				\
-   | (TARGET_HAVE_LDREXD ? 8 : 0))
-
-/* Set as a bit mask indicating the available widths of hardware floating
-   point types.  Where bit 1 indicates 16-bit support, bit 2 indicates
-   32-bit support, bit 3 indicates 64-bit support.  */
-#define TARGET_ARM_FP			\
-  (TARGET_VFP_SINGLE ? 4		\
-  		     : (TARGET_VFP_DOUBLE ? (TARGET_FP16 ? 14 : 12) : 0))
-
-
-/* Set as a bit mask indicating the available widths of floating point
-   types for hardware NEON floating point.  This is the same as
-   TARGET_ARM_FP without the 64-bit bit set.  */
-#ifdef TARGET_NEON
-#define TARGET_NEON_FP		\
-  (TARGET_ARM_FP & (0xff ^ 0x08))
-#endif
-
-/* The maximum number of parallel loads or stores we support in an ldm/stm
-   instruction.  */
-#define MAX_LDM_STM_OPS 4
-
-#define BIG_LITTLE_SPEC \
-   " %{mcpu=*:-mcpu=%:rewrite_mcpu(%{mcpu=*:%*})}"
-
-extern const char *arm_rewrite_mcpu (int argc, const char **argv);
-#define BIG_LITTLE_CPU_SPEC_FUNCTIONS \
-  { "rewrite_mcpu", arm_rewrite_mcpu },
-
-#define ASM_CPU_SPEC \
-   " %{mcpu=generic-*:-march=%*;"				\
-   "   :%{march=*:-march=%*}}"					\
-   BIG_LITTLE_SPEC
-
-/* -mcpu=native handling only makes sense with compiler running on
-   an ARM chip.  */
-#if defined(__arm__)
-extern const char *host_detect_local_cpu (int argc, const char **argv);
-# define EXTRA_SPEC_FUNCTIONS						\
-  { "local_cpu_detect", host_detect_local_cpu },			\
-  BIG_LITTLE_CPU_SPEC_FUNCTIONS
-
-# define MCPU_MTUNE_NATIVE_SPECS					\
-   " %{march=native:%<march=native %:local_cpu_detect(arch)}"		\
-   " %{mcpu=native:%<mcpu=native %:local_cpu_detect(cpu)}"		\
-   " %{mtune=native:%<mtune=native %:local_cpu_detect(tune)}"
-#else
-# define MCPU_MTUNE_NATIVE_SPECS ""
-# define EXTRA_SPEC_FUNCTIONS BIG_LITTLE_CPU_SPEC_FUNCTIONS
-#endif
-
-#define DRIVER_SELF_SPECS MCPU_MTUNE_NATIVE_SPECS
-
-#endif /* ! GCC_ARM_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/bpabi.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/bpabi.h
deleted file mode 100644
index 7a576ac..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/bpabi.h
+++ /dev/null
@@ -1,168 +0,0 @@
-/* Configuration file for ARM BPABI targets.
-   Copyright (C) 2004-2014 Free Software Foundation, Inc.
-   Contributed by CodeSourcery, LLC   
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3, or (at your
-   option) any later version.
-
-   GCC 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 General Public
-   License for more details.
-
-   Under Section 7 of GPL version 3, you are granted additional
-   permissions described in the GCC Runtime Library Exception, version
-   3.1, as published by the Free Software Foundation.
-
-   You should have received a copy of the GNU General Public License and
-   a copy of the GCC Runtime Library Exception along with this program;
-   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* Use the AAPCS ABI by default.  */
-#define ARM_DEFAULT_ABI ARM_ABI_AAPCS
-
-/* Assume that AAPCS ABIs should adhere to the full BPABI.  */ 
-#define TARGET_BPABI (TARGET_AAPCS_BASED)
-
-/* BPABI targets use EABI frame unwinding tables.  */
-#undef ARM_UNWIND_INFO
-#define ARM_UNWIND_INFO 1
-
-/* Section 4.1 of the AAPCS requires the use of VFP format.  */
-#undef  FPUTYPE_DEFAULT
-#define FPUTYPE_DEFAULT "vfp"
-
-/* TARGET_BIG_ENDIAN_DEFAULT is set in
-   config.gcc for big endian configurations.  */
-#if TARGET_BIG_ENDIAN_DEFAULT
-#define TARGET_ENDIAN_DEFAULT MASK_BIG_END
-#else
-#define TARGET_ENDIAN_DEFAULT 0
-#endif
-
-/* EABI targets should enable interworking by default.  */
-#undef  TARGET_DEFAULT
-#define TARGET_DEFAULT (MASK_INTERWORK | TARGET_ENDIAN_DEFAULT)
-
-/* The ARM BPABI functions return a boolean; they use no special
-   calling convention.  */
-#define FLOAT_LIB_COMPARE_RETURNS_BOOL(MODE, COMPARISON) TARGET_BPABI
-
-/* The BPABI integer comparison routines return { -1, 0, 1 }.  */
-#define TARGET_LIB_INT_CMP_BIASED !TARGET_BPABI
-
-#define TARGET_FIX_V4BX_SPEC " %{mcpu=arm8|mcpu=arm810|mcpu=strongarm*"\
-  "|march=armv4|mcpu=fa526|mcpu=fa626:--fix-v4bx}"
-
-#if TARGET_BIG_ENDIAN_DEFAULT
-#define BE8_LINK_SPEC \
-  " %{!mlittle-endian:%{march=armv7-a|mcpu=cortex-a5    \
-   |mcpu=cortex-a7                                      \
-   |mcpu=cortex-a8|mcpu=cortex-a9|mcpu=cortex-a15       \
-   |mcpu=cortex-a12					\
-   |mcpu=cortex-a15.cortex-a7				\
-   |mcpu=marvell-pj4					\
-   |mcpu=cortex-a53					\
-   |mcpu=cortex-a57					\
-   |mcpu=cortex-a57.cortex-a53				\
-   |mcpu=generic-armv7-a                                \
-   |march=armv7ve	                                \
-   |march=armv7-m|mcpu=cortex-m3                        \
-   |march=armv7e-m|mcpu=cortex-m4                       \
-   |march=armv6-m|mcpu=cortex-m0                        \
-   |march=armv8-a					\
-   :%{!r:--be8}}}"
-#else
-#define BE8_LINK_SPEC \
-  " %{mbig-endian:%{march=armv7-a|mcpu=cortex-a5        \
-   |mcpu=cortex-a7                                      \
-   |mcpu=cortex-a8|mcpu=cortex-a9|mcpu=cortex-a15       \
-   |mcpu=cortex-a12					\
-   |mcpu=cortex-a15.cortex-a7				\
-   |mcpu=cortex-a53					\
-   |mcpu=cortex-a57					\
-   |mcpu=cortex-a57.cortex-a53				\
-   |mcpu=marvell-pj4					\
-   |mcpu=generic-armv7-a                                \
-   |march=armv7ve	                                \
-   |march=armv7-m|mcpu=cortex-m3                        \
-   |march=armv7e-m|mcpu=cortex-m4                       \
-   |march=armv6-m|mcpu=cortex-m0                        \
-   |march=armv8-a					\
-   :%{!r:--be8}}}"
-#endif
-
-/* Tell the assembler to build BPABI binaries.  */
-#undef  SUBTARGET_EXTRA_ASM_SPEC
-#define SUBTARGET_EXTRA_ASM_SPEC \
-  "%{mabi=apcs-gnu|mabi=atpcs:-meabi=gnu;:-meabi=5}" TARGET_FIX_V4BX_SPEC
-
-#ifndef SUBTARGET_EXTRA_LINK_SPEC
-#define SUBTARGET_EXTRA_LINK_SPEC ""
-#endif
-
-/* Split out the EABI common values so other targets can use it.  */
-#define EABI_LINK_SPEC \
-  TARGET_FIX_V4BX_SPEC BE8_LINK_SPEC
-
-/* The generic link spec in elf.h does not support shared libraries.  */
-#define BPABI_LINK_SPEC \
-  "%{mbig-endian:-EB} %{mlittle-endian:-EL} "		\
-  "%{static:-Bstatic} %{shared:-shared} %{symbolic:-Bsymbolic} "	\
-  "-X" SUBTARGET_EXTRA_LINK_SPEC EABI_LINK_SPEC
-
-#undef  LINK_SPEC
-#define LINK_SPEC BPABI_LINK_SPEC
-
-/* The BPABI requires that we always use an out-of-line implementation
-   of RTTI comparison, even if the target supports weak symbols,
-   because the same object file might be used on a target that does
-   not support merging symbols across DLL boundaries.  This macro is
-   broken out separately so that it can be used within
-   TARGET_OS_CPP_BUILTINS in configuration files for systems based on
-   the BPABI.  */
-#define TARGET_BPABI_CPP_BUILTINS()			\
-  do							\
-    {							\
-      builtin_define ("__GXX_TYPEINFO_EQUALITY_INLINE=0");	\
-    }							\
-  while (false)
-
-#undef TARGET_OS_CPP_BUILTINS
-#define TARGET_OS_CPP_BUILTINS() \
-  TARGET_BPABI_CPP_BUILTINS()
-
-/* The BPABI specifies the use of .{init,fini}_array.  Therefore, we
-   do not want GCC to put anything into the .{init,fini} sections.  */
-#undef INIT_SECTION_ASM_OP
-#undef FINI_SECTION_ASM_OP
-#define INIT_ARRAY_SECTION_ASM_OP ARM_EABI_CTORS_SECTION_OP
-#define FINI_ARRAY_SECTION_ASM_OP ARM_EABI_DTORS_SECTION_OP
-
-/* The legacy _mcount implementation assumes r11 points to a
-    4-word APCS frame.  This is generally not true for EABI targets,
-    particularly not in Thumb mode.  We assume the mcount
-    implementation does not require a counter variable (No Counter).
-    Note that __gnu_mcount_nc will be entered with a misaligned stack.
-    This is OK because it uses a special calling convention anyway.  */
-
-#undef  NO_PROFILE_COUNTERS
-#define NO_PROFILE_COUNTERS 1
-#undef  ARM_FUNCTION_PROFILER
-#define ARM_FUNCTION_PROFILER(STREAM, LABELNO)  			\
-{									\
-  fprintf (STREAM, "\tpush\t{lr}\n");					\
-  fprintf (STREAM, "\tbl\t__gnu_mcount_nc\n");				\
-}
-
-#undef SUBTARGET_FRAME_POINTER_REQUIRED
-#define SUBTARGET_FRAME_POINTER_REQUIRED 0
-
-/* __gnu_mcount_nc restores the original LR value before returning.  Ensure
-   that there is no unnecessary hook set up.  */
-#undef PROFILE_HOOK
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/elf.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/elf.h
deleted file mode 100644
index f14c766..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/elf.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/* Definitions of target machine for GNU compiler.
-   For ARM with ELF obj format.
-   Copyright (C) 1995-2014 Free Software Foundation, Inc.
-   Contributed by Philip Blundell <philb@gnu.org> and
-   Catherine Moore <clm@cygnus.com>
-   
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3, or (at your
-   option) any later version.
-
-   GCC 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 General Public
-   License for more details.
-
-   Under Section 7 of GPL version 3, you are granted additional
-   permissions described in the GCC Runtime Library Exception, version
-   3.1, as published by the Free Software Foundation.
-
-   You should have received a copy of the GNU General Public License and
-   a copy of the GCC Runtime Library Exception along with this program;
-   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef OBJECT_FORMAT_ELF
- #error elf.h included before elfos.h
-#endif
-
-#ifndef LOCAL_LABEL_PREFIX
-#define LOCAL_LABEL_PREFIX "."
-#endif
-
-#ifndef SUBTARGET_CPP_SPEC
-#define SUBTARGET_CPP_SPEC  "-D__ELF__"
-#endif
-
-#ifndef SUBTARGET_EXTRA_SPECS
-#define SUBTARGET_EXTRA_SPECS \
-  { "subtarget_extra_asm_spec",	SUBTARGET_EXTRA_ASM_SPEC }, \
-  { "subtarget_asm_float_spec", SUBTARGET_ASM_FLOAT_SPEC }, \
-  SUBSUBTARGET_EXTRA_SPECS
-#endif
-
-#ifndef SUBTARGET_EXTRA_ASM_SPEC
-#define SUBTARGET_EXTRA_ASM_SPEC ""
-#endif
-
-#ifndef SUBTARGET_ASM_FLOAT_SPEC
-#define SUBTARGET_ASM_FLOAT_SPEC "\
-%{mapcs-float:-mfloat}"
-#endif
-
-#undef SUBSUBTARGET_EXTRA_SPECS
-#define SUBSUBTARGET_EXTRA_SPECS
-
-#ifndef ASM_SPEC
-#define ASM_SPEC "\
-%{mbig-endian:-EB} \
-%{mlittle-endian:-EL} \
-%(asm_cpu_spec) \
-%{mapcs-*:-mapcs-%*} \
-%(subtarget_asm_float_spec) \
-%{mthumb-interwork:-mthumb-interwork} \
-%{mfloat-abi=*} %{mfpu=*} \
-%(subtarget_extra_asm_spec)"
-#endif
-
-/* The ARM uses @ are a comment character so we need to redefine
-   TYPE_OPERAND_FMT.  */
-#undef  TYPE_OPERAND_FMT
-#define TYPE_OPERAND_FMT	"%%%s"
-
-/* We might need a ARM specific header to function declarations.  */
-#undef  ASM_DECLARE_FUNCTION_NAME
-#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)		\
-  do								\
-    {								\
-      ARM_DECLARE_FUNCTION_NAME (FILE, NAME, DECL);		\
-      ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function");	\
-      ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL));		\
-      ASM_OUTPUT_LABEL(FILE, NAME);				\
-      ARM_OUTPUT_FN_UNWIND (FILE, TRUE);			\
-    }								\
-  while (0)
-
-/* We might need an ARM specific trailer for function declarations.  */
-#undef  ASM_DECLARE_FUNCTION_SIZE
-#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL)		\
-  do								\
-    {								\
-      ARM_OUTPUT_FN_UNWIND (FILE, FALSE);			\
-      if (!flag_inhibit_size_directive)				\
-	ASM_OUTPUT_MEASURED_SIZE (FILE, FNAME);			\
-    }								\
-  while (0)
-
-/* Define this macro if jump tables (for `tablejump' insns) should be
-   output in the text section, along with the assembler instructions.
-   Otherwise, the readonly data section is used.  */
-/* We put ARM and Thumb-2 jump tables in the text section, because it makes
-   the code more efficient, but for Thumb-1 it's better to put them out of
-   band unless we are generating compressed tables.  */
-#define JUMP_TABLES_IN_TEXT_SECTION					\
-   (TARGET_32BIT || (TARGET_THUMB && (optimize_size || flag_pic)))
-
-#ifndef LINK_SPEC
-#define LINK_SPEC "%{mbig-endian:-EB} %{mlittle-endian:-EL} -X"
-#endif
-  
-/* Run-time Target Specification.  */
-#ifndef TARGET_DEFAULT
-#define TARGET_DEFAULT (MASK_APCS_FRAME)
-#endif
-
-#ifndef MULTILIB_DEFAULTS
-#define MULTILIB_DEFAULTS \
-  { "marm", "mlittle-endian", "mfloat-abi=soft", "mno-thumb-interwork", "fno-leading-underscore" }
-#endif
-
-#define TARGET_ASM_FILE_START_APP_OFF true
-#define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
-
-
-/* Output an element in the static constructor array.  */
-#undef TARGET_ASM_CONSTRUCTOR
-#define TARGET_ASM_CONSTRUCTOR arm_elf_asm_constructor
-
-#undef TARGET_ASM_DESTRUCTOR
-#define TARGET_ASM_DESTRUCTOR arm_elf_asm_destructor
-
-/* For PIC code we need to explicitly specify (PLT) and (GOT) relocs.  */
-#define NEED_PLT_RELOC	flag_pic
-#define NEED_GOT_RELOC	flag_pic
-
-/* The ELF assembler handles GOT addressing differently to NetBSD.  */
-#define GOT_PCREL	0
-
-/* Align output to a power of two.  Note ".align 0" is redundant,
-   and also GAS will treat it as ".align 2" which we do not want.  */
-#define ASM_OUTPUT_ALIGN(STREAM, POWER)			\
-  do							\
-    {							\
-      if ((POWER) > 0)					\
-	fprintf (STREAM, "\t.align\t%d\n", POWER);	\
-    }							\
-  while (0)
-
-/* Horrible hack: We want to prevent some libgcc routines being included
-   for some multilibs.  */
-#ifndef __ARM_ARCH_6M__
-#undef L_fixdfsi
-#undef L_fixunsdfsi
-#undef L_truncdfsf2
-#undef L_fixsfsi
-#undef L_fixunssfsi
-#undef L_floatdidf
-#undef L_floatdisf
-#undef L_floatundidf
-#undef L_floatundisf
-#endif
-
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/linux-eabi.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/linux-eabi.h
deleted file mode 100644
index 33bb9ba..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/linux-eabi.h
+++ /dev/null
@@ -1,139 +0,0 @@
-/* Configuration file for ARM GNU/Linux EABI targets.
-   Copyright (C) 2004-2014 Free Software Foundation, Inc.
-   Contributed by CodeSourcery, LLC   
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3, or (at your
-   option) any later version.
-
-   GCC 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 General Public
-   License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with GCC; see the file COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-/* On EABI GNU/Linux, we want both the BPABI builtins and the
-   GNU/Linux builtins.  */
-#undef  TARGET_OS_CPP_BUILTINS
-#define TARGET_OS_CPP_BUILTINS() 		\
-  do 						\
-    {						\
-      TARGET_BPABI_CPP_BUILTINS();		\
-      GNU_USER_TARGET_OS_CPP_BUILTINS();	\
-      ANDROID_TARGET_OS_CPP_BUILTINS();		\
-    }						\
-  while (false)
-
-/* We default to a soft-float ABI so that binaries can run on all
-   target hardware.  If you override this to use the hard-float ABI then
-   change the setting of GLIBC_DYNAMIC_LINKER_DEFAULT as well.  */
-#undef  TARGET_DEFAULT_FLOAT_ABI
-#define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_SOFT
-
-/* We default to the "aapcs-linux" ABI so that enums are int-sized by
-   default.  */
-#undef  ARM_DEFAULT_ABI
-#define ARM_DEFAULT_ABI ARM_ABI_AAPCS_LINUX
-
-/* Default to armv5t so that thumb shared libraries work.
-   The ARM10TDMI core is the default for armv5t, so set
-   SUBTARGET_CPU_DEFAULT to achieve this.  */
-#undef  SUBTARGET_CPU_DEFAULT
-#define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm9tdmi
-
-/* TARGET_BIG_ENDIAN_DEFAULT is set in
-   config.gcc for big endian configurations.  */
-#undef  TARGET_LINKER_EMULATION
-#if TARGET_BIG_ENDIAN_DEFAULT
-#define TARGET_LINKER_EMULATION "armelfb_linux_eabi"
-#else
-#define TARGET_LINKER_EMULATION "armelf_linux_eabi"
-#endif
-
-#undef  SUBTARGET_EXTRA_LINK_SPEC
-#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION
-
-/* GNU/Linux on ARM currently supports three dynamic linkers:
-   - ld-linux.so.2 - for the legacy ABI
-   - ld-linux.so.3 - for the EABI-derived soft-float ABI
-   - ld-linux-armhf.so.3 - for the EABI-derived hard-float ABI.
-   All the dynamic linkers live in /lib.
-   We default to soft-float, but this can be overridden by changing both
-   GLIBC_DYNAMIC_LINKER_DEFAULT and TARGET_DEFAULT_FLOAT_ABI.  */
-
-#undef  GLIBC_DYNAMIC_LINKER
-#define GLIBC_DYNAMIC_LINKER_SOFT_FLOAT "/lib/ld-linux.so.3"
-#define GLIBC_DYNAMIC_LINKER_HARD_FLOAT "/lib/ld-linux-armhf.so.3"
-#define GLIBC_DYNAMIC_LINKER_DEFAULT GLIBC_DYNAMIC_LINKER_SOFT_FLOAT
-
-#define GLIBC_DYNAMIC_LINKER \
-   "%{mfloat-abi=hard:" GLIBC_DYNAMIC_LINKER_HARD_FLOAT "} \
-    %{mfloat-abi=soft*:" GLIBC_DYNAMIC_LINKER_SOFT_FLOAT "} \
-    %{!mfloat-abi=*:" GLIBC_DYNAMIC_LINKER_DEFAULT "}"
-
-/* For ARM musl currently supports four dynamic linkers:
-   - ld-musl-arm.so.1 - for the EABI-derived soft-float ABI
-   - ld-musl-armhf.so.1 - for the EABI-derived hard-float ABI
-   - ld-musl-armeb.so.1 - for the EABI-derived soft-float ABI, EB
-   - ld-musl-armebhf.so.1 - for the EABI-derived hard-float ABI, EB
-   musl does not support the legacy OABI mode.
-   All the dynamic linkers live in /lib.
-   We default to soft-float, EL. */
-#undef  MUSL_DYNAMIC_LINKER
-#if TARGET_BIG_ENDIAN_DEFAULT
-#define MUSL_DYNAMIC_LINKER_E "%{mlittle-endian:;:eb}"
-#else
-#define MUSL_DYNAMIC_LINKER_E "%{mbig-endian:eb}"
-#endif
-#define MUSL_DYNAMIC_LINKER \
-  "/lib/ld-musl-arm" MUSL_DYNAMIC_LINKER_E "%{mfloat-abi=hard:hf}.so.1"
-
-/* At this point, bpabi.h will have clobbered LINK_SPEC.  We want to
-   use the GNU/Linux version, not the generic BPABI version.  */
-#undef  LINK_SPEC
-#define LINK_SPEC EABI_LINK_SPEC					\
-  LINUX_OR_ANDROID_LD (LINUX_TARGET_LINK_SPEC,				\
-		       LINUX_TARGET_LINK_SPEC " " ANDROID_LINK_SPEC)
-
-#undef  ASAN_CC1_SPEC
-#define ASAN_CC1_SPEC "%{%:sanitize(address):-funwind-tables}"
-
-#undef  CC1_SPEC
-#define CC1_SPEC							\
-  LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC,	\
-		       GNU_USER_TARGET_CC1_SPEC " " ASAN_CC1_SPEC " "	\
-		       ANDROID_CC1_SPEC)
-
-#define CC1PLUS_SPEC \
-  LINUX_OR_ANDROID_CC ("", ANDROID_CC1PLUS_SPEC)
-
-#undef  LIB_SPEC
-#define LIB_SPEC							\
-  LINUX_OR_ANDROID_LD (GNU_USER_TARGET_LIB_SPEC,			\
-		    GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC " " ANDROID_LIB_SPEC)
-
-#undef	STARTFILE_SPEC
-#define STARTFILE_SPEC \
-  LINUX_OR_ANDROID_LD (GNU_USER_TARGET_STARTFILE_SPEC, ANDROID_STARTFILE_SPEC)
-
-#undef	ENDFILE_SPEC
-#define ENDFILE_SPEC \
-  LINUX_OR_ANDROID_LD (GNU_USER_TARGET_ENDFILE_SPEC, ANDROID_ENDFILE_SPEC)
-
-/* Use the default LIBGCC_SPEC, not the version in linux-elf.h, as we
-   do not use -lfloat.  */
-#undef LIBGCC_SPEC
-
-/* Clear the instruction cache from `beg' to `end'.  This is
-   implemented in lib1funcs.S, so ensure an error if this definition
-   is used.  */
-#undef  CLEAR_INSN_CACHE
-#define CLEAR_INSN_CACHE(BEG, END) not_used
-
-#define ARM_TARGET2_DWARF_FORMAT (DW_EH_PE_pcrel | DW_EH_PE_indirect)
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/linux-elf.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/linux-elf.h
deleted file mode 100644
index 8fc7aeb..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/linux-elf.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/* Definitions for ARM running Linux-based GNU systems using ELF
-   Copyright (C) 1993-2014 Free Software Foundation, Inc.
-   Contributed by Philip Blundell <philb@gnu.org>
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3, or (at your
-   option) any later version.
-
-   GCC 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 General Public
-   License for more details.
-
-   Under Section 7 of GPL version 3, you are granted additional
-   permissions described in the GCC Runtime Library Exception, version
-   3.1, as published by the Free Software Foundation.
-
-   You should have received a copy of the GNU General Public License and
-   a copy of the GCC Runtime Library Exception along with this program;
-   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* elfos.h should have already been included.  Now just override
-   any conflicting definitions and add any extras.  */
-
-/* Run-time Target Specification.  */
-#undef  TARGET_DEFAULT_FLOAT_ABI
-#define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_HARD
-
-/* TARGET_BIG_ENDIAN_DEFAULT is set in
-   config.gcc for big endian configurations.  */
-#if TARGET_BIG_ENDIAN_DEFAULT
-#define TARGET_ENDIAN_DEFAULT    MASK_BIG_END
-#define TARGET_ENDIAN_OPTION     "mbig-endian"
-#define TARGET_LINKER_EMULATION  "armelfb_linux"
-#else
-#define TARGET_ENDIAN_DEFAULT    0
-#define TARGET_ENDIAN_OPTION     "mlittle-endian"
-#define TARGET_LINKER_EMULATION  "armelf_linux"
-#endif
-
-#undef  TARGET_DEFAULT
-#define TARGET_DEFAULT (TARGET_ENDIAN_DEFAULT)
-
-#define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6
-
-#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p"
-
-/* We do not have any MULTILIB_OPTIONS specified, so there are no
-   MULTILIB_DEFAULTS.  */
-#undef  MULTILIB_DEFAULTS
-
-/* Now we define the strings used to build the spec file.  */
-#undef  LIB_SPEC
-#define LIB_SPEC \
-  "%{pthread:-lpthread} \
-   %{shared:-lc} \
-   %{!shared:%{profile:-lc_p}%{!profile:-lc}}"
-
-#define LIBGCC_SPEC "-lgcc"
-
-#define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2"
-
-#define LINUX_TARGET_LINK_SPEC  "%{h*} \
-   %{static:-Bstatic} \
-   %{shared:-shared} \
-   %{symbolic:-Bsymbolic} \
-   %{!static: \
-     %{rdynamic:-export-dynamic} \
-     -dynamic-linker " GNU_USER_DYNAMIC_LINKER "} \
-   -X \
-   %{mbig-endian:-EB} %{mlittle-endian:-EL}" \
-   SUBTARGET_EXTRA_LINK_SPEC
-
-#undef  LINK_SPEC
-#define LINK_SPEC LINUX_TARGET_LINK_SPEC
-
-#define TARGET_OS_CPP_BUILTINS()		\
-  do						\
-    {						\
-	GNU_USER_TARGET_OS_CPP_BUILTINS();	\
-    }						\
-  while (0)
-
-/* This is how we tell the assembler that two symbols have the same value.  */
-#define ASM_OUTPUT_DEF(FILE, NAME1, NAME2) \
-  do					   \
-    {					   \
-      assemble_name (FILE, NAME1); 	   \
-      fputs (" = ", FILE);		   \
-      assemble_name (FILE, NAME2);	   \
-      fputc ('\n', FILE);		   \
-    }					   \
-  while (0)
-
-#undef  FPUTYPE_DEFAULT
-#define FPUTYPE_DEFAULT "vfp"
-
-/* Call the function profiler with a given profile label.  */
-#undef  ARM_FUNCTION_PROFILER
-#define ARM_FUNCTION_PROFILER(STREAM, LABELNO)  			\
-{									\
-  fprintf (STREAM, "\tbl\tmcount%s\n",					\
-	   (TARGET_ARM && NEED_PLT_RELOC) ? "(PLT)" : "");		\
-}
-
-/* The GNU/Linux profiler clobbers the link register.  Make sure the
-   prologue knows to save it.  */
-#define PROFILE_HOOK(X)						\
-  emit_clobber (gen_rtx_REG (SImode, LR_REGNUM))
-
-/* The GNU/Linux profiler needs a frame pointer.  */
-#define SUBTARGET_FRAME_POINTER_REQUIRED crtl->profile
-
-/* Add .note.GNU-stack.  */
-#undef NEED_INDICATE_EXEC_STACK
-#define NEED_INDICATE_EXEC_STACK	1
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/linux-gas.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/linux-gas.h
deleted file mode 100644
index 1dd0437..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/arm/linux-gas.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Definitions of target machine for GNU compiler.
-   ARM Linux-based GNU systems version.
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
-   Contributed by Russell King  <rmk92@ecs.soton.ac.uk>.
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3, or (at your
-   option) any later version.
-
-   GCC 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 General Public
-   License for more details.
-
-   Under Section 7 of GPL version 3, you are granted additional
-   permissions described in the GCC Runtime Library Exception, version
-   3.1, as published by the Free Software Foundation.
-
-   You should have received a copy of the GNU General Public License and
-   a copy of the GCC Runtime Library Exception along with this program;
-   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This is how we tell the assembler that a symbol is weak.
-   GAS always supports weak symbols.  */
-
-/* Unsigned chars produces much better code than signed.  */
-#define DEFAULT_SIGNED_CHAR 0
-
-#undef  SUBTARGET_CPP_SPEC
-#define SUBTARGET_CPP_SPEC  "%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}"
-
-#undef  SIZE_TYPE
-#define SIZE_TYPE "unsigned int"
-
-#undef  PTRDIFF_TYPE
-#define PTRDIFF_TYPE "int"
-
-/* Use the AAPCS type for wchar_t, or the previous Linux default for
-   non-AAPCS.  */
-#undef WCHAR_TYPE
-#define WCHAR_TYPE (TARGET_AAPCS_BASED ? "unsigned int" : "long int")
-
-#undef  WCHAR_TYPE_SIZE
-#define WCHAR_TYPE_SIZE BITS_PER_WORD
-
-/* Clear the instruction cache from `beg' to `end'.  This makes an
-   inline system call to SYS_cacheflush.  */
-#define CLEAR_INSN_CACHE(BEG, END)					\
-{									\
-  register unsigned long _beg __asm ("a1") = (unsigned long) (BEG);	\
-  register unsigned long _end __asm ("a2") = (unsigned long) (END);	\
-  register unsigned long _flg __asm ("a3") = 0;				\
-  __asm __volatile ("swi 0x9f0002		@ sys_cacheflush"	\
-		    : "=r" (_beg)					\
-		    : "0" (_beg), "r" (_end), "r" (_flg));		\
-}
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/dbxelf.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/dbxelf.h
deleted file mode 100644
index 4819cfa..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/dbxelf.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Definitions needed when using stabs embedded in ELF sections.
-   Copyright (C) 1999-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-Under Section 7 of GPL version 3, you are granted additional
-permissions described in the GCC Runtime Library Exception, version
-3.1, as published by the Free Software Foundation.
-
-You should have received a copy of the GNU General Public License and
-a copy of the GCC Runtime Library Exception along with this program;
-see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-<http://www.gnu.org/licenses/>.  */
-
-/* This file may be included by any ELF target which wishes to
-   support -gstabs generating stabs in sections, as produced by gas
-   and understood by gdb.  */
-
-#ifndef GCC_DBX_ELF_H
-#define GCC_DBX_ELF_H
-
-/* Output DBX (stabs) debugging information if doing -gstabs.  */
-
-#define DBX_DEBUGGING_INFO 1
-
-/* Make LBRAC and RBRAC addresses relative to the start of the
-   function.  The native Solaris stabs debugging format works this
-   way, gdb expects it, and it reduces the number of relocation
-   entries...  */
-
-#define DBX_BLOCKS_FUNCTION_RELATIVE 1
-
-/* ... but, to make this work, functions must appear prior to line info.  */
-
-#define DBX_FUNCTION_FIRST
-
-/* When generating stabs debugging, use N_BINCL entries.  */
-
-#define DBX_USE_BINCL
-
-/* There is no limit to the length of stabs strings.  */
-
-#ifndef DBX_CONTIN_LENGTH
-#define DBX_CONTIN_LENGTH 0
-#endif
-
-/* Like block addresses, stabs line numbers are relative to the
-   current function.  */
-
-#define DBX_LINES_FUNCTION_RELATIVE 1
-
-/* Generate a blank trailing N_SO to mark the end of the .o file, since
-   we can't depend upon the linker to mark .o file boundaries with
-   embedded stabs.  */
-
-#define DBX_OUTPUT_NULL_N_SO_AT_MAIN_SOURCE_FILE_END
-
-#endif /* ! GCC_DBX_ELF_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/elfos.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/elfos.h
deleted file mode 100644
index c1d5553..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/elfos.h
+++ /dev/null
@@ -1,438 +0,0 @@
-/* elfos.h  --  operating system specific defines to be used when
-   targeting GCC for some generic ELF system
-   Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   Based on svr4.h contributed by Ron Guilmette (rfg@netcom.com).
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-Under Section 7 of GPL version 3, you are granted additional
-permissions described in the GCC Runtime Library Exception, version
-3.1, as published by the Free Software Foundation.
-
-You should have received a copy of the GNU General Public License and
-a copy of the GCC Runtime Library Exception along with this program;
-see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-<http://www.gnu.org/licenses/>.  */
-
-#define TARGET_OBJFMT_CPP_BUILTINS()		\
-  do						\
-    {						\
-	builtin_define ("__ELF__");		\
-    }						\
-  while (0)
-
-/* Define a symbol indicating that we are using elfos.h.
-   Some CPU specific configuration files use this.  */
-#define USING_ELFOS_H
-
-/* The prefix to add to user-visible assembler symbols.
-
-   For ELF systems the convention is *not* to prepend a leading
-   underscore onto user-level symbol names.  */
-
-#undef  USER_LABEL_PREFIX
-#define USER_LABEL_PREFIX ""
-
-/* The biggest alignment supported by ELF in bits. 32-bit ELF 
-   supports section alignment up to (0x80000000 * 8), while 
-   64-bit ELF supports (0x8000000000000000 * 8). If this macro 
-   is not defined, the default is the largest alignment supported 
-   by 32-bit ELF and representable on a 32-bit host. Use this
-   macro to limit the alignment which can be specified using
-   the `__attribute__ ((aligned (N)))' construct.  */
-#ifndef MAX_OFILE_ALIGNMENT
-#define MAX_OFILE_ALIGNMENT (((unsigned int) 1 << 28) * 8)
-#endif
-
-/* Use periods rather than dollar signs in special g++ assembler names.  */
-
-#define NO_DOLLAR_IN_LABEL
-
-/* Writing `int' for a bit-field forces int alignment for the structure.  */
-
-#ifndef PCC_BITFIELD_TYPE_MATTERS
-#define PCC_BITFIELD_TYPE_MATTERS 1
-#endif
-
-/* All ELF targets can support DWARF-2.  */
-
-#define DWARF2_DEBUGGING_INFO 1
-
-/* The GNU tools operate better with dwarf2, and it is required by some
-   psABI's.  Since we don't have any native tools to be compatible with,
-   default to dwarf2.  */
-
-#ifndef PREFERRED_DEBUGGING_TYPE
-#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
-#endif
-
-/* All SVR4 targets use the ELF object file format.  */
-#define OBJECT_FORMAT_ELF
-
-
-/* Output #ident as a .ident.  */
-
-#undef TARGET_ASM_OUTPUT_IDENT
-#define TARGET_ASM_OUTPUT_IDENT default_asm_output_ident_directive
-
-#undef  SET_ASM_OP
-#define SET_ASM_OP	"\t.set\t"
-
-/* Most svr4 assemblers want a .file directive at the beginning of
-   their input file.  */
-#define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
-
-/* This is how to allocate empty space in some section.  The .zero
-   pseudo-op is used for this on most svr4 assemblers.  */
-
-#define SKIP_ASM_OP	"\t.zero\t"
-
-#undef  ASM_OUTPUT_SKIP
-#define ASM_OUTPUT_SKIP(FILE, SIZE) \
-   fprintf ((FILE), "%s"HOST_WIDE_INT_PRINT_UNSIGNED"\n",\
-	    SKIP_ASM_OP, (SIZE))
-
-/* This is how to store into the string LABEL
-   the symbol_ref name of an internal numbered label where
-   PREFIX is the class of label and NUM is the number within the class.
-   This is suitable for output with `assemble_name'.
-
-   For most svr4 systems, the convention is that any symbol which begins
-   with a period is not put into the linker symbol table by the assembler.  */
-
-#undef  ASM_GENERATE_INTERNAL_LABEL
-#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM)		\
-  do								\
-    {								\
-      char *__p;						\
-      (LABEL)[0] = '*';						\
-      (LABEL)[1] = '.';						\
-      __p = stpcpy (&(LABEL)[2], PREFIX);			\
-      sprint_ul (__p, (unsigned long) (NUM));			\
-    }								\
-  while (0)
-
-/* Output the label which precedes a jumptable.  Note that for all svr4
-   systems where we actually generate jumptables (which is to say every
-   svr4 target except i386, where we use casesi instead) we put the jump-
-   tables into the .rodata section and since other stuff could have been
-   put into the .rodata section prior to any given jumptable, we have to
-   make sure that the location counter for the .rodata section gets pro-
-   perly re-aligned prior to the actual beginning of the jump table.  */
-
-#undef ALIGN_ASM_OP
-#define ALIGN_ASM_OP "\t.align\t"
-
-#ifndef ASM_OUTPUT_BEFORE_CASE_LABEL
-#define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE, PREFIX, NUM, TABLE) \
-  ASM_OUTPUT_ALIGN ((FILE), 2);
-#endif
-
-#undef  ASM_OUTPUT_CASE_LABEL
-#define ASM_OUTPUT_CASE_LABEL(FILE, PREFIX, NUM, JUMPTABLE)		\
-  do									\
-    {									\
-      ASM_OUTPUT_BEFORE_CASE_LABEL (FILE, PREFIX, NUM, JUMPTABLE)	\
-	(*targetm.asm_out.internal_label) (FILE, PREFIX, NUM);			\
-    }									\
-  while (0)
-
-/* The standard SVR4 assembler seems to require that certain builtin
-   library routines (e.g. .udiv) be explicitly declared as .globl
-   in each assembly file where they are referenced.  */
-
-#define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN)	\
-  (*targetm.asm_out.globalize_label) (FILE, XSTR (FUN, 0))
-
-/* This says how to output assembler code to declare an
-   uninitialized external linkage data object.  Under SVR4,
-   the linker seems to want the alignment of data objects
-   to depend on their types.  We do exactly that here.  */
-
-#define COMMON_ASM_OP	"\t.comm\t"
-
-#undef  ASM_OUTPUT_ALIGNED_COMMON
-#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN)		\
-  do									\
-    {									\
-      fprintf ((FILE), "%s", COMMON_ASM_OP);				\
-      assemble_name ((FILE), (NAME));					\
-      fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n",		\
-	       (SIZE), (ALIGN) / BITS_PER_UNIT);			\
-    }									\
-  while (0)
-
-/* This says how to output assembler code to declare an
-   uninitialized internal linkage data object.  Under SVR4,
-   the linker seems to want the alignment of data objects
-   to depend on their types.  We do exactly that here.  */
-
-#define LOCAL_ASM_OP	"\t.local\t"
-
-#undef  ASM_OUTPUT_ALIGNED_LOCAL
-#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN)	\
-  do								\
-    {								\
-      fprintf ((FILE), "%s", LOCAL_ASM_OP);			\
-      assemble_name ((FILE), (NAME));				\
-      fprintf ((FILE), "\n");					\
-      ASM_OUTPUT_ALIGNED_COMMON (FILE, NAME, SIZE, ALIGN);	\
-    }								\
-  while (0)
-
-/* This is the pseudo-op used to generate a contiguous sequence of byte
-   values from a double-quoted string WITHOUT HAVING A TERMINATING NUL
-   AUTOMATICALLY APPENDED.  This is the same for most svr4 assemblers.  */
-
-#undef  ASCII_DATA_ASM_OP
-#define ASCII_DATA_ASM_OP	"\t.ascii\t"
-
-/* Support a read-only data section.  */
-#define READONLY_DATA_SECTION_ASM_OP	"\t.section\t.rodata"
-
-/* On svr4, we *do* have support for the .init and .fini sections, and we
-   can put stuff in there to be executed before and after `main'.  We let
-   crtstuff.c and other files know this by defining the following symbols.
-   The definitions say how to change sections to the .init and .fini
-   sections.  This is the same for all known svr4 assemblers.  */
-
-#define INIT_SECTION_ASM_OP	"\t.section\t.init"
-#define FINI_SECTION_ASM_OP	"\t.section\t.fini"
-
-/* Output assembly directive to move to the beginning of current section.  */
-#ifdef HAVE_GAS_SUBSECTION_ORDERING
-# define ASM_SECTION_START_OP	"\t.subsection\t-1"
-# define ASM_OUTPUT_SECTION_START(FILE)	\
-  fprintf ((FILE), "%s\n", ASM_SECTION_START_OP)
-#endif
-
-#define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)
-
-/* Switch into a generic section.  */
-#define TARGET_ASM_NAMED_SECTION  default_elf_asm_named_section
-
-#undef  TARGET_ASM_SELECT_RTX_SECTION
-#define TARGET_ASM_SELECT_RTX_SECTION default_elf_select_rtx_section
-#undef	TARGET_ASM_SELECT_SECTION
-#define TARGET_ASM_SELECT_SECTION default_elf_select_section
-#undef  TARGET_HAVE_SWITCHABLE_BSS_SECTIONS
-#define TARGET_HAVE_SWITCHABLE_BSS_SECTIONS true
-
-/* Define the strings used for the special svr4 .type and .size directives.
-   These strings generally do not vary from one system running svr4 to
-   another, but if a given system (e.g. m88k running svr) needs to use
-   different pseudo-op names for these, they may be overridden in the
-   file which includes this one.  */
-
-#define TYPE_ASM_OP	"\t.type\t"
-#define SIZE_ASM_OP	"\t.size\t"
-
-/* This is how we tell the assembler that a symbol is weak.  */
-
-#define ASM_WEAKEN_LABEL(FILE, NAME)	\
-  do					\
-    {					\
-      fputs ("\t.weak\t", (FILE));	\
-      assemble_name ((FILE), (NAME));	\
-      fputc ('\n', (FILE));		\
-    }					\
-  while (0)
-
-/* The following macro defines the format used to output the second
-   operand of the .type assembler directive.  Different svr4 assemblers
-   expect various different forms for this operand.  The one given here
-   is just a default.  You may need to override it in your machine-
-   specific tm.h file (depending upon the particulars of your assembler).  */
-
-#define TYPE_OPERAND_FMT	"@%s"
-
-/* Write the extra assembler code needed to declare a function's result.
-   Most svr4 assemblers don't require any special declaration of the
-   result value, but there are exceptions.  */
-
-#ifndef ASM_DECLARE_RESULT
-#define ASM_DECLARE_RESULT(FILE, RESULT)
-#endif
-
-/* These macros generate the special .type and .size directives which
-   are used to set the corresponding fields of the linker symbol table
-   entries in an ELF object file under SVR4.  These macros also output
-   the starting labels for the relevant functions/objects.  */
-
-/* Write the extra assembler code needed to declare a function properly.
-   Some svr4 assemblers need to also have something extra said about the
-   function's return value.  We allow for that here.  */
-
-#ifndef ASM_DECLARE_FUNCTION_NAME
-#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)		\
-  do								\
-    {								\
-      ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function");	\
-      ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL));		\
-      ASM_OUTPUT_FUNCTION_LABEL (FILE, NAME, DECL);		\
-    }								\
-  while (0)
-#endif
-
-/* Write the extra assembler code needed to declare an object properly.  */
-
-#ifdef HAVE_GAS_GNU_UNIQUE_OBJECT
-#define USE_GNU_UNIQUE_OBJECT flag_gnu_unique
-#else
-#define USE_GNU_UNIQUE_OBJECT 0
-#endif
-
-#define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)			\
-  do									\
-    {									\
-      HOST_WIDE_INT size;						\
-									\
-      /* For template static data member instantiations or		\
-	 inline fn local statics and their guard variables, use		\
-	 gnu_unique_object so that they will be combined even under	\
-	 RTLD_LOCAL.  Don't use gnu_unique_object for typeinfo,		\
-	 vtables and other read-only artificial decls.  */		\
-      if (USE_GNU_UNIQUE_OBJECT && DECL_ONE_ONLY (DECL)			\
-	  && (!DECL_ARTIFICIAL (DECL) || !TREE_READONLY (DECL)))	\
-	ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "gnu_unique_object");	\
-      else								\
-	ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object");		\
-									\
-      size_directive_output = 0;					\
-      if (!flag_inhibit_size_directive					\
-	  && (DECL) && DECL_SIZE (DECL))				\
-	{								\
-	  size_directive_output = 1;					\
-	  size = int_size_in_bytes (TREE_TYPE (DECL));			\
-	  ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, size);			\
-	}								\
-									\
-      ASM_OUTPUT_LABEL (FILE, NAME);					\
-    }									\
-  while (0)
-
-/* Output the size directive for a decl in rest_of_decl_compilation
-   in the case where we did not do so before the initializer.
-   Once we find the error_mark_node, we know that the value of
-   size_directive_output was set
-   by ASM_DECLARE_OBJECT_NAME when it was run for the same decl.  */
-
-#undef ASM_FINISH_DECLARE_OBJECT
-#define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END)\
-  do								\
-    {								\
-      const char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0);	\
-      HOST_WIDE_INT size;					\
-								\
-      if (!flag_inhibit_size_directive				\
-	  && DECL_SIZE (DECL)					\
-	  && ! AT_END && TOP_LEVEL				\
-	  && DECL_INITIAL (DECL) == error_mark_node		\
-	  && !size_directive_output)				\
-	{							\
-	  size_directive_output = 1;				\
-	  size = int_size_in_bytes (TREE_TYPE (DECL));		\
-	  ASM_OUTPUT_SIZE_DIRECTIVE (FILE, name, size);		\
-	}							\
-    }								\
-  while (0)
-
-/* This is how to declare the size of a function.  */
-#ifndef ASM_DECLARE_FUNCTION_SIZE
-#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL)		\
-  do								\
-    {								\
-      if (!flag_inhibit_size_directive)				\
-	ASM_OUTPUT_MEASURED_SIZE (FILE, FNAME);			\
-    }								\
-  while (0)
-#endif
-
-/* A table of bytes codes used by the ASM_OUTPUT_ASCII and
-   ASM_OUTPUT_LIMITED_STRING macros.  Each byte in the table
-   corresponds to a particular byte value [0..255].  For any
-   given byte value, if the value in the corresponding table
-   position is zero, the given character can be output directly.
-   If the table value is 1, the byte must be output as a \ooo
-   octal escape.  If the tables value is anything else, then the
-   byte value should be output as a \ followed by the value
-   in the table.  Note that we can use standard UN*X escape
-   sequences for many control characters, but we don't use
-   \a to represent BEL because some svr4 assemblers (e.g. on
-   the i386) don't know about that.  Also, we don't use \v
-   since some versions of gas, such as 2.2 did not accept it.  */
-
-#define ELF_ASCII_ESCAPES \
-"\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
-\0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\
-\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
-\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
-\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
-\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1"
-
-/* Some svr4 assemblers have a limit on the number of characters which
-   can appear in the operand of a .string directive.  If your assembler
-   has such a limitation, you should define STRING_LIMIT to reflect that
-   limit.  Note that at least some svr4 assemblers have a limit on the
-   actual number of bytes in the double-quoted string, and that they
-   count each character in an escape sequence as one byte.  Thus, an
-   escape sequence like \377 would count as four bytes.
-
-   If your target assembler doesn't support the .string directive, you
-   should define this to zero.
-*/
-
-#define ELF_STRING_LIMIT	((unsigned) 256)
-
-#define STRING_ASM_OP	"\t.string\t"
-
-/* The routine used to output NUL terminated strings.  We use a special
-   version of this for most svr4 targets because doing so makes the
-   generated assembly code more compact (and thus faster to assemble)
-   as well as more readable, especially for targets like the i386
-   (where the only alternative is to output character sequences as
-   comma separated lists of numbers).  */
-
-#define ASM_OUTPUT_LIMITED_STRING(FILE, STR)		\
-  default_elf_asm_output_limited_string ((FILE), (STR))
-
-/* The routine used to output sequences of byte values.  We use a special
-   version of this for most svr4 targets because doing so makes the
-   generated assembly code more compact (and thus faster to assemble)
-   as well as more readable.  Note that if we find subparts of the
-   character sequence which end with NUL (and which are shorter than
-   STRING_LIMIT) we output those using ASM_OUTPUT_LIMITED_STRING.  */
-
-#undef  ASM_OUTPUT_ASCII
-#define ASM_OUTPUT_ASCII(FILE, STR, LENGTH)			\
-  default_elf_asm_output_ascii ((FILE), (STR), (LENGTH));
-
-/* Allow the use of the -frecord-gcc-switches switch via the
-   elf_record_gcc_switches function defined in varasm.c.  */
-#undef  TARGET_ASM_RECORD_GCC_SWITCHES
-#define TARGET_ASM_RECORD_GCC_SWITCHES elf_record_gcc_switches
-
-/* A C statement (sans semicolon) to output to the stdio stream STREAM
-   any text necessary for declaring the name of an external symbol
-   named NAME which is referenced in this compilation but not defined.
-   It is needed to properly support non-default visibility.  */
-
-#ifndef ASM_OUTPUT_EXTERNAL
-#define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \
-  default_elf_asm_output_external (FILE, DECL, NAME)
-#endif
-
-#undef TARGET_LIBC_HAS_FUNCTION
-#define TARGET_LIBC_HAS_FUNCTION no_c99_libc_has_function
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/glibc-stdint.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/glibc-stdint.h
deleted file mode 100644
index 7fa22a9..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/glibc-stdint.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Definitions for <stdint.h> types on systems using GNU libc or uClibc.
-   Copyright (C) 2008-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-Under Section 7 of GPL version 3, you are granted additional
-permissions described in the GCC Runtime Library Exception, version
-3.1, as published by the Free Software Foundation.
-
-You should have received a copy of the GNU General Public License and
-a copy of the GCC Runtime Library Exception along with this program;
-see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-<http://www.gnu.org/licenses/>.  */
-
-#define SIG_ATOMIC_TYPE "int"
-
-#define INT8_TYPE "signed char"
-#define INT16_TYPE "short int"
-#define INT32_TYPE "int"
-#define INT64_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "long long int")
-#define UINT8_TYPE "unsigned char"
-#define UINT16_TYPE "short unsigned int"
-#define UINT32_TYPE "unsigned int"
-#define UINT64_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "long long unsigned int")
-
-#define INT_LEAST8_TYPE "signed char"
-#define INT_LEAST16_TYPE "short int"
-#define INT_LEAST32_TYPE "int"
-#define INT_LEAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "long long int")
-#define UINT_LEAST8_TYPE "unsigned char"
-#define UINT_LEAST16_TYPE "short unsigned int"
-#define UINT_LEAST32_TYPE "unsigned int"
-#define UINT_LEAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "long long unsigned int")
-
-#define INT_FAST8_TYPE "signed char"
-#define INT_FAST16_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "int")
-#define INT_FAST32_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "int")
-#define INT_FAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "long long int")
-#define UINT_FAST8_TYPE "unsigned char"
-#define UINT_FAST16_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "unsigned int")
-#define UINT_FAST32_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "unsigned int")
-#define UINT_FAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "long long unsigned int")
-
-#define INTPTR_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "int")
-#define UINTPTR_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "unsigned int")
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/gnu-user.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/gnu-user.h
deleted file mode 100644
index a1955a7..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/gnu-user.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/* Definitions for systems using, at least optionally, a GNU
-   (glibc-based) userspace or other userspace with libc derived from
-   glibc (e.g. uClibc) or for which similar specs are appropriate.
-   Copyright (C) 1995-2014 Free Software Foundation, Inc.
-   Contributed by Eric Youngdale.
-   Modified for stabs-in-ELF by H.J. Lu (hjl@lucon.org).
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-Under Section 7 of GPL version 3, you are granted additional
-permissions described in the GCC Runtime Library Exception, version
-3.1, as published by the Free Software Foundation.
-
-You should have received a copy of the GNU General Public License and
-a copy of the GCC Runtime Library Exception along with this program;
-see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-<http://www.gnu.org/licenses/>.  */
-
-/* Don't assume anything about the header files.  */
-#define NO_IMPLICIT_EXTERN_C
-
-#undef ASM_APP_ON
-#define ASM_APP_ON "#APP\n"
-
-#undef ASM_APP_OFF
-#define ASM_APP_OFF "#NO_APP\n"
-
-/* Provide a STARTFILE_SPEC appropriate for GNU userspace.  Here we add
-   the GNU userspace magical crtbegin.o file (see crtstuff.c) which
-   provides part of the support for getting C++ file-scope static
-   object constructed before entering `main'.  */
-
-#if defined HAVE_LD_PIE
-#define GNU_USER_TARGET_STARTFILE_SPEC \
-  "%{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} \
-   crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s} \
-   %{fvtable-verify=none:%s; \
-     fvtable-verify=preinit:vtv_start_preinit.o%s; \
-     fvtable-verify=std:vtv_start.o%s}"
-#else
-#define GNU_USER_TARGET_STARTFILE_SPEC \
-  "%{!shared: %{pg|p|profile:gcrt1.o%s;:crt1.o%s}} \
-   crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s} \
-   %{fvtable-verify=none:%s; \
-     fvtable-verify=preinit:vtv_start_preinit.o%s; \
-     fvtable-verify=std:vtv_start.o%s}"
-#endif
-#undef  STARTFILE_SPEC
-#define STARTFILE_SPEC GNU_USER_TARGET_STARTFILE_SPEC
-
-/* Provide a ENDFILE_SPEC appropriate for GNU userspace.  Here we tack on
-   the GNU userspace magical crtend.o file (see crtstuff.c) which
-   provides part of the support for getting C++ file-scope static
-   object constructed before entering `main', followed by a normal
-   GNU userspace "finalizer" file, `crtn.o'.  */
-
-#define GNU_USER_TARGET_ENDFILE_SPEC \
-  "%{fvtable-verify=none:%s; \
-     fvtable-verify=preinit:vtv_end_preinit.o%s; \
-     fvtable-verify=std:vtv_end.o%s} \
-   %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
-#undef  ENDFILE_SPEC
-#define ENDFILE_SPEC GNU_USER_TARGET_ENDFILE_SPEC
-
-/* This is for -profile to use -lc_p instead of -lc.  */
-#define GNU_USER_TARGET_CC1_SPEC "%{profile:-p}"
-#ifndef CC1_SPEC
-#define CC1_SPEC GNU_USER_TARGET_CC1_SPEC
-#endif
-
-/* The GNU C++ standard library requires that these macros be defined.  */
-#undef CPLUSPLUS_CPP_SPEC
-#define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)"
-
-#define GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC \
-  "%{shared:-lc} \
-   %{!shared:%{mieee-fp:-lieee} %{profile:-lc_p}%{!profile:-lc}}"
-
-#define GNU_USER_TARGET_LIB_SPEC \
-  "%{pthread:-lpthread} " \
-  GNU_USER_TARGET_NO_PTHREADS_LIB_SPEC
-
-#undef  LIB_SPEC
-#define LIB_SPEC GNU_USER_TARGET_LIB_SPEC
-
-#if defined(HAVE_LD_EH_FRAME_HDR)
-#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
-#endif
-
-#undef LINK_GCC_C_SEQUENCE_SPEC
-#define LINK_GCC_C_SEQUENCE_SPEC \
-  "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
-
-/* Use --as-needed -lgcc_s for eh support.  */
-#ifdef HAVE_LD_AS_NEEDED
-#define USE_LD_AS_NEEDED 1
-#endif
-
-#define TARGET_POSIX_IO
-
-#undef TARGET_LIBC_HAS_FUNCTION
-#define TARGET_LIBC_HAS_FUNCTION gnu_libc_has_function
-
-/* Link -lasan early on the command line.  For -static-libasan, don't link
-   it for -shared link, the executable should be compiled with -static-libasan
-   in that case, and for executable link link with --{,no-}whole-archive around
-   it to force everything into the executable.  And similarly for -ltsan.  */
-#if defined(HAVE_LD_STATIC_DYNAMIC)
-#undef LIBASAN_EARLY_SPEC
-#define LIBASAN_EARLY_SPEC "%{!shared:libasan_preinit%O%s} " \
-  "%{static-libasan:%{!shared:" \
-  LD_STATIC_OPTION " --whole-archive -lasan --no-whole-archive " \
-  LD_DYNAMIC_OPTION "}}%{!static-libasan:-lasan}"
-#undef LIBTSAN_EARLY_SPEC
-#define LIBTSAN_EARLY_SPEC "%{static-libtsan:%{!shared:" \
-  LD_STATIC_OPTION " --whole-archive -ltsan --no-whole-archive " \
-  LD_DYNAMIC_OPTION "}}%{!static-libtsan:-ltsan}"
-#endif
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/initfini-array.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/initfini-array.h
deleted file mode 100644
index 67e66f6..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/initfini-array.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Definitions for ELF systems with .init_array/.fini_array section
-   support.
-   Copyright (C) 2011-2014 Free Software Foundation, Inc.
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3, or (at your
-   option) any later version.
-
-   GCC 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 General Public
-   License for more details.
-
-   Under Section 7 of GPL version 3, you are granted additional
-   permissions described in the GCC Runtime Library Exception, version
-   3.1, as published by the Free Software Foundation.
-
-   You should have received a copy of the GNU General Public License and
-   a copy of the GCC Runtime Library Exception along with this program;
-   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifdef HAVE_INITFINI_ARRAY_SUPPORT
-
-#define USE_INITFINI_ARRAY
-
-#undef INIT_SECTION_ASM_OP
-#undef FINI_SECTION_ASM_OP
-
-#undef INIT_ARRAY_SECTION_ASM_OP
-#define INIT_ARRAY_SECTION_ASM_OP
-
-#undef FINI_ARRAY_SECTION_ASM_OP
-#define FINI_ARRAY_SECTION_ASM_OP
-
-/* Use .init_array/.fini_array section for constructors and destructors. */
-#undef TARGET_ASM_CONSTRUCTOR
-#define TARGET_ASM_CONSTRUCTOR default_elf_init_array_asm_out_constructor
-#undef TARGET_ASM_DESTRUCTOR
-#define TARGET_ASM_DESTRUCTOR default_elf_fini_array_asm_out_destructor
-
-#endif
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/linux-android.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/linux-android.h
deleted file mode 100644
index 26f1a74..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/linux-android.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Configuration file for Linux Android targets.
-   Copyright (C) 2008-2014 Free Software Foundation, Inc.
-   Contributed by Doug Kwan (dougkwan@google.com)
-   Rewritten by CodeSourcery, Inc.
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published
-   by the Free Software Foundation; either version 3, or (at your
-   option) any later version.
-
-   GCC 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 General Public
-   License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with GCC; see the file COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-#define ANDROID_TARGET_OS_CPP_BUILTINS()			\
-    do {							\
-	if (TARGET_ANDROID)					\
-	  builtin_define ("__ANDROID__");			\
-    } while (0)
-
-#if ANDROID_DEFAULT
-# define NOANDROID "mno-android"
-#else
-# define NOANDROID "!mandroid"
-#endif
-
-#define LINUX_OR_ANDROID_CC(LINUX_SPEC, ANDROID_SPEC) \
-  "%{" NOANDROID "|tno-android-cc:" LINUX_SPEC ";:" ANDROID_SPEC "}"
-
-#define LINUX_OR_ANDROID_LD(LINUX_SPEC, ANDROID_SPEC) \
-  "%{" NOANDROID "|tno-android-ld:" LINUX_SPEC ";:" ANDROID_SPEC "}"
-
-#define ANDROID_LINK_SPEC \
-  "%{shared: -Bsymbolic}"
-
-#define ANDROID_CC1_SPEC						\
-  "%{!mglibc:%{!muclibc:%{!mbionic: -mbionic}}} "			\
-  "%{!fno-pic:%{!fno-PIC:%{!fpic:%{!fPIC: -fPIC}}}}"
-
-#define ANDROID_CC1PLUS_SPEC						\
-  "%{!fexceptions:%{!fno-exceptions: -fno-exceptions}} "		\
-  "%{!frtti:%{!fno-rtti: -fno-rtti}}"
-
-#define ANDROID_LIB_SPEC \
-  "%{!static: -ldl}"
-
-#define ANDROID_STARTFILE_SPEC						\
-  "%{shared: crtbegin_so%O%s;:"						\
-  "  %{static: crtbegin_static%O%s;: crtbegin_dynamic%O%s}}"
-
-#define ANDROID_ENDFILE_SPEC \
-  "%{shared: crtend_so%O%s;: crtend_android%O%s}"
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/linux-protos.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/linux-protos.h
deleted file mode 100644
index 80001e9..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/linux-protos.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/* Prototypes.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-extern bool linux_has_ifunc_p (void);
-
-extern bool linux_libc_has_function (enum function_class fn_class);
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/linux.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/linux.h
deleted file mode 100644
index 6312026..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/linux.h
+++ /dev/null
@@ -1,214 +0,0 @@
-/* Definitions for systems using the Linux kernel, with or without
-   MMU, using ELF at the compiler level but possibly FLT for final
-   linked executables and shared libraries in some no-MMU cases, and
-   possibly with a choice of libc implementations.
-   Copyright (C) 1995-2014 Free Software Foundation, Inc.
-   Contributed by Eric Youngdale.
-   Modified for stabs-in-ELF by H.J. Lu (hjl@lucon.org).
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-Under Section 7 of GPL version 3, you are granted additional
-permissions described in the GCC Runtime Library Exception, version
-3.1, as published by the Free Software Foundation.
-
-You should have received a copy of the GNU General Public License and
-a copy of the GCC Runtime Library Exception along with this program;
-see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-<http://www.gnu.org/licenses/>.  */
-
-/* C libraries supported on Linux.  */
-#ifdef SINGLE_LIBC
-#define OPTION_GLIBC  (DEFAULT_LIBC == LIBC_GLIBC)
-#define OPTION_UCLIBC (DEFAULT_LIBC == LIBC_UCLIBC)
-#define OPTION_BIONIC (DEFAULT_LIBC == LIBC_BIONIC)
-#define OPTION_MUSL   (DEFAULT_LIBC == LIBC_MUSL)
-#else
-#define OPTION_GLIBC  (linux_libc == LIBC_GLIBC)
-#define OPTION_UCLIBC (linux_libc == LIBC_UCLIBC)
-#define OPTION_BIONIC (linux_libc == LIBC_BIONIC)
-#define OPTION_MUSL   (linux_libc == LIBC_MUSL)
-#endif
-
-#define GNU_USER_TARGET_OS_CPP_BUILTINS()			\
-    do {							\
-	if (OPTION_GLIBC)					\
-	  builtin_define ("__gnu_linux__");			\
-	builtin_define_std ("linux");				\
-	builtin_define_std ("unix");				\
-	builtin_assert ("system=linux");			\
-	builtin_assert ("system=unix");				\
-	builtin_assert ("system=posix");			\
-    } while (0)
-
-/* Determine which dynamic linker to use depending on whether GLIBC or
-   uClibc or Bionic is the default C library and whether
-   -muclibc or -mglibc or -mbionic has been passed to change the default.  */
-
-#define CHOOSE_DYNAMIC_LINKER1(LIBC1, LIBC2, LIBC3, LIBC4, LD1, LD2, LD3, LD4)	\
-  "%{" LIBC2 ":" LD2 ";:%{" LIBC3 ":" LD3 ";:%{" LIBC4 ":" LD4 ";:" LD1 "}}}"
-
-#if DEFAULT_LIBC == LIBC_GLIBC
-#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \
-  CHOOSE_DYNAMIC_LINKER1 ("mglibc", "muclibc", "mbionic", "mmusl", G, U, B, M)
-#elif DEFAULT_LIBC == LIBC_UCLIBC
-#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \
-  CHOOSE_DYNAMIC_LINKER1 ("muclibc", "mglibc", "mbionic", "mmusl", U, G, B, M)
-#elif DEFAULT_LIBC == LIBC_BIONIC
-#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \
-  CHOOSE_DYNAMIC_LINKER1 ("mbionic", "mglibc", "muclibc", "mmusl", B, G, U, M)
-#elif DEFAULT_LIBC == LIBC_MUSL
-#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \
-  CHOOSE_DYNAMIC_LINKER1 ("mmusl", "mglibc", "muclibc", "mbionic", M, G, U, B)
-#else
-#error "Unsupported DEFAULT_LIBC"
-#endif /* DEFAULT_LIBC */
-
-/* For most targets the following definitions suffice;
-   GLIBC_DYNAMIC_LINKER must be defined for each target using them, or
-   GLIBC_DYNAMIC_LINKER32 and GLIBC_DYNAMIC_LINKER64 for targets
-   supporting both 32-bit and 64-bit compilation.  */
-#define UCLIBC_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
-#define UCLIBC_DYNAMIC_LINKER32 "/lib/ld-uClibc.so.0"
-#define UCLIBC_DYNAMIC_LINKER64 "/lib/ld64-uClibc.so.0"
-#define UCLIBC_DYNAMIC_LINKERX32 "/lib/ldx32-uClibc.so.0"
-#define BIONIC_DYNAMIC_LINKER "/system/bin/linker"
-#define BIONIC_DYNAMIC_LINKER32 "/system/bin/linker"
-#define BIONIC_DYNAMIC_LINKER64 "/system/bin/linker64"
-#define BIONIC_DYNAMIC_LINKERX32 "/system/bin/linkerx32"
-
-/* Musl dynamic linker paths must be defined on a per-architecture
-   basis, for each architecture supported by Musl. However, in order
-   to let other architectures continue to build with other C
-   libraries, we provide a dummy definition of the following defines. */
-#define MUSL_DYNAMIC_LINKER "invalid"
-#define MUSL_DYNAMIC_LINKER32 "invalid"
-#define MUSL_DYNAMIC_LINKER64 "invalid"
-#define MUSL_DYNAMIC_LINKERX32 "invalid"
-
-#define GNU_USER_DYNAMIC_LINKER						\
-  CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER,	\
-			 BIONIC_DYNAMIC_LINKER, MUSL_DYNAMIC_LINKER)
-#define GNU_USER_DYNAMIC_LINKER32					\
-  CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER32, UCLIBC_DYNAMIC_LINKER32, \
-			 BIONIC_DYNAMIC_LINKER32, MUSL_DYNAMIC_LINKER32)
-#define GNU_USER_DYNAMIC_LINKER64					\
-  CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64, \
-			 BIONIC_DYNAMIC_LINKER64, MUSL_DYNAMIC_LINKER64)
-#define GNU_USER_DYNAMIC_LINKERX32					\
-  CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKERX32, UCLIBC_DYNAMIC_LINKERX32, \
-			 BIONIC_DYNAMIC_LINKERX32, MUSL_DYNAMIC_LINKER32)
-
-/* Whether we have Bionic libc runtime */
-#undef TARGET_HAS_BIONIC
-#define TARGET_HAS_BIONIC (OPTION_BIONIC)
-
-/* musl avoids problematic includes by rearranging the include directories.
- * Unfortunately, this is mostly duplicated from cppdefault.c */
-#if DEFAULT_LIBC == LIBC_MUSL
-#define INCLUDE_DEFAULTS_MUSL_GPP			\
-    { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1,		\
-      GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 0 },		\
-    { GPLUSPLUS_TOOL_INCLUDE_DIR, "G++", 1, 1,		\
-      GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 1 },		\
-    { GPLUSPLUS_BACKWARD_INCLUDE_DIR, "G++", 1, 1,	\
-      GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 0 },
-
-#ifdef LOCAL_INCLUDE_DIR
-#define INCLUDE_DEFAULTS_MUSL_LOCAL			\
-    { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 2 },		\
-    { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 0 },
-#else
-#define INCLUDE_DEFAULTS_MUSL_LOCAL
-#endif
-
-#ifdef PREFIX_INCLUDE_DIR
-#define INCLUDE_DEFAULTS_MUSL_PREFIX			\
-    { PREFIX_INCLUDE_DIR, 0, 0, 1, 0, 0},
-#else
-#define INCLUDE_DEFAULTS_MUSL_PREFIX
-#endif
-
-#ifdef CROSS_INCLUDE_DIR
-#define INCLUDE_DEFAULTS_MUSL_CROSS			\
-    { CROSS_INCLUDE_DIR, "GCC", 0, 0, 0, 0},
-#else
-#define INCLUDE_DEFAULTS_MUSL_CROSS
-#endif
-
-#ifdef TOOL_INCLUDE_DIR
-#define INCLUDE_DEFAULTS_MUSL_TOOL			\
-    { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1, 0, 0},
-#else
-#define INCLUDE_DEFAULTS_MUSL_TOOL
-#endif
-
-#ifdef NATIVE_SYSTEM_HEADER_DIR
-#define INCLUDE_DEFAULTS_MUSL_NATIVE			\
-    { NATIVE_SYSTEM_HEADER_DIR, 0, 0, 0, 1, 2 },	\
-    { NATIVE_SYSTEM_HEADER_DIR, 0, 0, 0, 1, 0 },
-#else
-#define INCLUDE_DEFAULTS_MUSL_NATIVE
-#endif
-
-#if defined (CROSS_DIRECTORY_STRUCTURE) && !defined (TARGET_SYSTEM_ROOT)
-# undef INCLUDE_DEFAULTS_MUSL_LOCAL
-# define INCLUDE_DEFAULTS_MUSL_LOCAL
-# undef INCLUDE_DEFAULTS_MUSL_NATIVE
-# define INCLUDE_DEFAULTS_MUSL_NATIVE
-#else
-# undef INCLUDE_DEFAULTS_MUSL_CROSS
-# define INCLUDE_DEFAULTS_MUSL_CROSS
-#endif
-
-#undef INCLUDE_DEFAULTS
-#define INCLUDE_DEFAULTS				\
-  {							\
-    INCLUDE_DEFAULTS_MUSL_GPP				\
-    INCLUDE_DEFAULTS_MUSL_PREFIX			\
-    INCLUDE_DEFAULTS_MUSL_CROSS				\
-    INCLUDE_DEFAULTS_MUSL_TOOL				\
-    INCLUDE_DEFAULTS_MUSL_NATIVE			\
-    { GCC_INCLUDE_DIR, "GCC", 0, 1, 0, 0 },		\
-    { 0, 0, 0, 0, 0, 0 }				\
-  }
-#endif
-
-#if (DEFAULT_LIBC == LIBC_UCLIBC) && defined (SINGLE_LIBC) /* uClinux */
-/* This is a *uclinux* target.  We don't define below macros to normal linux
-   versions, because doing so would require *uclinux* targets to include
-   linux.c, linux-protos.h, linux.opt, etc.  We could, alternatively, add
-   these files to *uclinux* targets, but that would only pollute option list
-   (add -mglibc, etc.) without adding any useful support.  */
-
-/* Define TARGET_LIBC_HAS_FUNCTION for *uclinux* targets to
-   no_c99_libc_has_function, because uclibc does not, normally, have
-   c99 runtime.  If, in special cases, uclibc does have c99 runtime,
-   this should be defined to a new hook.  Also please note that for targets
-   like *-linux-uclibc that similar check will also need to be added to
-   linux_libc_has_function.  */
-# undef TARGET_LIBC_HAS_FUNCTION
-# define TARGET_LIBC_HAS_FUNCTION no_c99_libc_has_function
-
-#else /* !uClinux, i.e., normal Linux */
-
-/* IFUNCs are supported by glibc, but not by uClibc or Bionic.  */
-# undef TARGET_HAS_IFUNC_P
-# define TARGET_HAS_IFUNC_P linux_has_ifunc_p
-
-/* Determine what functions are present at the runtime;
-   this includes full c99 runtime and sincos.  */
-# undef TARGET_LIBC_HAS_FUNCTION
-# define TARGET_LIBC_HAS_FUNCTION linux_libc_has_function
-
-#endif
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/vxworks-dummy.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/vxworks-dummy.h
deleted file mode 100644
index e900984..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/config/vxworks-dummy.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Dummy definitions of VxWorks-related macros
-   Copyright (C) 2007-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-Under Section 7 of GPL version 3, you are granted additional
-permissions described in the GCC Runtime Library Exception, version
-3.1, as published by the Free Software Foundation.
-
-You should have received a copy of the GNU General Public License and
-a copy of the GCC Runtime Library Exception along with this program;
-see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-<http://www.gnu.org/licenses/>.  */
-
-/* True if we're targeting VxWorks.  */
-#ifndef TARGET_VXWORKS
-#define TARGET_VXWORKS 0
-#endif
-
-/* True if generating code for a VxWorks RTP.  */
-#ifndef TARGET_VXWORKS_RTP
-#define TARGET_VXWORKS_RTP false
-#endif
-
-/* The symbol that points to an RTP's table of GOTs.  */
-#define VXWORKS_GOTT_BASE (gcc_unreachable (), "")
-
-/* The symbol that holds the index of the current module's GOT in
-   VXWORKS_GOTT_BASE.  */
-#define VXWORKS_GOTT_INDEX (gcc_unreachable (), "")
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/configargs.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/configargs.h
deleted file mode 100644
index 805d60a..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/configargs.h
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Generated automatically. */
-static const char configuration_arguments[] = "./configure --prefix=/usr/local/google/home/jnewlin/src/uclibc/buildroot/output/host/usr --sysconfdir=/usr/local/google/home/jnewlin/src/uclibc/buildroot/output/host/etc --enable-static --target=arm-buildroot-linux-gnueabi --with-sysroot=/usr/local/google/home/jnewlin/src/uclibc/buildroot/output/host/usr/arm-buildroot-linux-gnueabi/sysroot --disable-__cxa_atexit --with-gnu-ld --disable-libssp --disable-multilib --with-gmp=/usr/local/google/home/jnewlin/src/uclibc/buildroot/output/host/usr --with-mpfr=/usr/local/google/home/jnewlin/src/uclibc/buildroot/output/host/usr --enable-target-optspace --disable-libquadmath --enable-tls --disable-libmudflap --enable-threads --with-mpc=/usr/local/google/home/jnewlin/src/uclibc/buildroot/output/host/usr --without-isl --without-cloog --disable-decimal-float --with-arch=armv7-a --with-abi=aapcs-linux --with-cpu=cortex-a9 --with-fpu=vfpv3 --with-float=softfp --with-mode=arm --with-pkgversion='Buildroot 2014.11-git-00434-gb354417' --with-bugurl=http://bugs.buildroot.net/ --enable-languages=c,c++ --with-build-time-tools=/usr/local/google/home/jnewlin/src/uclibc/buildroot/output/host/usr/arm-buildroot-linux-gnueabi/bin --enable-shared --disable-libgomp";
-static const char thread_model[] = "posix";
-
-static const struct {
-  const char *name, *value;
-} configure_default_options[] = { { "abi", "aapcs-linux" }, { "cpu", "cortex-a9" }, { "arch", "armv7-a" }, { "float", "softfp" }, { "mode", "arm" }, { "fpu", "vfpv3" }, { "tls", "gnu" } };
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/context.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/context.h
deleted file mode 100644
index b8fb439..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/context.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* context.h - Holder for global state
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_CONTEXT_H
-#define GCC_CONTEXT_H
-
-namespace gcc {
-
-class pass_manager;
-class dump_manager;
-
-/* GCC's internal state can be divided into zero or more
-   "parallel universe" of state; an instance of this class is one such
-   context of state.  */
-class context
-{
-public:
-  context ();
-
-  /* Pass-management.  */
-
-  pass_manager *get_passes () { gcc_assert (m_passes); return m_passes; }
-
-  /* Handling dump files.  */
-
-  dump_manager *get_dumps () {gcc_assert (m_dumps); return m_dumps; }
-
-private:
-  /* Pass-management.  */
-  pass_manager *m_passes;
-
-  /* Dump files.  */
-  dump_manager *m_dumps;
-
-}; // class context
-
-} // namespace gcc
-
-/* The global singleton context aka "g".
-   (the name is chosen to be easy to type in a debugger).  */
-extern gcc::context *g;
-
-#endif /* ! GCC_CONTEXT_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/coretypes.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/coretypes.h
deleted file mode 100644
index d07a604..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/coretypes.h
+++ /dev/null
@@ -1,224 +0,0 @@
-/* GCC core type declarations.
-   Copyright (C) 2002-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-Under Section 7 of GPL version 3, you are granted additional
-permissions described in the GCC Runtime Library Exception, version
-3.1, as published by the Free Software Foundation.
-
-You should have received a copy of the GNU General Public License and
-a copy of the GCC Runtime Library Exception along with this program;
-see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-<http://www.gnu.org/licenses/>.  */
-
-/* Provide forward declarations of core types which are referred to by
-   most of the compiler.  This allows header files to use these types
-   (e.g. in function prototypes) without concern for whether the full
-   definitions are visible.  Some other declarations that need to be
-   universally visible are here, too.
-
-   In the context of tconfig.h, most of these have special definitions
-   which prevent them from being used except in further type
-   declarations.  This is a kludge; the right thing is to avoid
-   including the "tm.h" header set in the context of tconfig.h, but
-   we're not there yet.  */
-
-#ifndef GCC_CORETYPES_H
-#define GCC_CORETYPES_H
-
-#ifndef GTY
-#define GTY(x)  /* nothing - marker for gengtype */
-#endif
-
-#ifndef USED_FOR_TARGET
-
-typedef HOST_WIDEST_INT gcov_type;
-typedef unsigned HOST_WIDEST_INT gcov_type_unsigned;
-
-struct bitmap_head;
-typedef struct bitmap_head *bitmap;
-typedef const struct bitmap_head *const_bitmap;
-struct simple_bitmap_def;
-typedef struct simple_bitmap_def *sbitmap;
-typedef const struct simple_bitmap_def *const_sbitmap;
-struct rtx_def;
-typedef struct rtx_def *rtx;
-typedef const struct rtx_def *const_rtx;
-struct rtvec_def;
-typedef struct rtvec_def *rtvec;
-typedef const struct rtvec_def *const_rtvec;
-union tree_node;
-typedef union tree_node *tree;
-typedef const union tree_node *const_tree;
-typedef struct gimple_statement_base *gimple;
-typedef const struct gimple_statement_base *const_gimple;
-typedef gimple gimple_seq;
-struct gimple_stmt_iterator;
-union section;
-typedef union section section;
-struct gcc_options;
-struct cl_target_option;
-struct cl_optimization;
-struct cl_option;
-struct cl_decoded_option;
-struct cl_option_handlers;
-struct diagnostic_context;
-struct pretty_printer;
-
-/* Address space number for named address space support.  */
-typedef unsigned char addr_space_t;
-
-/* The value of addr_space_t that represents the generic address space.  */
-#define ADDR_SPACE_GENERIC 0
-#define ADDR_SPACE_GENERIC_P(AS) ((AS) == ADDR_SPACE_GENERIC)
-
-/* The major intermediate representations of GCC.  */
-enum ir_type {
-  IR_GIMPLE,
-  IR_RTL_CFGRTL,
-  IR_RTL_CFGLAYOUT
-};
-
-/* Provide forward struct declaration so that we don't have to include
-   all of cpplib.h whenever a random prototype includes a pointer.
-   Note that the cpp_reader and cpp_token typedefs remain part of
-   cpplib.h.  */
-
-struct cpp_reader;
-struct cpp_token;
-
-/* The thread-local storage model associated with a given VAR_DECL
-   or SYMBOL_REF.  This isn't used much, but both trees and RTL refer
-   to it, so it's here.  */
-enum tls_model {
-  TLS_MODEL_NONE,
-  TLS_MODEL_EMULATED,
-  TLS_MODEL_REAL,
-  TLS_MODEL_GLOBAL_DYNAMIC = TLS_MODEL_REAL,
-  TLS_MODEL_LOCAL_DYNAMIC,
-  TLS_MODEL_INITIAL_EXEC,
-  TLS_MODEL_LOCAL_EXEC
-};
-
-/* Types of unwind/exception handling info that can be generated.  */
-
-enum unwind_info_type
-{
-  UI_NONE,
-  UI_SJLJ,
-  UI_DWARF2,
-  UI_TARGET,
-  UI_SEH
-};
-
-/* Callgraph node profile representation.  */
-enum node_frequency {
-  /* This function most likely won't be executed at all.
-     (set only when profile feedback is available or via function attribute). */
-  NODE_FREQUENCY_UNLIKELY_EXECUTED,
-  /* For functions that are known to be executed once (i.e. constructors, destructors
-     and main function.  */
-  NODE_FREQUENCY_EXECUTED_ONCE,
-  /* The default value.  */
-  NODE_FREQUENCY_NORMAL,
-  /* Optimize this function hard
-     (set only when profile feedback is available or via function attribute). */
-  NODE_FREQUENCY_HOT
-};
-
-/* Possible initialization status of a variable.   When requested
-   by the user, this information is tracked and recorded in the DWARF
-   debug information, along with the variable's location.  */
-enum var_init_status
-{
-  VAR_INIT_STATUS_UNKNOWN,
-  VAR_INIT_STATUS_UNINITIALIZED,
-  VAR_INIT_STATUS_INITIALIZED
-};
-
-
-struct edge_def;
-typedef struct edge_def *edge;
-typedef const struct edge_def *const_edge;
-struct basic_block_def;
-typedef struct basic_block_def *basic_block;
-typedef const struct basic_block_def *const_basic_block;
-
-#define obstack_chunk_alloc	((void *(*) (long)) xmalloc)
-#define obstack_chunk_free	((void (*) (void *)) free)
-#define OBSTACK_CHUNK_SIZE	0
-#define gcc_obstack_init(OBSTACK)			\
-  _obstack_begin ((OBSTACK), OBSTACK_CHUNK_SIZE, 0,	\
-		  obstack_chunk_alloc,			\
-		  obstack_chunk_free)
-
-/* enum reg_class is target specific, so it should not appear in
-   target-independent code or interfaces, like the target hook declarations
-   in target.h.  */
-typedef int reg_class_t;
-
-class rtl_opt_pass;
-
-namespace gcc {
-  class context;
-}
-
-#else
-
-struct _dont_use_rtx_here_;
-struct _dont_use_rtvec_here_;
-union _dont_use_tree_here_;
-#define rtx struct _dont_use_rtx_here_ *
-#define const_rtx struct _dont_use_rtx_here_ *
-#define rtvec struct _dont_use_rtvec_here *
-#define const_rtvec struct _dont_use_rtvec_here *
-#define tree union _dont_use_tree_here_ *
-#define const_tree union _dont_use_tree_here_ *
-
-#endif
-
-/* Classes of functions that compiler needs to check
-   whether they are present at the runtime or not.  */
-enum function_class {
-  function_c94,
-  function_c99_misc,
-  function_c99_math_complex,
-  function_sincos
-};
-
-/* Memory model types for the __atomic* builtins. 
-   This must match the order in libstdc++-v3/include/bits/atomic_base.h.  */
-enum memmodel
-{
-  MEMMODEL_RELAXED = 0,
-  MEMMODEL_CONSUME = 1,
-  MEMMODEL_ACQUIRE = 2,
-  MEMMODEL_RELEASE = 3,
-  MEMMODEL_ACQ_REL = 4,
-  MEMMODEL_SEQ_CST = 5,
-  MEMMODEL_LAST = 6
-};
-
-/* Suppose that higher bits are target dependent. */
-#define MEMMODEL_MASK ((1<<16)-1)
-
-/* Support for user-provided GGC and PCH markers.  The first parameter
-   is a pointer to a pointer, the second a cookie.  */
-typedef void (*gt_pointer_operator) (void *, void *);
-
-#if !defined (HAVE_UCHAR)
-typedef unsigned char uchar;
-#endif
-
-#endif /* coretypes.h */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cp/cp-tree.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cp/cp-tree.def
deleted file mode 100644
index 057e7ea..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cp/cp-tree.def
+++ /dev/null
@@ -1,479 +0,0 @@
-/* This file contains the definitions and documentation for the
-   additional tree codes used in the GNU C++ compiler (see tree.def
-   for the standard codes).
-   Copyright (C) 1987-2014 Free Software Foundation, Inc.
-   Hacked by Michael Tiemann (tiemann@cygnus.com)
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-
-/* An OFFSET_REF is used in two situations:
-
-   1. An expression of the form `A::m' where `A' is a class and `m' is
-      a non-static member.  In this case, operand 0 will be a TYPE
-      (corresponding to `A') and operand 1 will be a FIELD_DECL,
-      BASELINK, or TEMPLATE_ID_EXPR (corresponding to `m').
-
-      The expression is a pointer-to-member if its address is taken,
-      but simply denotes a member of the object if its address is not
-      taken.
-
-      This form is only used during the parsing phase; once semantic
-      analysis has taken place they are eliminated.
-
-   2. An expression of the form `x.*p'.  In this case, operand 0 will
-      be an expression corresponding to `x' and operand 1 will be an
-      expression with pointer-to-member type.  */
-DEFTREECODE (OFFSET_REF, "offset_ref", tcc_reference, 2)
-
-/* A pointer-to-member constant.  For a pointer-to-member constant
-   `X::Y' The PTRMEM_CST_CLASS is the RECORD_TYPE for `X' and the
-   PTRMEM_CST_MEMBER is the _DECL for `Y'.  */
-DEFTREECODE (PTRMEM_CST, "ptrmem_cst", tcc_constant, 0)
-
-/* For NEW_EXPR, operand 0 is the placement list.
-   Operand 1 is the new-declarator.
-   Operand 2 is the number of elements in the array.
-   Operand 3 is the initializer.  */
-DEFTREECODE (NEW_EXPR, "nw_expr", tcc_expression, 4)
-DEFTREECODE (VEC_NEW_EXPR, "vec_nw_expr", tcc_expression, 3)
-
-/* For DELETE_EXPR, operand 0 is the store to be destroyed.
-   Operand 1 is the value to pass to the destroying function
-   saying whether the store should be deallocated as well.  */
-DEFTREECODE (DELETE_EXPR, "dl_expr", tcc_expression, 2)
-DEFTREECODE (VEC_DELETE_EXPR, "vec_dl_expr", tcc_expression, 2)
-
-/* Value is reference to particular overloaded class method.
-   Operand 0 is the class, operand 1 is the field
-   The COMPLEXITY field holds the class level (usually 0).  */
-DEFTREECODE (SCOPE_REF, "scope_ref", tcc_reference, 2)
-
-/* When composing an object with a member, this is the result.
-   Operand 0 is the object.  Operand 1 is the member (usually
-   a dereferenced pointer to member).  */
-DEFTREECODE (MEMBER_REF, "member_ref", tcc_reference, 2)
-
-/* Type conversion operator in C++.  TREE_TYPE is type that this
-   operator converts to.  Operand is expression to be converted.  */
-DEFTREECODE (TYPE_EXPR, "type_expr", tcc_expression, 1)
-
-/* AGGR_INIT_EXPRs have a variably-sized representation similar to
-   that of CALL_EXPRs.  Operand 0 is an INTEGER_CST node containing the
-   operand count, operand 1 is the function which performs initialization,
-   operand 2 is the slot which was allocated for this expression, and
-   the remaining operands are the arguments to the initialization function.  */
-DEFTREECODE (AGGR_INIT_EXPR, "aggr_init_expr", tcc_vl_exp, 3)
-
-/* Initialization of an array from another array, expressed at a high level
-   so that it works with TARGET_EXPR.  Operand 0 is the target, operand 1
-   is the initializer.  */
-DEFTREECODE (VEC_INIT_EXPR, "vec_init_expr", tcc_expression, 2)
-
-/* A throw expression.  operand 0 is the expression, if there was one,
-   else it is NULL_TREE.  */
-DEFTREECODE (THROW_EXPR, "throw_expr", tcc_expression, 1)
-
-/* An empty class object.  The TREE_TYPE gives the class type.  We use
-   these to avoid actually creating instances of the empty classes.  */
-DEFTREECODE (EMPTY_CLASS_EXPR, "empty_class_expr", tcc_expression, 0)
-
-/* A reference to a member function or member functions from a base
-   class.  BASELINK_FUNCTIONS gives the FUNCTION_DECL,
-   TEMPLATE_DECL, OVERLOAD, or TEMPLATE_ID_EXPR corresponding to the
-   functions.  BASELINK_BINFO gives the base from which the functions
-   come, i.e., the base to which the `this' pointer must be converted
-   before the functions are called.  BASELINK_ACCESS_BINFO gives the
-   base used to name the functions.
-
-   A BASELINK is an expression; the TREE_TYPE of the BASELINK gives
-   the type of the expression.  This type is either a FUNCTION_TYPE,
-   METHOD_TYPE, or `unknown_type_node' indicating that the function is
-   overloaded.  */
-DEFTREECODE (BASELINK, "baselink", tcc_exceptional, 0)
-
-/* Template definition.  The following fields have the specified uses,
-   although there are other macros in cp-tree.h that should be used for
-   accessing this data.
-	DECL_ARGUMENTS		template parm vector
-	DECL_TEMPLATE_INFO      template text &c
-	DECL_VINDEX		list of instantiations already produced;
-				only done for functions so far
-   For class template:
-	DECL_INITIAL		associated templates (methods &c)
-	DECL_TEMPLATE_RESULT    null
-   For non-class templates:
-	TREE_TYPE		type of object to be constructed
-	DECL_TEMPLATE_RESULT    decl for object to be created
-				(e.g., FUNCTION_DECL with tmpl parms used)
- */
-DEFTREECODE (TEMPLATE_DECL, "template_decl", tcc_declaration, 0)
-
-/* Index into a template parameter list.  The TEMPLATE_PARM_IDX gives
-   the index (from 0) of the parameter, while the TEMPLATE_PARM_LEVEL
-   gives the level (from 1) of the parameter.
-
-   Here's an example:
-
-   template <class T> // Index 0, Level 1.
-   struct S
-   {
-      template <class U, // Index 0, Level 2.
-		class V> // Index 1, Level 2.
-      void f();
-   };
-
-   The DESCENDANTS will be a chain of TEMPLATE_PARM_INDEXs descended
-   from this one.  The first descendant will have the same IDX, but
-   its LEVEL will be one less.  The TREE_CHAIN field is used to chain
-   together the descendants.  The TEMPLATE_PARM_DECL is the
-   declaration of this parameter, either a TYPE_DECL or CONST_DECL.
-   The TEMPLATE_PARM_ORIG_LEVEL is the LEVEL of the most distant
-   parent, i.e., the LEVEL that the parameter originally had when it
-   was declared.  For example, if we instantiate S<int>, we will have:
-
-   struct S<int>
-   {
-     template <class U, // Index 0, Level 1, Orig Level 2
-	       class V> // Index 1, Level 1, Orig Level 2
-     void f();
-   };
-
-   The LEVEL is the level of the parameter when we are worrying about
-   the types of things; the ORIG_LEVEL is the level when we are
-   worrying about instantiating things.  */
-DEFTREECODE (TEMPLATE_PARM_INDEX, "template_parm_index", tcc_exceptional, 0)
-
-/* Index into a template parameter list for template template parameters.
-   This parameter must be a type.  The TYPE_FIELDS value will be a
-   TEMPLATE_PARM_INDEX.
-
-   It is used without template arguments like TT in C<TT>,
-   TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO is NULL_TREE
-   and TYPE_NAME is a TEMPLATE_DECL.  */
-DEFTREECODE (TEMPLATE_TEMPLATE_PARM, "template_template_parm", tcc_type, 0)
-
-/* The ordering of the following codes is optimized for the checking
-   macros in tree.h.  Changing the order will degrade the speed of the
-   compiler.  TEMPLATE_TYPE_PARM, TYPENAME_TYPE, TYPEOF_TYPE,
-   BOUND_TEMPLATE_TEMPLATE_PARM.  */
-
-/* Index into a template parameter list.  This parameter must be a type.
-   The type.values field will be a TEMPLATE_PARM_INDEX.  */
-DEFTREECODE (TEMPLATE_TYPE_PARM, "template_type_parm", tcc_type, 0)
-
-/* A type designated by `typename T::t'.  TYPE_CONTEXT is `T',
-   TYPE_NAME is an IDENTIFIER_NODE for `t'.  If the type was named via
-   template-id, TYPENAME_TYPE_FULLNAME will hold the TEMPLATE_ID_EXPR.
-   TREE_TYPE is always NULL.  */
-DEFTREECODE (TYPENAME_TYPE, "typename_type", tcc_type, 0)
-
-/* A type designated by `__typeof (expr)'.  TYPEOF_TYPE_EXPR is the
-   expression in question.  */
-DEFTREECODE (TYPEOF_TYPE, "typeof_type", tcc_type, 0)
-
-/* Like TEMPLATE_TEMPLATE_PARM it is used with bound template arguments
-   like TT<int>.
-   In this case, TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO contains the
-   template name and its bound arguments.  TYPE_NAME is a TYPE_DECL.  */
-DEFTREECODE (BOUND_TEMPLATE_TEMPLATE_PARM, "bound_template_template_parm",
-	     tcc_type, 0)
-
-/* For template template argument of the form `T::template C'.
-   TYPE_CONTEXT is `T', the template parameter dependent object.
-   TYPE_NAME is an IDENTIFIER_NODE for `C', the member class template.  */
-DEFTREECODE (UNBOUND_CLASS_TEMPLATE, "unbound_class_template", tcc_type, 0)
-
-/* A using declaration.  USING_DECL_SCOPE contains the specified
-   scope.  In a member using decl, unless DECL_DEPENDENT_P is true,
-   USING_DECL_DECLS contains the _DECL or OVERLOAD so named.  This is
-   not an alias, but is later expanded into multiple aliases.  */
-DEFTREECODE (USING_DECL, "using_decl", tcc_declaration, 0)
-
-/* A using directive. The operand is USING_STMT_NAMESPACE.  */
-DEFTREECODE (USING_STMT, "using_stmt", tcc_statement, 1)
-
-/* An un-parsed default argument.  Holds a vector of input tokens and
-   a vector of places where the argument was instantiated before
-   parsing had occurred.  */
-DEFTREECODE (DEFAULT_ARG, "default_arg", tcc_exceptional, 0)
-
-/* An uninstantiated noexcept-specification.  DEFERRED_NOEXCEPT_PATTERN is
-   the pattern from the template, and DEFERRED_NOEXCEPT_ARGS are the
-   template arguments to substitute into the pattern when needed.  */
-DEFTREECODE (DEFERRED_NOEXCEPT, "deferred_noexcept", tcc_exceptional, 0)
-
-/* A template-id, like foo<int>.  The first operand is the template.
-   The second is NULL if there are no explicit arguments, or a
-   TREE_VEC of arguments.  The template will be a FUNCTION_DECL,
-   TEMPLATE_DECL, or an OVERLOAD.  If the template-id refers to a
-   member template, the template may be an IDENTIFIER_NODE.  */
-DEFTREECODE (TEMPLATE_ID_EXPR, "template_id_expr", tcc_expression, 2)
-
-/* A list-like node for chaining overloading candidates. TREE_TYPE is
-   the original name, and the parameter is the FUNCTION_DECL.  */
-DEFTREECODE (OVERLOAD, "overload", tcc_exceptional, 0)
-
-/* A pseudo-destructor, of the form "OBJECT.~DESTRUCTOR" or
-   "OBJECT.SCOPE::~DESTRUCTOR.  The first operand is the OBJECT.  The
-   second operand (if non-NULL) is the SCOPE.  The third operand is
-   the TYPE node corresponding to the DESTRUCTOR.  The type of the
-   first operand will always be a scalar type.
-
-   The type of a PSEUDO_DTOR_EXPR is always "void", even though it can
-   be used as if it were a zero-argument function.  We handle the
-   function-call case specially, and giving it "void" type prevents it
-   being used in expressions in ways that are not permitted.  */
-DEFTREECODE (PSEUDO_DTOR_EXPR, "pseudo_dtor_expr", tcc_expression, 3)
-
-/* A whole bunch of tree codes for the initial, superficial parsing of
-   templates.  */
-DEFTREECODE (MODOP_EXPR, "modop_expr", tcc_expression, 3)
-DEFTREECODE (CAST_EXPR, "cast_expr", tcc_unary, 1)
-DEFTREECODE (REINTERPRET_CAST_EXPR, "reinterpret_cast_expr", tcc_unary, 1)
-DEFTREECODE (CONST_CAST_EXPR, "const_cast_expr", tcc_unary, 1)
-DEFTREECODE (STATIC_CAST_EXPR, "static_cast_expr", tcc_unary, 1)
-DEFTREECODE (DYNAMIC_CAST_EXPR, "dynamic_cast_expr", tcc_unary, 1)
-DEFTREECODE (IMPLICIT_CONV_EXPR, "implicit_conv_expr", tcc_unary, 1)
-DEFTREECODE (DOTSTAR_EXPR, "dotstar_expr", tcc_expression, 2)
-DEFTREECODE (TYPEID_EXPR, "typeid_expr", tcc_expression, 1)
-DEFTREECODE (NOEXCEPT_EXPR, "noexcept_expr", tcc_unary, 1)
-
-/* A placeholder for an expression that is not type-dependent, but
-   does occur in a template.  When an expression that is not
-   type-dependent appears in a larger expression, we must compute the
-   type of that larger expression.  That computation would normally
-   modify the original expression, which would change the mangling of
-   that expression if it appeared in a template argument list.  In
-   that situation, we create a NON_DEPENDENT_EXPR to take the place of
-   the original expression.  The expression is the only operand -- it
-   is only needed for diagnostics.  */
-DEFTREECODE (NON_DEPENDENT_EXPR, "non_dependent_expr", tcc_expression, 1)
-
-/* CTOR_INITIALIZER is a placeholder in template code for a call to
-   setup_vtbl_pointer (and appears in all functions, not just ctors).  */
-DEFTREECODE (CTOR_INITIALIZER, "ctor_initializer", tcc_expression, 1)
-
-DEFTREECODE (TRY_BLOCK, "try_block", tcc_statement, 2)
-
-DEFTREECODE (EH_SPEC_BLOCK, "eh_spec_block", tcc_statement, 2)
-
-/* A HANDLER wraps a catch handler for the HANDLER_TYPE.  If this is
-   CATCH_ALL_TYPE, then the handler catches all types.  The declaration of
-   the catch variable is in HANDLER_PARMS, and the body block in
-   HANDLER_BODY.  */
-DEFTREECODE (HANDLER, "handler", tcc_statement, 2)
-
-/* A MUST_NOT_THROW_EXPR wraps an expression that may not
-   throw, and must call terminate if it does.  The second argument
-   is a condition, used in templates to express noexcept (condition).  */
-DEFTREECODE (MUST_NOT_THROW_EXPR, "must_not_throw_expr", tcc_expression, 2)
-
-/* A CLEANUP_STMT marks the point at which a declaration is fully
-   constructed.  The CLEANUP_EXPR is run on behalf of CLEANUP_DECL
-   when CLEANUP_BODY completes.  */
-DEFTREECODE (CLEANUP_STMT, "cleanup_stmt", tcc_statement, 3)
-
-/* Represents an 'if' statement. The operands are IF_COND,
-   THEN_CLAUSE, and ELSE_CLAUSE, and the current scope, respectively.  */
-/* ??? It is currently still necessary to distinguish between IF_STMT
-   and COND_EXPR for the benefit of templates.  */
-DEFTREECODE (IF_STMT, "if_stmt", tcc_statement, 4)
-
-/* Used to represent a `for' statement. The operands are
-   FOR_INIT_STMT, FOR_COND, FOR_EXPR, and FOR_BODY, respectively.  */
-DEFTREECODE (FOR_STMT, "for_stmt", tcc_statement, 5)
-
-/* Used to represent a range-based `for' statement. The operands are
-   RANGE_FOR_DECL, RANGE_FOR_EXPR, RANGE_FOR_BODY, and RANGE_FOR_SCOPE,
-   respectively.  Only used in templates.  */
-DEFTREECODE (RANGE_FOR_STMT, "range_for_stmt", tcc_statement, 4)
-
-/* Used to represent a 'while' statement. The operands are WHILE_COND
-   and WHILE_BODY, respectively.  */
-DEFTREECODE (WHILE_STMT, "while_stmt", tcc_statement, 2)
-
-/* Used to represent a 'do' statement. The operands are DO_BODY and
-   DO_COND, respectively.  */
-DEFTREECODE (DO_STMT, "do_stmt", tcc_statement, 2)
-
-/* Used to represent a 'break' statement.  */
-DEFTREECODE (BREAK_STMT, "break_stmt", tcc_statement, 0)
-
-/* Used to represent a 'continue' statement.  */
-DEFTREECODE (CONTINUE_STMT, "continue_stmt", tcc_statement, 0)
-
-/* Used to represent a 'switch' statement. The operands are
-   SWITCH_STMT_COND, SWITCH_STMT_BODY, SWITCH_STMT_TYPE, and
-   SWITCH_STMT_SCOPE, respectively.  */
-DEFTREECODE (SWITCH_STMT, "switch_stmt", tcc_statement, 4)
-
-/* Used to represent an expression statement.  Use `EXPR_STMT_EXPR' to
-   obtain the expression.  */
-DEFTREECODE (EXPR_STMT, "expr_stmt", tcc_expression, 1)
-
-DEFTREECODE (TAG_DEFN, "tag_defn", tcc_expression, 0)
-
-/* Represents an 'offsetof' expression during template expansion.  */
-DEFTREECODE (OFFSETOF_EXPR, "offsetof_expr", tcc_expression, 1)
-
-/* Represents the -> operator during template expansion.  */
-DEFTREECODE (ARROW_EXPR, "arrow_expr", tcc_expression, 1)
-
-/* Represents an '__alignof__' expression during template
-   expansion.  */
-DEFTREECODE (ALIGNOF_EXPR, "alignof_expr", tcc_expression, 1)
-
-/* Represents an Objective-C++ '@encode' expression during template
-   expansion.  */
-DEFTREECODE (AT_ENCODE_EXPR, "at_encode_expr", tcc_expression, 1)
-
-/* A STMT_EXPR represents a statement-expression during template
-   expansion.  This is the GCC extension { ( ... ) }.  The
-   STMT_EXPR_STMT is the statement given by the expression.  */
-DEFTREECODE (STMT_EXPR, "stmt_expr", tcc_expression, 1)
-
-/* Unary plus. Operand 0 is the expression to which the unary plus
-   is applied.  */
-DEFTREECODE (UNARY_PLUS_EXPR, "unary_plus_expr", tcc_unary, 1)
-
-/** C++0x extensions. */
-
-/* A static assertion.  This is a C++0x extension.
-   STATIC_ASSERT_CONDITION contains the condition that is being
-   checked.  STATIC_ASSERT_MESSAGE contains the message (a string
-   literal) to be displayed if the condition fails to hold.  */
-DEFTREECODE (STATIC_ASSERT, "static_assert", tcc_exceptional, 0)
-
-/* Represents an argument pack of types (or templates). An argument
-   pack stores zero or more arguments that will be used to instantiate
-   a parameter pack. 
-
-   ARGUMENT_PACK_ARGS retrieves the arguments stored in the argument
-   pack.
-
-   Example:
-     template<typename... Values>
-     class tuple { ... };
-
-     tuple<int, float, double> t;
-
-   Values is a (template) parameter pack. When tuple<int, float,
-   double> is instantiated, the Values parameter pack is instantiated
-   with the argument pack <int, float, double>. ARGUMENT_PACK_ARGS will
-   be a TREE_VEC containing int, float, and double.  */
-DEFTREECODE (TYPE_ARGUMENT_PACK, "type_argument_pack", tcc_type, 0)
-
-/* Represents an argument pack of values, which can be used either for
-   non-type template arguments or function call arguments. 
-
-   NONTYPE_ARGUMENT_PACK plays precisely the same role as
-   TYPE_ARGUMENT_PACK, but will be used for packing non-type template
-   arguments (e.g., "int... Dimensions") or function arguments ("const
-   Args&... args"). */
-DEFTREECODE (NONTYPE_ARGUMENT_PACK, "nontype_argument_pack", tcc_expression, 1)
-
-/* Represents a type expression that will be expanded into a list of
-   types when instantiated with one or more argument packs.
-
-   PACK_EXPANSION_PATTERN retrieves the expansion pattern. This is
-   the type or expression that we will substitute into with each
-   argument in an argument pack.
-
-   SET_PACK_EXPANSION_PATTERN sets the expansion pattern.
-
-   PACK_EXPANSION_PARAMETER_PACKS contains a TREE_LIST of the parameter
-   packs that are used in this pack expansion.
-
-   Example:
-     template<typename... Values>
-     struct tied : tuple<Values&...> { 
-       // ...
-     };
-
-   The derivation from tuple contains a TYPE_PACK_EXPANSION for the
-   template arguments. Its PACK_EXPANSION_PATTERN is "Values&" and its
-   PACK_EXPANSION_PARAMETER_PACKS will contain "Values".  */
-DEFTREECODE (TYPE_PACK_EXPANSION, "type_pack_expansion", tcc_type, 0)
-
-/* Represents an expression that will be expanded into a list of
-   expressions when instantiated with one or more argument packs.
-
-   EXPR_PACK_EXPANSION plays precisely the same role as TYPE_PACK_EXPANSION,
-   but will be used for expressions.  */
-DEFTREECODE (EXPR_PACK_EXPANSION, "expr_pack_expansion", tcc_expression, 3)
-
-/* Selects the Ith parameter out of an argument pack. This node will
-   be used when instantiating pack expansions; see
-   tsubst_pack_expansion. 
-
-   ARGUMENT_PACK_SELECT_FROM_PACK contains the *_ARGUMENT_PACK node
-   from which the argument will be selected.
-
-   ARGUMENT_PACK_SELECT_INDEX contains the index into the argument
-   pack that will be returned by this ARGUMENT_PACK_SELECT node. The
-   index is a machine integer.  */
-DEFTREECODE (ARGUMENT_PACK_SELECT, "argument_pack_select", tcc_exceptional, 0)
-
-/** C++ extensions. */
-
-/* Represents a trait expression during template expansion.  */
-DEFTREECODE (TRAIT_EXPR, "trait_expr", tcc_exceptional, 0)
-
-/* A lambda expression.  This is a C++0x extension.
-   LAMBDA_EXPR_DEFAULT_CAPTURE_MODE is an enum for the default, which may be
-   none.
-   LAMBDA_EXPR_CAPTURE_LIST holds the capture-list, including `this'.
-   LAMBDA_EXPR_THIS_CAPTURE goes straight to the capture of `this', if it exists.
-   LAMBDA_EXPR_PENDING_PROXIES is a vector of capture proxies which need to
-   be pushed once scope returns to the lambda.
-   LAMBDA_EXPR_MUTABLE_P signals whether this lambda was declared mutable.
-   LAMBDA_EXPR_RETURN_TYPE holds the return type, if it was specified.  */
-DEFTREECODE (LAMBDA_EXPR, "lambda_expr", tcc_exceptional, 0)
-
-/* The declared type of an expression.  This is a C++0x extension.
-   DECLTYPE_TYPE_EXPR is the expression whose type we are computing.
-   DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P states whether the
-   expression was parsed as an id-expression or a member access
-   expression. When false, it was parsed as a full expression.
-   DECLTYPE_FOR_LAMBDA_CAPTURE is set if we want lambda capture semantics.
-   DECLTYPE_FOR_LAMBDA_RETURN is set if we want lambda return deduction.  */
-DEFTREECODE (DECLTYPE_TYPE, "decltype_type", tcc_type, 0)
-
-/* A type designated by `__underlying_type (type)'.
-   UNDERLYING_TYPE_TYPE is the type in question.  */
-DEFTREECODE (UNDERLYING_TYPE, "underlying_type", tcc_type, 0)
-
-/* A type designated by one of the bases type traits.
-   BASES_TYPE is the type in question.  */
-DEFTREECODE (BASES, "bases", tcc_type, 0)
-
-/* Used to represent the template information stored by template
-   specializations.
-   The accessors are:
-   TI_TEMPLATE the template declaration associated to the specialization
-   TI_ARGS the arguments of the template specialization
-   TI_TYPEDEFS_NEEDING_ACCESS_CHECKING the vector of typedefs used in
-   the pattern of the template for which access check is needed at template
-   instantiation time.  */
-DEFTREECODE (TEMPLATE_INFO, "template_info", tcc_exceptional, 0)
-
-/*
-Local variables:
-mode:c
-End:
-*/
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cp/cp-tree.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cp/cp-tree.h
deleted file mode 100644
index 26a63d0..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cp/cp-tree.h
+++ /dev/null
@@ -1,6242 +0,0 @@
-/* Definitions for C++ parsing and type checking.
-   Copyright (C) 1987-2014 Free Software Foundation, Inc.
-   Contributed by Michael Tiemann (tiemann@cygnus.com)
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_CP_TREE_H
-#define GCC_CP_TREE_H
-
-#include "ggc.h"
-#include "function.h"
-#include "hashtab.h"
-#include "vec.h"
-
-/* In order for the format checking to accept the C++ front end
-   diagnostic framework extensions, you must include this file before
-   diagnostic-core.h, not after.  We override the definition of GCC_DIAG_STYLE
-   in c-common.h.  */
-#undef GCC_DIAG_STYLE
-#define GCC_DIAG_STYLE __gcc_cxxdiag__
-#if defined(GCC_DIAGNOSTIC_CORE_H) || defined (GCC_C_COMMON_H)
-#error \
-In order for the format checking to accept the C++ front end diagnostic \
-framework extensions, you must include this file before diagnostic-core.h and \
-c-common.h, not after.
-#endif
-#include "c-family/c-common.h"
-#include "diagnostic.h"
-
-#include "name-lookup.h"
-
-/* Usage of TREE_LANG_FLAG_?:
-   0: IDENTIFIER_MARKED (IDENTIFIER_NODEs)
-      NEW_EXPR_USE_GLOBAL (in NEW_EXPR).
-      DELETE_EXPR_USE_GLOBAL (in DELETE_EXPR).
-      COMPOUND_EXPR_OVERLOADED (in COMPOUND_EXPR).
-      TREE_INDIRECT_USING (in NAMESPACE_DECL).
-      CLEANUP_P (in TRY_BLOCK)
-      AGGR_INIT_VIA_CTOR_P (in AGGR_INIT_EXPR)
-      PTRMEM_OK_P (in ADDR_EXPR, OFFSET_REF, SCOPE_REF)
-      PAREN_STRING_LITERAL (in STRING_CST)
-      DECL_GNU_TLS_P (in VAR_DECL)
-      KOENIG_LOOKUP_P (in CALL_EXPR)
-      STATEMENT_LIST_NO_SCOPE (in STATEMENT_LIST).
-      EXPR_STMT_STMT_EXPR_RESULT (in EXPR_STMT)
-      STMT_EXPR_NO_SCOPE (in STMT_EXPR)
-      BIND_EXPR_TRY_BLOCK (in BIND_EXPR)
-      TYPENAME_IS_ENUM_P (in TYPENAME_TYPE)
-      OMP_FOR_GIMPLIFYING_P (in OMP_FOR, OMP_SIMD and OMP_DISTRIBUTE)
-      BASELINK_QUALIFIED_P (in BASELINK)
-      TARGET_EXPR_IMPLICIT_P (in TARGET_EXPR)
-      TEMPLATE_PARM_PARAMETER_PACK (in TEMPLATE_PARM_INDEX)
-      ATTR_IS_DEPENDENT (in the TREE_LIST for an attribute)
-      ABI_TAG_IMPLICIT (in the TREE_LIST for the argument of abi_tag)
-      CONSTRUCTOR_IS_DIRECT_INIT (in CONSTRUCTOR)
-      LAMBDA_EXPR_CAPTURES_THIS_P (in LAMBDA_EXPR)
-      DECLTYPE_FOR_LAMBDA_CAPTURE (in DECLTYPE_TYPE)
-      VEC_INIT_EXPR_IS_CONSTEXPR (in VEC_INIT_EXPR)
-      DECL_OVERRIDE_P (in FUNCTION_DECL)
-      IMPLICIT_CONV_EXPR_DIRECT_INIT (in IMPLICIT_CONV_EXPR)
-      TRANSACTION_EXPR_IS_STMT (in TRANSACTION_EXPR)
-      CONVERT_EXPR_VBASE_PATH (in CONVERT_EXPR)
-      OVL_ARG_DEPENDENT (in OVERLOAD)
-      PACK_EXPANSION_LOCAL_P (in *_PACK_EXPANSION)
-      TINFO_RECHECK_ACCESS_P (in TEMPLATE_INFO)
-      SIZEOF_EXPR_TYPE_P (in SIZEOF_EXPR)
-   1: IDENTIFIER_VIRTUAL_P (in IDENTIFIER_NODE)
-      TI_PENDING_TEMPLATE_FLAG.
-      TEMPLATE_PARMS_FOR_INLINE.
-      DELETE_EXPR_USE_VEC (in DELETE_EXPR).
-      (TREE_CALLS_NEW) (in _EXPR or _REF) (commented-out).
-      ICS_ELLIPSIS_FLAG (in _CONV)
-      DECL_INITIALIZED_P (in VAR_DECL)
-      TYPENAME_IS_CLASS_P (in TYPENAME_TYPE)
-      STMT_IS_FULL_EXPR_P (in _STMT)
-      TARGET_EXPR_LIST_INIT_P (in TARGET_EXPR)
-      LAMBDA_EXPR_MUTABLE_P (in LAMBDA_EXPR)
-      DECL_FINAL_P (in FUNCTION_DECL)
-      QUALIFIED_NAME_IS_TEMPLATE (in SCOPE_REF)
-      DECLTYPE_FOR_INIT_CAPTURE (in DECLTYPE_TYPE)
-   2: IDENTIFIER_OPNAME_P (in IDENTIFIER_NODE)
-      ICS_THIS_FLAG (in _CONV)
-      DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (in VAR_DECL)
-      STATEMENT_LIST_TRY_BLOCK (in STATEMENT_LIST)
-      TYPENAME_IS_RESOLVING_P (in TYPE_NAME_TYPE)
-      TARGET_EXPR_DIRECT_INIT_P (in TARGET_EXPR)
-      FNDECL_USED_AUTO (in FUNCTION_DECL)
-      DECLTYPE_FOR_LAMBDA_PROXY (in DECLTYPE_TYPE)
-      REF_PARENTHESIZED_P (in COMPONENT_REF, SCOPE_REF)
-      AGGR_INIT_ZERO_FIRST (in AGGR_INIT_EXPR)
-   3: (TREE_REFERENCE_EXPR) (in NON_LVALUE_EXPR) (commented-out).
-      ICS_BAD_FLAG (in _CONV)
-      FN_TRY_BLOCK_P (in TRY_BLOCK)
-      IDENTIFIER_CTOR_OR_DTOR_P (in IDENTIFIER_NODE)
-      BIND_EXPR_BODY_BLOCK (in BIND_EXPR)
-      DECL_NON_TRIVIALLY_INITIALIZED_P (in VAR_DECL)
-      CALL_EXPR_LIST_INIT_P (in CALL_EXPR, AGGR_INIT_EXPR)
-   4: TREE_HAS_CONSTRUCTOR (in INDIRECT_REF, SAVE_EXPR, CONSTRUCTOR,
-	  or FIELD_DECL).
-      IDENTIFIER_TYPENAME_P (in IDENTIFIER_NODE)
-      DECL_TINFO_P (in VAR_DECL)
-      FUNCTION_REF_QUALIFIED (in FUNCTION_TYPE, METHOD_TYPE)
-   5: C_IS_RESERVED_WORD (in IDENTIFIER_NODE)
-      DECL_VTABLE_OR_VTT_P (in VAR_DECL)
-      FUNCTION_RVALUE_QUALIFIED (in FUNCTION_TYPE, METHOD_TYPE)
-   6: IDENTIFIER_REPO_CHOSEN (in IDENTIFIER_NODE)
-      DECL_CONSTRUCTION_VTABLE_P (in VAR_DECL)
-      TYPE_MARKED_P (in _TYPE)
-      RANGE_FOR_IVDEP (in RANGE_FOR_STMT)
-
-   Usage of TYPE_LANG_FLAG_?:
-   0: TYPE_DEPENDENT_P
-   1: TYPE_HAS_USER_CONSTRUCTOR.
-   2: unused
-   3: TYPE_FOR_JAVA.
-   4: TYPE_HAS_NONTRIVIAL_DESTRUCTOR
-   5: CLASS_TYPE_P (in RECORD_TYPE and UNION_TYPE)
-      ENUM_FIXED_UNDERLYING_TYPE_P (in ENUMERAL_TYPE)
-      AUTO_IS_DECLTYPE (in TEMPLATE_TYPE_PARM)
-      REFERENCE_VLA_OK (in REFERENCE_TYPE)
-   6: TYPE_DEPENDENT_P_VALID
-
-   Usage of DECL_LANG_FLAG_?:
-   0: DECL_ERROR_REPORTED (in VAR_DECL).
-      DECL_TEMPLATE_PARM_P (in PARM_DECL, CONST_DECL, TYPE_DECL, or TEMPLATE_DECL)
-      DECL_LOCAL_FUNCTION_P (in FUNCTION_DECL)
-      DECL_MUTABLE_P (in FIELD_DECL)
-      DECL_DEPENDENT_P (in USING_DECL)
-   1: C_TYPEDEF_EXPLICITLY_SIGNED (in TYPE_DECL).
-      DECL_TEMPLATE_INSTANTIATED (in a VAR_DECL or a FUNCTION_DECL)
-      DECL_MEMBER_TEMPLATE_P (in TEMPLATE_DECL)
-      USING_DECL_TYPENAME_P (in USING_DECL)
-      DECL_VLA_CAPTURE_P (in FIELD_DECL)
-   2: DECL_THIS_EXTERN (in VAR_DECL or FUNCTION_DECL).
-      DECL_IMPLICIT_TYPEDEF_P (in a TYPE_DECL)
-   3: DECL_IN_AGGR_P.
-   4: DECL_C_BIT_FIELD (in a FIELD_DECL)
-      DECL_ANON_UNION_VAR_P (in a VAR_DECL)
-      DECL_SELF_REFERENCE_P (in a TYPE_DECL)
-      DECL_INVALID_OVERRIDER_P (in a FUNCTION_DECL)
-   5: DECL_INTERFACE_KNOWN.
-   6: DECL_THIS_STATIC (in VAR_DECL or FUNCTION_DECL).
-      DECL_FIELD_IS_BASE (in FIELD_DECL)
-      TYPE_DECL_ALIAS_P (in TYPE_DECL)
-   7: DECL_DEAD_FOR_LOCAL (in VAR_DECL).
-      DECL_THUNK_P (in a member FUNCTION_DECL)
-      DECL_NORMAL_CAPTURE_P (in FIELD_DECL)
-   8: DECL_DECLARED_CONSTEXPR_P (in VAR_DECL, FUNCTION_DECL)
-
-   Usage of language-independent fields in a language-dependent manner:
-
-   TYPE_ALIAS_SET
-     This field is used by TYPENAME_TYPEs, TEMPLATE_TYPE_PARMs, and so
-     forth as a substitute for the mark bits provided in `lang_type'.
-     At present, only the six low-order bits are used.
-
-   TYPE_LANG_SLOT_1
-     For an ENUMERAL_TYPE, this is ENUM_TEMPLATE_INFO.
-     For a FUNCTION_TYPE or METHOD_TYPE, this is TYPE_RAISES_EXCEPTIONS
-
-  BINFO_VIRTUALS
-     For a binfo, this is a TREE_LIST.  There is an entry for each
-     virtual function declared either in BINFO or its direct and
-     indirect primary bases.
-
-     The BV_DELTA of each node gives the amount by which to adjust the
-     `this' pointer when calling the function.  If the method is an
-     overridden version of a base class method, then it is assumed
-     that, prior to adjustment, the this pointer points to an object
-     of the base class.
-
-     The BV_VCALL_INDEX of each node, if non-NULL, gives the vtable
-     index of the vcall offset for this entry.
-
-     The BV_FN is the declaration for the virtual function itself.
-
-     If BV_LOST_PRIMARY is set, it means that this entry is for a lost
-     primary virtual base and can be left null in the vtable.
-
-   BINFO_VTABLE
-     This is an expression with POINTER_TYPE that gives the value
-     to which the vptr should be initialized.  Use get_vtbl_decl_for_binfo
-     to extract the VAR_DECL for the complete vtable.
-
-   DECL_VINDEX
-     This field is NULL for a non-virtual function.  For a virtual
-     function, it is eventually set to an INTEGER_CST indicating the
-     index in the vtable at which this function can be found.  When
-     a virtual function is declared, but before it is known what
-     function is overridden, this field is the error_mark_node.
-
-     Temporarily, it may be set to a TREE_LIST whose TREE_VALUE is
-     the virtual function this one overrides, and whose TREE_CHAIN is
-     the old DECL_VINDEX.  */
-
-/* Language-specific tree checkers.  */
-
-#define VAR_OR_FUNCTION_DECL_CHECK(NODE) \
-  TREE_CHECK2(NODE,VAR_DECL,FUNCTION_DECL)
-
-#define TYPE_FUNCTION_OR_TEMPLATE_DECL_CHECK(NODE) \
-  TREE_CHECK3(NODE,TYPE_DECL,TEMPLATE_DECL,FUNCTION_DECL)
-
-#define TYPE_FUNCTION_OR_TEMPLATE_DECL_P(NODE) \
-  (TREE_CODE (NODE) == TYPE_DECL || TREE_CODE (NODE) == TEMPLATE_DECL \
-   || TREE_CODE (NODE) == FUNCTION_DECL)
-
-#define VAR_FUNCTION_OR_PARM_DECL_CHECK(NODE) \
-  TREE_CHECK3(NODE,VAR_DECL,FUNCTION_DECL,PARM_DECL)
-
-#define VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK(NODE) \
-  TREE_CHECK4(NODE,VAR_DECL,FUNCTION_DECL,TYPE_DECL,TEMPLATE_DECL)
-
-#define VAR_TEMPL_TYPE_FIELD_OR_FUNCTION_DECL_CHECK(NODE) \
-  TREE_CHECK5(NODE,VAR_DECL,FIELD_DECL,FUNCTION_DECL,TYPE_DECL,TEMPLATE_DECL)
-
-#define BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK(NODE) \
-  TREE_CHECK(NODE,BOUND_TEMPLATE_TEMPLATE_PARM)
-
-#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
-#define THUNK_FUNCTION_CHECK(NODE) __extension__			\
-({  __typeof (NODE) const __t = (NODE);					\
-    if (TREE_CODE (__t) != FUNCTION_DECL || !__t->decl_common.lang_specific \
-	|| !__t->decl_common.lang_specific->u.fn.thunk_p)		\
-      tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__, 0);	\
-     __t; })
-#else
-#define THUNK_FUNCTION_CHECK(NODE) (NODE)
-#endif
-
-/* Language-dependent contents of an identifier.  */
-
-struct GTY(()) lang_identifier {
-  struct c_common_identifier c_common;
-  cxx_binding *namespace_bindings;
-  cxx_binding *bindings;
-  tree class_template_info;
-  tree label_value;
-};
-
-/* Return a typed pointer version of T if it designates a
-   C++ front-end identifier.  */
-inline lang_identifier*
-identifier_p (tree t)
-{
-  if (TREE_CODE (t) == IDENTIFIER_NODE)
-    return (lang_identifier*) t;
-  return NULL;
-}
-
-/* In an IDENTIFIER_NODE, nonzero if this identifier is actually a
-   keyword.  C_RID_CODE (node) is then the RID_* value of the keyword,
-   and C_RID_YYCODE is the token number wanted by Yacc.  */
-
-#define C_IS_RESERVED_WORD(ID) TREE_LANG_FLAG_5 (ID)
-
-#define LANG_IDENTIFIER_CAST(NODE) \
-	((struct lang_identifier*)IDENTIFIER_NODE_CHECK (NODE))
-
-struct GTY(()) template_parm_index_s {
-  struct tree_common common;
-  int index;
-  int level;
-  int orig_level;
-  tree decl;
-};
-typedef struct template_parm_index_s template_parm_index;
-
-struct GTY(()) ptrmem_cst {
-  struct tree_common common;
-  tree member;
-};
-typedef struct ptrmem_cst * ptrmem_cst_t;
-
-#define IDENTIFIER_GLOBAL_VALUE(NODE) \
-  namespace_binding ((NODE), global_namespace)
-#define SET_IDENTIFIER_GLOBAL_VALUE(NODE, VAL) \
-  set_namespace_binding ((NODE), global_namespace, (VAL))
-#define IDENTIFIER_NAMESPACE_VALUE(NODE) \
-  namespace_binding ((NODE), current_namespace)
-#define SET_IDENTIFIER_NAMESPACE_VALUE(NODE, VAL) \
-  set_namespace_binding ((NODE), current_namespace, (VAL))
-
-#define CLEANUP_P(NODE)		TREE_LANG_FLAG_0 (TRY_BLOCK_CHECK (NODE))
-
-#define BIND_EXPR_TRY_BLOCK(NODE) \
-  TREE_LANG_FLAG_0 (BIND_EXPR_CHECK (NODE))
-
-/* Used to mark the block around the member initializers and cleanups.  */
-#define BIND_EXPR_BODY_BLOCK(NODE) \
-  TREE_LANG_FLAG_3 (BIND_EXPR_CHECK (NODE))
-#define FUNCTION_NEEDS_BODY_BLOCK(NODE) \
-  (DECL_CONSTRUCTOR_P (NODE) || DECL_DESTRUCTOR_P (NODE) \
-   || LAMBDA_FUNCTION_P (NODE))
-
-#define STATEMENT_LIST_NO_SCOPE(NODE) \
-  TREE_LANG_FLAG_0 (STATEMENT_LIST_CHECK (NODE))
-#define STATEMENT_LIST_TRY_BLOCK(NODE) \
-  TREE_LANG_FLAG_2 (STATEMENT_LIST_CHECK (NODE))
-
-/* Nonzero if this statement should be considered a full-expression,
-   i.e., if temporaries created during this statement should have
-   their destructors run at the end of this statement.  */
-#define STMT_IS_FULL_EXPR_P(NODE) TREE_LANG_FLAG_1 ((NODE))
-
-/* Marks the result of a statement expression.  */
-#define EXPR_STMT_STMT_EXPR_RESULT(NODE) \
-  TREE_LANG_FLAG_0 (EXPR_STMT_CHECK (NODE))
-
-/* Nonzero if this statement-expression does not have an associated scope.  */
-#define STMT_EXPR_NO_SCOPE(NODE) \
-   TREE_LANG_FLAG_0 (STMT_EXPR_CHECK (NODE))
-
-/* Returns nonzero iff TYPE1 and TYPE2 are the same type, in the usual
-   sense of `same'.  */
-#define same_type_p(TYPE1, TYPE2) \
-  comptypes ((TYPE1), (TYPE2), COMPARE_STRICT)
-
-/* Returns nonzero iff NODE is a declaration for the global function
-   `main'.  */
-#define DECL_MAIN_P(NODE)				\
-   (DECL_EXTERN_C_FUNCTION_P (NODE)			\
-    && DECL_NAME (NODE) != NULL_TREE			\
-    && MAIN_NAME_P (DECL_NAME (NODE))			\
-    && flag_hosted)
-
-/* The overloaded FUNCTION_DECL.  */
-#define OVL_FUNCTION(NODE) \
-  (((struct tree_overload*)OVERLOAD_CHECK (NODE))->function)
-#define OVL_CHAIN(NODE)      TREE_CHAIN (NODE)
-/* Polymorphic access to FUNCTION and CHAIN.  */
-#define OVL_CURRENT(NODE)	\
-  ((TREE_CODE (NODE) == OVERLOAD) ? OVL_FUNCTION (NODE) : (NODE))
-#define OVL_NEXT(NODE)		\
-  ((TREE_CODE (NODE) == OVERLOAD) ? TREE_CHAIN (NODE) : NULL_TREE)
-/* If set, this was imported in a using declaration.
-   This is not to confuse with being used somewhere, which
-   is not important for this node.  */
-#define OVL_USED(NODE)		TREE_USED (OVERLOAD_CHECK (NODE))
-/* If set, this OVERLOAD was created for argument-dependent lookup
-   and can be freed afterward.  */
-#define OVL_ARG_DEPENDENT(NODE) TREE_LANG_FLAG_0 (OVERLOAD_CHECK (NODE))
-
-struct GTY(()) tree_overload {
-  struct tree_common common;
-  tree function;
-};
-
-/* Returns true iff NODE is a BASELINK.  */
-#define BASELINK_P(NODE) \
-  (TREE_CODE (NODE) == BASELINK)
-/* The BINFO indicating the base in which lookup found the
-   BASELINK_FUNCTIONS.  */
-#define BASELINK_BINFO(NODE) \
-  (((struct tree_baselink*) BASELINK_CHECK (NODE))->binfo)
-/* The functions referred to by the BASELINK; either a FUNCTION_DECL,
-   a TEMPLATE_DECL, an OVERLOAD, or a TEMPLATE_ID_EXPR.  */
-#define BASELINK_FUNCTIONS(NODE) \
-  (((struct tree_baselink*) BASELINK_CHECK (NODE))->functions)
-/* The BINFO in which the search for the functions indicated by this baselink
-   began.  This base is used to determine the accessibility of functions
-   selected by overload resolution.  */
-#define BASELINK_ACCESS_BINFO(NODE) \
-  (((struct tree_baselink*) BASELINK_CHECK (NODE))->access_binfo)
-/* For a type-conversion operator, the BASELINK_OPTYPE indicates the type
-   to which the conversion should occur.  This value is important if
-   the BASELINK_FUNCTIONS include a template conversion operator --
-   the BASELINK_OPTYPE can be used to determine what type the user
-   requested.  */
-#define BASELINK_OPTYPE(NODE) \
-  (TREE_CHAIN (BASELINK_CHECK (NODE)))
-/* Nonzero if this baselink was from a qualified lookup.  */
-#define BASELINK_QUALIFIED_P(NODE) \
-  TREE_LANG_FLAG_0 (BASELINK_CHECK (NODE))
-
-struct GTY(()) tree_baselink {
-  struct tree_common common;
-  tree binfo;
-  tree functions;
-  tree access_binfo;
-};
-
-/* The different kinds of ids that we encounter.  */
-
-typedef enum cp_id_kind
-{
-  /* Not an id at all.  */
-  CP_ID_KIND_NONE,
-  /* An unqualified-id that is not a template-id.  */
-  CP_ID_KIND_UNQUALIFIED,
-  /* An unqualified-id that is a dependent name.  */
-  CP_ID_KIND_UNQUALIFIED_DEPENDENT,
-  /* An unqualified template-id.  */
-  CP_ID_KIND_TEMPLATE_ID,
-  /* A qualified-id.  */
-  CP_ID_KIND_QUALIFIED
-} cp_id_kind;
-
-
-/* The various kinds of C++0x warnings we encounter. */
-
-typedef enum cpp0x_warn_str
-{
-  /* extended initializer lists */
-  CPP0X_INITIALIZER_LISTS,
-  /* explicit conversion operators */
-  CPP0X_EXPLICIT_CONVERSION,
-  /* variadic templates */
-  CPP0X_VARIADIC_TEMPLATES,
-  /* lambda expressions */
-  CPP0X_LAMBDA_EXPR,
-  /* C++0x auto */
-  CPP0X_AUTO,
-  /* scoped enums */
-  CPP0X_SCOPED_ENUMS,
-  /* defaulted and deleted functions */
-  CPP0X_DEFAULTED_DELETED,
-  /* inline namespaces */
-  CPP0X_INLINE_NAMESPACES,
-  /* override controls, override/final */
-  CPP0X_OVERRIDE_CONTROLS,
-  /* non-static data member initializers */
-  CPP0X_NSDMI,
-  /* user defined literals */
-  CPP0X_USER_DEFINED_LITERALS,
-  /* delegating constructors */
-  CPP0X_DELEGATING_CTORS,
-  /* inheriting constructors */
-  CPP0X_INHERITING_CTORS,
-  /* C++11 attributes */
-  CPP0X_ATTRIBUTES,
-  /* ref-qualified member functions */
-  CPP0X_REF_QUALIFIER
-} cpp0x_warn_str;
-
-/* The various kinds of operation used by composite_pointer_type. */
-
-typedef enum composite_pointer_operation
-{
-  /* comparison */
-  CPO_COMPARISON,
-  /* conversion */
-  CPO_CONVERSION,
-  /* conditional expression */
-  CPO_CONDITIONAL_EXPR
-} composite_pointer_operation;
-
-/* Possible cases of expression list used by build_x_compound_expr_from_list. */
-typedef enum expr_list_kind {
-  ELK_INIT,		/* initializer */
-  ELK_MEM_INIT,		/* member initializer */
-  ELK_FUNC_CAST		/* functional cast */
-} expr_list_kind; 
-
-/* Possible cases of implicit bad rhs conversions. */
-typedef enum impl_conv_rhs {
-  ICR_DEFAULT_ARGUMENT, /* default argument */
-  ICR_CONVERTING,       /* converting */
-  ICR_INIT,             /* initialization */
-  ICR_ARGPASS,          /* argument passing */
-  ICR_RETURN,           /* return */
-  ICR_ASSIGN            /* assignment */
-} impl_conv_rhs;
-
-/* Possible cases of implicit or explicit bad conversions to void. */
-typedef enum impl_conv_void {
-  ICV_CAST,            /* (explicit) conversion to void */
-  ICV_SECOND_OF_COND,  /* second operand of conditional expression */
-  ICV_THIRD_OF_COND,   /* third operand of conditional expression */
-  ICV_RIGHT_OF_COMMA,  /* right operand of comma operator */
-  ICV_LEFT_OF_COMMA,   /* left operand of comma operator */
-  ICV_STATEMENT,       /* statement */
-  ICV_THIRD_IN_FOR     /* for increment expression */
-} impl_conv_void;
-
-/* Possible invalid uses of an abstract class that might not have a
-   specific associated declaration.  */
-typedef enum abstract_class_use {
-  ACU_UNKNOWN,			/* unknown or decl provided */
-  ACU_CAST,			/* cast to abstract class */
-  ACU_NEW,			/* new-expression of abstract class */
-  ACU_THROW,			/* throw-expression of abstract class */
-  ACU_CATCH,			/* catch-parameter of abstract class */
-  ACU_ARRAY,			/* array of abstract class */
-  ACU_RETURN,			/* return type of abstract class */
-  ACU_PARM			/* parameter type of abstract class */
-} abstract_class_use;
-
-/* Macros for access to language-specific slots in an identifier.  */
-
-#define IDENTIFIER_NAMESPACE_BINDINGS(NODE)	\
-  (LANG_IDENTIFIER_CAST (NODE)->namespace_bindings)
-#define IDENTIFIER_TEMPLATE(NODE)	\
-  (LANG_IDENTIFIER_CAST (NODE)->class_template_info)
-
-/* The IDENTIFIER_BINDING is the innermost cxx_binding for the
-    identifier.  It's PREVIOUS is the next outermost binding.  Each
-    VALUE field is a DECL for the associated declaration.  Thus,
-    name lookup consists simply of pulling off the node at the front
-    of the list (modulo oddities for looking up the names of types,
-    and such.)  You can use SCOPE field to determine the scope
-    that bound the name.  */
-#define IDENTIFIER_BINDING(NODE) \
-  (LANG_IDENTIFIER_CAST (NODE)->bindings)
-
-/* TREE_TYPE only indicates on local and class scope the current
-   type. For namespace scope, the presence of a type in any namespace
-   is indicated with global_type_node, and the real type behind must
-   be found through lookup.  */
-#define IDENTIFIER_TYPE_VALUE(NODE) identifier_type_value (NODE)
-#define REAL_IDENTIFIER_TYPE_VALUE(NODE) TREE_TYPE (NODE)
-#define SET_IDENTIFIER_TYPE_VALUE(NODE,TYPE) (TREE_TYPE (NODE) = (TYPE))
-#define IDENTIFIER_HAS_TYPE_VALUE(NODE) (IDENTIFIER_TYPE_VALUE (NODE) ? 1 : 0)
-
-#define IDENTIFIER_LABEL_VALUE(NODE) \
-  (LANG_IDENTIFIER_CAST (NODE)->label_value)
-#define SET_IDENTIFIER_LABEL_VALUE(NODE, VALUE)   \
-  IDENTIFIER_LABEL_VALUE (NODE) = (VALUE)
-
-/* Nonzero if this identifier is used as a virtual function name somewhere
-   (optimizes searches).  */
-#define IDENTIFIER_VIRTUAL_P(NODE) TREE_LANG_FLAG_1 (NODE)
-
-/* Nonzero if this identifier is the prefix for a mangled C++ operator
-   name.  */
-#define IDENTIFIER_OPNAME_P(NODE) TREE_LANG_FLAG_2 (NODE)
-
-/* Nonzero if this identifier is the name of a type-conversion
-   operator.  */
-#define IDENTIFIER_TYPENAME_P(NODE) \
-  TREE_LANG_FLAG_4 (NODE)
-
-/* Nonzero if this identifier is the name of a constructor or
-   destructor.  */
-#define IDENTIFIER_CTOR_OR_DTOR_P(NODE) \
-  TREE_LANG_FLAG_3 (NODE)
-
-/* True iff NAME is the DECL_ASSEMBLER_NAME for an entity with vague
-   linkage which the prelinker has assigned to this translation
-   unit.  */
-#define IDENTIFIER_REPO_CHOSEN(NAME) \
-  (TREE_LANG_FLAG_6 (NAME))
-
-/* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is read-only.  */
-#define C_TYPE_FIELDS_READONLY(TYPE) \
-  (LANG_TYPE_CLASS_CHECK (TYPE)->fields_readonly)
-
-/* The tokens stored in the default argument.  */
-
-#define DEFARG_TOKENS(NODE) \
-  (((struct tree_default_arg *)DEFAULT_ARG_CHECK (NODE))->tokens)
-#define DEFARG_INSTANTIATIONS(NODE) \
-  (((struct tree_default_arg *)DEFAULT_ARG_CHECK (NODE))->instantiations)
-
-struct GTY (()) tree_default_arg {
-  struct tree_common common;
-  struct cp_token_cache *tokens;
-  vec<tree, va_gc> *instantiations;
-};
-
-
-#define DEFERRED_NOEXCEPT_PATTERN(NODE) \
-  (((struct tree_deferred_noexcept *)DEFERRED_NOEXCEPT_CHECK (NODE))->pattern)
-#define DEFERRED_NOEXCEPT_ARGS(NODE) \
-  (((struct tree_deferred_noexcept *)DEFERRED_NOEXCEPT_CHECK (NODE))->args)
-#define DEFERRED_NOEXCEPT_SPEC_P(NODE)				\
-  ((NODE) && (TREE_PURPOSE (NODE))				\
-  && (TREE_CODE (TREE_PURPOSE (NODE)) == DEFERRED_NOEXCEPT	\
-      || is_overloaded_fn (TREE_PURPOSE (NODE))))
-
-struct GTY (()) tree_deferred_noexcept {
-  struct tree_base base;
-  tree pattern;
-  tree args;
-};
-
-
-/* The condition associated with the static assertion.  This must be
-   an integral constant expression.  */
-#define STATIC_ASSERT_CONDITION(NODE) \
-  (((struct tree_static_assert *)STATIC_ASSERT_CHECK (NODE))->condition)
-
-/* The message associated with the static assertion.  This must be a
-   string constant, which will be emitted as an error message when the
-   static assert condition is false.  */
-#define STATIC_ASSERT_MESSAGE(NODE) \
-  (((struct tree_static_assert *)STATIC_ASSERT_CHECK (NODE))->message)
-
-/* Source location information for a static assertion.  */
-#define STATIC_ASSERT_SOURCE_LOCATION(NODE) \
-  (((struct tree_static_assert *)STATIC_ASSERT_CHECK (NODE))->location)
-
-struct GTY (()) tree_static_assert {
-  struct tree_common common;
-  tree condition;
-  tree message;
-  location_t location;
-};
-
-struct GTY (()) tree_argument_pack_select {
-  struct tree_common common;
-  tree argument_pack;
-  int index;
-};
-
-/* The different kinds of traits that we encounter.  */
-
-typedef enum cp_trait_kind
-{
-  CPTK_BASES,
-  CPTK_DIRECT_BASES,
-  CPTK_HAS_NOTHROW_ASSIGN,
-  CPTK_HAS_NOTHROW_CONSTRUCTOR,
-  CPTK_HAS_NOTHROW_COPY,
-  CPTK_HAS_TRIVIAL_ASSIGN,
-  CPTK_HAS_TRIVIAL_CONSTRUCTOR,
-  CPTK_HAS_TRIVIAL_COPY,
-  CPTK_HAS_TRIVIAL_DESTRUCTOR,
-  CPTK_HAS_VIRTUAL_DESTRUCTOR,
-  CPTK_IS_ABSTRACT,
-  CPTK_IS_BASE_OF,
-  CPTK_IS_CLASS,
-  CPTK_IS_CONVERTIBLE_TO,
-  CPTK_IS_EMPTY,
-  CPTK_IS_ENUM,
-  CPTK_IS_FINAL,
-  CPTK_IS_LITERAL_TYPE,
-  CPTK_IS_POD,
-  CPTK_IS_POLYMORPHIC,
-  CPTK_IS_STD_LAYOUT,
-  CPTK_IS_TRIVIAL,
-  CPTK_IS_UNION,
-  CPTK_UNDERLYING_TYPE
-} cp_trait_kind;
-
-/* The types that we are processing.  */
-#define TRAIT_EXPR_TYPE1(NODE) \
-  (((struct tree_trait_expr *)TRAIT_EXPR_CHECK (NODE))->type1)
-
-#define TRAIT_EXPR_TYPE2(NODE) \
-  (((struct tree_trait_expr *)TRAIT_EXPR_CHECK (NODE))->type2)
-
-/* The specific trait that we are processing.  */
-#define TRAIT_EXPR_KIND(NODE) \
-  (((struct tree_trait_expr *)TRAIT_EXPR_CHECK (NODE))->kind)
-
-struct GTY (()) tree_trait_expr {
-  struct tree_common common;
-  tree type1;
-  tree type2;  
-  enum cp_trait_kind kind;
-};
-
-/* Based off of TYPE_ANONYMOUS_P.  */
-#define LAMBDA_TYPE_P(NODE) \
-  (CLASS_TYPE_P (NODE) && CLASSTYPE_LAMBDA_EXPR (NODE))
-
-/* Test if FUNCTION_DECL is a lambda function.  */
-#define LAMBDA_FUNCTION_P(FNDECL) \
-  (DECL_OVERLOADED_OPERATOR_P (FNDECL) == CALL_EXPR \
-   && LAMBDA_TYPE_P (CP_DECL_CONTEXT (FNDECL)))
-
-enum cp_lambda_default_capture_mode_type {
-  CPLD_NONE,
-  CPLD_COPY,
-  CPLD_REFERENCE
-};
-
-/* The method of default capture, if any.  */
-#define LAMBDA_EXPR_DEFAULT_CAPTURE_MODE(NODE) \
-  (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->default_capture_mode)
-
-/* The capture-list, including `this'.  Each capture is stored as a FIELD_DECL
- * so that the name, type, and field are all together, whether or not it has
- * been added to the lambda's class type.
-   TREE_LIST:
-     TREE_PURPOSE: The FIELD_DECL for this capture.
-     TREE_VALUE: The initializer. This is part of a GNU extension.  */
-#define LAMBDA_EXPR_CAPTURE_LIST(NODE) \
-  (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->capture_list)
-
-/* During parsing of the lambda-introducer, the node in the capture-list
-   that holds the 'this' capture.  During parsing of the body, the
-   capture proxy for that node.  */
-#define LAMBDA_EXPR_THIS_CAPTURE(NODE) \
-  (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->this_capture)
-
-/* Predicate tracking whether `this' is in the effective capture set.  */
-#define LAMBDA_EXPR_CAPTURES_THIS_P(NODE) \
-  LAMBDA_EXPR_THIS_CAPTURE(NODE)
-
-/* Predicate tracking whether the lambda was declared 'mutable'.  */
-#define LAMBDA_EXPR_MUTABLE_P(NODE) \
-  TREE_LANG_FLAG_1 (LAMBDA_EXPR_CHECK (NODE))
-
-/* The return type in the expression.
- * NULL_TREE indicates that none was specified.  */
-#define LAMBDA_EXPR_RETURN_TYPE(NODE) \
-  (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->return_type)
-
-/* The source location of the lambda.  */
-#define LAMBDA_EXPR_LOCATION(NODE) \
-  (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->locus)
-
-/* The mangling scope for the lambda: FUNCTION_DECL, PARM_DECL, VAR_DECL,
-   FIELD_DECL or NULL_TREE.  If this is NULL_TREE, we have no linkage.  */
-#define LAMBDA_EXPR_EXTRA_SCOPE(NODE) \
-  (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->extra_scope)
-
-/* If EXTRA_SCOPE, this is the number of the lambda within that scope.  */
-#define LAMBDA_EXPR_DISCRIMINATOR(NODE) \
-  (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->discriminator)
-
-/* During parsing of the lambda, a vector of capture proxies which need
-   to be pushed once we're done processing a nested lambda.  */
-#define LAMBDA_EXPR_PENDING_PROXIES(NODE) \
-  (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->pending_proxies)
-
-/* The closure type of the lambda.  Note that the TREE_TYPE of a
-   LAMBDA_EXPR is always NULL_TREE, because we need to instantiate the
-   LAMBDA_EXPR in order to instantiate the type.  */
-#define LAMBDA_EXPR_CLOSURE(NODE) \
-  (((struct tree_lambda_expr *)LAMBDA_EXPR_CHECK (NODE))->closure)
-
-struct GTY (()) tree_lambda_expr
-{
-  struct tree_typed typed;
-  tree capture_list;
-  tree this_capture;
-  tree return_type;
-  tree extra_scope;
-  tree closure;
-  vec<tree, va_gc> *pending_proxies;
-  location_t locus;
-  enum cp_lambda_default_capture_mode_type default_capture_mode;
-  int discriminator;
-};
-
-/* A (typedef,context,usage location) triplet.
-   It represents a typedef used through a
-   context at a given source location.
-   e.g.
-   struct foo {
-     typedef int myint;
-   };
-
-   struct bar {
-    foo::myint v; // #1<-- this location.
-   };
-
-   In bar, the triplet will be (myint, foo, #1).
-   */
-struct GTY(()) qualified_typedef_usage_s {
-  tree typedef_decl;
-  tree context;
-  location_t locus;
-};
-typedef struct qualified_typedef_usage_s qualified_typedef_usage_t;
-
-/* Non-zero if this template specialization has access violations that
-   should be rechecked when the function is instantiated outside argument
-   deduction.  */
-#define TINFO_HAS_ACCESS_ERRORS(NODE) \
-  (TREE_LANG_FLAG_0 (TEMPLATE_INFO_CHECK (NODE)))
-#define FNDECL_HAS_ACCESS_ERRORS(NODE) \
-  (TINFO_HAS_ACCESS_ERRORS (DECL_TEMPLATE_INFO (NODE)))
-
-struct GTY(()) tree_template_info {
-  struct tree_common common;
-  vec<qualified_typedef_usage_t, va_gc> *typedefs_needing_access_checking;
-};
-
-enum cp_tree_node_structure_enum {
-  TS_CP_GENERIC,
-  TS_CP_IDENTIFIER,
-  TS_CP_TPI,
-  TS_CP_PTRMEM,
-  TS_CP_BINDING,
-  TS_CP_OVERLOAD,
-  TS_CP_BASELINK,
-  TS_CP_WRAPPER,
-  TS_CP_DEFAULT_ARG,
-  TS_CP_DEFERRED_NOEXCEPT,
-  TS_CP_STATIC_ASSERT,
-  TS_CP_ARGUMENT_PACK_SELECT,
-  TS_CP_TRAIT_EXPR,
-  TS_CP_LAMBDA_EXPR,
-  TS_CP_TEMPLATE_INFO,
-  TS_CP_USERDEF_LITERAL,
-  LAST_TS_CP_ENUM
-};
-
-/* The resulting tree type.  */
-union GTY((desc ("cp_tree_node_structure (&%h)"),
-       chain_next ("(union lang_tree_node *) c_tree_chain_next (&%h.generic)"))) lang_tree_node {
-  union tree_node GTY ((tag ("TS_CP_GENERIC"),
-			desc ("tree_node_structure (&%h)"))) generic;
-  struct template_parm_index_s GTY ((tag ("TS_CP_TPI"))) tpi;
-  struct ptrmem_cst GTY ((tag ("TS_CP_PTRMEM"))) ptrmem;
-  struct tree_overload GTY ((tag ("TS_CP_OVERLOAD"))) overload;
-  struct tree_baselink GTY ((tag ("TS_CP_BASELINK"))) baselink;
-  struct tree_default_arg GTY ((tag ("TS_CP_DEFAULT_ARG"))) default_arg;
-  struct tree_deferred_noexcept GTY ((tag ("TS_CP_DEFERRED_NOEXCEPT"))) deferred_noexcept;
-  struct lang_identifier GTY ((tag ("TS_CP_IDENTIFIER"))) identifier;
-  struct tree_static_assert GTY ((tag ("TS_CP_STATIC_ASSERT"))) 
-    static_assertion;
-  struct tree_argument_pack_select GTY ((tag ("TS_CP_ARGUMENT_PACK_SELECT")))
-    argument_pack_select;
-  struct tree_trait_expr GTY ((tag ("TS_CP_TRAIT_EXPR")))
-    trait_expression;
-  struct tree_lambda_expr GTY ((tag ("TS_CP_LAMBDA_EXPR")))
-    lambda_expression;
-  struct tree_template_info GTY ((tag ("TS_CP_TEMPLATE_INFO")))
-    template_info;
-  struct tree_userdef_literal GTY ((tag ("TS_CP_USERDEF_LITERAL")))
-    userdef_literal;
-};
-
-
-enum cp_tree_index
-{
-    CPTI_JAVA_BYTE_TYPE,
-    CPTI_JAVA_SHORT_TYPE,
-    CPTI_JAVA_INT_TYPE,
-    CPTI_JAVA_LONG_TYPE,
-    CPTI_JAVA_FLOAT_TYPE,
-    CPTI_JAVA_DOUBLE_TYPE,
-    CPTI_JAVA_CHAR_TYPE,
-    CPTI_JAVA_BOOLEAN_TYPE,
-
-    CPTI_WCHAR_DECL,
-    CPTI_VTABLE_ENTRY_TYPE,
-    CPTI_DELTA_TYPE,
-    CPTI_VTABLE_INDEX_TYPE,
-    CPTI_CLEANUP_TYPE,
-    CPTI_VTT_PARM_TYPE,
-
-    CPTI_CLASS_TYPE,
-    CPTI_UNKNOWN_TYPE,
-    CPTI_INIT_LIST_TYPE,
-    CPTI_VTBL_TYPE,
-    CPTI_VTBL_PTR_TYPE,
-    CPTI_STD,
-    CPTI_ABI,
-    CPTI_CONST_TYPE_INFO_TYPE,
-    CPTI_TYPE_INFO_PTR_TYPE,
-    CPTI_ABORT_FNDECL,
-    CPTI_GLOBAL_DELETE_FNDECL,
-    CPTI_AGGR_TAG,
-
-    CPTI_CTOR_IDENTIFIER,
-    CPTI_COMPLETE_CTOR_IDENTIFIER,
-    CPTI_BASE_CTOR_IDENTIFIER,
-    CPTI_DTOR_IDENTIFIER,
-    CPTI_COMPLETE_DTOR_IDENTIFIER,
-    CPTI_BASE_DTOR_IDENTIFIER,
-    CPTI_DELETING_DTOR_IDENTIFIER,
-    CPTI_DELTA_IDENTIFIER,
-    CPTI_IN_CHARGE_IDENTIFIER,
-    CPTI_VTT_PARM_IDENTIFIER,
-    CPTI_NELTS_IDENTIFIER,
-    CPTI_THIS_IDENTIFIER,
-    CPTI_PFN_IDENTIFIER,
-    CPTI_VPTR_IDENTIFIER,
-    CPTI_STD_IDENTIFIER,
-
-    CPTI_LANG_NAME_C,
-    CPTI_LANG_NAME_CPLUSPLUS,
-    CPTI_LANG_NAME_JAVA,
-
-    CPTI_EMPTY_EXCEPT_SPEC,
-    CPTI_NOEXCEPT_TRUE_SPEC,
-    CPTI_NOEXCEPT_FALSE_SPEC,
-    CPTI_JCLASS,
-    CPTI_TERMINATE,
-    CPTI_CALL_UNEXPECTED,
-    CPTI_ATEXIT_FN_PTR_TYPE,
-    CPTI_ATEXIT,
-    CPTI_DSO_HANDLE,
-    CPTI_DCAST,
-
-    CPTI_KEYED_CLASSES,
-
-    CPTI_NULLPTR,
-    CPTI_NULLPTR_TYPE,
-
-    CPTI_MAX
-};
-
-extern GTY(()) tree cp_global_trees[CPTI_MAX];
-
-#define java_byte_type_node		cp_global_trees[CPTI_JAVA_BYTE_TYPE]
-#define java_short_type_node		cp_global_trees[CPTI_JAVA_SHORT_TYPE]
-#define java_int_type_node		cp_global_trees[CPTI_JAVA_INT_TYPE]
-#define java_long_type_node		cp_global_trees[CPTI_JAVA_LONG_TYPE]
-#define java_float_type_node		cp_global_trees[CPTI_JAVA_FLOAT_TYPE]
-#define java_double_type_node		cp_global_trees[CPTI_JAVA_DOUBLE_TYPE]
-#define java_char_type_node		cp_global_trees[CPTI_JAVA_CHAR_TYPE]
-#define java_boolean_type_node		cp_global_trees[CPTI_JAVA_BOOLEAN_TYPE]
-
-#define wchar_decl_node			cp_global_trees[CPTI_WCHAR_DECL]
-#define vtable_entry_type		cp_global_trees[CPTI_VTABLE_ENTRY_TYPE]
-/* The type used to represent an offset by which to adjust the `this'
-   pointer in pointer-to-member types.  */
-#define delta_type_node			cp_global_trees[CPTI_DELTA_TYPE]
-/* The type used to represent an index into the vtable.  */
-#define vtable_index_type		cp_global_trees[CPTI_VTABLE_INDEX_TYPE]
-
-#define class_type_node			cp_global_trees[CPTI_CLASS_TYPE]
-#define unknown_type_node		cp_global_trees[CPTI_UNKNOWN_TYPE]
-#define init_list_type_node		cp_global_trees[CPTI_INIT_LIST_TYPE]
-#define vtbl_type_node			cp_global_trees[CPTI_VTBL_TYPE]
-#define vtbl_ptr_type_node		cp_global_trees[CPTI_VTBL_PTR_TYPE]
-#define std_node			cp_global_trees[CPTI_STD]
-#define abi_node			cp_global_trees[CPTI_ABI]
-#define const_type_info_type_node	cp_global_trees[CPTI_CONST_TYPE_INFO_TYPE]
-#define type_info_ptr_type		cp_global_trees[CPTI_TYPE_INFO_PTR_TYPE]
-#define abort_fndecl			cp_global_trees[CPTI_ABORT_FNDECL]
-#define global_delete_fndecl		cp_global_trees[CPTI_GLOBAL_DELETE_FNDECL]
-#define current_aggr			cp_global_trees[CPTI_AGGR_TAG]
-#define nullptr_node			cp_global_trees[CPTI_NULLPTR]
-#define nullptr_type_node		cp_global_trees[CPTI_NULLPTR_TYPE]
-
-/* We cache these tree nodes so as to call get_identifier less
-   frequently.  */
-
-/* The name of a constructor that takes an in-charge parameter to
-   decide whether or not to construct virtual base classes.  */
-#define ctor_identifier			cp_global_trees[CPTI_CTOR_IDENTIFIER]
-/* The name of a constructor that constructs virtual base classes.  */
-#define complete_ctor_identifier	cp_global_trees[CPTI_COMPLETE_CTOR_IDENTIFIER]
-/* The name of a constructor that does not construct virtual base classes.  */
-#define base_ctor_identifier		cp_global_trees[CPTI_BASE_CTOR_IDENTIFIER]
-/* The name of a destructor that takes an in-charge parameter to
-   decide whether or not to destroy virtual base classes and whether
-   or not to delete the object.  */
-#define dtor_identifier			cp_global_trees[CPTI_DTOR_IDENTIFIER]
-/* The name of a destructor that destroys virtual base classes.  */
-#define complete_dtor_identifier	cp_global_trees[CPTI_COMPLETE_DTOR_IDENTIFIER]
-/* The name of a destructor that does not destroy virtual base
-   classes.  */
-#define base_dtor_identifier		cp_global_trees[CPTI_BASE_DTOR_IDENTIFIER]
-/* The name of a destructor that destroys virtual base classes, and
-   then deletes the entire object.  */
-#define deleting_dtor_identifier	cp_global_trees[CPTI_DELETING_DTOR_IDENTIFIER]
-#define delta_identifier		cp_global_trees[CPTI_DELTA_IDENTIFIER]
-#define in_charge_identifier		cp_global_trees[CPTI_IN_CHARGE_IDENTIFIER]
-/* The name of the parameter that contains a pointer to the VTT to use
-   for this subobject constructor or destructor.  */
-#define vtt_parm_identifier		cp_global_trees[CPTI_VTT_PARM_IDENTIFIER]
-#define nelts_identifier		cp_global_trees[CPTI_NELTS_IDENTIFIER]
-#define this_identifier			cp_global_trees[CPTI_THIS_IDENTIFIER]
-#define pfn_identifier			cp_global_trees[CPTI_PFN_IDENTIFIER]
-#define vptr_identifier			cp_global_trees[CPTI_VPTR_IDENTIFIER]
-/* The name of the std namespace.  */
-#define std_identifier			cp_global_trees[CPTI_STD_IDENTIFIER]
-#define lang_name_c			cp_global_trees[CPTI_LANG_NAME_C]
-#define lang_name_cplusplus		cp_global_trees[CPTI_LANG_NAME_CPLUSPLUS]
-#define lang_name_java			cp_global_trees[CPTI_LANG_NAME_JAVA]
-
-/* Exception specifier used for throw().  */
-#define empty_except_spec		cp_global_trees[CPTI_EMPTY_EXCEPT_SPEC]
-#define noexcept_true_spec		cp_global_trees[CPTI_NOEXCEPT_TRUE_SPEC]
-#define noexcept_false_spec		cp_global_trees[CPTI_NOEXCEPT_FALSE_SPEC]
-
-/* If non-NULL, a POINTER_TYPE equivalent to (java::lang::Class*).  */
-#define jclass_node			cp_global_trees[CPTI_JCLASS]
-
-/* The declaration for `std::terminate'.  */
-#define terminate_node			cp_global_trees[CPTI_TERMINATE]
-
-/* The declaration for "__cxa_call_unexpected".  */
-#define call_unexpected_node		cp_global_trees[CPTI_CALL_UNEXPECTED]
-
-/* The type of the function-pointer argument to "__cxa_atexit" (or
-   "std::atexit", if "__cxa_atexit" is not being used).  */
-#define atexit_fn_ptr_type_node         cp_global_trees[CPTI_ATEXIT_FN_PTR_TYPE]
-
-/* A pointer to `std::atexit'.  */
-#define atexit_node			cp_global_trees[CPTI_ATEXIT]
-
-/* A pointer to `__dso_handle'.  */
-#define dso_handle_node			cp_global_trees[CPTI_DSO_HANDLE]
-
-/* The declaration of the dynamic_cast runtime.  */
-#define dynamic_cast_node		cp_global_trees[CPTI_DCAST]
-
-/* The type of a destructor.  */
-#define cleanup_type			cp_global_trees[CPTI_CLEANUP_TYPE]
-
-/* The type of the vtt parameter passed to subobject constructors and
-   destructors.  */
-#define vtt_parm_type			cp_global_trees[CPTI_VTT_PARM_TYPE]
-
-/* A TREE_LIST of the dynamic classes whose vtables may have to be
-   emitted in this translation unit.  */
-
-#define keyed_classes			cp_global_trees[CPTI_KEYED_CLASSES]
-
-/* Node to indicate default access. This must be distinct from the
-   access nodes in tree.h.  */
-
-#define access_default_node		null_node
-
-/* Global state.  */
-
-struct GTY(()) saved_scope {
-  vec<cxx_saved_binding, va_gc> *old_bindings;
-  tree old_namespace;
-  vec<tree, va_gc> *decl_ns_list;
-  tree class_name;
-  tree class_type;
-  tree access_specifier;
-  tree function_decl;
-  vec<tree, va_gc> *lang_base;
-  tree lang_name;
-  tree template_parms;
-  cp_binding_level *x_previous_class_level;
-  tree x_saved_tree;
-
-  /* Only used for uses of this in trailing return type.  */
-  tree x_current_class_ptr;
-  tree x_current_class_ref;
-
-  int x_processing_template_decl;
-  int x_processing_specialization;
-  BOOL_BITFIELD x_processing_explicit_instantiation : 1;
-  BOOL_BITFIELD need_pop_function_context : 1;
-
-  int unevaluated_operand;
-  int inhibit_evaluation_warnings;
-  /* If non-zero, implicit "omp declare target" attribute is added into the
-     attribute lists.  */
-  int omp_declare_target_attribute;
-
-  struct stmt_tree_s x_stmt_tree;
-
-  cp_binding_level *class_bindings;
-  cp_binding_level *bindings;
-
-  struct pointer_map_t *x_local_specializations;
-
-  struct saved_scope *prev;
-};
-
-/* The current open namespace.  */
-
-#define current_namespace scope_chain->old_namespace
-
-/* The stack for namespaces of current declarations.  */
-
-#define decl_namespace_list scope_chain->decl_ns_list
-
-/* IDENTIFIER_NODE: name of current class */
-
-#define current_class_name scope_chain->class_name
-
-/* _TYPE: the type of the current class */
-
-#define current_class_type scope_chain->class_type
-
-/* When parsing a class definition, the access specifier most recently
-   given by the user, or, if no access specifier was given, the
-   default value appropriate for the kind of class (i.e., struct,
-   class, or union).  */
-
-#define current_access_specifier scope_chain->access_specifier
-
-/* Pointer to the top of the language name stack.  */
-
-#define current_lang_base scope_chain->lang_base
-#define current_lang_name scope_chain->lang_name
-
-/* When parsing a template declaration, a TREE_LIST represents the
-   active template parameters.  Each node in the list represents one
-   level of template parameters.  The innermost level is first in the
-   list.  The depth of each level is stored as an INTEGER_CST in the
-   TREE_PURPOSE of each node.  The parameters for that level are
-   stored in the TREE_VALUE.  */
-
-#define current_template_parms scope_chain->template_parms
-
-#define processing_template_decl scope_chain->x_processing_template_decl
-#define processing_specialization scope_chain->x_processing_specialization
-#define processing_explicit_instantiation scope_chain->x_processing_explicit_instantiation
-
-/* The cached class binding level, from the most recently exited
-   class, or NULL if none.  */
-
-#define previous_class_level scope_chain->x_previous_class_level
-
-/* A map from local variable declarations in the body of the template
-   presently being instantiated to the corresponding instantiated
-   local variables.  */
-
-#define local_specializations scope_chain->x_local_specializations
-
-/* A list of private types mentioned, for deferred access checking.  */
-
-extern GTY(()) struct saved_scope *scope_chain;
-
-struct GTY(()) cxx_int_tree_map {
-  unsigned int uid;
-  tree to;
-};
-
-extern unsigned int cxx_int_tree_map_hash (const void *);
-extern int cxx_int_tree_map_eq (const void *, const void *);
-
-/* Global state pertinent to the current function.  */
-
-struct GTY(()) language_function {
-  struct c_language_function base;
-
-  tree x_cdtor_label;
-  tree x_current_class_ptr;
-  tree x_current_class_ref;
-  tree x_eh_spec_block;
-  tree x_in_charge_parm;
-  tree x_vtt_parm;
-  tree x_return_value;
-  tree x_auto_return_pattern;
-
-  BOOL_BITFIELD returns_value : 1;
-  BOOL_BITFIELD returns_null : 1;
-  BOOL_BITFIELD returns_abnormally : 1;
-  BOOL_BITFIELD infinite_loop: 1;
-  BOOL_BITFIELD x_in_function_try_handler : 1;
-  BOOL_BITFIELD x_in_base_initializer : 1;
-
-  /* True if this function can throw an exception.  */
-  BOOL_BITFIELD can_throw : 1;
-
-  htab_t GTY((param_is(struct named_label_entry))) x_named_labels;
-  cp_binding_level *bindings;
-  vec<tree, va_gc> *x_local_names;
-  /* Tracking possibly infinite loops.  This is a vec<tree> only because
-     vec<bool> doesn't work with gtype.  */
-  vec<tree, va_gc> *infinite_loops;
-  htab_t GTY((param_is (struct cxx_int_tree_map))) extern_decl_map;
-};
-
-/* The current C++-specific per-function global variables.  */
-
-#define cp_function_chain (cfun->language)
-
-/* In a constructor destructor, the point at which all derived class
-   destroying/construction has been done.  I.e., just before a
-   constructor returns, or before any base class destroying will be done
-   in a destructor.  */
-
-#define cdtor_label cp_function_chain->x_cdtor_label
-
-/* When we're processing a member function, current_class_ptr is the
-   PARM_DECL for the `this' pointer.  The current_class_ref is an
-   expression for `*this'.  */
-
-#define current_class_ptr			\
-  (*(cfun && cp_function_chain			\
-     ? &cp_function_chain->x_current_class_ptr	\
-     : &scope_chain->x_current_class_ptr))
-#define current_class_ref			\
-  (*(cfun && cp_function_chain			\
-     ? &cp_function_chain->x_current_class_ref	\
-     : &scope_chain->x_current_class_ref))
-
-/* The EH_SPEC_BLOCK for the exception-specifiers for the current
-   function, if any.  */
-
-#define current_eh_spec_block cp_function_chain->x_eh_spec_block
-
-/* The `__in_chrg' parameter for the current function.  Only used for
-   constructors and destructors.  */
-
-#define current_in_charge_parm cp_function_chain->x_in_charge_parm
-
-/* The `__vtt_parm' parameter for the current function.  Only used for
-   constructors and destructors.  */
-
-#define current_vtt_parm cp_function_chain->x_vtt_parm
-
-/* Set to 0 at beginning of a function definition, set to 1 if
-   a return statement that specifies a return value is seen.  */
-
-#define current_function_returns_value cp_function_chain->returns_value
-
-/* Set to 0 at beginning of a function definition, set to 1 if
-   a return statement with no argument is seen.  */
-
-#define current_function_returns_null cp_function_chain->returns_null
-
-/* Set to 0 at beginning of a function definition, set to 1 if
-   a call to a noreturn function is seen.  */
-
-#define current_function_returns_abnormally \
-  cp_function_chain->returns_abnormally
-
-/* Set to 0 at beginning of a function definition, set to 1 if we see an
-   obvious infinite loop.  This can have false positives and false
-   negatives, so it should only be used as a heuristic.  */
-
-#define current_function_infinite_loop cp_function_chain->infinite_loop
-
-/* Nonzero if we are processing a base initializer.  Zero elsewhere.  */
-#define in_base_initializer cp_function_chain->x_in_base_initializer
-
-#define in_function_try_handler cp_function_chain->x_in_function_try_handler
-
-/* Expression always returned from function, or error_mark_node
-   otherwise, for use by the automatic named return value optimization.  */
-
-#define current_function_return_value \
-  (cp_function_chain->x_return_value)
-
-/* A type involving 'auto' to be used for return type deduction.  */
-
-#define current_function_auto_return_pattern \
-  (cp_function_chain->x_auto_return_pattern)
-
-/* True if NAME is the IDENTIFIER_NODE for an overloaded "operator
-   new" or "operator delete".  */
-#define NEW_DELETE_OPNAME_P(NAME)		\
-  ((NAME) == ansi_opname (NEW_EXPR)		\
-   || (NAME) == ansi_opname (VEC_NEW_EXPR)	\
-   || (NAME) == ansi_opname (DELETE_EXPR)	\
-   || (NAME) == ansi_opname (VEC_DELETE_EXPR))
-
-#define ansi_opname(CODE) \
-  (operator_name_info[(int) (CODE)].identifier)
-#define ansi_assopname(CODE) \
-  (assignment_operator_name_info[(int) (CODE)].identifier)
-
-/* TRUE if a tree code represents a statement.  */
-extern bool statement_code_p[MAX_TREE_CODES];
-
-#define STATEMENT_CODE_P(CODE) statement_code_p[(int) (CODE)]
-
-enum languages { lang_c, lang_cplusplus, lang_java };
-
-/* Macros to make error reporting functions' lives easier.  */
-#define TYPE_IDENTIFIER(NODE) (DECL_NAME (TYPE_NAME (NODE)))
-#define TYPE_LINKAGE_IDENTIFIER(NODE) \
-  (TYPE_IDENTIFIER (TYPE_MAIN_VARIANT (NODE)))
-#define TYPE_NAME_STRING(NODE) (IDENTIFIER_POINTER (TYPE_IDENTIFIER (NODE)))
-#define TYPE_NAME_LENGTH(NODE) (IDENTIFIER_LENGTH (TYPE_IDENTIFIER (NODE)))
-
-/* Nonzero if NODE has no name for linkage purposes.  */
-#define TYPE_ANONYMOUS_P(NODE) \
-  (OVERLOAD_TYPE_P (NODE) && ANON_AGGRNAME_P (TYPE_LINKAGE_IDENTIFIER (NODE)))
-
-/* The _DECL for this _TYPE.  */
-#define TYPE_MAIN_DECL(NODE) (TYPE_STUB_DECL (TYPE_MAIN_VARIANT (NODE)))
-
-/* Nonzero if T is a type that could resolve to any kind of concrete type
-   at instantiation time.  */
-#define WILDCARD_TYPE_P(T)				\
-  (TREE_CODE (T) == TEMPLATE_TYPE_PARM			\
-   || TREE_CODE (T) == TYPENAME_TYPE			\
-   || TREE_CODE (T) == TYPEOF_TYPE			\
-   || TREE_CODE (T) == BOUND_TEMPLATE_TEMPLATE_PARM	\
-   || TREE_CODE (T) == DECLTYPE_TYPE)
-
-/* Nonzero if T is a class (or struct or union) type.  Also nonzero
-   for template type parameters, typename types, and instantiated
-   template template parameters.  Keep these checks in ascending code
-   order.  */
-#define MAYBE_CLASS_TYPE_P(T) (WILDCARD_TYPE_P (T) || CLASS_TYPE_P (T))
-
-/* Set CLASS_TYPE_P for T to VAL.  T must be a class, struct, or
-   union type.  */
-#define SET_CLASS_TYPE_P(T, VAL) \
-  (TYPE_LANG_FLAG_5 (T) = (VAL))
-
-/* Nonzero if T is a class type.  Zero for template type parameters,
-   typename types, and so forth.  */
-#define CLASS_TYPE_P(T) \
-  (RECORD_OR_UNION_CODE_P (TREE_CODE (T)) && TYPE_LANG_FLAG_5 (T))
-
-/* Nonzero if T is a class type but not an union.  */
-#define NON_UNION_CLASS_TYPE_P(T) \
-  (CLASS_TYPE_P (T) && TREE_CODE (T) != UNION_TYPE)
-
-/* Keep these checks in ascending code order.  */
-#define RECORD_OR_UNION_CODE_P(T)	\
-  ((T) == RECORD_TYPE || (T) == UNION_TYPE)
-#define OVERLOAD_TYPE_P(T) \
-  (CLASS_TYPE_P (T) || TREE_CODE (T) == ENUMERAL_TYPE)
-
-/* True if this a "Java" type, defined in 'extern "Java"'.  */
-#define TYPE_FOR_JAVA(NODE) TYPE_LANG_FLAG_3 (NODE)
-
-/* True if this type is dependent.  This predicate is only valid if
-   TYPE_DEPENDENT_P_VALID is true.  */
-#define TYPE_DEPENDENT_P(NODE) TYPE_LANG_FLAG_0 (NODE)
-
-/* True if dependent_type_p has been called for this type, with the
-   result that TYPE_DEPENDENT_P is valid.  */
-#define TYPE_DEPENDENT_P_VALID(NODE) TYPE_LANG_FLAG_6(NODE)
-
-/* Nonzero if this type is const-qualified.  */
-#define CP_TYPE_CONST_P(NODE)				\
-  ((cp_type_quals (NODE) & TYPE_QUAL_CONST) != 0)
-
-/* Nonzero if this type is volatile-qualified.  */
-#define CP_TYPE_VOLATILE_P(NODE)			\
-  ((cp_type_quals (NODE) & TYPE_QUAL_VOLATILE) != 0)
-
-/* Nonzero if this type is restrict-qualified.  */
-#define CP_TYPE_RESTRICT_P(NODE)			\
-  ((cp_type_quals (NODE) & TYPE_QUAL_RESTRICT) != 0)
-
-/* Nonzero if this type is const-qualified, but not
-   volatile-qualified.  Other qualifiers are ignored.  This macro is
-   used to test whether or not it is OK to bind an rvalue to a
-   reference.  */
-#define CP_TYPE_CONST_NON_VOLATILE_P(NODE)				\
-  ((cp_type_quals (NODE) & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE))	\
-   == TYPE_QUAL_CONST)
-
-#define FUNCTION_ARG_CHAIN(NODE) \
-  TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (NODE)))
-
-/* Given a FUNCTION_DECL, returns the first TREE_LIST out of TYPE_ARG_TYPES
-   which refers to a user-written parameter.  */
-#define FUNCTION_FIRST_USER_PARMTYPE(NODE) \
-  skip_artificial_parms_for ((NODE), TYPE_ARG_TYPES (TREE_TYPE (NODE)))
-
-/* Similarly, but for DECL_ARGUMENTS.  */
-#define FUNCTION_FIRST_USER_PARM(NODE) \
-  skip_artificial_parms_for ((NODE), DECL_ARGUMENTS (NODE))
-
-/* Nonzero iff TYPE is derived from PARENT. Ignores accessibility and
-   ambiguity issues.  */
-#define DERIVED_FROM_P(PARENT, TYPE) \
-  (lookup_base ((TYPE), (PARENT), ba_any, NULL, tf_none) != NULL_TREE)
-
-/* Gives the visibility specification for a class type.  */
-#define CLASSTYPE_VISIBILITY(TYPE)		\
-	DECL_VISIBILITY (TYPE_MAIN_DECL (TYPE))
-#define CLASSTYPE_VISIBILITY_SPECIFIED(TYPE)	\
-	DECL_VISIBILITY_SPECIFIED (TYPE_MAIN_DECL (TYPE))
-
-typedef struct GTY (()) tree_pair_s {
-  tree purpose;
-  tree value;
-} tree_pair_s;
-typedef tree_pair_s *tree_pair_p;
-
-/* This is a few header flags for 'struct lang_type'.  Actually,
-   all but the first are used only for lang_type_class; they
-   are put in this structure to save space.  */
-struct GTY(()) lang_type_header {
-  BOOL_BITFIELD is_lang_type_class : 1;
-
-  BOOL_BITFIELD has_type_conversion : 1;
-  BOOL_BITFIELD has_copy_ctor : 1;
-  BOOL_BITFIELD has_default_ctor : 1;
-  BOOL_BITFIELD const_needs_init : 1;
-  BOOL_BITFIELD ref_needs_init : 1;
-  BOOL_BITFIELD has_const_copy_assign : 1;
-
-  BOOL_BITFIELD spare : 1;
-};
-
-/* This structure provides additional information above and beyond
-   what is provide in the ordinary tree_type.  In the past, we used it
-   for the types of class types, template parameters types, typename
-   types, and so forth.  However, there can be many (tens to hundreds
-   of thousands) of template parameter types in a compilation, and
-   there's no need for this additional information in that case.
-   Therefore, we now use this data structure only for class types.
-
-   In the past, it was thought that there would be relatively few
-   class types.  However, in the presence of heavy use of templates,
-   many (i.e., thousands) of classes can easily be generated.
-   Therefore, we should endeavor to keep the size of this structure to
-   a minimum.  */
-struct GTY(()) lang_type_class {
-  struct lang_type_header h;
-
-  unsigned char align;
-
-  unsigned has_mutable : 1;
-  unsigned com_interface : 1;
-  unsigned non_pod_class : 1;
-  unsigned nearly_empty_p : 1;
-  unsigned user_align : 1;
-  unsigned has_copy_assign : 1;
-  unsigned has_new : 1;
-  unsigned has_array_new : 1;
-
-  unsigned gets_delete : 2;
-  unsigned interface_only : 1;
-  unsigned interface_unknown : 1;
-  unsigned contains_empty_class_p : 1;
-  unsigned anon_aggr : 1;
-  unsigned non_zero_init : 1;
-  unsigned empty_p : 1;
-
-  unsigned vec_new_uses_cookie : 1;
-  unsigned declared_class : 1;
-  unsigned diamond_shaped : 1;
-  unsigned repeated_base : 1;
-  unsigned being_defined : 1;
-  unsigned java_interface : 1;
-  unsigned debug_requested : 1;
-  unsigned fields_readonly : 1;
-
-  unsigned use_template : 2;
-  unsigned ptrmemfunc_flag : 1;
-  unsigned was_anonymous : 1;
-  unsigned lazy_default_ctor : 1;
-  unsigned lazy_copy_ctor : 1;
-  unsigned lazy_copy_assign : 1;
-  unsigned lazy_destructor : 1;
-
-  unsigned has_const_copy_ctor : 1;
-  unsigned has_complex_copy_ctor : 1;
-  unsigned has_complex_copy_assign : 1;
-  unsigned non_aggregate : 1;
-  unsigned has_complex_dflt : 1;
-  unsigned has_list_ctor : 1;
-  unsigned non_std_layout : 1;
-  unsigned is_literal : 1;
-
-  unsigned lazy_move_ctor : 1;
-  unsigned lazy_move_assign : 1;
-  unsigned has_complex_move_ctor : 1;
-  unsigned has_complex_move_assign : 1;
-  unsigned has_constexpr_ctor : 1;
-
-  /* When adding a flag here, consider whether or not it ought to
-     apply to a template instance if it applies to the template.  If
-     so, make sure to copy it in instantiate_class_template!  */
-
-  /* There are some bits left to fill out a 32-bit word.  Keep track
-     of this by updating the size of this bitfield whenever you add or
-     remove a flag.  */
-  unsigned dummy : 3;
-
-  tree primary_base;
-  vec<tree_pair_s, va_gc> *vcall_indices;
-  tree vtables;
-  tree typeinfo_var;
-  vec<tree, va_gc> *vbases;
-  binding_table nested_udts;
-  tree as_base;
-  vec<tree, va_gc> *pure_virtuals;
-  tree friend_classes;
-  vec<tree, va_gc> * GTY((reorder ("resort_type_method_vec"))) methods;
-  tree key_method;
-  tree decl_list;
-  tree template_info;
-  tree befriending_classes;
-  /* In a RECORD_TYPE, information specific to Objective-C++, such
-     as a list of adopted protocols or a pointer to a corresponding
-     @interface.  See objc/objc-act.h for details.  */
-  tree objc_info;
-  /* sorted_fields is sorted based on a pointer, so we need to be able
-     to resort it if pointers get rearranged.  */
-  struct sorted_fields_type * GTY ((reorder ("resort_sorted_fields")))
-    sorted_fields;
-  /* FIXME reuse another field?  */
-  tree lambda_expr;
-};
-
-struct GTY(()) lang_type_ptrmem {
-  struct lang_type_header h;
-  tree record;
-};
-
-struct GTY((variable_size)) lang_type {
-  union lang_type_u
-  {
-    struct lang_type_header GTY((skip (""))) h;
-    struct lang_type_class  GTY((tag ("1"))) c;
-    struct lang_type_ptrmem GTY((tag ("0"))) ptrmem;
-  } GTY((desc ("%h.h.is_lang_type_class"))) u;
-};
-
-#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
-
-#define LANG_TYPE_CLASS_CHECK(NODE) __extension__		\
-({  struct lang_type *lt = TYPE_LANG_SPECIFIC (NODE);		\
-    if (! lt->u.h.is_lang_type_class)				\
-      lang_check_failed (__FILE__, __LINE__, __FUNCTION__);	\
-    &lt->u.c; })
-
-#define LANG_TYPE_PTRMEM_CHECK(NODE) __extension__		\
-({  struct lang_type *lt = TYPE_LANG_SPECIFIC (NODE);		\
-    if (lt->u.h.is_lang_type_class)				\
-      lang_check_failed (__FILE__, __LINE__, __FUNCTION__);	\
-    &lt->u.ptrmem; })
-
-#else
-
-#define LANG_TYPE_CLASS_CHECK(NODE) (&TYPE_LANG_SPECIFIC (NODE)->u.c)
-#define LANG_TYPE_PTRMEM_CHECK(NODE) (&TYPE_LANG_SPECIFIC (NODE)->u.ptrmem)
-
-#endif /* ENABLE_TREE_CHECKING */
-
-/* Nonzero for _CLASSTYPE means that operator delete is defined.  */
-#define TYPE_GETS_DELETE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->gets_delete)
-#define TYPE_GETS_REG_DELETE(NODE) (TYPE_GETS_DELETE (NODE) & 1)
-
-/* Nonzero if `new NODE[x]' should cause the allocation of extra
-   storage to indicate how many array elements are in use.  */
-#define TYPE_VEC_NEW_USES_COOKIE(NODE)			\
-  (CLASS_TYPE_P (NODE)					\
-   && LANG_TYPE_CLASS_CHECK (NODE)->vec_new_uses_cookie)
-
-/* Nonzero means that this _CLASSTYPE node defines ways of converting
-   itself to other types.  */
-#define TYPE_HAS_CONVERSION(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->h.has_type_conversion)
-
-/* Nonzero means that NODE (a class type) has a default constructor --
-   but that it has not yet been declared.  */
-#define CLASSTYPE_LAZY_DEFAULT_CTOR(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->lazy_default_ctor)
-
-/* Nonzero means that NODE (a class type) has a copy constructor --
-   but that it has not yet been declared.  */
-#define CLASSTYPE_LAZY_COPY_CTOR(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->lazy_copy_ctor)
-
-/* Nonzero means that NODE (a class type) has a move constructor --
-   but that it has not yet been declared.  */
-#define CLASSTYPE_LAZY_MOVE_CTOR(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->lazy_move_ctor)
-
-/* Nonzero means that NODE (a class type) has an assignment operator
-   -- but that it has not yet been declared.  */
-#define CLASSTYPE_LAZY_COPY_ASSIGN(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->lazy_copy_assign)
-
-/* Nonzero means that NODE (a class type) has an assignment operator
-   -- but that it has not yet been declared.  */
-#define CLASSTYPE_LAZY_MOVE_ASSIGN(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->lazy_move_assign)
-
-/* Nonzero means that NODE (a class type) has a destructor -- but that
-   it has not yet been declared.  */
-#define CLASSTYPE_LAZY_DESTRUCTOR(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->lazy_destructor)
-
-/* Nonzero means that NODE (a class type) is final */
-#define CLASSTYPE_FINAL(NODE) \
-  TYPE_FINAL_P (NODE)
-
-
-/* Nonzero means that this _CLASSTYPE node overloads operator=(X&).  */
-#define TYPE_HAS_COPY_ASSIGN(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_copy_assign)
-
-/* True iff the class type NODE has an "operator =" whose parameter
-   has a parameter of type "const X&".  */
-#define TYPE_HAS_CONST_COPY_ASSIGN(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->h.has_const_copy_assign)
-
-/* Nonzero means that this _CLASSTYPE node has an X(X&) constructor.  */
-#define TYPE_HAS_COPY_CTOR(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->h.has_copy_ctor)
-#define TYPE_HAS_CONST_COPY_CTOR(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->has_const_copy_ctor)
-
-/* Nonzero if this class has an X(initializer_list<T>) constructor.  */
-#define TYPE_HAS_LIST_CTOR(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->has_list_ctor)
-
-/* Nonzero if this class has a constexpr constructor other than a copy/move
-   constructor.  Note that a class can have constexpr constructors for
-   static initialization even if it isn't a literal class.  */
-#define TYPE_HAS_CONSTEXPR_CTOR(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->has_constexpr_ctor)
-
-/* Nonzero if this class defines an overloaded operator new.  (An
-   operator new [] doesn't count.)  */
-#define TYPE_HAS_NEW_OPERATOR(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->has_new)
-
-/* Nonzero if this class defines an overloaded operator new[].  */
-#define TYPE_HAS_ARRAY_NEW_OPERATOR(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->has_array_new)
-
-/* Nonzero means that this type is being defined.  I.e., the left brace
-   starting the definition of this type has been seen.  */
-#define TYPE_BEING_DEFINED(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->being_defined)
-
-/* Nonzero means that this type is either complete or being defined, so we
-   can do lookup in it.  */
-#define COMPLETE_OR_OPEN_TYPE_P(NODE) \
-  (COMPLETE_TYPE_P (NODE) || (CLASS_TYPE_P (NODE) && TYPE_BEING_DEFINED (NODE)))
-
-/* Mark bits for repeated base checks.  */
-#define TYPE_MARKED_P(NODE) TREE_LANG_FLAG_6 (TYPE_CHECK (NODE))
-
-/* Nonzero if the class NODE has multiple paths to the same (virtual)
-   base object.  */
-#define CLASSTYPE_DIAMOND_SHAPED_P(NODE) \
-  (LANG_TYPE_CLASS_CHECK(NODE)->diamond_shaped)
-
-/* Nonzero if the class NODE has multiple instances of the same base
-   type.  */
-#define CLASSTYPE_REPEATED_BASE_P(NODE) \
-  (LANG_TYPE_CLASS_CHECK(NODE)->repeated_base)
-
-/* The member function with which the vtable will be emitted:
-   the first noninline non-pure-virtual member function.  NULL_TREE
-   if there is no key function or if this is a class template */
-#define CLASSTYPE_KEY_METHOD(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->key_method)
-
-/* Vector member functions defined in this class.  Each element is
-   either a FUNCTION_DECL, a TEMPLATE_DECL, or an OVERLOAD.  All
-   functions with the same name end up in the same slot.  The first
-   two elements are for constructors, and destructors, respectively.
-   All template conversion operators to innermost template dependent
-   types are overloaded on the next slot, if they exist.  Note, the
-   names for these functions will not all be the same.  The
-   non-template conversion operators & templated conversions to
-   non-innermost template types are next, followed by ordinary member
-   functions.  There may be empty entries at the end of the vector.
-   The conversion operators are unsorted. The ordinary member
-   functions are sorted, once the class is complete.  */
-#define CLASSTYPE_METHOD_VEC(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->methods)
-
-/* For class templates, this is a TREE_LIST of all member data,
-   functions, types, and friends in the order of declaration.
-   The TREE_PURPOSE of each TREE_LIST is NULL_TREE for a friend,
-   and the RECORD_TYPE for the class template otherwise.  */
-#define CLASSTYPE_DECL_LIST(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->decl_list)
-
-/* The slot in the CLASSTYPE_METHOD_VEC where constructors go.  */
-#define CLASSTYPE_CONSTRUCTOR_SLOT 0
-
-/* The slot in the CLASSTYPE_METHOD_VEC where destructors go.  */
-#define CLASSTYPE_DESTRUCTOR_SLOT 1
-
-/* The first slot in the CLASSTYPE_METHOD_VEC where conversion
-   operators can appear.  */
-#define CLASSTYPE_FIRST_CONVERSION_SLOT 2
-
-/* A FUNCTION_DECL or OVERLOAD for the constructors for NODE.  These
-   are the constructors that take an in-charge parameter.  */
-#define CLASSTYPE_CONSTRUCTORS(NODE) \
-  ((*CLASSTYPE_METHOD_VEC (NODE))[CLASSTYPE_CONSTRUCTOR_SLOT])
-
-/* A FUNCTION_DECL for the destructor for NODE.  These are the
-   destructors that take an in-charge parameter.  If
-   CLASSTYPE_LAZY_DESTRUCTOR is true, then this entry will be NULL
-   until the destructor is created with lazily_declare_fn.  */
-#define CLASSTYPE_DESTRUCTORS(NODE) \
-  (CLASSTYPE_METHOD_VEC (NODE)						      \
-   ? (*CLASSTYPE_METHOD_VEC (NODE))[CLASSTYPE_DESTRUCTOR_SLOT]		      \
-   : NULL_TREE)
-
-/* A dictionary of the nested user-defined-types (class-types, or enums)
-   found within this class.  This table includes nested member class
-   templates.  */
-#define CLASSTYPE_NESTED_UTDS(NODE) \
-   (LANG_TYPE_CLASS_CHECK (NODE)->nested_udts)
-
-/* Nonzero if NODE has a primary base class, i.e., a base class with
-   which it shares the virtual function table pointer.  */
-#define CLASSTYPE_HAS_PRIMARY_BASE_P(NODE) \
-  (CLASSTYPE_PRIMARY_BINFO (NODE) != NULL_TREE)
-
-/* If non-NULL, this is the binfo for the primary base class, i.e.,
-   the base class which contains the virtual function table pointer
-   for this class.  */
-#define CLASSTYPE_PRIMARY_BINFO(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->primary_base)
-
-/* A vector of BINFOs for the direct and indirect virtual base classes
-   that this type uses in a post-order depth-first left-to-right
-   order.  (In other words, these bases appear in the order that they
-   should be initialized.)  */
-#define CLASSTYPE_VBASECLASSES(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->vbases)
-
-/* The type corresponding to NODE when NODE is used as a base class,
-   i.e., NODE without virtual base classes.  */
-
-#define CLASSTYPE_AS_BASE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->as_base)
-
-/* True iff NODE is the CLASSTYPE_AS_BASE version of some type.  */
-
-#define IS_FAKE_BASE_TYPE(NODE)					\
-  (TREE_CODE (NODE) == RECORD_TYPE				\
-   && TYPE_CONTEXT (NODE) && CLASS_TYPE_P (TYPE_CONTEXT (NODE))	\
-   && CLASSTYPE_AS_BASE (TYPE_CONTEXT (NODE)) == (NODE))
-
-/* These are the size and alignment of the type without its virtual
-   base classes, for when we use this type as a base itself.  */
-#define CLASSTYPE_SIZE(NODE) TYPE_SIZE (CLASSTYPE_AS_BASE (NODE))
-#define CLASSTYPE_SIZE_UNIT(NODE) TYPE_SIZE_UNIT (CLASSTYPE_AS_BASE (NODE))
-#define CLASSTYPE_ALIGN(NODE) TYPE_ALIGN (CLASSTYPE_AS_BASE (NODE))
-#define CLASSTYPE_USER_ALIGN(NODE) TYPE_USER_ALIGN (CLASSTYPE_AS_BASE (NODE))
-
-/* The alignment of NODE, without its virtual bases, in bytes.  */
-#define CLASSTYPE_ALIGN_UNIT(NODE) \
-  (CLASSTYPE_ALIGN (NODE) / BITS_PER_UNIT)
-
-/* True if this a Java interface type, declared with
-   '__attribute__ ((java_interface))'.  */
-#define TYPE_JAVA_INTERFACE(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->java_interface)
-
-/* A vec<tree> of virtual functions which cannot be inherited by
-   derived classes.  When deriving from this type, the derived
-   class must provide its own definition for each of these functions.  */
-#define CLASSTYPE_PURE_VIRTUALS(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->pure_virtuals)
-
-/* Nonzero means that this type is an abstract class type.  */
-#define ABSTRACT_CLASS_TYPE_P(NODE) \
-  (CLASS_TYPE_P (NODE) && CLASSTYPE_PURE_VIRTUALS(NODE))
-
-/* Nonzero means that this type has an X() constructor.  */
-#define TYPE_HAS_DEFAULT_CONSTRUCTOR(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->h.has_default_ctor)
-
-/* Nonzero means that this type contains a mutable member.  */
-#define CLASSTYPE_HAS_MUTABLE(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_mutable)
-#define TYPE_HAS_MUTABLE_P(NODE) (cp_has_mutable_p (NODE))
-
-/* Nonzero means that this class type is not POD for the purpose of layout
-   (as defined in the ABI).  This is different from the language's POD.  */
-#define CLASSTYPE_NON_LAYOUT_POD_P(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->non_pod_class)
-
-/* Nonzero means that this class type is a non-standard-layout class.  */
-#define CLASSTYPE_NON_STD_LAYOUT(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->non_std_layout)
-
-/* Nonzero means that this class contains pod types whose default
-   initialization is not a zero initialization (namely, pointers to
-   data members).  */
-#define CLASSTYPE_NON_ZERO_INIT_P(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->non_zero_init)
-
-/* Nonzero if this class is "empty" in the sense of the C++ ABI.  */
-#define CLASSTYPE_EMPTY_P(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->empty_p)
-
-/* Nonzero if this class is "nearly empty", i.e., contains only a
-   virtual function table pointer.  */
-#define CLASSTYPE_NEARLY_EMPTY_P(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->nearly_empty_p)
-
-/* Nonzero if this class contains an empty subobject.  */
-#define CLASSTYPE_CONTAINS_EMPTY_CLASS_P(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->contains_empty_class_p)
-
-/* A list of class types of which this type is a friend.  The
-   TREE_VALUE is normally a TYPE, but will be a TEMPLATE_DECL in the
-   case of a template friend.  */
-#define CLASSTYPE_FRIEND_CLASSES(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->friend_classes)
-
-/* A list of the classes which grant friendship to this class.  */
-#define CLASSTYPE_BEFRIENDING_CLASSES(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->befriending_classes)
-
-/* The associated LAMBDA_EXPR that made this class.  */
-#define CLASSTYPE_LAMBDA_EXPR(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->lambda_expr)
-/* The extra mangling scope for this closure type.  */
-#define LAMBDA_TYPE_EXTRA_SCOPE(NODE) \
-  (LAMBDA_EXPR_EXTRA_SCOPE (CLASSTYPE_LAMBDA_EXPR (NODE)))
-
-/* Say whether this node was declared as a "class" or a "struct".  */
-#define CLASSTYPE_DECLARED_CLASS(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->declared_class)
-
-/* Nonzero if this class has const members
-   which have no specified initialization.  */
-#define CLASSTYPE_READONLY_FIELDS_NEED_INIT(NODE)	\
-  (TYPE_LANG_SPECIFIC (NODE)				\
-   ? LANG_TYPE_CLASS_CHECK (NODE)->h.const_needs_init : 0)
-#define SET_CLASSTYPE_READONLY_FIELDS_NEED_INIT(NODE, VALUE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->h.const_needs_init = (VALUE))
-
-/* Nonzero if this class has ref members
-   which have no specified initialization.  */
-#define CLASSTYPE_REF_FIELDS_NEED_INIT(NODE)		\
-  (TYPE_LANG_SPECIFIC (NODE)				\
-   ? LANG_TYPE_CLASS_CHECK (NODE)->h.ref_needs_init : 0)
-#define SET_CLASSTYPE_REF_FIELDS_NEED_INIT(NODE, VALUE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->h.ref_needs_init = (VALUE))
-
-/* Nonzero if this class is included from a header file which employs
-   `#pragma interface', and it is not included in its implementation file.  */
-#define CLASSTYPE_INTERFACE_ONLY(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->interface_only)
-
-/* True if we have already determined whether or not vtables, VTTs,
-   typeinfo, and other similar per-class data should be emitted in
-   this translation unit.  This flag does not indicate whether or not
-   these items should be emitted; it only indicates that we know one
-   way or the other.  */
-#define CLASSTYPE_INTERFACE_KNOWN(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown == 0)
-/* The opposite of CLASSTYPE_INTERFACE_KNOWN.  */
-#define CLASSTYPE_INTERFACE_UNKNOWN(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown)
-
-#define SET_CLASSTYPE_INTERFACE_UNKNOWN_X(NODE,X) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown = !!(X))
-#define SET_CLASSTYPE_INTERFACE_UNKNOWN(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown = 1)
-#define SET_CLASSTYPE_INTERFACE_KNOWN(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->interface_unknown = 0)
-
-/* Nonzero if a _DECL node requires us to output debug info for this class.  */
-#define CLASSTYPE_DEBUG_REQUESTED(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->debug_requested)
-
-/* Additional macros for inheritance information.  */
-
-/* Nonzero means that this class is on a path leading to a new vtable.  */
-#define BINFO_VTABLE_PATH_MARKED(NODE) BINFO_FLAG_1 (NODE)
-
-/* Nonzero means B (a BINFO) has its own vtable.  Any copies will not
-   have this flag set.  */
-#define BINFO_NEW_VTABLE_MARKED(B) (BINFO_FLAG_2 (B))
-
-/* Compare a BINFO_TYPE with another type for equality.  For a binfo,
-   this is functionally equivalent to using same_type_p, but
-   measurably faster.  At least one of the arguments must be a
-   BINFO_TYPE.  The other can be a BINFO_TYPE or a regular type.  If
-   BINFO_TYPE(T) ever stops being the main variant of the class the
-   binfo is for, this macro must change.  */
-#define SAME_BINFO_TYPE_P(A, B) ((A) == (B))
-
-/* Any subobject that needs a new vtable must have a vptr and must not
-   be a non-virtual primary base (since it would then use the vtable from a
-   derived class and never become non-primary.)  */
-#define SET_BINFO_NEW_VTABLE_MARKED(B)					 \
-  (BINFO_NEW_VTABLE_MARKED (B) = 1,					 \
-   gcc_assert (!BINFO_PRIMARY_P (B) || BINFO_VIRTUAL_P (B)),		 \
-   gcc_assert (TYPE_VFIELD (BINFO_TYPE (B))))
-
-/* Nonzero if this binfo is for a dependent base - one that should not
-   be searched.  */
-#define BINFO_DEPENDENT_BASE_P(NODE) BINFO_FLAG_3 (NODE)
-
-/* Nonzero if this binfo has lost its primary base binfo (because that
-   is a nearly-empty virtual base that has been taken by some other
-   base in the complete hierarchy.  */
-#define BINFO_LOST_PRIMARY_P(NODE) BINFO_FLAG_4 (NODE)
-
-/* Nonzero if this BINFO is a primary base class.  */
-#define BINFO_PRIMARY_P(NODE) BINFO_FLAG_5(NODE)
-
-/* Used by various search routines.  */
-#define IDENTIFIER_MARKED(NODE) TREE_LANG_FLAG_0 (NODE)
-
-/* A vec<tree_pair_s> of the vcall indices associated with the class
-   NODE.  The PURPOSE of each element is a FUNCTION_DECL for a virtual
-   function.  The VALUE is the index into the virtual table where the
-   vcall offset for that function is stored, when NODE is a virtual
-   base.  */
-#define CLASSTYPE_VCALL_INDICES(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->vcall_indices)
-
-/* The various vtables for the class NODE.  The primary vtable will be
-   first, followed by the construction vtables and VTT, if any.  */
-#define CLASSTYPE_VTABLES(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->vtables)
-
-/* The std::type_info variable representing this class, or NULL if no
-   such variable has been created.  This field is only set for the
-   TYPE_MAIN_VARIANT of the class.  */
-#define CLASSTYPE_TYPEINFO_VAR(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->typeinfo_var)
-
-/* Accessor macros for the BINFO_VIRTUALS list.  */
-
-/* The number of bytes by which to adjust the `this' pointer when
-   calling this virtual function.  Subtract this value from the this
-   pointer. Always non-NULL, might be constant zero though.  */
-#define BV_DELTA(NODE) (TREE_PURPOSE (NODE))
-
-/* If non-NULL, the vtable index at which to find the vcall offset
-   when calling this virtual function.  Add the value at that vtable
-   index to the this pointer.  */
-#define BV_VCALL_INDEX(NODE) (TREE_TYPE (NODE))
-
-/* The function to call.  */
-#define BV_FN(NODE) (TREE_VALUE (NODE))
-
-/* Whether or not this entry is for a lost primary virtual base.  */
-#define BV_LOST_PRIMARY(NODE) (TREE_LANG_FLAG_0 (NODE))
-
-/* For FUNCTION_TYPE or METHOD_TYPE, a list of the exceptions that
-   this type can raise.  Each TREE_VALUE is a _TYPE.  The TREE_VALUE
-   will be NULL_TREE to indicate a throw specification of `()', or
-   no exceptions allowed.  For a noexcept specification, TREE_VALUE
-   is NULL_TREE and TREE_PURPOSE is the constant-expression.  For
-   a deferred noexcept-specification, TREE_PURPOSE is a DEFERRED_NOEXCEPT
-   (for templates) or an OVERLOAD list of functions (for implicitly
-   declared functions).  */
-#define TYPE_RAISES_EXCEPTIONS(NODE) \
-  TYPE_LANG_SLOT_1 (FUNC_OR_METHOD_CHECK (NODE))
-
-/* For FUNCTION_TYPE or METHOD_TYPE, return 1 iff it is declared `throw()'
-   or noexcept(true).  */
-#define TYPE_NOTHROW_P(NODE) nothrow_spec_p (TYPE_RAISES_EXCEPTIONS (NODE))
-
-/* For FUNCTION_TYPE or METHOD_TYPE, true if NODE is noexcept.  This is the
-   case for things declared noexcept(true) and, with -fnothrow-opt, for
-   throw() functions.  */
-#define TYPE_NOEXCEPT_P(NODE) type_noexcept_p (NODE)
-
-/* The binding level associated with the namespace.  */
-#define NAMESPACE_LEVEL(NODE) \
-  (LANG_DECL_NS_CHECK (NODE)->level)
-
-/* Flags shared by all forms of DECL_LANG_SPECIFIC.
-
-   Some of the flags live here only to make lang_decl_min/fn smaller.  Do
-   not make this struct larger than 32 bits; instead, make sel smaller.  */
-
-struct GTY(()) lang_decl_base {
-  unsigned selector : 16;   /* Larger than necessary for faster access.  */
-  ENUM_BITFIELD(languages) language : 4;
-  unsigned use_template : 2;
-  unsigned not_really_extern : 1;	   /* var or fn */
-  unsigned initialized_in_class : 1;	   /* var or fn */
-  unsigned repo_available_p : 1;	   /* var or fn */
-  unsigned threadprivate_or_deleted_p : 1; /* var or fn */
-  unsigned anticipated_p : 1;		   /* fn, type or template */
-  unsigned friend_attr : 1;		   /* fn, type or template */
-  unsigned template_conv_p : 1;		   /* var or template */
-  unsigned odr_used : 1;		   /* var or fn */
-  unsigned u2sel : 1;
-  /* 1 spare bit */
-};
-
-/* True for DECL codes which have template info and access.  */
-#define LANG_DECL_HAS_MIN(NODE)			\
-  (VAR_OR_FUNCTION_DECL_P (NODE)		\
-   || TREE_CODE (NODE) == FIELD_DECL		\
-   || TREE_CODE (NODE) == CONST_DECL		\
-   || TREE_CODE (NODE) == TYPE_DECL		\
-   || TREE_CODE (NODE) == TEMPLATE_DECL		\
-   || TREE_CODE (NODE) == USING_DECL)
-
-/* DECL_LANG_SPECIFIC for the above codes.  */
-
-struct GTY(()) lang_decl_min {
-  struct lang_decl_base base;
-
-  /* In a FUNCTION_DECL for which DECL_THUNK_P holds, this is
-     THUNK_ALIAS.
-     In a FUNCTION_DECL for which DECL_THUNK_P does not hold,
-     VAR_DECL, TYPE_DECL, or TEMPLATE_DECL, this is
-     DECL_TEMPLATE_INFO.  */
-  tree template_info;
-
-  union lang_decl_u2 {
-    /* In a FUNCTION_DECL for which DECL_THUNK_P holds, this is
-       THUNK_VIRTUAL_OFFSET.
-       Otherwise this is DECL_ACCESS.  */
-    tree GTY ((tag ("0"))) access;
-
-    /* For VAR_DECL in function, this is DECL_DISCRIMINATOR.  */
-    int GTY ((tag ("1"))) discriminator;
-  } GTY ((desc ("%0.u.base.u2sel"))) u2;
-};
-
-/* Additional DECL_LANG_SPECIFIC information for functions.  */
-
-struct GTY(()) lang_decl_fn {
-  struct lang_decl_min min;
-
-  /* In an overloaded operator, this is the value of
-     DECL_OVERLOADED_OPERATOR_P.  */
-  ENUM_BITFIELD (tree_code) operator_code : 16;
-
-  unsigned global_ctor_p : 1;
-  unsigned global_dtor_p : 1;
-  unsigned constructor_attr : 1;
-  unsigned destructor_attr : 1;
-  unsigned assignment_operator_p : 1;
-  unsigned static_function : 1;
-  unsigned pure_virtual : 1;
-  unsigned defaulted_p : 1;
-
-  unsigned has_in_charge_parm_p : 1;
-  unsigned has_vtt_parm_p : 1;
-  unsigned pending_inline_p : 1;
-  unsigned nonconverting : 1;
-  unsigned thunk_p : 1;
-  unsigned this_thunk_p : 1;
-  unsigned hidden_friend_p : 1;
-  unsigned omp_declare_reduction_p : 1;
-  /* No spare bits on 32-bit hosts, 32 on 64-bit hosts.  */
-
-  /* For a non-thunk function decl, this is a tree list of
-     friendly classes. For a thunk function decl, it is the
-     thunked to function decl.  */
-  tree befriending_classes;
-
-  /* For a non-virtual FUNCTION_DECL, this is
-     DECL_FRIEND_CONTEXT.  For a virtual FUNCTION_DECL for which
-     DECL_THIS_THUNK_P does not hold, this is DECL_THUNKS. Both
-     this pointer and result pointer adjusting thunks are
-     chained here.  This pointer thunks to return pointer thunks
-     will be chained on the return pointer thunk.  */
-  tree context;
-
-  union lang_decl_u5
-  {
-    /* In a non-thunk FUNCTION_DECL or TEMPLATE_DECL, this is
-       DECL_CLONED_FUNCTION.  */
-    tree GTY ((tag ("0"))) cloned_function;
-
-    /* In a FUNCTION_DECL for which THUNK_P holds this is the
-       THUNK_FIXED_OFFSET.  */
-    HOST_WIDE_INT GTY ((tag ("1"))) fixed_offset;
-  } GTY ((desc ("%1.thunk_p"))) u5;
-
-  union lang_decl_u3
-  {
-    struct cp_token_cache * GTY ((tag ("1"))) pending_inline_info;
-    struct language_function * GTY ((tag ("0")))
-      saved_language_function;
-  } GTY ((desc ("%1.pending_inline_p"))) u;
-
-};
-
-/* DECL_LANG_SPECIFIC for namespaces.  */
-
-struct GTY(()) lang_decl_ns {
-  struct lang_decl_base base;
-  cp_binding_level *level;
-};
-
-/* DECL_LANG_SPECIFIC for parameters.  */
-
-struct GTY(()) lang_decl_parm {
-  struct lang_decl_base base;
-  int level;
-  int index;
-};
-
-/* DECL_LANG_SPECIFIC for all types.  It would be nice to just make this a
-   union rather than a struct containing a union as its only field, but
-   tree.h declares it as a struct.  */
-
-struct GTY((variable_size)) lang_decl {
-  union GTY((desc ("%h.base.selector"))) lang_decl_u {
-    struct lang_decl_base GTY ((default)) base;
-    struct lang_decl_min GTY((tag ("0"))) min;
-    struct lang_decl_fn GTY ((tag ("1"))) fn;
-    struct lang_decl_ns GTY((tag ("2"))) ns;
-    struct lang_decl_parm GTY((tag ("3"))) parm;
-  } u;
-};
-
-/* Looks through a template (if present) to find what it declares.  */
-#define STRIP_TEMPLATE(NODE) \
-  (TREE_CODE (NODE) == TEMPLATE_DECL ? DECL_TEMPLATE_RESULT (NODE) : NODE)
-
-#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
-
-#define LANG_DECL_MIN_CHECK(NODE) __extension__			\
-({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE);		\
-   if (!LANG_DECL_HAS_MIN (NODE))				\
-     lang_check_failed (__FILE__, __LINE__, __FUNCTION__);	\
-   &lt->u.min; })
-
-/* We want to be able to check DECL_CONSTRUCTOR_P and such on a function
-   template, not just on a FUNCTION_DECL.  So when looking for things in
-   lang_decl_fn, look down through a TEMPLATE_DECL into its result.  */
-#define LANG_DECL_FN_CHECK(NODE) __extension__				\
-({ struct lang_decl *lt = DECL_LANG_SPECIFIC (STRIP_TEMPLATE (NODE));	\
-   if (!DECL_DECLARES_FUNCTION_P (NODE) || lt->u.base.selector != 1)	\
-     lang_check_failed (__FILE__, __LINE__, __FUNCTION__);		\
-   &lt->u.fn; })
-
-#define LANG_DECL_NS_CHECK(NODE) __extension__				\
-({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE);			\
-   if (TREE_CODE (NODE) != NAMESPACE_DECL || lt->u.base.selector != 2)	\
-     lang_check_failed (__FILE__, __LINE__, __FUNCTION__);		\
-   &lt->u.ns; })
-
-#define LANG_DECL_PARM_CHECK(NODE) __extension__		\
-({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE);		\
-  if (TREE_CODE (NODE) != PARM_DECL)				\
-    lang_check_failed (__FILE__, __LINE__, __FUNCTION__);	\
-  &lt->u.parm; })
-
-#define LANG_DECL_U2_CHECK(NODE, TF) __extension__		\
-({  struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE);		\
-    if (!LANG_DECL_HAS_MIN (NODE) || lt->u.base.u2sel != TF)	\
-      lang_check_failed (__FILE__, __LINE__, __FUNCTION__);	\
-    &lt->u.min.u2; })
-
-#else
-
-#define LANG_DECL_MIN_CHECK(NODE) \
-  (&DECL_LANG_SPECIFIC (NODE)->u.min)
-
-#define LANG_DECL_FN_CHECK(NODE) \
-  (&DECL_LANG_SPECIFIC (STRIP_TEMPLATE (NODE))->u.fn)
-
-#define LANG_DECL_NS_CHECK(NODE) \
-  (&DECL_LANG_SPECIFIC (NODE)->u.ns)
-
-#define LANG_DECL_PARM_CHECK(NODE) \
-  (&DECL_LANG_SPECIFIC (NODE)->u.parm)
-
-#define LANG_DECL_U2_CHECK(NODE, TF) \
-  (&DECL_LANG_SPECIFIC (NODE)->u.min.u2)
-
-#endif /* ENABLE_TREE_CHECKING */
-
-/* For a FUNCTION_DECL or a VAR_DECL, the language linkage for the
-   declaration.  Some entities (like a member function in a local
-   class, or a local variable) do not have linkage at all, and this
-   macro should not be used in those cases.
-
-   Implementation note: A FUNCTION_DECL without DECL_LANG_SPECIFIC was
-   created by language-independent code, and has C linkage.  Most
-   VAR_DECLs have C++ linkage, and do not have DECL_LANG_SPECIFIC, but
-   we do create DECL_LANG_SPECIFIC for variables with non-C++ linkage.  */
-#define DECL_LANGUAGE(NODE)				\
-  (DECL_LANG_SPECIFIC (NODE)				\
-   ? DECL_LANG_SPECIFIC (NODE)->u.base.language		\
-   : (TREE_CODE (NODE) == FUNCTION_DECL			\
-      ? lang_c : lang_cplusplus))
-
-/* Set the language linkage for NODE to LANGUAGE.  */
-#define SET_DECL_LANGUAGE(NODE, LANGUAGE) \
-  (DECL_LANG_SPECIFIC (NODE)->u.base.language = (LANGUAGE))
-
-/* For FUNCTION_DECLs and TEMPLATE_DECLs: nonzero means that this function
-   is a constructor.  */
-#define DECL_CONSTRUCTOR_P(NODE) \
-  DECL_CXX_CONSTRUCTOR_P (STRIP_TEMPLATE (NODE))
-
-/* Nonzero if NODE (a FUNCTION_DECL) is a constructor for a complete
-   object.  */
-#define DECL_COMPLETE_CONSTRUCTOR_P(NODE)		\
-  (DECL_CONSTRUCTOR_P (NODE)				\
-   && DECL_NAME (NODE) == complete_ctor_identifier)
-
-/* Nonzero if NODE (a FUNCTION_DECL) is a constructor for a base
-   object.  */
-#define DECL_BASE_CONSTRUCTOR_P(NODE)		\
-  (DECL_CONSTRUCTOR_P (NODE)			\
-   && DECL_NAME (NODE) == base_ctor_identifier)
-
-/* Nonzero if NODE (a FUNCTION_DECL) is a constructor, but not either the
-   specialized in-charge constructor or the specialized not-in-charge
-   constructor.  */
-#define DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P(NODE)		\
-  (DECL_DECLARES_FUNCTION_P (NODE) && DECL_CONSTRUCTOR_P (NODE) \
-   && !DECL_CLONED_FUNCTION_P (NODE))
-
-/* Nonzero if NODE (a FUNCTION_DECL) is a copy constructor.  */
-#define DECL_COPY_CONSTRUCTOR_P(NODE) \
-  (DECL_CONSTRUCTOR_P (NODE) && copy_fn_p (NODE) > 0)
-
-/* Nonzero if NODE (a FUNCTION_DECL) is a move constructor.  */
-#define DECL_MOVE_CONSTRUCTOR_P(NODE) \
-  (DECL_CONSTRUCTOR_P (NODE) && move_fn_p (NODE))
-
-/* Nonzero if NODE (a FUNCTION_DECL or TEMPLATE_DECL)
-   is a destructor.  */
-#define DECL_DESTRUCTOR_P(NODE)				\
-  DECL_CXX_DESTRUCTOR_P (STRIP_TEMPLATE (NODE))
-
-/* Nonzero if NODE (a FUNCTION_DECL) is a destructor, but not the
-   specialized in-charge constructor, in-charge deleting constructor,
-   or the base destructor.  */
-#define DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P(NODE)			\
-  (DECL_DECLARES_FUNCTION_P (NODE) && DECL_DESTRUCTOR_P (NODE)	\
-   && !DECL_CLONED_FUNCTION_P (NODE))
-
-/* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a complete
-   object.  */
-#define DECL_COMPLETE_DESTRUCTOR_P(NODE)		\
-  (DECL_DESTRUCTOR_P (NODE)				\
-   && DECL_NAME (NODE) == complete_dtor_identifier)
-
-/* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a base
-   object.  */
-#define DECL_BASE_DESTRUCTOR_P(NODE)		\
-  (DECL_DESTRUCTOR_P (NODE)			\
-   && DECL_NAME (NODE) == base_dtor_identifier)
-
-/* Nonzero if NODE (a FUNCTION_DECL) is a destructor for a complete
-   object that deletes the object after it has been destroyed.  */
-#define DECL_DELETING_DESTRUCTOR_P(NODE)		\
-  (DECL_DESTRUCTOR_P (NODE)				\
-   && DECL_NAME (NODE) == deleting_dtor_identifier)
-
-/* Nonzero if NODE (a FUNCTION_DECL) is a cloned constructor or
-   destructor.  */
-#define DECL_CLONED_FUNCTION_P(NODE) (!!decl_cloned_function_p (NODE, true))
-
-/* If DECL_CLONED_FUNCTION_P holds, this is the function that was
-   cloned.  */
-#define DECL_CLONED_FUNCTION(NODE) (*decl_cloned_function_p (NODE, false))
-
-/* Perform an action for each clone of FN, if FN is a function with
-   clones.  This macro should be used like:
-
-      FOR_EACH_CLONE (clone, fn)
-	{ ... }
-
-  */
-#define FOR_EACH_CLONE(CLONE, FN)			\
-  if (TREE_CODE (FN) == FUNCTION_DECL			\
-      && (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (FN)	\
-	  || DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (FN)))	\
-     for (CLONE = DECL_CHAIN (FN);			\
-	  CLONE && DECL_CLONED_FUNCTION_P (CLONE);	\
-	  CLONE = DECL_CHAIN (CLONE))
-
-/* Nonzero if NODE has DECL_DISCRIMINATOR and not DECL_ACCESS.  */
-#define DECL_DISCRIMINATOR_P(NODE)	\
-  (VAR_P (NODE) && DECL_FUNCTION_SCOPE_P (NODE))
-
-/* Discriminator for name mangling.  */
-#define DECL_DISCRIMINATOR(NODE) (LANG_DECL_U2_CHECK (NODE, 1)->discriminator)
-
-/* True iff DECL_DISCRIMINATOR is set for a DECL_DISCRIMINATOR_P decl.  */
-#define DECL_DISCRIMINATOR_SET_P(NODE) \
-  (DECL_LANG_SPECIFIC (NODE) && DECL_LANG_SPECIFIC (NODE)->u.base.u2sel == 1)
-
-/* The index of a user-declared parameter in its function, starting at 1.
-   All artificial parameters will have index 0.  */
-#define DECL_PARM_INDEX(NODE) \
-  (LANG_DECL_PARM_CHECK (NODE)->index)
-
-/* The level of a user-declared parameter in its function, starting at 1.
-   A parameter of the function will have level 1; a parameter of the first
-   nested function declarator (i.e. t in void f (void (*p)(T t))) will have
-   level 2.  */
-#define DECL_PARM_LEVEL(NODE) \
-  (LANG_DECL_PARM_CHECK (NODE)->level)
-
-/* Nonzero if the VTT parm has been added to NODE.  */
-#define DECL_HAS_VTT_PARM_P(NODE) \
-  (LANG_DECL_FN_CHECK (NODE)->has_vtt_parm_p)
-
-/* Nonzero if NODE is a FUNCTION_DECL for which a VTT parameter is
-   required.  */
-#define DECL_NEEDS_VTT_PARM_P(NODE)			\
-  (CLASSTYPE_VBASECLASSES (DECL_CONTEXT (NODE))		\
-   && (DECL_BASE_CONSTRUCTOR_P (NODE)			\
-       || DECL_BASE_DESTRUCTOR_P (NODE)))
-
-/* Nonzero if NODE is a user-defined conversion operator.  */
-#define DECL_CONV_FN_P(NODE) \
-  (DECL_NAME (NODE) && IDENTIFIER_TYPENAME_P (DECL_NAME (NODE)))
-
-/* If FN is a conversion operator, the type to which it converts.
-   Otherwise, NULL_TREE.  */
-#define DECL_CONV_FN_TYPE(FN) \
-  (DECL_CONV_FN_P (FN) ? TREE_TYPE (DECL_NAME (FN)) : NULL_TREE)
-
-/* Nonzero if NODE, which is a TEMPLATE_DECL, is a template
-   conversion operator to a type dependent on the innermost template
-   args.  */
-#define DECL_TEMPLATE_CONV_FN_P(NODE) \
-  (DECL_LANG_SPECIFIC (TEMPLATE_DECL_CHECK (NODE))->u.base.template_conv_p)
-
-/* Nonzero if NODE, a static data member, was declared in its class as an
-   array of unknown bound.  */
-#define VAR_HAD_UNKNOWN_BOUND(NODE)			\
-  (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))		\
-   ? DECL_LANG_SPECIFIC (NODE)->u.base.template_conv_p	\
-   : false)
-#define SET_VAR_HAD_UNKNOWN_BOUND(NODE) \
-  (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))->u.base.template_conv_p = true)
-
-/* Set the overloaded operator code for NODE to CODE.  */
-#define SET_OVERLOADED_OPERATOR_CODE(NODE, CODE) \
-  (LANG_DECL_FN_CHECK (NODE)->operator_code = (CODE))
-
-/* If NODE is an overloaded operator, then this returns the TREE_CODE
-   associated with the overloaded operator.
-   DECL_ASSIGNMENT_OPERATOR_P must also be checked to determine
-   whether or not NODE is an assignment operator.  If NODE is not an
-   overloaded operator, ERROR_MARK is returned.  Since the numerical
-   value of ERROR_MARK is zero, this macro can be used as a predicate
-   to test whether or not NODE is an overloaded operator.  */
-#define DECL_OVERLOADED_OPERATOR_P(NODE)		\
-  (IDENTIFIER_OPNAME_P (DECL_NAME (NODE))		\
-   ? LANG_DECL_FN_CHECK (NODE)->operator_code : ERROR_MARK)
-
-/* Nonzero if NODE is an assignment operator (including += and such).  */
-#define DECL_ASSIGNMENT_OPERATOR_P(NODE) \
-  (LANG_DECL_FN_CHECK (NODE)->assignment_operator_p)
-
-/* For FUNCTION_DECLs: nonzero means that this function is a
-   constructor or a destructor with an extra in-charge parameter to
-   control whether or not virtual bases are constructed.  */
-#define DECL_HAS_IN_CHARGE_PARM_P(NODE) \
-  (LANG_DECL_FN_CHECK (NODE)->has_in_charge_parm_p)
-
-/* Nonzero if DECL is a declaration of __builtin_constant_p.  */
-#define DECL_IS_BUILTIN_CONSTANT_P(NODE)		\
- (TREE_CODE (NODE) == FUNCTION_DECL			\
-  && DECL_BUILT_IN_CLASS (NODE) == BUILT_IN_NORMAL	\
-  && DECL_FUNCTION_CODE (NODE) == BUILT_IN_CONSTANT_P)
-
-/* Nonzero for _DECL means that this decl appears in (or will appear
-   in) as a member in a RECORD_TYPE or UNION_TYPE node.  It is also for
-   detecting circularity in case members are multiply defined.  In the
-   case of a VAR_DECL, it is also used to determine how program storage
-   should be allocated.  */
-#define DECL_IN_AGGR_P(NODE) (DECL_LANG_FLAG_3 (NODE))
-
-/* Nonzero for a VAR_DECL means that the variable's initialization (if
-   any) has been processed.  (In general, DECL_INITIALIZED_P is
-   !DECL_EXTERNAL, but static data members may be initialized even if
-   not defined.)  */
-#define DECL_INITIALIZED_P(NODE) \
-   (TREE_LANG_FLAG_1 (VAR_DECL_CHECK (NODE)))
-
-/* Nonzero for a VAR_DECL iff an explicit initializer was provided
-   or a non-trivial constructor is called.  */
-#define DECL_NONTRIVIALLY_INITIALIZED_P(NODE)	\
-   (TREE_LANG_FLAG_3 (VAR_DECL_CHECK (NODE)))
-
-/* Nonzero for a VAR_DECL that was initialized with a
-   constant-expression.  */
-#define DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P(NODE) \
-  (TREE_LANG_FLAG_2 (VAR_DECL_CHECK (NODE)))
-
-/* Nonzero if the DECL was initialized in the class definition itself,
-   rather than outside the class.  This is used for both static member
-   VAR_DECLS, and FUNCTION_DECLS that are defined in the class.  */
-#define DECL_INITIALIZED_IN_CLASS_P(DECL) \
-  (DECL_LANG_SPECIFIC (VAR_OR_FUNCTION_DECL_CHECK (DECL)) \
-   ->u.base.initialized_in_class)
-
-/* Nonzero if the DECL is used in the sense of 3.2 [basic.def.odr].
-   Only available for decls with DECL_LANG_SPECIFIC.  */
-#define DECL_ODR_USED(DECL) \
-  (DECL_LANG_SPECIFIC (VAR_OR_FUNCTION_DECL_CHECK (DECL)) \
-   ->u.base.odr_used)
-
-/* Nonzero for DECL means that this decl is just a friend declaration,
-   and should not be added to the list of members for this class.  */
-#define DECL_FRIEND_P(NODE) \
-  (DECL_LANG_SPECIFIC (TYPE_FUNCTION_OR_TEMPLATE_DECL_CHECK (NODE)) \
-   ->u.base.friend_attr)
-
-/* A TREE_LIST of the types which have befriended this FUNCTION_DECL.  */
-#define DECL_BEFRIENDING_CLASSES(NODE) \
-  (LANG_DECL_FN_CHECK (NODE)->befriending_classes)
-
-/* Nonzero for FUNCTION_DECL means that this decl is a static
-   member function.  */
-#define DECL_STATIC_FUNCTION_P(NODE) \
-  (LANG_DECL_FN_CHECK (NODE)->static_function)
-
-/* Nonzero for FUNCTION_DECL means that this decl is a non-static
-   member function.  */
-#define DECL_NONSTATIC_MEMBER_FUNCTION_P(NODE) \
-  (TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE)
-
-/* Nonzero for FUNCTION_DECL means that this decl is a member function
-   (static or non-static).  */
-#define DECL_FUNCTION_MEMBER_P(NODE) \
-  (DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE) || DECL_STATIC_FUNCTION_P (NODE))
-
-/* Nonzero for FUNCTION_DECL means that this member function
-   has `this' as const X *const.  */
-#define DECL_CONST_MEMFUNC_P(NODE)					 \
-  (DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE)				 \
-   && CP_TYPE_CONST_P (TREE_TYPE (TREE_VALUE				 \
-				  (TYPE_ARG_TYPES (TREE_TYPE (NODE))))))
-
-/* Nonzero for FUNCTION_DECL means that this member function
-   has `this' as volatile X *const.  */
-#define DECL_VOLATILE_MEMFUNC_P(NODE)					 \
-  (DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE)				 \
-   && CP_TYPE_VOLATILE_P (TREE_TYPE (TREE_VALUE				 \
-				  (TYPE_ARG_TYPES (TREE_TYPE (NODE))))))
-
-/* Nonzero for a DECL means that this member is a non-static member.  */
-#define DECL_NONSTATIC_MEMBER_P(NODE)		\
-  (DECL_NONSTATIC_MEMBER_FUNCTION_P (NODE)	\
-   || TREE_CODE (NODE) == FIELD_DECL)
-
-/* Nonzero for _DECL means that this member object type
-   is mutable.  */
-#define DECL_MUTABLE_P(NODE) (DECL_LANG_FLAG_0 (NODE))
-
-/* Nonzero for _DECL means that this constructor or conversion function is
-   non-converting.  */
-#define DECL_NONCONVERTING_P(NODE) \
-  (LANG_DECL_FN_CHECK (NODE)->nonconverting)
-
-/* Nonzero for FUNCTION_DECL means that this member function is a pure
-   virtual function.  */
-#define DECL_PURE_VIRTUAL_P(NODE) \
-  (LANG_DECL_FN_CHECK (NODE)->pure_virtual)
-
-/* True (in a FUNCTION_DECL) if NODE is a virtual function that is an
-   invalid overrider for a function from a base class.  Once we have
-   complained about an invalid overrider we avoid complaining about it
-   again.  */
-#define DECL_INVALID_OVERRIDER_P(NODE) \
-  (DECL_LANG_FLAG_4 (NODE))
-
-/* True (in a FUNCTION_DECL) if NODE is a function declared with
-   an override virt-specifier */
-#define DECL_OVERRIDE_P(NODE) (TREE_LANG_FLAG_0 (NODE))
-
-/* The thunks associated with NODE, a FUNCTION_DECL.  */
-#define DECL_THUNKS(NODE) \
-  (DECL_VIRTUAL_P (NODE) ? LANG_DECL_FN_CHECK (NODE)->context : NULL_TREE)
-
-/* Set DECL_THUNKS.  */
-#define SET_DECL_THUNKS(NODE,THUNKS) \
-  (LANG_DECL_FN_CHECK (NODE)->context = (THUNKS))
-
-/* If NODE, a FUNCTION_DECL, is a C++11 inheriting constructor, then this
-   is the base it inherits from.  */
-#define DECL_INHERITED_CTOR_BASE(NODE) \
-  (DECL_CONSTRUCTOR_P (NODE) ? LANG_DECL_FN_CHECK (NODE)->context : NULL_TREE)
-
-/* Set the inherited base.  */
-#define SET_DECL_INHERITED_CTOR_BASE(NODE,INH) \
-  (LANG_DECL_FN_CHECK (NODE)->context = (INH))
-
-/* Nonzero if NODE is a thunk, rather than an ordinary function.  */
-#define DECL_THUNK_P(NODE)			\
-  (TREE_CODE (NODE) == FUNCTION_DECL		\
-   && DECL_LANG_SPECIFIC (NODE)			\
-   && LANG_DECL_FN_CHECK (NODE)->thunk_p)
-
-/* Set DECL_THUNK_P for node.  */
-#define SET_DECL_THUNK_P(NODE, THIS_ADJUSTING)			\
-  (LANG_DECL_FN_CHECK (NODE)->thunk_p = 1,			\
-   LANG_DECL_FN_CHECK (NODE)->this_thunk_p = (THIS_ADJUSTING))
-
-/* Nonzero if NODE is a this pointer adjusting thunk.  */
-#define DECL_THIS_THUNK_P(NODE)			\
-  (DECL_THUNK_P (NODE) && LANG_DECL_FN_CHECK (NODE)->this_thunk_p)
-
-/* Nonzero if NODE is a result pointer adjusting thunk.  */
-#define DECL_RESULT_THUNK_P(NODE)			\
-  (DECL_THUNK_P (NODE) && !LANG_DECL_FN_CHECK (NODE)->this_thunk_p)
-
-/* Nonzero if NODE is a FUNCTION_DECL, but not a thunk.  */
-#define DECL_NON_THUNK_FUNCTION_P(NODE)				\
-  (TREE_CODE (NODE) == FUNCTION_DECL && !DECL_THUNK_P (NODE))
-
-/* Nonzero if NODE is `extern "C"'.  */
-#define DECL_EXTERN_C_P(NODE) \
-  (DECL_LANGUAGE (NODE) == lang_c)
-
-/* Nonzero if NODE is an `extern "C"' function.  */
-#define DECL_EXTERN_C_FUNCTION_P(NODE) \
-  (DECL_NON_THUNK_FUNCTION_P (NODE) && DECL_EXTERN_C_P (NODE))
-
-/* True iff DECL is an entity with vague linkage whose definition is
-   available in this translation unit.  */
-#define DECL_REPO_AVAILABLE_P(NODE) \
-  (DECL_LANG_SPECIFIC (NODE)->u.base.repo_available_p)
-
-/* True if DECL is declared 'constexpr'.  */
-#define DECL_DECLARED_CONSTEXPR_P(DECL) \
-  DECL_LANG_FLAG_8 (VAR_OR_FUNCTION_DECL_CHECK (STRIP_TEMPLATE (DECL)))
-
-/* Nonzero if this DECL is the __PRETTY_FUNCTION__ variable in a
-   template function.  */
-#define DECL_PRETTY_FUNCTION_P(NODE) \
-  (DECL_NAME (NODE) \
-   && !strcmp (IDENTIFIER_POINTER (DECL_NAME (NODE)), "__PRETTY_FUNCTION__"))
-
-/* Nonzero if the thread-local variable was declared with __thread
-   as opposed to thread_local.  */
-#define DECL_GNU_TLS_P(NODE) \
-  (TREE_LANG_FLAG_0 (VAR_DECL_CHECK (NODE)))
-
-/* The _TYPE context in which this _DECL appears.  This field holds the
-   class where a virtual function instance is actually defined.  */
-#define DECL_CLASS_CONTEXT(NODE) \
-  (DECL_CLASS_SCOPE_P (NODE) ? DECL_CONTEXT (NODE) : NULL_TREE)
-
-/* For a non-member friend function, the class (if any) in which this
-   friend was defined.  For example, given:
-
-     struct S { friend void f (); };
-
-   the DECL_FRIEND_CONTEXT for `f' will be `S'.  */
-#define DECL_FRIEND_CONTEXT(NODE)				\
-  ((DECL_DECLARES_FUNCTION_P (NODE)				\
-    && DECL_FRIEND_P (NODE) && !DECL_FUNCTION_MEMBER_P (NODE))	\
-   ? LANG_DECL_FN_CHECK (NODE)->context				\
-   : NULL_TREE)
-
-/* Set the DECL_FRIEND_CONTEXT for NODE to CONTEXT.  */
-#define SET_DECL_FRIEND_CONTEXT(NODE, CONTEXT) \
-  (LANG_DECL_FN_CHECK (NODE)->context = (CONTEXT))
-
-#define CP_DECL_CONTEXT(NODE) \
-  (!DECL_FILE_SCOPE_P (NODE) ? DECL_CONTEXT (NODE) : global_namespace)
-#define CP_TYPE_CONTEXT(NODE) \
-  (!TYPE_FILE_SCOPE_P (NODE) ? TYPE_CONTEXT (NODE) : global_namespace)
-#define FROB_CONTEXT(NODE) \
-  ((NODE) == global_namespace ? DECL_CONTEXT (NODE) : (NODE))
-
-/* 1 iff NODE has namespace scope, including the global namespace.  */
-#define DECL_NAMESPACE_SCOPE_P(NODE)				\
-  (!DECL_TEMPLATE_PARM_P (NODE)					\
-   && TREE_CODE (CP_DECL_CONTEXT (NODE)) == NAMESPACE_DECL)
-
-#define TYPE_NAMESPACE_SCOPE_P(NODE) \
-  (TREE_CODE (CP_TYPE_CONTEXT (NODE)) == NAMESPACE_DECL)
-
-#define NAMESPACE_SCOPE_P(NODE) \
-  ((DECL_P (NODE) && DECL_NAMESPACE_SCOPE_P (NODE)) \
-   || (TYPE_P (NODE) && TYPE_NAMESPACE_SCOPE_P (NODE)))
-
-/* 1 iff NODE is a class member.  */
-#define DECL_CLASS_SCOPE_P(NODE) \
-  (DECL_CONTEXT (NODE) && TYPE_P (DECL_CONTEXT (NODE)))
-
-#define TYPE_CLASS_SCOPE_P(NODE) \
-  (TYPE_CONTEXT (NODE) && TYPE_P (TYPE_CONTEXT (NODE)))
-
-/* 1 iff NODE is function-local.  */
-#define DECL_FUNCTION_SCOPE_P(NODE) \
-  (DECL_CONTEXT (NODE) \
-   && TREE_CODE (DECL_CONTEXT (NODE)) == FUNCTION_DECL)
-
-#define TYPE_FUNCTION_SCOPE_P(NODE) \
-  (TYPE_CONTEXT (NODE) && TREE_CODE (TYPE_CONTEXT (NODE)) == FUNCTION_DECL)
-
-/* 1 iff VAR_DECL node NODE is a type-info decl.  This flag is set for
-   both the primary typeinfo object and the associated NTBS name.  */
-#define DECL_TINFO_P(NODE) TREE_LANG_FLAG_4 (VAR_DECL_CHECK (NODE))
-
-/* 1 iff VAR_DECL node NODE is virtual table or VTT.  */
-#define DECL_VTABLE_OR_VTT_P(NODE) TREE_LANG_FLAG_5 (VAR_DECL_CHECK (NODE))
-
-/* 1 iff FUNCTION_TYPE or METHOD_TYPE has a ref-qualifier (either & or &&). */
-#define FUNCTION_REF_QUALIFIED(NODE) \
-  TREE_LANG_FLAG_4 (FUNC_OR_METHOD_CHECK (NODE))
-
-/* 1 iff FUNCTION_TYPE or METHOD_TYPE has &&-ref-qualifier.  */
-#define FUNCTION_RVALUE_QUALIFIED(NODE) \
-  TREE_LANG_FLAG_5 (FUNC_OR_METHOD_CHECK (NODE))
-
-/* Returns 1 iff VAR_DECL is a construction virtual table.
-   DECL_VTABLE_OR_VTT_P will be true in this case and must be checked
-   before using this macro.  */
-#define DECL_CONSTRUCTION_VTABLE_P(NODE) \
-  TREE_LANG_FLAG_6 (VAR_DECL_CHECK (NODE))
-
-/* 1 iff NODE is function-local, but for types.  */
-#define LOCAL_CLASS_P(NODE)				\
-  (decl_function_context (TYPE_MAIN_DECL (NODE)) != NULL_TREE)
-
-/* For a NAMESPACE_DECL: the list of using namespace directives
-   The PURPOSE is the used namespace, the value is the namespace
-   that is the common ancestor.  */
-#define DECL_NAMESPACE_USING(NODE) DECL_VINDEX (NAMESPACE_DECL_CHECK (NODE))
-
-/* In a NAMESPACE_DECL, the DECL_INITIAL is used to record all users
-   of a namespace, to record the transitive closure of using namespace.  */
-#define DECL_NAMESPACE_USERS(NODE) DECL_INITIAL (NAMESPACE_DECL_CHECK (NODE))
-
-/* In a NAMESPACE_DECL, the list of namespaces which have associated
-   themselves with this one.  */
-#define DECL_NAMESPACE_ASSOCIATIONS(NODE) \
-  (NAMESPACE_DECL_CHECK (NODE)->decl_non_common.saved_tree)
-
-/* In a NAMESPACE_DECL, points to the original namespace if this is
-   a namespace alias.  */
-#define DECL_NAMESPACE_ALIAS(NODE) \
-	DECL_ABSTRACT_ORIGIN (NAMESPACE_DECL_CHECK (NODE))
-#define ORIGINAL_NAMESPACE(NODE)  \
-  (DECL_NAMESPACE_ALIAS (NODE) ? DECL_NAMESPACE_ALIAS (NODE) : (NODE))
-
-/* Nonzero if NODE is the std namespace.  */
-#define DECL_NAMESPACE_STD_P(NODE)			\
-  (TREE_CODE (NODE) == NAMESPACE_DECL			\
-   && CP_DECL_CONTEXT (NODE) == global_namespace	\
-   && DECL_NAME (NODE) == std_identifier)
-
-/* In a TREE_LIST concatenating using directives, indicate indirect
-   directives  */
-#define TREE_INDIRECT_USING(NODE) TREE_LANG_FLAG_0 (TREE_LIST_CHECK (NODE))
-
-/* In a TREE_LIST in an attribute list, indicates that the attribute
-   must be applied at instantiation time.  */
-#define ATTR_IS_DEPENDENT(NODE) TREE_LANG_FLAG_0 (TREE_LIST_CHECK (NODE))
-
-/* In a TREE_LIST in the argument of attribute abi_tag, indicates that the tag
-   was inherited from a template parameter, not explicitly indicated.  */
-#define ABI_TAG_IMPLICIT(NODE) TREE_LANG_FLAG_0 (TREE_LIST_CHECK (NODE))
-
-extern tree decl_shadowed_for_var_lookup (tree);
-extern void decl_shadowed_for_var_insert (tree, tree);
-
-/* Non zero if this is a using decl for a dependent scope. */
-#define DECL_DEPENDENT_P(NODE) DECL_LANG_FLAG_0 (USING_DECL_CHECK (NODE))
-
-/* The scope named in a using decl.  */
-#define USING_DECL_SCOPE(NODE) TREE_TYPE (USING_DECL_CHECK (NODE))
-
-/* The decls named by a using decl.  */
-#define USING_DECL_DECLS(NODE) DECL_INITIAL (USING_DECL_CHECK (NODE))
-
-/* Non zero if the using decl refers to a dependent type.  */
-#define USING_DECL_TYPENAME_P(NODE) DECL_LANG_FLAG_1 (USING_DECL_CHECK (NODE))
-
-/* In a VAR_DECL, true if we have a shadowed local variable
-   in the shadowed var table for this VAR_DECL.  */
-#define DECL_HAS_SHADOWED_FOR_VAR_P(NODE) \
-  (VAR_DECL_CHECK (NODE)->decl_with_vis.shadowed_for_var_p)
-
-/* In a VAR_DECL for a variable declared in a for statement,
-   this is the shadowed (local) variable.  */
-#define DECL_SHADOWED_FOR_VAR(NODE) \
-  (DECL_HAS_SHADOWED_FOR_VAR_P(NODE) ? decl_shadowed_for_var_lookup (NODE) : NULL)
-
-#define SET_DECL_SHADOWED_FOR_VAR(NODE, VAL) \
-  (decl_shadowed_for_var_insert (NODE, VAL))
-
-/* In a FUNCTION_DECL, this is nonzero if this function was defined in
-   the class definition.  We have saved away the text of the function,
-   but have not yet processed it.  */
-#define DECL_PENDING_INLINE_P(NODE) \
-  (LANG_DECL_FN_CHECK (NODE)->pending_inline_p)
-
-/* If DECL_PENDING_INLINE_P holds, this is the saved text of the
-   function.  */
-#define DECL_PENDING_INLINE_INFO(NODE) \
-  (LANG_DECL_FN_CHECK (NODE)->u.pending_inline_info)
-
-/* Nonzero for TYPE_DECL means that it was written 'using name = type'.  */
-#define TYPE_DECL_ALIAS_P(NODE) \
-  DECL_LANG_FLAG_6 (TYPE_DECL_CHECK (NODE))
-
-/* Nonzero for a type which is an alias for another type; i.e, a type
-   which declaration was written 'using name-of-type =
-   another-type'.  */
-#define TYPE_ALIAS_P(NODE)			\
-  (TYPE_P (NODE)				\
-   && TYPE_NAME (NODE)				\
-   && TREE_CODE (TYPE_NAME (NODE)) == TYPE_DECL	\
-   && TYPE_DECL_ALIAS_P (TYPE_NAME (NODE)))
-
-/* For a class type: if this structure has many fields, we'll sort them
-   and put them into a TREE_VEC.  */
-#define CLASSTYPE_SORTED_FIELDS(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->sorted_fields)
-
-/* If non-NULL for a VAR_DECL, FUNCTION_DECL, TYPE_DECL or
-   TEMPLATE_DECL, the entity is either a template specialization (if
-   DECL_USE_TEMPLATE is nonzero) or the abstract instance of the
-   template itself.
-
-   In either case, DECL_TEMPLATE_INFO is a TREE_LIST, whose
-   TREE_PURPOSE is the TEMPLATE_DECL of which this entity is a
-   specialization or abstract instance.  The TREE_VALUE is the
-   template arguments used to specialize the template.
-   
-   Consider:
-
-      template <typename T> struct S { friend void f(T) {} };
-
-   In this case, S<int>::f is, from the point of view of the compiler,
-   an instantiation of a template -- but, from the point of view of
-   the language, each instantiation of S results in a wholly unrelated
-   global function f.  In this case, DECL_TEMPLATE_INFO for S<int>::f
-   will be non-NULL, but DECL_USE_TEMPLATE will be zero.  */
-#define DECL_TEMPLATE_INFO(NODE) \
-  (DECL_LANG_SPECIFIC (VAR_TEMPL_TYPE_FIELD_OR_FUNCTION_DECL_CHECK (NODE)) \
-   ->u.min.template_info)
-
-/* For a VAR_DECL, indicates that the variable is actually a
-   non-static data member of anonymous union that has been promoted to
-   variable status.  */
-#define DECL_ANON_UNION_VAR_P(NODE) \
-  (DECL_LANG_FLAG_4 (VAR_DECL_CHECK (NODE)))
-
-/* Template information for a RECORD_TYPE or UNION_TYPE.  */
-#define CLASSTYPE_TEMPLATE_INFO(NODE) \
-  (LANG_TYPE_CLASS_CHECK (RECORD_OR_UNION_CHECK (NODE))->template_info)
-
-/* Template information for an ENUMERAL_TYPE.  Although an enumeration may
-   not be a primary template, it may be declared within the scope of a
-   primary template and the enumeration constants may depend on
-   non-type template parameters.  */
-#define ENUM_TEMPLATE_INFO(NODE) \
-  (TYPE_LANG_SLOT_1 (ENUMERAL_TYPE_CHECK (NODE)))
-
-/* Template information for a template template parameter.  */
-#define TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO(NODE) \
-  (LANG_TYPE_CLASS_CHECK (BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK (NODE)) \
-   ->template_info)
-
-/* Template information for an ENUMERAL_, RECORD_, UNION_TYPE, or
-   BOUND_TEMPLATE_TEMPLATE_PARM type.  Note that if NODE is a
-   specialization of an alias template, this accessor returns the
-   template info for the alias template, not the one (if any) for the
-   template of the underlying type.  */
-#define TYPE_TEMPLATE_INFO(NODE)					\
-  ((TYPE_ALIAS_P (NODE) && DECL_LANG_SPECIFIC (TYPE_NAME (NODE)))	\
-   ? (DECL_LANG_SPECIFIC (TYPE_NAME (NODE))				\
-      ? DECL_TEMPLATE_INFO (TYPE_NAME (NODE))				\
-      : NULL_TREE)							\
-   : ((TREE_CODE (NODE) == ENUMERAL_TYPE)				\
-      ? ENUM_TEMPLATE_INFO (NODE)					\
-      : ((TREE_CODE (NODE) == BOUND_TEMPLATE_TEMPLATE_PARM)		\
-	 ? TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (NODE)			\
-	 : (CLASS_TYPE_P (NODE)						\
-	    ? CLASSTYPE_TEMPLATE_INFO (NODE)				\
-	    : NULL_TREE))))
-
-
-/* Set the template information for an ENUMERAL_, RECORD_, or
-   UNION_TYPE to VAL.  */
-#define SET_TYPE_TEMPLATE_INFO(NODE, VAL)				\
-  (TREE_CODE (NODE) == ENUMERAL_TYPE					\
-   ? (ENUM_TEMPLATE_INFO (NODE) = (VAL))				\
-   : ((CLASS_TYPE_P (NODE) && !TYPE_ALIAS_P (NODE))			\
-      ? (CLASSTYPE_TEMPLATE_INFO (NODE) = (VAL))			\
-      : (DECL_TEMPLATE_INFO (TYPE_NAME (NODE)) = (VAL))))
-
-#define TI_TEMPLATE(NODE) TREE_TYPE (TEMPLATE_INFO_CHECK (NODE))
-#define TI_ARGS(NODE) TREE_CHAIN (TEMPLATE_INFO_CHECK (NODE))
-#define TI_PENDING_TEMPLATE_FLAG(NODE) TREE_LANG_FLAG_1 (NODE)
-/* For a given TREE_VEC containing a template argument list,
-   this property contains the number of arguments that are not
-   defaulted.  */
-#define NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE) TREE_CHAIN (TREE_VEC_CHECK (NODE))
-/* Below are the setter and getter of the NON_DEFAULT_TEMPLATE_ARGS_COUNT
-   property.  */
-#define SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE, INT_VALUE) \
-  NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE) = build_int_cst (NULL_TREE, INT_VALUE)
-#ifdef ENABLE_CHECKING
-#define GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE) \
-    int_cst_value (NON_DEFAULT_TEMPLATE_ARGS_COUNT (NODE))
-#else
-#define GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT(NODE) \
-  NON_DEFAULT_TEMPLATE_ARGS_COUNT (NODE) \
-  ? int_cst_value (NON_DEFAULT_TEMPLATE_ARGS_COUNT (NODE)) \
-  : TREE_VEC_LENGTH (INNERMOST_TEMPLATE_ARGS (NODE))
-#endif
-/* The list of typedefs - used in the template - that need
-   access checking at template instantiation time.
-
-   FIXME this should be associated with the TEMPLATE_DECL, not the
-   TEMPLATE_INFO.  */
-#define TI_TYPEDEFS_NEEDING_ACCESS_CHECKING(NODE) \
-  ((struct tree_template_info*)TEMPLATE_INFO_CHECK \
-     (NODE))->typedefs_needing_access_checking
-
-/* We use TREE_VECs to hold template arguments.  If there is only one
-   level of template arguments, then the TREE_VEC contains the
-   arguments directly.  If there is more than one level of template
-   arguments, then each entry in the TREE_VEC is itself a TREE_VEC,
-   containing the template arguments for a single level.  The first
-   entry in the outer TREE_VEC is the outermost level of template
-   parameters; the last is the innermost.
-
-   It is incorrect to ever form a template argument vector containing
-   only one level of arguments, but which is a TREE_VEC containing as
-   its only entry the TREE_VEC for that level.
-
-   For each TREE_VEC containing the template arguments for a single
-   level, it's possible to get or set the number of non defaulted
-   template arguments by using the accessor macros
-   GET_NON_DEFAULT_TEMPLATE_ARGS_COUNT or
-   SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT.  */
-
-/* Nonzero if the template arguments is actually a vector of vectors,
-   rather than just a vector.  */
-#define TMPL_ARGS_HAVE_MULTIPLE_LEVELS(NODE)		     \
-  (NODE && TREE_VEC_LENGTH (NODE) && TREE_VEC_ELT (NODE, 0)  \
-   && TREE_CODE (TREE_VEC_ELT (NODE, 0)) == TREE_VEC)
-
-/* The depth of a template argument vector.  When called directly by
-   the parser, we use a TREE_LIST rather than a TREE_VEC to represent
-   template arguments.  In fact, we may even see NULL_TREE if there
-   are no template arguments.  In both of those cases, there is only
-   one level of template arguments.  */
-#define TMPL_ARGS_DEPTH(NODE)					\
-  (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (NODE) ? TREE_VEC_LENGTH (NODE) : 1)
-
-/* The LEVELth level of the template ARGS.  The outermost level of
-   args is level 1, not level 0.  */
-#define TMPL_ARGS_LEVEL(ARGS, LEVEL)		\
-  (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (ARGS)	\
-   ? TREE_VEC_ELT (ARGS, (LEVEL) - 1) : (ARGS))
-
-/* Set the LEVELth level of the template ARGS to VAL.  This macro does
-   not work with single-level argument vectors.  */
-#define SET_TMPL_ARGS_LEVEL(ARGS, LEVEL, VAL)	\
-  (TREE_VEC_ELT (ARGS, (LEVEL) - 1) = (VAL))
-
-/* Accesses the IDXth parameter in the LEVELth level of the ARGS.  */
-#define TMPL_ARG(ARGS, LEVEL, IDX)				\
-  (TREE_VEC_ELT (TMPL_ARGS_LEVEL (ARGS, LEVEL), IDX))
-
-/* Given a single level of template arguments in NODE, return the
-   number of arguments.  */
-#define NUM_TMPL_ARGS(NODE)				\
-  (TREE_VEC_LENGTH (NODE))
-
-/* Returns the innermost level of template arguments in ARGS.  */
-#define INNERMOST_TEMPLATE_ARGS(NODE) \
-  (get_innermost_template_args ((NODE), 1))
-
-/* The number of levels of template parameters given by NODE.  */
-#define TMPL_PARMS_DEPTH(NODE) \
-  ((HOST_WIDE_INT) TREE_INT_CST_LOW (TREE_PURPOSE (NODE)))
-
-/* The TEMPLATE_DECL instantiated or specialized by NODE.  This
-   TEMPLATE_DECL will be the immediate parent, not the most general
-   template.  For example, in:
-
-      template <class T> struct S { template <class U> void f(U); }
-
-   the FUNCTION_DECL for S<int>::f<double> will have, as its
-   DECL_TI_TEMPLATE, `template <class U> S<int>::f<U>'.
-
-   As a special case, for a member friend template of a template
-   class, this value will not be a TEMPLATE_DECL, but rather an
-   IDENTIFIER_NODE or OVERLOAD indicating the name of the template and
-   any explicit template arguments provided.  For example, in:
-
-     template <class T> struct S { friend void f<int>(int, double); }
-
-   the DECL_TI_TEMPLATE will be an IDENTIFIER_NODE for `f' and the
-   DECL_TI_ARGS will be {int}.
-
-   For a FIELD_DECL with a non-static data member initializer, this value
-   is the FIELD_DECL it was instantiated from.  */
-#define DECL_TI_TEMPLATE(NODE)      TI_TEMPLATE (DECL_TEMPLATE_INFO (NODE))
-
-/* The template arguments used to obtain this decl from the most
-   general form of DECL_TI_TEMPLATE.  For the example given for
-   DECL_TI_TEMPLATE, the DECL_TI_ARGS will be {int, double}.  These
-   are always the full set of arguments required to instantiate this
-   declaration from the most general template specialized here.  */
-#define DECL_TI_ARGS(NODE)	    TI_ARGS (DECL_TEMPLATE_INFO (NODE))
-
-/* The TEMPLATE_DECL associated with NODE, a class type.  Even if NODE
-   will be generated from a partial specialization, the TEMPLATE_DECL
-   referred to here will be the original template.  For example,
-   given:
-
-      template <typename T> struct S {};
-      template <typename T> struct S<T*> {};
-      
-   the CLASSTPYE_TI_TEMPLATE for S<int*> will be S, not the S<T*>.  */
-#define CLASSTYPE_TI_TEMPLATE(NODE) TI_TEMPLATE (CLASSTYPE_TEMPLATE_INFO (NODE))
-#define CLASSTYPE_TI_ARGS(NODE)     TI_ARGS (CLASSTYPE_TEMPLATE_INFO (NODE))
-
-/* For a template instantiation TYPE, returns the TYPE corresponding
-   to the primary template.  Otherwise returns TYPE itself.  */
-#define CLASSTYPE_PRIMARY_TEMPLATE_TYPE(TYPE)				\
-  ((CLASSTYPE_USE_TEMPLATE ((TYPE))					\
-    && !CLASSTYPE_TEMPLATE_SPECIALIZATION ((TYPE)))			\
-   ? TREE_TYPE (DECL_TEMPLATE_RESULT (DECL_PRIMARY_TEMPLATE		\
-				      (CLASSTYPE_TI_TEMPLATE ((TYPE))))) \
-   : (TYPE))
-
-/* Like CLASS_TI_TEMPLATE, but also works for ENUMERAL_TYPEs.  */
-#define TYPE_TI_TEMPLATE(NODE)			\
-  (TI_TEMPLATE (TYPE_TEMPLATE_INFO (NODE)))
-
-/* Like DECL_TI_ARGS, but for an ENUMERAL_, RECORD_, or UNION_TYPE.  */
-#define TYPE_TI_ARGS(NODE)			\
-  (TI_ARGS (TYPE_TEMPLATE_INFO (NODE)))
-
-#define INNERMOST_TEMPLATE_PARMS(NODE)  TREE_VALUE (NODE)
-
-/* Nonzero if NODE (a TEMPLATE_DECL) is a member template, in the
-   sense of [temp.mem].  */
-#define DECL_MEMBER_TEMPLATE_P(NODE) \
-  (DECL_LANG_FLAG_1 (TEMPLATE_DECL_CHECK (NODE)))
-
-/* Nonzero if the NODE corresponds to the template parameters for a
-   member template, whose inline definition is being processed after
-   the class definition is complete.  */
-#define TEMPLATE_PARMS_FOR_INLINE(NODE) TREE_LANG_FLAG_1 (NODE)
-
-/* Determine if a declaration (PARM_DECL or FIELD_DECL) is a pack.  */
-#define DECL_PACK_P(NODE) \
-  (DECL_P (NODE) && PACK_EXPANSION_P (TREE_TYPE (NODE)))
-
-/* Determines if NODE is an expansion of one or more parameter packs,
-   e.g., a TYPE_PACK_EXPANSION or EXPR_PACK_EXPANSION.  */
-#define PACK_EXPANSION_P(NODE)                 \
-  (TREE_CODE (NODE) == TYPE_PACK_EXPANSION     \
-   || TREE_CODE (NODE) == EXPR_PACK_EXPANSION)
-
-/* Extracts the type or expression pattern from a TYPE_PACK_EXPANSION or
-   EXPR_PACK_EXPANSION.  */
-#define PACK_EXPANSION_PATTERN(NODE)                            \
-  (TREE_CODE (NODE) == TYPE_PACK_EXPANSION? TREE_TYPE (NODE)    \
-   : TREE_OPERAND (NODE, 0))
-
-/* Sets the type or expression pattern for a TYPE_PACK_EXPANSION or
-   EXPR_PACK_EXPANSION.  */
-#define SET_PACK_EXPANSION_PATTERN(NODE,VALUE)  \
-  if (TREE_CODE (NODE) == TYPE_PACK_EXPANSION)  \
-    TREE_TYPE (NODE) = VALUE;                   \
-  else                                          \
-    TREE_OPERAND (NODE, 0) = VALUE
-
-/* The list of parameter packs used in the PACK_EXPANSION_* node. The
-   TREE_VALUE of each TREE_LIST contains the parameter packs.  */
-#define PACK_EXPANSION_PARAMETER_PACKS(NODE)		\
-  *(TREE_CODE (NODE) == EXPR_PACK_EXPANSION		\
-    ? &TREE_OPERAND (NODE, 1)				\
-    : &TYPE_MINVAL (TYPE_PACK_EXPANSION_CHECK (NODE)))
-
-/* Any additional template args to be applied when substituting into
-   the pattern, set by tsubst_pack_expansion for partial instantiations.  */
-#define PACK_EXPANSION_EXTRA_ARGS(NODE)		\
-  *(TREE_CODE (NODE) == TYPE_PACK_EXPANSION	\
-    ? &TYPE_MAXVAL (NODE)			\
-    : &TREE_OPERAND ((NODE), 2))
-
-/* True iff this pack expansion is within a function context.  */
-#define PACK_EXPANSION_LOCAL_P(NODE) TREE_LANG_FLAG_0 (NODE)
-
-/* Determine if this is an argument pack.  */
-#define ARGUMENT_PACK_P(NODE)                          \
-  (TREE_CODE (NODE) == TYPE_ARGUMENT_PACK              \
-   || TREE_CODE (NODE) == NONTYPE_ARGUMENT_PACK)
-
-/* The arguments stored in an argument pack. Arguments are stored in a
-   TREE_VEC, which may have length zero.  */
-#define ARGUMENT_PACK_ARGS(NODE)                               \
-  (TREE_CODE (NODE) == TYPE_ARGUMENT_PACK? TREE_TYPE (NODE)    \
-   : TREE_OPERAND (NODE, 0))
-
-/* Set the arguments stored in an argument pack. VALUE must be a
-   TREE_VEC.  */
-#define SET_ARGUMENT_PACK_ARGS(NODE,VALUE)     \
-  if (TREE_CODE (NODE) == TYPE_ARGUMENT_PACK)  \
-    TREE_TYPE (NODE) = VALUE;                           \
-  else                                                  \
-    TREE_OPERAND (NODE, 0) = VALUE
-
-/* Whether the argument pack is "incomplete", meaning that more
-   arguments can still be deduced. Incomplete argument packs are only
-   used when the user has provided an explicit template argument list
-   for a variadic function template. Some of the explicit template
-   arguments will be placed into the beginning of the argument pack,
-   but additional arguments might still be deduced.  */
-#define ARGUMENT_PACK_INCOMPLETE_P(NODE)        \
-  TREE_ADDRESSABLE (ARGUMENT_PACK_ARGS (NODE))
-
-/* When ARGUMENT_PACK_INCOMPLETE_P, stores the explicit template
-   arguments used to fill this pack.  */
-#define ARGUMENT_PACK_EXPLICIT_ARGS(NODE)       \
-  TREE_TYPE (ARGUMENT_PACK_ARGS (NODE))
-
-/* In an ARGUMENT_PACK_SELECT, the argument pack from which an
-   argument will be selected.  */
-#define ARGUMENT_PACK_SELECT_FROM_PACK(NODE)				\
-  (((struct tree_argument_pack_select *)ARGUMENT_PACK_SELECT_CHECK (NODE))->argument_pack)
-
-/* In an ARGUMENT_PACK_SELECT, the index of the argument we want to
-   select.  */
-#define ARGUMENT_PACK_SELECT_INDEX(NODE)				\
-  (((struct tree_argument_pack_select *)ARGUMENT_PACK_SELECT_CHECK (NODE))->index)
-  
-/* In an ARGUMENT_PACK_SELECT, the actual underlying argument that the
-   ARGUMENT_PACK_SELECT represents. */
-#define ARGUMENT_PACK_SELECT_ARG(NODE)					\
-  TREE_VEC_ELT (ARGUMENT_PACK_ARGS (ARGUMENT_PACK_SELECT_FROM_PACK (NODE)), \
-	        ARGUMENT_PACK_SELECT_INDEX (NODE));
-
-/* In a FUNCTION_DECL, the saved language-specific per-function data.  */
-#define DECL_SAVED_FUNCTION_DATA(NODE)			\
-  (LANG_DECL_FN_CHECK (FUNCTION_DECL_CHECK (NODE))	\
-   ->u.saved_language_function)
-
-/* True if NODE is an implicit INDIRECT_EXPR from convert_from_reference.  */
-#define REFERENCE_REF_P(NODE)				\
-  (INDIRECT_REF_P (NODE)				\
-   && TREE_TYPE (TREE_OPERAND (NODE, 0))		\
-   && (TREE_CODE (TREE_TYPE (TREE_OPERAND ((NODE), 0)))	\
-       == REFERENCE_TYPE))
-
-/* True if NODE is a REFERENCE_TYPE which is OK to instantiate to be a
-   reference to VLA type, because it's used for VLA capture.  */
-#define REFERENCE_VLA_OK(NODE) \
-  (TYPE_LANG_FLAG_5 (REFERENCE_TYPE_CHECK (NODE)))
-
-#define NEW_EXPR_USE_GLOBAL(NODE) \
-  TREE_LANG_FLAG_0 (NEW_EXPR_CHECK (NODE))
-#define DELETE_EXPR_USE_GLOBAL(NODE) \
-  TREE_LANG_FLAG_0 (DELETE_EXPR_CHECK (NODE))
-#define DELETE_EXPR_USE_VEC(NODE) \
-  TREE_LANG_FLAG_1 (DELETE_EXPR_CHECK (NODE))
-
-/* Indicates that this is a non-dependent COMPOUND_EXPR which will
-   resolve to a function call.  */
-#define COMPOUND_EXPR_OVERLOADED(NODE) \
-  TREE_LANG_FLAG_0 (COMPOUND_EXPR_CHECK (NODE))
-
-/* In a CALL_EXPR appearing in a template, true if Koenig lookup
-   should be performed at instantiation time.  */
-#define KOENIG_LOOKUP_P(NODE) TREE_LANG_FLAG_0 (CALL_EXPR_CHECK (NODE))
-
-/* True if CALL_EXPR expresses list-initialization of an object.  */
-#define CALL_EXPR_LIST_INIT_P(NODE) \
-  TREE_LANG_FLAG_3 (TREE_CHECK2 ((NODE),CALL_EXPR,AGGR_INIT_EXPR))
-
-/* Indicates whether a string literal has been parenthesized. Such
-   usages are disallowed in certain circumstances.  */
-
-#define PAREN_STRING_LITERAL_P(NODE) \
-  TREE_LANG_FLAG_0 (STRING_CST_CHECK (NODE))
-
-/* Indicates whether a COMPONENT_REF has been parenthesized.  Currently
-   only set some of the time in C++14 mode.  */
-
-#define REF_PARENTHESIZED_P(NODE) \
-  TREE_LANG_FLAG_2 (COMPONENT_REF_CHECK (NODE))
-
-/* Nonzero if this AGGR_INIT_EXPR provides for initialization via a
-   constructor call, rather than an ordinary function call.  */
-#define AGGR_INIT_VIA_CTOR_P(NODE) \
-  TREE_LANG_FLAG_0 (AGGR_INIT_EXPR_CHECK (NODE))
-
-/* Nonzero if expanding this AGGR_INIT_EXPR should first zero-initialize
-   the object.  */
-#define AGGR_INIT_ZERO_FIRST(NODE) \
-  TREE_LANG_FLAG_2 (AGGR_INIT_EXPR_CHECK (NODE))
-
-/* AGGR_INIT_EXPR accessors.  These are equivalent to the CALL_EXPR
-   accessors, except for AGGR_INIT_EXPR_SLOT (which takes the place of
-   CALL_EXPR_STATIC_CHAIN).  */
-
-#define AGGR_INIT_EXPR_FN(NODE) TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), 1)
-#define AGGR_INIT_EXPR_SLOT(NODE) \
-  TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), 2)
-#define AGGR_INIT_EXPR_ARG(NODE, I) \
-  TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), (I) + 3)
-#define aggr_init_expr_nargs(NODE) (VL_EXP_OPERAND_LENGTH(NODE) - 3)
-
-/* AGGR_INIT_EXPR_ARGP returns a pointer to the argument vector for NODE.
-   We can't use &AGGR_INIT_EXPR_ARG (NODE, 0) because that will complain if
-   the argument count is zero when checking is enabled.  Instead, do
-   the pointer arithmetic to advance past the 3 fixed operands in a
-   AGGR_INIT_EXPR.  That produces a valid pointer to just past the end of
-   the operand array, even if it's not valid to dereference it.  */
-#define AGGR_INIT_EXPR_ARGP(NODE) \
-  (&(TREE_OPERAND (AGGR_INIT_EXPR_CHECK (NODE), 0)) + 3)
-
-/* Abstract iterators for AGGR_INIT_EXPRs.  */
-
-/* Structure containing iterator state.  */
-typedef struct aggr_init_expr_arg_iterator_d {
-  tree t;	/* the aggr_init_expr */
-  int n;	/* argument count */
-  int i;	/* next argument index */
-} aggr_init_expr_arg_iterator;
-
-/* Initialize the abstract argument list iterator object ITER with the
-   arguments from AGGR_INIT_EXPR node EXP.  */
-inline void
-init_aggr_init_expr_arg_iterator (tree exp,
-				       aggr_init_expr_arg_iterator *iter)
-{
-  iter->t = exp;
-  iter->n = aggr_init_expr_nargs (exp);
-  iter->i = 0;
-}
-
-/* Return the next argument from abstract argument list iterator object ITER,
-   and advance its state.  Return NULL_TREE if there are no more arguments.  */
-inline tree
-next_aggr_init_expr_arg (aggr_init_expr_arg_iterator *iter)
-{
-  tree result;
-  if (iter->i >= iter->n)
-    return NULL_TREE;
-  result = AGGR_INIT_EXPR_ARG (iter->t, iter->i);
-  iter->i++;
-  return result;
-}
-
-/* Initialize the abstract argument list iterator object ITER, then advance
-   past and return the first argument.  Useful in for expressions, e.g.
-     for (arg = first_aggr_init_expr_arg (exp, &iter); arg;
-          arg = next_aggr_init_expr_arg (&iter))   */
-inline tree
-first_aggr_init_expr_arg (tree exp, aggr_init_expr_arg_iterator *iter)
-{
-  init_aggr_init_expr_arg_iterator (exp, iter);
-  return next_aggr_init_expr_arg (iter);
-}
-
-/* Test whether there are more arguments in abstract argument list iterator
-   ITER, without changing its state.  */
-inline bool
-more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter)
-{
-  return (iter->i < iter->n);
-}
-
-/* Iterate through each argument ARG of AGGR_INIT_EXPR CALL, using variable
-   ITER (of type aggr_init_expr_arg_iterator) to hold the iteration state.  */
-#define FOR_EACH_AGGR_INIT_EXPR_ARG(arg, iter, call)			\
-  for ((arg) = first_aggr_init_expr_arg ((call), &(iter)); (arg);	\
-       (arg) = next_aggr_init_expr_arg (&(iter)))
-
-/* VEC_INIT_EXPR accessors.  */
-#define VEC_INIT_EXPR_SLOT(NODE) TREE_OPERAND (VEC_INIT_EXPR_CHECK (NODE), 0)
-#define VEC_INIT_EXPR_INIT(NODE) TREE_OPERAND (VEC_INIT_EXPR_CHECK (NODE), 1)
-
-/* Indicates that a VEC_INIT_EXPR is a potential constant expression.
-   Only set when the current function is constexpr.  */
-#define VEC_INIT_EXPR_IS_CONSTEXPR(NODE) \
-  TREE_LANG_FLAG_0 (VEC_INIT_EXPR_CHECK (NODE))
-
-/* Indicates that a VEC_INIT_EXPR is expressing value-initialization.  */
-#define VEC_INIT_EXPR_VALUE_INIT(NODE) \
-  TREE_LANG_FLAG_1 (VEC_INIT_EXPR_CHECK (NODE))
-
-/* The condition under which this MUST_NOT_THROW_EXPR actually blocks
-   exceptions.  NULL_TREE means 'true'.  */
-#define MUST_NOT_THROW_COND(NODE) \
-  TREE_OPERAND (MUST_NOT_THROW_EXPR_CHECK (NODE), 1)
-
-/* The TYPE_MAIN_DECL for a class template type is a TYPE_DECL, not a
-   TEMPLATE_DECL.  This macro determines whether or not a given class
-   type is really a template type, as opposed to an instantiation or
-   specialization of one.  */
-#define CLASSTYPE_IS_TEMPLATE(NODE)  \
-  (CLASSTYPE_TEMPLATE_INFO (NODE)    \
-   && !CLASSTYPE_USE_TEMPLATE (NODE) \
-   && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE)))
-
-/* The name used by the user to name the typename type.  Typically,
-   this is an IDENTIFIER_NODE, and the same as the DECL_NAME on the
-   corresponding TYPE_DECL.  However, this may also be a
-   TEMPLATE_ID_EXPR if we had something like `typename X::Y<T>'.  */
-#define TYPENAME_TYPE_FULLNAME(NODE) \
-  (TYPE_VALUES_RAW (TYPENAME_TYPE_CHECK (NODE)))
-
-/* True if a TYPENAME_TYPE was declared as an "enum".  */
-#define TYPENAME_IS_ENUM_P(NODE) \
-  (TREE_LANG_FLAG_0 (TYPENAME_TYPE_CHECK (NODE)))
-
-/* True if a TYPENAME_TYPE was declared as a "class", "struct", or
-   "union".  */
-#define TYPENAME_IS_CLASS_P(NODE) \
-  (TREE_LANG_FLAG_1 (TYPENAME_TYPE_CHECK (NODE)))
-
-/* True if a TYPENAME_TYPE is in the process of being resolved.  */
-#define TYPENAME_IS_RESOLVING_P(NODE) \
-  (TREE_LANG_FLAG_2 (TYPENAME_TYPE_CHECK (NODE)))
-
-/* [class.virtual]
-
-   A class that declares or inherits a virtual function is called a
-   polymorphic class.  */
-#define TYPE_POLYMORPHIC_P(NODE) (TREE_LANG_FLAG_2 (NODE))
-
-/* Nonzero if this class has a virtual function table pointer.  */
-#define TYPE_CONTAINS_VPTR_P(NODE)		\
-  (TYPE_POLYMORPHIC_P (NODE) || CLASSTYPE_VBASECLASSES (NODE))
-
-/* This flag is true of a local VAR_DECL if it was declared in a for
-   statement, but we are no longer in the scope of the for.  */
-#define DECL_DEAD_FOR_LOCAL(NODE) DECL_LANG_FLAG_7 (VAR_DECL_CHECK (NODE))
-
-/* This flag is set on a VAR_DECL that is a DECL_DEAD_FOR_LOCAL
-   if we already emitted a warning about using it.  */
-#define DECL_ERROR_REPORTED(NODE) DECL_LANG_FLAG_0 (VAR_DECL_CHECK (NODE))
-
-/* Nonzero if NODE is a FUNCTION_DECL (for a function with global
-   scope) declared in a local scope.  */
-#define DECL_LOCAL_FUNCTION_P(NODE) \
-  DECL_LANG_FLAG_0 (FUNCTION_DECL_CHECK (NODE))
-
-/* True if NODE was declared with auto in its return type, but it has
-   started compilation and so the return type might have been changed by
-   return type deduction; its declared return type should be found in
-   DECL_STRUCT_FUNCTION(NODE)->language->x_auto_return_pattern.  */
-#define FNDECL_USED_AUTO(NODE) \
-  TREE_LANG_FLAG_2 (FUNCTION_DECL_CHECK (NODE))
-
-/* Nonzero if NODE is a DECL which we know about but which has not
-   been explicitly declared, such as a built-in function or a friend
-   declared inside a class.  In the latter case DECL_HIDDEN_FRIEND_P
-   will be set.  */
-#define DECL_ANTICIPATED(NODE) \
-  (DECL_LANG_SPECIFIC (TYPE_FUNCTION_OR_TEMPLATE_DECL_CHECK (NODE)) \
-   ->u.base.anticipated_p)
-
-/* Nonzero if NODE is a FUNCTION_DECL which was declared as a friend
-   within a class but has not been declared in the surrounding scope.
-   The function is invisible except via argument dependent lookup.  */
-#define DECL_HIDDEN_FRIEND_P(NODE) \
-  (LANG_DECL_FN_CHECK (DECL_COMMON_CHECK (NODE))->hidden_friend_p)
-
-/* Nonzero if NODE is an artificial FUNCTION_DECL for
-   #pragma omp declare reduction.  */
-#define DECL_OMP_DECLARE_REDUCTION_P(NODE) \
-  (LANG_DECL_FN_CHECK (DECL_COMMON_CHECK (NODE))->omp_declare_reduction_p)
-
-/* Nonzero if DECL has been declared threadprivate by
-   #pragma omp threadprivate.  */
-#define CP_DECL_THREADPRIVATE_P(DECL) \
-  (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (DECL))->u.base.threadprivate_or_deleted_p)
-
-/* Nonzero if DECL was declared with '= delete'.  */
-#define DECL_DELETED_FN(DECL) \
-  (LANG_DECL_FN_CHECK (DECL)->min.base.threadprivate_or_deleted_p)
-
-/* Nonzero if DECL was declared with '= default' (maybe implicitly).  */
-#define DECL_DEFAULTED_FN(DECL) \
-  (LANG_DECL_FN_CHECK (DECL)->defaulted_p)
-
-/* Nonzero if DECL is explicitly defaulted in the class body.  */
-#define DECL_DEFAULTED_IN_CLASS_P(DECL)					\
-  (DECL_DEFAULTED_FN (DECL) && DECL_INITIALIZED_IN_CLASS_P (DECL))
-/* Nonzero if DECL was defaulted outside the class body.  */
-#define DECL_DEFAULTED_OUTSIDE_CLASS_P(DECL)				\
-  (DECL_DEFAULTED_FN (DECL)						\
-   && !(DECL_ARTIFICIAL (DECL) || DECL_INITIALIZED_IN_CLASS_P (DECL)))
-
-/* Record whether a typedef for type `int' was actually `signed int'.  */
-#define C_TYPEDEF_EXPLICITLY_SIGNED(EXP) DECL_LANG_FLAG_1 (EXP)
-
-/* Returns nonzero if DECL has external linkage, as specified by the
-   language standard.  (This predicate may hold even when the
-   corresponding entity is not actually given external linkage in the
-   object file; see decl_linkage for details.)  */
-#define DECL_EXTERNAL_LINKAGE_P(DECL) \
-  (decl_linkage (DECL) == lk_external)
-
-/* Keep these codes in ascending code order.  */
-
-#define INTEGRAL_CODE_P(CODE)	\
-  ((CODE) == ENUMERAL_TYPE	\
-   || (CODE) == BOOLEAN_TYPE	\
-   || (CODE) == INTEGER_TYPE)
-
-/* [basic.fundamental]
-
-   Types  bool, char, wchar_t, and the signed and unsigned integer types
-   are collectively called integral types.
-
-   Note that INTEGRAL_TYPE_P, as defined in tree.h, allows enumeration
-   types as well, which is incorrect in C++.  Keep these checks in
-   ascending code order.  */
-#define CP_INTEGRAL_TYPE_P(TYPE)		\
-  (TREE_CODE (TYPE) == BOOLEAN_TYPE		\
-   || TREE_CODE (TYPE) == INTEGER_TYPE)
-
-/* Returns true if TYPE is an integral or enumeration name.  Keep
-   these checks in ascending code order.  */
-#define INTEGRAL_OR_ENUMERATION_TYPE_P(TYPE) \
-   (TREE_CODE (TYPE) == ENUMERAL_TYPE || CP_INTEGRAL_TYPE_P (TYPE))
-
-/* Returns true if TYPE is an integral or unscoped enumeration type.  */
-#define INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P(TYPE) \
-   (UNSCOPED_ENUM_P (TYPE) || CP_INTEGRAL_TYPE_P (TYPE))
-
-/* True if the class type TYPE is a literal type.  */
-#define CLASSTYPE_LITERAL_P(TYPE)              \
-   (LANG_TYPE_CLASS_CHECK (TYPE)->is_literal)
-
-/* [basic.fundamental]
-
-   Integral and floating types are collectively called arithmetic
-   types.  
-
-   As a GNU extension, we also accept complex types.
-
-   Keep these checks in ascending code order.  */
-#define ARITHMETIC_TYPE_P(TYPE) \
-  (CP_INTEGRAL_TYPE_P (TYPE) \
-   || TREE_CODE (TYPE) == REAL_TYPE \
-   || TREE_CODE (TYPE) == COMPLEX_TYPE)
-
-/* True iff TYPE is cv decltype(nullptr).  */
-#define NULLPTR_TYPE_P(TYPE) (TREE_CODE (TYPE) == NULLPTR_TYPE)
-
-/* [basic.types]
-
-   Arithmetic types, enumeration types, pointer types,
-   pointer-to-member types, and std::nullptr_t are collectively called
-   scalar types.
-   
-   Keep these checks in ascending code order.  */
-#define SCALAR_TYPE_P(TYPE)			\
-  (TYPE_PTRDATAMEM_P (TYPE)			\
-   || TREE_CODE (TYPE) == ENUMERAL_TYPE		\
-   || ARITHMETIC_TYPE_P (TYPE)			\
-   || TYPE_PTR_P (TYPE)				\
-   || TYPE_PTRMEMFUNC_P (TYPE)                  \
-   || NULLPTR_TYPE_P (TYPE))
-
-/* Determines whether this type is a C++0x scoped enumeration
-   type. Scoped enumerations types are introduced via "enum class" or
-   "enum struct", e.g.,
-
-     enum class Color {
-       Red, Green, Blue
-     };
-
-   Scoped enumeration types are different from normal (unscoped)
-   enumeration types in several ways:
-   
-     - The enumerators of a scoped enumeration type are only available
-       within the scope of the enumeration type and not in the
-       enclosing scope. For example, the Red color can be referred to
-       with "Color::Red" but not "Red".
-
-     - Scoped enumerators and enumerations do not implicitly convert
-       to integers or 'bool'.
-
-     - The underlying type of the enum is well-defined.  */
-#define SCOPED_ENUM_P(TYPE)                                             \
-  (TREE_CODE (TYPE) == ENUMERAL_TYPE && ENUM_IS_SCOPED (TYPE))
-
-/* Determine whether this is an unscoped enumeration type.  */
-#define UNSCOPED_ENUM_P(TYPE)                                           \
-  (TREE_CODE (TYPE) == ENUMERAL_TYPE && !ENUM_IS_SCOPED (TYPE))
-
-/* Set the flag indicating whether an ENUMERAL_TYPE is a C++0x scoped
-   enumeration type (1) or a normal (unscoped) enumeration type
-   (0).  */
-#define SET_SCOPED_ENUM_P(TYPE, VAL)                    \
-  (ENUM_IS_SCOPED (TYPE) = (VAL))
-
-#define SET_OPAQUE_ENUM_P(TYPE, VAL)                    \
-  (ENUM_IS_OPAQUE (TYPE) = (VAL))
-
-#define OPAQUE_ENUM_P(TYPE)				\
-  (TREE_CODE (TYPE) == ENUMERAL_TYPE && ENUM_IS_OPAQUE (TYPE))
-
-/* Determines whether an ENUMERAL_TYPE has an explicit
-   underlying type.  */
-#define ENUM_FIXED_UNDERLYING_TYPE_P(NODE) (TYPE_LANG_FLAG_5 (NODE))
-
-/* Returns the underlying type of the given enumeration type. The
-   underlying type is determined in different ways, depending on the
-   properties of the enum:
-
-     - In C++0x, the underlying type can be explicitly specified, e.g.,
-
-         enum E1 : char { ... } // underlying type is char
-
-     - In a C++0x scoped enumeration, the underlying type is int
-       unless otherwises specified:
-
-         enum class E2 { ... } // underlying type is int
-
-     - Otherwise, the underlying type is determined based on the
-       values of the enumerators. In this case, the
-       ENUM_UNDERLYING_TYPE will not be set until after the definition
-       of the enumeration is completed by finish_enum.  */
-#define ENUM_UNDERLYING_TYPE(TYPE) \
-  TREE_TYPE (ENUMERAL_TYPE_CHECK (TYPE))
-
-/* [dcl.init.aggr]
-
-   An aggregate is an array or a class with no user-provided
-   constructors, no brace-or-equal-initializers for non-static data
-   members, no private or protected non-static data members, no
-   base classes, and no virtual functions.
-
-   As an extension, we also treat vectors as aggregates.  Keep these
-   checks in ascending code order.  */
-#define CP_AGGREGATE_TYPE_P(TYPE)				\
-  (TREE_CODE (TYPE) == VECTOR_TYPE				\
-   ||TREE_CODE (TYPE) == ARRAY_TYPE				\
-   || (CLASS_TYPE_P (TYPE) && !CLASSTYPE_NON_AGGREGATE (TYPE)))
-
-/* Nonzero for a class type means that the class type has a
-   user-declared constructor.  */
-#define TYPE_HAS_USER_CONSTRUCTOR(NODE) (TYPE_LANG_FLAG_1 (NODE))
-
-/* When appearing in an INDIRECT_REF, it means that the tree structure
-   underneath is actually a call to a constructor.  This is needed
-   when the constructor must initialize local storage (which can
-   be automatically destroyed), rather than allowing it to allocate
-   space from the heap.
-
-   When appearing in a SAVE_EXPR, it means that underneath
-   is a call to a constructor.
-
-   When appearing in a CONSTRUCTOR, the expression is a
-   compound literal.
-
-   When appearing in a FIELD_DECL, it means that this field
-   has been duly initialized in its constructor.  */
-#define TREE_HAS_CONSTRUCTOR(NODE) (TREE_LANG_FLAG_4 (NODE))
-
-/* True if NODE is a brace-enclosed initializer.  */
-#define BRACE_ENCLOSED_INITIALIZER_P(NODE) \
-  (TREE_CODE (NODE) == CONSTRUCTOR && TREE_TYPE (NODE) == init_list_type_node)
-
-/* True if NODE is a compound-literal, i.e., a brace-enclosed
-   initializer cast to a particular type.  */
-#define COMPOUND_LITERAL_P(NODE) \
-  (TREE_CODE (NODE) == CONSTRUCTOR && TREE_HAS_CONSTRUCTOR (NODE))
-
-#define EMPTY_CONSTRUCTOR_P(NODE) (TREE_CODE (NODE) == CONSTRUCTOR \
-				   && vec_safe_is_empty(CONSTRUCTOR_ELTS(NODE))\
-				   && !TREE_HAS_CONSTRUCTOR (NODE))
-
-/* True if NODE is a init-list used as a direct-initializer, i.e.
-   B b{1,2}, not B b({1,2}) or B b = {1,2}.  */
-#define CONSTRUCTOR_IS_DIRECT_INIT(NODE) (TREE_LANG_FLAG_0 (CONSTRUCTOR_CHECK (NODE)))
-
-#define DIRECT_LIST_INIT_P(NODE) \
-   (BRACE_ENCLOSED_INITIALIZER_P (NODE) && CONSTRUCTOR_IS_DIRECT_INIT (NODE))
-
-/* True if NODE represents a conversion for direct-initialization in a
-   template.  Set by perform_implicit_conversion_flags.  */
-#define IMPLICIT_CONV_EXPR_DIRECT_INIT(NODE) \
-  (TREE_LANG_FLAG_0 (IMPLICIT_CONV_EXPR_CHECK (NODE)))
-
-/* Nonzero means that an object of this type can not be initialized using
-   an initializer list.  */
-#define CLASSTYPE_NON_AGGREGATE(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->non_aggregate)
-#define TYPE_NON_AGGREGATE_CLASS(NODE) \
-  (CLASS_TYPE_P (NODE) && CLASSTYPE_NON_AGGREGATE (NODE))
-
-/* Nonzero if there is a non-trivial X::op=(cv X&) for this class.  */
-#define TYPE_HAS_COMPLEX_COPY_ASSIGN(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_copy_assign)
-
-/* Nonzero if there is a non-trivial X::X(cv X&) for this class.  */
-#define TYPE_HAS_COMPLEX_COPY_CTOR(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_copy_ctor)
-
-/* Nonzero if there is a non-trivial X::op=(X&&) for this class.  */
-#define TYPE_HAS_COMPLEX_MOVE_ASSIGN(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_move_assign)
-
-/* Nonzero if there is a non-trivial X::X(X&&) for this class.  */
-#define TYPE_HAS_COMPLEX_MOVE_CTOR(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_move_ctor)
-
-/* Nonzero if there is a non-trivial default constructor for this class.  */
-#define TYPE_HAS_COMPLEX_DFLT(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_complex_dflt)
-
-/* Nonzero if TYPE has a trivial destructor.  From [class.dtor]:
-
-     A destructor is trivial if it is an implicitly declared
-     destructor and if:
-
-       - all of the direct base classes of its class have trivial
-	 destructors,
-
-       - for all of the non-static data members of its class that are
-	 of class type (or array thereof), each such class has a
-	 trivial destructor.  */
-#define TYPE_HAS_TRIVIAL_DESTRUCTOR(NODE) \
-  (!TYPE_HAS_NONTRIVIAL_DESTRUCTOR (NODE))
-
-/* Nonzero for _TYPE node means that this type does not have a trivial
-   destructor.  Therefore, destroying an object of this type will
-   involve a call to a destructor.  This can apply to objects of
-   ARRAY_TYPE is the type of the elements needs a destructor.  */
-#define TYPE_HAS_NONTRIVIAL_DESTRUCTOR(NODE) \
-  (TYPE_LANG_FLAG_4 (NODE))
-
-/* Nonzero for class type means that the default constructor is trivial.  */
-#define TYPE_HAS_TRIVIAL_DFLT(NODE) \
-  (TYPE_HAS_DEFAULT_CONSTRUCTOR (NODE) && ! TYPE_HAS_COMPLEX_DFLT (NODE))
-
-/* Nonzero for class type means that copy initialization of this type can use
-   a bitwise copy.  */
-#define TYPE_HAS_TRIVIAL_COPY_CTOR(NODE) \
-  (TYPE_HAS_COPY_CTOR (NODE) && ! TYPE_HAS_COMPLEX_COPY_CTOR (NODE))
-
-/* Nonzero for class type means that assignment of this type can use
-   a bitwise copy.  */
-#define TYPE_HAS_TRIVIAL_COPY_ASSIGN(NODE) \
-  (TYPE_HAS_COPY_ASSIGN (NODE) && ! TYPE_HAS_COMPLEX_COPY_ASSIGN (NODE))
-
-/* Returns true if NODE is a pointer-to-data-member.  */
-#define TYPE_PTRDATAMEM_P(NODE)			\
-  (TREE_CODE (NODE) == OFFSET_TYPE)
-/* Returns true if NODE is a pointer.  */
-#define TYPE_PTR_P(NODE)			\
-  (TREE_CODE (NODE) == POINTER_TYPE)
-
-/* Returns true if NODE is an object type:
-
-     [basic.types]
-
-     An object type is a (possibly cv-qualified) type that is not a
-     function type, not a reference type, and not a void type.
-
-   Keep these checks in ascending order, for speed.  */
-#define TYPE_OBJ_P(NODE)			\
-  (TREE_CODE (NODE) != REFERENCE_TYPE		\
-   && !VOID_TYPE_P (NODE)  		        \
-   && TREE_CODE (NODE) != FUNCTION_TYPE		\
-   && TREE_CODE (NODE) != METHOD_TYPE)
-
-/* Returns true if NODE is a pointer to an object.  Keep these checks
-   in ascending tree code order.  */
-#define TYPE_PTROB_P(NODE)					\
-  (TYPE_PTR_P (NODE) && TYPE_OBJ_P (TREE_TYPE (NODE)))
-
-/* Returns true if NODE is a reference to an object.  Keep these checks
-   in ascending tree code order.  */
-#define TYPE_REF_OBJ_P(NODE)					\
-  (TREE_CODE (NODE) == REFERENCE_TYPE && TYPE_OBJ_P (TREE_TYPE (NODE)))
-
-/* Returns true if NODE is a pointer to an object, or a pointer to
-   void.  Keep these checks in ascending tree code order.  */
-#define TYPE_PTROBV_P(NODE)					\
-  (TYPE_PTR_P (NODE)						\
-   && !(TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE		\
-	|| TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE))
-
-/* Returns true if NODE is a pointer to function.  */
-#define TYPE_PTRFN_P(NODE)				\
-  (TYPE_PTR_P (NODE)			                \
-   && TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE)
-
-/* Returns true if NODE is a reference to function.  */
-#define TYPE_REFFN_P(NODE)				\
-  (TREE_CODE (NODE) == REFERENCE_TYPE			\
-   && TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE)
-
-/* Nonzero for _TYPE node means that this type is a pointer to member
-   function type.  */
-#define TYPE_PTRMEMFUNC_P(NODE)		\
-  (TREE_CODE (NODE) == RECORD_TYPE	\
-   && TYPE_LANG_SPECIFIC (NODE)		\
-   && TYPE_PTRMEMFUNC_FLAG (NODE))
-
-#define TYPE_PTRMEMFUNC_FLAG(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->ptrmemfunc_flag)
-
-/* Returns true if NODE is a pointer-to-member.  */
-#define TYPE_PTRMEM_P(NODE) \
-  (TYPE_PTRDATAMEM_P (NODE) || TYPE_PTRMEMFUNC_P (NODE))
-
-/* Returns true if NODE is a pointer or a pointer-to-member.  */
-#define TYPE_PTR_OR_PTRMEM_P(NODE) \
-  (TYPE_PTR_P (NODE) || TYPE_PTRMEM_P (NODE))
-
-/* Indicates when overload resolution may resolve to a pointer to
-   member function. [expr.unary.op]/3 */
-#define PTRMEM_OK_P(NODE) \
-  TREE_LANG_FLAG_0 (TREE_CHECK3 ((NODE), ADDR_EXPR, OFFSET_REF, SCOPE_REF))
-
-/* Get the POINTER_TYPE to the METHOD_TYPE associated with this
-   pointer to member function.  TYPE_PTRMEMFUNC_P _must_ be true,
-   before using this macro.  */
-#define TYPE_PTRMEMFUNC_FN_TYPE(NODE) \
-  (TREE_TYPE (TYPE_FIELDS (NODE)))
-
-/* Returns `A' for a type like `int (A::*)(double)' */
-#define TYPE_PTRMEMFUNC_OBJECT_TYPE(NODE) \
-  TYPE_METHOD_BASETYPE (TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (NODE)))
-
-/* These are use to manipulate the canonical RECORD_TYPE from the
-   hashed POINTER_TYPE, and can only be used on the POINTER_TYPE.  */
-#define TYPE_GET_PTRMEMFUNC_TYPE(NODE) \
-  (TYPE_LANG_SPECIFIC (NODE) ? LANG_TYPE_PTRMEM_CHECK (NODE)->record : NULL)
-#define TYPE_SET_PTRMEMFUNC_TYPE(NODE, VALUE)				\
-  do {									\
-    if (TYPE_LANG_SPECIFIC (NODE) == NULL)				\
-      {									\
-	TYPE_LANG_SPECIFIC (NODE) = ggc_alloc_cleared_lang_type		\
-	 (sizeof (struct lang_type_ptrmem));				\
-	TYPE_LANG_SPECIFIC (NODE)->u.ptrmem.h.is_lang_type_class = 0;	\
-      }									\
-    TYPE_LANG_SPECIFIC (NODE)->u.ptrmem.record = (VALUE);		\
-  } while (0)
-
-/* For a pointer-to-member type of the form `T X::*', this is `X'.
-   For a type like `void (X::*)() const', this type is `X', not `const
-   X'.  To get at the `const X' you have to look at the
-   TYPE_PTRMEM_POINTED_TO_TYPE; there, the first parameter will have
-   type `const X*'.  */
-#define TYPE_PTRMEM_CLASS_TYPE(NODE)			\
-  (TYPE_PTRDATAMEM_P (NODE)					\
-   ? TYPE_OFFSET_BASETYPE (NODE)		\
-   : TYPE_PTRMEMFUNC_OBJECT_TYPE (NODE))
-
-/* For a pointer-to-member type of the form `T X::*', this is `T'.  */
-#define TYPE_PTRMEM_POINTED_TO_TYPE(NODE)		\
-   (TYPE_PTRDATAMEM_P (NODE)				\
-    ? TREE_TYPE (NODE)					\
-    : TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (NODE)))
-
-/* For a pointer-to-member constant `X::Y' this is the RECORD_TYPE for
-   `X'.  */
-#define PTRMEM_CST_CLASS(NODE) \
-  TYPE_PTRMEM_CLASS_TYPE (TREE_TYPE (PTRMEM_CST_CHECK (NODE)))
-
-/* For a pointer-to-member constant `X::Y' this is the _DECL for
-   `Y'.  */
-#define PTRMEM_CST_MEMBER(NODE) (((ptrmem_cst_t)PTRMEM_CST_CHECK (NODE))->member)
-
-/* The expression in question for a TYPEOF_TYPE.  */
-#define TYPEOF_TYPE_EXPR(NODE) (TYPE_VALUES_RAW (TYPEOF_TYPE_CHECK (NODE)))
-
-/* The type in question for an UNDERLYING_TYPE.  */
-#define UNDERLYING_TYPE_TYPE(NODE) \
-  (TYPE_VALUES_RAW (UNDERLYING_TYPE_CHECK (NODE)))
-
-/* The type in question for BASES.  */
-#define BASES_TYPE(NODE) \
-  (TYPE_VALUES_RAW (BASES_CHECK (NODE)))
-
-#define BASES_DIRECT(NODE) \
-  TREE_LANG_FLAG_0 (BASES_CHECK (NODE))
-
-/* The expression in question for a DECLTYPE_TYPE.  */
-#define DECLTYPE_TYPE_EXPR(NODE) (TYPE_VALUES_RAW (DECLTYPE_TYPE_CHECK (NODE)))
-
-/* Whether the DECLTYPE_TYPE_EXPR of NODE was originally parsed as an
-   id-expression or a member-access expression. When false, it was
-   parsed as a full expression.  */
-#define DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P(NODE) \
-  (DECLTYPE_TYPE_CHECK (NODE))->type_common.string_flag
-
-/* These flags indicate that we want different semantics from normal
-   decltype: lambda capture just drops references, init capture
-   uses auto semantics, lambda proxies look through implicit dereference.  */
-#define DECLTYPE_FOR_LAMBDA_CAPTURE(NODE) \
-  TREE_LANG_FLAG_0 (DECLTYPE_TYPE_CHECK (NODE))
-#define DECLTYPE_FOR_INIT_CAPTURE(NODE) \
-  TREE_LANG_FLAG_1 (DECLTYPE_TYPE_CHECK (NODE))
-#define DECLTYPE_FOR_LAMBDA_PROXY(NODE) \
-  TREE_LANG_FLAG_2 (DECLTYPE_TYPE_CHECK (NODE))
-
-/* Nonzero for VAR_DECL and FUNCTION_DECL node means that `extern' was
-   specified in its declaration.  This can also be set for an
-   erroneously declared PARM_DECL.  */
-#define DECL_THIS_EXTERN(NODE) \
-  DECL_LANG_FLAG_2 (VAR_FUNCTION_OR_PARM_DECL_CHECK (NODE))
-
-/* Nonzero for VAR_DECL and FUNCTION_DECL node means that `static' was
-   specified in its declaration.  This can also be set for an
-   erroneously declared PARM_DECL.  */
-#define DECL_THIS_STATIC(NODE) \
-  DECL_LANG_FLAG_6 (VAR_FUNCTION_OR_PARM_DECL_CHECK (NODE))
-
-/* Nonzero for FIELD_DECL node means that this field is a lambda capture
-   field for an array of runtime bound.  */
-#define DECL_VLA_CAPTURE_P(NODE) \
-  DECL_LANG_FLAG_1 (FIELD_DECL_CHECK (NODE))
-
-/* Nonzero for FIELD_DECL node means that this field is a base class
-   of the parent object, as opposed to a member field.  */
-#define DECL_FIELD_IS_BASE(NODE) \
-  DECL_LANG_FLAG_6 (FIELD_DECL_CHECK (NODE))
-
-/* Nonzero for FIELD_DECL node means that this field is a simple (no
-   explicit initializer) lambda capture field, making it invisible to
-   name lookup in unevaluated contexts.  */
-#define DECL_NORMAL_CAPTURE_P(NODE) \
-  DECL_LANG_FLAG_7 (FIELD_DECL_CHECK (NODE))
-
-/* Nonzero if TYPE is an anonymous union or struct type.  We have to use a
-   flag for this because "A union for which objects or pointers are
-   declared is not an anonymous union" [class.union].  */
-#define ANON_AGGR_TYPE_P(NODE)				\
-  (CLASS_TYPE_P (NODE) && LANG_TYPE_CLASS_CHECK (NODE)->anon_aggr)
-#define SET_ANON_AGGR_TYPE_P(NODE)			\
-  (LANG_TYPE_CLASS_CHECK (NODE)->anon_aggr = 1)
-
-/* Nonzero if TYPE is an anonymous union type.  */
-#define ANON_UNION_TYPE_P(NODE) \
-  (TREE_CODE (NODE) == UNION_TYPE && ANON_AGGR_TYPE_P (NODE))
-
-/* Define fields and accessors for nodes representing declared names.  */
-
-#define TYPE_WAS_ANONYMOUS(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->was_anonymous)
-
-/* C++: all of these are overloaded!  These apply only to TYPE_DECLs.  */
-
-/* The format of each node in the DECL_FRIENDLIST is as follows:
-
-   The TREE_PURPOSE will be the name of a function, i.e., an
-   IDENTIFIER_NODE.  The TREE_VALUE will be itself a TREE_LIST, whose
-   TREE_VALUEs are friends with the given name.  */
-#define DECL_FRIENDLIST(NODE)		(DECL_INITIAL (NODE))
-#define FRIEND_NAME(LIST) (TREE_PURPOSE (LIST))
-#define FRIEND_DECLS(LIST) (TREE_VALUE (LIST))
-
-/* The DECL_ACCESS, if non-NULL, is a TREE_LIST.  The TREE_PURPOSE of
-   each node is a type; the TREE_VALUE is the access granted for this
-   DECL in that type.  The DECL_ACCESS is set by access declarations.
-   For example, if a member that would normally be public in a
-   derived class is made protected, then the derived class and the
-   protected_access_node will appear in the DECL_ACCESS for the node.  */
-#define DECL_ACCESS(NODE) (LANG_DECL_U2_CHECK (NODE, 0)->access)
-
-/* Nonzero if the FUNCTION_DECL is a global constructor.  */
-#define DECL_GLOBAL_CTOR_P(NODE) \
-  (LANG_DECL_FN_CHECK (NODE)->global_ctor_p)
-
-/* Nonzero if the FUNCTION_DECL is a global destructor.  */
-#define DECL_GLOBAL_DTOR_P(NODE) \
-  (LANG_DECL_FN_CHECK (NODE)->global_dtor_p)
-
-/* Accessor macros for C++ template decl nodes.  */
-
-/* The DECL_TEMPLATE_PARMS are a list.  The TREE_PURPOSE of each node
-   is a INT_CST whose TREE_INT_CST_LOW indicates the level of the
-   template parameters, with 1 being the outermost set of template
-   parameters.  The TREE_VALUE is a vector, whose elements are the
-   template parameters at each level.  Each element in the vector is a
-   TREE_LIST, whose TREE_VALUE is a PARM_DECL (if the parameter is a
-   non-type parameter), or a TYPE_DECL (if the parameter is a type
-   parameter).  The TREE_PURPOSE is the default value, if any.  The
-   TEMPLATE_PARM_INDEX for the parameter is available as the
-   DECL_INITIAL (for a PARM_DECL) or as the TREE_TYPE (for a
-   TYPE_DECL).  */
-#define DECL_TEMPLATE_PARMS(NODE)       \
-  TEMPLATE_DECL_CHECK (NODE)->decl_non_common.arguments
-#define DECL_INNERMOST_TEMPLATE_PARMS(NODE) \
-   INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (NODE))
-#define DECL_NTPARMS(NODE) \
-   TREE_VEC_LENGTH (DECL_INNERMOST_TEMPLATE_PARMS (NODE))
-/* For function, method, class-data templates.  */
-#define DECL_TEMPLATE_RESULT(NODE)      \
-  DECL_RESULT_FLD (TEMPLATE_DECL_CHECK (NODE))
-/* For a function template at namespace scope, DECL_TEMPLATE_INSTANTIATIONS
-   lists all instantiations and specializations of the function so that
-   tsubst_friend_function can reassign them to another template if we find
-   that the namespace-scope template is really a partial instantiation of a
-   friend template.
-
-   For a class template the DECL_TEMPLATE_INSTANTIATIONS lists holds
-   all instantiations and specializations of the class type, including
-   partial instantiations and partial specializations, so that if we
-   explicitly specialize a partial instantiation we can walk the list
-   in maybe_process_partial_specialization and reassign them or complain
-   as appropriate.
-
-   In both cases, the TREE_PURPOSE of each node contains the arguments
-   used; the TREE_VALUE contains the generated variable.  The template
-   arguments are always complete.  For example, given:
-
-      template <class T> struct S1 {
-	template <class U> struct S2 {};
-	template <class U> struct S2<U*> {};
-      };
-
-   the record for the partial specialization will contain, as its
-   argument list, { {T}, {U*} }, and will be on the
-   DECL_TEMPLATE_INSTANTIATIONS list for `template <class T> template
-   <class U> struct S1<T>::S2'.
-
-   This list is not used for other templates.  */
-#define DECL_TEMPLATE_INSTANTIATIONS(NODE) \
-  DECL_VINDEX (TEMPLATE_DECL_CHECK (NODE))
-
-/* For a class template, this list contains the partial
-   specializations of this template.  (Full specializations are not
-   recorded on this list.)  The TREE_PURPOSE holds the arguments used
-   in the partial specialization (e.g., for `template <class T> struct
-   S<T*, int>' this will be `T*, int'.)  The arguments will also include
-   any outer template arguments.  The TREE_VALUE holds the TEMPLATE_DECL
-   for the partial specialization.  The TREE_TYPE is the _TYPE node for
-   the partial specialization.
-
-   This list is not used for other templates.  */
-#define DECL_TEMPLATE_SPECIALIZATIONS(NODE)     \
-  DECL_SIZE (TEMPLATE_DECL_CHECK (NODE))
-
-/* Nonzero for a DECL which is actually a template parameter.  Keep
-   these checks in ascending tree code order.   */
-#define DECL_TEMPLATE_PARM_P(NODE)		\
-  (DECL_LANG_FLAG_0 (NODE)			\
-   && (TREE_CODE (NODE) == CONST_DECL		\
-       || TREE_CODE (NODE) == PARM_DECL		\
-       || TREE_CODE (NODE) == TYPE_DECL		\
-       || TREE_CODE (NODE) == TEMPLATE_DECL))
-
-/* Mark NODE as a template parameter.  */
-#define SET_DECL_TEMPLATE_PARM_P(NODE) \
-  (DECL_LANG_FLAG_0 (NODE) = 1)
-
-/* Nonzero if NODE is a template template parameter.  */
-#define DECL_TEMPLATE_TEMPLATE_PARM_P(NODE) \
-  (TREE_CODE (NODE) == TEMPLATE_DECL && DECL_TEMPLATE_PARM_P (NODE))
-
-/* Nonzero for a DECL that represents a function template.  */
-#define DECL_FUNCTION_TEMPLATE_P(NODE)                          \
-  (TREE_CODE (NODE) == TEMPLATE_DECL                            \
-   && DECL_TEMPLATE_RESULT (NODE) != NULL_TREE			\
-   && TREE_CODE (DECL_TEMPLATE_RESULT (NODE)) == FUNCTION_DECL)
-
-/* Nonzero for a DECL that represents a class template or alias
-   template.  */
-#define DECL_TYPE_TEMPLATE_P(NODE)				\
-  (TREE_CODE (NODE) == TEMPLATE_DECL				\
-   && DECL_TEMPLATE_RESULT (NODE) != NULL_TREE			\
-   && TREE_CODE (DECL_TEMPLATE_RESULT (NODE)) == TYPE_DECL)
-
-/* Nonzero for a DECL that represents a class template.  */
-#define DECL_CLASS_TEMPLATE_P(NODE)				\
-  (DECL_TYPE_TEMPLATE_P (NODE)					\
-   && DECL_IMPLICIT_TYPEDEF_P (DECL_TEMPLATE_RESULT (NODE)))
-
-/* Nonzero for a TEMPLATE_DECL that represents an alias template.  */
-#define DECL_ALIAS_TEMPLATE_P(NODE)			\
-  (DECL_TYPE_TEMPLATE_P (NODE)				\
-   && !DECL_ARTIFICIAL (DECL_TEMPLATE_RESULT (NODE)))
-
-/* Nonzero for a NODE which declares a type.  */
-#define DECL_DECLARES_TYPE_P(NODE) \
-  (TREE_CODE (NODE) == TYPE_DECL || DECL_TYPE_TEMPLATE_P (NODE))
-
-/* Nonzero if NODE declares a function.  */
-#define DECL_DECLARES_FUNCTION_P(NODE) \
-  (TREE_CODE (NODE) == FUNCTION_DECL || DECL_FUNCTION_TEMPLATE_P (NODE))
-
-/* Nonzero if NODE is the typedef implicitly generated for a type when
-   the type is declared.  In C++, `struct S {};' is roughly
-   equivalent to `struct S {}; typedef struct S S;' in C.
-   DECL_IMPLICIT_TYPEDEF_P will hold for the typedef indicated in this
-   example.  In C++, there is a second implicit typedef for each
-   class, in the scope of `S' itself, so that you can say `S::S'.
-   DECL_SELF_REFERENCE_P will hold for that second typedef.  */
-#define DECL_IMPLICIT_TYPEDEF_P(NODE) \
-  (TREE_CODE (NODE) == TYPE_DECL && DECL_LANG_FLAG_2 (NODE))
-#define SET_DECL_IMPLICIT_TYPEDEF_P(NODE) \
-  (DECL_LANG_FLAG_2 (NODE) = 1)
-#define DECL_SELF_REFERENCE_P(NODE) \
-  (TREE_CODE (NODE) == TYPE_DECL && DECL_LANG_FLAG_4 (NODE))
-#define SET_DECL_SELF_REFERENCE_P(NODE) \
-  (DECL_LANG_FLAG_4 (NODE) = 1)
-
-/* A `primary' template is one that has its own template header and is not
-   a partial specialization.  A member function of a class template is a
-   template, but not primary.  A member template is primary.  Friend
-   templates are primary, too.  */
-
-/* Returns the primary template corresponding to these parameters.  */
-#define DECL_PRIMARY_TEMPLATE(NODE) \
-  (TREE_TYPE (DECL_INNERMOST_TEMPLATE_PARMS (NODE)))
-
-/* Returns nonzero if NODE is a primary template.  */
-#define PRIMARY_TEMPLATE_P(NODE) (DECL_PRIMARY_TEMPLATE (NODE) == (NODE))
-
-/* Nonzero iff NODE is a specialization of a template.  The value
-   indicates the type of specializations:
-
-     1=implicit instantiation
-
-     2=partial or explicit specialization, e.g.:
-
-        template <> int min<int> (int, int),
-
-     3=explicit instantiation, e.g.:
-  
-        template int min<int> (int, int);
-
-   Note that NODE will be marked as a specialization even if the
-   template it is instantiating is not a primary template.  For
-   example, given:
-
-     template <typename T> struct O { 
-       void f();
-       struct I {}; 
-     };
-    
-   both O<int>::f and O<int>::I will be marked as instantiations.
-
-   If DECL_USE_TEMPLATE is nonzero, then DECL_TEMPLATE_INFO will also
-   be non-NULL.  */
-#define DECL_USE_TEMPLATE(NODE) (DECL_LANG_SPECIFIC (NODE)->u.base.use_template)
-
-/* Like DECL_USE_TEMPLATE, but for class types.  */
-#define CLASSTYPE_USE_TEMPLATE(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->use_template)
-
-/* True if NODE is a specialization of a primary template.  */
-#define CLASSTYPE_SPECIALIZATION_OF_PRIMARY_TEMPLATE_P(NODE)	\
-  (CLASS_TYPE_P (NODE)						\
-   && CLASSTYPE_USE_TEMPLATE (NODE)				\
-   && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE)))
-
-#define DECL_TEMPLATE_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) & 1)
-#define CLASSTYPE_TEMPLATE_INSTANTIATION(NODE) \
-  (CLASSTYPE_USE_TEMPLATE (NODE) & 1)
-
-#define DECL_TEMPLATE_SPECIALIZATION(NODE) (DECL_USE_TEMPLATE (NODE) == 2)
-#define SET_DECL_TEMPLATE_SPECIALIZATION(NODE) (DECL_USE_TEMPLATE (NODE) = 2)
-
-/* Returns true for an explicit or partial specialization of a class
-   template.  */
-#define CLASSTYPE_TEMPLATE_SPECIALIZATION(NODE) \
-  (CLASSTYPE_USE_TEMPLATE (NODE) == 2)
-#define SET_CLASSTYPE_TEMPLATE_SPECIALIZATION(NODE) \
-  (CLASSTYPE_USE_TEMPLATE (NODE) = 2)
-
-#define DECL_IMPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) == 1)
-#define SET_DECL_IMPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) = 1)
-#define CLASSTYPE_IMPLICIT_INSTANTIATION(NODE) \
-  (CLASSTYPE_USE_TEMPLATE (NODE) == 1)
-#define SET_CLASSTYPE_IMPLICIT_INSTANTIATION(NODE) \
-  (CLASSTYPE_USE_TEMPLATE (NODE) = 1)
-
-#define DECL_EXPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) == 3)
-#define SET_DECL_EXPLICIT_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) = 3)
-#define CLASSTYPE_EXPLICIT_INSTANTIATION(NODE) \
-  (CLASSTYPE_USE_TEMPLATE (NODE) == 3)
-#define SET_CLASSTYPE_EXPLICIT_INSTANTIATION(NODE) \
-  (CLASSTYPE_USE_TEMPLATE (NODE) = 3)
-
-/* Nonzero if DECL is a friend function which is an instantiation
-   from the point of view of the compiler, but not from the point of
-   view of the language.  For example given:
-      template <class T> struct S { friend void f(T) {}; };
-   the declaration of `void f(int)' generated when S<int> is
-   instantiated will not be a DECL_TEMPLATE_INSTANTIATION, but will be
-   a DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION.  */
-#define DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION(DECL) \
-  (DECL_TEMPLATE_INFO (DECL) && !DECL_USE_TEMPLATE (DECL))
-
-/* Nonzero if DECL is a function generated from a function 'temploid',
-   i.e. template, member of class template, or dependent friend.  */
-#define DECL_TEMPLOID_INSTANTIATION(DECL)		\
-  (DECL_TEMPLATE_INSTANTIATION (DECL)			\
-   || DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (DECL))
-
-/* Nonzero if DECL is either defined implicitly by the compiler or
-   generated from a temploid.  */
-#define DECL_GENERATED_P(DECL) \
-  (DECL_TEMPLOID_INSTANTIATION (DECL) || DECL_DEFAULTED_FN (DECL))
-
-/* Nonzero iff we are currently processing a declaration for an
-   entity with its own template parameter list, and which is not a
-   full specialization.  */
-#define PROCESSING_REAL_TEMPLATE_DECL_P() \
-  (processing_template_decl > template_class_depth (current_scope ()))
-
-/* Nonzero if this VAR_DECL or FUNCTION_DECL has already been
-   instantiated, i.e. its definition has been generated from the
-   pattern given in the template.  */
-#define DECL_TEMPLATE_INSTANTIATED(NODE) \
-  DECL_LANG_FLAG_1 (VAR_OR_FUNCTION_DECL_CHECK (NODE))
-
-/* We know what we're doing with this decl now.  */
-#define DECL_INTERFACE_KNOWN(NODE) DECL_LANG_FLAG_5 (NODE)
-
-/* DECL_EXTERNAL must be set on a decl until the decl is actually emitted,
-   so that assemble_external will work properly.  So we have this flag to
-   tell us whether the decl is really not external.
-
-   This flag does not indicate whether or not the decl is defined in the
-   current translation unit; it indicates whether or not we should emit the
-   decl at the end of compilation if it is defined and needed.  */
-#define DECL_NOT_REALLY_EXTERN(NODE) \
-  (DECL_LANG_SPECIFIC (NODE)->u.base.not_really_extern)
-
-#define DECL_REALLY_EXTERN(NODE) \
-  (DECL_EXTERNAL (NODE) && ! DECL_NOT_REALLY_EXTERN (NODE))
-
-/* A thunk is a stub function.
-
-   A thunk is an alternate entry point for an ordinary FUNCTION_DECL.
-   The address of the ordinary FUNCTION_DECL is given by the
-   DECL_INITIAL, which is always an ADDR_EXPR whose operand is a
-   FUNCTION_DECL.  The job of the thunk is to either adjust the this
-   pointer before transferring control to the FUNCTION_DECL, or call
-   FUNCTION_DECL and then adjust the result value. Note, the result
-   pointer adjusting thunk must perform a call to the thunked
-   function, (or be implemented via passing some invisible parameter
-   to the thunked function, which is modified to perform the
-   adjustment just before returning).
-
-   A thunk may perform either, or both, of the following operations:
-
-   o Adjust the this or result pointer by a constant offset.
-   o Adjust the this or result pointer by looking up a vcall or vbase offset
-     in the vtable.
-
-   A this pointer adjusting thunk converts from a base to a derived
-   class, and hence adds the offsets. A result pointer adjusting thunk
-   converts from a derived class to a base, and hence subtracts the
-   offsets.  If both operations are performed, then the constant
-   adjustment is performed first for this pointer adjustment and last
-   for the result pointer adjustment.
-
-   The constant adjustment is given by THUNK_FIXED_OFFSET.  If the
-   vcall or vbase offset is required, THUNK_VIRTUAL_OFFSET is
-   used. For this pointer adjusting thunks, it is the vcall offset
-   into the vtable.  For result pointer adjusting thunks it is the
-   binfo of the virtual base to convert to.  Use that binfo's vbase
-   offset.
-
-   It is possible to have equivalent covariant thunks.  These are
-   distinct virtual covariant thunks whose vbase offsets happen to
-   have the same value.  THUNK_ALIAS is used to pick one as the
-   canonical thunk, which will get all the this pointer adjusting
-   thunks attached to it.  */
-
-/* An integer indicating how many bytes should be subtracted from the
-   this or result pointer when this function is called.  */
-#define THUNK_FIXED_OFFSET(DECL) \
-  (DECL_LANG_SPECIFIC (THUNK_FUNCTION_CHECK (DECL))->u.fn.u5.fixed_offset)
-
-/* A tree indicating how to perform the virtual adjustment. For a this
-   adjusting thunk it is the number of bytes to be added to the vtable
-   to find the vcall offset. For a result adjusting thunk, it is the
-   binfo of the relevant virtual base.  If NULL, then there is no
-   virtual adjust.  (The vptr is always located at offset zero from
-   the this or result pointer.)  (If the covariant type is within the
-   class hierarchy being laid out, the vbase index is not yet known
-   at the point we need to create the thunks, hence the need to use
-   binfos.)  */
-
-#define THUNK_VIRTUAL_OFFSET(DECL) \
-  (LANG_DECL_U2_CHECK (FUNCTION_DECL_CHECK (DECL), 0)->access)
-
-/* A thunk which is equivalent to another thunk.  */
-#define THUNK_ALIAS(DECL) \
-  (DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (DECL))->u.min.template_info)
-
-/* For thunk NODE, this is the FUNCTION_DECL thunked to.  It is
-   possible for the target to be a thunk too.  */
-#define THUNK_TARGET(NODE)				\
-  (LANG_DECL_FN_CHECK (NODE)->befriending_classes)
-
-/* True for a SCOPE_REF iff the "template" keyword was used to
-   indicate that the qualified name denotes a template.  */
-#define QUALIFIED_NAME_IS_TEMPLATE(NODE) \
-  (TREE_LANG_FLAG_1 (SCOPE_REF_CHECK (NODE)))
-
-/* True for an OMP_ATOMIC that has dependent parameters.  These are stored
-   as an expr in operand 1, and integer_zero_node in operand 0.  */
-#define OMP_ATOMIC_DEPENDENT_P(NODE) \
-  (TREE_CODE (TREE_OPERAND (OMP_ATOMIC_CHECK (NODE), 0)) == INTEGER_CST)
-
-/* Used while gimplifying continue statements bound to OMP_FOR nodes.  */
-#define OMP_FOR_GIMPLIFYING_P(NODE) \
-  (TREE_LANG_FLAG_0 (OMP_LOOP_CHECK (NODE)))
-
-/* A language-specific token attached to the OpenMP data clauses to
-   hold code (or code fragments) related to ctors, dtors, and op=.
-   See semantics.c for details.  */
-#define CP_OMP_CLAUSE_INFO(NODE) \
-  TREE_TYPE (OMP_CLAUSE_RANGE_CHECK (NODE, OMP_CLAUSE_PRIVATE, \
-				     OMP_CLAUSE_LINEAR))
-
-/* Nonzero if this transaction expression's body contains statements.  */
-#define TRANSACTION_EXPR_IS_STMT(NODE) \
-   TREE_LANG_FLAG_0 (TRANSACTION_EXPR_CHECK (NODE))
-
-/* These macros provide convenient access to the various _STMT nodes
-   created when parsing template declarations.  */
-#define TRY_STMTS(NODE)		TREE_OPERAND (TRY_BLOCK_CHECK (NODE), 0)
-#define TRY_HANDLERS(NODE)	TREE_OPERAND (TRY_BLOCK_CHECK (NODE), 1)
-
-#define EH_SPEC_STMTS(NODE)	TREE_OPERAND (EH_SPEC_BLOCK_CHECK (NODE), 0)
-#define EH_SPEC_RAISES(NODE)	TREE_OPERAND (EH_SPEC_BLOCK_CHECK (NODE), 1)
-
-#define USING_STMT_NAMESPACE(NODE) TREE_OPERAND (USING_STMT_CHECK (NODE), 0)
-
-/* Nonzero if this try block is a function try block.  */
-#define FN_TRY_BLOCK_P(NODE)	TREE_LANG_FLAG_3 (TRY_BLOCK_CHECK (NODE))
-#define HANDLER_PARMS(NODE)	TREE_OPERAND (HANDLER_CHECK (NODE), 0)
-#define HANDLER_BODY(NODE)	TREE_OPERAND (HANDLER_CHECK (NODE), 1)
-#define HANDLER_TYPE(NODE)	TREE_TYPE (HANDLER_CHECK (NODE))
-
-/* CLEANUP_STMT accessors.  The statement(s) covered, the cleanup to run
-   and the VAR_DECL for which this cleanup exists.  */
-#define CLEANUP_BODY(NODE)	TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 0)
-#define CLEANUP_EXPR(NODE)	TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 1)
-#define CLEANUP_DECL(NODE)	TREE_OPERAND (CLEANUP_STMT_CHECK (NODE), 2)
-
-/* IF_STMT accessors. These give access to the condition of the if
-   statement, the then block of the if statement, and the else block
-   of the if statement if it exists.  */
-#define IF_COND(NODE)		TREE_OPERAND (IF_STMT_CHECK (NODE), 0)
-#define THEN_CLAUSE(NODE)	TREE_OPERAND (IF_STMT_CHECK (NODE), 1)
-#define ELSE_CLAUSE(NODE)	TREE_OPERAND (IF_STMT_CHECK (NODE), 2)
-#define IF_SCOPE(NODE)		TREE_OPERAND (IF_STMT_CHECK (NODE), 3)
-
-/* WHILE_STMT accessors. These give access to the condition of the
-   while statement and the body of the while statement, respectively.  */
-#define WHILE_COND(NODE)	TREE_OPERAND (WHILE_STMT_CHECK (NODE), 0)
-#define WHILE_BODY(NODE)	TREE_OPERAND (WHILE_STMT_CHECK (NODE), 1)
-
-/* DO_STMT accessors. These give access to the condition of the do
-   statement and the body of the do statement, respectively.  */
-#define DO_COND(NODE)		TREE_OPERAND (DO_STMT_CHECK (NODE), 0)
-#define DO_BODY(NODE)		TREE_OPERAND (DO_STMT_CHECK (NODE), 1)
-
-/* FOR_STMT accessors. These give access to the init statement,
-   condition, update expression, and body of the for statement,
-   respectively.  */
-#define FOR_INIT_STMT(NODE)	TREE_OPERAND (FOR_STMT_CHECK (NODE), 0)
-#define FOR_COND(NODE)		TREE_OPERAND (FOR_STMT_CHECK (NODE), 1)
-#define FOR_EXPR(NODE)		TREE_OPERAND (FOR_STMT_CHECK (NODE), 2)
-#define FOR_BODY(NODE)		TREE_OPERAND (FOR_STMT_CHECK (NODE), 3)
-#define FOR_SCOPE(NODE)		TREE_OPERAND (FOR_STMT_CHECK (NODE), 4)
-
-/* RANGE_FOR_STMT accessors. These give access to the declarator,
-   expression, body, and scope of the statement, respectively.  */
-#define RANGE_FOR_DECL(NODE)	TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 0)
-#define RANGE_FOR_EXPR(NODE)	TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 1)
-#define RANGE_FOR_BODY(NODE)	TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 2)
-#define RANGE_FOR_SCOPE(NODE)	TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 3)
-#define RANGE_FOR_IVDEP(NODE)	TREE_LANG_FLAG_6 (RANGE_FOR_STMT_CHECK (NODE))
-
-#define SWITCH_STMT_COND(NODE)	TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 0)
-#define SWITCH_STMT_BODY(NODE)	TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 1)
-#define SWITCH_STMT_TYPE(NODE)	TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 2)
-#define SWITCH_STMT_SCOPE(NODE)	TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 3)
-
-/* STMT_EXPR accessor.  */
-#define STMT_EXPR_STMT(NODE)	TREE_OPERAND (STMT_EXPR_CHECK (NODE), 0)
-
-/* EXPR_STMT accessor. This gives the expression associated with an
-   expression statement.  */
-#define EXPR_STMT_EXPR(NODE)	TREE_OPERAND (EXPR_STMT_CHECK (NODE), 0)
-
-/* True if this TARGET_EXPR was created by build_cplus_new, and so we can
-   discard it if it isn't useful.  */
-#define TARGET_EXPR_IMPLICIT_P(NODE) \
-  TREE_LANG_FLAG_0 (TARGET_EXPR_CHECK (NODE))
-
-/* True if this TARGET_EXPR is the result of list-initialization of a
-   temporary.  */
-#define TARGET_EXPR_LIST_INIT_P(NODE) \
-  TREE_LANG_FLAG_1 (TARGET_EXPR_CHECK (NODE))
-
-/* True if this TARGET_EXPR expresses direct-initialization of an object
-   to be named later.  */
-#define TARGET_EXPR_DIRECT_INIT_P(NODE) \
-  TREE_LANG_FLAG_2 (TARGET_EXPR_CHECK (NODE))
-
-/* True if EXPR expresses direct-initialization of a TYPE.  */
-#define DIRECT_INIT_EXPR_P(TYPE,EXPR)					\
-  (TREE_CODE (EXPR) == TARGET_EXPR && TREE_LANG_FLAG_2 (EXPR)		\
-   && same_type_ignoring_top_level_qualifiers_p (TYPE, TREE_TYPE (EXPR)))
-
-/* True if this CONVERT_EXPR is for a conversion to virtual base in
-   an NSDMI, and should be re-evaluated when used in a constructor.  */
-#define CONVERT_EXPR_VBASE_PATH(NODE) \
-  TREE_LANG_FLAG_0 (CONVERT_EXPR_CHECK (NODE))
-
-/* True if SIZEOF_EXPR argument is type.  */
-#define SIZEOF_EXPR_TYPE_P(NODE) \
-  TREE_LANG_FLAG_0 (SIZEOF_EXPR_CHECK (NODE))
-
-/* An enumeration of the kind of tags that C++ accepts.  */
-enum tag_types {
-  none_type = 0, /* Not a tag type.  */
-  record_type,   /* "struct" types.  */
-  class_type,    /* "class" types.  */
-  union_type,    /* "union" types.  */
-  enum_type,     /* "enum" types.  */
-  typename_type  /* "typename" types.  */
-};
-
-/* The various kinds of lvalues we distinguish.  */
-enum cp_lvalue_kind_flags {
-  clk_none = 0,     /* Things that are not an lvalue.  */
-  clk_ordinary = 1, /* An ordinary lvalue.  */
-  clk_rvalueref = 2,/* An xvalue (rvalue formed using an rvalue reference) */
-  clk_class = 4,    /* A prvalue of class-type.  */
-  clk_bitfield = 8, /* An lvalue for a bit-field.  */
-  clk_packed = 16   /* An lvalue for a packed field.  */
-};
-
-/* This type is used for parameters and variables which hold
-   combinations of the flags in enum cp_lvalue_kind_flags.  */
-typedef int cp_lvalue_kind;
-
-/* Various kinds of template specialization, instantiation, etc.  */
-typedef enum tmpl_spec_kind {
-  tsk_none,		   /* Not a template at all.  */
-  tsk_invalid_member_spec, /* An explicit member template
-			      specialization, but the enclosing
-			      classes have not all been explicitly
-			      specialized.  */
-  tsk_invalid_expl_inst,   /* An explicit instantiation containing
-			      template parameter lists.  */
-  tsk_excessive_parms,	   /* A template declaration with too many
-			      template parameter lists.  */
-  tsk_insufficient_parms,  /* A template declaration with too few
-			      parameter lists.  */
-  tsk_template,		   /* A template declaration.  */
-  tsk_expl_spec,	   /* An explicit specialization.  */
-  tsk_expl_inst		   /* An explicit instantiation.  */
-} tmpl_spec_kind;
-
-/* The various kinds of access.  BINFO_ACCESS depends on these being
-   two bit quantities.  The numerical values are important; they are
-   used to initialize RTTI data structures, so changing them changes
-   the ABI.  */
-typedef enum access_kind {
-  ak_none = 0,		   /* Inaccessible.  */
-  ak_public = 1,	   /* Accessible, as a `public' thing.  */
-  ak_protected = 2,	   /* Accessible, as a `protected' thing.  */
-  ak_private = 3	   /* Accessible, as a `private' thing.  */
-} access_kind;
-
-/* The various kinds of special functions.  If you add to this list,
-   you should update special_function_p as well.  */
-typedef enum special_function_kind {
-  sfk_none = 0,		   /* Not a special function.  This enumeral
-			      must have value zero; see
-			      special_function_p.  */
-  sfk_constructor,	   /* A constructor.  */
-  sfk_copy_constructor,    /* A copy constructor.  */
-  sfk_move_constructor,    /* A move constructor.  */
-  sfk_copy_assignment,     /* A copy assignment operator.  */
-  sfk_move_assignment,     /* A move assignment operator.  */
-  sfk_destructor,	   /* A destructor.  */
-  sfk_complete_destructor, /* A destructor for complete objects.  */
-  sfk_base_destructor,     /* A destructor for base subobjects.  */
-  sfk_deleting_destructor, /* A destructor for complete objects that
-			      deletes the object after it has been
-			      destroyed.  */
-  sfk_conversion,	   /* A conversion operator.  */
-  sfk_inheriting_constructor /* An inheriting constructor */
-} special_function_kind;
-
-/* The various kinds of linkage.  From [basic.link],
-
-      A name is said to have linkage when it might denote the same
-      object, reference, function, type, template, namespace or value
-      as a name introduced in another scope:
-
-      -- When a name has external linkage, the entity it denotes can
-	 be referred to from scopes of other translation units or from
-	 other scopes of the same translation unit.
-
-      -- When a name has internal linkage, the entity it denotes can
-	 be referred to by names from other scopes in the same
-	 translation unit.
-
-      -- When a name has no linkage, the entity it denotes cannot be
-	 referred to by names from other scopes.  */
-
-typedef enum linkage_kind {
-  lk_none,			/* No linkage.  */
-  lk_internal,			/* Internal linkage.  */
-  lk_external			/* External linkage.  */
-} linkage_kind;
-
-typedef enum duration_kind {
-  dk_static,
-  dk_thread,
-  dk_auto,
-  dk_dynamic
-} duration_kind;
-
-/* Bitmask flags to control type substitution.  */
-enum tsubst_flags {
-  tf_none = 0,			 /* nothing special */
-  tf_error = 1 << 0,		 /* give error messages  */
-  tf_warning = 1 << 1,	 	 /* give warnings too  */
-  tf_ignore_bad_quals = 1 << 2,	 /* ignore bad cvr qualifiers */
-  tf_keep_type_decl = 1 << 3,	 /* retain typedef type decls
-				    (make_typename_type use) */
-  tf_ptrmem_ok = 1 << 4,	 /* pointers to member ok (internal
-				    instantiate_type use) */
-  tf_user = 1 << 5,		 /* found template must be a user template
-				    (lookup_template_class use) */
-  tf_conv = 1 << 6,		 /* We are determining what kind of
-				    conversion might be permissible,
-				    not actually performing the
-				    conversion.  */
-  tf_decltype = 1 << 7,          /* We are the operand of decltype.
-				    Used to implement the special rules
-				    for calls in decltype (5.2.2/11).  */
-  tf_partial = 1 << 8,		 /* Doing initial explicit argument
-				    substitution in fn_type_unification.  */
-  /* Convenient substitution flags combinations.  */
-  tf_warning_or_error = tf_warning | tf_error
-};
-
-/* This type is used for parameters and variables which hold
-   combinations of the flags in enum tsubst_flags.  */
-typedef int tsubst_flags_t;
-
-/* The kind of checking we can do looking in a class hierarchy.  */
-enum base_access_flags {
-  ba_any = 0,  /* Do not check access, allow an ambiguous base,
-		      prefer a non-virtual base */
-  ba_unique = 1 << 0,  /* Must be a unique base.  */
-  ba_check_bit = 1 << 1,   /* Check access.  */
-  ba_check = ba_unique | ba_check_bit,
-  ba_ignore_scope = 1 << 2 /* Ignore access allowed by local scope.  */
-};
-
-/* This type is used for parameters and variables which hold
-   combinations of the flags in enum base_access_flags.  */
-typedef int base_access;
-
-/* The various kinds of access check during parsing.  */
-typedef enum deferring_kind {
-  dk_no_deferred = 0, /* Check access immediately */
-  dk_deferred = 1,    /* Deferred check */
-  dk_no_check = 2     /* No access check */
-} deferring_kind;
-
-/* The kind of base we can find, looking in a class hierarchy.
-   Values <0 indicate we failed.  */
-typedef enum base_kind {
-  bk_inaccessible = -3,   /* The base is inaccessible */
-  bk_ambig = -2,	  /* The base is ambiguous */
-  bk_not_base = -1,	  /* It is not a base */
-  bk_same_type = 0,	  /* It is the same type */
-  bk_proper_base = 1,	  /* It is a proper base */
-  bk_via_virtual = 2	  /* It is a proper base, but via a virtual
-			     path. This might not be the canonical
-			     binfo.  */
-} base_kind;
-
-/* Node for "pointer to (virtual) function".
-   This may be distinct from ptr_type_node so gdb can distinguish them.  */
-#define vfunc_ptr_type_node  vtable_entry_type
-
-
-/* For building calls to `delete'.  */
-extern GTY(()) tree integer_two_node;
-
-/* The number of function bodies which we are currently processing.
-   (Zero if we are at namespace scope, one inside the body of a
-   function, two inside the body of a function in a local class, etc.)  */
-extern int function_depth;
-
-/* Nonzero if we are inside eq_specializations, which affects comparison of
-   PARM_DECLs in cp_tree_equal.  */
-extern int comparing_specializations;
-
-/* A type-qualifier, or bitmask therefore, using the TYPE_QUAL
-   constants.  */
-
-typedef int cp_cv_quals;
-
-/* In parser.c.  */
-
-/* Nonzero if we are parsing an unevaluated operand: an operand to
-   sizeof, typeof, or alignof.  This is a count since operands to
-   sizeof can be nested.  */
-
-extern int cp_unevaluated_operand;
-extern tree cp_convert_range_for (tree, tree, tree, bool);
-extern bool parsing_nsdmi (void);
-extern void inject_this_parameter (tree, cp_cv_quals);
-
-/* in pt.c  */
-
-/* These values are used for the `STRICT' parameter to type_unification and
-   fn_type_unification.  Their meanings are described with the
-   documentation for fn_type_unification.  */
-
-typedef enum unification_kind_t {
-  DEDUCE_CALL,
-  DEDUCE_CONV,
-  DEDUCE_EXACT
-} unification_kind_t;
-
-/* in class.c */
-
-extern int current_class_depth;
-
-/* An array of all local classes present in this translation unit, in
-   declaration order.  */
-extern GTY(()) vec<tree, va_gc> *local_classes;
-
-/* Here's where we control how name mangling takes place.  */
-
-/* Cannot use '$' up front, because this confuses gdb
-   (names beginning with '$' are gdb-local identifiers).
-
-   Note that all forms in which the '$' is significant are long enough
-   for direct indexing (meaning that if we know there is a '$'
-   at a particular location, we can index into the string at
-   any other location that provides distinguishing characters).  */
-
-/* Define NO_DOT_IN_LABEL in your favorite tm file if your assembler
-   doesn't allow '.' in symbol names.  */
-#ifndef NO_DOT_IN_LABEL
-
-#define JOINER '.'
-
-#define AUTO_TEMP_NAME "_.tmp_"
-#define VFIELD_BASE ".vf"
-#define VFIELD_NAME "_vptr."
-#define VFIELD_NAME_FORMAT "_vptr.%s"
-
-#else /* NO_DOT_IN_LABEL */
-
-#ifndef NO_DOLLAR_IN_LABEL
-
-#define JOINER '$'
-
-#define AUTO_TEMP_NAME "_$tmp_"
-#define VFIELD_BASE "$vf"
-#define VFIELD_NAME "_vptr$"
-#define VFIELD_NAME_FORMAT "_vptr$%s"
-
-#else /* NO_DOLLAR_IN_LABEL */
-
-#define AUTO_TEMP_NAME "__tmp_"
-#define TEMP_NAME_P(ID_NODE) \
-  (!strncmp (IDENTIFIER_POINTER (ID_NODE), AUTO_TEMP_NAME, \
-	     sizeof (AUTO_TEMP_NAME) - 1))
-#define VTABLE_NAME "__vt_"
-#define VTABLE_NAME_P(ID_NODE) \
-  (!strncmp (IDENTIFIER_POINTER (ID_NODE), VTABLE_NAME, \
-	     sizeof (VTABLE_NAME) - 1))
-#define VFIELD_BASE "__vfb"
-#define VFIELD_NAME "__vptr_"
-#define VFIELD_NAME_P(ID_NODE) \
-  (!strncmp (IDENTIFIER_POINTER (ID_NODE), VFIELD_NAME, \
-	    sizeof (VFIELD_NAME) - 1))
-#define VFIELD_NAME_FORMAT "__vptr_%s"
-
-#endif	/* NO_DOLLAR_IN_LABEL */
-#endif	/* NO_DOT_IN_LABEL */
-
-#define THIS_NAME "this"
-
-#define IN_CHARGE_NAME "__in_chrg"
-
-#define VTBL_PTR_TYPE		"__vtbl_ptr_type"
-#define VTABLE_DELTA_NAME	"__delta"
-#define VTABLE_PFN_NAME		"__pfn"
-
-#define LAMBDANAME_PREFIX "__lambda"
-#define LAMBDANAME_FORMAT LAMBDANAME_PREFIX "%d"
-
-#define UDLIT_OP_ANSI_PREFIX "operator\"\""
-#define UDLIT_OP_ANSI_FORMAT UDLIT_OP_ANSI_PREFIX "%s"
-#define UDLIT_OP_MANGLED_PREFIX "li"
-#define UDLIT_OP_MANGLED_FORMAT UDLIT_OP_MANGLED_PREFIX "%s"
-#define UDLIT_OPER_P(ID_NODE) \
-  (!strncmp (IDENTIFIER_POINTER (ID_NODE), \
-             UDLIT_OP_ANSI_PREFIX, \
-	     sizeof (UDLIT_OP_ANSI_PREFIX) - 1))
-#define UDLIT_OP_SUFFIX(ID_NODE) \
-  (IDENTIFIER_POINTER (ID_NODE) + sizeof (UDLIT_OP_ANSI_PREFIX) - 1)
-
-#if !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL)
-
-#define VTABLE_NAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[1] == 'v' \
-  && IDENTIFIER_POINTER (ID_NODE)[2] == 't' \
-  && IDENTIFIER_POINTER (ID_NODE)[3] == JOINER)
-
-#define TEMP_NAME_P(ID_NODE) \
-  (!strncmp (IDENTIFIER_POINTER (ID_NODE), AUTO_TEMP_NAME, sizeof (AUTO_TEMP_NAME)-1))
-#define VFIELD_NAME_P(ID_NODE) \
-  (!strncmp (IDENTIFIER_POINTER (ID_NODE), VFIELD_NAME, sizeof(VFIELD_NAME)-1))
-
-#endif /* !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL) */
-
-
-/* Nonzero if we're done parsing and into end-of-file activities.  */
-
-extern int at_eof;
-
-/* A list of namespace-scope objects which have constructors or
-   destructors which reside in the global scope.  The decl is stored
-   in the TREE_VALUE slot and the initializer is stored in the
-   TREE_PURPOSE slot.  */
-extern GTY(()) tree static_aggregates;
-/* Likewise, for thread local storage.  */
-extern GTY(()) tree tls_aggregates;
-
-enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, TYPENAME_FLAG };
-
-/* These are uses as bits in flags passed to various functions to
-   control their behavior.  Despite the LOOKUP_ prefix, many of these
-   do not control name lookup.  ??? Functions using these flags should
-   probably be modified to accept explicit boolean flags for the
-   behaviors relevant to them.  */
-/* Check for access violations.  */
-#define LOOKUP_PROTECT (1 << 0)
-#define LOOKUP_NORMAL (LOOKUP_PROTECT)
-/* Even if the function found by lookup is a virtual function, it
-   should be called directly.  */
-#define LOOKUP_NONVIRTUAL (1 << 1)
-/* Non-converting (i.e., "explicit") constructors are not tried.  This flag
-   indicates that we are not performing direct-initialization.  */
-#define LOOKUP_ONLYCONVERTING (1 << 2)
-#define LOOKUP_IMPLICIT (LOOKUP_NORMAL | LOOKUP_ONLYCONVERTING)
-/* If a temporary is created, it should be created so that it lives
-   as long as the current variable bindings; otherwise it only lives
-   until the end of the complete-expression.  It also forces
-   direct-initialization in cases where other parts of the compiler
-   have already generated a temporary, such as reference
-   initialization and the catch parameter.  */
-#define DIRECT_BIND (1 << 3)
-/* We're performing a user-defined conversion, so more user-defined
-   conversions are not permitted (only built-in conversions).  */
-#define LOOKUP_NO_CONVERSION (1 << 4)
-/* The user has explicitly called a destructor.  (Therefore, we do
-   not need to check that the object is non-NULL before calling the
-   destructor.)  */
-#define LOOKUP_DESTRUCTOR (1 << 5)
-/* Do not permit references to bind to temporaries.  */
-#define LOOKUP_NO_TEMP_BIND (1 << 6)
-/* Do not accept objects, and possibly namespaces.  */
-#define LOOKUP_PREFER_TYPES (1 << 7)
-/* Do not accept objects, and possibly types.   */
-#define LOOKUP_PREFER_NAMESPACES (1 << 8)
-/* Accept types or namespaces.  */
-#define LOOKUP_PREFER_BOTH (LOOKUP_PREFER_TYPES | LOOKUP_PREFER_NAMESPACES)
-/* Return friend declarations and un-declared builtin functions.
-   (Normally, these entities are registered in the symbol table, but
-   not found by lookup.)  */
-#define LOOKUP_HIDDEN (LOOKUP_PREFER_NAMESPACES << 1)
-/* Prefer that the lvalue be treated as an rvalue.  */
-#define LOOKUP_PREFER_RVALUE (LOOKUP_HIDDEN << 1)
-/* We're inside an init-list, so narrowing conversions are ill-formed.  */
-#define LOOKUP_NO_NARROWING (LOOKUP_PREFER_RVALUE << 1)
-/* We're looking up a constructor for list-initialization.  */
-#define LOOKUP_LIST_INIT_CTOR (LOOKUP_NO_NARROWING << 1)
-/* This is the first parameter of a copy constructor.  */
-#define LOOKUP_COPY_PARM (LOOKUP_LIST_INIT_CTOR << 1)
-/* We only want to consider list constructors.  */
-#define LOOKUP_LIST_ONLY (LOOKUP_COPY_PARM << 1)
-/* Return after determining which function to call and checking access.
-   Used by sythesized_method_walk to determine which functions will
-   be called to initialize subobjects, in order to determine exception
-   specification and possible implicit delete.
-   This is kind of a hack, but exiting early avoids problems with trying
-   to perform argument conversions when the class isn't complete yet.  */
-#define LOOKUP_SPECULATIVE (LOOKUP_LIST_ONLY << 1)
-/* Used by calls from defaulted functions to limit the overload set to avoid
-   cycles trying to declare them (core issue 1092).  */
-#define LOOKUP_DEFAULTED (LOOKUP_SPECULATIVE << 1)
-/* Used in calls to store_init_value to suppress its usual call to
-   digest_init.  */
-#define LOOKUP_ALREADY_DIGESTED (LOOKUP_DEFAULTED << 1)
-/* An instantiation with explicit template arguments.  */
-#define LOOKUP_EXPLICIT_TMPL_ARGS (LOOKUP_ALREADY_DIGESTED << 1)
-/* Like LOOKUP_NO_TEMP_BIND, but also prevent binding to xvalues.  */
-#define LOOKUP_NO_RVAL_BIND (LOOKUP_EXPLICIT_TMPL_ARGS << 1)
-/* Used by case_conversion to disregard non-integral conversions.  */
-#define LOOKUP_NO_NON_INTEGRAL (LOOKUP_NO_RVAL_BIND << 1)
-/* Used for delegating constructors in order to diagnose self-delegation.  */
-#define LOOKUP_DELEGATING_CONS (LOOKUP_NO_NON_INTEGRAL << 1)
-
-#define LOOKUP_NAMESPACES_ONLY(F)  \
-  (((F) & LOOKUP_PREFER_NAMESPACES) && !((F) & LOOKUP_PREFER_TYPES))
-#define LOOKUP_TYPES_ONLY(F)  \
-  (!((F) & LOOKUP_PREFER_NAMESPACES) && ((F) & LOOKUP_PREFER_TYPES))
-#define LOOKUP_QUALIFIERS_ONLY(F)     ((F) & LOOKUP_PREFER_BOTH)
-
-
-/* These flags are used by the conversion code.
-   CONV_IMPLICIT   :  Perform implicit conversions (standard and user-defined).
-   CONV_STATIC     :  Perform the explicit conversions for static_cast.
-   CONV_CONST      :  Perform the explicit conversions for const_cast.
-   CONV_REINTERPRET:  Perform the explicit conversions for reinterpret_cast.
-   CONV_PRIVATE    :  Perform upcasts to private bases.
-   CONV_FORCE_TEMP :  Require a new temporary when converting to the same
-		      aggregate type.  */
-
-#define CONV_IMPLICIT    1
-#define CONV_STATIC      2
-#define CONV_CONST       4
-#define CONV_REINTERPRET 8
-#define CONV_PRIVATE	 16
-/* #define CONV_NONCONVERTING 32 */
-#define CONV_FORCE_TEMP  64
-#define CONV_OLD_CONVERT (CONV_IMPLICIT | CONV_STATIC | CONV_CONST \
-			  | CONV_REINTERPRET)
-#define CONV_C_CAST      (CONV_IMPLICIT | CONV_STATIC | CONV_CONST \
-			  | CONV_REINTERPRET | CONV_PRIVATE | CONV_FORCE_TEMP)
-
-/* Used by build_expr_type_conversion to indicate which types are
-   acceptable as arguments to the expression under consideration.  */
-
-#define WANT_INT	1 /* integer types, including bool */
-#define WANT_FLOAT	2 /* floating point types */
-#define WANT_ENUM	4 /* enumerated types */
-#define WANT_POINTER	8 /* pointer types */
-#define WANT_NULL      16 /* null pointer constant */
-#define WANT_VECTOR_OR_COMPLEX 32 /* vector or complex types */
-#define WANT_ARITH	(WANT_INT | WANT_FLOAT | WANT_VECTOR_OR_COMPLEX)
-
-/* Used with comptypes, and related functions, to guide type
-   comparison.  */
-
-#define COMPARE_STRICT	      0 /* Just check if the types are the
-				   same.  */
-#define COMPARE_BASE	      1 /* Check to see if the second type is
-				   derived from the first.  */
-#define COMPARE_DERIVED	      2 /* Like COMPARE_BASE, but in
-				   reverse.  */
-#define COMPARE_REDECLARATION 4 /* The comparison is being done when
-				   another declaration of an existing
-				   entity is seen.  */
-#define COMPARE_STRUCTURAL    8 /* The comparison is intended to be
-				   structural. The actual comparison
-				   will be identical to
-				   COMPARE_STRICT.  */
-
-/* Used with push_overloaded_decl.  */
-#define PUSH_GLOBAL	     0  /* Push the DECL into namespace scope,
-				   regardless of the current scope.  */
-#define PUSH_LOCAL	     1  /* Push the DECL into the current
-				   scope.  */
-#define PUSH_USING	     2  /* We are pushing this DECL as the
-				   result of a using declaration.  */
-
-/* Used with start function.  */
-#define SF_DEFAULT	     0  /* No flags.  */
-#define SF_PRE_PARSED	     1  /* The function declaration has
-				   already been parsed.  */
-#define SF_INCLASS_INLINE    2  /* The function is an inline, defined
-				   in the class body.  */
-
-/* Used with start_decl's initialized parameter.  */
-#define SD_UNINITIALIZED     0
-#define SD_INITIALIZED       1
-#define SD_DEFAULTED         2
-#define SD_DELETED           3
-
-/* Returns nonzero iff TYPE1 and TYPE2 are the same type, or if TYPE2
-   is derived from TYPE1, or if TYPE2 is a pointer (reference) to a
-   class derived from the type pointed to (referred to) by TYPE1.  */
-#define same_or_base_type_p(TYPE1, TYPE2) \
-  comptypes ((TYPE1), (TYPE2), COMPARE_BASE)
-
-/* These macros are used to access a TEMPLATE_PARM_INDEX.  */
-#define TEMPLATE_PARM_INDEX_CAST(NODE) \
-	((template_parm_index*)TEMPLATE_PARM_INDEX_CHECK (NODE))
-#define TEMPLATE_PARM_IDX(NODE) (TEMPLATE_PARM_INDEX_CAST (NODE)->index)
-#define TEMPLATE_PARM_LEVEL(NODE) (TEMPLATE_PARM_INDEX_CAST (NODE)->level)
-#define TEMPLATE_PARM_DESCENDANTS(NODE) (TREE_CHAIN (NODE))
-#define TEMPLATE_PARM_ORIG_LEVEL(NODE) (TEMPLATE_PARM_INDEX_CAST (NODE)->orig_level)
-#define TEMPLATE_PARM_DECL(NODE) (TEMPLATE_PARM_INDEX_CAST (NODE)->decl)
-#define TEMPLATE_PARM_PARAMETER_PACK(NODE) \
-  (TREE_LANG_FLAG_0 (TEMPLATE_PARM_INDEX_CHECK (NODE)))
-
-/* These macros are for accessing the fields of TEMPLATE_TYPE_PARM,
-   TEMPLATE_TEMPLATE_PARM and BOUND_TEMPLATE_TEMPLATE_PARM nodes.  */
-#define TEMPLATE_TYPE_PARM_INDEX(NODE)					\
-  (TYPE_VALUES_RAW (TREE_CHECK3 ((NODE), TEMPLATE_TYPE_PARM,		\
-				 TEMPLATE_TEMPLATE_PARM,		\
-				 BOUND_TEMPLATE_TEMPLATE_PARM)))
-#define TEMPLATE_TYPE_IDX(NODE) \
-  (TEMPLATE_PARM_IDX (TEMPLATE_TYPE_PARM_INDEX (NODE)))
-#define TEMPLATE_TYPE_LEVEL(NODE) \
-  (TEMPLATE_PARM_LEVEL (TEMPLATE_TYPE_PARM_INDEX (NODE)))
-#define TEMPLATE_TYPE_ORIG_LEVEL(NODE) \
-  (TEMPLATE_PARM_ORIG_LEVEL (TEMPLATE_TYPE_PARM_INDEX (NODE)))
-#define TEMPLATE_TYPE_DECL(NODE) \
-  (TEMPLATE_PARM_DECL (TEMPLATE_TYPE_PARM_INDEX (NODE)))
-#define TEMPLATE_TYPE_PARAMETER_PACK(NODE) \
-  (TEMPLATE_PARM_PARAMETER_PACK (TEMPLATE_TYPE_PARM_INDEX (NODE)))
-
-/* True iff this TEMPLATE_TYPE_PARM represents decltype(auto).  */
-#define AUTO_IS_DECLTYPE(NODE) \
-  (TYPE_LANG_FLAG_5 (TEMPLATE_TYPE_PARM_CHECK (NODE)))
-
-/* These constants can used as bit flags in the process of tree formatting.
-
-   TFF_PLAIN_IDENTIFIER: unqualified part of a name.
-   TFF_SCOPE: include the class and namespace scope of the name.
-   TFF_CHASE_TYPEDEF: print the original type-id instead of the typedef-name.
-   TFF_DECL_SPECIFIERS: print decl-specifiers.
-   TFF_CLASS_KEY_OR_ENUM: precede a class-type name (resp. enum name) with
-       a class-key (resp. `enum').
-   TFF_RETURN_TYPE: include function return type.
-   TFF_FUNCTION_DEFAULT_ARGUMENTS: include function default parameter values.
-   TFF_EXCEPTION_SPECIFICATION: show function exception specification.
-   TFF_TEMPLATE_HEADER: show the template<...> header in a
-       template-declaration.
-   TFF_TEMPLATE_NAME: show only template-name.
-   TFF_EXPR_IN_PARENS: parenthesize expressions.
-   TFF_NO_FUNCTION_ARGUMENTS: don't show function arguments.
-   TFF_UNQUALIFIED_NAME: do not print the qualifying scope of the
-       top-level entity.
-   TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS: do not omit template arguments
-       identical to their defaults.
-   TFF_NO_TEMPLATE_BINDINGS: do not print information about the template
-       arguments for a function template specialization.  */
-
-#define TFF_PLAIN_IDENTIFIER			(0)
-#define TFF_SCOPE				(1)
-#define TFF_CHASE_TYPEDEF			(1 << 1)
-#define TFF_DECL_SPECIFIERS			(1 << 2)
-#define TFF_CLASS_KEY_OR_ENUM			(1 << 3)
-#define TFF_RETURN_TYPE				(1 << 4)
-#define TFF_FUNCTION_DEFAULT_ARGUMENTS		(1 << 5)
-#define TFF_EXCEPTION_SPECIFICATION		(1 << 6)
-#define TFF_TEMPLATE_HEADER			(1 << 7)
-#define TFF_TEMPLATE_NAME			(1 << 8)
-#define TFF_EXPR_IN_PARENS			(1 << 9)
-#define TFF_NO_FUNCTION_ARGUMENTS		(1 << 10)
-#define TFF_UNQUALIFIED_NAME			(1 << 11)
-#define TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS	(1 << 12)
-#define TFF_NO_TEMPLATE_BINDINGS		(1 << 13)
-
-/* Returns the TEMPLATE_DECL associated to a TEMPLATE_TEMPLATE_PARM
-   node.  */
-#define TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL(NODE)	\
-  ((TREE_CODE (NODE) == BOUND_TEMPLATE_TEMPLATE_PARM)	\
-   ? TYPE_TI_TEMPLATE (NODE)				\
-   : TYPE_NAME (NODE))
-
-/* in lex.c  */
-
-extern void init_reswords (void);
-
-typedef struct GTY(()) operator_name_info_t {
-  /* The IDENTIFIER_NODE for the operator.  */
-  tree identifier;
-  /* The name of the operator.  */
-  const char *name;
-  /* The mangled name of the operator.  */
-  const char *mangled_name;
-  /* The arity of the operator.  */
-  int arity;
-} operator_name_info_t;
-
-/* A mapping from tree codes to operator name information.  */
-extern GTY(()) operator_name_info_t operator_name_info
-  [(int) MAX_TREE_CODES];
-/* Similar, but for assignment operators.  */
-extern GTY(()) operator_name_info_t assignment_operator_name_info
-  [(int) MAX_TREE_CODES];
-
-/* Non-static member functions have an optional virt-specifier-seq.
-   There is a VIRT_SPEC value for each virt-specifier.
-   They can be combined by bitwise-or to form the complete set of
-   virt-specifiers for a member function.  */
-enum virt_specifier
-  {
-    VIRT_SPEC_UNSPECIFIED = 0x0,
-    VIRT_SPEC_FINAL       = 0x1,
-    VIRT_SPEC_OVERRIDE    = 0x2
-  };
-
-/* A type-qualifier, or bitmask therefore, using the VIRT_SPEC
-   constants.  */
-
-typedef int cp_virt_specifiers;
-
-/* Wherever there is a function-cv-qual, there could also be a ref-qualifier:
-
-   [dcl.fct]
-   The return type, the parameter-type-list, the ref-qualifier, and
-   the cv-qualifier-seq, but not the default arguments or the exception
-   specification, are part of the function type.
-
-   REF_QUAL_NONE    Ordinary member function with no ref-qualifier
-   REF_QUAL_LVALUE  Member function with the &-ref-qualifier
-   REF_QUAL_RVALUE  Member function with the &&-ref-qualifier */
-
-enum cp_ref_qualifier {
-  REF_QUAL_NONE = 0,
-  REF_QUAL_LVALUE = 1,
-  REF_QUAL_RVALUE = 2
-};
-
-/* A storage class.  */
-
-typedef enum cp_storage_class {
-  /* sc_none must be zero so that zeroing a cp_decl_specifier_seq
-     sets the storage_class field to sc_none.  */
-  sc_none = 0,
-  sc_auto,
-  sc_register,
-  sc_static,
-  sc_extern,
-  sc_mutable
-} cp_storage_class;
-
-/* An individual decl-specifier.  This is used to index the array of
-   locations for the declspecs in struct cp_decl_specifier_seq
-   below.  */
-
-typedef enum cp_decl_spec {
-  ds_first,
-  ds_signed = ds_first,
-  ds_unsigned,
-  ds_short,
-  ds_long,
-  ds_const,
-  ds_volatile,
-  ds_restrict,
-  ds_inline,
-  ds_virtual,
-  ds_explicit,
-  ds_friend,
-  ds_typedef,
-  ds_alias,
-  ds_constexpr,
-  ds_complex,
-  ds_thread,
-  ds_type_spec,
-  ds_redefined_builtin_type_spec,
-  ds_attribute,
-  ds_std_attribute,
-  ds_storage_class,
-  ds_long_long,
-  ds_last /* This enumerator must always be the last one.  */
-} cp_decl_spec;
-
-/* A decl-specifier-seq.  */
-
-typedef struct cp_decl_specifier_seq {
-  /* An array of locations for the declaration sepecifiers, indexed by
-     enum cp_decl_spec_word.  */
-  source_location locations[ds_last];
-  /* The primary type, if any, given by the decl-specifier-seq.
-     Modifiers, like "short", "const", and "unsigned" are not
-     reflected here.  This field will be a TYPE, unless a typedef-name
-     was used, in which case it will be a TYPE_DECL.  */
-  tree type;
-  /* The attributes, if any, provided with the specifier sequence.  */
-  tree attributes;
-  /* The c++11 attributes that follows the type specifier.  */
-  tree std_attributes;
-  /* If non-NULL, a built-in type that the user attempted to redefine
-     to some other type.  */
-  tree redefined_builtin_type;
-  /* The storage class specified -- or sc_none if no storage class was
-     explicitly specified.  */
-  cp_storage_class storage_class;
-  /* True iff TYPE_SPEC defines a class or enum.  */
-  BOOL_BITFIELD type_definition_p : 1;
-  /* True iff multiple types were (erroneously) specified for this
-     decl-specifier-seq.  */
-  BOOL_BITFIELD multiple_types_p : 1;
-  /* True iff multiple storage classes were (erroneously) specified
-     for this decl-specifier-seq or a combination of a storage class
-     with a typedef specifier.  */
-  BOOL_BITFIELD conflicting_specifiers_p : 1;
-  /* True iff at least one decl-specifier was found.  */
-  BOOL_BITFIELD any_specifiers_p : 1;
-  /* True iff at least one type-specifier was found.  */
-  BOOL_BITFIELD any_type_specifiers_p : 1;
-  /* True iff "int" was explicitly provided.  */
-  BOOL_BITFIELD explicit_int_p : 1;
-  /* True iff "__int128" was explicitly provided.  */
-  BOOL_BITFIELD explicit_int128_p : 1;
-  /* True iff "char" was explicitly provided.  */
-  BOOL_BITFIELD explicit_char_p : 1;
-  /* True iff ds_thread is set for __thread, not thread_local.  */
-  BOOL_BITFIELD gnu_thread_keyword_p : 1;
-} cp_decl_specifier_seq;
-
-/* The various kinds of declarators.  */
-
-typedef enum cp_declarator_kind {
-  cdk_id,
-  cdk_function,
-  cdk_array,
-  cdk_pointer,
-  cdk_reference,
-  cdk_ptrmem,
-  cdk_error
-} cp_declarator_kind;
-
-/* A declarator.  */
-
-typedef struct cp_declarator cp_declarator;
-
-typedef struct cp_parameter_declarator cp_parameter_declarator;
-
-/* A parameter, before it has been semantically analyzed.  */
-struct cp_parameter_declarator {
-  /* The next parameter, or NULL_TREE if none.  */
-  cp_parameter_declarator *next;
-  /* The decl-specifiers-seq for the parameter.  */
-  cp_decl_specifier_seq decl_specifiers;
-  /* The declarator for the parameter.  */
-  cp_declarator *declarator;
-  /* The default-argument expression, or NULL_TREE, if none.  */
-  tree default_argument;
-  /* True iff this is the first parameter in the list and the
-     parameter sequence ends with an ellipsis.  */
-  bool ellipsis_p;
-};
-
-/* A declarator.  */
-struct cp_declarator {
-  /* The kind of declarator.  */
-  ENUM_BITFIELD (cp_declarator_kind) kind : 4;
-  /* Whether we parsed an ellipsis (`...') just before the declarator,
-     to indicate this is a parameter pack.  */
-  BOOL_BITFIELD parameter_pack_p : 1;
-  location_t id_loc; /* Currently only set for cdk_id and cdk_function. */
-  /* GNU Attributes that apply to this declarator.  If the declarator
-     is a pointer or a reference, these attribute apply to the type
-     pointed to.  */
-  tree attributes;
-  /* Standard C++11 attributes that apply to this declarator.  If the
-     declarator is a pointer or a reference, these attributes apply
-     to the pointer, rather than to the type pointed to.  */
-  tree std_attributes;
-  /* For all but cdk_id and cdk_error, the contained declarator.  For
-     cdk_id and cdk_error, guaranteed to be NULL.  */
-  cp_declarator *declarator;
-  union {
-    /* For identifiers.  */
-    struct {
-      /* If non-NULL, the qualifying scope (a NAMESPACE_DECL or
-	 *_TYPE) for this identifier.  */
-      tree qualifying_scope;
-      /* The unqualified name of the entity -- an IDENTIFIER_NODE,
-	 BIT_NOT_EXPR, or TEMPLATE_ID_EXPR.  */
-      tree unqualified_name;
-      /* If this is the name of a function, what kind of special
-	 function (if any).  */
-      special_function_kind sfk;
-    } id;
-    /* For functions.  */
-    struct {
-      /* The parameters to the function as a TREE_LIST of decl/default.  */
-      tree parameters;
-      /* The cv-qualifiers for the function.  */
-      cp_cv_quals qualifiers;
-      /* The virt-specifiers for the function.  */
-      cp_virt_specifiers virt_specifiers;
-      /* The ref-qualifier for the function.  */
-      cp_ref_qualifier ref_qualifier;
-      /* The exception-specification for the function.  */
-      tree exception_specification;
-      /* The late-specified return type, if any.  */
-      tree late_return_type;
-    } function;
-    /* For arrays.  */
-    struct {
-      /* The bounds to the array.  */
-      tree bounds;
-    } array;
-    /* For cdk_pointer and cdk_ptrmem.  */
-    struct {
-      /* The cv-qualifiers for the pointer.  */
-      cp_cv_quals qualifiers;
-      /* For cdk_ptrmem, the class type containing the member.  */
-      tree class_type;
-    } pointer;
-    /* For cdk_reference */
-    struct {
-      /* The cv-qualifiers for the reference.  These qualifiers are
-         only used to diagnose ill-formed code.  */
-      cp_cv_quals qualifiers;
-      /* Whether this is an rvalue reference */
-      bool rvalue_ref;
-    } reference;
-  } u;
-};
-
-/* A level of template instantiation.  */
-struct GTY((chain_next ("%h.next"))) tinst_level {
-  /* The immediately deeper level in the chain.  */
-  struct tinst_level *next;
-
-  /* The original node.  Can be either a DECL (for a function or static
-     data member) or a TYPE (for a class), depending on what we were
-     asked to instantiate.  */
-  tree decl;
-
-  /* The location where the template is instantiated.  */
-  location_t locus;
-
-  /* errorcount+sorrycount when we pushed this level.  */
-  int errors;
-
-  /* True if the location is in a system header.  */
-  bool in_system_header_p;
-};
-
-bool decl_spec_seq_has_spec_p (const cp_decl_specifier_seq *, cp_decl_spec);
-
-/* Return the type of the `this' parameter of FNTYPE.  */
-
-inline tree
-type_of_this_parm (const_tree fntype)
-{
-  function_args_iterator iter;
-  gcc_assert (TREE_CODE (fntype) == METHOD_TYPE);
-  function_args_iter_init (&iter, fntype);
-  return function_args_iter_cond (&iter);
-}
-
-/* Return the class of the `this' parameter of FNTYPE.  */
-
-inline tree
-class_of_this_parm (const_tree fntype)
-{
-  return TREE_TYPE (type_of_this_parm (fntype));
-}
-
-/* A parameter list indicating for a function with no parameters,
-   e.g  "int f(void)".  */
-extern cp_parameter_declarator *no_parameters;
-
-/* True if we saw "#pragma GCC java_exceptions".  */
-extern bool pragma_java_exceptions;
-
-/* in call.c */
-extern bool check_dtor_name			(tree, tree);
-bool magic_varargs_p                            (tree);
-
-extern tree build_conditional_expr		(location_t, tree, tree, tree, 
-                                                 tsubst_flags_t);
-extern tree build_addr_func			(tree, tsubst_flags_t);
-extern void set_flags_from_callee		(tree);
-extern tree build_call_a			(tree, int, tree*);
-extern tree build_call_n			(tree, int, ...);
-extern bool null_ptr_cst_p			(tree);
-extern bool null_member_pointer_value_p		(tree);
-extern bool sufficient_parms_p			(const_tree);
-extern tree type_decays_to			(tree);
-extern tree build_user_type_conversion		(tree, tree, int,
-						 tsubst_flags_t);
-extern tree build_new_function_call		(tree, vec<tree, va_gc> **, bool, 
-						 tsubst_flags_t);
-extern tree build_operator_new_call		(tree, vec<tree, va_gc> **, tree *,
-						 tree *, tree, tree *,
-						 tsubst_flags_t);
-extern tree build_new_method_call		(tree, tree, vec<tree, va_gc> **,
-						 tree, int, tree *,
-						 tsubst_flags_t);
-extern tree build_special_member_call		(tree, tree, vec<tree, va_gc> **,
-						 tree, int, tsubst_flags_t);
-extern tree build_new_op			(location_t, enum tree_code,
-						 int, tree, tree, tree, tree *,
-						 tsubst_flags_t);
-extern tree build_op_call			(tree, vec<tree, va_gc> **,
-						 tsubst_flags_t);
-extern tree build_op_delete_call		(enum tree_code, tree, tree,
-						 bool, tree, tree,
-						 tsubst_flags_t);
-extern bool can_convert				(tree, tree, tsubst_flags_t);
-extern bool can_convert_standard		(tree, tree, tsubst_flags_t);
-extern bool can_convert_arg			(tree, tree, tree, int,
-						 tsubst_flags_t);
-extern bool can_convert_arg_bad			(tree, tree, tree, int,
-						 tsubst_flags_t);
-extern bool enforce_access			(tree, tree, tree,
-						 tsubst_flags_t);
-extern void push_defarg_context			(tree);
-extern void pop_defarg_context			(void);
-extern tree convert_default_arg			(tree, tree, tree, int,
-						 tsubst_flags_t);
-extern tree convert_arg_to_ellipsis		(tree, tsubst_flags_t);
-extern tree build_x_va_arg			(source_location, tree, tree);
-extern tree cxx_type_promotes_to		(tree);
-extern tree type_passed_as			(tree);
-extern tree convert_for_arg_passing		(tree, tree, tsubst_flags_t);
-extern bool is_properly_derived_from		(tree, tree);
-extern tree initialize_reference		(tree, tree, int,
-						 tsubst_flags_t);
-extern tree extend_ref_init_temps		(tree, tree, vec<tree, va_gc>**);
-extern tree make_temporary_var_for_ref_to_temp	(tree, tree);
-extern bool type_has_extended_temps		(tree);
-extern tree strip_top_quals			(tree);
-extern bool reference_related_p			(tree, tree);
-extern tree perform_implicit_conversion		(tree, tree, tsubst_flags_t);
-extern tree perform_implicit_conversion_flags	(tree, tree, tsubst_flags_t, int);
-extern tree build_integral_nontype_arg_conv	(tree, tree, tsubst_flags_t);
-extern tree perform_direct_initialization_if_possible (tree, tree, bool,
-                                                       tsubst_flags_t);
-extern tree in_charge_arg_for_name		(tree);
-extern tree build_cxx_call			(tree, int, tree *,
-						 tsubst_flags_t);
-extern bool is_std_init_list			(tree);
-extern bool is_list_ctor			(tree);
-#ifdef ENABLE_CHECKING
-extern void validate_conversion_obstack		(void);
-#endif /* ENABLE_CHECKING */
-extern void mark_versions_used			(tree);
-extern tree get_function_version_dispatcher	(tree);
-
-/* in class.c */
-extern tree build_vfield_ref			(tree, tree);
-extern tree build_base_path			(enum tree_code, tree,
-						 tree, int, tsubst_flags_t);
-extern tree convert_to_base			(tree, tree, bool, bool,
-						 tsubst_flags_t);
-extern tree convert_to_base_statically		(tree, tree);
-extern tree build_vtbl_ref			(tree, tree);
-extern tree build_vfn_ref			(tree, tree);
-extern tree get_vtable_decl			(tree, int);
-extern void resort_type_method_vec		(void *, void *,
-						 gt_pointer_operator, void *);
-extern bool add_method				(tree, tree, tree);
-extern bool currently_open_class		(tree);
-extern tree currently_open_derived_class	(tree);
-extern tree current_nonlambda_class_type	(void);
-extern tree finish_struct			(tree, tree);
-extern void finish_struct_1			(tree);
-extern int resolves_to_fixed_type_p		(tree, int *);
-extern void init_class_processing		(void);
-extern int is_empty_class			(tree);
-extern bool is_really_empty_class		(tree);
-extern void pushclass				(tree);
-extern void popclass				(void);
-extern void push_nested_class			(tree);
-extern void pop_nested_class			(void);
-extern int current_lang_depth			(void);
-extern void push_lang_context			(tree);
-extern void pop_lang_context			(void);
-extern tree instantiate_type			(tree, tree, tsubst_flags_t);
-extern void print_class_statistics		(void);
-extern void build_self_reference		(void);
-extern int same_signature_p			(const_tree, const_tree);
-extern void maybe_add_class_template_decl_list	(tree, tree, int);
-extern void unreverse_member_declarations	(tree);
-extern void invalidate_class_lookup_cache	(void);
-extern void maybe_note_name_used_in_class	(tree, tree);
-extern void note_name_declared_in_class		(tree, tree);
-extern tree get_vtbl_decl_for_binfo		(tree);
-extern void debug_class				(tree);
-extern void debug_thunks			(tree);
-extern void set_linkage_according_to_type	(tree, tree);
-extern void determine_key_method		(tree);
-extern void check_for_override			(tree, tree);
-extern void push_class_stack			(void);
-extern void pop_class_stack			(void);
-extern bool type_has_user_nondefault_constructor (tree);
-extern tree in_class_defaulted_default_constructor (tree);
-extern bool user_provided_p			(tree);
-extern bool type_has_user_provided_constructor  (tree);
-extern bool type_has_user_provided_default_constructor (tree);
-extern bool vbase_has_user_provided_move_assign (tree);
-extern tree default_init_uninitialized_part (tree);
-extern bool trivial_default_constructor_is_constexpr (tree);
-extern bool type_has_constexpr_default_constructor (tree);
-extern bool type_has_virtual_destructor		(tree);
-extern bool type_has_move_constructor		(tree);
-extern bool type_has_move_assign		(tree);
-extern bool type_has_user_declared_move_constructor (tree);
-extern bool type_has_user_declared_move_assign(tree);
-extern bool type_build_ctor_call		(tree);
-extern bool type_build_dtor_call		(tree);
-extern void explain_non_literal_class		(tree);
-extern void defaulted_late_check		(tree);
-extern bool defaultable_fn_check		(tree);
-extern void fixup_type_variants			(tree);
-extern void fixup_attribute_variants		(tree);
-extern tree* decl_cloned_function_p		(const_tree, bool);
-extern void clone_function_decl			(tree, int);
-extern void adjust_clone_args			(tree);
-extern void deduce_noexcept_on_destructor       (tree);
-extern void insert_late_enum_def_into_classtype_sorted_fields (tree, tree);
-extern bool uniquely_derived_from_p             (tree, tree);
-extern bool publicly_uniquely_derived_p         (tree, tree);
-extern tree common_enclosing_class		(tree, tree);
-
-/* in cvt.c */
-extern tree convert_to_reference		(tree, tree, int, int, tree,
-						 tsubst_flags_t);
-extern tree convert_from_reference		(tree);
-extern tree force_rvalue			(tree, tsubst_flags_t);
-extern tree ocp_convert				(tree, tree, int, int,
-						 tsubst_flags_t);
-extern tree cp_convert				(tree, tree, tsubst_flags_t);
-extern tree cp_convert_and_check                (tree, tree, tsubst_flags_t);
-extern tree cp_fold_convert			(tree, tree);
-extern tree convert_to_void			(tree, impl_conv_void,
-                                 		 tsubst_flags_t);
-extern tree convert_force			(tree, tree, int,
-						 tsubst_flags_t);
-extern tree build_expr_type_conversion		(int, tree, bool);
-extern tree type_promotes_to			(tree);
-extern tree perform_qualification_conversions	(tree, tree);
-
-/* in name-lookup.c */
-extern tree pushdecl				(tree);
-extern tree pushdecl_maybe_friend		(tree, bool);
-extern void maybe_push_cleanup_level		(tree);
-extern tree pushtag				(tree, tree, tag_scope);
-extern tree make_anon_name			(void);
-extern tree pushdecl_top_level_maybe_friend	(tree, bool);
-extern tree pushdecl_top_level_and_finish	(tree, tree);
-extern tree check_for_out_of_scope_variable	(tree);
-extern void dump				(cp_binding_level &ref);
-extern void dump				(cp_binding_level *ptr);
-extern void print_other_binding_stack		(cp_binding_level *);
-extern tree maybe_push_decl			(tree);
-extern tree current_decl_namespace		(void);
-
-/* decl.c */
-extern tree poplevel				(int, int, int);
-extern void cxx_init_decl_processing		(void);
-enum cp_tree_node_structure_enum cp_tree_node_structure
-						(union lang_tree_node *);
-extern void finish_scope			(void);
-extern void push_switch				(tree);
-extern void pop_switch				(void);
-extern tree make_lambda_name			(void);
-extern int decls_match				(tree, tree);
-extern tree duplicate_decls			(tree, tree, bool);
-extern tree declare_local_label			(tree);
-extern tree define_label			(location_t, tree);
-extern void check_goto				(tree);
-extern bool check_omp_return			(void);
-extern tree make_typename_type			(tree, tree, enum tag_types, tsubst_flags_t);
-extern tree make_unbound_class_template		(tree, tree, tree, tsubst_flags_t);
-extern tree build_library_fn_ptr		(const char *, tree, int);
-extern tree build_cp_library_fn_ptr		(const char *, tree, int);
-extern tree push_library_fn			(tree, tree, tree, int);
-extern tree push_void_library_fn		(tree, tree, int);
-extern tree push_throw_library_fn		(tree, tree);
-extern void warn_misplaced_attr_for_class_type  (source_location location,
-						 tree class_type);
-extern tree check_tag_decl			(cp_decl_specifier_seq *, bool);
-extern tree shadow_tag				(cp_decl_specifier_seq *);
-extern tree groktypename			(cp_decl_specifier_seq *, const cp_declarator *, bool);
-extern tree start_decl				(const cp_declarator *, cp_decl_specifier_seq *, int, tree, tree, tree *);
-extern void start_decl_1			(tree, bool);
-extern bool check_array_initializer		(tree, tree, tree);
-extern void cp_finish_decl			(tree, tree, bool, tree, int);
-extern int cp_complete_array_type		(tree *, tree, bool);
-extern int cp_complete_array_type_or_error	(tree *, tree, bool, tsubst_flags_t);
-extern tree build_ptrmemfunc_type		(tree);
-extern tree build_ptrmem_type			(tree, tree);
-/* the grokdeclarator prototype is in decl.h */
-extern tree build_this_parm			(tree, cp_cv_quals);
-extern int copy_fn_p				(const_tree);
-extern bool move_fn_p                           (const_tree);
-extern bool move_signature_fn_p                 (const_tree);
-extern tree get_scope_of_declarator		(const cp_declarator *);
-extern void grok_special_member_properties	(tree);
-extern int grok_ctor_properties			(const_tree, const_tree);
-extern bool grok_op_properties			(tree, bool);
-extern tree xref_tag				(enum tag_types, tree, tag_scope, bool);
-extern tree xref_tag_from_type			(tree, tree, tag_scope);
-extern bool xref_basetypes			(tree, tree);
-extern tree start_enum				(tree, tree, tree, bool, bool *);
-extern void finish_enum_value_list		(tree);
-extern void finish_enum				(tree);
-extern void build_enumerator			(tree, tree, tree, location_t);
-extern tree lookup_enumerator			(tree, tree);
-extern bool start_preparsed_function		(tree, tree, int);
-extern bool start_function			(cp_decl_specifier_seq *,
-						 const cp_declarator *, tree);
-extern tree begin_function_body			(void);
-extern void finish_function_body		(tree);
-extern tree outer_curly_brace_block		(tree);
-extern tree finish_function			(int);
-extern tree grokmethod				(cp_decl_specifier_seq *, const cp_declarator *, tree);
-extern void maybe_register_incomplete_var	(tree);
-extern void maybe_commonize_var			(tree);
-extern void complete_vars			(tree);
-extern tree static_fn_type			(tree);
-extern void revert_static_member_fn		(tree);
-extern void fixup_anonymous_aggr		(tree);
-extern tree compute_array_index_type		(tree, tree, tsubst_flags_t);
-extern tree check_default_argument		(tree, tree, tsubst_flags_t);
-typedef int (*walk_namespaces_fn)		(tree, void *);
-extern int walk_namespaces			(walk_namespaces_fn,
-						 void *);
-extern int wrapup_globals_for_namespace		(tree, void *);
-extern tree create_implicit_typedef		(tree, tree);
-extern int local_variable_p			(const_tree);
-extern tree register_dtor_fn			(tree);
-extern tmpl_spec_kind current_tmpl_spec_kind	(int);
-extern tree cp_fname_init			(const char *, tree *);
-extern tree cxx_builtin_function		(tree decl);
-extern tree cxx_builtin_function_ext_scope	(tree decl);
-extern tree check_elaborated_type_specifier	(enum tag_types, tree, bool);
-extern void warn_extern_redeclared_static	(tree, tree);
-extern tree cxx_comdat_group			(tree);
-extern bool cp_missing_noreturn_ok_p		(tree);
-extern void initialize_artificial_var		(tree, vec<constructor_elt, va_gc> *);
-extern tree check_var_type			(tree, tree);
-extern tree reshape_init                        (tree, tree, tsubst_flags_t);
-extern tree next_initializable_field (tree);
-extern tree fndecl_declared_return_type		(tree);
-extern bool undeduced_auto_decl			(tree);
-extern void require_deduced_type		(tree);
-
-extern bool defer_mark_used_calls;
-extern GTY(()) vec<tree, va_gc> *deferred_mark_used_calls;
-extern tree finish_case_label			(location_t, tree, tree);
-extern tree cxx_maybe_build_cleanup		(tree, tsubst_flags_t);
-
-/* in decl2.c */
-extern bool check_java_method			(tree);
-extern tree build_memfn_type			(tree, tree, cp_cv_quals, cp_ref_qualifier);
-extern tree build_pointer_ptrmemfn_type	(tree);
-extern tree change_return_type			(tree, tree);
-extern void maybe_retrofit_in_chrg		(tree);
-extern void maybe_make_one_only			(tree);
-extern bool vague_linkage_p			(tree);
-extern void grokclassfn				(tree, tree,
-						 enum overload_flags);
-extern tree grok_array_decl			(location_t, tree, tree, bool);
-extern tree delete_sanity			(tree, tree, bool, int, tsubst_flags_t);
-extern tree check_classfn			(tree, tree, tree);
-extern void check_member_template		(tree);
-extern tree grokfield (const cp_declarator *, cp_decl_specifier_seq *,
-		       tree, bool, tree, tree);
-extern tree grokbitfield (const cp_declarator *, cp_decl_specifier_seq *,
-			  tree, tree);
-extern tree cp_reconstruct_complex_type		(tree, tree);
-extern bool attributes_naming_typedef_ok	(tree);
-extern void cplus_decl_attributes		(tree *, tree, int);
-extern void finish_anon_union			(tree);
-extern void cp_write_global_declarations	(void);
-extern tree coerce_new_type			(tree);
-extern tree coerce_delete_type			(tree);
-extern void comdat_linkage			(tree);
-extern void determine_visibility		(tree);
-extern void constrain_class_visibility		(tree);
-extern void reset_type_linkage			(tree);
-extern void tentative_decl_linkage		(tree);
-extern void import_export_decl			(tree);
-extern tree build_cleanup			(tree);
-extern tree build_offset_ref_call_from_tree	(tree, vec<tree, va_gc> **,
-						 tsubst_flags_t);
-extern bool decl_constant_var_p			(tree);
-extern bool decl_maybe_constant_var_p		(tree);
-extern void no_linkage_error			(tree);
-extern void check_default_args			(tree);
-extern bool mark_used				(tree);
-extern bool mark_used			        (tree, tsubst_flags_t);
-extern void finish_static_data_member_decl	(tree, tree, bool, tree, int);
-extern tree cp_build_parm_decl			(tree, tree);
-extern tree get_guard				(tree);
-extern tree get_guard_cond			(tree);
-extern tree set_guard				(tree);
-extern tree get_tls_wrapper_fn			(tree);
-extern void mark_needed				(tree);
-extern bool decl_needed_p			(tree);
-extern void note_vague_linkage_fn		(tree);
-extern tree build_artificial_parm		(tree, tree);
-extern bool possibly_inlined_p			(tree);
-extern int parm_index                           (tree);
-extern tree vtv_start_verification_constructor_init_function (void);
-extern tree vtv_finish_verification_constructor_init_function (tree);
-extern bool cp_omp_mappable_type		(tree);
-
-/* in error.c */
-extern void init_error				(void);
-extern const char *type_as_string		(tree, int);
-extern const char *type_as_string_translate	(tree, int);
-extern const char *decl_as_string		(tree, int);
-extern const char *decl_as_string_translate	(tree, int);
-extern const char *decl_as_dwarf_string		(tree, int);
-extern const char *expr_as_string		(tree, int);
-extern const char *lang_decl_name		(tree, int, bool);
-extern const char *lang_decl_dwarf_name		(tree, int, bool);
-extern const char *language_to_string		(enum languages);
-extern const char *class_key_or_enum_as_string	(tree);
-extern void print_instantiation_context		(void);
-extern void maybe_warn_variadic_templates       (void);
-extern void maybe_warn_cpp0x			(cpp0x_warn_str str);
-extern bool pedwarn_cxx98                       (location_t, int, const char *, ...) ATTRIBUTE_GCC_DIAG(3,4);
-extern location_t location_of                   (tree);
-extern void qualified_name_lookup_error		(tree, tree, tree,
-						 location_t);
-
-/* in except.c */
-extern void init_exception_processing		(void);
-extern tree expand_start_catch_block		(tree);
-extern void expand_end_catch_block		(void);
-extern tree build_exc_ptr			(void);
-extern tree build_throw				(tree);
-extern int nothrow_libfn_p			(const_tree);
-extern void check_handlers			(tree);
-extern tree finish_noexcept_expr		(tree, tsubst_flags_t);
-extern bool expr_noexcept_p			(tree, tsubst_flags_t);
-extern void perform_deferred_noexcept_checks	(void);
-extern bool nothrow_spec_p			(const_tree);
-extern bool type_noexcept_p			(const_tree);
-extern bool type_throw_all_p			(const_tree);
-extern tree build_noexcept_spec			(tree, int);
-extern void choose_personality_routine		(enum languages);
-extern tree build_must_not_throw_expr		(tree,tree);
-extern tree eh_type_info			(tree);
-extern tree begin_eh_spec_block			(void);
-extern void finish_eh_spec_block		(tree, tree);
-extern tree build_eh_type_type			(tree);
-extern tree cp_protect_cleanup_actions		(void);
-extern tree create_try_catch_expr               (tree, tree);
-
-/* in expr.c */
-extern tree cplus_expand_constant		(tree);
-extern tree mark_rvalue_use			(tree);
-extern tree mark_lvalue_use			(tree);
-extern tree mark_type_use			(tree);
-extern void mark_exp_read			(tree);
-
-/* friend.c */
-extern int is_friend				(tree, tree);
-extern void make_friend_class			(tree, tree, bool);
-extern void add_friend				(tree, tree, bool);
-extern tree do_friend				(tree, tree, tree, tree, enum overload_flags, bool);
-
-/* in init.c */
-extern tree expand_member_init			(tree);
-extern void emit_mem_initializers		(tree);
-extern tree build_aggr_init			(tree, tree, int,
-                                                 tsubst_flags_t);
-extern int is_class_type			(tree, int);
-extern tree get_type_value			(tree);
-extern tree build_zero_init			(tree, tree, bool);
-extern tree build_value_init			(tree, tsubst_flags_t);
-extern tree build_value_init_noctor		(tree, tsubst_flags_t);
-extern tree get_nsdmi				(tree, bool);
-extern tree build_offset_ref			(tree, tree, bool,
-						 tsubst_flags_t);
-extern tree throw_bad_array_new_length		(void);
-extern tree throw_bad_array_length		(void);
-extern tree build_new				(vec<tree, va_gc> **, tree, tree,
-						 vec<tree, va_gc> **, int,
-                                                 tsubst_flags_t);
-extern tree get_temp_regvar			(tree, tree);
-extern tree build_vec_init			(tree, tree, tree, bool, int,
-                                                 tsubst_flags_t);
-extern tree build_delete			(tree, tree,
-						 special_function_kind,
-						 int, int, tsubst_flags_t);
-extern void push_base_cleanups			(void);
-extern tree build_vec_delete			(tree, tree,
-						 special_function_kind, int,
-						 tsubst_flags_t);
-extern tree create_temporary_var		(tree);
-extern void initialize_vtbl_ptrs		(tree);
-extern tree build_java_class_ref		(tree);
-extern tree integral_constant_value		(tree);
-extern tree decl_constant_value_safe	        (tree);
-extern int diagnose_uninitialized_cst_or_ref_member (tree, bool, bool);
-extern tree build_vtbl_address                  (tree);
-
-/* in lex.c */
-extern void cxx_dup_lang_specific_decl		(tree);
-extern void yyungetc				(int, int);
-
-extern tree unqualified_name_lookup_error	(tree);
-extern tree unqualified_fn_lookup_error		(tree);
-extern tree build_lang_decl			(enum tree_code, tree, tree);
-extern tree build_lang_decl_loc			(location_t, enum tree_code, tree, tree);
-extern void retrofit_lang_decl			(tree);
-extern tree copy_decl				(tree);
-extern tree copy_type				(tree);
-extern tree cxx_make_type			(enum tree_code);
-extern tree make_class_type			(enum tree_code);
-extern bool cxx_init				(void);
-extern void cxx_finish				(void);
-extern bool in_main_input_context		(void);
-
-/* in method.c */
-extern void init_method				(void);
-extern tree make_thunk				(tree, bool, tree, tree);
-extern void finish_thunk			(tree);
-extern void use_thunk				(tree, bool);
-extern bool trivial_fn_p			(tree);
-extern bool maybe_explain_implicit_delete	(tree);
-extern void explain_implicit_non_constexpr	(tree);
-extern void deduce_inheriting_ctor		(tree);
-extern void synthesize_method			(tree);
-extern tree lazily_declare_fn			(special_function_kind,
-						 tree);
-extern tree skip_artificial_parms_for		(const_tree, tree);
-extern int num_artificial_parms_for		(const_tree);
-extern tree make_alias_for			(tree, tree);
-extern tree get_copy_ctor			(tree, tsubst_flags_t);
-extern tree get_copy_assign			(tree);
-extern tree get_default_ctor			(tree);
-extern tree get_dtor				(tree, tsubst_flags_t);
-extern tree get_inherited_ctor			(tree);
-extern tree locate_ctor				(tree);
-extern tree implicitly_declare_fn               (special_function_kind, tree,
-						 bool, tree, tree);
-
-/* In optimize.c */
-extern bool maybe_clone_body			(tree);
-
-/* in pt.c */
-extern bool check_template_shadow		(tree);
-extern tree get_innermost_template_args		(tree, int);
-extern void maybe_begin_member_template_processing (tree);
-extern void maybe_end_member_template_processing (void);
-extern tree finish_member_template_decl		(tree);
-extern void begin_template_parm_list		(void);
-extern bool begin_specialization		(void);
-extern void reset_specialization		(void);
-extern void end_specialization			(void);
-extern void begin_explicit_instantiation	(void);
-extern void end_explicit_instantiation		(void);
-extern tree check_explicit_specialization	(tree, tree, int, int);
-extern int num_template_headers_for_class	(tree);
-extern void check_template_variable		(tree);
-extern tree make_auto				(void);
-extern tree make_decltype_auto			(void);
-extern tree do_auto_deduction			(tree, tree, tree);
-extern tree type_uses_auto			(tree);
-extern tree type_uses_auto_or_concept		(tree);
-extern void append_type_to_template_for_access_check (tree, tree, tree,
-						      location_t);
-extern tree convert_generic_types_to_packs	(tree, int, int);
-extern tree splice_late_return_type		(tree, tree);
-extern bool is_auto				(const_tree);
-extern bool is_auto_or_concept			(const_tree);
-extern tree process_template_parm		(tree, location_t, tree, 
-						 bool, bool);
-extern tree end_template_parm_list		(tree);
-extern void end_template_decl			(void);
-extern tree maybe_update_decl_type		(tree, tree);
-extern bool check_default_tmpl_args             (tree, tree, bool, bool, int);
-extern tree push_template_decl			(tree);
-extern tree push_template_decl_real		(tree, bool);
-extern tree add_inherited_template_parms	(tree, tree);
-extern bool redeclare_class_template		(tree, tree);
-extern tree lookup_template_class		(tree, tree, tree, tree,
-						 int, tsubst_flags_t);
-extern tree lookup_template_function		(tree, tree);
-extern int uses_template_parms			(tree);
-extern int uses_template_parms_level		(tree, int);
-extern bool in_template_function		(void);
-extern tree instantiate_class_template		(tree);
-extern tree instantiate_template		(tree, tree, tsubst_flags_t);
-extern tree fn_type_unification			(tree, tree, tree,
-						 const tree *, unsigned int,
-						 tree, unification_kind_t, int,
-						 bool, bool);
-extern void mark_decl_instantiated		(tree, int);
-extern int more_specialized_fn			(tree, tree, int);
-extern void do_decl_instantiation		(tree, tree);
-extern void do_type_instantiation		(tree, tree, tsubst_flags_t);
-extern bool always_instantiate_p		(tree);
-extern void maybe_instantiate_noexcept		(tree);
-extern tree instantiate_decl			(tree, int, bool);
-extern int comp_template_parms			(const_tree, const_tree);
-extern bool uses_parameter_packs                (tree);
-extern bool template_parameter_pack_p           (const_tree);
-extern bool function_parameter_pack_p		(const_tree);
-extern bool function_parameter_expanded_from_pack_p (tree, tree);
-extern tree make_pack_expansion                 (tree);
-extern bool check_for_bare_parameter_packs      (tree);
-extern tree build_template_info			(tree, tree);
-extern tree get_template_info			(const_tree);
-extern vec<qualified_typedef_usage_t, va_gc> *get_types_needing_access_check (tree);
-extern int template_class_depth			(tree);
-extern int is_specialization_of			(tree, tree);
-extern bool is_specialization_of_friend		(tree, tree);
-extern tree get_pattern_parm			(tree, tree);
-extern int comp_template_args			(tree, tree);
-extern tree maybe_process_partial_specialization (tree);
-extern tree most_specialized_instantiation	(tree);
-extern void print_candidates			(tree);
-extern void instantiate_pending_templates	(int);
-extern tree tsubst_default_argument		(tree, tree, tree,
-						 tsubst_flags_t);
-extern tree tsubst (tree, tree, tsubst_flags_t, tree);
-extern tree tsubst_copy_and_build		(tree, tree, tsubst_flags_t,
-						 tree, bool, bool);
-extern tree most_general_template		(tree);
-extern tree get_mostly_instantiated_function_type (tree);
-extern int problematic_instantiation_changed	(void);
-extern void record_last_problematic_instantiation (void);
-extern struct tinst_level *current_instantiation(void);
-extern tree maybe_get_template_decl_from_type_decl (tree);
-extern int processing_template_parmlist;
-extern bool dependent_type_p			(tree);
-extern bool dependent_scope_p			(tree);
-extern bool any_dependent_template_arguments_p  (const_tree);
-extern bool dependent_template_p		(tree);
-extern bool dependent_template_id_p		(tree, tree);
-extern bool type_dependent_expression_p		(tree);
-extern bool any_type_dependent_arguments_p      (const vec<tree, va_gc> *);
-extern bool any_type_dependent_elements_p       (const_tree);
-extern bool type_dependent_expression_p_push	(tree);
-extern bool value_dependent_expression_p	(tree);
-extern bool instantiation_dependent_expression_p (tree);
-extern bool any_value_dependent_elements_p      (const_tree);
-extern bool dependent_omp_for_p			(tree, tree, tree, tree);
-extern tree resolve_typename_type		(tree, bool);
-extern tree template_for_substitution		(tree);
-extern tree build_non_dependent_expr		(tree);
-extern void make_args_non_dependent		(vec<tree, va_gc> *);
-extern bool reregister_specialization		(tree, tree, tree);
-extern tree fold_non_dependent_expr		(tree);
-extern tree fold_non_dependent_expr_sfinae	(tree, tsubst_flags_t);
-extern bool alias_type_or_template_p            (tree);
-extern bool alias_template_specialization_p     (const_tree);
-extern bool explicit_class_specialization_p     (tree);
-extern int push_tinst_level                     (tree);
-extern void pop_tinst_level                     (void);
-extern struct tinst_level *outermost_tinst_level(void);
-extern void init_template_processing		(void);
-extern void print_template_statistics		(void);
-bool template_template_parameter_p		(const_tree);
-bool template_type_parameter_p                  (const_tree);
-extern bool primary_template_instantiation_p    (const_tree);
-extern tree get_primary_template_innermost_parameters	(const_tree);
-extern tree get_template_parms_at_level (tree, int);
-extern tree get_template_innermost_arguments	(const_tree);
-extern tree get_template_argument_pack_elems	(const_tree);
-extern tree get_function_template_decl		(const_tree);
-extern tree resolve_nondeduced_context		(tree);
-extern hashval_t iterative_hash_template_arg (tree arg, hashval_t val);
-
-/* in repo.c */
-extern void init_repo				(void);
-extern int repo_emit_p				(tree);
-extern bool repo_export_class_p			(const_tree);
-extern void finish_repo				(void);
-
-/* in rtti.c */
-/* A vector of all tinfo decls that haven't been emitted yet.  */
-extern GTY(()) vec<tree, va_gc> *unemitted_tinfo_decls;
-
-extern void init_rtti_processing		(void);
-extern tree build_typeid			(tree, tsubst_flags_t);
-extern tree get_tinfo_decl			(tree);
-extern tree get_typeid				(tree, tsubst_flags_t);
-extern tree build_headof			(tree);
-extern tree build_dynamic_cast			(tree, tree, tsubst_flags_t);
-extern void emit_support_tinfos			(void);
-extern bool emit_tinfo_decl			(tree);
-
-/* in search.c */
-extern bool accessible_base_p			(tree, tree, bool);
-extern tree lookup_base                         (tree, tree, base_access,
-						 base_kind *, tsubst_flags_t);
-extern tree dcast_base_hint			(tree, tree);
-extern int accessible_p				(tree, tree, bool);
-extern int accessible_in_template_p		(tree, tree);
-extern tree lookup_field_1			(tree, tree, bool);
-extern tree lookup_field			(tree, tree, int, bool);
-extern int lookup_fnfields_1			(tree, tree);
-extern tree lookup_fnfields_slot		(tree, tree);
-extern tree lookup_fnfields_slot_nolazy		(tree, tree);
-extern int class_method_index_for_fn		(tree, tree);
-extern tree lookup_fnfields			(tree, tree, int);
-extern tree lookup_member			(tree, tree, int, bool,
-						 tsubst_flags_t);
-extern int look_for_overrides			(tree, tree);
-extern void get_pure_virtuals			(tree);
-extern void maybe_suppress_debug_info		(tree);
-extern void note_debug_info_needed		(tree);
-extern void print_search_statistics		(void);
-extern void reinit_search_statistics		(void);
-extern tree current_scope			(void);
-extern int at_function_scope_p			(void);
-extern bool at_class_scope_p			(void);
-extern bool at_namespace_scope_p		(void);
-extern tree context_for_name_lookup		(tree);
-extern tree lookup_conversions			(tree);
-extern tree binfo_from_vbase			(tree);
-extern tree binfo_for_vbase			(tree, tree);
-extern tree look_for_overrides_here		(tree, tree);
-#define dfs_skip_bases ((tree)1)
-extern tree dfs_walk_all (tree, tree (*) (tree, void *),
-			  tree (*) (tree, void *), void *);
-extern tree dfs_walk_once (tree, tree (*) (tree, void *),
-			   tree (*) (tree, void *), void *);
-extern tree binfo_via_virtual			(tree, tree);
-extern tree build_baselink			(tree, tree, tree, tree);
-extern tree adjust_result_of_qualified_name_lookup
-						(tree, tree, tree);
-extern tree copied_binfo			(tree, tree);
-extern tree original_binfo			(tree, tree);
-extern int shared_member_p			(tree);
-
-/* The representation of a deferred access check.  */
-
-typedef struct GTY(()) deferred_access_check {
-  /* The base class in which the declaration is referenced. */
-  tree binfo;
-  /* The declaration whose access must be checked.  */
-  tree decl;
-  /* The declaration that should be used in the error message.  */
-  tree diag_decl;
-  /* The location of this access.  */
-  location_t loc;
-} deferred_access_check;
-
-/* in semantics.c */
-extern void push_deferring_access_checks	(deferring_kind);
-extern void resume_deferring_access_checks	(void);
-extern void stop_deferring_access_checks	(void);
-extern void pop_deferring_access_checks		(void);
-extern vec<deferred_access_check, va_gc> *get_deferred_access_checks (void);
-extern void reopen_deferring_access_checks (vec<deferred_access_check, va_gc> *);
-extern void pop_to_parent_deferring_access_checks (void);
-extern bool perform_access_checks (vec<deferred_access_check, va_gc> *,
-				   tsubst_flags_t);
-extern bool perform_deferred_access_checks	(tsubst_flags_t);
-extern bool perform_or_defer_access_check	(tree, tree, tree,
-						 tsubst_flags_t);
-extern int stmts_are_full_exprs_p		(void);
-extern void init_cp_semantics			(void);
-extern tree do_poplevel				(tree);
-extern void break_maybe_infinite_loop		(void);
-extern void add_decl_expr			(tree);
-extern tree maybe_cleanup_point_expr_void	(tree);
-extern tree finish_expr_stmt			(tree);
-extern tree begin_if_stmt			(void);
-extern void finish_if_stmt_cond			(tree, tree);
-extern tree finish_then_clause			(tree);
-extern void begin_else_clause			(tree);
-extern void finish_else_clause			(tree);
-extern void finish_if_stmt			(tree);
-extern tree begin_while_stmt			(void);
-extern void finish_while_stmt_cond		(tree, tree, bool);
-extern void finish_while_stmt			(tree);
-extern tree begin_do_stmt			(void);
-extern void finish_do_body			(tree);
-extern void finish_do_stmt			(tree, tree, bool);
-extern tree finish_return_stmt			(tree);
-extern tree begin_for_scope			(tree *);
-extern tree begin_for_stmt			(tree, tree);
-extern void finish_for_init_stmt		(tree);
-extern void finish_for_cond			(tree, tree, bool);
-extern void finish_for_expr			(tree, tree);
-extern void finish_for_stmt			(tree);
-extern tree begin_range_for_stmt		(tree, tree);
-extern void finish_range_for_decl		(tree, tree, tree);
-extern void finish_range_for_stmt		(tree);
-extern tree finish_break_stmt			(void);
-extern tree finish_continue_stmt		(void);
-extern tree begin_switch_stmt			(void);
-extern void finish_switch_cond			(tree, tree);
-extern void finish_switch_stmt			(tree);
-extern tree finish_goto_stmt			(tree);
-extern tree begin_try_block			(void);
-extern void finish_try_block			(tree);
-extern void finish_handler_sequence		(tree);
-extern tree begin_function_try_block		(tree *);
-extern void finish_function_try_block		(tree);
-extern void finish_function_handler_sequence    (tree, tree);
-extern void finish_cleanup_try_block		(tree);
-extern tree begin_handler			(void);
-extern void finish_handler_parms		(tree, tree);
-extern void finish_handler			(tree);
-extern void finish_cleanup			(tree, tree);
-extern bool literal_type_p (tree);
-extern tree register_constexpr_fundef (tree, tree);
-extern bool check_constexpr_ctor_body (tree, tree);
-extern tree ensure_literal_type_for_constexpr_object (tree);
-extern bool potential_constant_expression (tree);
-extern bool potential_rvalue_constant_expression (tree);
-extern bool require_potential_constant_expression (tree);
-extern bool require_potential_rvalue_constant_expression (tree);
-extern tree cxx_constant_value (tree);
-extern tree maybe_constant_value (tree);
-extern tree maybe_constant_init (tree);
-extern bool is_sub_constant_expr (tree);
-extern bool reduced_constant_expression_p (tree);
-extern void explain_invalid_constexpr_fn (tree);
-extern vec<tree> cx_error_context (void);
-
-enum {
-  BCS_NO_SCOPE = 1,
-  BCS_TRY_BLOCK = 2,
-  BCS_FN_BODY = 4
-};
-extern tree begin_compound_stmt			(unsigned int);
-
-extern void finish_compound_stmt		(tree);
-extern tree finish_asm_stmt			(int, tree, tree, tree, tree,
-						 tree);
-extern tree finish_label_stmt			(tree);
-extern void finish_label_decl			(tree);
-extern tree finish_parenthesized_expr		(tree);
-extern tree force_paren_expr			(tree);
-extern tree finish_non_static_data_member       (tree, tree, tree);
-extern tree begin_stmt_expr			(void);
-extern tree finish_stmt_expr_expr		(tree, tree);
-extern tree finish_stmt_expr			(tree, bool);
-extern tree stmt_expr_value_expr		(tree);
-bool empty_expr_stmt_p				(tree);
-extern tree perform_koenig_lookup		(tree, vec<tree, va_gc> *,
-						 tsubst_flags_t);
-extern tree finish_call_expr			(tree, vec<tree, va_gc> **, bool,
-						 bool, tsubst_flags_t);
-extern tree finish_increment_expr		(tree, enum tree_code);
-extern tree finish_this_expr			(void);
-extern tree finish_pseudo_destructor_expr       (tree, tree, tree, location_t);
-extern tree finish_unary_op_expr		(location_t, enum tree_code, tree,
-						 tsubst_flags_t);
-extern tree finish_compound_literal		(tree, tree, tsubst_flags_t);
-extern tree finish_fname			(tree);
-extern void finish_translation_unit		(void);
-extern tree finish_template_type_parm		(tree, tree);
-extern tree finish_template_template_parm       (tree, tree);
-extern tree begin_class_definition		(tree);
-extern void finish_template_decl		(tree);
-extern tree finish_template_type		(tree, tree, int);
-extern tree finish_base_specifier		(tree, tree, bool);
-extern void finish_member_declaration		(tree);
-extern tree finish_id_expression		(tree, tree, tree,
-						 cp_id_kind *,
-						 bool, bool, bool *,
-						 bool, bool, bool, bool,
-						 const char **,
-                                                 location_t);
-extern tree finish_typeof			(tree);
-extern tree finish_underlying_type	        (tree);
-extern tree calculate_bases                     (tree);
-extern tree finish_bases                        (tree, bool);
-extern tree calculate_direct_bases              (tree);
-extern tree finish_offsetof			(tree);
-extern void finish_decl_cleanup			(tree, tree);
-extern void finish_eh_cleanup			(tree);
-extern void emit_associated_thunks		(tree);
-extern void finish_mem_initializers		(tree);
-extern tree check_template_template_default_arg (tree);
-extern bool expand_or_defer_fn_1		(tree);
-extern void expand_or_defer_fn			(tree);
-extern void add_typedef_to_current_template_for_access_check (tree, tree,
-							      location_t);
-extern void check_accessibility_of_qualified_id (tree, tree, tree);
-extern tree finish_qualified_id_expr		(tree, tree, bool, bool,
-						 bool, bool, tsubst_flags_t);
-extern void simplify_aggr_init_expr		(tree *);
-extern void finalize_nrv			(tree *, tree, tree);
-extern void note_decl_for_pch			(tree);
-extern tree omp_reduction_id			(enum tree_code, tree, tree);
-extern tree cp_remove_omp_priv_cleanup_stmt	(tree *, int *, void *);
-extern void cp_check_omp_declare_reduction	(tree);
-extern tree finish_omp_clauses			(tree);
-extern void finish_omp_threadprivate		(tree);
-extern tree begin_omp_structured_block		(void);
-extern tree finish_omp_structured_block		(tree);
-extern tree begin_omp_parallel			(void);
-extern tree finish_omp_parallel			(tree, tree);
-extern tree begin_omp_task			(void);
-extern tree finish_omp_task			(tree, tree);
-extern tree finish_omp_for			(location_t, enum tree_code,
-						 tree, tree, tree, tree, tree,
-						 tree, tree);
-extern void finish_omp_atomic			(enum tree_code, enum tree_code,
-						 tree, tree, tree, tree, tree,
-						 bool);
-extern void finish_omp_barrier			(void);
-extern void finish_omp_flush			(void);
-extern void finish_omp_taskwait			(void);
-extern void finish_omp_taskyield		(void);
-extern void finish_omp_cancel			(tree);
-extern void finish_omp_cancellation_point	(tree);
-extern tree begin_transaction_stmt		(location_t, tree *, int);
-extern void finish_transaction_stmt		(tree, tree, int, tree);
-extern tree build_transaction_expr		(location_t, tree, int, tree);
-extern bool cxx_omp_create_clause_info		(tree, tree, bool, bool,
-						 bool, bool);
-extern tree baselink_for_fns                    (tree);
-extern void finish_static_assert                (tree, tree, location_t,
-                                                 bool);
-extern tree finish_decltype_type                (tree, bool, tsubst_flags_t);
-extern tree finish_trait_expr			(enum cp_trait_kind, tree, tree);
-extern tree build_lambda_expr                   (void);
-extern tree build_lambda_object			(tree);
-extern tree begin_lambda_type                   (tree);
-extern tree lambda_capture_field_type		(tree, bool);
-extern tree lambda_return_type			(tree);
-extern tree lambda_proxy_type			(tree);
-extern tree lambda_function			(tree);
-extern void apply_deduced_return_type           (tree, tree);
-extern tree add_capture                         (tree, tree, tree, bool, bool);
-extern tree add_default_capture                 (tree, tree, tree);
-extern tree build_capture_proxy			(tree);
-extern void insert_capture_proxy		(tree);
-extern void insert_pending_capture_proxies	(void);
-extern bool is_capture_proxy			(tree);
-extern bool is_normal_capture_proxy             (tree);
-extern void register_capture_members		(tree);
-extern tree lambda_expr_this_capture            (tree);
-extern tree maybe_resolve_dummy			(tree);
-extern tree nonlambda_method_basetype		(void);
-extern void maybe_add_lambda_conv_op            (tree);
-extern bool is_lambda_ignored_entity            (tree);
-
-/* in tree.c */
-extern int cp_tree_operand_length		(const_tree);
-void cp_free_lang_data 				(tree t);
-extern tree force_target_expr			(tree, tree, tsubst_flags_t);
-extern tree build_target_expr_with_type		(tree, tree, tsubst_flags_t);
-extern void lang_check_failed			(const char *, int,
-						 const char *) ATTRIBUTE_NORETURN;
-extern tree stabilize_expr			(tree, tree *);
-extern void stabilize_call			(tree, tree *);
-extern bool stabilize_init			(tree, tree *);
-extern tree add_stmt_to_compound		(tree, tree);
-extern void init_tree				(void);
-extern bool pod_type_p				(const_tree);
-extern bool layout_pod_type_p			(const_tree);
-extern bool std_layout_type_p			(const_tree);
-extern bool trivial_type_p			(const_tree);
-extern bool trivially_copyable_p		(const_tree);
-extern bool scalarish_type_p			(const_tree);
-extern bool type_has_nontrivial_default_init	(const_tree);
-extern bool type_has_nontrivial_copy_init	(const_tree);
-extern bool class_tmpl_impl_spec_p		(const_tree);
-extern int zero_init_p				(const_tree);
-extern bool check_abi_tag_redeclaration		(const_tree, const_tree, const_tree);
-extern tree strip_typedefs			(tree);
-extern tree strip_typedefs_expr			(tree);
-extern tree copy_binfo				(tree, tree, tree,
-						 tree *, int);
-extern int member_p				(const_tree);
-extern cp_lvalue_kind real_lvalue_p		(const_tree);
-extern cp_lvalue_kind lvalue_kind		(const_tree);
-extern bool lvalue_or_rvalue_with_address_p	(const_tree);
-extern bool xvalue_p	                        (const_tree);
-extern bool builtin_valid_in_constant_expr_p    (const_tree);
-extern tree build_min				(enum tree_code, tree, ...);
-extern tree build_min_nt_loc			(location_t, enum tree_code,
-						 ...);
-extern tree build_min_non_dep			(enum tree_code, tree, ...);
-extern tree build_min_non_dep_call_vec		(tree, tree, vec<tree, va_gc> *);
-extern tree build_cplus_new			(tree, tree, tsubst_flags_t);
-extern tree build_aggr_init_expr		(tree, tree);
-extern tree get_target_expr			(tree);
-extern tree get_target_expr_sfinae		(tree, tsubst_flags_t);
-extern tree build_cplus_array_type		(tree, tree);
-extern tree build_array_of_n_type		(tree, int);
-extern bool array_of_runtime_bound_p		(tree);
-extern tree build_array_copy			(tree);
-extern tree build_vec_init_expr			(tree, tree, tsubst_flags_t);
-extern void diagnose_non_constexpr_vec_init	(tree);
-extern tree hash_tree_cons			(tree, tree, tree);
-extern tree hash_tree_chain			(tree, tree);
-extern tree build_qualified_name		(tree, tree, tree, bool);
-extern tree build_ref_qualified_type		(tree, cp_ref_qualifier);
-extern int is_overloaded_fn			(tree);
-extern tree dependent_name			(tree);
-extern tree get_fns				(tree);
-extern tree get_first_fn			(tree);
-extern tree ovl_cons				(tree, tree);
-extern tree build_overload			(tree, tree);
-extern tree ovl_scope				(tree);
-extern bool non_static_member_function_p        (tree);
-extern const char *cxx_printable_name		(tree, int);
-extern const char *cxx_printable_name_translate	(tree, int);
-extern tree build_exception_variant		(tree, tree);
-extern tree bind_template_template_parm		(tree, tree);
-extern tree array_type_nelts_total		(tree);
-extern tree array_type_nelts_top		(tree);
-extern tree break_out_target_exprs		(tree);
-extern tree get_type_decl			(tree);
-extern tree decl_namespace_context		(tree);
-extern bool decl_anon_ns_mem_p			(const_tree);
-extern tree lvalue_type				(tree);
-extern tree error_type				(tree);
-extern int varargs_function_p			(const_tree);
-extern bool really_overloaded_fn		(tree);
-extern bool cp_tree_equal			(tree, tree);
-extern tree no_linkage_check			(tree, bool);
-extern void debug_binfo				(tree);
-extern tree build_dummy_object			(tree);
-extern tree maybe_dummy_object			(tree, tree *);
-extern int is_dummy_object			(const_tree);
-extern const struct attribute_spec cxx_attribute_table[];
-extern tree make_ptrmem_cst			(tree, tree);
-extern tree cp_build_type_attribute_variant     (tree, tree);
-extern tree cp_build_reference_type		(tree, bool);
-extern tree move				(tree);
-extern tree cp_build_qualified_type_real	(tree, int, tsubst_flags_t);
-#define cp_build_qualified_type(TYPE, QUALS) \
-  cp_build_qualified_type_real ((TYPE), (QUALS), tf_warning_or_error)
-extern bool cv_qualified_p			(const_tree);
-extern tree cv_unqualified			(tree);
-extern special_function_kind special_function_p (const_tree);
-extern int count_trees				(tree);
-extern int char_type_p				(tree);
-extern void verify_stmt_tree			(tree);
-extern linkage_kind decl_linkage		(tree);
-extern duration_kind decl_storage_duration	(tree);
-extern tree cp_walk_subtrees (tree*, int*, walk_tree_fn,
-			      void*, struct pointer_set_t*);
-#define cp_walk_tree(tp,func,data,pset) \
-	walk_tree_1 (tp, func, data, pset, cp_walk_subtrees)
-#define cp_walk_tree_without_duplicates(tp,func,data) \
-	walk_tree_without_duplicates_1 (tp, func, data, cp_walk_subtrees)
-extern tree fold_if_not_in_template		(tree);
-extern tree rvalue				(tree);
-extern tree convert_bitfield_to_declared_type   (tree);
-extern tree cp_save_expr			(tree);
-extern bool cast_valid_in_integral_constant_expression_p (tree);
-extern bool cxx_type_hash_eq			(const_tree, const_tree);
-
-extern void cxx_print_statistics		(void);
-extern bool maybe_warn_zero_as_null_pointer_constant (tree, location_t);
-
-/* in ptree.c */
-extern void cxx_print_xnode			(FILE *, tree, int);
-extern void cxx_print_decl			(FILE *, tree, int);
-extern void cxx_print_type			(FILE *, tree, int);
-extern void cxx_print_identifier		(FILE *, tree, int);
-extern void cxx_print_error_function		(diagnostic_context *,
-						 const char *,
-						 struct diagnostic_info *);
-
-/* in typeck.c */
-extern bool cxx_mark_addressable		(tree);
-extern int string_conv_p			(const_tree, const_tree, int);
-extern tree cp_truthvalue_conversion		(tree);
-extern tree condition_conversion		(tree);
-extern tree require_complete_type		(tree);
-extern tree require_complete_type_sfinae	(tree, tsubst_flags_t);
-extern tree complete_type			(tree);
-extern tree complete_type_or_else		(tree, tree);
-extern tree complete_type_or_maybe_complain	(tree, tree, tsubst_flags_t);
-extern int type_unknown_p			(const_tree);
-enum { ce_derived, ce_normal, ce_exact };
-extern bool comp_except_specs			(const_tree, const_tree, int);
-extern bool comptypes				(tree, tree, int);
-extern bool same_type_ignoring_top_level_qualifiers_p (tree, tree);
-extern bool compparms				(const_tree, const_tree);
-extern int comp_cv_qualification		(const_tree, const_tree);
-extern int comp_cv_qual_signature		(tree, tree);
-extern tree cxx_sizeof_or_alignof_expr		(tree, enum tree_code, bool);
-extern tree cxx_sizeof_or_alignof_type		(tree, enum tree_code, bool);
-extern tree cxx_alignas_expr                    (tree);
-extern tree cxx_sizeof_nowarn                   (tree);
-extern tree is_bitfield_expr_with_lowered_type  (const_tree);
-extern tree unlowered_expr_type                 (const_tree);
-extern tree decay_conversion			(tree, tsubst_flags_t);
-extern tree build_class_member_access_expr      (tree, tree, tree, bool,
-						 tsubst_flags_t);
-extern tree finish_class_member_access_expr     (tree, tree, bool, 
-						 tsubst_flags_t);
-extern tree build_x_indirect_ref		(location_t, tree,
-						 ref_operator, tsubst_flags_t);
-extern tree cp_build_indirect_ref		(tree, ref_operator,
-                                                 tsubst_flags_t);
-extern tree build_array_ref			(location_t, tree, tree);
-extern tree cp_build_array_ref			(location_t, tree, tree,
-						 tsubst_flags_t);
-extern tree get_member_function_from_ptrfunc	(tree *, tree, tsubst_flags_t);
-extern tree cp_build_function_call              (tree, tree, tsubst_flags_t);
-extern tree cp_build_function_call_nary         (tree, tsubst_flags_t, ...)
-						ATTRIBUTE_SENTINEL;
-extern tree cp_build_function_call_vec		(tree, vec<tree, va_gc> **,
-						 tsubst_flags_t);
-extern tree build_x_binary_op			(location_t,
-						 enum tree_code, tree,
-						 enum tree_code, tree,
-						 enum tree_code, tree *,
-						 tsubst_flags_t);
-extern tree build_x_array_ref			(location_t, tree, tree,
-						 tsubst_flags_t);
-extern tree build_x_unary_op			(location_t,
-						 enum tree_code, tree,
-                                                 tsubst_flags_t);
-extern tree cp_build_addr_expr			(tree, tsubst_flags_t);
-extern tree cp_build_addr_expr_strict		(tree, tsubst_flags_t);
-extern tree cp_build_unary_op                   (enum tree_code, tree, int, 
-                                                 tsubst_flags_t);
-extern tree unary_complex_lvalue		(enum tree_code, tree);
-extern tree build_x_conditional_expr		(location_t, tree, tree, tree, 
-                                                 tsubst_flags_t);
-extern tree build_x_compound_expr_from_list	(tree, expr_list_kind,
-						 tsubst_flags_t);
-extern tree build_x_compound_expr_from_vec	(vec<tree, va_gc> *,
-						 const char *, tsubst_flags_t);
-extern tree build_x_compound_expr		(location_t, tree, tree,
-						 tsubst_flags_t);
-extern tree build_compound_expr                 (location_t, tree, tree);
-extern tree cp_build_compound_expr		(tree, tree, tsubst_flags_t);
-extern tree build_static_cast			(tree, tree, tsubst_flags_t);
-extern tree build_reinterpret_cast		(tree, tree, tsubst_flags_t);
-extern tree build_const_cast			(tree, tree, tsubst_flags_t);
-extern tree build_c_cast			(location_t, tree, tree);
-extern tree cp_build_c_cast			(tree, tree, tsubst_flags_t);
-extern tree build_x_modify_expr			(location_t, tree,
-						 enum tree_code, tree,
-						 tsubst_flags_t);
-extern tree cp_build_modify_expr		(tree, enum tree_code, tree,
-						 tsubst_flags_t);
-extern tree convert_for_initialization		(tree, tree, tree, int,
-						 impl_conv_rhs, tree, int,
-                                                 tsubst_flags_t);
-extern int comp_ptr_ttypes			(tree, tree);
-extern bool comp_ptr_ttypes_const		(tree, tree);
-extern bool error_type_p			(const_tree);
-extern bool ptr_reasonably_similar		(const_tree, const_tree);
-extern tree build_ptrmemfunc			(tree, tree, int, bool,
-						 tsubst_flags_t);
-extern int cp_type_quals			(const_tree);
-extern int type_memfn_quals			(const_tree);
-extern cp_ref_qualifier type_memfn_rqual	(const_tree);
-extern tree apply_memfn_quals			(tree, cp_cv_quals, cp_ref_qualifier);
-extern bool cp_has_mutable_p			(const_tree);
-extern bool at_least_as_qualified_p		(const_tree, const_tree);
-extern void cp_apply_type_quals_to_decl		(int, tree);
-extern tree build_ptrmemfunc1			(tree, tree, tree);
-extern void expand_ptrmemfunc_cst		(tree, tree *, tree *);
-extern tree type_after_usual_arithmetic_conversions (tree, tree);
-extern tree common_pointer_type                 (tree, tree);
-extern tree composite_pointer_type		(tree, tree, tree, tree,
-						 composite_pointer_operation, 
-						 tsubst_flags_t);
-extern tree merge_types				(tree, tree);
-extern tree strip_array_domain			(tree);
-extern tree check_return_expr			(tree, bool *);
-extern tree cp_build_binary_op                  (location_t,
-						 enum tree_code, tree, tree,
-						 tsubst_flags_t);
-extern tree build_x_vec_perm_expr               (location_t,
-						 tree, tree, tree,
-						 tsubst_flags_t);
-#define cxx_sizeof(T)  cxx_sizeof_or_alignof_type (T, SIZEOF_EXPR, true)
-extern tree build_simple_component_ref		(tree, tree);
-extern tree build_ptrmemfunc_access_expr	(tree, tree);
-extern tree build_address			(tree);
-extern tree build_typed_address			(tree, tree);
-extern tree build_nop				(tree, tree);
-extern tree non_reference			(tree);
-extern tree lookup_anon_field			(tree, tree);
-extern bool invalid_nonstatic_memfn_p		(tree, tsubst_flags_t);
-extern tree convert_member_func_to_ptr		(tree, tree, tsubst_flags_t);
-extern tree convert_ptrmem			(tree, tree, bool, bool,
-						 tsubst_flags_t);
-extern int lvalue_or_else			(tree, enum lvalue_use,
-                                                 tsubst_flags_t);
-extern void check_template_keyword		(tree);
-extern bool check_raw_literal_operator		(const_tree decl);
-extern bool check_literal_operator_args		(const_tree, bool *, bool *);
-extern void maybe_warn_about_useless_cast       (tree, tree, tsubst_flags_t);
-extern tree cp_perform_integral_promotions      (tree, tsubst_flags_t);
-
-/* in typeck2.c */
-extern void require_complete_eh_spec_types	(tree, tree);
-extern void cxx_incomplete_type_diagnostic	(const_tree, const_tree, diagnostic_t);
-#undef cxx_incomplete_type_error
-extern void cxx_incomplete_type_error		(const_tree, const_tree);
-#define cxx_incomplete_type_error(V,T) \
-  (cxx_incomplete_type_diagnostic ((V), (T), DK_ERROR))
-extern tree error_not_base_type			(tree, tree);
-extern tree binfo_or_else			(tree, tree);
-extern void cxx_readonly_error			(tree, enum lvalue_use);
-extern void complete_type_check_abstract	(tree);
-extern int abstract_virtuals_error		(tree, tree);
-extern int abstract_virtuals_error		(abstract_class_use, tree);
-extern int abstract_virtuals_error_sfinae	(tree, tree, tsubst_flags_t);
-extern int abstract_virtuals_error_sfinae	(abstract_class_use, tree, tsubst_flags_t);
-
-extern tree store_init_value			(tree, tree, vec<tree, va_gc>**, int);
-extern void check_narrowing			(tree, tree);
-extern tree digest_init				(tree, tree, tsubst_flags_t);
-extern tree digest_init_flags			(tree, tree, int);
-extern tree digest_nsdmi_init		        (tree, tree);
-extern tree build_scoped_ref			(tree, tree, tree *);
-extern tree build_x_arrow			(location_t, tree,
-						 tsubst_flags_t);
-extern tree build_m_component_ref		(tree, tree, tsubst_flags_t);
-extern tree build_functional_cast		(tree, tree, tsubst_flags_t);
-extern tree add_exception_specifier		(tree, tree, int);
-extern tree merge_exception_specifiers		(tree, tree, tree);
-
-/* in mangle.c */
-extern void init_mangle				(void);
-extern void mangle_decl				(tree);
-extern const char *mangle_type_string		(tree);
-extern tree mangle_typeinfo_for_type		(tree);
-extern tree mangle_typeinfo_string_for_type	(tree);
-extern tree mangle_vtbl_for_type		(tree);
-extern tree mangle_vtt_for_type			(tree);
-extern tree mangle_ctor_vtbl_for_type		(tree, tree);
-extern tree mangle_thunk			(tree, int, tree, tree);
-extern tree mangle_conv_op_name_for_type	(tree);
-extern tree mangle_guard_variable		(tree);
-extern tree mangle_tls_init_fn			(tree);
-extern tree mangle_tls_wrapper_fn		(tree);
-extern bool decl_tls_wrapper_p			(tree);
-extern tree mangle_ref_init_variable		(tree);
-extern char * get_mangled_vtable_map_var_name   (tree);
-
-/* in dump.c */
-extern bool cp_dump_tree			(void *, tree);
-
-/* In cp/cp-objcp-common.c.  */
-
-extern alias_set_type cxx_get_alias_set		(tree);
-extern bool cxx_warn_unused_global_decl		(const_tree);
-extern size_t cp_tree_size			(enum tree_code);
-extern bool cp_var_mod_type_p			(tree, tree);
-extern void cxx_initialize_diagnostics		(diagnostic_context *);
-extern int cxx_types_compatible_p		(tree, tree);
-extern void init_shadowed_var_for_decl		(void);
-extern bool cxx_block_may_fallthru		(const_tree);
-
-/* in cp-gimplify.c */
-extern int cp_gimplify_expr			(tree *, gimple_seq *,
-						 gimple_seq *);
-extern void cp_genericize			(tree);
-extern bool cxx_omp_const_qual_no_mutable	(tree);
-extern enum omp_clause_default_kind cxx_omp_predetermined_sharing (tree);
-extern tree cxx_omp_clause_default_ctor		(tree, tree, tree);
-extern tree cxx_omp_clause_copy_ctor		(tree, tree, tree);
-extern tree cxx_omp_clause_assign_op		(tree, tree, tree);
-extern tree cxx_omp_clause_dtor			(tree, tree);
-extern void cxx_omp_finish_clause		(tree, gimple_seq *);
-extern bool cxx_omp_privatize_by_reference	(const_tree);
-
-/* in name-lookup.c */
-extern void suggest_alternatives_for            (location_t, tree);
-extern tree strip_using_decl                    (tree);
-
-/* in vtable-class-hierarchy.c */
-extern void vtv_compute_class_hierarchy_transitive_closure (void);
-extern void vtv_generate_init_routine           (void);
-extern void vtv_save_class_info                 (tree);
-extern void vtv_recover_class_info              (void);
-extern void vtv_build_vtable_verify_fndecl      (void);
-
-/* In cp-cilkplus.c.  */
-extern bool cpp_validate_cilk_plus_loop		(tree);
-
-/* In cp/cp-array-notations.c */
-extern tree expand_array_notation_exprs         (tree);
-bool cilkplus_an_triplet_types_ok_p             (location_t, tree, tree, tree,
-						 tree);
-/* In c-family/cilk.c */
-extern bool cilk_valid_spawn                    (tree);
-
-/* -- end of C++ */
-
-#endif /* ! GCC_CP_TREE_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cp/cxx-pretty-print.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cp/cxx-pretty-print.h
deleted file mode 100644
index 2dc3f95..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cp/cxx-pretty-print.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/* Interface for the GNU C++ pretty-printer.
-   Copyright (C) 2003-2014 Free Software Foundation, Inc.
-   Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_CXX_PRETTY_PRINT_H
-#define GCC_CXX_PRETTY_PRINT_H
-
-#include "c-family/c-pretty-print.h"
-
-enum cxx_pretty_printer_flags
-{
-  /* Ask for a qualified-id.  */
-  pp_cxx_flag_default_argument = 1 << pp_c_flag_last_bit
-};
-
-struct cxx_pretty_printer : c_pretty_printer
-{
-  cxx_pretty_printer ();
-
-  void constant (tree);
-  void id_expression (tree);
-  void primary_expression (tree);
-  void postfix_expression (tree);
-  void unary_expression (tree);
-  void multiplicative_expression (tree);
-  void conditional_expression (tree);
-  void assignment_expression (tree);
-  void expression (tree);
-  void type_id (tree);
-  void statement (tree);
-  void declaration (tree);
-  void declaration_specifiers (tree);
-  void simple_type_specifier (tree);
-  void function_specifier (tree);
-  void declarator (tree);
-  void direct_declarator (tree);
-  void abstract_declarator (tree);
-  void direct_abstract_declarator (tree);
-
-  /* This is the enclosing scope of the entity being pretty-printed.  */
-  tree enclosing_scope;
-};
-
-#define pp_cxx_cv_qualifier_seq(PP, T)   \
-   pp_c_type_qualifier_list (PP, T)
-#define pp_cxx_cv_qualifiers(PP, CV)   \
-   pp_c_cv_qualifiers (PP, CV, false)
-
-#define pp_cxx_whitespace(PP)		pp_c_whitespace (PP)
-#define pp_cxx_left_paren(PP)		pp_c_left_paren (PP)
-#define pp_cxx_right_paren(PP)		pp_c_right_paren (PP)
-#define pp_cxx_left_brace(PP)		pp_c_left_brace (PP)
-#define pp_cxx_right_brace(PP)		pp_c_right_brace (PP)
-#define pp_cxx_left_bracket(PP)		pp_c_left_bracket (PP)
-#define pp_cxx_right_bracket(PP)	pp_c_right_bracket (PP)
-#define pp_cxx_dot(PP)			pp_c_dot (PP)
-#define pp_cxx_ampersand(PP)		pp_c_ampersand (PP)
-#define pp_cxx_star(PP)			pp_c_star (PP)
-#define pp_cxx_arrow(PP)		pp_c_arrow (PP)
-#define pp_cxx_semicolon(PP)		pp_c_semicolon (PP)
-#define pp_cxx_complement(PP)		pp_c_complement (PP)
-
-#define pp_cxx_ws_string(PP, I)		pp_c_ws_string (PP, I)
-#define pp_cxx_identifier(PP, I)	pp_c_identifier (PP, I)
-#define pp_cxx_tree_identifier(PP, T) \
-  pp_c_tree_identifier (PP, T)
-
-void pp_cxx_begin_template_argument_list (cxx_pretty_printer *);
-void pp_cxx_end_template_argument_list (cxx_pretty_printer *);
-void pp_cxx_colon_colon (cxx_pretty_printer *);
-void pp_cxx_separate_with (cxx_pretty_printer *, int);
-
-void pp_cxx_canonical_template_parameter (cxx_pretty_printer *, tree);
-void pp_cxx_trait_expression (cxx_pretty_printer *, tree);
-void pp_cxx_va_arg_expression (cxx_pretty_printer *, tree);
-void pp_cxx_offsetof_expression (cxx_pretty_printer *, tree);
-void pp_cxx_userdef_literal (cxx_pretty_printer *, tree);
-
-
-#endif /* GCC_CXX_PRETTY_PRINT_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cp/name-lookup.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cp/name-lookup.h
deleted file mode 100644
index 40e0338..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cp/name-lookup.h
+++ /dev/null
@@ -1,377 +0,0 @@
-/* Declarations for C++ name lookup routines.
-   Copyright (C) 2003-2014 Free Software Foundation, Inc.
-   Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_CP_NAME_LOOKUP_H
-#define GCC_CP_NAME_LOOKUP_H
-
-#include "c-family/c-common.h"
-
-/* The type of dictionary used to map names to types declared at
-   a given scope.  */
-typedef struct binding_table_s *binding_table;
-typedef struct binding_entry_s *binding_entry;
-
-/* The type of a routine repeatedly called by binding_table_foreach.  */
-typedef void (*bt_foreach_proc) (binding_entry, void *);
-
-struct GTY(()) binding_entry_s {
-  binding_entry chain;
-  tree name;
-  tree type;
-};
-
-/* These macros indicate the initial chains count for binding_table.  */
-#define SCOPE_DEFAULT_HT_SIZE		(1 << 3)
-#define CLASS_SCOPE_HT_SIZE		(1 << 3)
-#define NAMESPACE_ORDINARY_HT_SIZE	(1 << 5)
-#define NAMESPACE_STD_HT_SIZE		(1 << 8)
-#define GLOBAL_SCOPE_HT_SIZE		(1 << 8)
-
-extern void binding_table_foreach (binding_table, bt_foreach_proc, void *);
-extern binding_entry binding_table_find (binding_table, tree);
-
-/* Datatype that represents binding established by a declaration between
-   a name and a C++ entity.  */
-typedef struct cxx_binding cxx_binding;
-
-/* The datatype used to implement C++ scope.  */
-typedef struct cp_binding_level cp_binding_level;
-
-/* Nonzero if this binding is for a local scope, as opposed to a class
-   or namespace scope.  */
-#define LOCAL_BINDING_P(NODE) ((NODE)->is_local)
-
-/* True if NODE->value is from a base class of the class which is
-   currently being defined.  */
-#define INHERITED_VALUE_BINDING_P(NODE) ((NODE)->value_is_inherited)
-
-struct GTY(()) cxx_binding {
-  /* Link to chain together various bindings for this name.  */
-  cxx_binding *previous;
-  /* The non-type entity this name is bound to.  */
-  tree value;
-  /* The type entity this name is bound to.  */
-  tree type;
-  /* The scope at which this binding was made.  */
-  cp_binding_level *scope;
-  unsigned value_is_inherited : 1;
-  unsigned is_local : 1;
-};
-
-/* Datatype used to temporarily save C++ bindings (for implicit
-   instantiations purposes and like).  Implemented in decl.c.  */
-typedef struct GTY(()) cxx_saved_binding {
-  /* The name of the current binding.  */
-  tree identifier;
-  /* The binding we're saving.  */
-  cxx_binding *binding;
-  tree real_type_value;
-} cxx_saved_binding;
-
-
-extern tree identifier_type_value (tree);
-extern void set_identifier_type_value (tree, tree);
-extern void pop_binding (tree, tree);
-extern void pop_bindings_and_leave_scope (void);
-extern tree constructor_name (tree);
-extern bool constructor_name_p (tree, tree);
-
-/* The kinds of scopes we recognize.  */
-typedef enum scope_kind {
-  sk_block = 0,      /* An ordinary block scope.  This enumerator must
-			have the value zero because "cp_binding_level"
-			is initialized by using "memset" to set the
-			contents to zero, and the default scope kind
-			is "sk_block".  */
-  sk_cleanup,	     /* A scope for (pseudo-)scope for cleanup.  It is
-			pseudo in that it is transparent to name lookup
-			activities.  */
-  sk_try,	     /* A try-block.  */
-  sk_catch,	     /* A catch-block.  */
-  sk_for,	     /* The scope of the variable declared in a
-			for-init-statement.  */
-  sk_cond,	     /* The scope of the variable declared in the condition
-			of an if or switch statement.  */
-  sk_function_parms, /* The scope containing function parameters.  */
-  sk_class,	     /* The scope containing the members of a class.  */
-  sk_scoped_enum,    /* The scope containing the enumertors of a C++0x
-                        scoped enumeration.  */
-  sk_namespace,	     /* The scope containing the members of a
-			namespace, including the global scope.  */
-  sk_template_parms, /* A scope for template parameters.  */
-  sk_template_spec,  /* Like sk_template_parms, but for an explicit
-			specialization.  Since, by definition, an
-			explicit specialization is introduced by
-			"template <>", this scope is always empty.  */
-  sk_omp	     /* An OpenMP structured block.  */
-} scope_kind;
-
-/* The scope where the class/struct/union/enum tag applies.  */
-typedef enum tag_scope {
-  ts_current = 0,	/* Current scope only.  This is for the
-			     class-key identifier;
-			   case mentioned in [basic.lookup.elab]/2,
-			   or the class/enum definition
-			     class-key identifier { ... };  */
-  ts_global = 1,	/* All scopes.  This is the 3.4.1
-			   [basic.lookup.unqual] lookup mentioned
-			   in [basic.lookup.elab]/2.  */
-  ts_within_enclosing_non_class = 2,	/* Search within enclosing non-class
-					   only, for friend class lookup
-					   according to [namespace.memdef]/3
-					   and [class.friend]/9.  */
-  ts_lambda = 3			/* Declaring a lambda closure.  */
-} tag_scope;
-
-typedef struct GTY(()) cp_class_binding {
-  cxx_binding *base;
-  /* The bound name.  */
-  tree identifier;
-} cp_class_binding;
-
-
-typedef struct GTY(()) cp_label_binding {
-  /* The bound LABEL_DECL.  */
-  tree label;
-  /* The previous IDENTIFIER_LABEL_VALUE.  */
-  tree prev_value;
-} cp_label_binding;
-
-
-/* For each binding contour we allocate a binding_level structure
-   which records the names defined in that contour.
-   Contours include:
-    0) the global one
-    1) one for each function definition,
-       where internal declarations of the parameters appear.
-    2) one for each compound statement,
-       to record its declarations.
-
-   The current meaning of a name can be found by searching the levels
-   from the current one out to the global one.
-
-   Off to the side, may be the class_binding_level.  This exists only
-   to catch class-local declarations.  It is otherwise nonexistent.
-
-   Also there may be binding levels that catch cleanups that must be
-   run when exceptions occur.  Thus, to see whether a name is bound in
-   the current scope, it is not enough to look in the
-   CURRENT_BINDING_LEVEL.  You should use lookup_name_current_level
-   instead.  */
-
-/* Note that the information in the `names' component of the global contour
-   is duplicated in the IDENTIFIER_GLOBAL_VALUEs of all identifiers.  */
-
-struct GTY(()) cp_binding_level {
-  /* A chain of _DECL nodes for all variables, constants, functions,
-      and typedef types.  These are in the reverse of the order
-      supplied.  There may be OVERLOADs on this list, too, but they
-      are wrapped in TREE_LISTs; the TREE_VALUE is the OVERLOAD.  */
-  tree names;
-
-  /* A chain of NAMESPACE_DECL nodes.  */
-  tree namespaces;
-
-  /* An array of static functions and variables (for namespaces only) */
-  vec<tree, va_gc> *static_decls;
-
-  /* A list of USING_DECL nodes.  */
-  tree usings;
-
-  /* A list of used namespaces. PURPOSE is the namespace,
-      VALUE the common ancestor with this binding_level's namespace.  */
-  tree using_directives;
-
-  /* For the binding level corresponding to a class, the entities
-      declared in the class or its base classes.  */
-  vec<cp_class_binding, va_gc> *class_shadowed;
-
-  /* Similar to class_shadowed, but for IDENTIFIER_TYPE_VALUE, and
-      is used for all binding levels. The TREE_PURPOSE is the name of
-      the entity, the TREE_TYPE is the associated type.  In addition
-      the TREE_VALUE is the IDENTIFIER_TYPE_VALUE before we entered
-      the class.  */
-  tree type_shadowed;
-
-  /* Similar to class_shadowed, but for IDENTIFIER_LABEL_VALUE, and
-      used for all binding levels.  */
-  vec<cp_label_binding, va_gc> *shadowed_labels;
-
-  /* For each level (except not the global one),
-      a chain of BLOCK nodes for all the levels
-      that were entered and exited one level down.  */
-  tree blocks;
-
-  /* The entity (namespace, class, function) the scope of which this
-      binding contour corresponds to.  Otherwise NULL.  */
-  tree this_entity;
-
-  /* The binding level which this one is contained in (inherits from).  */
-  cp_binding_level *level_chain;
-
-  /* List of VAR_DECLS saved from a previous for statement.
-      These would be dead in ISO-conforming code, but might
-      be referenced in ARM-era code.  */
-  vec<tree, va_gc> *dead_vars_from_for;
-
-  /* STATEMENT_LIST for statements in this binding contour.
-      Only used at present for SK_CLEANUP temporary bindings.  */
-  tree statement_list;
-
-  /* Binding depth at which this level began.  */
-  int binding_depth;
-
-  /* The kind of scope that this object represents.  However, a
-      SK_TEMPLATE_SPEC scope is represented with KIND set to
-      SK_TEMPLATE_PARMS and EXPLICIT_SPEC_P set to true.  */
-  ENUM_BITFIELD (scope_kind) kind : 4;
-
-  /* True if this scope is an SK_TEMPLATE_SPEC scope.  This field is
-      only valid if KIND == SK_TEMPLATE_PARMS.  */
-  BOOL_BITFIELD explicit_spec_p : 1;
-
-  /* true means make a BLOCK for this level regardless of all else.  */
-  unsigned keep : 1;
-
-  /* Nonzero if this level can safely have additional
-      cleanup-needing variables added to it.  */
-  unsigned more_cleanups_ok : 1;
-  unsigned have_cleanups : 1;
-
-  /* Transient state set if this scope is of sk_class kind
-     and is in the process of defining 'this_entity'.  Reset
-     on leaving the class definition to allow for the scope
-     to be subsequently re-used as a non-defining scope for
-     'this_entity'.  */
-  unsigned defining_class_p : 1;
-
-  /* 23 bits left to fill a 32-bit word.  */
-};
-
-/* The binding level currently in effect.  */
-
-#define current_binding_level			\
-  (*(cfun && cp_function_chain && cp_function_chain->bindings \
-   ? &cp_function_chain->bindings		\
-   : &scope_chain->bindings))
-
-/* The binding level of the current class, if any.  */
-
-#define class_binding_level scope_chain->class_bindings
-
-/* The tree node representing the global scope.  */
-extern GTY(()) tree global_namespace;
-extern GTY(()) tree global_scope_name;
-
-/* Indicates that there is a type value in some namespace, although
-   that is not necessarily in scope at the moment.  */
-
-extern GTY(()) tree global_type_node;
-
-/* True if SCOPE designates the global scope binding contour.  */
-#define global_scope_p(SCOPE) \
-  ((SCOPE) == NAMESPACE_LEVEL (global_namespace))
-
-extern cp_binding_level *leave_scope (void);
-extern bool kept_level_p (void);
-extern bool global_bindings_p (void);
-extern bool toplevel_bindings_p	(void);
-extern bool namespace_bindings_p (void);
-extern bool local_bindings_p (void);
-extern bool template_parm_scope_p (void);
-extern scope_kind innermost_scope_kind (void);
-extern cp_binding_level *begin_scope (scope_kind, tree);
-extern void print_binding_stack	(void);
-extern void push_to_top_level (void);
-extern void pop_from_top_level (void);
-extern void pop_everything (void);
-extern void keep_next_level (bool);
-extern bool is_ancestor (tree, tree);
-extern tree push_scope (tree);
-extern void pop_scope (tree);
-extern tree push_inner_scope (tree);
-extern void pop_inner_scope (tree, tree);
-extern void push_binding_level (cp_binding_level *);
-
-extern void push_namespace (tree);
-extern void pop_namespace (void);
-extern void push_nested_namespace (tree);
-extern void pop_nested_namespace (tree);
-extern bool handle_namespace_attrs (tree, tree);
-extern void pushlevel_class (void);
-extern void poplevel_class (void);
-extern tree pushdecl_with_scope (tree, cp_binding_level *, bool);
-extern tree lookup_name_prefer_type (tree, int);
-extern tree lookup_name_real (tree, int, int, bool, int, int);
-extern tree lookup_type_scope (tree, tag_scope);
-extern tree namespace_binding (tree, tree);
-extern void set_namespace_binding (tree, tree, tree);
-extern bool hidden_name_p (tree);
-extern tree remove_hidden_names (tree);
-extern tree lookup_qualified_name (tree, tree, bool, bool);
-extern tree lookup_name_nonclass (tree);
-extern tree lookup_name_innermost_nonclass_level (tree);
-extern bool is_local_extern (tree);
-extern tree lookup_function_nonclass (tree, vec<tree, va_gc> *, bool);
-extern void push_local_binding (tree, tree, int);
-extern bool pushdecl_class_level (tree);
-extern tree pushdecl_namespace_level (tree, bool);
-extern bool push_class_level_binding (tree, tree);
-extern tree getdecls (void);
-extern int function_parm_depth (void);
-extern tree cp_namespace_decls (tree);
-extern void set_decl_namespace (tree, tree, bool);
-extern void push_decl_namespace (tree);
-extern void pop_decl_namespace (void);
-extern void do_namespace_alias (tree, tree);
-extern void do_toplevel_using_decl (tree, tree, tree);
-extern void do_local_using_decl (tree, tree, tree);
-extern tree do_class_using_decl (tree, tree);
-extern void do_using_directive (tree);
-extern tree lookup_arg_dependent (tree, tree, vec<tree, va_gc> *);
-extern bool is_associated_namespace (tree, tree);
-extern void parse_using_directive (tree, tree);
-extern tree innermost_non_namespace_value (tree);
-extern cxx_binding *outer_binding (tree, cxx_binding *, bool);
-extern void cp_emit_debug_info_for_using (tree, tree);
-
-/* Set *DECL to the (non-hidden) declaration for ID at global scope,
-   if present and return true; otherwise return false.  */
-
-inline bool
-get_global_value_if_present (tree id, tree *decl)
-{
-  tree global_value = namespace_binding (id, global_namespace);
-  if (global_value)
-    *decl = global_value;
-  return global_value != NULL;
-}
-
-/* True is the binding of IDENTIFIER at global scope names a type.  */
-
-inline bool
-is_typename_at_global_scope (tree id)
-{
-  tree global_value = namespace_binding (id, global_namespace);
-
-  return global_value && TREE_CODE (global_value) == TYPE_DECL;
-}
-
-#endif /* GCC_CP_NAME_LOOKUP_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cp/type-utils.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cp/type-utils.h
deleted file mode 100644
index 6f115b1..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cp/type-utils.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Utilities for querying and manipulating type trees.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_CP_TYPE_UTILS_H
-#define GCC_CP_TYPE_UTILS_H
-
-/* Returns the first tree within T that is directly matched by PRED.  T may be a
-   type or PARM_DECL and is incrementally decomposed toward its type-specifier
-   until a match is found.  NULL_TREE is returned if PRED does not match any
-   part of T.
-
-   This is primarily intended for detecting whether T uses `auto' or a concept
-   identifier.  Since either of these can only appear as a type-specifier for
-   the declaration in question, only top-level qualifications are traversed;
-   find_type_usage does not look through the whole type.  */
-
-inline tree
-find_type_usage (tree t, bool (*pred) (const_tree))
-{
-  enum tree_code code;
-  if (pred (t))
-    return t;
-
-  code = TREE_CODE (t);
-
-  if (code == POINTER_TYPE || code == REFERENCE_TYPE
-      || code == PARM_DECL || code == OFFSET_TYPE
-      || code == FUNCTION_TYPE || code == METHOD_TYPE
-      || code == ARRAY_TYPE)
-    return find_type_usage (TREE_TYPE (t), pred);
-
-  if (TYPE_PTRMEMFUNC_P (t))
-    return find_type_usage
-      (TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (t)), pred);
-
-  return NULL_TREE;
-}
-
-#endif // GCC_CP_TYPE_UTILS_H
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cppdefault.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cppdefault.h
deleted file mode 100644
index 30b6fed..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cppdefault.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* CPP Library.
-   Copyright (C) 1986-2014 Free Software Foundation, Inc.
-   Contributed by Per Bothner, 1994-95.
-   Based on CCCP program by Paul Rubin, June 1986
-   Adapted to ANSI C, Richard Stallman, Jan 1987
-
-   This program is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 3, 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; see the file COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_CPPDEFAULT_H
-#define GCC_CPPDEFAULT_H
-
-/* This is the default list of directories to search for include files.
-   It may be overridden by the various -I and -ixxx options.
-
-   #include "file" looks in the same directory as the current file,
-   then this list.
-   #include <file> just looks in this list.
-
-   All these directories are treated as `system' include directories
-   (they are not subject to pedantic warnings in some cases).  */
-
-struct default_include
-{
-  const char *const fname;	/* The name of the directory.  */
-  const char *const component;	/* The component containing the directory
-				   (see update_path in prefix.c) */
-  const char cplusplus;		/* Only look here if we're compiling C++.  */
-  const char cxx_aware;		/* Includes in this directory don't need to
-				   be wrapped in extern "C" when compiling
-				   C++.  */
-  const char add_sysroot;	/* FNAME should be prefixed by
-				   cpp_SYSROOT.  */
-  const char multilib;		/* FNAME should have appended
-				   - the multilib path specified with -imultilib
-				     when set to 1,
-				   - the multiarch path specified with
-				     -imultiarch, when set to 2.  */
-};
-
-extern const struct default_include cpp_include_defaults[];
-extern const char cpp_GCC_INCLUDE_DIR[];
-extern const size_t cpp_GCC_INCLUDE_DIR_len;
-
-/* The configure-time prefix, i.e., the value supplied as the argument
-   to --prefix=.  */
-extern const char cpp_PREFIX[];
-/* The length of the configure-time prefix.  */
-extern const size_t cpp_PREFIX_len;
-/* The configure-time execution prefix.  This is typically the lib/gcc
-   subdirectory of cpp_PREFIX.  */
-extern const char cpp_EXEC_PREFIX[];
-/* The run-time execution prefix.  This is typically the lib/gcc
-   subdirectory of the actual installation.  */
-extern const char *gcc_exec_prefix;
-
-/* Return true if the toolchain is relocated.  */
-bool cpp_relocated (void);
-
-#endif /* ! GCC_CPPDEFAULT_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cpplib.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cpplib.h
deleted file mode 100644
index a9db7ab..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/cpplib.h
+++ /dev/null
@@ -1,1074 +0,0 @@
-/* Definitions for CPP library.
-   Copyright (C) 1995-2014 Free Software Foundation, Inc.
-   Written by Per Bothner, 1994-95.
-
-This program is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3, 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.
-
- In other words, you are welcome to use, share and improve this program.
- You are forbidden to forbid anyone else to use, share and improve
- what you give them.   Help stamp out software-hoarding!  */
-#ifndef LIBCPP_CPPLIB_H
-#define LIBCPP_CPPLIB_H
-
-#include <sys/types.h>
-#include "symtab.h"
-#include "line-map.h"
-
-typedef struct cpp_reader cpp_reader;
-typedef struct cpp_buffer cpp_buffer;
-typedef struct cpp_options cpp_options;
-typedef struct cpp_token cpp_token;
-typedef struct cpp_string cpp_string;
-typedef struct cpp_hashnode cpp_hashnode;
-typedef struct cpp_macro cpp_macro;
-typedef struct cpp_callbacks cpp_callbacks;
-typedef struct cpp_dir cpp_dir;
-
-struct answer;
-struct _cpp_file;
-
-/* The first three groups, apart from '=', can appear in preprocessor
-   expressions (+= and -= are used to indicate unary + and - resp.).
-   This allows a lookup table to be implemented in _cpp_parse_expr.
-
-   The first group, to CPP_LAST_EQ, can be immediately followed by an
-   '='.  The lexer needs operators ending in '=', like ">>=", to be in
-   the same order as their counterparts without the '=', like ">>".
-
-   See the cpp_operator table optab in expr.c if you change the order or
-   add or remove anything in the first group.  */
-
-#define TTYPE_TABLE							\
-  OP(EQ,		"=")						\
-  OP(NOT,		"!")						\
-  OP(GREATER,		">")	/* compare */				\
-  OP(LESS,		"<")						\
-  OP(PLUS,		"+")	/* math */				\
-  OP(MINUS,		"-")						\
-  OP(MULT,		"*")						\
-  OP(DIV,		"/")						\
-  OP(MOD,		"%")						\
-  OP(AND,		"&")	/* bit ops */				\
-  OP(OR,		"|")						\
-  OP(XOR,		"^")						\
-  OP(RSHIFT,		">>")						\
-  OP(LSHIFT,		"<<")						\
-									\
-  OP(COMPL,		"~")						\
-  OP(AND_AND,		"&&")	/* logical */				\
-  OP(OR_OR,		"||")						\
-  OP(QUERY,		"?")						\
-  OP(COLON,		":")						\
-  OP(COMMA,		",")	/* grouping */				\
-  OP(OPEN_PAREN,	"(")						\
-  OP(CLOSE_PAREN,	")")						\
-  TK(EOF,		NONE)						\
-  OP(EQ_EQ,		"==")	/* compare */				\
-  OP(NOT_EQ,		"!=")						\
-  OP(GREATER_EQ,	">=")						\
-  OP(LESS_EQ,		"<=")						\
-									\
-  /* These two are unary + / - in preprocessor expressions.  */		\
-  OP(PLUS_EQ,		"+=")	/* math */				\
-  OP(MINUS_EQ,		"-=")						\
-									\
-  OP(MULT_EQ,		"*=")						\
-  OP(DIV_EQ,		"/=")						\
-  OP(MOD_EQ,		"%=")						\
-  OP(AND_EQ,		"&=")	/* bit ops */				\
-  OP(OR_EQ,		"|=")						\
-  OP(XOR_EQ,		"^=")						\
-  OP(RSHIFT_EQ,		">>=")						\
-  OP(LSHIFT_EQ,		"<<=")						\
-  /* Digraphs together, beginning with CPP_FIRST_DIGRAPH.  */		\
-  OP(HASH,		"#")	/* digraphs */				\
-  OP(PASTE,		"##")						\
-  OP(OPEN_SQUARE,	"[")						\
-  OP(CLOSE_SQUARE,	"]")						\
-  OP(OPEN_BRACE,	"{")						\
-  OP(CLOSE_BRACE,	"}")						\
-  /* The remainder of the punctuation.	Order is not significant.  */	\
-  OP(SEMICOLON,		";")	/* structure */				\
-  OP(ELLIPSIS,		"...")						\
-  OP(PLUS_PLUS,		"++")	/* increment */				\
-  OP(MINUS_MINUS,	"--")						\
-  OP(DEREF,		"->")	/* accessors */				\
-  OP(DOT,		".")						\
-  OP(SCOPE,		"::")						\
-  OP(DEREF_STAR,	"->*")						\
-  OP(DOT_STAR,		".*")						\
-  OP(ATSIGN,		"@")  /* used in Objective-C */			\
-									\
-  TK(NAME,		IDENT)	 /* word */				\
-  TK(AT_NAME,		IDENT)	 /* @word - Objective-C */		\
-  TK(NUMBER,		LITERAL) /* 34_be+ta  */			\
-									\
-  TK(CHAR,		LITERAL) /* 'char' */				\
-  TK(WCHAR,		LITERAL) /* L'char' */				\
-  TK(CHAR16,		LITERAL) /* u'char' */				\
-  TK(CHAR32,		LITERAL) /* U'char' */				\
-  TK(OTHER,		LITERAL) /* stray punctuation */		\
-									\
-  TK(STRING,		LITERAL) /* "string" */				\
-  TK(WSTRING,		LITERAL) /* L"string" */			\
-  TK(STRING16,		LITERAL) /* u"string" */			\
-  TK(STRING32,		LITERAL) /* U"string" */			\
-  TK(UTF8STRING,	LITERAL) /* u8"string" */			\
-  TK(OBJC_STRING,	LITERAL) /* @"string" - Objective-C */		\
-  TK(HEADER_NAME,	LITERAL) /* <stdio.h> in #include */		\
-									\
-  TK(CHAR_USERDEF,	LITERAL) /* 'char'_suffix - C++-0x */		\
-  TK(WCHAR_USERDEF,	LITERAL) /* L'char'_suffix - C++-0x */		\
-  TK(CHAR16_USERDEF,	LITERAL) /* u'char'_suffix - C++-0x */		\
-  TK(CHAR32_USERDEF,	LITERAL) /* U'char'_suffix - C++-0x */		\
-  TK(STRING_USERDEF,	LITERAL) /* "string"_suffix - C++-0x */		\
-  TK(WSTRING_USERDEF,	LITERAL) /* L"string"_suffix - C++-0x */	\
-  TK(STRING16_USERDEF,	LITERAL) /* u"string"_suffix - C++-0x */	\
-  TK(STRING32_USERDEF,	LITERAL) /* U"string"_suffix - C++-0x */	\
-  TK(UTF8STRING_USERDEF,LITERAL) /* u8"string"_suffix - C++-0x */	\
-									\
-  TK(COMMENT,		LITERAL) /* Only if output comments.  */	\
-				 /* SPELL_LITERAL happens to DTRT.  */	\
-  TK(MACRO_ARG,		NONE)	 /* Macro argument.  */			\
-  TK(PRAGMA,		NONE)	 /* Only for deferred pragmas.  */	\
-  TK(PRAGMA_EOL,	NONE)	 /* End-of-line for deferred pragmas.  */ \
-  TK(PADDING,		NONE)	 /* Whitespace for -E.	*/
-
-#define OP(e, s) CPP_ ## e,
-#define TK(e, s) CPP_ ## e,
-enum cpp_ttype
-{
-  TTYPE_TABLE
-  N_TTYPES,
-
-  /* Positions in the table.  */
-  CPP_LAST_EQ        = CPP_LSHIFT,
-  CPP_FIRST_DIGRAPH  = CPP_HASH,
-  CPP_LAST_PUNCTUATOR= CPP_ATSIGN,
-  CPP_LAST_CPP_OP    = CPP_LESS_EQ
-};
-#undef OP
-#undef TK
-
-/* C language kind, used when calling cpp_create_reader.  */
-enum c_lang {CLK_GNUC89 = 0, CLK_GNUC99, CLK_GNUC11,
-	     CLK_STDC89, CLK_STDC94, CLK_STDC99, CLK_STDC11,
-	     CLK_GNUCXX, CLK_CXX98, CLK_GNUCXX11, CLK_CXX11,
-	     CLK_GNUCXX1Y, CLK_CXX1Y, CLK_ASM};
-
-/* Payload of a NUMBER, STRING, CHAR or COMMENT token.  */
-struct GTY(()) cpp_string {
-  unsigned int len;
-  const unsigned char *text;
-};
-
-/* Flags for the cpp_token structure.  */
-#define PREV_WHITE	(1 << 0) /* If whitespace before this token.  */
-#define DIGRAPH		(1 << 1) /* If it was a digraph.  */
-#define STRINGIFY_ARG	(1 << 2) /* If macro argument to be stringified.  */
-#define PASTE_LEFT	(1 << 3) /* If on LHS of a ## operator.  */
-#define NAMED_OP	(1 << 4) /* C++ named operators.  */
-#define NO_EXPAND	(1 << 5) /* Do not macro-expand this token.  */
-#define BOL		(1 << 6) /* Token at beginning of line.  */
-#define PURE_ZERO	(1 << 7) /* Single 0 digit, used by the C++ frontend,
-				    set in c-lex.c.  */
-#define SP_DIGRAPH	(1 << 8) /* # or ## token was a digraph.  */
-#define SP_PREV_WHITE	(1 << 9) /* If whitespace before a ##
-				    operator, or before this token
-				    after a # operator.  */
-
-/* Specify which field, if any, of the cpp_token union is used.  */
-
-enum cpp_token_fld_kind {
-  CPP_TOKEN_FLD_NODE,
-  CPP_TOKEN_FLD_SOURCE,
-  CPP_TOKEN_FLD_STR,
-  CPP_TOKEN_FLD_ARG_NO,
-  CPP_TOKEN_FLD_TOKEN_NO,
-  CPP_TOKEN_FLD_PRAGMA,
-  CPP_TOKEN_FLD_NONE
-};
-
-/* A macro argument in the cpp_token union.  */
-struct GTY(()) cpp_macro_arg {
-  /* Argument number.  */
-  unsigned int arg_no;
-};
-
-/* An identifier in the cpp_token union.  */
-struct GTY(()) cpp_identifier {
-  /* The canonical (UTF-8) spelling of the identifier.  */
-  cpp_hashnode *
-    GTY ((nested_ptr (union tree_node,
-		"%h ? CPP_HASHNODE (GCC_IDENT_TO_HT_IDENT (%h)) : NULL",
-			"%h ? HT_IDENT_TO_GCC_IDENT (HT_NODE (%h)) : NULL")))
-       node;
-};
-
-/* A preprocessing token.  This has been carefully packed and should
-   occupy 16 bytes on 32-bit hosts and 24 bytes on 64-bit hosts.  */
-struct GTY(()) cpp_token {
-  source_location src_loc;	/* Location of first char of token.  */
-  ENUM_BITFIELD(cpp_ttype) type : CHAR_BIT;  /* token type */
-  unsigned short flags;		/* flags - see above */
-
-  union cpp_token_u
-  {
-    /* An identifier.  */
-    struct cpp_identifier GTY ((tag ("CPP_TOKEN_FLD_NODE"))) node;
-	 
-    /* Inherit padding from this token.  */
-    cpp_token * GTY ((tag ("CPP_TOKEN_FLD_SOURCE"))) source;
-
-    /* A string, or number.  */
-    struct cpp_string GTY ((tag ("CPP_TOKEN_FLD_STR"))) str;
-
-    /* Argument no. for a CPP_MACRO_ARG.  */
-    struct cpp_macro_arg GTY ((tag ("CPP_TOKEN_FLD_ARG_NO"))) macro_arg;
-
-    /* Original token no. for a CPP_PASTE (from a sequence of
-       consecutive paste tokens in a macro expansion).  */
-    unsigned int GTY ((tag ("CPP_TOKEN_FLD_TOKEN_NO"))) token_no;
-
-    /* Caller-supplied identifier for a CPP_PRAGMA.  */
-    unsigned int GTY ((tag ("CPP_TOKEN_FLD_PRAGMA"))) pragma;
-  } GTY ((desc ("cpp_token_val_index (&%1)"))) val;
-};
-
-/* Say which field is in use.  */
-extern enum cpp_token_fld_kind cpp_token_val_index (const cpp_token *tok);
-
-/* A type wide enough to hold any multibyte source character.
-   cpplib's character constant interpreter requires an unsigned type.
-   Also, a typedef for the signed equivalent.
-   The width of this type is capped at 32 bits; there do exist targets
-   where wchar_t is 64 bits, but only in a non-default mode, and there
-   would be no meaningful interpretation for a wchar_t value greater
-   than 2^32 anyway -- the widest wide-character encoding around is
-   ISO 10646, which stops at 2^31.  */
-#if CHAR_BIT * SIZEOF_INT >= 32
-# define CPPCHAR_SIGNED_T int
-#elif CHAR_BIT * SIZEOF_LONG >= 32
-# define CPPCHAR_SIGNED_T long
-#else
-# error "Cannot find a least-32-bit signed integer type"
-#endif
-typedef unsigned CPPCHAR_SIGNED_T cppchar_t;
-typedef CPPCHAR_SIGNED_T cppchar_signed_t;
-
-/* Style of header dependencies to generate.  */
-enum cpp_deps_style { DEPS_NONE = 0, DEPS_USER, DEPS_SYSTEM };
-
-/* The possible normalization levels, from most restrictive to least.  */
-enum cpp_normalize_level {
-  /* In NFKC.  */
-  normalized_KC = 0,
-  /* In NFC.  */
-  normalized_C,
-  /* In NFC, except for subsequences where being in NFC would make
-     the identifier invalid.  */
-  normalized_identifier_C,
-  /* Not normalized at all.  */
-  normalized_none
-};
-
-/* This structure is nested inside struct cpp_reader, and
-   carries all the options visible to the command line.  */
-struct cpp_options
-{
-  /* Characters between tab stops.  */
-  unsigned int tabstop;
-
-  /* The language we're preprocessing.  */
-  enum c_lang lang;
-
-  /* Nonzero means use extra default include directories for C++.  */
-  unsigned char cplusplus;
-
-  /* Nonzero means handle cplusplus style comments.  */
-  unsigned char cplusplus_comments;
-
-  /* Nonzero means define __OBJC__, treat @ as a special token, use
-     the OBJC[PLUS]_INCLUDE_PATH environment variable, and allow
-     "#import".  */
-  unsigned char objc;
-
-  /* Nonzero means don't copy comments into the output file.  */
-  unsigned char discard_comments;
-
-  /* Nonzero means don't copy comments into the output file during
-     macro expansion.  */
-  unsigned char discard_comments_in_macro_exp;
-
-  /* Nonzero means process the ISO trigraph sequences.  */
-  unsigned char trigraphs;
-
-  /* Nonzero means process the ISO digraph sequences.  */
-  unsigned char digraphs;
-
-  /* Nonzero means to allow hexadecimal floats and LL suffixes.  */
-  unsigned char extended_numbers;
-
-  /* Nonzero means process u/U prefix literals (UTF-16/32).  */
-  unsigned char uliterals;
-
-  /* Nonzero means process r/R raw strings.  If this is set, uliterals
-     must be set as well.  */
-  unsigned char rliterals;
-
-  /* Nonzero means print names of header files (-H).  */
-  unsigned char print_include_names;
-
-  /* Nonzero means complain about deprecated features.  */
-  unsigned char cpp_warn_deprecated;
-
-  /* Nonzero means warn if slash-star appears in a comment.  */
-  unsigned char warn_comments;
-
-  /* Nonzero means to warn about __DATA__, __TIME__ and __TIMESTAMP__ usage.   */
-  unsigned char warn_date_time;
-
-  /* Nonzero means warn if a user-supplied include directory does not
-     exist.  */
-  unsigned char warn_missing_include_dirs;
-
-  /* Nonzero means warn if there are any trigraphs.  */
-  unsigned char warn_trigraphs;
-
-  /* Nonzero means warn about multicharacter charconsts.  */
-  unsigned char warn_multichar;
-
-  /* Nonzero means warn about various incompatibilities with
-     traditional C.  */
-  unsigned char cpp_warn_traditional;
-
-  /* Nonzero means warn about long long numeric constants.  */
-  unsigned char cpp_warn_long_long;
-
-  /* Nonzero means warn about text after an #endif (or #else).  */
-  unsigned char warn_endif_labels;
-
-  /* Nonzero means warn about implicit sign changes owing to integer
-     promotions.  */
-  unsigned char warn_num_sign_change;
-
-  /* Zero means don't warn about __VA_ARGS__ usage in c89 pedantic mode.
-     Presumably the usage is protected by the appropriate #ifdef.  */
-  unsigned char warn_variadic_macros;
-
-  /* Nonzero means warn about builtin macros that are redefined or
-     explicitly undefined.  */
-  unsigned char warn_builtin_macro_redefined;
-
-  /* Nonzero means we should look for header.gcc files that remap file
-     names.  */
-  unsigned char remap;
-
-  /* Zero means dollar signs are punctuation.  */
-  unsigned char dollars_in_ident;
-
-  /* Nonzero means UCNs are accepted in identifiers.  */
-  unsigned char extended_identifiers;
-
-  /* True if we should warn about dollars in identifiers or numbers
-     for this translation unit.  */
-  unsigned char warn_dollars;
-
-  /* Nonzero means warn if undefined identifiers are evaluated in an #if.  */
-  unsigned char warn_undef;
-
-  /* Nonzero means warn of unused macros from the main file.  */
-  unsigned char warn_unused_macros;
-
-  /* Nonzero for the 1999 C Standard, including corrigenda and amendments.  */
-  unsigned char c99;
-
-  /* Nonzero if we are conforming to a specific C or C++ standard.  */
-  unsigned char std;
-
-  /* Nonzero means give all the error messages the ANSI standard requires.  */
-  unsigned char cpp_pedantic;
-
-  /* Nonzero means we're looking at already preprocessed code, so don't
-     bother trying to do macro expansion and whatnot.  */
-  unsigned char preprocessed;
-  
-  /* Nonzero means we are going to emit debugging logs during
-     preprocessing.  */
-  unsigned char debug;
-
-  /* Nonzero means we are tracking locations of tokens involved in
-     macro expansion. 1 Means we track the location in degraded mode
-     where we do not track locations of tokens resulting from the
-     expansion of arguments of function-like macro.  2 Means we do
-     track all macro expansions. This last option is the one that
-     consumes the highest amount of memory.  */
-  unsigned char track_macro_expansion;
-
-  /* Nonzero means handle C++ alternate operator names.  */
-  unsigned char operator_names;
-
-  /* Nonzero means warn about use of C++ alternate operator names.  */
-  unsigned char warn_cxx_operator_names;
-
-  /* True for traditional preprocessing.  */
-  unsigned char traditional;
-
-  /* Nonzero for C++ 2011 Standard user-defined literals.  */
-  unsigned char user_literals;
-
-  /* Nonzero means warn when a string or character literal is followed by a
-     ud-suffix which does not beging with an underscore.  */
-  unsigned char warn_literal_suffix;
-
-  /* Nonzero means interpret imaginary, fixed-point, or other gnu extension
-     literal number suffixes as user-defined literal number suffixes.  */
-  unsigned char ext_numeric_literals;
-
-  /* Nonzero means extended identifiers allow the characters specified
-     in C11 and C++11.  */
-  unsigned char c11_identifiers;
-
-  /* Nonzero for C++ 2014 Standard binary constants.  */
-  unsigned char binary_constants;
-
-  /* Nonzero for C++ 2014 Standard digit separators.  */
-  unsigned char digit_separators;
-
-  /* Holds the name of the target (execution) character set.  */
-  const char *narrow_charset;
-
-  /* Holds the name of the target wide character set.  */
-  const char *wide_charset;
-
-  /* Holds the name of the input character set.  */
-  const char *input_charset;
-
-  /* The minimum permitted level of normalization before a warning
-     is generated.  */
-  enum cpp_normalize_level warn_normalize;
-
-  /* True to warn about precompiled header files we couldn't use.  */
-  bool warn_invalid_pch;
-
-  /* True if dependencies should be restored from a precompiled header.  */
-  bool restore_pch_deps;
-
-  /* Dependency generation.  */
-  struct
-  {
-    /* Style of header dependencies to generate.  */
-    enum cpp_deps_style style;
-
-    /* Assume missing files are generated files.  */
-    bool missing_files;
-
-    /* Generate phony targets for each dependency apart from the first
-       one.  */
-    bool phony_targets;
-
-    /* If true, no dependency is generated on the main file.  */
-    bool ignore_main_file;
-
-    /* If true, intend to use the preprocessor output (e.g., for compilation)
-       in addition to the dependency info.  */
-    bool need_preprocessor_output;
-  } deps;
-
-  /* Target-specific features set by the front end or client.  */
-
-  /* Precision for target CPP arithmetic, target characters, target
-     ints and target wide characters, respectively.  */
-  size_t precision, char_precision, int_precision, wchar_precision;
-
-  /* True means chars (wide chars) are unsigned.  */
-  bool unsigned_char, unsigned_wchar;
-
-  /* True if the most significant byte in a word has the lowest
-     address in memory.  */
-  bool bytes_big_endian;
-
-  /* Nonzero means __STDC__ should have the value 0 in system headers.  */
-  unsigned char stdc_0_in_system_headers;
-
-  /* True disables tokenization outside of preprocessing directives. */
-  bool directives_only;
-
-  /* True enables canonicalization of system header file paths. */
-  bool canonical_system_headers;
-};
-
-/* Callback for header lookup for HEADER, which is the name of a
-   source file.  It is used as a method of last resort to find headers
-   that are not otherwise found during the normal include processing.
-   The return value is the malloced name of a header to try and open,
-   if any, or NULL otherwise.  This callback is called only if the
-   header is otherwise unfound.  */
-typedef const char *(*missing_header_cb)(cpp_reader *, const char *header, cpp_dir **);
-
-/* Call backs to cpplib client.  */
-struct cpp_callbacks
-{
-  /* Called when a new line of preprocessed output is started.  */
-  void (*line_change) (cpp_reader *, const cpp_token *, int);
-
-  /* Called when switching to/from a new file.
-     The line_map is for the new file.  It is NULL if there is no new file.
-     (In C this happens when done with <built-in>+<command line> and also
-     when done with a main file.)  This can be used for resource cleanup.  */
-  void (*file_change) (cpp_reader *, const struct line_map *);
-
-  void (*dir_change) (cpp_reader *, const char *);
-  void (*include) (cpp_reader *, source_location, const unsigned char *,
-		   const char *, int, const cpp_token **);
-  void (*define) (cpp_reader *, source_location, cpp_hashnode *);
-  void (*undef) (cpp_reader *, source_location, cpp_hashnode *);
-  void (*ident) (cpp_reader *, source_location, const cpp_string *);
-  void (*def_pragma) (cpp_reader *, source_location);
-  int (*valid_pch) (cpp_reader *, const char *, int);
-  void (*read_pch) (cpp_reader *, const char *, int, const char *);
-  missing_header_cb missing_header;
-
-  /* Context-sensitive macro support.  Returns macro (if any) that should
-     be expanded.  */
-  cpp_hashnode * (*macro_to_expand) (cpp_reader *, const cpp_token *);
-
-  /* Called to emit a diagnostic.  This callback receives the
-     translated message.  */
-  bool (*error) (cpp_reader *, int, int, source_location, unsigned int,
-		 const char *, va_list *)
-       ATTRIBUTE_FPTR_PRINTF(6,0);
-
-  /* Callbacks for when a macro is expanded, or tested (whether
-     defined or not at the time) in #ifdef, #ifndef or "defined".  */
-  void (*used_define) (cpp_reader *, source_location, cpp_hashnode *);
-  void (*used_undef) (cpp_reader *, source_location, cpp_hashnode *);
-  /* Called before #define and #undef or other macro definition
-     changes are processed.  */
-  void (*before_define) (cpp_reader *);
-  /* Called whenever a macro is expanded or tested.
-     Second argument is the location of the start of the current expansion.  */
-  void (*used) (cpp_reader *, source_location, cpp_hashnode *);
-
-  /* Callback that can change a user builtin into normal macro.  */
-  bool (*user_builtin_macro) (cpp_reader *, cpp_hashnode *);
-};
-
-#ifdef VMS
-#define INO_T_CPP ino_t ino[3]
-#else
-#define INO_T_CPP ino_t ino
-#endif
-
-/* Chain of directories to look for include files in.  */
-struct cpp_dir
-{
-  /* NULL-terminated singly-linked list.  */
-  struct cpp_dir *next;
-
-  /* NAME of the directory, NUL-terminated.  */
-  char *name;
-  unsigned int len;
-
-  /* One if a system header, two if a system header that has extern
-     "C" guards for C++.  */
-  unsigned char sysp;
-
-  /* Is this a user-supplied directory? */
-  bool user_supplied_p;
-
-  /* The canonicalized NAME as determined by lrealpath.  This field 
-     is only used by hosts that lack reliable inode numbers.  */
-  char *canonical_name;
-
-  /* Mapping of file names for this directory for MS-DOS and related
-     platforms.  A NULL-terminated array of (from, to) pairs.  */
-  const char **name_map;
-
-  /* Routine to construct pathname, given the search path name and the
-     HEADER we are trying to find, return a constructed pathname to
-     try and open.  If this is NULL, the constructed pathname is as
-     constructed by append_file_to_dir.  */
-  char *(*construct) (const char *header, cpp_dir *dir);
-
-  /* The C front end uses these to recognize duplicated
-     directories in the search path.  */
-  INO_T_CPP;
-  dev_t dev;
-};
-
-/* The structure of a node in the hash table.  The hash table has
-   entries for all identifiers: either macros defined by #define
-   commands (type NT_MACRO), assertions created with #assert
-   (NT_ASSERTION), or neither of the above (NT_VOID).  Builtin macros
-   like __LINE__ are flagged NODE_BUILTIN.  Poisoned identifiers are
-   flagged NODE_POISONED.  NODE_OPERATOR (C++ only) indicates an
-   identifier that behaves like an operator such as "xor".
-   NODE_DIAGNOSTIC is for speed in lex_token: it indicates a
-   diagnostic may be required for this node.  Currently this only
-   applies to __VA_ARGS__, poisoned identifiers, and -Wc++-compat
-   warnings about NODE_OPERATOR.  */
-
-/* Hash node flags.  */
-#define NODE_OPERATOR	(1 << 0)	/* C++ named operator.  */
-#define NODE_POISONED	(1 << 1)	/* Poisoned identifier.  */
-#define NODE_BUILTIN	(1 << 2)	/* Builtin macro.  */
-#define NODE_DIAGNOSTIC (1 << 3)	/* Possible diagnostic when lexed.  */
-#define NODE_WARN	(1 << 4)	/* Warn if redefined or undefined.  */
-#define NODE_DISABLED	(1 << 5)	/* A disabled macro.  */
-#define NODE_MACRO_ARG	(1 << 6)	/* Used during #define processing.  */
-#define NODE_USED	(1 << 7)	/* Dumped with -dU.  */
-#define NODE_CONDITIONAL (1 << 8)	/* Conditional macro */
-#define NODE_WARN_OPERATOR (1 << 9)	/* Warn about C++ named operator.  */
-
-/* Different flavors of hash node.  */
-enum node_type
-{
-  NT_VOID = 0,	   /* No definition yet.  */
-  NT_MACRO,	   /* A macro of some form.  */
-  NT_ASSERTION	   /* Predicate for #assert.  */
-};
-
-/* Different flavors of builtin macro.  _Pragma is an operator, but we
-   handle it with the builtin code for efficiency reasons.  */
-enum cpp_builtin_type
-{
-  BT_SPECLINE = 0,		/* `__LINE__' */
-  BT_DATE,			/* `__DATE__' */
-  BT_FILE,			/* `__FILE__' */
-  BT_BASE_FILE,			/* `__BASE_FILE__' */
-  BT_INCLUDE_LEVEL,		/* `__INCLUDE_LEVEL__' */
-  BT_TIME,			/* `__TIME__' */
-  BT_STDC,			/* `__STDC__' */
-  BT_PRAGMA,			/* `_Pragma' operator */
-  BT_TIMESTAMP,			/* `__TIMESTAMP__' */
-  BT_COUNTER,			/* `__COUNTER__' */
-  BT_FIRST_USER,		/* User defined builtin macros.  */
-  BT_LAST_USER = BT_FIRST_USER + 31
-};
-
-#define CPP_HASHNODE(HNODE)	((cpp_hashnode *) (HNODE))
-#define HT_NODE(NODE)		((ht_identifier *) (NODE))
-#define NODE_LEN(NODE)		HT_LEN (&(NODE)->ident)
-#define NODE_NAME(NODE)		HT_STR (&(NODE)->ident)
-
-/* Specify which field, if any, of the union is used.  */
-
-enum {
-  NTV_MACRO,
-  NTV_ANSWER,
-  NTV_BUILTIN,
-  NTV_ARGUMENT,
-  NTV_NONE
-};
-
-#define CPP_HASHNODE_VALUE_IDX(HNODE)				\
-  ((HNODE.flags & NODE_MACRO_ARG) ? NTV_ARGUMENT		\
-   : HNODE.type == NT_MACRO ? ((HNODE.flags & NODE_BUILTIN) 	\
-			       ? NTV_BUILTIN : NTV_MACRO)	\
-   : HNODE.type == NT_ASSERTION ? NTV_ANSWER			\
-   : NTV_NONE)
-
-/* The common part of an identifier node shared amongst all 3 C front
-   ends.  Also used to store CPP identifiers, which are a superset of
-   identifiers in the grammatical sense.  */
-
-union GTY(()) _cpp_hashnode_value {
-  /* If a macro.  */
-  cpp_macro * GTY((tag ("NTV_MACRO"))) macro;
-  /* Answers to an assertion.  */
-  struct answer * GTY ((tag ("NTV_ANSWER"))) answers;
-  /* Code for a builtin macro.  */
-  enum cpp_builtin_type GTY ((tag ("NTV_BUILTIN"))) builtin;
-  /* Macro argument index.  */
-  unsigned short GTY ((tag ("NTV_ARGUMENT"))) arg_index;
-};
-
-struct GTY(()) cpp_hashnode {
-  struct ht_identifier ident;
-  unsigned int is_directive : 1;
-  unsigned int directive_index : 7;	/* If is_directive,
-					   then index into directive table.
-					   Otherwise, a NODE_OPERATOR.  */
-  unsigned char rid_code;		/* Rid code - for front ends.  */
-  ENUM_BITFIELD(node_type) type : 6;	/* CPP node type.  */
-  unsigned int flags : 10;		/* CPP flags.  */
-
-  union _cpp_hashnode_value GTY ((desc ("CPP_HASHNODE_VALUE_IDX (%1)"))) value;
-};
-
-/* Call this first to get a handle to pass to other functions.
-
-   If you want cpplib to manage its own hashtable, pass in a NULL
-   pointer.  Otherwise you should pass in an initialized hash table
-   that cpplib will share; this technique is used by the C front
-   ends.  */
-extern cpp_reader *cpp_create_reader (enum c_lang, struct ht *,
-				      struct line_maps *);
-
-/* Reset the cpp_reader's line_map.  This is only used after reading a
-   PCH file.  */
-extern void cpp_set_line_map (cpp_reader *, struct line_maps *);
-
-/* Call this to change the selected language standard (e.g. because of
-   command line options).  */
-extern void cpp_set_lang (cpp_reader *, enum c_lang);
-
-/* Set the include paths.  */
-extern void cpp_set_include_chains (cpp_reader *, cpp_dir *, cpp_dir *, int);
-
-/* Call these to get pointers to the options, callback, and deps
-   structures for a given reader.  These pointers are good until you
-   call cpp_finish on that reader.  You can either edit the callbacks
-   through the pointer returned from cpp_get_callbacks, or set them
-   with cpp_set_callbacks.  */
-extern cpp_options *cpp_get_options (cpp_reader *);
-extern cpp_callbacks *cpp_get_callbacks (cpp_reader *);
-extern void cpp_set_callbacks (cpp_reader *, cpp_callbacks *);
-extern struct deps *cpp_get_deps (cpp_reader *);
-
-/* This function reads the file, but does not start preprocessing.  It
-   returns the name of the original file; this is the same as the
-   input file, except for preprocessed input.  This will generate at
-   least one file change callback, and possibly a line change callback
-   too.  If there was an error opening the file, it returns NULL.  */
-extern const char *cpp_read_main_file (cpp_reader *, const char *);
-
-/* Set up built-ins with special behavior.  Use cpp_init_builtins()
-   instead unless your know what you are doing.  */
-extern void cpp_init_special_builtins (cpp_reader *);
-
-/* Set up built-ins like __FILE__.  */
-extern void cpp_init_builtins (cpp_reader *, int);
-
-/* This is called after options have been parsed, and partially
-   processed.  */
-extern void cpp_post_options (cpp_reader *);
-
-/* Set up translation to the target character set.  */
-extern void cpp_init_iconv (cpp_reader *);
-
-/* Call this to finish preprocessing.  If you requested dependency
-   generation, pass an open stream to write the information to,
-   otherwise NULL.  It is your responsibility to close the stream.  */
-extern void cpp_finish (cpp_reader *, FILE *deps_stream);
-
-/* Call this to release the handle at the end of preprocessing.  Any
-   use of the handle after this function returns is invalid.  */
-extern void cpp_destroy (cpp_reader *);
-
-extern unsigned int cpp_token_len (const cpp_token *);
-extern unsigned char *cpp_token_as_text (cpp_reader *, const cpp_token *);
-extern unsigned char *cpp_spell_token (cpp_reader *, const cpp_token *,
-				       unsigned char *, bool);
-extern void cpp_register_pragma (cpp_reader *, const char *, const char *,
-				 void (*) (cpp_reader *), bool);
-extern void cpp_register_deferred_pragma (cpp_reader *, const char *,
-					  const char *, unsigned, bool, bool);
-extern int cpp_avoid_paste (cpp_reader *, const cpp_token *,
-			    const cpp_token *);
-extern const cpp_token *cpp_get_token (cpp_reader *);
-extern const cpp_token *cpp_get_token_with_location (cpp_reader *,
-						     source_location *);
-extern const unsigned char *cpp_macro_definition (cpp_reader *,
-						  cpp_hashnode *);
-extern void _cpp_backup_tokens (cpp_reader *, unsigned int);
-extern const cpp_token *cpp_peek_token (cpp_reader *, int);
-
-/* Evaluate a CPP_*CHAR* token.  */
-extern cppchar_t cpp_interpret_charconst (cpp_reader *, const cpp_token *,
-					  unsigned int *, int *);
-/* Evaluate a vector of CPP_*STRING* tokens.  */
-extern bool cpp_interpret_string (cpp_reader *,
-				  const cpp_string *, size_t,
-				  cpp_string *, enum cpp_ttype);
-extern bool cpp_interpret_string_notranslate (cpp_reader *,
-					      const cpp_string *, size_t,
-					      cpp_string *, enum cpp_ttype);
-
-/* Convert a host character constant to the execution character set.  */
-extern cppchar_t cpp_host_to_exec_charset (cpp_reader *, cppchar_t);
-
-/* Used to register macros and assertions, perhaps from the command line.
-   The text is the same as the command line argument.  */
-extern void cpp_define (cpp_reader *, const char *);
-extern void cpp_define_formatted (cpp_reader *pfile, 
-				  const char *fmt, ...) ATTRIBUTE_PRINTF_2;
-extern void cpp_assert (cpp_reader *, const char *);
-extern void cpp_undef (cpp_reader *, const char *);
-extern void cpp_unassert (cpp_reader *, const char *);
-
-/* Undefine all macros and assertions.  */
-extern void cpp_undef_all (cpp_reader *);
-
-extern cpp_buffer *cpp_push_buffer (cpp_reader *, const unsigned char *,
-				    size_t, int);
-extern int cpp_defined (cpp_reader *, const unsigned char *, int);
-
-/* A preprocessing number.  Code assumes that any unused high bits of
-   the double integer are set to zero.  */
-typedef unsigned HOST_WIDE_INT cpp_num_part;
-typedef struct cpp_num cpp_num;
-struct cpp_num
-{
-  cpp_num_part high;
-  cpp_num_part low;
-  bool unsignedp;  /* True if value should be treated as unsigned.  */
-  bool overflow;   /* True if the most recent calculation overflowed.  */
-};
-
-/* cpplib provides two interfaces for interpretation of preprocessing
-   numbers.
-
-   cpp_classify_number categorizes numeric constants according to
-   their field (integer, floating point, or invalid), radix (decimal,
-   octal, hexadecimal), and type suffixes.  */
-
-#define CPP_N_CATEGORY  0x000F
-#define CPP_N_INVALID	0x0000
-#define CPP_N_INTEGER	0x0001
-#define CPP_N_FLOATING	0x0002
-
-#define CPP_N_WIDTH	0x00F0
-#define CPP_N_SMALL	0x0010	/* int, float, shrot _Fract/Accum  */
-#define CPP_N_MEDIUM	0x0020	/* long, double, long _Fract/_Accum.  */
-#define CPP_N_LARGE	0x0040	/* long long, long double,
-				   long long _Fract/Accum.  */
-
-#define CPP_N_WIDTH_MD	0xF0000	/* machine defined.  */
-#define CPP_N_MD_W	0x10000
-#define CPP_N_MD_Q	0x20000
-
-#define CPP_N_RADIX	0x0F00
-#define CPP_N_DECIMAL	0x0100
-#define CPP_N_HEX	0x0200
-#define CPP_N_OCTAL	0x0400
-#define CPP_N_BINARY	0x0800
-
-#define CPP_N_UNSIGNED	0x1000	/* Properties.  */
-#define CPP_N_IMAGINARY	0x2000
-#define CPP_N_DFLOAT	0x4000
-#define CPP_N_DEFAULT	0x8000
-
-#define CPP_N_FRACT	0x100000 /* Fract types.  */
-#define CPP_N_ACCUM	0x200000 /* Accum types.  */
-
-#define CPP_N_USERDEF	0x1000000 /* C++0x user-defined literal.  */
-
-/* Classify a CPP_NUMBER token.  The return value is a combination of
-   the flags from the above sets.  */
-extern unsigned cpp_classify_number (cpp_reader *, const cpp_token *,
-				     const char **, source_location);
-
-/* Return the classification flags for a float suffix.  */
-extern unsigned int cpp_interpret_float_suffix (cpp_reader *, const char *,
-						size_t);
-
-/* Return the classification flags for an int suffix.  */
-extern unsigned int cpp_interpret_int_suffix (cpp_reader *, const char *,
-					      size_t);
-
-/* Evaluate a token classified as category CPP_N_INTEGER.  */
-extern cpp_num cpp_interpret_integer (cpp_reader *, const cpp_token *,
-				      unsigned int);
-
-/* Sign extend a number, with PRECISION significant bits and all
-   others assumed clear, to fill out a cpp_num structure.  */
-cpp_num cpp_num_sign_extend (cpp_num, size_t);
-
-/* Diagnostic levels.  To get a diagnostic without associating a
-   position in the translation unit with it, use cpp_error_with_line
-   with a line number of zero.  */
-
-enum {
-  /* Warning, an error with -Werror.  */
-  CPP_DL_WARNING = 0,
-  /* Same as CPP_DL_WARNING, except it is not suppressed in system headers.  */
-  CPP_DL_WARNING_SYSHDR,
-  /* Warning, an error with -pedantic-errors or -Werror.  */
-  CPP_DL_PEDWARN,
-  /* An error.  */
-  CPP_DL_ERROR,
-  /* An internal consistency check failed.  Prints "internal error: ",
-     otherwise the same as CPP_DL_ERROR.  */
-  CPP_DL_ICE,
-  /* An informative note following a warning.  */
-  CPP_DL_NOTE,
-  /* A fatal error.  */
-  CPP_DL_FATAL
-};
-
-/* Warning reason codes. Use a reason code of zero for unclassified warnings
-   and errors that are not warnings.  */
-enum {
-  CPP_W_NONE = 0,
-  CPP_W_DEPRECATED,
-  CPP_W_COMMENTS,
-  CPP_W_MISSING_INCLUDE_DIRS,
-  CPP_W_TRIGRAPHS,
-  CPP_W_MULTICHAR,
-  CPP_W_TRADITIONAL,
-  CPP_W_LONG_LONG,
-  CPP_W_ENDIF_LABELS,
-  CPP_W_NUM_SIGN_CHANGE,
-  CPP_W_VARIADIC_MACROS,
-  CPP_W_BUILTIN_MACRO_REDEFINED,
-  CPP_W_DOLLARS,
-  CPP_W_UNDEF,
-  CPP_W_UNUSED_MACROS,
-  CPP_W_CXX_OPERATOR_NAMES,
-  CPP_W_NORMALIZE,
-  CPP_W_INVALID_PCH,
-  CPP_W_WARNING_DIRECTIVE,
-  CPP_W_LITERAL_SUFFIX,
-  CPP_W_DATE_TIME
-};
-
-/* Output a diagnostic of some kind.  */
-extern bool cpp_error (cpp_reader *, int, const char *msgid, ...)
-  ATTRIBUTE_PRINTF_3;
-extern bool cpp_warning (cpp_reader *, int, const char *msgid, ...)
-  ATTRIBUTE_PRINTF_3;
-extern bool cpp_pedwarning (cpp_reader *, int, const char *msgid, ...)
-  ATTRIBUTE_PRINTF_3;
-extern bool cpp_warning_syshdr (cpp_reader *, int, const char *msgid, ...)
-  ATTRIBUTE_PRINTF_3;
-
-/* Output a diagnostic with "MSGID: " preceding the
-   error string of errno.  No location is printed.  */
-extern bool cpp_errno (cpp_reader *, int, const char *msgid);
-
-/* Same as cpp_error, except additionally specifies a position as a
-   (translation unit) physical line and physical column.  If the line is
-   zero, then no location is printed.  */
-extern bool cpp_error_with_line (cpp_reader *, int, source_location,
-                                 unsigned, const char *msgid, ...)
-  ATTRIBUTE_PRINTF_5;
-extern bool cpp_warning_with_line (cpp_reader *, int, source_location,
-                                   unsigned, const char *msgid, ...)
-  ATTRIBUTE_PRINTF_5;
-extern bool cpp_pedwarning_with_line (cpp_reader *, int, source_location,
-                                      unsigned, const char *msgid, ...)
-  ATTRIBUTE_PRINTF_5;
-extern bool cpp_warning_with_line_syshdr (cpp_reader *, int, source_location,
-                                          unsigned, const char *msgid, ...)
-  ATTRIBUTE_PRINTF_5;
-
-/* In lex.c */
-extern int cpp_ideq (const cpp_token *, const char *);
-extern void cpp_output_line (cpp_reader *, FILE *);
-extern unsigned char *cpp_output_line_to_string (cpp_reader *,
-						 const unsigned char *);
-extern void cpp_output_token (const cpp_token *, FILE *);
-extern const char *cpp_type2name (enum cpp_ttype, unsigned char flags);
-/* Returns the value of an escape sequence, truncated to the correct
-   target precision.  PSTR points to the input pointer, which is just
-   after the backslash.  LIMIT is how much text we have.  WIDE is true
-   if the escape sequence is part of a wide character constant or
-   string literal.  Handles all relevant diagnostics.  */
-extern cppchar_t cpp_parse_escape (cpp_reader *, const unsigned char ** pstr,
-				   const unsigned char *limit, int wide);
-
-/* Structure used to hold a comment block at a given location in the
-   source code.  */
-
-typedef struct
-{
-  /* Text of the comment including the terminators.  */
-  char *comment;
-
-  /* source location for the given comment.  */
-  source_location sloc;
-} cpp_comment;
-
-/* Structure holding all comments for a given cpp_reader.  */
-
-typedef struct
-{
-  /* table of comment entries.  */
-  cpp_comment *entries;
-
-  /* number of actual entries entered in the table.  */
-  int count;
-
-  /* number of entries allocated currently.  */
-  int allocated;
-} cpp_comment_table;
-
-/* Returns the table of comments encountered by the preprocessor. This
-   table is only populated when pfile->state.save_comments is true. */
-extern cpp_comment_table *cpp_get_comments (cpp_reader *);
-
-/* In hash.c */
-
-/* Lookup an identifier in the hashtable.  Puts the identifier in the
-   table if it is not already there.  */
-extern cpp_hashnode *cpp_lookup (cpp_reader *, const unsigned char *,
-				 unsigned int);
-
-typedef int (*cpp_cb) (cpp_reader *, cpp_hashnode *, void *);
-extern void cpp_forall_identifiers (cpp_reader *, cpp_cb, void *);
-
-/* In macro.c */
-extern void cpp_scan_nooutput (cpp_reader *);
-extern int  cpp_sys_macro_p (cpp_reader *);
-extern unsigned char *cpp_quote_string (unsigned char *, const unsigned char *,
-					unsigned int);
-
-/* In files.c */
-extern bool cpp_included (cpp_reader *, const char *);
-extern bool cpp_included_before (cpp_reader *, const char *, source_location);
-extern void cpp_make_system_header (cpp_reader *, int, int);
-extern bool cpp_push_include (cpp_reader *, const char *);
-extern bool cpp_push_default_include (cpp_reader *, const char *);
-extern void cpp_change_file (cpp_reader *, enum lc_reason, const char *);
-extern const char *cpp_get_path (struct _cpp_file *);
-extern cpp_dir *cpp_get_dir (struct _cpp_file *);
-extern cpp_buffer *cpp_get_buffer (cpp_reader *);
-extern struct _cpp_file *cpp_get_file (cpp_buffer *);
-extern cpp_buffer *cpp_get_prev (cpp_buffer *);
-extern void cpp_clear_file_cache (cpp_reader *);
-
-/* In pch.c */
-struct save_macro_data;
-extern int cpp_save_state (cpp_reader *, FILE *);
-extern int cpp_write_pch_deps (cpp_reader *, FILE *);
-extern int cpp_write_pch_state (cpp_reader *, FILE *);
-extern int cpp_valid_state (cpp_reader *, const char *, int);
-extern void cpp_prepare_state (cpp_reader *, struct save_macro_data **);
-extern int cpp_read_state (cpp_reader *, const char *, FILE *,
-			   struct save_macro_data *);
-
-/* In lex.c */
-extern void cpp_force_token_locations (cpp_reader *, source_location *);
-extern void cpp_stop_forcing_token_locations (cpp_reader *);
-
-/* In expr.c */
-extern enum cpp_ttype cpp_userdef_string_remove_type
-  (enum cpp_ttype type);
-extern enum cpp_ttype cpp_userdef_string_add_type
-  (enum cpp_ttype type);
-extern enum cpp_ttype cpp_userdef_char_remove_type
-  (enum cpp_ttype type);
-extern enum cpp_ttype cpp_userdef_char_add_type
-  (enum cpp_ttype type);
-extern bool cpp_userdef_string_p
-  (enum cpp_ttype type);
-extern bool cpp_userdef_char_p
-  (enum cpp_ttype type);
-extern const char * cpp_get_userdef_suffix
-  (const cpp_token *);
-
-#endif /* ! LIBCPP_CPPLIB_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/debug.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/debug.h
deleted file mode 100644
index fc57589..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/debug.h
+++ /dev/null
@@ -1,195 +0,0 @@
-/* Debug hooks for GCC.
-   Copyright (C) 2001-2014 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 3, 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; see the file COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_DEBUG_H
-#define GCC_DEBUG_H
-
-/* This structure contains hooks for the debug information output
-   functions, accessed through the global instance debug_hooks set in
-   toplev.c according to command line options.  */
-struct gcc_debug_hooks
-{
-  /* Initialize debug output.  MAIN_FILENAME is the name of the main
-     input file.  */
-  void (* init) (const char *main_filename);
-
-  /* Output debug symbols.  */
-  void (* finish) (const char *main_filename);
-
-  /* Called from cgraph_optimize before starting to assemble
-     functions/variables/toplevel asms.  */
-  void (* assembly_start) (void);
-
-  /* Macro defined on line LINE with name and expansion TEXT.  */
-  void (* define) (unsigned int line, const char *text);
-
-  /* MACRO undefined on line LINE.  */
-  void (* undef) (unsigned int line, const char *macro);
-
-  /* Record the beginning of a new source file FILE from LINE number
-     in the previous one.  */
-  void (* start_source_file) (unsigned int line, const char *file);
-
-  /* Record the resumption of a source file.  LINE is the line number
-     in the source file we are returning to.  */
-  void (* end_source_file) (unsigned int line);
-
-  /* Record the beginning of block N, counting from 1 and not
-     including the function-scope block, at LINE.  */
-  void (* begin_block) (unsigned int line, unsigned int n);
-
-  /* Record the end of a block.  Arguments as for begin_block.  */
-  void (* end_block) (unsigned int line, unsigned int n);
-
-  /* Returns nonzero if it is appropriate not to emit any debugging
-     information for BLOCK, because it doesn't contain any
-     instructions.  This may not be the case for blocks containing
-     nested functions, since we may actually call such a function even
-     though the BLOCK information is messed up.  Defaults to true.  */
-  bool (* ignore_block) (const_tree);
-
-  /* Record a source file location at (FILE, LINE, DISCRIMINATOR).  */
-  void (* source_line) (unsigned int line, const char *file,
-                        int discriminator, bool is_stmt);
-
-  /* Called at start of prologue code.  LINE is the first line in the
-     function.  */
-  void (* begin_prologue) (unsigned int line, const char *file);
-
-  /* Called at end of prologue code.  LINE is the first line in the
-     function.  */
-  void (* end_prologue) (unsigned int line, const char *file);
-
-  /* Called at beginning of epilogue code.  */
-  void (* begin_epilogue) (unsigned int line, const char *file);
-
-  /* Record end of epilogue code.  */
-  void (* end_epilogue) (unsigned int line, const char *file);
-
-  /* Called at start of function DECL, before it is declared.  */
-  void (* begin_function) (tree decl);
-
-  /* Record end of function.  LINE is highest line number in function.  */
-  void (* end_function) (unsigned int line);
-
-  /* Debug information for a function DECL.  This might include the
-     function name (a symbol), its parameters, and the block that
-     makes up the function's body, and the local variables of the
-     function.  */
-  void (* function_decl) (tree decl);
-
-  /* Debug information for a global DECL.  Called from toplev.c after
-     compilation proper has finished.  */
-  void (* global_decl) (tree decl);
-
-  /* Debug information for a type DECL.  Called from toplev.c after
-     compilation proper, also from various language front ends to
-     record built-in types.  The second argument is properly a
-     boolean, which indicates whether or not the type is a "local"
-     type as determined by the language.  (It's not a boolean for
-     legacy reasons.)  */
-  void (* type_decl) (tree decl, int local);
-
-  /* Debug information for imported modules and declarations.  */
-  void (* imported_module_or_decl) (tree decl, tree name,
-				    tree context, bool child);
-
-  /* DECL is an inline function, whose body is present, but which is
-     not being output at this point.  */
-  void (* deferred_inline_function) (tree decl);
-
-  /* DECL is an inline function which is about to be emitted out of
-     line.  The hook is useful to, e.g., emit abstract debug info for
-     the inline before it gets mangled by optimization.  */
-  void (* outlining_inline_function) (tree decl);
-
-  /* Called from final_scan_insn for any CODE_LABEL insn whose
-     LABEL_NAME is non-null.  */
-  void (* label) (rtx);
-
-  /* Called after the start and before the end of writing a PCH file.
-     The parameter is 0 if after the start, 1 if before the end.  */
-  void (* handle_pch) (unsigned int);
-
-  /* Called from final_scan_insn for any NOTE_INSN_VAR_LOCATION note.  */
-  void (* var_location) (rtx);
-
-  /* Called from final_scan_insn if there is a switch between hot and cold
-     text sections.  */
-  void (* switch_text_section) (void);
-
-  /* Called from grokdeclarator.  Replaces the anonymous name with the
-     type name.  */
-  void (* set_name) (tree, tree);
-
-  /* This is 1 if the debug writer wants to see start and end commands for the
-     main source files, and 0 otherwise.  */
-  int start_end_main_source_file;
-
-  /* The type of symtab field used by these debug hooks.  This is one
-     of the TYPE_SYMTAB_IS_xxx values defined in tree.h.  */
-  int tree_type_symtab_field;
-};
-
-extern const struct gcc_debug_hooks *debug_hooks;
-
-/* The do-nothing hooks.  */
-extern void debug_nothing_void (void);
-extern void debug_nothing_charstar (const char *);
-extern void debug_nothing_int_charstar (unsigned int, const char *);
-extern void debug_nothing_int_charstar_int_bool (unsigned int, const char *,
-                                                 int, bool);
-extern void debug_nothing_int (unsigned int);
-extern void debug_nothing_int_int (unsigned int, unsigned int);
-extern void debug_nothing_tree (tree);
-extern void debug_nothing_tree_tree (tree, tree);
-extern void debug_nothing_tree_int (tree, int);
-extern void debug_nothing_tree_tree_tree_bool (tree, tree, tree, bool);
-extern bool debug_true_const_tree (const_tree);
-extern void debug_nothing_rtx (rtx);
-extern void debug_nothing_rtx_rtx (rtx, rtx);
-
-/* Hooks for various debug formats.  */
-extern const struct gcc_debug_hooks do_nothing_debug_hooks;
-extern const struct gcc_debug_hooks dbx_debug_hooks;
-extern const struct gcc_debug_hooks sdb_debug_hooks;
-extern const struct gcc_debug_hooks xcoff_debug_hooks;
-extern const struct gcc_debug_hooks dwarf2_debug_hooks;
-extern const struct gcc_debug_hooks vmsdbg_debug_hooks;
-
-/* Dwarf2 frame information.  */
-
-extern void dwarf2out_begin_prologue (unsigned int, const char *);
-extern void dwarf2out_vms_end_prologue (unsigned int, const char *);
-extern void dwarf2out_vms_begin_epilogue (unsigned int, const char *);
-extern void dwarf2out_end_epilogue (unsigned int, const char *);
-extern void dwarf2out_frame_finish (void);
-/* Decide whether we want to emit frame unwind information for the current
-   translation unit.  */
-extern bool dwarf2out_do_frame (void);
-extern bool dwarf2out_do_cfi_asm (void);
-extern void dwarf2out_switch_text_section (void);
-
-const char *remap_debug_filename (const char *);
-void add_debug_prefix_map (const char *);
-
-/* For -fdump-go-spec.  */
-
-extern const struct gcc_debug_hooks *
-dump_go_spec_init (const char *, const struct gcc_debug_hooks *);
-
-#endif /* !GCC_DEBUG_H  */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/defaults.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/defaults.h
deleted file mode 100644
index f94ae17..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/defaults.h
+++ /dev/null
@@ -1,1393 +0,0 @@
-/* Definitions of various defaults for tm.h macros.
-   Copyright (C) 1992-2014 Free Software Foundation, Inc.
-   Contributed by Ron Guilmette (rfg@monkeys.com)
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-Under Section 7 of GPL version 3, you are granted additional
-permissions described in the GCC Runtime Library Exception, version
-3.1, as published by the Free Software Foundation.
-
-You should have received a copy of the GNU General Public License and
-a copy of the GCC Runtime Library Exception along with this program;
-see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_DEFAULTS_H
-#define GCC_DEFAULTS_H
-
-/* How to start an assembler comment.  */
-#ifndef ASM_COMMENT_START
-#define ASM_COMMENT_START ";#"
-#endif
-
-/* Store in OUTPUT a string (made with alloca) containing an
-   assembler-name for a local static variable or function named NAME.
-   LABELNO is an integer which is different for each call.  */
-
-#ifndef ASM_PN_FORMAT
-# ifndef NO_DOT_IN_LABEL
-#  define ASM_PN_FORMAT "%s.%lu"
-# else
-#  ifndef NO_DOLLAR_IN_LABEL
-#   define ASM_PN_FORMAT "%s$%lu"
-#  else
-#   define ASM_PN_FORMAT "__%s_%lu"
-#  endif
-# endif
-#endif /* ! ASM_PN_FORMAT */
-
-#ifndef ASM_FORMAT_PRIVATE_NAME
-# define ASM_FORMAT_PRIVATE_NAME(OUTPUT, NAME, LABELNO) \
-  do { const char *const name_ = (NAME); \
-       char *const output_ = (OUTPUT) = \
-	 (char *) alloca (strlen (name_) + 32); \
-       sprintf (output_, ASM_PN_FORMAT, name_, (unsigned long)(LABELNO)); \
-  } while (0)
-#endif
-
-/* Choose a reasonable default for ASM_OUTPUT_ASCII.  */
-
-#ifndef ASM_OUTPUT_ASCII
-#define ASM_OUTPUT_ASCII(MYFILE, MYSTRING, MYLENGTH) \
-  do {									      \
-    FILE *_hide_asm_out_file = (MYFILE);				      \
-    const unsigned char *_hide_p = (const unsigned char *) (MYSTRING);	      \
-    int _hide_thissize = (MYLENGTH);					      \
-    {									      \
-      FILE *asm_out_file = _hide_asm_out_file;				      \
-      const unsigned char *p = _hide_p;					      \
-      int thissize = _hide_thissize;					      \
-      int i;								      \
-      fprintf (asm_out_file, "\t.ascii \"");				      \
-									      \
-      for (i = 0; i < thissize; i++)					      \
-	{								      \
-	  int c = p[i];			   				      \
-	  if (c == '\"' || c == '\\')					      \
-	    putc ('\\', asm_out_file);					      \
-	  if (ISPRINT (c))						      \
-	    putc (c, asm_out_file);					      \
-	  else								      \
-	    {								      \
-	      fprintf (asm_out_file, "\\%o", c);			      \
-	      /* After an octal-escape, if a digit follows,		      \
-		 terminate one string constant and start another.	      \
-		 The VAX assembler fails to stop reading the escape	      \
-		 after three digits, so this is the only way we		      \
-		 can get it to parse the data properly.  */		      \
-	      if (i < thissize - 1 && ISDIGIT (p[i + 1]))		      \
-		fprintf (asm_out_file, "\"\n\t.ascii \"");		      \
-	  }								      \
-	}								      \
-      fprintf (asm_out_file, "\"\n");					      \
-    }									      \
-  }									      \
-  while (0)
-#endif
-
-/* This is how we tell the assembler to equate two values.  */
-#ifdef SET_ASM_OP
-#ifndef ASM_OUTPUT_DEF
-#define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2)				\
- do {	fprintf ((FILE), "%s", SET_ASM_OP);				\
-	assemble_name (FILE, LABEL1);					\
-	fprintf (FILE, ",");						\
-	assemble_name (FILE, LABEL2);					\
-	fprintf (FILE, "\n");						\
-  } while (0)
-#endif
-#endif
-
-#ifndef IFUNC_ASM_TYPE
-#define IFUNC_ASM_TYPE "gnu_indirect_function"
-#endif
-
-#ifndef TLS_COMMON_ASM_OP
-#define TLS_COMMON_ASM_OP ".tls_common"
-#endif
-
-#if defined (HAVE_AS_TLS) && !defined (ASM_OUTPUT_TLS_COMMON)
-#define ASM_OUTPUT_TLS_COMMON(FILE, DECL, NAME, SIZE)			\
-  do									\
-    {									\
-      fprintf ((FILE), "\t%s\t", TLS_COMMON_ASM_OP);			\
-      assemble_name ((FILE), (NAME));					\
-      fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n",		\
-	       (SIZE), DECL_ALIGN (DECL) / BITS_PER_UNIT);		\
-    }									\
-  while (0)
-#endif
-
-/* Decide whether to defer emitting the assembler output for an equate
-   of two values.  The default is to not defer output.  */
-#ifndef TARGET_DEFERRED_OUTPUT_DEFS
-#define TARGET_DEFERRED_OUTPUT_DEFS(DECL,TARGET) false
-#endif
-
-/* This is how to output the definition of a user-level label named
-   NAME, such as the label on variable NAME.  */
-
-#ifndef ASM_OUTPUT_LABEL
-#define ASM_OUTPUT_LABEL(FILE,NAME) \
-  do {						\
-    assemble_name ((FILE), (NAME));		\
-    fputs (":\n", (FILE));			\
-  } while (0)
-#endif
-
-/* This is how to output the definition of a user-level label named
-   NAME, such as the label on a function.  */
-
-#ifndef ASM_OUTPUT_FUNCTION_LABEL
-#define ASM_OUTPUT_FUNCTION_LABEL(FILE, NAME, DECL) \
-  ASM_OUTPUT_LABEL ((FILE), (NAME))
-#endif
-
-/* Output the definition of a compiler-generated label named NAME.  */
-#ifndef ASM_OUTPUT_INTERNAL_LABEL
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,NAME)	\
-  do {						\
-    assemble_name_raw ((FILE), (NAME));		\
-    fputs (":\n", (FILE));			\
-  } while (0)
-#endif
-
-/* This is how to output a reference to a user-level label named NAME.  */
-
-#ifndef ASM_OUTPUT_LABELREF
-#define ASM_OUTPUT_LABELREF(FILE,NAME)  \
-  do {							\
-    fputs (user_label_prefix, (FILE));			\
-    fputs ((NAME), (FILE));				\
-  } while (0);
-#endif
-
-/* Allow target to print debug info labels specially.  This is useful for
-   VLIW targets, since debug info labels should go into the middle of
-   instruction bundles instead of breaking them.  */
-
-#ifndef ASM_OUTPUT_DEBUG_LABEL
-#define ASM_OUTPUT_DEBUG_LABEL(FILE, PREFIX, NUM) \
-  (*targetm.asm_out.internal_label) (FILE, PREFIX, NUM)
-#endif
-
-/* This is how we tell the assembler that a symbol is weak.  */
-#ifndef ASM_OUTPUT_WEAK_ALIAS
-#if defined (ASM_WEAKEN_LABEL) && defined (ASM_OUTPUT_DEF)
-#define ASM_OUTPUT_WEAK_ALIAS(STREAM, NAME, VALUE)	\
-  do							\
-    {							\
-      ASM_WEAKEN_LABEL (STREAM, NAME);			\
-      if (VALUE)					\
-        ASM_OUTPUT_DEF (STREAM, NAME, VALUE);		\
-    }							\
-  while (0)
-#endif
-#endif
-
-/* This is how we tell the assembler that a symbol is a weak alias to
-   another symbol that doesn't require the other symbol to be defined.
-   Uses of the former will turn into weak uses of the latter, i.e.,
-   uses that, in case the latter is undefined, will not cause errors,
-   and will add it to the symbol table as weak undefined.  However, if
-   the latter is referenced directly, a strong reference prevails.  */
-#ifndef ASM_OUTPUT_WEAKREF
-#if defined HAVE_GAS_WEAKREF
-#define ASM_OUTPUT_WEAKREF(FILE, DECL, NAME, VALUE)			\
-  do									\
-    {									\
-      fprintf ((FILE), "\t.weakref\t");					\
-      assemble_name ((FILE), (NAME));					\
-      fprintf ((FILE), ",");						\
-      assemble_name ((FILE), (VALUE));					\
-      fprintf ((FILE), "\n");						\
-    }									\
-  while (0)
-#endif
-#endif
-
-/* How to emit a .type directive.  */
-#ifndef ASM_OUTPUT_TYPE_DIRECTIVE
-#if defined TYPE_ASM_OP && defined TYPE_OPERAND_FMT
-#define ASM_OUTPUT_TYPE_DIRECTIVE(STREAM, NAME, TYPE)	\
-  do							\
-    {							\
-      fputs (TYPE_ASM_OP, STREAM);			\
-      assemble_name (STREAM, NAME);			\
-      fputs (", ", STREAM);				\
-      fprintf (STREAM, TYPE_OPERAND_FMT, TYPE);		\
-      putc ('\n', STREAM);				\
-    }							\
-  while (0)
-#endif
-#endif
-
-/* How to emit a .size directive.  */
-#ifndef ASM_OUTPUT_SIZE_DIRECTIVE
-#ifdef SIZE_ASM_OP
-#define ASM_OUTPUT_SIZE_DIRECTIVE(STREAM, NAME, SIZE)	\
-  do							\
-    {							\
-      HOST_WIDE_INT size_ = (SIZE);			\
-      fputs (SIZE_ASM_OP, STREAM);			\
-      assemble_name (STREAM, NAME);			\
-      fprintf (STREAM, ", " HOST_WIDE_INT_PRINT_DEC "\n", size_); \
-    }							\
-  while (0)
-
-#define ASM_OUTPUT_MEASURED_SIZE(STREAM, NAME)		\
-  do							\
-    {							\
-      fputs (SIZE_ASM_OP, STREAM);			\
-      assemble_name (STREAM, NAME);			\
-      fputs (", .-", STREAM);				\
-      assemble_name (STREAM, NAME);			\
-      putc ('\n', STREAM);				\
-    }							\
-  while (0)
-
-#endif
-#endif
-
-/* This determines whether or not we support weak symbols.  SUPPORTS_WEAK
-   must be a preprocessor constant.  */
-#ifndef SUPPORTS_WEAK
-#if defined (ASM_WEAKEN_LABEL) || defined (ASM_WEAKEN_DECL)
-#define SUPPORTS_WEAK 1
-#else
-#define SUPPORTS_WEAK 0
-#endif
-#endif
-
-/* This determines whether or not we support weak symbols during target
-   code generation.  TARGET_SUPPORTS_WEAK can be any valid C expression.  */
-#ifndef TARGET_SUPPORTS_WEAK
-#define TARGET_SUPPORTS_WEAK (SUPPORTS_WEAK)
-#endif
-
-/* This determines whether or not we support the discriminator
-   attribute in the .loc directive.  */
-#ifndef SUPPORTS_DISCRIMINATOR
-#ifdef HAVE_GAS_DISCRIMINATOR
-#define SUPPORTS_DISCRIMINATOR 1
-#else
-#define SUPPORTS_DISCRIMINATOR 0
-#endif
-#endif
-
-/* This determines whether or not we support link-once semantics.  */
-#ifndef SUPPORTS_ONE_ONLY
-#ifdef MAKE_DECL_ONE_ONLY
-#define SUPPORTS_ONE_ONLY 1
-#else
-#define SUPPORTS_ONE_ONLY 0
-#endif
-#endif
-
-/* This determines whether weak symbols must be left out of a static
-   archive's table of contents.  Defining this macro to be nonzero has
-   the consequence that certain symbols will not be made weak that
-   otherwise would be.  The C++ ABI requires this macro to be zero;
-   see the documentation.  */
-#ifndef TARGET_WEAK_NOT_IN_ARCHIVE_TOC
-#define TARGET_WEAK_NOT_IN_ARCHIVE_TOC 0
-#endif
-
-/* This determines whether or not we need linkonce unwind information.  */
-#ifndef TARGET_USES_WEAK_UNWIND_INFO
-#define TARGET_USES_WEAK_UNWIND_INFO 0
-#endif
-
-/* By default, there is no prefix on user-defined symbols.  */
-#ifndef USER_LABEL_PREFIX
-#define USER_LABEL_PREFIX ""
-#endif
-
-/* If the target supports weak symbols, define TARGET_ATTRIBUTE_WEAK to
-   provide a weak attribute.  Else define it to nothing.
-
-   This would normally belong in ansidecl.h, but SUPPORTS_WEAK is
-   not available at that time.
-
-   Note, this is only for use by target files which we know are to be
-   compiled by GCC.  */
-#ifndef TARGET_ATTRIBUTE_WEAK
-# if SUPPORTS_WEAK
-#  define TARGET_ATTRIBUTE_WEAK __attribute__ ((weak))
-# else
-#  define TARGET_ATTRIBUTE_WEAK
-# endif
-#endif
-
-/* By default we can assume that all global symbols are in one namespace,
-   across all shared libraries.  */
-#ifndef MULTIPLE_SYMBOL_SPACES
-# define MULTIPLE_SYMBOL_SPACES 0
-#endif
-
-/* If the target supports init_priority C++ attribute, give
-   SUPPORTS_INIT_PRIORITY a nonzero value.  */
-#ifndef SUPPORTS_INIT_PRIORITY
-#define SUPPORTS_INIT_PRIORITY 1
-#endif /* SUPPORTS_INIT_PRIORITY */
-
-/* If we have a definition of INCOMING_RETURN_ADDR_RTX, assume that
-   the rest of the DWARF 2 frame unwind support is also provided.  */
-#if !defined (DWARF2_UNWIND_INFO) && defined (INCOMING_RETURN_ADDR_RTX)
-#define DWARF2_UNWIND_INFO 1
-#endif
-
-/* If we have named sections, and we're using crtstuff to run ctors,
-   use them for registering eh frame information.  */
-#if defined (TARGET_ASM_NAMED_SECTION) && DWARF2_UNWIND_INFO \
-    && !defined (EH_FRAME_IN_DATA_SECTION)
-#ifndef EH_FRAME_SECTION_NAME
-#define EH_FRAME_SECTION_NAME ".eh_frame"
-#endif
-#endif
-
-/* On many systems, different EH table encodings are used under
-   difference circumstances.  Some will require runtime relocations;
-   some will not.  For those that do not require runtime relocations,
-   we would like to make the table read-only.  However, since the
-   read-only tables may need to be combined with read-write tables
-   that do require runtime relocation, it is not safe to make the
-   tables read-only unless the linker will merge read-only and
-   read-write sections into a single read-write section.  If your
-   linker does not have this ability, but your system is such that no
-   encoding used with non-PIC code will ever require a runtime
-   relocation, then you can define EH_TABLES_CAN_BE_READ_ONLY to 1 in
-   your target configuration file.  */
-#ifndef EH_TABLES_CAN_BE_READ_ONLY
-#ifdef HAVE_LD_RO_RW_SECTION_MIXING
-#define EH_TABLES_CAN_BE_READ_ONLY 1
-#else
-#define EH_TABLES_CAN_BE_READ_ONLY 0
-#endif
-#endif
-
-/* If we have named section and we support weak symbols, then use the
-   .jcr section for recording java classes which need to be registered
-   at program start-up time.  */
-#if defined (TARGET_ASM_NAMED_SECTION) && SUPPORTS_WEAK
-#ifndef JCR_SECTION_NAME
-#define JCR_SECTION_NAME ".jcr"
-#endif
-#endif
-
-/* This decision to use a .jcr section can be overridden by defining
-   USE_JCR_SECTION to 0 in target file.  This is necessary if target
-   can define JCR_SECTION_NAME but does not have crtstuff or
-   linker support for .jcr section.  */
-#ifndef TARGET_USE_JCR_SECTION
-#ifdef JCR_SECTION_NAME
-#define TARGET_USE_JCR_SECTION 1
-#else
-#define TARGET_USE_JCR_SECTION 0
-#endif
-#endif
-
-/* Number of hardware registers that go into the DWARF-2 unwind info.
-   If not defined, equals FIRST_PSEUDO_REGISTER  */
-
-#ifndef DWARF_FRAME_REGISTERS
-#define DWARF_FRAME_REGISTERS FIRST_PSEUDO_REGISTER
-#endif
-
-/* Offsets recorded in opcodes are a multiple of this alignment factor.  */
-#ifndef DWARF_CIE_DATA_ALIGNMENT
-#ifdef STACK_GROWS_DOWNWARD
-#define DWARF_CIE_DATA_ALIGNMENT (-((int) UNITS_PER_WORD))
-#else
-#define DWARF_CIE_DATA_ALIGNMENT ((int) UNITS_PER_WORD)
-#endif
-#endif
-
-/* The DWARF 2 CFA column which tracks the return address.  Normally this
-   is the column for PC, or the first column after all of the hard
-   registers.  */
-#ifndef DWARF_FRAME_RETURN_COLUMN
-#ifdef PC_REGNUM
-#define DWARF_FRAME_RETURN_COLUMN	DWARF_FRAME_REGNUM (PC_REGNUM)
-#else
-#define DWARF_FRAME_RETURN_COLUMN	DWARF_FRAME_REGISTERS
-#endif
-#endif
-
-/* How to renumber registers for dbx and gdb.  If not defined, assume
-   no renumbering is necessary.  */
-
-#ifndef DBX_REGISTER_NUMBER
-#define DBX_REGISTER_NUMBER(REGNO) (REGNO)
-#endif
-
-/* The mapping from gcc register number to DWARF 2 CFA column number.
-   By default, we just provide columns for all registers.  */
-#ifndef DWARF_FRAME_REGNUM
-#define DWARF_FRAME_REGNUM(REG) DBX_REGISTER_NUMBER (REG)
-#endif
-
-/* Map register numbers held in the call frame info that gcc has
-   collected using DWARF_FRAME_REGNUM to those that should be output in
-   .debug_frame and .eh_frame.  */
-#ifndef DWARF2_FRAME_REG_OUT
-#define DWARF2_FRAME_REG_OUT(REGNO, FOR_EH) (REGNO)
-#endif
-
-/* The size of addresses as they appear in the Dwarf 2 data.
-   Some architectures use word addresses to refer to code locations,
-   but Dwarf 2 info always uses byte addresses.  On such machines,
-   Dwarf 2 addresses need to be larger than the architecture's
-   pointers.  */
-#ifndef DWARF2_ADDR_SIZE
-#define DWARF2_ADDR_SIZE (POINTER_SIZE / BITS_PER_UNIT)
-#endif
-
-/* The size in bytes of a DWARF field indicating an offset or length
-   relative to a debug info section, specified to be 4 bytes in the
-   DWARF-2 specification.  The SGI/MIPS ABI defines it to be the same
-   as PTR_SIZE.  */
-#ifndef DWARF_OFFSET_SIZE
-#define DWARF_OFFSET_SIZE 4
-#endif
-
-/* The size in bytes of a DWARF 4 type signature.  */
-#ifndef DWARF_TYPE_SIGNATURE_SIZE
-#define DWARF_TYPE_SIGNATURE_SIZE 8
-#endif
-
-/* Default sizes for base C types.  If the sizes are different for
-   your target, you should override these values by defining the
-   appropriate symbols in your tm.h file.  */
-
-#ifndef BITS_PER_WORD
-#define BITS_PER_WORD (BITS_PER_UNIT * UNITS_PER_WORD)
-#endif
-
-#ifndef CHAR_TYPE_SIZE
-#define CHAR_TYPE_SIZE BITS_PER_UNIT
-#endif
-
-#ifndef BOOL_TYPE_SIZE
-/* `bool' has size and alignment `1', on almost all platforms.  */
-#define BOOL_TYPE_SIZE CHAR_TYPE_SIZE
-#endif
-
-#ifndef SHORT_TYPE_SIZE
-#define SHORT_TYPE_SIZE (BITS_PER_UNIT * MIN ((UNITS_PER_WORD + 1) / 2, 2))
-#endif
-
-#ifndef INT_TYPE_SIZE
-#define INT_TYPE_SIZE BITS_PER_WORD
-#endif
-
-#ifndef LONG_TYPE_SIZE
-#define LONG_TYPE_SIZE BITS_PER_WORD
-#endif
-
-#ifndef LONG_LONG_TYPE_SIZE
-#define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
-#endif
-
-#ifndef WCHAR_TYPE_SIZE
-#define WCHAR_TYPE_SIZE INT_TYPE_SIZE
-#endif
-
-#ifndef FLOAT_TYPE_SIZE
-#define FLOAT_TYPE_SIZE BITS_PER_WORD
-#endif
-
-#ifndef DOUBLE_TYPE_SIZE
-#define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
-#endif
-
-#ifndef LONG_DOUBLE_TYPE_SIZE
-#define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
-#endif
-
-#ifndef DECIMAL32_TYPE_SIZE
-#define DECIMAL32_TYPE_SIZE 32
-#endif
-
-#ifndef DECIMAL64_TYPE_SIZE
-#define DECIMAL64_TYPE_SIZE 64
-#endif
-
-#ifndef DECIMAL128_TYPE_SIZE
-#define DECIMAL128_TYPE_SIZE 128
-#endif
-
-#ifndef SHORT_FRACT_TYPE_SIZE
-#define SHORT_FRACT_TYPE_SIZE BITS_PER_UNIT
-#endif
-
-#ifndef FRACT_TYPE_SIZE
-#define FRACT_TYPE_SIZE (BITS_PER_UNIT * 2)
-#endif
-
-#ifndef LONG_FRACT_TYPE_SIZE
-#define LONG_FRACT_TYPE_SIZE (BITS_PER_UNIT * 4)
-#endif
-
-#ifndef LONG_LONG_FRACT_TYPE_SIZE
-#define LONG_LONG_FRACT_TYPE_SIZE (BITS_PER_UNIT * 8)
-#endif
-
-#ifndef SHORT_ACCUM_TYPE_SIZE
-#define SHORT_ACCUM_TYPE_SIZE (SHORT_FRACT_TYPE_SIZE * 2)
-#endif
-
-#ifndef ACCUM_TYPE_SIZE
-#define ACCUM_TYPE_SIZE (FRACT_TYPE_SIZE * 2)
-#endif
-
-#ifndef LONG_ACCUM_TYPE_SIZE
-#define LONG_ACCUM_TYPE_SIZE (LONG_FRACT_TYPE_SIZE * 2)
-#endif
-
-#ifndef LONG_LONG_ACCUM_TYPE_SIZE
-#define LONG_LONG_ACCUM_TYPE_SIZE (LONG_LONG_FRACT_TYPE_SIZE * 2)
-#endif
-
-/* We let tm.h override the types used here, to handle trivial differences
-   such as the choice of unsigned int or long unsigned int for size_t.
-   When machines start needing nontrivial differences in the size type,
-   it would be best to do something here to figure out automatically
-   from other information what type to use.  */
-
-#ifndef SIZE_TYPE
-#define SIZE_TYPE "long unsigned int"
-#endif
-
-#ifndef SIZETYPE
-#define SIZETYPE SIZE_TYPE
-#endif
-
-#ifndef PID_TYPE
-#define PID_TYPE "int"
-#endif
-
-/* If GCC knows the exact uint_least16_t and uint_least32_t types from
-   <stdint.h>, use them for char16_t and char32_t.  Otherwise, use
-   these guesses; getting the wrong type of a given width will not
-   affect C++ name mangling because in C++ these are distinct types
-   not typedefs.  */
-
-#ifdef UINT_LEAST16_TYPE
-#define CHAR16_TYPE UINT_LEAST16_TYPE
-#else
-#define CHAR16_TYPE "short unsigned int"
-#endif
-
-#ifdef UINT_LEAST32_TYPE
-#define CHAR32_TYPE UINT_LEAST32_TYPE
-#else
-#define CHAR32_TYPE "unsigned int"
-#endif
-
-#ifndef WCHAR_TYPE
-#define WCHAR_TYPE "int"
-#endif
-
-/* WCHAR_TYPE gets overridden by -fshort-wchar.  */
-#define MODIFIED_WCHAR_TYPE \
-	(flag_short_wchar ? "short unsigned int" : WCHAR_TYPE)
-
-#ifndef PTRDIFF_TYPE
-#define PTRDIFF_TYPE "long int"
-#endif
-
-#ifndef WINT_TYPE
-#define WINT_TYPE "unsigned int"
-#endif
-
-#ifndef INTMAX_TYPE
-#define INTMAX_TYPE ((INT_TYPE_SIZE == LONG_LONG_TYPE_SIZE)	\
-		     ? "int"					\
-		     : ((LONG_TYPE_SIZE == LONG_LONG_TYPE_SIZE)	\
-			? "long int"				\
-			: "long long int"))
-#endif
-
-#ifndef UINTMAX_TYPE
-#define UINTMAX_TYPE ((INT_TYPE_SIZE == LONG_LONG_TYPE_SIZE)	\
-		     ? "unsigned int"				\
-		     : ((LONG_TYPE_SIZE == LONG_LONG_TYPE_SIZE)	\
-			? "long unsigned int"			\
-			: "long long unsigned int"))
-#endif
-
-
-/* There are no default definitions of these <stdint.h> types.  */
-
-#ifndef SIG_ATOMIC_TYPE
-#define SIG_ATOMIC_TYPE ((const char *) NULL)
-#endif
-
-#ifndef INT8_TYPE
-#define INT8_TYPE ((const char *) NULL)
-#endif
-
-#ifndef INT16_TYPE
-#define INT16_TYPE ((const char *) NULL)
-#endif
-
-#ifndef INT32_TYPE
-#define INT32_TYPE ((const char *) NULL)
-#endif
-
-#ifndef INT64_TYPE
-#define INT64_TYPE ((const char *) NULL)
-#endif
-
-#ifndef UINT8_TYPE
-#define UINT8_TYPE ((const char *) NULL)
-#endif
-
-#ifndef UINT16_TYPE
-#define UINT16_TYPE ((const char *) NULL)
-#endif
-
-#ifndef UINT32_TYPE
-#define UINT32_TYPE ((const char *) NULL)
-#endif
-
-#ifndef UINT64_TYPE
-#define UINT64_TYPE ((const char *) NULL)
-#endif
-
-#ifndef INT_LEAST8_TYPE
-#define INT_LEAST8_TYPE ((const char *) NULL)
-#endif
-
-#ifndef INT_LEAST16_TYPE
-#define INT_LEAST16_TYPE ((const char *) NULL)
-#endif
-
-#ifndef INT_LEAST32_TYPE
-#define INT_LEAST32_TYPE ((const char *) NULL)
-#endif
-
-#ifndef INT_LEAST64_TYPE
-#define INT_LEAST64_TYPE ((const char *) NULL)
-#endif
-
-#ifndef UINT_LEAST8_TYPE
-#define UINT_LEAST8_TYPE ((const char *) NULL)
-#endif
-
-#ifndef UINT_LEAST16_TYPE
-#define UINT_LEAST16_TYPE ((const char *) NULL)
-#endif
-
-#ifndef UINT_LEAST32_TYPE
-#define UINT_LEAST32_TYPE ((const char *) NULL)
-#endif
-
-#ifndef UINT_LEAST64_TYPE
-#define UINT_LEAST64_TYPE ((const char *) NULL)
-#endif
-
-#ifndef INT_FAST8_TYPE
-#define INT_FAST8_TYPE ((const char *) NULL)
-#endif
-
-#ifndef INT_FAST16_TYPE
-#define INT_FAST16_TYPE ((const char *) NULL)
-#endif
-
-#ifndef INT_FAST32_TYPE
-#define INT_FAST32_TYPE ((const char *) NULL)
-#endif
-
-#ifndef INT_FAST64_TYPE
-#define INT_FAST64_TYPE ((const char *) NULL)
-#endif
-
-#ifndef UINT_FAST8_TYPE
-#define UINT_FAST8_TYPE ((const char *) NULL)
-#endif
-
-#ifndef UINT_FAST16_TYPE
-#define UINT_FAST16_TYPE ((const char *) NULL)
-#endif
-
-#ifndef UINT_FAST32_TYPE
-#define UINT_FAST32_TYPE ((const char *) NULL)
-#endif
-
-#ifndef UINT_FAST64_TYPE
-#define UINT_FAST64_TYPE ((const char *) NULL)
-#endif
-
-#ifndef INTPTR_TYPE
-#define INTPTR_TYPE ((const char *) NULL)
-#endif
-
-#ifndef UINTPTR_TYPE
-#define UINTPTR_TYPE ((const char *) NULL)
-#endif
-
-/* Width in bits of a pointer.  Mind the value of the macro `Pmode'.  */
-#ifndef POINTER_SIZE
-#define POINTER_SIZE BITS_PER_WORD
-#endif
-
-#ifndef PIC_OFFSET_TABLE_REGNUM
-#define PIC_OFFSET_TABLE_REGNUM INVALID_REGNUM
-#endif
-
-#ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
-#define PIC_OFFSET_TABLE_REG_CALL_CLOBBERED 0
-#endif
-
-#ifndef TARGET_DLLIMPORT_DECL_ATTRIBUTES
-#define TARGET_DLLIMPORT_DECL_ATTRIBUTES 0
-#endif
-
-#ifndef TARGET_DECLSPEC
-#if TARGET_DLLIMPORT_DECL_ATTRIBUTES
-/* If the target supports the "dllimport" attribute, users are
-   probably used to the "__declspec" syntax.  */
-#define TARGET_DECLSPEC 1
-#else
-#define TARGET_DECLSPEC 0
-#endif
-#endif
-
-/* By default, the preprocessor should be invoked the same way in C++
-   as in C.  */
-#ifndef CPLUSPLUS_CPP_SPEC
-#ifdef CPP_SPEC
-#define CPLUSPLUS_CPP_SPEC CPP_SPEC
-#endif
-#endif
-
-#ifndef ACCUMULATE_OUTGOING_ARGS
-#define ACCUMULATE_OUTGOING_ARGS 0
-#endif
-
-/* By default, use the GNU runtime for Objective C.  */
-#ifndef NEXT_OBJC_RUNTIME
-#define NEXT_OBJC_RUNTIME 0
-#endif
-
-/* Supply a default definition for PUSH_ARGS.  */
-#ifndef PUSH_ARGS
-#ifdef PUSH_ROUNDING
-#define PUSH_ARGS	!ACCUMULATE_OUTGOING_ARGS
-#else
-#define PUSH_ARGS	0
-#endif
-#endif
-
-/* Decide whether a function's arguments should be processed
-   from first to last or from last to first.
-
-   They should if the stack and args grow in opposite directions, but
-   only if we have push insns.  */
-
-#ifdef PUSH_ROUNDING
-
-#ifndef PUSH_ARGS_REVERSED
-#if defined (STACK_GROWS_DOWNWARD) != defined (ARGS_GROW_DOWNWARD)
-#define PUSH_ARGS_REVERSED  PUSH_ARGS
-#endif
-#endif
-
-#endif
-
-#ifndef PUSH_ARGS_REVERSED
-#define PUSH_ARGS_REVERSED 0
-#endif
-
-/* Default value for the alignment (in bits) a C conformant malloc has to
-   provide. This default is intended to be safe and always correct.  */
-#ifndef MALLOC_ABI_ALIGNMENT
-#define MALLOC_ABI_ALIGNMENT BITS_PER_WORD
-#endif
-
-/* If PREFERRED_STACK_BOUNDARY is not defined, set it to STACK_BOUNDARY.
-   STACK_BOUNDARY is required.  */
-#ifndef PREFERRED_STACK_BOUNDARY
-#define PREFERRED_STACK_BOUNDARY STACK_BOUNDARY
-#endif
-
-/* Set INCOMING_STACK_BOUNDARY to PREFERRED_STACK_BOUNDARY if it is not
-   defined.  */
-#ifndef INCOMING_STACK_BOUNDARY
-#define INCOMING_STACK_BOUNDARY PREFERRED_STACK_BOUNDARY
-#endif
-
-#ifndef TARGET_DEFAULT_PACK_STRUCT
-#define TARGET_DEFAULT_PACK_STRUCT 0
-#endif
-
-/* By default, the vtable entries are void pointers, the so the alignment
-   is the same as pointer alignment.  The value of this macro specifies
-   the alignment of the vtable entry in bits.  It should be defined only
-   when special alignment is necessary.  */
-#ifndef TARGET_VTABLE_ENTRY_ALIGN
-#define TARGET_VTABLE_ENTRY_ALIGN POINTER_SIZE
-#endif
-
-/* There are a few non-descriptor entries in the vtable at offsets below
-   zero.  If these entries must be padded (say, to preserve the alignment
-   specified by TARGET_VTABLE_ENTRY_ALIGN), set this to the number of
-   words in each data entry.  */
-#ifndef TARGET_VTABLE_DATA_ENTRY_DISTANCE
-#define TARGET_VTABLE_DATA_ENTRY_DISTANCE 1
-#endif
-
-/* Decide whether it is safe to use a local alias for a virtual function
-   when constructing thunks.  */
-#ifndef TARGET_USE_LOCAL_THUNK_ALIAS_P
-#ifdef ASM_OUTPUT_DEF
-#define TARGET_USE_LOCAL_THUNK_ALIAS_P(DECL) 1
-#else
-#define TARGET_USE_LOCAL_THUNK_ALIAS_P(DECL) 0
-#endif
-#endif
-
-/* Select a format to encode pointers in exception handling data.  We
-   prefer those that result in fewer dynamic relocations.  Assume no
-   special support here and encode direct references.  */
-#ifndef ASM_PREFERRED_EH_DATA_FORMAT
-#define ASM_PREFERRED_EH_DATA_FORMAT(CODE,GLOBAL)  DW_EH_PE_absptr
-#endif
-
-/* By default, the C++ compiler will use the lowest bit of the pointer
-   to function to indicate a pointer-to-member-function points to a
-   virtual member function.  However, if FUNCTION_BOUNDARY indicates
-   function addresses aren't always even, the lowest bit of the delta
-   field will be used.  */
-#ifndef TARGET_PTRMEMFUNC_VBIT_LOCATION
-#define TARGET_PTRMEMFUNC_VBIT_LOCATION \
-  (FUNCTION_BOUNDARY >= 2 * BITS_PER_UNIT \
-   ? ptrmemfunc_vbit_in_pfn : ptrmemfunc_vbit_in_delta)
-#endif
-
-#ifndef DEFAULT_GDB_EXTENSIONS
-#define DEFAULT_GDB_EXTENSIONS 1
-#endif
-
-/* If more than one debugging type is supported, you must define
-   PREFERRED_DEBUGGING_TYPE to choose the default.  */
-
-#if 1 < (defined (DBX_DEBUGGING_INFO) + defined (SDB_DEBUGGING_INFO) \
-         + defined (DWARF2_DEBUGGING_INFO) + defined (XCOFF_DEBUGGING_INFO) \
-         + defined (VMS_DEBUGGING_INFO))
-#ifndef PREFERRED_DEBUGGING_TYPE
-#error You must define PREFERRED_DEBUGGING_TYPE
-#endif /* no PREFERRED_DEBUGGING_TYPE */
-
-/* If only one debugging format is supported, define PREFERRED_DEBUGGING_TYPE
-   here so other code needn't care.  */
-#elif defined DBX_DEBUGGING_INFO
-#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
-
-#elif defined SDB_DEBUGGING_INFO
-#define PREFERRED_DEBUGGING_TYPE SDB_DEBUG
-
-#elif defined DWARF2_DEBUGGING_INFO
-#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
-
-#elif defined VMS_DEBUGGING_INFO
-#define PREFERRED_DEBUGGING_TYPE VMS_AND_DWARF2_DEBUG
-
-#elif defined XCOFF_DEBUGGING_INFO
-#define PREFERRED_DEBUGGING_TYPE XCOFF_DEBUG
-
-#else
-/* No debugging format is supported by this target.  */
-#define PREFERRED_DEBUGGING_TYPE NO_DEBUG
-#endif
-
-#ifndef LARGEST_EXPONENT_IS_NORMAL
-#define LARGEST_EXPONENT_IS_NORMAL(SIZE) 0
-#endif
-
-#ifndef ROUND_TOWARDS_ZERO
-#define ROUND_TOWARDS_ZERO 0
-#endif
-
-#ifndef FLOAT_LIB_COMPARE_RETURNS_BOOL
-#define FLOAT_LIB_COMPARE_RETURNS_BOOL(MODE, COMPARISON) false
-#endif
-
-/* True if the targets integer-comparison functions return { 0, 1, 2
-   } to indicate { <, ==, > }.  False if { -1, 0, 1 } is used
-   instead.  The libgcc routines are biased.  */
-#ifndef TARGET_LIB_INT_CMP_BIASED
-#define TARGET_LIB_INT_CMP_BIASED (true)
-#endif
-
-/* If FLOAT_WORDS_BIG_ENDIAN is not defined in the header files,
-   then the word-endianness is the same as for integers.  */
-#ifndef FLOAT_WORDS_BIG_ENDIAN
-#define FLOAT_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN
-#endif
-
-#ifndef REG_WORDS_BIG_ENDIAN
-#define REG_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN
-#endif
-
-#ifdef TARGET_FLT_EVAL_METHOD
-#define TARGET_FLT_EVAL_METHOD_NON_DEFAULT 1
-#else
-#define TARGET_FLT_EVAL_METHOD 0
-#define TARGET_FLT_EVAL_METHOD_NON_DEFAULT 0
-#endif
-
-#ifndef TARGET_DEC_EVAL_METHOD
-#define TARGET_DEC_EVAL_METHOD 2
-#endif
-
-#ifndef HAS_LONG_COND_BRANCH
-#define HAS_LONG_COND_BRANCH 0
-#endif
-
-#ifndef HAS_LONG_UNCOND_BRANCH
-#define HAS_LONG_UNCOND_BRANCH 0
-#endif
-
-/* Determine whether __cxa_atexit, rather than atexit, is used to
-   register C++ destructors for local statics and global objects.  */
-#ifndef DEFAULT_USE_CXA_ATEXIT
-#define DEFAULT_USE_CXA_ATEXIT 0
-#endif
-
-/* If none of these macros are defined, the port must use the new
-   technique of defining constraints in the machine description.
-   tm_p.h will define those macros that machine-independent code
-   still uses.  */
-#if  !defined CONSTRAINT_LEN			\
-  && !defined REG_CLASS_FROM_LETTER		\
-  && !defined REG_CLASS_FROM_CONSTRAINT		\
-  && !defined CONST_OK_FOR_LETTER_P		\
-  && !defined CONST_OK_FOR_CONSTRAINT_P		\
-  && !defined CONST_DOUBLE_OK_FOR_LETTER_P	\
-  && !defined CONST_DOUBLE_OK_FOR_CONSTRAINT_P  \
-  && !defined EXTRA_CONSTRAINT			\
-  && !defined EXTRA_CONSTRAINT_STR		\
-  && !defined EXTRA_MEMORY_CONSTRAINT		\
-  && !defined EXTRA_ADDRESS_CONSTRAINT
-
-#define USE_MD_CONSTRAINTS
-
-#if GCC_VERSION >= 3000 && defined IN_GCC
-/* These old constraint macros shouldn't appear anywhere in a
-   configuration using MD constraint definitions.  */
-#pragma GCC poison REG_CLASS_FROM_LETTER CONST_OK_FOR_LETTER_P \
-                   CONST_DOUBLE_OK_FOR_LETTER_P EXTRA_CONSTRAINT
-#endif
-
-#else /* old constraint mechanism in use */
-
-/* Determine whether extra constraint letter should be handled
-   via address reload (like 'o').  */
-#ifndef EXTRA_MEMORY_CONSTRAINT
-#define EXTRA_MEMORY_CONSTRAINT(C,STR) 0
-#endif
-
-/* Determine whether extra constraint letter should be handled
-   as an address (like 'p').  */
-#ifndef EXTRA_ADDRESS_CONSTRAINT
-#define EXTRA_ADDRESS_CONSTRAINT(C,STR) 0
-#endif
-
-/* When a port defines CONSTRAINT_LEN, it should use DEFAULT_CONSTRAINT_LEN
-   for all the characters that it does not want to change, so things like the
-  'length' of a digit in a matching constraint is an implementation detail,
-   and not part of the interface.  */
-#define DEFAULT_CONSTRAINT_LEN(C,STR) 1
-
-#ifndef CONSTRAINT_LEN
-#define CONSTRAINT_LEN(C,STR) DEFAULT_CONSTRAINT_LEN (C, STR)
-#endif
-
-#if defined (CONST_OK_FOR_LETTER_P) && ! defined (CONST_OK_FOR_CONSTRAINT_P)
-#define CONST_OK_FOR_CONSTRAINT_P(VAL,C,STR) CONST_OK_FOR_LETTER_P (VAL, C)
-#endif
-
-#if defined (CONST_DOUBLE_OK_FOR_LETTER_P) && ! defined (CONST_DOUBLE_OK_FOR_CONSTRAINT_P)
-#define CONST_DOUBLE_OK_FOR_CONSTRAINT_P(OP,C,STR) \
-  CONST_DOUBLE_OK_FOR_LETTER_P (OP, C)
-#endif
-
-#ifndef REG_CLASS_FROM_CONSTRAINT
-#define REG_CLASS_FROM_CONSTRAINT(C,STR) REG_CLASS_FROM_LETTER (C)
-#endif
-
-#if defined (EXTRA_CONSTRAINT) && ! defined (EXTRA_CONSTRAINT_STR)
-#define EXTRA_CONSTRAINT_STR(OP, C,STR) EXTRA_CONSTRAINT (OP, C)
-#endif
-
-#endif /* old constraint mechanism in use */
-
-/* Determin whether the target runtime library is Bionic */
-#ifndef TARGET_HAS_BIONIC
-#define TARGET_HAS_BIONIC 0
-#endif
-
-/* Indicate that CLZ and CTZ are undefined at zero.  */
-#ifndef CLZ_DEFINED_VALUE_AT_ZERO
-#define CLZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE)  0
-#endif
-#ifndef CTZ_DEFINED_VALUE_AT_ZERO
-#define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE)  0
-#endif
-
-/* Provide a default value for STORE_FLAG_VALUE.  */
-#ifndef STORE_FLAG_VALUE
-#define STORE_FLAG_VALUE  1
-#endif
-
-/* This macro is used to determine what the largest unit size that
-   move_by_pieces can use is.  */
-
-/* MOVE_MAX_PIECES is the number of bytes at a time which we can
-   move efficiently, as opposed to  MOVE_MAX which is the maximum
-   number of bytes we can move with a single instruction.  */
-
-#ifndef MOVE_MAX_PIECES
-#define MOVE_MAX_PIECES   MOVE_MAX
-#endif
-
-#ifndef MAX_MOVE_MAX
-#define MAX_MOVE_MAX MOVE_MAX
-#endif
-
-#ifndef MIN_UNITS_PER_WORD
-#define MIN_UNITS_PER_WORD UNITS_PER_WORD
-#endif
-
-#ifndef MAX_BITS_PER_WORD
-#define MAX_BITS_PER_WORD BITS_PER_WORD
-#endif
-
-#ifndef STACK_POINTER_OFFSET
-#define STACK_POINTER_OFFSET    0
-#endif
-
-#ifndef LOCAL_REGNO
-#define LOCAL_REGNO(REGNO)  0
-#endif
-
-/* EXIT_IGNORE_STACK should be nonzero if, when returning from a function,
-   the stack pointer does not matter.  The value is tested only in
-   functions that have frame pointers.  */
-#ifndef EXIT_IGNORE_STACK
-#define EXIT_IGNORE_STACK 0
-#endif
-
-/* Assume that case vectors are not pc-relative.  */
-#ifndef CASE_VECTOR_PC_RELATIVE
-#define CASE_VECTOR_PC_RELATIVE 0
-#endif
-
-/* Assume that trampolines need function alignment.  */
-#ifndef TRAMPOLINE_ALIGNMENT
-#define TRAMPOLINE_ALIGNMENT FUNCTION_BOUNDARY
-#endif
-
-/* Register mappings for target machines without register windows.  */
-#ifndef INCOMING_REGNO
-#define INCOMING_REGNO(N) (N)
-#endif
-
-#ifndef OUTGOING_REGNO
-#define OUTGOING_REGNO(N) (N)
-#endif
-
-#ifndef SHIFT_COUNT_TRUNCATED
-#define SHIFT_COUNT_TRUNCATED 0
-#endif
-
-#ifndef LEGITIMATE_PIC_OPERAND_P
-#define LEGITIMATE_PIC_OPERAND_P(X) 1
-#endif
-
-#ifndef TARGET_MEM_CONSTRAINT
-#define TARGET_MEM_CONSTRAINT 'm'
-#endif
-
-#ifndef REVERSIBLE_CC_MODE
-#define REVERSIBLE_CC_MODE(MODE) 0
-#endif
-
-/* Biggest alignment supported by the object file format of this machine.  */
-#ifndef MAX_OFILE_ALIGNMENT
-#define MAX_OFILE_ALIGNMENT BIGGEST_ALIGNMENT
-#endif
-
-#ifndef FRAME_GROWS_DOWNWARD
-#define FRAME_GROWS_DOWNWARD 0
-#endif
-
-/* On most machines, the CFA coincides with the first incoming parm.  */
-#ifndef ARG_POINTER_CFA_OFFSET
-#define ARG_POINTER_CFA_OFFSET(FNDECL) \
-  (FIRST_PARM_OFFSET (FNDECL) + crtl->args.pretend_args_size)
-#endif
-
-/* On most machines, we use the CFA as DW_AT_frame_base.  */
-#ifndef CFA_FRAME_BASE_OFFSET
-#define CFA_FRAME_BASE_OFFSET(FNDECL) 0
-#endif
-
-/* The offset from the incoming value of %sp to the top of the stack frame
-   for the current function.  */
-#ifndef INCOMING_FRAME_SP_OFFSET
-#define INCOMING_FRAME_SP_OFFSET 0
-#endif
-
-#ifndef HARD_REGNO_NREGS_HAS_PADDING
-#define HARD_REGNO_NREGS_HAS_PADDING(REGNO, MODE) 0
-#define HARD_REGNO_NREGS_WITH_PADDING(REGNO, MODE) -1
-#endif
-
-#ifndef OUTGOING_REG_PARM_STACK_SPACE
-#define OUTGOING_REG_PARM_STACK_SPACE(FNTYPE) 0
-#endif
-
-/* MAX_STACK_ALIGNMENT is the maximum stack alignment guaranteed by
-   the backend.  MAX_SUPPORTED_STACK_ALIGNMENT is the maximum best
-   effort stack alignment supported by the backend.  If the backend
-   supports stack alignment, MAX_SUPPORTED_STACK_ALIGNMENT and
-   MAX_STACK_ALIGNMENT are the same.  Otherwise, the incoming stack
-   boundary will limit the maximum guaranteed stack alignment.  */
-#ifdef MAX_STACK_ALIGNMENT
-#define MAX_SUPPORTED_STACK_ALIGNMENT MAX_STACK_ALIGNMENT
-#else
-#define MAX_STACK_ALIGNMENT STACK_BOUNDARY
-#define MAX_SUPPORTED_STACK_ALIGNMENT PREFERRED_STACK_BOUNDARY
-#endif
-
-#define SUPPORTS_STACK_ALIGNMENT (MAX_STACK_ALIGNMENT > STACK_BOUNDARY)
-
-#ifndef LOCAL_ALIGNMENT
-#define LOCAL_ALIGNMENT(TYPE, ALIGNMENT) ALIGNMENT
-#endif
-
-#ifndef STACK_SLOT_ALIGNMENT
-#define STACK_SLOT_ALIGNMENT(TYPE,MODE,ALIGN) \
-  ((TYPE) ? LOCAL_ALIGNMENT ((TYPE), (ALIGN)) : (ALIGN))
-#endif
-
-#ifndef LOCAL_DECL_ALIGNMENT
-#define LOCAL_DECL_ALIGNMENT(DECL) \
-  LOCAL_ALIGNMENT (TREE_TYPE (DECL), DECL_ALIGN (DECL))
-#endif
-
-#ifndef MINIMUM_ALIGNMENT
-#define MINIMUM_ALIGNMENT(EXP,MODE,ALIGN) (ALIGN)
-#endif
-
-/* Alignment value for attribute ((aligned)).  */
-#ifndef ATTRIBUTE_ALIGNED_VALUE
-#define ATTRIBUTE_ALIGNED_VALUE BIGGEST_ALIGNMENT
-#endif
-
-#ifndef SLOW_UNALIGNED_ACCESS
-#define SLOW_UNALIGNED_ACCESS(MODE, ALIGN) STRICT_ALIGNMENT
-#endif
-
-/* For most ports anything that evaluates to a constant symbolic
-   or integer value is acceptable as a constant address.  */
-#ifndef CONSTANT_ADDRESS_P
-#define CONSTANT_ADDRESS_P(X)   (CONSTANT_P (X) && GET_CODE (X) != CONST_DOUBLE)
-#endif
-
-#ifndef MAX_FIXED_MODE_SIZE
-#define MAX_FIXED_MODE_SIZE GET_MODE_BITSIZE (DImode)
-#endif
-
-/* Nonzero if structures and unions should be returned in memory.
-
-   This should only be defined if compatibility with another compiler or
-   with an ABI is needed, because it results in slower code.  */
-
-#ifndef DEFAULT_PCC_STRUCT_RETURN
-#define DEFAULT_PCC_STRUCT_RETURN 1
-#endif
-
-#ifdef GCC_INSN_FLAGS_H
-/* Dependent default target macro definitions
-
-   This section of defaults.h defines target macros that depend on generated
-   headers.  This is a bit awkward:  We want to put all default definitions
-   for target macros in defaults.h, but some of the defaults depend on the
-   HAVE_* flags defines of insn-flags.h.  But insn-flags.h is not always
-   included by files that do include defaults.h.
-
-   Fortunately, the default macro definitions that depend on the HAVE_*
-   macros are also the ones that will only be used inside GCC itself, i.e.
-   not in the gen* programs or in target objects like libgcc.
-
-   Obviously, it would be best to keep this section of defaults.h as small
-   as possible, by converting the macros defined below to target hooks or
-   functions.
-*/
-
-/* The default branch cost is 1.  */
-#ifndef BRANCH_COST
-#define BRANCH_COST(speed_p, predictable_p) 1
-#endif
-
-/* If a memory-to-memory move would take MOVE_RATIO or more simple
-   move-instruction sequences, we will do a movmem or libcall instead.  */
-
-#ifndef MOVE_RATIO
-#if defined (HAVE_movmemqi) || defined (HAVE_movmemhi) || defined (HAVE_movmemsi) || defined (HAVE_movmemdi) || defined (HAVE_movmemti)
-#define MOVE_RATIO(speed) 2
-#else
-/* If we are optimizing for space (-Os), cut down the default move ratio.  */
-#define MOVE_RATIO(speed) ((speed) ? 15 : 3)
-#endif
-#endif
-
-/* If a clear memory operation would take CLEAR_RATIO or more simple
-   move-instruction sequences, we will do a setmem or libcall instead.  */
-
-#ifndef CLEAR_RATIO
-#if defined (HAVE_setmemqi) || defined (HAVE_setmemhi) || defined (HAVE_setmemsi) || defined (HAVE_setmemdi) || defined (HAVE_setmemti)
-#define CLEAR_RATIO(speed) 2
-#else
-/* If we are optimizing for space, cut down the default clear ratio.  */
-#define CLEAR_RATIO(speed) ((speed) ? 15 :3)
-#endif
-#endif
-
-/* If a memory set (to value other than zero) operation would take
-   SET_RATIO or more simple move-instruction sequences, we will do a movmem
-   or libcall instead.  */
-#ifndef SET_RATIO
-#define SET_RATIO(speed) MOVE_RATIO (speed)
-#endif
-
-/* Supply a default definition for FUNCTION_ARG_PADDING:
-   usually pad upward, but pad short args downward on
-   big-endian machines.  */
-
-#define DEFAULT_FUNCTION_ARG_PADDING(MODE, TYPE)			\
-  (! BYTES_BIG_ENDIAN							\
-   ? upward								\
-   : (((MODE) == BLKmode						\
-       ? ((TYPE) && TREE_CODE (TYPE_SIZE (TYPE)) == INTEGER_CST		\
-	  && int_size_in_bytes (TYPE) < (PARM_BOUNDARY / BITS_PER_UNIT)) \
-       : GET_MODE_BITSIZE (MODE) < PARM_BOUNDARY)			\
-      ? downward : upward))
-
-#ifndef FUNCTION_ARG_PADDING
-#define FUNCTION_ARG_PADDING(MODE, TYPE)	\
-  DEFAULT_FUNCTION_ARG_PADDING ((MODE), (TYPE))
-#endif
-
-/* Supply a default definition of STACK_SAVEAREA_MODE for emit_stack_save.
-   Normally move_insn, so Pmode stack pointer.  */
-
-#ifndef STACK_SAVEAREA_MODE
-#define STACK_SAVEAREA_MODE(LEVEL) Pmode
-#endif
-
-/* Supply a default definition of STACK_SIZE_MODE for
-   allocate_dynamic_stack_space.  Normally PLUS/MINUS, so word_mode.  */
-
-#ifndef STACK_SIZE_MODE
-#define STACK_SIZE_MODE word_mode
-#endif
-
-/* Provide default values for the macros controlling stack checking.  */
-
-/* The default is neither full builtin stack checking...  */
-#ifndef STACK_CHECK_BUILTIN
-#define STACK_CHECK_BUILTIN 0
-#endif
-
-/* ...nor static builtin stack checking.  */
-#ifndef STACK_CHECK_STATIC_BUILTIN
-#define STACK_CHECK_STATIC_BUILTIN 0
-#endif
-
-/* The default interval is one page (4096 bytes).  */
-#ifndef STACK_CHECK_PROBE_INTERVAL_EXP
-#define STACK_CHECK_PROBE_INTERVAL_EXP 12
-#endif
-
-/* The default is not to move the stack pointer.  */
-#ifndef STACK_CHECK_MOVING_SP
-#define STACK_CHECK_MOVING_SP 0
-#endif
-
-/* This is a kludge to try to capture the discrepancy between the old
-   mechanism (generic stack checking) and the new mechanism (static
-   builtin stack checking).  STACK_CHECK_PROTECT needs to be bumped
-   for the latter because part of the protection area is effectively
-   included in STACK_CHECK_MAX_FRAME_SIZE for the former.  */
-#ifdef STACK_CHECK_PROTECT
-#define STACK_OLD_CHECK_PROTECT STACK_CHECK_PROTECT
-#else
-#define STACK_OLD_CHECK_PROTECT						\
- (targetm_common.except_unwind_info (&global_options) == UI_SJLJ	\
-  ? 75 * UNITS_PER_WORD							\
-  : 8 * 1024)
-#endif
-
-/* Minimum amount of stack required to recover from an anticipated stack
-   overflow detection.  The default value conveys an estimate of the amount
-   of stack required to propagate an exception.  */
-#ifndef STACK_CHECK_PROTECT
-#define STACK_CHECK_PROTECT						\
- (targetm_common.except_unwind_info (&global_options) == UI_SJLJ	\
-  ? 75 * UNITS_PER_WORD							\
-  : 12 * 1024)
-#endif
-
-/* Make the maximum frame size be the largest we can and still only need
-   one probe per function.  */
-#ifndef STACK_CHECK_MAX_FRAME_SIZE
-#define STACK_CHECK_MAX_FRAME_SIZE \
-  ((1 << STACK_CHECK_PROBE_INTERVAL_EXP) - UNITS_PER_WORD)
-#endif
-
-/* This is arbitrary, but should be large enough everywhere.  */
-#ifndef STACK_CHECK_FIXED_FRAME_SIZE
-#define STACK_CHECK_FIXED_FRAME_SIZE (4 * UNITS_PER_WORD)
-#endif
-
-/* Provide a reasonable default for the maximum size of an object to
-   allocate in the fixed frame.  We may need to be able to make this
-   controllable by the user at some point.  */
-#ifndef STACK_CHECK_MAX_VAR_SIZE
-#define STACK_CHECK_MAX_VAR_SIZE (STACK_CHECK_MAX_FRAME_SIZE / 100)
-#endif
-
-/* By default, the C++ compiler will use function addresses in the
-   vtable entries.  Setting this nonzero tells the compiler to use
-   function descriptors instead.  The value of this macro says how
-   many words wide the descriptor is (normally 2).  It is assumed
-   that the address of a function descriptor may be treated as a
-   pointer to a function.  */
-#ifndef TARGET_VTABLE_USES_DESCRIPTORS
-#define TARGET_VTABLE_USES_DESCRIPTORS 0
-#endif
-
-#ifndef SWITCHABLE_TARGET
-#define SWITCHABLE_TARGET 0
-#endif
-
-#endif /* GCC_INSN_FLAGS_H  */
-
-#endif  /* ! GCC_DEFAULTS_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/df.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/df.h
deleted file mode 100644
index 878f507..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/df.h
+++ /dev/null
@@ -1,1153 +0,0 @@
-/* Form lists of pseudo register references for autoinc optimization
-   for GNU compiler.  This is part of flow optimization.
-   Copyright (C) 1999-2014 Free Software Foundation, Inc.
-   Originally contributed by Michael P. Hayes
-             (m.hayes@elec.canterbury.ac.nz, mhayes@redhat.com)
-   Major rewrite contributed by Danny Berlin (dberlin@dberlin.org)
-             and Kenneth Zadeck (zadeck@naturalbridge.com).
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_DF_H
-#define GCC_DF_H
-
-#include "bitmap.h"
-#include "regset.h"
-#include "sbitmap.h"
-#include "basic-block.h"
-#include "alloc-pool.h"
-#include "timevar.h"
-
-struct dataflow;
-struct df_d;
-struct df_problem;
-struct df_link;
-struct df_insn_info;
-union df_ref_d;
-
-/* Data flow problems.  All problems must have a unique id here.  */
-
-/* Scanning is not really a dataflow problem, but it is useful to have
-   the basic block functions in the vector so that things get done in
-   a uniform manner.  The last four problems can be added or deleted
-   at any time are always defined (though LIVE is always there at -O2
-   or higher); the others are always there.  */
-#define DF_SCAN    0
-#define DF_LR      1      /* Live Registers backward. */
-#define DF_LIVE    2      /* Live Registers & Uninitialized Registers */
-#define DF_RD      3      /* Reaching Defs. */
-#define DF_CHAIN   4      /* Def-Use and/or Use-Def Chains. */
-#define DF_WORD_LR 5      /* Subreg tracking lr.  */
-#define DF_NOTE    6      /* REG_DEAD and REG_UNUSED notes.  */
-#define DF_MD      7      /* Multiple Definitions. */
-
-#define DF_LAST_PROBLEM_PLUS1 (DF_MD + 1)
-
-/* Dataflow direction.  */
-enum df_flow_dir
-  {
-    DF_NONE,
-    DF_FORWARD,
-    DF_BACKWARD
-  };
-
-/* Descriminator for the various df_ref types.  */
-enum df_ref_class {DF_REF_BASE, DF_REF_ARTIFICIAL, DF_REF_REGULAR};
-
-/* The first of these us a set of a registers.  The remaining three
-   are all uses of a register (the mem_load and mem_store relate to
-   how the register as an addressing operand).  */
-enum df_ref_type {DF_REF_REG_DEF, DF_REF_REG_USE,
-		  DF_REF_REG_MEM_LOAD, DF_REF_REG_MEM_STORE};
-
-enum df_ref_flags
-  {
-    /* This flag is set if this ref occurs inside of a conditional
-       execution instruction.  */
-    DF_REF_CONDITIONAL = 1 << 0,
-
-    /* If this flag is set for an artificial use or def, that ref
-       logically happens at the top of the block.  If it is not set
-       for an artificial use or def, that ref logically happens at the
-       bottom of the block.  This is never set for regular refs.  */
-    DF_REF_AT_TOP = 1 << 1,
-
-    /* This flag is set if the use is inside a REG_EQUAL or REG_EQUIV
-       note.  */
-    DF_REF_IN_NOTE = 1 << 2,
-
-    /* This bit is true if this ref can make regs_ever_live true for
-       this regno.  */
-    DF_HARD_REG_LIVE = 1 << 3,
-
-
-    /* This flag is set if this ref is a partial use or def of the
-       associated register.  */
-    DF_REF_PARTIAL = 1 << 4,
-
-    /* Read-modify-write refs generate both a use and a def and
-       these are marked with this flag to show that they are not
-       independent.  */
-    DF_REF_READ_WRITE = 1 << 5,
-
-    /* This flag is set if this ref, generally a def, may clobber the
-       referenced register.  This is generally only set for hard
-       registers that cross a call site.  With better information
-       about calls, some of these could be changed in the future to
-       DF_REF_MUST_CLOBBER.  */
-    DF_REF_MAY_CLOBBER = 1 << 6,
-
-    /* This flag is set if this ref, generally a def, is a real
-       clobber. This is not currently set for registers live across a
-       call because that clobbering may or may not happen.
-
-       Most of the uses of this are with sets that have a
-       GET_CODE(..)==CLOBBER.  Note that this is set even if the
-       clobber is to a subreg.  So in order to tell if the clobber
-       wipes out the entire register, it is necessary to also check
-       the DF_REF_PARTIAL flag.  */
-    DF_REF_MUST_CLOBBER = 1 << 7,
-
-
-    /* If the ref has one of the following two flags set, then the
-       struct df_ref can be cast to struct df_ref_extract to access
-       the width and offset fields.  */
-
-    /* This flag is set if the ref contains a SIGN_EXTRACT.  */
-    DF_REF_SIGN_EXTRACT = 1 << 8,
-
-    /* This flag is set if the ref contains a ZERO_EXTRACT.  */
-    DF_REF_ZERO_EXTRACT = 1 << 9,
-
-    /* This flag is set if the ref contains a STRICT_LOW_PART.  */
-    DF_REF_STRICT_LOW_PART = 1 << 10,
-
-    /* This flag is set if the ref contains a SUBREG.  */
-    DF_REF_SUBREG = 1 << 11,
-
-
-    /* This bit is true if this ref is part of a multiword hardreg.  */
-    DF_REF_MW_HARDREG = 1 << 12,
-
-    /* This flag is set if this ref is a usage of the stack pointer by
-       a function call.  */
-    DF_REF_CALL_STACK_USAGE = 1 << 13,
-
-    /* This flag is used for verification of existing refs. */
-    DF_REF_REG_MARKER = 1 << 14,
-
-    /* This flag is set if this ref is inside a pre/post modify.  */
-    DF_REF_PRE_POST_MODIFY = 1 << 15
-
-  };
-
-/* The possible ordering of refs within the df_ref_info.  */
-enum df_ref_order
-  {
-    /* There is not table.  */
-    DF_REF_ORDER_NO_TABLE,
-
-    /* There is a table of refs but it is not (or no longer) organized
-       by one of the following methods.  */
-    DF_REF_ORDER_UNORDERED,
-    DF_REF_ORDER_UNORDERED_WITH_NOTES,
-
-    /* Organize the table by reg order, all of the refs with regno 0
-       followed by all of the refs with regno 1 ... .  Within all of
-       the regs for a particular regno, the refs are unordered.  */
-    DF_REF_ORDER_BY_REG,
-
-    /* For uses, the refs within eq notes may be added for
-       DF_REF_ORDER_BY_REG.  */
-    DF_REF_ORDER_BY_REG_WITH_NOTES,
-
-    /* Organize the refs in insn order.  The insns are ordered within a
-       block, and the blocks are ordered by FOR_ALL_BB_FN.  */
-    DF_REF_ORDER_BY_INSN,
-
-    /* For uses, the refs within eq notes may be added for
-       DF_REF_ORDER_BY_INSN.  */
-    DF_REF_ORDER_BY_INSN_WITH_NOTES
-  };
-
-/* Function prototypes added to df_problem instance.  */
-
-/* Allocate the problem specific data.  */
-typedef void (*df_alloc_function) (bitmap);
-
-/* This function is called if the problem has global data that needs
-   to be cleared when ever the set of blocks changes.  The bitmap
-   contains the set of blocks that may require special attention.
-   This call is only made if some of the blocks are going to change.
-   If everything is to be deleted, the wholesale deletion mechanisms
-   apply. */
-typedef void (*df_reset_function) (bitmap);
-
-/* Free the basic block info.  Called from the block reordering code
-   to get rid of the blocks that have been squished down.   */
-typedef void (*df_free_bb_function) (basic_block, void *);
-
-/* Local compute function.  */
-typedef void (*df_local_compute_function) (bitmap);
-
-/* Init the solution specific data.  */
-typedef void (*df_init_function) (bitmap);
-
-/* Iterative dataflow function.  */
-typedef void (*df_dataflow_function) (struct dataflow *, bitmap, int *, int);
-
-/* Confluence operator for blocks with 0 out (or in) edges.  */
-typedef void (*df_confluence_function_0) (basic_block);
-
-/* Confluence operator for blocks with 1 or more out (or in) edges.
-   Return true if BB input data has changed.  */
-typedef bool (*df_confluence_function_n) (edge);
-
-/* Transfer function for blocks. 
-   Return true if BB output data has changed.  */
-typedef bool (*df_transfer_function) (int);
-
-/* Function to massage the information after the problem solving.  */
-typedef void (*df_finalizer_function) (bitmap);
-
-/* Function to free all of the problem specific datastructures.  */
-typedef void (*df_free_function) (void);
-
-/* Function to remove this problem from the stack of dataflow problems
-   without effecting the other problems in the stack except for those
-   that depend on this problem.  */
-typedef void (*df_remove_problem_function) (void);
-
-/* Function to dump basic block independent results to FILE.  */
-typedef void (*df_dump_problem_function) (FILE *);
-
-/* Function to dump top or bottom of basic block results to FILE.  */
-typedef void (*df_dump_bb_problem_function) (basic_block, FILE *);
-
-/* Function to dump before or after an insn to FILE.  */
-typedef void (*df_dump_insn_problem_function) (const_rtx, FILE *);
-
-/* Function to dump top or bottom of basic block results to FILE.  */
-typedef void (*df_verify_solution_start) (void);
-
-/* Function to dump top or bottom of basic block results to FILE.  */
-typedef void (*df_verify_solution_end) (void);
-
-/* The static description of a dataflow problem to solve.  See above
-   typedefs for doc for the function fields.  */
-
-struct df_problem {
-  /* The unique id of the problem.  This is used it index into
-     df->defined_problems to make accessing the problem data easy.  */
-  unsigned int id;
-  enum df_flow_dir dir;			/* Dataflow direction.  */
-  df_alloc_function alloc_fun;
-  df_reset_function reset_fun;
-  df_free_bb_function free_bb_fun;
-  df_local_compute_function local_compute_fun;
-  df_init_function init_fun;
-  df_dataflow_function dataflow_fun;
-  df_confluence_function_0 con_fun_0;
-  df_confluence_function_n con_fun_n;
-  df_transfer_function trans_fun;
-  df_finalizer_function finalize_fun;
-  df_free_function free_fun;
-  df_remove_problem_function remove_problem_fun;
-  df_dump_problem_function dump_start_fun;
-  df_dump_bb_problem_function dump_top_fun;
-  df_dump_bb_problem_function dump_bottom_fun;
-  df_dump_insn_problem_function dump_insn_top_fun;
-  df_dump_insn_problem_function dump_insn_bottom_fun;
-  df_verify_solution_start verify_start_fun;
-  df_verify_solution_end verify_end_fun;
-  struct df_problem *dependent_problem;
-  unsigned int block_info_elt_size;
-
-  /* The timevar id associated with this pass.  */
-  timevar_id_t tv_id;
-
-  /* True if the df_set_blocks should null out the basic block info if
-     this block drops out of df->blocks_to_analyze.  */
-  bool free_blocks_on_set_blocks;
-};
-
-
-/* The specific instance of the problem to solve.  */
-struct dataflow
-{
-  struct df_problem *problem;           /* The problem to be solved.  */
-
-  /* Array indexed by bb->index, that contains basic block problem and
-     solution specific information.  */
-  void *block_info;
-  unsigned int block_info_size;
-
-  /* The pool to allocate the block_info from. */
-  alloc_pool block_pool;
-
-  /* The lr and live problems have their transfer functions recomputed
-     only if necessary.  This is possible for them because, the
-     problems are kept active for the entire backend and their
-     transfer functions are indexed by the REGNO.  These are not
-     defined for any other problem.  */
-  bitmap out_of_date_transfer_functions;
-
-  /* Other problem specific data that is not on a per basic block
-     basis.  The structure is generally defined privately for the
-     problem.  The exception being the scanning problem where it is
-     fully public.  */
-  void *problem_data;
-
-  /* Local flags for some of the problems. */
-  unsigned int local_flags;
-
-  /* True if this problem of this instance has been initialized.  This
-     is used by the dumpers to keep garbage out of the dumps if, for
-     debugging a dump is produced before the first call to
-     df_analyze after a new problem is added.  */
-  bool computed;
-
-  /* True if the something has changed which invalidates the dataflow
-     solutions.  Note that this bit is always true for all problems except
-     lr and live.  */
-  bool solutions_dirty;
-
-  /* If true, this pass is deleted by df_finish_pass.  This is never
-     true for DF_SCAN and DF_LR.  It is true for DF_LIVE if optimize >
-     1.  It is always true for the other problems.  */
-  bool optional_p;
-};
-
-
-/* The set of multiword hardregs used as operands to this
-   instruction. These are factored into individual uses and defs but
-   the aggregate is still needed to service the REG_DEAD and
-   REG_UNUSED notes.  */
-struct df_mw_hardreg
-{
-  rtx mw_reg;                   /* The multiword hardreg.  */
-  /* These two bitfields are intentionally oversized, in the hope that
-     accesses to 16-bit fields will usually be quicker.  */
-  ENUM_BITFIELD(df_ref_type) type : 16;
-				/* Used to see if the ref is read or write.  */
-  int flags : 16;		/* Various df_ref_flags.  */
-  unsigned int start_regno;     /* First word of the multi word subreg.  */
-  unsigned int end_regno;       /* Last word of the multi word subreg.  */
-  unsigned int mw_order;        /* Same as df_ref.ref_order.  */
-};
-
-
-/* Define a register reference structure.  One of these is allocated
-    for every register reference (use or def).  Note some register
-    references (e.g., post_inc, subreg) generate both a def and a use.  */
-struct df_base_ref
-{
-  /* These three bitfields are intentionally oversized, in the hope that
-     accesses to 8 and 16-bit fields will usually be quicker.  */
-  ENUM_BITFIELD(df_ref_class) cl : 8;
-
-  ENUM_BITFIELD(df_ref_type) type : 8;
-				/* Type of ref.  */
-  int flags : 16;		/* Various df_ref_flags.  */
-  unsigned int regno;		/* The register number referenced.  */
-  rtx reg;			/* The register referenced.  */
-  struct df_link *chain;	/* Head of def-use, use-def.  */
-  /* Pointer to the insn info of the containing instruction.  FIXME!
-     Currently this is NULL for artificial refs but this will be used
-     when FUDs are added.  */
-  struct df_insn_info *insn_info;
-  /* For each regno, there are three chains of refs, one for the uses,
-     the eq_uses and the defs.  These chains go through the refs
-     themselves rather than using an external structure.  */
-  union df_ref_d *next_reg;     /* Next ref with same regno and type.  */
-  union df_ref_d *prev_reg;     /* Prev ref with same regno and type.  */
-  /* Location in the ref table.  This is only valid after a call to
-     df_maybe_reorganize_[use,def]_refs which is an expensive operation.  */
-  int id;
-  /* The index at which the operand was scanned in the insn.  This is
-     used to totally order the refs in an insn.  */
-  unsigned int ref_order;
-};
-
-
-/* The three types of df_refs.  Note that the df_ref_extract is an
-   extension of the df_regular_ref, not the df_base_ref.  */
-struct df_artificial_ref
-{
-  struct df_base_ref base;
-
-  /* Artificial refs do not have an insn, so to get the basic block,
-     it must be explicitly here.  */
-  basic_block bb;
-};
-
-
-struct df_regular_ref
-{
-  struct df_base_ref base;
-  /* The loc is the address in the insn of the reg.  This is not
-     defined for special registers, such as clobbers and stack
-     pointers that are also associated with call insns and so those
-     just use the base.  */
-  rtx *loc;
-};
-
-/* Union of the different kinds of defs/uses placeholders.  */
-union df_ref_d
-{
-  struct df_base_ref base;
-  struct df_regular_ref regular_ref;
-  struct df_artificial_ref artificial_ref;
-};
-typedef union df_ref_d *df_ref;
-
-
-/* One of these structures is allocated for every insn.  */
-struct df_insn_info
-{
-  rtx insn;                     /* The insn this info comes from.  */
-  df_ref *defs;	                /* Head of insn-def chain.  */
-  df_ref *uses;	                /* Head of insn-use chain.  */
-  /* Head of insn-use chain for uses in REG_EQUAL/EQUIV notes.  */
-  df_ref *eq_uses;
-  struct df_mw_hardreg **mw_hardregs;
-  /* The logical uid of the insn in the basic block.  This is valid
-     after any call to df_analyze but may rot after insns are added,
-     deleted or moved. */
-  int luid;
-};
-
-/* These links are used for ref-ref chains.  Currently only DEF-USE and
-   USE-DEF chains can be built by DF.  */
-struct df_link
-{
-  df_ref ref;
-  struct df_link *next;
-};
-
-
-enum df_chain_flags
-{
-  /* Flags that control the building of chains.  */
-  DF_DU_CHAIN      =  1, /* Build DU chains.  */
-  DF_UD_CHAIN      =  2  /* Build UD chains.  */
-};
-
-enum df_changeable_flags
-{
-  /* Scanning flags.  */
-  /* Flag to control the running of dce as a side effect of building LR.  */
-  DF_LR_RUN_DCE           = 1 << 0, /* Run DCE.  */
-  DF_NO_HARD_REGS         = 1 << 1, /* Skip hard registers in RD and CHAIN Building.  */
-
-  DF_EQ_NOTES             = 1 << 2, /* Build chains with uses present in EQUIV/EQUAL notes. */
-  DF_NO_REGS_EVER_LIVE    = 1 << 3, /* Do not compute the regs_ever_live.  */
-
-  /* Cause df_insn_rescan df_notes_rescan and df_insn_delete, to
-  return immediately.  This is used by passes that know how to update
-  the scanning them selves.  */
-  DF_NO_INSN_RESCAN       = 1 << 4,
-
-  /* Cause df_insn_rescan df_notes_rescan and df_insn_delete, to
-  return after marking the insn for later processing.  This allows all
-  rescans to be batched.  */
-  DF_DEFER_INSN_RESCAN    = 1 << 5,
-
-  /* Compute the reaching defs problem as "live and reaching defs" (LR&RD).
-     A DEF is reaching and live at insn I if DEF reaches I and REGNO(DEF)
-     is in LR_IN of the basic block containing I.  */
-  DF_RD_PRUNE_DEAD_DEFS   = 1 << 6,
-
-  DF_VERIFY_SCHEDULED     = 1 << 7
-};
-
-/* Two of these structures are inline in df, one for the uses and one
-   for the defs.  This structure is only contains the refs within the
-   boundary of the df_set_blocks if that has been defined.  */
-struct df_ref_info
-{
-  df_ref *refs;                 /* Ref table, indexed by id.  */
-  unsigned int *begin;          /* First ref_index for this pseudo.  */
-  unsigned int *count;          /* Count of refs for this pseudo.  */
-  unsigned int refs_size;       /* Size of currently allocated refs table.  */
-
-  /* Table_size is the number of elements in the refs table.  This
-     will also be the width of the bitvectors in the rd and ru
-     problems.  Total_size is the number of refs.  These will be the
-     same if the focus has not been reduced by df_set_blocks.  If the
-     focus has been reduced, table_size will be smaller since it only
-     contains the refs in the set blocks.  */
-  unsigned int table_size;
-  unsigned int total_size;
-
-  enum df_ref_order ref_order;
-};
-
-/* Three of these structures are allocated for every pseudo reg. One
-   for the uses, one for the eq_uses and one for the defs.  */
-struct df_reg_info
-{
-  /* Head of chain for refs of that type and regno.  */
-  df_ref reg_chain;
-  /* Number of refs in the chain.  */
-  unsigned int n_refs;
-};
-
-
-/*----------------------------------------------------------------------------
-   Problem data for the scanning dataflow problem.  Unlike the other
-   dataflow problems, the problem data for scanning is fully exposed and
-   used by owners of the problem.
-----------------------------------------------------------------------------*/
-
-struct df_d
-{
-
-  /* The set of problems to be solved is stored in two arrays.  In
-     PROBLEMS_IN_ORDER, the problems are stored in the order that they
-     are solved.  This is an internally dense array that may have
-     nulls at the end of it.  In PROBLEMS_BY_INDEX, the problem is
-     stored by the value in df_problem.id.  These are used to access
-     the problem local data without having to search the first
-     array.  */
-
-  struct dataflow *problems_in_order[DF_LAST_PROBLEM_PLUS1];
-  struct dataflow *problems_by_index[DF_LAST_PROBLEM_PLUS1];
-
-  /* If not NULL, this subset of blocks of the program to be
-     considered for analysis.  At certain times, this will contain all
-     the blocks in the function so it cannot be used as an indicator
-     of if we are analyzing a subset.  See analyze_subset.  */
-  bitmap blocks_to_analyze;
-
-  /* The following information is really the problem data for the
-     scanning instance but it is used too often by the other problems
-     to keep getting it from there.  */
-  struct df_ref_info def_info;   /* Def info.  */
-  struct df_ref_info use_info;   /* Use info.  */
-
-  /* The following three arrays are allocated in parallel.   They contain
-     the sets of refs of each type for each reg.  */
-  struct df_reg_info **def_regs;       /* Def reg info.  */
-  struct df_reg_info **use_regs;       /* Eq_use reg info.  */
-  struct df_reg_info **eq_use_regs;    /* Eq_use info.  */
-  unsigned int regs_size;       /* Size of currently allocated regs table.  */
-  unsigned int regs_inited;     /* Number of regs with reg_infos allocated.  */
-
-
-  struct df_insn_info **insns;   /* Insn table, indexed by insn UID.  */
-  unsigned int insns_size;       /* Size of insn table.  */
-
-  int num_problems_defined;
-
-  bitmap_head hardware_regs_used;     /* The set of hardware registers used.  */
-  /* The set of hard regs that are in the artificial uses at the end
-     of a regular basic block.  */
-  bitmap_head regular_block_artificial_uses;
-  /* The set of hard regs that are in the artificial uses at the end
-     of a basic block that has an EH pred.  */
-  bitmap_head eh_block_artificial_uses;
-  /* The set of hardware registers live on entry to the function.  */
-  bitmap entry_block_defs;
-  bitmap exit_block_uses;        /* The set of hardware registers used in exit block.  */
-
-  /* Insns to delete, rescan or reprocess the notes at next
-     df_rescan_all or df_process_deferred_rescans. */
-  bitmap_head insns_to_delete;
-  bitmap_head insns_to_rescan;
-  bitmap_head insns_to_notes_rescan;
-  int *postorder;                /* The current set of basic blocks
-                                    in reverse postorder.  */
-  int *postorder_inverted;       /* The current set of basic blocks
-                                    in reverse postorder of inverted CFG.  */
-  int n_blocks;                  /* The number of blocks in reverse postorder.  */
-  int n_blocks_inverted;         /* The number of blocks
-                                    in reverse postorder of inverted CFG.  */
-
-  /* An array [FIRST_PSEUDO_REGISTER], indexed by regno, of the number
-     of refs that qualify as being real hard regs uses.  Artificial
-     uses and defs as well as refs in eq notes are ignored.  If the
-     ref is a def, it cannot be a MAY_CLOBBER def.  If the ref is a
-     use, it cannot be the emim_reg_set or be the frame or arg pointer
-     register.  Uses in debug insns are ignored.
-
-     IT IS NOT ACCEPTABLE TO MANUALLY CHANGE THIS ARRAY.  This array
-     always reflects the actual number of refs in the insn stream that
-     satisfy the above criteria.  */
-  unsigned int *hard_regs_live_count;
-
-  /* This counter provides a way to totally order refs without using
-     addresses.  It is incremented whenever a ref is created.  */
-  unsigned int ref_order;
-
-  /* Problem specific control information.  This is a combination of
-     enum df_changeable_flags values.  */
-  int changeable_flags : 8;
-
-  /* If this is true, then only a subset of the blocks of the program
-     is considered to compute the solutions of dataflow problems.  */
-  bool analyze_subset;
-
-  /* True if someone added or deleted something from regs_ever_live so
-     that the entry and exit blocks need be reprocessed.  */
-  bool redo_entry_and_exit;
-};
-
-#define DF_SCAN_BB_INFO(BB) (df_scan_get_bb_info ((BB)->index))
-#define DF_RD_BB_INFO(BB) (df_rd_get_bb_info ((BB)->index))
-#define DF_LR_BB_INFO(BB) (df_lr_get_bb_info ((BB)->index))
-#define DF_LIVE_BB_INFO(BB) (df_live_get_bb_info ((BB)->index))
-#define DF_WORD_LR_BB_INFO(BB) (df_word_lr_get_bb_info ((BB)->index))
-#define DF_MD_BB_INFO(BB) (df_md_get_bb_info ((BB)->index))
-
-/* Most transformations that wish to use live register analysis will
-   use these macros.  This info is the and of the lr and live sets.  */
-#define DF_LIVE_IN(BB) (&DF_LIVE_BB_INFO (BB)->in)
-#define DF_LIVE_OUT(BB) (&DF_LIVE_BB_INFO (BB)->out)
-
-/* These macros are used by passes that are not tolerant of
-   uninitialized variables.  This intolerance should eventually
-   be fixed.  */
-#define DF_LR_IN(BB) (&DF_LR_BB_INFO (BB)->in)
-#define DF_LR_OUT(BB) (&DF_LR_BB_INFO (BB)->out)
-
-/* These macros are used by passes that are not tolerant of
-   uninitialized variables.  This intolerance should eventually
-   be fixed.  */
-#define DF_WORD_LR_IN(BB) (&DF_WORD_LR_BB_INFO (BB)->in)
-#define DF_WORD_LR_OUT(BB) (&DF_WORD_LR_BB_INFO (BB)->out)
-
-/* Macros to access the elements within the ref structure.  */
-
-
-#define DF_REF_REAL_REG(REF) (GET_CODE ((REF)->base.reg) == SUBREG \
-				? SUBREG_REG ((REF)->base.reg) : ((REF)->base.reg))
-#define DF_REF_REGNO(REF) ((REF)->base.regno)
-#define DF_REF_REAL_LOC(REF) (GET_CODE (*((REF)->regular_ref.loc)) == SUBREG \
-                               ? &SUBREG_REG (*((REF)->regular_ref.loc)) : ((REF)->regular_ref.loc))
-#define DF_REF_REG(REF) ((REF)->base.reg)
-#define DF_REF_LOC(REF) (DF_REF_CLASS (REF) == DF_REF_REGULAR ? \
-			 (REF)->regular_ref.loc : NULL)
-#define DF_REF_BB(REF) (DF_REF_IS_ARTIFICIAL (REF) \
-			? (REF)->artificial_ref.bb \
-			: BLOCK_FOR_INSN (DF_REF_INSN (REF)))
-#define DF_REF_BBNO(REF) (DF_REF_BB (REF)->index)
-#define DF_REF_INSN_INFO(REF) ((REF)->base.insn_info)
-#define DF_REF_INSN(REF) ((REF)->base.insn_info->insn)
-#define DF_REF_INSN_UID(REF) (INSN_UID (DF_REF_INSN(REF)))
-#define DF_REF_CLASS(REF) ((REF)->base.cl)
-#define DF_REF_TYPE(REF) ((REF)->base.type)
-#define DF_REF_CHAIN(REF) ((REF)->base.chain)
-#define DF_REF_ID(REF) ((REF)->base.id)
-#define DF_REF_FLAGS(REF) ((REF)->base.flags)
-#define DF_REF_FLAGS_IS_SET(REF, v) ((DF_REF_FLAGS (REF) & (v)) != 0)
-#define DF_REF_FLAGS_SET(REF, v) (DF_REF_FLAGS (REF) |= (v))
-#define DF_REF_FLAGS_CLEAR(REF, v) (DF_REF_FLAGS (REF) &= ~(v))
-#define DF_REF_ORDER(REF) ((REF)->base.ref_order)
-/* If DF_REF_IS_ARTIFICIAL () is true, this is not a real
-   definition/use, but an artificial one created to model always live
-   registers, eh uses, etc.  */
-#define DF_REF_IS_ARTIFICIAL(REF) (DF_REF_CLASS (REF) == DF_REF_ARTIFICIAL)
-#define DF_REF_REG_MARK(REF) (DF_REF_FLAGS_SET ((REF),DF_REF_REG_MARKER))
-#define DF_REF_REG_UNMARK(REF) (DF_REF_FLAGS_CLEAR ((REF),DF_REF_REG_MARKER))
-#define DF_REF_IS_REG_MARKED(REF) (DF_REF_FLAGS_IS_SET ((REF),DF_REF_REG_MARKER))
-#define DF_REF_NEXT_REG(REF) ((REF)->base.next_reg)
-#define DF_REF_PREV_REG(REF) ((REF)->base.prev_reg)
-/* The following two macros may only be applied if one of
-   DF_REF_SIGN_EXTRACT | DF_REF_ZERO_EXTRACT is true. */
-#define DF_REF_EXTRACT_WIDTH(REF) ((REF)->extract_ref.width)
-#define DF_REF_EXTRACT_OFFSET(REF) ((REF)->extract_ref.offset)
-#define DF_REF_EXTRACT_MODE(REF) ((REF)->extract_ref.mode)
-
-/* Macros to determine the reference type.  */
-#define DF_REF_REG_DEF_P(REF) (DF_REF_TYPE (REF) == DF_REF_REG_DEF)
-#define DF_REF_REG_USE_P(REF) ((REF) && !DF_REF_REG_DEF_P (REF))
-#define DF_REF_REG_MEM_STORE_P(REF) (DF_REF_TYPE (REF) == DF_REF_REG_MEM_STORE)
-#define DF_REF_REG_MEM_LOAD_P(REF) (DF_REF_TYPE (REF) == DF_REF_REG_MEM_LOAD)
-#define DF_REF_REG_MEM_P(REF) (DF_REF_REG_MEM_STORE_P (REF) \
-                               || DF_REF_REG_MEM_LOAD_P (REF))
-
-#define DF_MWS_REG_DEF_P(MREF) (DF_MWS_TYPE (MREF) == DF_REF_REG_DEF)
-#define DF_MWS_REG_USE_P(MREF) ((MREF) && !DF_MWS_REG_DEF_P (MREF))
-#define DF_MWS_TYPE(MREF) ((MREF)->type)
-
-/* Macros to get the refs out of def_info or use_info refs table.  If
-   the focus of the dataflow has been set to some subset of blocks
-   with df_set_blocks, these macros will only find the uses and defs
-   in that subset of blocks.
-
-   These macros should be used with care.  The def macros are only
-   usable after a call to df_maybe_reorganize_def_refs and the use
-   macros are only usable after a call to
-   df_maybe_reorganize_use_refs.  HOWEVER, BUILDING AND USING THESE
-   ARRAYS ARE A CACHE LOCALITY KILLER.  */
-
-#define DF_DEFS_TABLE_SIZE() (df->def_info.table_size)
-#define DF_DEFS_GET(ID) (df->def_info.refs[(ID)])
-#define DF_DEFS_SET(ID,VAL) (df->def_info.refs[(ID)]=(VAL))
-#define DF_DEFS_COUNT(ID) (df->def_info.count[(ID)])
-#define DF_DEFS_BEGIN(ID) (df->def_info.begin[(ID)])
-#define DF_USES_TABLE_SIZE() (df->use_info.table_size)
-#define DF_USES_GET(ID) (df->use_info.refs[(ID)])
-#define DF_USES_SET(ID,VAL) (df->use_info.refs[(ID)]=(VAL))
-#define DF_USES_COUNT(ID) (df->use_info.count[(ID)])
-#define DF_USES_BEGIN(ID) (df->use_info.begin[(ID)])
-
-/* Macros to access the register information from scan dataflow record.  */
-
-#define DF_REG_SIZE(DF) (df->regs_inited)
-#define DF_REG_DEF_GET(REG) (df->def_regs[(REG)])
-#define DF_REG_DEF_CHAIN(REG) (df->def_regs[(REG)]->reg_chain)
-#define DF_REG_DEF_COUNT(REG) (df->def_regs[(REG)]->n_refs)
-#define DF_REG_USE_GET(REG) (df->use_regs[(REG)])
-#define DF_REG_USE_CHAIN(REG) (df->use_regs[(REG)]->reg_chain)
-#define DF_REG_USE_COUNT(REG) (df->use_regs[(REG)]->n_refs)
-#define DF_REG_EQ_USE_GET(REG) (df->eq_use_regs[(REG)])
-#define DF_REG_EQ_USE_CHAIN(REG) (df->eq_use_regs[(REG)]->reg_chain)
-#define DF_REG_EQ_USE_COUNT(REG) (df->eq_use_regs[(REG)]->n_refs)
-
-/* Macros to access the elements within the reg_info structure table.  */
-
-#define DF_REGNO_FIRST_DEF(REGNUM) \
-(DF_REG_DEF_GET(REGNUM) ? DF_REG_DEF_GET (REGNUM) : 0)
-#define DF_REGNO_LAST_USE(REGNUM) \
-(DF_REG_USE_GET(REGNUM) ? DF_REG_USE_GET (REGNUM) : 0)
-
-/* Macros to access the elements within the insn_info structure table.  */
-
-#define DF_INSN_SIZE() ((df)->insns_size)
-#define DF_INSN_INFO_GET(INSN) (df->insns[(INSN_UID (INSN))])
-#define DF_INSN_INFO_SET(INSN,VAL) (df->insns[(INSN_UID (INSN))]=(VAL))
-#define DF_INSN_INFO_LUID(II) ((II)->luid)
-#define DF_INSN_INFO_DEFS(II) ((II)->defs)
-#define DF_INSN_INFO_USES(II) ((II)->uses)
-#define DF_INSN_INFO_EQ_USES(II) ((II)->eq_uses)
-
-#define DF_INSN_LUID(INSN) (DF_INSN_INFO_LUID (DF_INSN_INFO_GET (INSN)))
-#define DF_INSN_DEFS(INSN) (DF_INSN_INFO_DEFS (DF_INSN_INFO_GET (INSN)))
-#define DF_INSN_USES(INSN) (DF_INSN_INFO_USES (DF_INSN_INFO_GET (INSN)))
-#define DF_INSN_EQ_USES(INSN) (DF_INSN_INFO_EQ_USES (DF_INSN_INFO_GET (INSN)))
-
-#define DF_INSN_UID_GET(UID) (df->insns[(UID)])
-#define DF_INSN_UID_SET(UID,VAL) (df->insns[(UID)]=(VAL))
-#define DF_INSN_UID_SAFE_GET(UID) (((unsigned)(UID) < DF_INSN_SIZE ())	\
-                                     ? DF_INSN_UID_GET (UID) \
-                                     : NULL)
-#define DF_INSN_UID_LUID(INSN) (DF_INSN_UID_GET (INSN)->luid)
-#define DF_INSN_UID_DEFS(INSN) (DF_INSN_UID_GET (INSN)->defs)
-#define DF_INSN_UID_USES(INSN) (DF_INSN_UID_GET (INSN)->uses)
-#define DF_INSN_UID_EQ_USES(INSN) (DF_INSN_UID_GET (INSN)->eq_uses)
-#define DF_INSN_UID_MWS(INSN) (DF_INSN_UID_GET (INSN)->mw_hardregs)
-
-/* An obstack for bitmap not related to specific dataflow problems.
-   This obstack should e.g. be used for bitmaps with a short life time
-   such as temporary bitmaps.  This obstack is declared in df-core.c.  */
-
-extern bitmap_obstack df_bitmap_obstack;
-
-
-/* One of these structures is allocated for every basic block.  */
-struct df_scan_bb_info
-{
-  /* The entry block has many artificial defs and these are at the
-     bottom of the block.
-
-     Blocks that are targets of exception edges may have some
-     artificial defs.  These are logically located at the top of the
-     block.
-
-     Blocks that are the targets of non-local goto's have the hard
-     frame pointer defined at the top of the block.  */
-  df_ref *artificial_defs;
-
-  /* Blocks that are targets of exception edges may have some
-     artificial uses.  These are logically at the top of the block.
-
-     Most blocks have artificial uses at the bottom of the block.  */
-  df_ref *artificial_uses;
-};
-
-
-/* Reaching definitions.  All bitmaps are indexed by the id field of
-   the ref except sparse_kill which is indexed by regno.  For the
-   LR&RD problem, the kill set is not complete: It does not contain
-   DEFs killed because the set register has died in the LR set.  */
-struct df_rd_bb_info
-{
-  /* Local sets to describe the basic blocks.   */
-  bitmap_head kill;
-  bitmap_head sparse_kill;
-  bitmap_head gen;   /* The set of defs generated in this block.  */
-
-  /* The results of the dataflow problem.  */
-  bitmap_head in;    /* At the top of the block.  */
-  bitmap_head out;   /* At the bottom of the block.  */
-};
-
-
-/* Multiple reaching definitions.  All bitmaps are referenced by the
-   register number.  */
-
-struct df_md_bb_info
-{
-  /* Local sets to describe the basic blocks.  */
-  bitmap_head gen;    /* Partial/conditional definitions live at BB out.  */
-  bitmap_head kill;   /* Other definitions that are live at BB out.  */
-  bitmap_head init;   /* Definitions coming from dominance frontier edges. */
-
-  /* The results of the dataflow problem.  */
-  bitmap_head in;    /* Just before the block itself. */
-  bitmap_head out;   /* At the bottom of the block.  */
-};
-
-
-/* Live registers, a backwards dataflow problem.  All bitmaps are
-   referenced by the register number.  */
-
-struct df_lr_bb_info
-{
-  /* Local sets to describe the basic blocks.  */
-  bitmap_head def;   /* The set of registers set in this block
-                        - except artificial defs at the top.  */
-  bitmap_head use;   /* The set of registers used in this block.  */
-
-  /* The results of the dataflow problem.  */
-  bitmap_head in;    /* Just before the block itself. */
-  bitmap_head out;   /* At the bottom of the block.  */
-};
-
-
-/* Uninitialized registers.  All bitmaps are referenced by the
-   register number.  Anded results of the forwards and backward live
-   info.  Note that the forwards live information is not available
-   separately.  */
-struct df_live_bb_info
-{
-  /* Local sets to describe the basic blocks.  */
-  bitmap_head kill;  /* The set of registers unset in this block.  Calls,
-		        for instance, unset registers.  */
-  bitmap_head gen;   /* The set of registers set in this block.  */
-
-  /* The results of the dataflow problem.  */
-  bitmap_head in;    /* At the top of the block.  */
-  bitmap_head out;   /* At the bottom of the block.  */
-};
-
-
-/* Live registers, a backwards dataflow problem.  These bitmaps are
-   indexed by 2 * regno for each pseudo and have two entries for each
-   pseudo.  Only pseudos that have a size of 2 * UNITS_PER_WORD are
-   meaningfully tracked.  */
-
-struct df_word_lr_bb_info
-{
-  /* Local sets to describe the basic blocks.  */
-  bitmap_head def;   /* The set of registers set in this block
-                        - except artificial defs at the top.  */
-  bitmap_head use;   /* The set of registers used in this block.  */
-
-  /* The results of the dataflow problem.  */
-  bitmap_head in;    /* Just before the block itself. */
-  bitmap_head out;   /* At the bottom of the block.  */
-};
-
-
-/* This is used for debugging and for the dumpers to find the latest
-   instance so that the df info can be added to the dumps.  This
-   should not be used by regular code.  */
-extern struct df_d *df;
-#define df_scan    (df->problems_by_index[DF_SCAN])
-#define df_rd      (df->problems_by_index[DF_RD])
-#define df_lr      (df->problems_by_index[DF_LR])
-#define df_live    (df->problems_by_index[DF_LIVE])
-#define df_chain   (df->problems_by_index[DF_CHAIN])
-#define df_word_lr (df->problems_by_index[DF_WORD_LR])
-#define df_note    (df->problems_by_index[DF_NOTE])
-#define df_md      (df->problems_by_index[DF_MD])
-
-/* This symbol turns on checking that each modification of the cfg has
-  been identified to the appropriate df routines.  It is not part of
-  verification per se because the check that the final solution has
-  not changed covers this.  However, if the solution is not being
-  properly recomputed because the cfg is being modified, adding in
-  calls to df_check_cfg_clean can be used to find the source of that
-  kind of problem.  */
-#if 0
-#define DF_DEBUG_CFG
-#endif
-
-
-/* Functions defined in df-core.c.  */
-
-extern void df_add_problem (struct df_problem *);
-extern int df_set_flags (int);
-extern int df_clear_flags (int);
-extern void df_set_blocks (bitmap);
-extern void df_remove_problem (struct dataflow *);
-extern void df_finish_pass (bool);
-extern void df_analyze_problem (struct dataflow *, bitmap, int *, int);
-extern void df_analyze ();
-extern void df_analyze_loop (struct loop *);
-extern int df_get_n_blocks (enum df_flow_dir);
-extern int *df_get_postorder (enum df_flow_dir);
-extern void df_simple_dataflow (enum df_flow_dir, df_init_function,
-				df_confluence_function_0, df_confluence_function_n,
-				df_transfer_function, bitmap, int *, int);
-extern void df_mark_solutions_dirty (void);
-extern bool df_get_bb_dirty (basic_block);
-extern void df_set_bb_dirty (basic_block);
-extern void df_compact_blocks (void);
-extern void df_bb_replace (int, basic_block);
-extern void df_bb_delete (int);
-extern void df_verify (void);
-#ifdef DF_DEBUG_CFG
-extern void df_check_cfg_clean (void);
-#endif
-extern df_ref df_bb_regno_first_def_find (basic_block, unsigned int);
-extern df_ref df_bb_regno_last_def_find (basic_block, unsigned int);
-extern df_ref df_find_def (rtx, rtx);
-extern bool df_reg_defined (rtx, rtx);
-extern df_ref df_find_use (rtx, rtx);
-extern bool df_reg_used (rtx, rtx);
-extern void df_worklist_dataflow (struct dataflow *,bitmap, int *, int);
-extern void df_print_regset (FILE *file, bitmap r);
-extern void df_print_word_regset (FILE *file, bitmap r);
-extern void df_dump (FILE *);
-extern void df_dump_region (FILE *);
-extern void df_dump_start (FILE *);
-extern void df_dump_top (basic_block, FILE *);
-extern void df_dump_bottom (basic_block, FILE *);
-extern void df_dump_insn_top (const_rtx, FILE *);
-extern void df_dump_insn_bottom (const_rtx, FILE *);
-extern void df_refs_chain_dump (df_ref *, bool, FILE *);
-extern void df_regs_chain_dump (df_ref,  FILE *);
-extern void df_insn_debug (rtx, bool, FILE *);
-extern void df_insn_debug_regno (rtx, FILE *);
-extern void df_regno_debug (unsigned int, FILE *);
-extern void df_ref_debug (df_ref, FILE *);
-extern void debug_df_insn (rtx);
-extern void debug_df_regno (unsigned int);
-extern void debug_df_reg (rtx);
-extern void debug_df_defno (unsigned int);
-extern void debug_df_useno (unsigned int);
-extern void debug_df_ref (df_ref);
-extern void debug_df_chain (struct df_link *);
-
-/* Functions defined in df-problems.c. */
-
-extern struct df_link *df_chain_create (df_ref, df_ref);
-extern void df_chain_unlink (df_ref);
-extern void df_chain_copy (df_ref, struct df_link *);
-extern void df_grow_bb_info (struct dataflow *);
-extern void df_chain_dump (struct df_link *, FILE *);
-extern void df_print_bb_index (basic_block bb, FILE *file);
-extern void df_rd_add_problem (void);
-extern void df_rd_simulate_artificial_defs_at_top (basic_block, bitmap);
-extern void df_rd_simulate_one_insn (basic_block, rtx, bitmap);
-extern void df_lr_add_problem (void);
-extern void df_lr_verify_transfer_functions (void);
-extern void df_live_verify_transfer_functions (void);
-extern void df_live_add_problem (void);
-extern void df_live_set_all_dirty (void);
-extern void df_chain_add_problem (unsigned int);
-extern void df_word_lr_add_problem (void);
-extern bool df_word_lr_mark_ref (df_ref, bool, bitmap);
-extern bool df_word_lr_simulate_defs (rtx, bitmap);
-extern void df_word_lr_simulate_uses (rtx, bitmap);
-extern void df_word_lr_simulate_artificial_refs_at_top (basic_block, bitmap);
-extern void df_word_lr_simulate_artificial_refs_at_end (basic_block, bitmap);
-extern void df_note_add_problem (void);
-extern void df_md_add_problem (void);
-extern void df_md_simulate_artificial_defs_at_top (basic_block, bitmap);
-extern void df_md_simulate_one_insn (basic_block, rtx, bitmap);
-extern void df_simulate_find_noclobber_defs (rtx, bitmap);
-extern void df_simulate_find_defs (rtx, bitmap);
-extern void df_simulate_defs (rtx, bitmap);
-extern void df_simulate_uses (rtx, bitmap);
-extern void df_simulate_initialize_backwards (basic_block, bitmap);
-extern void df_simulate_one_insn_backwards (basic_block, rtx, bitmap);
-extern void df_simulate_finalize_backwards (basic_block, bitmap);
-extern void df_simulate_initialize_forwards (basic_block, bitmap);
-extern void df_simulate_one_insn_forwards (basic_block, rtx, bitmap);
-extern void simulate_backwards_to_point (basic_block, regset, rtx);
-extern bool can_move_insns_across (rtx, rtx, rtx, rtx, basic_block, regset,
-				   regset, rtx *);
-/* Functions defined in df-scan.c.  */
-
-extern void df_scan_alloc (bitmap);
-extern void df_scan_add_problem (void);
-extern void df_grow_reg_info (void);
-extern void df_grow_insn_info (void);
-extern void df_scan_blocks (void);
-extern df_ref df_ref_create (rtx, rtx *, rtx,basic_block,
-			     enum df_ref_type, int ref_flags);
-extern void df_uses_create (rtx *, rtx, int);
-extern void df_ref_remove (df_ref);
-extern struct df_insn_info * df_insn_create_insn_record (rtx);
-extern void df_insn_delete (rtx);
-extern void df_bb_refs_record (int, bool);
-extern bool df_insn_rescan (rtx);
-extern bool df_insn_rescan_debug_internal (rtx);
-extern void df_insn_rescan_all (void);
-extern void df_process_deferred_rescans (void);
-extern void df_recompute_luids (basic_block);
-extern void df_insn_change_bb (rtx, basic_block);
-extern void df_maybe_reorganize_use_refs (enum df_ref_order);
-extern void df_maybe_reorganize_def_refs (enum df_ref_order);
-extern void df_ref_change_reg_with_loc (int, int, rtx);
-extern void df_notes_rescan (rtx);
-extern void df_hard_reg_init (void);
-extern void df_update_entry_block_defs (void);
-extern void df_update_exit_block_uses (void);
-extern void df_update_entry_exit_and_calls (void);
-extern bool df_hard_reg_used_p (unsigned int);
-extern unsigned int df_hard_reg_used_count (unsigned int);
-extern bool df_regs_ever_live_p (unsigned int);
-extern void df_set_regs_ever_live (unsigned int, bool);
-extern void df_compute_regs_ever_live (bool);
-extern bool df_read_modify_subreg_p (rtx);
-extern void df_scan_verify (void);
-
-
-/*----------------------------------------------------------------------------
-   Public functions access functions for the dataflow problems.
-----------------------------------------------------------------------------*/
-
-static inline struct df_scan_bb_info *
-df_scan_get_bb_info (unsigned int index)
-{
-  if (index < df_scan->block_info_size)
-    return &((struct df_scan_bb_info *) df_scan->block_info)[index];
-  else
-    return NULL;
-}
-
-static inline struct df_rd_bb_info *
-df_rd_get_bb_info (unsigned int index)
-{
-  if (index < df_rd->block_info_size)
-    return &((struct df_rd_bb_info *) df_rd->block_info)[index];
-  else
-    return NULL;
-}
-
-static inline struct df_lr_bb_info *
-df_lr_get_bb_info (unsigned int index)
-{
-  if (index < df_lr->block_info_size)
-    return &((struct df_lr_bb_info *) df_lr->block_info)[index];
-  else
-    return NULL;
-}
-
-static inline struct df_md_bb_info *
-df_md_get_bb_info (unsigned int index)
-{
-  if (index < df_md->block_info_size)
-    return &((struct df_md_bb_info *) df_md->block_info)[index];
-  else
-    return NULL;
-}
-
-static inline struct df_live_bb_info *
-df_live_get_bb_info (unsigned int index)
-{
-  if (index < df_live->block_info_size)
-    return &((struct df_live_bb_info *) df_live->block_info)[index];
-  else
-    return NULL;
-}
-
-static inline struct df_word_lr_bb_info *
-df_word_lr_get_bb_info (unsigned int index)
-{
-  if (index < df_word_lr->block_info_size)
-    return &((struct df_word_lr_bb_info *) df_word_lr->block_info)[index];
-  else
-    return NULL;
-}
-
-/* Get the live at out set for BB no matter what problem happens to be
-   defined.  This function is used by the register allocators who
-   choose different dataflow problems depending on the optimization
-   level.  */
-
-static inline bitmap
-df_get_live_out (basic_block bb)
-{
-  gcc_checking_assert (df_lr);
-
-  if (df_live)
-    return DF_LIVE_OUT (bb);
-  else
-    return DF_LR_OUT (bb);
-}
-
-/* Get the live at in set for BB no matter what problem happens to be
-   defined.  This function is used by the register allocators who
-   choose different dataflow problems depending on the optimization
-   level.  */
-
-static inline bitmap
-df_get_live_in (basic_block bb)
-{
-  gcc_checking_assert (df_lr);
-
-  if (df_live)
-    return DF_LIVE_IN (bb);
-  else
-    return DF_LR_IN (bb);
-}
-
-/* Get basic block info.  */
-/* Get the artificial defs for a basic block.  */
-
-static inline df_ref *
-df_get_artificial_defs (unsigned int bb_index)
-{
-  return df_scan_get_bb_info (bb_index)->artificial_defs;
-}
-
-
-/* Get the artificial uses for a basic block.  */
-
-static inline df_ref *
-df_get_artificial_uses (unsigned int bb_index)
-{
-  return df_scan_get_bb_info (bb_index)->artificial_uses;
-}
-
-
-/* web */
-
-/* This entry is allocated for each reference in the insn stream.  */
-struct web_entry
-{
-  /* Pointer to the parent in the union/find tree.  */
-  struct web_entry *pred;
-  /* Newly assigned register to the entry.  Set only for roots.  */
-  rtx reg;
-  void* extra_info;
-};
-
-extern struct web_entry *unionfind_root (struct web_entry *);
-extern bool unionfind_union (struct web_entry *, struct web_entry *);
-extern void union_defs (df_ref, struct web_entry *,
-			unsigned int *used, struct web_entry *,
-			bool (*fun) (struct web_entry *, struct web_entry *));
-
-#endif /* GCC_DF_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/diagnostic-color.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/diagnostic-color.h
deleted file mode 100644
index 63df692..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/diagnostic-color.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Copyright (C) 2013-2014 Free Software Foundation, Inc.
-   Contributed by Manuel Lopez-Ibanez <manu@gcc.gnu.org>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* Based on code from: */
-/* grep.c - main driver file for grep.
-   Copyright (C) 1992-2014 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-   02110-1301, USA.
-
-   Written July 1992 by Mike Haertel.  */
-
-#ifndef GCC_DIAGNOSTIC_COLOR_H
-#define GCC_DIAGNOSTIC_COLOR_H
-
-/* How often diagnostics are prefixed by their locations:
-   o DIAGNOSTICS_SHOW_PREFIX_NEVER: never - not yet supported;
-   o DIAGNOSTICS_SHOW_PREFIX_ONCE: emit only once;
-   o DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE: emit each time a physical
-   line is started.  */
-typedef enum
-{
-  DIAGNOSTICS_COLOR_NO       = 0,
-  DIAGNOSTICS_COLOR_YES      = 1,
-  DIAGNOSTICS_COLOR_AUTO     = 2
-} diagnostic_color_rule_t;
-
-const char *colorize_start (bool, const char *, size_t);
-const char *colorize_stop (bool);
-bool colorize_init (diagnostic_color_rule_t);
-
-inline const char *
-colorize_start (bool show_color, const char *name)
-{
-  return colorize_start (show_color, name, strlen (name));
-}
-
-#endif /* ! GCC_DIAGNOSTIC_COLOR_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/diagnostic-core.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/diagnostic-core.h
deleted file mode 100644
index 2ff8404..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/diagnostic-core.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/* Declarations of core diagnostic functionality for code that does
-   not need to deal with diagnostic contexts or diagnostic info
-   structures.
-   Copyright (C) 1998-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_DIAGNOSTIC_CORE_H
-#define GCC_DIAGNOSTIC_CORE_H
-
-#include "input.h"
-#include "bversion.h"
-
-/* Constants used to discriminate diagnostics.  */
-typedef enum
-{
-#define DEFINE_DIAGNOSTIC_KIND(K, msgid, C) K,
-#include "diagnostic.def"
-#undef DEFINE_DIAGNOSTIC_KIND
-  DK_LAST_DIAGNOSTIC_KIND,
-  /* This is used for tagging pragma pops in the diagnostic
-     classification history chain.  */
-  DK_POP
-} diagnostic_t;
-
-extern const char *progname;
-
-extern const char *trim_filename (const char *);
-
-/* If we haven't already defined a front-end-specific diagnostics
-   style, use the generic one.  */
-#ifndef GCC_DIAG_STYLE
-#define GCC_DIAG_STYLE __gcc_tdiag__
-#endif
-/* None of these functions are suitable for ATTRIBUTE_PRINTF, because
-   each language front end can extend them with its own set of format
-   specifiers.  We must use custom format checks.  */
-#if (ENABLE_CHECKING && GCC_VERSION >= 4001) || GCC_VERSION == BUILDING_GCC_VERSION
-#define ATTRIBUTE_GCC_DIAG(m, n) __attribute__ ((__format__ (GCC_DIAG_STYLE, m, n))) ATTRIBUTE_NONNULL(m)
-#else
-#define ATTRIBUTE_GCC_DIAG(m, n) ATTRIBUTE_NONNULL(m)
-#endif
-extern void internal_error (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2)
-     ATTRIBUTE_NORETURN;
-/* Pass one of the OPT_W* from options.h as the first parameter.  */
-extern bool warning (int, const char *, ...) ATTRIBUTE_GCC_DIAG(2,3);
-extern bool warning_at (location_t, int, const char *, ...)
-    ATTRIBUTE_GCC_DIAG(3,4);
-extern void error (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2);
-extern void error_n (location_t, int, const char *, const char *, ...)
-    ATTRIBUTE_GCC_DIAG(3,5) ATTRIBUTE_GCC_DIAG(4,5);
-extern void error_at (location_t, const char *, ...) ATTRIBUTE_GCC_DIAG(2,3);
-extern void fatal_error (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2)
-     ATTRIBUTE_NORETURN;
-/* Pass one of the OPT_W* from options.h as the second parameter.  */
-extern bool pedwarn (location_t, int, const char *, ...)
-     ATTRIBUTE_GCC_DIAG(3,4);
-extern bool permerror (location_t, const char *, ...) ATTRIBUTE_GCC_DIAG(2,3);
-extern void sorry (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2);
-extern void inform (location_t, const char *, ...) ATTRIBUTE_GCC_DIAG(2,3);
-extern void inform_n (location_t, int, const char *, const char *, ...)
-    ATTRIBUTE_GCC_DIAG(3,5) ATTRIBUTE_GCC_DIAG(4,5);
-extern void verbatim (const char *, ...) ATTRIBUTE_GCC_DIAG(1,2);
-extern bool emit_diagnostic (diagnostic_t, location_t, int,
-			     const char *, ...) ATTRIBUTE_GCC_DIAG(4,5);
-extern bool seen_error (void);
-
-#ifdef BUFSIZ
-  /* N.B. Unlike all the others, fnotice is just gettext+fprintf, and
-     therefore it can have ATTRIBUTE_PRINTF.  */
-extern void fnotice			(FILE *, const char *, ...)
-     ATTRIBUTE_PRINTF_2;
-#endif
-
-#endif /* ! GCC_DIAGNOSTIC_CORE_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/diagnostic.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/diagnostic.def
deleted file mode 100644
index c45ee10..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/diagnostic.def
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Copyright (C) 2001-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* DK_UNSPECIFIED must be first so it has a value of zero.  We never
-   assign this kind to an actual diagnostic, we only use this in
-   variables that can hold a kind, to mean they have yet to have a
-   kind specified.  I.e. they're uninitialized.  Within the diagnostic
-   machinery, this kind also means "don't change the existing kind",
-   meaning "no change is specified".  */
-DEFINE_DIAGNOSTIC_KIND (DK_UNSPECIFIED, "", NULL)
-
-/* If a diagnostic is set to DK_IGNORED, it won't get reported at all.
-   This is used by the diagnostic machinery when it wants to disable a
-   diagnostic without disabling the option which causes it.  */
-DEFINE_DIAGNOSTIC_KIND (DK_IGNORED, "", NULL)
-
-/* The remainder are real diagnostic types.  */
-DEFINE_DIAGNOSTIC_KIND (DK_FATAL, "fatal error: ", "error")
-DEFINE_DIAGNOSTIC_KIND (DK_ICE, "internal compiler error: ", "error")
-DEFINE_DIAGNOSTIC_KIND (DK_ERROR, "error: ", "error")
-DEFINE_DIAGNOSTIC_KIND (DK_SORRY, "sorry, unimplemented: ", "error")
-DEFINE_DIAGNOSTIC_KIND (DK_WARNING, "warning: ", "warning")
-DEFINE_DIAGNOSTIC_KIND (DK_ANACHRONISM, "anachronism: ", "warning")
-DEFINE_DIAGNOSTIC_KIND (DK_NOTE, "note: ", "note")
-DEFINE_DIAGNOSTIC_KIND (DK_DEBUG, "debug: ", "note")
-/* These two would be re-classified as DK_WARNING or DK_ERROR, so the
-prefix does not matter.  */
-DEFINE_DIAGNOSTIC_KIND (DK_PEDWARN, "pedwarn: ", NULL)
-DEFINE_DIAGNOSTIC_KIND (DK_PERMERROR, "permerror: ", NULL)
-/* This one is just for counting DK_WARNING promoted to DK_ERROR
-   due to -Werror and -Werror=warning.  */
-DEFINE_DIAGNOSTIC_KIND (DK_WERROR, "error: ", NULL)
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/diagnostic.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/diagnostic.h
deleted file mode 100644
index 6122938..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/diagnostic.h
+++ /dev/null
@@ -1,299 +0,0 @@
-/* Various declarations for language-independent diagnostics subroutines.
-   Copyright (C) 2000-2014 Free Software Foundation, Inc.
-   Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_DIAGNOSTIC_H
-#define GCC_DIAGNOSTIC_H
-
-#include "pretty-print.h"
-#include "diagnostic-core.h"
-
-/* A diagnostic is described by the MESSAGE to send, the FILE and LINE of
-   its context and its KIND (ice, error, warning, note, ...)  See complete
-   list in diagnostic.def.  */
-struct diagnostic_info
-{
-  text_info message;
-  location_t location;
-  unsigned int override_column;
-  /* Auxiliary data for client.  */
-  void *x_data;
-  /* The kind of diagnostic it is about.  */
-  diagnostic_t kind;
-  /* Which OPT_* directly controls this diagnostic.  */
-  int option_index;
-};
-
-/* Each time a diagnostic's classification is changed with a pragma,
-   we record the change and the location of the change in an array of
-   these structs.  */
-struct diagnostic_classification_change_t
-{
-  location_t location;
-  int option;
-  diagnostic_t kind;
-};
-
-/*  Forward declarations.  */
-typedef void (*diagnostic_starter_fn) (diagnostic_context *,
-				       diagnostic_info *);
-typedef diagnostic_starter_fn diagnostic_finalizer_fn;
-
-/* This data structure bundles altogether any information relevant to
-   the context of a diagnostic message.  */
-struct diagnostic_context
-{
-  /* Where most of the diagnostic formatting work is done.  */
-  pretty_printer *printer;
-
-  /* The number of times we have issued diagnostics.  */
-  int diagnostic_count[DK_LAST_DIAGNOSTIC_KIND];
-
-  /* True if we should display the "warnings are being tread as error"
-     message, usually displayed once per compiler run.  */
-  bool some_warnings_are_errors;
-
-  /* True if it has been requested that warnings be treated as errors.  */
-  bool warning_as_error_requested;
-
-  /* The number of option indexes that can be passed to warning() et
-     al.  */
-  int n_opts;
-
-  /* For each option index that can be passed to warning() et al
-     (OPT_* from options.h when using this code with the core GCC
-     options), this array may contain a new kind that the diagnostic
-     should be changed to before reporting, or DK_UNSPECIFIED to leave
-     it as the reported kind, or DK_IGNORED to not report it at
-     all.  */
-  diagnostic_t *classify_diagnostic;
-
-  /* History of all changes to the classifications above.  This list
-     is stored in location-order, so we can search it, either
-     binary-wise or end-to-front, to find the most recent
-     classification for a given diagnostic, given the location of the
-     diagnostic.  */
-  diagnostic_classification_change_t *classification_history;
-
-  /* The size of the above array.  */
-  int n_classification_history;
-
-  /* For pragma push/pop.  */
-  int *push_list;
-  int n_push;
-
-  /* True if we should print the source line with a caret indicating
-     the location.  */
-  bool show_caret;
-
-  /* Maximum width of the source line printed.  */
-  int caret_max_width;
-
-  /* True if we should print the command line option which controls
-     each diagnostic, if known.  */
-  bool show_option_requested;
-
-  /* True if we should raise a SIGABRT on errors.  */
-  bool abort_on_error;
-
-  /* True if we should show the column number on diagnostics.  */
-  bool show_column;
-
-  /* True if pedwarns are errors.  */
-  bool pedantic_errors;
-
-  /* True if permerrors are warnings.  */
-  bool permissive;
-
-  /* The index of the option to associate with turning permerrors into
-     warnings.  */
-  int opt_permissive;
-
-  /* True if errors are fatal.  */
-  bool fatal_errors;
-
-  /* True if all warnings should be disabled.  */
-  bool dc_inhibit_warnings;
-
-  /* True if warnings should be given in system headers.  */
-  bool dc_warn_system_headers;
-
-  /* Maximum number of errors to report.  */
-  unsigned int max_errors;
-
-  /* This function is called before any message is printed out.  It is
-     responsible for preparing message prefix and such.  For example, it
-     might say:
-     In file included from "/usr/local/include/curses.h:5:
-                      from "/home/gdr/src/nifty_printer.h:56:
-                      ...
-  */
-  diagnostic_starter_fn begin_diagnostic;
-
-  /* This function is called after the diagnostic message is printed.  */
-  diagnostic_finalizer_fn end_diagnostic;
-
-  /* Client hook to report an internal error.  */
-  void (*internal_error) (diagnostic_context *, const char *, va_list *);
-
-  /* Client hook to say whether the option controlling a diagnostic is
-     enabled.  Returns nonzero if enabled, zero if disabled.  */
-  int (*option_enabled) (int, void *);
-
-  /* Client information to pass as second argument to
-     option_enabled.  */
-  void *option_state;
-
-  /* Client hook to return the name of an option that controls a
-     diagnostic.  Returns malloced memory.  The first diagnostic_t
-     argument is the kind of diagnostic before any reclassification
-     (of warnings as errors, etc.); the second is the kind after any
-     reclassification.  May return NULL if no name is to be printed.
-     May be passed 0 as well as the index of a particular option.  */
-  char *(*option_name) (diagnostic_context *, int, diagnostic_t, diagnostic_t);
-
-  /* Auxiliary data for client.  */
-  void *x_data;
-
-  /* Used to detect that the last caret was printed at the same location.  */
-  location_t last_location;
-
-  /* Used to detect when the input file stack has changed since last
-     described.  */
-  const struct line_map *last_module;
-
-  int lock;
-
-  bool inhibit_notes_p;
-};
-
-static inline void
-diagnostic_inhibit_notes (diagnostic_context * context)
-{
-  context->inhibit_notes_p = true;
-}
-
-
-/* Client supplied function to announce a diagnostic.  */
-#define diagnostic_starter(DC) (DC)->begin_diagnostic
-
-/* Client supplied function called after a diagnostic message is
-   displayed.  */
-#define diagnostic_finalizer(DC) (DC)->end_diagnostic
-
-/* Extension hooks for client.  */
-#define diagnostic_context_auxiliary_data(DC) (DC)->x_data
-#define diagnostic_info_auxiliary_data(DI) (DI)->x_data
-
-/* Same as pp_format_decoder.  Works on 'diagnostic_context *'.  */
-#define diagnostic_format_decoder(DC) ((DC)->printer->format_decoder)
-
-/* Same as output_prefixing_rule.  Works on 'diagnostic_context *'.  */
-#define diagnostic_prefixing_rule(DC) ((DC)->printer->wrapping.rule)
-
-/* Maximum characters per line in automatic line wrapping mode.
-   Zero means don't wrap lines.  */
-#define diagnostic_line_cutoff(DC) ((DC)->printer->wrapping.line_cutoff)
-
-#define diagnostic_flush_buffer(DC) pp_flush ((DC)->printer)
-
-/* True if the last module or file in which a diagnostic was reported is
-   different from the current one.  */
-#define diagnostic_last_module_changed(DC, MAP)	\
-  ((DC)->last_module != MAP)
-
-/* Remember the current module or file as being the last one in which we
-   report a diagnostic.  */
-#define diagnostic_set_last_module(DC, MAP)	\
-  (DC)->last_module = MAP
-
-/* Raise SIGABRT on any diagnostic of severity DK_ERROR or higher.  */
-#define diagnostic_abort_on_error(DC) \
-  (DC)->abort_on_error = true
-
-/* This diagnostic_context is used by front-ends that directly output
-   diagnostic messages without going through `error', `warning',
-   and similar functions.  */
-extern diagnostic_context *global_dc;
-
-/* The total count of a KIND of diagnostics emitted so far.  */
-#define diagnostic_kind_count(DC, DK) (DC)->diagnostic_count[(int) (DK)]
-
-/* The number of errors that have been issued so far.  Ideally, these
-   would take a diagnostic_context as an argument.  */
-#define errorcount diagnostic_kind_count (global_dc, DK_ERROR)
-/* Similarly, but for warnings.  */
-#define warningcount diagnostic_kind_count (global_dc, DK_WARNING)
-/* Similarly, but for warnings promoted to errors.  */
-#define werrorcount diagnostic_kind_count (global_dc, DK_WERROR)
-/* Similarly, but for sorrys.  */
-#define sorrycount diagnostic_kind_count (global_dc, DK_SORRY)
-
-/* Returns nonzero if warnings should be emitted.  */
-#define diagnostic_report_warnings_p(DC, LOC)				\
-  (!(DC)->dc_inhibit_warnings						\
-   && !(in_system_header_at (LOC) && !(DC)->dc_warn_system_headers))
-
-#define report_diagnostic(D) diagnostic_report_diagnostic (global_dc, D)
-
-/* Override the column number to be used for reporting a
-   diagnostic.  */
-#define diagnostic_override_column(DI, COL) (DI)->override_column = (COL)
-
-/* Override the option index to be used for reporting a
-   diagnostic.  */
-#define diagnostic_override_option_index(DI, OPTIDX) \
-    ((DI)->option_index = (OPTIDX))
-
-/* Diagnostic related functions.  */
-extern void diagnostic_initialize (diagnostic_context *, int);
-extern void diagnostic_finish (diagnostic_context *);
-extern void diagnostic_report_current_module (diagnostic_context *, location_t);
-extern void diagnostic_show_locus (diagnostic_context *, const diagnostic_info *);
-
-/* Force diagnostics controlled by OPTIDX to be kind KIND.  */
-extern diagnostic_t diagnostic_classify_diagnostic (diagnostic_context *,
-						    int /* optidx */,
-						    diagnostic_t /* kind */,
-						    location_t);
-extern void diagnostic_push_diagnostics (diagnostic_context *, location_t);
-extern void diagnostic_pop_diagnostics (diagnostic_context *, location_t);
-extern bool diagnostic_report_diagnostic (diagnostic_context *,
-					  diagnostic_info *);
-#ifdef ATTRIBUTE_GCC_DIAG
-extern void diagnostic_set_info (diagnostic_info *, const char *, va_list *,
-				 location_t, diagnostic_t) ATTRIBUTE_GCC_DIAG(2,0);
-extern void diagnostic_set_info_translated (diagnostic_info *, const char *,
-					    va_list *, location_t,
-					    diagnostic_t)
-     ATTRIBUTE_GCC_DIAG(2,0);
-extern void diagnostic_append_note (diagnostic_context *, location_t,
-                                    const char *, ...) ATTRIBUTE_GCC_DIAG(3,4);
-#endif
-extern char *diagnostic_build_prefix (diagnostic_context *, const diagnostic_info *);
-void default_diagnostic_starter (diagnostic_context *, diagnostic_info *);
-void default_diagnostic_finalizer (diagnostic_context *, diagnostic_info *);
-void diagnostic_set_caret_max_width (diagnostic_context *context, int value);
-
-void diagnostic_file_cache_fini (void);
-
-/* Pure text formatting support functions.  */
-extern char *file_name_as_prefix (diagnostic_context *, const char *);
-
-#endif /* ! GCC_DIAGNOSTIC_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/double-int.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/double-int.h
deleted file mode 100644
index 5ca9ccf..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/double-int.h
+++ /dev/null
@@ -1,438 +0,0 @@
-/* Operations with long integers.
-   Copyright (C) 2006-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3, or (at your option) any
-later version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef DOUBLE_INT_H
-#define DOUBLE_INT_H
-
-/* A large integer is currently represented as a pair of HOST_WIDE_INTs.
-   It therefore represents a number with precision of
-   2 * HOST_BITS_PER_WIDE_INT bits (it is however possible that the
-   internal representation will change, if numbers with greater precision
-   are needed, so the users should not rely on it).  The representation does
-   not contain any information about signedness of the represented value, so
-   it can be used to represent both signed and unsigned numbers.  For
-   operations where the results depend on signedness (division, comparisons),
-   it must be specified separately.  For each such operation, there are three
-   versions of the function -- double_int_op, that takes an extra UNS argument
-   giving the signedness of the values, and double_int_sop and double_int_uop
-   that stand for its specializations for signed and unsigned values.
-
-   You may also represent with numbers in smaller precision using double_int.
-   You however need to use double_int_ext (that fills in the bits of the
-   number over the prescribed precision with zeros or with the sign bit) before
-   operations that do not perform arithmetics modulo 2^precision (comparisons,
-   division), and possibly before storing the results, if you want to keep
-   them in some canonical form).  In general, the signedness of double_int_ext
-   should match the signedness of the operation.
-
-   ??? The components of double_int differ in signedness mostly for
-   historical reasons (they replace an older structure used to represent
-   numbers with precision higher than HOST_WIDE_INT).  It might be less
-   confusing to have them both signed or both unsigned.  */
-
-struct double_int
-{
-  /* Normally, we would define constructors to create instances.
-     Two things prevent us from doing so.
-     First, defining a constructor makes the class non-POD in C++03,
-     and we certainly want double_int to be a POD.
-     Second, the GCC conding conventions prefer explicit conversion,
-     and explicit conversion operators are not available until C++11.  */
-
-  static double_int from_uhwi (unsigned HOST_WIDE_INT cst);
-  static double_int from_shwi (HOST_WIDE_INT cst);
-  static double_int from_pair (HOST_WIDE_INT high, unsigned HOST_WIDE_INT low);
-
-  /* Construct from a fuffer of length LEN.  BUFFER will be read according
-     to byte endianess and word endianess.  */
-  static double_int from_buffer (const unsigned char *buffer, int len);
-
-  /* No copy assignment operator or destructor to keep the type a POD.  */
-
-  /* There are some special value-creation static member functions.  */
-
-  static double_int mask (unsigned prec);
-  static double_int max_value (unsigned int prec, bool uns);
-  static double_int min_value (unsigned int prec, bool uns);
-
-  /* The following functions are mutating operations.  */
-
-  double_int &operator ++ (); // prefix
-  double_int &operator -- (); // prefix
-  double_int &operator *= (double_int);
-  double_int &operator += (double_int);
-  double_int &operator -= (double_int);
-  double_int &operator &= (double_int);
-  double_int &operator ^= (double_int);
-  double_int &operator |= (double_int);
-
-  /* The following functions are non-mutating operations.  */
-
-  /* Conversion functions.  */
-
-  HOST_WIDE_INT to_shwi () const;
-  unsigned HOST_WIDE_INT to_uhwi () const;
-
-  /* Conversion query functions.  */
-
-  bool fits_uhwi () const;
-  bool fits_shwi () const;
-  bool fits_hwi (bool uns) const;
-
-  /* Attribute query functions.  */
-
-  int trailing_zeros () const;
-  int popcount () const;
-
-  /* Arithmetic query operations.  */
-
-  bool multiple_of (double_int, bool, double_int *) const;
-
-  /* Arithmetic operation functions.  */
-
-  /* The following operations perform arithmetics modulo 2^precision, so you
-     do not need to call .ext between them, even if you are representing
-     numbers with precision less than HOST_BITS_PER_DOUBLE_INT bits.  */
-
-  double_int set_bit (unsigned) const;
-  double_int mul_with_sign (double_int, bool unsigned_p, bool *overflow) const;
-  double_int wide_mul_with_sign (double_int, bool unsigned_p,
-				 double_int *higher, bool *overflow) const;
-  double_int add_with_sign (double_int, bool unsigned_p, bool *overflow) const;
-  double_int sub_with_overflow (double_int, bool *overflow) const;
-  double_int neg_with_overflow (bool *overflow) const;
-
-  double_int operator * (double_int) const;
-  double_int operator + (double_int) const;
-  double_int operator - (double_int) const;
-  double_int operator - () const;
-  double_int operator ~ () const;
-  double_int operator & (double_int) const;
-  double_int operator | (double_int) const;
-  double_int operator ^ (double_int) const;
-  double_int and_not (double_int) const;
-
-  double_int lshift (HOST_WIDE_INT count) const;
-  double_int lshift (HOST_WIDE_INT count, unsigned int prec, bool arith) const;
-  double_int rshift (HOST_WIDE_INT count) const;
-  double_int rshift (HOST_WIDE_INT count, unsigned int prec, bool arith) const;
-  double_int alshift (HOST_WIDE_INT count, unsigned int prec) const;
-  double_int arshift (HOST_WIDE_INT count, unsigned int prec) const;
-  double_int llshift (HOST_WIDE_INT count, unsigned int prec) const;
-  double_int lrshift (HOST_WIDE_INT count, unsigned int prec) const;
-  double_int lrotate (HOST_WIDE_INT count, unsigned int prec) const;
-  double_int rrotate (HOST_WIDE_INT count, unsigned int prec) const;
-
-  /* You must ensure that double_int::ext is called on the operands
-     of the following operations, if the precision of the numbers
-     is less than HOST_BITS_PER_DOUBLE_INT bits.  */
-
-  double_int div (double_int, bool, unsigned) const;
-  double_int sdiv (double_int, unsigned) const;
-  double_int udiv (double_int, unsigned) const;
-  double_int mod (double_int, bool, unsigned) const;
-  double_int smod (double_int, unsigned) const;
-  double_int umod (double_int, unsigned) const;
-  double_int divmod_with_overflow (double_int, bool, unsigned,
-				   double_int *, bool *) const;
-  double_int divmod (double_int, bool, unsigned, double_int *) const;
-  double_int sdivmod (double_int, unsigned, double_int *) const;
-  double_int udivmod (double_int, unsigned, double_int *) const;
-
-  /* Precision control functions.  */
-
-  double_int ext (unsigned prec, bool uns) const;
-  double_int zext (unsigned prec) const;
-  double_int sext (unsigned prec) const;
-
-  /* Comparative functions.  */
-
-  bool is_zero () const;
-  bool is_one () const;
-  bool is_minus_one () const;
-  bool is_negative () const;
-
-  int cmp (double_int b, bool uns) const;
-  int ucmp (double_int b) const;
-  int scmp (double_int b) const;
-
-  bool ult (double_int b) const;
-  bool ule (double_int b) const;
-  bool ugt (double_int b) const;
-  bool slt (double_int b) const;
-  bool sle (double_int b) const;
-  bool sgt (double_int b) const;
-
-  double_int max (double_int b, bool uns);
-  double_int smax (double_int b);
-  double_int umax (double_int b);
-
-  double_int min (double_int b, bool uns);
-  double_int smin (double_int b);
-  double_int umin (double_int b);
-
-  bool operator == (double_int cst2) const;
-  bool operator != (double_int cst2) const;
-
-  /* Please migrate away from using these member variables publicly.  */
-
-  unsigned HOST_WIDE_INT low;
-  HOST_WIDE_INT high;
-
-};
-
-#define HOST_BITS_PER_DOUBLE_INT (2 * HOST_BITS_PER_WIDE_INT)
-
-/* Constructors and conversions.  */
-
-/* Constructs double_int from integer CST.  The bits over the precision of
-   HOST_WIDE_INT are filled with the sign bit.  */
-
-inline double_int
-double_int::from_shwi (HOST_WIDE_INT cst)
-{
-  double_int r;
-  r.low = (unsigned HOST_WIDE_INT) cst;
-  r.high = cst < 0 ? -1 : 0;
-  return r;
-}
-
-/* Some useful constants.  */
-/* FIXME(crowl): Maybe remove after converting callers?
-   The problem is that a named constant would not be as optimizable,
-   while the functional syntax is more verbose.  */
-
-#define double_int_minus_one (double_int::from_shwi (-1))
-#define double_int_zero (double_int::from_shwi (0))
-#define double_int_one (double_int::from_shwi (1))
-#define double_int_two (double_int::from_shwi (2))
-#define double_int_ten (double_int::from_shwi (10))
-
-/* Constructs double_int from unsigned integer CST.  The bits over the
-   precision of HOST_WIDE_INT are filled with zeros.  */
-
-inline double_int
-double_int::from_uhwi (unsigned HOST_WIDE_INT cst)
-{
-  double_int r;
-  r.low = cst;
-  r.high = 0;
-  return r;
-}
-
-inline double_int
-double_int::from_pair (HOST_WIDE_INT high, unsigned HOST_WIDE_INT low)
-{
-  double_int r;
-  r.low = low;
-  r.high = high;
-  return r;
-}
-
-inline double_int &
-double_int::operator ++ ()
-{
-  *this += double_int_one;
-  return *this;
-}
-
-inline double_int &
-double_int::operator -- ()
-{
-  *this -= double_int_one;
-  return *this;
-}
-
-inline double_int &
-double_int::operator &= (double_int b)
-{
-  *this = *this & b;
-  return *this;
-}
-
-inline double_int &
-double_int::operator ^= (double_int b)
-{
-  *this = *this ^ b;
-  return *this;
-}
-
-inline double_int &
-double_int::operator |= (double_int b)
-{
-  *this = *this | b;
-  return *this;
-}
-
-/* Returns value of CST as a signed number.  CST must satisfy
-   double_int::fits_signed.  */
-
-inline HOST_WIDE_INT
-double_int::to_shwi () const
-{
-  return (HOST_WIDE_INT) low;
-}
-
-/* Returns value of CST as an unsigned number.  CST must satisfy
-   double_int::fits_unsigned.  */
-
-inline unsigned HOST_WIDE_INT
-double_int::to_uhwi () const
-{
-  return low;
-}
-
-/* Returns true if CST fits in unsigned HOST_WIDE_INT.  */
-
-inline bool
-double_int::fits_uhwi () const
-{
-  return high == 0;
-}
-
-/* Logical operations.  */
-
-/* Returns ~A.  */
-
-inline double_int
-double_int::operator ~ () const
-{
-  double_int result;
-  result.low = ~low;
-  result.high = ~high;
-  return result;
-}
-
-/* Returns A | B.  */
-
-inline double_int
-double_int::operator | (double_int b) const
-{
-  double_int result;
-  result.low = low | b.low;
-  result.high = high | b.high;
-  return result;
-}
-
-/* Returns A & B.  */
-
-inline double_int
-double_int::operator & (double_int b) const
-{
-  double_int result;
-  result.low = low & b.low;
-  result.high = high & b.high;
-  return result;
-}
-
-/* Returns A & ~B.  */
-
-inline double_int
-double_int::and_not (double_int b) const
-{
-  double_int result;
-  result.low = low & ~b.low;
-  result.high = high & ~b.high;
-  return result;
-}
-
-/* Returns A ^ B.  */
-
-inline double_int
-double_int::operator ^ (double_int b) const
-{
-  double_int result;
-  result.low = low ^ b.low;
-  result.high = high ^ b.high;
-  return result;
-}
-
-void dump_double_int (FILE *, double_int, bool);
-
-#define ALL_ONES (~((unsigned HOST_WIDE_INT) 0))
-
-/* The operands of the following comparison functions must be processed
-   with double_int_ext, if their precision is less than
-   HOST_BITS_PER_DOUBLE_INT bits.  */
-
-/* Returns true if CST is zero.  */
-
-inline bool
-double_int::is_zero () const
-{
-  return low == 0 && high == 0;
-}
-
-/* Returns true if CST is one.  */
-
-inline bool
-double_int::is_one () const
-{
-  return low == 1 && high == 0;
-}
-
-/* Returns true if CST is minus one.  */
-
-inline bool
-double_int::is_minus_one () const
-{
-  return low == ALL_ONES && high == -1;
-}
-
-/* Returns true if CST is negative.  */
-
-inline bool
-double_int::is_negative () const
-{
-  return high < 0;
-}
-
-/* Returns true if CST1 == CST2.  */
-
-inline bool
-double_int::operator == (double_int cst2) const
-{
-  return low == cst2.low && high == cst2.high;
-}
-
-/* Returns true if CST1 != CST2.  */
-
-inline bool
-double_int::operator != (double_int cst2) const
-{
-  return low != cst2.low || high != cst2.high;
-}
-
-/* Return number of set bits of CST.  */
-
-inline int
-double_int::popcount () const
-{
-  return popcount_hwi (high) + popcount_hwi (low);
-}
-
-
-#ifndef GENERATOR_FILE
-/* Conversion to and from GMP integer representations.  */
-
-void mpz_set_double_int (mpz_t, double_int, bool);
-double_int mpz_get_double_int (const_tree, mpz_t, bool);
-#endif
-
-#endif /* DOUBLE_INT_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/dumpfile.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/dumpfile.h
deleted file mode 100644
index 75949b7..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/dumpfile.h
+++ /dev/null
@@ -1,240 +0,0 @@
-/* Definitions for the shared dumpfile.
-   Copyright (C) 2004-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-
-#ifndef GCC_DUMPFILE_H
-#define GCC_DUMPFILE_H 1
-
-#include "line-map.h"
-
-/* Different tree dump places.  When you add new tree dump places,
-   extend the DUMP_FILES array in dumpfile.c.  */
-enum tree_dump_index
-{
-  TDI_none,			/* No dump */
-  TDI_cgraph,                   /* dump function call graph.  */
-  TDI_inheritance,              /* dump type inheritance graph.  */
-  TDI_tu,			/* dump the whole translation unit.  */
-  TDI_class,			/* dump class hierarchy.  */
-  TDI_original,			/* dump each function before optimizing it */
-  TDI_generic,			/* dump each function after genericizing it */
-  TDI_nested,			/* dump each function after unnesting it */
-  TDI_tree_all,                 /* enable all the GENERIC/GIMPLE dumps.  */
-  TDI_rtl_all,                  /* enable all the RTL dumps.  */
-  TDI_ipa_all,                  /* enable all the IPA dumps.  */
-
-  TDI_end
-};
-
-/* Bit masks to control dumping. Not all values are applicable to all
-   dumps. Add new ones at the end. When you define new values, extend
-   the DUMP_OPTIONS array in dumpfile.c. The TDF_* flags coexist with
-   MSG_* flags (for -fopt-info) and the bit values must be chosen to
-   allow that.  */
-#define TDF_ADDRESS	(1 << 0)	/* dump node addresses */
-#define TDF_SLIM	(1 << 1)	/* don't go wild following links */
-#define TDF_RAW  	(1 << 2)	/* don't unparse the function */
-#define TDF_DETAILS	(1 << 3)	/* show more detailed info about
-					   each pass */
-#define TDF_STATS	(1 << 4)	/* dump various statistics about
-					   each pass */
-#define TDF_BLOCKS	(1 << 5)	/* display basic block boundaries */
-#define TDF_VOPS	(1 << 6)	/* display virtual operands */
-#define TDF_LINENO	(1 << 7)	/* display statement line numbers */
-#define TDF_UID		(1 << 8)	/* display decl UIDs */
-
-#define TDF_TREE	(1 << 9)	/* is a tree dump */
-#define TDF_RTL		(1 << 10)	/* is a RTL dump */
-#define TDF_IPA		(1 << 11)	/* is an IPA dump */
-#define TDF_STMTADDR	(1 << 12)	/* Address of stmt.  */
-
-#define TDF_GRAPH	(1 << 13)	/* a graph dump is being emitted */
-#define TDF_MEMSYMS	(1 << 14)	/* display memory symbols in expr.
-                                           Implies TDF_VOPS.  */
-
-#define TDF_DIAGNOSTIC	(1 << 15)	/* A dump to be put in a diagnostic
-					   message.  */
-#define TDF_VERBOSE     (1 << 16)       /* A dump that uses the full tree
-					   dumper to print stmts.  */
-#define TDF_RHS_ONLY	(1 << 17)	/* a flag to only print the RHS of
-					   a gimple stmt.  */
-#define TDF_ASMNAME	(1 << 18)	/* display asm names of decls  */
-#define TDF_EH		(1 << 19)	/* display EH region number
-					   holding this gimple statement.  */
-#define TDF_NOUID	(1 << 20)	/* omit UIDs from dumps.  */
-#define TDF_ALIAS	(1 << 21)	/* display alias information  */
-#define TDF_ENUMERATE_LOCALS (1 << 22)	/* Enumerate locals by uid.  */
-#define TDF_CSELIB	(1 << 23)	/* Dump cselib details.  */
-#define TDF_SCEV	(1 << 24)	/* Dump SCEV details.  */
-#define TDF_COMMENT	(1 << 25)	/* Dump lines with prefix ";;"  */
-#define MSG_OPTIMIZED_LOCATIONS  (1 << 26)  /* -fopt-info optimized sources */
-#define MSG_MISSED_OPTIMIZATION  (1 << 27)  /* missed opportunities */
-#define MSG_NOTE                 (1 << 28)  /* general optimization info */
-#define MSG_ALL         (MSG_OPTIMIZED_LOCATIONS | MSG_MISSED_OPTIMIZATION \
-                         | MSG_NOTE)
-
-
-/* Flags to control high-level -fopt-info dumps.  Usually these flags
-   define a group of passes.  An optimization pass can be part of
-   multiple groups.  */
-#define OPTGROUP_NONE        (0)
-#define OPTGROUP_IPA         (1 << 1)   /* IPA optimization passes */
-#define OPTGROUP_LOOP        (1 << 2)   /* Loop optimization passes */
-#define OPTGROUP_INLINE      (1 << 3)   /* Inlining passes */
-#define OPTGROUP_VEC         (1 << 4)   /* Vectorization passes */
-#define OPTGROUP_OTHER       (1 << 5)   /* All other passes */
-#define OPTGROUP_ALL	     (OPTGROUP_IPA | OPTGROUP_LOOP | OPTGROUP_INLINE \
-                              | OPTGROUP_VEC | OPTGROUP_OTHER)
-
-/* Define a tree dump switch.  */
-struct dump_file_info
-{
-  const char *suffix;           /* suffix to give output file.  */
-  const char *swtch;            /* command line dump switch */
-  const char *glob;             /* command line glob  */
-  const char *pfilename;        /* filename for the pass-specific stream  */
-  const char *alt_filename;     /* filename for the -fopt-info stream  */
-  FILE *pstream;                /* pass-specific dump stream  */
-  FILE *alt_stream;             /* -fopt-info stream */
-  int pflags;                   /* dump flags */
-  int optgroup_flags;           /* optgroup flags for -fopt-info */
-  int alt_flags;                /* flags for opt-info */
-  int pstate;                   /* state of pass-specific stream */
-  int alt_state;                /* state of the -fopt-info stream */
-  int num;                      /* dump file number */
-};
-
-/* In dumpfile.c */
-extern FILE *dump_begin (int, int *);
-extern void dump_end (int, FILE *);
-extern int opt_info_switch_p (const char *);
-extern const char *dump_flag_name (int);
-extern void dump_printf (int, const char *, ...) ATTRIBUTE_PRINTF_2;
-extern void dump_printf_loc (int, source_location,
-                             const char *, ...) ATTRIBUTE_PRINTF_3;
-extern void dump_basic_block (int, basic_block, int);
-extern void dump_generic_expr_loc (int, source_location, int, tree);
-extern void dump_generic_expr (int, int, tree);
-extern void dump_gimple_stmt_loc (int, source_location, int, gimple, int);
-extern void dump_gimple_stmt (int, int, gimple, int);
-extern void print_combine_total_stats (void);
-extern bool enable_rtl_dump_file (void);
-
-/* In tree-dump.c  */
-extern void dump_node (const_tree, int, FILE *);
-
-/* In combine.c  */
-extern void dump_combine_total_stats (FILE *);
-/* In cfghooks.c  */
-extern void dump_bb (FILE *, basic_block, int, int);
-
-/* Global variables used to communicate with passes.  */
-extern FILE *dump_file;
-extern FILE *alt_dump_file;
-extern int dump_flags;
-extern const char *dump_file_name;
-
-/* Return true if any of the dumps is enabled, false otherwise. */
-static inline bool
-dump_enabled_p (void)
-{
-  return (dump_file || alt_dump_file);
-}
-
-namespace gcc {
-
-class dump_manager
-{
-public:
-
-  dump_manager ();
-
-  unsigned int
-  dump_register (const char *suffix, const char *swtch, const char *glob,
-		 int flags, int optgroup_flags);
-
-  /* Return the dump_file_info for the given phase.  */
-  struct dump_file_info *
-  get_dump_file_info (int phase) const;
-
-  /* Return the name of the dump file for the given phase.
-     If the dump is not enabled, returns NULL.  */
-  char *
-  get_dump_file_name (int phase) const;
-
-  int
-  dump_switch_p (const char *arg);
-
-  /* Start a dump for PHASE. Store user-supplied dump flags in
-     *FLAG_PTR.  Return the number of streams opened.  Set globals
-     DUMP_FILE, and ALT_DUMP_FILE to point to the opened streams, and
-     set dump_flags appropriately for both pass dump stream and
-     -fopt-info stream. */
-  int
-  dump_start (int phase, int *flag_ptr);
-
-  /* Finish a tree dump for PHASE and close associated dump streams.  Also
-     reset the globals DUMP_FILE, ALT_DUMP_FILE, and DUMP_FLAGS.  */
-  void
-  dump_finish (int phase);
-
-  FILE *
-  dump_begin (int phase, int *flag_ptr);
-
-  /* Returns nonzero if tree dump PHASE has been initialized.  */
-  int
-  dump_initialized_p (int phase) const;
-
-  /* Returns the switch name of PHASE.  */
-  const char *
-  dump_flag_name (int phase) const;
-
-private:
-
-  int
-  dump_phase_enabled_p (int phase) const;
-
-  int
-  dump_switch_p_1 (const char *arg, struct dump_file_info *dfi, bool doglob);
-
-  int
-  dump_enable_all (int flags, const char *filename);
-
-  int
-  opt_info_enable_passes (int optgroup_flags, int flags, const char *filename);
-
-private:
-
-  /* Dynamically registered dump files and switches.  */
-  int m_next_dump;
-  struct dump_file_info *m_extra_dump_files;
-  size_t m_extra_dump_files_in_use;
-  size_t m_extra_dump_files_alloced;
-
-  /* Grant access to dump_enable_all.  */
-  friend bool ::enable_rtl_dump_file (void);
-
-  /* Grant access to opt_info_enable_passes.  */
-  friend int ::opt_info_switch_p (const char *arg);
-
-}; // class dump_manager
-
-} // namespace gcc
-
-#endif /* GCC_DUMPFILE_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/emit-rtl.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/emit-rtl.h
deleted file mode 100644
index fe68de9..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/emit-rtl.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/* Exported functions from emit-rtl.c
-   Copyright (C) 2004-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_EMIT_RTL_H
-#define GCC_EMIT_RTL_H
-
-/* Set the alias set of MEM to SET.  */
-extern void set_mem_alias_set (rtx, alias_set_type);
-
-/* Set the alignment of MEM to ALIGN bits.  */
-extern void set_mem_align (rtx, unsigned int);
-
-/* Set the address space of MEM to ADDRSPACE.  */
-extern void set_mem_addr_space (rtx, addr_space_t);
-
-/* Set the expr for MEM to EXPR.  */
-extern void set_mem_expr (rtx, tree);
-
-/* Set the offset for MEM to OFFSET.  */
-extern void set_mem_offset (rtx, HOST_WIDE_INT);
-
-/* Clear the offset recorded for MEM.  */
-extern void clear_mem_offset (rtx);
-
-/* Set the size for MEM to SIZE.  */
-extern void set_mem_size (rtx, HOST_WIDE_INT);
-
-/* Clear the size recorded for MEM.  */
-extern void clear_mem_size (rtx);
-
-/* Set the attributes for MEM appropriate for a spill slot.  */
-extern void set_mem_attrs_for_spill (rtx);
-extern tree get_spill_slot_decl (bool);
-
-/* Return a memory reference like MEMREF, but with its address changed to
-   ADDR.  The caller is asserting that the actual piece of memory pointed
-   to is the same, just the form of the address is being changed, such as
-   by putting something into a register.  */
-extern rtx replace_equiv_address (rtx, rtx);
-
-/* Likewise, but the reference is not required to be valid.  */
-extern rtx replace_equiv_address_nv (rtx, rtx);
-
-extern rtx gen_blockage (void);
-extern rtvec gen_rtvec (int, ...);
-extern rtx copy_insn_1 (rtx);
-extern rtx copy_insn (rtx);
-extern rtx copy_delay_slot_insn (rtx);
-extern rtx gen_int_mode (HOST_WIDE_INT, enum machine_mode);
-extern rtx emit_copy_of_insn_after (rtx, rtx);
-extern void set_reg_attrs_from_value (rtx, rtx);
-extern void set_reg_attrs_for_parm (rtx, rtx);
-extern void set_reg_attrs_for_decl_rtl (tree t, rtx x);
-extern void adjust_reg_mode (rtx, enum machine_mode);
-extern int mem_expr_equal_p (const_tree, const_tree);
-
-extern bool need_atomic_barrier_p (enum memmodel, bool);
-
-/* Return the first insn of the current sequence or current function.  */
-
-static inline rtx
-get_insns (void)
-{
-  return crtl->emit.x_first_insn;
-}
-
-/* Specify a new insn as the first in the chain.  */
-
-static inline void
-set_first_insn (rtx insn)
-{
-  gcc_checking_assert (!insn || !PREV_INSN (insn));
-  crtl->emit.x_first_insn = insn;
-}
-
-/* Return the last insn emitted in current sequence or current function.  */
-
-static inline rtx
-get_last_insn (void)
-{
-  return crtl->emit.x_last_insn;
-}
-
-/* Specify a new insn as the last in the chain.  */
-
-static inline void
-set_last_insn (rtx insn)
-{
-  gcc_checking_assert (!insn || !NEXT_INSN (insn));
-  crtl->emit.x_last_insn = insn;
-}
-
-/* Return a number larger than any instruction's uid in this function.  */
-
-static inline int
-get_max_uid (void)
-{
-  return crtl->emit.x_cur_insn_uid;
-}
-
-extern void set_decl_incoming_rtl (tree, rtx, bool);
-
-#endif /* GCC_EMIT_RTL_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/except.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/except.h
deleted file mode 100644
index bab13e1..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/except.h
+++ /dev/null
@@ -1,335 +0,0 @@
-/* Exception Handling interface routines.
-   Copyright (C) 1996-2014 Free Software Foundation, Inc.
-   Contributed by Mike Stump <mrs@cygnus.com>.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* No include guards here, but define an include file marker anyway, so
-   that the compiler can keep track of where this file is included.  This
-   is e.g. used to avoid including this file in front-end specific files.  */
-#ifndef GCC_EXCEPT_H
-#  define GCC_EXCEPT_H
-#endif
-
-#include "hashtab.h"
-
-struct function;
-struct eh_region_d;
-struct pointer_map_t;
-
-/* The type of an exception region.  */
-enum eh_region_type
-{
-  /* CLEANUP regions implement e.g. destructors run when exiting a block.
-     They can be generated from both GIMPLE_TRY_FINALLY and GIMPLE_TRY_CATCH
-     nodes.  It is expected by the runtime that cleanup regions will *not*
-     resume normal program flow, but will continue propagation of the
-     exception.  */
-  ERT_CLEANUP,
-
-  /* TRY regions implement catching an exception.  The list of types associated
-     with the attached catch handlers is examined in order by the runtime and
-     control is transferred to the appropriate handler.  Note that a NULL type
-     list is a catch-all handler, and that it will catch *all* exceptions
-     including those originating from a different language.  */
-  ERT_TRY,
-
-  /* ALLOWED_EXCEPTIONS regions implement exception filtering, e.g. the
-     throw(type-list) specification that can be added to C++ functions.
-     The runtime examines the thrown exception vs the type list, and if
-     the exception does not match, transfers control to the handler.  The
-     normal handler for C++ calls __cxa_call_unexpected.  */
-  ERT_ALLOWED_EXCEPTIONS,
-
-  /* MUST_NOT_THROW regions prevent all exceptions from propagating.  This
-     region type is used in C++ to surround destructors being run inside a
-     CLEANUP region.  This differs from an ALLOWED_EXCEPTIONS region with
-     an empty type list in that the runtime is prepared to terminate the
-     program directly.  We only generate code for MUST_NOT_THROW regions
-     along control paths that are already handling an exception within the
-     current function.  */
-  ERT_MUST_NOT_THROW
-};
-
-
-/* A landing pad for a given exception region.  Any transfer of control
-   from the EH runtime to the function happens at a landing pad.  */
-
-struct GTY(()) eh_landing_pad_d
-{
-  /* The linked list of all landing pads associated with the region.  */
-  struct eh_landing_pad_d *next_lp;
-
-  /* The region with which this landing pad is associated.  */
-  struct eh_region_d *region;
-
-  /* At the gimple level, the location to which control will be transferred
-     for this landing pad.  There can be both EH and normal edges into the
-     block containing the post-landing-pad label.  */
-  tree post_landing_pad;
-
-  /* At the rtl level, the location to which the runtime will transfer
-     control.  This differs from the post-landing-pad in that the target's
-     EXCEPTION_RECEIVER pattern will be expanded here, as well as other
-     bookkeeping specific to exceptions.  There must not be normal edges
-     into the block containing the landing-pad label.  */
-  rtx landing_pad;
-
-  /* The index of this landing pad within fun->eh->lp_array.  */
-  int index;
-};
-
-/* A catch handler associated with an ERT_TRY region.  */
-
-struct GTY(()) eh_catch_d
-{
-  /* The double-linked list of all catch handlers for the region.  */
-  struct eh_catch_d *next_catch;
-  struct eh_catch_d *prev_catch;
-
-  /* A TREE_LIST of runtime type objects that this catch handler
-     will catch, or NULL if all exceptions are caught.  */
-  tree type_list;
-
-  /* A TREE_LIST of INTEGER_CSTs that correspond to the type_list entries,
-     having been mapped by assign_filter_values.  These integers are to be
-     compared against the __builtin_eh_filter value.  */
-  tree filter_list;
-
-  /* The code that should be executed if this catch handler matches the
-     thrown exception.  This label is only maintained until
-     pass_lower_eh_dispatch, at which point it is cleared.  */
-  tree label;
-};
-
-/* Describes one exception region.  */
-
-struct GTY(()) eh_region_d
-{
-  /* The immediately surrounding region.  */
-  struct eh_region_d *outer;
-
-  /* The list of immediately contained regions.  */
-  struct eh_region_d *inner;
-  struct eh_region_d *next_peer;
-
-  /* The index of this region within fun->eh->region_array.  */
-  int index;
-
-  /* Each region does exactly one thing.  */
-  enum eh_region_type type;
-
-  /* Holds the action to perform based on the preceding type.  */
-  union eh_region_u {
-    struct eh_region_u_try {
-      /* The double-linked list of all catch handlers for this region.  */
-      struct eh_catch_d *first_catch;
-      struct eh_catch_d *last_catch;
-    } GTY ((tag ("ERT_TRY"))) eh_try;
-
-    struct eh_region_u_allowed {
-      /* A TREE_LIST of runtime type objects allowed to pass.  */
-      tree type_list;
-      /* The code that should be executed if the thrown exception does
-	 not match the type list.  This label is only maintained until
-	 pass_lower_eh_dispatch, at which point it is cleared.  */
-      tree label;
-      /* The integer that will be passed by the runtime to signal that
-	 we should execute the code at LABEL.  This integer is assigned
-	 by assign_filter_values and is to be compared against the
-	 __builtin_eh_filter value.  */
-      int filter;
-    } GTY ((tag ("ERT_ALLOWED_EXCEPTIONS"))) allowed;
-
-    struct eh_region_u_must_not_throw {
-      /* A function decl to be invoked if this region is actually reachable
-	 from within the function, rather than implementable from the runtime.
-	 The normal way for this to happen is for there to be a CLEANUP region
-	 contained within this MUST_NOT_THROW region.  Note that if the
-	 runtime handles the MUST_NOT_THROW region, we have no control over
-	 what termination function is called; it will be decided by the
-	 personality function in effect for this CIE.  */
-      tree failure_decl;
-      /* The location assigned to the call of FAILURE_DECL, if expanded.  */
-      location_t failure_loc;
-    } GTY ((tag ("ERT_MUST_NOT_THROW"))) must_not_throw;
-  } GTY ((desc ("%0.type"))) u;
-
-  /* The list of landing pads associated with this region.  */
-  struct eh_landing_pad_d *landing_pads;
-
-  /* EXC_PTR and FILTER values copied from the runtime for this region.
-     Each region gets its own psuedos so that if there are nested exceptions
-     we do not overwrite the values of the first exception.  */
-  rtx exc_ptr_reg, filter_reg;
-
-  /* True if this region should use __cxa_end_cleanup instead
-     of _Unwind_Resume.  */
-  bool use_cxa_end_cleanup;
-};
-
-typedef struct eh_landing_pad_d *eh_landing_pad;
-typedef struct eh_catch_d *eh_catch;
-typedef struct eh_region_d *eh_region;
-
-
-
-
-/* The exception status for each function.  */
-
-struct GTY(()) eh_status
-{
-  /* The tree of all regions for this function.  */
-  eh_region region_tree;
-
-  /* The same information as an indexable array.  */
-  vec<eh_region, va_gc> *region_array;
-
-  /* The landing pads as an indexable array.  */
-  vec<eh_landing_pad, va_gc> *lp_array;
-
-  /* At the gimple level, a mapping from gimple statement to landing pad
-     or must-not-throw region.  See record_stmt_eh_region.  */
-  htab_t GTY((param_is (struct throw_stmt_node))) throw_stmt_table;
-
-  /* All of the runtime type data used by the function.  These objects
-     are emitted to the lang-specific-data-area for the function.  */
-  vec<tree, va_gc> *ttype_data;
-
-  /* The table of all action chains.  These encode the eh_region tree in
-     a compact form for use by the runtime, and is also emitted to the
-     lang-specific-data-area.  Note that the ARM EABI uses a different
-     format for the encoding than all other ports.  */
-  union eh_status_u {
-    vec<tree, va_gc> *GTY((tag ("1"))) arm_eabi;
-    vec<uchar, va_gc> *GTY((tag ("0"))) other;
-  } GTY ((desc ("targetm.arm_eabi_unwinder"))) ehspec_data;
-};
-
-
-/* Invokes CALLBACK for every exception handler label.  Only used by old
-   loop hackery; should not be used by new code.  */
-extern void for_each_eh_label (void (*) (rtx));
-
-extern void init_eh_for_function (void);
-
-extern void remove_eh_landing_pad (eh_landing_pad);
-extern void remove_eh_handler (eh_region);
-extern void remove_unreachable_eh_regions (sbitmap);
-
-extern bool current_function_has_exception_handlers (void);
-extern void output_function_exception_table (const char *);
-
-extern rtx expand_builtin_eh_pointer (tree);
-extern rtx expand_builtin_eh_filter (tree);
-extern rtx expand_builtin_eh_copy_values (tree);
-extern void expand_builtin_unwind_init (void);
-extern rtx expand_builtin_eh_return_data_regno (tree);
-extern rtx expand_builtin_extract_return_addr (tree);
-extern void expand_builtin_init_dwarf_reg_sizes (tree);
-extern rtx expand_builtin_frob_return_addr (tree);
-extern rtx expand_builtin_dwarf_sp_column (void);
-extern void expand_builtin_eh_return (tree, tree);
-extern void expand_eh_return (void);
-extern rtx expand_builtin_extend_pointer (tree);
-extern void expand_dw2_landing_pad_for_region (eh_region);
-
-typedef tree (*duplicate_eh_regions_map) (tree, void *);
-extern struct pointer_map_t *duplicate_eh_regions
-  (struct function *, eh_region, int, duplicate_eh_regions_map, void *);
-
-extern void sjlj_emit_function_exit_after (rtx);
-
-extern eh_region gen_eh_region_cleanup (eh_region);
-extern eh_region gen_eh_region_try (eh_region);
-extern eh_region gen_eh_region_allowed (eh_region, tree);
-extern eh_region gen_eh_region_must_not_throw (eh_region);
-
-extern eh_catch gen_eh_region_catch (eh_region, tree);
-extern eh_landing_pad gen_eh_landing_pad (eh_region);
-
-extern eh_region get_eh_region_from_number_fn (struct function *, int);
-extern eh_region get_eh_region_from_number (int);
-extern eh_landing_pad get_eh_landing_pad_from_number_fn (struct function*,int);
-extern eh_landing_pad get_eh_landing_pad_from_number (int);
-extern eh_region get_eh_region_from_lp_number_fn (struct function *, int);
-extern eh_region get_eh_region_from_lp_number (int);
-
-extern eh_region eh_region_outermost (struct function *, eh_region, eh_region);
-
-extern void make_reg_eh_region_note (rtx insn, int ecf_flags, int lp_nr);
-extern void make_reg_eh_region_note_nothrow_nononlocal (rtx);
-
-extern void verify_eh_tree (struct function *);
-extern void dump_eh_tree (FILE *, struct function *);
-void debug_eh_tree (struct function *);
-extern void add_type_for_runtime (tree);
-extern tree lookup_type_for_runtime (tree);
-extern void assign_filter_values (void);
-
-extern eh_region get_eh_region_from_rtx (const_rtx);
-extern eh_landing_pad get_eh_landing_pad_from_rtx (const_rtx);
-
-extern void finish_eh_generation (void);
-
-struct GTY(()) throw_stmt_node {
-  gimple stmt;
-  int lp_nr;
-};
-
-extern struct htab *get_eh_throw_stmt_table (struct function *);
-extern void set_eh_throw_stmt_table (struct function *, struct htab *);
-
-enum eh_personality_kind {
-  eh_personality_none,
-  eh_personality_any,
-  eh_personality_lang
-};
-
-extern enum eh_personality_kind
-function_needs_eh_personality (struct function *);
-
-/* Pre-order iteration within the eh_region tree.  */
-
-static inline eh_region
-ehr_next (eh_region r, eh_region start)
-{
-  if (r->inner)
-    r = r->inner;
-  else if (r->next_peer && r != start)
-    r = r->next_peer;
-  else
-    {
-      do
-	{
-	  r = r->outer;
-	  if (r == start)
-	    return NULL;
-	}
-      while (r->next_peer == NULL);
-      r = r->next_peer;
-    }
-  return r;
-}
-
-#define FOR_ALL_EH_REGION_AT(R, START) \
-  for ((R) = (START); (R) != NULL; (R) = ehr_next (R, START))
-
-#define FOR_ALL_EH_REGION_FN(R, FN) \
-  for ((R) = (FN)->eh->region_tree; (R) != NULL; (R) = ehr_next (R, NULL))
-
-#define FOR_ALL_EH_REGION(R) FOR_ALL_EH_REGION_FN (R, cfun)
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/filenames.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/filenames.h
deleted file mode 100644
index e799a51..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/filenames.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/* Macros for taking apart, interpreting and processing file names.
-
-   These are here because some non-Posix (a.k.a. DOSish) systems have
-   drive letter brain-damage at the beginning of an absolute file name,
-   use forward- and back-slash in path names interchangeably, and
-   some of them have case-insensitive file names.
-
-   Copyright 2000, 2001, 2007, 2010 Free Software Foundation, Inc.
-
-This file is part of BFD, the Binary File Descriptor library.
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifndef FILENAMES_H
-#define FILENAMES_H
-
-#include "hashtab.h" /* for hashval_t */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if defined(__MSDOS__) || defined(_WIN32) || defined(__OS2__) || defined (__CYGWIN__)
-#  ifndef HAVE_DOS_BASED_FILE_SYSTEM
-#    define HAVE_DOS_BASED_FILE_SYSTEM 1
-#  endif
-#  ifndef HAVE_CASE_INSENSITIVE_FILE_SYSTEM
-#    define HAVE_CASE_INSENSITIVE_FILE_SYSTEM 1
-#  endif
-#  define HAS_DRIVE_SPEC(f) HAS_DOS_DRIVE_SPEC (f)
-#  define IS_DIR_SEPARATOR(c) IS_DOS_DIR_SEPARATOR (c)
-#  define IS_ABSOLUTE_PATH(f) IS_DOS_ABSOLUTE_PATH (f)
-#else /* not DOSish */
-#  if defined(__APPLE__)
-#    ifndef HAVE_CASE_INSENSITIVE_FILE_SYSTEM
-#      define HAVE_CASE_INSENSITIVE_FILE_SYSTEM 1
-#    endif
-#  endif /* __APPLE__ */
-#  define HAS_DRIVE_SPEC(f) (0)
-#  define IS_DIR_SEPARATOR(c) IS_UNIX_DIR_SEPARATOR (c)
-#  define IS_ABSOLUTE_PATH(f) IS_UNIX_ABSOLUTE_PATH (f)
-#endif
-
-#define IS_DIR_SEPARATOR_1(dos_based, c)				\
-  (((c) == '/')								\
-   || (((c) == '\\') && (dos_based)))
-
-#define HAS_DRIVE_SPEC_1(dos_based, f)			\
-  ((f)[0] && ((f)[1] == ':') && (dos_based))
-
-/* Remove the drive spec from F, assuming HAS_DRIVE_SPEC (f).
-   The result is a pointer to the remainder of F.  */
-#define STRIP_DRIVE_SPEC(f)	((f) + 2)
-
-#define IS_DOS_DIR_SEPARATOR(c) IS_DIR_SEPARATOR_1 (1, c)
-#define IS_DOS_ABSOLUTE_PATH(f) IS_ABSOLUTE_PATH_1 (1, f)
-#define HAS_DOS_DRIVE_SPEC(f) HAS_DRIVE_SPEC_1 (1, f)
-
-#define IS_UNIX_DIR_SEPARATOR(c) IS_DIR_SEPARATOR_1 (0, c)
-#define IS_UNIX_ABSOLUTE_PATH(f) IS_ABSOLUTE_PATH_1 (0, f)
-
-/* Note that when DOS_BASED is true, IS_ABSOLUTE_PATH accepts d:foo as
-   well, although it is only semi-absolute.  This is because the users
-   of IS_ABSOLUTE_PATH want to know whether to prepend the current
-   working directory to a file name, which should not be done with a
-   name like d:foo.  */
-#define IS_ABSOLUTE_PATH_1(dos_based, f)		 \
-  (IS_DIR_SEPARATOR_1 (dos_based, (f)[0])		 \
-   || HAS_DRIVE_SPEC_1 (dos_based, f))
-
-extern int filename_cmp (const char *s1, const char *s2);
-#define FILENAME_CMP(s1, s2)	filename_cmp(s1, s2)
-
-extern int filename_ncmp (const char *s1, const char *s2,
-			  size_t n);
-
-extern hashval_t filename_hash (const void *s);
-
-extern int filename_eq (const void *s1, const void *s2);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* FILENAMES_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/fixed-value.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/fixed-value.h
deleted file mode 100644
index f183eab..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/fixed-value.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/* Fixed-point arithmetic support.
-   Copyright (C) 2006-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_FIXED_VALUE_H
-#define GCC_FIXED_VALUE_H
-
-#include "machmode.h"
-#include "real.h"
-#include "double-int.h"
-
-struct GTY(()) fixed_value
-{
-  double_int data;		/* Store data up to 2 wide integers.  */
-  enum machine_mode mode;	/* Use machine mode to know IBIT and FBIT.  */
-};
-
-#define FIXED_VALUE_TYPE struct fixed_value
-
-#define MAX_FCONST0	18	/* For storing 18 fixed-point zeros per
-				   fract, ufract, accum, and uaccum modes .  */
-#define MAX_FCONST1	8	/* For storing 8 fixed-point ones per accum
-				   and uaccum modes.  */
-/* Constant fixed-point values 0 and 1.  */
-extern FIXED_VALUE_TYPE fconst0[MAX_FCONST0];
-extern FIXED_VALUE_TYPE fconst1[MAX_FCONST1];
-
-/* Macros to access fconst0 and fconst1 via machine modes.  */
-#define FCONST0(mode)	fconst0[mode - QQmode]
-#define FCONST1(mode)	fconst1[mode - HAmode]
-
-/* Return a CONST_FIXED with value R and mode M.  */
-#define CONST_FIXED_FROM_FIXED_VALUE(r, m) \
-  const_fixed_from_fixed_value (r, m)
-extern rtx const_fixed_from_fixed_value (FIXED_VALUE_TYPE, enum machine_mode);
-
-/* Construct a FIXED_VALUE from a bit payload and machine mode MODE.
-   The bits in PAYLOAD are sign-extended/zero-extended according to MODE.  */
-extern FIXED_VALUE_TYPE fixed_from_double_int (double_int,
-						     enum machine_mode);
-
-/* Return a CONST_FIXED from a bit payload and machine mode MODE.
-   The bits in PAYLOAD are sign-extended/zero-extended according to MODE.  */
-static inline rtx
-const_fixed_from_double_int (double_int payload,
-                             enum machine_mode mode)
-{
-  return
-    const_fixed_from_fixed_value (fixed_from_double_int (payload, mode),
-                                  mode);
-}
-
-/* Initialize from a decimal or hexadecimal string.  */
-extern void fixed_from_string (FIXED_VALUE_TYPE *, const char *,
-			       enum machine_mode);
-
-/* In tree.c: wrap up a FIXED_VALUE_TYPE in a tree node.  */
-extern tree build_fixed (tree, FIXED_VALUE_TYPE);
-
-/* Extend or truncate to a new mode.  */
-extern bool fixed_convert (FIXED_VALUE_TYPE *, enum machine_mode,
-			   const FIXED_VALUE_TYPE *, bool);
-
-/* Convert to a fixed-point mode from an integer.  */
-extern bool fixed_convert_from_int (FIXED_VALUE_TYPE *, enum machine_mode,
-				    double_int, bool, bool);
-
-/* Convert to a fixed-point mode from a real.  */
-extern bool fixed_convert_from_real (FIXED_VALUE_TYPE *, enum machine_mode,
-				     const REAL_VALUE_TYPE *, bool);
-
-/* Convert to a real mode from a fixed-point.  */
-extern void real_convert_from_fixed (REAL_VALUE_TYPE *, enum machine_mode,
-				     const FIXED_VALUE_TYPE *);
-
-/* Compare two fixed-point objects for bitwise identity.  */
-extern bool fixed_identical (const FIXED_VALUE_TYPE *, const FIXED_VALUE_TYPE *);
-
-/* Calculate a hash value.  */
-extern unsigned int fixed_hash (const FIXED_VALUE_TYPE *);
-
-#define FIXED_VALUES_IDENTICAL(x, y)	fixed_identical (&(x), &(y))
-
-/* Determine whether a fixed-point value X is negative.  */
-#define FIXED_VALUE_NEGATIVE(x)		fixed_isneg (&(x))
-
-/* Render F as a decimal floating point constant.  */
-extern void fixed_to_decimal (char *str, const FIXED_VALUE_TYPE *, size_t);
-
-/* Binary or unary arithmetic on tree_code.  */
-extern bool fixed_arithmetic (FIXED_VALUE_TYPE *, int, const FIXED_VALUE_TYPE *,
-			      const FIXED_VALUE_TYPE *, bool);
-
-/* Compare fixed-point values by tree_code.  */
-extern bool fixed_compare (int, const FIXED_VALUE_TYPE *,
-			   const FIXED_VALUE_TYPE *);
-
-/* Determine whether a fixed-point value X is negative.  */
-extern bool fixed_isneg (const FIXED_VALUE_TYPE *);
-
-#endif /* GCC_FIXED_VALUE_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/flag-types.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/flag-types.h
deleted file mode 100644
index ec16faa..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/flag-types.h
+++ /dev/null
@@ -1,232 +0,0 @@
-/* Compilation switch flag type definitions for GCC.
-   Copyright (C) 1987-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_FLAG_TYPES_H
-#define GCC_FLAG_TYPES_H
-
-enum debug_info_type
-{
-  NO_DEBUG,	    /* Write no debug info.  */
-  DBX_DEBUG,	    /* Write BSD .stabs for DBX (using dbxout.c).  */
-  SDB_DEBUG,	    /* Write COFF for (old) SDB (using sdbout.c).  */
-  DWARF2_DEBUG,	    /* Write Dwarf v2 debug info (using dwarf2out.c).  */
-  XCOFF_DEBUG,	    /* Write IBM/Xcoff debug info (using dbxout.c).  */
-  VMS_DEBUG,        /* Write VMS debug info (using vmsdbgout.c).  */
-  VMS_AND_DWARF2_DEBUG /* Write VMS debug info (using vmsdbgout.c).
-                          and DWARF v2 debug info (using dwarf2out.c).  */
-};
-
-enum debug_info_levels
-{
-  DINFO_LEVEL_NONE,	/* Write no debugging info.  */
-  DINFO_LEVEL_TERSE,	/* Write minimal info to support tracebacks only.  */
-  DINFO_LEVEL_NORMAL,	/* Write info for all declarations (and line table).  */
-  DINFO_LEVEL_VERBOSE	/* Write normal info plus #define/#undef info.  */
-};
-
-/* A major contribution to object and executable size is debug
-   information size.  A major contribution to debug information
-   size is struct descriptions replicated in several object files.
-   The following function determines whether or not debug information
-   should be generated for a given struct.  The indirect parameter
-   indicates that the struct is being handled indirectly, via
-   a pointer.  See opts.c for the implementation. */
-
-enum debug_info_usage
-{
-  DINFO_USAGE_DFN,	/* A struct definition. */
-  DINFO_USAGE_DIR_USE,	/* A direct use, such as the type of a variable. */
-  DINFO_USAGE_IND_USE,	/* An indirect use, such as through a pointer. */
-  DINFO_USAGE_NUM_ENUMS	/* The number of enumerators. */
-};
-
-/* A major contribution to object and executable size is debug
-   information size.  A major contribution to debug information size
-   is struct descriptions replicated in several object files. The
-   following flags attempt to reduce this information.  The basic
-   idea is to not emit struct debugging information in the current
-   compilation unit when that information will be generated by
-   another compilation unit.
-
-   Debug information for a struct defined in the current source
-   file should be generated in the object file.  Likewise the
-   debug information for a struct defined in a header should be
-   generated in the object file of the corresponding source file.
-   Both of these case are handled when the base name of the file of
-   the struct definition matches the base name of the source file
-   of the current compilation unit.  This matching emits minimal
-   struct debugging information.
-
-   The base file name matching rule above will fail to emit debug
-   information for structs defined in system headers.  So a second
-   category of files includes system headers in addition to files
-   with matching bases.
-
-   The remaining types of files are library headers and application
-   headers.  We cannot currently distinguish these two types.  */
-
-enum debug_struct_file
-{
-  DINFO_STRUCT_FILE_NONE,   /* Debug no structs. */
-  DINFO_STRUCT_FILE_BASE,   /* Debug structs defined in files with the
-                               same base name as the compilation unit. */
-  DINFO_STRUCT_FILE_SYS,    /* Also debug structs defined in system
-                               header files.  */
-  DINFO_STRUCT_FILE_ANY     /* Debug structs defined in all files. */
-};
-
-/* Enumerate visibility settings.  This is deliberately ordered from most
-   to least visibility.  */
-#ifndef SYMBOL_VISIBILITY_DEFINED
-#define SYMBOL_VISIBILITY_DEFINED
-enum symbol_visibility
-{
-  VISIBILITY_DEFAULT,
-  VISIBILITY_PROTECTED,
-  VISIBILITY_HIDDEN,
-  VISIBILITY_INTERNAL
-};
-#endif
-
-/* The stack reuse level.  */
-enum stack_reuse_level
-{
-  SR_NONE,
-  SR_NAMED_VARS,
-  SR_ALL
-};
-
-/* The algorithm used for the integrated register allocator (IRA).  */
-enum ira_algorithm
-{
-  IRA_ALGORITHM_CB,
-  IRA_ALGORITHM_PRIORITY
-};
-
-/* The regions used for the integrated register allocator (IRA).  */
-enum ira_region
-{
-  IRA_REGION_ONE,
-  IRA_REGION_ALL,
-  IRA_REGION_MIXED,
-  /* This value means that there were no options -fira-region on the
-     command line and that we should choose a value depending on the
-     used -O option.  */
-  IRA_REGION_AUTODETECT
-};
-
-/* The options for excess precision.  */
-enum excess_precision
-{
-  EXCESS_PRECISION_DEFAULT,
-  EXCESS_PRECISION_FAST,
-  EXCESS_PRECISION_STANDARD
-};
-
-/* Type of stack check.  */
-enum stack_check_type
-{
-  /* Do not check the stack.  */
-  NO_STACK_CHECK = 0,
-
-  /* Check the stack generically, i.e. assume no specific support
-     from the target configuration files.  */
-  GENERIC_STACK_CHECK,
-
-  /* Check the stack and rely on the target configuration files to
-     check the static frame of functions, i.e. use the generic
-     mechanism only for dynamic stack allocations.  */
-  STATIC_BUILTIN_STACK_CHECK,
-
-  /* Check the stack and entirely rely on the target configuration
-     files, i.e. do not use the generic mechanism at all.  */
-  FULL_BUILTIN_STACK_CHECK
-};
-
-/* Names for the different levels of -Wstrict-overflow=N.  The numeric
-   values here correspond to N.  */
-
-enum warn_strict_overflow_code
-{
-  /* Overflow warning that should be issued with -Wall: a questionable
-     construct that is easy to avoid even when using macros.  Example:
-     folding (x + CONSTANT > x) to 1.  */
-  WARN_STRICT_OVERFLOW_ALL = 1,
-  /* Overflow warning about folding a comparison to a constant because
-     of undefined signed overflow, other than cases covered by
-     WARN_STRICT_OVERFLOW_ALL.  Example: folding (abs (x) >= 0) to 1
-     (this is false when x == INT_MIN).  */
-  WARN_STRICT_OVERFLOW_CONDITIONAL = 2,
-  /* Overflow warning about changes to comparisons other than folding
-     them to a constant.  Example: folding (x + 1 > 1) to (x > 0).  */
-  WARN_STRICT_OVERFLOW_COMPARISON = 3,
-  /* Overflow warnings not covered by the above cases.  Example:
-     folding ((x * 10) / 5) to (x * 2).  */
-  WARN_STRICT_OVERFLOW_MISC = 4,
-  /* Overflow warnings about reducing magnitude of constants in
-     comparison.  Example: folding (x + 2 > y) to (x + 1 >= y).  */
-  WARN_STRICT_OVERFLOW_MAGNITUDE = 5
-};
-
-/* Floating-point contraction mode.  */
-enum fp_contract_mode {
-  FP_CONTRACT_OFF = 0,
-  FP_CONTRACT_ON = 1,
-  FP_CONTRACT_FAST = 2
-};
-
-/* Vectorizer cost-model.  */
-enum vect_cost_model {
-  VECT_COST_MODEL_UNLIMITED = 0,
-  VECT_COST_MODEL_CHEAP = 1,
-  VECT_COST_MODEL_DYNAMIC = 2,
-  VECT_COST_MODEL_DEFAULT = 3
-};
-
-
-/* Different instrumentation modes.  */
-enum sanitize_code {
-  /* AddressSanitizer.  */
-  SANITIZE_ADDRESS = 1 << 0,
-  /* ThreadSanitizer.  */
-  SANITIZE_THREAD = 1 << 1,
-  /* LeakSanitizer.  */
-  SANITIZE_LEAK = 1 << 2,
-  /* UndefinedBehaviorSanitizer.  */
-  SANITIZE_SHIFT = 1 << 3,
-  SANITIZE_DIVIDE = 1 << 4,
-  SANITIZE_UNREACHABLE = 1 << 5,
-  SANITIZE_VLA = 1 << 6,
-  SANITIZE_NULL = 1 << 7,
-  SANITIZE_RETURN = 1 << 8,
-  SANITIZE_SI_OVERFLOW = 1 << 9,
-  SANITIZE_BOOL = 1 << 10,
-  SANITIZE_ENUM = 1 << 11,
-  SANITIZE_UNDEFINED = SANITIZE_SHIFT | SANITIZE_DIVIDE | SANITIZE_UNREACHABLE
-		       | SANITIZE_VLA | SANITIZE_NULL | SANITIZE_RETURN
-		       | SANITIZE_SI_OVERFLOW | SANITIZE_BOOL | SANITIZE_ENUM
-};
-
-/* flag_vtable_verify initialization levels. */
-enum vtv_priority {
-  VTV_NO_PRIORITY       = 0,  /* i.E. Do NOT do vtable verification. */
-  VTV_STANDARD_PRIORITY = 1,
-  VTV_PREINIT_PRIORITY  = 2
-};
-#endif /* ! GCC_FLAG_TYPES_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/flags.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/flags.h
deleted file mode 100644
index 475d428..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/flags.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/* Compilation switch flag definitions for GCC.
-   Copyright (C) 1987-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_FLAGS_H
-#define GCC_FLAGS_H
-
-#include "flag-types.h"
-#include "options.h"
-
-#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) && !defined(IN_RTS)
-
-/* Names of debug_info_type, for error messages.  */
-extern const char *const debug_type_names[];
-
-extern void strip_off_ending (char *, int);
-extern int base_of_path (const char *path, const char **base_out);
-
-/* Return true iff flags are set as if -ffast-math.  */
-extern bool fast_math_flags_set_p (const struct gcc_options *);
-extern bool fast_math_flags_struct_set_p (struct cl_optimization *);
-
-
-/* Now the symbols that are set with `-f' switches.  */
-
-/* True if printing into -fdump-final-insns= dump.  */
-
-extern bool final_insns_dump_p;
-
-
-/* Other basic status info about current function.  */
-
-/* Target-dependent global state.  */
-struct target_flag_state {
-  /* Values of the -falign-* flags: how much to align labels in code.
-     0 means `use default', 1 means `don't align'.
-     For each variable, there is an _log variant which is the power
-     of two not less than the variable, for .align output.  */
-  int x_align_loops_log;
-  int x_align_loops_max_skip;
-  int x_align_jumps_log;
-  int x_align_jumps_max_skip;
-  int x_align_labels_log;
-  int x_align_labels_max_skip;
-  int x_align_functions_log;
-
-  /* The excess precision currently in effect.  */
-  enum excess_precision x_flag_excess_precision;
-};
-
-extern struct target_flag_state default_target_flag_state;
-#if SWITCHABLE_TARGET
-extern struct target_flag_state *this_target_flag_state;
-#else
-#define this_target_flag_state (&default_target_flag_state)
-#endif
-
-#define align_loops_log \
-  (this_target_flag_state->x_align_loops_log)
-#define align_loops_max_skip \
-  (this_target_flag_state->x_align_loops_max_skip)
-#define align_jumps_log \
-  (this_target_flag_state->x_align_jumps_log)
-#define align_jumps_max_skip \
-  (this_target_flag_state->x_align_jumps_max_skip)
-#define align_labels_log \
-  (this_target_flag_state->x_align_labels_log)
-#define align_labels_max_skip \
-  (this_target_flag_state->x_align_labels_max_skip)
-#define align_functions_log \
-  (this_target_flag_state->x_align_functions_log)
-#define flag_excess_precision \
-  (this_target_flag_state->x_flag_excess_precision)
-
-/* Returns TRUE if generated code should match ABI version N or
-   greater is in use.  */
-
-#define abi_version_at_least(N) \
-  (flag_abi_version == 0 || flag_abi_version >= (N))
-
-/* Whether to emit an overflow warning whose code is C.  */
-#define issue_strict_overflow_warning(c) (warn_strict_overflow >= (int) (c))
-
-#endif
-
-#endif /* ! GCC_FLAGS_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/fold-const.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/fold-const.h
deleted file mode 100644
index f69e9f8..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/fold-const.h
+++ /dev/null
@@ -1,172 +0,0 @@
-/* Fold a constant sub-tree into a single node for C-compiler
-   Copyright (C) 1987-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_FOLD_CONST_H
-#define GCC_FOLD_CONST_H
-
-/* Non-zero if we are folding constants inside an initializer; zero
-   otherwise.  */
-extern int folding_initializer;
-
-/* Convert between trees and native memory representation.  */
-extern int native_encode_expr (const_tree, unsigned char *, int);
-extern tree native_interpret_expr (tree, const unsigned char *, int);
-
-/* Fold constants as much as possible in an expression.
-   Returns the simplified expression.
-   Acts only on the top level of the expression;
-   if the argument itself cannot be simplified, its
-   subexpressions are not changed.  */
-
-extern tree fold (tree);
-#define fold_unary(CODE,T1,T2)\
-   fold_unary_loc (UNKNOWN_LOCATION, CODE, T1, T2)
-extern tree fold_unary_loc (location_t, enum tree_code, tree, tree);
-#define fold_unary_ignore_overflow(CODE,T1,T2)\
-   fold_unary_ignore_overflow_loc (UNKNOWN_LOCATION, CODE, T1, T2)
-extern tree fold_unary_ignore_overflow_loc (location_t, enum tree_code, tree, tree);
-#define fold_binary(CODE,T1,T2,T3)\
-   fold_binary_loc (UNKNOWN_LOCATION, CODE, T1, T2, T3)
-extern tree fold_binary_loc (location_t, enum tree_code, tree, tree, tree);
-#define fold_ternary(CODE,T1,T2,T3,T4)\
-   fold_ternary_loc (UNKNOWN_LOCATION, CODE, T1, T2, T3, T4)
-extern tree fold_ternary_loc (location_t, enum tree_code, tree, tree, tree, tree);
-#define fold_build1(c,t1,t2)\
-   fold_build1_stat_loc (UNKNOWN_LOCATION, c, t1, t2 MEM_STAT_INFO)
-#define fold_build1_loc(l,c,t1,t2)\
-   fold_build1_stat_loc (l, c, t1, t2 MEM_STAT_INFO)
-extern tree fold_build1_stat_loc (location_t, enum tree_code, tree,
-				  tree MEM_STAT_DECL);
-#define fold_build2(c,t1,t2,t3)\
-   fold_build2_stat_loc (UNKNOWN_LOCATION, c, t1, t2, t3 MEM_STAT_INFO)
-#define fold_build2_loc(l,c,t1,t2,t3)\
-   fold_build2_stat_loc (l, c, t1, t2, t3 MEM_STAT_INFO)
-extern tree fold_build2_stat_loc (location_t, enum tree_code, tree, tree,
-				  tree MEM_STAT_DECL);
-#define fold_build3(c,t1,t2,t3,t4)\
-   fold_build3_stat_loc (UNKNOWN_LOCATION, c, t1, t2, t3, t4 MEM_STAT_INFO)
-#define fold_build3_loc(l,c,t1,t2,t3,t4)\
-   fold_build3_stat_loc (l, c, t1, t2, t3, t4 MEM_STAT_INFO)
-extern tree fold_build3_stat_loc (location_t, enum tree_code, tree, tree, tree,
-				  tree MEM_STAT_DECL);
-extern tree fold_build1_initializer_loc (location_t, enum tree_code, tree, tree);
-extern tree fold_build2_initializer_loc (location_t, enum tree_code, tree, tree, tree);
-#define fold_build_call_array(T1,T2,N,T4)\
-   fold_build_call_array_loc (UNKNOWN_LOCATION, T1, T2, N, T4)
-extern tree fold_build_call_array_loc (location_t, tree, tree, int, tree *);
-#define fold_build_call_array_initializer(T1,T2,N,T4)\
-   fold_build_call_array_initializer_loc (UNKNOWN_LOCATION, T1, T2, N, T4)
-extern tree fold_build_call_array_initializer_loc (location_t, tree, tree, int, tree *);
-extern bool fold_convertible_p (const_tree, const_tree);
-#define fold_convert(T1,T2)\
-   fold_convert_loc (UNKNOWN_LOCATION, T1, T2)
-extern tree fold_convert_loc (location_t, tree, tree);
-extern tree fold_single_bit_test (location_t, enum tree_code, tree, tree, tree);
-extern tree fold_ignored_result (tree);
-extern tree fold_abs_const (tree, tree);
-extern tree fold_indirect_ref_1 (location_t, tree, tree);
-extern void fold_defer_overflow_warnings (void);
-extern void fold_undefer_overflow_warnings (bool, const_gimple, int);
-extern void fold_undefer_and_ignore_overflow_warnings (void);
-extern bool fold_deferring_overflow_warnings_p (void);
-extern tree fold_fma (location_t, tree, tree, tree, tree);
-extern int operand_equal_p (const_tree, const_tree, unsigned int);
-extern int multiple_of_p (tree, const_tree, const_tree);
-#define omit_one_operand(T1,T2,T3)\
-   omit_one_operand_loc (UNKNOWN_LOCATION, T1, T2, T3)
-extern tree omit_one_operand_loc (location_t, tree, tree, tree);
-#define omit_two_operands(T1,T2,T3,T4)\
-   omit_two_operands_loc (UNKNOWN_LOCATION, T1, T2, T3, T4)
-extern tree omit_two_operands_loc (location_t, tree, tree, tree, tree);
-#define invert_truthvalue(T)\
-   invert_truthvalue_loc (UNKNOWN_LOCATION, T)
-extern tree invert_truthvalue_loc (location_t, tree);
-extern tree fold_unary_to_constant (enum tree_code, tree, tree);
-extern tree fold_binary_to_constant (enum tree_code, tree, tree, tree);
-extern tree fold_read_from_constant_string (tree);
-extern tree int_const_binop (enum tree_code, const_tree, const_tree);
-#define build_fold_addr_expr(T)\
-        build_fold_addr_expr_loc (UNKNOWN_LOCATION, (T))
-extern tree build_fold_addr_expr_loc (location_t, tree);
-#define build_fold_addr_expr_with_type(T,TYPE)\
-        build_fold_addr_expr_with_type_loc (UNKNOWN_LOCATION, (T), TYPE)
-extern tree build_fold_addr_expr_with_type_loc (location_t, tree, tree);
-extern tree fold_build_cleanup_point_expr (tree type, tree expr);
-extern tree fold_strip_sign_ops (tree);
-#define build_fold_indirect_ref(T)\
-        build_fold_indirect_ref_loc (UNKNOWN_LOCATION, T)
-extern tree build_fold_indirect_ref_loc (location_t, tree);
-#define fold_indirect_ref(T)\
-        fold_indirect_ref_loc (UNKNOWN_LOCATION, T)
-extern tree fold_indirect_ref_loc (location_t, tree);
-extern tree build_simple_mem_ref_loc (location_t, tree);
-#define build_simple_mem_ref(T)\
-	build_simple_mem_ref_loc (UNKNOWN_LOCATION, T)
-extern double_int mem_ref_offset (const_tree);
-extern tree build_invariant_address (tree, tree, HOST_WIDE_INT);
-extern tree constant_boolean_node (bool, tree);
-extern tree div_if_zero_remainder (enum tree_code, const_tree, const_tree);
-
-extern bool tree_swap_operands_p (const_tree, const_tree, bool);
-extern enum tree_code swap_tree_comparison (enum tree_code);
-
-extern bool ptr_difference_const (tree, tree, HOST_WIDE_INT *);
-extern enum tree_code invert_tree_comparison (enum tree_code, bool);
-
-extern bool tree_unary_nonzero_warnv_p (enum tree_code, tree, tree, bool *);
-extern bool tree_binary_nonzero_warnv_p (enum tree_code, tree, tree, tree op1,
-                                         bool *);
-extern bool tree_single_nonzero_warnv_p (tree, bool *);
-extern bool tree_unary_nonnegative_warnv_p (enum tree_code, tree, tree, bool *);
-extern bool tree_binary_nonnegative_warnv_p (enum tree_code, tree, tree, tree,
-                                             bool *);
-extern bool tree_single_nonnegative_warnv_p (tree t, bool *strict_overflow_p);
-extern bool tree_call_nonnegative_warnv_p (tree, tree, tree, tree, bool *);
-
-extern bool fold_real_zero_addition_p (const_tree, const_tree, int);
-extern tree combine_comparisons (location_t, enum tree_code, enum tree_code,
-				 enum tree_code, tree, tree, tree);
-extern void debug_fold_checksum (const_tree);
-extern bool may_negate_without_overflow_p (const_tree);
-#define round_up(T,N) round_up_loc (UNKNOWN_LOCATION, T, N)
-extern tree round_up_loc (location_t, tree, int);
-#define round_down(T,N) round_down_loc (UNKNOWN_LOCATION, T, N)
-extern tree round_down_loc (location_t, tree, int);
-extern tree size_int_kind (HOST_WIDE_INT, enum size_type_kind);
-#define size_binop(CODE,T1,T2)\
-   size_binop_loc (UNKNOWN_LOCATION, CODE, T1, T2)
-extern tree size_binop_loc (location_t, enum tree_code, tree, tree);
-#define size_diffop(T1,T2)\
-   size_diffop_loc (UNKNOWN_LOCATION, T1, T2)
-extern tree size_diffop_loc (location_t, tree, tree);
-
-/* Return an expr equal to X but certainly not valid as an lvalue.  */
-#define non_lvalue(T) non_lvalue_loc (UNKNOWN_LOCATION, T)
-extern tree non_lvalue_loc (location_t, tree);
-
-extern bool tree_expr_nonnegative_p (tree);
-extern bool tree_expr_nonnegative_warnv_p (tree, bool *);
-extern tree make_range (tree, int *, tree *, tree *, bool *);
-extern tree make_range_step (location_t, enum tree_code, tree, tree, tree,
-			     tree *, tree *, int *, bool *);
-extern tree build_range_check (location_t, tree, tree, int, tree, tree);
-extern bool merge_ranges (int *, tree *, tree *, int, tree, tree, int,
-			  tree, tree);
-
-#endif // GCC_FOLD_CONST_H
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/function.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/function.h
deleted file mode 100644
index 38a0fc4..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/function.h
+++ /dev/null
@@ -1,849 +0,0 @@
-/* Structure for saving state for a nested function.
-   Copyright (C) 1989-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_FUNCTION_H
-#define GCC_FUNCTION_H
-
-#include "hashtab.h"
-#include "vec.h"
-#include "machmode.h"
-#include "tm.h"			/* For CUMULATIVE_ARGS.  */
-#include "hard-reg-set.h"	/* For HARD_REG_SET in struct rtl_data. */
-#include "input.h"		/* For location_t.  */
-
-/* Stack of pending (incomplete) sequences saved by `start_sequence'.
-   Each element describes one pending sequence.
-   The main insn-chain is saved in the last element of the chain,
-   unless the chain is empty.  */
-
-struct GTY(()) sequence_stack {
-  /* First and last insns in the chain of the saved sequence.  */
-  rtx first;
-  rtx last;
-  struct sequence_stack *next;
-};
-
-struct GTY(()) emit_status {
-  /* This is reset to LAST_VIRTUAL_REGISTER + 1 at the start of each function.
-     After rtl generation, it is 1 plus the largest register number used.  */
-  int x_reg_rtx_no;
-
-  /* Lowest label number in current function.  */
-  int x_first_label_num;
-
-  /* The ends of the doubly-linked chain of rtl for the current function.
-     Both are reset to null at the start of rtl generation for the function.
-
-     start_sequence saves both of these on `sequence_stack' and then starts
-     a new, nested sequence of insns.  */
-  rtx x_first_insn;
-  rtx x_last_insn;
-
-  /* Stack of pending (incomplete) sequences saved by `start_sequence'.
-     Each element describes one pending sequence.
-     The main insn-chain is saved in the last element of the chain,
-     unless the chain is empty.  */
-  struct sequence_stack *sequence_stack;
-
-  /* INSN_UID for next insn emitted.
-     Reset to 1 for each function compiled.  */
-  int x_cur_insn_uid;
-
-  /* INSN_UID for next debug insn emitted.  Only used if
-     --param min-nondebug-insn-uid=<value> is given with nonzero value.  */
-  int x_cur_debug_insn_uid;
-
-  /* The length of the regno_pointer_align, regno_decl, and x_regno_reg_rtx
-     vectors.  Since these vectors are needed during the expansion phase when
-     the total number of registers in the function is not yet known, the
-     vectors are copied and made bigger when necessary.  */
-  int regno_pointer_align_length;
-
-  /* Indexed by pseudo register number, if nonzero gives the known alignment
-     for that pseudo (if REG_POINTER is set in x_regno_reg_rtx).
-     Allocated in parallel with x_regno_reg_rtx.  */
-  unsigned char * GTY((skip)) regno_pointer_align;
-};
-
-
-/* Indexed by register number, gives an rtx for that register (and only
-   that register).  For pseudo registers, it is the unique rtx for
-   that pseudo.  For hard registers, it is an rtx of the mode specified
-   by reg_raw_mode.
-
-   FIXME: We could put it into emit_status struct, but gengtype is not
-   able to deal with length attribute nested in top level structures.  */
-
-extern GTY ((length ("crtl->emit.x_reg_rtx_no"))) rtx * regno_reg_rtx;
-
-/* For backward compatibility... eventually these should all go away.  */
-#define reg_rtx_no (crtl->emit.x_reg_rtx_no)
-#define seq_stack (crtl->emit.sequence_stack)
-
-#define REGNO_POINTER_ALIGN(REGNO) (crtl->emit.regno_pointer_align[REGNO])
-
-struct GTY(()) expr_status {
-  /* Number of units that we should eventually pop off the stack.
-     These are the arguments to function calls that have already returned.  */
-  int x_pending_stack_adjust;
-
-  /* Under some ABIs, it is the caller's responsibility to pop arguments
-     pushed for function calls.  A naive implementation would simply pop
-     the arguments immediately after each call.  However, if several
-     function calls are made in a row, it is typically cheaper to pop
-     all the arguments after all of the calls are complete since a
-     single pop instruction can be used.  Therefore, GCC attempts to
-     defer popping the arguments until absolutely necessary.  (For
-     example, at the end of a conditional, the arguments must be popped,
-     since code outside the conditional won't know whether or not the
-     arguments need to be popped.)
-
-     When INHIBIT_DEFER_POP is nonzero, however, the compiler does not
-     attempt to defer pops.  Instead, the stack is popped immediately
-     after each call.  Rather then setting this variable directly, use
-     NO_DEFER_POP and OK_DEFER_POP.  */
-  int x_inhibit_defer_pop;
-
-  /* If PREFERRED_STACK_BOUNDARY and PUSH_ROUNDING are defined, the stack
-     boundary can be momentarily unaligned while pushing the arguments.
-     Record the delta since last aligned boundary here in order to get
-     stack alignment in the nested function calls working right.  */
-  int x_stack_pointer_delta;
-
-  /* Nonzero means __builtin_saveregs has already been done in this function.
-     The value is the pseudoreg containing the value __builtin_saveregs
-     returned.  */
-  rtx x_saveregs_value;
-
-  /* Similarly for __builtin_apply_args.  */
-  rtx x_apply_args_value;
-
-  /* List of labels that must never be deleted.  */
-  rtx x_forced_labels;
-};
-
-typedef struct call_site_record_d *call_site_record;
-
-/* RTL representation of exception handling.  */
-struct GTY(()) rtl_eh {
-  rtx ehr_stackadj;
-  rtx ehr_handler;
-  rtx ehr_label;
-
-  rtx sjlj_fc;
-  rtx sjlj_exit_after;
-
-  vec<uchar, va_gc> *action_record_data;
-
-  vec<call_site_record, va_gc> *call_site_record_v[2];
-};
-
-#define pending_stack_adjust (crtl->expr.x_pending_stack_adjust)
-#define inhibit_defer_pop (crtl->expr.x_inhibit_defer_pop)
-#define saveregs_value (crtl->expr.x_saveregs_value)
-#define apply_args_value (crtl->expr.x_apply_args_value)
-#define forced_labels (crtl->expr.x_forced_labels)
-#define stack_pointer_delta (crtl->expr.x_stack_pointer_delta)
-
-struct gimple_df;
-struct temp_slot;
-typedef struct temp_slot *temp_slot_p;
-struct call_site_record_d;
-struct dw_fde_node;
-
-class ipa_opt_pass_d;
-typedef ipa_opt_pass_d *ipa_opt_pass;
-
-
-struct GTY(()) varasm_status {
-  /* If we're using a per-function constant pool, this is it.  */
-  struct rtx_constant_pool *pool;
-
-  /* Number of tree-constants deferred during the expansion of this
-     function.  */
-  unsigned int deferred_constants;
-};
-
-/* Information mainlined about RTL representation of incoming arguments.  */
-struct GTY(()) incoming_args {
-  /* Number of bytes of args popped by function being compiled on its return.
-     Zero if no bytes are to be popped.
-     May affect compilation of return insn or of function epilogue.  */
-  int pops_args;
-
-  /* If function's args have a fixed size, this is that size, in bytes.
-     Otherwise, it is -1.
-     May affect compilation of return insn or of function epilogue.  */
-  int size;
-
-  /* # bytes the prologue should push and pretend that the caller pushed them.
-     The prologue must do this, but only if parms can be passed in
-     registers.  */
-  int pretend_args_size;
-
-  /* This is the offset from the arg pointer to the place where the first
-     anonymous arg can be found, if there is one.  */
-  rtx arg_offset_rtx;
-
-  /* Quantities of various kinds of registers
-     used for the current function's args.  */
-  CUMULATIVE_ARGS info;
-
-  /* The arg pointer hard register, or the pseudo into which it was copied.  */
-  rtx internal_arg_pointer;
-};
-
-/* Data for function partitioning.  */
-struct GTY(()) function_subsections {
-  /* Assembly labels for the hot and cold text sections, to
-     be used by debugger functions for determining the size of text
-     sections.  */
-
-  const char *hot_section_label;
-  const char *cold_section_label;
-  const char *hot_section_end_label;
-  const char *cold_section_end_label;
-};
-
-/* Describe an empty area of space in the stack frame.  These can be chained
-   into a list; this is used to keep track of space wasted for alignment
-   reasons.  */
-struct GTY(()) frame_space
-{
-  struct frame_space *next;
-
-  HOST_WIDE_INT start;
-  HOST_WIDE_INT length;
-};
-
-/* Datastructures maintained for currently processed function in RTL form.  */
-struct GTY(()) rtl_data {
-  struct expr_status expr;
-  struct emit_status emit;
-  struct varasm_status varasm;
-  struct incoming_args args;
-  struct function_subsections subsections;
-  struct rtl_eh eh;
-
-  /* For function.c  */
-
-  /* # of bytes of outgoing arguments.  If ACCUMULATE_OUTGOING_ARGS is
-     defined, the needed space is pushed by the prologue.  */
-  int outgoing_args_size;
-
-  /* If nonzero, an RTL expression for the location at which the current
-     function returns its result.  If the current function returns its
-     result in a register, current_function_return_rtx will always be
-     the hard register containing the result.  */
-  rtx return_rtx;
-
-  /* Vector of initial-value pairs.  Each pair consists of a pseudo
-     register of approprite mode that stores the initial value a hard
-     register REGNO, and that hard register itself.  */
-  /* ??? This could be a VEC but there is currently no way to define an
-	 opaque VEC type.  */
-  struct initial_value_struct *hard_reg_initial_vals;
-
-  /* A variable living at the top of the frame that holds a known value.
-     Used for detecting stack clobbers.  */
-  tree stack_protect_guard;
-
-  /* List (chain of EXPR_LIST) of labels heading the current handlers for
-     nonlocal gotos.  */
-  rtx x_nonlocal_goto_handler_labels;
-
-  /* Label that will go on function epilogue.
-     Jumping to this label serves as a "return" instruction
-     on machines which require execution of the epilogue on all returns.  */
-  rtx x_return_label;
-
-  /* Label that will go on the end of function epilogue.
-     Jumping to this label serves as a "naked return" instruction
-     on machines which require execution of the epilogue on all returns.  */
-  rtx x_naked_return_label;
-
-  /* List (chain of EXPR_LISTs) of all stack slots in this function.
-     Made for the sake of unshare_all_rtl.  */
-  rtx x_stack_slot_list;
-
-  /* List of empty areas in the stack frame.  */
-  struct frame_space *frame_space_list;
-
-  /* Place after which to insert the tail_recursion_label if we need one.  */
-  rtx x_stack_check_probe_note;
-
-  /* Location at which to save the argument pointer if it will need to be
-     referenced.  There are two cases where this is done: if nonlocal gotos
-     exist, or if vars stored at an offset from the argument pointer will be
-     needed by inner routines.  */
-  rtx x_arg_pointer_save_area;
-
-  /* Dynamic Realign Argument Pointer used for realigning stack.  */
-  rtx drap_reg;
-
-  /* Offset to end of allocated area of stack frame.
-     If stack grows down, this is the address of the last stack slot allocated.
-     If stack grows up, this is the address for the next slot.  */
-  HOST_WIDE_INT x_frame_offset;
-
-  /* Insn after which register parms and SAVE_EXPRs are born, if nonopt.  */
-  rtx x_parm_birth_insn;
-
-  /* List of all used temporaries allocated, by level.  */
-  vec<temp_slot_p, va_gc> *x_used_temp_slots;
-
-  /* List of available temp slots.  */
-  struct temp_slot *x_avail_temp_slots;
-
-  /* Current nesting level for temporaries.  */
-  int x_temp_slot_level;
-
-  /* The largest alignment needed on the stack, including requirement
-     for outgoing stack alignment.  */
-  unsigned int stack_alignment_needed;
-
-  /* Preferred alignment of the end of stack frame, which is preferred
-     to call other functions.  */
-  unsigned int preferred_stack_boundary;
-
-  /* The minimum alignment of parameter stack.  */
-  unsigned int parm_stack_boundary;
-
-  /* The largest alignment of slot allocated on the stack.  */
-  unsigned int max_used_stack_slot_alignment;
-
-  /* The stack alignment estimated before reload, with consideration of
-     following factors:
-     1. Alignment of local stack variables (max_used_stack_slot_alignment)
-     2. Alignment requirement to call other functions
-        (preferred_stack_boundary)
-     3. Alignment of non-local stack variables but might be spilled in
-        local stack.  */
-  unsigned int stack_alignment_estimated;
-
-  /* For reorg.  */
-
-  /* Nonzero if function being compiled called builtin_return_addr or
-     builtin_frame_address with nonzero count.  */
-  bool accesses_prior_frames;
-
-  /* Nonzero if the function calls __builtin_eh_return.  */
-  bool calls_eh_return;
-
-  /* Nonzero if function saves all registers, e.g. if it has a nonlocal
-     label that can reach the exit block via non-exceptional paths. */
-  bool saves_all_registers;
-
-  /* Nonzero if function being compiled has nonlocal gotos to parent
-     function.  */
-  bool has_nonlocal_goto;
-
-  /* Nonzero if function being compiled has an asm statement.  */
-  bool has_asm_statement;
-
-  /* This bit is used by the exception handling logic.  It is set if all
-     calls (if any) are sibling calls.  Such functions do not have to
-     have EH tables generated, as they cannot throw.  A call to such a
-     function, however, should be treated as throwing if any of its callees
-     can throw.  */
-  bool all_throwers_are_sibcalls;
-
-  /* Nonzero if stack limit checking should be enabled in the current
-     function.  */
-  bool limit_stack;
-
-  /* Nonzero if profiling code should be generated.  */
-  bool profile;
-
-  /* Nonzero if the current function uses the constant pool.  */
-  bool uses_const_pool;
-
-  /* Nonzero if the current function uses pic_offset_table_rtx.  */
-  bool uses_pic_offset_table;
-
-  /* Nonzero if the current function needs an lsda for exception handling.  */
-  bool uses_eh_lsda;
-
-  /* Set when the tail call has been produced.  */
-  bool tail_call_emit;
-
-  /* Nonzero if code to initialize arg_pointer_save_area has been emitted.  */
-  bool arg_pointer_save_area_init;
-
-  /* Nonzero if current function must be given a frame pointer.
-     Set in reload1.c or lra-eliminations.c if anything is allocated
-     on the stack there.  */
-  bool frame_pointer_needed;
-
-  /* When set, expand should optimize for speed.  */
-  bool maybe_hot_insn_p;
-
-  /* Nonzero if function stack realignment is needed.  This flag may be
-     set twice: before and after reload.  It is set before reload wrt
-     stack alignment estimation before reload.  It will be changed after
-     reload if by then criteria of stack realignment is different.
-     The value set after reload is the accurate one and is finalized.  */
-  bool stack_realign_needed;
-
-  /* Nonzero if function stack realignment is tried.  This flag is set
-     only once before reload.  It affects register elimination.  This
-     is used to generate DWARF debug info for stack variables.  */
-  bool stack_realign_tried;
-
-  /* Nonzero if function being compiled needs dynamic realigned
-     argument pointer (drap) if stack needs realigning.  */
-  bool need_drap;
-
-  /* Nonzero if function stack realignment estimation is done, namely
-     stack_realign_needed flag has been set before reload wrt estimated
-     stack alignment info.  */
-  bool stack_realign_processed;
-
-  /* Nonzero if function stack realignment has been finalized, namely
-     stack_realign_needed flag has been set and finalized after reload.  */
-  bool stack_realign_finalized;
-
-  /* True if dbr_schedule has already been called for this function.  */
-  bool dbr_scheduled_p;
-
-  /* True if current function can not throw.  Unlike
-     TREE_NOTHROW (current_function_decl) it is set even for overwritable
-     function where currently compiled version of it is nothrow.  */
-  bool nothrow;
-
-  /* True if we performed shrink-wrapping for the current function.  */
-  bool shrink_wrapped;
-
-  /* Nonzero if function being compiled doesn't modify the stack pointer
-     (ignoring the prologue and epilogue).  This is only valid after
-     pass_stack_ptr_mod has run.  */
-  bool sp_is_unchanging;
-
-  /* Nonzero if function being compiled doesn't contain any calls
-     (ignoring the prologue and epilogue).  This is set prior to
-     local register allocation and is valid for the remaining
-     compiler passes.  */
-  bool is_leaf;
-
-  /* Nonzero if the function being compiled is a leaf function which only
-     uses leaf registers.  This is valid after reload (specifically after
-     sched2) and is useful only if the port defines LEAF_REGISTERS.  */
-  bool uses_only_leaf_regs;
-
-  /* Nonzero if the function being compiled has undergone hot/cold partitioning
-     (under flag_reorder_blocks_and_partition) and has at least one cold
-     block.  */
-  bool has_bb_partition;
-
-  /* Nonzero if the function being compiled has completed the bb reordering
-     pass.  */
-  bool bb_reorder_complete;
-
-  /* Like regs_ever_live, but 1 if a reg is set or clobbered from an
-     asm.  Unlike regs_ever_live, elements of this array corresponding
-     to eliminable regs (like the frame pointer) are set if an asm
-     sets them.  */
-  HARD_REG_SET asm_clobbers;
-};
-
-#define return_label (crtl->x_return_label)
-#define naked_return_label (crtl->x_naked_return_label)
-#define stack_slot_list (crtl->x_stack_slot_list)
-#define parm_birth_insn (crtl->x_parm_birth_insn)
-#define frame_offset (crtl->x_frame_offset)
-#define stack_check_probe_note (crtl->x_stack_check_probe_note)
-#define arg_pointer_save_area (crtl->x_arg_pointer_save_area)
-#define used_temp_slots (crtl->x_used_temp_slots)
-#define avail_temp_slots (crtl->x_avail_temp_slots)
-#define temp_slot_level (crtl->x_temp_slot_level)
-#define nonlocal_goto_handler_labels (crtl->x_nonlocal_goto_handler_labels)
-#define frame_pointer_needed (crtl->frame_pointer_needed)
-#define stack_realign_fp (crtl->stack_realign_needed && !crtl->need_drap)
-#define stack_realign_drap (crtl->stack_realign_needed && crtl->need_drap)
-
-extern GTY(()) struct rtl_data x_rtl;
-
-/* Accessor to RTL datastructures.  We keep them statically allocated now since
-   we never keep multiple functions.  For threaded compiler we might however
-   want to do differently.  */
-#define crtl (&x_rtl)
-
-struct GTY(()) stack_usage
-{
-  /* # of bytes of static stack space allocated by the function.  */
-  HOST_WIDE_INT static_stack_size;
-
-  /* # of bytes of dynamic stack space allocated by the function.  This is
-     meaningful only if has_unbounded_dynamic_stack_size is zero.  */
-  HOST_WIDE_INT dynamic_stack_size;
-
-  /* # of bytes of space pushed onto the stack after the prologue.  If
-     !ACCUMULATE_OUTGOING_ARGS, it contains the outgoing arguments.  */
-  int pushed_stack_size;
-
-  /* Nonzero if the amount of stack space allocated dynamically cannot
-     be bounded at compile-time.  */
-  unsigned int has_unbounded_dynamic_stack_size : 1;
-};
-
-#define current_function_static_stack_size (cfun->su->static_stack_size)
-#define current_function_dynamic_stack_size (cfun->su->dynamic_stack_size)
-#define current_function_pushed_stack_size (cfun->su->pushed_stack_size)
-#define current_function_has_unbounded_dynamic_stack_size \
-  (cfun->su->has_unbounded_dynamic_stack_size)
-#define current_function_allocates_dynamic_stack_space    \
-  (current_function_dynamic_stack_size != 0               \
-   || current_function_has_unbounded_dynamic_stack_size)
-
-/* This structure can save all the important global and static variables
-   describing the status of the current function.  */
-
-struct GTY(()) function {
-  struct eh_status *eh;
-
-  /* The control flow graph for this function.  */
-  struct control_flow_graph *cfg;
-
-  /* GIMPLE body for this function.  */
-  gimple_seq gimple_body;
-
-  /* SSA and dataflow information.  */
-  struct gimple_df *gimple_df;
-
-  /* The loops in this function.  */
-  struct loops *x_current_loops;
-
-  /* The stack usage of this function.  */
-  struct stack_usage *su;
-
-  /* Value histograms attached to particular statements.  */
-  htab_t GTY((skip)) value_histograms;
-
-  /* For function.c.  */
-
-  /* Points to the FUNCTION_DECL of this function.  */
-  tree decl;
-
-  /* A PARM_DECL that should contain the static chain for this function.
-     It will be initialized at the beginning of the function.  */
-  tree static_chain_decl;
-
-  /* An expression that contains the non-local goto save area.  The first
-     word is the saved frame pointer and the second is the saved stack
-     pointer.  */
-  tree nonlocal_goto_save_area;
-
-  /* Vector of function local variables, functions, types and constants.  */
-  vec<tree, va_gc> *local_decls;
-
-  /* In a Cilk function, the VAR_DECL for the frame descriptor. */
-  tree cilk_frame_decl;
-
-  /* For md files.  */
-
-  /* tm.h can use this to store whatever it likes.  */
-  struct machine_function * GTY ((maybe_undef)) machine;
-
-  /* Language-specific code can use this to store whatever it likes.  */
-  struct language_function * language;
-
-  /* Used types hash table.  */
-  htab_t GTY ((param_is (union tree_node))) used_types_hash;
-
-  /* Dwarf2 Frame Description Entry, containing the Call Frame Instructions
-     used for unwinding.  Only set when either dwarf2 unwinding or dwarf2
-     debugging is enabled.  */
-  struct dw_fde_node *fde;
-
-  /* Last statement uid.  */
-  int last_stmt_uid;
-
-  /* Function sequence number for profiling, debugging, etc.  */
-  int funcdef_no;
-
-  /* Line number of the start of the function for debugging purposes.  */
-  location_t function_start_locus;
-
-  /* Line number of the end of the function.  */
-  location_t function_end_locus;
-
-  /* Properties used by the pass manager.  */
-  unsigned int curr_properties;
-  unsigned int last_verified;
-
-  /* Non-null if the function does something that would prevent it from
-     being copied; this applies to both versioning and inlining.  Set to
-     a string describing the reason for failure.  */
-  const char * GTY((skip)) cannot_be_copied_reason;
-
-  /* Collected bit flags.  */
-
-  /* Number of units of general registers that need saving in stdarg
-     function.  What unit is depends on the backend, either it is number
-     of bytes, or it can be number of registers.  */
-  unsigned int va_list_gpr_size : 8;
-
-  /* Number of units of floating point registers that need saving in stdarg
-     function.  */
-  unsigned int va_list_fpr_size : 8;
-
-  /* Nonzero if function being compiled can call setjmp.  */
-  unsigned int calls_setjmp : 1;
-
-  /* Nonzero if function being compiled can call alloca,
-     either as a subroutine or builtin.  */
-  unsigned int calls_alloca : 1;
-
-  /* This will indicate whether a function is a cilk function */
-  unsigned int is_cilk_function : 1;
-
-  /* Nonzero if this is a Cilk function that spawns. */
-  unsigned int calls_cilk_spawn : 1;
-  
-  /* Nonzero if function being compiled receives nonlocal gotos
-     from nested functions.  */
-  unsigned int has_nonlocal_label : 1;
-
-  /* Nonzero if we've set cannot_be_copied_reason.  I.e. if
-     (cannot_be_copied_set && !cannot_be_copied_reason), the function
-     can in fact be copied.  */
-  unsigned int cannot_be_copied_set : 1;
-
-  /* Nonzero if current function uses stdarg.h or equivalent.  */
-  unsigned int stdarg : 1;
-
-  unsigned int after_inlining : 1;
-  unsigned int always_inline_functions_inlined : 1;
-
-  /* Nonzero if function being compiled can throw synchronous non-call
-     exceptions.  */
-  unsigned int can_throw_non_call_exceptions : 1;
-
-  /* Nonzero if instructions that may throw exceptions but don't otherwise
-     contribute to the execution of the program can be deleted.  */
-  unsigned int can_delete_dead_exceptions : 1;
-
-  /* Fields below this point are not set for abstract functions; see
-     allocate_struct_function.  */
-
-  /* Nonzero if function being compiled needs to be given an address
-     where the value should be stored.  */
-  unsigned int returns_struct : 1;
-
-  /* Nonzero if function being compiled needs to
-     return the address of where it has put a structure value.  */
-  unsigned int returns_pcc_struct : 1;
-
-  /* Nonzero if this function has local DECL_HARD_REGISTER variables.
-     In this case code motion has to be done more carefully.  */
-  unsigned int has_local_explicit_reg_vars : 1;
-
-  /* Nonzero if the current function is a thunk, i.e., a lightweight
-     function implemented by the output_mi_thunk hook) that just
-     adjusts one of its arguments and forwards to another
-     function.  */
-  unsigned int is_thunk : 1;
-
-  /* Nonzero if the current function contains any loops with
-     loop->force_vect set.  */
-  unsigned int has_force_vect_loops : 1;
-
-  /* Nonzero if the current function contains any loops with
-     nonzero value in loop->simduid.  */
-  unsigned int has_simduid_loops : 1;
-
-  /* Set when the tail call has been identified.  */
-  unsigned int tail_call_marked : 1;
-};
-
-/* Add the decl D to the local_decls list of FUN.  */
-
-static inline void
-add_local_decl (struct function *fun, tree d)
-{
-  vec_safe_push (fun->local_decls, d);
-}
-
-#define FOR_EACH_LOCAL_DECL(FUN, I, D)		\
-  FOR_EACH_VEC_SAFE_ELT_REVERSE ((FUN)->local_decls, I, D)
-
-/* If va_list_[gf]pr_size is set to this, it means we don't know how
-   many units need to be saved.  */
-#define VA_LIST_MAX_GPR_SIZE	255
-#define VA_LIST_MAX_FPR_SIZE	255
-
-/* The function currently being compiled.  */
-extern GTY(()) struct function *cfun;
-
-/* In order to ensure that cfun is not set directly, we redefine it so
-   that it is not an lvalue.  Rather than assign to cfun, use
-   push_cfun or set_cfun.  */
-#define cfun (cfun + 0)
-
-/* Nonzero if we've already converted virtual regs to hard regs.  */
-extern int virtuals_instantiated;
-
-/* Nonzero if at least one trampoline has been created.  */
-extern int trampolines_created;
-
-struct GTY(()) types_used_by_vars_entry {
-  tree type;
-  tree var_decl;
-};
-
-/* Hash table making the relationship between a global variable
-   and the types it references in its initializer. The key of the
-   entry is a referenced type, and the value is the DECL of the global
-   variable. types_use_by_vars_do_hash and types_used_by_vars_eq below are
-   the hash and equality functions to use for this hash table.  */
-extern GTY((param_is (struct types_used_by_vars_entry))) htab_t
-  types_used_by_vars_hash;
-
-hashval_t types_used_by_vars_do_hash (const void*);
-int types_used_by_vars_eq (const void *, const void *);
-void types_used_by_var_decl_insert (tree type, tree var_decl);
-
-/* During parsing of a global variable, this vector contains the types
-   referenced by the global variable.  */
-extern GTY(()) vec<tree, va_gc> *types_used_by_cur_var_decl;
-
-/* cfun shouldn't be set directly; use one of these functions instead.  */
-extern void set_cfun (struct function *new_cfun);
-extern void push_cfun (struct function *new_cfun);
-extern void pop_cfun (void);
-extern void instantiate_decl_rtl (rtx x);
-
-/* Return the loop tree of FN.  */
-
-inline struct loops *
-loops_for_fn (struct function *fn)
-{
-  return fn->x_current_loops;
-}
-
-/* Set the loop tree of FN to LOOPS.  */
-
-inline void
-set_loops_for_fn (struct function *fn, struct loops *loops)
-{
-  gcc_checking_assert (fn->x_current_loops == NULL || loops == NULL);
-  fn->x_current_loops = loops;
-}
-
-/* For backward compatibility... eventually these should all go away.  */
-#define current_function_funcdef_no (cfun->funcdef_no)
-
-#define current_loops (cfun->x_current_loops)
-#define dom_computed (cfun->cfg->x_dom_computed)
-#define n_bbs_in_dom_tree (cfun->cfg->x_n_bbs_in_dom_tree)
-#define VALUE_HISTOGRAMS(fun) (fun)->value_histograms
-
-/* Identify BLOCKs referenced by more than one NOTE_INSN_BLOCK_{BEG,END},
-   and create duplicate blocks.  */
-extern void reorder_blocks (void);
-
-/* Set BLOCK_NUMBER for all the blocks in FN.  */
-extern void number_blocks (tree);
-
-extern void clear_block_marks (tree);
-extern tree blocks_nreverse (tree);
-extern tree block_chainon (tree, tree);
-
-/* Return size needed for stack frame based on slots so far allocated.
-   This size counts from zero.  It is not rounded to STACK_BOUNDARY;
-   the caller may have to do that.  */
-extern HOST_WIDE_INT get_frame_size (void);
-
-/* Issue an error message and return TRUE if frame OFFSET overflows in
-   the signed target pointer arithmetics for function FUNC.  Otherwise
-   return FALSE.  */
-extern bool frame_offset_overflow (HOST_WIDE_INT, tree);
-
-/* A pointer to a function to create target specific, per-function
-   data structures.  */
-extern struct machine_function * (*init_machine_status) (void);
-
-/* Save and restore status information for a nested function.  */
-extern void free_after_parsing (struct function *);
-extern void free_after_compilation (struct function *);
-
-extern void init_varasm_status (void);
-
-#ifdef RTX_CODE
-extern void diddle_return_value (void (*)(rtx, void*), void*);
-extern void clobber_return_register (void);
-#endif
-
-extern rtx get_arg_pointer_save_area (void);
-
-/* Returns the name of the current function.  */
-extern const char *fndecl_name (tree);
-extern const char *function_name (struct function *);
-extern const char *current_function_name (void);
-
-extern void do_warn_unused_parameter (tree);
-
-extern bool pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
-			       tree, bool);
-extern bool reference_callee_copied (CUMULATIVE_ARGS *, enum machine_mode,
-				     tree, bool);
-
-extern void used_types_insert (tree);
-
-extern int get_next_funcdef_no (void);
-extern int get_last_funcdef_no (void);
-
-#ifdef HAVE_simple_return
-extern bool requires_stack_frame_p (rtx, HARD_REG_SET, HARD_REG_SET);
-#endif                        
-
-extern rtx get_hard_reg_initial_val (enum machine_mode, unsigned int);
-extern rtx has_hard_reg_initial_val (enum machine_mode, unsigned int);
-extern rtx get_hard_reg_initial_reg (rtx);
-extern bool initial_value_entry (int i, rtx *, rtx *);
-
-/* Called from gimple_expand_cfg.  */
-extern unsigned int emit_initial_value_sets (void);
-
-/* In predict.c */
-extern bool optimize_function_for_size_p (struct function *);
-extern bool optimize_function_for_speed_p (struct function *);
-
-/* In function.c */
-extern void expand_function_end (void);
-extern void expand_function_start (tree);
-extern void stack_protect_epilogue (void);
-extern void init_dummy_function_start (void);
-extern void expand_dummy_function_end (void);
-extern void allocate_struct_function (tree, bool);
-extern void push_struct_function (tree fndecl);
-extern void init_function_start (tree);
-extern bool use_register_for_decl (const_tree);
-extern void generate_setjmp_warnings (void);
-extern void init_temp_slots (void);
-extern void free_temp_slots (void);
-extern void pop_temp_slots (void);
-extern void push_temp_slots (void);
-extern void preserve_temp_slots (rtx);
-extern int aggregate_value_p (const_tree, const_tree);
-extern void push_function_context (void);
-extern void pop_function_context (void);
-extern gimple_seq gimplify_parameters (void);
-
-#endif  /* GCC_FUNCTION_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gcc-plugin.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gcc-plugin.h
deleted file mode 100644
index 035b50b..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gcc-plugin.h
+++ /dev/null
@@ -1,166 +0,0 @@
-/* Public header file for plugins to include.
-   Copyright (C) 2009-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_PLUGIN_H
-#define GCC_PLUGIN_H
-
-#ifndef IN_GCC
-#define IN_GCC
-#endif
-
-#include "config.h"
-#include "system.h"
-#include "coretypes.h"
-#include "highlev-plugin-common.h"
-#include "hashtab.h"
-
-/* Event names.  */
-enum plugin_event
-{
-# define DEFEVENT(NAME) NAME,
-# include "plugin.def"
-# undef DEFEVENT
-  PLUGIN_EVENT_FIRST_DYNAMIC
-};
-
-/* All globals declared here have C linkage to reduce link compatibility
-   issues with implementation language choice and mangling.  */
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern const char **plugin_event_name;
-
-struct plugin_argument
-{
-  char *key;    /* key of the argument.  */
-  char *value;  /* value is optional and can be NULL.  */
-};
-
-/* Additional information about the plugin. Used by --help and --version. */
-
-struct plugin_info
-{
-  const char *version;
-  const char *help;
-};
-
-/* Represents the gcc version. Used to avoid using an incompatible plugin. */
-
-struct plugin_gcc_version
-{
-  const char *basever;
-  const char *datestamp;
-  const char *devphase;
-  const char *revision;
-  const char *configuration_arguments;
-};
-
-/* Object that keeps track of the plugin name and its arguments. */
-struct plugin_name_args
-{
-  char *base_name;              /* Short name of the plugin (filename without
-                                   .so suffix). */
-  const char *full_name;        /* Path to the plugin as specified with
-                                   -fplugin=. */
-  int argc;                     /* Number of arguments specified with
-                                   -fplugin-arg-... */
-  struct plugin_argument *argv; /* Array of ARGC key-value pairs. */
-  const char *version;          /* Version string provided by plugin. */
-  const char *help;             /* Help string provided by plugin. */
-};
-
-/* The default version check. Compares every field in VERSION. */
-
-extern bool plugin_default_version_check (struct plugin_gcc_version *,
-					  struct plugin_gcc_version *);
-
-/* Function type for the plugin initialization routine. Each plugin module
-   should define this as an externally-visible function with name
-   "plugin_init."
-
-   PLUGIN_INFO - plugin invocation information.
-   VERSION     - the plugin_gcc_version symbol of GCC.
-
-   Returns 0 if initialization finishes successfully.  */
-
-typedef int (*plugin_init_func) (struct plugin_name_args *plugin_info,
-                                 struct plugin_gcc_version *version);
-
-/* Declaration for "plugin_init" function so that it doesn't need to be
-   duplicated in every plugin.  */
-extern int plugin_init (struct plugin_name_args *plugin_info,
-                        struct plugin_gcc_version *version);
-
-/* Function type for a plugin callback routine.
-
-   GCC_DATA  - event-specific data provided by GCC
-   USER_DATA - plugin-specific data provided by the plugin  */
-
-typedef void (*plugin_callback_func) (void *gcc_data, void *user_data);
-
-/* Called from the plugin's initialization code. Register a single callback.
-   This function can be called multiple times.
-
-   PLUGIN_NAME - display name for this plugin
-   EVENT       - which event the callback is for
-   CALLBACK    - the callback to be called at the event
-   USER_DATA   - plugin-provided data.
-*/
-
-/* Number of event ids / names registered so far.  */
-
-extern int get_event_last (void);
-
-int get_named_event_id (const char *name, enum insert_option insert);
-
-/* This is also called without a callback routine for the
-   PLUGIN_PASS_MANAGER_SETUP, PLUGIN_INFO, PLUGIN_REGISTER_GGC_ROOTS and
-   PLUGIN_REGISTER_GGC_CACHES pseudo-events, with a specific user_data.
-  */
-
-extern void register_callback (const char *plugin_name,
-			       int event,
-                               plugin_callback_func callback,
-                               void *user_data);
-
-extern int unregister_callback (const char *plugin_name, int event);
-
-
-/* Retrieve the plugin directory name, as returned by the
-   -fprint-file-name=plugin argument to the gcc program, which is the
-   -iplugindir program argument to cc1.  */
-extern const char* default_plugin_dir_name (void);
-
-#ifdef __cplusplus
-}
-#endif
-
-/* In case the C++ compiler does name mangling for globals, declare
-   plugin_is_GPL_compatible extern "C" so that a later definition
-   in a plugin file will have this linkage.  */
-#ifdef __cplusplus
-extern "C" {
-#endif
-extern int plugin_is_GPL_compatible;
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* GCC_PLUGIN_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gcc-symtab.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gcc-symtab.h
deleted file mode 100644
index e253561..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gcc-symtab.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Declarations for symtab.c.
-   FIXME - This file should be named symtab.h, but that name conflicts
-           with libcpp's symtab.h.
-
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_SYMTAB_H
-#define GCC_SYMTAB_H
-
-extern void change_decl_assembler_name (tree, tree);
-
-#endif  // GCC_SYMTAB_H
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/genrtl.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/genrtl.h
deleted file mode 100644
index ff9c02e..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/genrtl.h
+++ /dev/null
@@ -1,1247 +0,0 @@
-/* Generated automatically by gengenrtl from rtl.def.  */
-
-#ifndef GCC_GENRTL_H
-#define GCC_GENRTL_H
-
-#include "statistics.h"
-
-static inline rtx
-gen_rtx_fmt_0_stat (RTX_CODE code, enum machine_mode mode MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  X0EXP (rt, 0) = NULL_RTX;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_0(c, m)\
-        gen_rtx_fmt_0_stat (c, m MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_ee_stat (RTX_CODE code, enum machine_mode mode,
-	rtx arg0,
-	rtx arg1 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XEXP (rt, 0) = arg0;
-  XEXP (rt, 1) = arg1;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_ee(c, m, p0, p1)\
-        gen_rtx_fmt_ee_stat (c, m, p0, p1 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_ue_stat (RTX_CODE code, enum machine_mode mode,
-	rtx arg0,
-	rtx arg1 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XEXP (rt, 0) = arg0;
-  XEXP (rt, 1) = arg1;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_ue(c, m, p0, p1)\
-        gen_rtx_fmt_ue_stat (c, m, p0, p1 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_ie_stat (RTX_CODE code, enum machine_mode mode,
-	int arg0,
-	rtx arg1 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XINT (rt, 0) = arg0;
-  XEXP (rt, 1) = arg1;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_ie(c, m, p0, p1)\
-        gen_rtx_fmt_ie_stat (c, m, p0, p1 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_E_stat (RTX_CODE code, enum machine_mode mode,
-	rtvec arg0 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XVEC (rt, 0) = arg0;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_E(c, m, p0)\
-        gen_rtx_fmt_E_stat (c, m, p0 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_i_stat (RTX_CODE code, enum machine_mode mode,
-	int arg0 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XINT (rt, 0) = arg0;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_i(c, m, p0)\
-        gen_rtx_fmt_i_stat (c, m, p0 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_iuuBeiie_stat (RTX_CODE code, enum machine_mode mode,
-	int arg0,
-	rtx arg1,
-	rtx arg2,
-	basic_block arg3,
-	rtx arg4,
-	int arg5,
-	int arg6,
-	rtx arg7 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XINT (rt, 0) = arg0;
-  XEXP (rt, 1) = arg1;
-  XEXP (rt, 2) = arg2;
-  XBBDEF (rt, 3) = arg3;
-  XEXP (rt, 4) = arg4;
-  XINT (rt, 5) = arg5;
-  XINT (rt, 6) = arg6;
-  XEXP (rt, 7) = arg7;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_iuuBeiie(c, m, p0, p1, p2, p3, p4, p5, p6, p7)\
-        gen_rtx_fmt_iuuBeiie_stat (c, m, p0, p1, p2, p3, p4, p5, p6, p7 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_iuuBeiie0_stat (RTX_CODE code, enum machine_mode mode,
-	int arg0,
-	rtx arg1,
-	rtx arg2,
-	basic_block arg3,
-	rtx arg4,
-	int arg5,
-	int arg6,
-	rtx arg7 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XINT (rt, 0) = arg0;
-  XEXP (rt, 1) = arg1;
-  XEXP (rt, 2) = arg2;
-  XBBDEF (rt, 3) = arg3;
-  XEXP (rt, 4) = arg4;
-  XINT (rt, 5) = arg5;
-  XINT (rt, 6) = arg6;
-  XEXP (rt, 7) = arg7;
-  X0EXP (rt, 8) = NULL_RTX;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_iuuBeiie0(c, m, p0, p1, p2, p3, p4, p5, p6, p7)\
-        gen_rtx_fmt_iuuBeiie0_stat (c, m, p0, p1, p2, p3, p4, p5, p6, p7 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_iuuBeiiee_stat (RTX_CODE code, enum machine_mode mode,
-	int arg0,
-	rtx arg1,
-	rtx arg2,
-	basic_block arg3,
-	rtx arg4,
-	int arg5,
-	int arg6,
-	rtx arg7,
-	rtx arg8 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XINT (rt, 0) = arg0;
-  XEXP (rt, 1) = arg1;
-  XEXP (rt, 2) = arg2;
-  XBBDEF (rt, 3) = arg3;
-  XEXP (rt, 4) = arg4;
-  XINT (rt, 5) = arg5;
-  XINT (rt, 6) = arg6;
-  XEXP (rt, 7) = arg7;
-  XEXP (rt, 8) = arg8;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_iuuBeiiee(c, m, p0, p1, p2, p3, p4, p5, p6, p7, p8)\
-        gen_rtx_fmt_iuuBeiiee_stat (c, m, p0, p1, p2, p3, p4, p5, p6, p7, p8 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_iuuBe0000_stat (RTX_CODE code, enum machine_mode mode,
-	int arg0,
-	rtx arg1,
-	rtx arg2,
-	basic_block arg3,
-	rtx arg4 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XINT (rt, 0) = arg0;
-  XEXP (rt, 1) = arg1;
-  XEXP (rt, 2) = arg2;
-  XBBDEF (rt, 3) = arg3;
-  XEXP (rt, 4) = arg4;
-  X0EXP (rt, 5) = NULL_RTX;
-  X0EXP (rt, 6) = NULL_RTX;
-  X0EXP (rt, 7) = NULL_RTX;
-  X0EXP (rt, 8) = NULL_RTX;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_iuuBe0000(c, m, p0, p1, p2, p3, p4)\
-        gen_rtx_fmt_iuuBe0000_stat (c, m, p0, p1, p2, p3, p4 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_iuu00000_stat (RTX_CODE code, enum machine_mode mode,
-	int arg0,
-	rtx arg1,
-	rtx arg2 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XINT (rt, 0) = arg0;
-  XEXP (rt, 1) = arg1;
-  XEXP (rt, 2) = arg2;
-  X0EXP (rt, 3) = NULL_RTX;
-  X0EXP (rt, 4) = NULL_RTX;
-  X0EXP (rt, 5) = NULL_RTX;
-  X0EXP (rt, 6) = NULL_RTX;
-  X0EXP (rt, 7) = NULL_RTX;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_iuu00000(c, m, p0, p1, p2)\
-        gen_rtx_fmt_iuu00000_stat (c, m, p0, p1, p2 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_iuuB00is_stat (RTX_CODE code, enum machine_mode mode,
-	int arg0,
-	rtx arg1,
-	rtx arg2,
-	basic_block arg3,
-	int arg4,
-	const char *arg5 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XINT (rt, 0) = arg0;
-  XEXP (rt, 1) = arg1;
-  XEXP (rt, 2) = arg2;
-  XBBDEF (rt, 3) = arg3;
-  X0EXP (rt, 4) = NULL_RTX;
-  X0EXP (rt, 5) = NULL_RTX;
-  XINT (rt, 6) = arg4;
-  XSTR (rt, 7) = arg5;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_iuuB00is(c, m, p0, p1, p2, p3, p4, p5)\
-        gen_rtx_fmt_iuuB00is_stat (c, m, p0, p1, p2, p3, p4, p5 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_si_stat (RTX_CODE code, enum machine_mode mode,
-	const char *arg0,
-	int arg1 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XSTR (rt, 0) = arg0;
-  XINT (rt, 1) = arg1;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_si(c, m, p0, p1)\
-        gen_rtx_fmt_si_stat (c, m, p0, p1 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_ssiEEEi_stat (RTX_CODE code, enum machine_mode mode,
-	const char *arg0,
-	const char *arg1,
-	int arg2,
-	rtvec arg3,
-	rtvec arg4,
-	rtvec arg5,
-	int arg6 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XSTR (rt, 0) = arg0;
-  XSTR (rt, 1) = arg1;
-  XINT (rt, 2) = arg2;
-  XVEC (rt, 3) = arg3;
-  XVEC (rt, 4) = arg4;
-  XVEC (rt, 5) = arg5;
-  XINT (rt, 6) = arg6;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_ssiEEEi(c, m, p0, p1, p2, p3, p4, p5, p6)\
-        gen_rtx_fmt_ssiEEEi_stat (c, m, p0, p1, p2, p3, p4, p5, p6 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_Ei_stat (RTX_CODE code, enum machine_mode mode,
-	rtvec arg0,
-	int arg1 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XVEC (rt, 0) = arg0;
-  XINT (rt, 1) = arg1;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_Ei(c, m, p0, p1)\
-        gen_rtx_fmt_Ei_stat (c, m, p0, p1 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_eEee0_stat (RTX_CODE code, enum machine_mode mode,
-	rtx arg0,
-	rtvec arg1,
-	rtx arg2,
-	rtx arg3 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XEXP (rt, 0) = arg0;
-  XVEC (rt, 1) = arg1;
-  XEXP (rt, 2) = arg2;
-  XEXP (rt, 3) = arg3;
-  X0EXP (rt, 4) = NULL_RTX;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_eEee0(c, m, p0, p1, p2, p3)\
-        gen_rtx_fmt_eEee0_stat (c, m, p0, p1, p2, p3 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_eee_stat (RTX_CODE code, enum machine_mode mode,
-	rtx arg0,
-	rtx arg1,
-	rtx arg2 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XEXP (rt, 0) = arg0;
-  XEXP (rt, 1) = arg1;
-  XEXP (rt, 2) = arg2;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_eee(c, m, p0, p1, p2)\
-        gen_rtx_fmt_eee_stat (c, m, p0, p1, p2 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_e_stat (RTX_CODE code, enum machine_mode mode,
-	rtx arg0 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XEXP (rt, 0) = arg0;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_e(c, m, p0)\
-        gen_rtx_fmt_e_stat (c, m, p0 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt__stat (RTX_CODE code, enum machine_mode mode MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-
-  return rt;
-}
-
-#define gen_rtx_fmt_(c, m)\
-        gen_rtx_fmt__stat (c, m MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_w_stat (RTX_CODE code, enum machine_mode mode,
-	HOST_WIDE_INT arg0 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XWINT (rt, 0) = arg0;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_w(c, m, p0)\
-        gen_rtx_fmt_w_stat (c, m, p0 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_www_stat (RTX_CODE code, enum machine_mode mode,
-	HOST_WIDE_INT arg0,
-	HOST_WIDE_INT arg1,
-	HOST_WIDE_INT arg2 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XWINT (rt, 0) = arg0;
-  XWINT (rt, 1) = arg1;
-  XWINT (rt, 2) = arg2;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_www(c, m, p0, p1, p2)\
-        gen_rtx_fmt_www_stat (c, m, p0, p1, p2 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_s_stat (RTX_CODE code, enum machine_mode mode,
-	const char *arg0 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XSTR (rt, 0) = arg0;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_s(c, m, p0)\
-        gen_rtx_fmt_s_stat (c, m, p0 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_i00_stat (RTX_CODE code, enum machine_mode mode,
-	int arg0 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XINT (rt, 0) = arg0;
-  X0EXP (rt, 1) = NULL_RTX;
-  X0EXP (rt, 2) = NULL_RTX;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_i00(c, m, p0)\
-        gen_rtx_fmt_i00_stat (c, m, p0 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_ei_stat (RTX_CODE code, enum machine_mode mode,
-	rtx arg0,
-	int arg1 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XEXP (rt, 0) = arg0;
-  XINT (rt, 1) = arg1;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_ei(c, m, p0, p1)\
-        gen_rtx_fmt_ei_stat (c, m, p0, p1 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_e0_stat (RTX_CODE code, enum machine_mode mode,
-	rtx arg0 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XEXP (rt, 0) = arg0;
-  X0EXP (rt, 1) = NULL_RTX;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_e0(c, m, p0)\
-        gen_rtx_fmt_e0_stat (c, m, p0 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_u_stat (RTX_CODE code, enum machine_mode mode,
-	rtx arg0 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XEXP (rt, 0) = arg0;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_u(c, m, p0)\
-        gen_rtx_fmt_u_stat (c, m, p0 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_s00_stat (RTX_CODE code, enum machine_mode mode,
-	const char *arg0 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XSTR (rt, 0) = arg0;
-  X0EXP (rt, 1) = NULL_RTX;
-  X0EXP (rt, 2) = NULL_RTX;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_s00(c, m, p0)\
-        gen_rtx_fmt_s00_stat (c, m, p0 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_tei_stat (RTX_CODE code, enum machine_mode mode,
-	tree arg0,
-	rtx arg1,
-	int arg2 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XTREE (rt, 0) = arg0;
-  XEXP (rt, 1) = arg1;
-  XINT (rt, 2) = arg2;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_tei(c, m, p0, p1, p2)\
-        gen_rtx_fmt_tei_stat (c, m, p0, p1, p2 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_t_stat (RTX_CODE code, enum machine_mode mode,
-	tree arg0 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XTREE (rt, 0) = arg0;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_t(c, m, p0)\
-        gen_rtx_fmt_t_stat (c, m, p0 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_iss_stat (RTX_CODE code, enum machine_mode mode,
-	int arg0,
-	const char *arg1,
-	const char *arg2 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XINT (rt, 0) = arg0;
-  XSTR (rt, 1) = arg1;
-  XSTR (rt, 2) = arg2;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_iss(c, m, p0, p1, p2)\
-        gen_rtx_fmt_iss_stat (c, m, p0, p1, p2 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_is_stat (RTX_CODE code, enum machine_mode mode,
-	int arg0,
-	const char *arg1 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XINT (rt, 0) = arg0;
-  XSTR (rt, 1) = arg1;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_is(c, m, p0, p1)\
-        gen_rtx_fmt_is_stat (c, m, p0, p1 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_isE_stat (RTX_CODE code, enum machine_mode mode,
-	int arg0,
-	const char *arg1,
-	rtvec arg2 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XINT (rt, 0) = arg0;
-  XSTR (rt, 1) = arg1;
-  XVEC (rt, 2) = arg2;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_isE(c, m, p0, p1, p2)\
-        gen_rtx_fmt_isE_stat (c, m, p0, p1, p2 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_iE_stat (RTX_CODE code, enum machine_mode mode,
-	int arg0,
-	rtvec arg1 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XINT (rt, 0) = arg0;
-  XVEC (rt, 1) = arg1;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_iE(c, m, p0, p1)\
-        gen_rtx_fmt_iE_stat (c, m, p0, p1 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_ss_stat (RTX_CODE code, enum machine_mode mode,
-	const char *arg0,
-	const char *arg1 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XSTR (rt, 0) = arg0;
-  XSTR (rt, 1) = arg1;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_ss(c, m, p0, p1)\
-        gen_rtx_fmt_ss_stat (c, m, p0, p1 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_eE_stat (RTX_CODE code, enum machine_mode mode,
-	rtx arg0,
-	rtvec arg1 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XEXP (rt, 0) = arg0;
-  XVEC (rt, 1) = arg1;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_eE(c, m, p0, p1)\
-        gen_rtx_fmt_eE_stat (c, m, p0, p1 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_ses_stat (RTX_CODE code, enum machine_mode mode,
-	const char *arg0,
-	rtx arg1,
-	const char *arg2 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XSTR (rt, 0) = arg0;
-  XEXP (rt, 1) = arg1;
-  XSTR (rt, 2) = arg2;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_ses(c, m, p0, p1, p2)\
-        gen_rtx_fmt_ses_stat (c, m, p0, p1, p2 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_sss_stat (RTX_CODE code, enum machine_mode mode,
-	const char *arg0,
-	const char *arg1,
-	const char *arg2 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XSTR (rt, 0) = arg0;
-  XSTR (rt, 1) = arg1;
-  XSTR (rt, 2) = arg2;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_sss(c, m, p0, p1, p2)\
-        gen_rtx_fmt_sss_stat (c, m, p0, p1, p2 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_sse_stat (RTX_CODE code, enum machine_mode mode,
-	const char *arg0,
-	const char *arg1,
-	rtx arg2 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XSTR (rt, 0) = arg0;
-  XSTR (rt, 1) = arg1;
-  XEXP (rt, 2) = arg2;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_sse(c, m, p0, p1, p2)\
-        gen_rtx_fmt_sse_stat (c, m, p0, p1, p2 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_sies_stat (RTX_CODE code, enum machine_mode mode,
-	const char *arg0,
-	int arg1,
-	rtx arg2,
-	const char *arg3 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XSTR (rt, 0) = arg0;
-  XINT (rt, 1) = arg1;
-  XEXP (rt, 2) = arg2;
-  XSTR (rt, 3) = arg3;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_sies(c, m, p0, p1, p2, p3)\
-        gen_rtx_fmt_sies_stat (c, m, p0, p1, p2, p3 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_sE_stat (RTX_CODE code, enum machine_mode mode,
-	const char *arg0,
-	rtvec arg1 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XSTR (rt, 0) = arg0;
-  XVEC (rt, 1) = arg1;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_sE(c, m, p0, p1)\
-        gen_rtx_fmt_sE_stat (c, m, p0, p1 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_ii_stat (RTX_CODE code, enum machine_mode mode,
-	int arg0,
-	int arg1 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XINT (rt, 0) = arg0;
-  XINT (rt, 1) = arg1;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_ii(c, m, p0, p1)\
-        gen_rtx_fmt_ii_stat (c, m, p0, p1 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_Ee_stat (RTX_CODE code, enum machine_mode mode,
-	rtvec arg0,
-	rtx arg1 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XVEC (rt, 0) = arg0;
-  XEXP (rt, 1) = arg1;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_Ee(c, m, p0, p1)\
-        gen_rtx_fmt_Ee_stat (c, m, p0, p1 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_sEsE_stat (RTX_CODE code, enum machine_mode mode,
-	const char *arg0,
-	rtvec arg1,
-	const char *arg2,
-	rtvec arg3 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XSTR (rt, 0) = arg0;
-  XVEC (rt, 1) = arg1;
-  XSTR (rt, 2) = arg2;
-  XVEC (rt, 3) = arg3;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_sEsE(c, m, p0, p1, p2, p3)\
-        gen_rtx_fmt_sEsE_stat (c, m, p0, p1, p2, p3 MEM_STAT_INFO)
-
-static inline rtx
-gen_rtx_fmt_ssss_stat (RTX_CODE code, enum machine_mode mode,
-	const char *arg0,
-	const char *arg1,
-	const char *arg2,
-	const char *arg3 MEM_STAT_DECL)
-{
-  rtx rt;
-  rt = rtx_alloc_stat (code PASS_MEM_STAT);
-
-  PUT_MODE (rt, mode);
-  XSTR (rt, 0) = arg0;
-  XSTR (rt, 1) = arg1;
-  XSTR (rt, 2) = arg2;
-  XSTR (rt, 3) = arg3;
-
-  return rt;
-}
-
-#define gen_rtx_fmt_ssss(c, m, p0, p1, p2, p3)\
-        gen_rtx_fmt_ssss_stat (c, m, p0, p1, p2, p3 MEM_STAT_INFO)
-
-
-#define gen_rtx_VALUE(MODE) \
-  gen_rtx_fmt_0 (VALUE, (MODE))
-#define gen_rtx_DEBUG_EXPR(MODE) \
-  gen_rtx_fmt_0 (DEBUG_EXPR, (MODE))
-#define gen_rtx_EXPR_LIST(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (EXPR_LIST, (MODE), (ARG0), (ARG1))
-#define gen_rtx_INSN_LIST(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ue (INSN_LIST, (MODE), (ARG0), (ARG1))
-#define gen_rtx_INT_LIST(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ie (INT_LIST, (MODE), (ARG0), (ARG1))
-#define gen_rtx_SEQUENCE(MODE, ARG0) \
-  gen_rtx_fmt_E (SEQUENCE, (MODE), (ARG0))
-#define gen_rtx_ADDRESS(MODE, ARG0) \
-  gen_rtx_fmt_i (ADDRESS, (MODE), (ARG0))
-#define gen_rtx_DEBUG_INSN(MODE, ARG0, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7) \
-  gen_rtx_fmt_iuuBeiie (DEBUG_INSN, (MODE), (ARG0), (ARG1), (ARG2), (ARG3), (ARG4), (ARG5), (ARG6), (ARG7))
-#define gen_rtx_INSN(MODE, ARG0, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7) \
-  gen_rtx_fmt_iuuBeiie (INSN, (MODE), (ARG0), (ARG1), (ARG2), (ARG3), (ARG4), (ARG5), (ARG6), (ARG7))
-#define gen_rtx_JUMP_INSN(MODE, ARG0, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7) \
-  gen_rtx_fmt_iuuBeiie0 (JUMP_INSN, (MODE), (ARG0), (ARG1), (ARG2), (ARG3), (ARG4), (ARG5), (ARG6), (ARG7))
-#define gen_rtx_CALL_INSN(MODE, ARG0, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8) \
-  gen_rtx_fmt_iuuBeiiee (CALL_INSN, (MODE), (ARG0), (ARG1), (ARG2), (ARG3), (ARG4), (ARG5), (ARG6), (ARG7), (ARG8))
-#define gen_rtx_JUMP_TABLE_DATA(MODE, ARG0, ARG1, ARG2, ARG3, ARG4) \
-  gen_rtx_fmt_iuuBe0000 (JUMP_TABLE_DATA, (MODE), (ARG0), (ARG1), (ARG2), (ARG3), (ARG4))
-#define gen_rtx_BARRIER(MODE, ARG0, ARG1, ARG2) \
-  gen_rtx_fmt_iuu00000 (BARRIER, (MODE), (ARG0), (ARG1), (ARG2))
-#define gen_rtx_CODE_LABEL(MODE, ARG0, ARG1, ARG2, ARG3, ARG4, ARG5) \
-  gen_rtx_fmt_iuuB00is (CODE_LABEL, (MODE), (ARG0), (ARG1), (ARG2), (ARG3), (ARG4), (ARG5))
-#define gen_rtx_COND_EXEC(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (COND_EXEC, (MODE), (ARG0), (ARG1))
-#define gen_rtx_PARALLEL(MODE, ARG0) \
-  gen_rtx_fmt_E (PARALLEL, (MODE), (ARG0))
-#define gen_rtx_ASM_INPUT(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_si (ASM_INPUT, (MODE), (ARG0), (ARG1))
-#define gen_rtx_ASM_OPERANDS(MODE, ARG0, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) \
-  gen_rtx_fmt_ssiEEEi (ASM_OPERANDS, (MODE), (ARG0), (ARG1), (ARG2), (ARG3), (ARG4), (ARG5), (ARG6))
-#define gen_rtx_UNSPEC(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_Ei (UNSPEC, (MODE), (ARG0), (ARG1))
-#define gen_rtx_UNSPEC_VOLATILE(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_Ei (UNSPEC_VOLATILE, (MODE), (ARG0), (ARG1))
-#define gen_rtx_ADDR_VEC(MODE, ARG0) \
-  gen_rtx_fmt_E (ADDR_VEC, (MODE), (ARG0))
-#define gen_rtx_ADDR_DIFF_VEC(MODE, ARG0, ARG1, ARG2, ARG3) \
-  gen_rtx_fmt_eEee0 (ADDR_DIFF_VEC, (MODE), (ARG0), (ARG1), (ARG2), (ARG3))
-#define gen_rtx_PREFETCH(MODE, ARG0, ARG1, ARG2) \
-  gen_rtx_fmt_eee (PREFETCH, (MODE), (ARG0), (ARG1), (ARG2))
-#define gen_rtx_SET(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (SET, (MODE), (ARG0), (ARG1))
-#define gen_rtx_USE(MODE, ARG0) \
-  gen_rtx_fmt_e (USE, (MODE), (ARG0))
-#define gen_rtx_CLOBBER(MODE, ARG0) \
-  gen_rtx_fmt_e (CLOBBER, (MODE), (ARG0))
-#define gen_rtx_CALL(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (CALL, (MODE), (ARG0), (ARG1))
-#define gen_rtx_raw_RETURN(MODE) \
-  gen_rtx_fmt_ (RETURN, (MODE))
-#define gen_rtx_raw_SIMPLE_RETURN(MODE) \
-  gen_rtx_fmt_ (SIMPLE_RETURN, (MODE))
-#define gen_rtx_EH_RETURN(MODE) \
-  gen_rtx_fmt_ (EH_RETURN, (MODE))
-#define gen_rtx_TRAP_IF(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (TRAP_IF, (MODE), (ARG0), (ARG1))
-#define gen_rtx_raw_CONST_INT(MODE, ARG0) \
-  gen_rtx_fmt_w (CONST_INT, (MODE), (ARG0))
-#define gen_rtx_raw_CONST_VECTOR(MODE, ARG0) \
-  gen_rtx_fmt_E (CONST_VECTOR, (MODE), (ARG0))
-#define gen_rtx_CONST_STRING(MODE, ARG0) \
-  gen_rtx_fmt_s (CONST_STRING, (MODE), (ARG0))
-#define gen_rtx_CONST(MODE, ARG0) \
-  gen_rtx_fmt_e (CONST, (MODE), (ARG0))
-#define gen_rtx_raw_PC(MODE) \
-  gen_rtx_fmt_ (PC, (MODE))
-#define gen_rtx_raw_REG(MODE, ARG0) \
-  gen_rtx_fmt_i00 (REG, (MODE), (ARG0))
-#define gen_rtx_SCRATCH(MODE) \
-  gen_rtx_fmt_0 (SCRATCH, (MODE))
-#define gen_rtx_raw_SUBREG(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ei (SUBREG, (MODE), (ARG0), (ARG1))
-#define gen_rtx_STRICT_LOW_PART(MODE, ARG0) \
-  gen_rtx_fmt_e (STRICT_LOW_PART, (MODE), (ARG0))
-#define gen_rtx_CONCAT(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (CONCAT, (MODE), (ARG0), (ARG1))
-#define gen_rtx_CONCATN(MODE, ARG0) \
-  gen_rtx_fmt_E (CONCATN, (MODE), (ARG0))
-#define gen_rtx_raw_MEM(MODE, ARG0) \
-  gen_rtx_fmt_e0 (MEM, (MODE), (ARG0))
-#define gen_rtx_LABEL_REF(MODE, ARG0) \
-  gen_rtx_fmt_u (LABEL_REF, (MODE), (ARG0))
-#define gen_rtx_SYMBOL_REF(MODE, ARG0) \
-  gen_rtx_fmt_s00 (SYMBOL_REF, (MODE), (ARG0))
-#define gen_rtx_raw_CC0(MODE) \
-  gen_rtx_fmt_ (CC0, (MODE))
-#define gen_rtx_IF_THEN_ELSE(MODE, ARG0, ARG1, ARG2) \
-  gen_rtx_fmt_eee (IF_THEN_ELSE, (MODE), (ARG0), (ARG1), (ARG2))
-#define gen_rtx_COMPARE(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (COMPARE, (MODE), (ARG0), (ARG1))
-#define gen_rtx_PLUS(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (PLUS, (MODE), (ARG0), (ARG1))
-#define gen_rtx_MINUS(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (MINUS, (MODE), (ARG0), (ARG1))
-#define gen_rtx_NEG(MODE, ARG0) \
-  gen_rtx_fmt_e (NEG, (MODE), (ARG0))
-#define gen_rtx_MULT(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (MULT, (MODE), (ARG0), (ARG1))
-#define gen_rtx_SS_MULT(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (SS_MULT, (MODE), (ARG0), (ARG1))
-#define gen_rtx_US_MULT(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (US_MULT, (MODE), (ARG0), (ARG1))
-#define gen_rtx_DIV(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (DIV, (MODE), (ARG0), (ARG1))
-#define gen_rtx_SS_DIV(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (SS_DIV, (MODE), (ARG0), (ARG1))
-#define gen_rtx_US_DIV(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (US_DIV, (MODE), (ARG0), (ARG1))
-#define gen_rtx_MOD(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (MOD, (MODE), (ARG0), (ARG1))
-#define gen_rtx_UDIV(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (UDIV, (MODE), (ARG0), (ARG1))
-#define gen_rtx_UMOD(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (UMOD, (MODE), (ARG0), (ARG1))
-#define gen_rtx_AND(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (AND, (MODE), (ARG0), (ARG1))
-#define gen_rtx_IOR(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (IOR, (MODE), (ARG0), (ARG1))
-#define gen_rtx_XOR(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (XOR, (MODE), (ARG0), (ARG1))
-#define gen_rtx_NOT(MODE, ARG0) \
-  gen_rtx_fmt_e (NOT, (MODE), (ARG0))
-#define gen_rtx_ASHIFT(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (ASHIFT, (MODE), (ARG0), (ARG1))
-#define gen_rtx_ROTATE(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (ROTATE, (MODE), (ARG0), (ARG1))
-#define gen_rtx_ASHIFTRT(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (ASHIFTRT, (MODE), (ARG0), (ARG1))
-#define gen_rtx_LSHIFTRT(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (LSHIFTRT, (MODE), (ARG0), (ARG1))
-#define gen_rtx_ROTATERT(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (ROTATERT, (MODE), (ARG0), (ARG1))
-#define gen_rtx_SMIN(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (SMIN, (MODE), (ARG0), (ARG1))
-#define gen_rtx_SMAX(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (SMAX, (MODE), (ARG0), (ARG1))
-#define gen_rtx_UMIN(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (UMIN, (MODE), (ARG0), (ARG1))
-#define gen_rtx_UMAX(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (UMAX, (MODE), (ARG0), (ARG1))
-#define gen_rtx_PRE_DEC(MODE, ARG0) \
-  gen_rtx_fmt_e (PRE_DEC, (MODE), (ARG0))
-#define gen_rtx_PRE_INC(MODE, ARG0) \
-  gen_rtx_fmt_e (PRE_INC, (MODE), (ARG0))
-#define gen_rtx_POST_DEC(MODE, ARG0) \
-  gen_rtx_fmt_e (POST_DEC, (MODE), (ARG0))
-#define gen_rtx_POST_INC(MODE, ARG0) \
-  gen_rtx_fmt_e (POST_INC, (MODE), (ARG0))
-#define gen_rtx_PRE_MODIFY(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (PRE_MODIFY, (MODE), (ARG0), (ARG1))
-#define gen_rtx_POST_MODIFY(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (POST_MODIFY, (MODE), (ARG0), (ARG1))
-#define gen_rtx_NE(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (NE, (MODE), (ARG0), (ARG1))
-#define gen_rtx_EQ(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (EQ, (MODE), (ARG0), (ARG1))
-#define gen_rtx_GE(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (GE, (MODE), (ARG0), (ARG1))
-#define gen_rtx_GT(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (GT, (MODE), (ARG0), (ARG1))
-#define gen_rtx_LE(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (LE, (MODE), (ARG0), (ARG1))
-#define gen_rtx_LT(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (LT, (MODE), (ARG0), (ARG1))
-#define gen_rtx_GEU(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (GEU, (MODE), (ARG0), (ARG1))
-#define gen_rtx_GTU(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (GTU, (MODE), (ARG0), (ARG1))
-#define gen_rtx_LEU(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (LEU, (MODE), (ARG0), (ARG1))
-#define gen_rtx_LTU(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (LTU, (MODE), (ARG0), (ARG1))
-#define gen_rtx_UNORDERED(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (UNORDERED, (MODE), (ARG0), (ARG1))
-#define gen_rtx_ORDERED(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (ORDERED, (MODE), (ARG0), (ARG1))
-#define gen_rtx_UNEQ(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (UNEQ, (MODE), (ARG0), (ARG1))
-#define gen_rtx_UNGE(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (UNGE, (MODE), (ARG0), (ARG1))
-#define gen_rtx_UNGT(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (UNGT, (MODE), (ARG0), (ARG1))
-#define gen_rtx_UNLE(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (UNLE, (MODE), (ARG0), (ARG1))
-#define gen_rtx_UNLT(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (UNLT, (MODE), (ARG0), (ARG1))
-#define gen_rtx_LTGT(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (LTGT, (MODE), (ARG0), (ARG1))
-#define gen_rtx_SIGN_EXTEND(MODE, ARG0) \
-  gen_rtx_fmt_e (SIGN_EXTEND, (MODE), (ARG0))
-#define gen_rtx_ZERO_EXTEND(MODE, ARG0) \
-  gen_rtx_fmt_e (ZERO_EXTEND, (MODE), (ARG0))
-#define gen_rtx_TRUNCATE(MODE, ARG0) \
-  gen_rtx_fmt_e (TRUNCATE, (MODE), (ARG0))
-#define gen_rtx_FLOAT_EXTEND(MODE, ARG0) \
-  gen_rtx_fmt_e (FLOAT_EXTEND, (MODE), (ARG0))
-#define gen_rtx_FLOAT_TRUNCATE(MODE, ARG0) \
-  gen_rtx_fmt_e (FLOAT_TRUNCATE, (MODE), (ARG0))
-#define gen_rtx_FLOAT(MODE, ARG0) \
-  gen_rtx_fmt_e (FLOAT, (MODE), (ARG0))
-#define gen_rtx_FIX(MODE, ARG0) \
-  gen_rtx_fmt_e (FIX, (MODE), (ARG0))
-#define gen_rtx_UNSIGNED_FLOAT(MODE, ARG0) \
-  gen_rtx_fmt_e (UNSIGNED_FLOAT, (MODE), (ARG0))
-#define gen_rtx_UNSIGNED_FIX(MODE, ARG0) \
-  gen_rtx_fmt_e (UNSIGNED_FIX, (MODE), (ARG0))
-#define gen_rtx_FRACT_CONVERT(MODE, ARG0) \
-  gen_rtx_fmt_e (FRACT_CONVERT, (MODE), (ARG0))
-#define gen_rtx_UNSIGNED_FRACT_CONVERT(MODE, ARG0) \
-  gen_rtx_fmt_e (UNSIGNED_FRACT_CONVERT, (MODE), (ARG0))
-#define gen_rtx_SAT_FRACT(MODE, ARG0) \
-  gen_rtx_fmt_e (SAT_FRACT, (MODE), (ARG0))
-#define gen_rtx_UNSIGNED_SAT_FRACT(MODE, ARG0) \
-  gen_rtx_fmt_e (UNSIGNED_SAT_FRACT, (MODE), (ARG0))
-#define gen_rtx_ABS(MODE, ARG0) \
-  gen_rtx_fmt_e (ABS, (MODE), (ARG0))
-#define gen_rtx_SQRT(MODE, ARG0) \
-  gen_rtx_fmt_e (SQRT, (MODE), (ARG0))
-#define gen_rtx_BSWAP(MODE, ARG0) \
-  gen_rtx_fmt_e (BSWAP, (MODE), (ARG0))
-#define gen_rtx_FFS(MODE, ARG0) \
-  gen_rtx_fmt_e (FFS, (MODE), (ARG0))
-#define gen_rtx_CLRSB(MODE, ARG0) \
-  gen_rtx_fmt_e (CLRSB, (MODE), (ARG0))
-#define gen_rtx_CLZ(MODE, ARG0) \
-  gen_rtx_fmt_e (CLZ, (MODE), (ARG0))
-#define gen_rtx_CTZ(MODE, ARG0) \
-  gen_rtx_fmt_e (CTZ, (MODE), (ARG0))
-#define gen_rtx_POPCOUNT(MODE, ARG0) \
-  gen_rtx_fmt_e (POPCOUNT, (MODE), (ARG0))
-#define gen_rtx_PARITY(MODE, ARG0) \
-  gen_rtx_fmt_e (PARITY, (MODE), (ARG0))
-#define gen_rtx_SIGN_EXTRACT(MODE, ARG0, ARG1, ARG2) \
-  gen_rtx_fmt_eee (SIGN_EXTRACT, (MODE), (ARG0), (ARG1), (ARG2))
-#define gen_rtx_ZERO_EXTRACT(MODE, ARG0, ARG1, ARG2) \
-  gen_rtx_fmt_eee (ZERO_EXTRACT, (MODE), (ARG0), (ARG1), (ARG2))
-#define gen_rtx_HIGH(MODE, ARG0) \
-  gen_rtx_fmt_e (HIGH, (MODE), (ARG0))
-#define gen_rtx_LO_SUM(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (LO_SUM, (MODE), (ARG0), (ARG1))
-#define gen_rtx_VEC_MERGE(MODE, ARG0, ARG1, ARG2) \
-  gen_rtx_fmt_eee (VEC_MERGE, (MODE), (ARG0), (ARG1), (ARG2))
-#define gen_rtx_VEC_SELECT(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (VEC_SELECT, (MODE), (ARG0), (ARG1))
-#define gen_rtx_VEC_CONCAT(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (VEC_CONCAT, (MODE), (ARG0), (ARG1))
-#define gen_rtx_VEC_DUPLICATE(MODE, ARG0) \
-  gen_rtx_fmt_e (VEC_DUPLICATE, (MODE), (ARG0))
-#define gen_rtx_SS_PLUS(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (SS_PLUS, (MODE), (ARG0), (ARG1))
-#define gen_rtx_US_PLUS(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (US_PLUS, (MODE), (ARG0), (ARG1))
-#define gen_rtx_SS_MINUS(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (SS_MINUS, (MODE), (ARG0), (ARG1))
-#define gen_rtx_SS_NEG(MODE, ARG0) \
-  gen_rtx_fmt_e (SS_NEG, (MODE), (ARG0))
-#define gen_rtx_US_NEG(MODE, ARG0) \
-  gen_rtx_fmt_e (US_NEG, (MODE), (ARG0))
-#define gen_rtx_SS_ABS(MODE, ARG0) \
-  gen_rtx_fmt_e (SS_ABS, (MODE), (ARG0))
-#define gen_rtx_SS_ASHIFT(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (SS_ASHIFT, (MODE), (ARG0), (ARG1))
-#define gen_rtx_US_ASHIFT(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (US_ASHIFT, (MODE), (ARG0), (ARG1))
-#define gen_rtx_US_MINUS(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ee (US_MINUS, (MODE), (ARG0), (ARG1))
-#define gen_rtx_SS_TRUNCATE(MODE, ARG0) \
-  gen_rtx_fmt_e (SS_TRUNCATE, (MODE), (ARG0))
-#define gen_rtx_US_TRUNCATE(MODE, ARG0) \
-  gen_rtx_fmt_e (US_TRUNCATE, (MODE), (ARG0))
-#define gen_rtx_FMA(MODE, ARG0, ARG1, ARG2) \
-  gen_rtx_fmt_eee (FMA, (MODE), (ARG0), (ARG1), (ARG2))
-#define gen_rtx_VAR_LOCATION(MODE, ARG0, ARG1, ARG2) \
-  gen_rtx_fmt_tei (VAR_LOCATION, (MODE), (ARG0), (ARG1), (ARG2))
-#define gen_rtx_DEBUG_IMPLICIT_PTR(MODE, ARG0) \
-  gen_rtx_fmt_t (DEBUG_IMPLICIT_PTR, (MODE), (ARG0))
-#define gen_rtx_ENTRY_VALUE(MODE) \
-  gen_rtx_fmt_0 (ENTRY_VALUE, (MODE))
-#define gen_rtx_DEBUG_PARAMETER_REF(MODE, ARG0) \
-  gen_rtx_fmt_t (DEBUG_PARAMETER_REF, (MODE), (ARG0))
-#define gen_rtx_MATCH_OPERAND(MODE, ARG0, ARG1, ARG2) \
-  gen_rtx_fmt_iss (MATCH_OPERAND, (MODE), (ARG0), (ARG1), (ARG2))
-#define gen_rtx_MATCH_SCRATCH(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_is (MATCH_SCRATCH, (MODE), (ARG0), (ARG1))
-#define gen_rtx_MATCH_OPERATOR(MODE, ARG0, ARG1, ARG2) \
-  gen_rtx_fmt_isE (MATCH_OPERATOR, (MODE), (ARG0), (ARG1), (ARG2))
-#define gen_rtx_MATCH_PARALLEL(MODE, ARG0, ARG1, ARG2) \
-  gen_rtx_fmt_isE (MATCH_PARALLEL, (MODE), (ARG0), (ARG1), (ARG2))
-#define gen_rtx_MATCH_DUP(MODE, ARG0) \
-  gen_rtx_fmt_i (MATCH_DUP, (MODE), (ARG0))
-#define gen_rtx_MATCH_OP_DUP(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_iE (MATCH_OP_DUP, (MODE), (ARG0), (ARG1))
-#define gen_rtx_MATCH_PAR_DUP(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_iE (MATCH_PAR_DUP, (MODE), (ARG0), (ARG1))
-#define gen_rtx_MATCH_CODE(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ss (MATCH_CODE, (MODE), (ARG0), (ARG1))
-#define gen_rtx_MATCH_TEST(MODE, ARG0) \
-  gen_rtx_fmt_s (MATCH_TEST, (MODE), (ARG0))
-#define gen_rtx_DEFINE_DELAY(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_eE (DEFINE_DELAY, (MODE), (ARG0), (ARG1))
-#define gen_rtx_DEFINE_PREDICATE(MODE, ARG0, ARG1, ARG2) \
-  gen_rtx_fmt_ses (DEFINE_PREDICATE, (MODE), (ARG0), (ARG1), (ARG2))
-#define gen_rtx_DEFINE_SPECIAL_PREDICATE(MODE, ARG0, ARG1, ARG2) \
-  gen_rtx_fmt_ses (DEFINE_SPECIAL_PREDICATE, (MODE), (ARG0), (ARG1), (ARG2))
-#define gen_rtx_DEFINE_REGISTER_CONSTRAINT(MODE, ARG0, ARG1, ARG2) \
-  gen_rtx_fmt_sss (DEFINE_REGISTER_CONSTRAINT, (MODE), (ARG0), (ARG1), (ARG2))
-#define gen_rtx_DEFINE_CONSTRAINT(MODE, ARG0, ARG1, ARG2) \
-  gen_rtx_fmt_sse (DEFINE_CONSTRAINT, (MODE), (ARG0), (ARG1), (ARG2))
-#define gen_rtx_DEFINE_MEMORY_CONSTRAINT(MODE, ARG0, ARG1, ARG2) \
-  gen_rtx_fmt_sse (DEFINE_MEMORY_CONSTRAINT, (MODE), (ARG0), (ARG1), (ARG2))
-#define gen_rtx_DEFINE_ADDRESS_CONSTRAINT(MODE, ARG0, ARG1, ARG2) \
-  gen_rtx_fmt_sse (DEFINE_ADDRESS_CONSTRAINT, (MODE), (ARG0), (ARG1), (ARG2))
-#define gen_rtx_EXCLUSION_SET(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ss (EXCLUSION_SET, (MODE), (ARG0), (ARG1))
-#define gen_rtx_PRESENCE_SET(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ss (PRESENCE_SET, (MODE), (ARG0), (ARG1))
-#define gen_rtx_FINAL_PRESENCE_SET(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ss (FINAL_PRESENCE_SET, (MODE), (ARG0), (ARG1))
-#define gen_rtx_ABSENCE_SET(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ss (ABSENCE_SET, (MODE), (ARG0), (ARG1))
-#define gen_rtx_FINAL_ABSENCE_SET(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ss (FINAL_ABSENCE_SET, (MODE), (ARG0), (ARG1))
-#define gen_rtx_DEFINE_AUTOMATON(MODE, ARG0) \
-  gen_rtx_fmt_s (DEFINE_AUTOMATON, (MODE), (ARG0))
-#define gen_rtx_AUTOMATA_OPTION(MODE, ARG0) \
-  gen_rtx_fmt_s (AUTOMATA_OPTION, (MODE), (ARG0))
-#define gen_rtx_DEFINE_RESERVATION(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ss (DEFINE_RESERVATION, (MODE), (ARG0), (ARG1))
-#define gen_rtx_DEFINE_INSN_RESERVATION(MODE, ARG0, ARG1, ARG2, ARG3) \
-  gen_rtx_fmt_sies (DEFINE_INSN_RESERVATION, (MODE), (ARG0), (ARG1), (ARG2), (ARG3))
-#define gen_rtx_DEFINE_ATTR(MODE, ARG0, ARG1, ARG2) \
-  gen_rtx_fmt_sse (DEFINE_ATTR, (MODE), (ARG0), (ARG1), (ARG2))
-#define gen_rtx_DEFINE_ENUM_ATTR(MODE, ARG0, ARG1, ARG2) \
-  gen_rtx_fmt_sse (DEFINE_ENUM_ATTR, (MODE), (ARG0), (ARG1), (ARG2))
-#define gen_rtx_ATTR(MODE, ARG0) \
-  gen_rtx_fmt_s (ATTR, (MODE), (ARG0))
-#define gen_rtx_SET_ATTR(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ss (SET_ATTR, (MODE), (ARG0), (ARG1))
-#define gen_rtx_SET_ATTR_ALTERNATIVE(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_sE (SET_ATTR_ALTERNATIVE, (MODE), (ARG0), (ARG1))
-#define gen_rtx_EQ_ATTR(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ss (EQ_ATTR, (MODE), (ARG0), (ARG1))
-#define gen_rtx_EQ_ATTR_ALT(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_ii (EQ_ATTR_ALT, (MODE), (ARG0), (ARG1))
-#define gen_rtx_ATTR_FLAG(MODE, ARG0) \
-  gen_rtx_fmt_s (ATTR_FLAG, (MODE), (ARG0))
-#define gen_rtx_COND(MODE, ARG0, ARG1) \
-  gen_rtx_fmt_Ee (COND, (MODE), (ARG0), (ARG1))
-#define gen_rtx_DEFINE_SUBST(MODE, ARG0, ARG1, ARG2, ARG3) \
-  gen_rtx_fmt_sEsE (DEFINE_SUBST, (MODE), (ARG0), (ARG1), (ARG2), (ARG3))
-#define gen_rtx_DEFINE_SUBST_ATTR(MODE, ARG0, ARG1, ARG2, ARG3) \
-  gen_rtx_fmt_ssss (DEFINE_SUBST_ATTR, (MODE), (ARG0), (ARG1), (ARG2), (ARG3))
-
-#endif /* GCC_GENRTL_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ggc.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ggc.h
deleted file mode 100644
index 55f3fe9..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ggc.h
+++ /dev/null
@@ -1,287 +0,0 @@
-/* Garbage collection for the GNU compiler.
-
-   Copyright (C) 1998-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_GGC_H
-#define GCC_GGC_H
-#include "statistics.h"
-
-/* Symbols are marked with `ggc' for `gcc gc' so as not to interfere with
-   an external gc library that might be linked in.  */
-
-/* Constants for general use.  */
-extern const char empty_string[];	/* empty string */
-
-/* Internal functions and data structures used by the GTY
-   machinery, including the generated gt*.[hc] files.  */
-
-#include "gtype-desc.h"
-
-/* One of these applies its third parameter (with cookie in the fourth
-   parameter) to each pointer in the object pointed to by the first
-   parameter, using the second parameter.  */
-typedef void (*gt_note_pointers) (void *, void *, gt_pointer_operator,
-				  void *);
-
-/* One of these is called before objects are re-ordered in memory.
-   The first parameter is the original object, the second is the
-   subobject that has had its pointers reordered, the third parameter
-   can compute the new values of a pointer when given the cookie in
-   the fourth parameter.  */
-typedef void (*gt_handle_reorder) (void *, void *, gt_pointer_operator,
-				   void *);
-
-/* Used by the gt_pch_n_* routines.  Register an object in the hash table.  */
-extern int gt_pch_note_object (void *, void *, gt_note_pointers);
-
-/* Used by the gt_pch_n_* routines.  Register that an object has a reorder
-   function.  */
-extern void gt_pch_note_reorder (void *, void *, gt_handle_reorder);
-
-/* Mark the object in the first parameter and anything it points to.  */
-typedef void (*gt_pointer_walker) (void *);
-
-/* Structures for the easy way to mark roots.
-   In an array, terminated by having base == NULL.  */
-struct ggc_root_tab {
-  void *base;
-  size_t nelt;
-  size_t stride;
-  gt_pointer_walker cb;
-  gt_pointer_walker pchw;
-};
-#define LAST_GGC_ROOT_TAB { NULL, 0, 0, NULL, NULL }
-/* Pointers to arrays of ggc_root_tab, terminated by NULL.  */
-extern const struct ggc_root_tab * const gt_ggc_rtab[];
-extern const struct ggc_root_tab * const gt_ggc_deletable_rtab[];
-extern const struct ggc_root_tab * const gt_pch_cache_rtab[];
-extern const struct ggc_root_tab * const gt_pch_scalar_rtab[];
-
-/* Structure for hash table cache marking.  */
-struct htab;
-struct ggc_cache_tab {
-  struct htab * *base;
-  size_t nelt;
-  size_t stride;
-  gt_pointer_walker cb;
-  gt_pointer_walker pchw;
-  int (*marked_p) (const void *);
-};
-#define LAST_GGC_CACHE_TAB { NULL, 0, 0, NULL, NULL, NULL }
-/* Pointers to arrays of ggc_cache_tab, terminated by NULL.  */
-extern const struct ggc_cache_tab * const gt_ggc_cache_rtab[];
-
-/* If EXPR is not NULL and previously unmarked, mark it and evaluate
-   to true.  Otherwise evaluate to false.  */
-#define ggc_test_and_set_mark(EXPR) \
-  ((EXPR) != NULL && ((void *) (EXPR)) != (void *) 1 && ! ggc_set_mark (EXPR))
-
-#define ggc_mark(EXPR)				\
-  do {						\
-    const void *const a__ = (EXPR);		\
-    if (a__ != NULL && a__ != (void *) 1)	\
-      ggc_set_mark (a__);			\
-  } while (0)
-
-/* Actually set the mark on a particular region of memory, but don't
-   follow pointers.  This function is called by ggc_mark_*.  It
-   returns zero if the object was not previously marked; nonzero if
-   the object was already marked, or if, for any other reason,
-   pointers in this data structure should not be traversed.  */
-extern int ggc_set_mark	(const void *);
-
-/* Return 1 if P has been marked, zero otherwise.
-   P must have been allocated by the GC allocator; it mustn't point to
-   static objects, stack variables, or memory allocated with malloc.  */
-extern int ggc_marked_p	(const void *);
-
-/* PCH and GGC handling for strings, mostly trivial.  */
-extern void gt_pch_n_S (const void *);
-extern void gt_ggc_m_S (const void *);
-
-/* End of GTY machinery API.  */
-
-/* Initialize the string pool.  */
-extern void init_stringpool (void);
-
-/* Initialize the garbage collector.  */
-extern void init_ggc (void);
-
-/* When true, identifier nodes are considered as GC roots.  When
-   false, identifier nodes are treated like any other GC-allocated
-   object, and the identifier hash table is treated as a weak
-   hash.  */
-extern bool ggc_protect_identifiers;
-
-/* Write out all GCed objects to F.  */
-extern void gt_pch_save (FILE *f);
-
-
-/* Allocation.  */
-
-/* The internal primitive.  */
-extern void *ggc_internal_alloc_stat (size_t MEM_STAT_DECL)
-  ATTRIBUTE_MALLOC;
-
-extern size_t ggc_round_alloc_size (size_t requested_size);
-
-#define ggc_internal_alloc(s) ggc_internal_alloc_stat (s MEM_STAT_INFO)
-
-/* Allocates cleared memory.  */
-extern void *ggc_internal_cleared_alloc_stat (size_t MEM_STAT_DECL)
-  ATTRIBUTE_MALLOC;
-#define ggc_internal_cleared_alloc(s) ggc_internal_cleared_alloc_stat (s MEM_STAT_INFO)
-
-/* Resize a block.  */
-extern void *ggc_realloc_stat (void *, size_t MEM_STAT_DECL);
-
-/* Free a block.  To be used when known for certain it's not reachable.  */
-extern void ggc_free (void *);
-
-extern void dump_ggc_loc_statistics (bool);
-
-/* Reallocators.  */
-#define GGC_RESIZEVEC(T, P, N) \
-    ((T *) ggc_realloc_stat ((P), (N) * sizeof (T) MEM_STAT_INFO))
-
-#define GGC_RESIZEVAR(T, P, N)                          \
-    ((T *) ggc_realloc_stat ((P), (N) MEM_STAT_INFO))
-
-static inline void *
-ggc_internal_vec_alloc_stat (size_t s, size_t c MEM_STAT_DECL)
-{
-    return ggc_internal_alloc_stat (c * s PASS_MEM_STAT);
-}
-
-static inline void *
-ggc_internal_cleared_vec_alloc_stat (size_t s, size_t c MEM_STAT_DECL)
-{
-    return ggc_internal_cleared_alloc_stat (c * s PASS_MEM_STAT);
-}
-
-#define ggc_internal_cleared_vec_alloc(s, c) \
-    (ggc_internal_cleared_vec_alloc_stat ((s), (c) MEM_STAT_INFO))
-
-static inline void *
-ggc_alloc_atomic_stat (size_t s MEM_STAT_DECL)
-{
-    return ggc_internal_alloc_stat (s PASS_MEM_STAT);
-}
-
-#define ggc_alloc_atomic(S)  (ggc_alloc_atomic_stat ((S) MEM_STAT_INFO))
-
-#define ggc_alloc_cleared_atomic(S)             \
-    (ggc_internal_cleared_alloc_stat ((S) MEM_STAT_INFO))
-
-extern void *ggc_cleared_alloc_htab_ignore_args (size_t, size_t)
-  ATTRIBUTE_MALLOC;
-
-extern void *ggc_cleared_alloc_ptr_array_two_args (size_t, size_t)
-  ATTRIBUTE_MALLOC;
-
-#define htab_create_ggc(SIZE, HASH, EQ, DEL) \
-  htab_create_typed_alloc (SIZE, HASH, EQ, DEL,	\
-			   ggc_cleared_alloc_htab_ignore_args,		\
-			   ggc_cleared_alloc_ptr_array_two_args,	\
-			   ggc_free)
-
-#define splay_tree_new_ggc(COMPARE, ALLOC_TREE, ALLOC_NODE)		     \
-  splay_tree_new_typed_alloc (COMPARE, NULL, NULL, &ALLOC_TREE, &ALLOC_NODE, \
-			      &ggc_splay_dont_free, NULL)
-
-extern void *ggc_splay_alloc (int, void *)
-  ATTRIBUTE_MALLOC;
-
-extern void ggc_splay_dont_free (void *, void *);
-
-/* Allocate a gc-able string, and fill it with LENGTH bytes from CONTENTS.
-   If LENGTH is -1, then CONTENTS is assumed to be a
-   null-terminated string and the memory sized accordingly.  */
-extern const char *ggc_alloc_string_stat (const char *contents, int length
-                                          MEM_STAT_DECL);
-
-#define ggc_alloc_string(c, l) ggc_alloc_string_stat (c, l MEM_STAT_INFO)
-
-/* Make a copy of S, in GC-able memory.  */
-#define ggc_strdup(S) ggc_alloc_string_stat ((S), -1 MEM_STAT_INFO)
-
-/* Invoke the collector.  Garbage collection occurs only when this
-   function is called, not during allocations.  */
-extern void ggc_collect	(void);
-
-/* Register an additional root table.  This can be useful for some
-   plugins.  Does nothing if the passed pointer is NULL. */
-extern void ggc_register_root_tab (const struct ggc_root_tab *);
-
-/* Register an additional cache table.  This can be useful for some
-   plugins.  Does nothing if the passed pointer is NULL. */
-extern void ggc_register_cache_tab (const struct ggc_cache_tab *);
-
-/* Read objects previously saved with gt_pch_save from F.  */
-extern void gt_pch_restore (FILE *f);
-
-/* Statistics.  */
-
-/* Print allocation statistics.  */
-extern void ggc_print_statistics (void);
-
-extern void stringpool_statistics (void);
-
-/* Heuristics.  */
-extern void init_ggc_heuristics (void);
-
-#define ggc_alloc_rtvec_sized(NELT)				\
-  ggc_alloc_rtvec_def (sizeof (struct rtvec_def)		\
-		       + ((NELT) - 1) * sizeof (rtx))		\
-
-/* Memory statistics passing versions of some allocators.  Too few of them to
-   make gengtype produce them, so just define the needed ones here.  */
-static inline struct rtx_def *
-ggc_alloc_rtx_def_stat (size_t s MEM_STAT_DECL)
-{
-  return (struct rtx_def *) ggc_internal_alloc_stat (s PASS_MEM_STAT);
-}
-
-static inline union tree_node *
-ggc_alloc_tree_node_stat (size_t s MEM_STAT_DECL)
-{
-  return (union tree_node *) ggc_internal_alloc_stat (s PASS_MEM_STAT);
-}
-
-static inline union tree_node *
-ggc_alloc_cleared_tree_node_stat (size_t s MEM_STAT_DECL)
-{
-  return (union tree_node *) ggc_internal_cleared_alloc_stat (s PASS_MEM_STAT);
-}
-
-static inline struct gimple_statement_base *
-ggc_alloc_cleared_gimple_statement_stat (size_t s MEM_STAT_DECL)
-{
-  return (struct gimple_statement_base *)
-    ggc_internal_cleared_alloc_stat (s PASS_MEM_STAT);
-}
-
-static inline struct simd_clone *
-ggc_alloc_cleared_simd_clone_stat (size_t s MEM_STAT_DECL)
-{
-  return (struct simd_clone *)
-    ggc_internal_cleared_alloc_stat (s PASS_MEM_STAT);
-}
-
-#endif
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-builder.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-builder.h
deleted file mode 100644
index 1b5afdc..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-builder.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Header file for high level statement building routines.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-
-#ifndef GCC_GIMPLE_BUILDER_H
-#define GCC_GIMPLE_BUILDER_H
-
-gimple build_assign (enum tree_code, tree, int, tree lhs = NULL_TREE);
-gimple build_assign (enum tree_code, gimple, int, tree lhs = NULL_TREE);
-gimple build_assign (enum tree_code, tree, tree, tree lhs = NULL_TREE);
-gimple build_assign (enum tree_code, gimple, tree, tree lhs = NULL_TREE);
-gimple build_assign (enum tree_code, tree, gimple, tree lhs = NULL_TREE);
-gimple build_assign (enum tree_code, gimple, gimple, tree lhs = NULL_TREE);
-gimple build_type_cast (tree, tree, tree lhs = NULL_TREE);
-gimple build_type_cast (tree, gimple, tree lhs = NULL_TREE);
-
-#endif /* GCC_GIMPLE_BUILDER_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-expr.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-expr.h
deleted file mode 100644
index 3b6cda8..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-expr.h
+++ /dev/null
@@ -1,180 +0,0 @@
-/* Header file for gimple decl, type and expressions.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_GIMPLE_EXPR_H
-#define GCC_GIMPLE_EXPR_H
-
-extern bool useless_type_conversion_p (tree, tree);
-
-
-extern void gimple_set_body (tree, gimple_seq);
-extern gimple_seq gimple_body (tree);
-extern bool gimple_has_body_p (tree);
-extern const char *gimple_decl_printable_name (tree, int);
-extern tree copy_var_decl (tree, tree, tree);
-extern bool gimple_can_coalesce_p (tree, tree);
-extern tree create_tmp_var_name (const char *);
-extern tree create_tmp_var_raw (tree, const char *);
-extern tree create_tmp_var (tree, const char *);
-extern tree create_tmp_reg (tree, const char *);
-extern tree create_tmp_reg_fn (struct function *, tree, const char *);
-
-
-extern void extract_ops_from_tree_1 (tree, enum tree_code *, tree *, tree *,
-				     tree *);
-extern void gimple_cond_get_ops_from_tree (tree, enum tree_code *, tree *,
-					   tree *);
-extern bool is_gimple_lvalue (tree);
-extern bool is_gimple_condexpr (tree);
-extern bool is_gimple_address (const_tree);
-extern bool is_gimple_invariant_address (const_tree);
-extern bool is_gimple_ip_invariant_address (const_tree);
-extern bool is_gimple_min_invariant (const_tree);
-extern bool is_gimple_ip_invariant (const_tree);
-extern bool is_gimple_reg (tree);
-extern bool is_gimple_val (tree);
-extern bool is_gimple_asm_val (tree);
-extern bool is_gimple_min_lval (tree);
-extern bool is_gimple_call_addr (tree);
-extern bool is_gimple_mem_ref_addr (tree);
-extern void mark_addressable (tree);
-extern bool is_gimple_reg_rhs (tree);
-
-/* Return true if a conversion from either type of TYPE1 and TYPE2
-   to the other is not required.  Otherwise return false.  */
-
-static inline bool
-types_compatible_p (tree type1, tree type2)
-{
-  return (type1 == type2
-	  || (useless_type_conversion_p (type1, type2)
-	      && useless_type_conversion_p (type2, type1)));
-}
-
-/* Return true if TYPE is a suitable type for a scalar register variable.  */
-
-static inline bool
-is_gimple_reg_type (tree type)
-{
-  return !AGGREGATE_TYPE_P (type);
-}
-
-/* Return true if T is a variable.  */
-
-static inline bool
-is_gimple_variable (tree t)
-{
-  return (TREE_CODE (t) == VAR_DECL
-	  || TREE_CODE (t) == PARM_DECL
-	  || TREE_CODE (t) == RESULT_DECL
-	  || TREE_CODE (t) == SSA_NAME);
-}
-
-/*  Return true if T is a GIMPLE identifier (something with an address).  */
-
-static inline bool
-is_gimple_id (tree t)
-{
-  return (is_gimple_variable (t)
-	  || TREE_CODE (t) == FUNCTION_DECL
-	  || TREE_CODE (t) == LABEL_DECL
-	  || TREE_CODE (t) == CONST_DECL
-	  /* Allow string constants, since they are addressable.  */
-	  || TREE_CODE (t) == STRING_CST);
-}
-
-/* Return true if OP, an SSA name or a DECL is a virtual operand.  */
-
-static inline bool
-virtual_operand_p (tree op)
-{
-  if (TREE_CODE (op) == SSA_NAME)
-    {
-      op = SSA_NAME_VAR (op);
-      if (!op)
-	return false;
-    }
-
-  if (TREE_CODE (op) == VAR_DECL)
-    return VAR_DECL_IS_VIRTUAL_OPERAND (op);
-
-  return false;
-}
-
-/*  Return true if T is something whose address can be taken.  */
-
-static inline bool
-is_gimple_addressable (tree t)
-{
-  return (is_gimple_id (t) || handled_component_p (t)
-	  || TREE_CODE (t) == MEM_REF);
-}
-
-/* Return true if T is a valid gimple constant.  */
-
-static inline bool
-is_gimple_constant (const_tree t)
-{
-  switch (TREE_CODE (t))
-    {
-    case INTEGER_CST:
-    case REAL_CST:
-    case FIXED_CST:
-    case STRING_CST:
-    case COMPLEX_CST:
-    case VECTOR_CST:
-      return true;
-
-    default:
-      return false;
-    }
-}
-
-/* A wrapper around extract_ops_from_tree_1, for callers which expect
-   to see only a maximum of two operands.  */
-
-static inline void
-extract_ops_from_tree (tree expr, enum tree_code *code, tree *op0,
-		       tree *op1)
-{
-  tree op2;
-  extract_ops_from_tree_1 (expr, code, op0, op1, &op2);
-  gcc_assert (op2 == NULL_TREE);
-}
-
-/* Given a valid GIMPLE_CALL function address return the FUNCTION_DECL
-   associated with the callee if known.  Otherwise return NULL_TREE.  */
-
-static inline tree
-gimple_call_addr_fndecl (const_tree fn)
-{
-  if (fn && TREE_CODE (fn) == ADDR_EXPR)
-    {
-      tree fndecl = TREE_OPERAND (fn, 0);
-      if (TREE_CODE (fndecl) == MEM_REF
-	  && TREE_CODE (TREE_OPERAND (fndecl, 0)) == ADDR_EXPR
-	  && integer_zerop (TREE_OPERAND (fndecl, 1)))
-	fndecl = TREE_OPERAND (TREE_OPERAND (fndecl, 0), 0);
-      if (TREE_CODE (fndecl) == FUNCTION_DECL)
-	return fndecl;
-    }
-  return NULL_TREE;
-}
-
-#endif /* GCC_GIMPLE_EXPR_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-fold.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-fold.h
deleted file mode 100644
index 6b43066..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-fold.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Gimple folding definitions.
-
-   Copyright (C) 2011-2014 Free Software Foundation, Inc.
-   Contributed by Richard Guenther <rguenther@suse.de>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_GIMPLE_FOLD_H
-#define GCC_GIMPLE_FOLD_H
-
-extern tree canonicalize_constructor_val (tree, tree);
-extern tree get_symbol_constant_value (tree);
-extern void gimplify_and_update_call_from_tree (gimple_stmt_iterator *, tree);
-extern tree gimple_fold_builtin (gimple);
-extern bool fold_stmt (gimple_stmt_iterator *);
-extern bool fold_stmt_inplace (gimple_stmt_iterator *);
-extern tree maybe_fold_and_comparisons (enum tree_code, tree, tree, 
-					enum tree_code, tree, tree);
-extern tree maybe_fold_or_comparisons (enum tree_code, tree, tree,
-				       enum tree_code, tree, tree);
-extern tree gimple_fold_stmt_to_constant_1 (gimple, tree (*) (tree));
-extern tree gimple_fold_stmt_to_constant (gimple, tree (*) (tree));
-extern tree fold_const_aggregate_ref_1 (tree, tree (*) (tree));
-extern tree fold_const_aggregate_ref (tree);
-extern tree gimple_get_virt_method_for_binfo (HOST_WIDE_INT, tree,
-					      bool *can_refer = NULL);
-extern tree gimple_get_virt_method_for_vtable (HOST_WIDE_INT, tree,
-					       unsigned HOST_WIDE_INT,
-					       bool *can_refer = NULL);
-extern bool gimple_val_nonnegative_real_p (tree);
-extern tree gimple_fold_indirect_ref (tree);
-extern bool arith_code_with_undefined_signed_overflow (tree_code);
-extern gimple_seq rewrite_to_defined_overflow (gimple);
-
-#endif  /* GCC_GIMPLE_FOLD_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-iterator.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-iterator.h
deleted file mode 100644
index c35dc81..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-iterator.h
+++ /dev/null
@@ -1,298 +0,0 @@
-/* Header file for gimple iterators.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_GIMPLE_ITERATOR_H
-#define GCC_GIMPLE_ITERATOR_H
-
-/* Iterator object for GIMPLE statement sequences.  */
-
-struct gimple_stmt_iterator
-{
-  /* Sequence node holding the current statement.  */
-  gimple_seq_node ptr;
-
-  /* Sequence and basic block holding the statement.  These fields
-     are necessary to handle edge cases such as when statement is
-     added to an empty basic block or when the last statement of a
-     block/sequence is removed.  */
-  gimple_seq *seq;
-  basic_block bb;
-};
- 
-enum gsi_iterator_update
-{
-  GSI_NEW_STMT,		/* Only valid when single statement is added, move
-			   iterator to it.  */
-  GSI_SAME_STMT,	/* Leave the iterator at the same statement.  */
-  GSI_CONTINUE_LINKING	/* Move iterator to whatever position is suitable
-			   for linking other statements in the same
-			   direction.  */
-};
-
-extern void gsi_insert_seq_before_without_update (gimple_stmt_iterator *,
-						  gimple_seq,
-						  enum gsi_iterator_update);
-extern void gsi_insert_seq_before (gimple_stmt_iterator *, gimple_seq,
-				   enum gsi_iterator_update);
-extern void gsi_insert_seq_after_without_update (gimple_stmt_iterator *,
-						 gimple_seq,
-						 enum gsi_iterator_update);
-extern void gsi_insert_seq_after (gimple_stmt_iterator *, gimple_seq,
-				  enum gsi_iterator_update);
-extern gimple_seq gsi_split_seq_after (gimple_stmt_iterator);
-extern void gsi_set_stmt (gimple_stmt_iterator *, gimple);
-extern void gsi_split_seq_before (gimple_stmt_iterator *, gimple_seq *);
-extern void gsi_replace (gimple_stmt_iterator *, gimple, bool);
-extern void gsi_replace_with_seq (gimple_stmt_iterator *, gimple_seq, bool);
-extern void gsi_insert_before_without_update (gimple_stmt_iterator *, gimple,
-					      enum gsi_iterator_update);
-extern void gsi_insert_before (gimple_stmt_iterator *, gimple,
-			       enum gsi_iterator_update);
-extern void gsi_insert_after_without_update (gimple_stmt_iterator *, gimple,
-					     enum gsi_iterator_update);
-extern void gsi_insert_after (gimple_stmt_iterator *, gimple,
-			      enum gsi_iterator_update);
-extern bool gsi_remove (gimple_stmt_iterator *, bool);
-extern gimple_stmt_iterator gsi_for_stmt (gimple);
-extern void gsi_move_after (gimple_stmt_iterator *, gimple_stmt_iterator *);
-extern void gsi_move_before (gimple_stmt_iterator *, gimple_stmt_iterator *);
-extern void gsi_move_to_bb_end (gimple_stmt_iterator *, basic_block);
-extern void gsi_insert_on_edge (edge, gimple);
-extern void gsi_insert_seq_on_edge (edge, gimple_seq);
-extern basic_block gsi_insert_on_edge_immediate (edge, gimple);
-extern basic_block gsi_insert_seq_on_edge_immediate (edge, gimple_seq);
-extern void gsi_commit_edge_inserts (void);
-extern void gsi_commit_one_edge_insert (edge, basic_block *);
-extern gimple_stmt_iterator gsi_start_phis (basic_block);
-
-/* Return a new iterator pointing to GIMPLE_SEQ's first statement.  */
-
-static inline gimple_stmt_iterator
-gsi_start_1 (gimple_seq *seq)
-{
-  gimple_stmt_iterator i;
-
-  i.ptr = gimple_seq_first (*seq);
-  i.seq = seq;
-  i.bb = i.ptr ? gimple_bb (i.ptr) : NULL;
-
-  return i;
-}
-
-#define gsi_start(x) gsi_start_1 (&(x))
-
-static inline gimple_stmt_iterator
-gsi_none (void)
-{
-  gimple_stmt_iterator i;
-  i.ptr = NULL;
-  i.seq = NULL;
-  i.bb = NULL;
-  return i;
-}
-
-/* Return a new iterator pointing to the first statement in basic block BB.  */
-
-static inline gimple_stmt_iterator
-gsi_start_bb (basic_block bb)
-{
-  gimple_stmt_iterator i;
-  gimple_seq *seq;
-
-  seq = bb_seq_addr (bb);
-  i.ptr = gimple_seq_first (*seq);
-  i.seq = seq;
-  i.bb = bb;
-
-  return i;
-}
-
-/* Return a new iterator initially pointing to GIMPLE_SEQ's last statement.  */
-
-static inline gimple_stmt_iterator
-gsi_last_1 (gimple_seq *seq)
-{
-  gimple_stmt_iterator i;
-
-  i.ptr = gimple_seq_last (*seq);
-  i.seq = seq;
-  i.bb = i.ptr ? gimple_bb (i.ptr) : NULL;
-
-  return i;
-}
-
-#define gsi_last(x) gsi_last_1 (&(x))
-
-/* Return a new iterator pointing to the last statement in basic block BB.  */
-
-static inline gimple_stmt_iterator
-gsi_last_bb (basic_block bb)
-{
-  gimple_stmt_iterator i;
-  gimple_seq *seq;
-
-  seq = bb_seq_addr (bb);
-  i.ptr = gimple_seq_last (*seq);
-  i.seq = seq;
-  i.bb = bb;
-
-  return i;
-}
-
-/* Return true if I is at the end of its sequence.  */
-
-static inline bool
-gsi_end_p (gimple_stmt_iterator i)
-{
-  return i.ptr == NULL;
-}
-
-/* Return true if I is one statement before the end of its sequence.  */
-
-static inline bool
-gsi_one_before_end_p (gimple_stmt_iterator i)
-{
-  return i.ptr != NULL && i.ptr->next == NULL;
-}
-
-/* Advance the iterator to the next gimple statement.  */
-
-static inline void
-gsi_next (gimple_stmt_iterator *i)
-{
-  i->ptr = i->ptr->next;
-}
-
-/* Advance the iterator to the previous gimple statement.  */
-
-static inline void
-gsi_prev (gimple_stmt_iterator *i)
-{
-  gimple prev = i->ptr->prev;
-  if (prev->next)
-    i->ptr = prev;
-  else
-    i->ptr = NULL;
-}
-
-/* Return the current stmt.  */
-
-static inline gimple
-gsi_stmt (gimple_stmt_iterator i)
-{
-  return i.ptr;
-}
-
-/* Return a block statement iterator that points to the first non-label
-   statement in block BB.  */
-
-static inline gimple_stmt_iterator
-gsi_after_labels (basic_block bb)
-{
-  gimple_stmt_iterator gsi = gsi_start_bb (bb);
-
-  while (!gsi_end_p (gsi) && gimple_code (gsi_stmt (gsi)) == GIMPLE_LABEL)
-    gsi_next (&gsi);
-
-  return gsi;
-}
-
-/* Advance the iterator to the next non-debug gimple statement.  */
-
-static inline void
-gsi_next_nondebug (gimple_stmt_iterator *i)
-{
-  do
-    {
-      gsi_next (i);
-    }
-  while (!gsi_end_p (*i) && is_gimple_debug (gsi_stmt (*i)));
-}
-
-/* Advance the iterator to the next non-debug gimple statement.  */
-
-static inline void
-gsi_prev_nondebug (gimple_stmt_iterator *i)
-{
-  do
-    {
-      gsi_prev (i);
-    }
-  while (!gsi_end_p (*i) && is_gimple_debug (gsi_stmt (*i)));
-}
-
-/* Return a new iterator pointing to the first non-debug statement in
-   basic block BB.  */
-
-static inline gimple_stmt_iterator
-gsi_start_nondebug_bb (basic_block bb)
-{
-  gimple_stmt_iterator i = gsi_start_bb (bb);
-
-  if (!gsi_end_p (i) && is_gimple_debug (gsi_stmt (i)))
-    gsi_next_nondebug (&i);
-
-  return i;
-}
-
-/* Return a new iterator pointing to the first non-debug non-label statement in
-   basic block BB.  */
-
-static inline gimple_stmt_iterator
-gsi_start_nondebug_after_labels_bb (basic_block bb)
-{
-  gimple_stmt_iterator i = gsi_after_labels (bb);
-
-  if (!gsi_end_p (i) && is_gimple_debug (gsi_stmt (i)))
-    gsi_next_nondebug (&i);
-
-  return i;
-}
-
-/* Return a new iterator pointing to the last non-debug statement in
-   basic block BB.  */
-
-static inline gimple_stmt_iterator
-gsi_last_nondebug_bb (basic_block bb)
-{
-  gimple_stmt_iterator i = gsi_last_bb (bb);
-
-  if (!gsi_end_p (i) && is_gimple_debug (gsi_stmt (i)))
-    gsi_prev_nondebug (&i);
-
-  return i;
-}
-
-/* Return the basic block associated with this iterator.  */
-
-static inline basic_block
-gsi_bb (gimple_stmt_iterator i)
-{
-  return i.bb;
-}
-
-/* Return the sequence associated with this iterator.  */
-
-static inline gimple_seq
-gsi_seq (gimple_stmt_iterator i)
-{
-  return *i.seq;
-}
-
-#endif /* GCC_GIMPLE_ITERATOR_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-low.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-low.h
deleted file mode 100644
index a4efa50..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-low.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Header file for gimple lowering pass.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_GIMPLE_LOW_H
-#define GCC_GIMPLE_LOW_H
-
-extern bool gimple_stmt_may_fallthru (gimple);
-extern bool gimple_seq_may_fallthru (gimple_seq);
-extern void record_vars_into (tree, tree);
-extern void record_vars (tree);
-
-#endif /* GCC_GIMPLE_LOW_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-pretty-print.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-pretty-print.h
deleted file mode 100644
index 37db243..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-pretty-print.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Various declarations for pretty formatting of GIMPLE statements and
-   expressions.
-   Copyright (C) 2000-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_GIMPLE_PRETTY_PRINT_H
-#define GCC_GIMPLE_PRETTY_PRINT_H
-
-#include "pretty-print.h"
-#include "tree-pretty-print.h"
-
-/* In gimple-pretty-print.c  */
-extern void debug_gimple_stmt (gimple);
-extern void debug_gimple_seq (gimple_seq);
-extern void print_gimple_seq (FILE *, gimple_seq, int, int);
-extern void print_gimple_stmt (FILE *, gimple, int, int);
-extern void debug (gimple_statement_base &ref);
-extern void debug (gimple_statement_base *ptr);
-extern void print_gimple_expr (FILE *, gimple, int, int);
-extern void pp_gimple_stmt_1 (pretty_printer *, gimple, int, int);
-extern void gimple_dump_bb (FILE *, basic_block, int, int);
-extern void gimple_dump_bb_for_graph (pretty_printer *, basic_block);
-
-#endif /* ! GCC_GIMPLE_PRETTY_PRINT_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-ssa.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-ssa.h
deleted file mode 100644
index 8bcbf67..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-ssa.h
+++ /dev/null
@@ -1,170 +0,0 @@
-/* Header file for routines that straddle the border between GIMPLE and
-   SSA in gimple.
-   Copyright (C) 2009-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_GIMPLE_SSA_H
-#define GCC_GIMPLE_SSA_H
-
-#include "tree-ssa-operands.h"
-
-/* This structure is used to map a gimple statement to a label,
-   or list of labels to represent transaction restart.  */
-
-struct GTY(()) tm_restart_node {
-  gimple stmt;
-  tree label_or_list;
-};
-
-/* Gimple dataflow datastructure. All publicly available fields shall have
-   gimple_ accessor defined, all publicly modifiable fields should have
-   gimple_set accessor.  */
-struct GTY(()) gimple_df {
-  /* A vector of all the noreturn calls passed to modify_stmt.
-     cleanup_control_flow uses it to detect cases where a mid-block
-     indirect call has been turned into a noreturn call.  When this
-     happens, all the instructions after the call are no longer
-     reachable and must be deleted as dead.  */
-  vec<gimple, va_gc> *modified_noreturn_calls;
-
-  /* Array of all SSA_NAMEs used in the function.  */
-  vec<tree, va_gc> *ssa_names;
-
-  /* Artificial variable used for the virtual operand FUD chain.  */
-  tree vop;
-
-  /* The PTA solution for the ESCAPED artificial variable.  */
-  struct pt_solution escaped;
-
-  /* A map of decls to artificial ssa-names that point to the partition
-     of the decl.  */
-  struct pointer_map_t * GTY((skip(""))) decls_to_pointers;
-
-  /* Free list of SSA_NAMEs.  */
-  vec<tree, va_gc> *free_ssanames;
-
-  /* Hashtable holding definition for symbol.  If this field is not NULL, it
-     means that the first reference to this variable in the function is a
-     USE or a VUSE.  In those cases, the SSA renamer creates an SSA name
-     for this variable with an empty defining statement.  */
-  htab_t GTY((param_is (union tree_node))) default_defs;
-
-  /* True if there are any symbols that need to be renamed.  */
-  unsigned int ssa_renaming_needed : 1;
-
-  /* True if all virtual operands need to be renamed.  */
-  unsigned int rename_vops : 1;
-
-  /* True if the code is in ssa form.  */
-  unsigned int in_ssa_p : 1;
-
-  /* True if IPA points-to information was computed for this function.  */
-  unsigned int ipa_pta : 1;
-
-  struct ssa_operands ssa_operands;
-
-  /* Map gimple stmt to tree label (or list of labels) for transaction
-     restart and abort.  */
-  htab_t GTY ((param_is (struct tm_restart_node))) tm_restart;
-};
-
-
-/* Return true when gimple SSA form was built.
-   gimple_in_ssa_p is queried by gimplifier in various early stages before SSA
-   infrastructure is initialized.  Check for presence of the datastructures
-   at first place.  */
-static inline bool
-gimple_in_ssa_p (const struct function *fun)
-{
-  return fun && fun->gimple_df && fun->gimple_df->in_ssa_p;
-}
-
-/* Artificial variable used for the virtual operand FUD chain.  */
-static inline tree
-gimple_vop (const struct function *fun)
-{
-  gcc_checking_assert (fun && fun->gimple_df);
-  return fun->gimple_df->vop;
-}
-
-/* Return the set of VUSE operand for statement G.  */
-
-static inline use_operand_p
-gimple_vuse_op (const_gimple g)
-{
-  struct use_optype_d *ops;
-  const gimple_statement_with_memory_ops *mem_ops_stmt =
-     dyn_cast <const gimple_statement_with_memory_ops> (g);
-  if (!mem_ops_stmt)
-    return NULL_USE_OPERAND_P;
-  ops = mem_ops_stmt->use_ops;
-  if (ops
-      && USE_OP_PTR (ops)->use == &mem_ops_stmt->vuse)
-    return USE_OP_PTR (ops);
-  return NULL_USE_OPERAND_P;
-}
-
-/* Return the set of VDEF operand for statement G.  */
-
-static inline def_operand_p
-gimple_vdef_op (gimple g)
-{
-  gimple_statement_with_memory_ops *mem_ops_stmt =
-     dyn_cast <gimple_statement_with_memory_ops> (g);
-  if (!mem_ops_stmt)
-    return NULL_DEF_OPERAND_P;
-  if (mem_ops_stmt->vdef)
-    return &mem_ops_stmt->vdef;
-  return NULL_DEF_OPERAND_P;
-}
-
-/* Mark statement S as modified, and update it.  */
-
-static inline void
-update_stmt (gimple s)
-{
-  if (gimple_has_ops (s))
-    {
-      gimple_set_modified (s, true);
-      update_stmt_operands (cfun, s);
-    }
-}
-
-/* Update statement S if it has been optimized.  */
-
-static inline void
-update_stmt_if_modified (gimple s)
-{
-  if (gimple_modified_p (s))
-    update_stmt_operands (cfun, s);
-}
-
-/* Mark statement S as modified, and update it.  */
-
-static inline void
-update_stmt_fn (struct function *fn, gimple s)
-{
-  if (gimple_has_ops (s))
-    {
-      gimple_set_modified (s, true);
-      update_stmt_operands (fn, s);
-    }
-}
-
-
-#endif /* GCC_GIMPLE_SSA_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-walk.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-walk.h
deleted file mode 100644
index 555eb18..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple-walk.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/* Header file for gimple statement walk support.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_GIMPLE_WALK_H
-#define GCC_GIMPLE_WALK_H
-
-/* Convenience routines to walk all statements of a gimple function.
-   Note that this is useful exclusively before the code is converted
-   into SSA form.  Once the program is in SSA form, the standard
-   operand interface should be used to analyze/modify statements.  */
-struct walk_stmt_info
-{
-  /* Points to the current statement being walked.  */
-  gimple_stmt_iterator gsi;
-
-  /* Additional data that the callback functions may want to carry
-     through the recursion.  */
-  void *info;
-
-  /* Pointer map used to mark visited tree nodes when calling
-     walk_tree on each operand.  If set to NULL, duplicate tree nodes
-     will be visited more than once.  */
-  struct pointer_set_t *pset;
-
-  /* Operand returned by the callbacks.  This is set when calling
-     walk_gimple_seq.  If the walk_stmt_fn or walk_tree_fn callback
-     returns non-NULL, this field will contain the tree returned by
-     the last callback.  */
-  tree callback_result;
-
-  /* Indicates whether the operand being examined may be replaced
-     with something that matches is_gimple_val (if true) or something
-     slightly more complicated (if false).  "Something" technically
-     means the common subset of is_gimple_lvalue and is_gimple_rhs,
-     but we never try to form anything more complicated than that, so
-     we don't bother checking.
-
-     Also note that CALLBACK should update this flag while walking the
-     sub-expressions of a statement.  For instance, when walking the
-     statement 'foo (&var)', the flag VAL_ONLY will initially be set
-     to true, however, when walking &var, the operand of that
-     ADDR_EXPR does not need to be a GIMPLE value.  */
-  BOOL_BITFIELD val_only : 1;
-
-  /* True if we are currently walking the LHS of an assignment.  */
-  BOOL_BITFIELD is_lhs : 1;
-
-  /* Optional.  Set to true by the callback functions if they made any
-     changes.  */
-  BOOL_BITFIELD changed : 1;
-
-  /* True if we're interested in location information.  */
-  BOOL_BITFIELD want_locations : 1;
-
-  /* True if we've removed the statement that was processed.  */
-  BOOL_BITFIELD removed_stmt : 1;
-};
-
-/* Callback for walk_gimple_stmt.  Called for every statement found
-   during traversal.  The first argument points to the statement to
-   walk.  The second argument is a flag that the callback sets to
-   'true' if it the callback handled all the operands and
-   sub-statements of the statement (the default value of this flag is
-   'false').  The third argument is an anonymous pointer to data
-   to be used by the callback.  */
-typedef tree (*walk_stmt_fn) (gimple_stmt_iterator *, bool *,
-			      struct walk_stmt_info *);
-
-extern gimple walk_gimple_seq_mod (gimple_seq *, walk_stmt_fn, walk_tree_fn,
-				   struct walk_stmt_info *);
-extern gimple walk_gimple_seq (gimple_seq, walk_stmt_fn, walk_tree_fn,
-			       struct walk_stmt_info *);
-extern tree walk_gimple_op (gimple, walk_tree_fn, struct walk_stmt_info *);
-extern tree walk_gimple_stmt (gimple_stmt_iterator *, walk_stmt_fn,
-			      walk_tree_fn, struct walk_stmt_info *);
-typedef bool (*walk_stmt_load_store_addr_fn) (gimple, tree, tree, void *);
-extern bool walk_stmt_load_store_addr_ops (gimple, void *,
-					   walk_stmt_load_store_addr_fn,
-					   walk_stmt_load_store_addr_fn,
-					   walk_stmt_load_store_addr_fn);
-extern bool walk_stmt_load_store_ops (gimple, void *,
-				      walk_stmt_load_store_addr_fn,
-				      walk_stmt_load_store_addr_fn);
-#endif /* GCC_GIMPLE_WALK_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple.def
deleted file mode 100644
index dfe4b77..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple.def
+++ /dev/null
@@ -1,386 +0,0 @@
-/* This file contains the definitions of the GIMPLE IR tuples used in GCC.
-
-   Copyright (C) 2007-2014 Free Software Foundation, Inc.
-   Contributed by Aldy Hernandez <aldyh@redhat.com>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* The format of this file is
-   DEFGSCODE(GIMPLE_symbol, printable name, GSS_symbol).  */
-
-
-/* Error marker.  This is used in similar ways as ERROR_MARK in tree.def.  */
-DEFGSCODE(GIMPLE_ERROR_MARK, "gimple_error_mark", GSS_BASE)
-
-/* IMPORTANT.  Do not rearrange the codes between GIMPLE_COND and
-   GIMPLE_RETURN.  The ordering is exposed by gimple_has_ops calls.
-   These are all the GIMPLE statements with register operands.  */
-
-/* GIMPLE_COND <COND_CODE, OP1, OP2, TRUE_LABEL, FALSE_LABEL>
-   represents the conditional jump:
-
-   if (OP1 COND_CODE OP2) goto TRUE_LABEL else goto FALSE_LABEL
-
-   COND_CODE is the tree code used as the comparison predicate.  It
-   must be of class tcc_comparison.
-
-   OP1 and OP2 are the operands used in the comparison.  They must be
-   accepted by is_gimple_operand.
-
-   TRUE_LABEL and FALSE_LABEL are the LABEL_DECL nodes used as the
-   jump target for the comparison.  */
-DEFGSCODE(GIMPLE_COND, "gimple_cond", GSS_WITH_OPS)
-
-/* GIMPLE_DEBUG represents a debug statement.  */
-DEFGSCODE(GIMPLE_DEBUG, "gimple_debug", GSS_WITH_OPS)
-
-/* GIMPLE_GOTO <TARGET> represents unconditional jumps.
-   TARGET is a LABEL_DECL or an expression node for computed GOTOs.  */
-DEFGSCODE(GIMPLE_GOTO, "gimple_goto", GSS_WITH_OPS)
-
-/* GIMPLE_LABEL <LABEL> represents label statements.  LABEL is a
-   LABEL_DECL representing a jump target.  */
-DEFGSCODE(GIMPLE_LABEL, "gimple_label", GSS_WITH_OPS)
-
-/* GIMPLE_SWITCH <INDEX, DEFAULT_LAB, LAB1, ..., LABN> represents the
-   multiway branch:
-
-   switch (INDEX)
-   {
-     case LAB1: ...; break;
-     ...
-     case LABN: ...; break;
-     default: ...
-   }
-
-   INDEX is the variable evaluated to decide which label to jump to.
-
-   DEFAULT_LAB, LAB1 ... LABN are the tree nodes representing case labels.
-   They must be CASE_LABEL_EXPR nodes.  */
-DEFGSCODE(GIMPLE_SWITCH, "gimple_switch", GSS_WITH_OPS)
-
-/* IMPORTANT.
-
-   Do not rearrange the codes between GIMPLE_ASSIGN and GIMPLE_RETURN.
-   It's exposed by GIMPLE_RANGE_CHECK calls. These are all the GIMPLE
-   statements with memory and register operands.  */
-
-/* GIMPLE_ASSIGN <SUBCODE, LHS, RHS1[, RHS2]> represents the assignment
-   statement
-
-   LHS = RHS1 SUBCODE RHS2.
-
-   SUBCODE is the tree code for the expression computed by the RHS of the
-   assignment.  It must be one of the tree codes accepted by
-   get_gimple_rhs_class.  If LHS is not a gimple register according to
-   is_gimple_reg, SUBCODE must be of class GIMPLE_SINGLE_RHS.
-
-   LHS is the operand on the LHS of the assignment.  It must be a tree node
-   accepted by is_gimple_lvalue.
-
-   RHS1 is the first operand on the RHS of the assignment.  It must always be
-   present.  It must be a tree node accepted by is_gimple_val.
-
-   RHS2 is the second operand on the RHS of the assignment.  It must be a tree
-   node accepted by is_gimple_val.  This argument exists only if SUBCODE is
-   of class GIMPLE_BINARY_RHS.  */
-DEFGSCODE(GIMPLE_ASSIGN, "gimple_assign", GSS_WITH_MEM_OPS)
-
-/* GIMPLE_ASM <STRING, I1, ..., IN, O1, ... OM, C1, ..., CP>
-   represents inline assembly statements.
-
-   STRING is the string containing the assembly statements.
-   I1 ... IN are the N input operands.
-   O1 ... OM are the M output operands.
-   C1 ... CP are the P clobber operands.
-   L1 ... LQ are the Q label operands.  */
-DEFGSCODE(GIMPLE_ASM, "gimple_asm", GSS_ASM)
-
-/* GIMPLE_CALL <FN, LHS, ARG1, ..., ARGN[, CHAIN]> represents function
-   calls.
-
-   FN is the callee.  It must be accepted by is_gimple_call_addr.
-
-   LHS is the operand where the return value from FN is stored.  It may
-   be NULL.
-
-   ARG1 ... ARGN are the arguments.  They must all be accepted by
-   is_gimple_operand.
-
-    CHAIN is the optional static chain link for nested functions.  */
-DEFGSCODE(GIMPLE_CALL, "gimple_call", GSS_CALL)
-
-/* GIMPLE_TRANSACTION <BODY, LABEL> represents __transaction_atomic and
-   __transaction_relaxed blocks.
-   BODY is the sequence of statements inside the transaction.
-   LABEL is a label for the statement immediately following the
-   transaction.  This is before RETURN so that it has MEM_OPS,
-   so that it can clobber global memory.  */
-DEFGSCODE(GIMPLE_TRANSACTION, "gimple_transaction", GSS_TRANSACTION)
-
-/* GIMPLE_RETURN <RETVAL> represents return statements.
-
-   RETVAL is the value to return or NULL.  If a value is returned it
-   must be accepted by is_gimple_operand.  */
-DEFGSCODE(GIMPLE_RETURN, "gimple_return", GSS_WITH_MEM_OPS)
-
-/* GIMPLE_BIND <VARS, BLOCK, BODY> represents a lexical scope.
-   VARS is the set of variables declared in that scope.
-   BLOCK is the symbol binding block used for debug information.
-   BODY is the sequence of statements in the scope.  */
-DEFGSCODE(GIMPLE_BIND, "gimple_bind", GSS_BIND)
-
-/* GIMPLE_CATCH <TYPES, HANDLER> represents a typed exception handler.
-   TYPES is the type (or list of types) handled.  HANDLER is the
-   sequence of statements that handle these types.  */
-DEFGSCODE(GIMPLE_CATCH, "gimple_catch", GSS_CATCH)
-
-/* GIMPLE_EH_FILTER <TYPES, FAILURE> represents an exception
-   specification.  TYPES is a list of allowed types and FAILURE is the
-   sequence of statements to execute on failure.  */
-DEFGSCODE(GIMPLE_EH_FILTER, "gimple_eh_filter", GSS_EH_FILTER)
-
-/* GIMPLE_EH_MUST_NOT_THROW <DECL> represents an exception barrier.
-   DECL is a noreturn function decl taking no arguments that will
-   be invoked if an exception propagates to this point.  */
-DEFGSCODE(GIMPLE_EH_MUST_NOT_THROW, "gimple_eh_must_not_throw", GSS_EH_MNT)
-
-/* GIMPLE_EH_ELSE <N_BODY, E_BODY> must be the sole contents of
-   a GIMPLE_TRY_FINALLY node.  For all normal exits from the try block,
-   N_BODY is run; for all exception exits from the try block,
-   E_BODY is run.  */
-DEFGSCODE(GIMPLE_EH_ELSE, "gimple_eh_else", GSS_EH_ELSE)
-
-/* GIMPLE_RESX resumes execution after an exception.  */
-DEFGSCODE(GIMPLE_RESX, "gimple_resx", GSS_EH_CTRL)
-
-/* GIMPLE_EH_DISPATCH demultiplexes an exception edge based on
-   the FILTER argument.  */
-DEFGSCODE(GIMPLE_EH_DISPATCH, "gimple_eh_dispatch", GSS_EH_CTRL)
-
-/* GIMPLE_PHI <RESULT, ARG1, ..., ARGN> represents the PHI node
-
-   RESULT = PHI <ARG1, ..., ARGN>
-
-   RESULT is the SSA name created by this PHI node.
-
-   ARG1 ... ARGN are the arguments to the PHI node.  N must be
-   exactly the same as the number of incoming edges to the basic block
-   holding the PHI node.  Every argument is either an SSA name or a
-   tree node of class tcc_constant.  */
-DEFGSCODE(GIMPLE_PHI, "gimple_phi", GSS_PHI)
-
-/* GIMPLE_TRY <TRY_KIND, EVAL, CLEANUP>
-   represents a try/catch or a try/finally statement.
-
-   TRY_KIND is either GIMPLE_TRY_CATCH or GIMPLE_TRY_FINALLY.
-
-   EVAL is the sequence of statements to execute on entry to GIMPLE_TRY.
-
-   CLEANUP is the sequence of statements to execute according to
-   TRY_KIND.  If TRY_KIND is GIMPLE_TRY_CATCH, CLEANUP is only exected
-   if an exception is thrown during execution of EVAL.  If TRY_KIND is
-   GIMPLE_TRY_FINALLY, CLEANUP is always executed after executing EVAL
-   (regardless of whether EVAL finished normally, or jumped out or an
-   exception was thrown).  */
-DEFGSCODE(GIMPLE_TRY, "gimple_try", GSS_TRY)
-
-/* GIMPLE_NOP represents the "do nothing" statement.  */
-DEFGSCODE(GIMPLE_NOP, "gimple_nop", GSS_BASE)
-
-
-/* IMPORTANT.
-
-   Do not rearrange any of the GIMPLE_OMP_* codes.  This ordering is
-   exposed by the range check in gimple_omp_subcode().  */
-
-
-/* Tuples used for lowering of OMP_ATOMIC.  Although the form of the OMP_ATOMIC
-   expression is very simple (just in form mem op= expr), various implicit
-   conversions may cause the expression to become more complex, so that it does
-   not fit the gimple grammar very well.  To overcome this problem, OMP_ATOMIC
-   is rewritten as a sequence of two codes in gimplification:
-
-   GIMPLE_OMP_LOAD (tmp, mem)
-   val = some computations involving tmp;
-   GIMPLE_OMP_STORE (val).  */
-DEFGSCODE(GIMPLE_OMP_ATOMIC_LOAD, "gimple_omp_atomic_load",
-	  GSS_OMP_ATOMIC_LOAD)
-DEFGSCODE(GIMPLE_OMP_ATOMIC_STORE, "gimple_omp_atomic_store",
-	  GSS_OMP_ATOMIC_STORE_LAYOUT)
-
-/* GIMPLE_OMP_CONTINUE marks the location of the loop or sections
-   iteration in partially lowered OpenMP code.  */
-DEFGSCODE(GIMPLE_OMP_CONTINUE, "gimple_omp_continue", GSS_OMP_CONTINUE)
-
-/* GIMPLE_OMP_CRITICAL <NAME, BODY> represents
-
-   #pragma omp critical [name]
-
-   NAME is the name given to the critical section.
-   BODY is the sequence of statements that are inside the critical section.  */
-DEFGSCODE(GIMPLE_OMP_CRITICAL, "gimple_omp_critical", GSS_OMP_CRITICAL)
-
-/* GIMPLE_OMP_FOR <BODY, CLAUSES, INDEX, INITIAL, FINAL, COND, INCR, PRE_BODY>
-   represents
-
-   PRE_BODY
-   #pragma omp for [clause1 ... clauseN]
-   for (INDEX = INITIAL; INDEX COND FINAL; INDEX {+=,-=} INCR)
-   BODY
-
-   BODY is the loop body.
-
-   CLAUSES is the list of clauses.
-
-   INDEX must be an integer or pointer variable, which is implicitly thread
-   private.  It must be accepted by is_gimple_operand.
-
-   INITIAL is the initial value given to INDEX. It must be
-   accepted by is_gimple_operand.
-
-   FINAL is the final value that INDEX should take. It must
-   be accepted by is_gimple_operand.
-
-   COND is the condition code for the controlling predicate.  It must
-   be one of { <, >, <=, >= }
-
-   INCR is the loop index increment.  It must be tree node of type
-   tcc_constant.
-
-   PRE_BODY is a landing pad filled by the gimplifier with things from
-   INIT, COND, and INCR that are technically part of the OMP_FOR
-   structured block, but are evaluated before the loop body begins.
-
-   INITIAL, FINAL and INCR are required to be loop invariant integer
-   expressions that are evaluated without any synchronization.
-   The evaluation order, frequency of evaluation and side-effects are
-   unspecified by the standard.  */
-DEFGSCODE(GIMPLE_OMP_FOR, "gimple_omp_for", GSS_OMP_FOR)
-
-/* GIMPLE_OMP_MASTER <BODY> represents #pragma omp master.
-   BODY is the sequence of statements to execute in the master section.  */
-DEFGSCODE(GIMPLE_OMP_MASTER, "gimple_omp_master", GSS_OMP)
-
-/* GIMPLE_OMP_TASKGROUP <BODY> represents #pragma omp taskgroup.
-   BODY is the sequence of statements to execute in the taskgroup section.  */
-DEFGSCODE(GIMPLE_OMP_TASKGROUP, "gimple_omp_taskgroup", GSS_OMP)
-
-/* GIMPLE_OMP_ORDERED <BODY> represents #pragma omp ordered.
-   BODY is the sequence of statements to execute in the ordered section.  */
-DEFGSCODE(GIMPLE_OMP_ORDERED, "gimple_omp_ordered", GSS_OMP)
-
-/* GIMPLE_OMP_PARALLEL <BODY, CLAUSES, CHILD_FN, DATA_ARG> represents
-
-   #pragma omp parallel [CLAUSES]
-   BODY
-
-   BODY is a the sequence of statements to be executed by all threads.
-
-   CLAUSES is an OMP_CLAUSE chain with all the clauses.
-
-   CHILD_FN is set when outlining the body of the parallel region.
-   All the statements in BODY are moved into this newly created
-   function when converting OMP constructs into low-GIMPLE.
-
-   DATA_ARG is a local variable in the parent function containing data
-   to be shared with CHILD_FN.  This is used to implement all the data
-   sharing clauses.  */
-DEFGSCODE(GIMPLE_OMP_PARALLEL, "gimple_omp_parallel", GSS_OMP_PARALLEL_LAYOUT)
-
-/* GIMPLE_OMP_TASK <BODY, CLAUSES, CHILD_FN, DATA_ARG, COPY_FN,
-		    ARG_SIZE, ARG_ALIGN> represents
-
-   #pragma omp task [CLAUSES]
-   BODY
-
-   BODY is a the sequence of statements to be executed by all threads.
-
-   CLAUSES is an OMP_CLAUSE chain with all the clauses.
-
-   CHILD_FN is set when outlining the body of the explicit task region.
-   All the statements in BODY are moved into this newly created
-   function when converting OMP constructs into low-GIMPLE.
-
-   DATA_ARG is a local variable in the parent function containing data
-   to be shared with CHILD_FN.  This is used to implement all the data
-   sharing clauses.
-
-   COPY_FN is set when outlining the firstprivate var initialization.
-   All the needed statements are emitted into the newly created
-   function, or when only memcpy is needed, it is NULL.
-
-   ARG_SIZE and ARG_ALIGN are the size and alignment of the incoming
-   data area allocated by GOMP_task and passed to CHILD_FN.  */
-DEFGSCODE(GIMPLE_OMP_TASK, "gimple_omp_task", GSS_OMP_TASK)
-
-/* OMP_RETURN marks the end of an OpenMP directive.  */
-DEFGSCODE(GIMPLE_OMP_RETURN, "gimple_omp_return", GSS_OMP_ATOMIC_STORE_LAYOUT)
-
-/* OMP_SECTION <BODY> represents #pragma omp section.
-   BODY is the sequence of statements in the section body.  */
-DEFGSCODE(GIMPLE_OMP_SECTION, "gimple_omp_section", GSS_OMP)
-
-/* OMP_SECTIONS <BODY, CLAUSES, CONTROL> represents #pragma omp sections.
-
-   BODY is the sequence of statements in the sections body.
-   CLAUSES is an OMP_CLAUSE chain holding the list of associated clauses.
-   CONTROL is a VAR_DECL used for deciding which of the sections
-   to execute.  */
-DEFGSCODE(GIMPLE_OMP_SECTIONS, "gimple_omp_sections", GSS_OMP_SECTIONS)
-
-/* GIMPLE_OMP_SECTIONS_SWITCH is a marker placed immediately after
-   OMP_SECTIONS.  It represents the GIMPLE_SWITCH used to decide which
-   branch is taken.  */
-DEFGSCODE(GIMPLE_OMP_SECTIONS_SWITCH, "gimple_omp_sections_switch", GSS_BASE)
-
-/* GIMPLE_OMP_SINGLE <BODY, CLAUSES> represents #pragma omp single
-   BODY is the sequence of statements inside the single section.
-   CLAUSES is an OMP_CLAUSE chain holding the associated clauses.  */
-DEFGSCODE(GIMPLE_OMP_SINGLE, "gimple_omp_single", GSS_OMP_SINGLE_LAYOUT)
-
-/* GIMPLE_OMP_TARGET <BODY, CLAUSES, CHILD_FN> represents
-   #pragma omp target {,data,update}
-   BODY is the sequence of statements inside the target construct
-   (NULL for target update).
-   CLAUSES is an OMP_CLAUSE chain holding the associated clauses.
-   CHILD_FN is set when outlining the body of the target region.
-   All the statements in BODY are moved into this newly created
-   function when converting OMP constructs into low-GIMPLE.
-   DATA_ARG is a vec of 3 local variables in the parent function
-   containing data to be mapped to CHILD_FN.  This is used to
-   implement the MAP clauses.  */
-DEFGSCODE(GIMPLE_OMP_TARGET, "gimple_omp_target", GSS_OMP_PARALLEL_LAYOUT)
-
-/* GIMPLE_OMP_TEAMS <BODY, CLAUSES> represents #pragma omp teams
-   BODY is the sequence of statements inside the single section.
-   CLAUSES is an OMP_CLAUSE chain holding the associated clauses.  */
-DEFGSCODE(GIMPLE_OMP_TEAMS, "gimple_omp_teams", GSS_OMP_SINGLE_LAYOUT)
-
-/* GIMPLE_PREDICT <PREDICT, OUTCOME> specifies a hint for branch prediction.
-
-   PREDICT is one of the predictors from predict.def.
-
-   OUTCOME is NOT_TAKEN or TAKEN.  */
-DEFGSCODE(GIMPLE_PREDICT, "gimple_predict", GSS_BASE)
-
-/*  This node represents a cleanup expression.  It is ONLY USED INTERNALLY
-    by the gimplifier as a placeholder for cleanups, and its uses will be
-    cleaned up by the time gimplification is done.
-
-    This tuple should not exist outside of the gimplifier proper.  */
-DEFGSCODE(GIMPLE_WITH_CLEANUP_EXPR, "gimple_with_cleanup_expr", GSS_WCE)
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple.h
deleted file mode 100644
index 11959a8..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimple.h
+++ /dev/null
@@ -1,5719 +0,0 @@
-/* Gimple IR definitions.
-
-   Copyright (C) 2007-2014 Free Software Foundation, Inc.
-   Contributed by Aldy Hernandez <aldyh@redhat.com>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_GIMPLE_H
-#define GCC_GIMPLE_H
-
-typedef gimple gimple_seq_node;
-
-/* For each block, the PHI nodes that need to be rewritten are stored into
-   these vectors.  */
-typedef vec<gimple> gimple_vec;
-
-enum gimple_code {
-#define DEFGSCODE(SYM, STRING, STRUCT)	SYM,
-#include "gimple.def"
-#undef DEFGSCODE
-    LAST_AND_UNUSED_GIMPLE_CODE
-};
-
-extern const char *const gimple_code_name[];
-extern const unsigned char gimple_rhs_class_table[];
-
-/* Error out if a gimple tuple is addressed incorrectly.  */
-#if defined ENABLE_GIMPLE_CHECKING
-#define gcc_gimple_checking_assert(EXPR) gcc_assert (EXPR)
-extern void gimple_check_failed (const_gimple, const char *, int,          \
-                                 const char *, enum gimple_code,           \
-				 enum tree_code) ATTRIBUTE_NORETURN;
-
-#define GIMPLE_CHECK(GS, CODE)						\
-  do {									\
-    const_gimple __gs = (GS);						\
-    if (gimple_code (__gs) != (CODE))					\
-      gimple_check_failed (__gs, __FILE__, __LINE__, __FUNCTION__,	\
-	  		   (CODE), ERROR_MARK);				\
-  } while (0)
-#else  /* not ENABLE_GIMPLE_CHECKING  */
-#define gcc_gimple_checking_assert(EXPR) ((void)(0 && (EXPR)))
-#define GIMPLE_CHECK(GS, CODE)			(void)0
-#endif
-
-/* Class of GIMPLE expressions suitable for the RHS of assignments.  See
-   get_gimple_rhs_class.  */
-enum gimple_rhs_class
-{
-  GIMPLE_INVALID_RHS,	/* The expression cannot be used on the RHS.  */
-  GIMPLE_TERNARY_RHS,	/* The expression is a ternary operation.  */
-  GIMPLE_BINARY_RHS,	/* The expression is a binary operation.  */
-  GIMPLE_UNARY_RHS,	/* The expression is a unary operation.  */
-  GIMPLE_SINGLE_RHS	/* The expression is a single object (an SSA
-			   name, a _DECL, a _REF, etc.  */
-};
-
-/* Specific flags for individual GIMPLE statements.  These flags are
-   always stored in gimple_statement_base.subcode and they may only be
-   defined for statement codes that do not use subcodes.
-
-   Values for the masks can overlap as long as the overlapping values
-   are never used in the same statement class.
-
-   The maximum mask value that can be defined is 1 << 15 (i.e., each
-   statement code can hold up to 16 bitflags).
-
-   Keep this list sorted.  */
-enum gf_mask {
-    GF_ASM_INPUT		= 1 << 0,
-    GF_ASM_VOLATILE		= 1 << 1,
-    GF_CALL_FROM_THUNK		= 1 << 0,
-    GF_CALL_RETURN_SLOT_OPT	= 1 << 1,
-    GF_CALL_TAILCALL		= 1 << 2,
-    GF_CALL_VA_ARG_PACK		= 1 << 3,
-    GF_CALL_NOTHROW		= 1 << 4,
-    GF_CALL_ALLOCA_FOR_VAR	= 1 << 5,
-    GF_CALL_INTERNAL		= 1 << 6,
-    GF_OMP_PARALLEL_COMBINED	= 1 << 0,
-    GF_OMP_FOR_KIND_MASK	= 3 << 0,
-    GF_OMP_FOR_KIND_FOR		= 0 << 0,
-    GF_OMP_FOR_KIND_DISTRIBUTE	= 1 << 0,
-    GF_OMP_FOR_KIND_SIMD	= 2 << 0,
-    GF_OMP_FOR_KIND_CILKSIMD	= 3 << 0,
-    GF_OMP_FOR_COMBINED		= 1 << 2,
-    GF_OMP_FOR_COMBINED_INTO	= 1 << 3,
-    GF_OMP_TARGET_KIND_MASK	= 3 << 0,
-    GF_OMP_TARGET_KIND_REGION	= 0 << 0,
-    GF_OMP_TARGET_KIND_DATA	= 1 << 0,
-    GF_OMP_TARGET_KIND_UPDATE	= 2 << 0,
-
-    /* True on an GIMPLE_OMP_RETURN statement if the return does not require
-       a thread synchronization via some sort of barrier.  The exact barrier
-       that would otherwise be emitted is dependent on the OMP statement with
-       which this return is associated.  */
-    GF_OMP_RETURN_NOWAIT	= 1 << 0,
-
-    GF_OMP_SECTION_LAST		= 1 << 0,
-    GF_OMP_ATOMIC_NEED_VALUE	= 1 << 0,
-    GF_OMP_ATOMIC_SEQ_CST	= 1 << 1,
-    GF_PREDICT_TAKEN		= 1 << 15
-};
-
-/* Currently, there are only two types of gimple debug stmt.  Others are
-   envisioned, for example, to enable the generation of is_stmt notes
-   in line number information, to mark sequence points, etc.  This
-   subcode is to be used to tell them apart.  */
-enum gimple_debug_subcode {
-  GIMPLE_DEBUG_BIND = 0,
-  GIMPLE_DEBUG_SOURCE_BIND = 1
-};
-
-/* Masks for selecting a pass local flag (PLF) to work on.  These
-   masks are used by gimple_set_plf and gimple_plf.  */
-enum plf_mask {
-    GF_PLF_1	= 1 << 0,
-    GF_PLF_2	= 1 << 1
-};
-
-/* Data structure definitions for GIMPLE tuples.  NOTE: word markers
-   are for 64 bit hosts.  */
-
-struct GTY((desc ("gimple_statement_structure (&%h)"), tag ("GSS_BASE"),
-	    chain_next ("%h.next"), variable_size))
-  gimple_statement_base
-{
-  /* [ WORD 1 ]
-     Main identifying code for a tuple.  */
-  ENUM_BITFIELD(gimple_code) code : 8;
-
-  /* Nonzero if a warning should not be emitted on this tuple.  */
-  unsigned int no_warning	: 1;
-
-  /* Nonzero if this tuple has been visited.  Passes are responsible
-     for clearing this bit before using it.  */
-  unsigned int visited		: 1;
-
-  /* Nonzero if this tuple represents a non-temporal move.  */
-  unsigned int nontemporal_move	: 1;
-
-  /* Pass local flags.  These flags are free for any pass to use as
-     they see fit.  Passes should not assume that these flags contain
-     any useful value when the pass starts.  Any initial state that
-     the pass requires should be set on entry to the pass.  See
-     gimple_set_plf and gimple_plf for usage.  */
-  unsigned int plf		: 2;
-
-  /* Nonzero if this statement has been modified and needs to have its
-     operands rescanned.  */
-  unsigned modified 		: 1;
-
-  /* Nonzero if this statement contains volatile operands.  */
-  unsigned has_volatile_ops 	: 1;
-
-  /* Padding to get subcode to 16 bit alignment.  */
-  unsigned pad			: 1;
-
-  /* The SUBCODE field can be used for tuple-specific flags for tuples
-     that do not require subcodes.  Note that SUBCODE should be at
-     least as wide as tree codes, as several tuples store tree codes
-     in there.  */
-  unsigned int subcode		: 16;
-
-  /* UID of this statement.  This is used by passes that want to
-     assign IDs to statements.  It must be assigned and used by each
-     pass.  By default it should be assumed to contain garbage.  */
-  unsigned uid;
-
-  /* [ WORD 2 ]
-     Locus information for debug info.  */
-  location_t location;
-
-  /* Number of operands in this tuple.  */
-  unsigned num_ops;
-
-  /* [ WORD 3 ]
-     Basic block holding this statement.  */
-  basic_block bb;
-
-  /* [ WORD 4-5 ]
-     Linked lists of gimple statements.  The next pointers form
-     a NULL terminated list, the prev pointers are a cyclic list.
-     A gimple statement is hence also a double-ended list of
-     statements, with the pointer itself being the first element,
-     and the prev pointer being the last.  */
-  gimple next;
-  gimple GTY((skip)) prev;
-};
-
-
-/* Base structure for tuples with operands.  */
-
-/* This gimple subclass has no tag value.  */
-struct GTY(())
-  gimple_statement_with_ops_base : public gimple_statement_base
-{
-  /* [ WORD 1-6 ] : base class */
-
-  /* [ WORD 7 ]
-     SSA operand vectors.  NOTE: It should be possible to
-     amalgamate these vectors with the operand vector OP.  However,
-     the SSA operand vectors are organized differently and contain
-     more information (like immediate use chaining).  */
-  struct use_optype_d GTY((skip (""))) *use_ops;
-};
-
-
-/* Statements that take register operands.  */
-
-struct GTY((tag("GSS_WITH_OPS")))
-  gimple_statement_with_ops : public gimple_statement_with_ops_base
-{
-  /* [ WORD 1-7 ] : base class */
-
-  /* [ WORD 8 ]
-     Operand vector.  NOTE!  This must always be the last field
-     of this structure.  In particular, this means that this
-     structure cannot be embedded inside another one.  */
-  tree GTY((length ("%h.num_ops"))) op[1];
-};
-
-
-/* Base for statements that take both memory and register operands.  */
-
-struct GTY((tag("GSS_WITH_MEM_OPS_BASE")))
-  gimple_statement_with_memory_ops_base : public gimple_statement_with_ops_base
-{
-  /* [ WORD 1-7 ] : base class */
-
-  /* [ WORD 8-9 ]
-     Virtual operands for this statement.  The GC will pick them
-     up via the ssa_names array.  */
-  tree GTY((skip (""))) vdef;
-  tree GTY((skip (""))) vuse;
-};
-
-
-/* Statements that take both memory and register operands.  */
-
-struct GTY((tag("GSS_WITH_MEM_OPS")))
-  gimple_statement_with_memory_ops :
-    public gimple_statement_with_memory_ops_base
-{
-  /* [ WORD 1-9 ] : base class */
-
-  /* [ WORD 10 ]
-     Operand vector.  NOTE!  This must always be the last field
-     of this structure.  In particular, this means that this
-     structure cannot be embedded inside another one.  */
-  tree GTY((length ("%h.num_ops"))) op[1];
-};
-
-
-/* Call statements that take both memory and register operands.  */
-
-struct GTY((tag("GSS_CALL")))
-  gimple_statement_call : public gimple_statement_with_memory_ops_base
-{
-  /* [ WORD 1-9 ] : base class */
-
-  /* [ WORD 10-13 ]  */
-  struct pt_solution call_used;
-  struct pt_solution call_clobbered;
-
-  /* [ WORD 14 ]  */
-  union GTY ((desc ("%1.subcode & GF_CALL_INTERNAL"))) {
-    tree GTY ((tag ("0"))) fntype;
-    enum internal_fn GTY ((tag ("GF_CALL_INTERNAL"))) internal_fn;
-  } u;
-
-  /* [ WORD 15 ]
-     Operand vector.  NOTE!  This must always be the last field
-     of this structure.  In particular, this means that this
-     structure cannot be embedded inside another one.  */
-  tree GTY((length ("%h.num_ops"))) op[1];
-};
-
-
-/* OpenMP statements (#pragma omp).  */
-
-struct GTY((tag("GSS_OMP")))
-  gimple_statement_omp : public gimple_statement_base
-{
-  /* [ WORD 1-6 ] : base class */
-
-  /* [ WORD 7 ]  */
-  gimple_seq body;
-};
-
-
-/* GIMPLE_BIND */
-
-struct GTY((tag("GSS_BIND")))
-  gimple_statement_bind : public gimple_statement_base
-{
-  /* [ WORD 1-6 ] : base class */
-
-  /* [ WORD 7 ]
-     Variables declared in this scope.  */
-  tree vars;
-
-  /* [ WORD 8 ]
-     This is different than the BLOCK field in gimple_statement_base,
-     which is analogous to TREE_BLOCK (i.e., the lexical block holding
-     this statement).  This field is the equivalent of BIND_EXPR_BLOCK
-     in tree land (i.e., the lexical scope defined by this bind).  See
-     gimple-low.c.  */
-  tree block;
-
-  /* [ WORD 9 ]  */
-  gimple_seq body;
-};
-
-
-/* GIMPLE_CATCH */
-
-struct GTY((tag("GSS_CATCH")))
-  gimple_statement_catch : public gimple_statement_base
-{
-  /* [ WORD 1-6 ] : base class */
-
-  /* [ WORD 7 ]  */
-  tree types;
-
-  /* [ WORD 8 ]  */
-  gimple_seq handler;
-};
-
-
-/* GIMPLE_EH_FILTER */
-
-struct GTY((tag("GSS_EH_FILTER")))
-  gimple_statement_eh_filter : public gimple_statement_base
-{
-  /* [ WORD 1-6 ] : base class */
-
-  /* [ WORD 7 ]
-     Filter types.  */
-  tree types;
-
-  /* [ WORD 8 ]
-     Failure actions.  */
-  gimple_seq failure;
-};
-
-/* GIMPLE_EH_ELSE */
-
-struct GTY((tag("GSS_EH_ELSE")))
-  gimple_statement_eh_else : public gimple_statement_base
-{
-  /* [ WORD 1-6 ] : base class */
-
-  /* [ WORD 7,8 ] */
-  gimple_seq n_body, e_body;
-};
-
-/* GIMPLE_EH_MUST_NOT_THROW */
-
-struct GTY((tag("GSS_EH_MNT")))
-  gimple_statement_eh_mnt : public gimple_statement_base
-{
-  /* [ WORD 1-6 ] : base class */
-
-  /* [ WORD 7 ] Abort function decl.  */
-  tree fndecl;
-};
-
-/* GIMPLE_PHI */
-
-struct GTY((tag("GSS_PHI")))
-  gimple_statement_phi : public gimple_statement_base
-{
-  /* [ WORD 1-6 ] : base class */
-
-  /* [ WORD 7 ]  */
-  unsigned capacity;
-  unsigned nargs;
-
-  /* [ WORD 8 ]  */
-  tree result;
-
-  /* [ WORD 9 ]  */
-  struct phi_arg_d GTY ((length ("%h.nargs"))) args[1];
-};
-
-
-/* GIMPLE_RESX, GIMPLE_EH_DISPATCH */
-
-struct GTY((tag("GSS_EH_CTRL")))
-  gimple_statement_eh_ctrl : public gimple_statement_base
-{
-  /* [ WORD 1-6 ] : base class */
-
-  /* [ WORD 7 ]
-     Exception region number.  */
-  int region;
-};
-
-struct GTY((tag("GSS_EH_CTRL")))
-  gimple_statement_resx : public gimple_statement_eh_ctrl
-{
-  /* No extra fields; adds invariant:
-       stmt->code == GIMPLE_RESX.  */
-};
-
-struct GTY((tag("GSS_EH_CTRL")))
-  gimple_statement_eh_dispatch : public gimple_statement_eh_ctrl
-{
-  /* No extra fields; adds invariant:
-       stmt->code == GIMPLE_EH_DISPATH.  */
-};
-
-
-/* GIMPLE_TRY */
-
-struct GTY((tag("GSS_TRY")))
-  gimple_statement_try : public gimple_statement_base
-{
-  /* [ WORD 1-6 ] : base class */
-
-  /* [ WORD 7 ]
-     Expression to evaluate.  */
-  gimple_seq eval;
-
-  /* [ WORD 8 ]
-     Cleanup expression.  */
-  gimple_seq cleanup;
-};
-
-/* Kind of GIMPLE_TRY statements.  */
-enum gimple_try_flags
-{
-  /* A try/catch.  */
-  GIMPLE_TRY_CATCH = 1 << 0,
-
-  /* A try/finally.  */
-  GIMPLE_TRY_FINALLY = 1 << 1,
-  GIMPLE_TRY_KIND = GIMPLE_TRY_CATCH | GIMPLE_TRY_FINALLY,
-
-  /* Analogous to TRY_CATCH_IS_CLEANUP.  */
-  GIMPLE_TRY_CATCH_IS_CLEANUP = 1 << 2
-};
-
-/* GIMPLE_WITH_CLEANUP_EXPR */
-
-struct GTY((tag("GSS_WCE")))
-  gimple_statement_wce : public gimple_statement_base
-{
-  /* [ WORD 1-6 ] : base class */
-
-  /* Subcode: CLEANUP_EH_ONLY.  True if the cleanup should only be
-	      executed if an exception is thrown, not on normal exit of its
-	      scope.  This flag is analogous to the CLEANUP_EH_ONLY flag
-	      in TARGET_EXPRs.  */
-
-  /* [ WORD 7 ]
-     Cleanup expression.  */
-  gimple_seq cleanup;
-};
-
-
-/* GIMPLE_ASM  */
-
-struct GTY((tag("GSS_ASM")))
-  gimple_statement_asm : public gimple_statement_with_memory_ops_base
-{
-  /* [ WORD 1-9 ] : base class */
-
-  /* [ WORD 10 ]
-     __asm__ statement.  */
-  const char *string;
-
-  /* [ WORD 11 ]
-       Number of inputs, outputs, clobbers, labels.  */
-  unsigned char ni;
-  unsigned char no;
-  unsigned char nc;
-  unsigned char nl;
-
-  /* [ WORD 12 ]
-     Operand vector.  NOTE!  This must always be the last field
-     of this structure.  In particular, this means that this
-     structure cannot be embedded inside another one.  */
-  tree GTY((length ("%h.num_ops"))) op[1];
-};
-
-/* GIMPLE_OMP_CRITICAL */
-
-struct GTY((tag("GSS_OMP_CRITICAL")))
-  gimple_statement_omp_critical : public gimple_statement_omp
-{
-  /* [ WORD 1-7 ] : base class */
-
-  /* [ WORD 8 ]
-     Critical section name.  */
-  tree name;
-};
-
-
-struct GTY(()) gimple_omp_for_iter {
-  /* Condition code.  */
-  enum tree_code cond;
-
-  /* Index variable.  */
-  tree index;
-
-  /* Initial value.  */
-  tree initial;
-
-  /* Final value.  */
-  tree final;
-
-  /* Increment.  */
-  tree incr;
-};
-
-/* GIMPLE_OMP_FOR */
-
-struct GTY((tag("GSS_OMP_FOR")))
-  gimple_statement_omp_for : public gimple_statement_omp
-{
-  /* [ WORD 1-7 ] : base class */
-
-  /* [ WORD 8 ]  */
-  tree clauses;
-
-  /* [ WORD 9 ]
-     Number of elements in iter array.  */
-  size_t collapse;
-
-  /* [ WORD 10 ]  */
-  struct gimple_omp_for_iter * GTY((length ("%h.collapse"))) iter;
-
-  /* [ WORD 11 ]
-     Pre-body evaluated before the loop body begins.  */
-  gimple_seq pre_body;
-};
-
-
-/* GIMPLE_OMP_PARALLEL, GIMPLE_OMP_TARGET */
-struct GTY((tag("GSS_OMP_PARALLEL_LAYOUT")))
-  gimple_statement_omp_parallel_layout : public gimple_statement_omp
-{
-  /* [ WORD 1-7 ] : base class */
-
-  /* [ WORD 8 ]
-     Clauses.  */
-  tree clauses;
-
-  /* [ WORD 9 ]
-     Child function holding the body of the parallel region.  */
-  tree child_fn;
-
-  /* [ WORD 10 ]
-     Shared data argument.  */
-  tree data_arg;
-};
-
-/* GIMPLE_OMP_PARALLEL or GIMPLE_TASK */
-struct GTY((tag("GSS_OMP_PARALLEL_LAYOUT")))
-  gimple_statement_omp_taskreg : public gimple_statement_omp_parallel_layout
-{
-    /* No extra fields; adds invariant:
-         stmt->code == GIMPLE_OMP_PARALLEL
-	 || stmt->code == GIMPLE_OMP_TASK.  */
-};
-
-
-/* GIMPLE_OMP_PARALLEL */
-struct GTY((tag("GSS_OMP_PARALLEL_LAYOUT")))
-  gimple_statement_omp_parallel : public gimple_statement_omp_taskreg
-{
-    /* No extra fields; adds invariant:
-         stmt->code == GIMPLE_OMP_PARALLEL.  */
-};
-
-struct GTY((tag("GSS_OMP_PARALLEL_LAYOUT")))
-  gimple_statement_omp_target : public gimple_statement_omp_parallel_layout
-{
-    /* No extra fields; adds invariant:
-         stmt->code == GIMPLE_OMP_TARGET.  */
-};
-
-/* GIMPLE_OMP_TASK */
-
-struct GTY((tag("GSS_OMP_TASK")))
-  gimple_statement_omp_task : public gimple_statement_omp_taskreg
-{
-  /* [ WORD 1-10 ] : base class */
-
-  /* [ WORD 11 ]
-     Child function holding firstprivate initialization if needed.  */
-  tree copy_fn;
-
-  /* [ WORD 12-13 ]
-     Size and alignment in bytes of the argument data block.  */
-  tree arg_size;
-  tree arg_align;
-};
-
-
-/* GIMPLE_OMP_SECTION */
-/* Uses struct gimple_statement_omp.  */
-
-
-/* GIMPLE_OMP_SECTIONS */
-
-struct GTY((tag("GSS_OMP_SECTIONS")))
-  gimple_statement_omp_sections : public gimple_statement_omp
-{
-  /* [ WORD 1-7 ] : base class */
-
-  /* [ WORD 8 ]  */
-  tree clauses;
-
-  /* [ WORD 9 ]
-     The control variable used for deciding which of the sections to
-     execute.  */
-  tree control;
-};
-
-/* GIMPLE_OMP_CONTINUE.
-
-   Note: This does not inherit from gimple_statement_omp, because we
-         do not need the body field.  */
-
-struct GTY((tag("GSS_OMP_CONTINUE")))
-  gimple_statement_omp_continue : public gimple_statement_base
-{
-  /* [ WORD 1-6 ] : base class */
-
-  /* [ WORD 7 ]  */
-  tree control_def;
-
-  /* [ WORD 8 ]  */
-  tree control_use;
-};
-
-/* GIMPLE_OMP_SINGLE, GIMPLE_OMP_TEAMS */
-
-struct GTY((tag("GSS_OMP_SINGLE_LAYOUT")))
-  gimple_statement_omp_single_layout : public gimple_statement_omp
-{
-  /* [ WORD 1-7 ] : base class */
-
-  /* [ WORD 7 ]  */
-  tree clauses;
-};
-
-struct GTY((tag("GSS_OMP_SINGLE_LAYOUT")))
-  gimple_statement_omp_single : public gimple_statement_omp_single_layout
-{
-    /* No extra fields; adds invariant:
-         stmt->code == GIMPLE_OMP_SINGLE.  */
-};
-
-struct GTY((tag("GSS_OMP_SINGLE_LAYOUT")))
-  gimple_statement_omp_teams : public gimple_statement_omp_single_layout
-{
-    /* No extra fields; adds invariant:
-         stmt->code == GIMPLE_OMP_TEAMS.  */
-};
-
-
-/* GIMPLE_OMP_ATOMIC_LOAD.
-   Note: This is based on gimple_statement_base, not g_s_omp, because g_s_omp
-   contains a sequence, which we don't need here.  */
-
-struct GTY((tag("GSS_OMP_ATOMIC_LOAD")))
-  gimple_statement_omp_atomic_load : public gimple_statement_base
-{
-  /* [ WORD 1-6 ] : base class */
-
-  /* [ WORD 7-8 ]  */
-  tree rhs, lhs;
-};
-
-/* GIMPLE_OMP_ATOMIC_STORE.
-   See note on GIMPLE_OMP_ATOMIC_LOAD.  */
-
-struct GTY((tag("GSS_OMP_ATOMIC_STORE_LAYOUT")))
-  gimple_statement_omp_atomic_store_layout : public gimple_statement_base
-{
-  /* [ WORD 1-6 ] : base class */
-
-  /* [ WORD 7 ]  */
-  tree val;
-};
-
-struct GTY((tag("GSS_OMP_ATOMIC_STORE_LAYOUT")))
-  gimple_statement_omp_atomic_store :
-    public gimple_statement_omp_atomic_store_layout
-{
-    /* No extra fields; adds invariant:
-         stmt->code == GIMPLE_OMP_ATOMIC_STORE.  */
-};
-
-struct GTY((tag("GSS_OMP_ATOMIC_STORE_LAYOUT")))
-  gimple_statement_omp_return :
-    public gimple_statement_omp_atomic_store_layout
-{
-    /* No extra fields; adds invariant:
-         stmt->code == GIMPLE_OMP_RETURN.  */
-};
-
-/* GIMPLE_TRANSACTION.  */
-
-/* Bits to be stored in the GIMPLE_TRANSACTION subcode.  */
-
-/* The __transaction_atomic was declared [[outer]] or it is
-   __transaction_relaxed.  */
-#define GTMA_IS_OUTER			(1u << 0)
-#define GTMA_IS_RELAXED			(1u << 1)
-#define GTMA_DECLARATION_MASK		(GTMA_IS_OUTER | GTMA_IS_RELAXED)
-
-/* The transaction is seen to not have an abort.  */
-#define GTMA_HAVE_ABORT			(1u << 2)
-/* The transaction is seen to have loads or stores.  */
-#define GTMA_HAVE_LOAD			(1u << 3)
-#define GTMA_HAVE_STORE			(1u << 4)
-/* The transaction MAY enter serial irrevocable mode in its dynamic scope.  */
-#define GTMA_MAY_ENTER_IRREVOCABLE	(1u << 5)
-/* The transaction WILL enter serial irrevocable mode.
-   An irrevocable block post-dominates the entire transaction, such
-   that all invocations of the transaction will go serial-irrevocable.
-   In such case, we don't bother instrumenting the transaction, and
-   tell the runtime that it should begin the transaction in
-   serial-irrevocable mode.  */
-#define GTMA_DOES_GO_IRREVOCABLE	(1u << 6)
-/* The transaction contains no instrumentation code whatsover, most
-   likely because it is guaranteed to go irrevocable upon entry.  */
-#define GTMA_HAS_NO_INSTRUMENTATION	(1u << 7)
-
-struct GTY((tag("GSS_TRANSACTION")))
-  gimple_statement_transaction : public gimple_statement_with_memory_ops_base
-{
-  /* [ WORD 1-9 ] : base class */
-
-  /* [ WORD 10 ] */
-  gimple_seq body;
-
-  /* [ WORD 11 ] */
-  tree label;
-};
-
-#define DEFGSSTRUCT(SYM, STRUCT, HAS_TREE_OP)	SYM,
-enum gimple_statement_structure_enum {
-#include "gsstruct.def"
-    LAST_GSS_ENUM
-};
-#undef DEFGSSTRUCT
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_asm>::test (gimple gs)
-{
-  return gs->code == GIMPLE_ASM;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_bind>::test (gimple gs)
-{
-  return gs->code == GIMPLE_BIND;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_call>::test (gimple gs)
-{
-  return gs->code == GIMPLE_CALL;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_catch>::test (gimple gs)
-{
-  return gs->code == GIMPLE_CATCH;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_resx>::test (gimple gs)
-{
-  return gs->code == GIMPLE_RESX;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_eh_dispatch>::test (gimple gs)
-{
-  return gs->code == GIMPLE_EH_DISPATCH;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_eh_else>::test (gimple gs)
-{
-  return gs->code == GIMPLE_EH_ELSE;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_eh_filter>::test (gimple gs)
-{
-  return gs->code == GIMPLE_EH_FILTER;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_eh_mnt>::test (gimple gs)
-{
-  return gs->code == GIMPLE_EH_MUST_NOT_THROW;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_omp_atomic_load>::test (gimple gs)
-{
-  return gs->code == GIMPLE_OMP_ATOMIC_LOAD;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_omp_atomic_store>::test (gimple gs)
-{
-  return gs->code == GIMPLE_OMP_ATOMIC_STORE;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_omp_return>::test (gimple gs)
-{
-  return gs->code == GIMPLE_OMP_RETURN;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_omp_continue>::test (gimple gs)
-{
-  return gs->code == GIMPLE_OMP_CONTINUE;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_omp_critical>::test (gimple gs)
-{
-  return gs->code == GIMPLE_OMP_CRITICAL;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_omp_for>::test (gimple gs)
-{
-  return gs->code == GIMPLE_OMP_FOR;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_omp_taskreg>::test (gimple gs)
-{
-  return gs->code == GIMPLE_OMP_PARALLEL || gs->code == GIMPLE_OMP_TASK;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_omp_parallel>::test (gimple gs)
-{
-  return gs->code == GIMPLE_OMP_PARALLEL;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_omp_target>::test (gimple gs)
-{
-  return gs->code == GIMPLE_OMP_TARGET;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_omp_sections>::test (gimple gs)
-{
-  return gs->code == GIMPLE_OMP_SECTIONS;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_omp_single>::test (gimple gs)
-{
-  return gs->code == GIMPLE_OMP_SINGLE;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_omp_teams>::test (gimple gs)
-{
-  return gs->code == GIMPLE_OMP_TEAMS;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_omp_task>::test (gimple gs)
-{
-  return gs->code == GIMPLE_OMP_TASK;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_phi>::test (gimple gs)
-{
-  return gs->code == GIMPLE_PHI;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_transaction>::test (gimple gs)
-{
-  return gs->code == GIMPLE_TRANSACTION;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_try>::test (gimple gs)
-{
-  return gs->code == GIMPLE_TRY;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_wce>::test (gimple gs)
-{
-  return gs->code == GIMPLE_WITH_CLEANUP_EXPR;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_asm>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_ASM;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_bind>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_BIND;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_call>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_CALL;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_catch>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_CATCH;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_resx>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_RESX;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_eh_dispatch>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_EH_DISPATCH;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_eh_filter>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_EH_FILTER;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_omp_atomic_load>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_OMP_ATOMIC_LOAD;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_omp_atomic_store>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_OMP_ATOMIC_STORE;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_omp_return>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_OMP_RETURN;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_omp_continue>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_OMP_CONTINUE;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_omp_critical>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_OMP_CRITICAL;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_omp_for>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_OMP_FOR;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_omp_taskreg>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_OMP_PARALLEL || gs->code == GIMPLE_OMP_TASK;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_omp_parallel>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_OMP_PARALLEL;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_omp_target>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_OMP_TARGET;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_omp_sections>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_OMP_SECTIONS;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_omp_single>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_OMP_SINGLE;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_omp_teams>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_OMP_TEAMS;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_omp_task>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_OMP_TASK;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_phi>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_PHI;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_transaction>::test (const_gimple gs)
-{
-  return gs->code == GIMPLE_TRANSACTION;
-}
-
-/* Offset in bytes to the location of the operand vector.
-   Zero if there is no operand vector for this tuple structure.  */
-extern size_t const gimple_ops_offset_[];
-
-/* Map GIMPLE codes to GSS codes.  */
-extern enum gimple_statement_structure_enum const gss_for_code_[];
-
-/* This variable holds the currently expanded gimple statement for purposes
-   of comminucating the profile info to the builtin expanders.  */
-extern gimple currently_expanding_gimple_stmt;
-
-#define gimple_alloc(c, n) gimple_alloc_stat (c, n MEM_STAT_INFO)
-gimple gimple_alloc_stat (enum gimple_code, unsigned MEM_STAT_DECL);
-gimple gimple_build_return (tree);
-void gimple_call_reset_alias_info (gimple);
-gimple gimple_build_call_vec (tree, vec<tree> );
-gimple gimple_build_call (tree, unsigned, ...);
-gimple gimple_build_call_valist (tree, unsigned, va_list);
-gimple gimple_build_call_internal (enum internal_fn, unsigned, ...);
-gimple gimple_build_call_internal_vec (enum internal_fn, vec<tree> );
-gimple gimple_build_call_from_tree (tree);
-gimple gimple_build_assign_stat (tree, tree MEM_STAT_DECL);
-#define gimple_build_assign(l,r) gimple_build_assign_stat (l, r MEM_STAT_INFO)
-gimple gimple_build_assign_with_ops (enum tree_code, tree,
-				     tree, tree, tree CXX_MEM_STAT_INFO);
-gimple gimple_build_assign_with_ops (enum tree_code, tree,
-				     tree, tree CXX_MEM_STAT_INFO);
-gimple gimple_build_cond (enum tree_code, tree, tree, tree, tree);
-gimple gimple_build_cond_from_tree (tree, tree, tree);
-void gimple_cond_set_condition_from_tree (gimple, tree);
-gimple gimple_build_label (tree label);
-gimple gimple_build_goto (tree dest);
-gimple gimple_build_nop (void);
-gimple gimple_build_bind (tree, gimple_seq, tree);
-gimple gimple_build_asm_vec (const char *, vec<tree, va_gc> *,
-			     vec<tree, va_gc> *, vec<tree, va_gc> *,
-			     vec<tree, va_gc> *);
-gimple gimple_build_catch (tree, gimple_seq);
-gimple gimple_build_eh_filter (tree, gimple_seq);
-gimple gimple_build_eh_must_not_throw (tree);
-gimple gimple_build_eh_else (gimple_seq, gimple_seq);
-gimple_statement_try *gimple_build_try (gimple_seq, gimple_seq,
-					enum gimple_try_flags);
-gimple gimple_build_wce (gimple_seq);
-gimple gimple_build_resx (int);
-gimple gimple_build_switch_nlabels (unsigned, tree, tree);
-gimple gimple_build_switch (tree, tree, vec<tree> );
-gimple gimple_build_eh_dispatch (int);
-gimple gimple_build_debug_bind_stat (tree, tree, gimple MEM_STAT_DECL);
-#define gimple_build_debug_bind(var,val,stmt)			\
-  gimple_build_debug_bind_stat ((var), (val), (stmt) MEM_STAT_INFO)
-gimple gimple_build_debug_source_bind_stat (tree, tree, gimple MEM_STAT_DECL);
-#define gimple_build_debug_source_bind(var,val,stmt)			\
-  gimple_build_debug_source_bind_stat ((var), (val), (stmt) MEM_STAT_INFO)
-gimple gimple_build_omp_critical (gimple_seq, tree);
-gimple gimple_build_omp_for (gimple_seq, int, tree, size_t, gimple_seq);
-gimple gimple_build_omp_parallel (gimple_seq, tree, tree, tree);
-gimple gimple_build_omp_task (gimple_seq, tree, tree, tree, tree, tree, tree);
-gimple gimple_build_omp_section (gimple_seq);
-gimple gimple_build_omp_master (gimple_seq);
-gimple gimple_build_omp_taskgroup (gimple_seq);
-gimple gimple_build_omp_continue (tree, tree);
-gimple gimple_build_omp_ordered (gimple_seq);
-gimple gimple_build_omp_return (bool);
-gimple gimple_build_omp_sections (gimple_seq, tree);
-gimple gimple_build_omp_sections_switch (void);
-gimple gimple_build_omp_single (gimple_seq, tree);
-gimple gimple_build_omp_target (gimple_seq, int, tree);
-gimple gimple_build_omp_teams (gimple_seq, tree);
-gimple gimple_build_omp_atomic_load (tree, tree);
-gimple gimple_build_omp_atomic_store (tree);
-gimple gimple_build_transaction (gimple_seq, tree);
-gimple gimple_build_predict (enum br_predictor, enum prediction);
-extern void gimple_seq_add_stmt (gimple_seq *, gimple);
-extern void gimple_seq_add_stmt_without_update (gimple_seq *, gimple);
-void gimple_seq_add_seq (gimple_seq *, gimple_seq);
-extern void annotate_all_with_location_after (gimple_seq, gimple_stmt_iterator,
-					      location_t);
-extern void annotate_all_with_location (gimple_seq, location_t);
-bool empty_body_p (gimple_seq);
-gimple_seq gimple_seq_copy (gimple_seq);
-bool gimple_call_same_target_p (const_gimple, const_gimple);
-int gimple_call_flags (const_gimple);
-int gimple_call_arg_flags (const_gimple, unsigned);
-int gimple_call_return_flags (const_gimple);
-bool gimple_assign_copy_p (gimple);
-bool gimple_assign_ssa_name_copy_p (gimple);
-bool gimple_assign_unary_nop_p (gimple);
-void gimple_set_bb (gimple, basic_block);
-void gimple_assign_set_rhs_from_tree (gimple_stmt_iterator *, tree);
-void gimple_assign_set_rhs_with_ops_1 (gimple_stmt_iterator *, enum tree_code,
-				       tree, tree, tree);
-tree gimple_get_lhs (const_gimple);
-void gimple_set_lhs (gimple, tree);
-gimple gimple_copy (gimple);
-bool gimple_has_side_effects (const_gimple);
-bool gimple_could_trap_p_1 (gimple, bool, bool);
-bool gimple_could_trap_p (gimple);
-bool gimple_assign_rhs_could_trap_p (gimple);
-extern void dump_gimple_statistics (void);
-unsigned get_gimple_rhs_num_ops (enum tree_code);
-extern tree canonicalize_cond_expr_cond (tree);
-gimple gimple_call_copy_skip_args (gimple, bitmap);
-extern bool gimple_compare_field_offset (tree, tree);
-extern tree gimple_unsigned_type (tree);
-extern tree gimple_signed_type (tree);
-extern alias_set_type gimple_get_alias_set (tree);
-extern bool gimple_ior_addresses_taken (bitmap, gimple);
-extern bool gimple_builtin_call_types_compatible_p (gimple, tree);
-extern bool gimple_call_builtin_p (gimple);
-extern bool gimple_call_builtin_p (gimple, enum built_in_class);
-extern bool gimple_call_builtin_p (gimple, enum built_in_function);
-extern bool gimple_asm_clobbers_memory_p (const_gimple);
-extern void dump_decl_set (FILE *, bitmap);
-extern bool nonfreeing_call_p (gimple);
-extern bool infer_nonnull_range (gimple, tree, bool, bool);
-extern void sort_case_labels (vec<tree> );
-extern void preprocess_case_label_vec_for_gimple (vec<tree> , tree, tree *);
-extern void gimple_seq_set_location (gimple_seq , location_t);
-
-/* Formal (expression) temporary table handling: multiple occurrences of
-   the same scalar expression are evaluated into the same temporary.  */
-
-typedef struct gimple_temp_hash_elt
-{
-  tree val;   /* Key */
-  tree temp;  /* Value */
-} elt_t;
-
-/* Get the number of the next statement uid to be allocated.  */
-static inline unsigned int
-gimple_stmt_max_uid (struct function *fn)
-{
-  return fn->last_stmt_uid;
-}
-
-/* Set the number of the next statement uid to be allocated.  */
-static inline void
-set_gimple_stmt_max_uid (struct function *fn, unsigned int maxid)
-{
-  fn->last_stmt_uid = maxid;
-}
-
-/* Set the number of the next statement uid to be allocated.  */
-static inline unsigned int
-inc_gimple_stmt_max_uid (struct function *fn)
-{
-  return fn->last_stmt_uid++;
-}
-
-/* Return the first node in GIMPLE sequence S.  */
-
-static inline gimple_seq_node
-gimple_seq_first (gimple_seq s)
-{
-  return s;
-}
-
-
-/* Return the first statement in GIMPLE sequence S.  */
-
-static inline gimple
-gimple_seq_first_stmt (gimple_seq s)
-{
-  gimple_seq_node n = gimple_seq_first (s);
-  return n;
-}
-
-
-/* Return the last node in GIMPLE sequence S.  */
-
-static inline gimple_seq_node
-gimple_seq_last (gimple_seq s)
-{
-  return s ? s->prev : NULL;
-}
-
-
-/* Return the last statement in GIMPLE sequence S.  */
-
-static inline gimple
-gimple_seq_last_stmt (gimple_seq s)
-{
-  gimple_seq_node n = gimple_seq_last (s);
-  return n;
-}
-
-
-/* Set the last node in GIMPLE sequence *PS to LAST.  */
-
-static inline void
-gimple_seq_set_last (gimple_seq *ps, gimple_seq_node last)
-{
-  (*ps)->prev = last;
-}
-
-
-/* Set the first node in GIMPLE sequence *PS to FIRST.  */
-
-static inline void
-gimple_seq_set_first (gimple_seq *ps, gimple_seq_node first)
-{
-  *ps = first;
-}
-
-
-/* Return true if GIMPLE sequence S is empty.  */
-
-static inline bool
-gimple_seq_empty_p (gimple_seq s)
-{
-  return s == NULL;
-}
-
-/* Allocate a new sequence and initialize its first element with STMT.  */
-
-static inline gimple_seq
-gimple_seq_alloc_with_stmt (gimple stmt)
-{
-  gimple_seq seq = NULL;
-  gimple_seq_add_stmt (&seq, stmt);
-  return seq;
-}
-
-
-/* Returns the sequence of statements in BB.  */
-
-static inline gimple_seq
-bb_seq (const_basic_block bb)
-{
-  return (!(bb->flags & BB_RTL)) ? bb->il.gimple.seq : NULL;
-}
-
-static inline gimple_seq *
-bb_seq_addr (basic_block bb)
-{
-  return (!(bb->flags & BB_RTL)) ? &bb->il.gimple.seq : NULL;
-}
-
-/* Sets the sequence of statements in BB to SEQ.  */
-
-static inline void
-set_bb_seq (basic_block bb, gimple_seq seq)
-{
-  gcc_checking_assert (!(bb->flags & BB_RTL));
-  bb->il.gimple.seq = seq;
-}
-
-
-/* Return the code for GIMPLE statement G.  */
-
-static inline enum gimple_code
-gimple_code (const_gimple g)
-{
-  return g->code;
-}
-
-
-/* Return the GSS code used by a GIMPLE code.  */
-
-static inline enum gimple_statement_structure_enum
-gss_for_code (enum gimple_code code)
-{
-  gcc_gimple_checking_assert ((unsigned int)code < LAST_AND_UNUSED_GIMPLE_CODE);
-  return gss_for_code_[code];
-}
-
-
-/* Return which GSS code is used by GS.  */
-
-static inline enum gimple_statement_structure_enum
-gimple_statement_structure (gimple gs)
-{
-  return gss_for_code (gimple_code (gs));
-}
-
-
-/* Return true if statement G has sub-statements.  This is only true for
-   High GIMPLE statements.  */
-
-static inline bool
-gimple_has_substatements (gimple g)
-{
-  switch (gimple_code (g))
-    {
-    case GIMPLE_BIND:
-    case GIMPLE_CATCH:
-    case GIMPLE_EH_FILTER:
-    case GIMPLE_EH_ELSE:
-    case GIMPLE_TRY:
-    case GIMPLE_OMP_FOR:
-    case GIMPLE_OMP_MASTER:
-    case GIMPLE_OMP_TASKGROUP:
-    case GIMPLE_OMP_ORDERED:
-    case GIMPLE_OMP_SECTION:
-    case GIMPLE_OMP_PARALLEL:
-    case GIMPLE_OMP_TASK:
-    case GIMPLE_OMP_SECTIONS:
-    case GIMPLE_OMP_SINGLE:
-    case GIMPLE_OMP_TARGET:
-    case GIMPLE_OMP_TEAMS:
-    case GIMPLE_OMP_CRITICAL:
-    case GIMPLE_WITH_CLEANUP_EXPR:
-    case GIMPLE_TRANSACTION:
-      return true;
-
-    default:
-      return false;
-    }
-}
-
-
-/* Return the basic block holding statement G.  */
-
-static inline basic_block
-gimple_bb (const_gimple g)
-{
-  return g->bb;
-}
-
-
-/* Return the lexical scope block holding statement G.  */
-
-static inline tree
-gimple_block (const_gimple g)
-{
-  return LOCATION_BLOCK (g->location);
-}
-
-
-/* Set BLOCK to be the lexical scope block holding statement G.  */
-
-static inline void
-gimple_set_block (gimple g, tree block)
-{
-  if (block)
-    g->location =
-	COMBINE_LOCATION_DATA (line_table, g->location, block);
-  else
-    g->location = LOCATION_LOCUS (g->location);
-}
-
-
-/* Return location information for statement G.  */
-
-static inline location_t
-gimple_location (const_gimple g)
-{
-  return g->location;
-}
-
-/* Return pointer to location information for statement G.  */
-
-static inline const location_t *
-gimple_location_ptr (const_gimple g)
-{
-  return &g->location;
-}
-
-
-/* Set location information for statement G.  */
-
-static inline void
-gimple_set_location (gimple g, location_t location)
-{
-  g->location = location;
-}
-
-
-/* Return true if G contains location information.  */
-
-static inline bool
-gimple_has_location (const_gimple g)
-{
-  return LOCATION_LOCUS (gimple_location (g)) != UNKNOWN_LOCATION;
-}
-
-
-/* Return the file name of the location of STMT.  */
-
-static inline const char *
-gimple_filename (const_gimple stmt)
-{
-  return LOCATION_FILE (gimple_location (stmt));
-}
-
-
-/* Return the line number of the location of STMT.  */
-
-static inline int
-gimple_lineno (const_gimple stmt)
-{
-  return LOCATION_LINE (gimple_location (stmt));
-}
-
-
-/* Determine whether SEQ is a singleton. */
-
-static inline bool
-gimple_seq_singleton_p (gimple_seq seq)
-{
-  return ((gimple_seq_first (seq) != NULL)
-	  && (gimple_seq_first (seq) == gimple_seq_last (seq)));
-}
-
-/* Return true if no warnings should be emitted for statement STMT.  */
-
-static inline bool
-gimple_no_warning_p (const_gimple stmt)
-{
-  return stmt->no_warning;
-}
-
-/* Set the no_warning flag of STMT to NO_WARNING.  */
-
-static inline void
-gimple_set_no_warning (gimple stmt, bool no_warning)
-{
-  stmt->no_warning = (unsigned) no_warning;
-}
-
-/* Set the visited status on statement STMT to VISITED_P.  */
-
-static inline void
-gimple_set_visited (gimple stmt, bool visited_p)
-{
-  stmt->visited = (unsigned) visited_p;
-}
-
-
-/* Return the visited status for statement STMT.  */
-
-static inline bool
-gimple_visited_p (gimple stmt)
-{
-  return stmt->visited;
-}
-
-
-/* Set pass local flag PLF on statement STMT to VAL_P.  */
-
-static inline void
-gimple_set_plf (gimple stmt, enum plf_mask plf, bool val_p)
-{
-  if (val_p)
-    stmt->plf |= (unsigned int) plf;
-  else
-    stmt->plf &= ~((unsigned int) plf);
-}
-
-
-/* Return the value of pass local flag PLF on statement STMT.  */
-
-static inline unsigned int
-gimple_plf (gimple stmt, enum plf_mask plf)
-{
-  return stmt->plf & ((unsigned int) plf);
-}
-
-
-/* Set the UID of statement.  */
-
-static inline void
-gimple_set_uid (gimple g, unsigned uid)
-{
-  g->uid = uid;
-}
-
-
-/* Return the UID of statement.  */
-
-static inline unsigned
-gimple_uid (const_gimple g)
-{
-  return g->uid;
-}
-
-
-/* Make statement G a singleton sequence.  */
-
-static inline void
-gimple_init_singleton (gimple g)
-{
-  g->next = NULL;
-  g->prev = g;
-}
-
-
-/* Return true if GIMPLE statement G has register or memory operands.  */
-
-static inline bool
-gimple_has_ops (const_gimple g)
-{
-  return gimple_code (g) >= GIMPLE_COND && gimple_code (g) <= GIMPLE_RETURN;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_with_ops>::test (const_gimple gs)
-{
-  return gimple_has_ops (gs);
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_with_ops>::test (gimple gs)
-{
-  return gimple_has_ops (gs);
-}
-
-/* Return true if GIMPLE statement G has memory operands.  */
-
-static inline bool
-gimple_has_mem_ops (const_gimple g)
-{
-  return gimple_code (g) >= GIMPLE_ASSIGN && gimple_code (g) <= GIMPLE_RETURN;
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <const gimple_statement_with_memory_ops>::test (const_gimple gs)
-{
-  return gimple_has_mem_ops (gs);
-}
-
-template <>
-template <>
-inline bool
-is_a_helper <gimple_statement_with_memory_ops>::test (gimple gs)
-{
-  return gimple_has_mem_ops (gs);
-}
-
-/* Return the set of USE operands for statement G.  */
-
-static inline struct use_optype_d *
-gimple_use_ops (const_gimple g)
-{
-  const gimple_statement_with_ops *ops_stmt =
-    dyn_cast <const gimple_statement_with_ops> (g);
-  if (!ops_stmt)
-    return NULL;
-  return ops_stmt->use_ops;
-}
-
-
-/* Set USE to be the set of USE operands for statement G.  */
-
-static inline void
-gimple_set_use_ops (gimple g, struct use_optype_d *use)
-{
-  gimple_statement_with_ops *ops_stmt =
-    as_a <gimple_statement_with_ops> (g);
-  ops_stmt->use_ops = use;
-}
-
-
-/* Return the single VUSE operand of the statement G.  */
-
-static inline tree
-gimple_vuse (const_gimple g)
-{
-  const gimple_statement_with_memory_ops *mem_ops_stmt =
-     dyn_cast <const gimple_statement_with_memory_ops> (g);
-  if (!mem_ops_stmt)
-    return NULL_TREE;
-  return mem_ops_stmt->vuse;
-}
-
-/* Return the single VDEF operand of the statement G.  */
-
-static inline tree
-gimple_vdef (const_gimple g)
-{
-  const gimple_statement_with_memory_ops *mem_ops_stmt =
-     dyn_cast <const gimple_statement_with_memory_ops> (g);
-  if (!mem_ops_stmt)
-    return NULL_TREE;
-  return mem_ops_stmt->vdef;
-}
-
-/* Return the single VUSE operand of the statement G.  */
-
-static inline tree *
-gimple_vuse_ptr (gimple g)
-{
-  gimple_statement_with_memory_ops *mem_ops_stmt =
-     dyn_cast <gimple_statement_with_memory_ops> (g);
-  if (!mem_ops_stmt)
-    return NULL;
-  return &mem_ops_stmt->vuse;
-}
-
-/* Return the single VDEF operand of the statement G.  */
-
-static inline tree *
-gimple_vdef_ptr (gimple g)
-{
-  gimple_statement_with_memory_ops *mem_ops_stmt =
-     dyn_cast <gimple_statement_with_memory_ops> (g);
-  if (!mem_ops_stmt)
-    return NULL;
-  return &mem_ops_stmt->vdef;
-}
-
-/* Set the single VUSE operand of the statement G.  */
-
-static inline void
-gimple_set_vuse (gimple g, tree vuse)
-{
-  gimple_statement_with_memory_ops *mem_ops_stmt =
-    as_a <gimple_statement_with_memory_ops> (g);
-  mem_ops_stmt->vuse = vuse;
-}
-
-/* Set the single VDEF operand of the statement G.  */
-
-static inline void
-gimple_set_vdef (gimple g, tree vdef)
-{
-  gimple_statement_with_memory_ops *mem_ops_stmt =
-    as_a <gimple_statement_with_memory_ops> (g);
-  mem_ops_stmt->vdef = vdef;
-}
-
-
-/* Return true if statement G has operands and the modified field has
-   been set.  */
-
-static inline bool
-gimple_modified_p (const_gimple g)
-{
-  return (gimple_has_ops (g)) ? (bool) g->modified : false;
-}
-
-
-/* Set the MODIFIED flag to MODIFIEDP, iff the gimple statement G has
-   a MODIFIED field.  */
-
-static inline void
-gimple_set_modified (gimple s, bool modifiedp)
-{
-  if (gimple_has_ops (s))
-    s->modified = (unsigned) modifiedp;
-}
-
-
-/* Return the tree code for the expression computed by STMT.  This is
-   only valid for GIMPLE_COND, GIMPLE_CALL and GIMPLE_ASSIGN.  For
-   GIMPLE_CALL, return CALL_EXPR as the expression code for
-   consistency.  This is useful when the caller needs to deal with the
-   three kinds of computation that GIMPLE supports.  */
-
-static inline enum tree_code
-gimple_expr_code (const_gimple stmt)
-{
-  enum gimple_code code = gimple_code (stmt);
-  if (code == GIMPLE_ASSIGN || code == GIMPLE_COND)
-    return (enum tree_code) stmt->subcode;
-  else
-    {
-      gcc_gimple_checking_assert (code == GIMPLE_CALL);
-      return CALL_EXPR;
-    }
-}
-
-
-/* Return true if statement STMT contains volatile operands.  */
-
-static inline bool
-gimple_has_volatile_ops (const_gimple stmt)
-{
-  if (gimple_has_mem_ops (stmt))
-    return stmt->has_volatile_ops;
-  else
-    return false;
-}
-
-
-/* Set the HAS_VOLATILE_OPS flag to VOLATILEP.  */
-
-static inline void
-gimple_set_has_volatile_ops (gimple stmt, bool volatilep)
-{
-  if (gimple_has_mem_ops (stmt))
-    stmt->has_volatile_ops = (unsigned) volatilep;
-}
-
-/* Return true if STMT is in a transaction.  */
-
-static inline bool
-gimple_in_transaction (gimple stmt)
-{
-  return bb_in_transaction (gimple_bb (stmt));
-}
-
-/* Return true if statement STMT may access memory.  */
-
-static inline bool
-gimple_references_memory_p (gimple stmt)
-{
-  return gimple_has_mem_ops (stmt) && gimple_vuse (stmt);
-}
-
-
-/* Return the subcode for OMP statement S.  */
-
-static inline unsigned
-gimple_omp_subcode (const_gimple s)
-{
-  gcc_gimple_checking_assert (gimple_code (s) >= GIMPLE_OMP_ATOMIC_LOAD
-	      && gimple_code (s) <= GIMPLE_OMP_TEAMS);
-  return s->subcode;
-}
-
-/* Set the subcode for OMP statement S to SUBCODE.  */
-
-static inline void
-gimple_omp_set_subcode (gimple s, unsigned int subcode)
-{
-  /* We only have 16 bits for the subcode.  Assert that we are not
-     overflowing it.  */
-  gcc_gimple_checking_assert (subcode < (1 << 16));
-  s->subcode = subcode;
-}
-
-/* Set the nowait flag on OMP_RETURN statement S.  */
-
-static inline void
-gimple_omp_return_set_nowait (gimple s)
-{
-  GIMPLE_CHECK (s, GIMPLE_OMP_RETURN);
-  s->subcode |= GF_OMP_RETURN_NOWAIT;
-}
-
-
-/* Return true if OMP return statement G has the GF_OMP_RETURN_NOWAIT
-   flag set.  */
-
-static inline bool
-gimple_omp_return_nowait_p (const_gimple g)
-{
-  GIMPLE_CHECK (g, GIMPLE_OMP_RETURN);
-  return (gimple_omp_subcode (g) & GF_OMP_RETURN_NOWAIT) != 0;
-}
-
-
-/* Set the LHS of OMP return.  */
-
-static inline void
-gimple_omp_return_set_lhs (gimple g, tree lhs)
-{
-  gimple_statement_omp_return *omp_return_stmt =
-    as_a <gimple_statement_omp_return> (g);
-  omp_return_stmt->val = lhs;
-}
-
-
-/* Get the LHS of OMP return.  */
-
-static inline tree
-gimple_omp_return_lhs (const_gimple g)
-{
-  const gimple_statement_omp_return *omp_return_stmt =
-    as_a <const gimple_statement_omp_return> (g);
-  return omp_return_stmt->val;
-}
-
-
-/* Return a pointer to the LHS of OMP return.  */
-
-static inline tree *
-gimple_omp_return_lhs_ptr (gimple g)
-{
-  gimple_statement_omp_return *omp_return_stmt =
-    as_a <gimple_statement_omp_return> (g);
-  return &omp_return_stmt->val;
-}
-
-
-/* Return true if OMP section statement G has the GF_OMP_SECTION_LAST
-   flag set.  */
-
-static inline bool
-gimple_omp_section_last_p (const_gimple g)
-{
-  GIMPLE_CHECK (g, GIMPLE_OMP_SECTION);
-  return (gimple_omp_subcode (g) & GF_OMP_SECTION_LAST) != 0;
-}
-
-
-/* Set the GF_OMP_SECTION_LAST flag on G.  */
-
-static inline void
-gimple_omp_section_set_last (gimple g)
-{
-  GIMPLE_CHECK (g, GIMPLE_OMP_SECTION);
-  g->subcode |= GF_OMP_SECTION_LAST;
-}
-
-
-/* Return true if OMP parallel statement G has the
-   GF_OMP_PARALLEL_COMBINED flag set.  */
-
-static inline bool
-gimple_omp_parallel_combined_p (const_gimple g)
-{
-  GIMPLE_CHECK (g, GIMPLE_OMP_PARALLEL);
-  return (gimple_omp_subcode (g) & GF_OMP_PARALLEL_COMBINED) != 0;
-}
-
-
-/* Set the GF_OMP_PARALLEL_COMBINED field in G depending on the boolean
-   value of COMBINED_P.  */
-
-static inline void
-gimple_omp_parallel_set_combined_p (gimple g, bool combined_p)
-{
-  GIMPLE_CHECK (g, GIMPLE_OMP_PARALLEL);
-  if (combined_p)
-    g->subcode |= GF_OMP_PARALLEL_COMBINED;
-  else
-    g->subcode &= ~GF_OMP_PARALLEL_COMBINED;
-}
-
-
-/* Return true if OMP atomic load/store statement G has the
-   GF_OMP_ATOMIC_NEED_VALUE flag set.  */
-
-static inline bool
-gimple_omp_atomic_need_value_p (const_gimple g)
-{
-  if (gimple_code (g) != GIMPLE_OMP_ATOMIC_LOAD)
-    GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_STORE);
-  return (gimple_omp_subcode (g) & GF_OMP_ATOMIC_NEED_VALUE) != 0;
-}
-
-
-/* Set the GF_OMP_ATOMIC_NEED_VALUE flag on G.  */
-
-static inline void
-gimple_omp_atomic_set_need_value (gimple g)
-{
-  if (gimple_code (g) != GIMPLE_OMP_ATOMIC_LOAD)
-    GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_STORE);
-  g->subcode |= GF_OMP_ATOMIC_NEED_VALUE;
-}
-
-
-/* Return true if OMP atomic load/store statement G has the
-   GF_OMP_ATOMIC_SEQ_CST flag set.  */
-
-static inline bool
-gimple_omp_atomic_seq_cst_p (const_gimple g)
-{
-  if (gimple_code (g) != GIMPLE_OMP_ATOMIC_LOAD)
-    GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_STORE);
-  return (gimple_omp_subcode (g) & GF_OMP_ATOMIC_SEQ_CST) != 0;
-}
-
-
-/* Set the GF_OMP_ATOMIC_SEQ_CST flag on G.  */
-
-static inline void
-gimple_omp_atomic_set_seq_cst (gimple g)
-{
-  if (gimple_code (g) != GIMPLE_OMP_ATOMIC_LOAD)
-    GIMPLE_CHECK (g, GIMPLE_OMP_ATOMIC_STORE);
-  g->subcode |= GF_OMP_ATOMIC_SEQ_CST;
-}
-
-
-/* Return the number of operands for statement GS.  */
-
-static inline unsigned
-gimple_num_ops (const_gimple gs)
-{
-  return gs->num_ops;
-}
-
-
-/* Set the number of operands for statement GS.  */
-
-static inline void
-gimple_set_num_ops (gimple gs, unsigned num_ops)
-{
-  gs->num_ops = num_ops;
-}
-
-
-/* Return the array of operands for statement GS.  */
-
-static inline tree *
-gimple_ops (gimple gs)
-{
-  size_t off;
-
-  /* All the tuples have their operand vector at the very bottom
-     of the structure.  Note that those structures that do not
-     have an operand vector have a zero offset.  */
-  off = gimple_ops_offset_[gimple_statement_structure (gs)];
-  gcc_gimple_checking_assert (off != 0);
-
-  return (tree *) ((char *) gs + off);
-}
-
-
-/* Return operand I for statement GS.  */
-
-static inline tree
-gimple_op (const_gimple gs, unsigned i)
-{
-  if (gimple_has_ops (gs))
-    {
-      gcc_gimple_checking_assert (i < gimple_num_ops (gs));
-      return gimple_ops (CONST_CAST_GIMPLE (gs))[i];
-    }
-  else
-    return NULL_TREE;
-}
-
-/* Return a pointer to operand I for statement GS.  */
-
-static inline tree *
-gimple_op_ptr (const_gimple gs, unsigned i)
-{
-  if (gimple_has_ops (gs))
-    {
-      gcc_gimple_checking_assert (i < gimple_num_ops (gs));
-      return gimple_ops (CONST_CAST_GIMPLE (gs)) + i;
-    }
-  else
-    return NULL;
-}
-
-/* Set operand I of statement GS to OP.  */
-
-static inline void
-gimple_set_op (gimple gs, unsigned i, tree op)
-{
-  gcc_gimple_checking_assert (gimple_has_ops (gs) && i < gimple_num_ops (gs));
-
-  /* Note.  It may be tempting to assert that OP matches
-     is_gimple_operand, but that would be wrong.  Different tuples
-     accept slightly different sets of tree operands.  Each caller
-     should perform its own validation.  */
-  gimple_ops (gs)[i] = op;
-}
-
-/* Return true if GS is a GIMPLE_ASSIGN.  */
-
-static inline bool
-is_gimple_assign (const_gimple gs)
-{
-  return gimple_code (gs) == GIMPLE_ASSIGN;
-}
-
-/* Determine if expression CODE is one of the valid expressions that can
-   be used on the RHS of GIMPLE assignments.  */
-
-static inline enum gimple_rhs_class
-get_gimple_rhs_class (enum tree_code code)
-{
-  return (enum gimple_rhs_class) gimple_rhs_class_table[(int) code];
-}
-
-/* Return the LHS of assignment statement GS.  */
-
-static inline tree
-gimple_assign_lhs (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
-  return gimple_op (gs, 0);
-}
-
-
-/* Return a pointer to the LHS of assignment statement GS.  */
-
-static inline tree *
-gimple_assign_lhs_ptr (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
-  return gimple_op_ptr (gs, 0);
-}
-
-
-/* Set LHS to be the LHS operand of assignment statement GS.  */
-
-static inline void
-gimple_assign_set_lhs (gimple gs, tree lhs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
-  gimple_set_op (gs, 0, lhs);
-
-  if (lhs && TREE_CODE (lhs) == SSA_NAME)
-    SSA_NAME_DEF_STMT (lhs) = gs;
-}
-
-
-/* Return the first operand on the RHS of assignment statement GS.  */
-
-static inline tree
-gimple_assign_rhs1 (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
-  return gimple_op (gs, 1);
-}
-
-
-/* Return a pointer to the first operand on the RHS of assignment
-   statement GS.  */
-
-static inline tree *
-gimple_assign_rhs1_ptr (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
-  return gimple_op_ptr (gs, 1);
-}
-
-/* Set RHS to be the first operand on the RHS of assignment statement GS.  */
-
-static inline void
-gimple_assign_set_rhs1 (gimple gs, tree rhs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
-
-  gimple_set_op (gs, 1, rhs);
-}
-
-
-/* Return the second operand on the RHS of assignment statement GS.
-   If GS does not have two operands, NULL is returned instead.  */
-
-static inline tree
-gimple_assign_rhs2 (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
-
-  if (gimple_num_ops (gs) >= 3)
-    return gimple_op (gs, 2);
-  else
-    return NULL_TREE;
-}
-
-
-/* Return a pointer to the second operand on the RHS of assignment
-   statement GS.  */
-
-static inline tree *
-gimple_assign_rhs2_ptr (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
-  return gimple_op_ptr (gs, 2);
-}
-
-
-/* Set RHS to be the second operand on the RHS of assignment statement GS.  */
-
-static inline void
-gimple_assign_set_rhs2 (gimple gs, tree rhs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
-
-  gimple_set_op (gs, 2, rhs);
-}
-
-/* Return the third operand on the RHS of assignment statement GS.
-   If GS does not have two operands, NULL is returned instead.  */
-
-static inline tree
-gimple_assign_rhs3 (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
-
-  if (gimple_num_ops (gs) >= 4)
-    return gimple_op (gs, 3);
-  else
-    return NULL_TREE;
-}
-
-/* Return a pointer to the third operand on the RHS of assignment
-   statement GS.  */
-
-static inline tree *
-gimple_assign_rhs3_ptr (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
-  return gimple_op_ptr (gs, 3);
-}
-
-
-/* Set RHS to be the third operand on the RHS of assignment statement GS.  */
-
-static inline void
-gimple_assign_set_rhs3 (gimple gs, tree rhs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
-
-  gimple_set_op (gs, 3, rhs);
-}
-
-/* A wrapper around gimple_assign_set_rhs_with_ops_1, for callers which expect
-   to see only a maximum of two operands.  */
-
-static inline void
-gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *gsi, enum tree_code code,
-				tree op1, tree op2)
-{
-  gimple_assign_set_rhs_with_ops_1 (gsi, code, op1, op2, NULL);
-}
-
-/* Returns true if GS is a nontemporal move.  */
-
-static inline bool
-gimple_assign_nontemporal_move_p (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
-  return gs->nontemporal_move;
-}
-
-/* Sets nontemporal move flag of GS to NONTEMPORAL.  */
-
-static inline void
-gimple_assign_set_nontemporal_move (gimple gs, bool nontemporal)
-{
-  GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
-  gs->nontemporal_move = nontemporal;
-}
-
-
-/* Return the code of the expression computed on the rhs of assignment
-   statement GS.  In case that the RHS is a single object, returns the
-   tree code of the object.  */
-
-static inline enum tree_code
-gimple_assign_rhs_code (const_gimple gs)
-{
-  enum tree_code code;
-  GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
-
-  code = (enum tree_code) gs->subcode;
-  /* While we initially set subcode to the TREE_CODE of the rhs for
-     GIMPLE_SINGLE_RHS assigns we do not update that subcode to stay
-     in sync when we rewrite stmts into SSA form or do SSA propagations.  */
-  if (get_gimple_rhs_class (code) == GIMPLE_SINGLE_RHS)
-    code = TREE_CODE (gimple_assign_rhs1 (gs));
-
-  return code;
-}
-
-
-/* Set CODE to be the code for the expression computed on the RHS of
-   assignment S.  */
-
-static inline void
-gimple_assign_set_rhs_code (gimple s, enum tree_code code)
-{
-  GIMPLE_CHECK (s, GIMPLE_ASSIGN);
-  s->subcode = code;
-}
-
-
-/* Return the gimple rhs class of the code of the expression computed on
-   the rhs of assignment statement GS.
-   This will never return GIMPLE_INVALID_RHS.  */
-
-static inline enum gimple_rhs_class
-gimple_assign_rhs_class (const_gimple gs)
-{
-  return get_gimple_rhs_class (gimple_assign_rhs_code (gs));
-}
-
-/* Return true if GS is an assignment with a singleton RHS, i.e.,
-   there is no operator associated with the assignment itself.
-   Unlike gimple_assign_copy_p, this predicate returns true for
-   any RHS operand, including those that perform an operation
-   and do not have the semantics of a copy, such as COND_EXPR.  */
-
-static inline bool
-gimple_assign_single_p (gimple gs)
-{
-  return (is_gimple_assign (gs)
-          && gimple_assign_rhs_class (gs) == GIMPLE_SINGLE_RHS);
-}
-
-/* Return true if GS performs a store to its lhs.  */
-
-static inline bool
-gimple_store_p (gimple gs)
-{
-  tree lhs = gimple_get_lhs (gs);
-  return lhs && !is_gimple_reg (lhs);
-}
-
-/* Return true if GS is an assignment that loads from its rhs1.  */
-
-static inline bool
-gimple_assign_load_p (gimple gs)
-{
-  tree rhs;
-  if (!gimple_assign_single_p (gs))
-    return false;
-  rhs = gimple_assign_rhs1 (gs);
-  if (TREE_CODE (rhs) == WITH_SIZE_EXPR)
-    return true;
-  rhs = get_base_address (rhs);
-  return (DECL_P (rhs)
-	  || TREE_CODE (rhs) == MEM_REF || TREE_CODE (rhs) == TARGET_MEM_REF);
-}
-
-
-/* Return true if S is a type-cast assignment.  */
-
-static inline bool
-gimple_assign_cast_p (gimple s)
-{
-  if (is_gimple_assign (s))
-    {
-      enum tree_code sc = gimple_assign_rhs_code (s);
-      return CONVERT_EXPR_CODE_P (sc)
-	     || sc == VIEW_CONVERT_EXPR
-	     || sc == FIX_TRUNC_EXPR;
-    }
-
-  return false;
-}
-
-/* Return true if S is a clobber statement.  */
-
-static inline bool
-gimple_clobber_p (gimple s)
-{
-  return gimple_assign_single_p (s)
-         && TREE_CLOBBER_P (gimple_assign_rhs1 (s));
-}
-
-/* Return true if GS is a GIMPLE_CALL.  */
-
-static inline bool
-is_gimple_call (const_gimple gs)
-{
-  return gimple_code (gs) == GIMPLE_CALL;
-}
-
-/* Return the LHS of call statement GS.  */
-
-static inline tree
-gimple_call_lhs (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_CALL);
-  return gimple_op (gs, 0);
-}
-
-
-/* Return a pointer to the LHS of call statement GS.  */
-
-static inline tree *
-gimple_call_lhs_ptr (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_CALL);
-  return gimple_op_ptr (gs, 0);
-}
-
-
-/* Set LHS to be the LHS operand of call statement GS.  */
-
-static inline void
-gimple_call_set_lhs (gimple gs, tree lhs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_CALL);
-  gimple_set_op (gs, 0, lhs);
-  if (lhs && TREE_CODE (lhs) == SSA_NAME)
-    SSA_NAME_DEF_STMT (lhs) = gs;
-}
-
-
-/* Return true if call GS calls an internal-only function, as enumerated
-   by internal_fn.  */
-
-static inline bool
-gimple_call_internal_p (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_CALL);
-  return (gs->subcode & GF_CALL_INTERNAL) != 0;
-}
-
-
-/* Return the target of internal call GS.  */
-
-static inline enum internal_fn
-gimple_call_internal_fn (const_gimple gs)
-{
-  gcc_gimple_checking_assert (gimple_call_internal_p (gs));
-  return static_cast <const gimple_statement_call *> (gs)->u.internal_fn;
-}
-
-
-/* Return the function type of the function called by GS.  */
-
-static inline tree
-gimple_call_fntype (const_gimple gs)
-{
-  const gimple_statement_call *call_stmt =
-    as_a <const gimple_statement_call> (gs);
-  if (gimple_call_internal_p (gs))
-    return NULL_TREE;
-  return call_stmt->u.fntype;
-}
-
-/* Set the type of the function called by GS to FNTYPE.  */
-
-static inline void
-gimple_call_set_fntype (gimple gs, tree fntype)
-{
-  gimple_statement_call *call_stmt = as_a <gimple_statement_call> (gs);
-  gcc_gimple_checking_assert (!gimple_call_internal_p (gs));
-  call_stmt->u.fntype = fntype;
-}
-
-
-/* Return the tree node representing the function called by call
-   statement GS.  */
-
-static inline tree
-gimple_call_fn (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_CALL);
-  return gimple_op (gs, 1);
-}
-
-/* Return a pointer to the tree node representing the function called by call
-   statement GS.  */
-
-static inline tree *
-gimple_call_fn_ptr (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_CALL);
-  return gimple_op_ptr (gs, 1);
-}
-
-
-/* Set FN to be the function called by call statement GS.  */
-
-static inline void
-gimple_call_set_fn (gimple gs, tree fn)
-{
-  GIMPLE_CHECK (gs, GIMPLE_CALL);
-  gcc_gimple_checking_assert (!gimple_call_internal_p (gs));
-  gimple_set_op (gs, 1, fn);
-}
-
-
-/* Set FNDECL to be the function called by call statement GS.  */
-
-static inline void
-gimple_call_set_fndecl (gimple gs, tree decl)
-{
-  GIMPLE_CHECK (gs, GIMPLE_CALL);
-  gcc_gimple_checking_assert (!gimple_call_internal_p (gs));
-  gimple_set_op (gs, 1, build_fold_addr_expr_loc (gimple_location (gs), decl));
-}
-
-
-/* Set internal function FN to be the function called by call statement GS.  */
-
-static inline void
-gimple_call_set_internal_fn (gimple gs, enum internal_fn fn)
-{
-  gimple_statement_call *call_stmt = as_a <gimple_statement_call> (gs);
-  gcc_gimple_checking_assert (gimple_call_internal_p (gs));
-  call_stmt->u.internal_fn = fn;
-}
-
-
-/* If a given GIMPLE_CALL's callee is a FUNCTION_DECL, return it.
-   Otherwise return NULL.  This function is analogous to
-   get_callee_fndecl in tree land.  */
-
-static inline tree
-gimple_call_fndecl (const_gimple gs)
-{
-  return gimple_call_addr_fndecl (gimple_call_fn (gs));
-}
-
-
-/* Return the type returned by call statement GS.  */
-
-static inline tree
-gimple_call_return_type (const_gimple gs)
-{
-  tree type = gimple_call_fntype (gs);
-
-  if (type == NULL_TREE)
-    return TREE_TYPE (gimple_call_lhs (gs));
-
-  /* The type returned by a function is the type of its
-     function type.  */
-  return TREE_TYPE (type);
-}
-
-
-/* Return the static chain for call statement GS.  */
-
-static inline tree
-gimple_call_chain (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_CALL);
-  return gimple_op (gs, 2);
-}
-
-
-/* Return a pointer to the static chain for call statement GS.  */
-
-static inline tree *
-gimple_call_chain_ptr (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_CALL);
-  return gimple_op_ptr (gs, 2);
-}
-
-/* Set CHAIN to be the static chain for call statement GS.  */
-
-static inline void
-gimple_call_set_chain (gimple gs, tree chain)
-{
-  GIMPLE_CHECK (gs, GIMPLE_CALL);
-
-  gimple_set_op (gs, 2, chain);
-}
-
-
-/* Return the number of arguments used by call statement GS.  */
-
-static inline unsigned
-gimple_call_num_args (const_gimple gs)
-{
-  unsigned num_ops;
-  GIMPLE_CHECK (gs, GIMPLE_CALL);
-  num_ops = gimple_num_ops (gs);
-  return num_ops - 3;
-}
-
-
-/* Return the argument at position INDEX for call statement GS.  */
-
-static inline tree
-gimple_call_arg (const_gimple gs, unsigned index)
-{
-  GIMPLE_CHECK (gs, GIMPLE_CALL);
-  return gimple_op (gs, index + 3);
-}
-
-
-/* Return a pointer to the argument at position INDEX for call
-   statement GS.  */
-
-static inline tree *
-gimple_call_arg_ptr (const_gimple gs, unsigned index)
-{
-  GIMPLE_CHECK (gs, GIMPLE_CALL);
-  return gimple_op_ptr (gs, index + 3);
-}
-
-
-/* Set ARG to be the argument at position INDEX for call statement GS.  */
-
-static inline void
-gimple_call_set_arg (gimple gs, unsigned index, tree arg)
-{
-  GIMPLE_CHECK (gs, GIMPLE_CALL);
-  gimple_set_op (gs, index + 3, arg);
-}
-
-
-/* If TAIL_P is true, mark call statement S as being a tail call
-   (i.e., a call just before the exit of a function).  These calls are
-   candidate for tail call optimization.  */
-
-static inline void
-gimple_call_set_tail (gimple s, bool tail_p)
-{
-  GIMPLE_CHECK (s, GIMPLE_CALL);
-  if (tail_p)
-    s->subcode |= GF_CALL_TAILCALL;
-  else
-    s->subcode &= ~GF_CALL_TAILCALL;
-}
-
-
-/* Return true if GIMPLE_CALL S is marked as a tail call.  */
-
-static inline bool
-gimple_call_tail_p (gimple s)
-{
-  GIMPLE_CHECK (s, GIMPLE_CALL);
-  return (s->subcode & GF_CALL_TAILCALL) != 0;
-}
-
-
-/* If RETURN_SLOT_OPT_P is true mark GIMPLE_CALL S as valid for return
-   slot optimization.  This transformation uses the target of the call
-   expansion as the return slot for calls that return in memory.  */
-
-static inline void
-gimple_call_set_return_slot_opt (gimple s, bool return_slot_opt_p)
-{
-  GIMPLE_CHECK (s, GIMPLE_CALL);
-  if (return_slot_opt_p)
-    s->subcode |= GF_CALL_RETURN_SLOT_OPT;
-  else
-    s->subcode &= ~GF_CALL_RETURN_SLOT_OPT;
-}
-
-
-/* Return true if S is marked for return slot optimization.  */
-
-static inline bool
-gimple_call_return_slot_opt_p (gimple s)
-{
-  GIMPLE_CHECK (s, GIMPLE_CALL);
-  return (s->subcode & GF_CALL_RETURN_SLOT_OPT) != 0;
-}
-
-
-/* If FROM_THUNK_P is true, mark GIMPLE_CALL S as being the jump from a
-   thunk to the thunked-to function.  */
-
-static inline void
-gimple_call_set_from_thunk (gimple s, bool from_thunk_p)
-{
-  GIMPLE_CHECK (s, GIMPLE_CALL);
-  if (from_thunk_p)
-    s->subcode |= GF_CALL_FROM_THUNK;
-  else
-    s->subcode &= ~GF_CALL_FROM_THUNK;
-}
-
-
-/* Return true if GIMPLE_CALL S is a jump from a thunk.  */
-
-static inline bool
-gimple_call_from_thunk_p (gimple s)
-{
-  GIMPLE_CHECK (s, GIMPLE_CALL);
-  return (s->subcode & GF_CALL_FROM_THUNK) != 0;
-}
-
-
-/* If PASS_ARG_PACK_P is true, GIMPLE_CALL S is a stdarg call that needs the
-   argument pack in its argument list.  */
-
-static inline void
-gimple_call_set_va_arg_pack (gimple s, bool pass_arg_pack_p)
-{
-  GIMPLE_CHECK (s, GIMPLE_CALL);
-  if (pass_arg_pack_p)
-    s->subcode |= GF_CALL_VA_ARG_PACK;
-  else
-    s->subcode &= ~GF_CALL_VA_ARG_PACK;
-}
-
-
-/* Return true if GIMPLE_CALL S is a stdarg call that needs the
-   argument pack in its argument list.  */
-
-static inline bool
-gimple_call_va_arg_pack_p (gimple s)
-{
-  GIMPLE_CHECK (s, GIMPLE_CALL);
-  return (s->subcode & GF_CALL_VA_ARG_PACK) != 0;
-}
-
-
-/* Return true if S is a noreturn call.  */
-
-static inline bool
-gimple_call_noreturn_p (gimple s)
-{
-  GIMPLE_CHECK (s, GIMPLE_CALL);
-  return (gimple_call_flags (s) & ECF_NORETURN) != 0;
-}
-
-
-/* If NOTHROW_P is true, GIMPLE_CALL S is a call that is known to not throw
-   even if the called function can throw in other cases.  */
-
-static inline void
-gimple_call_set_nothrow (gimple s, bool nothrow_p)
-{
-  GIMPLE_CHECK (s, GIMPLE_CALL);
-  if (nothrow_p)
-    s->subcode |= GF_CALL_NOTHROW;
-  else
-    s->subcode &= ~GF_CALL_NOTHROW;
-}
-
-/* Return true if S is a nothrow call.  */
-
-static inline bool
-gimple_call_nothrow_p (gimple s)
-{
-  GIMPLE_CHECK (s, GIMPLE_CALL);
-  return (gimple_call_flags (s) & ECF_NOTHROW) != 0;
-}
-
-/* If FOR_VAR is true, GIMPLE_CALL S is a call to builtin_alloca that
-   is known to be emitted for VLA objects.  Those are wrapped by
-   stack_save/stack_restore calls and hence can't lead to unbounded
-   stack growth even when they occur in loops.  */
-
-static inline void
-gimple_call_set_alloca_for_var (gimple s, bool for_var)
-{
-  GIMPLE_CHECK (s, GIMPLE_CALL);
-  if (for_var)
-    s->subcode |= GF_CALL_ALLOCA_FOR_VAR;
-  else
-    s->subcode &= ~GF_CALL_ALLOCA_FOR_VAR;
-}
-
-/* Return true of S is a call to builtin_alloca emitted for VLA objects.  */
-
-static inline bool
-gimple_call_alloca_for_var_p (gimple s)
-{
-  GIMPLE_CHECK (s, GIMPLE_CALL);
-  return (s->subcode & GF_CALL_ALLOCA_FOR_VAR) != 0;
-}
-
-/* Copy all the GF_CALL_* flags from ORIG_CALL to DEST_CALL.  */
-
-static inline void
-gimple_call_copy_flags (gimple dest_call, gimple orig_call)
-{
-  GIMPLE_CHECK (dest_call, GIMPLE_CALL);
-  GIMPLE_CHECK (orig_call, GIMPLE_CALL);
-  dest_call->subcode = orig_call->subcode;
-}
-
-
-/* Return a pointer to the points-to solution for the set of call-used
-   variables of the call CALL.  */
-
-static inline struct pt_solution *
-gimple_call_use_set (gimple call)
-{
-  gimple_statement_call *call_stmt = as_a <gimple_statement_call> (call);
-  return &call_stmt->call_used;
-}
-
-
-/* Return a pointer to the points-to solution for the set of call-used
-   variables of the call CALL.  */
-
-static inline struct pt_solution *
-gimple_call_clobber_set (gimple call)
-{
-  gimple_statement_call *call_stmt = as_a <gimple_statement_call> (call);
-  return &call_stmt->call_clobbered;
-}
-
-
-/* Returns true if this is a GIMPLE_ASSIGN or a GIMPLE_CALL with a
-   non-NULL lhs.  */
-
-static inline bool
-gimple_has_lhs (gimple stmt)
-{
-  return (is_gimple_assign (stmt)
-	  || (is_gimple_call (stmt)
-	      && gimple_call_lhs (stmt) != NULL_TREE));
-}
-
-
-/* Return the code of the predicate computed by conditional statement GS.  */
-
-static inline enum tree_code
-gimple_cond_code (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_COND);
-  return (enum tree_code) gs->subcode;
-}
-
-
-/* Set CODE to be the predicate code for the conditional statement GS.  */
-
-static inline void
-gimple_cond_set_code (gimple gs, enum tree_code code)
-{
-  GIMPLE_CHECK (gs, GIMPLE_COND);
-  gs->subcode = code;
-}
-
-
-/* Return the LHS of the predicate computed by conditional statement GS.  */
-
-static inline tree
-gimple_cond_lhs (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_COND);
-  return gimple_op (gs, 0);
-}
-
-/* Return the pointer to the LHS of the predicate computed by conditional
-   statement GS.  */
-
-static inline tree *
-gimple_cond_lhs_ptr (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_COND);
-  return gimple_op_ptr (gs, 0);
-}
-
-/* Set LHS to be the LHS operand of the predicate computed by
-   conditional statement GS.  */
-
-static inline void
-gimple_cond_set_lhs (gimple gs, tree lhs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_COND);
-  gimple_set_op (gs, 0, lhs);
-}
-
-
-/* Return the RHS operand of the predicate computed by conditional GS.  */
-
-static inline tree
-gimple_cond_rhs (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_COND);
-  return gimple_op (gs, 1);
-}
-
-/* Return the pointer to the RHS operand of the predicate computed by
-   conditional GS.  */
-
-static inline tree *
-gimple_cond_rhs_ptr (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_COND);
-  return gimple_op_ptr (gs, 1);
-}
-
-
-/* Set RHS to be the RHS operand of the predicate computed by
-   conditional statement GS.  */
-
-static inline void
-gimple_cond_set_rhs (gimple gs, tree rhs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_COND);
-  gimple_set_op (gs, 1, rhs);
-}
-
-
-/* Return the label used by conditional statement GS when its
-   predicate evaluates to true.  */
-
-static inline tree
-gimple_cond_true_label (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_COND);
-  return gimple_op (gs, 2);
-}
-
-
-/* Set LABEL to be the label used by conditional statement GS when its
-   predicate evaluates to true.  */
-
-static inline void
-gimple_cond_set_true_label (gimple gs, tree label)
-{
-  GIMPLE_CHECK (gs, GIMPLE_COND);
-  gimple_set_op (gs, 2, label);
-}
-
-
-/* Set LABEL to be the label used by conditional statement GS when its
-   predicate evaluates to false.  */
-
-static inline void
-gimple_cond_set_false_label (gimple gs, tree label)
-{
-  GIMPLE_CHECK (gs, GIMPLE_COND);
-  gimple_set_op (gs, 3, label);
-}
-
-
-/* Return the label used by conditional statement GS when its
-   predicate evaluates to false.  */
-
-static inline tree
-gimple_cond_false_label (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_COND);
-  return gimple_op (gs, 3);
-}
-
-
-/* Set the conditional COND_STMT to be of the form 'if (1 == 0)'.  */
-
-static inline void
-gimple_cond_make_false (gimple gs)
-{
-  gimple_cond_set_lhs (gs, boolean_true_node);
-  gimple_cond_set_rhs (gs, boolean_false_node);
-  gs->subcode = EQ_EXPR;
-}
-
-
-/* Set the conditional COND_STMT to be of the form 'if (1 == 1)'.  */
-
-static inline void
-gimple_cond_make_true (gimple gs)
-{
-  gimple_cond_set_lhs (gs, boolean_true_node);
-  gimple_cond_set_rhs (gs, boolean_true_node);
-  gs->subcode = EQ_EXPR;
-}
-
-/* Check if conditional statemente GS is of the form 'if (1 == 1)',
-  'if (0 == 0)', 'if (1 != 0)' or 'if (0 != 1)' */
-
-static inline bool
-gimple_cond_true_p (const_gimple gs)
-{
-  tree lhs = gimple_cond_lhs (gs);
-  tree rhs = gimple_cond_rhs (gs);
-  enum tree_code code = gimple_cond_code (gs);
-
-  if (lhs != boolean_true_node && lhs != boolean_false_node)
-    return false;
-
-  if (rhs != boolean_true_node && rhs != boolean_false_node)
-    return false;
-
-  if (code == NE_EXPR && lhs != rhs)
-    return true;
-
-  if (code == EQ_EXPR && lhs == rhs)
-      return true;
-
-  return false;
-}
-
-/* Check if conditional statement GS is of the form 'if (1 != 1)',
-   'if (0 != 0)', 'if (1 == 0)' or 'if (0 == 1)' */
-
-static inline bool
-gimple_cond_false_p (const_gimple gs)
-{
-  tree lhs = gimple_cond_lhs (gs);
-  tree rhs = gimple_cond_rhs (gs);
-  enum tree_code code = gimple_cond_code (gs);
-
-  if (lhs != boolean_true_node && lhs != boolean_false_node)
-    return false;
-
-  if (rhs != boolean_true_node && rhs != boolean_false_node)
-    return false;
-
-  if (code == NE_EXPR && lhs == rhs)
-    return true;
-
-  if (code == EQ_EXPR && lhs != rhs)
-      return true;
-
-  return false;
-}
-
-/* Set the code, LHS and RHS of GIMPLE_COND STMT from CODE, LHS and RHS.  */
-
-static inline void
-gimple_cond_set_condition (gimple stmt, enum tree_code code, tree lhs, tree rhs)
-{
-  gimple_cond_set_code (stmt, code);
-  gimple_cond_set_lhs (stmt, lhs);
-  gimple_cond_set_rhs (stmt, rhs);
-}
-
-/* Return the LABEL_DECL node used by GIMPLE_LABEL statement GS.  */
-
-static inline tree
-gimple_label_label (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_LABEL);
-  return gimple_op (gs, 0);
-}
-
-
-/* Set LABEL to be the LABEL_DECL node used by GIMPLE_LABEL statement
-   GS.  */
-
-static inline void
-gimple_label_set_label (gimple gs, tree label)
-{
-  GIMPLE_CHECK (gs, GIMPLE_LABEL);
-  gimple_set_op (gs, 0, label);
-}
-
-
-/* Return the destination of the unconditional jump GS.  */
-
-static inline tree
-gimple_goto_dest (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_GOTO);
-  return gimple_op (gs, 0);
-}
-
-
-/* Set DEST to be the destination of the unconditonal jump GS.  */
-
-static inline void
-gimple_goto_set_dest (gimple gs, tree dest)
-{
-  GIMPLE_CHECK (gs, GIMPLE_GOTO);
-  gimple_set_op (gs, 0, dest);
-}
-
-
-/* Return the variables declared in the GIMPLE_BIND statement GS.  */
-
-static inline tree
-gimple_bind_vars (const_gimple gs)
-{
-  const gimple_statement_bind *bind_stmt =
-    as_a <const gimple_statement_bind> (gs);
-  return bind_stmt->vars;
-}
-
-
-/* Set VARS to be the set of variables declared in the GIMPLE_BIND
-   statement GS.  */
-
-static inline void
-gimple_bind_set_vars (gimple gs, tree vars)
-{
-  gimple_statement_bind *bind_stmt = as_a <gimple_statement_bind> (gs);
-  bind_stmt->vars = vars;
-}
-
-
-/* Append VARS to the set of variables declared in the GIMPLE_BIND
-   statement GS.  */
-
-static inline void
-gimple_bind_append_vars (gimple gs, tree vars)
-{
-  gimple_statement_bind *bind_stmt = as_a <gimple_statement_bind> (gs);
-  bind_stmt->vars = chainon (bind_stmt->vars, vars);
-}
-
-
-static inline gimple_seq *
-gimple_bind_body_ptr (gimple gs)
-{
-  gimple_statement_bind *bind_stmt = as_a <gimple_statement_bind> (gs);
-  return &bind_stmt->body;
-}
-
-/* Return the GIMPLE sequence contained in the GIMPLE_BIND statement GS.  */
-
-static inline gimple_seq
-gimple_bind_body (gimple gs)
-{
-  return *gimple_bind_body_ptr (gs);
-}
-
-
-/* Set SEQ to be the GIMPLE sequence contained in the GIMPLE_BIND
-   statement GS.  */
-
-static inline void
-gimple_bind_set_body (gimple gs, gimple_seq seq)
-{
-  gimple_statement_bind *bind_stmt = as_a <gimple_statement_bind> (gs);
-  bind_stmt->body = seq;
-}
-
-
-/* Append a statement to the end of a GIMPLE_BIND's body.  */
-
-static inline void
-gimple_bind_add_stmt (gimple gs, gimple stmt)
-{
-  gimple_statement_bind *bind_stmt = as_a <gimple_statement_bind> (gs);
-  gimple_seq_add_stmt (&bind_stmt->body, stmt);
-}
-
-
-/* Append a sequence of statements to the end of a GIMPLE_BIND's body.  */
-
-static inline void
-gimple_bind_add_seq (gimple gs, gimple_seq seq)
-{
-  gimple_statement_bind *bind_stmt = as_a <gimple_statement_bind> (gs);
-  gimple_seq_add_seq (&bind_stmt->body, seq);
-}
-
-
-/* Return the TREE_BLOCK node associated with GIMPLE_BIND statement
-   GS.  This is analogous to the BIND_EXPR_BLOCK field in trees.  */
-
-static inline tree
-gimple_bind_block (const_gimple gs)
-{
-  const gimple_statement_bind *bind_stmt =
-    as_a <const gimple_statement_bind> (gs);
-  return bind_stmt->block;
-}
-
-
-/* Set BLOCK to be the TREE_BLOCK node associated with GIMPLE_BIND
-   statement GS.  */
-
-static inline void
-gimple_bind_set_block (gimple gs, tree block)
-{
-  gimple_statement_bind *bind_stmt = as_a <gimple_statement_bind> (gs);
-  gcc_gimple_checking_assert (block == NULL_TREE
-			      || TREE_CODE (block) == BLOCK);
-  bind_stmt->block = block;
-}
-
-
-/* Return the number of input operands for GIMPLE_ASM GS.  */
-
-static inline unsigned
-gimple_asm_ninputs (const_gimple gs)
-{
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm> (gs);
-  return asm_stmt->ni;
-}
-
-
-/* Return the number of output operands for GIMPLE_ASM GS.  */
-
-static inline unsigned
-gimple_asm_noutputs (const_gimple gs)
-{
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm> (gs);
-  return asm_stmt->no;
-}
-
-
-/* Return the number of clobber operands for GIMPLE_ASM GS.  */
-
-static inline unsigned
-gimple_asm_nclobbers (const_gimple gs)
-{
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm> (gs);
-  return asm_stmt->nc;
-}
-
-/* Return the number of label operands for GIMPLE_ASM GS.  */
-
-static inline unsigned
-gimple_asm_nlabels (const_gimple gs)
-{
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm> (gs);
-  return asm_stmt->nl;
-}
-
-/* Return input operand INDEX of GIMPLE_ASM GS.  */
-
-static inline tree
-gimple_asm_input_op (const_gimple gs, unsigned index)
-{
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm> (gs);
-  gcc_gimple_checking_assert (index < asm_stmt->ni);
-  return gimple_op (gs, index + asm_stmt->no);
-}
-
-/* Return a pointer to input operand INDEX of GIMPLE_ASM GS.  */
-
-static inline tree *
-gimple_asm_input_op_ptr (const_gimple gs, unsigned index)
-{
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm> (gs);
-  gcc_gimple_checking_assert (index < asm_stmt->ni);
-  return gimple_op_ptr (gs, index + asm_stmt->no);
-}
-
-
-/* Set IN_OP to be input operand INDEX in GIMPLE_ASM GS.  */
-
-static inline void
-gimple_asm_set_input_op (gimple gs, unsigned index, tree in_op)
-{
-  gimple_statement_asm *asm_stmt = as_a <gimple_statement_asm> (gs);
-  gcc_gimple_checking_assert (index < asm_stmt->ni
-			      && TREE_CODE (in_op) == TREE_LIST);
-  gimple_set_op (gs, index + asm_stmt->no, in_op);
-}
-
-
-/* Return output operand INDEX of GIMPLE_ASM GS.  */
-
-static inline tree
-gimple_asm_output_op (const_gimple gs, unsigned index)
-{
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm> (gs);
-  gcc_gimple_checking_assert (index < asm_stmt->no);
-  return gimple_op (gs, index);
-}
-
-/* Return a pointer to output operand INDEX of GIMPLE_ASM GS.  */
-
-static inline tree *
-gimple_asm_output_op_ptr (const_gimple gs, unsigned index)
-{
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm> (gs);
-  gcc_gimple_checking_assert (index < asm_stmt->no);
-  return gimple_op_ptr (gs, index);
-}
-
-
-/* Set OUT_OP to be output operand INDEX in GIMPLE_ASM GS.  */
-
-static inline void
-gimple_asm_set_output_op (gimple gs, unsigned index, tree out_op)
-{
-  gimple_statement_asm *asm_stmt = as_a <gimple_statement_asm> (gs);
-  gcc_gimple_checking_assert (index < asm_stmt->no
-			      && TREE_CODE (out_op) == TREE_LIST);
-  gimple_set_op (gs, index, out_op);
-}
-
-
-/* Return clobber operand INDEX of GIMPLE_ASM GS.  */
-
-static inline tree
-gimple_asm_clobber_op (const_gimple gs, unsigned index)
-{
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm> (gs);
-  gcc_gimple_checking_assert (index < asm_stmt->nc);
-  return gimple_op (gs, index + asm_stmt->ni + asm_stmt->no);
-}
-
-
-/* Set CLOBBER_OP to be clobber operand INDEX in GIMPLE_ASM GS.  */
-
-static inline void
-gimple_asm_set_clobber_op (gimple gs, unsigned index, tree clobber_op)
-{
-  gimple_statement_asm *asm_stmt = as_a <gimple_statement_asm> (gs);
-  gcc_gimple_checking_assert (index < asm_stmt->nc
-			      && TREE_CODE (clobber_op) == TREE_LIST);
-  gimple_set_op (gs, index + asm_stmt->ni + asm_stmt->no, clobber_op);
-}
-
-/* Return label operand INDEX of GIMPLE_ASM GS.  */
-
-static inline tree
-gimple_asm_label_op (const_gimple gs, unsigned index)
-{
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm> (gs);
-  gcc_gimple_checking_assert (index < asm_stmt->nl);
-  return gimple_op (gs, index + asm_stmt->ni + asm_stmt->nc);
-}
-
-/* Set LABEL_OP to be label operand INDEX in GIMPLE_ASM GS.  */
-
-static inline void
-gimple_asm_set_label_op (gimple gs, unsigned index, tree label_op)
-{
-  gimple_statement_asm *asm_stmt = as_a <gimple_statement_asm> (gs);
-  gcc_gimple_checking_assert (index < asm_stmt->nl
-			      && TREE_CODE (label_op) == TREE_LIST);
-  gimple_set_op (gs, index + asm_stmt->ni + asm_stmt->nc, label_op);
-}
-
-/* Return the string representing the assembly instruction in
-   GIMPLE_ASM GS.  */
-
-static inline const char *
-gimple_asm_string (const_gimple gs)
-{
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm> (gs);
-  return asm_stmt->string;
-}
-
-
-/* Return true if GS is an asm statement marked volatile.  */
-
-static inline bool
-gimple_asm_volatile_p (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_ASM);
-  return (gs->subcode & GF_ASM_VOLATILE) != 0;
-}
-
-
-/* If VOLATLE_P is true, mark asm statement GS as volatile.  */
-
-static inline void
-gimple_asm_set_volatile (gimple gs, bool volatile_p)
-{
-  GIMPLE_CHECK (gs, GIMPLE_ASM);
-  if (volatile_p)
-    gs->subcode |= GF_ASM_VOLATILE;
-  else
-    gs->subcode &= ~GF_ASM_VOLATILE;
-}
-
-
-/* If INPUT_P is true, mark asm GS as an ASM_INPUT.  */
-
-static inline void
-gimple_asm_set_input (gimple gs, bool input_p)
-{
-  GIMPLE_CHECK (gs, GIMPLE_ASM);
-  if (input_p)
-    gs->subcode |= GF_ASM_INPUT;
-  else
-    gs->subcode &= ~GF_ASM_INPUT;
-}
-
-
-/* Return true if asm GS is an ASM_INPUT.  */
-
-static inline bool
-gimple_asm_input_p (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_ASM);
-  return (gs->subcode & GF_ASM_INPUT) != 0;
-}
-
-
-/* Return the types handled by GIMPLE_CATCH statement GS.  */
-
-static inline tree
-gimple_catch_types (const_gimple gs)
-{
-  const gimple_statement_catch *catch_stmt =
-    as_a <const gimple_statement_catch> (gs);
-  return catch_stmt->types;
-}
-
-
-/* Return a pointer to the types handled by GIMPLE_CATCH statement GS.  */
-
-static inline tree *
-gimple_catch_types_ptr (gimple gs)
-{
-  gimple_statement_catch *catch_stmt = as_a <gimple_statement_catch> (gs);
-  return &catch_stmt->types;
-}
-
-
-/* Return a pointer to the GIMPLE sequence representing the body of
-   the handler of GIMPLE_CATCH statement GS.  */
-
-static inline gimple_seq *
-gimple_catch_handler_ptr (gimple gs)
-{
-  gimple_statement_catch *catch_stmt = as_a <gimple_statement_catch> (gs);
-  return &catch_stmt->handler;
-}
-
-
-/* Return the GIMPLE sequence representing the body of the handler of
-   GIMPLE_CATCH statement GS.  */
-
-static inline gimple_seq
-gimple_catch_handler (gimple gs)
-{
-  return *gimple_catch_handler_ptr (gs);
-}
-
-
-/* Set T to be the set of types handled by GIMPLE_CATCH GS.  */
-
-static inline void
-gimple_catch_set_types (gimple gs, tree t)
-{
-  gimple_statement_catch *catch_stmt = as_a <gimple_statement_catch> (gs);
-  catch_stmt->types = t;
-}
-
-
-/* Set HANDLER to be the body of GIMPLE_CATCH GS.  */
-
-static inline void
-gimple_catch_set_handler (gimple gs, gimple_seq handler)
-{
-  gimple_statement_catch *catch_stmt = as_a <gimple_statement_catch> (gs);
-  catch_stmt->handler = handler;
-}
-
-
-/* Return the types handled by GIMPLE_EH_FILTER statement GS.  */
-
-static inline tree
-gimple_eh_filter_types (const_gimple gs)
-{
-  const gimple_statement_eh_filter *eh_filter_stmt =
-    as_a <const gimple_statement_eh_filter> (gs);
-  return eh_filter_stmt->types;
-}
-
-
-/* Return a pointer to the types handled by GIMPLE_EH_FILTER statement
-   GS.  */
-
-static inline tree *
-gimple_eh_filter_types_ptr (gimple gs)
-{
-  gimple_statement_eh_filter *eh_filter_stmt =
-    as_a <gimple_statement_eh_filter> (gs);
-  return &eh_filter_stmt->types;
-}
-
-
-/* Return a pointer to the sequence of statement to execute when
-   GIMPLE_EH_FILTER statement fails.  */
-
-static inline gimple_seq *
-gimple_eh_filter_failure_ptr (gimple gs)
-{
-  gimple_statement_eh_filter *eh_filter_stmt =
-    as_a <gimple_statement_eh_filter> (gs);
-  return &eh_filter_stmt->failure;
-}
-
-
-/* Return the sequence of statement to execute when GIMPLE_EH_FILTER
-   statement fails.  */
-
-static inline gimple_seq
-gimple_eh_filter_failure (gimple gs)
-{
-  return *gimple_eh_filter_failure_ptr (gs);
-}
-
-
-/* Set TYPES to be the set of types handled by GIMPLE_EH_FILTER GS.  */
-
-static inline void
-gimple_eh_filter_set_types (gimple gs, tree types)
-{
-  gimple_statement_eh_filter *eh_filter_stmt =
-    as_a <gimple_statement_eh_filter> (gs);
-  eh_filter_stmt->types = types;
-}
-
-
-/* Set FAILURE to be the sequence of statements to execute on failure
-   for GIMPLE_EH_FILTER GS.  */
-
-static inline void
-gimple_eh_filter_set_failure (gimple gs, gimple_seq failure)
-{
-  gimple_statement_eh_filter *eh_filter_stmt =
-    as_a <gimple_statement_eh_filter> (gs);
-  eh_filter_stmt->failure = failure;
-}
-
-/* Get the function decl to be called by the MUST_NOT_THROW region.  */
-
-static inline tree
-gimple_eh_must_not_throw_fndecl (gimple gs)
-{
-  gimple_statement_eh_mnt *eh_mnt_stmt = as_a <gimple_statement_eh_mnt> (gs);
-  return eh_mnt_stmt->fndecl;
-}
-
-/* Set the function decl to be called by GS to DECL.  */
-
-static inline void
-gimple_eh_must_not_throw_set_fndecl (gimple gs, tree decl)
-{
-  gimple_statement_eh_mnt *eh_mnt_stmt = as_a <gimple_statement_eh_mnt> (gs);
-  eh_mnt_stmt->fndecl = decl;
-}
-
-/* GIMPLE_EH_ELSE accessors.  */
-
-static inline gimple_seq *
-gimple_eh_else_n_body_ptr (gimple gs)
-{
-  gimple_statement_eh_else *eh_else_stmt =
-    as_a <gimple_statement_eh_else> (gs);
-  return &eh_else_stmt->n_body;
-}
-
-static inline gimple_seq
-gimple_eh_else_n_body (gimple gs)
-{
-  return *gimple_eh_else_n_body_ptr (gs);
-}
-
-static inline gimple_seq *
-gimple_eh_else_e_body_ptr (gimple gs)
-{
-  gimple_statement_eh_else *eh_else_stmt =
-    as_a <gimple_statement_eh_else> (gs);
-  return &eh_else_stmt->e_body;
-}
-
-static inline gimple_seq
-gimple_eh_else_e_body (gimple gs)
-{
-  return *gimple_eh_else_e_body_ptr (gs);
-}
-
-static inline void
-gimple_eh_else_set_n_body (gimple gs, gimple_seq seq)
-{
-  gimple_statement_eh_else *eh_else_stmt =
-    as_a <gimple_statement_eh_else> (gs);
-  eh_else_stmt->n_body = seq;
-}
-
-static inline void
-gimple_eh_else_set_e_body (gimple gs, gimple_seq seq)
-{
-  gimple_statement_eh_else *eh_else_stmt =
-    as_a <gimple_statement_eh_else> (gs);
-  eh_else_stmt->e_body = seq;
-}
-
-/* GIMPLE_TRY accessors. */
-
-/* Return the kind of try block represented by GIMPLE_TRY GS.  This is
-   either GIMPLE_TRY_CATCH or GIMPLE_TRY_FINALLY.  */
-
-static inline enum gimple_try_flags
-gimple_try_kind (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_TRY);
-  return (enum gimple_try_flags) (gs->subcode & GIMPLE_TRY_KIND);
-}
-
-
-/* Set the kind of try block represented by GIMPLE_TRY GS.  */
-
-static inline void
-gimple_try_set_kind (gimple gs, enum gimple_try_flags kind)
-{
-  GIMPLE_CHECK (gs, GIMPLE_TRY);
-  gcc_gimple_checking_assert (kind == GIMPLE_TRY_CATCH
-			      || kind == GIMPLE_TRY_FINALLY);
-  if (gimple_try_kind (gs) != kind)
-    gs->subcode = (unsigned int) kind;
-}
-
-
-/* Return the GIMPLE_TRY_CATCH_IS_CLEANUP flag.  */
-
-static inline bool
-gimple_try_catch_is_cleanup (const_gimple gs)
-{
-  gcc_gimple_checking_assert (gimple_try_kind (gs) == GIMPLE_TRY_CATCH);
-  return (gs->subcode & GIMPLE_TRY_CATCH_IS_CLEANUP) != 0;
-}
-
-
-/* Return a pointer to the sequence of statements used as the
-   body for GIMPLE_TRY GS.  */
-
-static inline gimple_seq *
-gimple_try_eval_ptr (gimple gs)
-{
-  gimple_statement_try *try_stmt = as_a <gimple_statement_try> (gs);
-  return &try_stmt->eval;
-}
-
-
-/* Return the sequence of statements used as the body for GIMPLE_TRY GS.  */
-
-static inline gimple_seq
-gimple_try_eval (gimple gs)
-{
-  return *gimple_try_eval_ptr (gs);
-}
-
-
-/* Return a pointer to the sequence of statements used as the cleanup body for
-   GIMPLE_TRY GS.  */
-
-static inline gimple_seq *
-gimple_try_cleanup_ptr (gimple gs)
-{
-  gimple_statement_try *try_stmt = as_a <gimple_statement_try> (gs);
-  return &try_stmt->cleanup;
-}
-
-
-/* Return the sequence of statements used as the cleanup body for
-   GIMPLE_TRY GS.  */
-
-static inline gimple_seq
-gimple_try_cleanup (gimple gs)
-{
-  return *gimple_try_cleanup_ptr (gs);
-}
-
-
-/* Set the GIMPLE_TRY_CATCH_IS_CLEANUP flag.  */
-
-static inline void
-gimple_try_set_catch_is_cleanup (gimple g, bool catch_is_cleanup)
-{
-  gcc_gimple_checking_assert (gimple_try_kind (g) == GIMPLE_TRY_CATCH);
-  if (catch_is_cleanup)
-    g->subcode |= GIMPLE_TRY_CATCH_IS_CLEANUP;
-  else
-    g->subcode &= ~GIMPLE_TRY_CATCH_IS_CLEANUP;
-}
-
-
-/* Set EVAL to be the sequence of statements to use as the body for
-   GIMPLE_TRY GS.  */
-
-static inline void
-gimple_try_set_eval (gimple gs, gimple_seq eval)
-{
-  gimple_statement_try *try_stmt = as_a <gimple_statement_try> (gs);
-  try_stmt->eval = eval;
-}
-
-
-/* Set CLEANUP to be the sequence of statements to use as the cleanup
-   body for GIMPLE_TRY GS.  */
-
-static inline void
-gimple_try_set_cleanup (gimple gs, gimple_seq cleanup)
-{
-  gimple_statement_try *try_stmt = as_a <gimple_statement_try> (gs);
-  try_stmt->cleanup = cleanup;
-}
-
-
-/* Return a pointer to the cleanup sequence for cleanup statement GS.  */
-
-static inline gimple_seq *
-gimple_wce_cleanup_ptr (gimple gs)
-{
-  gimple_statement_wce *wce_stmt = as_a <gimple_statement_wce> (gs);
-  return &wce_stmt->cleanup;
-}
-
-
-/* Return the cleanup sequence for cleanup statement GS.  */
-
-static inline gimple_seq
-gimple_wce_cleanup (gimple gs)
-{
-  return *gimple_wce_cleanup_ptr (gs);
-}
-
-
-/* Set CLEANUP to be the cleanup sequence for GS.  */
-
-static inline void
-gimple_wce_set_cleanup (gimple gs, gimple_seq cleanup)
-{
-  gimple_statement_wce *wce_stmt = as_a <gimple_statement_wce> (gs);
-  wce_stmt->cleanup = cleanup;
-}
-
-
-/* Return the CLEANUP_EH_ONLY flag for a WCE tuple.  */
-
-static inline bool
-gimple_wce_cleanup_eh_only (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_WITH_CLEANUP_EXPR);
-  return gs->subcode != 0;
-}
-
-
-/* Set the CLEANUP_EH_ONLY flag for a WCE tuple.  */
-
-static inline void
-gimple_wce_set_cleanup_eh_only (gimple gs, bool eh_only_p)
-{
-  GIMPLE_CHECK (gs, GIMPLE_WITH_CLEANUP_EXPR);
-  gs->subcode = (unsigned int) eh_only_p;
-}
-
-
-/* Return the maximum number of arguments supported by GIMPLE_PHI GS.  */
-
-static inline unsigned
-gimple_phi_capacity (const_gimple gs)
-{
-  const gimple_statement_phi *phi_stmt =
-    as_a <const gimple_statement_phi> (gs);
-  return phi_stmt->capacity;
-}
-
-
-/* Return the number of arguments in GIMPLE_PHI GS.  This must always
-   be exactly the number of incoming edges for the basic block holding
-   GS.  */
-
-static inline unsigned
-gimple_phi_num_args (const_gimple gs)
-{
-  const gimple_statement_phi *phi_stmt =
-    as_a <const gimple_statement_phi> (gs);
-  return phi_stmt->nargs;
-}
-
-
-/* Return the SSA name created by GIMPLE_PHI GS.  */
-
-static inline tree
-gimple_phi_result (const_gimple gs)
-{
-  const gimple_statement_phi *phi_stmt =
-    as_a <const gimple_statement_phi> (gs);
-  return phi_stmt->result;
-}
-
-/* Return a pointer to the SSA name created by GIMPLE_PHI GS.  */
-
-static inline tree *
-gimple_phi_result_ptr (gimple gs)
-{
-  gimple_statement_phi *phi_stmt = as_a <gimple_statement_phi> (gs);
-  return &phi_stmt->result;
-}
-
-/* Set RESULT to be the SSA name created by GIMPLE_PHI GS.  */
-
-static inline void
-gimple_phi_set_result (gimple gs, tree result)
-{
-  gimple_statement_phi *phi_stmt = as_a <gimple_statement_phi> (gs);
-  phi_stmt->result = result;
-  if (result && TREE_CODE (result) == SSA_NAME)
-    SSA_NAME_DEF_STMT (result) = gs;
-}
-
-
-/* Return the PHI argument corresponding to incoming edge INDEX for
-   GIMPLE_PHI GS.  */
-
-static inline struct phi_arg_d *
-gimple_phi_arg (gimple gs, unsigned index)
-{
-  gimple_statement_phi *phi_stmt = as_a <gimple_statement_phi> (gs);
-  gcc_gimple_checking_assert (index <= phi_stmt->capacity);
-  return &(phi_stmt->args[index]);
-}
-
-/* Set PHIARG to be the argument corresponding to incoming edge INDEX
-   for GIMPLE_PHI GS.  */
-
-static inline void
-gimple_phi_set_arg (gimple gs, unsigned index, struct phi_arg_d * phiarg)
-{
-  gimple_statement_phi *phi_stmt = as_a <gimple_statement_phi> (gs);
-  gcc_gimple_checking_assert (index <= phi_stmt->nargs);
-  phi_stmt->args[index] = *phiarg;
-}
-
-/* Return the PHI nodes for basic block BB, or NULL if there are no
-   PHI nodes.  */
-
-static inline gimple_seq
-phi_nodes (const_basic_block bb)
-{
-  gcc_checking_assert (!(bb->flags & BB_RTL));
-  return bb->il.gimple.phi_nodes;
-}
-
-/* Return a pointer to the PHI nodes for basic block BB.  */
-
-static inline gimple_seq *
-phi_nodes_ptr (basic_block bb)
-{
-  gcc_checking_assert (!(bb->flags & BB_RTL));
-  return &bb->il.gimple.phi_nodes;
-}
-
-/* Return the tree operand for argument I of PHI node GS.  */
-
-static inline tree
-gimple_phi_arg_def (gimple gs, size_t index)
-{
-  return gimple_phi_arg (gs, index)->def;
-}
-
-
-/* Return a pointer to the tree operand for argument I of PHI node GS.  */
-
-static inline tree *
-gimple_phi_arg_def_ptr (gimple gs, size_t index)
-{
-  return &gimple_phi_arg (gs, index)->def;
-}
-
-/* Return the edge associated with argument I of phi node GS.  */
-
-static inline edge
-gimple_phi_arg_edge (gimple gs, size_t i)
-{
-  return EDGE_PRED (gimple_bb (gs), i);
-}
-
-/* Return the source location of gimple argument I of phi node GS.  */
-
-static inline source_location
-gimple_phi_arg_location (gimple gs, size_t i)
-{
-  return gimple_phi_arg (gs, i)->locus;
-}
-
-/* Return the source location of the argument on edge E of phi node GS.  */
-
-static inline source_location
-gimple_phi_arg_location_from_edge (gimple gs, edge e)
-{
-  return gimple_phi_arg (gs, e->dest_idx)->locus;
-}
-
-/* Set the source location of gimple argument I of phi node GS to LOC.  */
-
-static inline void
-gimple_phi_arg_set_location (gimple gs, size_t i, source_location loc)
-{
-  gimple_phi_arg (gs, i)->locus = loc;
-}
-
-/* Return TRUE if argument I of phi node GS has a location record.  */
-
-static inline bool
-gimple_phi_arg_has_location (gimple gs, size_t i)
-{
-  return gimple_phi_arg_location (gs, i) != UNKNOWN_LOCATION;
-}
-
-
-/* Return the region number for GIMPLE_RESX GS.  */
-
-static inline int
-gimple_resx_region (const_gimple gs)
-{
-  const gimple_statement_resx *resx_stmt =
-    as_a <const gimple_statement_resx> (gs);
-  return resx_stmt->region;
-}
-
-/* Set REGION to be the region number for GIMPLE_RESX GS.  */
-
-static inline void
-gimple_resx_set_region (gimple gs, int region)
-{
-  gimple_statement_resx *resx_stmt = as_a <gimple_statement_resx> (gs);
-  resx_stmt->region = region;
-}
-
-/* Return the region number for GIMPLE_EH_DISPATCH GS.  */
-
-static inline int
-gimple_eh_dispatch_region (const_gimple gs)
-{
-  const gimple_statement_eh_dispatch *eh_dispatch_stmt =
-    as_a <const gimple_statement_eh_dispatch> (gs);
-  return eh_dispatch_stmt->region;
-}
-
-/* Set REGION to be the region number for GIMPLE_EH_DISPATCH GS.  */
-
-static inline void
-gimple_eh_dispatch_set_region (gimple gs, int region)
-{
-  gimple_statement_eh_dispatch *eh_dispatch_stmt =
-    as_a <gimple_statement_eh_dispatch> (gs);
-  eh_dispatch_stmt->region = region;
-}
-
-/* Return the number of labels associated with the switch statement GS.  */
-
-static inline unsigned
-gimple_switch_num_labels (const_gimple gs)
-{
-  unsigned num_ops;
-  GIMPLE_CHECK (gs, GIMPLE_SWITCH);
-  num_ops = gimple_num_ops (gs);
-  gcc_gimple_checking_assert (num_ops > 1);
-  return num_ops - 1;
-}
-
-
-/* Set NLABELS to be the number of labels for the switch statement GS.  */
-
-static inline void
-gimple_switch_set_num_labels (gimple g, unsigned nlabels)
-{
-  GIMPLE_CHECK (g, GIMPLE_SWITCH);
-  gimple_set_num_ops (g, nlabels + 1);
-}
-
-
-/* Return the index variable used by the switch statement GS.  */
-
-static inline tree
-gimple_switch_index (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_SWITCH);
-  return gimple_op (gs, 0);
-}
-
-
-/* Return a pointer to the index variable for the switch statement GS.  */
-
-static inline tree *
-gimple_switch_index_ptr (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_SWITCH);
-  return gimple_op_ptr (gs, 0);
-}
-
-
-/* Set INDEX to be the index variable for switch statement GS.  */
-
-static inline void
-gimple_switch_set_index (gimple gs, tree index)
-{
-  GIMPLE_CHECK (gs, GIMPLE_SWITCH);
-  gcc_gimple_checking_assert (SSA_VAR_P (index) || CONSTANT_CLASS_P (index));
-  gimple_set_op (gs, 0, index);
-}
-
-
-/* Return the label numbered INDEX.  The default label is 0, followed by any
-   labels in a switch statement.  */
-
-static inline tree
-gimple_switch_label (const_gimple gs, unsigned index)
-{
-  GIMPLE_CHECK (gs, GIMPLE_SWITCH);
-  gcc_gimple_checking_assert (gimple_num_ops (gs) > index + 1);
-  return gimple_op (gs, index + 1);
-}
-
-/* Set the label number INDEX to LABEL.  0 is always the default label.  */
-
-static inline void
-gimple_switch_set_label (gimple gs, unsigned index, tree label)
-{
-  GIMPLE_CHECK (gs, GIMPLE_SWITCH);
-  gcc_gimple_checking_assert (gimple_num_ops (gs) > index + 1
-			      && (label == NULL_TREE
-			          || TREE_CODE (label) == CASE_LABEL_EXPR));
-  gimple_set_op (gs, index + 1, label);
-}
-
-/* Return the default label for a switch statement.  */
-
-static inline tree
-gimple_switch_default_label (const_gimple gs)
-{
-  tree label = gimple_switch_label (gs, 0);
-  gcc_checking_assert (!CASE_LOW (label) && !CASE_HIGH (label));
-  return label;
-}
-
-/* Set the default label for a switch statement.  */
-
-static inline void
-gimple_switch_set_default_label (gimple gs, tree label)
-{
-  gcc_checking_assert (!CASE_LOW (label) && !CASE_HIGH (label));
-  gimple_switch_set_label (gs, 0, label);
-}
-
-/* Return true if GS is a GIMPLE_DEBUG statement.  */
-
-static inline bool
-is_gimple_debug (const_gimple gs)
-{
-  return gimple_code (gs) == GIMPLE_DEBUG;
-}
-
-/* Return true if S is a GIMPLE_DEBUG BIND statement.  */
-
-static inline bool
-gimple_debug_bind_p (const_gimple s)
-{
-  if (is_gimple_debug (s))
-    return s->subcode == GIMPLE_DEBUG_BIND;
-
-  return false;
-}
-
-/* Return the variable bound in a GIMPLE_DEBUG bind statement.  */
-
-static inline tree
-gimple_debug_bind_get_var (gimple dbg)
-{
-  GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
-  gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
-  return gimple_op (dbg, 0);
-}
-
-/* Return the value bound to the variable in a GIMPLE_DEBUG bind
-   statement.  */
-
-static inline tree
-gimple_debug_bind_get_value (gimple dbg)
-{
-  GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
-  gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
-  return gimple_op (dbg, 1);
-}
-
-/* Return a pointer to the value bound to the variable in a
-   GIMPLE_DEBUG bind statement.  */
-
-static inline tree *
-gimple_debug_bind_get_value_ptr (gimple dbg)
-{
-  GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
-  gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
-  return gimple_op_ptr (dbg, 1);
-}
-
-/* Set the variable bound in a GIMPLE_DEBUG bind statement.  */
-
-static inline void
-gimple_debug_bind_set_var (gimple dbg, tree var)
-{
-  GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
-  gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
-  gimple_set_op (dbg, 0, var);
-}
-
-/* Set the value bound to the variable in a GIMPLE_DEBUG bind
-   statement.  */
-
-static inline void
-gimple_debug_bind_set_value (gimple dbg, tree value)
-{
-  GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
-  gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
-  gimple_set_op (dbg, 1, value);
-}
-
-/* The second operand of a GIMPLE_DEBUG_BIND, when the value was
-   optimized away.  */
-#define GIMPLE_DEBUG_BIND_NOVALUE NULL_TREE /* error_mark_node */
-
-/* Remove the value bound to the variable in a GIMPLE_DEBUG bind
-   statement.  */
-
-static inline void
-gimple_debug_bind_reset_value (gimple dbg)
-{
-  GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
-  gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
-  gimple_set_op (dbg, 1, GIMPLE_DEBUG_BIND_NOVALUE);
-}
-
-/* Return true if the GIMPLE_DEBUG bind statement is bound to a
-   value.  */
-
-static inline bool
-gimple_debug_bind_has_value_p (gimple dbg)
-{
-  GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
-  gcc_gimple_checking_assert (gimple_debug_bind_p (dbg));
-  return gimple_op (dbg, 1) != GIMPLE_DEBUG_BIND_NOVALUE;
-}
-
-#undef GIMPLE_DEBUG_BIND_NOVALUE
-
-/* Return true if S is a GIMPLE_DEBUG SOURCE BIND statement.  */
-
-static inline bool
-gimple_debug_source_bind_p (const_gimple s)
-{
-  if (is_gimple_debug (s))
-    return s->subcode == GIMPLE_DEBUG_SOURCE_BIND;
-
-  return false;
-}
-
-/* Return the variable bound in a GIMPLE_DEBUG source bind statement.  */
-
-static inline tree
-gimple_debug_source_bind_get_var (gimple dbg)
-{
-  GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
-  gcc_gimple_checking_assert (gimple_debug_source_bind_p (dbg));
-  return gimple_op (dbg, 0);
-}
-
-/* Return the value bound to the variable in a GIMPLE_DEBUG source bind
-   statement.  */
-
-static inline tree
-gimple_debug_source_bind_get_value (gimple dbg)
-{
-  GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
-  gcc_gimple_checking_assert (gimple_debug_source_bind_p (dbg));
-  return gimple_op (dbg, 1);
-}
-
-/* Return a pointer to the value bound to the variable in a
-   GIMPLE_DEBUG source bind statement.  */
-
-static inline tree *
-gimple_debug_source_bind_get_value_ptr (gimple dbg)
-{
-  GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
-  gcc_gimple_checking_assert (gimple_debug_source_bind_p (dbg));
-  return gimple_op_ptr (dbg, 1);
-}
-
-/* Set the variable bound in a GIMPLE_DEBUG source bind statement.  */
-
-static inline void
-gimple_debug_source_bind_set_var (gimple dbg, tree var)
-{
-  GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
-  gcc_gimple_checking_assert (gimple_debug_source_bind_p (dbg));
-  gimple_set_op (dbg, 0, var);
-}
-
-/* Set the value bound to the variable in a GIMPLE_DEBUG source bind
-   statement.  */
-
-static inline void
-gimple_debug_source_bind_set_value (gimple dbg, tree value)
-{
-  GIMPLE_CHECK (dbg, GIMPLE_DEBUG);
-  gcc_gimple_checking_assert (gimple_debug_source_bind_p (dbg));
-  gimple_set_op (dbg, 1, value);
-}
-
-/* Return the line number for EXPR, or return -1 if we have no line
-   number information for it.  */
-static inline int
-get_lineno (const_gimple stmt)
-{
-  location_t loc;
-
-  if (!stmt)
-    return -1;
-
-  loc = gimple_location (stmt);
-  if (loc == UNKNOWN_LOCATION)
-    return -1;
-
-  return LOCATION_LINE (loc);
-}
-
-/* Return a pointer to the body for the OMP statement GS.  */
-
-static inline gimple_seq *
-gimple_omp_body_ptr (gimple gs)
-{
-  return &static_cast <gimple_statement_omp *> (gs)->body;
-}
-
-/* Return the body for the OMP statement GS.  */
-
-static inline gimple_seq
-gimple_omp_body (gimple gs)
-{
-  return *gimple_omp_body_ptr (gs);
-}
-
-/* Set BODY to be the body for the OMP statement GS.  */
-
-static inline void
-gimple_omp_set_body (gimple gs, gimple_seq body)
-{
-  static_cast <gimple_statement_omp *> (gs)->body = body;
-}
-
-
-/* Return the name associated with OMP_CRITICAL statement GS.  */
-
-static inline tree
-gimple_omp_critical_name (const_gimple gs)
-{
-  const gimple_statement_omp_critical *omp_critical_stmt =
-    as_a <const gimple_statement_omp_critical> (gs);
-  return omp_critical_stmt->name;
-}
-
-
-/* Return a pointer to the name associated with OMP critical statement GS.  */
-
-static inline tree *
-gimple_omp_critical_name_ptr (gimple gs)
-{
-  gimple_statement_omp_critical *omp_critical_stmt =
-    as_a <gimple_statement_omp_critical> (gs);
-  return &omp_critical_stmt->name;
-}
-
-
-/* Set NAME to be the name associated with OMP critical statement GS.  */
-
-static inline void
-gimple_omp_critical_set_name (gimple gs, tree name)
-{
-  gimple_statement_omp_critical *omp_critical_stmt =
-    as_a <gimple_statement_omp_critical> (gs);
-  omp_critical_stmt->name = name;
-}
-
-
-/* Return the kind of OMP for statemement.  */
-
-static inline int
-gimple_omp_for_kind (const_gimple g)
-{
-  GIMPLE_CHECK (g, GIMPLE_OMP_FOR);
-  return (gimple_omp_subcode (g) & GF_OMP_FOR_KIND_MASK);
-}
-
-
-/* Set the OMP for kind.  */
-
-static inline void
-gimple_omp_for_set_kind (gimple g, int kind)
-{
-  GIMPLE_CHECK (g, GIMPLE_OMP_FOR);
-  g->subcode = (g->subcode & ~GF_OMP_FOR_KIND_MASK)
-		      | (kind & GF_OMP_FOR_KIND_MASK);
-}
-
-
-/* Return true if OMP for statement G has the
-   GF_OMP_FOR_COMBINED flag set.  */
-
-static inline bool
-gimple_omp_for_combined_p (const_gimple g)
-{
-  GIMPLE_CHECK (g, GIMPLE_OMP_FOR);
-  return (gimple_omp_subcode (g) & GF_OMP_FOR_COMBINED) != 0;
-}
-
-
-/* Set the GF_OMP_FOR_COMBINED field in G depending on the boolean
-   value of COMBINED_P.  */
-
-static inline void
-gimple_omp_for_set_combined_p (gimple g, bool combined_p)
-{
-  GIMPLE_CHECK (g, GIMPLE_OMP_FOR);
-  if (combined_p)
-    g->subcode |= GF_OMP_FOR_COMBINED;
-  else
-    g->subcode &= ~GF_OMP_FOR_COMBINED;
-}
-
-
-/* Return true if OMP for statement G has the
-   GF_OMP_FOR_COMBINED_INTO flag set.  */
-
-static inline bool
-gimple_omp_for_combined_into_p (const_gimple g)
-{
-  GIMPLE_CHECK (g, GIMPLE_OMP_FOR);
-  return (gimple_omp_subcode (g) & GF_OMP_FOR_COMBINED_INTO) != 0;
-}
-
-
-/* Set the GF_OMP_FOR_COMBINED_INTO field in G depending on the boolean
-   value of COMBINED_P.  */
-
-static inline void
-gimple_omp_for_set_combined_into_p (gimple g, bool combined_p)
-{
-  GIMPLE_CHECK (g, GIMPLE_OMP_FOR);
-  if (combined_p)
-    g->subcode |= GF_OMP_FOR_COMBINED_INTO;
-  else
-    g->subcode &= ~GF_OMP_FOR_COMBINED_INTO;
-}
-
-
-/* Return the clauses associated with OMP_FOR GS.  */
-
-static inline tree
-gimple_omp_for_clauses (const_gimple gs)
-{
-  const gimple_statement_omp_for *omp_for_stmt =
-    as_a <const gimple_statement_omp_for> (gs);
-  return omp_for_stmt->clauses;
-}
-
-
-/* Return a pointer to the OMP_FOR GS.  */
-
-static inline tree *
-gimple_omp_for_clauses_ptr (gimple gs)
-{
-  gimple_statement_omp_for *omp_for_stmt =
-    as_a <gimple_statement_omp_for> (gs);
-  return &omp_for_stmt->clauses;
-}
-
-
-/* Set CLAUSES to be the list of clauses associated with OMP_FOR GS.  */
-
-static inline void
-gimple_omp_for_set_clauses (gimple gs, tree clauses)
-{
-  gimple_statement_omp_for *omp_for_stmt =
-    as_a <gimple_statement_omp_for> (gs);
-  omp_for_stmt->clauses = clauses;
-}
-
-
-/* Get the collapse count of OMP_FOR GS.  */
-
-static inline size_t
-gimple_omp_for_collapse (gimple gs)
-{
-  gimple_statement_omp_for *omp_for_stmt =
-    as_a <gimple_statement_omp_for> (gs);
-  return omp_for_stmt->collapse;
-}
-
-
-/* Return the index variable for OMP_FOR GS.  */
-
-static inline tree
-gimple_omp_for_index (const_gimple gs, size_t i)
-{
-  const gimple_statement_omp_for *omp_for_stmt =
-    as_a <const gimple_statement_omp_for> (gs);
-  gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
-  return omp_for_stmt->iter[i].index;
-}
-
-
-/* Return a pointer to the index variable for OMP_FOR GS.  */
-
-static inline tree *
-gimple_omp_for_index_ptr (gimple gs, size_t i)
-{
-  gimple_statement_omp_for *omp_for_stmt =
-    as_a <gimple_statement_omp_for> (gs);
-  gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
-  return &omp_for_stmt->iter[i].index;
-}
-
-
-/* Set INDEX to be the index variable for OMP_FOR GS.  */
-
-static inline void
-gimple_omp_for_set_index (gimple gs, size_t i, tree index)
-{
-  gimple_statement_omp_for *omp_for_stmt =
-    as_a <gimple_statement_omp_for> (gs);
-  gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
-  omp_for_stmt->iter[i].index = index;
-}
-
-
-/* Return the initial value for OMP_FOR GS.  */
-
-static inline tree
-gimple_omp_for_initial (const_gimple gs, size_t i)
-{
-  const gimple_statement_omp_for *omp_for_stmt =
-    as_a <const gimple_statement_omp_for> (gs);
-  gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
-  return omp_for_stmt->iter[i].initial;
-}
-
-
-/* Return a pointer to the initial value for OMP_FOR GS.  */
-
-static inline tree *
-gimple_omp_for_initial_ptr (gimple gs, size_t i)
-{
-  gimple_statement_omp_for *omp_for_stmt =
-    as_a <gimple_statement_omp_for> (gs);
-  gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
-  return &omp_for_stmt->iter[i].initial;
-}
-
-
-/* Set INITIAL to be the initial value for OMP_FOR GS.  */
-
-static inline void
-gimple_omp_for_set_initial (gimple gs, size_t i, tree initial)
-{
-  gimple_statement_omp_for *omp_for_stmt =
-    as_a <gimple_statement_omp_for> (gs);
-  gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
-  omp_for_stmt->iter[i].initial = initial;
-}
-
-
-/* Return the final value for OMP_FOR GS.  */
-
-static inline tree
-gimple_omp_for_final (const_gimple gs, size_t i)
-{
-  const gimple_statement_omp_for *omp_for_stmt =
-    as_a <const gimple_statement_omp_for> (gs);
-  gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
-  return omp_for_stmt->iter[i].final;
-}
-
-
-/* Return a pointer to the final value for OMP_FOR GS.  */
-
-static inline tree *
-gimple_omp_for_final_ptr (gimple gs, size_t i)
-{
-  gimple_statement_omp_for *omp_for_stmt =
-    as_a <gimple_statement_omp_for> (gs);
-  gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
-  return &omp_for_stmt->iter[i].final;
-}
-
-
-/* Set FINAL to be the final value for OMP_FOR GS.  */
-
-static inline void
-gimple_omp_for_set_final (gimple gs, size_t i, tree final)
-{
-  gimple_statement_omp_for *omp_for_stmt =
-    as_a <gimple_statement_omp_for> (gs);
-  gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
-  omp_for_stmt->iter[i].final = final;
-}
-
-
-/* Return the increment value for OMP_FOR GS.  */
-
-static inline tree
-gimple_omp_for_incr (const_gimple gs, size_t i)
-{
-  const gimple_statement_omp_for *omp_for_stmt =
-    as_a <const gimple_statement_omp_for> (gs);
-  gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
-  return omp_for_stmt->iter[i].incr;
-}
-
-
-/* Return a pointer to the increment value for OMP_FOR GS.  */
-
-static inline tree *
-gimple_omp_for_incr_ptr (gimple gs, size_t i)
-{
-  gimple_statement_omp_for *omp_for_stmt =
-    as_a <gimple_statement_omp_for> (gs);
-  gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
-  return &omp_for_stmt->iter[i].incr;
-}
-
-
-/* Set INCR to be the increment value for OMP_FOR GS.  */
-
-static inline void
-gimple_omp_for_set_incr (gimple gs, size_t i, tree incr)
-{
-  gimple_statement_omp_for *omp_for_stmt =
-    as_a <gimple_statement_omp_for> (gs);
-  gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
-  omp_for_stmt->iter[i].incr = incr;
-}
-
-
-/* Return a pointer to the sequence of statements to execute before the OMP_FOR
-   statement GS starts.  */
-
-static inline gimple_seq *
-gimple_omp_for_pre_body_ptr (gimple gs)
-{
-  gimple_statement_omp_for *omp_for_stmt =
-    as_a <gimple_statement_omp_for> (gs);
-  return &omp_for_stmt->pre_body;
-}
-
-
-/* Return the sequence of statements to execute before the OMP_FOR
-   statement GS starts.  */
-
-static inline gimple_seq
-gimple_omp_for_pre_body (gimple gs)
-{
-  return *gimple_omp_for_pre_body_ptr (gs);
-}
-
-
-/* Set PRE_BODY to be the sequence of statements to execute before the
-   OMP_FOR statement GS starts.  */
-
-static inline void
-gimple_omp_for_set_pre_body (gimple gs, gimple_seq pre_body)
-{
-  gimple_statement_omp_for *omp_for_stmt =
-    as_a <gimple_statement_omp_for> (gs);
-  omp_for_stmt->pre_body = pre_body;
-}
-
-
-/* Return the clauses associated with OMP_PARALLEL GS.  */
-
-static inline tree
-gimple_omp_parallel_clauses (const_gimple gs)
-{
-  const gimple_statement_omp_parallel *omp_parallel_stmt =
-    as_a <const gimple_statement_omp_parallel> (gs);
-  return omp_parallel_stmt->clauses;
-}
-
-
-/* Return a pointer to the clauses associated with OMP_PARALLEL GS.  */
-
-static inline tree *
-gimple_omp_parallel_clauses_ptr (gimple gs)
-{
-  gimple_statement_omp_parallel *omp_parallel_stmt =
-    as_a <gimple_statement_omp_parallel> (gs);
-  return &omp_parallel_stmt->clauses;
-}
-
-
-/* Set CLAUSES to be the list of clauses associated with OMP_PARALLEL
-   GS.  */
-
-static inline void
-gimple_omp_parallel_set_clauses (gimple gs, tree clauses)
-{
-  gimple_statement_omp_parallel *omp_parallel_stmt =
-    as_a <gimple_statement_omp_parallel> (gs);
-  omp_parallel_stmt->clauses = clauses;
-}
-
-
-/* Return the child function used to hold the body of OMP_PARALLEL GS.  */
-
-static inline tree
-gimple_omp_parallel_child_fn (const_gimple gs)
-{
-  const gimple_statement_omp_parallel *omp_parallel_stmt =
-    as_a <const gimple_statement_omp_parallel> (gs);
-  return omp_parallel_stmt->child_fn;
-}
-
-/* Return a pointer to the child function used to hold the body of
-   OMP_PARALLEL GS.  */
-
-static inline tree *
-gimple_omp_parallel_child_fn_ptr (gimple gs)
-{
-  gimple_statement_omp_parallel *omp_parallel_stmt =
-    as_a <gimple_statement_omp_parallel> (gs);
-  return &omp_parallel_stmt->child_fn;
-}
-
-
-/* Set CHILD_FN to be the child function for OMP_PARALLEL GS.  */
-
-static inline void
-gimple_omp_parallel_set_child_fn (gimple gs, tree child_fn)
-{
-  gimple_statement_omp_parallel *omp_parallel_stmt =
-    as_a <gimple_statement_omp_parallel> (gs);
-  omp_parallel_stmt->child_fn = child_fn;
-}
-
-
-/* Return the artificial argument used to send variables and values
-   from the parent to the children threads in OMP_PARALLEL GS.  */
-
-static inline tree
-gimple_omp_parallel_data_arg (const_gimple gs)
-{
-  const gimple_statement_omp_parallel *omp_parallel_stmt =
-    as_a <const gimple_statement_omp_parallel> (gs);
-  return omp_parallel_stmt->data_arg;
-}
-
-
-/* Return a pointer to the data argument for OMP_PARALLEL GS.  */
-
-static inline tree *
-gimple_omp_parallel_data_arg_ptr (gimple gs)
-{
-  gimple_statement_omp_parallel *omp_parallel_stmt =
-    as_a <gimple_statement_omp_parallel> (gs);
-  return &omp_parallel_stmt->data_arg;
-}
-
-
-/* Set DATA_ARG to be the data argument for OMP_PARALLEL GS.  */
-
-static inline void
-gimple_omp_parallel_set_data_arg (gimple gs, tree data_arg)
-{
-  gimple_statement_omp_parallel *omp_parallel_stmt =
-    as_a <gimple_statement_omp_parallel> (gs);
-  omp_parallel_stmt->data_arg = data_arg;
-}
-
-
-/* Return the clauses associated with OMP_TASK GS.  */
-
-static inline tree
-gimple_omp_task_clauses (const_gimple gs)
-{
-  const gimple_statement_omp_task *omp_task_stmt =
-    as_a <const gimple_statement_omp_task> (gs);
-  return omp_task_stmt->clauses;
-}
-
-
-/* Return a pointer to the clauses associated with OMP_TASK GS.  */
-
-static inline tree *
-gimple_omp_task_clauses_ptr (gimple gs)
-{
-  gimple_statement_omp_task *omp_task_stmt =
-    as_a <gimple_statement_omp_task> (gs);
-  return &omp_task_stmt->clauses;
-}
-
-
-/* Set CLAUSES to be the list of clauses associated with OMP_TASK
-   GS.  */
-
-static inline void
-gimple_omp_task_set_clauses (gimple gs, tree clauses)
-{
-  gimple_statement_omp_task *omp_task_stmt =
-    as_a <gimple_statement_omp_task> (gs);
-  omp_task_stmt->clauses = clauses;
-}
-
-
-/* Return the child function used to hold the body of OMP_TASK GS.  */
-
-static inline tree
-gimple_omp_task_child_fn (const_gimple gs)
-{
-  const gimple_statement_omp_task *omp_task_stmt =
-    as_a <const gimple_statement_omp_task> (gs);
-  return omp_task_stmt->child_fn;
-}
-
-/* Return a pointer to the child function used to hold the body of
-   OMP_TASK GS.  */
-
-static inline tree *
-gimple_omp_task_child_fn_ptr (gimple gs)
-{
-  gimple_statement_omp_task *omp_task_stmt =
-    as_a <gimple_statement_omp_task> (gs);
-  return &omp_task_stmt->child_fn;
-}
-
-
-/* Set CHILD_FN to be the child function for OMP_TASK GS.  */
-
-static inline void
-gimple_omp_task_set_child_fn (gimple gs, tree child_fn)
-{
-  gimple_statement_omp_task *omp_task_stmt =
-    as_a <gimple_statement_omp_task> (gs);
-  omp_task_stmt->child_fn = child_fn;
-}
-
-
-/* Return the artificial argument used to send variables and values
-   from the parent to the children threads in OMP_TASK GS.  */
-
-static inline tree
-gimple_omp_task_data_arg (const_gimple gs)
-{
-  const gimple_statement_omp_task *omp_task_stmt =
-    as_a <const gimple_statement_omp_task> (gs);
-  return omp_task_stmt->data_arg;
-}
-
-
-/* Return a pointer to the data argument for OMP_TASK GS.  */
-
-static inline tree *
-gimple_omp_task_data_arg_ptr (gimple gs)
-{
-  gimple_statement_omp_task *omp_task_stmt =
-    as_a <gimple_statement_omp_task> (gs);
-  return &omp_task_stmt->data_arg;
-}
-
-
-/* Set DATA_ARG to be the data argument for OMP_TASK GS.  */
-
-static inline void
-gimple_omp_task_set_data_arg (gimple gs, tree data_arg)
-{
-  gimple_statement_omp_task *omp_task_stmt =
-    as_a <gimple_statement_omp_task> (gs);
-  omp_task_stmt->data_arg = data_arg;
-}
-
-
-/* Return the clauses associated with OMP_TASK GS.  */
-
-static inline tree
-gimple_omp_taskreg_clauses (const_gimple gs)
-{
-  const gimple_statement_omp_taskreg *omp_taskreg_stmt =
-    as_a <const gimple_statement_omp_taskreg> (gs);
-  return omp_taskreg_stmt->clauses;
-}
-
-
-/* Return a pointer to the clauses associated with OMP_TASK GS.  */
-
-static inline tree *
-gimple_omp_taskreg_clauses_ptr (gimple gs)
-{
-  gimple_statement_omp_taskreg *omp_taskreg_stmt =
-    as_a <gimple_statement_omp_taskreg> (gs);
-  return &omp_taskreg_stmt->clauses;
-}
-
-
-/* Set CLAUSES to be the list of clauses associated with OMP_TASK
-   GS.  */
-
-static inline void
-gimple_omp_taskreg_set_clauses (gimple gs, tree clauses)
-{
-  gimple_statement_omp_taskreg *omp_taskreg_stmt =
-    as_a <gimple_statement_omp_taskreg> (gs);
-  omp_taskreg_stmt->clauses = clauses;
-}
-
-
-/* Return the child function used to hold the body of OMP_TASK GS.  */
-
-static inline tree
-gimple_omp_taskreg_child_fn (const_gimple gs)
-{
-  const gimple_statement_omp_taskreg *omp_taskreg_stmt =
-    as_a <const gimple_statement_omp_taskreg> (gs);
-  return omp_taskreg_stmt->child_fn;
-}
-
-/* Return a pointer to the child function used to hold the body of
-   OMP_TASK GS.  */
-
-static inline tree *
-gimple_omp_taskreg_child_fn_ptr (gimple gs)
-{
-  gimple_statement_omp_taskreg *omp_taskreg_stmt =
-    as_a <gimple_statement_omp_taskreg> (gs);
-  return &omp_taskreg_stmt->child_fn;
-}
-
-
-/* Set CHILD_FN to be the child function for OMP_TASK GS.  */
-
-static inline void
-gimple_omp_taskreg_set_child_fn (gimple gs, tree child_fn)
-{
-  gimple_statement_omp_taskreg *omp_taskreg_stmt =
-    as_a <gimple_statement_omp_taskreg> (gs);
-  omp_taskreg_stmt->child_fn = child_fn;
-}
-
-
-/* Return the artificial argument used to send variables and values
-   from the parent to the children threads in OMP_TASK GS.  */
-
-static inline tree
-gimple_omp_taskreg_data_arg (const_gimple gs)
-{
-  const gimple_statement_omp_taskreg *omp_taskreg_stmt =
-    as_a <const gimple_statement_omp_taskreg> (gs);
-  return omp_taskreg_stmt->data_arg;
-}
-
-
-/* Return a pointer to the data argument for OMP_TASK GS.  */
-
-static inline tree *
-gimple_omp_taskreg_data_arg_ptr (gimple gs)
-{
-  gimple_statement_omp_taskreg *omp_taskreg_stmt =
-    as_a <gimple_statement_omp_taskreg> (gs);
-  return &omp_taskreg_stmt->data_arg;
-}
-
-
-/* Set DATA_ARG to be the data argument for OMP_TASK GS.  */
-
-static inline void
-gimple_omp_taskreg_set_data_arg (gimple gs, tree data_arg)
-{
-  gimple_statement_omp_taskreg *omp_taskreg_stmt =
-    as_a <gimple_statement_omp_taskreg> (gs);
-  omp_taskreg_stmt->data_arg = data_arg;
-}
-
-
-/* Return the copy function used to hold the body of OMP_TASK GS.  */
-
-static inline tree
-gimple_omp_task_copy_fn (const_gimple gs)
-{
-  const gimple_statement_omp_task *omp_task_stmt =
-    as_a <const gimple_statement_omp_task> (gs);
-  return omp_task_stmt->copy_fn;
-}
-
-/* Return a pointer to the copy function used to hold the body of
-   OMP_TASK GS.  */
-
-static inline tree *
-gimple_omp_task_copy_fn_ptr (gimple gs)
-{
-  gimple_statement_omp_task *omp_task_stmt =
-    as_a <gimple_statement_omp_task> (gs);
-  return &omp_task_stmt->copy_fn;
-}
-
-
-/* Set CHILD_FN to be the copy function for OMP_TASK GS.  */
-
-static inline void
-gimple_omp_task_set_copy_fn (gimple gs, tree copy_fn)
-{
-  gimple_statement_omp_task *omp_task_stmt =
-    as_a <gimple_statement_omp_task> (gs);
-  omp_task_stmt->copy_fn = copy_fn;
-}
-
-
-/* Return size of the data block in bytes in OMP_TASK GS.  */
-
-static inline tree
-gimple_omp_task_arg_size (const_gimple gs)
-{
-  const gimple_statement_omp_task *omp_task_stmt =
-    as_a <const gimple_statement_omp_task> (gs);
-  return omp_task_stmt->arg_size;
-}
-
-
-/* Return a pointer to the data block size for OMP_TASK GS.  */
-
-static inline tree *
-gimple_omp_task_arg_size_ptr (gimple gs)
-{
-  gimple_statement_omp_task *omp_task_stmt =
-    as_a <gimple_statement_omp_task> (gs);
-  return &omp_task_stmt->arg_size;
-}
-
-
-/* Set ARG_SIZE to be the data block size for OMP_TASK GS.  */
-
-static inline void
-gimple_omp_task_set_arg_size (gimple gs, tree arg_size)
-{
-  gimple_statement_omp_task *omp_task_stmt =
-    as_a <gimple_statement_omp_task> (gs);
-  omp_task_stmt->arg_size = arg_size;
-}
-
-
-/* Return align of the data block in bytes in OMP_TASK GS.  */
-
-static inline tree
-gimple_omp_task_arg_align (const_gimple gs)
-{
-  const gimple_statement_omp_task *omp_task_stmt =
-    as_a <const gimple_statement_omp_task> (gs);
-  return omp_task_stmt->arg_align;
-}
-
-
-/* Return a pointer to the data block align for OMP_TASK GS.  */
-
-static inline tree *
-gimple_omp_task_arg_align_ptr (gimple gs)
-{
-  gimple_statement_omp_task *omp_task_stmt =
-    as_a <gimple_statement_omp_task> (gs);
-  return &omp_task_stmt->arg_align;
-}
-
-
-/* Set ARG_SIZE to be the data block align for OMP_TASK GS.  */
-
-static inline void
-gimple_omp_task_set_arg_align (gimple gs, tree arg_align)
-{
-  gimple_statement_omp_task *omp_task_stmt =
-    as_a <gimple_statement_omp_task> (gs);
-  omp_task_stmt->arg_align = arg_align;
-}
-
-
-/* Return the clauses associated with OMP_SINGLE GS.  */
-
-static inline tree
-gimple_omp_single_clauses (const_gimple gs)
-{
-  const gimple_statement_omp_single *omp_single_stmt =
-    as_a <const gimple_statement_omp_single> (gs);
-  return omp_single_stmt->clauses;
-}
-
-
-/* Return a pointer to the clauses associated with OMP_SINGLE GS.  */
-
-static inline tree *
-gimple_omp_single_clauses_ptr (gimple gs)
-{
-  gimple_statement_omp_single *omp_single_stmt =
-    as_a <gimple_statement_omp_single> (gs);
-  return &omp_single_stmt->clauses;
-}
-
-
-/* Set CLAUSES to be the clauses associated with OMP_SINGLE GS.  */
-
-static inline void
-gimple_omp_single_set_clauses (gimple gs, tree clauses)
-{
-  gimple_statement_omp_single *omp_single_stmt =
-    as_a <gimple_statement_omp_single> (gs);
-  omp_single_stmt->clauses = clauses;
-}
-
-
-/* Return the clauses associated with OMP_TARGET GS.  */
-
-static inline tree
-gimple_omp_target_clauses (const_gimple gs)
-{
-  const gimple_statement_omp_target *omp_target_stmt =
-    as_a <const gimple_statement_omp_target> (gs);
-  return omp_target_stmt->clauses;
-}
-
-
-/* Return a pointer to the clauses associated with OMP_TARGET GS.  */
-
-static inline tree *
-gimple_omp_target_clauses_ptr (gimple gs)
-{
-  gimple_statement_omp_target *omp_target_stmt =
-    as_a <gimple_statement_omp_target> (gs);
-  return &omp_target_stmt->clauses;
-}
-
-
-/* Set CLAUSES to be the clauses associated with OMP_TARGET GS.  */
-
-static inline void
-gimple_omp_target_set_clauses (gimple gs, tree clauses)
-{
-  gimple_statement_omp_target *omp_target_stmt =
-    as_a <gimple_statement_omp_target> (gs);
-  omp_target_stmt->clauses = clauses;
-}
-
-
-/* Return the kind of OMP target statemement.  */
-
-static inline int
-gimple_omp_target_kind (const_gimple g)
-{
-  GIMPLE_CHECK (g, GIMPLE_OMP_TARGET);
-  return (gimple_omp_subcode (g) & GF_OMP_TARGET_KIND_MASK);
-}
-
-
-/* Set the OMP target kind.  */
-
-static inline void
-gimple_omp_target_set_kind (gimple g, int kind)
-{
-  GIMPLE_CHECK (g, GIMPLE_OMP_TARGET);
-  g->subcode = (g->subcode & ~GF_OMP_TARGET_KIND_MASK)
-		      | (kind & GF_OMP_TARGET_KIND_MASK);
-}
-
-
-/* Return the child function used to hold the body of OMP_TARGET GS.  */
-
-static inline tree
-gimple_omp_target_child_fn (const_gimple gs)
-{
-  const gimple_statement_omp_target *omp_target_stmt =
-    as_a <const gimple_statement_omp_target> (gs);
-  return omp_target_stmt->child_fn;
-}
-
-/* Return a pointer to the child function used to hold the body of
-   OMP_TARGET GS.  */
-
-static inline tree *
-gimple_omp_target_child_fn_ptr (gimple gs)
-{
-  gimple_statement_omp_target *omp_target_stmt =
-    as_a <gimple_statement_omp_target> (gs);
-  return &omp_target_stmt->child_fn;
-}
-
-
-/* Set CHILD_FN to be the child function for OMP_TARGET GS.  */
-
-static inline void
-gimple_omp_target_set_child_fn (gimple gs, tree child_fn)
-{
-  gimple_statement_omp_target *omp_target_stmt =
-    as_a <gimple_statement_omp_target> (gs);
-  omp_target_stmt->child_fn = child_fn;
-}
-
-
-/* Return the artificial argument used to send variables and values
-   from the parent to the children threads in OMP_TARGET GS.  */
-
-static inline tree
-gimple_omp_target_data_arg (const_gimple gs)
-{
-  const gimple_statement_omp_target *omp_target_stmt =
-    as_a <const gimple_statement_omp_target> (gs);
-  return omp_target_stmt->data_arg;
-}
-
-
-/* Return a pointer to the data argument for OMP_TARGET GS.  */
-
-static inline tree *
-gimple_omp_target_data_arg_ptr (gimple gs)
-{
-  gimple_statement_omp_target *omp_target_stmt =
-    as_a <gimple_statement_omp_target> (gs);
-  return &omp_target_stmt->data_arg;
-}
-
-
-/* Set DATA_ARG to be the data argument for OMP_TARGET GS.  */
-
-static inline void
-gimple_omp_target_set_data_arg (gimple gs, tree data_arg)
-{
-  gimple_statement_omp_target *omp_target_stmt =
-    as_a <gimple_statement_omp_target> (gs);
-  omp_target_stmt->data_arg = data_arg;
-}
-
-
-/* Return the clauses associated with OMP_TEAMS GS.  */
-
-static inline tree
-gimple_omp_teams_clauses (const_gimple gs)
-{
-  const gimple_statement_omp_teams *omp_teams_stmt =
-    as_a <const gimple_statement_omp_teams> (gs);
-  return omp_teams_stmt->clauses;
-}
-
-
-/* Return a pointer to the clauses associated with OMP_TEAMS GS.  */
-
-static inline tree *
-gimple_omp_teams_clauses_ptr (gimple gs)
-{
-  gimple_statement_omp_teams *omp_teams_stmt =
-    as_a <gimple_statement_omp_teams> (gs);
-  return &omp_teams_stmt->clauses;
-}
-
-
-/* Set CLAUSES to be the clauses associated with OMP_TEAMS GS.  */
-
-static inline void
-gimple_omp_teams_set_clauses (gimple gs, tree clauses)
-{
-  gimple_statement_omp_teams *omp_teams_stmt =
-    as_a <gimple_statement_omp_teams> (gs);
-  omp_teams_stmt->clauses = clauses;
-}
-
-
-/* Return the clauses associated with OMP_SECTIONS GS.  */
-
-static inline tree
-gimple_omp_sections_clauses (const_gimple gs)
-{
-  const gimple_statement_omp_sections *omp_sections_stmt =
-    as_a <const gimple_statement_omp_sections> (gs);
-  return omp_sections_stmt->clauses;
-}
-
-
-/* Return a pointer to the clauses associated with OMP_SECTIONS GS.  */
-
-static inline tree *
-gimple_omp_sections_clauses_ptr (gimple gs)
-{
-  gimple_statement_omp_sections *omp_sections_stmt =
-    as_a <gimple_statement_omp_sections> (gs);
-  return &omp_sections_stmt->clauses;
-}
-
-
-/* Set CLAUSES to be the set of clauses associated with OMP_SECTIONS
-   GS.  */
-
-static inline void
-gimple_omp_sections_set_clauses (gimple gs, tree clauses)
-{
-  gimple_statement_omp_sections *omp_sections_stmt =
-    as_a <gimple_statement_omp_sections> (gs);
-  omp_sections_stmt->clauses = clauses;
-}
-
-
-/* Return the control variable associated with the GIMPLE_OMP_SECTIONS
-   in GS.  */
-
-static inline tree
-gimple_omp_sections_control (const_gimple gs)
-{
-  const gimple_statement_omp_sections *omp_sections_stmt =
-    as_a <const gimple_statement_omp_sections> (gs);
-  return omp_sections_stmt->control;
-}
-
-
-/* Return a pointer to the clauses associated with the GIMPLE_OMP_SECTIONS
-   GS.  */
-
-static inline tree *
-gimple_omp_sections_control_ptr (gimple gs)
-{
-  gimple_statement_omp_sections *omp_sections_stmt =
-    as_a <gimple_statement_omp_sections> (gs);
-  return &omp_sections_stmt->control;
-}
-
-
-/* Set CONTROL to be the set of clauses associated with the
-   GIMPLE_OMP_SECTIONS in GS.  */
-
-static inline void
-gimple_omp_sections_set_control (gimple gs, tree control)
-{
-  gimple_statement_omp_sections *omp_sections_stmt =
-    as_a <gimple_statement_omp_sections> (gs);
-  omp_sections_stmt->control = control;
-}
-
-
-/* Set COND to be the condition code for OMP_FOR GS.  */
-
-static inline void
-gimple_omp_for_set_cond (gimple gs, size_t i, enum tree_code cond)
-{
-  gimple_statement_omp_for *omp_for_stmt =
-    as_a <gimple_statement_omp_for> (gs);
-  gcc_gimple_checking_assert (TREE_CODE_CLASS (cond) == tcc_comparison
-			      && i < omp_for_stmt->collapse);
-  omp_for_stmt->iter[i].cond = cond;
-}
-
-
-/* Return the condition code associated with OMP_FOR GS.  */
-
-static inline enum tree_code
-gimple_omp_for_cond (const_gimple gs, size_t i)
-{
-  const gimple_statement_omp_for *omp_for_stmt =
-    as_a <const gimple_statement_omp_for> (gs);
-  gcc_gimple_checking_assert (i < omp_for_stmt->collapse);
-  return omp_for_stmt->iter[i].cond;
-}
-
-
-/* Set the value being stored in an atomic store.  */
-
-static inline void
-gimple_omp_atomic_store_set_val (gimple g, tree val)
-{
-  gimple_statement_omp_atomic_store *omp_atomic_store_stmt =
-    as_a <gimple_statement_omp_atomic_store> (g);
-  omp_atomic_store_stmt->val = val;
-}
-
-
-/* Return the value being stored in an atomic store.  */
-
-static inline tree
-gimple_omp_atomic_store_val (const_gimple g)
-{
-  const gimple_statement_omp_atomic_store *omp_atomic_store_stmt =
-    as_a <const gimple_statement_omp_atomic_store> (g);
-  return omp_atomic_store_stmt->val;
-}
-
-
-/* Return a pointer to the value being stored in an atomic store.  */
-
-static inline tree *
-gimple_omp_atomic_store_val_ptr (gimple g)
-{
-  gimple_statement_omp_atomic_store *omp_atomic_store_stmt =
-    as_a <gimple_statement_omp_atomic_store> (g);
-  return &omp_atomic_store_stmt->val;
-}
-
-
-/* Set the LHS of an atomic load.  */
-
-static inline void
-gimple_omp_atomic_load_set_lhs (gimple g, tree lhs)
-{
-  gimple_statement_omp_atomic_load *omp_atomic_load_stmt =
-    as_a <gimple_statement_omp_atomic_load> (g);
-  omp_atomic_load_stmt->lhs = lhs;
-}
-
-
-/* Get the LHS of an atomic load.  */
-
-static inline tree
-gimple_omp_atomic_load_lhs (const_gimple g)
-{
-  const gimple_statement_omp_atomic_load *omp_atomic_load_stmt =
-    as_a <const gimple_statement_omp_atomic_load> (g);
-  return omp_atomic_load_stmt->lhs;
-}
-
-
-/* Return a pointer to the LHS of an atomic load.  */
-
-static inline tree *
-gimple_omp_atomic_load_lhs_ptr (gimple g)
-{
-  gimple_statement_omp_atomic_load *omp_atomic_load_stmt =
-    as_a <gimple_statement_omp_atomic_load> (g);
-  return &omp_atomic_load_stmt->lhs;
-}
-
-
-/* Set the RHS of an atomic load.  */
-
-static inline void
-gimple_omp_atomic_load_set_rhs (gimple g, tree rhs)
-{
-  gimple_statement_omp_atomic_load *omp_atomic_load_stmt =
-    as_a <gimple_statement_omp_atomic_load> (g);
-  omp_atomic_load_stmt->rhs = rhs;
-}
-
-
-/* Get the RHS of an atomic load.  */
-
-static inline tree
-gimple_omp_atomic_load_rhs (const_gimple g)
-{
-  const gimple_statement_omp_atomic_load *omp_atomic_load_stmt =
-    as_a <const gimple_statement_omp_atomic_load> (g);
-  return omp_atomic_load_stmt->rhs;
-}
-
-
-/* Return a pointer to the RHS of an atomic load.  */
-
-static inline tree *
-gimple_omp_atomic_load_rhs_ptr (gimple g)
-{
-  gimple_statement_omp_atomic_load *omp_atomic_load_stmt =
-    as_a <gimple_statement_omp_atomic_load> (g);
-  return &omp_atomic_load_stmt->rhs;
-}
-
-
-/* Get the definition of the control variable in a GIMPLE_OMP_CONTINUE.  */
-
-static inline tree
-gimple_omp_continue_control_def (const_gimple g)
-{
-  const gimple_statement_omp_continue *omp_continue_stmt =
-    as_a <const gimple_statement_omp_continue> (g);
-  return omp_continue_stmt->control_def;
-}
-
-/* The same as above, but return the address.  */
-
-static inline tree *
-gimple_omp_continue_control_def_ptr (gimple g)
-{
-  gimple_statement_omp_continue *omp_continue_stmt =
-    as_a <gimple_statement_omp_continue> (g);
-  return &omp_continue_stmt->control_def;
-}
-
-/* Set the definition of the control variable in a GIMPLE_OMP_CONTINUE.  */
-
-static inline void
-gimple_omp_continue_set_control_def (gimple g, tree def)
-{
-  gimple_statement_omp_continue *omp_continue_stmt =
-    as_a <gimple_statement_omp_continue> (g);
-  omp_continue_stmt->control_def = def;
-}
-
-
-/* Get the use of the control variable in a GIMPLE_OMP_CONTINUE.  */
-
-static inline tree
-gimple_omp_continue_control_use (const_gimple g)
-{
-  const gimple_statement_omp_continue *omp_continue_stmt =
-    as_a <const gimple_statement_omp_continue> (g);
-  return omp_continue_stmt->control_use;
-}
-
-
-/* The same as above, but return the address.  */
-
-static inline tree *
-gimple_omp_continue_control_use_ptr (gimple g)
-{
-  gimple_statement_omp_continue *omp_continue_stmt =
-    as_a <gimple_statement_omp_continue> (g);
-  return &omp_continue_stmt->control_use;
-}
-
-
-/* Set the use of the control variable in a GIMPLE_OMP_CONTINUE.  */
-
-static inline void
-gimple_omp_continue_set_control_use (gimple g, tree use)
-{
-  gimple_statement_omp_continue *omp_continue_stmt =
-    as_a <gimple_statement_omp_continue> (g);
-  omp_continue_stmt->control_use = use;
-}
-
-/* Return a pointer to the body for the GIMPLE_TRANSACTION statement GS.  */
-
-static inline gimple_seq *
-gimple_transaction_body_ptr (gimple gs)
-{
-  gimple_statement_transaction *transaction_stmt =
-    as_a <gimple_statement_transaction> (gs);
-  return &transaction_stmt->body;
-}
-
-/* Return the body for the GIMPLE_TRANSACTION statement GS.  */
-
-static inline gimple_seq
-gimple_transaction_body (gimple gs)
-{
-  return *gimple_transaction_body_ptr (gs);
-}
-
-/* Return the label associated with a GIMPLE_TRANSACTION.  */
-
-static inline tree
-gimple_transaction_label (const_gimple gs)
-{
-  const gimple_statement_transaction *transaction_stmt =
-    as_a <const gimple_statement_transaction> (gs);
-  return transaction_stmt->label;
-}
-
-static inline tree *
-gimple_transaction_label_ptr (gimple gs)
-{
-  gimple_statement_transaction *transaction_stmt =
-    as_a <gimple_statement_transaction> (gs);
-  return &transaction_stmt->label;
-}
-
-/* Return the subcode associated with a GIMPLE_TRANSACTION.  */
-
-static inline unsigned int
-gimple_transaction_subcode (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_TRANSACTION);
-  return gs->subcode;
-}
-
-/* Set BODY to be the body for the GIMPLE_TRANSACTION statement GS.  */
-
-static inline void
-gimple_transaction_set_body (gimple gs, gimple_seq body)
-{
-  gimple_statement_transaction *transaction_stmt =
-    as_a <gimple_statement_transaction> (gs);
-  transaction_stmt->body = body;
-}
-
-/* Set the label associated with a GIMPLE_TRANSACTION.  */
-
-static inline void
-gimple_transaction_set_label (gimple gs, tree label)
-{
-  gimple_statement_transaction *transaction_stmt =
-    as_a <gimple_statement_transaction> (gs);
-  transaction_stmt->label = label;
-}
-
-/* Set the subcode associated with a GIMPLE_TRANSACTION.  */
-
-static inline void
-gimple_transaction_set_subcode (gimple gs, unsigned int subcode)
-{
-  GIMPLE_CHECK (gs, GIMPLE_TRANSACTION);
-  gs->subcode = subcode;
-}
-
-
-/* Return a pointer to the return value for GIMPLE_RETURN GS.  */
-
-static inline tree *
-gimple_return_retval_ptr (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_RETURN);
-  return gimple_op_ptr (gs, 0);
-}
-
-/* Return the return value for GIMPLE_RETURN GS.  */
-
-static inline tree
-gimple_return_retval (const_gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_RETURN);
-  return gimple_op (gs, 0);
-}
-
-
-/* Set RETVAL to be the return value for GIMPLE_RETURN GS.  */
-
-static inline void
-gimple_return_set_retval (gimple gs, tree retval)
-{
-  GIMPLE_CHECK (gs, GIMPLE_RETURN);
-  gimple_set_op (gs, 0, retval);
-}
-
-
-/* Returns true when the gimple statement STMT is any of the OpenMP types.  */
-
-#define CASE_GIMPLE_OMP				\
-    case GIMPLE_OMP_PARALLEL:			\
-    case GIMPLE_OMP_TASK:			\
-    case GIMPLE_OMP_FOR:			\
-    case GIMPLE_OMP_SECTIONS:			\
-    case GIMPLE_OMP_SECTIONS_SWITCH:		\
-    case GIMPLE_OMP_SINGLE:			\
-    case GIMPLE_OMP_TARGET:			\
-    case GIMPLE_OMP_TEAMS:			\
-    case GIMPLE_OMP_SECTION:			\
-    case GIMPLE_OMP_MASTER:			\
-    case GIMPLE_OMP_TASKGROUP:			\
-    case GIMPLE_OMP_ORDERED:			\
-    case GIMPLE_OMP_CRITICAL:			\
-    case GIMPLE_OMP_RETURN:			\
-    case GIMPLE_OMP_ATOMIC_LOAD:		\
-    case GIMPLE_OMP_ATOMIC_STORE:		\
-    case GIMPLE_OMP_CONTINUE
-
-static inline bool
-is_gimple_omp (const_gimple stmt)
-{
-  switch (gimple_code (stmt))
-    {
-    CASE_GIMPLE_OMP:
-      return true;
-    default:
-      return false;
-    }
-}
-
-
-/* Returns TRUE if statement G is a GIMPLE_NOP.  */
-
-static inline bool
-gimple_nop_p (const_gimple g)
-{
-  return gimple_code (g) == GIMPLE_NOP;
-}
-
-
-/* Return true if GS is a GIMPLE_RESX.  */
-
-static inline bool
-is_gimple_resx (const_gimple gs)
-{
-  return gimple_code (gs) == GIMPLE_RESX;
-}
-
-/* Return the predictor of GIMPLE_PREDICT statement GS.  */
-
-static inline enum br_predictor
-gimple_predict_predictor (gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_PREDICT);
-  return (enum br_predictor) (gs->subcode & ~GF_PREDICT_TAKEN);
-}
-
-
-/* Set the predictor of GIMPLE_PREDICT statement GS to PREDICT.  */
-
-static inline void
-gimple_predict_set_predictor (gimple gs, enum br_predictor predictor)
-{
-  GIMPLE_CHECK (gs, GIMPLE_PREDICT);
-  gs->subcode = (gs->subcode & GF_PREDICT_TAKEN)
-		       | (unsigned) predictor;
-}
-
-
-/* Return the outcome of GIMPLE_PREDICT statement GS.  */
-
-static inline enum prediction
-gimple_predict_outcome (gimple gs)
-{
-  GIMPLE_CHECK (gs, GIMPLE_PREDICT);
-  return (gs->subcode & GF_PREDICT_TAKEN) ? TAKEN : NOT_TAKEN;
-}
-
-
-/* Set the outcome of GIMPLE_PREDICT statement GS to OUTCOME.  */
-
-static inline void
-gimple_predict_set_outcome (gimple gs, enum prediction outcome)
-{
-  GIMPLE_CHECK (gs, GIMPLE_PREDICT);
-  if (outcome == TAKEN)
-    gs->subcode |= GF_PREDICT_TAKEN;
-  else
-    gs->subcode &= ~GF_PREDICT_TAKEN;
-}
-
-
-/* Return the type of the main expression computed by STMT.  Return
-   void_type_node if the statement computes nothing.  */
-
-static inline tree
-gimple_expr_type (const_gimple stmt)
-{
-  enum gimple_code code = gimple_code (stmt);
-
-  if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL)
-    {
-      tree type;
-      /* In general we want to pass out a type that can be substituted
-         for both the RHS and the LHS types if there is a possibly
-	 useless conversion involved.  That means returning the
-	 original RHS type as far as we can reconstruct it.  */
-      if (code == GIMPLE_CALL)
-	{
-	  if (gimple_call_internal_p (stmt)
-	      && gimple_call_internal_fn (stmt) == IFN_MASK_STORE)
-	    type = TREE_TYPE (gimple_call_arg (stmt, 3));
-	  else
-	    type = gimple_call_return_type (stmt);
-	}
-      else
-	switch (gimple_assign_rhs_code (stmt))
-	  {
-	  case POINTER_PLUS_EXPR:
-	    type = TREE_TYPE (gimple_assign_rhs1 (stmt));
-	    break;
-
-	  default:
-	    /* As fallback use the type of the LHS.  */
-	    type = TREE_TYPE (gimple_get_lhs (stmt));
-	    break;
-	  }
-      return type;
-    }
-  else if (code == GIMPLE_COND)
-    return boolean_type_node;
-  else
-    return void_type_node;
-}
-
-/* Enum and arrays used for allocation stats.  Keep in sync with
-   gimple.c:gimple_alloc_kind_names.  */
-enum gimple_alloc_kind
-{
-  gimple_alloc_kind_assign,	/* Assignments.  */
-  gimple_alloc_kind_phi,	/* PHI nodes.  */
-  gimple_alloc_kind_cond,	/* Conditionals.  */
-  gimple_alloc_kind_rest,	/* Everything else.  */
-  gimple_alloc_kind_all
-};
-
-extern int gimple_alloc_counts[];
-extern int gimple_alloc_sizes[];
-
-/* Return the allocation kind for a given stmt CODE.  */
-static inline enum gimple_alloc_kind
-gimple_alloc_kind (enum gimple_code code)
-{
-  switch (code)
-    {
-      case GIMPLE_ASSIGN:
-	return gimple_alloc_kind_assign;
-      case GIMPLE_PHI:
-	return gimple_alloc_kind_phi;
-      case GIMPLE_COND:
-	return gimple_alloc_kind_cond;
-      default:
-	return gimple_alloc_kind_rest;
-    }
-}
-
-/* Return true if a location should not be emitted for this statement
-   by annotate_all_with_location.  */
-
-static inline bool
-gimple_do_not_emit_location_p (gimple g)
-{
-  return gimple_plf (g, GF_PLF_1);
-}
-
-/* Mark statement G so a location will not be emitted by
-   annotate_one_with_location.  */
-
-static inline void
-gimple_set_do_not_emit_location (gimple g)
-{
-  /* The PLF flags are initialized to 0 when a new tuple is created,
-     so no need to initialize it anywhere.  */
-  gimple_set_plf (g, GF_PLF_1, true);
-}
-
-
-/* Macros for showing usage statistics.  */
-#define SCALE(x) ((unsigned long) ((x) < 1024*10	\
-		  ? (x)					\
-		  : ((x) < 1024*1024*10			\
-		     ? (x) / 1024			\
-		     : (x) / (1024*1024))))
-
-#define LABEL(x) ((x) < 1024*10 ? 'b' : ((x) < 1024*1024*10 ? 'k' : 'M'))
-
-#endif  /* GCC_GIMPLE_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimplify-me.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimplify-me.h
deleted file mode 100644
index 841831d..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimplify-me.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Header file for middle end gimplification.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_GIMPLIFY_ME_H
-#define GCC_GIMPLIFY_ME_H
-
-/* Validation of GIMPLE expressions.  Note that these predicates only check
- *    the basic form of the expression, they don't recurse to make sure that
- *       underlying nodes are also of the right form.  */
-typedef bool (*gimple_predicate)(tree);
-
-extern tree force_gimple_operand_1 (tree, gimple_seq *, gimple_predicate, tree);
-extern tree force_gimple_operand (tree, gimple_seq *, bool, tree);
-extern tree force_gimple_operand_gsi_1 (gimple_stmt_iterator *, tree,
-					gimple_predicate, tree,
-					bool, enum gsi_iterator_update);
-extern tree force_gimple_operand_gsi (gimple_stmt_iterator *, tree, bool, tree,
-				      bool, enum gsi_iterator_update);
-extern void gimple_regimplify_operands (gimple, gimple_stmt_iterator *);
-
-#endif /* GCC_GIMPLIFY_ME_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimplify.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimplify.h
deleted file mode 100644
index 5085ccf..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gimplify.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/* Header file for gimplification.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_GIMPLIFY_H
-#define GCC_GIMPLIFY_H
-
-/* Validation of GIMPLE expressions.  Note that these predicates only check
-   the basic form of the expression, they don't recurse to make sure that
-   underlying nodes are also of the right form.  */
-typedef bool (*gimple_predicate)(tree);
-
-/* FIXME we should deduce this from the predicate.  */
-enum fallback {
-  fb_none = 0,		/* Do not generate a temporary.  */
-
-  fb_rvalue = 1,	/* Generate an rvalue to hold the result of a
-			   gimplified expression.  */
-
-  fb_lvalue = 2,	/* Generate an lvalue to hold the result of a
-			   gimplified expression.  */
-
-  fb_mayfail = 4,	/* Gimplification may fail.  Error issued
-			   afterwards.  */
-  fb_either= fb_rvalue | fb_lvalue
-};
-
-typedef int fallback_t;
-
-enum gimplify_status {
-  GS_ERROR	= -2,	/* Something Bad Seen.  */
-  GS_UNHANDLED	= -1,	/* A langhook result for "I dunno".  */
-  GS_OK		= 0,	/* We did something, maybe more to do.  */
-  GS_ALL_DONE	= 1	/* The expression is fully gimplified.  */
-};
-
-extern void free_gimplify_stack (void);
-extern void push_gimplify_context (bool in_ssa = false,
-				   bool rhs_cond_ok = false);
-extern void pop_gimplify_context (gimple);
-extern gimple gimple_current_bind_expr (void);
-extern vec<gimple> gimple_bind_expr_stack (void);
-extern void gimplify_and_add (tree, gimple_seq *);
-extern tree get_formal_tmp_var (tree, gimple_seq *);
-extern tree get_initialized_tmp_var (tree, gimple_seq *, gimple_seq *);
-extern void declare_vars (tree, gimple, bool);
-extern void gimple_add_tmp_var (tree);
-extern void gimple_add_tmp_var_fn (struct function *, tree);
-extern tree unshare_expr (tree);
-extern tree unshare_expr_without_location (tree);
-extern tree voidify_wrapper_expr (tree, tree);
-extern tree build_and_jump (tree *);
-extern enum gimplify_status gimplify_self_mod_expr (tree *, gimple_seq *,
-						    gimple_seq *, bool, tree);
-extern tree gimple_boolify (tree);
-extern gimple_predicate rhs_predicate_for (tree);
-extern bool gimplify_stmt (tree *, gimple_seq *);
-extern void omp_firstprivatize_variable (struct gimplify_omp_ctx *, tree);
-extern enum gimplify_status gimplify_expr (tree *, gimple_seq *, gimple_seq *,
-					   bool (*) (tree), fallback_t);
-
-extern void gimplify_type_sizes (tree, gimple_seq *);
-extern void gimplify_one_sizepos (tree *, gimple_seq *);
-extern gimple gimplify_body (tree, bool);
-extern enum gimplify_status gimplify_arg (tree *, gimple_seq *, location_t);
-extern void gimplify_function_tree (tree);
-extern enum gimplify_status gimplify_va_arg_expr (tree *, gimple_seq *,
-						  gimple_seq *);
-gimple gimplify_assign (tree, tree, gimple_seq *);
-
-/* Return true if gimplify_one_sizepos doesn't need to gimplify
-   expr (when in TYPE_SIZE{,_UNIT} and similar type/decl size/bitsize
-   fields).  */
-
-static inline bool
-is_gimple_sizepos (tree expr)
-{
-  /* gimplify_one_sizepos doesn't need to do anything if the value isn't there,
-     is constant, or contains A PLACEHOLDER_EXPR.  We also don't want to do
-     anything if it's already a VAR_DECL.  If it's a VAR_DECL from another
-     function, the gimplifier will want to replace it with a new variable,
-     but that will cause problems if this type is from outside the function.
-     It's OK to have that here.  */
-  return (expr == NULL_TREE
-	  || TREE_CONSTANT (expr)
-	  || TREE_CODE (expr) == VAR_DECL
-	  || CONTAINS_PLACEHOLDER_P (expr));
-}                                        
-
-#endif /* GCC_GIMPLIFY_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gsstruct.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gsstruct.def
deleted file mode 100644
index c061dce..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gsstruct.def
+++ /dev/null
@@ -1,53 +0,0 @@
-/* This file contains the definitions for the gimple IR structure
-   enumeration used in GCC.
-
-   Copyright (C) 2007-2014 Free Software Foundation, Inc.
-   Contributed by Aldy Hernandez <aldyh@redhat.com>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* The format of this file is
-   DEFGSSTRUCT(GSS enumeration value, structure name, has-tree-operands).
-   Each enum value should correspond with a single member of the union
-   gimple_statement_d.  */
-
-DEFGSSTRUCT(GSS_BASE, gimple_statement_base, false)
-DEFGSSTRUCT(GSS_WITH_OPS, gimple_statement_with_ops, true)
-DEFGSSTRUCT(GSS_WITH_MEM_OPS_BASE, gimple_statement_with_memory_ops_base, false)
-DEFGSSTRUCT(GSS_WITH_MEM_OPS, gimple_statement_with_memory_ops, true)
-DEFGSSTRUCT(GSS_CALL, gimple_statement_call, true)
-DEFGSSTRUCT(GSS_ASM, gimple_statement_asm, true)
-DEFGSSTRUCT(GSS_BIND, gimple_statement_bind, false)
-DEFGSSTRUCT(GSS_PHI, gimple_statement_phi, false)
-DEFGSSTRUCT(GSS_TRY, gimple_statement_try, false)
-DEFGSSTRUCT(GSS_CATCH, gimple_statement_catch, false)
-DEFGSSTRUCT(GSS_EH_FILTER, gimple_statement_eh_filter, false)
-DEFGSSTRUCT(GSS_EH_MNT, gimple_statement_eh_mnt, false)
-DEFGSSTRUCT(GSS_EH_CTRL, gimple_statement_eh_ctrl, false)
-DEFGSSTRUCT(GSS_EH_ELSE, gimple_statement_eh_else, false)
-DEFGSSTRUCT(GSS_WCE, gimple_statement_wce, false)
-DEFGSSTRUCT(GSS_OMP, gimple_statement_omp, false)
-DEFGSSTRUCT(GSS_OMP_CRITICAL, gimple_statement_omp_critical, false)
-DEFGSSTRUCT(GSS_OMP_FOR, gimple_statement_omp_for, false)
-DEFGSSTRUCT(GSS_OMP_PARALLEL_LAYOUT, gimple_statement_omp_parallel_layout, false)
-DEFGSSTRUCT(GSS_OMP_TASK, gimple_statement_omp_task, false)
-DEFGSSTRUCT(GSS_OMP_SECTIONS, gimple_statement_omp_sections, false)
-DEFGSSTRUCT(GSS_OMP_SINGLE_LAYOUT, gimple_statement_omp_single_layout, false)
-DEFGSSTRUCT(GSS_OMP_CONTINUE, gimple_statement_omp_continue, false)
-DEFGSSTRUCT(GSS_OMP_ATOMIC_LOAD, gimple_statement_omp_atomic_load, false)
-DEFGSSTRUCT(GSS_OMP_ATOMIC_STORE_LAYOUT, gimple_statement_omp_atomic_store, false)
-DEFGSSTRUCT(GSS_TRANSACTION, gimple_statement_transaction, false)
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gtm-builtins.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gtm-builtins.def
deleted file mode 100644
index e2bc081..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gtm-builtins.def
+++ /dev/null
@@ -1,208 +0,0 @@
-DEF_TM_BUILTIN (BUILT_IN_TM_START, "_ITM_beginTransaction",
-		BT_FN_UINT32_UINT32_VAR, ATTR_TM_NOTHROW_RT_LIST)
-
-DEF_TM_BUILTIN (BUILT_IN_TM_COMMIT, "_ITM_commitTransaction",
-		BT_FN_VOID, ATTR_TM_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_COMMIT_EH, "_ITM_commitTransactionEH",
-		BT_FN_VOID_PTR, ATTR_TM_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_ABORT, "_ITM_abortTransaction",
-		BT_FN_VOID_INT, ATTR_TM_NORETURN_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_IRREVOCABLE, "_ITM_changeTransactionMode",
-		BT_FN_VOID_INT, ATTR_TM_NOTHROW_LIST)
-
-DEF_TM_BUILTIN (BUILT_IN_TM_MEMCPY, "_ITM_memcpyRtWt",
-		BT_FN_VOID_PTR_CONST_PTR_SIZE, ATTR_TM_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_MEMMOVE, "_ITM_memmoveRtWt",
-		BT_FN_VOID_PTR_CONST_PTR_SIZE, ATTR_TM_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_MEMSET, "_ITM_memsetW",
-	       	BT_FN_VOID_PTR_INT_SIZE, ATTR_TM_TMPURE_NOTHROW_LIST)
-
-DEF_TM_BUILTIN (BUILT_IN_TM_GETTMCLONE_IRR, "_ITM_getTMCloneOrIrrevocable",
-		BT_FN_PTR_PTR, ATTR_TM_CONST_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_GETTMCLONE_SAFE, "_ITM_getTMCloneSafe",
-		BT_FN_PTR_PTR, ATTR_TM_CONST_NOTHROW_LIST)
-
-/* Memory allocation builtins.  */
-DEF_TM_BUILTIN (BUILT_IN_TM_MALLOC, "_ITM_malloc",
-		BT_FN_PTR_SIZE, ATTR_TMPURE_MALLOC_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_CALLOC, "_ITM_calloc",
-		BT_FN_PTR_SIZE_SIZE, ATTR_TMPURE_MALLOC_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_FREE, "_ITM_free",
-		BT_FN_VOID_PTR, ATTR_TMPURE_NOTHROW_LEAF_LIST)
-
-/* Logging builtins.  */
-DEF_TM_BUILTIN (BUILT_IN_TM_LOG_1, "_ITM_LU1",
-		BT_FN_VOID_VPTR, ATTR_TM_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOG_2, "_ITM_LU2",
-		BT_FN_VOID_VPTR, ATTR_TM_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOG_4, "_ITM_LU4",
-		BT_FN_VOID_VPTR, ATTR_TM_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOG_8, "_ITM_LU8",
-		BT_FN_VOID_VPTR, ATTR_TM_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOG_FLOAT, "_ITM_LF",
-		BT_FN_VOID_VPTR, ATTR_TM_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOG_DOUBLE, "_ITM_LD",
-		BT_FN_VOID_VPTR, ATTR_TM_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOG_LDOUBLE, "_ITM_LE",
-		BT_FN_VOID_VPTR, ATTR_TM_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOG, "_ITM_LB",
-		BT_FN_VOID_VPTR_SIZE, ATTR_TM_TMPURE_NOTHROW_LIST)
-
-/* These stubs should get defined in the backend if applicable.  */
-DEF_BUILTIN_STUB (BUILT_IN_TM_LOG_M64, "__builtin__ITM_LM64")
-DEF_BUILTIN_STUB (BUILT_IN_TM_LOG_M128, "__builtin__ITM_LM128")
-DEF_BUILTIN_STUB (BUILT_IN_TM_LOG_M256, "__builtin__ITM_LM256")
-
-/* Writes.
-
-   Note: The writes must follow the following order: STORE, WAR, WAW.
-   The TM optimizations depend on this order.
-
-   BUILT_IN_TM_STORE_1 must be the first builtin.
-   BUILTIN_TM_LOAD_STORE_P depends on this.  */
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_1, "_ITM_WU1",
-		BT_FN_VOID_VPTR_I1, ATTR_TM_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_WAR_1, "_ITM_WaRU1",
-		BT_FN_VOID_VPTR_I1, ATTR_TM_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_WAW_1, "_ITM_WaWU1",
-		BT_FN_VOID_VPTR_I1, ATTR_TM_NOTHROW_LIST)
-
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_2, "_ITM_WU2",
-		BT_FN_VOID_VPTR_I2, ATTR_TM_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_WAR_2, "_ITM_WaRU2",
-		BT_FN_VOID_VPTR_I2, ATTR_TM_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_WAW_2, "_ITM_WaWU2",
-		BT_FN_VOID_VPTR_I2, ATTR_TM_NOTHROW_LIST)
-
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_4, "_ITM_WU4",
-		BT_FN_VOID_VPTR_I4, ATTR_TM_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_WAR_4, "_ITM_WaRU4",
-		BT_FN_VOID_VPTR_I4, ATTR_TM_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_WAW_4, "_ITM_WaWU4",
-		BT_FN_VOID_VPTR_I4, ATTR_TM_NOTHROW_LIST)
-
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_8, "_ITM_WU8",
-		BT_FN_VOID_VPTR_I8, ATTR_TM_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_WAR_8, "_ITM_WaRU8",
-		BT_FN_VOID_VPTR_I8, ATTR_TM_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_WAW_8, "_ITM_WaWU8",
-		BT_FN_VOID_VPTR_I8, ATTR_TM_NOTHROW_LIST)
-
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_FLOAT, "_ITM_WF",
-		BT_FN_VOID_VPTR_FLOAT, ATTR_TM_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_WAR_FLOAT, "_ITM_WaRF",
-		BT_FN_VOID_VPTR_FLOAT, ATTR_TM_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_WAW_FLOAT, "_ITM_WaWF",
-		BT_FN_VOID_VPTR_FLOAT, ATTR_TM_NOTHROW_LIST)
-
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_DOUBLE, "_ITM_WD",
-		BT_FN_VOID_VPTR_DOUBLE, ATTR_TM_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_WAR_DOUBLE, "_ITM_WaRD",
-		BT_FN_VOID_VPTR_DOUBLE, ATTR_TM_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_WAW_DOUBLE, "_ITM_WaWD",
-		BT_FN_VOID_VPTR_DOUBLE, ATTR_TM_NOTHROW_LIST)
-
-/* These stubs should get defined in the backend if applicable.  */
-DEF_BUILTIN_STUB (BUILT_IN_TM_STORE_M64, "__builtin__ITM_WM64")
-DEF_BUILTIN_STUB (BUILT_IN_TM_STORE_WAR_M64, "__builtin__ITM_WaRM64")
-DEF_BUILTIN_STUB (BUILT_IN_TM_STORE_WAW_M64, "__builtin__ITM_WaWM64")
-DEF_BUILTIN_STUB (BUILT_IN_TM_STORE_M128, "__builtin__ITM_WM128")
-DEF_BUILTIN_STUB (BUILT_IN_TM_STORE_WAR_M128, "__builtin__ITM_WaRM128")
-DEF_BUILTIN_STUB (BUILT_IN_TM_STORE_WAW_M128, "__builtin__ITM_WaWM128")
-DEF_BUILTIN_STUB (BUILT_IN_TM_STORE_M256, "__builtin__ITM_WM256")
-DEF_BUILTIN_STUB (BUILT_IN_TM_STORE_WAR_M256, "__builtin__ITM_WaRM256")
-DEF_BUILTIN_STUB (BUILT_IN_TM_STORE_WAW_M256, "__builtin__ITM_WaWM256")
-
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_LDOUBLE, "_ITM_WE",
-		BT_FN_VOID_VPTR_LDOUBLE, ATTR_TM_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_WAR_LDOUBLE, "_ITM_WaRE",
-		BT_FN_VOID_VPTR_LDOUBLE, ATTR_TM_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_STORE_WAW_LDOUBLE, "_ITM_WaWE",
-		BT_FN_VOID_VPTR_LDOUBLE, ATTR_TM_NOTHROW_LIST)
-/* Note: BUILT_IN_TM_STORE_WAW_LDOUBLE must be the last TM store.
-   BUILTIN_TM_STORE_P depends on this.  */
-
-/* Reads.
-
-   Note: The reads must follow the following order: LOAD, RAR, RAW, RFW.
-   The TM optimizations depend on this order.  */
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_1, "_ITM_RU1",
-		BT_FN_I1_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RAR_1, "_ITM_RaRU1",
-		BT_FN_I1_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RAW_1, "_ITM_RaWU1",
-		BT_FN_I1_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RFW_1, "_ITM_RfWU1",
-		BT_FN_I1_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_2, "_ITM_RU2",
-		BT_FN_I2_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RAR_2, "_ITM_RaRU2",
-		BT_FN_I2_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RAW_2, "_ITM_RaWU2",
-		BT_FN_I2_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RFW_2, "_ITM_RfWU2",
-		BT_FN_I2_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_4, "_ITM_RU4",
-		BT_FN_I4_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RAR_4, "_ITM_RaRU4",
-		BT_FN_I4_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RAW_4, "_ITM_RaWU4",
-		BT_FN_I4_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RFW_4, "_ITM_RfWU4",
-		BT_FN_I4_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_8, "_ITM_RU8",
-		BT_FN_I8_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RAR_8, "_ITM_RaRU8",
-		BT_FN_I8_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RAW_8, "_ITM_RaWU8",
-		BT_FN_I8_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RFW_8, "_ITM_RfWU8",
-		BT_FN_I8_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_FLOAT, "_ITM_RF",
-		BT_FN_FLOAT_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RAR_FLOAT, "_ITM_RaRF",
-		BT_FN_FLOAT_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RAW_FLOAT, "_ITM_RaWF",
-		BT_FN_FLOAT_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RFW_FLOAT, "_ITM_RfWF",
-		BT_FN_FLOAT_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_DOUBLE, "_ITM_RD",
-		BT_FN_DOUBLE_CONST_DOUBLE_PTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RAR_DOUBLE, "_ITM_RaRD",
-		BT_FN_DOUBLE_CONST_DOUBLE_PTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RAW_DOUBLE, "_ITM_RaWD",
-		BT_FN_DOUBLE_CONST_DOUBLE_PTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RFW_DOUBLE, "_ITM_RfWD",
-		BT_FN_DOUBLE_CONST_DOUBLE_PTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-
-/* These stubs should get defined in the backend if applicable.  */
-DEF_BUILTIN_STUB (BUILT_IN_TM_LOAD_M64, "__builtin__ITM_RM64")
-DEF_BUILTIN_STUB (BUILT_IN_TM_LOAD_RAR_M64, "__builtin__ITM_RaRM64")
-DEF_BUILTIN_STUB (BUILT_IN_TM_LOAD_RAW_M64, "__builtin__ITM_RaRM64")
-DEF_BUILTIN_STUB (BUILT_IN_TM_LOAD_RFW_M64, "__builtin__ITM_RfWM64")
-DEF_BUILTIN_STUB (BUILT_IN_TM_LOAD_M128, "__builtin__ITM_RM128")
-DEF_BUILTIN_STUB (BUILT_IN_TM_LOAD_RAR_M128, "__builtin__ITM_RaRM128")
-DEF_BUILTIN_STUB (BUILT_IN_TM_LOAD_RAW_M128, "__builtin__ITM_RaRM128")
-DEF_BUILTIN_STUB (BUILT_IN_TM_LOAD_RFW_M128, "__builtin__ITM_RfWM128")
-DEF_BUILTIN_STUB (BUILT_IN_TM_LOAD_M256, "__builtin__ITM_RM256")
-DEF_BUILTIN_STUB (BUILT_IN_TM_LOAD_RAR_M256, "__builtin__ITM_RaRM256")
-DEF_BUILTIN_STUB (BUILT_IN_TM_LOAD_RAW_M256, "__builtin__ITM_RaRM256")
-DEF_BUILTIN_STUB (BUILT_IN_TM_LOAD_RFW_M256, "__builtin__ITM_RfWM256")
-
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_LDOUBLE, "_ITM_RE",
-		BT_FN_LDOUBLE_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RAR_LDOUBLE, "_ITM_RaRE",
-		BT_FN_LDOUBLE_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RAW_LDOUBLE, "_ITM_RaWE",
-		BT_FN_LDOUBLE_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-DEF_TM_BUILTIN (BUILT_IN_TM_LOAD_RFW_LDOUBLE, "_ITM_RfWE",
-		BT_FN_LDOUBLE_VPTR, ATTR_TM_PURE_TMPURE_NOTHROW_LIST)
-
-/* Note: BUILT_IN_TM_LOAD_RFW_LDOUBLE must be the last TM load as well
-   as the last builtin.  BUILTIN_TM_LOAD_STORE_P and BUILTIN_TM_LOAD_P
-   depend on this.  */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gtype-desc.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gtype-desc.h
deleted file mode 100644
index 8a0aa94..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/gtype-desc.h
+++ /dev/null
@@ -1,5234 +0,0 @@
-/* Type information for GCC.
-   Copyright (C) 2004-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* This file is machine generated.  Do not edit.  */
-
-/* Allocators for known structs and unions.  */
-
-#define ggc_alloc_vec_ivarref_entry_va_gc_() ((vec<ivarref_entry,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<ivarref_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ivarref_entry_va_gc_() ((vec<ivarref_entry,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<ivarref_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_ivarref_entry_va_gc_(n) ((vec<ivarref_entry,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<ivarref_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_ivarref_entry_va_gc_(n) ((vec<ivarref_entry,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<ivarref_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_ivarref_entry() ((struct ivarref_entry *)(ggc_internal_alloc_stat (sizeof (struct ivarref_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ivarref_entry() ((struct ivarref_entry *)(ggc_internal_cleared_alloc_stat (sizeof (struct ivarref_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ivarref_entry(n) ((struct ivarref_entry *)(ggc_internal_vec_alloc_stat (sizeof (struct ivarref_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ivarref_entry(n) ((struct ivarref_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct ivarref_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_prot_list_entry_va_gc_() ((vec<prot_list_entry,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<prot_list_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_prot_list_entry_va_gc_() ((vec<prot_list_entry,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<prot_list_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_prot_list_entry_va_gc_(n) ((vec<prot_list_entry,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<prot_list_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_prot_list_entry_va_gc_(n) ((vec<prot_list_entry,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<prot_list_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_prot_list_entry() ((struct prot_list_entry *)(ggc_internal_alloc_stat (sizeof (struct prot_list_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_prot_list_entry() ((struct prot_list_entry *)(ggc_internal_cleared_alloc_stat (sizeof (struct prot_list_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_prot_list_entry(n) ((struct prot_list_entry *)(ggc_internal_vec_alloc_stat (sizeof (struct prot_list_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_prot_list_entry(n) ((struct prot_list_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct prot_list_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_msgref_entry_va_gc_() ((vec<msgref_entry,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<msgref_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_msgref_entry_va_gc_() ((vec<msgref_entry,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<msgref_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_msgref_entry_va_gc_(n) ((vec<msgref_entry,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<msgref_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_msgref_entry_va_gc_(n) ((vec<msgref_entry,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<msgref_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_msgref_entry() ((struct msgref_entry *)(ggc_internal_alloc_stat (sizeof (struct msgref_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_msgref_entry() ((struct msgref_entry *)(ggc_internal_cleared_alloc_stat (sizeof (struct msgref_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_msgref_entry(n) ((struct msgref_entry *)(ggc_internal_vec_alloc_stat (sizeof (struct msgref_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_msgref_entry(n) ((struct msgref_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct msgref_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_ident_data_tuple_va_gc_() ((vec<ident_data_tuple,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<ident_data_tuple,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ident_data_tuple_va_gc_() ((vec<ident_data_tuple,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<ident_data_tuple,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_ident_data_tuple_va_gc_(n) ((vec<ident_data_tuple,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<ident_data_tuple,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_ident_data_tuple_va_gc_(n) ((vec<ident_data_tuple,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<ident_data_tuple,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_ident_data_tuple() ((struct ident_data_tuple *)(ggc_internal_alloc_stat (sizeof (struct ident_data_tuple) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ident_data_tuple() ((struct ident_data_tuple *)(ggc_internal_cleared_alloc_stat (sizeof (struct ident_data_tuple) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ident_data_tuple(n) ((struct ident_data_tuple *)(ggc_internal_vec_alloc_stat (sizeof (struct ident_data_tuple), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ident_data_tuple(n) ((struct ident_data_tuple *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct ident_data_tuple), n MEM_STAT_INFO)))
-#define ggc_alloc_string_descriptor() ((struct string_descriptor *)(ggc_internal_alloc_stat (sizeof (struct string_descriptor) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_string_descriptor() ((struct string_descriptor *)(ggc_internal_cleared_alloc_stat (sizeof (struct string_descriptor) MEM_STAT_INFO)))
-#define ggc_alloc_vec_string_descriptor(n) ((struct string_descriptor *)(ggc_internal_vec_alloc_stat (sizeof (struct string_descriptor), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_string_descriptor(n) ((struct string_descriptor *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct string_descriptor), n MEM_STAT_INFO)))
-#define ggc_alloc_imp_entry() ((struct imp_entry *)(ggc_internal_alloc_stat (sizeof (struct imp_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_imp_entry() ((struct imp_entry *)(ggc_internal_cleared_alloc_stat (sizeof (struct imp_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_imp_entry(n) ((struct imp_entry *)(ggc_internal_vec_alloc_stat (sizeof (struct imp_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_imp_entry(n) ((struct imp_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct imp_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_hashed_attribute() ((struct hashed_attribute *)(ggc_internal_alloc_stat (sizeof (struct hashed_attribute) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_hashed_attribute() ((struct hashed_attribute *)(ggc_internal_cleared_alloc_stat (sizeof (struct hashed_attribute) MEM_STAT_INFO)))
-#define ggc_alloc_vec_hashed_attribute(n) ((struct hashed_attribute *)(ggc_internal_vec_alloc_stat (sizeof (struct hashed_attribute), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_hashed_attribute(n) ((struct hashed_attribute *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct hashed_attribute), n MEM_STAT_INFO)))
-#define ggc_alloc_hashed_entry() ((struct hashed_entry *)(ggc_internal_alloc_stat (sizeof (struct hashed_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_hashed_entry() ((struct hashed_entry *)(ggc_internal_cleared_alloc_stat (sizeof (struct hashed_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_hashed_entry(n) ((struct hashed_entry *)(ggc_internal_vec_alloc_stat (sizeof (struct hashed_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_hashed_entry(n) ((struct hashed_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct hashed_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_objc_map_private() ((struct objc_map_private *)(ggc_internal_alloc_stat (sizeof (struct objc_map_private) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_objc_map_private() ((struct objc_map_private *)(ggc_internal_cleared_alloc_stat (sizeof (struct objc_map_private) MEM_STAT_INFO)))
-#define ggc_alloc_vec_objc_map_private(n) ((struct objc_map_private *)(ggc_internal_vec_alloc_stat (sizeof (struct objc_map_private), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_objc_map_private(n) ((struct objc_map_private *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct objc_map_private), n MEM_STAT_INFO)))
-#define ggc_alloc_builtin_record() ((struct builtin_record *)(ggc_internal_alloc_stat (sizeof (struct builtin_record) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_builtin_record() ((struct builtin_record *)(ggc_internal_cleared_alloc_stat (sizeof (struct builtin_record) MEM_STAT_INFO)))
-#define ggc_alloc_vec_builtin_record(n) ((struct builtin_record *)(ggc_internal_vec_alloc_stat (sizeof (struct builtin_record), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_builtin_record(n) ((struct builtin_record *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct builtin_record), n MEM_STAT_INFO)))
-#define ggc_alloc_string_or_tree() ((union string_or_tree *)(ggc_internal_alloc_stat (sizeof (union string_or_tree) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_string_or_tree() ((union string_or_tree *)(ggc_internal_cleared_alloc_stat (sizeof (union string_or_tree) MEM_STAT_INFO)))
-#define ggc_alloc_vec_string_or_tree(n) ((union string_or_tree *)(ggc_internal_vec_alloc_stat (sizeof (union string_or_tree), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_string_or_tree(n) ((union string_or_tree *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union string_or_tree), n MEM_STAT_INFO)))
-#define ggc_alloc_BootstrapMethods() ((struct BootstrapMethods *)(ggc_internal_alloc_stat (sizeof (struct BootstrapMethods) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_BootstrapMethods() ((struct BootstrapMethods *)(ggc_internal_cleared_alloc_stat (sizeof (struct BootstrapMethods) MEM_STAT_INFO)))
-#define ggc_alloc_vec_BootstrapMethods(n) ((struct BootstrapMethods *)(ggc_internal_vec_alloc_stat (sizeof (struct BootstrapMethods), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_BootstrapMethods(n) ((struct BootstrapMethods *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct BootstrapMethods), n MEM_STAT_INFO)))
-#define ggc_alloc_bootstrap_method() ((struct bootstrap_method *)(ggc_internal_alloc_stat (sizeof (struct bootstrap_method) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_bootstrap_method() ((struct bootstrap_method *)(ggc_internal_cleared_alloc_stat (sizeof (struct bootstrap_method) MEM_STAT_INFO)))
-#define ggc_alloc_vec_bootstrap_method(n) ((struct bootstrap_method *)(ggc_internal_vec_alloc_stat (sizeof (struct bootstrap_method), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_bootstrap_method(n) ((struct bootstrap_method *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct bootstrap_method), n MEM_STAT_INFO)))
-#define ggc_alloc_cpool_entry(SIZE) ((union cpool_entry *)(ggc_internal_alloc_stat (SIZE MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cpool_entry(SIZE) ((union cpool_entry *)(ggc_internal_cleared_alloc_stat (SIZE MEM_STAT_INFO)))
-#define ggc_alloc_vec_cpool_entry(SIZE, n) ((union cpool_entry *)(ggc_internal_vec_alloc_stat (SIZE, n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cpool_entry(SIZE, n) ((union cpool_entry *)(ggc_internal_cleared_vec_alloc_stat (SIZE, n MEM_STAT_INFO)))
-#define ggc_alloc_vec_method_entry_va_gc_() ((vec<method_entry,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<method_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_method_entry_va_gc_() ((vec<method_entry,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<method_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_method_entry_va_gc_(n) ((vec<method_entry,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<method_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_method_entry_va_gc_(n) ((vec<method_entry,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<method_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_method_entry_d() ((struct method_entry_d *)(ggc_internal_alloc_stat (sizeof (struct method_entry_d) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_method_entry_d() ((struct method_entry_d *)(ggc_internal_cleared_alloc_stat (sizeof (struct method_entry_d) MEM_STAT_INFO)))
-#define ggc_alloc_vec_method_entry_d(n) ((struct method_entry_d *)(ggc_internal_vec_alloc_stat (sizeof (struct method_entry_d), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_method_entry_d(n) ((struct method_entry_d *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct method_entry_d), n MEM_STAT_INFO)))
-#define ggc_alloc_lang_decl_var() ((struct lang_decl_var *)(ggc_internal_alloc_stat (sizeof (struct lang_decl_var) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lang_decl_var() ((struct lang_decl_var *)(ggc_internal_cleared_alloc_stat (sizeof (struct lang_decl_var) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lang_decl_var(n) ((struct lang_decl_var *)(ggc_internal_vec_alloc_stat (sizeof (struct lang_decl_var), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lang_decl_var(n) ((struct lang_decl_var *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct lang_decl_var), n MEM_STAT_INFO)))
-#define ggc_alloc_type_assertion() ((struct type_assertion *)(ggc_internal_alloc_stat (sizeof (struct type_assertion) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_type_assertion() ((struct type_assertion *)(ggc_internal_cleared_alloc_stat (sizeof (struct type_assertion) MEM_STAT_INFO)))
-#define ggc_alloc_vec_type_assertion(n) ((struct type_assertion *)(ggc_internal_vec_alloc_stat (sizeof (struct type_assertion), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_type_assertion(n) ((struct type_assertion *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct type_assertion), n MEM_STAT_INFO)))
-#define ggc_alloc_lang_decl_func() ((struct lang_decl_func *)(ggc_internal_alloc_stat (sizeof (struct lang_decl_func) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lang_decl_func() ((struct lang_decl_func *)(ggc_internal_cleared_alloc_stat (sizeof (struct lang_decl_func) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lang_decl_func(n) ((struct lang_decl_func *)(ggc_internal_vec_alloc_stat (sizeof (struct lang_decl_func), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lang_decl_func(n) ((struct lang_decl_func *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct lang_decl_func), n MEM_STAT_INFO)))
-#define ggc_alloc_treetreehash_entry() ((struct treetreehash_entry *)(ggc_internal_alloc_stat (sizeof (struct treetreehash_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_treetreehash_entry() ((struct treetreehash_entry *)(ggc_internal_cleared_alloc_stat (sizeof (struct treetreehash_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_treetreehash_entry(n) ((struct treetreehash_entry *)(ggc_internal_vec_alloc_stat (sizeof (struct treetreehash_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_treetreehash_entry(n) ((struct treetreehash_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct treetreehash_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_CPool() ((struct CPool *)(ggc_internal_alloc_stat (sizeof (struct CPool) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_CPool() ((struct CPool *)(ggc_internal_cleared_alloc_stat (sizeof (struct CPool) MEM_STAT_INFO)))
-#define ggc_alloc_vec_CPool(n) ((struct CPool *)(ggc_internal_vec_alloc_stat (sizeof (struct CPool), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_CPool(n) ((struct CPool *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct CPool), n MEM_STAT_INFO)))
-#define ggc_alloc_JCF() ((struct JCF *)(ggc_internal_alloc_stat (sizeof (struct JCF) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_JCF() ((struct JCF *)(ggc_internal_cleared_alloc_stat (sizeof (struct JCF) MEM_STAT_INFO)))
-#define ggc_alloc_vec_JCF(n) ((struct JCF *)(ggc_internal_vec_alloc_stat (sizeof (struct JCF), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_JCF(n) ((struct JCF *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct JCF), n MEM_STAT_INFO)))
-#define ggc_alloc_gfc_powdecl_list() ((struct gfc_powdecl_list *)(ggc_internal_alloc_stat (sizeof (struct gfc_powdecl_list) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gfc_powdecl_list() ((struct gfc_powdecl_list *)(ggc_internal_cleared_alloc_stat (sizeof (struct gfc_powdecl_list) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gfc_powdecl_list(n) ((struct gfc_powdecl_list *)(ggc_internal_vec_alloc_stat (sizeof (struct gfc_powdecl_list), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gfc_powdecl_list(n) ((struct gfc_powdecl_list *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gfc_powdecl_list), n MEM_STAT_INFO)))
-#define ggc_alloc_gfc_st_parameter() ((struct gfc_st_parameter *)(ggc_internal_alloc_stat (sizeof (struct gfc_st_parameter) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gfc_st_parameter() ((struct gfc_st_parameter *)(ggc_internal_cleared_alloc_stat (sizeof (struct gfc_st_parameter) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gfc_st_parameter(n) ((struct gfc_st_parameter *)(ggc_internal_vec_alloc_stat (sizeof (struct gfc_st_parameter), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gfc_st_parameter(n) ((struct gfc_st_parameter *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gfc_st_parameter), n MEM_STAT_INFO)))
-#define ggc_alloc_gfc_st_parameter_field() ((struct gfc_st_parameter_field *)(ggc_internal_alloc_stat (sizeof (struct gfc_st_parameter_field) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gfc_st_parameter_field() ((struct gfc_st_parameter_field *)(ggc_internal_cleared_alloc_stat (sizeof (struct gfc_st_parameter_field) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gfc_st_parameter_field(n) ((struct gfc_st_parameter_field *)(ggc_internal_vec_alloc_stat (sizeof (struct gfc_st_parameter_field), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gfc_st_parameter_field(n) ((struct gfc_st_parameter_field *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gfc_st_parameter_field), n MEM_STAT_INFO)))
-#define ggc_alloc_gfc_intrinsic_map_t() ((struct gfc_intrinsic_map_t *)(ggc_internal_alloc_stat (sizeof (struct gfc_intrinsic_map_t) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gfc_intrinsic_map_t() ((struct gfc_intrinsic_map_t *)(ggc_internal_cleared_alloc_stat (sizeof (struct gfc_intrinsic_map_t) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gfc_intrinsic_map_t(n) ((struct gfc_intrinsic_map_t *)(ggc_internal_vec_alloc_stat (sizeof (struct gfc_intrinsic_map_t), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gfc_intrinsic_map_t(n) ((struct gfc_intrinsic_map_t *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gfc_intrinsic_map_t), n MEM_STAT_INFO)))
-#define ggc_alloc_module_htab_entry() ((struct module_htab_entry *)(ggc_internal_alloc_stat (sizeof (struct module_htab_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_module_htab_entry() ((struct module_htab_entry *)(ggc_internal_cleared_alloc_stat (sizeof (struct module_htab_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_module_htab_entry(n) ((struct module_htab_entry *)(ggc_internal_vec_alloc_stat (sizeof (struct module_htab_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_module_htab_entry(n) ((struct module_htab_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct module_htab_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_binding_level() ((struct binding_level *)(ggc_internal_alloc_stat (sizeof (struct binding_level) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_binding_level() ((struct binding_level *)(ggc_internal_cleared_alloc_stat (sizeof (struct binding_level) MEM_STAT_INFO)))
-#define ggc_alloc_vec_binding_level(n) ((struct binding_level *)(ggc_internal_vec_alloc_stat (sizeof (struct binding_level), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_binding_level(n) ((struct binding_level *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct binding_level), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_pending_noexcept_va_gc_() ((vec<pending_noexcept,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<pending_noexcept,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_pending_noexcept_va_gc_() ((vec<pending_noexcept,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<pending_noexcept,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_pending_noexcept_va_gc_(n) ((vec<pending_noexcept,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<pending_noexcept,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_pending_noexcept_va_gc_(n) ((vec<pending_noexcept,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<pending_noexcept,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_pending_noexcept() ((struct pending_noexcept *)(ggc_internal_alloc_stat (sizeof (struct pending_noexcept) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_pending_noexcept() ((struct pending_noexcept *)(ggc_internal_cleared_alloc_stat (sizeof (struct pending_noexcept) MEM_STAT_INFO)))
-#define ggc_alloc_vec_pending_noexcept(n) ((struct pending_noexcept *)(ggc_internal_vec_alloc_stat (sizeof (struct pending_noexcept), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_pending_noexcept(n) ((struct pending_noexcept *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct pending_noexcept), n MEM_STAT_INFO)))
-#define ggc_alloc_pending_abstract_type() ((struct pending_abstract_type *)(ggc_internal_alloc_stat (sizeof (struct pending_abstract_type) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_pending_abstract_type() ((struct pending_abstract_type *)(ggc_internal_cleared_alloc_stat (sizeof (struct pending_abstract_type) MEM_STAT_INFO)))
-#define ggc_alloc_vec_pending_abstract_type(n) ((struct pending_abstract_type *)(ggc_internal_vec_alloc_stat (sizeof (struct pending_abstract_type), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_pending_abstract_type(n) ((struct pending_abstract_type *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct pending_abstract_type), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_int_va_gc_() ((vec<tree_int,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<tree_int,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_int_va_gc_() ((vec<tree_int,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<tree_int,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_tree_int_va_gc_(n) ((vec<tree_int,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<tree_int,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_tree_int_va_gc_(n) ((vec<tree_int,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<tree_int,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_int() ((struct tree_int *)(ggc_internal_alloc_stat (sizeof (struct tree_int) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_int() ((struct tree_int *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_int) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_int(n) ((struct tree_int *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_int), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_int(n) ((struct tree_int *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_int), n MEM_STAT_INFO)))
-#define ggc_alloc_cp_parser() ((struct cp_parser *)(ggc_internal_alloc_stat (sizeof (struct cp_parser) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cp_parser() ((struct cp_parser *)(ggc_internal_cleared_alloc_stat (sizeof (struct cp_parser) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cp_parser(n) ((struct cp_parser *)(ggc_internal_vec_alloc_stat (sizeof (struct cp_parser), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cp_parser(n) ((struct cp_parser *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cp_parser), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_cp_unparsed_functions_entry_va_gc_() ((vec<cp_unparsed_functions_entry,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<cp_unparsed_functions_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cp_unparsed_functions_entry_va_gc_() ((vec<cp_unparsed_functions_entry,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<cp_unparsed_functions_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_cp_unparsed_functions_entry_va_gc_(n) ((vec<cp_unparsed_functions_entry,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<cp_unparsed_functions_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_cp_unparsed_functions_entry_va_gc_(n) ((vec<cp_unparsed_functions_entry,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<cp_unparsed_functions_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cp_parser_context() ((struct cp_parser_context *)(ggc_internal_alloc_stat (sizeof (struct cp_parser_context) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cp_parser_context() ((struct cp_parser_context *)(ggc_internal_cleared_alloc_stat (sizeof (struct cp_parser_context) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cp_parser_context(n) ((struct cp_parser_context *)(ggc_internal_vec_alloc_stat (sizeof (struct cp_parser_context), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cp_parser_context(n) ((struct cp_parser_context *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cp_parser_context), n MEM_STAT_INFO)))
-#define ggc_alloc_cp_unparsed_functions_entry_d() ((struct cp_unparsed_functions_entry_d *)(ggc_internal_alloc_stat (sizeof (struct cp_unparsed_functions_entry_d) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cp_unparsed_functions_entry_d() ((struct cp_unparsed_functions_entry_d *)(ggc_internal_cleared_alloc_stat (sizeof (struct cp_unparsed_functions_entry_d) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cp_unparsed_functions_entry_d(n) ((struct cp_unparsed_functions_entry_d *)(ggc_internal_vec_alloc_stat (sizeof (struct cp_unparsed_functions_entry_d), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cp_unparsed_functions_entry_d(n) ((struct cp_unparsed_functions_entry_d *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cp_unparsed_functions_entry_d), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_cp_default_arg_entry_va_gc_() ((vec<cp_default_arg_entry,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<cp_default_arg_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cp_default_arg_entry_va_gc_() ((vec<cp_default_arg_entry,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<cp_default_arg_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_cp_default_arg_entry_va_gc_(n) ((vec<cp_default_arg_entry,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<cp_default_arg_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_cp_default_arg_entry_va_gc_(n) ((vec<cp_default_arg_entry,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<cp_default_arg_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cp_default_arg_entry_d() ((struct cp_default_arg_entry_d *)(ggc_internal_alloc_stat (sizeof (struct cp_default_arg_entry_d) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cp_default_arg_entry_d() ((struct cp_default_arg_entry_d *)(ggc_internal_cleared_alloc_stat (sizeof (struct cp_default_arg_entry_d) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cp_default_arg_entry_d(n) ((struct cp_default_arg_entry_d *)(ggc_internal_vec_alloc_stat (sizeof (struct cp_default_arg_entry_d), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cp_default_arg_entry_d(n) ((struct cp_default_arg_entry_d *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cp_default_arg_entry_d), n MEM_STAT_INFO)))
-#define ggc_alloc_cp_lexer() ((struct cp_lexer *)(ggc_internal_alloc_stat (sizeof (struct cp_lexer) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cp_lexer() ((struct cp_lexer *)(ggc_internal_cleared_alloc_stat (sizeof (struct cp_lexer) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cp_lexer(n) ((struct cp_lexer *)(ggc_internal_vec_alloc_stat (sizeof (struct cp_lexer), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cp_lexer(n) ((struct cp_lexer *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cp_lexer), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_cp_token_va_gc_() ((vec<cp_token,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<cp_token,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cp_token_va_gc_() ((vec<cp_token,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<cp_token,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_cp_token_va_gc_(n) ((vec<cp_token,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<cp_token,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_cp_token_va_gc_(n) ((vec<cp_token,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<cp_token,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cp_token() ((struct cp_token *)(ggc_internal_alloc_stat (sizeof (struct cp_token) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cp_token() ((struct cp_token *)(ggc_internal_cleared_alloc_stat (sizeof (struct cp_token) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cp_token(n) ((struct cp_token *)(ggc_internal_vec_alloc_stat (sizeof (struct cp_token), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cp_token(n) ((struct cp_token *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cp_token), n MEM_STAT_INFO)))
-#define ggc_alloc_cp_token_value() ((union cp_token_value *)(ggc_internal_alloc_stat (sizeof (union cp_token_value) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cp_token_value() ((union cp_token_value *)(ggc_internal_cleared_alloc_stat (sizeof (union cp_token_value) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cp_token_value(n) ((union cp_token_value *)(ggc_internal_vec_alloc_stat (sizeof (union cp_token_value), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cp_token_value(n) ((union cp_token_value *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union cp_token_value), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_check() ((struct tree_check *)(ggc_internal_alloc_stat (sizeof (struct tree_check) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_check() ((struct tree_check *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_check) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_check(n) ((struct tree_check *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_check), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_check(n) ((struct tree_check *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_check), n MEM_STAT_INFO)))
-#define ggc_alloc_constexpr_call() ((struct constexpr_call *)(ggc_internal_alloc_stat (sizeof (struct constexpr_call) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_constexpr_call() ((struct constexpr_call *)(ggc_internal_cleared_alloc_stat (sizeof (struct constexpr_call) MEM_STAT_INFO)))
-#define ggc_alloc_vec_constexpr_call(n) ((struct constexpr_call *)(ggc_internal_vec_alloc_stat (sizeof (struct constexpr_call), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_constexpr_call(n) ((struct constexpr_call *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct constexpr_call), n MEM_STAT_INFO)))
-#define ggc_alloc_constexpr_fundef() ((struct constexpr_fundef *)(ggc_internal_alloc_stat (sizeof (struct constexpr_fundef) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_constexpr_fundef() ((struct constexpr_fundef *)(ggc_internal_cleared_alloc_stat (sizeof (struct constexpr_fundef) MEM_STAT_INFO)))
-#define ggc_alloc_vec_constexpr_fundef(n) ((struct constexpr_fundef *)(ggc_internal_vec_alloc_stat (sizeof (struct constexpr_fundef), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_constexpr_fundef(n) ((struct constexpr_fundef *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct constexpr_fundef), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_deferred_access_va_gc_() ((vec<deferred_access,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<deferred_access,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_deferred_access_va_gc_() ((vec<deferred_access,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<deferred_access,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_deferred_access_va_gc_(n) ((vec<deferred_access,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<deferred_access,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_deferred_access_va_gc_(n) ((vec<deferred_access,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<deferred_access,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_deferred_access() ((struct deferred_access *)(ggc_internal_alloc_stat (sizeof (struct deferred_access) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_deferred_access() ((struct deferred_access *)(ggc_internal_cleared_alloc_stat (sizeof (struct deferred_access) MEM_STAT_INFO)))
-#define ggc_alloc_vec_deferred_access(n) ((struct deferred_access *)(ggc_internal_vec_alloc_stat (sizeof (struct deferred_access), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_deferred_access(n) ((struct deferred_access *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct deferred_access), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_deferred_access_check_va_gc_() ((vec<deferred_access_check,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<deferred_access_check,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_deferred_access_check_va_gc_() ((vec<deferred_access_check,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<deferred_access_check,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_deferred_access_check_va_gc_(n) ((vec<deferred_access_check,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<deferred_access_check,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_deferred_access_check_va_gc_(n) ((vec<deferred_access_check,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<deferred_access_check,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_spec_entry() ((struct spec_entry *)(ggc_internal_alloc_stat (sizeof (struct spec_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_spec_entry() ((struct spec_entry *)(ggc_internal_cleared_alloc_stat (sizeof (struct spec_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_spec_entry(n) ((struct spec_entry *)(ggc_internal_vec_alloc_stat (sizeof (struct spec_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_spec_entry(n) ((struct spec_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct spec_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_pending_template() ((struct pending_template *)(ggc_internal_alloc_stat (sizeof (struct pending_template) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_pending_template() ((struct pending_template *)(ggc_internal_cleared_alloc_stat (sizeof (struct pending_template) MEM_STAT_INFO)))
-#define ggc_alloc_vec_pending_template(n) ((struct pending_template *)(ggc_internal_vec_alloc_stat (sizeof (struct pending_template), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_pending_template(n) ((struct pending_template *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct pending_template), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_incomplete_var_va_gc_() ((vec<incomplete_var,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<incomplete_var,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_incomplete_var_va_gc_() ((vec<incomplete_var,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<incomplete_var,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_incomplete_var_va_gc_(n) ((vec<incomplete_var,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<incomplete_var,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_incomplete_var_va_gc_(n) ((vec<incomplete_var,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<incomplete_var,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_incomplete_var_d() ((struct incomplete_var_d *)(ggc_internal_alloc_stat (sizeof (struct incomplete_var_d) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_incomplete_var_d() ((struct incomplete_var_d *)(ggc_internal_cleared_alloc_stat (sizeof (struct incomplete_var_d) MEM_STAT_INFO)))
-#define ggc_alloc_vec_incomplete_var_d(n) ((struct incomplete_var_d *)(ggc_internal_vec_alloc_stat (sizeof (struct incomplete_var_d), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_incomplete_var_d(n) ((struct incomplete_var_d *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct incomplete_var_d), n MEM_STAT_INFO)))
-#define ggc_alloc_named_label_use_entry() ((struct named_label_use_entry *)(ggc_internal_alloc_stat (sizeof (struct named_label_use_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_named_label_use_entry() ((struct named_label_use_entry *)(ggc_internal_cleared_alloc_stat (sizeof (struct named_label_use_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_named_label_use_entry(n) ((struct named_label_use_entry *)(ggc_internal_vec_alloc_stat (sizeof (struct named_label_use_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_named_label_use_entry(n) ((struct named_label_use_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct named_label_use_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_deferred_access_check() ((struct deferred_access_check *)(ggc_internal_alloc_stat (sizeof (struct deferred_access_check) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_deferred_access_check() ((struct deferred_access_check *)(ggc_internal_cleared_alloc_stat (sizeof (struct deferred_access_check) MEM_STAT_INFO)))
-#define ggc_alloc_vec_deferred_access_check(n) ((struct deferred_access_check *)(ggc_internal_vec_alloc_stat (sizeof (struct deferred_access_check), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_deferred_access_check(n) ((struct deferred_access_check *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct deferred_access_check), n MEM_STAT_INFO)))
-#define ggc_alloc_operator_name_info_t() ((struct operator_name_info_t *)(ggc_internal_alloc_stat (sizeof (struct operator_name_info_t) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_operator_name_info_t() ((struct operator_name_info_t *)(ggc_internal_cleared_alloc_stat (sizeof (struct operator_name_info_t) MEM_STAT_INFO)))
-#define ggc_alloc_vec_operator_name_info_t(n) ((struct operator_name_info_t *)(ggc_internal_vec_alloc_stat (sizeof (struct operator_name_info_t), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_operator_name_info_t(n) ((struct operator_name_info_t *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct operator_name_info_t), n MEM_STAT_INFO)))
-#define ggc_alloc_lang_decl_u() ((union lang_decl_u *)(ggc_internal_alloc_stat (sizeof (union lang_decl_u) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lang_decl_u() ((union lang_decl_u *)(ggc_internal_cleared_alloc_stat (sizeof (union lang_decl_u) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lang_decl_u(n) ((union lang_decl_u *)(ggc_internal_vec_alloc_stat (sizeof (union lang_decl_u), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lang_decl_u(n) ((union lang_decl_u *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union lang_decl_u), n MEM_STAT_INFO)))
-#define ggc_alloc_lang_decl_parm() ((struct lang_decl_parm *)(ggc_internal_alloc_stat (sizeof (struct lang_decl_parm) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lang_decl_parm() ((struct lang_decl_parm *)(ggc_internal_cleared_alloc_stat (sizeof (struct lang_decl_parm) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lang_decl_parm(n) ((struct lang_decl_parm *)(ggc_internal_vec_alloc_stat (sizeof (struct lang_decl_parm), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lang_decl_parm(n) ((struct lang_decl_parm *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct lang_decl_parm), n MEM_STAT_INFO)))
-#define ggc_alloc_lang_decl_ns() ((struct lang_decl_ns *)(ggc_internal_alloc_stat (sizeof (struct lang_decl_ns) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lang_decl_ns() ((struct lang_decl_ns *)(ggc_internal_cleared_alloc_stat (sizeof (struct lang_decl_ns) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lang_decl_ns(n) ((struct lang_decl_ns *)(ggc_internal_vec_alloc_stat (sizeof (struct lang_decl_ns), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lang_decl_ns(n) ((struct lang_decl_ns *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct lang_decl_ns), n MEM_STAT_INFO)))
-#define ggc_alloc_lang_decl_fn() ((struct lang_decl_fn *)(ggc_internal_alloc_stat (sizeof (struct lang_decl_fn) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lang_decl_fn() ((struct lang_decl_fn *)(ggc_internal_cleared_alloc_stat (sizeof (struct lang_decl_fn) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lang_decl_fn(n) ((struct lang_decl_fn *)(ggc_internal_vec_alloc_stat (sizeof (struct lang_decl_fn), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lang_decl_fn(n) ((struct lang_decl_fn *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct lang_decl_fn), n MEM_STAT_INFO)))
-#define ggc_alloc_lang_decl_u3() ((union lang_decl_u3 *)(ggc_internal_alloc_stat (sizeof (union lang_decl_u3) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lang_decl_u3() ((union lang_decl_u3 *)(ggc_internal_cleared_alloc_stat (sizeof (union lang_decl_u3) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lang_decl_u3(n) ((union lang_decl_u3 *)(ggc_internal_vec_alloc_stat (sizeof (union lang_decl_u3), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lang_decl_u3(n) ((union lang_decl_u3 *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union lang_decl_u3), n MEM_STAT_INFO)))
-#define ggc_alloc_lang_decl_u5() ((union lang_decl_u5 *)(ggc_internal_alloc_stat (sizeof (union lang_decl_u5) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lang_decl_u5() ((union lang_decl_u5 *)(ggc_internal_cleared_alloc_stat (sizeof (union lang_decl_u5) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lang_decl_u5(n) ((union lang_decl_u5 *)(ggc_internal_vec_alloc_stat (sizeof (union lang_decl_u5), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lang_decl_u5(n) ((union lang_decl_u5 *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union lang_decl_u5), n MEM_STAT_INFO)))
-#define ggc_alloc_lang_decl_min() ((struct lang_decl_min *)(ggc_internal_alloc_stat (sizeof (struct lang_decl_min) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lang_decl_min() ((struct lang_decl_min *)(ggc_internal_cleared_alloc_stat (sizeof (struct lang_decl_min) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lang_decl_min(n) ((struct lang_decl_min *)(ggc_internal_vec_alloc_stat (sizeof (struct lang_decl_min), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lang_decl_min(n) ((struct lang_decl_min *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct lang_decl_min), n MEM_STAT_INFO)))
-#define ggc_alloc_lang_decl_u2() ((union lang_decl_u2 *)(ggc_internal_alloc_stat (sizeof (union lang_decl_u2) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lang_decl_u2() ((union lang_decl_u2 *)(ggc_internal_cleared_alloc_stat (sizeof (union lang_decl_u2) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lang_decl_u2(n) ((union lang_decl_u2 *)(ggc_internal_vec_alloc_stat (sizeof (union lang_decl_u2), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lang_decl_u2(n) ((union lang_decl_u2 *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union lang_decl_u2), n MEM_STAT_INFO)))
-#define ggc_alloc_lang_decl_base() ((struct lang_decl_base *)(ggc_internal_alloc_stat (sizeof (struct lang_decl_base) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lang_decl_base() ((struct lang_decl_base *)(ggc_internal_cleared_alloc_stat (sizeof (struct lang_decl_base) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lang_decl_base(n) ((struct lang_decl_base *)(ggc_internal_vec_alloc_stat (sizeof (struct lang_decl_base), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lang_decl_base(n) ((struct lang_decl_base *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct lang_decl_base), n MEM_STAT_INFO)))
-#define ggc_alloc_lang_type_u() ((union lang_type_u *)(ggc_internal_alloc_stat (sizeof (union lang_type_u) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lang_type_u() ((union lang_type_u *)(ggc_internal_cleared_alloc_stat (sizeof (union lang_type_u) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lang_type_u(n) ((union lang_type_u *)(ggc_internal_vec_alloc_stat (sizeof (union lang_type_u), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lang_type_u(n) ((union lang_type_u *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union lang_type_u), n MEM_STAT_INFO)))
-#define ggc_alloc_lang_type_ptrmem() ((struct lang_type_ptrmem *)(ggc_internal_alloc_stat (sizeof (struct lang_type_ptrmem) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lang_type_ptrmem() ((struct lang_type_ptrmem *)(ggc_internal_cleared_alloc_stat (sizeof (struct lang_type_ptrmem) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lang_type_ptrmem(n) ((struct lang_type_ptrmem *)(ggc_internal_vec_alloc_stat (sizeof (struct lang_type_ptrmem), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lang_type_ptrmem(n) ((struct lang_type_ptrmem *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct lang_type_ptrmem), n MEM_STAT_INFO)))
-#define ggc_alloc_lang_type_class() ((struct lang_type_class *)(ggc_internal_alloc_stat (sizeof (struct lang_type_class) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lang_type_class() ((struct lang_type_class *)(ggc_internal_cleared_alloc_stat (sizeof (struct lang_type_class) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lang_type_class(n) ((struct lang_type_class *)(ggc_internal_vec_alloc_stat (sizeof (struct lang_type_class), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lang_type_class(n) ((struct lang_type_class *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct lang_type_class), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_pair_s_va_gc_() ((vec<tree_pair_s,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<tree_pair_s,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_pair_s_va_gc_() ((vec<tree_pair_s,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<tree_pair_s,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_tree_pair_s_va_gc_(n) ((vec<tree_pair_s,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<tree_pair_s,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_tree_pair_s_va_gc_(n) ((vec<tree_pair_s,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<tree_pair_s,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_lang_type_header() ((struct lang_type_header *)(ggc_internal_alloc_stat (sizeof (struct lang_type_header) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lang_type_header() ((struct lang_type_header *)(ggc_internal_cleared_alloc_stat (sizeof (struct lang_type_header) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lang_type_header(n) ((struct lang_type_header *)(ggc_internal_vec_alloc_stat (sizeof (struct lang_type_header), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lang_type_header(n) ((struct lang_type_header *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct lang_type_header), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_pair_s() ((struct tree_pair_s *)(ggc_internal_alloc_stat (sizeof (struct tree_pair_s) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_pair_s() ((struct tree_pair_s *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_pair_s) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_pair_s(n) ((struct tree_pair_s *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_pair_s), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_pair_s(n) ((struct tree_pair_s *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_pair_s), n MEM_STAT_INFO)))
-#define ggc_alloc_named_label_entry() ((struct named_label_entry *)(ggc_internal_alloc_stat (sizeof (struct named_label_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_named_label_entry() ((struct named_label_entry *)(ggc_internal_cleared_alloc_stat (sizeof (struct named_label_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_named_label_entry(n) ((struct named_label_entry *)(ggc_internal_vec_alloc_stat (sizeof (struct named_label_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_named_label_entry(n) ((struct named_label_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct named_label_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_cxx_saved_binding_va_gc_() ((vec<cxx_saved_binding,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<cxx_saved_binding,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cxx_saved_binding_va_gc_() ((vec<cxx_saved_binding,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<cxx_saved_binding,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_cxx_saved_binding_va_gc_(n) ((vec<cxx_saved_binding,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<cxx_saved_binding,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_cxx_saved_binding_va_gc_(n) ((vec<cxx_saved_binding,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<cxx_saved_binding,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_template_info() ((struct tree_template_info *)(ggc_internal_alloc_stat (sizeof (struct tree_template_info) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_template_info() ((struct tree_template_info *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_template_info) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_template_info(n) ((struct tree_template_info *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_template_info), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_template_info(n) ((struct tree_template_info *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_template_info), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_qualified_typedef_usage_t_va_gc_() ((vec<qualified_typedef_usage_t,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<qualified_typedef_usage_t,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_qualified_typedef_usage_t_va_gc_() ((vec<qualified_typedef_usage_t,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<qualified_typedef_usage_t,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_qualified_typedef_usage_t_va_gc_(n) ((vec<qualified_typedef_usage_t,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<qualified_typedef_usage_t,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_qualified_typedef_usage_t_va_gc_(n) ((vec<qualified_typedef_usage_t,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<qualified_typedef_usage_t,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_qualified_typedef_usage_s() ((struct qualified_typedef_usage_s *)(ggc_internal_alloc_stat (sizeof (struct qualified_typedef_usage_s) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_qualified_typedef_usage_s() ((struct qualified_typedef_usage_s *)(ggc_internal_cleared_alloc_stat (sizeof (struct qualified_typedef_usage_s) MEM_STAT_INFO)))
-#define ggc_alloc_vec_qualified_typedef_usage_s(n) ((struct qualified_typedef_usage_s *)(ggc_internal_vec_alloc_stat (sizeof (struct qualified_typedef_usage_s), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_qualified_typedef_usage_s(n) ((struct qualified_typedef_usage_s *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct qualified_typedef_usage_s), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_lambda_expr() ((struct tree_lambda_expr *)(ggc_internal_alloc_stat (sizeof (struct tree_lambda_expr) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_lambda_expr() ((struct tree_lambda_expr *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_lambda_expr) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_lambda_expr(n) ((struct tree_lambda_expr *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_lambda_expr), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_lambda_expr(n) ((struct tree_lambda_expr *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_lambda_expr), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_trait_expr() ((struct tree_trait_expr *)(ggc_internal_alloc_stat (sizeof (struct tree_trait_expr) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_trait_expr() ((struct tree_trait_expr *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_trait_expr) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_trait_expr(n) ((struct tree_trait_expr *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_trait_expr), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_trait_expr(n) ((struct tree_trait_expr *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_trait_expr), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_argument_pack_select() ((struct tree_argument_pack_select *)(ggc_internal_alloc_stat (sizeof (struct tree_argument_pack_select) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_argument_pack_select() ((struct tree_argument_pack_select *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_argument_pack_select) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_argument_pack_select(n) ((struct tree_argument_pack_select *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_argument_pack_select), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_argument_pack_select(n) ((struct tree_argument_pack_select *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_argument_pack_select), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_static_assert() ((struct tree_static_assert *)(ggc_internal_alloc_stat (sizeof (struct tree_static_assert) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_static_assert() ((struct tree_static_assert *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_static_assert) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_static_assert(n) ((struct tree_static_assert *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_static_assert), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_static_assert(n) ((struct tree_static_assert *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_static_assert), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_deferred_noexcept() ((struct tree_deferred_noexcept *)(ggc_internal_alloc_stat (sizeof (struct tree_deferred_noexcept) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_deferred_noexcept() ((struct tree_deferred_noexcept *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_deferred_noexcept) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_deferred_noexcept(n) ((struct tree_deferred_noexcept *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_deferred_noexcept), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_deferred_noexcept(n) ((struct tree_deferred_noexcept *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_deferred_noexcept), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_default_arg() ((struct tree_default_arg *)(ggc_internal_alloc_stat (sizeof (struct tree_default_arg) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_default_arg() ((struct tree_default_arg *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_default_arg) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_default_arg(n) ((struct tree_default_arg *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_default_arg), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_default_arg(n) ((struct tree_default_arg *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_default_arg), n MEM_STAT_INFO)))
-#define ggc_alloc_cp_token_cache() ((struct cp_token_cache *)(ggc_internal_alloc_stat (sizeof (struct cp_token_cache) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cp_token_cache() ((struct cp_token_cache *)(ggc_internal_cleared_alloc_stat (sizeof (struct cp_token_cache) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cp_token_cache(n) ((struct cp_token_cache *)(ggc_internal_vec_alloc_stat (sizeof (struct cp_token_cache), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cp_token_cache(n) ((struct cp_token_cache *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cp_token_cache), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_baselink() ((struct tree_baselink *)(ggc_internal_alloc_stat (sizeof (struct tree_baselink) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_baselink() ((struct tree_baselink *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_baselink) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_baselink(n) ((struct tree_baselink *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_baselink), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_baselink(n) ((struct tree_baselink *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_baselink), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_overload() ((struct tree_overload *)(ggc_internal_alloc_stat (sizeof (struct tree_overload) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_overload() ((struct tree_overload *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_overload) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_overload(n) ((struct tree_overload *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_overload), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_overload(n) ((struct tree_overload *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_overload), n MEM_STAT_INFO)))
-#define ggc_alloc_ptrmem_cst() ((struct ptrmem_cst *)(ggc_internal_alloc_stat (sizeof (struct ptrmem_cst) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ptrmem_cst() ((struct ptrmem_cst *)(ggc_internal_cleared_alloc_stat (sizeof (struct ptrmem_cst) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ptrmem_cst(n) ((struct ptrmem_cst *)(ggc_internal_vec_alloc_stat (sizeof (struct ptrmem_cst), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ptrmem_cst(n) ((struct ptrmem_cst *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct ptrmem_cst), n MEM_STAT_INFO)))
-#define ggc_alloc_template_parm_index_s() ((struct template_parm_index_s *)(ggc_internal_alloc_stat (sizeof (struct template_parm_index_s) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_template_parm_index_s() ((struct template_parm_index_s *)(ggc_internal_cleared_alloc_stat (sizeof (struct template_parm_index_s) MEM_STAT_INFO)))
-#define ggc_alloc_vec_template_parm_index_s(n) ((struct template_parm_index_s *)(ggc_internal_vec_alloc_stat (sizeof (struct template_parm_index_s), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_template_parm_index_s(n) ((struct template_parm_index_s *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct template_parm_index_s), n MEM_STAT_INFO)))
-#define ggc_alloc_saved_scope() ((struct saved_scope *)(ggc_internal_alloc_stat (sizeof (struct saved_scope) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_saved_scope() ((struct saved_scope *)(ggc_internal_cleared_alloc_stat (sizeof (struct saved_scope) MEM_STAT_INFO)))
-#define ggc_alloc_vec_saved_scope(n) ((struct saved_scope *)(ggc_internal_vec_alloc_stat (sizeof (struct saved_scope), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_saved_scope(n) ((struct saved_scope *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct saved_scope), n MEM_STAT_INFO)))
-#define ggc_alloc_cxx_int_tree_map() ((struct cxx_int_tree_map *)(ggc_internal_alloc_stat (sizeof (struct cxx_int_tree_map) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cxx_int_tree_map() ((struct cxx_int_tree_map *)(ggc_internal_cleared_alloc_stat (sizeof (struct cxx_int_tree_map) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cxx_int_tree_map(n) ((struct cxx_int_tree_map *)(ggc_internal_vec_alloc_stat (sizeof (struct cxx_int_tree_map), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cxx_int_tree_map(n) ((struct cxx_int_tree_map *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cxx_int_tree_map), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_cp_label_binding_va_gc_() ((vec<cp_label_binding,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<cp_label_binding,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cp_label_binding_va_gc_() ((vec<cp_label_binding,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<cp_label_binding,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_cp_label_binding_va_gc_(n) ((vec<cp_label_binding,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<cp_label_binding,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_cp_label_binding_va_gc_(n) ((vec<cp_label_binding,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<cp_label_binding,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_cp_class_binding_va_gc_() ((vec<cp_class_binding,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<cp_class_binding,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cp_class_binding_va_gc_() ((vec<cp_class_binding,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<cp_class_binding,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_cp_class_binding_va_gc_(n) ((vec<cp_class_binding,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<cp_class_binding,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_cp_class_binding_va_gc_(n) ((vec<cp_class_binding,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<cp_class_binding,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cp_label_binding() ((struct cp_label_binding *)(ggc_internal_alloc_stat (sizeof (struct cp_label_binding) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cp_label_binding() ((struct cp_label_binding *)(ggc_internal_cleared_alloc_stat (sizeof (struct cp_label_binding) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cp_label_binding(n) ((struct cp_label_binding *)(ggc_internal_vec_alloc_stat (sizeof (struct cp_label_binding), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cp_label_binding(n) ((struct cp_label_binding *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cp_label_binding), n MEM_STAT_INFO)))
-#define ggc_alloc_cp_class_binding() ((struct cp_class_binding *)(ggc_internal_alloc_stat (sizeof (struct cp_class_binding) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cp_class_binding() ((struct cp_class_binding *)(ggc_internal_cleared_alloc_stat (sizeof (struct cp_class_binding) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cp_class_binding(n) ((struct cp_class_binding *)(ggc_internal_vec_alloc_stat (sizeof (struct cp_class_binding), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cp_class_binding(n) ((struct cp_class_binding *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cp_class_binding), n MEM_STAT_INFO)))
-#define ggc_alloc_cxx_saved_binding() ((struct cxx_saved_binding *)(ggc_internal_alloc_stat (sizeof (struct cxx_saved_binding) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cxx_saved_binding() ((struct cxx_saved_binding *)(ggc_internal_cleared_alloc_stat (sizeof (struct cxx_saved_binding) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cxx_saved_binding(n) ((struct cxx_saved_binding *)(ggc_internal_vec_alloc_stat (sizeof (struct cxx_saved_binding), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cxx_saved_binding(n) ((struct cxx_saved_binding *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cxx_saved_binding), n MEM_STAT_INFO)))
-#define ggc_alloc_cp_binding_level() ((struct cp_binding_level *)(ggc_internal_alloc_stat (sizeof (struct cp_binding_level) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cp_binding_level() ((struct cp_binding_level *)(ggc_internal_cleared_alloc_stat (sizeof (struct cp_binding_level) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cp_binding_level(n) ((struct cp_binding_level *)(ggc_internal_vec_alloc_stat (sizeof (struct cp_binding_level), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cp_binding_level(n) ((struct cp_binding_level *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cp_binding_level), n MEM_STAT_INFO)))
-#define ggc_alloc_cxx_binding() ((struct cxx_binding *)(ggc_internal_alloc_stat (sizeof (struct cxx_binding) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cxx_binding() ((struct cxx_binding *)(ggc_internal_cleared_alloc_stat (sizeof (struct cxx_binding) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cxx_binding(n) ((struct cxx_binding *)(ggc_internal_vec_alloc_stat (sizeof (struct cxx_binding), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cxx_binding(n) ((struct cxx_binding *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cxx_binding), n MEM_STAT_INFO)))
-#define ggc_alloc_binding_entry_s() ((struct binding_entry_s *)(ggc_internal_alloc_stat (sizeof (struct binding_entry_s) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_binding_entry_s() ((struct binding_entry_s *)(ggc_internal_cleared_alloc_stat (sizeof (struct binding_entry_s) MEM_STAT_INFO)))
-#define ggc_alloc_vec_binding_entry_s(n) ((struct binding_entry_s *)(ggc_internal_vec_alloc_stat (sizeof (struct binding_entry_s), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_binding_entry_s(n) ((struct binding_entry_s *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct binding_entry_s), n MEM_STAT_INFO)))
-#define ggc_alloc_binding_table_s() ((struct binding_table_s *)(ggc_internal_alloc_stat (sizeof (struct binding_table_s) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_binding_table_s() ((struct binding_table_s *)(ggc_internal_cleared_alloc_stat (sizeof (struct binding_table_s) MEM_STAT_INFO)))
-#define ggc_alloc_vec_binding_table_s(n) ((struct binding_table_s *)(ggc_internal_vec_alloc_stat (sizeof (struct binding_table_s), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_binding_table_s(n) ((struct binding_table_s *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct binding_table_s), n MEM_STAT_INFO)))
-#define ggc_alloc_tinst_level() ((struct tinst_level *)(ggc_internal_alloc_stat (sizeof (struct tinst_level) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tinst_level() ((struct tinst_level *)(ggc_internal_cleared_alloc_stat (sizeof (struct tinst_level) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tinst_level(n) ((struct tinst_level *)(ggc_internal_vec_alloc_stat (sizeof (struct tinst_level), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tinst_level(n) ((struct tinst_level *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tinst_level), n MEM_STAT_INFO)))
-#define ggc_alloc_globals() ((struct globals *)(ggc_internal_alloc_stat (sizeof (struct globals) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_globals() ((struct globals *)(ggc_internal_cleared_alloc_stat (sizeof (struct globals) MEM_STAT_INFO)))
-#define ggc_alloc_vec_globals(n) ((struct globals *)(ggc_internal_vec_alloc_stat (sizeof (struct globals), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_globals(n) ((struct globals *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct globals), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_tinfo_s_va_gc_() ((vec<tinfo_s,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<tinfo_s,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tinfo_s_va_gc_() ((vec<tinfo_s,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<tinfo_s,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_tinfo_s_va_gc_(n) ((vec<tinfo_s,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<tinfo_s,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_tinfo_s_va_gc_(n) ((vec<tinfo_s,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<tinfo_s,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_tinfo_s() ((struct tinfo_s *)(ggc_internal_alloc_stat (sizeof (struct tinfo_s) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tinfo_s() ((struct tinfo_s *)(ggc_internal_cleared_alloc_stat (sizeof (struct tinfo_s) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tinfo_s(n) ((struct tinfo_s *)(ggc_internal_vec_alloc_stat (sizeof (struct tinfo_s), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tinfo_s(n) ((struct tinfo_s *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tinfo_s), n MEM_STAT_INFO)))
-#define ggc_alloc_c_parser() ((struct c_parser *)(ggc_internal_alloc_stat (sizeof (struct c_parser) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_c_parser() ((struct c_parser *)(ggc_internal_cleared_alloc_stat (sizeof (struct c_parser) MEM_STAT_INFO)))
-#define ggc_alloc_vec_c_parser(n) ((struct c_parser *)(ggc_internal_vec_alloc_stat (sizeof (struct c_parser), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_c_parser(n) ((struct c_parser *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct c_parser), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_c_token_va_gc_() ((vec<c_token,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<c_token,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_c_token_va_gc_() ((vec<c_token,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<c_token,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_c_token_va_gc_(n) ((vec<c_token,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<c_token,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_c_token_va_gc_(n) ((vec<c_token,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<c_token,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_c_token() ((struct c_token *)(ggc_internal_alloc_stat (sizeof (struct c_token) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_c_token() ((struct c_token *)(ggc_internal_cleared_alloc_stat (sizeof (struct c_token) MEM_STAT_INFO)))
-#define ggc_alloc_vec_c_token(n) ((struct c_token *)(ggc_internal_vec_alloc_stat (sizeof (struct c_token), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_c_token(n) ((struct c_token *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct c_token), n MEM_STAT_INFO)))
-#define ggc_alloc_opt_stack() ((struct opt_stack *)(ggc_internal_alloc_stat (sizeof (struct opt_stack) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_opt_stack() ((struct opt_stack *)(ggc_internal_cleared_alloc_stat (sizeof (struct opt_stack) MEM_STAT_INFO)))
-#define ggc_alloc_vec_opt_stack(n) ((struct opt_stack *)(ggc_internal_vec_alloc_stat (sizeof (struct opt_stack), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_opt_stack(n) ((struct opt_stack *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct opt_stack), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_pending_redefinition_va_gc_() ((vec<pending_redefinition,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<pending_redefinition,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_pending_redefinition_va_gc_() ((vec<pending_redefinition,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<pending_redefinition,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_pending_redefinition_va_gc_(n) ((vec<pending_redefinition,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<pending_redefinition,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_pending_redefinition_va_gc_(n) ((vec<pending_redefinition,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<pending_redefinition,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_pending_redefinition_d() ((struct pending_redefinition_d *)(ggc_internal_alloc_stat (sizeof (struct pending_redefinition_d) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_pending_redefinition_d() ((struct pending_redefinition_d *)(ggc_internal_cleared_alloc_stat (sizeof (struct pending_redefinition_d) MEM_STAT_INFO)))
-#define ggc_alloc_vec_pending_redefinition_d(n) ((struct pending_redefinition_d *)(ggc_internal_vec_alloc_stat (sizeof (struct pending_redefinition_d), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_pending_redefinition_d(n) ((struct pending_redefinition_d *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct pending_redefinition_d), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_pending_weak_va_gc_() ((vec<pending_weak,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<pending_weak,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_pending_weak_va_gc_() ((vec<pending_weak,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<pending_weak,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_pending_weak_va_gc_(n) ((vec<pending_weak,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<pending_weak,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_pending_weak_va_gc_(n) ((vec<pending_weak,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<pending_weak,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_pending_weak_d() ((struct pending_weak_d *)(ggc_internal_alloc_stat (sizeof (struct pending_weak_d) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_pending_weak_d() ((struct pending_weak_d *)(ggc_internal_cleared_alloc_stat (sizeof (struct pending_weak_d) MEM_STAT_INFO)))
-#define ggc_alloc_vec_pending_weak_d(n) ((struct pending_weak_d *)(ggc_internal_vec_alloc_stat (sizeof (struct pending_weak_d), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_pending_weak_d(n) ((struct pending_weak_d *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct pending_weak_d), n MEM_STAT_INFO)))
-#define ggc_alloc_align_stack() ((struct align_stack *)(ggc_internal_alloc_stat (sizeof (struct align_stack) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_align_stack() ((struct align_stack *)(ggc_internal_cleared_alloc_stat (sizeof (struct align_stack) MEM_STAT_INFO)))
-#define ggc_alloc_vec_align_stack(n) ((struct align_stack *)(ggc_internal_vec_alloc_stat (sizeof (struct align_stack), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_align_stack(n) ((struct align_stack *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct align_stack), n MEM_STAT_INFO)))
-#define ggc_alloc_lazy_hex_fp_value_struct() ((struct lazy_hex_fp_value_struct *)(ggc_internal_alloc_stat (sizeof (struct lazy_hex_fp_value_struct) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lazy_hex_fp_value_struct() ((struct lazy_hex_fp_value_struct *)(ggc_internal_cleared_alloc_stat (sizeof (struct lazy_hex_fp_value_struct) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lazy_hex_fp_value_struct(n) ((struct lazy_hex_fp_value_struct *)(ggc_internal_vec_alloc_stat (sizeof (struct lazy_hex_fp_value_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lazy_hex_fp_value_struct(n) ((struct lazy_hex_fp_value_struct *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct lazy_hex_fp_value_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_userdef_literal() ((struct tree_userdef_literal *)(ggc_internal_alloc_stat (sizeof (struct tree_userdef_literal) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_userdef_literal() ((struct tree_userdef_literal *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_userdef_literal) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_userdef_literal(n) ((struct tree_userdef_literal *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_userdef_literal), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_userdef_literal(n) ((struct tree_userdef_literal *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_userdef_literal), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_gc_vec_va_gc_() ((vec<tree_gc_vec,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<tree_gc_vec,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_gc_vec_va_gc_() ((vec<tree_gc_vec,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<tree_gc_vec,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_tree_gc_vec_va_gc_(n) ((vec<tree_gc_vec,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<tree_gc_vec,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_tree_gc_vec_va_gc_(n) ((vec<tree_gc_vec,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<tree_gc_vec,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_c_language_function() ((struct c_language_function *)(ggc_internal_alloc_stat (sizeof (struct c_language_function) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_c_language_function() ((struct c_language_function *)(ggc_internal_cleared_alloc_stat (sizeof (struct c_language_function) MEM_STAT_INFO)))
-#define ggc_alloc_vec_c_language_function(n) ((struct c_language_function *)(ggc_internal_vec_alloc_stat (sizeof (struct c_language_function), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_c_language_function(n) ((struct c_language_function *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct c_language_function), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_const_char_p_va_gc_() ((vec<const_char_p,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<const_char_p,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_const_char_p_va_gc_() ((vec<const_char_p,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<const_char_p,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_const_char_p_va_gc_(n) ((vec<const_char_p,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<const_char_p,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_const_char_p_va_gc_(n) ((vec<const_char_p,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<const_char_p,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_sorted_fields_type(SIZE) ((struct sorted_fields_type *)(ggc_internal_alloc_stat (SIZE MEM_STAT_INFO)))
-#define ggc_alloc_cleared_sorted_fields_type(SIZE) ((struct sorted_fields_type *)(ggc_internal_cleared_alloc_stat (SIZE MEM_STAT_INFO)))
-#define ggc_alloc_vec_sorted_fields_type(SIZE, n) ((struct sorted_fields_type *)(ggc_internal_vec_alloc_stat (SIZE, n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_sorted_fields_type(SIZE, n) ((struct sorted_fields_type *)(ggc_internal_cleared_vec_alloc_stat (SIZE, n MEM_STAT_INFO)))
-#define ggc_alloc_c_inline_static() ((struct c_inline_static *)(ggc_internal_alloc_stat (sizeof (struct c_inline_static) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_c_inline_static() ((struct c_inline_static *)(ggc_internal_cleared_alloc_stat (sizeof (struct c_inline_static) MEM_STAT_INFO)))
-#define ggc_alloc_vec_c_inline_static(n) ((struct c_inline_static *)(ggc_internal_vec_alloc_stat (sizeof (struct c_inline_static), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_c_inline_static(n) ((struct c_inline_static *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct c_inline_static), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_c_goto_bindings_p_va_gc_() ((vec<c_goto_bindings_p,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<c_goto_bindings_p,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_c_goto_bindings_p_va_gc_() ((vec<c_goto_bindings_p,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<c_goto_bindings_p,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_c_goto_bindings_p_va_gc_(n) ((vec<c_goto_bindings_p,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<c_goto_bindings_p,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_c_goto_bindings_p_va_gc_(n) ((vec<c_goto_bindings_p,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<c_goto_bindings_p,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_c_goto_bindings() ((struct c_goto_bindings *)(ggc_internal_alloc_stat (sizeof (struct c_goto_bindings) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_c_goto_bindings() ((struct c_goto_bindings *)(ggc_internal_cleared_alloc_stat (sizeof (struct c_goto_bindings) MEM_STAT_INFO)))
-#define ggc_alloc_vec_c_goto_bindings(n) ((struct c_goto_bindings *)(ggc_internal_vec_alloc_stat (sizeof (struct c_goto_bindings), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_c_goto_bindings(n) ((struct c_goto_bindings *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct c_goto_bindings), n MEM_STAT_INFO)))
-#define ggc_alloc_c_scope() ((struct c_scope *)(ggc_internal_alloc_stat (sizeof (struct c_scope) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_c_scope() ((struct c_scope *)(ggc_internal_cleared_alloc_stat (sizeof (struct c_scope) MEM_STAT_INFO)))
-#define ggc_alloc_vec_c_scope(n) ((struct c_scope *)(ggc_internal_vec_alloc_stat (sizeof (struct c_scope), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_c_scope(n) ((struct c_scope *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct c_scope), n MEM_STAT_INFO)))
-#define ggc_alloc_lang_identifier() ((struct lang_identifier *)(ggc_internal_alloc_stat (sizeof (struct lang_identifier) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lang_identifier() ((struct lang_identifier *)(ggc_internal_cleared_alloc_stat (sizeof (struct lang_identifier) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lang_identifier(n) ((struct lang_identifier *)(ggc_internal_vec_alloc_stat (sizeof (struct lang_identifier), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lang_identifier(n) ((struct lang_identifier *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct lang_identifier), n MEM_STAT_INFO)))
-#define ggc_alloc_c_common_identifier() ((struct c_common_identifier *)(ggc_internal_alloc_stat (sizeof (struct c_common_identifier) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_c_common_identifier() ((struct c_common_identifier *)(ggc_internal_cleared_alloc_stat (sizeof (struct c_common_identifier) MEM_STAT_INFO)))
-#define ggc_alloc_vec_c_common_identifier(n) ((struct c_common_identifier *)(ggc_internal_vec_alloc_stat (sizeof (struct c_common_identifier), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_c_common_identifier(n) ((struct c_common_identifier *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct c_common_identifier), n MEM_STAT_INFO)))
-#define ggc_alloc_c_binding() ((struct c_binding *)(ggc_internal_alloc_stat (sizeof (struct c_binding) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_c_binding() ((struct c_binding *)(ggc_internal_cleared_alloc_stat (sizeof (struct c_binding) MEM_STAT_INFO)))
-#define ggc_alloc_vec_c_binding(n) ((struct c_binding *)(ggc_internal_vec_alloc_stat (sizeof (struct c_binding), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_c_binding(n) ((struct c_binding *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct c_binding), n MEM_STAT_INFO)))
-#define ggc_alloc_c_label_vars() ((struct c_label_vars *)(ggc_internal_alloc_stat (sizeof (struct c_label_vars) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_c_label_vars() ((struct c_label_vars *)(ggc_internal_cleared_alloc_stat (sizeof (struct c_label_vars) MEM_STAT_INFO)))
-#define ggc_alloc_vec_c_label_vars(n) ((struct c_label_vars *)(ggc_internal_vec_alloc_stat (sizeof (struct c_label_vars), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_c_label_vars(n) ((struct c_label_vars *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct c_label_vars), n MEM_STAT_INFO)))
-#define ggc_alloc_stmt_tree_s() ((struct stmt_tree_s *)(ggc_internal_alloc_stat (sizeof (struct stmt_tree_s) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_stmt_tree_s() ((struct stmt_tree_s *)(ggc_internal_cleared_alloc_stat (sizeof (struct stmt_tree_s) MEM_STAT_INFO)))
-#define ggc_alloc_vec_stmt_tree_s(n) ((struct stmt_tree_s *)(ggc_internal_vec_alloc_stat (sizeof (struct stmt_tree_s), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_stmt_tree_s(n) ((struct stmt_tree_s *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct stmt_tree_s), n MEM_STAT_INFO)))
-#define ggc_alloc_c_spot_bindings() ((struct c_spot_bindings *)(ggc_internal_alloc_stat (sizeof (struct c_spot_bindings) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_c_spot_bindings() ((struct c_spot_bindings *)(ggc_internal_cleared_alloc_stat (sizeof (struct c_spot_bindings) MEM_STAT_INFO)))
-#define ggc_alloc_vec_c_spot_bindings(n) ((struct c_spot_bindings *)(ggc_internal_vec_alloc_stat (sizeof (struct c_spot_bindings), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_c_spot_bindings(n) ((struct c_spot_bindings *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct c_spot_bindings), n MEM_STAT_INFO)))
-#define ggc_alloc_pad_type_hash() ((struct pad_type_hash *)(ggc_internal_alloc_stat (sizeof (struct pad_type_hash) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_pad_type_hash() ((struct pad_type_hash *)(ggc_internal_cleared_alloc_stat (sizeof (struct pad_type_hash) MEM_STAT_INFO)))
-#define ggc_alloc_vec_pad_type_hash(n) ((struct pad_type_hash *)(ggc_internal_vec_alloc_stat (sizeof (struct pad_type_hash), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_pad_type_hash(n) ((struct pad_type_hash *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct pad_type_hash), n MEM_STAT_INFO)))
-#define ggc_alloc_gnat_binding_level() ((struct gnat_binding_level *)(ggc_internal_alloc_stat (sizeof (struct gnat_binding_level) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gnat_binding_level() ((struct gnat_binding_level *)(ggc_internal_cleared_alloc_stat (sizeof (struct gnat_binding_level) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gnat_binding_level(n) ((struct gnat_binding_level *)(ggc_internal_vec_alloc_stat (sizeof (struct gnat_binding_level), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gnat_binding_level(n) ((struct gnat_binding_level *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gnat_binding_level), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_loop_info_va_gc_() ((vec<loop_info,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<loop_info,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_loop_info_va_gc_() ((vec<loop_info,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<loop_info,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_loop_info_va_gc_(n) ((vec<loop_info,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<loop_info,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_loop_info_va_gc_(n) ((vec<loop_info,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<loop_info,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_loop_info_d() ((struct loop_info_d *)(ggc_internal_alloc_stat (sizeof (struct loop_info_d) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_loop_info_d() ((struct loop_info_d *)(ggc_internal_cleared_alloc_stat (sizeof (struct loop_info_d) MEM_STAT_INFO)))
-#define ggc_alloc_vec_loop_info_d(n) ((struct loop_info_d *)(ggc_internal_vec_alloc_stat (sizeof (struct loop_info_d), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_loop_info_d(n) ((struct loop_info_d *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct loop_info_d), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_range_check_info_va_gc_() ((vec<range_check_info,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<range_check_info,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_range_check_info_va_gc_() ((vec<range_check_info,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<range_check_info,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_range_check_info_va_gc_(n) ((vec<range_check_info,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<range_check_info,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_range_check_info_va_gc_(n) ((vec<range_check_info,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<range_check_info,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_range_check_info_d() ((struct range_check_info_d *)(ggc_internal_alloc_stat (sizeof (struct range_check_info_d) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_range_check_info_d() ((struct range_check_info_d *)(ggc_internal_cleared_alloc_stat (sizeof (struct range_check_info_d) MEM_STAT_INFO)))
-#define ggc_alloc_vec_range_check_info_d(n) ((struct range_check_info_d *)(ggc_internal_vec_alloc_stat (sizeof (struct range_check_info_d), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_range_check_info_d(n) ((struct range_check_info_d *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct range_check_info_d), n MEM_STAT_INFO)))
-#define ggc_alloc_elab_info() ((struct elab_info *)(ggc_internal_alloc_stat (sizeof (struct elab_info) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_elab_info() ((struct elab_info *)(ggc_internal_cleared_alloc_stat (sizeof (struct elab_info) MEM_STAT_INFO)))
-#define ggc_alloc_vec_elab_info(n) ((struct elab_info *)(ggc_internal_vec_alloc_stat (sizeof (struct elab_info), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_elab_info(n) ((struct elab_info *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct elab_info), n MEM_STAT_INFO)))
-#define ggc_alloc_stmt_group() ((struct stmt_group *)(ggc_internal_alloc_stat (sizeof (struct stmt_group) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_stmt_group() ((struct stmt_group *)(ggc_internal_cleared_alloc_stat (sizeof (struct stmt_group) MEM_STAT_INFO)))
-#define ggc_alloc_vec_stmt_group(n) ((struct stmt_group *)(ggc_internal_vec_alloc_stat (sizeof (struct stmt_group), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_stmt_group(n) ((struct stmt_group *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct stmt_group), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_parm_attr_va_gc_() ((vec<parm_attr,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<parm_attr,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_parm_attr_va_gc_() ((vec<parm_attr,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<parm_attr,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_parm_attr_va_gc_(n) ((vec<parm_attr,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<parm_attr,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_parm_attr_va_gc_(n) ((vec<parm_attr,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<parm_attr,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_parm_attr_d() ((struct parm_attr_d *)(ggc_internal_alloc_stat (sizeof (struct parm_attr_d) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_parm_attr_d() ((struct parm_attr_d *)(ggc_internal_cleared_alloc_stat (sizeof (struct parm_attr_d) MEM_STAT_INFO)))
-#define ggc_alloc_vec_parm_attr_d(n) ((struct parm_attr_d *)(ggc_internal_vec_alloc_stat (sizeof (struct parm_attr_d), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_parm_attr_d(n) ((struct parm_attr_d *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct parm_attr_d), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_odr_type_va_gc_() ((vec<odr_type,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<odr_type,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_odr_type_va_gc_() ((vec<odr_type,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<odr_type,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_odr_type_va_gc_(n) ((vec<odr_type,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<odr_type,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_odr_type_va_gc_(n) ((vec<odr_type,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<odr_type,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_type_map() ((struct tree_type_map *)(ggc_internal_alloc_stat (sizeof (struct tree_type_map) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_type_map() ((struct tree_type_map *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_type_map) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_type_map(n) ((struct tree_type_map *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_type_map), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_type_map(n) ((struct tree_type_map *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_type_map), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_inline_summary_t_va_gc_() ((vec<inline_summary_t,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<inline_summary_t,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_inline_summary_t_va_gc_() ((vec<inline_summary_t,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<inline_summary_t,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_inline_summary_t_va_gc_(n) ((vec<inline_summary_t,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<inline_summary_t,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_inline_summary_t_va_gc_(n) ((vec<inline_summary_t,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<inline_summary_t,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_size_time_entry_va_gc_() ((vec<size_time_entry,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<size_time_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_size_time_entry_va_gc_() ((vec<size_time_entry,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<size_time_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_size_time_entry_va_gc_(n) ((vec<size_time_entry,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<size_time_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_size_time_entry_va_gc_(n) ((vec<size_time_entry,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<size_time_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_size_time_entry() ((struct size_time_entry *)(ggc_internal_alloc_stat (sizeof (struct size_time_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_size_time_entry() ((struct size_time_entry *)(ggc_internal_cleared_alloc_stat (sizeof (struct size_time_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_size_time_entry(n) ((struct size_time_entry *)(ggc_internal_vec_alloc_stat (sizeof (struct size_time_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_size_time_entry(n) ((struct size_time_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct size_time_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_predicate() ((struct predicate *)(ggc_internal_alloc_stat (sizeof (struct predicate) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_predicate() ((struct predicate *)(ggc_internal_cleared_alloc_stat (sizeof (struct predicate) MEM_STAT_INFO)))
-#define ggc_alloc_vec_predicate(n) ((struct predicate *)(ggc_internal_vec_alloc_stat (sizeof (struct predicate), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_predicate(n) ((struct predicate *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct predicate), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_condition_va_gc_() ((vec<condition,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<condition,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_condition_va_gc_() ((vec<condition,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<condition,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_condition_va_gc_(n) ((vec<condition,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<condition,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_condition_va_gc_(n) ((vec<condition,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<condition,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_condition() ((struct condition *)(ggc_internal_alloc_stat (sizeof (struct condition) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_condition() ((struct condition *)(ggc_internal_cleared_alloc_stat (sizeof (struct condition) MEM_STAT_INFO)))
-#define ggc_alloc_vec_condition(n) ((struct condition *)(ggc_internal_vec_alloc_stat (sizeof (struct condition), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_condition(n) ((struct condition *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct condition), n MEM_STAT_INFO)))
-#define ggc_alloc_lto_tree_ref_table() ((struct lto_tree_ref_table *)(ggc_internal_alloc_stat (sizeof (struct lto_tree_ref_table) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lto_tree_ref_table() ((struct lto_tree_ref_table *)(ggc_internal_cleared_alloc_stat (sizeof (struct lto_tree_ref_table) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lto_tree_ref_table(n) ((struct lto_tree_ref_table *)(ggc_internal_vec_alloc_stat (sizeof (struct lto_tree_ref_table), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lto_tree_ref_table(n) ((struct lto_tree_ref_table *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct lto_tree_ref_table), n MEM_STAT_INFO)))
-#define ggc_alloc_lto_in_decl_state() ((struct lto_in_decl_state *)(ggc_internal_alloc_stat (sizeof (struct lto_in_decl_state) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lto_in_decl_state() ((struct lto_in_decl_state *)(ggc_internal_cleared_alloc_stat (sizeof (struct lto_in_decl_state) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lto_in_decl_state(n) ((struct lto_in_decl_state *)(ggc_internal_vec_alloc_stat (sizeof (struct lto_in_decl_state), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lto_in_decl_state(n) ((struct lto_in_decl_state *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct lto_in_decl_state), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_edge_args_va_gc_() ((vec<ipa_edge_args,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<ipa_edge_args,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_edge_args_va_gc_() ((vec<ipa_edge_args,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<ipa_edge_args,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_ipa_edge_args_va_gc_(n) ((vec<ipa_edge_args,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<ipa_edge_args,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_ipa_edge_args_va_gc_(n) ((vec<ipa_edge_args,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<ipa_edge_args,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_agg_replacement_value_p_va_gc_() ((vec<ipa_agg_replacement_value_p,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<ipa_agg_replacement_value_p,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_agg_replacement_value_p_va_gc_() ((vec<ipa_agg_replacement_value_p,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<ipa_agg_replacement_value_p,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_ipa_agg_replacement_value_p_va_gc_(n) ((vec<ipa_agg_replacement_value_p,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<ipa_agg_replacement_value_p,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_ipa_agg_replacement_value_p_va_gc_(n) ((vec<ipa_agg_replacement_value_p,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<ipa_agg_replacement_value_p,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_jump_func_va_gc_() ((vec<ipa_jump_func,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<ipa_jump_func,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_jump_func_va_gc_() ((vec<ipa_jump_func,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<ipa_jump_func,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_ipa_jump_func_va_gc_(n) ((vec<ipa_jump_func,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<ipa_jump_func,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_ipa_jump_func_va_gc_(n) ((vec<ipa_jump_func,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<ipa_jump_func,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_jump_func_value() ((union jump_func_value *)(ggc_internal_alloc_stat (sizeof (union jump_func_value) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_jump_func_value() ((union jump_func_value *)(ggc_internal_cleared_alloc_stat (sizeof (union jump_func_value) MEM_STAT_INFO)))
-#define ggc_alloc_vec_jump_func_value(n) ((union jump_func_value *)(ggc_internal_vec_alloc_stat (sizeof (union jump_func_value), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_jump_func_value(n) ((union jump_func_value *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union jump_func_value), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_agg_jf_item_va_gc_() ((vec<ipa_agg_jf_item,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<ipa_agg_jf_item,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_agg_jf_item_va_gc_() ((vec<ipa_agg_jf_item,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<ipa_agg_jf_item,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_ipa_agg_jf_item_va_gc_(n) ((vec<ipa_agg_jf_item,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<ipa_agg_jf_item,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_ipa_agg_jf_item_va_gc_(n) ((vec<ipa_agg_jf_item,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<ipa_agg_jf_item,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_ipa_ancestor_jf_data() ((struct ipa_ancestor_jf_data *)(ggc_internal_alloc_stat (sizeof (struct ipa_ancestor_jf_data) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ipa_ancestor_jf_data() ((struct ipa_ancestor_jf_data *)(ggc_internal_cleared_alloc_stat (sizeof (struct ipa_ancestor_jf_data) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_ancestor_jf_data(n) ((struct ipa_ancestor_jf_data *)(ggc_internal_vec_alloc_stat (sizeof (struct ipa_ancestor_jf_data), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_ancestor_jf_data(n) ((struct ipa_ancestor_jf_data *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct ipa_ancestor_jf_data), n MEM_STAT_INFO)))
-#define ggc_alloc_ipa_pass_through_data() ((struct ipa_pass_through_data *)(ggc_internal_alloc_stat (sizeof (struct ipa_pass_through_data) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ipa_pass_through_data() ((struct ipa_pass_through_data *)(ggc_internal_cleared_alloc_stat (sizeof (struct ipa_pass_through_data) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_pass_through_data(n) ((struct ipa_pass_through_data *)(ggc_internal_vec_alloc_stat (sizeof (struct ipa_pass_through_data), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_pass_through_data(n) ((struct ipa_pass_through_data *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct ipa_pass_through_data), n MEM_STAT_INFO)))
-#define ggc_alloc_ipa_constant_data() ((struct ipa_constant_data *)(ggc_internal_alloc_stat (sizeof (struct ipa_constant_data) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ipa_constant_data() ((struct ipa_constant_data *)(ggc_internal_cleared_alloc_stat (sizeof (struct ipa_constant_data) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_constant_data(n) ((struct ipa_constant_data *)(ggc_internal_vec_alloc_stat (sizeof (struct ipa_constant_data), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_constant_data(n) ((struct ipa_constant_data *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct ipa_constant_data), n MEM_STAT_INFO)))
-#define ggc_alloc_ipa_known_type_data() ((struct ipa_known_type_data *)(ggc_internal_alloc_stat (sizeof (struct ipa_known_type_data) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ipa_known_type_data() ((struct ipa_known_type_data *)(ggc_internal_cleared_alloc_stat (sizeof (struct ipa_known_type_data) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_known_type_data(n) ((struct ipa_known_type_data *)(ggc_internal_vec_alloc_stat (sizeof (struct ipa_known_type_data), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_known_type_data(n) ((struct ipa_known_type_data *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct ipa_known_type_data), n MEM_STAT_INFO)))
-#define ggc_alloc_ssa_operand_memory_d(SIZE) ((struct ssa_operand_memory_d *)(ggc_internal_alloc_stat (SIZE MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ssa_operand_memory_d(SIZE) ((struct ssa_operand_memory_d *)(ggc_internal_cleared_alloc_stat (SIZE MEM_STAT_INFO)))
-#define ggc_alloc_vec_ssa_operand_memory_d(SIZE, n) ((struct ssa_operand_memory_d *)(ggc_internal_vec_alloc_stat (SIZE, n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ssa_operand_memory_d(SIZE, n) ((struct ssa_operand_memory_d *)(ggc_internal_cleared_vec_alloc_stat (SIZE, n MEM_STAT_INFO)))
-#define ggc_alloc_scev_info_str() ((struct scev_info_str *)(ggc_internal_alloc_stat (sizeof (struct scev_info_str) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_scev_info_str() ((struct scev_info_str *)(ggc_internal_cleared_alloc_stat (sizeof (struct scev_info_str) MEM_STAT_INFO)))
-#define ggc_alloc_vec_scev_info_str(n) ((struct scev_info_str *)(ggc_internal_vec_alloc_stat (sizeof (struct scev_info_str), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_scev_info_str(n) ((struct scev_info_str *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct scev_info_str), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_mem_addr_template_va_gc_() ((vec<mem_addr_template,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<mem_addr_template,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_mem_addr_template_va_gc_() ((vec<mem_addr_template,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<mem_addr_template,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_mem_addr_template_va_gc_(n) ((vec<mem_addr_template,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<mem_addr_template,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_mem_addr_template_va_gc_(n) ((vec<mem_addr_template,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<mem_addr_template,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_mem_addr_template() ((struct mem_addr_template *)(ggc_internal_alloc_stat (sizeof (struct mem_addr_template) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_mem_addr_template() ((struct mem_addr_template *)(ggc_internal_cleared_alloc_stat (sizeof (struct mem_addr_template) MEM_STAT_INFO)))
-#define ggc_alloc_vec_mem_addr_template(n) ((struct mem_addr_template *)(ggc_internal_vec_alloc_stat (sizeof (struct mem_addr_template), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_mem_addr_template(n) ((struct mem_addr_template *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct mem_addr_template), n MEM_STAT_INFO)))
-#define ggc_alloc_ssa_operands() ((struct ssa_operands *)(ggc_internal_alloc_stat (sizeof (struct ssa_operands) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ssa_operands() ((struct ssa_operands *)(ggc_internal_cleared_alloc_stat (sizeof (struct ssa_operands) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ssa_operands(n) ((struct ssa_operands *)(ggc_internal_vec_alloc_stat (sizeof (struct ssa_operands), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ssa_operands(n) ((struct ssa_operands *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct ssa_operands), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_va_gc_() ((vec<gimple,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<gimple,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_va_gc_() ((vec<gimple,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<gimple,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_gimple_va_gc_(n) ((vec<gimple,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<gimple,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_gimple_va_gc_(n) ((vec<gimple,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<gimple,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_tm_restart_node() ((struct tm_restart_node *)(ggc_internal_alloc_stat (sizeof (struct tm_restart_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tm_restart_node() ((struct tm_restart_node *)(ggc_internal_cleared_alloc_stat (sizeof (struct tm_restart_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tm_restart_node(n) ((struct tm_restart_node *)(ggc_internal_vec_alloc_stat (sizeof (struct tm_restart_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tm_restart_node(n) ((struct tm_restart_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tm_restart_node), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_transaction() ((struct gimple_statement_transaction *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_transaction) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_transaction() ((struct gimple_statement_transaction *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_transaction) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_transaction(n) ((struct gimple_statement_transaction *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_transaction), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_transaction(n) ((struct gimple_statement_transaction *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_transaction), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_omp_return() ((struct gimple_statement_omp_return *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_omp_return) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_omp_return() ((struct gimple_statement_omp_return *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_omp_return) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_omp_return(n) ((struct gimple_statement_omp_return *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_omp_return), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_omp_return(n) ((struct gimple_statement_omp_return *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_omp_return), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_omp_atomic_store() ((struct gimple_statement_omp_atomic_store *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_omp_atomic_store) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_omp_atomic_store() ((struct gimple_statement_omp_atomic_store *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_omp_atomic_store) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_omp_atomic_store(n) ((struct gimple_statement_omp_atomic_store *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_omp_atomic_store), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_omp_atomic_store(n) ((struct gimple_statement_omp_atomic_store *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_omp_atomic_store), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_omp_atomic_store_layout() ((struct gimple_statement_omp_atomic_store_layout *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_omp_atomic_store_layout) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_omp_atomic_store_layout() ((struct gimple_statement_omp_atomic_store_layout *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_omp_atomic_store_layout) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_omp_atomic_store_layout(n) ((struct gimple_statement_omp_atomic_store_layout *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_omp_atomic_store_layout), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_omp_atomic_store_layout(n) ((struct gimple_statement_omp_atomic_store_layout *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_omp_atomic_store_layout), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_omp_atomic_load() ((struct gimple_statement_omp_atomic_load *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_omp_atomic_load) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_omp_atomic_load() ((struct gimple_statement_omp_atomic_load *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_omp_atomic_load) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_omp_atomic_load(n) ((struct gimple_statement_omp_atomic_load *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_omp_atomic_load), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_omp_atomic_load(n) ((struct gimple_statement_omp_atomic_load *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_omp_atomic_load), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_omp_teams() ((struct gimple_statement_omp_teams *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_omp_teams) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_omp_teams() ((struct gimple_statement_omp_teams *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_omp_teams) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_omp_teams(n) ((struct gimple_statement_omp_teams *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_omp_teams), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_omp_teams(n) ((struct gimple_statement_omp_teams *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_omp_teams), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_omp_single() ((struct gimple_statement_omp_single *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_omp_single) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_omp_single() ((struct gimple_statement_omp_single *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_omp_single) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_omp_single(n) ((struct gimple_statement_omp_single *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_omp_single), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_omp_single(n) ((struct gimple_statement_omp_single *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_omp_single), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_omp_single_layout() ((struct gimple_statement_omp_single_layout *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_omp_single_layout) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_omp_single_layout() ((struct gimple_statement_omp_single_layout *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_omp_single_layout) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_omp_single_layout(n) ((struct gimple_statement_omp_single_layout *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_omp_single_layout), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_omp_single_layout(n) ((struct gimple_statement_omp_single_layout *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_omp_single_layout), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_omp_continue() ((struct gimple_statement_omp_continue *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_omp_continue) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_omp_continue() ((struct gimple_statement_omp_continue *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_omp_continue) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_omp_continue(n) ((struct gimple_statement_omp_continue *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_omp_continue), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_omp_continue(n) ((struct gimple_statement_omp_continue *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_omp_continue), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_omp_sections() ((struct gimple_statement_omp_sections *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_omp_sections) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_omp_sections() ((struct gimple_statement_omp_sections *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_omp_sections) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_omp_sections(n) ((struct gimple_statement_omp_sections *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_omp_sections), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_omp_sections(n) ((struct gimple_statement_omp_sections *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_omp_sections), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_omp_task() ((struct gimple_statement_omp_task *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_omp_task) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_omp_task() ((struct gimple_statement_omp_task *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_omp_task) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_omp_task(n) ((struct gimple_statement_omp_task *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_omp_task), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_omp_task(n) ((struct gimple_statement_omp_task *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_omp_task), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_omp_target() ((struct gimple_statement_omp_target *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_omp_target) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_omp_target() ((struct gimple_statement_omp_target *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_omp_target) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_omp_target(n) ((struct gimple_statement_omp_target *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_omp_target), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_omp_target(n) ((struct gimple_statement_omp_target *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_omp_target), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_omp_parallel() ((struct gimple_statement_omp_parallel *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_omp_parallel) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_omp_parallel() ((struct gimple_statement_omp_parallel *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_omp_parallel) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_omp_parallel(n) ((struct gimple_statement_omp_parallel *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_omp_parallel), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_omp_parallel(n) ((struct gimple_statement_omp_parallel *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_omp_parallel), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_omp_taskreg() ((struct gimple_statement_omp_taskreg *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_omp_taskreg) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_omp_taskreg() ((struct gimple_statement_omp_taskreg *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_omp_taskreg) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_omp_taskreg(n) ((struct gimple_statement_omp_taskreg *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_omp_taskreg), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_omp_taskreg(n) ((struct gimple_statement_omp_taskreg *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_omp_taskreg), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_omp_parallel_layout() ((struct gimple_statement_omp_parallel_layout *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_omp_parallel_layout) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_omp_parallel_layout() ((struct gimple_statement_omp_parallel_layout *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_omp_parallel_layout) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_omp_parallel_layout(n) ((struct gimple_statement_omp_parallel_layout *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_omp_parallel_layout), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_omp_parallel_layout(n) ((struct gimple_statement_omp_parallel_layout *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_omp_parallel_layout), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_omp_for() ((struct gimple_statement_omp_for *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_omp_for) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_omp_for() ((struct gimple_statement_omp_for *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_omp_for) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_omp_for(n) ((struct gimple_statement_omp_for *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_omp_for), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_omp_for(n) ((struct gimple_statement_omp_for *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_omp_for), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_omp_for_iter() ((struct gimple_omp_for_iter *)(ggc_internal_alloc_stat (sizeof (struct gimple_omp_for_iter) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_omp_for_iter() ((struct gimple_omp_for_iter *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_omp_for_iter) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_omp_for_iter(n) ((struct gimple_omp_for_iter *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_omp_for_iter), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_omp_for_iter(n) ((struct gimple_omp_for_iter *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_omp_for_iter), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_omp_critical() ((struct gimple_statement_omp_critical *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_omp_critical) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_omp_critical() ((struct gimple_statement_omp_critical *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_omp_critical) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_omp_critical(n) ((struct gimple_statement_omp_critical *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_omp_critical), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_omp_critical(n) ((struct gimple_statement_omp_critical *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_omp_critical), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_asm() ((struct gimple_statement_asm *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_asm) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_asm() ((struct gimple_statement_asm *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_asm) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_asm(n) ((struct gimple_statement_asm *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_asm), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_asm(n) ((struct gimple_statement_asm *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_asm), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_wce() ((struct gimple_statement_wce *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_wce) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_wce() ((struct gimple_statement_wce *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_wce) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_wce(n) ((struct gimple_statement_wce *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_wce), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_wce(n) ((struct gimple_statement_wce *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_wce), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_try() ((struct gimple_statement_try *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_try) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_try() ((struct gimple_statement_try *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_try) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_try(n) ((struct gimple_statement_try *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_try), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_try(n) ((struct gimple_statement_try *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_try), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_eh_dispatch() ((struct gimple_statement_eh_dispatch *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_eh_dispatch) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_eh_dispatch() ((struct gimple_statement_eh_dispatch *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_eh_dispatch) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_eh_dispatch(n) ((struct gimple_statement_eh_dispatch *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_eh_dispatch), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_eh_dispatch(n) ((struct gimple_statement_eh_dispatch *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_eh_dispatch), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_resx() ((struct gimple_statement_resx *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_resx) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_resx() ((struct gimple_statement_resx *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_resx) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_resx(n) ((struct gimple_statement_resx *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_resx), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_resx(n) ((struct gimple_statement_resx *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_resx), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_eh_ctrl() ((struct gimple_statement_eh_ctrl *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_eh_ctrl) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_eh_ctrl() ((struct gimple_statement_eh_ctrl *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_eh_ctrl) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_eh_ctrl(n) ((struct gimple_statement_eh_ctrl *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_eh_ctrl), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_eh_ctrl(n) ((struct gimple_statement_eh_ctrl *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_eh_ctrl), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_phi() ((struct gimple_statement_phi *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_phi) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_phi() ((struct gimple_statement_phi *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_phi) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_phi(n) ((struct gimple_statement_phi *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_phi), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_phi(n) ((struct gimple_statement_phi *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_phi), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_eh_mnt() ((struct gimple_statement_eh_mnt *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_eh_mnt) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_eh_mnt() ((struct gimple_statement_eh_mnt *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_eh_mnt) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_eh_mnt(n) ((struct gimple_statement_eh_mnt *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_eh_mnt), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_eh_mnt(n) ((struct gimple_statement_eh_mnt *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_eh_mnt), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_eh_else() ((struct gimple_statement_eh_else *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_eh_else) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_eh_else() ((struct gimple_statement_eh_else *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_eh_else) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_eh_else(n) ((struct gimple_statement_eh_else *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_eh_else), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_eh_else(n) ((struct gimple_statement_eh_else *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_eh_else), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_eh_filter() ((struct gimple_statement_eh_filter *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_eh_filter) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_eh_filter() ((struct gimple_statement_eh_filter *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_eh_filter) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_eh_filter(n) ((struct gimple_statement_eh_filter *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_eh_filter), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_eh_filter(n) ((struct gimple_statement_eh_filter *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_eh_filter), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_catch() ((struct gimple_statement_catch *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_catch) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_catch() ((struct gimple_statement_catch *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_catch) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_catch(n) ((struct gimple_statement_catch *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_catch), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_catch(n) ((struct gimple_statement_catch *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_catch), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_bind() ((struct gimple_statement_bind *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_bind) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_bind() ((struct gimple_statement_bind *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_bind) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_bind(n) ((struct gimple_statement_bind *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_bind), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_bind(n) ((struct gimple_statement_bind *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_bind), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_omp() ((struct gimple_statement_omp *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_omp) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_omp() ((struct gimple_statement_omp *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_omp) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_omp(n) ((struct gimple_statement_omp *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_omp), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_omp(n) ((struct gimple_statement_omp *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_omp), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_call() ((struct gimple_statement_call *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_call) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_call() ((struct gimple_statement_call *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_call) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_call(n) ((struct gimple_statement_call *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_call), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_call(n) ((struct gimple_statement_call *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_call), n MEM_STAT_INFO)))
-#define ggc_alloc_pt_solution() ((struct pt_solution *)(ggc_internal_alloc_stat (sizeof (struct pt_solution) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_pt_solution() ((struct pt_solution *)(ggc_internal_cleared_alloc_stat (sizeof (struct pt_solution) MEM_STAT_INFO)))
-#define ggc_alloc_vec_pt_solution(n) ((struct pt_solution *)(ggc_internal_vec_alloc_stat (sizeof (struct pt_solution), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_pt_solution(n) ((struct pt_solution *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct pt_solution), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_with_memory_ops() ((struct gimple_statement_with_memory_ops *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_with_memory_ops) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_with_memory_ops() ((struct gimple_statement_with_memory_ops *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_with_memory_ops) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_with_memory_ops(n) ((struct gimple_statement_with_memory_ops *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_with_memory_ops), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_with_memory_ops(n) ((struct gimple_statement_with_memory_ops *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_with_memory_ops), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_with_memory_ops_base() ((struct gimple_statement_with_memory_ops_base *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_with_memory_ops_base) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_with_memory_ops_base() ((struct gimple_statement_with_memory_ops_base *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_with_memory_ops_base) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_with_memory_ops_base(n) ((struct gimple_statement_with_memory_ops_base *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_with_memory_ops_base), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_with_memory_ops_base(n) ((struct gimple_statement_with_memory_ops_base *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_with_memory_ops_base), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_with_ops() ((struct gimple_statement_with_ops *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_with_ops) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_with_ops() ((struct gimple_statement_with_ops *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_with_ops) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_with_ops(n) ((struct gimple_statement_with_ops *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_with_ops), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_with_ops(n) ((struct gimple_statement_with_ops *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_with_ops), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_with_ops_base() ((struct gimple_statement_with_ops_base *)(ggc_internal_alloc_stat (sizeof (struct gimple_statement_with_ops_base) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_with_ops_base() ((struct gimple_statement_with_ops_base *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_statement_with_ops_base) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_with_ops_base(n) ((struct gimple_statement_with_ops_base *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_statement_with_ops_base), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_with_ops_base(n) ((struct gimple_statement_with_ops_base *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_statement_with_ops_base), n MEM_STAT_INFO)))
-#define ggc_alloc_type_hash() ((struct type_hash *)(ggc_internal_alloc_stat (sizeof (struct type_hash) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_type_hash() ((struct type_hash *)(ggc_internal_cleared_alloc_stat (sizeof (struct type_hash) MEM_STAT_INFO)))
-#define ggc_alloc_vec_type_hash(n) ((struct type_hash *)(ggc_internal_vec_alloc_stat (sizeof (struct type_hash), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_type_hash(n) ((struct type_hash *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct type_hash), n MEM_STAT_INFO)))
-#define ggc_alloc_string_pool_data() ((struct string_pool_data *)(ggc_internal_alloc_stat (sizeof (struct string_pool_data) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_string_pool_data() ((struct string_pool_data *)(ggc_internal_cleared_alloc_stat (sizeof (struct string_pool_data) MEM_STAT_INFO)))
-#define ggc_alloc_vec_string_pool_data(n) ((struct string_pool_data *)(ggc_internal_vec_alloc_stat (sizeof (struct string_pool_data), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_string_pool_data(n) ((struct string_pool_data *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct string_pool_data), n MEM_STAT_INFO)))
-#define ggc_alloc_initial_value_pair() ((struct initial_value_pair *)(ggc_internal_alloc_stat (sizeof (struct initial_value_pair) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_initial_value_pair() ((struct initial_value_pair *)(ggc_internal_cleared_alloc_stat (sizeof (struct initial_value_pair) MEM_STAT_INFO)))
-#define ggc_alloc_vec_initial_value_pair(n) ((struct initial_value_pair *)(ggc_internal_vec_alloc_stat (sizeof (struct initial_value_pair), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_initial_value_pair(n) ((struct initial_value_pair *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct initial_value_pair), n MEM_STAT_INFO)))
-#define ggc_alloc_temp_slot_address_entry() ((struct temp_slot_address_entry *)(ggc_internal_alloc_stat (sizeof (struct temp_slot_address_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_temp_slot_address_entry() ((struct temp_slot_address_entry *)(ggc_internal_cleared_alloc_stat (sizeof (struct temp_slot_address_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_temp_slot_address_entry(n) ((struct temp_slot_address_entry *)(ggc_internal_vec_alloc_stat (sizeof (struct temp_slot_address_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_temp_slot_address_entry(n) ((struct temp_slot_address_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct temp_slot_address_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_eh_status_u() ((union eh_status_u *)(ggc_internal_alloc_stat (sizeof (union eh_status_u) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_eh_status_u() ((union eh_status_u *)(ggc_internal_cleared_alloc_stat (sizeof (union eh_status_u) MEM_STAT_INFO)))
-#define ggc_alloc_vec_eh_status_u(n) ((union eh_status_u *)(ggc_internal_vec_alloc_stat (sizeof (union eh_status_u), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_eh_status_u(n) ((union eh_status_u *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union eh_status_u), n MEM_STAT_INFO)))
-#define ggc_alloc_throw_stmt_node() ((struct throw_stmt_node *)(ggc_internal_alloc_stat (sizeof (struct throw_stmt_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_throw_stmt_node() ((struct throw_stmt_node *)(ggc_internal_cleared_alloc_stat (sizeof (struct throw_stmt_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_throw_stmt_node(n) ((struct throw_stmt_node *)(ggc_internal_vec_alloc_stat (sizeof (struct throw_stmt_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_throw_stmt_node(n) ((struct throw_stmt_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct throw_stmt_node), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_eh_landing_pad_va_gc_() ((vec<eh_landing_pad,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<eh_landing_pad,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_eh_landing_pad_va_gc_() ((vec<eh_landing_pad,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<eh_landing_pad,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_eh_landing_pad_va_gc_(n) ((vec<eh_landing_pad,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<eh_landing_pad,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_eh_landing_pad_va_gc_(n) ((vec<eh_landing_pad,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<eh_landing_pad,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_eh_region_va_gc_() ((vec<eh_region,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<eh_region,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_eh_region_va_gc_() ((vec<eh_region,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<eh_region,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_eh_region_va_gc_(n) ((vec<eh_region,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<eh_region,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_eh_region_va_gc_(n) ((vec<eh_region,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<eh_region,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_eh_region_u() ((union eh_region_u *)(ggc_internal_alloc_stat (sizeof (union eh_region_u) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_eh_region_u() ((union eh_region_u *)(ggc_internal_cleared_alloc_stat (sizeof (union eh_region_u) MEM_STAT_INFO)))
-#define ggc_alloc_vec_eh_region_u(n) ((union eh_region_u *)(ggc_internal_vec_alloc_stat (sizeof (union eh_region_u), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_eh_region_u(n) ((union eh_region_u *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union eh_region_u), n MEM_STAT_INFO)))
-#define ggc_alloc_eh_region_u_must_not_throw() ((struct eh_region_u_must_not_throw *)(ggc_internal_alloc_stat (sizeof (struct eh_region_u_must_not_throw) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_eh_region_u_must_not_throw() ((struct eh_region_u_must_not_throw *)(ggc_internal_cleared_alloc_stat (sizeof (struct eh_region_u_must_not_throw) MEM_STAT_INFO)))
-#define ggc_alloc_vec_eh_region_u_must_not_throw(n) ((struct eh_region_u_must_not_throw *)(ggc_internal_vec_alloc_stat (sizeof (struct eh_region_u_must_not_throw), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_eh_region_u_must_not_throw(n) ((struct eh_region_u_must_not_throw *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct eh_region_u_must_not_throw), n MEM_STAT_INFO)))
-#define ggc_alloc_eh_region_u_allowed() ((struct eh_region_u_allowed *)(ggc_internal_alloc_stat (sizeof (struct eh_region_u_allowed) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_eh_region_u_allowed() ((struct eh_region_u_allowed *)(ggc_internal_cleared_alloc_stat (sizeof (struct eh_region_u_allowed) MEM_STAT_INFO)))
-#define ggc_alloc_vec_eh_region_u_allowed(n) ((struct eh_region_u_allowed *)(ggc_internal_vec_alloc_stat (sizeof (struct eh_region_u_allowed), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_eh_region_u_allowed(n) ((struct eh_region_u_allowed *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct eh_region_u_allowed), n MEM_STAT_INFO)))
-#define ggc_alloc_eh_region_u_try() ((struct eh_region_u_try *)(ggc_internal_alloc_stat (sizeof (struct eh_region_u_try) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_eh_region_u_try() ((struct eh_region_u_try *)(ggc_internal_cleared_alloc_stat (sizeof (struct eh_region_u_try) MEM_STAT_INFO)))
-#define ggc_alloc_vec_eh_region_u_try(n) ((struct eh_region_u_try *)(ggc_internal_vec_alloc_stat (sizeof (struct eh_region_u_try), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_eh_region_u_try(n) ((struct eh_region_u_try *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct eh_region_u_try), n MEM_STAT_INFO)))
-#define ggc_alloc_eh_catch_d() ((struct eh_catch_d *)(ggc_internal_alloc_stat (sizeof (struct eh_catch_d) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_eh_catch_d() ((struct eh_catch_d *)(ggc_internal_cleared_alloc_stat (sizeof (struct eh_catch_d) MEM_STAT_INFO)))
-#define ggc_alloc_vec_eh_catch_d(n) ((struct eh_catch_d *)(ggc_internal_vec_alloc_stat (sizeof (struct eh_catch_d), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_eh_catch_d(n) ((struct eh_catch_d *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct eh_catch_d), n MEM_STAT_INFO)))
-#define ggc_alloc_eh_landing_pad_d() ((struct eh_landing_pad_d *)(ggc_internal_alloc_stat (sizeof (struct eh_landing_pad_d) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_eh_landing_pad_d() ((struct eh_landing_pad_d *)(ggc_internal_cleared_alloc_stat (sizeof (struct eh_landing_pad_d) MEM_STAT_INFO)))
-#define ggc_alloc_vec_eh_landing_pad_d(n) ((struct eh_landing_pad_d *)(ggc_internal_vec_alloc_stat (sizeof (struct eh_landing_pad_d), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_eh_landing_pad_d(n) ((struct eh_landing_pad_d *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct eh_landing_pad_d), n MEM_STAT_INFO)))
-#define ggc_alloc_pointer_map_t() ((struct pointer_map_t *)(ggc_internal_alloc_stat (sizeof (struct pointer_map_t) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_pointer_map_t() ((struct pointer_map_t *)(ggc_internal_cleared_alloc_stat (sizeof (struct pointer_map_t) MEM_STAT_INFO)))
-#define ggc_alloc_vec_pointer_map_t(n) ((struct pointer_map_t *)(ggc_internal_vec_alloc_stat (sizeof (struct pointer_map_t), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_pointer_map_t(n) ((struct pointer_map_t *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct pointer_map_t), n MEM_STAT_INFO)))
-#define ggc_alloc_eh_region_d() ((struct eh_region_d *)(ggc_internal_alloc_stat (sizeof (struct eh_region_d) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_eh_region_d() ((struct eh_region_d *)(ggc_internal_cleared_alloc_stat (sizeof (struct eh_region_d) MEM_STAT_INFO)))
-#define ggc_alloc_vec_eh_region_d(n) ((struct eh_region_d *)(ggc_internal_vec_alloc_stat (sizeof (struct eh_region_d), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_eh_region_d(n) ((struct eh_region_d *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct eh_region_d), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_die_arg_entry_va_gc_() ((vec<die_arg_entry,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<die_arg_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_die_arg_entry_va_gc_() ((vec<die_arg_entry,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<die_arg_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_die_arg_entry_va_gc_(n) ((vec<die_arg_entry,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<die_arg_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_die_arg_entry_va_gc_(n) ((vec<die_arg_entry,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<die_arg_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_macinfo_entry_va_gc_() ((vec<macinfo_entry,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<macinfo_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_macinfo_entry_va_gc_() ((vec<macinfo_entry,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<macinfo_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_macinfo_entry_va_gc_(n) ((vec<macinfo_entry,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<macinfo_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_macinfo_entry_va_gc_(n) ((vec<macinfo_entry,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<macinfo_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_pubname_entry_va_gc_() ((vec<pubname_entry,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<pubname_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_pubname_entry_va_gc_() ((vec<pubname_entry,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<pubname_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_pubname_entry_va_gc_(n) ((vec<pubname_entry,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<pubname_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_pubname_entry_va_gc_(n) ((vec<pubname_entry,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<pubname_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_line_info_table_p_va_gc_() ((vec<dw_line_info_table_p,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<dw_line_info_table_p,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_line_info_table_p_va_gc_() ((vec<dw_line_info_table_p,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<dw_line_info_table_p,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_dw_line_info_table_p_va_gc_(n) ((vec<dw_line_info_table_p,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<dw_line_info_table_p,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_dw_line_info_table_p_va_gc_(n) ((vec<dw_line_info_table_p,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<dw_line_info_table_p,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cached_dw_loc_list_def() ((struct cached_dw_loc_list_def *)(ggc_internal_alloc_stat (sizeof (struct cached_dw_loc_list_def) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cached_dw_loc_list_def() ((struct cached_dw_loc_list_def *)(ggc_internal_cleared_alloc_stat (sizeof (struct cached_dw_loc_list_def) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cached_dw_loc_list_def(n) ((struct cached_dw_loc_list_def *)(ggc_internal_vec_alloc_stat (sizeof (struct cached_dw_loc_list_def), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cached_dw_loc_list_def(n) ((struct cached_dw_loc_list_def *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cached_dw_loc_list_def), n MEM_STAT_INFO)))
-#define ggc_alloc_call_arg_loc_node() ((struct call_arg_loc_node *)(ggc_internal_alloc_stat (sizeof (struct call_arg_loc_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_call_arg_loc_node() ((struct call_arg_loc_node *)(ggc_internal_cleared_alloc_stat (sizeof (struct call_arg_loc_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_call_arg_loc_node(n) ((struct call_arg_loc_node *)(ggc_internal_vec_alloc_stat (sizeof (struct call_arg_loc_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_call_arg_loc_node(n) ((struct call_arg_loc_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct call_arg_loc_node), n MEM_STAT_INFO)))
-#define ggc_alloc_var_loc_list_def() ((struct var_loc_list_def *)(ggc_internal_alloc_stat (sizeof (struct var_loc_list_def) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_var_loc_list_def() ((struct var_loc_list_def *)(ggc_internal_cleared_alloc_stat (sizeof (struct var_loc_list_def) MEM_STAT_INFO)))
-#define ggc_alloc_vec_var_loc_list_def(n) ((struct var_loc_list_def *)(ggc_internal_vec_alloc_stat (sizeof (struct var_loc_list_def), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_var_loc_list_def(n) ((struct var_loc_list_def *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct var_loc_list_def), n MEM_STAT_INFO)))
-#define ggc_alloc_var_loc_node() ((struct var_loc_node *)(ggc_internal_alloc_stat (sizeof (struct var_loc_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_var_loc_node() ((struct var_loc_node *)(ggc_internal_cleared_alloc_stat (sizeof (struct var_loc_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_var_loc_node(n) ((struct var_loc_node *)(ggc_internal_vec_alloc_stat (sizeof (struct var_loc_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_var_loc_node(n) ((struct var_loc_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct var_loc_node), n MEM_STAT_INFO)))
-#define ggc_alloc_die_arg_entry_struct() ((struct die_arg_entry_struct *)(ggc_internal_alloc_stat (sizeof (struct die_arg_entry_struct) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_die_arg_entry_struct() ((struct die_arg_entry_struct *)(ggc_internal_cleared_alloc_stat (sizeof (struct die_arg_entry_struct) MEM_STAT_INFO)))
-#define ggc_alloc_vec_die_arg_entry_struct(n) ((struct die_arg_entry_struct *)(ggc_internal_vec_alloc_stat (sizeof (struct die_arg_entry_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_die_arg_entry_struct(n) ((struct die_arg_entry_struct *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct die_arg_entry_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_limbo_die_struct() ((struct limbo_die_struct *)(ggc_internal_alloc_stat (sizeof (struct limbo_die_struct) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_limbo_die_struct() ((struct limbo_die_struct *)(ggc_internal_cleared_alloc_stat (sizeof (struct limbo_die_struct) MEM_STAT_INFO)))
-#define ggc_alloc_vec_limbo_die_struct(n) ((struct limbo_die_struct *)(ggc_internal_vec_alloc_stat (sizeof (struct limbo_die_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_limbo_die_struct(n) ((struct limbo_die_struct *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct limbo_die_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_macinfo_struct() ((struct macinfo_struct *)(ggc_internal_alloc_stat (sizeof (struct macinfo_struct) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_macinfo_struct() ((struct macinfo_struct *)(ggc_internal_cleared_alloc_stat (sizeof (struct macinfo_struct) MEM_STAT_INFO)))
-#define ggc_alloc_vec_macinfo_struct(n) ((struct macinfo_struct *)(ggc_internal_vec_alloc_stat (sizeof (struct macinfo_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_macinfo_struct(n) ((struct macinfo_struct *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct macinfo_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_attr_node_va_gc_() ((vec<dw_attr_node,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<dw_attr_node,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_attr_node_va_gc_() ((vec<dw_attr_node,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<dw_attr_node,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_dw_attr_node_va_gc_(n) ((vec<dw_attr_node,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<dw_attr_node,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_dw_attr_node_va_gc_(n) ((vec<dw_attr_node,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<dw_attr_node,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_die_symbol_or_type_node() ((union die_symbol_or_type_node *)(ggc_internal_alloc_stat (sizeof (union die_symbol_or_type_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_die_symbol_or_type_node() ((union die_symbol_or_type_node *)(ggc_internal_cleared_alloc_stat (sizeof (union die_symbol_or_type_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_die_symbol_or_type_node(n) ((union die_symbol_or_type_node *)(ggc_internal_vec_alloc_stat (sizeof (union die_symbol_or_type_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_die_symbol_or_type_node(n) ((union die_symbol_or_type_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union die_symbol_or_type_node), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_line_info_table_struct() ((struct dw_line_info_table_struct *)(ggc_internal_alloc_stat (sizeof (struct dw_line_info_table_struct) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_line_info_table_struct() ((struct dw_line_info_table_struct *)(ggc_internal_cleared_alloc_stat (sizeof (struct dw_line_info_table_struct) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_line_info_table_struct(n) ((struct dw_line_info_table_struct *)(ggc_internal_vec_alloc_stat (sizeof (struct dw_line_info_table_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_line_info_table_struct(n) ((struct dw_line_info_table_struct *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct dw_line_info_table_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_line_info_entry_va_gc_() ((vec<dw_line_info_entry,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<dw_line_info_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_line_info_entry_va_gc_() ((vec<dw_line_info_entry,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<dw_line_info_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_dw_line_info_entry_va_gc_(n) ((vec<dw_line_info_entry,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<dw_line_info_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_dw_line_info_entry_va_gc_(n) ((vec<dw_line_info_entry,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<dw_line_info_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_comdat_type_struct() ((struct comdat_type_struct *)(ggc_internal_alloc_stat (sizeof (struct comdat_type_struct) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_comdat_type_struct() ((struct comdat_type_struct *)(ggc_internal_cleared_alloc_stat (sizeof (struct comdat_type_struct) MEM_STAT_INFO)))
-#define ggc_alloc_vec_comdat_type_struct(n) ((struct comdat_type_struct *)(ggc_internal_vec_alloc_stat (sizeof (struct comdat_type_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_comdat_type_struct(n) ((struct comdat_type_struct *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct comdat_type_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_ranges_by_label_struct() ((struct dw_ranges_by_label_struct *)(ggc_internal_alloc_stat (sizeof (struct dw_ranges_by_label_struct) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_ranges_by_label_struct() ((struct dw_ranges_by_label_struct *)(ggc_internal_cleared_alloc_stat (sizeof (struct dw_ranges_by_label_struct) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_ranges_by_label_struct(n) ((struct dw_ranges_by_label_struct *)(ggc_internal_vec_alloc_stat (sizeof (struct dw_ranges_by_label_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_ranges_by_label_struct(n) ((struct dw_ranges_by_label_struct *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct dw_ranges_by_label_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_ranges_struct() ((struct dw_ranges_struct *)(ggc_internal_alloc_stat (sizeof (struct dw_ranges_struct) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_ranges_struct() ((struct dw_ranges_struct *)(ggc_internal_cleared_alloc_stat (sizeof (struct dw_ranges_struct) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_ranges_struct(n) ((struct dw_ranges_struct *)(ggc_internal_vec_alloc_stat (sizeof (struct dw_ranges_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_ranges_struct(n) ((struct dw_ranges_struct *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct dw_ranges_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_pubname_struct() ((struct pubname_struct *)(ggc_internal_alloc_stat (sizeof (struct pubname_struct) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_pubname_struct() ((struct pubname_struct *)(ggc_internal_cleared_alloc_stat (sizeof (struct pubname_struct) MEM_STAT_INFO)))
-#define ggc_alloc_vec_pubname_struct(n) ((struct pubname_struct *)(ggc_internal_vec_alloc_stat (sizeof (struct pubname_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_pubname_struct(n) ((struct pubname_struct *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct pubname_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_line_info_struct() ((struct dw_line_info_struct *)(ggc_internal_alloc_stat (sizeof (struct dw_line_info_struct) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_line_info_struct() ((struct dw_line_info_struct *)(ggc_internal_cleared_alloc_stat (sizeof (struct dw_line_info_struct) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_line_info_struct(n) ((struct dw_line_info_struct *)(ggc_internal_vec_alloc_stat (sizeof (struct dw_line_info_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_line_info_struct(n) ((struct dw_line_info_struct *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct dw_line_info_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_attr_struct() ((struct dw_attr_struct *)(ggc_internal_alloc_stat (sizeof (struct dw_attr_struct) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_attr_struct() ((struct dw_attr_struct *)(ggc_internal_cleared_alloc_stat (sizeof (struct dw_attr_struct) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_attr_struct(n) ((struct dw_attr_struct *)(ggc_internal_vec_alloc_stat (sizeof (struct dw_attr_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_attr_struct(n) ((struct dw_attr_struct *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct dw_attr_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_addr_table_entry_struct_union() ((union addr_table_entry_struct_union *)(ggc_internal_alloc_stat (sizeof (union addr_table_entry_struct_union) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_addr_table_entry_struct_union() ((union addr_table_entry_struct_union *)(ggc_internal_cleared_alloc_stat (sizeof (union addr_table_entry_struct_union) MEM_STAT_INFO)))
-#define ggc_alloc_vec_addr_table_entry_struct_union(n) ((union addr_table_entry_struct_union *)(ggc_internal_vec_alloc_stat (sizeof (union addr_table_entry_struct_union), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_addr_table_entry_struct_union(n) ((union addr_table_entry_struct_union *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union addr_table_entry_struct_union), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_deferred_locations_va_gc_() ((vec<deferred_locations,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<deferred_locations,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_deferred_locations_va_gc_() ((vec<deferred_locations,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<deferred_locations,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_deferred_locations_va_gc_(n) ((vec<deferred_locations,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<deferred_locations,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_deferred_locations_va_gc_(n) ((vec<deferred_locations,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<deferred_locations,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_deferred_locations_struct() ((struct deferred_locations_struct *)(ggc_internal_alloc_stat (sizeof (struct deferred_locations_struct) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_deferred_locations_struct() ((struct deferred_locations_struct *)(ggc_internal_cleared_alloc_stat (sizeof (struct deferred_locations_struct) MEM_STAT_INFO)))
-#define ggc_alloc_vec_deferred_locations_struct(n) ((struct deferred_locations_struct *)(ggc_internal_vec_alloc_stat (sizeof (struct deferred_locations_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_deferred_locations_struct(n) ((struct deferred_locations_struct *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct deferred_locations_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_fde_ref_va_gc_() ((vec<dw_fde_ref,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<dw_fde_ref,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_fde_ref_va_gc_() ((vec<dw_fde_ref,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<dw_fde_ref,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_dw_fde_ref_va_gc_(n) ((vec<dw_fde_ref,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<dw_fde_ref,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_dw_fde_ref_va_gc_(n) ((vec<dw_fde_ref,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<dw_fde_ref,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_reg_saved_in_data_struct() ((struct reg_saved_in_data_struct *)(ggc_internal_alloc_stat (sizeof (struct reg_saved_in_data_struct) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_reg_saved_in_data_struct() ((struct reg_saved_in_data_struct *)(ggc_internal_cleared_alloc_stat (sizeof (struct reg_saved_in_data_struct) MEM_STAT_INFO)))
-#define ggc_alloc_vec_reg_saved_in_data_struct(n) ((struct reg_saved_in_data_struct *)(ggc_internal_vec_alloc_stat (sizeof (struct reg_saved_in_data_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_reg_saved_in_data_struct(n) ((struct reg_saved_in_data_struct *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct reg_saved_in_data_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_cfi_row_struct() ((struct dw_cfi_row_struct *)(ggc_internal_alloc_stat (sizeof (struct dw_cfi_row_struct) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_cfi_row_struct() ((struct dw_cfi_row_struct *)(ggc_internal_cleared_alloc_stat (sizeof (struct dw_cfi_row_struct) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_cfi_row_struct(n) ((struct dw_cfi_row_struct *)(ggc_internal_vec_alloc_stat (sizeof (struct dw_cfi_row_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_cfi_row_struct(n) ((struct dw_cfi_row_struct *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct dw_cfi_row_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_val_struct_union() ((union dw_val_struct_union *)(ggc_internal_alloc_stat (sizeof (union dw_val_struct_union) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_val_struct_union() ((union dw_val_struct_union *)(ggc_internal_cleared_alloc_stat (sizeof (union dw_val_struct_union) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_val_struct_union(n) ((union dw_val_struct_union *)(ggc_internal_vec_alloc_stat (sizeof (union dw_val_struct_union), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_val_struct_union(n) ((union dw_val_struct_union *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union dw_val_struct_union), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_val_vms_delta_union() ((struct dw_val_vms_delta_union *)(ggc_internal_alloc_stat (sizeof (struct dw_val_vms_delta_union) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_val_vms_delta_union() ((struct dw_val_vms_delta_union *)(ggc_internal_cleared_alloc_stat (sizeof (struct dw_val_vms_delta_union) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_val_vms_delta_union(n) ((struct dw_val_vms_delta_union *)(ggc_internal_vec_alloc_stat (sizeof (struct dw_val_vms_delta_union), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_val_vms_delta_union(n) ((struct dw_val_vms_delta_union *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct dw_val_vms_delta_union), n MEM_STAT_INFO)))
-#define ggc_alloc_dwarf_file_data() ((struct dwarf_file_data *)(ggc_internal_alloc_stat (sizeof (struct dwarf_file_data) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dwarf_file_data() ((struct dwarf_file_data *)(ggc_internal_cleared_alloc_stat (sizeof (struct dwarf_file_data) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dwarf_file_data(n) ((struct dwarf_file_data *)(ggc_internal_vec_alloc_stat (sizeof (struct dwarf_file_data), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dwarf_file_data(n) ((struct dwarf_file_data *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct dwarf_file_data), n MEM_STAT_INFO)))
-#define ggc_alloc_indirect_string_node() ((struct indirect_string_node *)(ggc_internal_alloc_stat (sizeof (struct indirect_string_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_indirect_string_node() ((struct indirect_string_node *)(ggc_internal_cleared_alloc_stat (sizeof (struct indirect_string_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_indirect_string_node(n) ((struct indirect_string_node *)(ggc_internal_vec_alloc_stat (sizeof (struct indirect_string_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_indirect_string_node(n) ((struct indirect_string_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct indirect_string_node), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_val_die_union() ((struct dw_val_die_union *)(ggc_internal_alloc_stat (sizeof (struct dw_val_die_union) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_val_die_union() ((struct dw_val_die_union *)(ggc_internal_cleared_alloc_stat (sizeof (struct dw_val_die_union) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_val_die_union(n) ((struct dw_val_die_union *)(ggc_internal_vec_alloc_stat (sizeof (struct dw_val_die_union), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_val_die_union(n) ((struct dw_val_die_union *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct dw_val_die_union), n MEM_STAT_INFO)))
-#define ggc_alloc_addr_table_entry_struct() ((struct addr_table_entry_struct *)(ggc_internal_alloc_stat (sizeof (struct addr_table_entry_struct) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_addr_table_entry_struct() ((struct addr_table_entry_struct *)(ggc_internal_cleared_alloc_stat (sizeof (struct addr_table_entry_struct) MEM_STAT_INFO)))
-#define ggc_alloc_vec_addr_table_entry_struct(n) ((struct addr_table_entry_struct *)(ggc_internal_vec_alloc_stat (sizeof (struct addr_table_entry_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_addr_table_entry_struct(n) ((struct addr_table_entry_struct *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct addr_table_entry_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_vec_const() ((struct dw_vec_const *)(ggc_internal_alloc_stat (sizeof (struct dw_vec_const) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_vec_const() ((struct dw_vec_const *)(ggc_internal_cleared_alloc_stat (sizeof (struct dw_vec_const) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_vec_const(n) ((struct dw_vec_const *)(ggc_internal_vec_alloc_stat (sizeof (struct dw_vec_const), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_vec_const(n) ((struct dw_vec_const *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct dw_vec_const), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_cfa_location() ((struct dw_cfa_location *)(ggc_internal_alloc_stat (sizeof (struct dw_cfa_location) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_cfa_location() ((struct dw_cfa_location *)(ggc_internal_cleared_alloc_stat (sizeof (struct dw_cfa_location) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_cfa_location(n) ((struct dw_cfa_location *)(ggc_internal_vec_alloc_stat (sizeof (struct dw_cfa_location), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_cfa_location(n) ((struct dw_cfa_location *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct dw_cfa_location), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_cfi_ref_va_gc_() ((vec<dw_cfi_ref,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<dw_cfi_ref,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_cfi_ref_va_gc_() ((vec<dw_cfi_ref,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<dw_cfi_ref,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_dw_cfi_ref_va_gc_(n) ((vec<dw_cfi_ref,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<dw_cfi_ref,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_dw_cfi_ref_va_gc_(n) ((vec<dw_cfi_ref,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<dw_cfi_ref,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_loc_list_struct() ((struct dw_loc_list_struct *)(ggc_internal_alloc_stat (sizeof (struct dw_loc_list_struct) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_loc_list_struct() ((struct dw_loc_list_struct *)(ggc_internal_cleared_alloc_stat (sizeof (struct dw_loc_list_struct) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_loc_list_struct(n) ((struct dw_loc_list_struct *)(ggc_internal_vec_alloc_stat (sizeof (struct dw_loc_list_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_loc_list_struct(n) ((struct dw_loc_list_struct *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct dw_loc_list_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_loc_descr_node() ((struct dw_loc_descr_node *)(ggc_internal_alloc_stat (sizeof (struct dw_loc_descr_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_loc_descr_node() ((struct dw_loc_descr_node *)(ggc_internal_cleared_alloc_stat (sizeof (struct dw_loc_descr_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_loc_descr_node(n) ((struct dw_loc_descr_node *)(ggc_internal_vec_alloc_stat (sizeof (struct dw_loc_descr_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_loc_descr_node(n) ((struct dw_loc_descr_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct dw_loc_descr_node), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_cfi_node() ((struct dw_cfi_node *)(ggc_internal_alloc_stat (sizeof (struct dw_cfi_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_cfi_node() ((struct dw_cfi_node *)(ggc_internal_cleared_alloc_stat (sizeof (struct dw_cfi_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_cfi_node(n) ((struct dw_cfi_node *)(ggc_internal_vec_alloc_stat (sizeof (struct dw_cfi_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_cfi_node(n) ((struct dw_cfi_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct dw_cfi_node), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_val_node() ((struct dw_val_node *)(ggc_internal_alloc_stat (sizeof (struct dw_val_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_val_node() ((struct dw_val_node *)(ggc_internal_cleared_alloc_stat (sizeof (struct dw_val_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_val_node(n) ((struct dw_val_node *)(ggc_internal_vec_alloc_stat (sizeof (struct dw_val_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_val_node(n) ((struct dw_val_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct dw_val_node), n MEM_STAT_INFO)))
-#define ggc_alloc_typeinfo() ((struct typeinfo *)(ggc_internal_alloc_stat (sizeof (struct typeinfo) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_typeinfo() ((struct typeinfo *)(ggc_internal_cleared_alloc_stat (sizeof (struct typeinfo) MEM_STAT_INFO)))
-#define ggc_alloc_vec_typeinfo(n) ((struct typeinfo *)(ggc_internal_vec_alloc_stat (sizeof (struct typeinfo), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_typeinfo(n) ((struct typeinfo *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct typeinfo), n MEM_STAT_INFO)))
-#define ggc_alloc_odr_type_d() ((struct odr_type_d *)(ggc_internal_alloc_stat (sizeof (struct odr_type_d) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_odr_type_d() ((struct odr_type_d *)(ggc_internal_cleared_alloc_stat (sizeof (struct odr_type_d) MEM_STAT_INFO)))
-#define ggc_alloc_vec_odr_type_d(n) ((struct odr_type_d *)(ggc_internal_vec_alloc_stat (sizeof (struct odr_type_d), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_odr_type_d(n) ((struct odr_type_d *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct odr_type_d), n MEM_STAT_INFO)))
-#define ggc_alloc_inline_summary() ((struct inline_summary *)(ggc_internal_alloc_stat (sizeof (struct inline_summary) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_inline_summary() ((struct inline_summary *)(ggc_internal_cleared_alloc_stat (sizeof (struct inline_summary) MEM_STAT_INFO)))
-#define ggc_alloc_vec_inline_summary(n) ((struct inline_summary *)(ggc_internal_vec_alloc_stat (sizeof (struct inline_summary), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_inline_summary(n) ((struct inline_summary *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct inline_summary), n MEM_STAT_INFO)))
-#define ggc_alloc_ipa_agg_jump_function() ((struct ipa_agg_jump_function *)(ggc_internal_alloc_stat (sizeof (struct ipa_agg_jump_function) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ipa_agg_jump_function() ((struct ipa_agg_jump_function *)(ggc_internal_cleared_alloc_stat (sizeof (struct ipa_agg_jump_function) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_agg_jump_function(n) ((struct ipa_agg_jump_function *)(ggc_internal_vec_alloc_stat (sizeof (struct ipa_agg_jump_function), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_agg_jump_function(n) ((struct ipa_agg_jump_function *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct ipa_agg_jump_function), n MEM_STAT_INFO)))
-#define ggc_alloc_ipa_agg_replacement_value() ((struct ipa_agg_replacement_value *)(ggc_internal_alloc_stat (sizeof (struct ipa_agg_replacement_value) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ipa_agg_replacement_value() ((struct ipa_agg_replacement_value *)(ggc_internal_cleared_alloc_stat (sizeof (struct ipa_agg_replacement_value) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_agg_replacement_value(n) ((struct ipa_agg_replacement_value *)(ggc_internal_vec_alloc_stat (sizeof (struct ipa_agg_replacement_value), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_agg_replacement_value(n) ((struct ipa_agg_replacement_value *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct ipa_agg_replacement_value), n MEM_STAT_INFO)))
-#define ggc_alloc_ipa_edge_args() ((struct ipa_edge_args *)(ggc_internal_alloc_stat (sizeof (struct ipa_edge_args) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ipa_edge_args() ((struct ipa_edge_args *)(ggc_internal_cleared_alloc_stat (sizeof (struct ipa_edge_args) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_edge_args(n) ((struct ipa_edge_args *)(ggc_internal_vec_alloc_stat (sizeof (struct ipa_edge_args), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_edge_args(n) ((struct ipa_edge_args *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct ipa_edge_args), n MEM_STAT_INFO)))
-#define ggc_alloc_ipa_agg_jf_item() ((struct ipa_agg_jf_item *)(ggc_internal_alloc_stat (sizeof (struct ipa_agg_jf_item) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ipa_agg_jf_item() ((struct ipa_agg_jf_item *)(ggc_internal_cleared_alloc_stat (sizeof (struct ipa_agg_jf_item) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_agg_jf_item(n) ((struct ipa_agg_jf_item *)(ggc_internal_vec_alloc_stat (sizeof (struct ipa_agg_jf_item), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_agg_jf_item(n) ((struct ipa_agg_jf_item *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct ipa_agg_jf_item), n MEM_STAT_INFO)))
-#define ggc_alloc_ipa_jump_func() ((struct ipa_jump_func *)(ggc_internal_alloc_stat (sizeof (struct ipa_jump_func) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ipa_jump_func() ((struct ipa_jump_func *)(ggc_internal_cleared_alloc_stat (sizeof (struct ipa_jump_func) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_jump_func(n) ((struct ipa_jump_func *)(ggc_internal_vec_alloc_stat (sizeof (struct ipa_jump_func), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_jump_func(n) ((struct ipa_jump_func *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct ipa_jump_func), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_alias_set_entry_va_gc_() ((vec<alias_set_entry,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<alias_set_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_alias_set_entry_va_gc_() ((vec<alias_set_entry,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<alias_set_entry,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_alias_set_entry_va_gc_(n) ((vec<alias_set_entry,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<alias_set_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_alias_set_entry_va_gc_(n) ((vec<alias_set_entry,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<alias_set_entry,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_alias_set_entry_d() ((struct alias_set_entry_d *)(ggc_internal_alloc_stat (sizeof (struct alias_set_entry_d) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_alias_set_entry_d() ((struct alias_set_entry_d *)(ggc_internal_cleared_alloc_stat (sizeof (struct alias_set_entry_d) MEM_STAT_INFO)))
-#define ggc_alloc_vec_alias_set_entry_d(n) ((struct alias_set_entry_d *)(ggc_internal_vec_alloc_stat (sizeof (struct alias_set_entry_d), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_alias_set_entry_d(n) ((struct alias_set_entry_d *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct alias_set_entry_d), n MEM_STAT_INFO)))
-#define ggc_alloc_constant_descriptor_tree() ((struct constant_descriptor_tree *)(ggc_internal_alloc_stat (sizeof (struct constant_descriptor_tree) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_constant_descriptor_tree() ((struct constant_descriptor_tree *)(ggc_internal_cleared_alloc_stat (sizeof (struct constant_descriptor_tree) MEM_STAT_INFO)))
-#define ggc_alloc_vec_constant_descriptor_tree(n) ((struct constant_descriptor_tree *)(ggc_internal_vec_alloc_stat (sizeof (struct constant_descriptor_tree), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_constant_descriptor_tree(n) ((struct constant_descriptor_tree *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct constant_descriptor_tree), n MEM_STAT_INFO)))
-#define ggc_alloc_asm_node() ((struct asm_node *)(ggc_internal_alloc_stat (sizeof (struct asm_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_asm_node() ((struct asm_node *)(ggc_internal_cleared_alloc_stat (sizeof (struct asm_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_asm_node(n) ((struct asm_node *)(ggc_internal_vec_alloc_stat (sizeof (struct asm_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_asm_node(n) ((struct asm_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct asm_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cgraph_indirect_call_info() ((struct cgraph_indirect_call_info *)(ggc_internal_alloc_stat (sizeof (struct cgraph_indirect_call_info) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cgraph_indirect_call_info() ((struct cgraph_indirect_call_info *)(ggc_internal_cleared_alloc_stat (sizeof (struct cgraph_indirect_call_info) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cgraph_indirect_call_info(n) ((struct cgraph_indirect_call_info *)(ggc_internal_vec_alloc_stat (sizeof (struct cgraph_indirect_call_info), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cgraph_indirect_call_info(n) ((struct cgraph_indirect_call_info *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cgraph_indirect_call_info), n MEM_STAT_INFO)))
-#define ggc_alloc_cgraph_function_version_info() ((struct cgraph_function_version_info *)(ggc_internal_alloc_stat (sizeof (struct cgraph_function_version_info) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cgraph_function_version_info() ((struct cgraph_function_version_info *)(ggc_internal_cleared_alloc_stat (sizeof (struct cgraph_function_version_info) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cgraph_function_version_info(n) ((struct cgraph_function_version_info *)(ggc_internal_vec_alloc_stat (sizeof (struct cgraph_function_version_info), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cgraph_function_version_info(n) ((struct cgraph_function_version_info *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cgraph_function_version_info), n MEM_STAT_INFO)))
-#define ggc_alloc_cgraph_edge() ((struct cgraph_edge *)(ggc_internal_alloc_stat (sizeof (struct cgraph_edge) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cgraph_edge() ((struct cgraph_edge *)(ggc_internal_cleared_alloc_stat (sizeof (struct cgraph_edge) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cgraph_edge(n) ((struct cgraph_edge *)(ggc_internal_vec_alloc_stat (sizeof (struct cgraph_edge), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cgraph_edge(n) ((struct cgraph_edge *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cgraph_edge), n MEM_STAT_INFO)))
-#define ggc_alloc_cgraph_simd_clone() ((struct cgraph_simd_clone *)(ggc_internal_alloc_stat (sizeof (struct cgraph_simd_clone) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cgraph_simd_clone() ((struct cgraph_simd_clone *)(ggc_internal_cleared_alloc_stat (sizeof (struct cgraph_simd_clone) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cgraph_simd_clone(n) ((struct cgraph_simd_clone *)(ggc_internal_vec_alloc_stat (sizeof (struct cgraph_simd_clone), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cgraph_simd_clone(n) ((struct cgraph_simd_clone *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cgraph_simd_clone), n MEM_STAT_INFO)))
-#define ggc_alloc_cgraph_simd_clone_arg() ((struct cgraph_simd_clone_arg *)(ggc_internal_alloc_stat (sizeof (struct cgraph_simd_clone_arg) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cgraph_simd_clone_arg() ((struct cgraph_simd_clone_arg *)(ggc_internal_cleared_alloc_stat (sizeof (struct cgraph_simd_clone_arg) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cgraph_simd_clone_arg(n) ((struct cgraph_simd_clone_arg *)(ggc_internal_vec_alloc_stat (sizeof (struct cgraph_simd_clone_arg), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cgraph_simd_clone_arg(n) ((struct cgraph_simd_clone_arg *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cgraph_simd_clone_arg), n MEM_STAT_INFO)))
-#define ggc_alloc_cgraph_clone_info() ((struct cgraph_clone_info *)(ggc_internal_alloc_stat (sizeof (struct cgraph_clone_info) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cgraph_clone_info() ((struct cgraph_clone_info *)(ggc_internal_cleared_alloc_stat (sizeof (struct cgraph_clone_info) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cgraph_clone_info(n) ((struct cgraph_clone_info *)(ggc_internal_vec_alloc_stat (sizeof (struct cgraph_clone_info), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cgraph_clone_info(n) ((struct cgraph_clone_info *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cgraph_clone_info), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_replace_map_p_va_gc_() ((vec<ipa_replace_map_p,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<ipa_replace_map_p,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_replace_map_p_va_gc_() ((vec<ipa_replace_map_p,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<ipa_replace_map_p,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_ipa_replace_map_p_va_gc_(n) ((vec<ipa_replace_map_p,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<ipa_replace_map_p,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_ipa_replace_map_p_va_gc_(n) ((vec<ipa_replace_map_p,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<ipa_replace_map_p,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_ipa_replace_map() ((struct ipa_replace_map *)(ggc_internal_alloc_stat (sizeof (struct ipa_replace_map) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ipa_replace_map() ((struct ipa_replace_map *)(ggc_internal_cleared_alloc_stat (sizeof (struct ipa_replace_map) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_replace_map(n) ((struct ipa_replace_map *)(ggc_internal_vec_alloc_stat (sizeof (struct ipa_replace_map), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_replace_map(n) ((struct ipa_replace_map *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct ipa_replace_map), n MEM_STAT_INFO)))
-#define ggc_alloc_cgraph_rtl_info() ((struct cgraph_rtl_info *)(ggc_internal_alloc_stat (sizeof (struct cgraph_rtl_info) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cgraph_rtl_info() ((struct cgraph_rtl_info *)(ggc_internal_cleared_alloc_stat (sizeof (struct cgraph_rtl_info) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cgraph_rtl_info(n) ((struct cgraph_rtl_info *)(ggc_internal_vec_alloc_stat (sizeof (struct cgraph_rtl_info), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cgraph_rtl_info(n) ((struct cgraph_rtl_info *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cgraph_rtl_info), n MEM_STAT_INFO)))
-#define ggc_alloc_cgraph_global_info() ((struct cgraph_global_info *)(ggc_internal_alloc_stat (sizeof (struct cgraph_global_info) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cgraph_global_info() ((struct cgraph_global_info *)(ggc_internal_cleared_alloc_stat (sizeof (struct cgraph_global_info) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cgraph_global_info(n) ((struct cgraph_global_info *)(ggc_internal_vec_alloc_stat (sizeof (struct cgraph_global_info), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cgraph_global_info(n) ((struct cgraph_global_info *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cgraph_global_info), n MEM_STAT_INFO)))
-#define ggc_alloc_cgraph_local_info() ((struct cgraph_local_info *)(ggc_internal_alloc_stat (sizeof (struct cgraph_local_info) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cgraph_local_info() ((struct cgraph_local_info *)(ggc_internal_cleared_alloc_stat (sizeof (struct cgraph_local_info) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cgraph_local_info(n) ((struct cgraph_local_info *)(ggc_internal_vec_alloc_stat (sizeof (struct cgraph_local_info), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cgraph_local_info(n) ((struct cgraph_local_info *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cgraph_local_info), n MEM_STAT_INFO)))
-#define ggc_alloc_cgraph_thunk_info() ((struct cgraph_thunk_info *)(ggc_internal_alloc_stat (sizeof (struct cgraph_thunk_info) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cgraph_thunk_info() ((struct cgraph_thunk_info *)(ggc_internal_cleared_alloc_stat (sizeof (struct cgraph_thunk_info) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cgraph_thunk_info(n) ((struct cgraph_thunk_info *)(ggc_internal_vec_alloc_stat (sizeof (struct cgraph_thunk_info), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cgraph_thunk_info(n) ((struct cgraph_thunk_info *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cgraph_thunk_info), n MEM_STAT_INFO)))
-#define ggc_alloc_lto_file_decl_data() ((struct lto_file_decl_data *)(ggc_internal_alloc_stat (sizeof (struct lto_file_decl_data) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lto_file_decl_data() ((struct lto_file_decl_data *)(ggc_internal_cleared_alloc_stat (sizeof (struct lto_file_decl_data) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lto_file_decl_data(n) ((struct lto_file_decl_data *)(ggc_internal_vec_alloc_stat (sizeof (struct lto_file_decl_data), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lto_file_decl_data(n) ((struct lto_file_decl_data *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct lto_file_decl_data), n MEM_STAT_INFO)))
-#define ggc_alloc_ipa_ref_list() ((struct ipa_ref_list *)(ggc_internal_alloc_stat (sizeof (struct ipa_ref_list) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ipa_ref_list() ((struct ipa_ref_list *)(ggc_internal_cleared_alloc_stat (sizeof (struct ipa_ref_list) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_ref_list(n) ((struct ipa_ref_list *)(ggc_internal_vec_alloc_stat (sizeof (struct ipa_ref_list), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_ref_list(n) ((struct ipa_ref_list *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct ipa_ref_list), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_ref_t_va_gc_() ((vec<ipa_ref_t,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<ipa_ref_t,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_ref_t_va_gc_() ((vec<ipa_ref_t,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<ipa_ref_t,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_ipa_ref_t_va_gc_(n) ((vec<ipa_ref_t,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<ipa_ref_t,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_ipa_ref_t_va_gc_(n) ((vec<ipa_ref_t,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<ipa_ref_t,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_ipa_ref() ((struct ipa_ref *)(ggc_internal_alloc_stat (sizeof (struct ipa_ref) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ipa_ref() ((struct ipa_ref *)(ggc_internal_cleared_alloc_stat (sizeof (struct ipa_ref) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_ref(n) ((struct ipa_ref *)(ggc_internal_vec_alloc_stat (sizeof (struct ipa_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_ref(n) ((struct ipa_ref *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct ipa_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_symtab_node() ((struct symtab_node *)(ggc_internal_alloc_stat (sizeof (struct symtab_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_symtab_node() ((struct symtab_node *)(ggc_internal_cleared_alloc_stat (sizeof (struct symtab_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_symtab_node(n) ((struct symtab_node *)(ggc_internal_vec_alloc_stat (sizeof (struct symtab_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_symtab_node(n) ((struct symtab_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct symtab_node), n MEM_STAT_INFO)))
-#define ggc_alloc_varpool_node() ((struct varpool_node *)(ggc_internal_alloc_stat (sizeof (struct varpool_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_varpool_node() ((struct varpool_node *)(ggc_internal_cleared_alloc_stat (sizeof (struct varpool_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_varpool_node(n) ((struct varpool_node *)(ggc_internal_vec_alloc_stat (sizeof (struct varpool_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_varpool_node(n) ((struct varpool_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct varpool_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cgraph_node() ((struct cgraph_node *)(ggc_internal_alloc_stat (sizeof (struct cgraph_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cgraph_node() ((struct cgraph_node *)(ggc_internal_cleared_alloc_stat (sizeof (struct cgraph_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cgraph_node(n) ((struct cgraph_node *)(ggc_internal_vec_alloc_stat (sizeof (struct cgraph_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cgraph_node(n) ((struct cgraph_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cgraph_node), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_basic_block_va_gc_() ((vec<basic_block,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<basic_block,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_basic_block_va_gc_() ((vec<basic_block,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<basic_block,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_basic_block_va_gc_(n) ((vec<basic_block,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<basic_block,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_basic_block_va_gc_(n) ((vec<basic_block,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<basic_block,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_basic_block_il_dependent() ((union basic_block_il_dependent *)(ggc_internal_alloc_stat (sizeof (union basic_block_il_dependent) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_basic_block_il_dependent() ((union basic_block_il_dependent *)(ggc_internal_cleared_alloc_stat (sizeof (union basic_block_il_dependent) MEM_STAT_INFO)))
-#define ggc_alloc_vec_basic_block_il_dependent(n) ((union basic_block_il_dependent *)(ggc_internal_vec_alloc_stat (sizeof (union basic_block_il_dependent), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_basic_block_il_dependent(n) ((union basic_block_il_dependent *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union basic_block_il_dependent), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_edge_va_gc_() ((vec<edge,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<edge,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_edge_va_gc_() ((vec<edge,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<edge,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_edge_va_gc_(n) ((vec<edge,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<edge,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_edge_va_gc_(n) ((vec<edge,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<edge,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_bb_info() ((struct gimple_bb_info *)(ggc_internal_alloc_stat (sizeof (struct gimple_bb_info) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_bb_info() ((struct gimple_bb_info *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_bb_info) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_bb_info(n) ((struct gimple_bb_info *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_bb_info), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_bb_info(n) ((struct gimple_bb_info *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_bb_info), n MEM_STAT_INFO)))
-#define ggc_alloc_rtl_bb_info() ((struct rtl_bb_info *)(ggc_internal_alloc_stat (sizeof (struct rtl_bb_info) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtl_bb_info() ((struct rtl_bb_info *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtl_bb_info) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtl_bb_info(n) ((struct rtl_bb_info *)(ggc_internal_vec_alloc_stat (sizeof (struct rtl_bb_info), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtl_bb_info(n) ((struct rtl_bb_info *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtl_bb_info), n MEM_STAT_INFO)))
-#define ggc_alloc_niter_desc() ((struct niter_desc *)(ggc_internal_alloc_stat (sizeof (struct niter_desc) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_niter_desc() ((struct niter_desc *)(ggc_internal_cleared_alloc_stat (sizeof (struct niter_desc) MEM_STAT_INFO)))
-#define ggc_alloc_vec_niter_desc(n) ((struct niter_desc *)(ggc_internal_vec_alloc_stat (sizeof (struct niter_desc), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_niter_desc(n) ((struct niter_desc *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct niter_desc), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_loop_p_va_gc_() ((vec<loop_p,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<loop_p,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_loop_p_va_gc_() ((vec<loop_p,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<loop_p,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_loop_p_va_gc_(n) ((vec<loop_p,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<loop_p,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_loop_p_va_gc_(n) ((vec<loop_p,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<loop_p,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_loop() ((struct loop *)(ggc_internal_alloc_stat (sizeof (struct loop) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_loop() ((struct loop *)(ggc_internal_cleared_alloc_stat (sizeof (struct loop) MEM_STAT_INFO)))
-#define ggc_alloc_vec_loop(n) ((struct loop *)(ggc_internal_vec_alloc_stat (sizeof (struct loop), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_loop(n) ((struct loop *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct loop), n MEM_STAT_INFO)))
-#define ggc_alloc_loop_exit() ((struct loop_exit *)(ggc_internal_alloc_stat (sizeof (struct loop_exit) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_loop_exit() ((struct loop_exit *)(ggc_internal_cleared_alloc_stat (sizeof (struct loop_exit) MEM_STAT_INFO)))
-#define ggc_alloc_vec_loop_exit(n) ((struct loop_exit *)(ggc_internal_vec_alloc_stat (sizeof (struct loop_exit), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_loop_exit(n) ((struct loop_exit *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct loop_exit), n MEM_STAT_INFO)))
-#define ggc_alloc_nb_iter_bound() ((struct nb_iter_bound *)(ggc_internal_alloc_stat (sizeof (struct nb_iter_bound) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_nb_iter_bound() ((struct nb_iter_bound *)(ggc_internal_cleared_alloc_stat (sizeof (struct nb_iter_bound) MEM_STAT_INFO)))
-#define ggc_alloc_vec_nb_iter_bound(n) ((struct nb_iter_bound *)(ggc_internal_vec_alloc_stat (sizeof (struct nb_iter_bound), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_nb_iter_bound(n) ((struct nb_iter_bound *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct nb_iter_bound), n MEM_STAT_INFO)))
-#define ggc_alloc_lpt_decision() ((struct lpt_decision *)(ggc_internal_alloc_stat (sizeof (struct lpt_decision) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lpt_decision() ((struct lpt_decision *)(ggc_internal_cleared_alloc_stat (sizeof (struct lpt_decision) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lpt_decision(n) ((struct lpt_decision *)(ggc_internal_vec_alloc_stat (sizeof (struct lpt_decision), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lpt_decision(n) ((struct lpt_decision *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct lpt_decision), n MEM_STAT_INFO)))
-#define ggc_alloc_noswitch_section() ((struct noswitch_section *)(ggc_internal_alloc_stat (sizeof (struct noswitch_section) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_noswitch_section() ((struct noswitch_section *)(ggc_internal_cleared_alloc_stat (sizeof (struct noswitch_section) MEM_STAT_INFO)))
-#define ggc_alloc_vec_noswitch_section(n) ((struct noswitch_section *)(ggc_internal_vec_alloc_stat (sizeof (struct noswitch_section), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_noswitch_section(n) ((struct noswitch_section *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct noswitch_section), n MEM_STAT_INFO)))
-#define ggc_alloc_unnamed_section() ((struct unnamed_section *)(ggc_internal_alloc_stat (sizeof (struct unnamed_section) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_unnamed_section() ((struct unnamed_section *)(ggc_internal_cleared_alloc_stat (sizeof (struct unnamed_section) MEM_STAT_INFO)))
-#define ggc_alloc_vec_unnamed_section(n) ((struct unnamed_section *)(ggc_internal_vec_alloc_stat (sizeof (struct unnamed_section), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_unnamed_section(n) ((struct unnamed_section *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct unnamed_section), n MEM_STAT_INFO)))
-#define ggc_alloc_named_section() ((struct named_section *)(ggc_internal_alloc_stat (sizeof (struct named_section) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_named_section() ((struct named_section *)(ggc_internal_cleared_alloc_stat (sizeof (struct named_section) MEM_STAT_INFO)))
-#define ggc_alloc_vec_named_section(n) ((struct named_section *)(ggc_internal_vec_alloc_stat (sizeof (struct named_section), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_named_section(n) ((struct named_section *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct named_section), n MEM_STAT_INFO)))
-#define ggc_alloc_section_common() ((struct section_common *)(ggc_internal_alloc_stat (sizeof (struct section_common) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_section_common() ((struct section_common *)(ggc_internal_cleared_alloc_stat (sizeof (struct section_common) MEM_STAT_INFO)))
-#define ggc_alloc_vec_section_common(n) ((struct section_common *)(ggc_internal_vec_alloc_stat (sizeof (struct section_common), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_section_common(n) ((struct section_common *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct section_common), n MEM_STAT_INFO)))
-#define ggc_alloc_types_used_by_vars_entry() ((struct types_used_by_vars_entry *)(ggc_internal_alloc_stat (sizeof (struct types_used_by_vars_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_types_used_by_vars_entry() ((struct types_used_by_vars_entry *)(ggc_internal_cleared_alloc_stat (sizeof (struct types_used_by_vars_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_types_used_by_vars_entry(n) ((struct types_used_by_vars_entry *)(ggc_internal_vec_alloc_stat (sizeof (struct types_used_by_vars_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_types_used_by_vars_entry(n) ((struct types_used_by_vars_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct types_used_by_vars_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_language_function() ((struct language_function *)(ggc_internal_alloc_stat (sizeof (struct language_function) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_language_function() ((struct language_function *)(ggc_internal_cleared_alloc_stat (sizeof (struct language_function) MEM_STAT_INFO)))
-#define ggc_alloc_vec_language_function(n) ((struct language_function *)(ggc_internal_vec_alloc_stat (sizeof (struct language_function), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_language_function(n) ((struct language_function *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct language_function), n MEM_STAT_INFO)))
-#define ggc_alloc_loops() ((struct loops *)(ggc_internal_alloc_stat (sizeof (struct loops) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_loops() ((struct loops *)(ggc_internal_cleared_alloc_stat (sizeof (struct loops) MEM_STAT_INFO)))
-#define ggc_alloc_vec_loops(n) ((struct loops *)(ggc_internal_vec_alloc_stat (sizeof (struct loops), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_loops(n) ((struct loops *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct loops), n MEM_STAT_INFO)))
-#define ggc_alloc_control_flow_graph() ((struct control_flow_graph *)(ggc_internal_alloc_stat (sizeof (struct control_flow_graph) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_control_flow_graph() ((struct control_flow_graph *)(ggc_internal_cleared_alloc_stat (sizeof (struct control_flow_graph) MEM_STAT_INFO)))
-#define ggc_alloc_vec_control_flow_graph(n) ((struct control_flow_graph *)(ggc_internal_vec_alloc_stat (sizeof (struct control_flow_graph), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_control_flow_graph(n) ((struct control_flow_graph *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct control_flow_graph), n MEM_STAT_INFO)))
-#define ggc_alloc_eh_status() ((struct eh_status *)(ggc_internal_alloc_stat (sizeof (struct eh_status) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_eh_status() ((struct eh_status *)(ggc_internal_cleared_alloc_stat (sizeof (struct eh_status) MEM_STAT_INFO)))
-#define ggc_alloc_vec_eh_status(n) ((struct eh_status *)(ggc_internal_vec_alloc_stat (sizeof (struct eh_status), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_eh_status(n) ((struct eh_status *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct eh_status), n MEM_STAT_INFO)))
-#define ggc_alloc_stack_usage() ((struct stack_usage *)(ggc_internal_alloc_stat (sizeof (struct stack_usage) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_stack_usage() ((struct stack_usage *)(ggc_internal_cleared_alloc_stat (sizeof (struct stack_usage) MEM_STAT_INFO)))
-#define ggc_alloc_vec_stack_usage(n) ((struct stack_usage *)(ggc_internal_vec_alloc_stat (sizeof (struct stack_usage), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_stack_usage(n) ((struct stack_usage *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct stack_usage), n MEM_STAT_INFO)))
-#define ggc_alloc_rtl_data() ((struct rtl_data *)(ggc_internal_alloc_stat (sizeof (struct rtl_data) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtl_data() ((struct rtl_data *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtl_data) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtl_data(n) ((struct rtl_data *)(ggc_internal_vec_alloc_stat (sizeof (struct rtl_data), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtl_data(n) ((struct rtl_data *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtl_data), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_temp_slot_p_va_gc_() ((vec<temp_slot_p,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<temp_slot_p,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_temp_slot_p_va_gc_() ((vec<temp_slot_p,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<temp_slot_p,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_temp_slot_p_va_gc_(n) ((vec<temp_slot_p,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<temp_slot_p,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_temp_slot_p_va_gc_(n) ((vec<temp_slot_p,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<temp_slot_p,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_initial_value_struct() ((struct initial_value_struct *)(ggc_internal_alloc_stat (sizeof (struct initial_value_struct) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_initial_value_struct() ((struct initial_value_struct *)(ggc_internal_cleared_alloc_stat (sizeof (struct initial_value_struct) MEM_STAT_INFO)))
-#define ggc_alloc_vec_initial_value_struct(n) ((struct initial_value_struct *)(ggc_internal_vec_alloc_stat (sizeof (struct initial_value_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_initial_value_struct(n) ((struct initial_value_struct *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct initial_value_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_frame_space() ((struct frame_space *)(ggc_internal_alloc_stat (sizeof (struct frame_space) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_frame_space() ((struct frame_space *)(ggc_internal_cleared_alloc_stat (sizeof (struct frame_space) MEM_STAT_INFO)))
-#define ggc_alloc_vec_frame_space(n) ((struct frame_space *)(ggc_internal_vec_alloc_stat (sizeof (struct frame_space), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_frame_space(n) ((struct frame_space *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct frame_space), n MEM_STAT_INFO)))
-#define ggc_alloc_function_subsections() ((struct function_subsections *)(ggc_internal_alloc_stat (sizeof (struct function_subsections) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_function_subsections() ((struct function_subsections *)(ggc_internal_cleared_alloc_stat (sizeof (struct function_subsections) MEM_STAT_INFO)))
-#define ggc_alloc_vec_function_subsections(n) ((struct function_subsections *)(ggc_internal_vec_alloc_stat (sizeof (struct function_subsections), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_function_subsections(n) ((struct function_subsections *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct function_subsections), n MEM_STAT_INFO)))
-#define ggc_alloc_incoming_args() ((struct incoming_args *)(ggc_internal_alloc_stat (sizeof (struct incoming_args) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_incoming_args() ((struct incoming_args *)(ggc_internal_cleared_alloc_stat (sizeof (struct incoming_args) MEM_STAT_INFO)))
-#define ggc_alloc_vec_incoming_args(n) ((struct incoming_args *)(ggc_internal_vec_alloc_stat (sizeof (struct incoming_args), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_incoming_args(n) ((struct incoming_args *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct incoming_args), n MEM_STAT_INFO)))
-#define ggc_alloc_varasm_status() ((struct varasm_status *)(ggc_internal_alloc_stat (sizeof (struct varasm_status) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_varasm_status() ((struct varasm_status *)(ggc_internal_cleared_alloc_stat (sizeof (struct varasm_status) MEM_STAT_INFO)))
-#define ggc_alloc_vec_varasm_status(n) ((struct varasm_status *)(ggc_internal_vec_alloc_stat (sizeof (struct varasm_status), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_varasm_status(n) ((struct varasm_status *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct varasm_status), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_constant_pool() ((struct rtx_constant_pool *)(ggc_internal_alloc_stat (sizeof (struct rtx_constant_pool) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_constant_pool() ((struct rtx_constant_pool *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_constant_pool) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_constant_pool(n) ((struct rtx_constant_pool *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_constant_pool), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_constant_pool(n) ((struct rtx_constant_pool *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_constant_pool), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_fde_node() ((struct dw_fde_node *)(ggc_internal_alloc_stat (sizeof (struct dw_fde_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_fde_node() ((struct dw_fde_node *)(ggc_internal_cleared_alloc_stat (sizeof (struct dw_fde_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_fde_node(n) ((struct dw_fde_node *)(ggc_internal_vec_alloc_stat (sizeof (struct dw_fde_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_fde_node(n) ((struct dw_fde_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct dw_fde_node), n MEM_STAT_INFO)))
-#define ggc_alloc_temp_slot() ((struct temp_slot *)(ggc_internal_alloc_stat (sizeof (struct temp_slot) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_temp_slot() ((struct temp_slot *)(ggc_internal_cleared_alloc_stat (sizeof (struct temp_slot) MEM_STAT_INFO)))
-#define ggc_alloc_vec_temp_slot(n) ((struct temp_slot *)(ggc_internal_vec_alloc_stat (sizeof (struct temp_slot), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_temp_slot(n) ((struct temp_slot *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct temp_slot), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_df() ((struct gimple_df *)(ggc_internal_alloc_stat (sizeof (struct gimple_df) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_df() ((struct gimple_df *)(ggc_internal_cleared_alloc_stat (sizeof (struct gimple_df) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_df(n) ((struct gimple_df *)(ggc_internal_vec_alloc_stat (sizeof (struct gimple_df), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_df(n) ((struct gimple_df *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct gimple_df), n MEM_STAT_INFO)))
-#define ggc_alloc_rtl_eh() ((struct rtl_eh *)(ggc_internal_alloc_stat (sizeof (struct rtl_eh) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtl_eh() ((struct rtl_eh *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtl_eh) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtl_eh(n) ((struct rtl_eh *)(ggc_internal_vec_alloc_stat (sizeof (struct rtl_eh), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtl_eh(n) ((struct rtl_eh *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtl_eh), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_call_site_record_va_gc_() ((vec<call_site_record,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<call_site_record,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_call_site_record_va_gc_() ((vec<call_site_record,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<call_site_record,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_call_site_record_va_gc_(n) ((vec<call_site_record,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<call_site_record,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_call_site_record_va_gc_(n) ((vec<call_site_record,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<call_site_record,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_uchar_va_gc_() ((vec<uchar,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<uchar,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_uchar_va_gc_() ((vec<uchar,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<uchar,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_uchar_va_gc_(n) ((vec<uchar,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<uchar,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_uchar_va_gc_(n) ((vec<uchar,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<uchar,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_call_site_record_d() ((struct call_site_record_d *)(ggc_internal_alloc_stat (sizeof (struct call_site_record_d) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_call_site_record_d() ((struct call_site_record_d *)(ggc_internal_cleared_alloc_stat (sizeof (struct call_site_record_d) MEM_STAT_INFO)))
-#define ggc_alloc_vec_call_site_record_d(n) ((struct call_site_record_d *)(ggc_internal_vec_alloc_stat (sizeof (struct call_site_record_d), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_call_site_record_d(n) ((struct call_site_record_d *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct call_site_record_d), n MEM_STAT_INFO)))
-#define ggc_alloc_expr_status() ((struct expr_status *)(ggc_internal_alloc_stat (sizeof (struct expr_status) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_expr_status() ((struct expr_status *)(ggc_internal_cleared_alloc_stat (sizeof (struct expr_status) MEM_STAT_INFO)))
-#define ggc_alloc_vec_expr_status(n) ((struct expr_status *)(ggc_internal_vec_alloc_stat (sizeof (struct expr_status), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_expr_status(n) ((struct expr_status *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct expr_status), n MEM_STAT_INFO)))
-#define ggc_alloc_emit_status() ((struct emit_status *)(ggc_internal_alloc_stat (sizeof (struct emit_status) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_emit_status() ((struct emit_status *)(ggc_internal_cleared_alloc_stat (sizeof (struct emit_status) MEM_STAT_INFO)))
-#define ggc_alloc_vec_emit_status(n) ((struct emit_status *)(ggc_internal_vec_alloc_stat (sizeof (struct emit_status), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_emit_status(n) ((struct emit_status *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct emit_status), n MEM_STAT_INFO)))
-#define ggc_alloc_sequence_stack() ((struct sequence_stack *)(ggc_internal_alloc_stat (sizeof (struct sequence_stack) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_sequence_stack() ((struct sequence_stack *)(ggc_internal_cleared_alloc_stat (sizeof (struct sequence_stack) MEM_STAT_INFO)))
-#define ggc_alloc_vec_sequence_stack(n) ((struct sequence_stack *)(ggc_internal_vec_alloc_stat (sizeof (struct sequence_stack), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_sequence_stack(n) ((struct sequence_stack *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct sequence_stack), n MEM_STAT_INFO)))
-#define ggc_alloc_target_libfuncs() ((struct target_libfuncs *)(ggc_internal_alloc_stat (sizeof (struct target_libfuncs) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_target_libfuncs() ((struct target_libfuncs *)(ggc_internal_cleared_alloc_stat (sizeof (struct target_libfuncs) MEM_STAT_INFO)))
-#define ggc_alloc_vec_target_libfuncs(n) ((struct target_libfuncs *)(ggc_internal_vec_alloc_stat (sizeof (struct target_libfuncs), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_target_libfuncs(n) ((struct target_libfuncs *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct target_libfuncs), n MEM_STAT_INFO)))
-#define ggc_alloc_libfunc_entry() ((struct libfunc_entry *)(ggc_internal_alloc_stat (sizeof (struct libfunc_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_libfunc_entry() ((struct libfunc_entry *)(ggc_internal_cleared_alloc_stat (sizeof (struct libfunc_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_libfunc_entry(n) ((struct libfunc_entry *)(ggc_internal_vec_alloc_stat (sizeof (struct libfunc_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_libfunc_entry(n) ((struct libfunc_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct libfunc_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_alias_pair_va_gc_() ((vec<alias_pair,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<alias_pair,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_alias_pair_va_gc_() ((vec<alias_pair,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<alias_pair,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_alias_pair_va_gc_(n) ((vec<alias_pair,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<alias_pair,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_alias_pair_va_gc_(n) ((vec<alias_pair,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<alias_pair,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_builtin_info_type() ((struct builtin_info_type *)(ggc_internal_alloc_stat (sizeof (struct builtin_info_type) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_builtin_info_type() ((struct builtin_info_type *)(ggc_internal_cleared_alloc_stat (sizeof (struct builtin_info_type) MEM_STAT_INFO)))
-#define ggc_alloc_vec_builtin_info_type(n) ((struct builtin_info_type *)(ggc_internal_vec_alloc_stat (sizeof (struct builtin_info_type), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_builtin_info_type(n) ((struct builtin_info_type *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct builtin_info_type), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_vec_map() ((struct tree_vec_map *)(ggc_internal_alloc_stat (sizeof (struct tree_vec_map) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_vec_map() ((struct tree_vec_map *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_vec_map) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_vec_map(n) ((struct tree_vec_map *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_vec_map), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_vec_map(n) ((struct tree_vec_map *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_vec_map), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_priority_map() ((struct tree_priority_map *)(ggc_internal_alloc_stat (sizeof (struct tree_priority_map) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_priority_map() ((struct tree_priority_map *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_priority_map) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_priority_map(n) ((struct tree_priority_map *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_priority_map), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_priority_map(n) ((struct tree_priority_map *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_priority_map), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_int_map() ((struct tree_int_map *)(ggc_internal_alloc_stat (sizeof (struct tree_int_map) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_int_map() ((struct tree_int_map *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_int_map) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_int_map(n) ((struct tree_int_map *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_int_map), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_int_map(n) ((struct tree_int_map *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_int_map), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_decl_map() ((struct tree_decl_map *)(ggc_internal_alloc_stat (sizeof (struct tree_decl_map) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_decl_map() ((struct tree_decl_map *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_decl_map) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_decl_map(n) ((struct tree_decl_map *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_decl_map), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_decl_map(n) ((struct tree_decl_map *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_decl_map), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_map() ((struct tree_map *)(ggc_internal_alloc_stat (sizeof (struct tree_map) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_map() ((struct tree_map *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_map) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_map(n) ((struct tree_map *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_map), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_map(n) ((struct tree_map *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_map), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_map_base() ((struct tree_map_base *)(ggc_internal_alloc_stat (sizeof (struct tree_map_base) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_map_base() ((struct tree_map_base *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_map_base) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_map_base(n) ((struct tree_map_base *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_map_base), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_map_base(n) ((struct tree_map_base *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_map_base), n MEM_STAT_INFO)))
-#define ggc_alloc_lang_tree_node() ((union lang_tree_node *)(ggc_internal_alloc_stat (sizeof (union lang_tree_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lang_tree_node() ((union lang_tree_node *)(ggc_internal_cleared_alloc_stat (sizeof (union lang_tree_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lang_tree_node(n) ((union lang_tree_node *)(ggc_internal_vec_alloc_stat (sizeof (union lang_tree_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lang_tree_node(n) ((union lang_tree_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union lang_tree_node), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_target_option() ((struct tree_target_option *)(ggc_internal_alloc_stat (sizeof (struct tree_target_option) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_target_option() ((struct tree_target_option *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_target_option) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_target_option(n) ((struct tree_target_option *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_target_option), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_target_option(n) ((struct tree_target_option *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_target_option), n MEM_STAT_INFO)))
-#define ggc_alloc_target_globals() ((struct target_globals *)(ggc_internal_alloc_stat (sizeof (struct target_globals) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_target_globals() ((struct target_globals *)(ggc_internal_cleared_alloc_stat (sizeof (struct target_globals) MEM_STAT_INFO)))
-#define ggc_alloc_vec_target_globals(n) ((struct target_globals *)(ggc_internal_vec_alloc_stat (sizeof (struct target_globals), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_target_globals(n) ((struct target_globals *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct target_globals), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_optimization_option() ((struct tree_optimization_option *)(ggc_internal_alloc_stat (sizeof (struct tree_optimization_option) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_optimization_option() ((struct tree_optimization_option *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_optimization_option) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_optimization_option(n) ((struct tree_optimization_option *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_optimization_option), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_optimization_option(n) ((struct tree_optimization_option *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_optimization_option), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_statement_list() ((struct tree_statement_list *)(ggc_internal_alloc_stat (sizeof (struct tree_statement_list) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_statement_list() ((struct tree_statement_list *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_statement_list) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_statement_list(n) ((struct tree_statement_list *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_statement_list), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_statement_list(n) ((struct tree_statement_list *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_statement_list), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_statement_list_node() ((struct tree_statement_list_node *)(ggc_internal_alloc_stat (sizeof (struct tree_statement_list_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_statement_list_node() ((struct tree_statement_list_node *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_statement_list_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_statement_list_node(n) ((struct tree_statement_list_node *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_statement_list_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_statement_list_node(n) ((struct tree_statement_list_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_statement_list_node), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_type_decl() ((struct tree_type_decl *)(ggc_internal_alloc_stat (sizeof (struct tree_type_decl) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_type_decl() ((struct tree_type_decl *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_type_decl) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_type_decl(n) ((struct tree_type_decl *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_type_decl), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_type_decl(n) ((struct tree_type_decl *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_type_decl), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_translation_unit_decl() ((struct tree_translation_unit_decl *)(ggc_internal_alloc_stat (sizeof (struct tree_translation_unit_decl) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_translation_unit_decl() ((struct tree_translation_unit_decl *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_translation_unit_decl) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_translation_unit_decl(n) ((struct tree_translation_unit_decl *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_translation_unit_decl), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_translation_unit_decl(n) ((struct tree_translation_unit_decl *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_translation_unit_decl), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_function_decl() ((struct tree_function_decl *)(ggc_internal_alloc_stat (sizeof (struct tree_function_decl) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_function_decl() ((struct tree_function_decl *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_function_decl) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_function_decl(n) ((struct tree_function_decl *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_function_decl), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_function_decl(n) ((struct tree_function_decl *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_function_decl), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_decl_non_common() ((struct tree_decl_non_common *)(ggc_internal_alloc_stat (sizeof (struct tree_decl_non_common) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_decl_non_common() ((struct tree_decl_non_common *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_decl_non_common) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_decl_non_common(n) ((struct tree_decl_non_common *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_decl_non_common), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_decl_non_common(n) ((struct tree_decl_non_common *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_decl_non_common), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_var_decl() ((struct tree_var_decl *)(ggc_internal_alloc_stat (sizeof (struct tree_var_decl) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_var_decl() ((struct tree_var_decl *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_var_decl) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_var_decl(n) ((struct tree_var_decl *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_var_decl), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_var_decl(n) ((struct tree_var_decl *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_var_decl), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_decl_with_vis() ((struct tree_decl_with_vis *)(ggc_internal_alloc_stat (sizeof (struct tree_decl_with_vis) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_decl_with_vis() ((struct tree_decl_with_vis *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_decl_with_vis) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_decl_with_vis(n) ((struct tree_decl_with_vis *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_decl_with_vis), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_decl_with_vis(n) ((struct tree_decl_with_vis *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_decl_with_vis), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_parm_decl() ((struct tree_parm_decl *)(ggc_internal_alloc_stat (sizeof (struct tree_parm_decl) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_parm_decl() ((struct tree_parm_decl *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_parm_decl) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_parm_decl(n) ((struct tree_parm_decl *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_parm_decl), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_parm_decl(n) ((struct tree_parm_decl *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_parm_decl), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_const_decl() ((struct tree_const_decl *)(ggc_internal_alloc_stat (sizeof (struct tree_const_decl) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_const_decl() ((struct tree_const_decl *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_const_decl) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_const_decl(n) ((struct tree_const_decl *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_const_decl), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_const_decl(n) ((struct tree_const_decl *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_const_decl), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_result_decl() ((struct tree_result_decl *)(ggc_internal_alloc_stat (sizeof (struct tree_result_decl) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_result_decl() ((struct tree_result_decl *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_result_decl) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_result_decl(n) ((struct tree_result_decl *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_result_decl), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_result_decl(n) ((struct tree_result_decl *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_result_decl), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_label_decl() ((struct tree_label_decl *)(ggc_internal_alloc_stat (sizeof (struct tree_label_decl) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_label_decl() ((struct tree_label_decl *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_label_decl) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_label_decl(n) ((struct tree_label_decl *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_label_decl), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_label_decl(n) ((struct tree_label_decl *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_label_decl), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_field_decl() ((struct tree_field_decl *)(ggc_internal_alloc_stat (sizeof (struct tree_field_decl) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_field_decl() ((struct tree_field_decl *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_field_decl) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_field_decl(n) ((struct tree_field_decl *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_field_decl), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_field_decl(n) ((struct tree_field_decl *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_field_decl), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_decl_with_rtl() ((struct tree_decl_with_rtl *)(ggc_internal_alloc_stat (sizeof (struct tree_decl_with_rtl) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_decl_with_rtl() ((struct tree_decl_with_rtl *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_decl_with_rtl) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_decl_with_rtl(n) ((struct tree_decl_with_rtl *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_decl_with_rtl), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_decl_with_rtl(n) ((struct tree_decl_with_rtl *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_decl_with_rtl), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_decl_common() ((struct tree_decl_common *)(ggc_internal_alloc_stat (sizeof (struct tree_decl_common) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_decl_common() ((struct tree_decl_common *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_decl_common) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_decl_common(n) ((struct tree_decl_common *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_decl_common), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_decl_common(n) ((struct tree_decl_common *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_decl_common), n MEM_STAT_INFO)))
-#define ggc_alloc_lang_decl(SIZE) ((struct lang_decl *)(ggc_internal_alloc_stat (SIZE MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lang_decl(SIZE) ((struct lang_decl *)(ggc_internal_cleared_alloc_stat (SIZE MEM_STAT_INFO)))
-#define ggc_alloc_vec_lang_decl(SIZE, n) ((struct lang_decl *)(ggc_internal_vec_alloc_stat (SIZE, n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lang_decl(SIZE, n) ((struct lang_decl *)(ggc_internal_cleared_vec_alloc_stat (SIZE, n MEM_STAT_INFO)))
-#define ggc_alloc_tree_decl_minimal() ((struct tree_decl_minimal *)(ggc_internal_alloc_stat (sizeof (struct tree_decl_minimal) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_decl_minimal() ((struct tree_decl_minimal *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_decl_minimal) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_decl_minimal(n) ((struct tree_decl_minimal *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_decl_minimal), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_decl_minimal(n) ((struct tree_decl_minimal *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_decl_minimal), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_binfo() ((struct tree_binfo *)(ggc_internal_alloc_stat (sizeof (struct tree_binfo) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_binfo() ((struct tree_binfo *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_binfo) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_binfo(n) ((struct tree_binfo *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_binfo), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_binfo(n) ((struct tree_binfo *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_binfo), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_type_non_common() ((struct tree_type_non_common *)(ggc_internal_alloc_stat (sizeof (struct tree_type_non_common) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_type_non_common() ((struct tree_type_non_common *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_type_non_common) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_type_non_common(n) ((struct tree_type_non_common *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_type_non_common), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_type_non_common(n) ((struct tree_type_non_common *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_type_non_common), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_type_with_lang_specific() ((struct tree_type_with_lang_specific *)(ggc_internal_alloc_stat (sizeof (struct tree_type_with_lang_specific) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_type_with_lang_specific() ((struct tree_type_with_lang_specific *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_type_with_lang_specific) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_type_with_lang_specific(n) ((struct tree_type_with_lang_specific *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_type_with_lang_specific), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_type_with_lang_specific(n) ((struct tree_type_with_lang_specific *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_type_with_lang_specific), n MEM_STAT_INFO)))
-#define ggc_alloc_lang_type(SIZE) ((struct lang_type *)(ggc_internal_alloc_stat (SIZE MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lang_type(SIZE) ((struct lang_type *)(ggc_internal_cleared_alloc_stat (SIZE MEM_STAT_INFO)))
-#define ggc_alloc_vec_lang_type(SIZE, n) ((struct lang_type *)(ggc_internal_vec_alloc_stat (SIZE, n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lang_type(SIZE, n) ((struct lang_type *)(ggc_internal_cleared_vec_alloc_stat (SIZE, n MEM_STAT_INFO)))
-#define ggc_alloc_tree_type_common() ((struct tree_type_common *)(ggc_internal_alloc_stat (sizeof (struct tree_type_common) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_type_common() ((struct tree_type_common *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_type_common) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_type_common(n) ((struct tree_type_common *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_type_common), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_type_common(n) ((struct tree_type_common *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_type_common), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_type_symtab() ((union tree_type_symtab *)(ggc_internal_alloc_stat (sizeof (union tree_type_symtab) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_type_symtab() ((union tree_type_symtab *)(ggc_internal_cleared_alloc_stat (sizeof (union tree_type_symtab) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_type_symtab(n) ((union tree_type_symtab *)(ggc_internal_vec_alloc_stat (sizeof (union tree_type_symtab), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_type_symtab(n) ((union tree_type_symtab *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union tree_type_symtab), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_block() ((struct tree_block *)(ggc_internal_alloc_stat (sizeof (struct tree_block) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_block() ((struct tree_block *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_block) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_block(n) ((struct tree_block *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_block), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_block(n) ((struct tree_block *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_block), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_va_gc_() ((vec<tree,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<tree,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_va_gc_() ((vec<tree,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<tree,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_tree_va_gc_(n) ((vec<tree,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<tree,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_tree_va_gc_(n) ((vec<tree,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<tree,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_omp_clause() ((struct tree_omp_clause *)(ggc_internal_alloc_stat (sizeof (struct tree_omp_clause) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_omp_clause() ((struct tree_omp_clause *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_omp_clause) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_omp_clause(n) ((struct tree_omp_clause *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_omp_clause), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_omp_clause(n) ((struct tree_omp_clause *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_omp_clause), n MEM_STAT_INFO)))
-#define ggc_alloc_phi_arg_d() ((struct phi_arg_d *)(ggc_internal_alloc_stat (sizeof (struct phi_arg_d) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_phi_arg_d() ((struct phi_arg_d *)(ggc_internal_cleared_alloc_stat (sizeof (struct phi_arg_d) MEM_STAT_INFO)))
-#define ggc_alloc_vec_phi_arg_d(n) ((struct phi_arg_d *)(ggc_internal_vec_alloc_stat (sizeof (struct phi_arg_d), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_phi_arg_d(n) ((struct phi_arg_d *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct phi_arg_d), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_ssa_name() ((struct tree_ssa_name *)(ggc_internal_alloc_stat (sizeof (struct tree_ssa_name) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_ssa_name() ((struct tree_ssa_name *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_ssa_name) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_ssa_name(n) ((struct tree_ssa_name *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_ssa_name), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_ssa_name(n) ((struct tree_ssa_name *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_ssa_name), n MEM_STAT_INFO)))
-#define ggc_alloc_ssa_name_info_type() ((union ssa_name_info_type *)(ggc_internal_alloc_stat (sizeof (union ssa_name_info_type) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ssa_name_info_type() ((union ssa_name_info_type *)(ggc_internal_cleared_alloc_stat (sizeof (union ssa_name_info_type) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ssa_name_info_type(n) ((union ssa_name_info_type *)(ggc_internal_vec_alloc_stat (sizeof (union ssa_name_info_type), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ssa_name_info_type(n) ((union ssa_name_info_type *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union ssa_name_info_type), n MEM_STAT_INFO)))
-#define ggc_alloc_ssa_use_operand_t() ((struct ssa_use_operand_t *)(ggc_internal_alloc_stat (sizeof (struct ssa_use_operand_t) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ssa_use_operand_t() ((struct ssa_use_operand_t *)(ggc_internal_cleared_alloc_stat (sizeof (struct ssa_use_operand_t) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ssa_use_operand_t(n) ((struct ssa_use_operand_t *)(ggc_internal_vec_alloc_stat (sizeof (struct ssa_use_operand_t), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ssa_use_operand_t(n) ((struct ssa_use_operand_t *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct ssa_use_operand_t), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_exp() ((struct tree_exp *)(ggc_internal_alloc_stat (sizeof (struct tree_exp) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_exp() ((struct tree_exp *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_exp) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_exp(n) ((struct tree_exp *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_exp), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_exp(n) ((struct tree_exp *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_exp), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_exp_subunion() ((union tree_exp_subunion *)(ggc_internal_alloc_stat (sizeof (union tree_exp_subunion) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_exp_subunion() ((union tree_exp_subunion *)(ggc_internal_cleared_alloc_stat (sizeof (union tree_exp_subunion) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_exp_subunion(n) ((union tree_exp_subunion *)(ggc_internal_vec_alloc_stat (sizeof (union tree_exp_subunion), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_exp_subunion(n) ((union tree_exp_subunion *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union tree_exp_subunion), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_constructor() ((struct tree_constructor *)(ggc_internal_alloc_stat (sizeof (struct tree_constructor) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_constructor() ((struct tree_constructor *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_constructor) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_constructor(n) ((struct tree_constructor *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_constructor), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_constructor(n) ((struct tree_constructor *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_constructor), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_constructor_elt_va_gc_() ((vec<constructor_elt,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<constructor_elt,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_constructor_elt_va_gc_() ((vec<constructor_elt,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<constructor_elt,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_constructor_elt_va_gc_(n) ((vec<constructor_elt,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<constructor_elt,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_constructor_elt_va_gc_(n) ((vec<constructor_elt,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<constructor_elt,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_constructor_elt() ((struct constructor_elt *)(ggc_internal_alloc_stat (sizeof (struct constructor_elt) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_constructor_elt() ((struct constructor_elt *)(ggc_internal_cleared_alloc_stat (sizeof (struct constructor_elt) MEM_STAT_INFO)))
-#define ggc_alloc_vec_constructor_elt(n) ((struct constructor_elt *)(ggc_internal_vec_alloc_stat (sizeof (struct constructor_elt), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_constructor_elt(n) ((struct constructor_elt *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct constructor_elt), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_vec() ((struct tree_vec *)(ggc_internal_alloc_stat (sizeof (struct tree_vec) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_vec() ((struct tree_vec *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_vec) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_vec(n) ((struct tree_vec *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_vec), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_vec(n) ((struct tree_vec *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_vec), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_list() ((struct tree_list *)(ggc_internal_alloc_stat (sizeof (struct tree_list) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_list() ((struct tree_list *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_list) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_list(n) ((struct tree_list *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_list), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_list(n) ((struct tree_list *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_list), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_identifier() ((struct tree_identifier *)(ggc_internal_alloc_stat (sizeof (struct tree_identifier) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_identifier() ((struct tree_identifier *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_identifier) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_identifier(n) ((struct tree_identifier *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_identifier), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_identifier(n) ((struct tree_identifier *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_identifier), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_vector() ((struct tree_vector *)(ggc_internal_alloc_stat (sizeof (struct tree_vector) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_vector() ((struct tree_vector *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_vector) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_vector(n) ((struct tree_vector *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_vector), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_vector(n) ((struct tree_vector *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_vector), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_complex() ((struct tree_complex *)(ggc_internal_alloc_stat (sizeof (struct tree_complex) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_complex() ((struct tree_complex *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_complex) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_complex(n) ((struct tree_complex *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_complex), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_complex(n) ((struct tree_complex *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_complex), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_string() ((struct tree_string *)(ggc_internal_alloc_stat (sizeof (struct tree_string) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_string() ((struct tree_string *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_string) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_string(n) ((struct tree_string *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_string), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_string(n) ((struct tree_string *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_string), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_fixed_cst() ((struct tree_fixed_cst *)(ggc_internal_alloc_stat (sizeof (struct tree_fixed_cst) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_fixed_cst() ((struct tree_fixed_cst *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_fixed_cst) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_fixed_cst(n) ((struct tree_fixed_cst *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_fixed_cst), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_fixed_cst(n) ((struct tree_fixed_cst *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_fixed_cst), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_real_cst() ((struct tree_real_cst *)(ggc_internal_alloc_stat (sizeof (struct tree_real_cst) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_real_cst() ((struct tree_real_cst *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_real_cst) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_real_cst(n) ((struct tree_real_cst *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_real_cst), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_real_cst(n) ((struct tree_real_cst *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_real_cst), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_int_cst() ((struct tree_int_cst *)(ggc_internal_alloc_stat (sizeof (struct tree_int_cst) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_int_cst() ((struct tree_int_cst *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_int_cst) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_int_cst(n) ((struct tree_int_cst *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_int_cst), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_int_cst(n) ((struct tree_int_cst *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_int_cst), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_common() ((struct tree_common *)(ggc_internal_alloc_stat (sizeof (struct tree_common) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_common() ((struct tree_common *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_common) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_common(n) ((struct tree_common *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_common), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_common(n) ((struct tree_common *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_common), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_typed() ((struct tree_typed *)(ggc_internal_alloc_stat (sizeof (struct tree_typed) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_typed() ((struct tree_typed *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_typed) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_typed(n) ((struct tree_typed *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_typed), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_typed(n) ((struct tree_typed *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_typed), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_base() ((struct tree_base *)(ggc_internal_alloc_stat (sizeof (struct tree_base) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_base() ((struct tree_base *)(ggc_internal_cleared_alloc_stat (sizeof (struct tree_base) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_base(n) ((struct tree_base *)(ggc_internal_vec_alloc_stat (sizeof (struct tree_base), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_base(n) ((struct tree_base *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct tree_base), n MEM_STAT_INFO)))
-#define ggc_alloc_alias_pair() ((struct alias_pair *)(ggc_internal_alloc_stat (sizeof (struct alias_pair) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_alias_pair() ((struct alias_pair *)(ggc_internal_cleared_alloc_stat (sizeof (struct alias_pair) MEM_STAT_INFO)))
-#define ggc_alloc_vec_alias_pair(n) ((struct alias_pair *)(ggc_internal_vec_alloc_stat (sizeof (struct alias_pair), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_alias_pair(n) ((struct alias_pair *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct alias_pair), n MEM_STAT_INFO)))
-#define ggc_alloc_die_struct() ((struct die_struct *)(ggc_internal_alloc_stat (sizeof (struct die_struct) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_die_struct() ((struct die_struct *)(ggc_internal_cleared_alloc_stat (sizeof (struct die_struct) MEM_STAT_INFO)))
-#define ggc_alloc_vec_die_struct(n) ((struct die_struct *)(ggc_internal_vec_alloc_stat (sizeof (struct die_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_die_struct(n) ((struct die_struct *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct die_struct), n MEM_STAT_INFO)))
-#define ggc_alloc_range_info_def() ((struct range_info_def *)(ggc_internal_alloc_stat (sizeof (struct range_info_def) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_range_info_def() ((struct range_info_def *)(ggc_internal_cleared_alloc_stat (sizeof (struct range_info_def) MEM_STAT_INFO)))
-#define ggc_alloc_vec_range_info_def(n) ((struct range_info_def *)(ggc_internal_vec_alloc_stat (sizeof (struct range_info_def), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_range_info_def(n) ((struct range_info_def *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct range_info_def), n MEM_STAT_INFO)))
-#define ggc_alloc_ptr_info_def() ((struct ptr_info_def *)(ggc_internal_alloc_stat (sizeof (struct ptr_info_def) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ptr_info_def() ((struct ptr_info_def *)(ggc_internal_cleared_alloc_stat (sizeof (struct ptr_info_def) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ptr_info_def(n) ((struct ptr_info_def *)(ggc_internal_vec_alloc_stat (sizeof (struct ptr_info_def), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ptr_info_def(n) ((struct ptr_info_def *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct ptr_info_def), n MEM_STAT_INFO)))
-#define ggc_alloc_target_rtl() ((struct target_rtl *)(ggc_internal_alloc_stat (sizeof (struct target_rtl) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_target_rtl() ((struct target_rtl *)(ggc_internal_cleared_alloc_stat (sizeof (struct target_rtl) MEM_STAT_INFO)))
-#define ggc_alloc_vec_target_rtl(n) ((struct target_rtl *)(ggc_internal_vec_alloc_stat (sizeof (struct target_rtl), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_target_rtl(n) ((struct target_rtl *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct target_rtl), n MEM_STAT_INFO)))
-#define ggc_alloc_function() ((struct function *)(ggc_internal_alloc_stat (sizeof (struct function) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_function() ((struct function *)(ggc_internal_cleared_alloc_stat (sizeof (struct function) MEM_STAT_INFO)))
-#define ggc_alloc_vec_function(n) ((struct function *)(ggc_internal_vec_alloc_stat (sizeof (struct function), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_function(n) ((struct function *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct function), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_subunion() ((union rtx_def_subunion *)(ggc_internal_alloc_stat (sizeof (union rtx_def_subunion) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_subunion() ((union rtx_def_subunion *)(ggc_internal_cleared_alloc_stat (sizeof (union rtx_def_subunion) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_subunion(n) ((union rtx_def_subunion *)(ggc_internal_vec_alloc_stat (sizeof (union rtx_def_subunion), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_subunion(n) ((union rtx_def_subunion *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union rtx_def_subunion), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_debug_parameter_ref() ((struct rtx_def_debug_parameter_ref *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_debug_parameter_ref) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_debug_parameter_ref() ((struct rtx_def_debug_parameter_ref *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_debug_parameter_ref) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_debug_parameter_ref(n) ((struct rtx_def_debug_parameter_ref *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_debug_parameter_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_debug_parameter_ref(n) ((struct rtx_def_debug_parameter_ref *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_debug_parameter_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_entry_value() ((struct rtx_def_entry_value *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_entry_value) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_entry_value() ((struct rtx_def_entry_value *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_entry_value) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_entry_value(n) ((struct rtx_def_entry_value *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_entry_value), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_entry_value(n) ((struct rtx_def_entry_value *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_entry_value), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_debug_implicit_ptr() ((struct rtx_def_debug_implicit_ptr *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_debug_implicit_ptr) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_debug_implicit_ptr() ((struct rtx_def_debug_implicit_ptr *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_debug_implicit_ptr) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_debug_implicit_ptr(n) ((struct rtx_def_debug_implicit_ptr *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_debug_implicit_ptr), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_debug_implicit_ptr(n) ((struct rtx_def_debug_implicit_ptr *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_debug_implicit_ptr), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_var_location() ((struct rtx_def_var_location *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_var_location) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_var_location() ((struct rtx_def_var_location *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_var_location) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_var_location(n) ((struct rtx_def_var_location *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_var_location), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_var_location(n) ((struct rtx_def_var_location *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_var_location), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_fma() ((struct rtx_def_fma *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_fma) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_fma() ((struct rtx_def_fma *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_fma) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_fma(n) ((struct rtx_def_fma *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_fma), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_fma(n) ((struct rtx_def_fma *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_fma), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_us_truncate() ((struct rtx_def_us_truncate *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_us_truncate) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_us_truncate() ((struct rtx_def_us_truncate *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_us_truncate) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_us_truncate(n) ((struct rtx_def_us_truncate *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_us_truncate), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_us_truncate(n) ((struct rtx_def_us_truncate *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_us_truncate), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_ss_truncate() ((struct rtx_def_ss_truncate *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_ss_truncate) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_ss_truncate() ((struct rtx_def_ss_truncate *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_ss_truncate) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_ss_truncate(n) ((struct rtx_def_ss_truncate *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_ss_truncate), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_ss_truncate(n) ((struct rtx_def_ss_truncate *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_ss_truncate), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_us_minus() ((struct rtx_def_us_minus *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_us_minus) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_us_minus() ((struct rtx_def_us_minus *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_us_minus) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_us_minus(n) ((struct rtx_def_us_minus *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_us_minus), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_us_minus(n) ((struct rtx_def_us_minus *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_us_minus), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_us_ashift() ((struct rtx_def_us_ashift *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_us_ashift) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_us_ashift() ((struct rtx_def_us_ashift *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_us_ashift) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_us_ashift(n) ((struct rtx_def_us_ashift *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_us_ashift), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_us_ashift(n) ((struct rtx_def_us_ashift *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_us_ashift), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_ss_ashift() ((struct rtx_def_ss_ashift *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_ss_ashift) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_ss_ashift() ((struct rtx_def_ss_ashift *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_ss_ashift) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_ss_ashift(n) ((struct rtx_def_ss_ashift *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_ss_ashift), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_ss_ashift(n) ((struct rtx_def_ss_ashift *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_ss_ashift), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_ss_abs() ((struct rtx_def_ss_abs *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_ss_abs) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_ss_abs() ((struct rtx_def_ss_abs *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_ss_abs) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_ss_abs(n) ((struct rtx_def_ss_abs *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_ss_abs), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_ss_abs(n) ((struct rtx_def_ss_abs *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_ss_abs), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_us_neg() ((struct rtx_def_us_neg *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_us_neg) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_us_neg() ((struct rtx_def_us_neg *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_us_neg) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_us_neg(n) ((struct rtx_def_us_neg *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_us_neg), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_us_neg(n) ((struct rtx_def_us_neg *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_us_neg), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_ss_neg() ((struct rtx_def_ss_neg *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_ss_neg) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_ss_neg() ((struct rtx_def_ss_neg *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_ss_neg) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_ss_neg(n) ((struct rtx_def_ss_neg *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_ss_neg), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_ss_neg(n) ((struct rtx_def_ss_neg *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_ss_neg), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_ss_minus() ((struct rtx_def_ss_minus *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_ss_minus) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_ss_minus() ((struct rtx_def_ss_minus *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_ss_minus) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_ss_minus(n) ((struct rtx_def_ss_minus *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_ss_minus), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_ss_minus(n) ((struct rtx_def_ss_minus *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_ss_minus), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_us_plus() ((struct rtx_def_us_plus *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_us_plus) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_us_plus() ((struct rtx_def_us_plus *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_us_plus) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_us_plus(n) ((struct rtx_def_us_plus *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_us_plus), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_us_plus(n) ((struct rtx_def_us_plus *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_us_plus), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_ss_plus() ((struct rtx_def_ss_plus *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_ss_plus) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_ss_plus() ((struct rtx_def_ss_plus *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_ss_plus) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_ss_plus(n) ((struct rtx_def_ss_plus *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_ss_plus), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_ss_plus(n) ((struct rtx_def_ss_plus *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_ss_plus), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_vec_duplicate() ((struct rtx_def_vec_duplicate *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_vec_duplicate) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_vec_duplicate() ((struct rtx_def_vec_duplicate *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_vec_duplicate) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_vec_duplicate(n) ((struct rtx_def_vec_duplicate *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_vec_duplicate), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_vec_duplicate(n) ((struct rtx_def_vec_duplicate *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_vec_duplicate), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_vec_concat() ((struct rtx_def_vec_concat *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_vec_concat) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_vec_concat() ((struct rtx_def_vec_concat *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_vec_concat) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_vec_concat(n) ((struct rtx_def_vec_concat *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_vec_concat), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_vec_concat(n) ((struct rtx_def_vec_concat *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_vec_concat), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_vec_select() ((struct rtx_def_vec_select *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_vec_select) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_vec_select() ((struct rtx_def_vec_select *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_vec_select) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_vec_select(n) ((struct rtx_def_vec_select *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_vec_select), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_vec_select(n) ((struct rtx_def_vec_select *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_vec_select), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_vec_merge() ((struct rtx_def_vec_merge *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_vec_merge) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_vec_merge() ((struct rtx_def_vec_merge *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_vec_merge) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_vec_merge(n) ((struct rtx_def_vec_merge *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_vec_merge), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_vec_merge(n) ((struct rtx_def_vec_merge *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_vec_merge), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_lo_sum() ((struct rtx_def_lo_sum *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_lo_sum) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_lo_sum() ((struct rtx_def_lo_sum *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_lo_sum) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_lo_sum(n) ((struct rtx_def_lo_sum *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_lo_sum), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_lo_sum(n) ((struct rtx_def_lo_sum *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_lo_sum), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_high() ((struct rtx_def_high *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_high) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_high() ((struct rtx_def_high *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_high) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_high(n) ((struct rtx_def_high *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_high), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_high(n) ((struct rtx_def_high *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_high), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_zero_extract() ((struct rtx_def_zero_extract *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_zero_extract) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_zero_extract() ((struct rtx_def_zero_extract *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_zero_extract) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_zero_extract(n) ((struct rtx_def_zero_extract *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_zero_extract), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_zero_extract(n) ((struct rtx_def_zero_extract *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_zero_extract), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_sign_extract() ((struct rtx_def_sign_extract *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_sign_extract) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_sign_extract() ((struct rtx_def_sign_extract *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_sign_extract) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_sign_extract(n) ((struct rtx_def_sign_extract *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_sign_extract), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_sign_extract(n) ((struct rtx_def_sign_extract *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_sign_extract), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_parity() ((struct rtx_def_parity *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_parity) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_parity() ((struct rtx_def_parity *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_parity) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_parity(n) ((struct rtx_def_parity *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_parity), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_parity(n) ((struct rtx_def_parity *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_parity), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_popcount() ((struct rtx_def_popcount *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_popcount) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_popcount() ((struct rtx_def_popcount *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_popcount) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_popcount(n) ((struct rtx_def_popcount *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_popcount), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_popcount(n) ((struct rtx_def_popcount *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_popcount), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_ctz() ((struct rtx_def_ctz *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_ctz) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_ctz() ((struct rtx_def_ctz *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_ctz) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_ctz(n) ((struct rtx_def_ctz *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_ctz), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_ctz(n) ((struct rtx_def_ctz *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_ctz), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_clz() ((struct rtx_def_clz *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_clz) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_clz() ((struct rtx_def_clz *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_clz) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_clz(n) ((struct rtx_def_clz *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_clz), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_clz(n) ((struct rtx_def_clz *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_clz), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_clrsb() ((struct rtx_def_clrsb *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_clrsb) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_clrsb() ((struct rtx_def_clrsb *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_clrsb) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_clrsb(n) ((struct rtx_def_clrsb *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_clrsb), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_clrsb(n) ((struct rtx_def_clrsb *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_clrsb), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_ffs() ((struct rtx_def_ffs *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_ffs) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_ffs() ((struct rtx_def_ffs *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_ffs) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_ffs(n) ((struct rtx_def_ffs *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_ffs), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_ffs(n) ((struct rtx_def_ffs *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_ffs), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_bswap() ((struct rtx_def_bswap *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_bswap) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_bswap() ((struct rtx_def_bswap *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_bswap) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_bswap(n) ((struct rtx_def_bswap *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_bswap), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_bswap(n) ((struct rtx_def_bswap *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_bswap), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_sqrt() ((struct rtx_def_sqrt *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_sqrt) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_sqrt() ((struct rtx_def_sqrt *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_sqrt) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_sqrt(n) ((struct rtx_def_sqrt *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_sqrt), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_sqrt(n) ((struct rtx_def_sqrt *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_sqrt), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_abs() ((struct rtx_def_abs *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_abs) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_abs() ((struct rtx_def_abs *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_abs) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_abs(n) ((struct rtx_def_abs *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_abs), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_abs(n) ((struct rtx_def_abs *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_abs), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_unsigned_sat_fract() ((struct rtx_def_unsigned_sat_fract *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_unsigned_sat_fract) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_unsigned_sat_fract() ((struct rtx_def_unsigned_sat_fract *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_unsigned_sat_fract) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_unsigned_sat_fract(n) ((struct rtx_def_unsigned_sat_fract *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_unsigned_sat_fract), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_unsigned_sat_fract(n) ((struct rtx_def_unsigned_sat_fract *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_unsigned_sat_fract), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_sat_fract() ((struct rtx_def_sat_fract *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_sat_fract) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_sat_fract() ((struct rtx_def_sat_fract *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_sat_fract) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_sat_fract(n) ((struct rtx_def_sat_fract *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_sat_fract), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_sat_fract(n) ((struct rtx_def_sat_fract *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_sat_fract), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_unsigned_fract_convert() ((struct rtx_def_unsigned_fract_convert *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_unsigned_fract_convert) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_unsigned_fract_convert() ((struct rtx_def_unsigned_fract_convert *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_unsigned_fract_convert) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_unsigned_fract_convert(n) ((struct rtx_def_unsigned_fract_convert *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_unsigned_fract_convert), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_unsigned_fract_convert(n) ((struct rtx_def_unsigned_fract_convert *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_unsigned_fract_convert), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_fract_convert() ((struct rtx_def_fract_convert *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_fract_convert) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_fract_convert() ((struct rtx_def_fract_convert *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_fract_convert) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_fract_convert(n) ((struct rtx_def_fract_convert *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_fract_convert), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_fract_convert(n) ((struct rtx_def_fract_convert *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_fract_convert), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_unsigned_fix() ((struct rtx_def_unsigned_fix *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_unsigned_fix) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_unsigned_fix() ((struct rtx_def_unsigned_fix *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_unsigned_fix) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_unsigned_fix(n) ((struct rtx_def_unsigned_fix *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_unsigned_fix), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_unsigned_fix(n) ((struct rtx_def_unsigned_fix *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_unsigned_fix), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_unsigned_float() ((struct rtx_def_unsigned_float *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_unsigned_float) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_unsigned_float() ((struct rtx_def_unsigned_float *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_unsigned_float) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_unsigned_float(n) ((struct rtx_def_unsigned_float *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_unsigned_float), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_unsigned_float(n) ((struct rtx_def_unsigned_float *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_unsigned_float), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_fix() ((struct rtx_def_fix *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_fix) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_fix() ((struct rtx_def_fix *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_fix) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_fix(n) ((struct rtx_def_fix *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_fix), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_fix(n) ((struct rtx_def_fix *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_fix), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_float() ((struct rtx_def_float *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_float) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_float() ((struct rtx_def_float *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_float) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_float(n) ((struct rtx_def_float *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_float), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_float(n) ((struct rtx_def_float *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_float), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_float_truncate() ((struct rtx_def_float_truncate *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_float_truncate) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_float_truncate() ((struct rtx_def_float_truncate *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_float_truncate) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_float_truncate(n) ((struct rtx_def_float_truncate *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_float_truncate), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_float_truncate(n) ((struct rtx_def_float_truncate *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_float_truncate), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_float_extend() ((struct rtx_def_float_extend *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_float_extend) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_float_extend() ((struct rtx_def_float_extend *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_float_extend) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_float_extend(n) ((struct rtx_def_float_extend *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_float_extend), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_float_extend(n) ((struct rtx_def_float_extend *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_float_extend), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_truncate() ((struct rtx_def_truncate *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_truncate) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_truncate() ((struct rtx_def_truncate *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_truncate) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_truncate(n) ((struct rtx_def_truncate *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_truncate), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_truncate(n) ((struct rtx_def_truncate *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_truncate), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_zero_extend() ((struct rtx_def_zero_extend *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_zero_extend) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_zero_extend() ((struct rtx_def_zero_extend *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_zero_extend) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_zero_extend(n) ((struct rtx_def_zero_extend *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_zero_extend), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_zero_extend(n) ((struct rtx_def_zero_extend *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_zero_extend), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_sign_extend() ((struct rtx_def_sign_extend *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_sign_extend) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_sign_extend() ((struct rtx_def_sign_extend *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_sign_extend) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_sign_extend(n) ((struct rtx_def_sign_extend *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_sign_extend), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_sign_extend(n) ((struct rtx_def_sign_extend *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_sign_extend), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_ltgt() ((struct rtx_def_ltgt *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_ltgt) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_ltgt() ((struct rtx_def_ltgt *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_ltgt) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_ltgt(n) ((struct rtx_def_ltgt *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_ltgt), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_ltgt(n) ((struct rtx_def_ltgt *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_ltgt), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_unlt() ((struct rtx_def_unlt *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_unlt) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_unlt() ((struct rtx_def_unlt *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_unlt) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_unlt(n) ((struct rtx_def_unlt *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_unlt), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_unlt(n) ((struct rtx_def_unlt *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_unlt), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_unle() ((struct rtx_def_unle *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_unle) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_unle() ((struct rtx_def_unle *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_unle) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_unle(n) ((struct rtx_def_unle *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_unle), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_unle(n) ((struct rtx_def_unle *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_unle), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_ungt() ((struct rtx_def_ungt *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_ungt) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_ungt() ((struct rtx_def_ungt *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_ungt) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_ungt(n) ((struct rtx_def_ungt *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_ungt), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_ungt(n) ((struct rtx_def_ungt *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_ungt), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_unge() ((struct rtx_def_unge *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_unge) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_unge() ((struct rtx_def_unge *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_unge) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_unge(n) ((struct rtx_def_unge *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_unge), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_unge(n) ((struct rtx_def_unge *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_unge), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_uneq() ((struct rtx_def_uneq *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_uneq) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_uneq() ((struct rtx_def_uneq *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_uneq) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_uneq(n) ((struct rtx_def_uneq *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_uneq), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_uneq(n) ((struct rtx_def_uneq *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_uneq), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_ordered() ((struct rtx_def_ordered *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_ordered) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_ordered() ((struct rtx_def_ordered *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_ordered) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_ordered(n) ((struct rtx_def_ordered *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_ordered), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_ordered(n) ((struct rtx_def_ordered *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_ordered), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_unordered() ((struct rtx_def_unordered *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_unordered) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_unordered() ((struct rtx_def_unordered *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_unordered) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_unordered(n) ((struct rtx_def_unordered *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_unordered), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_unordered(n) ((struct rtx_def_unordered *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_unordered), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_ltu() ((struct rtx_def_ltu *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_ltu) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_ltu() ((struct rtx_def_ltu *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_ltu) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_ltu(n) ((struct rtx_def_ltu *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_ltu), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_ltu(n) ((struct rtx_def_ltu *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_ltu), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_leu() ((struct rtx_def_leu *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_leu) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_leu() ((struct rtx_def_leu *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_leu) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_leu(n) ((struct rtx_def_leu *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_leu), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_leu(n) ((struct rtx_def_leu *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_leu), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_gtu() ((struct rtx_def_gtu *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_gtu) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_gtu() ((struct rtx_def_gtu *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_gtu) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_gtu(n) ((struct rtx_def_gtu *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_gtu), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_gtu(n) ((struct rtx_def_gtu *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_gtu), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_geu() ((struct rtx_def_geu *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_geu) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_geu() ((struct rtx_def_geu *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_geu) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_geu(n) ((struct rtx_def_geu *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_geu), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_geu(n) ((struct rtx_def_geu *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_geu), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_lt() ((struct rtx_def_lt *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_lt) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_lt() ((struct rtx_def_lt *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_lt) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_lt(n) ((struct rtx_def_lt *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_lt), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_lt(n) ((struct rtx_def_lt *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_lt), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_le() ((struct rtx_def_le *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_le) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_le() ((struct rtx_def_le *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_le) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_le(n) ((struct rtx_def_le *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_le), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_le(n) ((struct rtx_def_le *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_le), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_gt() ((struct rtx_def_gt *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_gt) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_gt() ((struct rtx_def_gt *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_gt) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_gt(n) ((struct rtx_def_gt *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_gt), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_gt(n) ((struct rtx_def_gt *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_gt), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_ge() ((struct rtx_def_ge *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_ge) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_ge() ((struct rtx_def_ge *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_ge) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_ge(n) ((struct rtx_def_ge *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_ge), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_ge(n) ((struct rtx_def_ge *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_ge), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_eq() ((struct rtx_def_eq *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_eq) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_eq() ((struct rtx_def_eq *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_eq) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_eq(n) ((struct rtx_def_eq *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_eq), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_eq(n) ((struct rtx_def_eq *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_eq), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_ne() ((struct rtx_def_ne *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_ne) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_ne() ((struct rtx_def_ne *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_ne) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_ne(n) ((struct rtx_def_ne *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_ne), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_ne(n) ((struct rtx_def_ne *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_ne), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_post_modify() ((struct rtx_def_post_modify *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_post_modify) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_post_modify() ((struct rtx_def_post_modify *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_post_modify) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_post_modify(n) ((struct rtx_def_post_modify *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_post_modify), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_post_modify(n) ((struct rtx_def_post_modify *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_post_modify), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_pre_modify() ((struct rtx_def_pre_modify *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_pre_modify) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_pre_modify() ((struct rtx_def_pre_modify *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_pre_modify) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_pre_modify(n) ((struct rtx_def_pre_modify *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_pre_modify), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_pre_modify(n) ((struct rtx_def_pre_modify *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_pre_modify), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_post_inc() ((struct rtx_def_post_inc *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_post_inc) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_post_inc() ((struct rtx_def_post_inc *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_post_inc) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_post_inc(n) ((struct rtx_def_post_inc *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_post_inc), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_post_inc(n) ((struct rtx_def_post_inc *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_post_inc), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_post_dec() ((struct rtx_def_post_dec *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_post_dec) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_post_dec() ((struct rtx_def_post_dec *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_post_dec) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_post_dec(n) ((struct rtx_def_post_dec *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_post_dec), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_post_dec(n) ((struct rtx_def_post_dec *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_post_dec), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_pre_inc() ((struct rtx_def_pre_inc *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_pre_inc) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_pre_inc() ((struct rtx_def_pre_inc *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_pre_inc) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_pre_inc(n) ((struct rtx_def_pre_inc *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_pre_inc), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_pre_inc(n) ((struct rtx_def_pre_inc *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_pre_inc), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_pre_dec() ((struct rtx_def_pre_dec *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_pre_dec) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_pre_dec() ((struct rtx_def_pre_dec *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_pre_dec) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_pre_dec(n) ((struct rtx_def_pre_dec *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_pre_dec), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_pre_dec(n) ((struct rtx_def_pre_dec *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_pre_dec), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_umax() ((struct rtx_def_umax *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_umax) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_umax() ((struct rtx_def_umax *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_umax) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_umax(n) ((struct rtx_def_umax *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_umax), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_umax(n) ((struct rtx_def_umax *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_umax), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_umin() ((struct rtx_def_umin *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_umin) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_umin() ((struct rtx_def_umin *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_umin) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_umin(n) ((struct rtx_def_umin *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_umin), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_umin(n) ((struct rtx_def_umin *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_umin), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_smax() ((struct rtx_def_smax *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_smax) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_smax() ((struct rtx_def_smax *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_smax) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_smax(n) ((struct rtx_def_smax *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_smax), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_smax(n) ((struct rtx_def_smax *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_smax), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_smin() ((struct rtx_def_smin *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_smin) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_smin() ((struct rtx_def_smin *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_smin) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_smin(n) ((struct rtx_def_smin *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_smin), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_smin(n) ((struct rtx_def_smin *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_smin), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_rotatert() ((struct rtx_def_rotatert *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_rotatert) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_rotatert() ((struct rtx_def_rotatert *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_rotatert) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_rotatert(n) ((struct rtx_def_rotatert *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_rotatert), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_rotatert(n) ((struct rtx_def_rotatert *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_rotatert), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_lshiftrt() ((struct rtx_def_lshiftrt *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_lshiftrt) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_lshiftrt() ((struct rtx_def_lshiftrt *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_lshiftrt) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_lshiftrt(n) ((struct rtx_def_lshiftrt *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_lshiftrt), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_lshiftrt(n) ((struct rtx_def_lshiftrt *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_lshiftrt), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_ashiftrt() ((struct rtx_def_ashiftrt *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_ashiftrt) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_ashiftrt() ((struct rtx_def_ashiftrt *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_ashiftrt) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_ashiftrt(n) ((struct rtx_def_ashiftrt *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_ashiftrt), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_ashiftrt(n) ((struct rtx_def_ashiftrt *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_ashiftrt), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_rotate() ((struct rtx_def_rotate *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_rotate) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_rotate() ((struct rtx_def_rotate *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_rotate) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_rotate(n) ((struct rtx_def_rotate *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_rotate), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_rotate(n) ((struct rtx_def_rotate *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_rotate), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_ashift() ((struct rtx_def_ashift *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_ashift) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_ashift() ((struct rtx_def_ashift *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_ashift) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_ashift(n) ((struct rtx_def_ashift *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_ashift), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_ashift(n) ((struct rtx_def_ashift *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_ashift), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_not() ((struct rtx_def_not *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_not) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_not() ((struct rtx_def_not *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_not) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_not(n) ((struct rtx_def_not *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_not), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_not(n) ((struct rtx_def_not *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_not), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_xor() ((struct rtx_def_xor *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_xor) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_xor() ((struct rtx_def_xor *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_xor) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_xor(n) ((struct rtx_def_xor *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_xor), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_xor(n) ((struct rtx_def_xor *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_xor), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_ior() ((struct rtx_def_ior *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_ior) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_ior() ((struct rtx_def_ior *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_ior) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_ior(n) ((struct rtx_def_ior *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_ior), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_ior(n) ((struct rtx_def_ior *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_ior), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_and() ((struct rtx_def_and *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_and) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_and() ((struct rtx_def_and *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_and) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_and(n) ((struct rtx_def_and *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_and), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_and(n) ((struct rtx_def_and *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_and), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_umod() ((struct rtx_def_umod *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_umod) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_umod() ((struct rtx_def_umod *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_umod) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_umod(n) ((struct rtx_def_umod *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_umod), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_umod(n) ((struct rtx_def_umod *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_umod), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_udiv() ((struct rtx_def_udiv *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_udiv) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_udiv() ((struct rtx_def_udiv *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_udiv) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_udiv(n) ((struct rtx_def_udiv *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_udiv), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_udiv(n) ((struct rtx_def_udiv *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_udiv), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_mod() ((struct rtx_def_mod *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_mod) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_mod() ((struct rtx_def_mod *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_mod) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_mod(n) ((struct rtx_def_mod *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_mod), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_mod(n) ((struct rtx_def_mod *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_mod), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_us_div() ((struct rtx_def_us_div *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_us_div) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_us_div() ((struct rtx_def_us_div *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_us_div) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_us_div(n) ((struct rtx_def_us_div *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_us_div), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_us_div(n) ((struct rtx_def_us_div *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_us_div), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_ss_div() ((struct rtx_def_ss_div *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_ss_div) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_ss_div() ((struct rtx_def_ss_div *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_ss_div) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_ss_div(n) ((struct rtx_def_ss_div *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_ss_div), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_ss_div(n) ((struct rtx_def_ss_div *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_ss_div), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_div() ((struct rtx_def_div *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_div) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_div() ((struct rtx_def_div *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_div) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_div(n) ((struct rtx_def_div *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_div), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_div(n) ((struct rtx_def_div *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_div), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_us_mult() ((struct rtx_def_us_mult *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_us_mult) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_us_mult() ((struct rtx_def_us_mult *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_us_mult) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_us_mult(n) ((struct rtx_def_us_mult *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_us_mult), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_us_mult(n) ((struct rtx_def_us_mult *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_us_mult), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_ss_mult() ((struct rtx_def_ss_mult *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_ss_mult) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_ss_mult() ((struct rtx_def_ss_mult *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_ss_mult) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_ss_mult(n) ((struct rtx_def_ss_mult *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_ss_mult), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_ss_mult(n) ((struct rtx_def_ss_mult *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_ss_mult), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_mult() ((struct rtx_def_mult *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_mult) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_mult() ((struct rtx_def_mult *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_mult) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_mult(n) ((struct rtx_def_mult *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_mult), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_mult(n) ((struct rtx_def_mult *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_mult), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_neg() ((struct rtx_def_neg *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_neg) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_neg() ((struct rtx_def_neg *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_neg) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_neg(n) ((struct rtx_def_neg *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_neg), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_neg(n) ((struct rtx_def_neg *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_neg), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_minus() ((struct rtx_def_minus *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_minus) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_minus() ((struct rtx_def_minus *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_minus) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_minus(n) ((struct rtx_def_minus *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_minus), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_minus(n) ((struct rtx_def_minus *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_minus), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_plus() ((struct rtx_def_plus *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_plus) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_plus() ((struct rtx_def_plus *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_plus) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_plus(n) ((struct rtx_def_plus *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_plus), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_plus(n) ((struct rtx_def_plus *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_plus), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_compare() ((struct rtx_def_compare *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_compare) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_compare() ((struct rtx_def_compare *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_compare) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_compare(n) ((struct rtx_def_compare *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_compare), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_compare(n) ((struct rtx_def_compare *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_compare), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_if_then_else() ((struct rtx_def_if_then_else *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_if_then_else) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_if_then_else() ((struct rtx_def_if_then_else *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_if_then_else) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_if_then_else(n) ((struct rtx_def_if_then_else *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_if_then_else), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_if_then_else(n) ((struct rtx_def_if_then_else *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_if_then_else), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_cc0() ((struct rtx_def_cc0 *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_cc0) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_cc0() ((struct rtx_def_cc0 *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_cc0) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_cc0(n) ((struct rtx_def_cc0 *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_cc0), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_cc0(n) ((struct rtx_def_cc0 *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_cc0), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_symbol_ref() ((struct rtx_def_symbol_ref *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_symbol_ref) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_symbol_ref() ((struct rtx_def_symbol_ref *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_symbol_ref) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_symbol_ref(n) ((struct rtx_def_symbol_ref *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_symbol_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_symbol_ref(n) ((struct rtx_def_symbol_ref *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_symbol_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_fake_union_1() ((union fake_union_1 *)(ggc_internal_alloc_stat (sizeof (union fake_union_1) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_fake_union_1() ((union fake_union_1 *)(ggc_internal_cleared_alloc_stat (sizeof (union fake_union_1) MEM_STAT_INFO)))
-#define ggc_alloc_vec_fake_union_1(n) ((union fake_union_1 *)(ggc_internal_vec_alloc_stat (sizeof (union fake_union_1), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_fake_union_1(n) ((union fake_union_1 *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union fake_union_1), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_label_ref() ((struct rtx_def_label_ref *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_label_ref) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_label_ref() ((struct rtx_def_label_ref *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_label_ref) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_label_ref(n) ((struct rtx_def_label_ref *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_label_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_label_ref(n) ((struct rtx_def_label_ref *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_label_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_mem() ((struct rtx_def_mem *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_mem) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_mem() ((struct rtx_def_mem *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_mem) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_mem(n) ((struct rtx_def_mem *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_mem), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_mem(n) ((struct rtx_def_mem *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_mem), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_concatn() ((struct rtx_def_concatn *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_concatn) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_concatn() ((struct rtx_def_concatn *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_concatn) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_concatn(n) ((struct rtx_def_concatn *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_concatn), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_concatn(n) ((struct rtx_def_concatn *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_concatn), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_concat() ((struct rtx_def_concat *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_concat) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_concat() ((struct rtx_def_concat *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_concat) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_concat(n) ((struct rtx_def_concat *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_concat), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_concat(n) ((struct rtx_def_concat *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_concat), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_strict_low_part() ((struct rtx_def_strict_low_part *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_strict_low_part) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_strict_low_part() ((struct rtx_def_strict_low_part *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_strict_low_part) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_strict_low_part(n) ((struct rtx_def_strict_low_part *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_strict_low_part), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_strict_low_part(n) ((struct rtx_def_strict_low_part *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_strict_low_part), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_subreg() ((struct rtx_def_subreg *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_subreg) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_subreg() ((struct rtx_def_subreg *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_subreg) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_subreg(n) ((struct rtx_def_subreg *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_subreg), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_subreg(n) ((struct rtx_def_subreg *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_subreg), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_scratch() ((struct rtx_def_scratch *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_scratch) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_scratch() ((struct rtx_def_scratch *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_scratch) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_scratch(n) ((struct rtx_def_scratch *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_scratch), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_scratch(n) ((struct rtx_def_scratch *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_scratch), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_reg() ((struct rtx_def_reg *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_reg) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_reg() ((struct rtx_def_reg *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_reg) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_reg(n) ((struct rtx_def_reg *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_reg), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_reg(n) ((struct rtx_def_reg *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_reg), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_pc() ((struct rtx_def_pc *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_pc) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_pc() ((struct rtx_def_pc *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_pc) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_pc(n) ((struct rtx_def_pc *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_pc), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_pc(n) ((struct rtx_def_pc *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_pc), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_const() ((struct rtx_def_const *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_const) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_const() ((struct rtx_def_const *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_const) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_const(n) ((struct rtx_def_const *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_const), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_const(n) ((struct rtx_def_const *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_const), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_const_string() ((struct rtx_def_const_string *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_const_string) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_const_string() ((struct rtx_def_const_string *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_const_string) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_const_string(n) ((struct rtx_def_const_string *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_const_string), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_const_string(n) ((struct rtx_def_const_string *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_const_string), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_const_vector() ((struct rtx_def_const_vector *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_const_vector) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_const_vector() ((struct rtx_def_const_vector *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_const_vector) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_const_vector(n) ((struct rtx_def_const_vector *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_const_vector), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_const_vector(n) ((struct rtx_def_const_vector *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_const_vector), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_const_double() ((struct rtx_def_const_double *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_const_double) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_const_double() ((struct rtx_def_const_double *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_const_double) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_const_double(n) ((struct rtx_def_const_double *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_const_double), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_const_double(n) ((struct rtx_def_const_double *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_const_double), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_const_fixed() ((struct rtx_def_const_fixed *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_const_fixed) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_const_fixed() ((struct rtx_def_const_fixed *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_const_fixed) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_const_fixed(n) ((struct rtx_def_const_fixed *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_const_fixed), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_const_fixed(n) ((struct rtx_def_const_fixed *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_const_fixed), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_const_int() ((struct rtx_def_const_int *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_const_int) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_const_int() ((struct rtx_def_const_int *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_const_int) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_const_int(n) ((struct rtx_def_const_int *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_const_int), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_const_int(n) ((struct rtx_def_const_int *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_const_int), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_trap_if() ((struct rtx_def_trap_if *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_trap_if) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_trap_if() ((struct rtx_def_trap_if *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_trap_if) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_trap_if(n) ((struct rtx_def_trap_if *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_trap_if), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_trap_if(n) ((struct rtx_def_trap_if *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_trap_if), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_eh_return() ((struct rtx_def_eh_return *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_eh_return) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_eh_return() ((struct rtx_def_eh_return *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_eh_return) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_eh_return(n) ((struct rtx_def_eh_return *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_eh_return), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_eh_return(n) ((struct rtx_def_eh_return *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_eh_return), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_simple_return() ((struct rtx_def_simple_return *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_simple_return) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_simple_return() ((struct rtx_def_simple_return *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_simple_return) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_simple_return(n) ((struct rtx_def_simple_return *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_simple_return), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_simple_return(n) ((struct rtx_def_simple_return *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_simple_return), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_return() ((struct rtx_def_return *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_return) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_return() ((struct rtx_def_return *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_return) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_return(n) ((struct rtx_def_return *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_return), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_return(n) ((struct rtx_def_return *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_return), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_call() ((struct rtx_def_call *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_call) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_call() ((struct rtx_def_call *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_call) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_call(n) ((struct rtx_def_call *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_call), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_call(n) ((struct rtx_def_call *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_call), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_clobber() ((struct rtx_def_clobber *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_clobber) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_clobber() ((struct rtx_def_clobber *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_clobber) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_clobber(n) ((struct rtx_def_clobber *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_clobber), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_clobber(n) ((struct rtx_def_clobber *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_clobber), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_use() ((struct rtx_def_use *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_use) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_use() ((struct rtx_def_use *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_use) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_use(n) ((struct rtx_def_use *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_use), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_use(n) ((struct rtx_def_use *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_use), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_set() ((struct rtx_def_set *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_set) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_set() ((struct rtx_def_set *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_set) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_set(n) ((struct rtx_def_set *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_set), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_set(n) ((struct rtx_def_set *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_set), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_prefetch() ((struct rtx_def_prefetch *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_prefetch) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_prefetch() ((struct rtx_def_prefetch *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_prefetch) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_prefetch(n) ((struct rtx_def_prefetch *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_prefetch), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_prefetch(n) ((struct rtx_def_prefetch *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_prefetch), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_addr_diff_vec() ((struct rtx_def_addr_diff_vec *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_addr_diff_vec) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_addr_diff_vec() ((struct rtx_def_addr_diff_vec *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_addr_diff_vec) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_addr_diff_vec(n) ((struct rtx_def_addr_diff_vec *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_addr_diff_vec), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_addr_diff_vec(n) ((struct rtx_def_addr_diff_vec *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_addr_diff_vec), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_addr_vec() ((struct rtx_def_addr_vec *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_addr_vec) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_addr_vec() ((struct rtx_def_addr_vec *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_addr_vec) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_addr_vec(n) ((struct rtx_def_addr_vec *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_addr_vec), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_addr_vec(n) ((struct rtx_def_addr_vec *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_addr_vec), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_unspec_volatile() ((struct rtx_def_unspec_volatile *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_unspec_volatile) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_unspec_volatile() ((struct rtx_def_unspec_volatile *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_unspec_volatile) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_unspec_volatile(n) ((struct rtx_def_unspec_volatile *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_unspec_volatile), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_unspec_volatile(n) ((struct rtx_def_unspec_volatile *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_unspec_volatile), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_unspec() ((struct rtx_def_unspec *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_unspec) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_unspec() ((struct rtx_def_unspec *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_unspec) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_unspec(n) ((struct rtx_def_unspec *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_unspec), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_unspec(n) ((struct rtx_def_unspec *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_unspec), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_asm_operands() ((struct rtx_def_asm_operands *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_asm_operands) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_asm_operands() ((struct rtx_def_asm_operands *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_asm_operands) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_asm_operands(n) ((struct rtx_def_asm_operands *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_asm_operands), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_asm_operands(n) ((struct rtx_def_asm_operands *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_asm_operands), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_asm_input() ((struct rtx_def_asm_input *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_asm_input) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_asm_input() ((struct rtx_def_asm_input *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_asm_input) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_asm_input(n) ((struct rtx_def_asm_input *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_asm_input), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_asm_input(n) ((struct rtx_def_asm_input *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_asm_input), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_parallel() ((struct rtx_def_parallel *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_parallel) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_parallel() ((struct rtx_def_parallel *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_parallel) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_parallel(n) ((struct rtx_def_parallel *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_parallel), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_parallel(n) ((struct rtx_def_parallel *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_parallel), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_cond_exec() ((struct rtx_def_cond_exec *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_cond_exec) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_cond_exec() ((struct rtx_def_cond_exec *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_cond_exec) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_cond_exec(n) ((struct rtx_def_cond_exec *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_cond_exec), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_cond_exec(n) ((struct rtx_def_cond_exec *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_cond_exec), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_note() ((struct rtx_def_note *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_note) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_note() ((struct rtx_def_note *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_note) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_note(n) ((struct rtx_def_note *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_note), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_note(n) ((struct rtx_def_note *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_note), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_code_label() ((struct rtx_def_code_label *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_code_label) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_code_label() ((struct rtx_def_code_label *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_code_label) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_code_label(n) ((struct rtx_def_code_label *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_code_label), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_code_label(n) ((struct rtx_def_code_label *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_code_label), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_barrier() ((struct rtx_def_barrier *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_barrier) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_barrier() ((struct rtx_def_barrier *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_barrier) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_barrier(n) ((struct rtx_def_barrier *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_barrier), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_barrier(n) ((struct rtx_def_barrier *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_barrier), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_jump_table_data() ((struct rtx_def_jump_table_data *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_jump_table_data) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_jump_table_data() ((struct rtx_def_jump_table_data *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_jump_table_data) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_jump_table_data(n) ((struct rtx_def_jump_table_data *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_jump_table_data), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_jump_table_data(n) ((struct rtx_def_jump_table_data *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_jump_table_data), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_call_insn() ((struct rtx_def_call_insn *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_call_insn) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_call_insn() ((struct rtx_def_call_insn *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_call_insn) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_call_insn(n) ((struct rtx_def_call_insn *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_call_insn), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_call_insn(n) ((struct rtx_def_call_insn *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_call_insn), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_jump_insn() ((struct rtx_def_jump_insn *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_jump_insn) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_jump_insn() ((struct rtx_def_jump_insn *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_jump_insn) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_jump_insn(n) ((struct rtx_def_jump_insn *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_jump_insn), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_jump_insn(n) ((struct rtx_def_jump_insn *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_jump_insn), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_insn() ((struct rtx_def_insn *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_insn) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_insn() ((struct rtx_def_insn *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_insn) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_insn(n) ((struct rtx_def_insn *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_insn), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_insn(n) ((struct rtx_def_insn *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_insn), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_debug_insn() ((struct rtx_def_debug_insn *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_debug_insn) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_debug_insn() ((struct rtx_def_debug_insn *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_debug_insn) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_debug_insn(n) ((struct rtx_def_debug_insn *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_debug_insn), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_debug_insn(n) ((struct rtx_def_debug_insn *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_debug_insn), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_address() ((struct rtx_def_address *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_address) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_address() ((struct rtx_def_address *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_address) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_address(n) ((struct rtx_def_address *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_address), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_address(n) ((struct rtx_def_address *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_address), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_sequence() ((struct rtx_def_sequence *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_sequence) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_sequence() ((struct rtx_def_sequence *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_sequence) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_sequence(n) ((struct rtx_def_sequence *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_sequence), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_sequence(n) ((struct rtx_def_sequence *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_sequence), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_int_list() ((struct rtx_def_int_list *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_int_list) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_int_list() ((struct rtx_def_int_list *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_int_list) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_int_list(n) ((struct rtx_def_int_list *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_int_list), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_int_list(n) ((struct rtx_def_int_list *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_int_list), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_insn_list() ((struct rtx_def_insn_list *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_insn_list) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_insn_list() ((struct rtx_def_insn_list *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_insn_list) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_insn_list(n) ((struct rtx_def_insn_list *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_insn_list), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_insn_list(n) ((struct rtx_def_insn_list *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_insn_list), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_expr_list() ((struct rtx_def_expr_list *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_expr_list) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_expr_list() ((struct rtx_def_expr_list *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_expr_list) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_expr_list(n) ((struct rtx_def_expr_list *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_expr_list), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_expr_list(n) ((struct rtx_def_expr_list *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_expr_list), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_debug_expr() ((struct rtx_def_debug_expr *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_debug_expr) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_debug_expr() ((struct rtx_def_debug_expr *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_debug_expr) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_debug_expr(n) ((struct rtx_def_debug_expr *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_debug_expr), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_debug_expr(n) ((struct rtx_def_debug_expr *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_debug_expr), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_value() ((struct rtx_def_value *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_value) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_value() ((struct rtx_def_value *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_value) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_value(n) ((struct rtx_def_value *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_value), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_value(n) ((struct rtx_def_value *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_value), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_UnKnown() ((struct rtx_def_UnKnown *)(ggc_internal_alloc_stat (sizeof (struct rtx_def_UnKnown) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_UnKnown() ((struct rtx_def_UnKnown *)(ggc_internal_cleared_alloc_stat (sizeof (struct rtx_def_UnKnown) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_UnKnown(n) ((struct rtx_def_UnKnown *)(ggc_internal_vec_alloc_stat (sizeof (struct rtx_def_UnKnown), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_UnKnown(n) ((struct rtx_def_UnKnown *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct rtx_def_UnKnown), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_symbol_subunion() ((union rtx_def_symbol_subunion *)(ggc_internal_alloc_stat (sizeof (union rtx_def_symbol_subunion) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_symbol_subunion() ((union rtx_def_symbol_subunion *)(ggc_internal_cleared_alloc_stat (sizeof (union rtx_def_symbol_subunion) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_symbol_subunion(n) ((union rtx_def_symbol_subunion *)(ggc_internal_vec_alloc_stat (sizeof (union rtx_def_symbol_subunion), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_symbol_subunion(n) ((union rtx_def_symbol_subunion *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union rtx_def_symbol_subunion), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def_note_subunion() ((union rtx_def_note_subunion *)(ggc_internal_alloc_stat (sizeof (union rtx_def_note_subunion) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def_note_subunion() ((union rtx_def_note_subunion *)(ggc_internal_cleared_alloc_stat (sizeof (union rtx_def_note_subunion) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def_note_subunion(n) ((union rtx_def_note_subunion *)(ggc_internal_vec_alloc_stat (sizeof (union rtx_def_note_subunion), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def_note_subunion(n) ((union rtx_def_note_subunion *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union rtx_def_note_subunion), n MEM_STAT_INFO)))
-#define ggc_alloc_constant_descriptor_rtx() ((struct constant_descriptor_rtx *)(ggc_internal_alloc_stat (sizeof (struct constant_descriptor_rtx) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_constant_descriptor_rtx() ((struct constant_descriptor_rtx *)(ggc_internal_cleared_alloc_stat (sizeof (struct constant_descriptor_rtx) MEM_STAT_INFO)))
-#define ggc_alloc_vec_constant_descriptor_rtx(n) ((struct constant_descriptor_rtx *)(ggc_internal_vec_alloc_stat (sizeof (struct constant_descriptor_rtx), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_constant_descriptor_rtx(n) ((struct constant_descriptor_rtx *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct constant_descriptor_rtx), n MEM_STAT_INFO)))
-#define ggc_alloc_fixed_value() ((struct fixed_value *)(ggc_internal_alloc_stat (sizeof (struct fixed_value) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_fixed_value() ((struct fixed_value *)(ggc_internal_cleared_alloc_stat (sizeof (struct fixed_value) MEM_STAT_INFO)))
-#define ggc_alloc_vec_fixed_value(n) ((struct fixed_value *)(ggc_internal_vec_alloc_stat (sizeof (struct fixed_value), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_fixed_value(n) ((struct fixed_value *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct fixed_value), n MEM_STAT_INFO)))
-#define ggc_alloc_real_value() ((struct real_value *)(ggc_internal_alloc_stat (sizeof (struct real_value) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_real_value() ((struct real_value *)(ggc_internal_cleared_alloc_stat (sizeof (struct real_value) MEM_STAT_INFO)))
-#define ggc_alloc_vec_real_value(n) ((struct real_value *)(ggc_internal_vec_alloc_stat (sizeof (struct real_value), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_real_value(n) ((struct real_value *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct real_value), n MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_va_gc_() ((vec<rtx,va_gc> *)(ggc_internal_alloc_stat (sizeof (vec<rtx,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_va_gc_() ((vec<rtx,va_gc> *)(ggc_internal_cleared_alloc_stat (sizeof (vec<rtx,va_gc>) MEM_STAT_INFO)))
-#define ggc_alloc_vec_vec_rtx_va_gc_(n) ((vec<rtx,va_gc> *)(ggc_internal_vec_alloc_stat (sizeof (vec<rtx,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_vec_rtx_va_gc_(n) ((vec<rtx,va_gc> *)(ggc_internal_cleared_vec_alloc_stat (sizeof (vec<rtx,va_gc>), n MEM_STAT_INFO)))
-#define ggc_alloc_block_symbol() ((struct block_symbol *)(ggc_internal_alloc_stat (sizeof (struct block_symbol) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_block_symbol() ((struct block_symbol *)(ggc_internal_cleared_alloc_stat (sizeof (struct block_symbol) MEM_STAT_INFO)))
-#define ggc_alloc_vec_block_symbol(n) ((struct block_symbol *)(ggc_internal_vec_alloc_stat (sizeof (struct block_symbol), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_block_symbol(n) ((struct block_symbol *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct block_symbol), n MEM_STAT_INFO)))
-#define ggc_alloc_object_block() ((struct object_block *)(ggc_internal_alloc_stat (sizeof (struct object_block) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_object_block() ((struct object_block *)(ggc_internal_cleared_alloc_stat (sizeof (struct object_block) MEM_STAT_INFO)))
-#define ggc_alloc_vec_object_block(n) ((struct object_block *)(ggc_internal_vec_alloc_stat (sizeof (struct object_block), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_object_block(n) ((struct object_block *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct object_block), n MEM_STAT_INFO)))
-#define ggc_alloc_reg_attrs() ((struct reg_attrs *)(ggc_internal_alloc_stat (sizeof (struct reg_attrs) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_reg_attrs() ((struct reg_attrs *)(ggc_internal_cleared_alloc_stat (sizeof (struct reg_attrs) MEM_STAT_INFO)))
-#define ggc_alloc_vec_reg_attrs(n) ((struct reg_attrs *)(ggc_internal_vec_alloc_stat (sizeof (struct reg_attrs), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_reg_attrs(n) ((struct reg_attrs *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct reg_attrs), n MEM_STAT_INFO)))
-#define ggc_alloc_mem_attrs() ((struct mem_attrs *)(ggc_internal_alloc_stat (sizeof (struct mem_attrs) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_mem_attrs() ((struct mem_attrs *)(ggc_internal_cleared_alloc_stat (sizeof (struct mem_attrs) MEM_STAT_INFO)))
-#define ggc_alloc_vec_mem_attrs(n) ((struct mem_attrs *)(ggc_internal_vec_alloc_stat (sizeof (struct mem_attrs), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_mem_attrs(n) ((struct mem_attrs *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct mem_attrs), n MEM_STAT_INFO)))
-#define ggc_alloc_coverage_data() ((struct coverage_data *)(ggc_internal_alloc_stat (sizeof (struct coverage_data) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_coverage_data() ((struct coverage_data *)(ggc_internal_cleared_alloc_stat (sizeof (struct coverage_data) MEM_STAT_INFO)))
-#define ggc_alloc_vec_coverage_data(n) ((struct coverage_data *)(ggc_internal_vec_alloc_stat (sizeof (struct coverage_data), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_coverage_data(n) ((struct coverage_data *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct coverage_data), n MEM_STAT_INFO)))
-#define ggc_alloc_bitmap_obstack() ((struct bitmap_obstack *)(ggc_internal_alloc_stat (sizeof (struct bitmap_obstack) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_bitmap_obstack() ((struct bitmap_obstack *)(ggc_internal_cleared_alloc_stat (sizeof (struct bitmap_obstack) MEM_STAT_INFO)))
-#define ggc_alloc_vec_bitmap_obstack(n) ((struct bitmap_obstack *)(ggc_internal_vec_alloc_stat (sizeof (struct bitmap_obstack), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_bitmap_obstack(n) ((struct bitmap_obstack *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct bitmap_obstack), n MEM_STAT_INFO)))
-#define ggc_alloc_bitmap_element() ((struct bitmap_element *)(ggc_internal_alloc_stat (sizeof (struct bitmap_element) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_bitmap_element() ((struct bitmap_element *)(ggc_internal_cleared_alloc_stat (sizeof (struct bitmap_element) MEM_STAT_INFO)))
-#define ggc_alloc_vec_bitmap_element(n) ((struct bitmap_element *)(ggc_internal_vec_alloc_stat (sizeof (struct bitmap_element), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_bitmap_element(n) ((struct bitmap_element *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct bitmap_element), n MEM_STAT_INFO)))
-#define ggc_alloc_splay_tree_s() ((struct splay_tree_s *)(ggc_internal_alloc_stat (sizeof (struct splay_tree_s) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_splay_tree_s() ((struct splay_tree_s *)(ggc_internal_cleared_alloc_stat (sizeof (struct splay_tree_s) MEM_STAT_INFO)))
-#define ggc_alloc_vec_splay_tree_s(n) ((struct splay_tree_s *)(ggc_internal_vec_alloc_stat (sizeof (struct splay_tree_s), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_splay_tree_s(n) ((struct splay_tree_s *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct splay_tree_s), n MEM_STAT_INFO)))
-#define ggc_alloc_splay_tree_node_s() ((struct splay_tree_node_s *)(ggc_internal_alloc_stat (sizeof (struct splay_tree_node_s) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_splay_tree_node_s() ((struct splay_tree_node_s *)(ggc_internal_cleared_alloc_stat (sizeof (struct splay_tree_node_s) MEM_STAT_INFO)))
-#define ggc_alloc_vec_splay_tree_node_s(n) ((struct splay_tree_node_s *)(ggc_internal_vec_alloc_stat (sizeof (struct splay_tree_node_s), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_splay_tree_node_s(n) ((struct splay_tree_node_s *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct splay_tree_node_s), n MEM_STAT_INFO)))
-#define ggc_alloc_machine_function() ((struct machine_function *)(ggc_internal_alloc_stat (sizeof (struct machine_function) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_machine_function() ((struct machine_function *)(ggc_internal_cleared_alloc_stat (sizeof (struct machine_function) MEM_STAT_INFO)))
-#define ggc_alloc_vec_machine_function(n) ((struct machine_function *)(ggc_internal_vec_alloc_stat (sizeof (struct machine_function), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_machine_function(n) ((struct machine_function *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct machine_function), n MEM_STAT_INFO)))
-#define ggc_alloc_arm_stack_offsets() ((struct arm_stack_offsets *)(ggc_internal_alloc_stat (sizeof (struct arm_stack_offsets) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_arm_stack_offsets() ((struct arm_stack_offsets *)(ggc_internal_cleared_alloc_stat (sizeof (struct arm_stack_offsets) MEM_STAT_INFO)))
-#define ggc_alloc_vec_arm_stack_offsets(n) ((struct arm_stack_offsets *)(ggc_internal_vec_alloc_stat (sizeof (struct arm_stack_offsets), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_arm_stack_offsets(n) ((struct arm_stack_offsets *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct arm_stack_offsets), n MEM_STAT_INFO)))
-#define ggc_alloc_basic_block_def() ((struct basic_block_def *)(ggc_internal_alloc_stat (sizeof (struct basic_block_def) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_basic_block_def() ((struct basic_block_def *)(ggc_internal_cleared_alloc_stat (sizeof (struct basic_block_def) MEM_STAT_INFO)))
-#define ggc_alloc_vec_basic_block_def(n) ((struct basic_block_def *)(ggc_internal_vec_alloc_stat (sizeof (struct basic_block_def), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_basic_block_def(n) ((struct basic_block_def *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct basic_block_def), n MEM_STAT_INFO)))
-#define ggc_alloc_edge_def() ((edge_def *)(ggc_internal_alloc_stat (sizeof (edge_def) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_edge_def() ((edge_def *)(ggc_internal_cleared_alloc_stat (sizeof (edge_def) MEM_STAT_INFO)))
-#define ggc_alloc_vec_edge_def(n) ((edge_def *)(ggc_internal_vec_alloc_stat (sizeof (edge_def), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_edge_def(n) ((edge_def *)(ggc_internal_cleared_vec_alloc_stat (sizeof (edge_def), n MEM_STAT_INFO)))
-#define ggc_alloc_cl_optimization() ((struct cl_optimization *)(ggc_internal_alloc_stat (sizeof (struct cl_optimization) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cl_optimization() ((struct cl_optimization *)(ggc_internal_cleared_alloc_stat (sizeof (struct cl_optimization) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cl_optimization(n) ((struct cl_optimization *)(ggc_internal_vec_alloc_stat (sizeof (struct cl_optimization), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cl_optimization(n) ((struct cl_optimization *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cl_optimization), n MEM_STAT_INFO)))
-#define ggc_alloc_cl_target_option() ((struct cl_target_option *)(ggc_internal_alloc_stat (sizeof (struct cl_target_option) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cl_target_option() ((struct cl_target_option *)(ggc_internal_cleared_alloc_stat (sizeof (struct cl_target_option) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cl_target_option(n) ((struct cl_target_option *)(ggc_internal_vec_alloc_stat (sizeof (struct cl_target_option), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cl_target_option(n) ((struct cl_target_option *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cl_target_option), n MEM_STAT_INFO)))
-#define ggc_alloc_section() ((union section *)(ggc_internal_alloc_stat (sizeof (union section) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_section() ((union section *)(ggc_internal_cleared_alloc_stat (sizeof (union section) MEM_STAT_INFO)))
-#define ggc_alloc_vec_section(n) ((union section *)(ggc_internal_vec_alloc_stat (sizeof (union section), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_section(n) ((union section *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union section), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_statement_base(SIZE) ((struct gimple_statement_base *)(ggc_internal_alloc_stat (SIZE MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_statement_base(SIZE) ((struct gimple_statement_base *)(ggc_internal_cleared_alloc_stat (SIZE MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_statement_base(SIZE, n) ((struct gimple_statement_base *)(ggc_internal_vec_alloc_stat (SIZE, n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_statement_base(SIZE, n) ((struct gimple_statement_base *)(ggc_internal_cleared_vec_alloc_stat (SIZE, n MEM_STAT_INFO)))
-#define ggc_alloc_rtvec_def(SIZE) ((struct rtvec_def *)(ggc_internal_alloc_stat (SIZE MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtvec_def(SIZE) ((struct rtvec_def *)(ggc_internal_cleared_alloc_stat (SIZE MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtvec_def(SIZE, n) ((struct rtvec_def *)(ggc_internal_vec_alloc_stat (SIZE, n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtvec_def(SIZE, n) ((struct rtvec_def *)(ggc_internal_cleared_vec_alloc_stat (SIZE, n MEM_STAT_INFO)))
-#define ggc_alloc_rtx_def(SIZE) ((struct rtx_def *)(ggc_internal_alloc_stat (SIZE MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx_def(SIZE) ((struct rtx_def *)(ggc_internal_cleared_alloc_stat (SIZE MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx_def(SIZE, n) ((struct rtx_def *)(ggc_internal_vec_alloc_stat (SIZE, n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx_def(SIZE, n) ((struct rtx_def *)(ggc_internal_cleared_vec_alloc_stat (SIZE, n MEM_STAT_INFO)))
-#define ggc_alloc_bitmap_head() ((struct bitmap_head *)(ggc_internal_alloc_stat (sizeof (struct bitmap_head) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_bitmap_head() ((struct bitmap_head *)(ggc_internal_cleared_alloc_stat (sizeof (struct bitmap_head) MEM_STAT_INFO)))
-#define ggc_alloc_vec_bitmap_head(n) ((struct bitmap_head *)(ggc_internal_vec_alloc_stat (sizeof (struct bitmap_head), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_bitmap_head(n) ((struct bitmap_head *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct bitmap_head), n MEM_STAT_INFO)))
-#define ggc_alloc_cpp_macro_u() ((union cpp_macro_u *)(ggc_internal_alloc_stat (sizeof (union cpp_macro_u) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cpp_macro_u() ((union cpp_macro_u *)(ggc_internal_cleared_alloc_stat (sizeof (union cpp_macro_u) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cpp_macro_u(n) ((union cpp_macro_u *)(ggc_internal_vec_alloc_stat (sizeof (union cpp_macro_u), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cpp_macro_u(n) ((union cpp_macro_u *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union cpp_macro_u), n MEM_STAT_INFO)))
-#define ggc_alloc_ht_identifier() ((struct ht_identifier *)(ggc_internal_alloc_stat (sizeof (struct ht_identifier) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ht_identifier() ((struct ht_identifier *)(ggc_internal_cleared_alloc_stat (sizeof (struct ht_identifier) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ht_identifier(n) ((struct ht_identifier *)(ggc_internal_vec_alloc_stat (sizeof (struct ht_identifier), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ht_identifier(n) ((struct ht_identifier *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct ht_identifier), n MEM_STAT_INFO)))
-#define ggc_alloc__cpp_hashnode_value() ((union _cpp_hashnode_value *)(ggc_internal_alloc_stat (sizeof (union _cpp_hashnode_value) MEM_STAT_INFO)))
-#define ggc_alloc_cleared__cpp_hashnode_value() ((union _cpp_hashnode_value *)(ggc_internal_cleared_alloc_stat (sizeof (union _cpp_hashnode_value) MEM_STAT_INFO)))
-#define ggc_alloc_vec__cpp_hashnode_value(n) ((union _cpp_hashnode_value *)(ggc_internal_vec_alloc_stat (sizeof (union _cpp_hashnode_value), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec__cpp_hashnode_value(n) ((union _cpp_hashnode_value *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union _cpp_hashnode_value), n MEM_STAT_INFO)))
-#define ggc_alloc_cpp_token_u() ((union cpp_token_u *)(ggc_internal_alloc_stat (sizeof (union cpp_token_u) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cpp_token_u() ((union cpp_token_u *)(ggc_internal_cleared_alloc_stat (sizeof (union cpp_token_u) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cpp_token_u(n) ((union cpp_token_u *)(ggc_internal_vec_alloc_stat (sizeof (union cpp_token_u), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cpp_token_u(n) ((union cpp_token_u *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union cpp_token_u), n MEM_STAT_INFO)))
-#define ggc_alloc_cpp_identifier() ((struct cpp_identifier *)(ggc_internal_alloc_stat (sizeof (struct cpp_identifier) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cpp_identifier() ((struct cpp_identifier *)(ggc_internal_cleared_alloc_stat (sizeof (struct cpp_identifier) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cpp_identifier(n) ((struct cpp_identifier *)(ggc_internal_vec_alloc_stat (sizeof (struct cpp_identifier), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cpp_identifier(n) ((struct cpp_identifier *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cpp_identifier), n MEM_STAT_INFO)))
-#define ggc_alloc_cpp_macro_arg() ((struct cpp_macro_arg *)(ggc_internal_alloc_stat (sizeof (struct cpp_macro_arg) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cpp_macro_arg() ((struct cpp_macro_arg *)(ggc_internal_cleared_alloc_stat (sizeof (struct cpp_macro_arg) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cpp_macro_arg(n) ((struct cpp_macro_arg *)(ggc_internal_vec_alloc_stat (sizeof (struct cpp_macro_arg), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cpp_macro_arg(n) ((struct cpp_macro_arg *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cpp_macro_arg), n MEM_STAT_INFO)))
-#define ggc_alloc_answer() ((struct answer *)(ggc_internal_alloc_stat (sizeof (struct answer) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_answer() ((struct answer *)(ggc_internal_cleared_alloc_stat (sizeof (struct answer) MEM_STAT_INFO)))
-#define ggc_alloc_vec_answer(n) ((struct answer *)(ggc_internal_vec_alloc_stat (sizeof (struct answer), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_answer(n) ((struct answer *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct answer), n MEM_STAT_INFO)))
-#define ggc_alloc_cpp_macro() ((struct cpp_macro *)(ggc_internal_alloc_stat (sizeof (struct cpp_macro) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cpp_macro() ((struct cpp_macro *)(ggc_internal_cleared_alloc_stat (sizeof (struct cpp_macro) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cpp_macro(n) ((struct cpp_macro *)(ggc_internal_vec_alloc_stat (sizeof (struct cpp_macro), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cpp_macro(n) ((struct cpp_macro *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cpp_macro), n MEM_STAT_INFO)))
-#define ggc_alloc_cpp_string() ((struct cpp_string *)(ggc_internal_alloc_stat (sizeof (struct cpp_string) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cpp_string() ((struct cpp_string *)(ggc_internal_cleared_alloc_stat (sizeof (struct cpp_string) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cpp_string(n) ((struct cpp_string *)(ggc_internal_vec_alloc_stat (sizeof (struct cpp_string), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cpp_string(n) ((struct cpp_string *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cpp_string), n MEM_STAT_INFO)))
-#define ggc_alloc_cpp_token() ((struct cpp_token *)(ggc_internal_alloc_stat (sizeof (struct cpp_token) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cpp_token() ((struct cpp_token *)(ggc_internal_cleared_alloc_stat (sizeof (struct cpp_token) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cpp_token(n) ((struct cpp_token *)(ggc_internal_vec_alloc_stat (sizeof (struct cpp_token), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cpp_token(n) ((struct cpp_token *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cpp_token), n MEM_STAT_INFO)))
-#define ggc_alloc_line_maps() ((struct line_maps *)(ggc_internal_alloc_stat (sizeof (struct line_maps) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_line_maps() ((struct line_maps *)(ggc_internal_cleared_alloc_stat (sizeof (struct line_maps) MEM_STAT_INFO)))
-#define ggc_alloc_vec_line_maps(n) ((struct line_maps *)(ggc_internal_vec_alloc_stat (sizeof (struct line_maps), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_line_maps(n) ((struct line_maps *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct line_maps), n MEM_STAT_INFO)))
-#define ggc_alloc_location_adhoc_data_map() ((struct location_adhoc_data_map *)(ggc_internal_alloc_stat (sizeof (struct location_adhoc_data_map) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_location_adhoc_data_map() ((struct location_adhoc_data_map *)(ggc_internal_cleared_alloc_stat (sizeof (struct location_adhoc_data_map) MEM_STAT_INFO)))
-#define ggc_alloc_vec_location_adhoc_data_map(n) ((struct location_adhoc_data_map *)(ggc_internal_vec_alloc_stat (sizeof (struct location_adhoc_data_map), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_location_adhoc_data_map(n) ((struct location_adhoc_data_map *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct location_adhoc_data_map), n MEM_STAT_INFO)))
-#define ggc_alloc_htab() ((struct htab *)(ggc_internal_alloc_stat (sizeof (struct htab) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_htab() ((struct htab *)(ggc_internal_cleared_alloc_stat (sizeof (struct htab) MEM_STAT_INFO)))
-#define ggc_alloc_vec_htab(n) ((struct htab *)(ggc_internal_vec_alloc_stat (sizeof (struct htab), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_htab(n) ((struct htab *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct htab), n MEM_STAT_INFO)))
-#define ggc_alloc_location_adhoc_data() ((struct location_adhoc_data *)(ggc_internal_alloc_stat (sizeof (struct location_adhoc_data) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_location_adhoc_data() ((struct location_adhoc_data *)(ggc_internal_cleared_alloc_stat (sizeof (struct location_adhoc_data) MEM_STAT_INFO)))
-#define ggc_alloc_vec_location_adhoc_data(n) ((struct location_adhoc_data *)(ggc_internal_vec_alloc_stat (sizeof (struct location_adhoc_data), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_location_adhoc_data(n) ((struct location_adhoc_data *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct location_adhoc_data), n MEM_STAT_INFO)))
-#define ggc_alloc_maps_info() ((struct maps_info *)(ggc_internal_alloc_stat (sizeof (struct maps_info) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_maps_info() ((struct maps_info *)(ggc_internal_cleared_alloc_stat (sizeof (struct maps_info) MEM_STAT_INFO)))
-#define ggc_alloc_vec_maps_info(n) ((struct maps_info *)(ggc_internal_vec_alloc_stat (sizeof (struct maps_info), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_maps_info(n) ((struct maps_info *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct maps_info), n MEM_STAT_INFO)))
-#define ggc_alloc_line_map() ((struct line_map *)(ggc_internal_alloc_stat (sizeof (struct line_map) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_line_map() ((struct line_map *)(ggc_internal_cleared_alloc_stat (sizeof (struct line_map) MEM_STAT_INFO)))
-#define ggc_alloc_vec_line_map(n) ((struct line_map *)(ggc_internal_vec_alloc_stat (sizeof (struct line_map), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_line_map(n) ((struct line_map *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct line_map), n MEM_STAT_INFO)))
-#define ggc_alloc_map_u() ((union map_u *)(ggc_internal_alloc_stat (sizeof (union map_u) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_map_u() ((union map_u *)(ggc_internal_cleared_alloc_stat (sizeof (union map_u) MEM_STAT_INFO)))
-#define ggc_alloc_vec_map_u(n) ((union map_u *)(ggc_internal_vec_alloc_stat (sizeof (union map_u), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_map_u(n) ((union map_u *)(ggc_internal_cleared_vec_alloc_stat (sizeof (union map_u), n MEM_STAT_INFO)))
-#define ggc_alloc_line_map_macro() ((struct line_map_macro *)(ggc_internal_alloc_stat (sizeof (struct line_map_macro) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_line_map_macro() ((struct line_map_macro *)(ggc_internal_cleared_alloc_stat (sizeof (struct line_map_macro) MEM_STAT_INFO)))
-#define ggc_alloc_vec_line_map_macro(n) ((struct line_map_macro *)(ggc_internal_vec_alloc_stat (sizeof (struct line_map_macro), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_line_map_macro(n) ((struct line_map_macro *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct line_map_macro), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_node(SIZE) ((union tree_node *)(ggc_internal_alloc_stat (SIZE MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_node(SIZE) ((union tree_node *)(ggc_internal_cleared_alloc_stat (SIZE MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_node(SIZE, n) ((union tree_node *)(ggc_internal_vec_alloc_stat (SIZE, n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_node(SIZE, n) ((union tree_node *)(ggc_internal_cleared_vec_alloc_stat (SIZE, n MEM_STAT_INFO)))
-#define ggc_alloc_cpp_hashnode() ((struct cpp_hashnode *)(ggc_internal_alloc_stat (sizeof (struct cpp_hashnode) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cpp_hashnode() ((struct cpp_hashnode *)(ggc_internal_cleared_alloc_stat (sizeof (struct cpp_hashnode) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cpp_hashnode(n) ((struct cpp_hashnode *)(ggc_internal_vec_alloc_stat (sizeof (struct cpp_hashnode), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cpp_hashnode(n) ((struct cpp_hashnode *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct cpp_hashnode), n MEM_STAT_INFO)))
-#define ggc_alloc_line_map_ordinary() ((struct line_map_ordinary *)(ggc_internal_alloc_stat (sizeof (struct line_map_ordinary) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_line_map_ordinary() ((struct line_map_ordinary *)(ggc_internal_cleared_alloc_stat (sizeof (struct line_map_ordinary) MEM_STAT_INFO)))
-#define ggc_alloc_vec_line_map_ordinary(n) ((struct line_map_ordinary *)(ggc_internal_vec_alloc_stat (sizeof (struct line_map_ordinary), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_line_map_ordinary(n) ((struct line_map_ordinary *)(ggc_internal_cleared_vec_alloc_stat (sizeof (struct line_map_ordinary), n MEM_STAT_INFO)))
-
-/* Allocators for known typedefs.  */
-#define ggc_alloc_attr() ((attr *)(ggc_internal_alloc_stat (sizeof (attr) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_attr() ((attr *)(ggc_internal_cleared_alloc_stat (sizeof (attr) MEM_STAT_INFO)))
-#define ggc_alloc_vec_attr(n) ((attr *)(ggc_internal_vec_alloc_stat (sizeof (attr), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_attr(n) ((attr *)(ggc_internal_cleared_vec_alloc_stat (sizeof (attr), n MEM_STAT_INFO)))
-#define ggc_alloc_hash() ((hash *)(ggc_internal_alloc_stat (sizeof (hash) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_hash() ((hash *)(ggc_internal_cleared_alloc_stat (sizeof (hash) MEM_STAT_INFO)))
-#define ggc_alloc_vec_hash(n) ((hash *)(ggc_internal_vec_alloc_stat (sizeof (hash), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_hash(n) ((hash *)(ggc_internal_cleared_vec_alloc_stat (sizeof (hash), n MEM_STAT_INFO)))
-#define ggc_alloc_objc_map_t() ((objc_map_t *)(ggc_internal_alloc_stat (sizeof (objc_map_t) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_objc_map_t() ((objc_map_t *)(ggc_internal_cleared_alloc_stat (sizeof (objc_map_t) MEM_STAT_INFO)))
-#define ggc_alloc_vec_objc_map_t(n) ((objc_map_t *)(ggc_internal_vec_alloc_stat (sizeof (objc_map_t), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_objc_map_t(n) ((objc_map_t *)(ggc_internal_cleared_vec_alloc_stat (sizeof (objc_map_t), n MEM_STAT_INFO)))
-#define ggc_alloc_method_entry() ((method_entry *)(ggc_internal_alloc_stat (sizeof (method_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_method_entry() ((method_entry *)(ggc_internal_cleared_alloc_stat (sizeof (method_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_method_entry(n) ((method_entry *)(ggc_internal_vec_alloc_stat (sizeof (method_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_method_entry(n) ((method_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (method_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_constant_pool() ((constant_pool *)(ggc_internal_alloc_stat (sizeof (constant_pool) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_constant_pool() ((constant_pool *)(ggc_internal_cleared_alloc_stat (sizeof (constant_pool) MEM_STAT_INFO)))
-#define ggc_alloc_vec_constant_pool(n) ((constant_pool *)(ggc_internal_vec_alloc_stat (sizeof (constant_pool), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_constant_pool(n) ((constant_pool *)(ggc_internal_cleared_vec_alloc_stat (sizeof (constant_pool), n MEM_STAT_INFO)))
-#define ggc_alloc_go_char_p() ((go_char_p *)(ggc_internal_alloc_stat (sizeof (go_char_p) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_go_char_p() ((go_char_p *)(ggc_internal_cleared_alloc_stat (sizeof (go_char_p) MEM_STAT_INFO)))
-#define ggc_alloc_vec_go_char_p(n) ((go_char_p *)(ggc_internal_vec_alloc_stat (sizeof (go_char_p), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_go_char_p(n) ((go_char_p *)(ggc_internal_cleared_vec_alloc_stat (sizeof (go_char_p), n MEM_STAT_INFO)))
-#define ggc_alloc_cp_unparsed_functions_entry() ((cp_unparsed_functions_entry *)(ggc_internal_alloc_stat (sizeof (cp_unparsed_functions_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cp_unparsed_functions_entry() ((cp_unparsed_functions_entry *)(ggc_internal_cleared_alloc_stat (sizeof (cp_unparsed_functions_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cp_unparsed_functions_entry(n) ((cp_unparsed_functions_entry *)(ggc_internal_vec_alloc_stat (sizeof (cp_unparsed_functions_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cp_unparsed_functions_entry(n) ((cp_unparsed_functions_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (cp_unparsed_functions_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cp_default_arg_entry() ((cp_default_arg_entry *)(ggc_internal_alloc_stat (sizeof (cp_default_arg_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cp_default_arg_entry() ((cp_default_arg_entry *)(ggc_internal_cleared_alloc_stat (sizeof (cp_default_arg_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cp_default_arg_entry(n) ((cp_default_arg_entry *)(ggc_internal_vec_alloc_stat (sizeof (cp_default_arg_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cp_default_arg_entry(n) ((cp_default_arg_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (cp_default_arg_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cp_token_cache_ptr() ((cp_token_cache_ptr *)(ggc_internal_alloc_stat (sizeof (cp_token_cache_ptr) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cp_token_cache_ptr() ((cp_token_cache_ptr *)(ggc_internal_cleared_alloc_stat (sizeof (cp_token_cache_ptr) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cp_token_cache_ptr(n) ((cp_token_cache_ptr *)(ggc_internal_vec_alloc_stat (sizeof (cp_token_cache_ptr), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cp_token_cache_ptr(n) ((cp_token_cache_ptr *)(ggc_internal_cleared_vec_alloc_stat (sizeof (cp_token_cache_ptr), n MEM_STAT_INFO)))
-#define ggc_alloc_cp_token_position() ((cp_token_position *)(ggc_internal_alloc_stat (sizeof (cp_token_position) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cp_token_position() ((cp_token_position *)(ggc_internal_cleared_alloc_stat (sizeof (cp_token_position) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cp_token_position(n) ((cp_token_position *)(ggc_internal_vec_alloc_stat (sizeof (cp_token_position), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cp_token_position(n) ((cp_token_position *)(ggc_internal_cleared_vec_alloc_stat (sizeof (cp_token_position), n MEM_STAT_INFO)))
-#define ggc_alloc_incomplete_var() ((incomplete_var *)(ggc_internal_alloc_stat (sizeof (incomplete_var) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_incomplete_var() ((incomplete_var *)(ggc_internal_cleared_alloc_stat (sizeof (incomplete_var) MEM_STAT_INFO)))
-#define ggc_alloc_vec_incomplete_var(n) ((incomplete_var *)(ggc_internal_vec_alloc_stat (sizeof (incomplete_var), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_incomplete_var(n) ((incomplete_var *)(ggc_internal_cleared_vec_alloc_stat (sizeof (incomplete_var), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_pair_p() ((tree_pair_p *)(ggc_internal_alloc_stat (sizeof (tree_pair_p) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_pair_p() ((tree_pair_p *)(ggc_internal_cleared_alloc_stat (sizeof (tree_pair_p) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_pair_p(n) ((tree_pair_p *)(ggc_internal_vec_alloc_stat (sizeof (tree_pair_p), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_pair_p(n) ((tree_pair_p *)(ggc_internal_cleared_vec_alloc_stat (sizeof (tree_pair_p), n MEM_STAT_INFO)))
-#define ggc_alloc_qualified_typedef_usage_t() ((qualified_typedef_usage_t *)(ggc_internal_alloc_stat (sizeof (qualified_typedef_usage_t) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_qualified_typedef_usage_t() ((qualified_typedef_usage_t *)(ggc_internal_cleared_alloc_stat (sizeof (qualified_typedef_usage_t) MEM_STAT_INFO)))
-#define ggc_alloc_vec_qualified_typedef_usage_t(n) ((qualified_typedef_usage_t *)(ggc_internal_vec_alloc_stat (sizeof (qualified_typedef_usage_t), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_qualified_typedef_usage_t(n) ((qualified_typedef_usage_t *)(ggc_internal_cleared_vec_alloc_stat (sizeof (qualified_typedef_usage_t), n MEM_STAT_INFO)))
-#define ggc_alloc_ptrmem_cst_t() ((ptrmem_cst_t *)(ggc_internal_alloc_stat (sizeof (ptrmem_cst_t) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ptrmem_cst_t() ((ptrmem_cst_t *)(ggc_internal_cleared_alloc_stat (sizeof (ptrmem_cst_t) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ptrmem_cst_t(n) ((ptrmem_cst_t *)(ggc_internal_vec_alloc_stat (sizeof (ptrmem_cst_t), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ptrmem_cst_t(n) ((ptrmem_cst_t *)(ggc_internal_cleared_vec_alloc_stat (sizeof (ptrmem_cst_t), n MEM_STAT_INFO)))
-#define ggc_alloc_template_parm_index() ((template_parm_index *)(ggc_internal_alloc_stat (sizeof (template_parm_index) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_template_parm_index() ((template_parm_index *)(ggc_internal_cleared_alloc_stat (sizeof (template_parm_index) MEM_STAT_INFO)))
-#define ggc_alloc_vec_template_parm_index(n) ((template_parm_index *)(ggc_internal_vec_alloc_stat (sizeof (template_parm_index), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_template_parm_index(n) ((template_parm_index *)(ggc_internal_cleared_vec_alloc_stat (sizeof (template_parm_index), n MEM_STAT_INFO)))
-#define ggc_alloc_binding_entry() ((binding_entry *)(ggc_internal_alloc_stat (sizeof (binding_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_binding_entry() ((binding_entry *)(ggc_internal_cleared_alloc_stat (sizeof (binding_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_binding_entry(n) ((binding_entry *)(ggc_internal_vec_alloc_stat (sizeof (binding_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_binding_entry(n) ((binding_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (binding_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_binding_table() ((binding_table *)(ggc_internal_alloc_stat (sizeof (binding_table) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_binding_table() ((binding_table *)(ggc_internal_cleared_alloc_stat (sizeof (binding_table) MEM_STAT_INFO)))
-#define ggc_alloc_vec_binding_table(n) ((binding_table *)(ggc_internal_vec_alloc_stat (sizeof (binding_table), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_binding_table(n) ((binding_table *)(ggc_internal_cleared_vec_alloc_stat (sizeof (binding_table), n MEM_STAT_INFO)))
-#define ggc_alloc_pending_redefinition() ((pending_redefinition *)(ggc_internal_alloc_stat (sizeof (pending_redefinition) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_pending_redefinition() ((pending_redefinition *)(ggc_internal_cleared_alloc_stat (sizeof (pending_redefinition) MEM_STAT_INFO)))
-#define ggc_alloc_vec_pending_redefinition(n) ((pending_redefinition *)(ggc_internal_vec_alloc_stat (sizeof (pending_redefinition), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_pending_redefinition(n) ((pending_redefinition *)(ggc_internal_cleared_vec_alloc_stat (sizeof (pending_redefinition), n MEM_STAT_INFO)))
-#define ggc_alloc_pending_weak() ((pending_weak *)(ggc_internal_alloc_stat (sizeof (pending_weak) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_pending_weak() ((pending_weak *)(ggc_internal_cleared_alloc_stat (sizeof (pending_weak) MEM_STAT_INFO)))
-#define ggc_alloc_vec_pending_weak(n) ((pending_weak *)(ggc_internal_vec_alloc_stat (sizeof (pending_weak), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_pending_weak(n) ((pending_weak *)(ggc_internal_cleared_vec_alloc_stat (sizeof (pending_weak), n MEM_STAT_INFO)))
-#define ggc_alloc_stmt_tree() ((stmt_tree *)(ggc_internal_alloc_stat (sizeof (stmt_tree) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_stmt_tree() ((stmt_tree *)(ggc_internal_cleared_alloc_stat (sizeof (stmt_tree) MEM_STAT_INFO)))
-#define ggc_alloc_vec_stmt_tree(n) ((stmt_tree *)(ggc_internal_vec_alloc_stat (sizeof (stmt_tree), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_stmt_tree(n) ((stmt_tree *)(ggc_internal_cleared_vec_alloc_stat (sizeof (stmt_tree), n MEM_STAT_INFO)))
-#define ggc_alloc_tree_gc_vec() ((tree_gc_vec *)(ggc_internal_alloc_stat (sizeof (tree_gc_vec) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree_gc_vec() ((tree_gc_vec *)(ggc_internal_cleared_alloc_stat (sizeof (tree_gc_vec) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree_gc_vec(n) ((tree_gc_vec *)(ggc_internal_vec_alloc_stat (sizeof (tree_gc_vec), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree_gc_vec(n) ((tree_gc_vec *)(ggc_internal_cleared_vec_alloc_stat (sizeof (tree_gc_vec), n MEM_STAT_INFO)))
-#define ggc_alloc_const_char_p() ((const_char_p *)(ggc_internal_alloc_stat (sizeof (const_char_p) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_const_char_p() ((const_char_p *)(ggc_internal_cleared_alloc_stat (sizeof (const_char_p) MEM_STAT_INFO)))
-#define ggc_alloc_vec_const_char_p(n) ((const_char_p *)(ggc_internal_vec_alloc_stat (sizeof (const_char_p), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_const_char_p(n) ((const_char_p *)(ggc_internal_cleared_vec_alloc_stat (sizeof (const_char_p), n MEM_STAT_INFO)))
-#define ggc_alloc_c_binding_ptr() ((c_binding_ptr *)(ggc_internal_alloc_stat (sizeof (c_binding_ptr) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_c_binding_ptr() ((c_binding_ptr *)(ggc_internal_cleared_alloc_stat (sizeof (c_binding_ptr) MEM_STAT_INFO)))
-#define ggc_alloc_vec_c_binding_ptr(n) ((c_binding_ptr *)(ggc_internal_vec_alloc_stat (sizeof (c_binding_ptr), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_c_binding_ptr(n) ((c_binding_ptr *)(ggc_internal_cleared_vec_alloc_stat (sizeof (c_binding_ptr), n MEM_STAT_INFO)))
-#define ggc_alloc_c_goto_bindings_p() ((c_goto_bindings_p *)(ggc_internal_alloc_stat (sizeof (c_goto_bindings_p) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_c_goto_bindings_p() ((c_goto_bindings_p *)(ggc_internal_cleared_alloc_stat (sizeof (c_goto_bindings_p) MEM_STAT_INFO)))
-#define ggc_alloc_vec_c_goto_bindings_p(n) ((c_goto_bindings_p *)(ggc_internal_vec_alloc_stat (sizeof (c_goto_bindings_p), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_c_goto_bindings_p(n) ((c_goto_bindings_p *)(ggc_internal_cleared_vec_alloc_stat (sizeof (c_goto_bindings_p), n MEM_STAT_INFO)))
-#define ggc_alloc_loop_info() ((loop_info *)(ggc_internal_alloc_stat (sizeof (loop_info) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_loop_info() ((loop_info *)(ggc_internal_cleared_alloc_stat (sizeof (loop_info) MEM_STAT_INFO)))
-#define ggc_alloc_vec_loop_info(n) ((loop_info *)(ggc_internal_vec_alloc_stat (sizeof (loop_info), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_loop_info(n) ((loop_info *)(ggc_internal_cleared_vec_alloc_stat (sizeof (loop_info), n MEM_STAT_INFO)))
-#define ggc_alloc_range_check_info() ((range_check_info *)(ggc_internal_alloc_stat (sizeof (range_check_info) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_range_check_info() ((range_check_info *)(ggc_internal_cleared_alloc_stat (sizeof (range_check_info) MEM_STAT_INFO)))
-#define ggc_alloc_vec_range_check_info(n) ((range_check_info *)(ggc_internal_vec_alloc_stat (sizeof (range_check_info), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_range_check_info(n) ((range_check_info *)(ggc_internal_cleared_vec_alloc_stat (sizeof (range_check_info), n MEM_STAT_INFO)))
-#define ggc_alloc_parm_attr() ((parm_attr *)(ggc_internal_alloc_stat (sizeof (parm_attr) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_parm_attr() ((parm_attr *)(ggc_internal_cleared_alloc_stat (sizeof (parm_attr) MEM_STAT_INFO)))
-#define ggc_alloc_vec_parm_attr(n) ((parm_attr *)(ggc_internal_vec_alloc_stat (sizeof (parm_attr), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_parm_attr(n) ((parm_attr *)(ggc_internal_cleared_vec_alloc_stat (sizeof (parm_attr), n MEM_STAT_INFO)))
-#define ggc_alloc_inline_summary_t() ((inline_summary_t *)(ggc_internal_alloc_stat (sizeof (inline_summary_t) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_inline_summary_t() ((inline_summary_t *)(ggc_internal_cleared_alloc_stat (sizeof (inline_summary_t) MEM_STAT_INFO)))
-#define ggc_alloc_vec_inline_summary_t(n) ((inline_summary_t *)(ggc_internal_vec_alloc_stat (sizeof (inline_summary_t), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_inline_summary_t(n) ((inline_summary_t *)(ggc_internal_cleared_vec_alloc_stat (sizeof (inline_summary_t), n MEM_STAT_INFO)))
-#define ggc_alloc_conditions() ((conditions *)(ggc_internal_alloc_stat (sizeof (conditions) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_conditions() ((conditions *)(ggc_internal_cleared_alloc_stat (sizeof (conditions) MEM_STAT_INFO)))
-#define ggc_alloc_vec_conditions(n) ((conditions *)(ggc_internal_vec_alloc_stat (sizeof (conditions), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_conditions(n) ((conditions *)(ggc_internal_cleared_vec_alloc_stat (sizeof (conditions), n MEM_STAT_INFO)))
-#define ggc_alloc_lto_file_decl_data_ptr() ((lto_file_decl_data_ptr *)(ggc_internal_alloc_stat (sizeof (lto_file_decl_data_ptr) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lto_file_decl_data_ptr() ((lto_file_decl_data_ptr *)(ggc_internal_cleared_alloc_stat (sizeof (lto_file_decl_data_ptr) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lto_file_decl_data_ptr(n) ((lto_file_decl_data_ptr *)(ggc_internal_vec_alloc_stat (sizeof (lto_file_decl_data_ptr), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lto_file_decl_data_ptr(n) ((lto_file_decl_data_ptr *)(ggc_internal_cleared_vec_alloc_stat (sizeof (lto_file_decl_data_ptr), n MEM_STAT_INFO)))
-#define ggc_alloc_lto_in_decl_state_ptr() ((lto_in_decl_state_ptr *)(ggc_internal_alloc_stat (sizeof (lto_in_decl_state_ptr) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_lto_in_decl_state_ptr() ((lto_in_decl_state_ptr *)(ggc_internal_cleared_alloc_stat (sizeof (lto_in_decl_state_ptr) MEM_STAT_INFO)))
-#define ggc_alloc_vec_lto_in_decl_state_ptr(n) ((lto_in_decl_state_ptr *)(ggc_internal_vec_alloc_stat (sizeof (lto_in_decl_state_ptr), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_lto_in_decl_state_ptr(n) ((lto_in_decl_state_ptr *)(ggc_internal_cleared_vec_alloc_stat (sizeof (lto_in_decl_state_ptr), n MEM_STAT_INFO)))
-#define ggc_alloc_ipa_agg_replacement_value_p() ((ipa_agg_replacement_value_p *)(ggc_internal_alloc_stat (sizeof (ipa_agg_replacement_value_p) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ipa_agg_replacement_value_p() ((ipa_agg_replacement_value_p *)(ggc_internal_cleared_alloc_stat (sizeof (ipa_agg_replacement_value_p) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_agg_replacement_value_p(n) ((ipa_agg_replacement_value_p *)(ggc_internal_vec_alloc_stat (sizeof (ipa_agg_replacement_value_p), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_agg_replacement_value_p(n) ((ipa_agg_replacement_value_p *)(ggc_internal_cleared_vec_alloc_stat (sizeof (ipa_agg_replacement_value_p), n MEM_STAT_INFO)))
-#define ggc_alloc_ipa_agg_jump_function_p() ((ipa_agg_jump_function_p *)(ggc_internal_alloc_stat (sizeof (ipa_agg_jump_function_p) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ipa_agg_jump_function_p() ((ipa_agg_jump_function_p *)(ggc_internal_cleared_alloc_stat (sizeof (ipa_agg_jump_function_p) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_agg_jump_function_p(n) ((ipa_agg_jump_function_p *)(ggc_internal_vec_alloc_stat (sizeof (ipa_agg_jump_function_p), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_agg_jump_function_p(n) ((ipa_agg_jump_function_p *)(ggc_internal_cleared_vec_alloc_stat (sizeof (ipa_agg_jump_function_p), n MEM_STAT_INFO)))
-#define ggc_alloc_char_ptr() ((char_ptr *)(ggc_internal_alloc_stat (sizeof (char_ptr) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_char_ptr() ((char_ptr *)(ggc_internal_cleared_alloc_stat (sizeof (char_ptr) MEM_STAT_INFO)))
-#define ggc_alloc_vec_char_ptr(n) ((char_ptr *)(ggc_internal_vec_alloc_stat (sizeof (char_ptr), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_char_ptr(n) ((char_ptr *)(ggc_internal_cleared_vec_alloc_stat (sizeof (char_ptr), n MEM_STAT_INFO)))
-#define ggc_alloc_use_operand_p() ((use_operand_p *)(ggc_internal_alloc_stat (sizeof (use_operand_p) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_use_operand_p() ((use_operand_p *)(ggc_internal_cleared_alloc_stat (sizeof (use_operand_p) MEM_STAT_INFO)))
-#define ggc_alloc_vec_use_operand_p(n) ((use_operand_p *)(ggc_internal_vec_alloc_stat (sizeof (use_operand_p), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_use_operand_p(n) ((use_operand_p *)(ggc_internal_cleared_vec_alloc_stat (sizeof (use_operand_p), n MEM_STAT_INFO)))
-#define ggc_alloc_def_operand_p() ((def_operand_p *)(ggc_internal_alloc_stat (sizeof (def_operand_p) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_def_operand_p() ((def_operand_p *)(ggc_internal_cleared_alloc_stat (sizeof (def_operand_p) MEM_STAT_INFO)))
-#define ggc_alloc_vec_def_operand_p(n) ((def_operand_p *)(ggc_internal_vec_alloc_stat (sizeof (def_operand_p), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_def_operand_p(n) ((def_operand_p *)(ggc_internal_cleared_vec_alloc_stat (sizeof (def_operand_p), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_seq_node() ((gimple_seq_node *)(ggc_internal_alloc_stat (sizeof (gimple_seq_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_seq_node() ((gimple_seq_node *)(ggc_internal_cleared_alloc_stat (sizeof (gimple_seq_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_seq_node(n) ((gimple_seq_node *)(ggc_internal_vec_alloc_stat (sizeof (gimple_seq_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_seq_node(n) ((gimple_seq_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (gimple_seq_node), n MEM_STAT_INFO)))
-#define ggc_alloc_function_p() ((function_p *)(ggc_internal_alloc_stat (sizeof (function_p) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_function_p() ((function_p *)(ggc_internal_cleared_alloc_stat (sizeof (function_p) MEM_STAT_INFO)))
-#define ggc_alloc_vec_function_p(n) ((function_p *)(ggc_internal_vec_alloc_stat (sizeof (function_p), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_function_p(n) ((function_p *)(ggc_internal_cleared_vec_alloc_stat (sizeof (function_p), n MEM_STAT_INFO)))
-#define ggc_alloc_eh_region() ((eh_region *)(ggc_internal_alloc_stat (sizeof (eh_region) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_eh_region() ((eh_region *)(ggc_internal_cleared_alloc_stat (sizeof (eh_region) MEM_STAT_INFO)))
-#define ggc_alloc_vec_eh_region(n) ((eh_region *)(ggc_internal_vec_alloc_stat (sizeof (eh_region), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_eh_region(n) ((eh_region *)(ggc_internal_cleared_vec_alloc_stat (sizeof (eh_region), n MEM_STAT_INFO)))
-#define ggc_alloc_eh_catch() ((eh_catch *)(ggc_internal_alloc_stat (sizeof (eh_catch) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_eh_catch() ((eh_catch *)(ggc_internal_cleared_alloc_stat (sizeof (eh_catch) MEM_STAT_INFO)))
-#define ggc_alloc_vec_eh_catch(n) ((eh_catch *)(ggc_internal_vec_alloc_stat (sizeof (eh_catch), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_eh_catch(n) ((eh_catch *)(ggc_internal_cleared_vec_alloc_stat (sizeof (eh_catch), n MEM_STAT_INFO)))
-#define ggc_alloc_eh_landing_pad() ((eh_landing_pad *)(ggc_internal_alloc_stat (sizeof (eh_landing_pad) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_eh_landing_pad() ((eh_landing_pad *)(ggc_internal_cleared_alloc_stat (sizeof (eh_landing_pad) MEM_STAT_INFO)))
-#define ggc_alloc_vec_eh_landing_pad(n) ((eh_landing_pad *)(ggc_internal_vec_alloc_stat (sizeof (eh_landing_pad), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_eh_landing_pad(n) ((eh_landing_pad *)(ggc_internal_cleared_vec_alloc_stat (sizeof (eh_landing_pad), n MEM_STAT_INFO)))
-#define ggc_alloc_dchar_p() ((dchar_p *)(ggc_internal_alloc_stat (sizeof (dchar_p) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dchar_p() ((dchar_p *)(ggc_internal_cleared_alloc_stat (sizeof (dchar_p) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dchar_p(n) ((dchar_p *)(ggc_internal_vec_alloc_stat (sizeof (dchar_p), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dchar_p(n) ((dchar_p *)(ggc_internal_cleared_vec_alloc_stat (sizeof (dchar_p), n MEM_STAT_INFO)))
-#define ggc_alloc_cached_dw_loc_list() ((cached_dw_loc_list *)(ggc_internal_alloc_stat (sizeof (cached_dw_loc_list) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cached_dw_loc_list() ((cached_dw_loc_list *)(ggc_internal_cleared_alloc_stat (sizeof (cached_dw_loc_list) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cached_dw_loc_list(n) ((cached_dw_loc_list *)(ggc_internal_vec_alloc_stat (sizeof (cached_dw_loc_list), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cached_dw_loc_list(n) ((cached_dw_loc_list *)(ggc_internal_cleared_vec_alloc_stat (sizeof (cached_dw_loc_list), n MEM_STAT_INFO)))
-#define ggc_alloc_var_loc_list() ((var_loc_list *)(ggc_internal_alloc_stat (sizeof (var_loc_list) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_var_loc_list() ((var_loc_list *)(ggc_internal_cleared_alloc_stat (sizeof (var_loc_list) MEM_STAT_INFO)))
-#define ggc_alloc_vec_var_loc_list(n) ((var_loc_list *)(ggc_internal_vec_alloc_stat (sizeof (var_loc_list), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_var_loc_list(n) ((var_loc_list *)(ggc_internal_cleared_vec_alloc_stat (sizeof (var_loc_list), n MEM_STAT_INFO)))
-#define ggc_alloc_die_arg_entry() ((die_arg_entry *)(ggc_internal_alloc_stat (sizeof (die_arg_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_die_arg_entry() ((die_arg_entry *)(ggc_internal_cleared_alloc_stat (sizeof (die_arg_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_die_arg_entry(n) ((die_arg_entry *)(ggc_internal_vec_alloc_stat (sizeof (die_arg_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_die_arg_entry(n) ((die_arg_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (die_arg_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_limbo_die_node() ((limbo_die_node *)(ggc_internal_alloc_stat (sizeof (limbo_die_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_limbo_die_node() ((limbo_die_node *)(ggc_internal_cleared_alloc_stat (sizeof (limbo_die_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_limbo_die_node(n) ((limbo_die_node *)(ggc_internal_vec_alloc_stat (sizeof (limbo_die_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_limbo_die_node(n) ((limbo_die_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (limbo_die_node), n MEM_STAT_INFO)))
-#define ggc_alloc_comdat_type_node() ((comdat_type_node *)(ggc_internal_alloc_stat (sizeof (comdat_type_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_comdat_type_node() ((comdat_type_node *)(ggc_internal_cleared_alloc_stat (sizeof (comdat_type_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_comdat_type_node(n) ((comdat_type_node *)(ggc_internal_vec_alloc_stat (sizeof (comdat_type_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_comdat_type_node(n) ((comdat_type_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (comdat_type_node), n MEM_STAT_INFO)))
-#define ggc_alloc_macinfo_entry() ((macinfo_entry *)(ggc_internal_alloc_stat (sizeof (macinfo_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_macinfo_entry() ((macinfo_entry *)(ggc_internal_cleared_alloc_stat (sizeof (macinfo_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_macinfo_entry(n) ((macinfo_entry *)(ggc_internal_vec_alloc_stat (sizeof (macinfo_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_macinfo_entry(n) ((macinfo_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (macinfo_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_pubname_entry() ((pubname_entry *)(ggc_internal_alloc_stat (sizeof (pubname_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_pubname_entry() ((pubname_entry *)(ggc_internal_cleared_alloc_stat (sizeof (pubname_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_pubname_entry(n) ((pubname_entry *)(ggc_internal_vec_alloc_stat (sizeof (pubname_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_pubname_entry(n) ((pubname_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (pubname_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_die_node() ((die_node *)(ggc_internal_alloc_stat (sizeof (die_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_die_node() ((die_node *)(ggc_internal_cleared_alloc_stat (sizeof (die_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_die_node(n) ((die_node *)(ggc_internal_vec_alloc_stat (sizeof (die_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_die_node(n) ((die_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (die_node), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_attr_node() ((dw_attr_node *)(ggc_internal_alloc_stat (sizeof (dw_attr_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_attr_node() ((dw_attr_node *)(ggc_internal_cleared_alloc_stat (sizeof (dw_attr_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_attr_node(n) ((dw_attr_node *)(ggc_internal_vec_alloc_stat (sizeof (dw_attr_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_attr_node(n) ((dw_attr_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (dw_attr_node), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_line_info_table_p() ((dw_line_info_table_p *)(ggc_internal_alloc_stat (sizeof (dw_line_info_table_p) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_line_info_table_p() ((dw_line_info_table_p *)(ggc_internal_cleared_alloc_stat (sizeof (dw_line_info_table_p) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_line_info_table_p(n) ((dw_line_info_table_p *)(ggc_internal_vec_alloc_stat (sizeof (dw_line_info_table_p), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_line_info_table_p(n) ((dw_line_info_table_p *)(ggc_internal_cleared_vec_alloc_stat (sizeof (dw_line_info_table_p), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_line_info_table() ((dw_line_info_table *)(ggc_internal_alloc_stat (sizeof (dw_line_info_table) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_line_info_table() ((dw_line_info_table *)(ggc_internal_cleared_alloc_stat (sizeof (dw_line_info_table) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_line_info_table(n) ((dw_line_info_table *)(ggc_internal_vec_alloc_stat (sizeof (dw_line_info_table), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_line_info_table(n) ((dw_line_info_table *)(ggc_internal_cleared_vec_alloc_stat (sizeof (dw_line_info_table), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_line_info_entry() ((dw_line_info_entry *)(ggc_internal_alloc_stat (sizeof (dw_line_info_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_line_info_entry() ((dw_line_info_entry *)(ggc_internal_cleared_alloc_stat (sizeof (dw_line_info_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_line_info_entry(n) ((dw_line_info_entry *)(ggc_internal_vec_alloc_stat (sizeof (dw_line_info_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_line_info_entry(n) ((dw_line_info_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (dw_line_info_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_comdat_type_node_ref() ((comdat_type_node_ref *)(ggc_internal_alloc_stat (sizeof (comdat_type_node_ref) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_comdat_type_node_ref() ((comdat_type_node_ref *)(ggc_internal_cleared_alloc_stat (sizeof (comdat_type_node_ref) MEM_STAT_INFO)))
-#define ggc_alloc_vec_comdat_type_node_ref(n) ((comdat_type_node_ref *)(ggc_internal_vec_alloc_stat (sizeof (comdat_type_node_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_comdat_type_node_ref(n) ((comdat_type_node_ref *)(ggc_internal_cleared_vec_alloc_stat (sizeof (comdat_type_node_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_ranges_by_label_ref() ((dw_ranges_by_label_ref *)(ggc_internal_alloc_stat (sizeof (dw_ranges_by_label_ref) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_ranges_by_label_ref() ((dw_ranges_by_label_ref *)(ggc_internal_cleared_alloc_stat (sizeof (dw_ranges_by_label_ref) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_ranges_by_label_ref(n) ((dw_ranges_by_label_ref *)(ggc_internal_vec_alloc_stat (sizeof (dw_ranges_by_label_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_ranges_by_label_ref(n) ((dw_ranges_by_label_ref *)(ggc_internal_cleared_vec_alloc_stat (sizeof (dw_ranges_by_label_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_ranges_ref() ((dw_ranges_ref *)(ggc_internal_alloc_stat (sizeof (dw_ranges_ref) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_ranges_ref() ((dw_ranges_ref *)(ggc_internal_cleared_alloc_stat (sizeof (dw_ranges_ref) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_ranges_ref(n) ((dw_ranges_ref *)(ggc_internal_vec_alloc_stat (sizeof (dw_ranges_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_ranges_ref(n) ((dw_ranges_ref *)(ggc_internal_cleared_vec_alloc_stat (sizeof (dw_ranges_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_pubname_ref() ((pubname_ref *)(ggc_internal_alloc_stat (sizeof (pubname_ref) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_pubname_ref() ((pubname_ref *)(ggc_internal_cleared_alloc_stat (sizeof (pubname_ref) MEM_STAT_INFO)))
-#define ggc_alloc_vec_pubname_ref(n) ((pubname_ref *)(ggc_internal_vec_alloc_stat (sizeof (pubname_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_pubname_ref(n) ((pubname_ref *)(ggc_internal_cleared_vec_alloc_stat (sizeof (pubname_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_line_info_ref() ((dw_line_info_ref *)(ggc_internal_alloc_stat (sizeof (dw_line_info_ref) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_line_info_ref() ((dw_line_info_ref *)(ggc_internal_cleared_alloc_stat (sizeof (dw_line_info_ref) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_line_info_ref(n) ((dw_line_info_ref *)(ggc_internal_vec_alloc_stat (sizeof (dw_line_info_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_line_info_ref(n) ((dw_line_info_ref *)(ggc_internal_cleared_vec_alloc_stat (sizeof (dw_line_info_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_attr_ref() ((dw_attr_ref *)(ggc_internal_alloc_stat (sizeof (dw_attr_ref) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_attr_ref() ((dw_attr_ref *)(ggc_internal_cleared_alloc_stat (sizeof (dw_attr_ref) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_attr_ref(n) ((dw_attr_ref *)(ggc_internal_vec_alloc_stat (sizeof (dw_attr_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_attr_ref(n) ((dw_attr_ref *)(ggc_internal_cleared_vec_alloc_stat (sizeof (dw_attr_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_loc_list_node() ((dw_loc_list_node *)(ggc_internal_alloc_stat (sizeof (dw_loc_list_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_loc_list_node() ((dw_loc_list_node *)(ggc_internal_cleared_alloc_stat (sizeof (dw_loc_list_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_loc_list_node(n) ((dw_loc_list_node *)(ggc_internal_vec_alloc_stat (sizeof (dw_loc_list_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_loc_list_node(n) ((dw_loc_list_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (dw_loc_list_node), n MEM_STAT_INFO)))
-#define ggc_alloc_addr_table_entry() ((addr_table_entry *)(ggc_internal_alloc_stat (sizeof (addr_table_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_addr_table_entry() ((addr_table_entry *)(ggc_internal_cleared_alloc_stat (sizeof (addr_table_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_addr_table_entry(n) ((addr_table_entry *)(ggc_internal_vec_alloc_stat (sizeof (addr_table_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_addr_table_entry(n) ((addr_table_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (addr_table_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_deferred_locations() ((deferred_locations *)(ggc_internal_alloc_stat (sizeof (deferred_locations) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_deferred_locations() ((deferred_locations *)(ggc_internal_cleared_alloc_stat (sizeof (deferred_locations) MEM_STAT_INFO)))
-#define ggc_alloc_vec_deferred_locations(n) ((deferred_locations *)(ggc_internal_vec_alloc_stat (sizeof (deferred_locations), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_deferred_locations(n) ((deferred_locations *)(ggc_internal_cleared_vec_alloc_stat (sizeof (deferred_locations), n MEM_STAT_INFO)))
-#define ggc_alloc_reg_saved_in_data() ((reg_saved_in_data *)(ggc_internal_alloc_stat (sizeof (reg_saved_in_data) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_reg_saved_in_data() ((reg_saved_in_data *)(ggc_internal_cleared_alloc_stat (sizeof (reg_saved_in_data) MEM_STAT_INFO)))
-#define ggc_alloc_vec_reg_saved_in_data(n) ((reg_saved_in_data *)(ggc_internal_vec_alloc_stat (sizeof (reg_saved_in_data), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_reg_saved_in_data(n) ((reg_saved_in_data *)(ggc_internal_cleared_vec_alloc_stat (sizeof (reg_saved_in_data), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_cfi_row() ((dw_cfi_row *)(ggc_internal_alloc_stat (sizeof (dw_cfi_row) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_cfi_row() ((dw_cfi_row *)(ggc_internal_cleared_alloc_stat (sizeof (dw_cfi_row) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_cfi_row(n) ((dw_cfi_row *)(ggc_internal_vec_alloc_stat (sizeof (dw_cfi_row), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_cfi_row(n) ((dw_cfi_row *)(ggc_internal_cleared_vec_alloc_stat (sizeof (dw_cfi_row), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_fde_ref() ((dw_fde_ref *)(ggc_internal_alloc_stat (sizeof (dw_fde_ref) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_fde_ref() ((dw_fde_ref *)(ggc_internal_cleared_alloc_stat (sizeof (dw_fde_ref) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_fde_ref(n) ((dw_fde_ref *)(ggc_internal_vec_alloc_stat (sizeof (dw_fde_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_fde_ref(n) ((dw_fde_ref *)(ggc_internal_cleared_vec_alloc_stat (sizeof (dw_fde_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_cfi_vec() ((cfi_vec *)(ggc_internal_alloc_stat (sizeof (cfi_vec) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cfi_vec() ((cfi_vec *)(ggc_internal_cleared_alloc_stat (sizeof (cfi_vec) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cfi_vec(n) ((cfi_vec *)(ggc_internal_vec_alloc_stat (sizeof (cfi_vec), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cfi_vec(n) ((cfi_vec *)(ggc_internal_cleared_vec_alloc_stat (sizeof (cfi_vec), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_loc_list_ref() ((dw_loc_list_ref *)(ggc_internal_alloc_stat (sizeof (dw_loc_list_ref) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_loc_list_ref() ((dw_loc_list_ref *)(ggc_internal_cleared_alloc_stat (sizeof (dw_loc_list_ref) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_loc_list_ref(n) ((dw_loc_list_ref *)(ggc_internal_vec_alloc_stat (sizeof (dw_loc_list_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_loc_list_ref(n) ((dw_loc_list_ref *)(ggc_internal_cleared_vec_alloc_stat (sizeof (dw_loc_list_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_loc_descr_ref() ((dw_loc_descr_ref *)(ggc_internal_alloc_stat (sizeof (dw_loc_descr_ref) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_loc_descr_ref() ((dw_loc_descr_ref *)(ggc_internal_cleared_alloc_stat (sizeof (dw_loc_descr_ref) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_loc_descr_ref(n) ((dw_loc_descr_ref *)(ggc_internal_vec_alloc_stat (sizeof (dw_loc_descr_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_loc_descr_ref(n) ((dw_loc_descr_ref *)(ggc_internal_cleared_vec_alloc_stat (sizeof (dw_loc_descr_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_cfi_ref() ((dw_cfi_ref *)(ggc_internal_alloc_stat (sizeof (dw_cfi_ref) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_cfi_ref() ((dw_cfi_ref *)(ggc_internal_cleared_alloc_stat (sizeof (dw_cfi_ref) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_cfi_ref(n) ((dw_cfi_ref *)(ggc_internal_vec_alloc_stat (sizeof (dw_cfi_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_cfi_ref(n) ((dw_cfi_ref *)(ggc_internal_cleared_vec_alloc_stat (sizeof (dw_cfi_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_val_ref() ((dw_val_ref *)(ggc_internal_alloc_stat (sizeof (dw_val_ref) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_val_ref() ((dw_val_ref *)(ggc_internal_cleared_alloc_stat (sizeof (dw_val_ref) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_val_ref(n) ((dw_val_ref *)(ggc_internal_vec_alloc_stat (sizeof (dw_val_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_val_ref(n) ((dw_val_ref *)(ggc_internal_cleared_vec_alloc_stat (sizeof (dw_val_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_const_dw_die_ref() ((const_dw_die_ref *)(ggc_internal_alloc_stat (sizeof (const_dw_die_ref) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_const_dw_die_ref() ((const_dw_die_ref *)(ggc_internal_cleared_alloc_stat (sizeof (const_dw_die_ref) MEM_STAT_INFO)))
-#define ggc_alloc_vec_const_dw_die_ref(n) ((const_dw_die_ref *)(ggc_internal_vec_alloc_stat (sizeof (const_dw_die_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_const_dw_die_ref(n) ((const_dw_die_ref *)(ggc_internal_cleared_vec_alloc_stat (sizeof (const_dw_die_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_dw_die_ref() ((dw_die_ref *)(ggc_internal_alloc_stat (sizeof (dw_die_ref) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_dw_die_ref() ((dw_die_ref *)(ggc_internal_cleared_alloc_stat (sizeof (dw_die_ref) MEM_STAT_INFO)))
-#define ggc_alloc_vec_dw_die_ref(n) ((dw_die_ref *)(ggc_internal_vec_alloc_stat (sizeof (dw_die_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_dw_die_ref(n) ((dw_die_ref *)(ggc_internal_cleared_vec_alloc_stat (sizeof (dw_die_ref), n MEM_STAT_INFO)))
-#define ggc_alloc_odr_type() ((odr_type *)(ggc_internal_alloc_stat (sizeof (odr_type) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_odr_type() ((odr_type *)(ggc_internal_cleared_alloc_stat (sizeof (odr_type) MEM_STAT_INFO)))
-#define ggc_alloc_vec_odr_type(n) ((odr_type *)(ggc_internal_vec_alloc_stat (sizeof (odr_type), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_odr_type(n) ((odr_type *)(ggc_internal_cleared_vec_alloc_stat (sizeof (odr_type), n MEM_STAT_INFO)))
-#define ggc_alloc_alias_set_entry() ((alias_set_entry *)(ggc_internal_alloc_stat (sizeof (alias_set_entry) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_alias_set_entry() ((alias_set_entry *)(ggc_internal_cleared_alloc_stat (sizeof (alias_set_entry) MEM_STAT_INFO)))
-#define ggc_alloc_vec_alias_set_entry(n) ((alias_set_entry *)(ggc_internal_vec_alloc_stat (sizeof (alias_set_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_alias_set_entry(n) ((alias_set_entry *)(ggc_internal_cleared_vec_alloc_stat (sizeof (alias_set_entry), n MEM_STAT_INFO)))
-#define ggc_alloc_cgraph_edge_p() ((cgraph_edge_p *)(ggc_internal_alloc_stat (sizeof (cgraph_edge_p) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cgraph_edge_p() ((cgraph_edge_p *)(ggc_internal_cleared_alloc_stat (sizeof (cgraph_edge_p) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cgraph_edge_p(n) ((cgraph_edge_p *)(ggc_internal_vec_alloc_stat (sizeof (cgraph_edge_p), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cgraph_edge_p(n) ((cgraph_edge_p *)(ggc_internal_cleared_vec_alloc_stat (sizeof (cgraph_edge_p), n MEM_STAT_INFO)))
-#define ggc_alloc_varpool_node_ptr() ((varpool_node_ptr *)(ggc_internal_alloc_stat (sizeof (varpool_node_ptr) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_varpool_node_ptr() ((varpool_node_ptr *)(ggc_internal_cleared_alloc_stat (sizeof (varpool_node_ptr) MEM_STAT_INFO)))
-#define ggc_alloc_vec_varpool_node_ptr(n) ((varpool_node_ptr *)(ggc_internal_vec_alloc_stat (sizeof (varpool_node_ptr), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_varpool_node_ptr(n) ((varpool_node_ptr *)(ggc_internal_cleared_vec_alloc_stat (sizeof (varpool_node_ptr), n MEM_STAT_INFO)))
-#define ggc_alloc_cgraph_node_ptr() ((cgraph_node_ptr *)(ggc_internal_alloc_stat (sizeof (cgraph_node_ptr) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_cgraph_node_ptr() ((cgraph_node_ptr *)(ggc_internal_cleared_alloc_stat (sizeof (cgraph_node_ptr) MEM_STAT_INFO)))
-#define ggc_alloc_vec_cgraph_node_ptr(n) ((cgraph_node_ptr *)(ggc_internal_vec_alloc_stat (sizeof (cgraph_node_ptr), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_cgraph_node_ptr(n) ((cgraph_node_ptr *)(ggc_internal_cleared_vec_alloc_stat (sizeof (cgraph_node_ptr), n MEM_STAT_INFO)))
-#define ggc_alloc_ipa_replace_map_p() ((ipa_replace_map_p *)(ggc_internal_alloc_stat (sizeof (ipa_replace_map_p) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ipa_replace_map_p() ((ipa_replace_map_p *)(ggc_internal_cleared_alloc_stat (sizeof (ipa_replace_map_p) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_replace_map_p(n) ((ipa_replace_map_p *)(ggc_internal_vec_alloc_stat (sizeof (ipa_replace_map_p), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_replace_map_p(n) ((ipa_replace_map_p *)(ggc_internal_cleared_vec_alloc_stat (sizeof (ipa_replace_map_p), n MEM_STAT_INFO)))
-#define ggc_alloc_ipa_ref_ptr() ((ipa_ref_ptr *)(ggc_internal_alloc_stat (sizeof (ipa_ref_ptr) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ipa_ref_ptr() ((ipa_ref_ptr *)(ggc_internal_cleared_alloc_stat (sizeof (ipa_ref_ptr) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_ref_ptr(n) ((ipa_ref_ptr *)(ggc_internal_vec_alloc_stat (sizeof (ipa_ref_ptr), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_ref_ptr(n) ((ipa_ref_ptr *)(ggc_internal_cleared_vec_alloc_stat (sizeof (ipa_ref_ptr), n MEM_STAT_INFO)))
-#define ggc_alloc_ipa_ref_t() ((ipa_ref_t *)(ggc_internal_alloc_stat (sizeof (ipa_ref_t) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ipa_ref_t() ((ipa_ref_t *)(ggc_internal_cleared_alloc_stat (sizeof (ipa_ref_t) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ipa_ref_t(n) ((ipa_ref_t *)(ggc_internal_vec_alloc_stat (sizeof (ipa_ref_t), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ipa_ref_t(n) ((ipa_ref_t *)(ggc_internal_cleared_vec_alloc_stat (sizeof (ipa_ref_t), n MEM_STAT_INFO)))
-#define ggc_alloc_loop_p() ((loop_p *)(ggc_internal_alloc_stat (sizeof (loop_p) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_loop_p() ((loop_p *)(ggc_internal_cleared_alloc_stat (sizeof (loop_p) MEM_STAT_INFO)))
-#define ggc_alloc_vec_loop_p(n) ((loop_p *)(ggc_internal_vec_alloc_stat (sizeof (loop_p), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_loop_p(n) ((loop_p *)(ggc_internal_cleared_vec_alloc_stat (sizeof (loop_p), n MEM_STAT_INFO)))
-#define ggc_alloc_temp_slot_p() ((temp_slot_p *)(ggc_internal_alloc_stat (sizeof (temp_slot_p) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_temp_slot_p() ((temp_slot_p *)(ggc_internal_cleared_alloc_stat (sizeof (temp_slot_p) MEM_STAT_INFO)))
-#define ggc_alloc_vec_temp_slot_p(n) ((temp_slot_p *)(ggc_internal_vec_alloc_stat (sizeof (temp_slot_p), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_temp_slot_p(n) ((temp_slot_p *)(ggc_internal_cleared_vec_alloc_stat (sizeof (temp_slot_p), n MEM_STAT_INFO)))
-#define ggc_alloc_call_site_record() ((call_site_record *)(ggc_internal_alloc_stat (sizeof (call_site_record) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_call_site_record() ((call_site_record *)(ggc_internal_cleared_alloc_stat (sizeof (call_site_record) MEM_STAT_INFO)))
-#define ggc_alloc_vec_call_site_record(n) ((call_site_record *)(ggc_internal_vec_alloc_stat (sizeof (call_site_record), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_call_site_record(n) ((call_site_record *)(ggc_internal_cleared_vec_alloc_stat (sizeof (call_site_record), n MEM_STAT_INFO)))
-#define ggc_alloc_hashnode() ((hashnode *)(ggc_internal_alloc_stat (sizeof (hashnode) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_hashnode() ((hashnode *)(ggc_internal_cleared_alloc_stat (sizeof (hashnode) MEM_STAT_INFO)))
-#define ggc_alloc_vec_hashnode(n) ((hashnode *)(ggc_internal_vec_alloc_stat (sizeof (hashnode), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_hashnode(n) ((hashnode *)(ggc_internal_cleared_vec_alloc_stat (sizeof (hashnode), n MEM_STAT_INFO)))
-#define ggc_alloc_ht_identifier_ptr() ((ht_identifier_ptr *)(ggc_internal_alloc_stat (sizeof (ht_identifier_ptr) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_ht_identifier_ptr() ((ht_identifier_ptr *)(ggc_internal_cleared_alloc_stat (sizeof (ht_identifier_ptr) MEM_STAT_INFO)))
-#define ggc_alloc_vec_ht_identifier_ptr(n) ((ht_identifier_ptr *)(ggc_internal_vec_alloc_stat (sizeof (ht_identifier_ptr), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_ht_identifier_ptr(n) ((ht_identifier_ptr *)(ggc_internal_cleared_vec_alloc_stat (sizeof (ht_identifier_ptr), n MEM_STAT_INFO)))
-#define ggc_alloc_splay_tree() ((splay_tree *)(ggc_internal_alloc_stat (sizeof (splay_tree) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_splay_tree() ((splay_tree *)(ggc_internal_cleared_alloc_stat (sizeof (splay_tree) MEM_STAT_INFO)))
-#define ggc_alloc_vec_splay_tree(n) ((splay_tree *)(ggc_internal_vec_alloc_stat (sizeof (splay_tree), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_splay_tree(n) ((splay_tree *)(ggc_internal_cleared_vec_alloc_stat (sizeof (splay_tree), n MEM_STAT_INFO)))
-#define ggc_alloc_splay_tree_node() ((splay_tree_node *)(ggc_internal_alloc_stat (sizeof (splay_tree_node) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_splay_tree_node() ((splay_tree_node *)(ggc_internal_cleared_alloc_stat (sizeof (splay_tree_node) MEM_STAT_INFO)))
-#define ggc_alloc_vec_splay_tree_node(n) ((splay_tree_node *)(ggc_internal_vec_alloc_stat (sizeof (splay_tree_node), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_splay_tree_node(n) ((splay_tree_node *)(ggc_internal_cleared_vec_alloc_stat (sizeof (splay_tree_node), n MEM_STAT_INFO)))
-#define ggc_alloc_htab_t() ((htab_t *)(ggc_internal_alloc_stat (sizeof (htab_t) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_htab_t() ((htab_t *)(ggc_internal_cleared_alloc_stat (sizeof (htab_t) MEM_STAT_INFO)))
-#define ggc_alloc_vec_htab_t(n) ((htab_t *)(ggc_internal_vec_alloc_stat (sizeof (htab_t), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_htab_t(n) ((htab_t *)(ggc_internal_cleared_vec_alloc_stat (sizeof (htab_t), n MEM_STAT_INFO)))
-#define ggc_alloc_const_basic_block() ((const_basic_block *)(ggc_internal_alloc_stat (sizeof (const_basic_block) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_const_basic_block() ((const_basic_block *)(ggc_internal_cleared_alloc_stat (sizeof (const_basic_block) MEM_STAT_INFO)))
-#define ggc_alloc_vec_const_basic_block(n) ((const_basic_block *)(ggc_internal_vec_alloc_stat (sizeof (const_basic_block), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_const_basic_block(n) ((const_basic_block *)(ggc_internal_cleared_vec_alloc_stat (sizeof (const_basic_block), n MEM_STAT_INFO)))
-#define ggc_alloc_basic_block() ((basic_block *)(ggc_internal_alloc_stat (sizeof (basic_block) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_basic_block() ((basic_block *)(ggc_internal_cleared_alloc_stat (sizeof (basic_block) MEM_STAT_INFO)))
-#define ggc_alloc_vec_basic_block(n) ((basic_block *)(ggc_internal_vec_alloc_stat (sizeof (basic_block), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_basic_block(n) ((basic_block *)(ggc_internal_cleared_vec_alloc_stat (sizeof (basic_block), n MEM_STAT_INFO)))
-#define ggc_alloc_const_edge() ((const_edge *)(ggc_internal_alloc_stat (sizeof (const_edge) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_const_edge() ((const_edge *)(ggc_internal_cleared_alloc_stat (sizeof (const_edge) MEM_STAT_INFO)))
-#define ggc_alloc_vec_const_edge(n) ((const_edge *)(ggc_internal_vec_alloc_stat (sizeof (const_edge), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_const_edge(n) ((const_edge *)(ggc_internal_cleared_vec_alloc_stat (sizeof (const_edge), n MEM_STAT_INFO)))
-#define ggc_alloc_edge() ((edge *)(ggc_internal_alloc_stat (sizeof (edge) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_edge() ((edge *)(ggc_internal_cleared_alloc_stat (sizeof (edge) MEM_STAT_INFO)))
-#define ggc_alloc_vec_edge(n) ((edge *)(ggc_internal_vec_alloc_stat (sizeof (edge), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_edge(n) ((edge *)(ggc_internal_cleared_vec_alloc_stat (sizeof (edge), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple_seq() ((gimple_seq *)(ggc_internal_alloc_stat (sizeof (gimple_seq) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple_seq() ((gimple_seq *)(ggc_internal_cleared_alloc_stat (sizeof (gimple_seq) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple_seq(n) ((gimple_seq *)(ggc_internal_vec_alloc_stat (sizeof (gimple_seq), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple_seq(n) ((gimple_seq *)(ggc_internal_cleared_vec_alloc_stat (sizeof (gimple_seq), n MEM_STAT_INFO)))
-#define ggc_alloc_const_gimple() ((const_gimple *)(ggc_internal_alloc_stat (sizeof (const_gimple) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_const_gimple() ((const_gimple *)(ggc_internal_cleared_alloc_stat (sizeof (const_gimple) MEM_STAT_INFO)))
-#define ggc_alloc_vec_const_gimple(n) ((const_gimple *)(ggc_internal_vec_alloc_stat (sizeof (const_gimple), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_const_gimple(n) ((const_gimple *)(ggc_internal_cleared_vec_alloc_stat (sizeof (const_gimple), n MEM_STAT_INFO)))
-#define ggc_alloc_gimple() ((gimple *)(ggc_internal_alloc_stat (sizeof (gimple) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_gimple() ((gimple *)(ggc_internal_cleared_alloc_stat (sizeof (gimple) MEM_STAT_INFO)))
-#define ggc_alloc_vec_gimple(n) ((gimple *)(ggc_internal_vec_alloc_stat (sizeof (gimple), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_gimple(n) ((gimple *)(ggc_internal_cleared_vec_alloc_stat (sizeof (gimple), n MEM_STAT_INFO)))
-#define ggc_alloc_const_tree() ((const_tree *)(ggc_internal_alloc_stat (sizeof (const_tree) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_const_tree() ((const_tree *)(ggc_internal_cleared_alloc_stat (sizeof (const_tree) MEM_STAT_INFO)))
-#define ggc_alloc_vec_const_tree(n) ((const_tree *)(ggc_internal_vec_alloc_stat (sizeof (const_tree), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_const_tree(n) ((const_tree *)(ggc_internal_cleared_vec_alloc_stat (sizeof (const_tree), n MEM_STAT_INFO)))
-#define ggc_alloc_tree() ((tree *)(ggc_internal_alloc_stat (sizeof (tree) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_tree() ((tree *)(ggc_internal_cleared_alloc_stat (sizeof (tree) MEM_STAT_INFO)))
-#define ggc_alloc_vec_tree(n) ((tree *)(ggc_internal_vec_alloc_stat (sizeof (tree), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_tree(n) ((tree *)(ggc_internal_cleared_vec_alloc_stat (sizeof (tree), n MEM_STAT_INFO)))
-#define ggc_alloc_const_rtvec() ((const_rtvec *)(ggc_internal_alloc_stat (sizeof (const_rtvec) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_const_rtvec() ((const_rtvec *)(ggc_internal_cleared_alloc_stat (sizeof (const_rtvec) MEM_STAT_INFO)))
-#define ggc_alloc_vec_const_rtvec(n) ((const_rtvec *)(ggc_internal_vec_alloc_stat (sizeof (const_rtvec), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_const_rtvec(n) ((const_rtvec *)(ggc_internal_cleared_vec_alloc_stat (sizeof (const_rtvec), n MEM_STAT_INFO)))
-#define ggc_alloc_rtvec() ((rtvec *)(ggc_internal_alloc_stat (sizeof (rtvec) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtvec() ((rtvec *)(ggc_internal_cleared_alloc_stat (sizeof (rtvec) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtvec(n) ((rtvec *)(ggc_internal_vec_alloc_stat (sizeof (rtvec), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtvec(n) ((rtvec *)(ggc_internal_cleared_vec_alloc_stat (sizeof (rtvec), n MEM_STAT_INFO)))
-#define ggc_alloc_const_rtx() ((const_rtx *)(ggc_internal_alloc_stat (sizeof (const_rtx) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_const_rtx() ((const_rtx *)(ggc_internal_cleared_alloc_stat (sizeof (const_rtx) MEM_STAT_INFO)))
-#define ggc_alloc_vec_const_rtx(n) ((const_rtx *)(ggc_internal_vec_alloc_stat (sizeof (const_rtx), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_const_rtx(n) ((const_rtx *)(ggc_internal_cleared_vec_alloc_stat (sizeof (const_rtx), n MEM_STAT_INFO)))
-#define ggc_alloc_rtx() ((rtx *)(ggc_internal_alloc_stat (sizeof (rtx) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_rtx() ((rtx *)(ggc_internal_cleared_alloc_stat (sizeof (rtx) MEM_STAT_INFO)))
-#define ggc_alloc_vec_rtx(n) ((rtx *)(ggc_internal_vec_alloc_stat (sizeof (rtx), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_rtx(n) ((rtx *)(ggc_internal_cleared_vec_alloc_stat (sizeof (rtx), n MEM_STAT_INFO)))
-#define ggc_alloc_const_bitmap() ((const_bitmap *)(ggc_internal_alloc_stat (sizeof (const_bitmap) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_const_bitmap() ((const_bitmap *)(ggc_internal_cleared_alloc_stat (sizeof (const_bitmap) MEM_STAT_INFO)))
-#define ggc_alloc_vec_const_bitmap(n) ((const_bitmap *)(ggc_internal_vec_alloc_stat (sizeof (const_bitmap), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_const_bitmap(n) ((const_bitmap *)(ggc_internal_cleared_vec_alloc_stat (sizeof (const_bitmap), n MEM_STAT_INFO)))
-#define ggc_alloc_bitmap() ((bitmap *)(ggc_internal_alloc_stat (sizeof (bitmap) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_bitmap() ((bitmap *)(ggc_internal_cleared_alloc_stat (sizeof (bitmap) MEM_STAT_INFO)))
-#define ggc_alloc_vec_bitmap(n) ((bitmap *)(ggc_internal_vec_alloc_stat (sizeof (bitmap), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_bitmap(n) ((bitmap *)(ggc_internal_cleared_vec_alloc_stat (sizeof (bitmap), n MEM_STAT_INFO)))
-#define ggc_alloc_PTR() ((PTR *)(ggc_internal_alloc_stat (sizeof (PTR) MEM_STAT_INFO)))
-#define ggc_alloc_cleared_PTR() ((PTR *)(ggc_internal_cleared_alloc_stat (sizeof (PTR) MEM_STAT_INFO)))
-#define ggc_alloc_vec_PTR(n) ((PTR *)(ggc_internal_vec_alloc_stat (sizeof (PTR), n MEM_STAT_INFO)))
-#define ggc_alloc_cleared_vec_PTR(n) ((PTR *)(ggc_internal_cleared_vec_alloc_stat (sizeof (PTR), n MEM_STAT_INFO)))
-
-/* GC marker procedures.  */
-/* Macros and declarations.  */
-#define gt_ggc_m_24vec_ivarref_entry_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_ivarref_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_ivarref_entry_va_gc_ (void *);
-#define gt_ggc_m_26vec_prot_list_entry_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_prot_list_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_prot_list_entry_va_gc_ (void *);
-#define gt_ggc_m_23vec_msgref_entry_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_msgref_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_msgref_entry_va_gc_ (void *);
-#define gt_ggc_m_27vec_ident_data_tuple_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_ident_data_tuple_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_ident_data_tuple_va_gc_ (void *);
-#define gt_ggc_m_17string_descriptor(X) do { \
-  if (X != NULL) gt_ggc_mx_string_descriptor (X);\
-  } while (0)
-extern void gt_ggc_mx_string_descriptor (void *);
-#define gt_ggc_m_9imp_entry(X) do { \
-  if (X != NULL) gt_ggc_mx_imp_entry (X);\
-  } while (0)
-extern void gt_ggc_mx_imp_entry (void *);
-#define gt_ggc_m_16hashed_attribute(X) do { \
-  if (X != NULL) gt_ggc_mx_hashed_attribute (X);\
-  } while (0)
-extern void gt_ggc_mx_hashed_attribute (void *);
-#define gt_ggc_m_12hashed_entry(X) do { \
-  if (X != NULL) gt_ggc_mx_hashed_entry (X);\
-  } while (0)
-extern void gt_ggc_mx_hashed_entry (void *);
-#define gt_ggc_m_16objc_map_private(X) do { \
-  if (X != NULL) gt_ggc_mx_objc_map_private (X);\
-  } while (0)
-extern void gt_ggc_mx_objc_map_private (void *);
-#define gt_ggc_m_23vec_method_entry_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_method_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_method_entry_va_gc_ (void *);
-#define gt_ggc_m_14type_assertion(X) do { \
-  if (X != NULL) gt_ggc_mx_type_assertion (X);\
-  } while (0)
-extern void gt_ggc_mx_type_assertion (void *);
-#define gt_ggc_m_18treetreehash_entry(X) do { \
-  if (X != NULL) gt_ggc_mx_treetreehash_entry (X);\
-  } while (0)
-extern void gt_ggc_mx_treetreehash_entry (void *);
-#define gt_ggc_m_5CPool(X) do { \
-  if (X != NULL) gt_ggc_mx_CPool (X);\
-  } while (0)
-extern void gt_ggc_mx_CPool (void *);
-#define gt_ggc_m_3JCF(X) do { \
-  if (X != NULL) gt_ggc_mx_JCF (X);\
-  } while (0)
-extern void gt_ggc_mx_JCF (void *);
-#define gt_ggc_m_17module_htab_entry(X) do { \
-  if (X != NULL) gt_ggc_mx_module_htab_entry (X);\
-  } while (0)
-extern void gt_ggc_mx_module_htab_entry (void *);
-#define gt_ggc_m_13binding_level(X) do { \
-  if (X != NULL) gt_ggc_mx_binding_level (X);\
-  } while (0)
-extern void gt_ggc_mx_binding_level (void *);
-#define gt_ggc_m_27vec_pending_noexcept_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_pending_noexcept_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_pending_noexcept_va_gc_ (void *);
-#define gt_ggc_m_21pending_abstract_type(X) do { \
-  if (X != NULL) gt_ggc_mx_pending_abstract_type (X);\
-  } while (0)
-extern void gt_ggc_mx_pending_abstract_type (void *);
-#define gt_ggc_m_19vec_tree_int_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_tree_int_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_tree_int_va_gc_ (void *);
-#define gt_ggc_m_9cp_parser(X) do { \
-  if (X != NULL) gt_ggc_mx_cp_parser (X);\
-  } while (0)
-extern void gt_ggc_mx_cp_parser (void *);
-#define gt_ggc_m_38vec_cp_unparsed_functions_entry_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_cp_unparsed_functions_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_cp_unparsed_functions_entry_va_gc_ (void *);
-#define gt_ggc_m_17cp_parser_context(X) do { \
-  if (X != NULL) gt_ggc_mx_cp_parser_context (X);\
-  } while (0)
-extern void gt_ggc_mx_cp_parser_context (void *);
-#define gt_ggc_m_31vec_cp_default_arg_entry_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_cp_default_arg_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_cp_default_arg_entry_va_gc_ (void *);
-#define gt_ggc_m_8cp_lexer(X) do { \
-  if (X != NULL) gt_ggc_mx_cp_lexer (X);\
-  } while (0)
-extern void gt_ggc_mx_cp_lexer (void *);
-#define gt_ggc_m_19vec_cp_token_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_cp_token_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_cp_token_va_gc_ (void *);
-#define gt_ggc_m_10tree_check(X) do { \
-  if (X != NULL) gt_ggc_mx_tree_check (X);\
-  } while (0)
-extern void gt_ggc_mx_tree_check (void *);
-#define gt_ggc_m_14constexpr_call(X) do { \
-  if (X != NULL) gt_ggc_mx_constexpr_call (X);\
-  } while (0)
-extern void gt_ggc_mx_constexpr_call (void *);
-#define gt_ggc_m_16constexpr_fundef(X) do { \
-  if (X != NULL) gt_ggc_mx_constexpr_fundef (X);\
-  } while (0)
-extern void gt_ggc_mx_constexpr_fundef (void *);
-#define gt_ggc_m_26vec_deferred_access_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_deferred_access_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_deferred_access_va_gc_ (void *);
-#define gt_ggc_m_32vec_deferred_access_check_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_deferred_access_check_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_deferred_access_check_va_gc_ (void *);
-#define gt_ggc_m_10spec_entry(X) do { \
-  if (X != NULL) gt_ggc_mx_spec_entry (X);\
-  } while (0)
-extern void gt_ggc_mx_spec_entry (void *);
-#define gt_ggc_m_16pending_template(X) do { \
-  if (X != NULL) gt_ggc_mx_pending_template (X);\
-  } while (0)
-extern void gt_ggc_mx_pending_template (void *);
-#define gt_ggc_m_25vec_incomplete_var_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_incomplete_var_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_incomplete_var_va_gc_ (void *);
-#define gt_ggc_m_21named_label_use_entry(X) do { \
-  if (X != NULL) gt_ggc_mx_named_label_use_entry (X);\
-  } while (0)
-extern void gt_ggc_mx_named_label_use_entry (void *);
-#define gt_ggc_m_22vec_tree_pair_s_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_tree_pair_s_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_tree_pair_s_va_gc_ (void *);
-#define gt_ggc_m_17named_label_entry(X) do { \
-  if (X != NULL) gt_ggc_mx_named_label_entry (X);\
-  } while (0)
-extern void gt_ggc_mx_named_label_entry (void *);
-#define gt_ggc_m_28vec_cxx_saved_binding_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_cxx_saved_binding_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_cxx_saved_binding_va_gc_ (void *);
-#define gt_ggc_m_36vec_qualified_typedef_usage_t_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_qualified_typedef_usage_t_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_qualified_typedef_usage_t_va_gc_ (void *);
-#define gt_ggc_m_14cp_token_cache(X) do { \
-  if (X != NULL) gt_ggc_mx_cp_token_cache (X);\
-  } while (0)
-extern void gt_ggc_mx_cp_token_cache (void *);
-#define gt_ggc_m_11saved_scope(X) do { \
-  if (X != NULL) gt_ggc_mx_saved_scope (X);\
-  } while (0)
-extern void gt_ggc_mx_saved_scope (void *);
-#define gt_ggc_m_16cxx_int_tree_map(X) do { \
-  if (X != NULL) gt_ggc_mx_cxx_int_tree_map (X);\
-  } while (0)
-extern void gt_ggc_mx_cxx_int_tree_map (void *);
-#define gt_ggc_m_27vec_cp_label_binding_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_cp_label_binding_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_cp_label_binding_va_gc_ (void *);
-#define gt_ggc_m_27vec_cp_class_binding_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_cp_class_binding_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_cp_class_binding_va_gc_ (void *);
-#define gt_ggc_m_16cp_binding_level(X) do { \
-  if (X != NULL) gt_ggc_mx_cp_binding_level (X);\
-  } while (0)
-extern void gt_ggc_mx_cp_binding_level (void *);
-#define gt_ggc_m_11cxx_binding(X) do { \
-  if (X != NULL) gt_ggc_mx_cxx_binding (X);\
-  } while (0)
-extern void gt_ggc_mx_cxx_binding (void *);
-#define gt_ggc_m_15binding_entry_s(X) do { \
-  if (X != NULL) gt_ggc_mx_binding_entry_s (X);\
-  } while (0)
-extern void gt_ggc_mx_binding_entry_s (void *);
-#define gt_ggc_m_15binding_table_s(X) do { \
-  if (X != NULL) gt_ggc_mx_binding_table_s (X);\
-  } while (0)
-extern void gt_ggc_mx_binding_table_s (void *);
-#define gt_ggc_m_11tinst_level(X) do { \
-  if (X != NULL) gt_ggc_mx_tinst_level (X);\
-  } while (0)
-extern void gt_ggc_mx_tinst_level (void *);
-#define gt_ggc_m_18vec_tinfo_s_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_tinfo_s_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_tinfo_s_va_gc_ (void *);
-#define gt_ggc_m_8c_parser(X) do { \
-  if (X != NULL) gt_ggc_mx_c_parser (X);\
-  } while (0)
-extern void gt_ggc_mx_c_parser (void *);
-#define gt_ggc_m_18vec_c_token_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_c_token_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_c_token_va_gc_ (void *);
-#define gt_ggc_m_9opt_stack(X) do { \
-  if (X != NULL) gt_ggc_mx_opt_stack (X);\
-  } while (0)
-extern void gt_ggc_mx_opt_stack (void *);
-#define gt_ggc_m_31vec_pending_redefinition_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_pending_redefinition_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_pending_redefinition_va_gc_ (void *);
-#define gt_ggc_m_23vec_pending_weak_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_pending_weak_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_pending_weak_va_gc_ (void *);
-#define gt_ggc_m_11align_stack(X) do { \
-  if (X != NULL) gt_ggc_mx_align_stack (X);\
-  } while (0)
-extern void gt_ggc_mx_align_stack (void *);
-#define gt_ggc_m_22vec_tree_gc_vec_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_tree_gc_vec_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_tree_gc_vec_va_gc_ (void *);
-#define gt_ggc_m_23vec_const_char_p_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_const_char_p_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_const_char_p_va_gc_ (void *);
-#define gt_ggc_m_18sorted_fields_type(X) do { \
-  if (X != NULL) gt_ggc_mx_sorted_fields_type (X);\
-  } while (0)
-extern void gt_ggc_mx_sorted_fields_type (void *);
-#define gt_ggc_m_15c_inline_static(X) do { \
-  if (X != NULL) gt_ggc_mx_c_inline_static (X);\
-  } while (0)
-extern void gt_ggc_mx_c_inline_static (void *);
-#define gt_ggc_m_28vec_c_goto_bindings_p_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_c_goto_bindings_p_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_c_goto_bindings_p_va_gc_ (void *);
-#define gt_ggc_m_15c_goto_bindings(X) do { \
-  if (X != NULL) gt_ggc_mx_c_goto_bindings (X);\
-  } while (0)
-extern void gt_ggc_mx_c_goto_bindings (void *);
-#define gt_ggc_m_7c_scope(X) do { \
-  if (X != NULL) gt_ggc_mx_c_scope (X);\
-  } while (0)
-extern void gt_ggc_mx_c_scope (void *);
-#define gt_ggc_m_9c_binding(X) do { \
-  if (X != NULL) gt_ggc_mx_c_binding (X);\
-  } while (0)
-extern void gt_ggc_mx_c_binding (void *);
-#define gt_ggc_m_12c_label_vars(X) do { \
-  if (X != NULL) gt_ggc_mx_c_label_vars (X);\
-  } while (0)
-extern void gt_ggc_mx_c_label_vars (void *);
-#define gt_ggc_m_13pad_type_hash(X) do { \
-  if (X != NULL) gt_ggc_mx_pad_type_hash (X);\
-  } while (0)
-extern void gt_ggc_mx_pad_type_hash (void *);
-#define gt_ggc_m_18gnat_binding_level(X) do { \
-  if (X != NULL) gt_ggc_mx_gnat_binding_level (X);\
-  } while (0)
-extern void gt_ggc_mx_gnat_binding_level (void *);
-#define gt_ggc_m_20vec_loop_info_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_loop_info_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_loop_info_va_gc_ (void *);
-#define gt_ggc_m_11loop_info_d(X) do { \
-  if (X != NULL) gt_ggc_mx_loop_info_d (X);\
-  } while (0)
-extern void gt_ggc_mx_loop_info_d (void *);
-#define gt_ggc_m_27vec_range_check_info_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_range_check_info_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_range_check_info_va_gc_ (void *);
-#define gt_ggc_m_18range_check_info_d(X) do { \
-  if (X != NULL) gt_ggc_mx_range_check_info_d (X);\
-  } while (0)
-extern void gt_ggc_mx_range_check_info_d (void *);
-#define gt_ggc_m_9elab_info(X) do { \
-  if (X != NULL) gt_ggc_mx_elab_info (X);\
-  } while (0)
-extern void gt_ggc_mx_elab_info (void *);
-#define gt_ggc_m_10stmt_group(X) do { \
-  if (X != NULL) gt_ggc_mx_stmt_group (X);\
-  } while (0)
-extern void gt_ggc_mx_stmt_group (void *);
-#define gt_ggc_m_20vec_parm_attr_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_parm_attr_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_parm_attr_va_gc_ (void *);
-#define gt_ggc_m_11parm_attr_d(X) do { \
-  if (X != NULL) gt_ggc_mx_parm_attr_d (X);\
-  } while (0)
-extern void gt_ggc_mx_parm_attr_d (void *);
-#define gt_ggc_m_19vec_odr_type_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_odr_type_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_odr_type_va_gc_ (void *);
-#define gt_ggc_m_13tree_type_map(X) do { \
-  if (X != NULL) gt_ggc_mx_tree_type_map (X);\
-  } while (0)
-extern void gt_ggc_mx_tree_type_map (void *);
-#define gt_ggc_m_27vec_inline_summary_t_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_inline_summary_t_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_inline_summary_t_va_gc_ (void *);
-#define gt_ggc_m_26vec_size_time_entry_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_size_time_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_size_time_entry_va_gc_ (void *);
-#define gt_ggc_m_20vec_condition_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_condition_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_condition_va_gc_ (void *);
-#define gt_ggc_m_17lto_in_decl_state(X) do { \
-  if (X != NULL) gt_ggc_mx_lto_in_decl_state (X);\
-  } while (0)
-extern void gt_ggc_mx_lto_in_decl_state (void *);
-#define gt_ggc_m_24vec_ipa_edge_args_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_ipa_edge_args_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_ipa_edge_args_va_gc_ (void *);
-#define gt_ggc_m_38vec_ipa_agg_replacement_value_p_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_ipa_agg_replacement_value_p_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_ipa_agg_replacement_value_p_va_gc_ (void *);
-#define gt_ggc_m_24vec_ipa_jump_func_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_ipa_jump_func_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_ipa_jump_func_va_gc_ (void *);
-#define gt_ggc_m_26vec_ipa_agg_jf_item_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_ipa_agg_jf_item_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_ipa_agg_jf_item_va_gc_ (void *);
-#define gt_ggc_m_20ssa_operand_memory_d(X) do { \
-  if (X != NULL) gt_ggc_mx_ssa_operand_memory_d (X);\
-  } while (0)
-extern void gt_ggc_mx_ssa_operand_memory_d (void *);
-#define gt_ggc_m_13scev_info_str(X) do { \
-  if (X != NULL) gt_ggc_mx_scev_info_str (X);\
-  } while (0)
-extern void gt_ggc_mx_scev_info_str (void *);
-#define gt_ggc_m_28vec_mem_addr_template_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_mem_addr_template_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_mem_addr_template_va_gc_ (void *);
-#define gt_ggc_m_17vec_gimple_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_gimple_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_gimple_va_gc_ (void *);
-#define gt_ggc_m_15tm_restart_node(X) do { \
-  if (X != NULL) gt_ggc_mx_tm_restart_node (X);\
-  } while (0)
-extern void gt_ggc_mx_tm_restart_node (void *);
-#define gt_ggc_m_9type_hash(X) do { \
-  if (X != NULL) gt_ggc_mx_type_hash (X);\
-  } while (0)
-extern void gt_ggc_mx_type_hash (void *);
-#define gt_ggc_m_16string_pool_data(X) do { \
-  if (X != NULL) gt_ggc_mx_string_pool_data (X);\
-  } while (0)
-extern void gt_ggc_mx_string_pool_data (void *);
-#define gt_ggc_m_23temp_slot_address_entry(X) do { \
-  if (X != NULL) gt_ggc_mx_temp_slot_address_entry (X);\
-  } while (0)
-extern void gt_ggc_mx_temp_slot_address_entry (void *);
-#define gt_ggc_m_15throw_stmt_node(X) do { \
-  if (X != NULL) gt_ggc_mx_throw_stmt_node (X);\
-  } while (0)
-extern void gt_ggc_mx_throw_stmt_node (void *);
-#define gt_ggc_m_25vec_eh_landing_pad_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_eh_landing_pad_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_eh_landing_pad_va_gc_ (void *);
-#define gt_ggc_m_20vec_eh_region_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_eh_region_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_eh_region_va_gc_ (void *);
-#define gt_ggc_m_10eh_catch_d(X) do { \
-  if (X != NULL) gt_ggc_mx_eh_catch_d (X);\
-  } while (0)
-extern void gt_ggc_mx_eh_catch_d (void *);
-#define gt_ggc_m_16eh_landing_pad_d(X) do { \
-  if (X != NULL) gt_ggc_mx_eh_landing_pad_d (X);\
-  } while (0)
-extern void gt_ggc_mx_eh_landing_pad_d (void *);
-#define gt_ggc_m_13pointer_map_t(X) do { \
-  if (X != NULL) gt_ggc_mx_pointer_map_t (X);\
-  } while (0)
-extern void gt_ggc_mx_pointer_map_t (void *);
-#define gt_ggc_m_11eh_region_d(X) do { \
-  if (X != NULL) gt_ggc_mx_eh_region_d (X);\
-  } while (0)
-extern void gt_ggc_mx_eh_region_d (void *);
-#define gt_ggc_m_24vec_die_arg_entry_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_die_arg_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_die_arg_entry_va_gc_ (void *);
-#define gt_ggc_m_24vec_macinfo_entry_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_macinfo_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_macinfo_entry_va_gc_ (void *);
-#define gt_ggc_m_24vec_pubname_entry_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_pubname_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_pubname_entry_va_gc_ (void *);
-#define gt_ggc_m_31vec_dw_line_info_table_p_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_dw_line_info_table_p_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_dw_line_info_table_p_va_gc_ (void *);
-#define gt_ggc_m_22cached_dw_loc_list_def(X) do { \
-  if (X != NULL) gt_ggc_mx_cached_dw_loc_list_def (X);\
-  } while (0)
-extern void gt_ggc_mx_cached_dw_loc_list_def (void *);
-#define gt_ggc_m_17call_arg_loc_node(X) do { \
-  if (X != NULL) gt_ggc_mx_call_arg_loc_node (X);\
-  } while (0)
-extern void gt_ggc_mx_call_arg_loc_node (void *);
-#define gt_ggc_m_16var_loc_list_def(X) do { \
-  if (X != NULL) gt_ggc_mx_var_loc_list_def (X);\
-  } while (0)
-extern void gt_ggc_mx_var_loc_list_def (void *);
-#define gt_ggc_m_12var_loc_node(X) do { \
-  if (X != NULL) gt_ggc_mx_var_loc_node (X);\
-  } while (0)
-extern void gt_ggc_mx_var_loc_node (void *);
-#define gt_ggc_m_16limbo_die_struct(X) do { \
-  if (X != NULL) gt_ggc_mx_limbo_die_struct (X);\
-  } while (0)
-extern void gt_ggc_mx_limbo_die_struct (void *);
-#define gt_ggc_m_23vec_dw_attr_node_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_dw_attr_node_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_dw_attr_node_va_gc_ (void *);
-#define gt_ggc_m_25dw_line_info_table_struct(X) do { \
-  if (X != NULL) gt_ggc_mx_dw_line_info_table_struct (X);\
-  } while (0)
-extern void gt_ggc_mx_dw_line_info_table_struct (void *);
-#define gt_ggc_m_29vec_dw_line_info_entry_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_dw_line_info_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_dw_line_info_entry_va_gc_ (void *);
-#define gt_ggc_m_18comdat_type_struct(X) do { \
-  if (X != NULL) gt_ggc_mx_comdat_type_struct (X);\
-  } while (0)
-extern void gt_ggc_mx_comdat_type_struct (void *);
-#define gt_ggc_m_25dw_ranges_by_label_struct(X) do { \
-  if (X != NULL) gt_ggc_mx_dw_ranges_by_label_struct (X);\
-  } while (0)
-extern void gt_ggc_mx_dw_ranges_by_label_struct (void *);
-#define gt_ggc_m_16dw_ranges_struct(X) do { \
-  if (X != NULL) gt_ggc_mx_dw_ranges_struct (X);\
-  } while (0)
-extern void gt_ggc_mx_dw_ranges_struct (void *);
-#define gt_ggc_m_29vec_deferred_locations_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_deferred_locations_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_deferred_locations_va_gc_ (void *);
-#define gt_ggc_m_21vec_dw_fde_ref_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_dw_fde_ref_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_dw_fde_ref_va_gc_ (void *);
-#define gt_ggc_m_24reg_saved_in_data_struct(X) do { \
-  if (X != NULL) gt_ggc_mx_reg_saved_in_data_struct (X);\
-  } while (0)
-extern void gt_ggc_mx_reg_saved_in_data_struct (void *);
-#define gt_ggc_m_17dw_cfi_row_struct(X) do { \
-  if (X != NULL) gt_ggc_mx_dw_cfi_row_struct (X);\
-  } while (0)
-extern void gt_ggc_mx_dw_cfi_row_struct (void *);
-#define gt_ggc_m_15dwarf_file_data(X) do { \
-  if (X != NULL) gt_ggc_mx_dwarf_file_data (X);\
-  } while (0)
-extern void gt_ggc_mx_dwarf_file_data (void *);
-#define gt_ggc_m_20indirect_string_node(X) do { \
-  if (X != NULL) gt_ggc_mx_indirect_string_node (X);\
-  } while (0)
-extern void gt_ggc_mx_indirect_string_node (void *);
-#define gt_ggc_m_23addr_table_entry_struct(X) do { \
-  if (X != NULL) gt_ggc_mx_addr_table_entry_struct (X);\
-  } while (0)
-extern void gt_ggc_mx_addr_table_entry_struct (void *);
-#define gt_ggc_m_21vec_dw_cfi_ref_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_dw_cfi_ref_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_dw_cfi_ref_va_gc_ (void *);
-#define gt_ggc_m_18dw_loc_list_struct(X) do { \
-  if (X != NULL) gt_ggc_mx_dw_loc_list_struct (X);\
-  } while (0)
-extern void gt_ggc_mx_dw_loc_list_struct (void *);
-#define gt_ggc_m_17dw_loc_descr_node(X) do { \
-  if (X != NULL) gt_ggc_mx_dw_loc_descr_node (X);\
-  } while (0)
-extern void gt_ggc_mx_dw_loc_descr_node (void *);
-#define gt_ggc_m_11dw_cfi_node(X) do { \
-  if (X != NULL) gt_ggc_mx_dw_cfi_node (X);\
-  } while (0)
-extern void gt_ggc_mx_dw_cfi_node (void *);
-#define gt_ggc_m_8typeinfo(X) do { \
-  if (X != NULL) gt_ggc_mx_typeinfo (X);\
-  } while (0)
-extern void gt_ggc_mx_typeinfo (void *);
-#define gt_ggc_m_10odr_type_d(X) do { \
-  if (X != NULL) gt_ggc_mx_odr_type_d (X);\
-  } while (0)
-extern void gt_ggc_mx_odr_type_d (void *);
-#define gt_ggc_m_25ipa_agg_replacement_value(X) do { \
-  if (X != NULL) gt_ggc_mx_ipa_agg_replacement_value (X);\
-  } while (0)
-extern void gt_ggc_mx_ipa_agg_replacement_value (void *);
-#define gt_ggc_m_26vec_alias_set_entry_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_alias_set_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_alias_set_entry_va_gc_ (void *);
-#define gt_ggc_m_17alias_set_entry_d(X) do { \
-  if (X != NULL) gt_ggc_mx_alias_set_entry_d (X);\
-  } while (0)
-extern void gt_ggc_mx_alias_set_entry_d (void *);
-#define gt_ggc_m_24constant_descriptor_tree(X) do { \
-  if (X != NULL) gt_ggc_mx_constant_descriptor_tree (X);\
-  } while (0)
-extern void gt_ggc_mx_constant_descriptor_tree (void *);
-#define gt_ggc_m_8asm_node(X) do { \
-  if (X != NULL) gt_ggc_mx_asm_node (X);\
-  } while (0)
-extern void gt_ggc_mx_asm_node (void *);
-#define gt_ggc_m_25cgraph_indirect_call_info(X) do { \
-  if (X != NULL) gt_ggc_mx_cgraph_indirect_call_info (X);\
-  } while (0)
-extern void gt_ggc_mx_cgraph_indirect_call_info (void *);
-#define gt_ggc_m_28cgraph_function_version_info(X) do { \
-  if (X != NULL) gt_ggc_mx_cgraph_function_version_info (X);\
-  } while (0)
-extern void gt_ggc_mx_cgraph_function_version_info (void *);
-#define gt_ggc_m_11cgraph_edge(X) do { \
-  if (X != NULL) gt_ggc_mx_cgraph_edge (X);\
-  } while (0)
-extern void gt_ggc_mx_cgraph_edge (void *);
-#define gt_ggc_m_17cgraph_simd_clone(X) do { \
-  if (X != NULL) gt_ggc_mx_cgraph_simd_clone (X);\
-  } while (0)
-extern void gt_ggc_mx_cgraph_simd_clone (void *);
-#define gt_ggc_m_28vec_ipa_replace_map_p_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_ipa_replace_map_p_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_ipa_replace_map_p_va_gc_ (void *);
-#define gt_ggc_m_15ipa_replace_map(X) do { \
-  if (X != NULL) gt_ggc_mx_ipa_replace_map (X);\
-  } while (0)
-extern void gt_ggc_mx_ipa_replace_map (void *);
-#define gt_ggc_m_18lto_file_decl_data(X) do { \
-  if (X != NULL) gt_ggc_mx_lto_file_decl_data (X);\
-  } while (0)
-extern void gt_ggc_mx_lto_file_decl_data (void *);
-#define gt_ggc_m_20vec_ipa_ref_t_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_ipa_ref_t_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_ipa_ref_t_va_gc_ (void *);
-#define gt_ggc_m_11symtab_node(X) do { \
-  if (X != NULL) gt_ggc_mx_symtab_node (X);\
-  } while (0)
-extern void gt_ggc_mx_symtab_node (void *);
-#define gt_ggc_m_22vec_basic_block_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_basic_block_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_basic_block_va_gc_ (void *);
-#define gt_ggc_m_15vec_edge_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_edge_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_edge_va_gc_ (void *);
-#define gt_ggc_m_11rtl_bb_info(X) do { \
-  if (X != NULL) gt_ggc_mx_rtl_bb_info (X);\
-  } while (0)
-extern void gt_ggc_mx_rtl_bb_info (void *);
-#define gt_ggc_m_10niter_desc(X) do { \
-  if (X != NULL) gt_ggc_mx_niter_desc (X);\
-  } while (0)
-extern void gt_ggc_mx_niter_desc (void *);
-#define gt_ggc_m_17vec_loop_p_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_loop_p_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_loop_p_va_gc_ (void *);
-#define gt_ggc_m_4loop(X) do { \
-  if (X != NULL) gt_ggc_mx_loop (X);\
-  } while (0)
-extern void gt_ggc_mx_loop (void *);
-#define gt_ggc_m_9loop_exit(X) do { \
-  if (X != NULL) gt_ggc_mx_loop_exit (X);\
-  } while (0)
-extern void gt_ggc_mx_loop_exit (void *);
-#define gt_ggc_m_13nb_iter_bound(X) do { \
-  if (X != NULL) gt_ggc_mx_nb_iter_bound (X);\
-  } while (0)
-extern void gt_ggc_mx_nb_iter_bound (void *);
-#define gt_ggc_m_24types_used_by_vars_entry(X) do { \
-  if (X != NULL) gt_ggc_mx_types_used_by_vars_entry (X);\
-  } while (0)
-extern void gt_ggc_mx_types_used_by_vars_entry (void *);
-#define gt_ggc_m_17language_function(X) do { \
-  if (X != NULL) gt_ggc_mx_language_function (X);\
-  } while (0)
-extern void gt_ggc_mx_language_function (void *);
-#define gt_ggc_m_5loops(X) do { \
-  if (X != NULL) gt_ggc_mx_loops (X);\
-  } while (0)
-extern void gt_ggc_mx_loops (void *);
-#define gt_ggc_m_18control_flow_graph(X) do { \
-  if (X != NULL) gt_ggc_mx_control_flow_graph (X);\
-  } while (0)
-extern void gt_ggc_mx_control_flow_graph (void *);
-#define gt_ggc_m_9eh_status(X) do { \
-  if (X != NULL) gt_ggc_mx_eh_status (X);\
-  } while (0)
-extern void gt_ggc_mx_eh_status (void *);
-#define gt_ggc_m_11stack_usage(X) do { \
-  if (X != NULL) gt_ggc_mx_stack_usage (X);\
-  } while (0)
-extern void gt_ggc_mx_stack_usage (void *);
-#define gt_ggc_m_22vec_temp_slot_p_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_temp_slot_p_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_temp_slot_p_va_gc_ (void *);
-#define gt_ggc_m_20initial_value_struct(X) do { \
-  if (X != NULL) gt_ggc_mx_initial_value_struct (X);\
-  } while (0)
-extern void gt_ggc_mx_initial_value_struct (void *);
-#define gt_ggc_m_11frame_space(X) do { \
-  if (X != NULL) gt_ggc_mx_frame_space (X);\
-  } while (0)
-extern void gt_ggc_mx_frame_space (void *);
-#define gt_ggc_m_17rtx_constant_pool(X) do { \
-  if (X != NULL) gt_ggc_mx_rtx_constant_pool (X);\
-  } while (0)
-extern void gt_ggc_mx_rtx_constant_pool (void *);
-#define gt_ggc_m_11dw_fde_node(X) do { \
-  if (X != NULL) gt_ggc_mx_dw_fde_node (X);\
-  } while (0)
-extern void gt_ggc_mx_dw_fde_node (void *);
-#define gt_ggc_m_9temp_slot(X) do { \
-  if (X != NULL) gt_ggc_mx_temp_slot (X);\
-  } while (0)
-extern void gt_ggc_mx_temp_slot (void *);
-#define gt_ggc_m_9gimple_df(X) do { \
-  if (X != NULL) gt_ggc_mx_gimple_df (X);\
-  } while (0)
-extern void gt_ggc_mx_gimple_df (void *);
-#define gt_ggc_m_27vec_call_site_record_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_call_site_record_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_call_site_record_va_gc_ (void *);
-#define gt_ggc_m_16vec_uchar_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_uchar_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_uchar_va_gc_ (void *);
-#define gt_ggc_m_18call_site_record_d(X) do { \
-  if (X != NULL) gt_ggc_mx_call_site_record_d (X);\
-  } while (0)
-extern void gt_ggc_mx_call_site_record_d (void *);
-#define gt_ggc_m_14sequence_stack(X) do { \
-  if (X != NULL) gt_ggc_mx_sequence_stack (X);\
-  } while (0)
-extern void gt_ggc_mx_sequence_stack (void *);
-#define gt_ggc_m_15target_libfuncs(X) do { \
-  if (X != NULL) gt_ggc_mx_target_libfuncs (X);\
-  } while (0)
-extern void gt_ggc_mx_target_libfuncs (void *);
-#define gt_ggc_m_13libfunc_entry(X) do { \
-  if (X != NULL) gt_ggc_mx_libfunc_entry (X);\
-  } while (0)
-extern void gt_ggc_mx_libfunc_entry (void *);
-#define gt_ggc_m_21vec_alias_pair_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_alias_pair_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_alias_pair_va_gc_ (void *);
-#define gt_ggc_m_12tree_vec_map(X) do { \
-  if (X != NULL) gt_ggc_mx_tree_vec_map (X);\
-  } while (0)
-extern void gt_ggc_mx_tree_vec_map (void *);
-#define gt_ggc_m_17tree_priority_map(X) do { \
-  if (X != NULL) gt_ggc_mx_tree_priority_map (X);\
-  } while (0)
-extern void gt_ggc_mx_tree_priority_map (void *);
-#define gt_ggc_m_12tree_int_map(X) do { \
-  if (X != NULL) gt_ggc_mx_tree_int_map (X);\
-  } while (0)
-extern void gt_ggc_mx_tree_int_map (void *);
-#define gt_ggc_m_13tree_decl_map(X) do { \
-  if (X != NULL) gt_ggc_mx_tree_decl_map (X);\
-  } while (0)
-extern void gt_ggc_mx_tree_decl_map (void *);
-#define gt_ggc_m_8tree_map(X) do { \
-  if (X != NULL) gt_ggc_mx_tree_map (X);\
-  } while (0)
-extern void gt_ggc_mx_tree_map (void *);
-#define gt_ggc_m_14lang_tree_node(X) do { \
-  if (X != NULL) gt_ggc_mx_lang_tree_node (X);\
-  } while (0)
-extern void gt_ggc_mx_lang_tree_node (void *);
-#define gt_ggc_m_14target_globals(X) do { \
-  if (X != NULL) gt_ggc_mx_target_globals (X);\
-  } while (0)
-extern void gt_ggc_mx_target_globals (void *);
-#define gt_ggc_m_24tree_statement_list_node(X) do { \
-  if (X != NULL) gt_ggc_mx_tree_statement_list_node (X);\
-  } while (0)
-extern void gt_ggc_mx_tree_statement_list_node (void *);
-#define gt_ggc_m_9lang_decl(X) do { \
-  if (X != NULL) gt_ggc_mx_lang_decl (X);\
-  } while (0)
-extern void gt_ggc_mx_lang_decl (void *);
-#define gt_ggc_m_9lang_type(X) do { \
-  if (X != NULL) gt_ggc_mx_lang_type (X);\
-  } while (0)
-extern void gt_ggc_mx_lang_type (void *);
-#define gt_ggc_m_15vec_tree_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_tree_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_tree_va_gc_ (void *);
-#define gt_ggc_m_26vec_constructor_elt_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_constructor_elt_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_constructor_elt_va_gc_ (void *);
-#define gt_ggc_m_10die_struct(X) do { \
-  if (X != NULL) gt_ggc_mx_die_struct (X);\
-  } while (0)
-extern void gt_ggc_mx_die_struct (void *);
-#define gt_ggc_m_14range_info_def(X) do { \
-  if (X != NULL) gt_ggc_mx_range_info_def (X);\
-  } while (0)
-extern void gt_ggc_mx_range_info_def (void *);
-#define gt_ggc_m_12ptr_info_def(X) do { \
-  if (X != NULL) gt_ggc_mx_ptr_info_def (X);\
-  } while (0)
-extern void gt_ggc_mx_ptr_info_def (void *);
-#define gt_ggc_m_10target_rtl(X) do { \
-  if (X != NULL) gt_ggc_mx_target_rtl (X);\
-  } while (0)
-extern void gt_ggc_mx_target_rtl (void *);
-#define gt_ggc_m_8function(X) do { \
-  if (X != NULL) gt_ggc_mx_function (X);\
-  } while (0)
-extern void gt_ggc_mx_function (void *);
-#define gt_ggc_m_23constant_descriptor_rtx(X) do { \
-  if (X != NULL) gt_ggc_mx_constant_descriptor_rtx (X);\
-  } while (0)
-extern void gt_ggc_mx_constant_descriptor_rtx (void *);
-#define gt_ggc_m_11fixed_value(X) do { \
-  if (X != NULL) gt_ggc_mx_fixed_value (X);\
-  } while (0)
-extern void gt_ggc_mx_fixed_value (void *);
-#define gt_ggc_m_10real_value(X) do { \
-  if (X != NULL) gt_ggc_mx_real_value (X);\
-  } while (0)
-extern void gt_ggc_mx_real_value (void *);
-#define gt_ggc_m_14vec_rtx_va_gc_(X) do { \
-  if (X != NULL) gt_ggc_mx_vec_rtx_va_gc_ (X);\
-  } while (0)
-extern void gt_ggc_mx_vec_rtx_va_gc_ (void *);
-#define gt_ggc_m_12object_block(X) do { \
-  if (X != NULL) gt_ggc_mx_object_block (X);\
-  } while (0)
-extern void gt_ggc_mx_object_block (void *);
-#define gt_ggc_m_9reg_attrs(X) do { \
-  if (X != NULL) gt_ggc_mx_reg_attrs (X);\
-  } while (0)
-extern void gt_ggc_mx_reg_attrs (void *);
-#define gt_ggc_m_9mem_attrs(X) do { \
-  if (X != NULL) gt_ggc_mx_mem_attrs (X);\
-  } while (0)
-extern void gt_ggc_mx_mem_attrs (void *);
-#define gt_ggc_m_13coverage_data(X) do { \
-  if (X != NULL) gt_ggc_mx_coverage_data (X);\
-  } while (0)
-extern void gt_ggc_mx_coverage_data (void *);
-#define gt_ggc_m_14bitmap_obstack(X) do { \
-  if (X != NULL) gt_ggc_mx_bitmap_obstack (X);\
-  } while (0)
-extern void gt_ggc_mx_bitmap_obstack (void *);
-#define gt_ggc_m_14bitmap_element(X) do { \
-  if (X != NULL) gt_ggc_mx_bitmap_element (X);\
-  } while (0)
-extern void gt_ggc_mx_bitmap_element (void *);
-#define gt_ggc_m_16machine_function(X) do { \
-  if (X != NULL) gt_ggc_mx_machine_function (X);\
-  } while (0)
-extern void gt_ggc_mx_machine_function (void *);
-#define gt_ggc_m_15basic_block_def(X) do { \
-  if (X != NULL) gt_ggc_mx_basic_block_def (X);\
-  } while (0)
-extern void gt_ggc_mx_basic_block_def (void *);
-#define gt_ggc_m_8edge_def(X) do { \
-  if (X != NULL) gt_ggc_mx_edge_def (X);\
-  } while (0)
-extern void gt_ggc_mx_edge_def (void *);
-#define gt_ggc_m_7section(X) do { \
-  if (X != NULL) gt_ggc_mx_section (X);\
-  } while (0)
-extern void gt_ggc_mx_section (void *);
-#define gt_ggc_m_21gimple_statement_base(X) do { \
-  if (X != NULL) gt_ggc_mx_gimple_statement_base (X);\
-  } while (0)
-extern void gt_ggc_mx_gimple_statement_base (void *);
-#define gt_ggc_m_9rtvec_def(X) do { \
-  if (X != NULL) gt_ggc_mx_rtvec_def (X);\
-  } while (0)
-extern void gt_ggc_mx_rtvec_def (void *);
-#define gt_ggc_m_7rtx_def(X) do { \
-  if (X != NULL) gt_ggc_mx_rtx_def (X);\
-  } while (0)
-extern void gt_ggc_mx_rtx_def (void *);
-#define gt_ggc_m_11bitmap_head(X) do { \
-  if (X != NULL) gt_ggc_mx_bitmap_head (X);\
-  } while (0)
-extern void gt_ggc_mx_bitmap_head (void *);
-#define gt_ggc_m_6answer(X) do { \
-  if (X != NULL) gt_ggc_mx_answer (X);\
-  } while (0)
-extern void gt_ggc_mx_answer (void *);
-#define gt_ggc_m_9cpp_macro(X) do { \
-  if (X != NULL) gt_ggc_mx_cpp_macro (X);\
-  } while (0)
-extern void gt_ggc_mx_cpp_macro (void *);
-#define gt_ggc_m_9cpp_token(X) do { \
-  if (X != NULL) gt_ggc_mx_cpp_token (X);\
-  } while (0)
-extern void gt_ggc_mx_cpp_token (void *);
-#define gt_ggc_m_9line_maps(X) do { \
-  if (X != NULL) gt_ggc_mx_line_maps (X);\
-  } while (0)
-extern void gt_ggc_mx_line_maps (void *);
-#define gt_ggc_m_9tree_node(X) do { \
-  if (X != NULL) gt_ggc_mx_tree_node (X);\
-  } while (0)
-#define gt_ggc_mx_tree_node gt_ggc_mx_lang_tree_node
-extern void gt_ggc_m_II17splay_tree_node_s (void *);
-extern void gt_ggc_m_SP9tree_node17splay_tree_node_s (void *);
-extern void gt_ggc_m_P9tree_nodeP9tree_node17splay_tree_node_s (void *);
-extern void gt_ggc_m_P17string_descriptor4htab (void *);
-extern void gt_ggc_m_P14type_assertion4htab (void *);
-extern void gt_ggc_m_P18treetreehash_entry4htab (void *);
-extern void gt_ggc_m_P17module_htab_entry4htab (void *);
-extern void gt_ggc_m_P21pending_abstract_type4htab (void *);
-extern void gt_ggc_m_P14constexpr_call4htab (void *);
-extern void gt_ggc_m_P16constexpr_fundef4htab (void *);
-extern void gt_ggc_m_P10spec_entry4htab (void *);
-extern void gt_ggc_m_P16cxx_int_tree_map4htab (void *);
-extern void gt_ggc_m_P17named_label_entry4htab (void *);
-extern void gt_ggc_m_P13pad_type_hash4htab (void *);
-extern void gt_ggc_m_P12tree_int_map4htab (void *);
-extern void gt_ggc_m_P13tree_type_map4htab (void *);
-extern void gt_ggc_m_P17lto_in_decl_state4htab (void *);
-extern void gt_ggc_m_P9tree_nodeP9tree_node12splay_tree_s (void *);
-extern void gt_ggc_m_P13scev_info_str4htab (void *);
-extern void gt_ggc_m_P15tm_restart_node4htab (void *);
-extern void gt_ggc_m_P8tree_map4htab (void *);
-extern void gt_ggc_m_P23constant_descriptor_rtx4htab (void *);
-extern void gt_ggc_m_P24constant_descriptor_tree4htab (void *);
-extern void gt_ggc_m_P12object_block4htab (void *);
-extern void gt_ggc_m_P7section4htab (void *);
-extern void gt_ggc_m_P17tree_priority_map4htab (void *);
-extern void gt_ggc_m_P12tree_vec_map4htab (void *);
-extern void gt_ggc_m_P13tree_decl_map4htab (void *);
-extern void gt_ggc_m_P9type_hash4htab (void *);
-extern void gt_ggc_m_P23temp_slot_address_entry4htab (void *);
-extern void gt_ggc_m_P15throw_stmt_node4htab (void *);
-extern void gt_ggc_m_P9reg_attrs4htab (void *);
-extern void gt_ggc_m_P7rtx_def4htab (void *);
-extern void gt_ggc_m_P23addr_table_entry_struct4htab (void *);
-extern void gt_ggc_m_P22cached_dw_loc_list_def4htab (void *);
-extern void gt_ggc_m_P16var_loc_list_def4htab (void *);
-extern void gt_ggc_m_P10die_struct4htab (void *);
-extern void gt_ggc_m_P15dwarf_file_data4htab (void *);
-extern void gt_ggc_m_P20indirect_string_node4htab (void *);
-extern void gt_ggc_m_SP9tree_node12splay_tree_s (void *);
-extern void gt_ggc_m_P28cgraph_function_version_info4htab (void *);
-extern void gt_ggc_m_II12splay_tree_s (void *);
-extern void gt_ggc_m_P11symtab_node4htab (void *);
-extern void gt_ggc_m_P11cgraph_edge4htab (void *);
-extern void gt_ggc_m_P9loop_exit4htab (void *);
-extern void gt_ggc_m_P24types_used_by_vars_entry4htab (void *);
-extern void gt_ggc_m_P9tree_node4htab (void *);
-extern void gt_ggc_m_P13libfunc_entry4htab (void *);
-
-/* functions code */
-
-/* PCH type-walking procedures.  */
-/* Macros and declarations.  */
-#define gt_pch_n_24vec_ivarref_entry_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_ivarref_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_ivarref_entry_va_gc_ (void *);
-#define gt_pch_n_26vec_prot_list_entry_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_prot_list_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_prot_list_entry_va_gc_ (void *);
-#define gt_pch_n_23vec_msgref_entry_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_msgref_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_msgref_entry_va_gc_ (void *);
-#define gt_pch_n_27vec_ident_data_tuple_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_ident_data_tuple_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_ident_data_tuple_va_gc_ (void *);
-#define gt_pch_n_17string_descriptor(X) do { \
-  if (X != NULL) gt_pch_nx_string_descriptor (X);\
-  } while (0)
-extern void gt_pch_nx_string_descriptor (void *);
-#define gt_pch_n_9imp_entry(X) do { \
-  if (X != NULL) gt_pch_nx_imp_entry (X);\
-  } while (0)
-extern void gt_pch_nx_imp_entry (void *);
-#define gt_pch_n_16hashed_attribute(X) do { \
-  if (X != NULL) gt_pch_nx_hashed_attribute (X);\
-  } while (0)
-extern void gt_pch_nx_hashed_attribute (void *);
-#define gt_pch_n_12hashed_entry(X) do { \
-  if (X != NULL) gt_pch_nx_hashed_entry (X);\
-  } while (0)
-extern void gt_pch_nx_hashed_entry (void *);
-#define gt_pch_n_16objc_map_private(X) do { \
-  if (X != NULL) gt_pch_nx_objc_map_private (X);\
-  } while (0)
-extern void gt_pch_nx_objc_map_private (void *);
-#define gt_pch_n_23vec_method_entry_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_method_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_method_entry_va_gc_ (void *);
-#define gt_pch_n_14type_assertion(X) do { \
-  if (X != NULL) gt_pch_nx_type_assertion (X);\
-  } while (0)
-extern void gt_pch_nx_type_assertion (void *);
-#define gt_pch_n_18treetreehash_entry(X) do { \
-  if (X != NULL) gt_pch_nx_treetreehash_entry (X);\
-  } while (0)
-extern void gt_pch_nx_treetreehash_entry (void *);
-#define gt_pch_n_5CPool(X) do { \
-  if (X != NULL) gt_pch_nx_CPool (X);\
-  } while (0)
-extern void gt_pch_nx_CPool (void *);
-#define gt_pch_n_3JCF(X) do { \
-  if (X != NULL) gt_pch_nx_JCF (X);\
-  } while (0)
-extern void gt_pch_nx_JCF (void *);
-#define gt_pch_n_17module_htab_entry(X) do { \
-  if (X != NULL) gt_pch_nx_module_htab_entry (X);\
-  } while (0)
-extern void gt_pch_nx_module_htab_entry (void *);
-#define gt_pch_n_13binding_level(X) do { \
-  if (X != NULL) gt_pch_nx_binding_level (X);\
-  } while (0)
-extern void gt_pch_nx_binding_level (void *);
-#define gt_pch_n_27vec_pending_noexcept_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_pending_noexcept_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_pending_noexcept_va_gc_ (void *);
-#define gt_pch_n_21pending_abstract_type(X) do { \
-  if (X != NULL) gt_pch_nx_pending_abstract_type (X);\
-  } while (0)
-extern void gt_pch_nx_pending_abstract_type (void *);
-#define gt_pch_n_19vec_tree_int_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_tree_int_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_tree_int_va_gc_ (void *);
-#define gt_pch_n_9cp_parser(X) do { \
-  if (X != NULL) gt_pch_nx_cp_parser (X);\
-  } while (0)
-extern void gt_pch_nx_cp_parser (void *);
-#define gt_pch_n_38vec_cp_unparsed_functions_entry_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_cp_unparsed_functions_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_cp_unparsed_functions_entry_va_gc_ (void *);
-#define gt_pch_n_17cp_parser_context(X) do { \
-  if (X != NULL) gt_pch_nx_cp_parser_context (X);\
-  } while (0)
-extern void gt_pch_nx_cp_parser_context (void *);
-#define gt_pch_n_31vec_cp_default_arg_entry_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_cp_default_arg_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_cp_default_arg_entry_va_gc_ (void *);
-#define gt_pch_n_8cp_lexer(X) do { \
-  if (X != NULL) gt_pch_nx_cp_lexer (X);\
-  } while (0)
-extern void gt_pch_nx_cp_lexer (void *);
-#define gt_pch_n_19vec_cp_token_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_cp_token_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_cp_token_va_gc_ (void *);
-#define gt_pch_n_10tree_check(X) do { \
-  if (X != NULL) gt_pch_nx_tree_check (X);\
-  } while (0)
-extern void gt_pch_nx_tree_check (void *);
-#define gt_pch_n_14constexpr_call(X) do { \
-  if (X != NULL) gt_pch_nx_constexpr_call (X);\
-  } while (0)
-extern void gt_pch_nx_constexpr_call (void *);
-#define gt_pch_n_16constexpr_fundef(X) do { \
-  if (X != NULL) gt_pch_nx_constexpr_fundef (X);\
-  } while (0)
-extern void gt_pch_nx_constexpr_fundef (void *);
-#define gt_pch_n_26vec_deferred_access_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_deferred_access_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_deferred_access_va_gc_ (void *);
-#define gt_pch_n_32vec_deferred_access_check_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_deferred_access_check_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_deferred_access_check_va_gc_ (void *);
-#define gt_pch_n_10spec_entry(X) do { \
-  if (X != NULL) gt_pch_nx_spec_entry (X);\
-  } while (0)
-extern void gt_pch_nx_spec_entry (void *);
-#define gt_pch_n_16pending_template(X) do { \
-  if (X != NULL) gt_pch_nx_pending_template (X);\
-  } while (0)
-extern void gt_pch_nx_pending_template (void *);
-#define gt_pch_n_25vec_incomplete_var_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_incomplete_var_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_incomplete_var_va_gc_ (void *);
-#define gt_pch_n_21named_label_use_entry(X) do { \
-  if (X != NULL) gt_pch_nx_named_label_use_entry (X);\
-  } while (0)
-extern void gt_pch_nx_named_label_use_entry (void *);
-#define gt_pch_n_22vec_tree_pair_s_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_tree_pair_s_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_tree_pair_s_va_gc_ (void *);
-#define gt_pch_n_17named_label_entry(X) do { \
-  if (X != NULL) gt_pch_nx_named_label_entry (X);\
-  } while (0)
-extern void gt_pch_nx_named_label_entry (void *);
-#define gt_pch_n_28vec_cxx_saved_binding_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_cxx_saved_binding_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_cxx_saved_binding_va_gc_ (void *);
-#define gt_pch_n_36vec_qualified_typedef_usage_t_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_qualified_typedef_usage_t_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_qualified_typedef_usage_t_va_gc_ (void *);
-#define gt_pch_n_14cp_token_cache(X) do { \
-  if (X != NULL) gt_pch_nx_cp_token_cache (X);\
-  } while (0)
-extern void gt_pch_nx_cp_token_cache (void *);
-#define gt_pch_n_11saved_scope(X) do { \
-  if (X != NULL) gt_pch_nx_saved_scope (X);\
-  } while (0)
-extern void gt_pch_nx_saved_scope (void *);
-#define gt_pch_n_16cxx_int_tree_map(X) do { \
-  if (X != NULL) gt_pch_nx_cxx_int_tree_map (X);\
-  } while (0)
-extern void gt_pch_nx_cxx_int_tree_map (void *);
-#define gt_pch_n_27vec_cp_label_binding_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_cp_label_binding_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_cp_label_binding_va_gc_ (void *);
-#define gt_pch_n_27vec_cp_class_binding_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_cp_class_binding_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_cp_class_binding_va_gc_ (void *);
-#define gt_pch_n_16cp_binding_level(X) do { \
-  if (X != NULL) gt_pch_nx_cp_binding_level (X);\
-  } while (0)
-extern void gt_pch_nx_cp_binding_level (void *);
-#define gt_pch_n_11cxx_binding(X) do { \
-  if (X != NULL) gt_pch_nx_cxx_binding (X);\
-  } while (0)
-extern void gt_pch_nx_cxx_binding (void *);
-#define gt_pch_n_15binding_entry_s(X) do { \
-  if (X != NULL) gt_pch_nx_binding_entry_s (X);\
-  } while (0)
-extern void gt_pch_nx_binding_entry_s (void *);
-#define gt_pch_n_15binding_table_s(X) do { \
-  if (X != NULL) gt_pch_nx_binding_table_s (X);\
-  } while (0)
-extern void gt_pch_nx_binding_table_s (void *);
-#define gt_pch_n_11tinst_level(X) do { \
-  if (X != NULL) gt_pch_nx_tinst_level (X);\
-  } while (0)
-extern void gt_pch_nx_tinst_level (void *);
-#define gt_pch_n_18vec_tinfo_s_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_tinfo_s_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_tinfo_s_va_gc_ (void *);
-#define gt_pch_n_8c_parser(X) do { \
-  if (X != NULL) gt_pch_nx_c_parser (X);\
-  } while (0)
-extern void gt_pch_nx_c_parser (void *);
-#define gt_pch_n_18vec_c_token_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_c_token_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_c_token_va_gc_ (void *);
-#define gt_pch_n_9opt_stack(X) do { \
-  if (X != NULL) gt_pch_nx_opt_stack (X);\
-  } while (0)
-extern void gt_pch_nx_opt_stack (void *);
-#define gt_pch_n_31vec_pending_redefinition_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_pending_redefinition_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_pending_redefinition_va_gc_ (void *);
-#define gt_pch_n_23vec_pending_weak_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_pending_weak_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_pending_weak_va_gc_ (void *);
-#define gt_pch_n_11align_stack(X) do { \
-  if (X != NULL) gt_pch_nx_align_stack (X);\
-  } while (0)
-extern void gt_pch_nx_align_stack (void *);
-#define gt_pch_n_22vec_tree_gc_vec_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_tree_gc_vec_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_tree_gc_vec_va_gc_ (void *);
-#define gt_pch_n_23vec_const_char_p_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_const_char_p_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_const_char_p_va_gc_ (void *);
-#define gt_pch_n_18sorted_fields_type(X) do { \
-  if (X != NULL) gt_pch_nx_sorted_fields_type (X);\
-  } while (0)
-extern void gt_pch_nx_sorted_fields_type (void *);
-#define gt_pch_n_15c_inline_static(X) do { \
-  if (X != NULL) gt_pch_nx_c_inline_static (X);\
-  } while (0)
-extern void gt_pch_nx_c_inline_static (void *);
-#define gt_pch_n_28vec_c_goto_bindings_p_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_c_goto_bindings_p_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_c_goto_bindings_p_va_gc_ (void *);
-#define gt_pch_n_15c_goto_bindings(X) do { \
-  if (X != NULL) gt_pch_nx_c_goto_bindings (X);\
-  } while (0)
-extern void gt_pch_nx_c_goto_bindings (void *);
-#define gt_pch_n_7c_scope(X) do { \
-  if (X != NULL) gt_pch_nx_c_scope (X);\
-  } while (0)
-extern void gt_pch_nx_c_scope (void *);
-#define gt_pch_n_9c_binding(X) do { \
-  if (X != NULL) gt_pch_nx_c_binding (X);\
-  } while (0)
-extern void gt_pch_nx_c_binding (void *);
-#define gt_pch_n_12c_label_vars(X) do { \
-  if (X != NULL) gt_pch_nx_c_label_vars (X);\
-  } while (0)
-extern void gt_pch_nx_c_label_vars (void *);
-#define gt_pch_n_13pad_type_hash(X) do { \
-  if (X != NULL) gt_pch_nx_pad_type_hash (X);\
-  } while (0)
-extern void gt_pch_nx_pad_type_hash (void *);
-#define gt_pch_n_18gnat_binding_level(X) do { \
-  if (X != NULL) gt_pch_nx_gnat_binding_level (X);\
-  } while (0)
-extern void gt_pch_nx_gnat_binding_level (void *);
-#define gt_pch_n_20vec_loop_info_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_loop_info_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_loop_info_va_gc_ (void *);
-#define gt_pch_n_11loop_info_d(X) do { \
-  if (X != NULL) gt_pch_nx_loop_info_d (X);\
-  } while (0)
-extern void gt_pch_nx_loop_info_d (void *);
-#define gt_pch_n_27vec_range_check_info_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_range_check_info_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_range_check_info_va_gc_ (void *);
-#define gt_pch_n_18range_check_info_d(X) do { \
-  if (X != NULL) gt_pch_nx_range_check_info_d (X);\
-  } while (0)
-extern void gt_pch_nx_range_check_info_d (void *);
-#define gt_pch_n_9elab_info(X) do { \
-  if (X != NULL) gt_pch_nx_elab_info (X);\
-  } while (0)
-extern void gt_pch_nx_elab_info (void *);
-#define gt_pch_n_10stmt_group(X) do { \
-  if (X != NULL) gt_pch_nx_stmt_group (X);\
-  } while (0)
-extern void gt_pch_nx_stmt_group (void *);
-#define gt_pch_n_20vec_parm_attr_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_parm_attr_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_parm_attr_va_gc_ (void *);
-#define gt_pch_n_11parm_attr_d(X) do { \
-  if (X != NULL) gt_pch_nx_parm_attr_d (X);\
-  } while (0)
-extern void gt_pch_nx_parm_attr_d (void *);
-#define gt_pch_n_19vec_odr_type_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_odr_type_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_odr_type_va_gc_ (void *);
-#define gt_pch_n_13tree_type_map(X) do { \
-  if (X != NULL) gt_pch_nx_tree_type_map (X);\
-  } while (0)
-extern void gt_pch_nx_tree_type_map (void *);
-#define gt_pch_n_27vec_inline_summary_t_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_inline_summary_t_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_inline_summary_t_va_gc_ (void *);
-#define gt_pch_n_26vec_size_time_entry_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_size_time_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_size_time_entry_va_gc_ (void *);
-#define gt_pch_n_20vec_condition_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_condition_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_condition_va_gc_ (void *);
-#define gt_pch_n_17lto_in_decl_state(X) do { \
-  if (X != NULL) gt_pch_nx_lto_in_decl_state (X);\
-  } while (0)
-extern void gt_pch_nx_lto_in_decl_state (void *);
-#define gt_pch_n_24vec_ipa_edge_args_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_ipa_edge_args_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_ipa_edge_args_va_gc_ (void *);
-#define gt_pch_n_38vec_ipa_agg_replacement_value_p_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_ipa_agg_replacement_value_p_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_ipa_agg_replacement_value_p_va_gc_ (void *);
-#define gt_pch_n_24vec_ipa_jump_func_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_ipa_jump_func_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_ipa_jump_func_va_gc_ (void *);
-#define gt_pch_n_26vec_ipa_agg_jf_item_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_ipa_agg_jf_item_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_ipa_agg_jf_item_va_gc_ (void *);
-#define gt_pch_n_20ssa_operand_memory_d(X) do { \
-  if (X != NULL) gt_pch_nx_ssa_operand_memory_d (X);\
-  } while (0)
-extern void gt_pch_nx_ssa_operand_memory_d (void *);
-#define gt_pch_n_13scev_info_str(X) do { \
-  if (X != NULL) gt_pch_nx_scev_info_str (X);\
-  } while (0)
-extern void gt_pch_nx_scev_info_str (void *);
-#define gt_pch_n_28vec_mem_addr_template_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_mem_addr_template_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_mem_addr_template_va_gc_ (void *);
-#define gt_pch_n_17vec_gimple_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_gimple_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_gimple_va_gc_ (void *);
-#define gt_pch_n_15tm_restart_node(X) do { \
-  if (X != NULL) gt_pch_nx_tm_restart_node (X);\
-  } while (0)
-extern void gt_pch_nx_tm_restart_node (void *);
-#define gt_pch_n_9type_hash(X) do { \
-  if (X != NULL) gt_pch_nx_type_hash (X);\
-  } while (0)
-extern void gt_pch_nx_type_hash (void *);
-#define gt_pch_n_16string_pool_data(X) do { \
-  if (X != NULL) gt_pch_nx_string_pool_data (X);\
-  } while (0)
-extern void gt_pch_nx_string_pool_data (void *);
-#define gt_pch_n_23temp_slot_address_entry(X) do { \
-  if (X != NULL) gt_pch_nx_temp_slot_address_entry (X);\
-  } while (0)
-extern void gt_pch_nx_temp_slot_address_entry (void *);
-#define gt_pch_n_15throw_stmt_node(X) do { \
-  if (X != NULL) gt_pch_nx_throw_stmt_node (X);\
-  } while (0)
-extern void gt_pch_nx_throw_stmt_node (void *);
-#define gt_pch_n_25vec_eh_landing_pad_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_eh_landing_pad_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_eh_landing_pad_va_gc_ (void *);
-#define gt_pch_n_20vec_eh_region_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_eh_region_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_eh_region_va_gc_ (void *);
-#define gt_pch_n_10eh_catch_d(X) do { \
-  if (X != NULL) gt_pch_nx_eh_catch_d (X);\
-  } while (0)
-extern void gt_pch_nx_eh_catch_d (void *);
-#define gt_pch_n_16eh_landing_pad_d(X) do { \
-  if (X != NULL) gt_pch_nx_eh_landing_pad_d (X);\
-  } while (0)
-extern void gt_pch_nx_eh_landing_pad_d (void *);
-#define gt_pch_n_13pointer_map_t(X) do { \
-  if (X != NULL) gt_pch_nx_pointer_map_t (X);\
-  } while (0)
-extern void gt_pch_nx_pointer_map_t (void *);
-#define gt_pch_n_11eh_region_d(X) do { \
-  if (X != NULL) gt_pch_nx_eh_region_d (X);\
-  } while (0)
-extern void gt_pch_nx_eh_region_d (void *);
-#define gt_pch_n_24vec_die_arg_entry_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_die_arg_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_die_arg_entry_va_gc_ (void *);
-#define gt_pch_n_24vec_macinfo_entry_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_macinfo_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_macinfo_entry_va_gc_ (void *);
-#define gt_pch_n_24vec_pubname_entry_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_pubname_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_pubname_entry_va_gc_ (void *);
-#define gt_pch_n_31vec_dw_line_info_table_p_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_dw_line_info_table_p_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_dw_line_info_table_p_va_gc_ (void *);
-#define gt_pch_n_22cached_dw_loc_list_def(X) do { \
-  if (X != NULL) gt_pch_nx_cached_dw_loc_list_def (X);\
-  } while (0)
-extern void gt_pch_nx_cached_dw_loc_list_def (void *);
-#define gt_pch_n_17call_arg_loc_node(X) do { \
-  if (X != NULL) gt_pch_nx_call_arg_loc_node (X);\
-  } while (0)
-extern void gt_pch_nx_call_arg_loc_node (void *);
-#define gt_pch_n_16var_loc_list_def(X) do { \
-  if (X != NULL) gt_pch_nx_var_loc_list_def (X);\
-  } while (0)
-extern void gt_pch_nx_var_loc_list_def (void *);
-#define gt_pch_n_12var_loc_node(X) do { \
-  if (X != NULL) gt_pch_nx_var_loc_node (X);\
-  } while (0)
-extern void gt_pch_nx_var_loc_node (void *);
-#define gt_pch_n_16limbo_die_struct(X) do { \
-  if (X != NULL) gt_pch_nx_limbo_die_struct (X);\
-  } while (0)
-extern void gt_pch_nx_limbo_die_struct (void *);
-#define gt_pch_n_23vec_dw_attr_node_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_dw_attr_node_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_dw_attr_node_va_gc_ (void *);
-#define gt_pch_n_25dw_line_info_table_struct(X) do { \
-  if (X != NULL) gt_pch_nx_dw_line_info_table_struct (X);\
-  } while (0)
-extern void gt_pch_nx_dw_line_info_table_struct (void *);
-#define gt_pch_n_29vec_dw_line_info_entry_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_dw_line_info_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_dw_line_info_entry_va_gc_ (void *);
-#define gt_pch_n_18comdat_type_struct(X) do { \
-  if (X != NULL) gt_pch_nx_comdat_type_struct (X);\
-  } while (0)
-extern void gt_pch_nx_comdat_type_struct (void *);
-#define gt_pch_n_25dw_ranges_by_label_struct(X) do { \
-  if (X != NULL) gt_pch_nx_dw_ranges_by_label_struct (X);\
-  } while (0)
-extern void gt_pch_nx_dw_ranges_by_label_struct (void *);
-#define gt_pch_n_16dw_ranges_struct(X) do { \
-  if (X != NULL) gt_pch_nx_dw_ranges_struct (X);\
-  } while (0)
-extern void gt_pch_nx_dw_ranges_struct (void *);
-#define gt_pch_n_29vec_deferred_locations_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_deferred_locations_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_deferred_locations_va_gc_ (void *);
-#define gt_pch_n_21vec_dw_fde_ref_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_dw_fde_ref_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_dw_fde_ref_va_gc_ (void *);
-#define gt_pch_n_24reg_saved_in_data_struct(X) do { \
-  if (X != NULL) gt_pch_nx_reg_saved_in_data_struct (X);\
-  } while (0)
-extern void gt_pch_nx_reg_saved_in_data_struct (void *);
-#define gt_pch_n_17dw_cfi_row_struct(X) do { \
-  if (X != NULL) gt_pch_nx_dw_cfi_row_struct (X);\
-  } while (0)
-extern void gt_pch_nx_dw_cfi_row_struct (void *);
-#define gt_pch_n_15dwarf_file_data(X) do { \
-  if (X != NULL) gt_pch_nx_dwarf_file_data (X);\
-  } while (0)
-extern void gt_pch_nx_dwarf_file_data (void *);
-#define gt_pch_n_20indirect_string_node(X) do { \
-  if (X != NULL) gt_pch_nx_indirect_string_node (X);\
-  } while (0)
-extern void gt_pch_nx_indirect_string_node (void *);
-#define gt_pch_n_23addr_table_entry_struct(X) do { \
-  if (X != NULL) gt_pch_nx_addr_table_entry_struct (X);\
-  } while (0)
-extern void gt_pch_nx_addr_table_entry_struct (void *);
-#define gt_pch_n_21vec_dw_cfi_ref_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_dw_cfi_ref_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_dw_cfi_ref_va_gc_ (void *);
-#define gt_pch_n_18dw_loc_list_struct(X) do { \
-  if (X != NULL) gt_pch_nx_dw_loc_list_struct (X);\
-  } while (0)
-extern void gt_pch_nx_dw_loc_list_struct (void *);
-#define gt_pch_n_17dw_loc_descr_node(X) do { \
-  if (X != NULL) gt_pch_nx_dw_loc_descr_node (X);\
-  } while (0)
-extern void gt_pch_nx_dw_loc_descr_node (void *);
-#define gt_pch_n_11dw_cfi_node(X) do { \
-  if (X != NULL) gt_pch_nx_dw_cfi_node (X);\
-  } while (0)
-extern void gt_pch_nx_dw_cfi_node (void *);
-#define gt_pch_n_8typeinfo(X) do { \
-  if (X != NULL) gt_pch_nx_typeinfo (X);\
-  } while (0)
-extern void gt_pch_nx_typeinfo (void *);
-#define gt_pch_n_10odr_type_d(X) do { \
-  if (X != NULL) gt_pch_nx_odr_type_d (X);\
-  } while (0)
-extern void gt_pch_nx_odr_type_d (void *);
-#define gt_pch_n_25ipa_agg_replacement_value(X) do { \
-  if (X != NULL) gt_pch_nx_ipa_agg_replacement_value (X);\
-  } while (0)
-extern void gt_pch_nx_ipa_agg_replacement_value (void *);
-#define gt_pch_n_26vec_alias_set_entry_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_alias_set_entry_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_alias_set_entry_va_gc_ (void *);
-#define gt_pch_n_17alias_set_entry_d(X) do { \
-  if (X != NULL) gt_pch_nx_alias_set_entry_d (X);\
-  } while (0)
-extern void gt_pch_nx_alias_set_entry_d (void *);
-#define gt_pch_n_24constant_descriptor_tree(X) do { \
-  if (X != NULL) gt_pch_nx_constant_descriptor_tree (X);\
-  } while (0)
-extern void gt_pch_nx_constant_descriptor_tree (void *);
-#define gt_pch_n_8asm_node(X) do { \
-  if (X != NULL) gt_pch_nx_asm_node (X);\
-  } while (0)
-extern void gt_pch_nx_asm_node (void *);
-#define gt_pch_n_25cgraph_indirect_call_info(X) do { \
-  if (X != NULL) gt_pch_nx_cgraph_indirect_call_info (X);\
-  } while (0)
-extern void gt_pch_nx_cgraph_indirect_call_info (void *);
-#define gt_pch_n_28cgraph_function_version_info(X) do { \
-  if (X != NULL) gt_pch_nx_cgraph_function_version_info (X);\
-  } while (0)
-extern void gt_pch_nx_cgraph_function_version_info (void *);
-#define gt_pch_n_11cgraph_edge(X) do { \
-  if (X != NULL) gt_pch_nx_cgraph_edge (X);\
-  } while (0)
-extern void gt_pch_nx_cgraph_edge (void *);
-#define gt_pch_n_17cgraph_simd_clone(X) do { \
-  if (X != NULL) gt_pch_nx_cgraph_simd_clone (X);\
-  } while (0)
-extern void gt_pch_nx_cgraph_simd_clone (void *);
-#define gt_pch_n_28vec_ipa_replace_map_p_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_ipa_replace_map_p_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_ipa_replace_map_p_va_gc_ (void *);
-#define gt_pch_n_15ipa_replace_map(X) do { \
-  if (X != NULL) gt_pch_nx_ipa_replace_map (X);\
-  } while (0)
-extern void gt_pch_nx_ipa_replace_map (void *);
-#define gt_pch_n_18lto_file_decl_data(X) do { \
-  if (X != NULL) gt_pch_nx_lto_file_decl_data (X);\
-  } while (0)
-extern void gt_pch_nx_lto_file_decl_data (void *);
-#define gt_pch_n_20vec_ipa_ref_t_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_ipa_ref_t_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_ipa_ref_t_va_gc_ (void *);
-#define gt_pch_n_11symtab_node(X) do { \
-  if (X != NULL) gt_pch_nx_symtab_node (X);\
-  } while (0)
-extern void gt_pch_nx_symtab_node (void *);
-#define gt_pch_n_22vec_basic_block_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_basic_block_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_basic_block_va_gc_ (void *);
-#define gt_pch_n_15vec_edge_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_edge_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_edge_va_gc_ (void *);
-#define gt_pch_n_11rtl_bb_info(X) do { \
-  if (X != NULL) gt_pch_nx_rtl_bb_info (X);\
-  } while (0)
-extern void gt_pch_nx_rtl_bb_info (void *);
-#define gt_pch_n_10niter_desc(X) do { \
-  if (X != NULL) gt_pch_nx_niter_desc (X);\
-  } while (0)
-extern void gt_pch_nx_niter_desc (void *);
-#define gt_pch_n_17vec_loop_p_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_loop_p_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_loop_p_va_gc_ (void *);
-#define gt_pch_n_4loop(X) do { \
-  if (X != NULL) gt_pch_nx_loop (X);\
-  } while (0)
-extern void gt_pch_nx_loop (void *);
-#define gt_pch_n_9loop_exit(X) do { \
-  if (X != NULL) gt_pch_nx_loop_exit (X);\
-  } while (0)
-extern void gt_pch_nx_loop_exit (void *);
-#define gt_pch_n_13nb_iter_bound(X) do { \
-  if (X != NULL) gt_pch_nx_nb_iter_bound (X);\
-  } while (0)
-extern void gt_pch_nx_nb_iter_bound (void *);
-#define gt_pch_n_24types_used_by_vars_entry(X) do { \
-  if (X != NULL) gt_pch_nx_types_used_by_vars_entry (X);\
-  } while (0)
-extern void gt_pch_nx_types_used_by_vars_entry (void *);
-#define gt_pch_n_17language_function(X) do { \
-  if (X != NULL) gt_pch_nx_language_function (X);\
-  } while (0)
-extern void gt_pch_nx_language_function (void *);
-#define gt_pch_n_5loops(X) do { \
-  if (X != NULL) gt_pch_nx_loops (X);\
-  } while (0)
-extern void gt_pch_nx_loops (void *);
-#define gt_pch_n_18control_flow_graph(X) do { \
-  if (X != NULL) gt_pch_nx_control_flow_graph (X);\
-  } while (0)
-extern void gt_pch_nx_control_flow_graph (void *);
-#define gt_pch_n_9eh_status(X) do { \
-  if (X != NULL) gt_pch_nx_eh_status (X);\
-  } while (0)
-extern void gt_pch_nx_eh_status (void *);
-#define gt_pch_n_11stack_usage(X) do { \
-  if (X != NULL) gt_pch_nx_stack_usage (X);\
-  } while (0)
-extern void gt_pch_nx_stack_usage (void *);
-#define gt_pch_n_22vec_temp_slot_p_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_temp_slot_p_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_temp_slot_p_va_gc_ (void *);
-#define gt_pch_n_20initial_value_struct(X) do { \
-  if (X != NULL) gt_pch_nx_initial_value_struct (X);\
-  } while (0)
-extern void gt_pch_nx_initial_value_struct (void *);
-#define gt_pch_n_11frame_space(X) do { \
-  if (X != NULL) gt_pch_nx_frame_space (X);\
-  } while (0)
-extern void gt_pch_nx_frame_space (void *);
-#define gt_pch_n_17rtx_constant_pool(X) do { \
-  if (X != NULL) gt_pch_nx_rtx_constant_pool (X);\
-  } while (0)
-extern void gt_pch_nx_rtx_constant_pool (void *);
-#define gt_pch_n_11dw_fde_node(X) do { \
-  if (X != NULL) gt_pch_nx_dw_fde_node (X);\
-  } while (0)
-extern void gt_pch_nx_dw_fde_node (void *);
-#define gt_pch_n_9temp_slot(X) do { \
-  if (X != NULL) gt_pch_nx_temp_slot (X);\
-  } while (0)
-extern void gt_pch_nx_temp_slot (void *);
-#define gt_pch_n_9gimple_df(X) do { \
-  if (X != NULL) gt_pch_nx_gimple_df (X);\
-  } while (0)
-extern void gt_pch_nx_gimple_df (void *);
-#define gt_pch_n_27vec_call_site_record_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_call_site_record_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_call_site_record_va_gc_ (void *);
-#define gt_pch_n_16vec_uchar_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_uchar_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_uchar_va_gc_ (void *);
-#define gt_pch_n_18call_site_record_d(X) do { \
-  if (X != NULL) gt_pch_nx_call_site_record_d (X);\
-  } while (0)
-extern void gt_pch_nx_call_site_record_d (void *);
-#define gt_pch_n_14sequence_stack(X) do { \
-  if (X != NULL) gt_pch_nx_sequence_stack (X);\
-  } while (0)
-extern void gt_pch_nx_sequence_stack (void *);
-#define gt_pch_n_15target_libfuncs(X) do { \
-  if (X != NULL) gt_pch_nx_target_libfuncs (X);\
-  } while (0)
-extern void gt_pch_nx_target_libfuncs (void *);
-#define gt_pch_n_13libfunc_entry(X) do { \
-  if (X != NULL) gt_pch_nx_libfunc_entry (X);\
-  } while (0)
-extern void gt_pch_nx_libfunc_entry (void *);
-#define gt_pch_n_21vec_alias_pair_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_alias_pair_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_alias_pair_va_gc_ (void *);
-#define gt_pch_n_12tree_vec_map(X) do { \
-  if (X != NULL) gt_pch_nx_tree_vec_map (X);\
-  } while (0)
-extern void gt_pch_nx_tree_vec_map (void *);
-#define gt_pch_n_17tree_priority_map(X) do { \
-  if (X != NULL) gt_pch_nx_tree_priority_map (X);\
-  } while (0)
-extern void gt_pch_nx_tree_priority_map (void *);
-#define gt_pch_n_12tree_int_map(X) do { \
-  if (X != NULL) gt_pch_nx_tree_int_map (X);\
-  } while (0)
-extern void gt_pch_nx_tree_int_map (void *);
-#define gt_pch_n_13tree_decl_map(X) do { \
-  if (X != NULL) gt_pch_nx_tree_decl_map (X);\
-  } while (0)
-extern void gt_pch_nx_tree_decl_map (void *);
-#define gt_pch_n_8tree_map(X) do { \
-  if (X != NULL) gt_pch_nx_tree_map (X);\
-  } while (0)
-extern void gt_pch_nx_tree_map (void *);
-#define gt_pch_n_14lang_tree_node(X) do { \
-  if (X != NULL) gt_pch_nx_lang_tree_node (X);\
-  } while (0)
-extern void gt_pch_nx_lang_tree_node (void *);
-#define gt_pch_n_14target_globals(X) do { \
-  if (X != NULL) gt_pch_nx_target_globals (X);\
-  } while (0)
-extern void gt_pch_nx_target_globals (void *);
-#define gt_pch_n_24tree_statement_list_node(X) do { \
-  if (X != NULL) gt_pch_nx_tree_statement_list_node (X);\
-  } while (0)
-extern void gt_pch_nx_tree_statement_list_node (void *);
-#define gt_pch_n_9lang_decl(X) do { \
-  if (X != NULL) gt_pch_nx_lang_decl (X);\
-  } while (0)
-extern void gt_pch_nx_lang_decl (void *);
-#define gt_pch_n_9lang_type(X) do { \
-  if (X != NULL) gt_pch_nx_lang_type (X);\
-  } while (0)
-extern void gt_pch_nx_lang_type (void *);
-#define gt_pch_n_15vec_tree_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_tree_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_tree_va_gc_ (void *);
-#define gt_pch_n_26vec_constructor_elt_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_constructor_elt_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_constructor_elt_va_gc_ (void *);
-#define gt_pch_n_10die_struct(X) do { \
-  if (X != NULL) gt_pch_nx_die_struct (X);\
-  } while (0)
-extern void gt_pch_nx_die_struct (void *);
-#define gt_pch_n_14range_info_def(X) do { \
-  if (X != NULL) gt_pch_nx_range_info_def (X);\
-  } while (0)
-extern void gt_pch_nx_range_info_def (void *);
-#define gt_pch_n_12ptr_info_def(X) do { \
-  if (X != NULL) gt_pch_nx_ptr_info_def (X);\
-  } while (0)
-extern void gt_pch_nx_ptr_info_def (void *);
-#define gt_pch_n_10target_rtl(X) do { \
-  if (X != NULL) gt_pch_nx_target_rtl (X);\
-  } while (0)
-extern void gt_pch_nx_target_rtl (void *);
-#define gt_pch_n_8function(X) do { \
-  if (X != NULL) gt_pch_nx_function (X);\
-  } while (0)
-extern void gt_pch_nx_function (void *);
-#define gt_pch_n_23constant_descriptor_rtx(X) do { \
-  if (X != NULL) gt_pch_nx_constant_descriptor_rtx (X);\
-  } while (0)
-extern void gt_pch_nx_constant_descriptor_rtx (void *);
-#define gt_pch_n_11fixed_value(X) do { \
-  if (X != NULL) gt_pch_nx_fixed_value (X);\
-  } while (0)
-extern void gt_pch_nx_fixed_value (void *);
-#define gt_pch_n_10real_value(X) do { \
-  if (X != NULL) gt_pch_nx_real_value (X);\
-  } while (0)
-extern void gt_pch_nx_real_value (void *);
-#define gt_pch_n_14vec_rtx_va_gc_(X) do { \
-  if (X != NULL) gt_pch_nx_vec_rtx_va_gc_ (X);\
-  } while (0)
-extern void gt_pch_nx_vec_rtx_va_gc_ (void *);
-#define gt_pch_n_12object_block(X) do { \
-  if (X != NULL) gt_pch_nx_object_block (X);\
-  } while (0)
-extern void gt_pch_nx_object_block (void *);
-#define gt_pch_n_9reg_attrs(X) do { \
-  if (X != NULL) gt_pch_nx_reg_attrs (X);\
-  } while (0)
-extern void gt_pch_nx_reg_attrs (void *);
-#define gt_pch_n_9mem_attrs(X) do { \
-  if (X != NULL) gt_pch_nx_mem_attrs (X);\
-  } while (0)
-extern void gt_pch_nx_mem_attrs (void *);
-#define gt_pch_n_13coverage_data(X) do { \
-  if (X != NULL) gt_pch_nx_coverage_data (X);\
-  } while (0)
-extern void gt_pch_nx_coverage_data (void *);
-#define gt_pch_n_14bitmap_obstack(X) do { \
-  if (X != NULL) gt_pch_nx_bitmap_obstack (X);\
-  } while (0)
-extern void gt_pch_nx_bitmap_obstack (void *);
-#define gt_pch_n_14bitmap_element(X) do { \
-  if (X != NULL) gt_pch_nx_bitmap_element (X);\
-  } while (0)
-extern void gt_pch_nx_bitmap_element (void *);
-#define gt_pch_n_16machine_function(X) do { \
-  if (X != NULL) gt_pch_nx_machine_function (X);\
-  } while (0)
-extern void gt_pch_nx_machine_function (void *);
-#define gt_pch_n_15basic_block_def(X) do { \
-  if (X != NULL) gt_pch_nx_basic_block_def (X);\
-  } while (0)
-extern void gt_pch_nx_basic_block_def (void *);
-#define gt_pch_n_8edge_def(X) do { \
-  if (X != NULL) gt_pch_nx_edge_def (X);\
-  } while (0)
-extern void gt_pch_nx_edge_def (void *);
-#define gt_pch_n_7section(X) do { \
-  if (X != NULL) gt_pch_nx_section (X);\
-  } while (0)
-extern void gt_pch_nx_section (void *);
-#define gt_pch_n_21gimple_statement_base(X) do { \
-  if (X != NULL) gt_pch_nx_gimple_statement_base (X);\
-  } while (0)
-extern void gt_pch_nx_gimple_statement_base (void *);
-#define gt_pch_n_9rtvec_def(X) do { \
-  if (X != NULL) gt_pch_nx_rtvec_def (X);\
-  } while (0)
-extern void gt_pch_nx_rtvec_def (void *);
-#define gt_pch_n_7rtx_def(X) do { \
-  if (X != NULL) gt_pch_nx_rtx_def (X);\
-  } while (0)
-extern void gt_pch_nx_rtx_def (void *);
-#define gt_pch_n_11bitmap_head(X) do { \
-  if (X != NULL) gt_pch_nx_bitmap_head (X);\
-  } while (0)
-extern void gt_pch_nx_bitmap_head (void *);
-#define gt_pch_n_6answer(X) do { \
-  if (X != NULL) gt_pch_nx_answer (X);\
-  } while (0)
-extern void gt_pch_nx_answer (void *);
-#define gt_pch_n_9cpp_macro(X) do { \
-  if (X != NULL) gt_pch_nx_cpp_macro (X);\
-  } while (0)
-extern void gt_pch_nx_cpp_macro (void *);
-#define gt_pch_n_9cpp_token(X) do { \
-  if (X != NULL) gt_pch_nx_cpp_token (X);\
-  } while (0)
-extern void gt_pch_nx_cpp_token (void *);
-#define gt_pch_n_9line_maps(X) do { \
-  if (X != NULL) gt_pch_nx_line_maps (X);\
-  } while (0)
-extern void gt_pch_nx_line_maps (void *);
-#define gt_pch_n_9tree_node(X) do { \
-  if (X != NULL) gt_pch_nx_tree_node (X);\
-  } while (0)
-#define gt_pch_nx_tree_node gt_pch_nx_lang_tree_node
-extern void gt_pch_n_II17splay_tree_node_s (void *);
-extern void gt_pch_n_SP9tree_node17splay_tree_node_s (void *);
-extern void gt_pch_n_P9tree_nodeP9tree_node17splay_tree_node_s (void *);
-extern void gt_pch_n_P17string_descriptor4htab (void *);
-extern void gt_pch_n_P14type_assertion4htab (void *);
-extern void gt_pch_n_P18treetreehash_entry4htab (void *);
-extern void gt_pch_n_P17module_htab_entry4htab (void *);
-extern void gt_pch_n_P21pending_abstract_type4htab (void *);
-extern void gt_pch_n_P14constexpr_call4htab (void *);
-extern void gt_pch_n_P16constexpr_fundef4htab (void *);
-extern void gt_pch_n_P10spec_entry4htab (void *);
-extern void gt_pch_n_P16cxx_int_tree_map4htab (void *);
-extern void gt_pch_n_P17named_label_entry4htab (void *);
-extern void gt_pch_n_P13pad_type_hash4htab (void *);
-extern void gt_pch_n_P12tree_int_map4htab (void *);
-extern void gt_pch_n_P13tree_type_map4htab (void *);
-extern void gt_pch_n_P17lto_in_decl_state4htab (void *);
-extern void gt_pch_n_P9tree_nodeP9tree_node12splay_tree_s (void *);
-extern void gt_pch_n_P13scev_info_str4htab (void *);
-extern void gt_pch_n_P15tm_restart_node4htab (void *);
-extern void gt_pch_n_P8tree_map4htab (void *);
-extern void gt_pch_n_P23constant_descriptor_rtx4htab (void *);
-extern void gt_pch_n_P24constant_descriptor_tree4htab (void *);
-extern void gt_pch_n_P12object_block4htab (void *);
-extern void gt_pch_n_P7section4htab (void *);
-extern void gt_pch_n_P17tree_priority_map4htab (void *);
-extern void gt_pch_n_P12tree_vec_map4htab (void *);
-extern void gt_pch_n_P13tree_decl_map4htab (void *);
-extern void gt_pch_n_P9type_hash4htab (void *);
-extern void gt_pch_n_P23temp_slot_address_entry4htab (void *);
-extern void gt_pch_n_P15throw_stmt_node4htab (void *);
-extern void gt_pch_n_P9reg_attrs4htab (void *);
-extern void gt_pch_n_P7rtx_def4htab (void *);
-extern void gt_pch_n_P23addr_table_entry_struct4htab (void *);
-extern void gt_pch_n_P22cached_dw_loc_list_def4htab (void *);
-extern void gt_pch_n_P16var_loc_list_def4htab (void *);
-extern void gt_pch_n_P10die_struct4htab (void *);
-extern void gt_pch_n_P15dwarf_file_data4htab (void *);
-extern void gt_pch_n_P20indirect_string_node4htab (void *);
-extern void gt_pch_n_SP9tree_node12splay_tree_s (void *);
-extern void gt_pch_n_P28cgraph_function_version_info4htab (void *);
-extern void gt_pch_n_II12splay_tree_s (void *);
-extern void gt_pch_n_P11symtab_node4htab (void *);
-extern void gt_pch_n_P11cgraph_edge4htab (void *);
-extern void gt_pch_n_P9loop_exit4htab (void *);
-extern void gt_pch_n_P24types_used_by_vars_entry4htab (void *);
-extern void gt_pch_n_P9tree_node4htab (void *);
-extern void gt_pch_n_P13libfunc_entry4htab (void *);
-
-/* functions code */
-
-/* Local pointer-walking routines.  */
-extern void gt_pch_p_24vec_ivarref_entry_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_26vec_prot_list_entry_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_23vec_msgref_entry_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_27vec_ident_data_tuple_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_17string_descriptor
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_9imp_entry
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_16hashed_attribute
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_12hashed_entry
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_16objc_map_private
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_23vec_method_entry_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_14type_assertion
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_18treetreehash_entry
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_5CPool
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_3JCF
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_17module_htab_entry
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_13binding_level
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_27vec_pending_noexcept_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21pending_abstract_type
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_19vec_tree_int_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_9cp_parser
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_38vec_cp_unparsed_functions_entry_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_17cp_parser_context
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_31vec_cp_default_arg_entry_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_8cp_lexer
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_19vec_cp_token_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_10tree_check
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_14constexpr_call
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_16constexpr_fundef
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_26vec_deferred_access_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_32vec_deferred_access_check_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_10spec_entry
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_16pending_template
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_25vec_incomplete_var_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21named_label_use_entry
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_22vec_tree_pair_s_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_17named_label_entry
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_28vec_cxx_saved_binding_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_36vec_qualified_typedef_usage_t_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_14cp_token_cache
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_11saved_scope
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_16cxx_int_tree_map
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_27vec_cp_label_binding_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_27vec_cp_class_binding_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_16cp_binding_level
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_11cxx_binding
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_15binding_entry_s
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_15binding_table_s
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_11tinst_level
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_18vec_tinfo_s_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_8c_parser
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_18vec_c_token_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_9opt_stack
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_31vec_pending_redefinition_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_23vec_pending_weak_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_11align_stack
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_22vec_tree_gc_vec_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_23vec_const_char_p_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_18sorted_fields_type
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_15c_inline_static
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_28vec_c_goto_bindings_p_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_15c_goto_bindings
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_7c_scope
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_9c_binding
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_12c_label_vars
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_13pad_type_hash
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_18gnat_binding_level
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_20vec_loop_info_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_11loop_info_d
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_27vec_range_check_info_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_18range_check_info_d
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_9elab_info
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_10stmt_group
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_20vec_parm_attr_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_11parm_attr_d
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_19vec_odr_type_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_13tree_type_map
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_27vec_inline_summary_t_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_26vec_size_time_entry_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_20vec_condition_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_17lto_in_decl_state
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_24vec_ipa_edge_args_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_38vec_ipa_agg_replacement_value_p_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_24vec_ipa_jump_func_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_26vec_ipa_agg_jf_item_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_20ssa_operand_memory_d
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_13scev_info_str
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_28vec_mem_addr_template_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_17vec_gimple_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_15tm_restart_node
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_9type_hash
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_16string_pool_data
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_23temp_slot_address_entry
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_15throw_stmt_node
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_25vec_eh_landing_pad_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_20vec_eh_region_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_10eh_catch_d
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_16eh_landing_pad_d
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_13pointer_map_t
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_11eh_region_d
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_24vec_die_arg_entry_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_24vec_macinfo_entry_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_24vec_pubname_entry_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_31vec_dw_line_info_table_p_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_22cached_dw_loc_list_def
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_17call_arg_loc_node
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_16var_loc_list_def
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_12var_loc_node
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_16limbo_die_struct
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_23vec_dw_attr_node_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_25dw_line_info_table_struct
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_29vec_dw_line_info_entry_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_18comdat_type_struct
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_25dw_ranges_by_label_struct
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_16dw_ranges_struct
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_29vec_deferred_locations_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21vec_dw_fde_ref_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_24reg_saved_in_data_struct
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_17dw_cfi_row_struct
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_15dwarf_file_data
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_20indirect_string_node
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_23addr_table_entry_struct
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21vec_dw_cfi_ref_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_18dw_loc_list_struct
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_17dw_loc_descr_node
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_11dw_cfi_node
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_8typeinfo
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_10odr_type_d
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_25ipa_agg_replacement_value
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_26vec_alias_set_entry_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_17alias_set_entry_d
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_24constant_descriptor_tree
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_8asm_node
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_25cgraph_indirect_call_info
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_28cgraph_function_version_info
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_11cgraph_edge
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_17cgraph_simd_clone
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_28vec_ipa_replace_map_p_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_15ipa_replace_map
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_18lto_file_decl_data
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_20vec_ipa_ref_t_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_11symtab_node
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_11symtab_node
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_11symtab_node
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_22vec_basic_block_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_15vec_edge_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_11rtl_bb_info
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_10niter_desc
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_17vec_loop_p_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_4loop
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_9loop_exit
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_13nb_iter_bound
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_24types_used_by_vars_entry
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_17language_function
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_5loops
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_18control_flow_graph
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_9eh_status
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_11stack_usage
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_22vec_temp_slot_p_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_20initial_value_struct
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_11frame_space
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_17rtx_constant_pool
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_11dw_fde_node
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_9temp_slot
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_9gimple_df
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_27vec_call_site_record_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_16vec_uchar_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_18call_site_record_d
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_14sequence_stack
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_15target_libfuncs
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_13libfunc_entry
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21vec_alias_pair_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_12tree_vec_map
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_17tree_priority_map
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_12tree_int_map
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_13tree_decl_map
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_8tree_map
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_14lang_tree_node
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_14target_globals
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_24tree_statement_list_node
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_9lang_decl
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_9lang_type
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_15vec_tree_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_26vec_constructor_elt_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_10die_struct
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_14range_info_def
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_12ptr_info_def
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_10target_rtl
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_8function
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_23constant_descriptor_rtx
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_11fixed_value
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_10real_value
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_14vec_rtx_va_gc_
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_12object_block
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_9reg_attrs
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_9mem_attrs
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_13coverage_data
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_14bitmap_obstack
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_14bitmap_element
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_16machine_function
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_15basic_block_def
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_8edge_def
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_7section
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_21gimple_statement_base
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_9rtvec_def
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_7rtx_def
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_11bitmap_head
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_6answer
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_9cpp_macro
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_9cpp_token
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_9line_maps
-    (void *, void *, gt_pointer_operator, void *);
-#define gt_pch_p_9tree_node gt_pch_p_14lang_tree_node
-extern void gt_pch_p_II17splay_tree_node_s
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_SP9tree_node17splay_tree_node_s
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P9tree_nodeP9tree_node17splay_tree_node_s
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P17string_descriptor4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P14type_assertion4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P18treetreehash_entry4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P17module_htab_entry4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P21pending_abstract_type4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P14constexpr_call4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P16constexpr_fundef4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P10spec_entry4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P16cxx_int_tree_map4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P17named_label_entry4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P13pad_type_hash4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P12tree_int_map4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P13tree_type_map4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P17lto_in_decl_state4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P9tree_nodeP9tree_node12splay_tree_s
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P13scev_info_str4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P15tm_restart_node4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P8tree_map4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P23constant_descriptor_rtx4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P24constant_descriptor_tree4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P12object_block4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P7section4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P17tree_priority_map4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P12tree_vec_map4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P13tree_decl_map4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P9type_hash4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P23temp_slot_address_entry4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P15throw_stmt_node4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P9reg_attrs4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P7rtx_def4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P23addr_table_entry_struct4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P22cached_dw_loc_list_def4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P16var_loc_list_def4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P10die_struct4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P15dwarf_file_data4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P20indirect_string_node4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_SP9tree_node12splay_tree_s
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P28cgraph_function_version_info4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_II12splay_tree_s
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P11symtab_node4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P11cgraph_edge4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P9loop_exit4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P24types_used_by_vars_entry4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P9tree_node4htab
-    (void *, void *, gt_pointer_operator, void *);
-extern void gt_pch_p_P13libfunc_entry4htab
-    (void *, void *, gt_pointer_operator, void *);
-
-/* Splay tree callback allocators.  */
-extern void * ggc_alloc_splay_tree_scalar_scalar_splay_tree_node_s (int, void *);
-extern void * ggc_alloc_splay_tree_str_tree_node_splay_tree_node_s (int, void *);
-extern void * ggc_alloc_splay_tree_tree_node_tree_node_splay_tree_node_s (int, void *);
-extern void * ggc_alloc_splay_tree_string_descriptor_htab (int, void *);
-extern void * ggc_alloc_splay_tree_type_assertion_htab (int, void *);
-extern void * ggc_alloc_splay_tree_treetreehash_entry_htab (int, void *);
-extern void * ggc_alloc_splay_tree_module_htab_entry_htab (int, void *);
-extern void * ggc_alloc_splay_tree_pending_abstract_type_htab (int, void *);
-extern void * ggc_alloc_splay_tree_constexpr_call_htab (int, void *);
-extern void * ggc_alloc_splay_tree_constexpr_fundef_htab (int, void *);
-extern void * ggc_alloc_splay_tree_spec_entry_htab (int, void *);
-extern void * ggc_alloc_splay_tree_cxx_int_tree_map_htab (int, void *);
-extern void * ggc_alloc_splay_tree_named_label_entry_htab (int, void *);
-extern void * ggc_alloc_splay_tree_pad_type_hash_htab (int, void *);
-extern void * ggc_alloc_splay_tree_tree_int_map_htab (int, void *);
-extern void * ggc_alloc_splay_tree_tree_type_map_htab (int, void *);
-extern void * ggc_alloc_splay_tree_lto_in_decl_state_htab (int, void *);
-extern void * ggc_alloc_splay_tree_tree_node_tree_node_splay_tree_s (int, void *);
-extern void * ggc_alloc_splay_tree_scev_info_str_htab (int, void *);
-extern void * ggc_alloc_splay_tree_tm_restart_node_htab (int, void *);
-extern void * ggc_alloc_splay_tree_tree_map_htab (int, void *);
-extern void * ggc_alloc_splay_tree_constant_descriptor_rtx_htab (int, void *);
-extern void * ggc_alloc_splay_tree_constant_descriptor_tree_htab (int, void *);
-extern void * ggc_alloc_splay_tree_object_block_htab (int, void *);
-extern void * ggc_alloc_splay_tree_section_htab (int, void *);
-extern void * ggc_alloc_splay_tree_tree_priority_map_htab (int, void *);
-extern void * ggc_alloc_splay_tree_tree_vec_map_htab (int, void *);
-extern void * ggc_alloc_splay_tree_tree_decl_map_htab (int, void *);
-extern void * ggc_alloc_splay_tree_type_hash_htab (int, void *);
-extern void * ggc_alloc_splay_tree_temp_slot_address_entry_htab (int, void *);
-extern void * ggc_alloc_splay_tree_throw_stmt_node_htab (int, void *);
-extern void * ggc_alloc_splay_tree_reg_attrs_htab (int, void *);
-extern void * ggc_alloc_splay_tree_rtx_def_htab (int, void *);
-extern void * ggc_alloc_splay_tree_addr_table_entry_struct_htab (int, void *);
-extern void * ggc_alloc_splay_tree_cached_dw_loc_list_def_htab (int, void *);
-extern void * ggc_alloc_splay_tree_var_loc_list_def_htab (int, void *);
-extern void * ggc_alloc_splay_tree_die_struct_htab (int, void *);
-extern void * ggc_alloc_splay_tree_dwarf_file_data_htab (int, void *);
-extern void * ggc_alloc_splay_tree_indirect_string_node_htab (int, void *);
-extern void * ggc_alloc_splay_tree_str_tree_node_splay_tree_s (int, void *);
-extern void * ggc_alloc_splay_tree_cgraph_function_version_info_htab (int, void *);
-extern void * ggc_alloc_splay_tree_scalar_scalar_splay_tree_s (int, void *);
-extern void * ggc_alloc_splay_tree_symtab_node_htab (int, void *);
-extern void * ggc_alloc_splay_tree_cgraph_edge_htab (int, void *);
-extern void * ggc_alloc_splay_tree_loop_exit_htab (int, void *);
-extern void * ggc_alloc_splay_tree_types_used_by_vars_entry_htab (int, void *);
-extern void * ggc_alloc_splay_tree_tree_node_htab (int, void *);
-extern void * ggc_alloc_splay_tree_libfunc_entry_htab (int, void *);
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/hard-reg-set.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/hard-reg-set.h
deleted file mode 100644
index b8ab3df..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/hard-reg-set.h
+++ /dev/null
@@ -1,724 +0,0 @@
-/* Sets (bit vectors) of hard registers, and operations on them.
-   Copyright (C) 1987-2014 Free Software Foundation, Inc.
-
-This file is part of GCC
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_HARD_REG_SET_H
-#define GCC_HARD_REG_SET_H
-
-/* Define the type of a set of hard registers.  */
-
-/* HARD_REG_ELT_TYPE is a typedef of the unsigned integral type which
-   will be used for hard reg sets, either alone or in an array.
-
-   If HARD_REG_SET is a macro, its definition is HARD_REG_ELT_TYPE,
-   and it has enough bits to represent all the target machine's hard
-   registers.  Otherwise, it is a typedef for a suitably sized array
-   of HARD_REG_ELT_TYPEs.  HARD_REG_SET_LONGS is defined as how many.
-
-   Note that lots of code assumes that the first part of a regset is
-   the same format as a HARD_REG_SET.  To help make sure this is true,
-   we only try the widest fast integer mode (HOST_WIDEST_FAST_INT)
-   instead of all the smaller types.  This approach loses only if
-   there are very few registers and then only in the few cases where
-   we have an array of HARD_REG_SETs, so it needn't be as complex as
-   it used to be.  */
-
-typedef unsigned HOST_WIDEST_FAST_INT HARD_REG_ELT_TYPE;
-
-#if FIRST_PSEUDO_REGISTER <= HOST_BITS_PER_WIDEST_FAST_INT
-
-#define HARD_REG_SET HARD_REG_ELT_TYPE
-
-#else
-
-#define HARD_REG_SET_LONGS \
- ((FIRST_PSEUDO_REGISTER + HOST_BITS_PER_WIDEST_FAST_INT - 1)	\
-  / HOST_BITS_PER_WIDEST_FAST_INT)
-typedef HARD_REG_ELT_TYPE HARD_REG_SET[HARD_REG_SET_LONGS];
-
-#endif
-
-/* HARD_REG_SET wrapped into a structure, to make it possible to
-   use HARD_REG_SET even in APIs that should not include
-   hard-reg-set.h.  */
-struct hard_reg_set_container
-{
-  HARD_REG_SET set;
-};
-
-/* HARD_CONST is used to cast a constant to the appropriate type
-   for use with a HARD_REG_SET.  */
-
-#define HARD_CONST(X) ((HARD_REG_ELT_TYPE) (X))
-
-/* Define macros SET_HARD_REG_BIT, CLEAR_HARD_REG_BIT and TEST_HARD_REG_BIT
-   to set, clear or test one bit in a hard reg set of type HARD_REG_SET.
-   All three take two arguments: the set and the register number.
-
-   In the case where sets are arrays of longs, the first argument
-   is actually a pointer to a long.
-
-   Define two macros for initializing a set:
-   CLEAR_HARD_REG_SET and SET_HARD_REG_SET.
-   These take just one argument.
-
-   Also define macros for copying hard reg sets:
-   COPY_HARD_REG_SET and COMPL_HARD_REG_SET.
-   These take two arguments TO and FROM; they read from FROM
-   and store into TO.  COMPL_HARD_REG_SET complements each bit.
-
-   Also define macros for combining hard reg sets:
-   IOR_HARD_REG_SET and AND_HARD_REG_SET.
-   These take two arguments TO and FROM; they read from FROM
-   and combine bitwise into TO.  Define also two variants
-   IOR_COMPL_HARD_REG_SET and AND_COMPL_HARD_REG_SET
-   which use the complement of the set FROM.
-
-   Also define:
-
-   hard_reg_set_subset_p (X, Y), which returns true if X is a subset of Y.
-   hard_reg_set_equal_p (X, Y), which returns true if X and Y are equal.
-   hard_reg_set_intersect_p (X, Y), which returns true if X and Y intersect.
-   hard_reg_set_empty_p (X), which returns true if X is empty.  */
-
-#define UHOST_BITS_PER_WIDE_INT ((unsigned) HOST_BITS_PER_WIDEST_FAST_INT)
-
-#ifdef HARD_REG_SET
-
-#define SET_HARD_REG_BIT(SET, BIT)  \
- ((SET) |= HARD_CONST (1) << (BIT))
-#define CLEAR_HARD_REG_BIT(SET, BIT)  \
- ((SET) &= ~(HARD_CONST (1) << (BIT)))
-#define TEST_HARD_REG_BIT(SET, BIT)  \
- (!!((SET) & (HARD_CONST (1) << (BIT))))
-
-#define CLEAR_HARD_REG_SET(TO) ((TO) = HARD_CONST (0))
-#define SET_HARD_REG_SET(TO) ((TO) = ~ HARD_CONST (0))
-
-#define COPY_HARD_REG_SET(TO, FROM) ((TO) = (FROM))
-#define COMPL_HARD_REG_SET(TO, FROM) ((TO) = ~(FROM))
-
-#define IOR_HARD_REG_SET(TO, FROM) ((TO) |= (FROM))
-#define IOR_COMPL_HARD_REG_SET(TO, FROM) ((TO) |= ~ (FROM))
-#define AND_HARD_REG_SET(TO, FROM) ((TO) &= (FROM))
-#define AND_COMPL_HARD_REG_SET(TO, FROM) ((TO) &= ~ (FROM))
-
-static inline bool
-hard_reg_set_subset_p (const HARD_REG_SET x, const HARD_REG_SET y)
-{
-  return (x & ~y) == HARD_CONST (0);
-}
-
-static inline bool
-hard_reg_set_equal_p (const HARD_REG_SET x, const HARD_REG_SET y)
-{
-  return x == y;
-}
-
-static inline bool
-hard_reg_set_intersect_p (const HARD_REG_SET x, const HARD_REG_SET y)
-{
-  return (x & y) != HARD_CONST (0);
-}
-
-static inline bool
-hard_reg_set_empty_p (const HARD_REG_SET x)
-{
-  return x == HARD_CONST (0);
-}
-
-#else
-
-#define SET_HARD_REG_BIT(SET, BIT)		\
-  ((SET)[(BIT) / UHOST_BITS_PER_WIDE_INT]	\
-   |= HARD_CONST (1) << ((BIT) % UHOST_BITS_PER_WIDE_INT))
-
-#define CLEAR_HARD_REG_BIT(SET, BIT)		\
-  ((SET)[(BIT) / UHOST_BITS_PER_WIDE_INT]	\
-   &= ~(HARD_CONST (1) << ((BIT) % UHOST_BITS_PER_WIDE_INT)))
-
-#define TEST_HARD_REG_BIT(SET, BIT)		\
-  (!!((SET)[(BIT) / UHOST_BITS_PER_WIDE_INT]	\
-      & (HARD_CONST (1) << ((BIT) % UHOST_BITS_PER_WIDE_INT))))
-
-#if FIRST_PSEUDO_REGISTER <= 2*HOST_BITS_PER_WIDEST_FAST_INT
-#define CLEAR_HARD_REG_SET(TO)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO);			\
-     scan_tp_[0] = 0;						\
-     scan_tp_[1] = 0; } while (0)
-
-#define SET_HARD_REG_SET(TO)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO);			\
-     scan_tp_[0] = -1;						\
-     scan_tp_[1] = -1; } while (0)
-
-#define COPY_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM);	\
-     scan_tp_[0] = scan_fp_[0];					\
-     scan_tp_[1] = scan_fp_[1]; } while (0)
-
-#define COMPL_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     scan_tp_[0] = ~ scan_fp_[0];				\
-     scan_tp_[1] = ~ scan_fp_[1]; } while (0)
-
-#define AND_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     scan_tp_[0] &= scan_fp_[0];				\
-     scan_tp_[1] &= scan_fp_[1]; } while (0)
-
-#define AND_COMPL_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     scan_tp_[0] &= ~ scan_fp_[0];				\
-     scan_tp_[1] &= ~ scan_fp_[1]; } while (0)
-
-#define IOR_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     scan_tp_[0] |= scan_fp_[0];				\
-     scan_tp_[1] |= scan_fp_[1]; } while (0)
-
-#define IOR_COMPL_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     scan_tp_[0] |= ~ scan_fp_[0];				\
-     scan_tp_[1] |= ~ scan_fp_[1]; } while (0)
-
-static inline bool
-hard_reg_set_subset_p (const HARD_REG_SET x, const HARD_REG_SET y)
-{
-  return (x[0] & ~y[0]) == 0 && (x[1] & ~y[1]) == 0;
-}
-
-static inline bool
-hard_reg_set_equal_p (const HARD_REG_SET x, const HARD_REG_SET y)
-{
-  return x[0] == y[0] && x[1] == y[1];
-}
-
-static inline bool
-hard_reg_set_intersect_p (const HARD_REG_SET x, const HARD_REG_SET y)
-{
-  return (x[0] & y[0]) != 0 || (x[1] & y[1]) != 0;
-}
-
-static inline bool
-hard_reg_set_empty_p (const HARD_REG_SET x)
-{
-  return x[0] == 0 && x[1] == 0;
-}
-
-#else
-#if FIRST_PSEUDO_REGISTER <= 3*HOST_BITS_PER_WIDEST_FAST_INT
-#define CLEAR_HARD_REG_SET(TO)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO);			\
-     scan_tp_[0] = 0;						\
-     scan_tp_[1] = 0;						\
-     scan_tp_[2] = 0; } while (0)
-
-#define SET_HARD_REG_SET(TO)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO);			\
-     scan_tp_[0] = -1;						\
-     scan_tp_[1] = -1;						\
-     scan_tp_[2] = -1; } while (0)
-
-#define COPY_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM);	\
-     scan_tp_[0] = scan_fp_[0];					\
-     scan_tp_[1] = scan_fp_[1];					\
-     scan_tp_[2] = scan_fp_[2]; } while (0)
-
-#define COMPL_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     scan_tp_[0] = ~ scan_fp_[0];				\
-     scan_tp_[1] = ~ scan_fp_[1];				\
-     scan_tp_[2] = ~ scan_fp_[2]; } while (0)
-
-#define AND_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     scan_tp_[0] &= scan_fp_[0];				\
-     scan_tp_[1] &= scan_fp_[1];				\
-     scan_tp_[2] &= scan_fp_[2]; } while (0)
-
-#define AND_COMPL_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     scan_tp_[0] &= ~ scan_fp_[0];				\
-     scan_tp_[1] &= ~ scan_fp_[1];				\
-     scan_tp_[2] &= ~ scan_fp_[2]; } while (0)
-
-#define IOR_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     scan_tp_[0] |= scan_fp_[0];				\
-     scan_tp_[1] |= scan_fp_[1];				\
-     scan_tp_[2] |= scan_fp_[2]; } while (0)
-
-#define IOR_COMPL_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     scan_tp_[0] |= ~ scan_fp_[0];				\
-     scan_tp_[1] |= ~ scan_fp_[1];				\
-     scan_tp_[2] |= ~ scan_fp_[2]; } while (0)
-
-static inline bool
-hard_reg_set_subset_p (const HARD_REG_SET x, const HARD_REG_SET y)
-{
-  return ((x[0] & ~y[0]) == 0
-	  && (x[1] & ~y[1]) == 0
-	  && (x[2] & ~y[2]) == 0);
-}
-
-static inline bool
-hard_reg_set_equal_p (const HARD_REG_SET x, const HARD_REG_SET y)
-{
-  return x[0] == y[0] && x[1] == y[1] && x[2] == y[2];
-}
-
-static inline bool
-hard_reg_set_intersect_p (const HARD_REG_SET x, const HARD_REG_SET y)
-{
-  return ((x[0] & y[0]) != 0
-	  || (x[1] & y[1]) != 0
-	  || (x[2] & y[2]) != 0);
-}
-
-static inline bool
-hard_reg_set_empty_p (const HARD_REG_SET x)
-{
-  return x[0] == 0 && x[1] == 0 && x[2] == 0;
-}
-
-#else
-#if FIRST_PSEUDO_REGISTER <= 4*HOST_BITS_PER_WIDEST_FAST_INT
-#define CLEAR_HARD_REG_SET(TO)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO);			\
-     scan_tp_[0] = 0;						\
-     scan_tp_[1] = 0;						\
-     scan_tp_[2] = 0;						\
-     scan_tp_[3] = 0; } while (0)
-
-#define SET_HARD_REG_SET(TO)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO);			\
-     scan_tp_[0] = -1;						\
-     scan_tp_[1] = -1;						\
-     scan_tp_[2] = -1;						\
-     scan_tp_[3] = -1; } while (0)
-
-#define COPY_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM);	\
-     scan_tp_[0] = scan_fp_[0];					\
-     scan_tp_[1] = scan_fp_[1];					\
-     scan_tp_[2] = scan_fp_[2];					\
-     scan_tp_[3] = scan_fp_[3]; } while (0)
-
-#define COMPL_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     scan_tp_[0] = ~ scan_fp_[0];				\
-     scan_tp_[1] = ~ scan_fp_[1];				\
-     scan_tp_[2] = ~ scan_fp_[2];				\
-     scan_tp_[3] = ~ scan_fp_[3]; } while (0)
-
-#define AND_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     scan_tp_[0] &= scan_fp_[0];				\
-     scan_tp_[1] &= scan_fp_[1];				\
-     scan_tp_[2] &= scan_fp_[2];				\
-     scan_tp_[3] &= scan_fp_[3]; } while (0)
-
-#define AND_COMPL_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     scan_tp_[0] &= ~ scan_fp_[0];				\
-     scan_tp_[1] &= ~ scan_fp_[1];				\
-     scan_tp_[2] &= ~ scan_fp_[2];				\
-     scan_tp_[3] &= ~ scan_fp_[3]; } while (0)
-
-#define IOR_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     scan_tp_[0] |= scan_fp_[0];				\
-     scan_tp_[1] |= scan_fp_[1];				\
-     scan_tp_[2] |= scan_fp_[2];				\
-     scan_tp_[3] |= scan_fp_[3]; } while (0)
-
-#define IOR_COMPL_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     scan_tp_[0] |= ~ scan_fp_[0];				\
-     scan_tp_[1] |= ~ scan_fp_[1];				\
-     scan_tp_[2] |= ~ scan_fp_[2];				\
-     scan_tp_[3] |= ~ scan_fp_[3]; } while (0)
-
-static inline bool
-hard_reg_set_subset_p (const HARD_REG_SET x, const HARD_REG_SET y)
-{
-  return ((x[0] & ~y[0]) == 0
-	  && (x[1] & ~y[1]) == 0
-	  && (x[2] & ~y[2]) == 0
-	  && (x[3] & ~y[3]) == 0);
-}
-
-static inline bool
-hard_reg_set_equal_p (const HARD_REG_SET x, const HARD_REG_SET y)
-{
-  return x[0] == y[0] && x[1] == y[1] && x[2] == y[2] && x[3] == y[3];
-}
-
-static inline bool
-hard_reg_set_intersect_p (const HARD_REG_SET x, const HARD_REG_SET y)
-{
-  return ((x[0] & y[0]) != 0
-	  || (x[1] & y[1]) != 0
-	  || (x[2] & y[2]) != 0
-	  || (x[3] & y[3]) != 0);
-}
-
-static inline bool
-hard_reg_set_empty_p (const HARD_REG_SET x)
-{
-  return x[0] == 0 && x[1] == 0 && x[2] == 0 && x[3] == 0;
-}
-
-#else /* FIRST_PSEUDO_REGISTER > 4*HOST_BITS_PER_WIDEST_FAST_INT */
-
-#define CLEAR_HARD_REG_SET(TO)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO);			\
-     int i;							\
-     for (i = 0; i < HARD_REG_SET_LONGS; i++)			\
-       *scan_tp_++ = 0; } while (0)
-
-#define SET_HARD_REG_SET(TO)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO);			\
-     int i;							\
-     for (i = 0; i < HARD_REG_SET_LONGS; i++)			\
-       *scan_tp_++ = -1; } while (0)
-
-#define COPY_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     int i;							\
-     for (i = 0; i < HARD_REG_SET_LONGS; i++)			\
-       *scan_tp_++ = *scan_fp_++; } while (0)
-
-#define COMPL_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     int i;							\
-     for (i = 0; i < HARD_REG_SET_LONGS; i++)			\
-       *scan_tp_++ = ~ *scan_fp_++; } while (0)
-
-#define AND_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     int i;							\
-     for (i = 0; i < HARD_REG_SET_LONGS; i++)			\
-       *scan_tp_++ &= *scan_fp_++; } while (0)
-
-#define AND_COMPL_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     int i;							\
-     for (i = 0; i < HARD_REG_SET_LONGS; i++)			\
-       *scan_tp_++ &= ~ *scan_fp_++; } while (0)
-
-#define IOR_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     int i;							\
-     for (i = 0; i < HARD_REG_SET_LONGS; i++)			\
-       *scan_tp_++ |= *scan_fp_++; } while (0)
-
-#define IOR_COMPL_HARD_REG_SET(TO, FROM)  \
-do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); 	\
-     int i;							\
-     for (i = 0; i < HARD_REG_SET_LONGS; i++)			\
-       *scan_tp_++ |= ~ *scan_fp_++; } while (0)
-
-static inline bool
-hard_reg_set_subset_p (const HARD_REG_SET x, const HARD_REG_SET y)
-{
-  int i;
-
-  for (i = 0; i < HARD_REG_SET_LONGS; i++)
-    if ((x[i] & ~y[i]) != 0)
-      return false;
-  return true;
-}
-
-static inline bool
-hard_reg_set_equal_p (const HARD_REG_SET x, const HARD_REG_SET y)
-{
-  int i;
-
-  for (i = 0; i < HARD_REG_SET_LONGS; i++)
-    if (x[i] != y[i])
-      return false;
-  return true;
-}
-
-static inline bool
-hard_reg_set_intersect_p (const HARD_REG_SET x, const HARD_REG_SET y)
-{
-  int i;
-
-  for (i = 0; i < HARD_REG_SET_LONGS; i++)
-    if ((x[i] & y[i]) != 0)
-      return true;
-  return false;
-}
-
-static inline bool
-hard_reg_set_empty_p (const HARD_REG_SET x)
-{
-  int i;
-
-  for (i = 0; i < HARD_REG_SET_LONGS; i++)
-    if (x[i] != 0)
-      return false;
-  return true;
-}
-
-#endif
-#endif
-#endif
-#endif
-
-/* Iterator for hard register sets.  */
-
-struct hard_reg_set_iterator
-{
-  /* Pointer to the current element.  */
-  HARD_REG_ELT_TYPE *pelt;
-
-  /* The length of the set.  */
-  unsigned short length;
-
-  /* Word within the current element.  */
-  unsigned short word_no;
-
-  /* Contents of the actually processed word.  When finding next bit
-     it is shifted right, so that the actual bit is always the least
-     significant bit of ACTUAL.  */
-  HARD_REG_ELT_TYPE bits;
-};
-
-#define HARD_REG_ELT_BITS UHOST_BITS_PER_WIDE_INT
-
-/* The implementation of the iterator functions is fully analogous to
-   the bitmap iterators.  */
-static inline void
-hard_reg_set_iter_init (hard_reg_set_iterator *iter, HARD_REG_SET set,
-                        unsigned min, unsigned *regno)
-{
-#ifdef HARD_REG_SET_LONGS
-  iter->pelt = set;
-  iter->length = HARD_REG_SET_LONGS;
-#else
-  iter->pelt = &set;
-  iter->length = 1;
-#endif
-  iter->word_no = min / HARD_REG_ELT_BITS;
-  if (iter->word_no < iter->length)
-    {
-      iter->bits = iter->pelt[iter->word_no];
-      iter->bits >>= min % HARD_REG_ELT_BITS;
-
-      /* This is required for correct search of the next bit.  */
-      min += !iter->bits;
-    }
-  *regno = min;
-}
-
-static inline bool
-hard_reg_set_iter_set (hard_reg_set_iterator *iter, unsigned *regno)
-{
-  while (1)
-    {
-      /* Return false when we're advanced past the end of the set.  */
-      if (iter->word_no >= iter->length)
-        return false;
-
-      if (iter->bits)
-        {
-          /* Find the correct bit and return it.  */
-          while (!(iter->bits & 1))
-            {
-              iter->bits >>= 1;
-              *regno += 1;
-            }
-          return (*regno < FIRST_PSEUDO_REGISTER);
-        }
-
-      /* Round to the beginning of the next word.  */
-      *regno = (*regno + HARD_REG_ELT_BITS - 1);
-      *regno -= *regno % HARD_REG_ELT_BITS;
-
-      /* Find the next non-zero word.  */
-      while (++iter->word_no < iter->length)
-        {
-          iter->bits = iter->pelt[iter->word_no];
-          if (iter->bits)
-            break;
-          *regno += HARD_REG_ELT_BITS;
-        }
-    }
-}
-
-static inline void
-hard_reg_set_iter_next (hard_reg_set_iterator *iter, unsigned *regno)
-{
-  iter->bits >>= 1;
-  *regno += 1;
-}
-
-#define EXECUTE_IF_SET_IN_HARD_REG_SET(SET, MIN, REGNUM, ITER)          \
-  for (hard_reg_set_iter_init (&(ITER), (SET), (MIN), &(REGNUM));       \
-       hard_reg_set_iter_set (&(ITER), &(REGNUM));                      \
-       hard_reg_set_iter_next (&(ITER), &(REGNUM)))
-
-
-/* Define some standard sets of registers.  */
-
-/* Indexed by hard register number, contains 1 for registers
-   that are being used for global register decls.
-   These must be exempt from ordinary flow analysis
-   and are also considered fixed.  */
-
-extern char global_regs[FIRST_PSEUDO_REGISTER];
-
-struct target_hard_regs {
-  /* The set of registers that actually exist on the current target.  */
-  HARD_REG_SET x_accessible_reg_set;
-
-  /* The set of registers that should be considered to be register
-     operands.  It is a subset of x_accessible_reg_set.  */
-  HARD_REG_SET x_operand_reg_set;
-
-  /* Indexed by hard register number, contains 1 for registers
-     that are fixed use (stack pointer, pc, frame pointer, etc.;.
-     These are the registers that cannot be used to allocate
-     a pseudo reg whose life does not cross calls.  */
-  char x_fixed_regs[FIRST_PSEUDO_REGISTER];
-
-  /* The same info as a HARD_REG_SET.  */
-  HARD_REG_SET x_fixed_reg_set;
-
-  /* Indexed by hard register number, contains 1 for registers
-     that are fixed use or are clobbered by function calls.
-     These are the registers that cannot be used to allocate
-     a pseudo reg whose life crosses calls.  */
-  char x_call_used_regs[FIRST_PSEUDO_REGISTER];
-
-  char x_call_really_used_regs[FIRST_PSEUDO_REGISTER];
-
-  /* The same info as a HARD_REG_SET.  */
-  HARD_REG_SET x_call_used_reg_set;
-
-  /* Contains registers that are fixed use -- i.e. in fixed_reg_set -- or
-     a function value return register or TARGET_STRUCT_VALUE_RTX or
-     STATIC_CHAIN_REGNUM.  These are the registers that cannot hold quantities
-     across calls even if we are willing to save and restore them.  */
-  HARD_REG_SET x_call_fixed_reg_set;
-
-  /* Contains 1 for registers that are set or clobbered by calls.  */
-  /* ??? Ideally, this would be just call_used_regs plus global_regs, but
-     for someone's bright idea to have call_used_regs strictly include
-     fixed_regs.  Which leaves us guessing as to the set of fixed_regs
-     that are actually preserved.  We know for sure that those associated
-     with the local stack frame are safe, but scant others.  */
-  HARD_REG_SET x_regs_invalidated_by_call;
-
-  /* Call used hard registers which can not be saved because there is no
-     insn for this.  */
-  HARD_REG_SET x_no_caller_save_reg_set;
-
-  /* Table of register numbers in the order in which to try to use them.  */
-  int x_reg_alloc_order[FIRST_PSEUDO_REGISTER];
-
-  /* The inverse of reg_alloc_order.  */
-  int x_inv_reg_alloc_order[FIRST_PSEUDO_REGISTER];
-
-  /* For each reg class, a HARD_REG_SET saying which registers are in it.  */
-  HARD_REG_SET x_reg_class_contents[N_REG_CLASSES];
-
-  /* For each reg class, a boolean saying whether the class contains only
-     fixed registers.  */
-  bool x_class_only_fixed_regs[N_REG_CLASSES];
-
-  /* For each reg class, number of regs it contains.  */
-  unsigned int x_reg_class_size[N_REG_CLASSES];
-
-  /* For each reg class, table listing all the classes contained in it.  */
-  enum reg_class x_reg_class_subclasses[N_REG_CLASSES][N_REG_CLASSES];
-
-  /* For each pair of reg classes,
-     a largest reg class contained in their union.  */
-  enum reg_class x_reg_class_subunion[N_REG_CLASSES][N_REG_CLASSES];
-
-  /* For each pair of reg classes,
-     the smallest reg class that contains their union.  */
-  enum reg_class x_reg_class_superunion[N_REG_CLASSES][N_REG_CLASSES];
-
-  /* Vector indexed by hardware reg giving its name.  */
-  const char *x_reg_names[FIRST_PSEUDO_REGISTER];
-};
-
-extern struct target_hard_regs default_target_hard_regs;
-#if SWITCHABLE_TARGET
-extern struct target_hard_regs *this_target_hard_regs;
-#else
-#define this_target_hard_regs (&default_target_hard_regs)
-#endif
-
-#define accessible_reg_set \
-  (this_target_hard_regs->x_accessible_reg_set)
-#define operand_reg_set \
-  (this_target_hard_regs->x_operand_reg_set)
-#define fixed_regs \
-  (this_target_hard_regs->x_fixed_regs)
-#define fixed_reg_set \
-  (this_target_hard_regs->x_fixed_reg_set)
-#define call_used_regs \
-  (this_target_hard_regs->x_call_used_regs)
-#define call_really_used_regs \
-  (this_target_hard_regs->x_call_really_used_regs)
-#define call_used_reg_set \
-  (this_target_hard_regs->x_call_used_reg_set)
-#define call_fixed_reg_set \
-  (this_target_hard_regs->x_call_fixed_reg_set)
-#define regs_invalidated_by_call \
-  (this_target_hard_regs->x_regs_invalidated_by_call)
-#define no_caller_save_reg_set \
-  (this_target_hard_regs->x_no_caller_save_reg_set)
-#define reg_alloc_order \
-  (this_target_hard_regs->x_reg_alloc_order)
-#define inv_reg_alloc_order \
-  (this_target_hard_regs->x_inv_reg_alloc_order)
-#define reg_class_contents \
-  (this_target_hard_regs->x_reg_class_contents)
-#define class_only_fixed_regs \
-  (this_target_hard_regs->x_class_only_fixed_regs)
-#define reg_class_size \
-  (this_target_hard_regs->x_reg_class_size)
-#define reg_class_subclasses \
-  (this_target_hard_regs->x_reg_class_subclasses)
-#define reg_class_subunion \
-  (this_target_hard_regs->x_reg_class_subunion)
-#define reg_class_superunion \
-  (this_target_hard_regs->x_reg_class_superunion)
-#define reg_names \
-  (this_target_hard_regs->x_reg_names)
-
-/* Vector indexed by reg class giving its name.  */
-
-extern const char * reg_class_names[];
-
-/* Given a hard REGN a FROM mode and a TO mode, return nonzero if
-   REGN cannot change modes between the specified modes.  */
-#define REG_CANNOT_CHANGE_MODE_P(REGN, FROM, TO)                          \
-         CANNOT_CHANGE_MODE_CLASS (FROM, TO, REGNO_REG_CLASS (REGN))
-
-#endif /* ! GCC_HARD_REG_SET_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/hash-table.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/hash-table.h
deleted file mode 100644
index 034385c..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/hash-table.h
+++ /dev/null
@@ -1,1060 +0,0 @@
-/* A type-safe hash table template.
-   Copyright (C) 2012-2014 Free Software Foundation, Inc.
-   Contributed by Lawrence Crowl <crowl@google.com>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-
-/* This file implements a typed hash table.
-   The implementation borrows from libiberty's htab_t in hashtab.h.
-
-
-   INTRODUCTION TO TYPES
-
-   Users of the hash table generally need to be aware of three types.
-
-      1. The type being placed into the hash table.  This type is called
-      the value type.
-
-      2. The type used to describe how to handle the value type within
-      the hash table.  This descriptor type provides the hash table with
-      several things.
-
-         - A typedef named 'value_type' to the value type (from above).
-
-         - A static member function named 'hash' that takes a value_type
-         pointer and returns a hashval_t value.
-
-         - A typedef named 'compare_type' that is used to test when an value
-         is found.  This type is the comparison type.  Usually, it will be the
-         same as value_type.  If it is not the same type, you must generally
-         explicitly compute hash values and pass them to the hash table.
-
-         - A static member function named 'equal' that takes a value_type
-         pointer and a compare_type pointer, and returns a bool.
-
-         - A static function named 'remove' that takes an value_type pointer
-         and frees the memory allocated by it.  This function is used when
-         individual elements of the table need to be disposed of (e.g.,
-         when deleting a hash table, removing elements from the table, etc).
-
-      3. The type of the hash table itself.  (More later.)
-
-   In very special circumstances, users may need to know about a fourth type.
-
-      4. The template type used to describe how hash table memory
-      is allocated.  This type is called the allocator type.  It is
-      parameterized on the value type.  It provides four functions.
-
-         - A static member function named 'control_alloc'.  This function
-         allocates the control data blocks for the table.
-
-         - A static member function named 'control_free'.  This function
-         frees the control data blocks for the table.
-
-         - A static member function named 'data_alloc'.  This function
-         allocates the data elements in the table.
-
-         - A static member function named 'data_free'.  This function
-         deallocates the data elements in the table.
-
-   Hash table are instantiated with two type arguments.
-
-      * The descriptor type, (2) above.
-
-      * The allocator type, (4) above.  In general, you will not need to
-      provide your own allocator type.  By default, hash tables will use
-      the class template xcallocator, which uses malloc/free for allocation.
-
-
-   DEFINING A DESCRIPTOR TYPE
-
-   The first task in using the hash table is to describe the element type.
-   We compose this into a few steps.
-
-      1. Decide on a removal policy for values stored in the table.
-         This header provides class templates for the two most common
-         policies.
-
-         * typed_free_remove implements the static 'remove' member function
-         by calling free().
-
-         * typed_noop_remove implements the static 'remove' member function
-         by doing nothing.
-
-         You can use these policies by simply deriving the descriptor type
-         from one of those class template, with the appropriate argument.
-
-         Otherwise, you need to write the static 'remove' member function
-         in the descriptor class.
-
-      2. Choose a hash function.  Write the static 'hash' member function.
-
-      3. Choose an equality testing function.  In most cases, its two
-      arguments will be value_type pointers.  If not, the first argument must
-      be a value_type pointer, and the second argument a compare_type pointer.
-
-
-   AN EXAMPLE DESCRIPTOR TYPE
-
-   Suppose you want to put some_type into the hash table.  You could define
-   the descriptor type as follows.
-
-      struct some_type_hasher : typed_noop_remove <some_type>
-      // Deriving from typed_noop_remove means that we get a 'remove' that does
-      // nothing.  This choice is good for raw values.
-      {
-        typedef some_type value_type;
-        typedef some_type compare_type;
-        static inline hashval_t hash (const value_type *);
-        static inline bool equal (const value_type *, const compare_type *);
-      };
-
-      inline hashval_t
-      some_type_hasher::hash (const value_type *e)
-      { ... compute and return a hash value for E ... }
-
-      inline bool
-      some_type_hasher::equal (const value_type *p1, const compare_type *p2)
-      { ... compare P1 vs P2.  Return true if they are the 'same' ... }
-
-
-   AN EXAMPLE HASH_TABLE DECLARATION
-
-   To instantiate a hash table for some_type:
-
-      hash_table <some_type_hasher> some_type_hash_table;
-
-   There is no need to mention some_type directly, as the hash table will
-   obtain it using some_type_hasher::value_type.
-
-   You can then used any of the functions in hash_table's public interface.
-   See hash_table for details.  The interface is very similar to libiberty's
-   htab_t.
-
-
-   EASY DESCRIPTORS FOR POINTERS
-
-   The class template pointer_hash provides everything you need to hash
-   pointers (as opposed to what they point to).  So, to instantiate a hash
-   table over pointers to whatever_type,
-
-      hash_table <pointer_hash <whatever_type>> whatever_type_hash_table;
-
-
-   HASH TABLE ITERATORS
-
-   The hash table provides standard C++ iterators.  For example, consider a
-   hash table of some_info.  We wish to consume each element of the table:
-
-      extern void consume (some_info *);
-
-   We define a convenience typedef and the hash table:
-
-      typedef hash_table <some_info_hasher> info_table_type;
-      info_table_type info_table;
-
-   Then we write the loop in typical C++ style:
-
-      for (info_table_type::iterator iter = info_table.begin ();
-           iter != info_table.end ();
-           ++iter)
-        if ((*iter).status == INFO_READY)
-          consume (&*iter);
-
-   Or with common sub-expression elimination:
-
-      for (info_table_type::iterator iter = info_table.begin ();
-           iter != info_table.end ();
-           ++iter)
-        {
-          some_info &elem = *iter;
-          if (elem.status == INFO_READY)
-            consume (&elem);
-        }
-
-   One can also use a more typical GCC style:
-
-      typedef some_info *some_info_p;
-      some_info *elem_ptr;
-      info_table_type::iterator iter;
-      FOR_EACH_HASH_TABLE_ELEMENT (info_table, elem_ptr, some_info_p, iter)
-        if (elem_ptr->status == INFO_READY)
-          consume (elem_ptr);
-
-*/
-
-
-#ifndef TYPED_HASHTAB_H
-#define TYPED_HASHTAB_H
-
-#include "hashtab.h"
-
-
-/* The ordinary memory allocator.  */
-/* FIXME (crowl): This allocator may be extracted for wider sharing later.  */
-
-template <typename Type>
-struct xcallocator
-{
-  static Type *control_alloc (size_t count);
-  static Type *data_alloc (size_t count);
-  static void control_free (Type *memory);
-  static void data_free (Type *memory);
-};
-
-
-/* Allocate memory for COUNT control blocks.  */
-
-template <typename Type>
-inline Type *
-xcallocator <Type>::control_alloc (size_t count)
-{
-  return static_cast <Type *> (xcalloc (count, sizeof (Type)));
-}
-
-
-/* Allocate memory for COUNT data blocks.  */
-
-template <typename Type>
-inline Type *
-xcallocator <Type>::data_alloc (size_t count)
-{
-  return static_cast <Type *> (xcalloc (count, sizeof (Type)));
-}
-
-
-/* Free memory for control blocks.  */
-
-template <typename Type>
-inline void
-xcallocator <Type>::control_free (Type *memory)
-{
-  return ::free (memory);
-}
-
-
-/* Free memory for data blocks.  */
-
-template <typename Type>
-inline void
-xcallocator <Type>::data_free (Type *memory)
-{
-  return ::free (memory);
-}
-
-
-/* Helpful type for removing with free.  */
-
-template <typename Type>
-struct typed_free_remove
-{
-  static inline void remove (Type *p);
-};
-
-
-/* Remove with free.  */
-
-template <typename Type>
-inline void
-typed_free_remove <Type>::remove (Type *p)
-{
-  free (p);
-}
-
-
-/* Helpful type for a no-op remove.  */
-
-template <typename Type>
-struct typed_noop_remove
-{
-  static inline void remove (Type *p);
-};
-
-
-/* Remove doing nothing.  */
-
-template <typename Type>
-inline void
-typed_noop_remove <Type>::remove (Type *p ATTRIBUTE_UNUSED)
-{
-}
-
-
-/* Pointer hash with a no-op remove method.  */
-
-template <typename Type>
-struct pointer_hash : typed_noop_remove <Type>
-{
-  typedef Type value_type;
-  typedef Type compare_type;
-
-  static inline hashval_t
-  hash (const value_type *);
-
-  static inline int
-  equal (const value_type *existing, const compare_type *candidate);
-};
-
-template <typename Type>
-inline hashval_t
-pointer_hash <Type>::hash (const value_type *candidate)
-{
-  /* This is a really poor hash function, but it is what the current code uses,
-     so I am reusing it to avoid an additional axis in testing.  */
-  return (hashval_t) ((intptr_t)candidate >> 3);
-}
-
-template <typename Type>
-inline int
-pointer_hash <Type>::equal (const value_type *existing,
-			   const compare_type *candidate)
-{
-  return existing == candidate;
-}
-
-
-/* Table of primes and their inversion information.  */
-
-struct prime_ent
-{
-  hashval_t prime;
-  hashval_t inv;
-  hashval_t inv_m2;     /* inverse of prime-2 */
-  hashval_t shift;
-};
-
-extern struct prime_ent const prime_tab[];
-
-
-/* Functions for computing hash table indexes.  */
-
-extern unsigned int hash_table_higher_prime_index (unsigned long n);
-extern hashval_t hash_table_mod1 (hashval_t hash, unsigned int index);
-extern hashval_t hash_table_mod2 (hashval_t hash, unsigned int index);
-
-
-/* Internal implementation type.  */
-
-template <typename T>
-struct hash_table_control
-{
-  /* Table itself.  */
-  T **entries;
-
-  /* Current size (in entries) of the hash table.  */
-  size_t size;
-
-  /* Current number of elements including also deleted elements.  */
-  size_t n_elements;
-
-  /* Current number of deleted elements in the table.  */
-  size_t n_deleted;
-
-  /* The following member is used for debugging. Its value is number
-     of all calls of `htab_find_slot' for the hash table. */
-  unsigned int searches;
-
-  /* The following member is used for debugging.  Its value is number
-     of collisions fixed for time of work with the hash table. */
-  unsigned int collisions;
-
-  /* Current size (in entries) of the hash table, as an index into the
-     table of primes.  */
-  unsigned int size_prime_index;
-};
-
-
-/* User-facing hash table type.
-
-   The table stores elements of type Descriptor::value_type.
-
-   It hashes values with the hash member function.
-     The table currently works with relatively weak hash functions.
-     Use typed_pointer_hash <Value> when hashing pointers instead of objects.
-
-   It compares elements with the equal member function.
-     Two elements with the same hash may not be equal.
-     Use typed_pointer_equal <Value> when hashing pointers instead of objects.
-
-   It removes elements with the remove member function.
-     This feature is useful for freeing memory.
-     Derive from typed_null_remove <Value> when not freeing objects.
-     Derive from typed_free_remove <Value> when doing a simple object free.
-
-   Specify the template Allocator to allocate and free memory.
-     The default is xcallocator.
-
-*/
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator = xcallocator>
-class hash_table
-{
-public:
-  typedef typename Descriptor::value_type value_type;
-  typedef typename Descriptor::compare_type compare_type;
-
-  class iterator
-  {
-  public:
-    inline iterator ();
-    inline iterator (value_type **, value_type **);
-    inline value_type &operator * ();
-    void slide ();
-    inline iterator &operator ++ ();
-    inline bool operator != (const iterator &) const;
-  private:
-    value_type **m_slot;
-    value_type **m_limit;
-  };
-
-private:
-  hash_table_control <value_type> *htab;
-
-  value_type **find_empty_slot_for_expand (hashval_t hash);
-  void expand ();
-
-public:
-  hash_table ();
-  void create (size_t initial_slots);
-  bool is_created ();
-  void dispose ();
-  value_type *find (const value_type *value);
-  value_type *find_with_hash (const compare_type *comparable, hashval_t hash);
-  value_type **find_slot (const value_type *value, enum insert_option insert);
-  value_type **find_slot_with_hash (const compare_type *comparable,
-				    hashval_t hash, enum insert_option insert);
-  void empty ();
-  void clear_slot (value_type **slot);
-  void remove_elt (const value_type *value);
-  void remove_elt_with_hash (const compare_type *comparable, hashval_t hash);
-  size_t size ();
-  size_t elements ();
-  size_t elements_with_deleted ();
-  double collisions ();
-
-  template <typename Argument,
-	    int (*Callback) (value_type **slot, Argument argument)>
-  void traverse_noresize (Argument argument);
-
-  template <typename Argument,
-	    int (*Callback) (value_type **slot, Argument argument)>
-  void traverse (Argument argument);
-
-  iterator begin ();
-  iterator end ();
-};
-
-
-/* Construct the hash table.  The only useful operation next is create.  */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-inline
-hash_table <Descriptor, Allocator>::hash_table ()
-: htab (NULL)
-{
-}
-
-
-/* See if the table has been created, as opposed to constructed.  */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-inline bool
-hash_table <Descriptor, Allocator>::is_created ()
-{
-  return htab != NULL;
-}
-
-
-/* Like find_with_hash, but compute the hash value from the element.  */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-inline typename Descriptor::value_type *
-hash_table <Descriptor, Allocator>::find (const value_type *value)
-{
-  return find_with_hash (value, Descriptor::hash (value));
-}
-
-
-/* Like find_slot_with_hash, but compute the hash value from the element.  */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-inline typename Descriptor::value_type **
-hash_table <Descriptor, Allocator>
-::find_slot (const value_type *value, enum insert_option insert)
-{
-  return find_slot_with_hash (value, Descriptor::hash (value), insert);
-}
-
-
-/* Like remove_elt_with_hash, but compute the hash value from the element.  */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-inline void
-hash_table <Descriptor, Allocator>::remove_elt (const value_type *value)
-{
-  remove_elt_with_hash (value, Descriptor::hash (value));
-}
-
-
-/* Return the current size of this hash table.  */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-inline size_t
-hash_table <Descriptor, Allocator>::size ()
-{
-  return htab->size;
-}
-
-
-/* Return the current number of elements in this hash table. */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-inline size_t
-hash_table <Descriptor, Allocator>::elements ()
-{
-  return htab->n_elements - htab->n_deleted;
-}
-
-
-/* Return the current number of elements in this hash table. */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-inline size_t
-hash_table <Descriptor, Allocator>::elements_with_deleted ()
-{
-  return htab->n_elements;
-}
-
-
-  /* Return the fraction of fixed collisions during all work with given
-     hash table. */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-inline double
-hash_table <Descriptor, Allocator>::collisions ()
-{
-  if (htab->searches == 0)
-    return 0.0;
-
-  return static_cast <double> (htab->collisions) / htab->searches;
-}
-
-
-/* Create a hash table with at least the given number of INITIAL_SLOTS.  */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-void
-hash_table <Descriptor, Allocator>::create (size_t size)
-{
-  unsigned int size_prime_index;
-
-  size_prime_index = hash_table_higher_prime_index (size);
-  size = prime_tab[size_prime_index].prime;
-
-  htab = Allocator <hash_table_control <value_type> > ::control_alloc (1);
-  gcc_assert (htab != NULL);
-  htab->entries = Allocator <value_type*> ::data_alloc (size);
-  gcc_assert (htab->entries != NULL);
-  htab->size = size;
-  htab->size_prime_index = size_prime_index;
-}
-
-
-/* Dispose of a hash table.  Free all memory and return this hash table to
-   the non-created state.  Naturally the hash table must already exist.  */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-void
-hash_table <Descriptor, Allocator>::dispose ()
-{
-  size_t size = htab->size;
-  value_type **entries = htab->entries;
-
-  for (int i = size - 1; i >= 0; i--)
-    if (entries[i] != HTAB_EMPTY_ENTRY && entries[i] != HTAB_DELETED_ENTRY)
-      Descriptor::remove (entries[i]);
-
-  Allocator <value_type *> ::data_free (entries);
-  Allocator <hash_table_control <value_type> > ::control_free (htab);
-  htab = NULL;
-}
-
-
-/* Similar to find_slot, but without several unwanted side effects:
-    - Does not call equal when it finds an existing entry.
-    - Does not change the count of elements/searches/collisions in the
-      hash table.
-   This function also assumes there are no deleted entries in the table.
-   HASH is the hash value for the element to be inserted.  */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-typename Descriptor::value_type **
-hash_table <Descriptor, Allocator>::find_empty_slot_for_expand (hashval_t hash)
-{
-  hashval_t index = hash_table_mod1 (hash, htab->size_prime_index);
-  size_t size = htab->size;
-  value_type **slot = htab->entries + index;
-  hashval_t hash2;
-
-  if (*slot == HTAB_EMPTY_ENTRY)
-    return slot;
-  else if (*slot == HTAB_DELETED_ENTRY)
-    abort ();
-
-  hash2 = hash_table_mod2 (hash, htab->size_prime_index);
-  for (;;)
-    {
-      index += hash2;
-      if (index >= size)
-        index -= size;
-
-      slot = htab->entries + index;
-      if (*slot == HTAB_EMPTY_ENTRY)
-        return slot;
-      else if (*slot == HTAB_DELETED_ENTRY)
-        abort ();
-    }
-}
-
-
-/* The following function changes size of memory allocated for the
-   entries and repeatedly inserts the table elements.  The occupancy
-   of the table after the call will be about 50%.  Naturally the hash
-   table must already exist.  Remember also that the place of the
-   table entries is changed.  If memory allocation fails, this function
-   will abort.  */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-void
-hash_table <Descriptor, Allocator>::expand ()
-{
-  value_type **oentries;
-  value_type **olimit;
-  value_type **p;
-  value_type **nentries;
-  size_t nsize, osize, elts;
-  unsigned int oindex, nindex;
-
-  oentries = htab->entries;
-  oindex = htab->size_prime_index;
-  osize = htab->size;
-  olimit = oentries + osize;
-  elts = elements ();
-
-  /* Resize only when table after removal of unused elements is either
-     too full or too empty.  */
-  if (elts * 2 > osize || (elts * 8 < osize && osize > 32))
-    {
-      nindex = hash_table_higher_prime_index (elts * 2);
-      nsize = prime_tab[nindex].prime;
-    }
-  else
-    {
-      nindex = oindex;
-      nsize = osize;
-    }
-
-  nentries = Allocator <value_type *> ::data_alloc (nsize);
-  gcc_assert (nentries != NULL);
-  htab->entries = nentries;
-  htab->size = nsize;
-  htab->size_prime_index = nindex;
-  htab->n_elements -= htab->n_deleted;
-  htab->n_deleted = 0;
-
-  p = oentries;
-  do
-    {
-      value_type *x = *p;
-
-      if (x != HTAB_EMPTY_ENTRY && x != HTAB_DELETED_ENTRY)
-        {
-          value_type **q = find_empty_slot_for_expand (Descriptor::hash (x));
-
-          *q = x;
-        }
-
-      p++;
-    }
-  while (p < olimit);
-
-  Allocator <value_type *> ::data_free (oentries);
-}
-
-
-/* This function searches for a hash table entry equal to the given
-   COMPARABLE element starting with the given HASH value.  It cannot
-   be used to insert or delete an element. */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-typename Descriptor::value_type *
-hash_table <Descriptor, Allocator>
-::find_with_hash (const compare_type *comparable, hashval_t hash)
-{
-  hashval_t index, hash2;
-  size_t size;
-  value_type *entry;
-
-  htab->searches++;
-  size = htab->size;
-  index = hash_table_mod1 (hash, htab->size_prime_index);
-
-  entry = htab->entries[index];
-  if (entry == HTAB_EMPTY_ENTRY
-      || (entry != HTAB_DELETED_ENTRY && Descriptor::equal (entry, comparable)))
-    return entry;
-
-  hash2 = hash_table_mod2 (hash, htab->size_prime_index);
-  for (;;)
-    {
-      htab->collisions++;
-      index += hash2;
-      if (index >= size)
-        index -= size;
-
-      entry = htab->entries[index];
-      if (entry == HTAB_EMPTY_ENTRY
-          || (entry != HTAB_DELETED_ENTRY
-	      && Descriptor::equal (entry, comparable)))
-        return entry;
-    }
-}
-
-
-/* This function searches for a hash table slot containing an entry
-   equal to the given COMPARABLE element and starting with the given
-   HASH.  To delete an entry, call this with insert=NO_INSERT, then
-   call clear_slot on the slot returned (possibly after doing some
-   checks).  To insert an entry, call this with insert=INSERT, then
-   write the value you want into the returned slot.  When inserting an
-   entry, NULL may be returned if memory allocation fails. */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-typename Descriptor::value_type **
-hash_table <Descriptor, Allocator>
-::find_slot_with_hash (const compare_type *comparable, hashval_t hash,
-		       enum insert_option insert)
-{
-  value_type **first_deleted_slot;
-  hashval_t index, hash2;
-  size_t size;
-  value_type *entry;
-
-  size = htab->size;
-  if (insert == INSERT && size * 3 <= htab->n_elements * 4)
-    {
-      expand ();
-      size = htab->size;
-    }
-
-  index = hash_table_mod1 (hash, htab->size_prime_index);
-
-  htab->searches++;
-  first_deleted_slot = NULL;
-
-  entry = htab->entries[index];
-  if (entry == HTAB_EMPTY_ENTRY)
-    goto empty_entry;
-  else if (entry == HTAB_DELETED_ENTRY)
-    first_deleted_slot = &htab->entries[index];
-  else if (Descriptor::equal (entry, comparable))
-    return &htab->entries[index];
-
-  hash2 = hash_table_mod2 (hash, htab->size_prime_index);
-  for (;;)
-    {
-      htab->collisions++;
-      index += hash2;
-      if (index >= size)
-	index -= size;
-
-      entry = htab->entries[index];
-      if (entry == HTAB_EMPTY_ENTRY)
-	goto empty_entry;
-      else if (entry == HTAB_DELETED_ENTRY)
-	{
-	  if (!first_deleted_slot)
-	    first_deleted_slot = &htab->entries[index];
-	}
-      else if (Descriptor::equal (entry, comparable))
-	return &htab->entries[index];
-    }
-
- empty_entry:
-  if (insert == NO_INSERT)
-    return NULL;
-
-  if (first_deleted_slot)
-    {
-      htab->n_deleted--;
-      *first_deleted_slot = static_cast <value_type *> (HTAB_EMPTY_ENTRY);
-      return first_deleted_slot;
-    }
-
-  htab->n_elements++;
-  return &htab->entries[index];
-}
-
-
-/* This function clears all entries in the given hash table.  */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-void
-hash_table <Descriptor, Allocator>::empty ()
-{
-  size_t size = htab->size;
-  value_type **entries = htab->entries;
-  int i;
-
-  for (i = size - 1; i >= 0; i--)
-    if (entries[i] != HTAB_EMPTY_ENTRY && entries[i] != HTAB_DELETED_ENTRY)
-      Descriptor::remove (entries[i]);
-
-  /* Instead of clearing megabyte, downsize the table.  */
-  if (size > 1024*1024 / sizeof (PTR))
-    {
-      int nindex = hash_table_higher_prime_index (1024 / sizeof (PTR));
-      int nsize = prime_tab[nindex].prime;
-
-      Allocator <value_type *> ::data_free (htab->entries);
-      htab->entries = Allocator <value_type *> ::data_alloc (nsize);
-      htab->size = nsize;
-      htab->size_prime_index = nindex;
-    }
-  else
-    memset (entries, 0, size * sizeof (value_type *));
-  htab->n_deleted = 0;
-  htab->n_elements = 0;
-}
-
-
-/* This function clears a specified SLOT in a hash table.  It is
-   useful when you've already done the lookup and don't want to do it
-   again. */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-void
-hash_table <Descriptor, Allocator>::clear_slot (value_type **slot)
-{
-  if (slot < htab->entries || slot >= htab->entries + htab->size
-      || *slot == HTAB_EMPTY_ENTRY || *slot == HTAB_DELETED_ENTRY)
-    abort ();
-
-  Descriptor::remove (*slot);
-
-  *slot = static_cast <value_type *> (HTAB_DELETED_ENTRY);
-  htab->n_deleted++;
-}
-
-
-/* This function deletes an element with the given COMPARABLE value
-   from hash table starting with the given HASH.  If there is no
-   matching element in the hash table, this function does nothing. */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-void
-hash_table <Descriptor, Allocator>
-::remove_elt_with_hash (const compare_type *comparable, hashval_t hash)
-{
-  value_type **slot;
-
-  slot = find_slot_with_hash (comparable, hash, NO_INSERT);
-  if (*slot == HTAB_EMPTY_ENTRY)
-    return;
-
-  Descriptor::remove (*slot);
-
-  *slot = static_cast <value_type *> (HTAB_DELETED_ENTRY);
-  htab->n_deleted++;
-}
-
-
-/* This function scans over the entire hash table calling CALLBACK for
-   each live entry.  If CALLBACK returns false, the iteration stops.
-   ARGUMENT is passed as CALLBACK's second argument. */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-template <typename Argument,
-	  int (*Callback) (typename Descriptor::value_type **slot, Argument argument)>
-void
-hash_table <Descriptor, Allocator>::traverse_noresize (Argument argument)
-{
-  value_type **slot;
-  value_type **limit;
-
-  slot = htab->entries;
-  limit = slot + htab->size;
-
-  do
-    {
-      value_type *x = *slot;
-
-      if (x != HTAB_EMPTY_ENTRY && x != HTAB_DELETED_ENTRY)
-        if (! Callback (slot, argument))
-          break;
-    }
-  while (++slot < limit);
-}
-
-
-/* Like traverse_noresize, but does resize the table when it is too empty
-   to improve effectivity of subsequent calls.  */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-template <typename Argument,
-	  int (*Callback) (typename Descriptor::value_type **slot,
-			   Argument argument)>
-void
-hash_table <Descriptor, Allocator>::traverse (Argument argument)
-{
-  size_t size = htab->size;
-  if (elements () * 8 < size && size > 32)
-    expand ();
-
-  traverse_noresize <Argument, Callback> (argument);
-}
-
-
-/* Iterator definitions.  */
-
-/* The default constructor produces the end value.  */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-inline
-hash_table <Descriptor, Allocator>::iterator::iterator ()
-: m_slot (NULL), m_limit (NULL)
-{
-}
-
-/* The parameterized constructor produces the begin value.  */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-inline
-hash_table <Descriptor, Allocator>::iterator::iterator
-   (value_type **slot, value_type **limit)
-: m_slot (slot), m_limit (limit)
-{
-}
-
-/* Obtain the element.  */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-inline typename hash_table <Descriptor, Allocator>::value_type &
-hash_table <Descriptor, Allocator>::iterator::operator * ()
-{
-  return **m_slot;
-}
-
-/* Slide down the iterator slots until an active entry is found.  */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-void
-hash_table <Descriptor, Allocator>::iterator::slide ()
-{
-  for ( ; m_slot < m_limit; ++m_slot )
-    {
-      value_type *x = *m_slot;
-      if (x != HTAB_EMPTY_ENTRY && x != HTAB_DELETED_ENTRY)
-        return;
-    }
-  m_slot = NULL;
-  m_limit = NULL;
-}
-
-/* Bump the iterator.  */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-inline typename hash_table <Descriptor, Allocator>::iterator &
-hash_table <Descriptor, Allocator>::iterator::operator ++ ()
-{
-  ++m_slot;
-  slide ();
-  return *this;
-}
-
-/* Compare iterators.  */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-inline bool
-hash_table <Descriptor, Allocator>::iterator::
-  operator != (const iterator &other) const
-{
-  return m_slot != other.m_slot || m_limit != other.m_limit;
-}
-
-/* Hash table iterator producers.  */
-
-/* The beginning of a hash table iteration.  */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-inline typename hash_table <Descriptor, Allocator>::iterator
-hash_table <Descriptor, Allocator>::begin ()
-{
-  iterator hti (htab->entries, htab->entries + htab->size);
-  hti.slide ();
-  return hti;
-}
-
-/* The end of a hash table iteration.  */
-
-template <typename Descriptor,
-	  template <typename Type> class Allocator>
-inline typename hash_table <Descriptor, Allocator>::iterator
-hash_table <Descriptor, Allocator>::end ()
-{
-  return iterator ();
-}
-
-/* Iterate through the elements of hash_table HTAB,
-   using hash_table <....>::iterator ITER,
-   storing each element in RESULT, which is of type TYPE.  */
-
-#define FOR_EACH_HASH_TABLE_ELEMENT(HTAB, RESULT, TYPE, ITER) \
-  for ((ITER) = (HTAB).begin (); \
-       (ITER) != (HTAB).end () ? (RESULT = &*(ITER) , true) : false; \
-       ++(ITER))
-
-#endif /* TYPED_HASHTAB_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/hashtab.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/hashtab.h
deleted file mode 100644
index 4bb65d6..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/hashtab.h
+++ /dev/null
@@ -1,209 +0,0 @@
-/* An expandable hash tables datatype.  
-   Copyright (C) 1999, 2000, 2002, 2003, 2004, 2005, 2009, 2010
-   Free Software Foundation, Inc.
-   Contributed by Vladimir Makarov (vmakarov@cygnus.com).
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-/* This package implements basic hash table functionality.  It is possible
-   to search for an entry, create an entry and destroy an entry.
-
-   Elements in the table are generic pointers.
-
-   The size of the table is not fixed; if the occupancy of the table
-   grows too high the hash table will be expanded.
-
-   The abstract data implementation is based on generalized Algorithm D
-   from Knuth's book "The art of computer programming".  Hash table is
-   expanded by creation of new hash table and transferring elements from
-   the old table to the new table.  */
-
-#ifndef __HASHTAB_H__
-#define __HASHTAB_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#include "ansidecl.h"
-
-#ifndef GTY
-#define GTY(X)
-#endif
-
-/* The type for a hash code.  */
-typedef unsigned int hashval_t;
-
-/* Callback function pointer types.  */
-
-/* Calculate hash of a table entry.  */
-typedef hashval_t (*htab_hash) (const void *);
-
-/* Compare a table entry with a possible entry.  The entry already in
-   the table always comes first, so the second element can be of a
-   different type (but in this case htab_find and htab_find_slot
-   cannot be used; instead the variants that accept a hash value
-   must be used).  */
-typedef int (*htab_eq) (const void *, const void *);
-
-/* Cleanup function called whenever a live element is removed from
-   the hash table.  */
-typedef void (*htab_del) (void *);
-  
-/* Function called by htab_traverse for each live element.  The first
-   arg is the slot of the element (which can be passed to htab_clear_slot
-   if desired), the second arg is the auxiliary pointer handed to
-   htab_traverse.  Return 1 to continue scan, 0 to stop.  */
-typedef int (*htab_trav) (void **, void *);
-
-/* Memory-allocation function, with the same functionality as calloc().
-   Iff it returns NULL, the hash table implementation will pass an error
-   code back to the user, so if your code doesn't handle errors,
-   best if you use xcalloc instead.  */
-typedef void *(*htab_alloc) (size_t, size_t);
-
-/* We also need a free() routine.  */
-typedef void (*htab_free) (void *);
-
-/* Memory allocation and deallocation; variants which take an extra
-   argument.  */
-typedef void *(*htab_alloc_with_arg) (void *, size_t, size_t);
-typedef void (*htab_free_with_arg) (void *, void *);
-
-/* This macro defines reserved value for empty table entry.  */
-
-#define HTAB_EMPTY_ENTRY    ((PTR) 0)
-
-/* This macro defines reserved value for table entry which contained
-   a deleted element. */
-
-#define HTAB_DELETED_ENTRY  ((PTR) 1)
-
-/* Hash tables are of the following type.  The structure
-   (implementation) of this type is not needed for using the hash
-   tables.  All work with hash table should be executed only through
-   functions mentioned below.  The size of this structure is subject to
-   change.  */
-
-struct GTY(()) htab {
-  /* Pointer to hash function.  */
-  htab_hash hash_f;
-
-  /* Pointer to comparison function.  */
-  htab_eq eq_f;
-
-  /* Pointer to cleanup function.  */
-  htab_del del_f;
-
-  /* Table itself.  */
-  void ** GTY ((use_param, length ("%h.size"))) entries;
-
-  /* Current size (in entries) of the hash table.  */
-  size_t size;
-
-  /* Current number of elements including also deleted elements.  */
-  size_t n_elements;
-
-  /* Current number of deleted elements in the table.  */
-  size_t n_deleted;
-
-  /* The following member is used for debugging. Its value is number
-     of all calls of `htab_find_slot' for the hash table. */
-  unsigned int searches;
-
-  /* The following member is used for debugging.  Its value is number
-     of collisions fixed for time of work with the hash table. */
-  unsigned int collisions;
-
-  /* Pointers to allocate/free functions.  */
-  htab_alloc alloc_f;
-  htab_free free_f;
-
-  /* Alternate allocate/free functions, which take an extra argument.  */
-  void * GTY((skip)) alloc_arg;
-  htab_alloc_with_arg alloc_with_arg_f;
-  htab_free_with_arg free_with_arg_f;
-
-  /* Current size (in entries) of the hash table, as an index into the
-     table of primes.  */
-  unsigned int size_prime_index;
-};
-
-typedef struct htab *htab_t;
-
-/* An enum saying whether we insert into the hash table or not.  */
-enum insert_option {NO_INSERT, INSERT};
-
-/* The prototypes of the package functions. */
-
-extern htab_t	htab_create_alloc  (size_t, htab_hash,
-                                    htab_eq, htab_del,
-                                    htab_alloc, htab_free);
-
-extern htab_t	htab_create_alloc_ex (size_t, htab_hash,
-                                      htab_eq, htab_del,
-                                      void *, htab_alloc_with_arg,
-                                      htab_free_with_arg);
-
-extern htab_t  htab_create_typed_alloc (size_t, htab_hash, htab_eq, htab_del,
-					htab_alloc, htab_alloc, htab_free);
-
-/* Backward-compatibility functions.  */
-extern htab_t htab_create (size_t, htab_hash, htab_eq, htab_del);
-extern htab_t htab_try_create (size_t, htab_hash, htab_eq, htab_del);
-
-extern void	htab_set_functions_ex (htab_t, htab_hash,
-                                       htab_eq, htab_del,
-                                       void *, htab_alloc_with_arg,
-                                       htab_free_with_arg);
-
-extern void	htab_delete (htab_t);
-extern void	htab_empty (htab_t);
-
-extern void *	htab_find (htab_t, const void *);
-extern void **	htab_find_slot (htab_t, const void *, enum insert_option);
-extern void *	htab_find_with_hash (htab_t, const void *, hashval_t);
-extern void **	htab_find_slot_with_hash (htab_t, const void *,
-					  hashval_t, enum insert_option);
-extern void	htab_clear_slot	(htab_t, void **);
-extern void	htab_remove_elt	(htab_t, void *);
-extern void	htab_remove_elt_with_hash (htab_t, void *, hashval_t);
-
-extern void	htab_traverse (htab_t, htab_trav, void *);
-extern void	htab_traverse_noresize (htab_t, htab_trav, void *);
-
-extern size_t	htab_size (htab_t);
-extern size_t	htab_elements (htab_t);
-extern double	htab_collisions	(htab_t);
-
-/* A hash function for pointers.  */
-extern htab_hash htab_hash_pointer;
-
-/* An equality function for pointers.  */
-extern htab_eq htab_eq_pointer;
-
-/* A hash function for null-terminated strings.  */
-extern hashval_t htab_hash_string (const void *);
-
-/* An iterative hash function for arbitrary data.  */
-extern hashval_t iterative_hash (const void *, size_t, hashval_t);
-/* Shorthand for hashing something with an intrinsic size.  */
-#define iterative_hash_object(OB,INIT) iterative_hash (&OB, sizeof (OB), INIT)
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* __HASHTAB_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/highlev-plugin-common.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/highlev-plugin-common.h
deleted file mode 100644
index 609955c..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/highlev-plugin-common.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Interface for high-level plugins in GCC - Parts common between GCC,
-   ICI and high-level plugins.
-
-   Copyright (C) 2009-2014 Free Software Foundation, Inc.
-
-   Contributed by INRIA.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef HIGHLEV_PLUGIN_COMMON_H
-#define HIGHLEV_PLUGIN_COMMON_H
-
-/* Return codes for invoke_plugin_callbacks / call_plugin_event .  */
-#define PLUGEVT_SUCCESS         0
-#define PLUGEVT_NO_EVENTS       1
-#define PLUGEVT_NO_SUCH_EVENT   2
-#define PLUGEVT_NO_CALLBACK     3
-
-#endif /* HIGHLEV_PLUGIN_COMMON_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/hwint.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/hwint.h
deleted file mode 100644
index 229fb94..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/hwint.h
+++ /dev/null
@@ -1,351 +0,0 @@
-/* HOST_WIDE_INT definitions for the GNU compiler.
-   Copyright (C) 1998-2014 Free Software Foundation, Inc.
-
-   This file is part of GCC.
-
-   Provide definitions for macros which depend on HOST_BITS_PER_INT
-   and HOST_BITS_PER_LONG.  */
-
-#ifndef GCC_HWINT_H
-#define GCC_HWINT_H
-
-/* This describes the machine the compiler is hosted on.  */
-#define HOST_BITS_PER_CHAR  CHAR_BIT
-#define HOST_BITS_PER_SHORT (CHAR_BIT * SIZEOF_SHORT)
-#define HOST_BITS_PER_INT   (CHAR_BIT * SIZEOF_INT)
-#define HOST_BITS_PER_LONG  (CHAR_BIT * SIZEOF_LONG)
-
-/* The string that should be inserted into a printf style format to
-   indicate a "long" operand.  */
-#ifndef HOST_LONG_FORMAT
-#define HOST_LONG_FORMAT "l"
-#endif
-
-/* The string that should be inserted into a printf style format to
-   indicate a "long long" operand.  */
-#ifndef HOST_LONG_LONG_FORMAT
-#define HOST_LONG_LONG_FORMAT "ll"
-#endif
-
-/* If HAVE_LONG_LONG and SIZEOF_LONG_LONG aren't defined, but
-   GCC_VERSION >= 3000, assume this is the second or later stage of a
-   bootstrap, we do have long long, and it's 64 bits.  (This is
-   required by C99; we do have some ports that violate that assumption
-   but they're all cross-compile-only.)  Just in case, force a
-   constraint violation if that assumption is incorrect.  */
-#if !defined HAVE_LONG_LONG
-# if GCC_VERSION >= 3000
-#  define HAVE_LONG_LONG 1
-#  define SIZEOF_LONG_LONG 8
-extern char sizeof_long_long_must_be_8[sizeof (long long) == 8 ? 1 : -1];
-# endif
-#endif
-
-#ifdef HAVE_LONG_LONG
-# define HOST_BITS_PER_LONGLONG (CHAR_BIT * SIZEOF_LONG_LONG)
-#endif
-#ifdef HAVE___INT64
-# define HOST_BITS_PER___INT64 (CHAR_BIT * SIZEOF___INT64)
-#endif
-
-/* Set HOST_WIDE_INT.  This should be the widest efficient host
-   integer type.  It can be 32 or 64 bits, except that if we are
-   targeting a machine with 64-bit size_t then it has to be 64 bits.
-
-   With a sane ABI, 'long' is the largest efficient host integer type.
-   Thus, we use that unless we have to use 'long long' or '__int64'
-   because we're targeting a 64-bit machine from a 32-bit host.  */
-
-#if HOST_BITS_PER_LONG >= 64 || !defined NEED_64BIT_HOST_WIDE_INT
-#   define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_LONG
-#   define HOST_WIDE_INT long
-#   define HOST_WIDE_INT_C(X) X ## L
-#else
-# if HOST_BITS_PER_LONGLONG >= 64
-#   define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_LONGLONG
-#   define HOST_WIDE_INT long long
-#   define HOST_WIDE_INT_C(X) X ## LL
-# else
-#  if HOST_BITS_PER___INT64 >= 64
-#   define HOST_BITS_PER_WIDE_INT HOST_BITS_PER___INT64
-#   define HOST_WIDE_INT __int64
-#   define HOST_WIDE_INT_C(X) X ## i64
-#  else
-    #error "Unable to find a suitable type for HOST_WIDE_INT"
-#  endif
-# endif
-#endif
-
-/* Print support for half a host wide int.  */
-#define HOST_BITS_PER_HALF_WIDE_INT (HOST_BITS_PER_WIDE_INT / 2)
-#if HOST_BITS_PER_HALF_WIDE_INT == HOST_BITS_PER_LONG
-# define HOST_HALF_WIDE_INT long
-# define HOST_HALF_WIDE_INT_PRINT HOST_LONG_FORMAT
-# define HOST_HALF_WIDE_INT_PRINT_C "L"
-# define HOST_HALF_WIDE_INT_PRINT_DEC "%" HOST_HALF_WIDE_INT_PRINT "d"
-# define HOST_HALF_WIDE_INT_PRINT_DEC_C HOST_HALF_WIDE_INT_PRINT_DEC HOST_HALF_WIDE_INT_PRINT_C
-# define HOST_HALF_WIDE_INT_PRINT_UNSIGNED "%" HOST_HALF_WIDE_INT_PRINT "u"
-# define HOST_HALF_WIDE_INT_PRINT_HEX "%#" HOST_HALF_WIDE_INT_PRINT "x"
-# define HOST_HALF_WIDE_INT_PRINT_HEX_PURE "%" HOST_HALF_WIDE_INT_PRINT "x"
-#elif HOST_BITS_PER_HALF_WIDE_INT == HOST_BITS_PER_INT
-# define HOST_HALF_WIDE_INT int
-# define HOST_HALF_WIDE_INT_PRINT ""
-# define HOST_HALF_WIDE_INT_PRINT_C ""
-# define HOST_HALF_WIDE_INT_PRINT_DEC "%" HOST_HALF_WIDE_INT_PRINT "d"
-# define HOST_HALF_WIDE_INT_PRINT_DEC_C HOST_HALF_WIDE_INT_PRINT_DEC HOST_HALF_WIDE_INT_PRINT_C
-# define HOST_HALF_WIDE_INT_PRINT_UNSIGNED "%" HOST_HALF_WIDE_INT_PRINT "u"
-# define HOST_HALF_WIDE_INT_PRINT_HEX "%#" HOST_HALF_WIDE_INT_PRINT "x"
-# define HOST_HALF_WIDE_INT_PRINT_HEX_PURE "%" HOST_HALF_WIDE_INT_PRINT "x"
-#elif HOST_BITS_PER_HALF_WIDE_INT == HOST_BITS_PER_SHORT
-# define HOST_HALF_WIDE_INT short
-# define HOST_HALF_WIDE_INT_PRINT ""
-# define HOST_HALF_WIDE_INT_PRINT_C ""
-# define HOST_HALF_WIDE_INT_PRINT_DEC "%" HOST_HALF_WIDE_INT_PRINT "d"
-# define HOST_HALF_WIDE_INT_PRINT_DEC_C HOST_HALF_WIDE_INT_PRINT_DEC HOST_HALF_WIDE_INT_PRINT_C
-# define HOST_HALF_WIDE_INT_PRINT_UNSIGNED "%" HOST_HALF_WIDE_INT_PRINT "u"
-# define HOST_HALF_WIDE_INT_PRINT_HEX "%#" HOST_HALF_WIDE_INT_PRINT "x"
-# define HOST_HALF_WIDE_INT_PRINT_HEX_PURE "%" HOST_HALF_WIDE_INT_PRINT "x"
-#else
-#error Please add support for HOST_HALF_WIDE_INT
-#endif
-
-
-#define HOST_WIDE_INT_UC(X) HOST_WIDE_INT_C (X ## U)
-#define HOST_WIDE_INT_1 HOST_WIDE_INT_C (1)
-#define HOST_WIDE_INT_1U HOST_WIDE_INT_UC (1)
-#define HOST_WIDE_INT_M1 HOST_WIDE_INT_C (-1)
-#define HOST_WIDE_INT_M1U HOST_WIDE_INT_UC (-1)
-
-/* This is a magic identifier which allows GCC to figure out the type
-   of HOST_WIDE_INT for %wd specifier checks.  You must issue this
-   typedef before using the __asm_fprintf__ format attribute.  */
-typedef HOST_WIDE_INT __gcc_host_wide_int__;
-
-/* Various printf format strings for HOST_WIDE_INT.  */
-
-#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
-# define HOST_WIDE_INT_PRINT HOST_LONG_FORMAT
-# define HOST_WIDE_INT_PRINT_C "L"
-  /* 'long' might be 32 or 64 bits, and the number of leading zeroes
-     must be tweaked accordingly.  */
-# if HOST_BITS_PER_WIDE_INT == 64
-#  define HOST_WIDE_INT_PRINT_DOUBLE_HEX \
-     "0x%" HOST_LONG_FORMAT "x%016" HOST_LONG_FORMAT "x"
-#  define HOST_WIDE_INT_PRINT_PADDED_HEX \
-     "%016" HOST_LONG_FORMAT "x"
-# else
-#  define HOST_WIDE_INT_PRINT_DOUBLE_HEX \
-     "0x%" HOST_LONG_FORMAT "x%08" HOST_LONG_FORMAT "x"
-#  define HOST_WIDE_INT_PRINT_PADDED_HEX \
-     "%08" HOST_LONG_FORMAT "x"
-# endif
-#else
-# define HOST_WIDE_INT_PRINT HOST_LONG_LONG_FORMAT
-# define HOST_WIDE_INT_PRINT_C "LL"
-  /* We can assume that 'long long' is at least 64 bits.  */
-# define HOST_WIDE_INT_PRINT_DOUBLE_HEX \
-    "0x%" HOST_LONG_LONG_FORMAT "x%016" HOST_LONG_LONG_FORMAT "x"
-# define HOST_WIDE_INT_PRINT_PADDED_HEX \
-    "%016" HOST_LONG_LONG_FORMAT "x"
-#endif /* HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG */
-
-#define HOST_WIDE_INT_PRINT_DEC "%" HOST_WIDE_INT_PRINT "d"
-#define HOST_WIDE_INT_PRINT_DEC_C HOST_WIDE_INT_PRINT_DEC HOST_WIDE_INT_PRINT_C
-#define HOST_WIDE_INT_PRINT_UNSIGNED "%" HOST_WIDE_INT_PRINT "u"
-#define HOST_WIDE_INT_PRINT_HEX "%#" HOST_WIDE_INT_PRINT "x"
-#define HOST_WIDE_INT_PRINT_HEX_PURE "%" HOST_WIDE_INT_PRINT "x"
-
-/* Set HOST_WIDEST_INT.  This is a 64-bit type unless the compiler
-   in use has no 64-bit type at all; in that case it's 32 bits.  */
-
-#if HOST_BITS_PER_WIDE_INT >= 64 \
-    || (HOST_BITS_PER_LONGLONG < 64 && HOST_BITS_PER___INT64 < 64)
-# define HOST_WIDEST_INT		      HOST_WIDE_INT
-# define HOST_BITS_PER_WIDEST_INT	      HOST_BITS_PER_WIDE_INT
-# define HOST_WIDEST_INT_PRINT                HOST_WIDE_INT_PRINT
-# define HOST_WIDEST_INT_PRINT_DEC	      HOST_WIDE_INT_PRINT_DEC
-# define HOST_WIDEST_INT_PRINT_DEC_C	      HOST_WIDE_INT_PRINT_DEC_C
-# define HOST_WIDEST_INT_PRINT_UNSIGNED	      HOST_WIDE_INT_PRINT_UNSIGNED
-# define HOST_WIDEST_INT_PRINT_HEX	      HOST_WIDE_INT_PRINT_HEX
-# define HOST_WIDEST_INT_PRINT_DOUBLE_HEX     HOST_WIDE_INT_PRINT_DOUBLE_HEX
-# define HOST_WIDEST_INT_C(X)		      HOST_WIDE_INT (X)
-#else
-# if HOST_BITS_PER_LONGLONG >= 64
-#  define HOST_BITS_PER_WIDEST_INT	      HOST_BITS_PER_LONGLONG
-#  define HOST_WIDEST_INT		      long long
-#  define HOST_WIDEST_INT_C(X)		      X ## LL
-# else
-#  if HOST_BITS_PER___INT64 >= 64
-#   define HOST_BITS_PER_WIDEST_INT	      HOST_BITS_PER___INT64
-#   define HOST_WIDEST_INT		      __int64
-#   define HOST_WIDEST_INT_C(X)		      X ## i64
-#  else
-    #error "This line should be impossible to reach"
-#  endif
-# endif
-# define HOST_WIDEST_INT_PRINT                HOST_LONG_LONG_FORMAT
-# define HOST_WIDEST_INT_PRINT_DEC	      "%" HOST_LONG_LONG_FORMAT "d"
-# define HOST_WIDEST_INT_PRINT_DEC_C	      "%" HOST_LONG_LONG_FORMAT "dLL"
-# define HOST_WIDEST_INT_PRINT_UNSIGNED	      "%" HOST_LONG_LONG_FORMAT "u"
-# define HOST_WIDEST_INT_PRINT_HEX	      "%#" HOST_LONG_LONG_FORMAT "x"
-# define HOST_WIDEST_INT_PRINT_DOUBLE_HEX     \
-    "0x%" HOST_LONG_LONG_FORMAT "x%016" HOST_LONG_LONG_FORMAT "x"
-#endif
-
-/* Define HOST_WIDEST_FAST_INT to the widest integer type supported
-   efficiently in hardware.  (That is, the widest integer type that fits
-   in a hardware register.)  Normally this is "long" but on some hosts it
-   should be "long long" or "__int64".  This is no convenient way to
-   autodetect this, so such systems must set a flag in config.host; see there
-   for details.  */
-
-#ifdef USE_LONG_LONG_FOR_WIDEST_FAST_INT
-#  ifdef HAVE_LONG_LONG
-#    define HOST_WIDEST_FAST_INT long long
-#    define HOST_BITS_PER_WIDEST_FAST_INT HOST_BITS_PER_LONGLONG
-#  elif defined (HAVE___INT64)
-#    define HOST_WIDEST_FAST_INT __int64
-#    define HOST_BITS_PER_WIDEST_FAST_INT HOST_BITS_PER___INT64
-#  else
-#    error "Your host said it wanted to use long long or __int64 but neither"
-#    error "exist"
-#  endif
-#else
-#  define HOST_WIDEST_FAST_INT long
-#  define HOST_BITS_PER_WIDEST_FAST_INT HOST_BITS_PER_LONG
-#endif
-
-/* Inline functions operating on HOST_WIDE_INT.  */
-#if GCC_VERSION < 3004
-
-extern int clz_hwi (unsigned HOST_WIDE_INT x);
-extern int ctz_hwi (unsigned HOST_WIDE_INT x);
-extern int ffs_hwi (unsigned HOST_WIDE_INT x);
-
-/* Return the number of set bits in X.  */
-extern int popcount_hwi (unsigned HOST_WIDE_INT x);
-
-/* Return log2, or -1 if not exact.  */
-extern int exact_log2                  (unsigned HOST_WIDE_INT);
-
-/* Return floor of log2, with -1 for zero.  */
-extern int floor_log2                  (unsigned HOST_WIDE_INT);
-
-/* Return the smallest n such that 2**n >= X.  */
-extern int ceil_log2			(unsigned HOST_WIDE_INT);
-
-#else /* GCC_VERSION >= 3004 */
-
-/* For convenience, define 0 -> word_size.  */
-static inline int
-clz_hwi (unsigned HOST_WIDE_INT x)
-{
-  if (x == 0)
-    return HOST_BITS_PER_WIDE_INT;
-# if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
-  return __builtin_clzl (x);
-# elif HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONGLONG
-  return __builtin_clzll (x);
-# else
-  return __builtin_clz (x);
-# endif
-}
-
-static inline int
-ctz_hwi (unsigned HOST_WIDE_INT x)
-{
-  if (x == 0)
-    return HOST_BITS_PER_WIDE_INT;
-# if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
-  return __builtin_ctzl (x);
-# elif HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONGLONG
-  return __builtin_ctzll (x);
-# else
-  return __builtin_ctz (x);
-# endif
-}
-
-static inline int
-ffs_hwi (unsigned HOST_WIDE_INT x)
-{
-# if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
-  return __builtin_ffsl (x);
-# elif HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONGLONG
-  return __builtin_ffsll (x);
-# else
-  return __builtin_ffs (x);
-# endif
-}
-
-static inline int
-popcount_hwi (unsigned HOST_WIDE_INT x)
-{
-# if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
-  return __builtin_popcountl (x);
-# elif HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONGLONG
-  return __builtin_popcountll (x);
-# else
-  return __builtin_popcount (x);
-# endif
-}
-
-static inline int
-floor_log2 (unsigned HOST_WIDE_INT x)
-{
-  return HOST_BITS_PER_WIDE_INT - 1 - clz_hwi (x);
-}
-
-static inline int
-ceil_log2 (unsigned HOST_WIDE_INT x)
-{
-  return floor_log2 (x - 1) + 1;
-}
-
-static inline int
-exact_log2 (unsigned HOST_WIDE_INT x)
-{
-  return x == (x & -x) && x ? ctz_hwi (x) : -1;
-}
-
-#endif /* GCC_VERSION >= 3004 */
-
-#define HOST_WIDE_INT_MIN (HOST_WIDE_INT) \
-  ((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1))
-#define HOST_WIDE_INT_MAX (~(HOST_WIDE_INT_MIN))
-
-extern HOST_WIDE_INT abs_hwi (HOST_WIDE_INT);
-extern unsigned HOST_WIDE_INT absu_hwi (HOST_WIDE_INT);
-extern HOST_WIDE_INT gcd (HOST_WIDE_INT, HOST_WIDE_INT);
-extern HOST_WIDE_INT pos_mul_hwi (HOST_WIDE_INT, HOST_WIDE_INT);
-extern HOST_WIDE_INT mul_hwi (HOST_WIDE_INT, HOST_WIDE_INT);
-extern HOST_WIDE_INT least_common_multiple (HOST_WIDE_INT, HOST_WIDE_INT);
-
-/* Sign extend SRC starting from PREC.  */
-
-static inline HOST_WIDE_INT
-sext_hwi (HOST_WIDE_INT src, unsigned int prec)
-{
-  if (prec == HOST_BITS_PER_WIDE_INT)
-    return src;
-  else
-    {
-      gcc_checking_assert (prec < HOST_BITS_PER_WIDE_INT);
-      int shift = HOST_BITS_PER_WIDE_INT - prec;
-      return (src << shift) >> shift;
-    }
-}
-
-/* Zero extend SRC starting from PREC.  */
-static inline unsigned HOST_WIDE_INT
-zext_hwi (unsigned HOST_WIDE_INT src, unsigned int prec)
-{
-  if (prec == HOST_BITS_PER_WIDE_INT)
-    return src;
-  else
-    {
-      gcc_checking_assert (prec < HOST_BITS_PER_WIDE_INT);
-      return src & (((HOST_WIDE_INT) 1 << prec) - 1);
-    }
-}
-
-#endif /* ! GCC_HWINT_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/incpath.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/incpath.h
deleted file mode 100644
index e86130f..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/incpath.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Set up combined include path for the preprocessor.
-   Copyright (C) 2003-2014 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 3, 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; see the file COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-extern void split_quote_chain (void);
-extern void add_path (char *, int, int, bool);
-extern void register_include_chains (cpp_reader *, const char *,
-				     const char *, const char *,
-				     int, int, int);
-extern void add_cpp_dir_path (struct cpp_dir *, int);
-extern struct cpp_dir *get_added_cpp_dirs (int);
-
-struct target_c_incpath_s {
-  /* Do extra includes processing.  STDINC is false iff -nostdinc was given.  */
-  void (*extra_pre_includes) (const char *, const char *, int);
-  void (*extra_includes) (const char *, const char *, int);
-};
-
-extern struct target_c_incpath_s target_c_incpath;
-
-enum { QUOTE = 0, BRACKET, SYSTEM, AFTER };
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/input.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/input.h
deleted file mode 100644
index d910bb8..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/input.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Declarations for variables relating to reading the source file.
-   Used by parsers, lexical analyzers, and error message routines.
-   Copyright (C) 1993-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_INPUT_H
-#define GCC_INPUT_H
-
-#include "line-map.h"
-
-extern GTY(()) struct line_maps *line_table;
-
-/* A value which will never be used to represent a real location.  */
-#define UNKNOWN_LOCATION ((source_location) 0)
-
-/* The location for declarations in "<built-in>" */
-#define BUILTINS_LOCATION ((source_location) 1)
-
-/* line-map.c reserves RESERVED_LOCATION_COUNT to the user.  Ensure
-   both UNKNOWN_LOCATION and BUILTINS_LOCATION fit into that.  */
-extern char builtins_location_check[(BUILTINS_LOCATION
-				     < RESERVED_LOCATION_COUNT) ? 1 : -1];
-
-extern expanded_location expand_location (source_location);
-extern const char *location_get_source_line (expanded_location xloc,
-					     int *line_size);
-extern expanded_location expand_location_to_spelling_point (source_location);
-extern source_location expansion_point_location_if_in_system_header (source_location);
-
-/* Historically GCC used location_t, while cpp used source_location.
-   This could be removed but it hardly seems worth the effort.  */
-typedef source_location location_t;
-
-extern location_t input_location;
-
-#define LOCATION_FILE(LOC) ((expand_location (LOC)).file)
-#define LOCATION_LINE(LOC) ((expand_location (LOC)).line)
-#define LOCATION_COLUMN(LOC)((expand_location (LOC)).column)
-#define LOCATION_LOCUS(LOC) \
-  ((IS_ADHOC_LOC (LOC)) ? get_location_from_adhoc_loc (line_table, LOC) \
-   : (LOC))
-#define LOCATION_BLOCK(LOC) \
-  ((tree) ((IS_ADHOC_LOC (LOC)) ? get_data_from_adhoc_loc (line_table, (LOC)) \
-   : NULL))
-
-#define in_system_header_at(LOC) \
-  ((linemap_location_in_system_header_p (line_table, LOC)))
-
-void dump_line_table_statistics (void);
-
-void diagnostics_file_cache_fini (void);
-
-#endif
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/insn-codes.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/insn-codes.h
deleted file mode 100644
index 7676571..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/insn-codes.h
+++ /dev/null
@@ -1,2297 +0,0 @@
-/* Generated automatically by the program `gencodes'
-   from the machine description file `md'.  */
-
-#ifndef GCC_INSN_CODES_H
-#define GCC_INSN_CODES_H
-
-enum insn_code {
-  CODE_FOR_nothing = 0,
-
-  CODE_FOR_addsi3_compare0 = 7,
-  CODE_FOR_cmpsi2_addneg = 10,
-  CODE_FOR_thumb1_subsi3_insn = 36,
-  CODE_FOR_subsi3_compare = 39,
-  CODE_FOR_mulhisi3 = 67,
-  CODE_FOR_maddhisi4 = 71,
-  CODE_FOR_maddhidi4 = 74,
-  CODE_FOR_insv_zero = 89,
-  CODE_FOR_insv_t2 = 90,
-  CODE_FOR_andsi_notsi_si = 94,
-  CODE_FOR_thumb1_bicsi3 = 95,
-  CODE_FOR_andsi_not_shiftsi_si = 96,
-  CODE_FOR_arm_ashldi3_1bit = 128,
-  CODE_FOR_arm_ashrdi3_1bit = 130,
-  CODE_FOR_arm_lshrdi3_1bit = 132,
-  CODE_FOR_unaligned_loadsi = 141,
-  CODE_FOR_unaligned_loadhis = 142,
-  CODE_FOR_unaligned_loadhiu = 143,
-  CODE_FOR_unaligned_storesi = 144,
-  CODE_FOR_unaligned_storehi = 145,
-  CODE_FOR_unaligned_loaddi = 146,
-  CODE_FOR_unaligned_storedi = 147,
-  CODE_FOR_extzv_t2 = 149,
-  CODE_FOR_divsi3 = 150,
-  CODE_FOR_udivsi3 = 151,
-  CODE_FOR_one_cmpldi2 = 163,
-  CODE_FOR_zero_extendqidi2 = 168,
-  CODE_FOR_zero_extendhidi2 = 169,
-  CODE_FOR_zero_extendsidi2 = 170,
-  CODE_FOR_extendqidi2 = 171,
-  CODE_FOR_extendhidi2 = 172,
-  CODE_FOR_extendsidi2 = 173,
-  CODE_FOR_thumb1_extendhisi2 = 184,
-  CODE_FOR_thumb1_extendqisi2 = 192,
-  CODE_FOR_pic_load_addr_unified = 198,
-  CODE_FOR_pic_load_addr_32bit = 199,
-  CODE_FOR_pic_load_addr_thumb1 = 200,
-  CODE_FOR_pic_add_dot_plus_four = 201,
-  CODE_FOR_pic_add_dot_plus_eight = 202,
-  CODE_FOR_tls_load_dot_plus_eight = 203,
-#define CODE_FOR_pic_offset_arm CODE_FOR_nothing
-  CODE_FOR_movmem12b = 216,
-  CODE_FOR_movmem8b = 217,
-  CODE_FOR_cbranchsi4_insn = 218,
-  CODE_FOR_cbranchsi4_scratch = 219,
-  CODE_FOR_arm_cond_branch = 236,
-  CODE_FOR_cstoresi_nltu_thumb1 = 243,
-  CODE_FOR_cstoresi_ltu_thumb1 = 244,
-  CODE_FOR_thumb1_addsi3_addgeu = 245,
-  CODE_FOR_blockage = 275,
-  CODE_FOR_arm_casesi_internal = 276,
-  CODE_FOR_thumb1_casesi_dispatch = 277,
-  CODE_FOR_nop = 281,
-  CODE_FOR_trap = 282,
-  CODE_FOR_movcond_addsi = 305,
-  CODE_FOR_movcond = 306,
-  CODE_FOR_prologue_thumb1_interwork = 336,
-  CODE_FOR_stack_tie = 342,
-  CODE_FOR_align_4 = 348,
-  CODE_FOR_align_8 = 349,
-  CODE_FOR_consttable_end = 350,
-  CODE_FOR_consttable_1 = 351,
-  CODE_FOR_consttable_2 = 352,
-  CODE_FOR_consttable_4 = 353,
-  CODE_FOR_consttable_8 = 354,
-  CODE_FOR_consttable_16 = 355,
-  CODE_FOR_clzsi2 = 357,
-  CODE_FOR_rbitsi2 = 358,
-  CODE_FOR_prefetch = 359,
-  CODE_FOR_force_register_use = 360,
-  CODE_FOR_arm_eh_return = 361,
-  CODE_FOR_thumb_eh_return = 362,
-  CODE_FOR_load_tp_hard = 363,
-  CODE_FOR_load_tp_soft = 364,
-  CODE_FOR_tlscall = 365,
-  CODE_FOR_crc32b = 376,
-  CODE_FOR_crc32h = 377,
-  CODE_FOR_crc32w = 378,
-  CODE_FOR_crc32cb = 379,
-  CODE_FOR_crc32ch = 380,
-  CODE_FOR_crc32cw = 381,
-  CODE_FOR_tbcstv8qi = 440,
-  CODE_FOR_tbcstv4hi = 441,
-  CODE_FOR_tbcstv2si = 442,
-  CODE_FOR_iwmmxt_iordi3 = 443,
-  CODE_FOR_iwmmxt_xordi3 = 444,
-  CODE_FOR_iwmmxt_anddi3 = 445,
-  CODE_FOR_iwmmxt_nanddi3 = 446,
-  CODE_FOR_movv2si_internal = 450,
-  CODE_FOR_movv4hi_internal = 451,
-  CODE_FOR_movv8qi_internal = 452,
-  CODE_FOR_ssaddv8qi3 = 465,
-  CODE_FOR_ssaddv4hi3 = 466,
-  CODE_FOR_ssaddv2si3 = 467,
-  CODE_FOR_usaddv8qi3 = 468,
-  CODE_FOR_usaddv4hi3 = 469,
-  CODE_FOR_usaddv2si3 = 470,
-  CODE_FOR_sssubv8qi3 = 474,
-  CODE_FOR_sssubv4hi3 = 475,
-  CODE_FOR_sssubv2si3 = 476,
-  CODE_FOR_ussubv8qi3 = 477,
-  CODE_FOR_ussubv4hi3 = 478,
-  CODE_FOR_ussubv2si3 = 479,
-  CODE_FOR_smulv4hi3_highpart = 481,
-  CODE_FOR_umulv4hi3_highpart = 482,
-  CODE_FOR_iwmmxt_wmacs = 483,
-  CODE_FOR_iwmmxt_wmacsz = 484,
-  CODE_FOR_iwmmxt_wmacu = 485,
-  CODE_FOR_iwmmxt_wmacuz = 486,
-  CODE_FOR_iwmmxt_clrdi = 487,
-  CODE_FOR_iwmmxt_clrv8qi = 488,
-  CODE_FOR_iwmmxt_clrv4hi = 489,
-  CODE_FOR_iwmmxt_clrv2si = 490,
-  CODE_FOR_iwmmxt_uavgrndv8qi3 = 491,
-  CODE_FOR_iwmmxt_uavgrndv4hi3 = 492,
-  CODE_FOR_iwmmxt_uavgv8qi3 = 493,
-  CODE_FOR_iwmmxt_uavgv4hi3 = 494,
-  CODE_FOR_iwmmxt_tinsrb = 495,
-  CODE_FOR_iwmmxt_tinsrh = 496,
-  CODE_FOR_iwmmxt_tinsrw = 497,
-  CODE_FOR_iwmmxt_textrmub = 498,
-  CODE_FOR_iwmmxt_textrmsb = 499,
-  CODE_FOR_iwmmxt_textrmuh = 500,
-  CODE_FOR_iwmmxt_textrmsh = 501,
-  CODE_FOR_iwmmxt_textrmw = 502,
-  CODE_FOR_iwmmxt_wshufh = 503,
-  CODE_FOR_eqv8qi3 = 504,
-  CODE_FOR_eqv4hi3 = 505,
-  CODE_FOR_eqv2si3 = 506,
-  CODE_FOR_gtuv8qi3 = 507,
-  CODE_FOR_gtuv4hi3 = 508,
-  CODE_FOR_gtuv2si3 = 509,
-  CODE_FOR_gtv8qi3 = 510,
-  CODE_FOR_gtv4hi3 = 511,
-  CODE_FOR_gtv2si3 = 512,
-  CODE_FOR_iwmmxt_wpackhss = 525,
-  CODE_FOR_iwmmxt_wpackwss = 526,
-  CODE_FOR_iwmmxt_wpackdss = 527,
-  CODE_FOR_iwmmxt_wpackhus = 528,
-  CODE_FOR_iwmmxt_wpackwus = 529,
-  CODE_FOR_iwmmxt_wpackdus = 530,
-  CODE_FOR_iwmmxt_wunpckihb = 531,
-  CODE_FOR_iwmmxt_wunpckihh = 532,
-  CODE_FOR_iwmmxt_wunpckihw = 533,
-  CODE_FOR_iwmmxt_wunpckilb = 534,
-  CODE_FOR_iwmmxt_wunpckilh = 535,
-  CODE_FOR_iwmmxt_wunpckilw = 536,
-  CODE_FOR_iwmmxt_wunpckehub = 537,
-  CODE_FOR_iwmmxt_wunpckehuh = 538,
-  CODE_FOR_iwmmxt_wunpckehuw = 539,
-  CODE_FOR_iwmmxt_wunpckehsb = 540,
-  CODE_FOR_iwmmxt_wunpckehsh = 541,
-  CODE_FOR_iwmmxt_wunpckehsw = 542,
-  CODE_FOR_iwmmxt_wunpckelub = 543,
-  CODE_FOR_iwmmxt_wunpckeluh = 544,
-  CODE_FOR_iwmmxt_wunpckeluw = 545,
-  CODE_FOR_iwmmxt_wunpckelsb = 546,
-  CODE_FOR_iwmmxt_wunpckelsh = 547,
-  CODE_FOR_iwmmxt_wunpckelsw = 548,
-  CODE_FOR_rorv4hi3 = 549,
-  CODE_FOR_rorv2si3 = 550,
-  CODE_FOR_rordi3 = 551,
-  CODE_FOR_ashrv4hi3_iwmmxt = 552,
-  CODE_FOR_ashrv2si3_iwmmxt = 553,
-  CODE_FOR_ashrdi3_iwmmxt = 554,
-  CODE_FOR_lshrv4hi3_iwmmxt = 555,
-  CODE_FOR_lshrv2si3_iwmmxt = 556,
-  CODE_FOR_lshrdi3_iwmmxt = 557,
-  CODE_FOR_ashlv4hi3_iwmmxt = 558,
-  CODE_FOR_ashlv2si3_iwmmxt = 559,
-  CODE_FOR_ashldi3_iwmmxt = 560,
-  CODE_FOR_rorv4hi3_di = 561,
-  CODE_FOR_rorv2si3_di = 562,
-  CODE_FOR_rordi3_di = 563,
-  CODE_FOR_ashrv4hi3_di = 564,
-  CODE_FOR_ashrv2si3_di = 565,
-  CODE_FOR_ashrdi3_di = 566,
-  CODE_FOR_lshrv4hi3_di = 567,
-  CODE_FOR_lshrv2si3_di = 568,
-  CODE_FOR_lshrdi3_di = 569,
-  CODE_FOR_ashlv4hi3_di = 570,
-  CODE_FOR_ashlv2si3_di = 571,
-  CODE_FOR_ashldi3_di = 572,
-  CODE_FOR_iwmmxt_wmadds = 573,
-  CODE_FOR_iwmmxt_wmaddu = 574,
-  CODE_FOR_iwmmxt_tmia = 575,
-  CODE_FOR_iwmmxt_tmiaph = 576,
-  CODE_FOR_iwmmxt_tmiabb = 577,
-  CODE_FOR_iwmmxt_tmiatb = 578,
-  CODE_FOR_iwmmxt_tmiabt = 579,
-  CODE_FOR_iwmmxt_tmiatt = 580,
-  CODE_FOR_iwmmxt_tmovmskb = 581,
-  CODE_FOR_iwmmxt_tmovmskh = 582,
-  CODE_FOR_iwmmxt_tmovmskw = 583,
-  CODE_FOR_iwmmxt_waccb = 584,
-  CODE_FOR_iwmmxt_wacch = 585,
-  CODE_FOR_iwmmxt_waccw = 586,
-  CODE_FOR_iwmmxt_waligni = 587,
-  CODE_FOR_iwmmxt_walignr = 588,
-  CODE_FOR_iwmmxt_walignr0 = 589,
-  CODE_FOR_iwmmxt_walignr1 = 590,
-  CODE_FOR_iwmmxt_walignr2 = 591,
-  CODE_FOR_iwmmxt_walignr3 = 592,
-  CODE_FOR_iwmmxt_wsadb = 593,
-  CODE_FOR_iwmmxt_wsadh = 594,
-  CODE_FOR_iwmmxt_wsadbz = 595,
-  CODE_FOR_iwmmxt_wsadhz = 596,
-  CODE_FOR_iwmmxt_wabsv2si3 = 597,
-  CODE_FOR_iwmmxt_wabsv4hi3 = 598,
-  CODE_FOR_iwmmxt_wabsv8qi3 = 599,
-  CODE_FOR_iwmmxt_wabsdiffb = 600,
-  CODE_FOR_iwmmxt_wabsdiffh = 601,
-  CODE_FOR_iwmmxt_wabsdiffw = 602,
-  CODE_FOR_iwmmxt_waddsubhx = 603,
-  CODE_FOR_iwmmxt_wsubaddhx = 604,
-  CODE_FOR_addcv4hi3 = 605,
-  CODE_FOR_addcv2si3 = 606,
-  CODE_FOR_iwmmxt_avg4 = 607,
-  CODE_FOR_iwmmxt_avg4r = 608,
-  CODE_FOR_iwmmxt_wmaddsx = 609,
-  CODE_FOR_iwmmxt_wmaddux = 610,
-  CODE_FOR_iwmmxt_wmaddsn = 611,
-  CODE_FOR_iwmmxt_wmaddun = 612,
-  CODE_FOR_iwmmxt_wmulwsm = 613,
-  CODE_FOR_iwmmxt_wmulwum = 614,
-  CODE_FOR_iwmmxt_wmulsmr = 615,
-  CODE_FOR_iwmmxt_wmulumr = 616,
-  CODE_FOR_iwmmxt_wmulwsmr = 617,
-  CODE_FOR_iwmmxt_wmulwumr = 618,
-  CODE_FOR_iwmmxt_wmulwl = 619,
-  CODE_FOR_iwmmxt_wqmulm = 620,
-  CODE_FOR_iwmmxt_wqmulwm = 621,
-  CODE_FOR_iwmmxt_wqmulmr = 622,
-  CODE_FOR_iwmmxt_wqmulwmr = 623,
-  CODE_FOR_iwmmxt_waddbhusm = 624,
-  CODE_FOR_iwmmxt_waddbhusl = 625,
-  CODE_FOR_iwmmxt_wqmiabb = 626,
-  CODE_FOR_iwmmxt_wqmiabt = 627,
-  CODE_FOR_iwmmxt_wqmiatb = 628,
-  CODE_FOR_iwmmxt_wqmiatt = 629,
-  CODE_FOR_iwmmxt_wqmiabbn = 630,
-  CODE_FOR_iwmmxt_wqmiabtn = 631,
-  CODE_FOR_iwmmxt_wqmiatbn = 632,
-  CODE_FOR_iwmmxt_wqmiattn = 633,
-  CODE_FOR_iwmmxt_wmiabb = 634,
-  CODE_FOR_iwmmxt_wmiabt = 635,
-  CODE_FOR_iwmmxt_wmiatb = 636,
-  CODE_FOR_iwmmxt_wmiatt = 637,
-  CODE_FOR_iwmmxt_wmiabbn = 638,
-  CODE_FOR_iwmmxt_wmiabtn = 639,
-  CODE_FOR_iwmmxt_wmiatbn = 640,
-  CODE_FOR_iwmmxt_wmiattn = 641,
-  CODE_FOR_iwmmxt_wmiawbb = 642,
-  CODE_FOR_iwmmxt_wmiawbt = 643,
-  CODE_FOR_iwmmxt_wmiawtb = 644,
-  CODE_FOR_iwmmxt_wmiawtt = 645,
-  CODE_FOR_iwmmxt_wmiawbbn = 646,
-  CODE_FOR_iwmmxt_wmiawbtn = 647,
-  CODE_FOR_iwmmxt_wmiawtbn = 648,
-  CODE_FOR_iwmmxt_wmiawttn = 649,
-  CODE_FOR_iwmmxt_wmerge = 650,
-  CODE_FOR_iwmmxt_tandcv2si3 = 651,
-  CODE_FOR_iwmmxt_tandcv4hi3 = 652,
-  CODE_FOR_iwmmxt_tandcv8qi3 = 653,
-  CODE_FOR_iwmmxt_torcv2si3 = 654,
-  CODE_FOR_iwmmxt_torcv4hi3 = 655,
-  CODE_FOR_iwmmxt_torcv8qi3 = 656,
-  CODE_FOR_iwmmxt_torvscv2si3 = 657,
-  CODE_FOR_iwmmxt_torvscv4hi3 = 658,
-  CODE_FOR_iwmmxt_torvscv8qi3 = 659,
-  CODE_FOR_iwmmxt_textrcv2si3 = 660,
-  CODE_FOR_iwmmxt_textrcv4hi3 = 661,
-  CODE_FOR_iwmmxt_textrcv8qi3 = 662,
-  CODE_FOR_fmasf4 = 699,
-  CODE_FOR_fmadf4 = 700,
-  CODE_FOR_extendhfsf2 = 709,
-  CODE_FOR_truncsfhf2 = 710,
-  CODE_FOR_fixuns_truncsfsi2 = 713,
-  CODE_FOR_fixuns_truncdfsi2 = 714,
-  CODE_FOR_floatunssisf2 = 717,
-  CODE_FOR_floatunssidf2 = 718,
-  CODE_FOR_btruncsf2 = 736,
-  CODE_FOR_ceilsf2 = 737,
-  CODE_FOR_floorsf2 = 738,
-  CODE_FOR_nearbyintsf2 = 739,
-  CODE_FOR_rintsf2 = 740,
-  CODE_FOR_roundsf2 = 741,
-  CODE_FOR_btruncdf2 = 742,
-  CODE_FOR_ceildf2 = 743,
-  CODE_FOR_floordf2 = 744,
-  CODE_FOR_nearbyintdf2 = 745,
-  CODE_FOR_rintdf2 = 746,
-  CODE_FOR_rounddf2 = 747,
-  CODE_FOR_smaxsf3 = 748,
-  CODE_FOR_smaxdf3 = 749,
-  CODE_FOR_sminsf3 = 750,
-  CODE_FOR_smindf3 = 751,
-  CODE_FOR_tls_load_dot_plus_four = 761,
-  CODE_FOR_thumb2_zero_extendqisi2_v6 = 786,
-  CODE_FOR_thumb2_casesi_internal = 787,
-  CODE_FOR_thumb2_casesi_internal_pic = 788,
-  CODE_FOR_thumb2_eh_return = 790,
-  CODE_FOR_thumb2_addsi3_compare0 = 798,
-  CODE_FOR_vec_setv8qi_internal = 844,
-  CODE_FOR_vec_setv4hi_internal = 845,
-  CODE_FOR_vec_setv2si_internal = 846,
-  CODE_FOR_vec_setv2sf_internal = 847,
-  CODE_FOR_vec_setv16qi_internal = 848,
-  CODE_FOR_vec_setv8hi_internal = 849,
-  CODE_FOR_vec_setv4si_internal = 850,
-  CODE_FOR_vec_setv4sf_internal = 851,
-  CODE_FOR_vec_setv2di_internal = 852,
-  CODE_FOR_vec_extractv8qi = 853,
-  CODE_FOR_vec_extractv4hi = 854,
-  CODE_FOR_vec_extractv2si = 855,
-  CODE_FOR_vec_extractv2sf = 856,
-  CODE_FOR_vec_extractv16qi = 857,
-  CODE_FOR_vec_extractv8hi = 858,
-  CODE_FOR_vec_extractv4si = 859,
-  CODE_FOR_vec_extractv4sf = 860,
-  CODE_FOR_vec_extractv2di = 861,
-  CODE_FOR_adddi3_neon = 871,
-  CODE_FOR_subdi3_neon = 881,
-  CODE_FOR_mulv8qi3addv8qi_neon = 890,
-  CODE_FOR_mulv16qi3addv16qi_neon = 891,
-  CODE_FOR_mulv4hi3addv4hi_neon = 892,
-  CODE_FOR_mulv8hi3addv8hi_neon = 893,
-  CODE_FOR_mulv2si3addv2si_neon = 894,
-  CODE_FOR_mulv4si3addv4si_neon = 895,
-  CODE_FOR_mulv2sf3addv2sf_neon = 896,
-  CODE_FOR_mulv4sf3addv4sf_neon = 897,
-  CODE_FOR_mulv8qi3negv8qiaddv8qi_neon = 898,
-  CODE_FOR_mulv16qi3negv16qiaddv16qi_neon = 899,
-  CODE_FOR_mulv4hi3negv4hiaddv4hi_neon = 900,
-  CODE_FOR_mulv8hi3negv8hiaddv8hi_neon = 901,
-  CODE_FOR_mulv2si3negv2siaddv2si_neon = 902,
-  CODE_FOR_mulv4si3negv4siaddv4si_neon = 903,
-  CODE_FOR_mulv2sf3negv2sfaddv2sf_neon = 904,
-  CODE_FOR_mulv4sf3negv4sfaddv4sf_neon = 905,
-  CODE_FOR_fmav2sf4 = 906,
-  CODE_FOR_fmav4sf4 = 907,
-  CODE_FOR_fmav2sf4_intrinsic = 908,
-  CODE_FOR_fmav4sf4_intrinsic = 909,
-  CODE_FOR_fmsubv2sf4_intrinsic = 912,
-  CODE_FOR_fmsubv4sf4_intrinsic = 913,
-  CODE_FOR_neon_vrintpv2sf = 914,
-  CODE_FOR_neon_vrintzv2sf = 915,
-  CODE_FOR_neon_vrintmv2sf = 916,
-  CODE_FOR_neon_vrintxv2sf = 917,
-  CODE_FOR_neon_vrintav2sf = 918,
-  CODE_FOR_neon_vrintnv2sf = 919,
-  CODE_FOR_neon_vrintpv4sf = 920,
-  CODE_FOR_neon_vrintzv4sf = 921,
-  CODE_FOR_neon_vrintmv4sf = 922,
-  CODE_FOR_neon_vrintxv4sf = 923,
-  CODE_FOR_neon_vrintav4sf = 924,
-  CODE_FOR_neon_vrintnv4sf = 925,
-  CODE_FOR_iorv8qi3 = 926,
-  CODE_FOR_iorv16qi3 = 927,
-  CODE_FOR_iorv4hi3 = 928,
-  CODE_FOR_iorv8hi3 = 929,
-  CODE_FOR_iorv2si3 = 930,
-  CODE_FOR_iorv4si3 = 931,
-  CODE_FOR_iorv2sf3 = 932,
-  CODE_FOR_iorv4sf3 = 933,
-  CODE_FOR_iorv2di3 = 934,
-  CODE_FOR_andv8qi3 = 935,
-  CODE_FOR_andv16qi3 = 936,
-  CODE_FOR_andv4hi3 = 937,
-  CODE_FOR_andv8hi3 = 938,
-  CODE_FOR_andv2si3 = 939,
-  CODE_FOR_andv4si3 = 940,
-  CODE_FOR_andv2sf3 = 941,
-  CODE_FOR_andv4sf3 = 942,
-  CODE_FOR_andv2di3 = 943,
-  CODE_FOR_ornv8qi3_neon = 944,
-  CODE_FOR_ornv16qi3_neon = 945,
-  CODE_FOR_ornv4hi3_neon = 946,
-  CODE_FOR_ornv8hi3_neon = 947,
-  CODE_FOR_ornv2si3_neon = 948,
-  CODE_FOR_ornv4si3_neon = 949,
-  CODE_FOR_ornv2sf3_neon = 950,
-  CODE_FOR_ornv4sf3_neon = 951,
-  CODE_FOR_ornv2di3_neon = 952,
-  CODE_FOR_orndi3_neon = 953,
-  CODE_FOR_bicv8qi3_neon = 954,
-  CODE_FOR_bicv16qi3_neon = 955,
-  CODE_FOR_bicv4hi3_neon = 956,
-  CODE_FOR_bicv8hi3_neon = 957,
-  CODE_FOR_bicv2si3_neon = 958,
-  CODE_FOR_bicv4si3_neon = 959,
-  CODE_FOR_bicv2sf3_neon = 960,
-  CODE_FOR_bicv4sf3_neon = 961,
-  CODE_FOR_bicv2di3_neon = 962,
-  CODE_FOR_bicdi3_neon = 963,
-  CODE_FOR_xorv8qi3 = 964,
-  CODE_FOR_xorv16qi3 = 965,
-  CODE_FOR_xorv4hi3 = 966,
-  CODE_FOR_xorv8hi3 = 967,
-  CODE_FOR_xorv2si3 = 968,
-  CODE_FOR_xorv4si3 = 969,
-  CODE_FOR_xorv2sf3 = 970,
-  CODE_FOR_xorv4sf3 = 971,
-  CODE_FOR_xorv2di3 = 972,
-  CODE_FOR_one_cmplv8qi2 = 973,
-  CODE_FOR_one_cmplv16qi2 = 974,
-  CODE_FOR_one_cmplv4hi2 = 975,
-  CODE_FOR_one_cmplv8hi2 = 976,
-  CODE_FOR_one_cmplv2si2 = 977,
-  CODE_FOR_one_cmplv4si2 = 978,
-  CODE_FOR_one_cmplv2sf2 = 979,
-  CODE_FOR_one_cmplv4sf2 = 980,
-  CODE_FOR_one_cmplv2di2 = 981,
-  CODE_FOR_absv8qi2 = 982,
-  CODE_FOR_absv16qi2 = 983,
-  CODE_FOR_absv4hi2 = 984,
-  CODE_FOR_absv8hi2 = 985,
-  CODE_FOR_absv2si2 = 986,
-  CODE_FOR_absv4si2 = 987,
-  CODE_FOR_absv2sf2 = 988,
-  CODE_FOR_absv4sf2 = 989,
-  CODE_FOR_negv8qi2 = 990,
-  CODE_FOR_negv16qi2 = 991,
-  CODE_FOR_negv4hi2 = 992,
-  CODE_FOR_negv8hi2 = 993,
-  CODE_FOR_negv2si2 = 994,
-  CODE_FOR_negv4si2 = 995,
-  CODE_FOR_negv2sf2 = 996,
-  CODE_FOR_negv4sf2 = 997,
-  CODE_FOR_negdi2_neon = 998,
-  CODE_FOR_vashlv8qi3 = 1027,
-  CODE_FOR_vashlv16qi3 = 1028,
-  CODE_FOR_vashlv4hi3 = 1029,
-  CODE_FOR_vashlv8hi3 = 1030,
-  CODE_FOR_vashlv2si3 = 1031,
-  CODE_FOR_vashlv4si3 = 1032,
-  CODE_FOR_vashrv8qi3_imm = 1033,
-  CODE_FOR_vashrv16qi3_imm = 1034,
-  CODE_FOR_vashrv4hi3_imm = 1035,
-  CODE_FOR_vashrv8hi3_imm = 1036,
-  CODE_FOR_vashrv2si3_imm = 1037,
-  CODE_FOR_vashrv4si3_imm = 1038,
-  CODE_FOR_vlshrv8qi3_imm = 1039,
-  CODE_FOR_vlshrv16qi3_imm = 1040,
-  CODE_FOR_vlshrv4hi3_imm = 1041,
-  CODE_FOR_vlshrv8hi3_imm = 1042,
-  CODE_FOR_vlshrv2si3_imm = 1043,
-  CODE_FOR_vlshrv4si3_imm = 1044,
-  CODE_FOR_ashlv8qi3_signed = 1045,
-  CODE_FOR_ashlv16qi3_signed = 1046,
-  CODE_FOR_ashlv4hi3_signed = 1047,
-  CODE_FOR_ashlv8hi3_signed = 1048,
-  CODE_FOR_ashlv2si3_signed = 1049,
-  CODE_FOR_ashlv4si3_signed = 1050,
-  CODE_FOR_ashlv2di3_signed = 1051,
-  CODE_FOR_ashlv8qi3_unsigned = 1052,
-  CODE_FOR_ashlv16qi3_unsigned = 1053,
-  CODE_FOR_ashlv4hi3_unsigned = 1054,
-  CODE_FOR_ashlv8hi3_unsigned = 1055,
-  CODE_FOR_ashlv2si3_unsigned = 1056,
-  CODE_FOR_ashlv4si3_unsigned = 1057,
-  CODE_FOR_ashlv2di3_unsigned = 1058,
-  CODE_FOR_neon_load_count = 1059,
-  CODE_FOR_ashldi3_neon_noclobber = 1060,
-  CODE_FOR_ashldi3_neon = 1061,
-  CODE_FOR_signed_shift_di3_neon = 1062,
-  CODE_FOR_unsigned_shift_di3_neon = 1063,
-  CODE_FOR_ashrdi3_neon_imm_noclobber = 1064,
-  CODE_FOR_lshrdi3_neon_imm_noclobber = 1065,
-  CODE_FOR_ashrdi3_neon = 1066,
-  CODE_FOR_lshrdi3_neon = 1067,
-  CODE_FOR_widen_ssumv8qi3 = 1068,
-  CODE_FOR_widen_ssumv4hi3 = 1069,
-  CODE_FOR_widen_ssumv2si3 = 1070,
-  CODE_FOR_widen_usumv8qi3 = 1071,
-  CODE_FOR_widen_usumv4hi3 = 1072,
-  CODE_FOR_widen_usumv2si3 = 1073,
-  CODE_FOR_quad_halves_plusv4si = 1074,
-  CODE_FOR_quad_halves_sminv4si = 1075,
-  CODE_FOR_quad_halves_smaxv4si = 1076,
-  CODE_FOR_quad_halves_uminv4si = 1077,
-  CODE_FOR_quad_halves_umaxv4si = 1078,
-  CODE_FOR_quad_halves_plusv4sf = 1079,
-  CODE_FOR_quad_halves_sminv4sf = 1080,
-  CODE_FOR_quad_halves_smaxv4sf = 1081,
-  CODE_FOR_quad_halves_plusv8hi = 1082,
-  CODE_FOR_quad_halves_sminv8hi = 1083,
-  CODE_FOR_quad_halves_smaxv8hi = 1084,
-  CODE_FOR_quad_halves_uminv8hi = 1085,
-  CODE_FOR_quad_halves_umaxv8hi = 1086,
-  CODE_FOR_quad_halves_plusv16qi = 1087,
-  CODE_FOR_quad_halves_sminv16qi = 1088,
-  CODE_FOR_quad_halves_smaxv16qi = 1089,
-  CODE_FOR_quad_halves_uminv16qi = 1090,
-  CODE_FOR_quad_halves_umaxv16qi = 1091,
-  CODE_FOR_reduc_splus_v2di = 1092,
-  CODE_FOR_neon_vpadd_internalv8qi = 1093,
-  CODE_FOR_neon_vpadd_internalv4hi = 1094,
-  CODE_FOR_neon_vpadd_internalv2si = 1095,
-  CODE_FOR_neon_vpadd_internalv2sf = 1096,
-  CODE_FOR_neon_vpsminv8qi = 1097,
-  CODE_FOR_neon_vpsminv4hi = 1098,
-  CODE_FOR_neon_vpsminv2si = 1099,
-  CODE_FOR_neon_vpsminv2sf = 1100,
-  CODE_FOR_neon_vpsmaxv8qi = 1101,
-  CODE_FOR_neon_vpsmaxv4hi = 1102,
-  CODE_FOR_neon_vpsmaxv2si = 1103,
-  CODE_FOR_neon_vpsmaxv2sf = 1104,
-  CODE_FOR_neon_vpuminv8qi = 1105,
-  CODE_FOR_neon_vpuminv4hi = 1106,
-  CODE_FOR_neon_vpuminv2si = 1107,
-  CODE_FOR_neon_vpumaxv8qi = 1108,
-  CODE_FOR_neon_vpumaxv4hi = 1109,
-  CODE_FOR_neon_vpumaxv2si = 1110,
-  CODE_FOR_neon_vaddv8qi_unspec = 1127,
-  CODE_FOR_neon_vaddv16qi_unspec = 1128,
-  CODE_FOR_neon_vaddv4hi_unspec = 1129,
-  CODE_FOR_neon_vaddv8hi_unspec = 1130,
-  CODE_FOR_neon_vaddv2si_unspec = 1131,
-  CODE_FOR_neon_vaddv4si_unspec = 1132,
-  CODE_FOR_neon_vaddv2sf_unspec = 1133,
-  CODE_FOR_neon_vaddv4sf_unspec = 1134,
-  CODE_FOR_neon_vadddi_unspec = 1135,
-  CODE_FOR_neon_vaddv2di_unspec = 1136,
-  CODE_FOR_neon_vaddlv8qi = 1137,
-  CODE_FOR_neon_vaddlv4hi = 1138,
-  CODE_FOR_neon_vaddlv2si = 1139,
-  CODE_FOR_neon_vaddwv8qi = 1140,
-  CODE_FOR_neon_vaddwv4hi = 1141,
-  CODE_FOR_neon_vaddwv2si = 1142,
-  CODE_FOR_neon_vhaddv8qi = 1143,
-  CODE_FOR_neon_vhaddv16qi = 1144,
-  CODE_FOR_neon_vhaddv4hi = 1145,
-  CODE_FOR_neon_vhaddv8hi = 1146,
-  CODE_FOR_neon_vhaddv2si = 1147,
-  CODE_FOR_neon_vhaddv4si = 1148,
-  CODE_FOR_neon_vqaddv8qi = 1149,
-  CODE_FOR_neon_vqaddv16qi = 1150,
-  CODE_FOR_neon_vqaddv4hi = 1151,
-  CODE_FOR_neon_vqaddv8hi = 1152,
-  CODE_FOR_neon_vqaddv2si = 1153,
-  CODE_FOR_neon_vqaddv4si = 1154,
-  CODE_FOR_neon_vqadddi = 1155,
-  CODE_FOR_neon_vqaddv2di = 1156,
-  CODE_FOR_neon_vaddhnv8hi = 1157,
-  CODE_FOR_neon_vaddhnv4si = 1158,
-  CODE_FOR_neon_vaddhnv2di = 1159,
-  CODE_FOR_neon_vmulv8qi = 1160,
-  CODE_FOR_neon_vmulv16qi = 1161,
-  CODE_FOR_neon_vmulv4hi = 1162,
-  CODE_FOR_neon_vmulv8hi = 1163,
-  CODE_FOR_neon_vmulv2si = 1164,
-  CODE_FOR_neon_vmulv4si = 1165,
-  CODE_FOR_neon_vmulv2sf = 1166,
-  CODE_FOR_neon_vmulv4sf = 1167,
-  CODE_FOR_neon_vmlav8qi_unspec = 1168,
-  CODE_FOR_neon_vmlav16qi_unspec = 1169,
-  CODE_FOR_neon_vmlav4hi_unspec = 1170,
-  CODE_FOR_neon_vmlav8hi_unspec = 1171,
-  CODE_FOR_neon_vmlav2si_unspec = 1172,
-  CODE_FOR_neon_vmlav4si_unspec = 1173,
-  CODE_FOR_neon_vmlav2sf_unspec = 1174,
-  CODE_FOR_neon_vmlav4sf_unspec = 1175,
-  CODE_FOR_neon_vmlalv8qi = 1176,
-  CODE_FOR_neon_vmlalv4hi = 1177,
-  CODE_FOR_neon_vmlalv2si = 1178,
-  CODE_FOR_neon_vmlsv8qi_unspec = 1179,
-  CODE_FOR_neon_vmlsv16qi_unspec = 1180,
-  CODE_FOR_neon_vmlsv4hi_unspec = 1181,
-  CODE_FOR_neon_vmlsv8hi_unspec = 1182,
-  CODE_FOR_neon_vmlsv2si_unspec = 1183,
-  CODE_FOR_neon_vmlsv4si_unspec = 1184,
-  CODE_FOR_neon_vmlsv2sf_unspec = 1185,
-  CODE_FOR_neon_vmlsv4sf_unspec = 1186,
-  CODE_FOR_neon_vmlslv8qi = 1187,
-  CODE_FOR_neon_vmlslv4hi = 1188,
-  CODE_FOR_neon_vmlslv2si = 1189,
-  CODE_FOR_neon_vqdmulhv4hi = 1190,
-  CODE_FOR_neon_vqdmulhv2si = 1191,
-  CODE_FOR_neon_vqdmulhv8hi = 1192,
-  CODE_FOR_neon_vqdmulhv4si = 1193,
-  CODE_FOR_neon_vqdmlalv4hi = 1194,
-  CODE_FOR_neon_vqdmlalv2si = 1195,
-  CODE_FOR_neon_vqdmlslv4hi = 1196,
-  CODE_FOR_neon_vqdmlslv2si = 1197,
-  CODE_FOR_neon_vmullv8qi = 1198,
-  CODE_FOR_neon_vmullv4hi = 1199,
-  CODE_FOR_neon_vmullv2si = 1200,
-  CODE_FOR_neon_vqdmullv4hi = 1201,
-  CODE_FOR_neon_vqdmullv2si = 1202,
-  CODE_FOR_neon_vsubv8qi_unspec = 1203,
-  CODE_FOR_neon_vsubv16qi_unspec = 1204,
-  CODE_FOR_neon_vsubv4hi_unspec = 1205,
-  CODE_FOR_neon_vsubv8hi_unspec = 1206,
-  CODE_FOR_neon_vsubv2si_unspec = 1207,
-  CODE_FOR_neon_vsubv4si_unspec = 1208,
-  CODE_FOR_neon_vsubv2sf_unspec = 1209,
-  CODE_FOR_neon_vsubv4sf_unspec = 1210,
-  CODE_FOR_neon_vsubdi_unspec = 1211,
-  CODE_FOR_neon_vsubv2di_unspec = 1212,
-  CODE_FOR_neon_vsublv8qi = 1213,
-  CODE_FOR_neon_vsublv4hi = 1214,
-  CODE_FOR_neon_vsublv2si = 1215,
-  CODE_FOR_neon_vsubwv8qi = 1216,
-  CODE_FOR_neon_vsubwv4hi = 1217,
-  CODE_FOR_neon_vsubwv2si = 1218,
-  CODE_FOR_neon_vqsubv8qi = 1219,
-  CODE_FOR_neon_vqsubv16qi = 1220,
-  CODE_FOR_neon_vqsubv4hi = 1221,
-  CODE_FOR_neon_vqsubv8hi = 1222,
-  CODE_FOR_neon_vqsubv2si = 1223,
-  CODE_FOR_neon_vqsubv4si = 1224,
-  CODE_FOR_neon_vqsubdi = 1225,
-  CODE_FOR_neon_vqsubv2di = 1226,
-  CODE_FOR_neon_vhsubv8qi = 1227,
-  CODE_FOR_neon_vhsubv16qi = 1228,
-  CODE_FOR_neon_vhsubv4hi = 1229,
-  CODE_FOR_neon_vhsubv8hi = 1230,
-  CODE_FOR_neon_vhsubv2si = 1231,
-  CODE_FOR_neon_vhsubv4si = 1232,
-  CODE_FOR_neon_vsubhnv8hi = 1233,
-  CODE_FOR_neon_vsubhnv4si = 1234,
-  CODE_FOR_neon_vsubhnv2di = 1235,
-  CODE_FOR_neon_vceqv8qi = 1236,
-  CODE_FOR_neon_vceqv16qi = 1237,
-  CODE_FOR_neon_vceqv4hi = 1238,
-  CODE_FOR_neon_vceqv8hi = 1239,
-  CODE_FOR_neon_vceqv2si = 1240,
-  CODE_FOR_neon_vceqv4si = 1241,
-  CODE_FOR_neon_vceqv2sf = 1242,
-  CODE_FOR_neon_vceqv4sf = 1243,
-  CODE_FOR_neon_vcgev8qi = 1244,
-  CODE_FOR_neon_vcgev16qi = 1245,
-  CODE_FOR_neon_vcgev4hi = 1246,
-  CODE_FOR_neon_vcgev8hi = 1247,
-  CODE_FOR_neon_vcgev2si = 1248,
-  CODE_FOR_neon_vcgev4si = 1249,
-  CODE_FOR_neon_vcgev2sf = 1250,
-  CODE_FOR_neon_vcgev4sf = 1251,
-  CODE_FOR_neon_vcgeuv8qi = 1252,
-  CODE_FOR_neon_vcgeuv16qi = 1253,
-  CODE_FOR_neon_vcgeuv4hi = 1254,
-  CODE_FOR_neon_vcgeuv8hi = 1255,
-  CODE_FOR_neon_vcgeuv2si = 1256,
-  CODE_FOR_neon_vcgeuv4si = 1257,
-  CODE_FOR_neon_vcgtv8qi = 1258,
-  CODE_FOR_neon_vcgtv16qi = 1259,
-  CODE_FOR_neon_vcgtv4hi = 1260,
-  CODE_FOR_neon_vcgtv8hi = 1261,
-  CODE_FOR_neon_vcgtv2si = 1262,
-  CODE_FOR_neon_vcgtv4si = 1263,
-  CODE_FOR_neon_vcgtv2sf = 1264,
-  CODE_FOR_neon_vcgtv4sf = 1265,
-  CODE_FOR_neon_vcgtuv8qi = 1266,
-  CODE_FOR_neon_vcgtuv16qi = 1267,
-  CODE_FOR_neon_vcgtuv4hi = 1268,
-  CODE_FOR_neon_vcgtuv8hi = 1269,
-  CODE_FOR_neon_vcgtuv2si = 1270,
-  CODE_FOR_neon_vcgtuv4si = 1271,
-  CODE_FOR_neon_vclev8qi = 1272,
-  CODE_FOR_neon_vclev16qi = 1273,
-  CODE_FOR_neon_vclev4hi = 1274,
-  CODE_FOR_neon_vclev8hi = 1275,
-  CODE_FOR_neon_vclev2si = 1276,
-  CODE_FOR_neon_vclev4si = 1277,
-  CODE_FOR_neon_vclev2sf = 1278,
-  CODE_FOR_neon_vclev4sf = 1279,
-  CODE_FOR_neon_vcltv8qi = 1280,
-  CODE_FOR_neon_vcltv16qi = 1281,
-  CODE_FOR_neon_vcltv4hi = 1282,
-  CODE_FOR_neon_vcltv8hi = 1283,
-  CODE_FOR_neon_vcltv2si = 1284,
-  CODE_FOR_neon_vcltv4si = 1285,
-  CODE_FOR_neon_vcltv2sf = 1286,
-  CODE_FOR_neon_vcltv4sf = 1287,
-  CODE_FOR_neon_vcagev2sf = 1288,
-  CODE_FOR_neon_vcagev4sf = 1289,
-  CODE_FOR_neon_vcagtv2sf = 1290,
-  CODE_FOR_neon_vcagtv4sf = 1291,
-  CODE_FOR_neon_vtstv8qi = 1292,
-  CODE_FOR_neon_vtstv16qi = 1293,
-  CODE_FOR_neon_vtstv4hi = 1294,
-  CODE_FOR_neon_vtstv8hi = 1295,
-  CODE_FOR_neon_vtstv2si = 1296,
-  CODE_FOR_neon_vtstv4si = 1297,
-  CODE_FOR_neon_vabdv8qi = 1298,
-  CODE_FOR_neon_vabdv16qi = 1299,
-  CODE_FOR_neon_vabdv4hi = 1300,
-  CODE_FOR_neon_vabdv8hi = 1301,
-  CODE_FOR_neon_vabdv2si = 1302,
-  CODE_FOR_neon_vabdv4si = 1303,
-  CODE_FOR_neon_vabdv2sf = 1304,
-  CODE_FOR_neon_vabdv4sf = 1305,
-  CODE_FOR_neon_vabdlv8qi = 1306,
-  CODE_FOR_neon_vabdlv4hi = 1307,
-  CODE_FOR_neon_vabdlv2si = 1308,
-  CODE_FOR_neon_vabav8qi = 1309,
-  CODE_FOR_neon_vabav16qi = 1310,
-  CODE_FOR_neon_vabav4hi = 1311,
-  CODE_FOR_neon_vabav8hi = 1312,
-  CODE_FOR_neon_vabav2si = 1313,
-  CODE_FOR_neon_vabav4si = 1314,
-  CODE_FOR_neon_vabalv8qi = 1315,
-  CODE_FOR_neon_vabalv4hi = 1316,
-  CODE_FOR_neon_vabalv2si = 1317,
-  CODE_FOR_neon_vmaxv8qi = 1318,
-  CODE_FOR_neon_vmaxv16qi = 1319,
-  CODE_FOR_neon_vmaxv4hi = 1320,
-  CODE_FOR_neon_vmaxv8hi = 1321,
-  CODE_FOR_neon_vmaxv2si = 1322,
-  CODE_FOR_neon_vmaxv4si = 1323,
-  CODE_FOR_neon_vmaxv2sf = 1324,
-  CODE_FOR_neon_vmaxv4sf = 1325,
-  CODE_FOR_neon_vminv8qi = 1326,
-  CODE_FOR_neon_vminv16qi = 1327,
-  CODE_FOR_neon_vminv4hi = 1328,
-  CODE_FOR_neon_vminv8hi = 1329,
-  CODE_FOR_neon_vminv2si = 1330,
-  CODE_FOR_neon_vminv4si = 1331,
-  CODE_FOR_neon_vminv2sf = 1332,
-  CODE_FOR_neon_vminv4sf = 1333,
-  CODE_FOR_neon_vpaddlv8qi = 1334,
-  CODE_FOR_neon_vpaddlv16qi = 1335,
-  CODE_FOR_neon_vpaddlv4hi = 1336,
-  CODE_FOR_neon_vpaddlv8hi = 1337,
-  CODE_FOR_neon_vpaddlv2si = 1338,
-  CODE_FOR_neon_vpaddlv4si = 1339,
-  CODE_FOR_neon_vpadalv8qi = 1340,
-  CODE_FOR_neon_vpadalv16qi = 1341,
-  CODE_FOR_neon_vpadalv4hi = 1342,
-  CODE_FOR_neon_vpadalv8hi = 1343,
-  CODE_FOR_neon_vpadalv2si = 1344,
-  CODE_FOR_neon_vpadalv4si = 1345,
-  CODE_FOR_neon_vpmaxv8qi = 1346,
-  CODE_FOR_neon_vpmaxv4hi = 1347,
-  CODE_FOR_neon_vpmaxv2si = 1348,
-  CODE_FOR_neon_vpmaxv2sf = 1349,
-  CODE_FOR_neon_vpminv8qi = 1350,
-  CODE_FOR_neon_vpminv4hi = 1351,
-  CODE_FOR_neon_vpminv2si = 1352,
-  CODE_FOR_neon_vpminv2sf = 1353,
-  CODE_FOR_neon_vrecpsv2sf = 1354,
-  CODE_FOR_neon_vrecpsv4sf = 1355,
-  CODE_FOR_neon_vrsqrtsv2sf = 1356,
-  CODE_FOR_neon_vrsqrtsv4sf = 1357,
-  CODE_FOR_neon_vqabsv8qi = 1358,
-  CODE_FOR_neon_vqabsv16qi = 1359,
-  CODE_FOR_neon_vqabsv4hi = 1360,
-  CODE_FOR_neon_vqabsv8hi = 1361,
-  CODE_FOR_neon_vqabsv2si = 1362,
-  CODE_FOR_neon_vqabsv4si = 1363,
-  CODE_FOR_neon_vqnegv8qi = 1364,
-  CODE_FOR_neon_vqnegv16qi = 1365,
-  CODE_FOR_neon_vqnegv4hi = 1366,
-  CODE_FOR_neon_vqnegv8hi = 1367,
-  CODE_FOR_neon_vqnegv2si = 1368,
-  CODE_FOR_neon_vqnegv4si = 1369,
-  CODE_FOR_neon_vclsv8qi = 1370,
-  CODE_FOR_neon_vclsv16qi = 1371,
-  CODE_FOR_neon_vclsv4hi = 1372,
-  CODE_FOR_neon_vclsv8hi = 1373,
-  CODE_FOR_neon_vclsv2si = 1374,
-  CODE_FOR_neon_vclsv4si = 1375,
-  CODE_FOR_clzv8qi2 = 1376,
-  CODE_FOR_clzv16qi2 = 1377,
-  CODE_FOR_clzv4hi2 = 1378,
-  CODE_FOR_clzv8hi2 = 1379,
-  CODE_FOR_clzv2si2 = 1380,
-  CODE_FOR_clzv4si2 = 1381,
-  CODE_FOR_popcountv8qi2 = 1382,
-  CODE_FOR_popcountv16qi2 = 1383,
-  CODE_FOR_neon_vrecpev2si = 1384,
-  CODE_FOR_neon_vrecpev2sf = 1385,
-  CODE_FOR_neon_vrecpev4si = 1386,
-  CODE_FOR_neon_vrecpev4sf = 1387,
-  CODE_FOR_neon_vrsqrtev2si = 1388,
-  CODE_FOR_neon_vrsqrtev2sf = 1389,
-  CODE_FOR_neon_vrsqrtev4si = 1390,
-  CODE_FOR_neon_vrsqrtev4sf = 1391,
-  CODE_FOR_neon_vget_lanev8qi_sext_internal = 1392,
-  CODE_FOR_neon_vget_lanev4hi_sext_internal = 1393,
-  CODE_FOR_neon_vget_lanev2si_sext_internal = 1394,
-  CODE_FOR_neon_vget_lanev2sf_sext_internal = 1395,
-  CODE_FOR_neon_vget_lanev8qi_zext_internal = 1396,
-  CODE_FOR_neon_vget_lanev4hi_zext_internal = 1397,
-  CODE_FOR_neon_vget_lanev2si_zext_internal = 1398,
-  CODE_FOR_neon_vget_lanev2sf_zext_internal = 1399,
-  CODE_FOR_neon_vget_lanev16qi_sext_internal = 1400,
-  CODE_FOR_neon_vget_lanev8hi_sext_internal = 1401,
-  CODE_FOR_neon_vget_lanev4si_sext_internal = 1402,
-  CODE_FOR_neon_vget_lanev4sf_sext_internal = 1403,
-  CODE_FOR_neon_vget_lanev16qi_zext_internal = 1404,
-  CODE_FOR_neon_vget_lanev8hi_zext_internal = 1405,
-  CODE_FOR_neon_vget_lanev4si_zext_internal = 1406,
-  CODE_FOR_neon_vget_lanev4sf_zext_internal = 1407,
-  CODE_FOR_neon_vdup_nv8qi = 1408,
-  CODE_FOR_neon_vdup_nv4hi = 1409,
-  CODE_FOR_neon_vdup_nv16qi = 1410,
-  CODE_FOR_neon_vdup_nv8hi = 1411,
-  CODE_FOR_neon_vdup_nv2si = 1412,
-  CODE_FOR_neon_vdup_nv2sf = 1413,
-  CODE_FOR_neon_vdup_nv4si = 1414,
-  CODE_FOR_neon_vdup_nv4sf = 1415,
-  CODE_FOR_neon_vdup_nv2di = 1416,
-  CODE_FOR_neon_vdup_lanev8qi_internal = 1417,
-  CODE_FOR_neon_vdup_lanev16qi_internal = 1418,
-  CODE_FOR_neon_vdup_lanev4hi_internal = 1419,
-  CODE_FOR_neon_vdup_lanev8hi_internal = 1420,
-  CODE_FOR_neon_vdup_lanev2si_internal = 1421,
-  CODE_FOR_neon_vdup_lanev4si_internal = 1422,
-  CODE_FOR_neon_vdup_lanev2sf_internal = 1423,
-  CODE_FOR_neon_vdup_lanev4sf_internal = 1424,
-  CODE_FOR_neon_vcombinev8qi = 1435,
-  CODE_FOR_neon_vcombinev4hi = 1436,
-  CODE_FOR_neon_vcombinev2si = 1437,
-  CODE_FOR_neon_vcombinev2sf = 1438,
-  CODE_FOR_neon_vcombinedi = 1439,
-  CODE_FOR_floatv2siv2sf2 = 1440,
-  CODE_FOR_floatv4siv4sf2 = 1441,
-  CODE_FOR_floatunsv2siv2sf2 = 1442,
-  CODE_FOR_floatunsv4siv4sf2 = 1443,
-  CODE_FOR_fix_truncv2sfv2si2 = 1444,
-  CODE_FOR_fix_truncv4sfv4si2 = 1445,
-  CODE_FOR_fixuns_truncv2sfv2si2 = 1446,
-  CODE_FOR_fixuns_truncv4sfv4si2 = 1447,
-  CODE_FOR_neon_vcvtv2sf = 1448,
-  CODE_FOR_neon_vcvtv4sf = 1449,
-  CODE_FOR_neon_vcvtv2si = 1450,
-  CODE_FOR_neon_vcvtv4si = 1451,
-  CODE_FOR_neon_vcvtv4sfv4hf = 1452,
-  CODE_FOR_neon_vcvtv4hfv4sf = 1453,
-  CODE_FOR_neon_vcvt_nv2sf = 1454,
-  CODE_FOR_neon_vcvt_nv4sf = 1455,
-  CODE_FOR_neon_vcvt_nv2si = 1456,
-  CODE_FOR_neon_vcvt_nv4si = 1457,
-  CODE_FOR_neon_vmovnv8hi = 1458,
-  CODE_FOR_neon_vmovnv4si = 1459,
-  CODE_FOR_neon_vmovnv2di = 1460,
-  CODE_FOR_neon_vqmovnv8hi = 1461,
-  CODE_FOR_neon_vqmovnv4si = 1462,
-  CODE_FOR_neon_vqmovnv2di = 1463,
-  CODE_FOR_neon_vqmovunv8hi = 1464,
-  CODE_FOR_neon_vqmovunv4si = 1465,
-  CODE_FOR_neon_vqmovunv2di = 1466,
-  CODE_FOR_neon_vmovlv8qi = 1467,
-  CODE_FOR_neon_vmovlv4hi = 1468,
-  CODE_FOR_neon_vmovlv2si = 1469,
-  CODE_FOR_neon_vmul_lanev4hi = 1470,
-  CODE_FOR_neon_vmul_lanev2si = 1471,
-  CODE_FOR_neon_vmul_lanev2sf = 1472,
-  CODE_FOR_neon_vmul_lanev8hi = 1473,
-  CODE_FOR_neon_vmul_lanev4si = 1474,
-  CODE_FOR_neon_vmul_lanev4sf = 1475,
-  CODE_FOR_neon_vmull_lanev4hi = 1476,
-  CODE_FOR_neon_vmull_lanev2si = 1477,
-  CODE_FOR_neon_vqdmull_lanev4hi = 1478,
-  CODE_FOR_neon_vqdmull_lanev2si = 1479,
-  CODE_FOR_neon_vqdmulh_lanev8hi = 1480,
-  CODE_FOR_neon_vqdmulh_lanev4si = 1481,
-  CODE_FOR_neon_vqdmulh_lanev4hi = 1482,
-  CODE_FOR_neon_vqdmulh_lanev2si = 1483,
-  CODE_FOR_neon_vmla_lanev4hi = 1484,
-  CODE_FOR_neon_vmla_lanev2si = 1485,
-  CODE_FOR_neon_vmla_lanev2sf = 1486,
-  CODE_FOR_neon_vmla_lanev8hi = 1487,
-  CODE_FOR_neon_vmla_lanev4si = 1488,
-  CODE_FOR_neon_vmla_lanev4sf = 1489,
-  CODE_FOR_neon_vmlal_lanev4hi = 1490,
-  CODE_FOR_neon_vmlal_lanev2si = 1491,
-  CODE_FOR_neon_vqdmlal_lanev4hi = 1492,
-  CODE_FOR_neon_vqdmlal_lanev2si = 1493,
-  CODE_FOR_neon_vmls_lanev4hi = 1494,
-  CODE_FOR_neon_vmls_lanev2si = 1495,
-  CODE_FOR_neon_vmls_lanev2sf = 1496,
-  CODE_FOR_neon_vmls_lanev8hi = 1497,
-  CODE_FOR_neon_vmls_lanev4si = 1498,
-  CODE_FOR_neon_vmls_lanev4sf = 1499,
-  CODE_FOR_neon_vmlsl_lanev4hi = 1500,
-  CODE_FOR_neon_vmlsl_lanev2si = 1501,
-  CODE_FOR_neon_vqdmlsl_lanev4hi = 1502,
-  CODE_FOR_neon_vqdmlsl_lanev2si = 1503,
-  CODE_FOR_neon_vextv8qi = 1504,
-  CODE_FOR_neon_vextv16qi = 1505,
-  CODE_FOR_neon_vextv4hi = 1506,
-  CODE_FOR_neon_vextv8hi = 1507,
-  CODE_FOR_neon_vextv2si = 1508,
-  CODE_FOR_neon_vextv4si = 1509,
-  CODE_FOR_neon_vextv2sf = 1510,
-  CODE_FOR_neon_vextv4sf = 1511,
-  CODE_FOR_neon_vextdi = 1512,
-  CODE_FOR_neon_vextv2di = 1513,
-  CODE_FOR_neon_vrev64v8qi = 1514,
-  CODE_FOR_neon_vrev64v16qi = 1515,
-  CODE_FOR_neon_vrev64v4hi = 1516,
-  CODE_FOR_neon_vrev64v8hi = 1517,
-  CODE_FOR_neon_vrev64v2si = 1518,
-  CODE_FOR_neon_vrev64v4si = 1519,
-  CODE_FOR_neon_vrev64v2sf = 1520,
-  CODE_FOR_neon_vrev64v4sf = 1521,
-  CODE_FOR_neon_vrev64v2di = 1522,
-  CODE_FOR_neon_vrev32v8qi = 1523,
-  CODE_FOR_neon_vrev32v4hi = 1524,
-  CODE_FOR_neon_vrev32v16qi = 1525,
-  CODE_FOR_neon_vrev32v8hi = 1526,
-  CODE_FOR_neon_vrev16v8qi = 1527,
-  CODE_FOR_neon_vrev16v16qi = 1528,
-  CODE_FOR_neon_vbslv8qi_internal = 1529,
-  CODE_FOR_neon_vbslv16qi_internal = 1530,
-  CODE_FOR_neon_vbslv4hi_internal = 1531,
-  CODE_FOR_neon_vbslv8hi_internal = 1532,
-  CODE_FOR_neon_vbslv2si_internal = 1533,
-  CODE_FOR_neon_vbslv4si_internal = 1534,
-  CODE_FOR_neon_vbslv2sf_internal = 1535,
-  CODE_FOR_neon_vbslv4sf_internal = 1536,
-  CODE_FOR_neon_vbsldi_internal = 1537,
-  CODE_FOR_neon_vbslv2di_internal = 1538,
-  CODE_FOR_neon_vshlv8qi = 1539,
-  CODE_FOR_neon_vshlv16qi = 1540,
-  CODE_FOR_neon_vshlv4hi = 1541,
-  CODE_FOR_neon_vshlv8hi = 1542,
-  CODE_FOR_neon_vshlv2si = 1543,
-  CODE_FOR_neon_vshlv4si = 1544,
-  CODE_FOR_neon_vshldi = 1545,
-  CODE_FOR_neon_vshlv2di = 1546,
-  CODE_FOR_neon_vqshlv8qi = 1547,
-  CODE_FOR_neon_vqshlv16qi = 1548,
-  CODE_FOR_neon_vqshlv4hi = 1549,
-  CODE_FOR_neon_vqshlv8hi = 1550,
-  CODE_FOR_neon_vqshlv2si = 1551,
-  CODE_FOR_neon_vqshlv4si = 1552,
-  CODE_FOR_neon_vqshldi = 1553,
-  CODE_FOR_neon_vqshlv2di = 1554,
-  CODE_FOR_neon_vshr_nv8qi = 1555,
-  CODE_FOR_neon_vshr_nv16qi = 1556,
-  CODE_FOR_neon_vshr_nv4hi = 1557,
-  CODE_FOR_neon_vshr_nv8hi = 1558,
-  CODE_FOR_neon_vshr_nv2si = 1559,
-  CODE_FOR_neon_vshr_nv4si = 1560,
-  CODE_FOR_neon_vshr_ndi = 1561,
-  CODE_FOR_neon_vshr_nv2di = 1562,
-  CODE_FOR_neon_vshrn_nv8hi = 1563,
-  CODE_FOR_neon_vshrn_nv4si = 1564,
-  CODE_FOR_neon_vshrn_nv2di = 1565,
-  CODE_FOR_neon_vqshrn_nv8hi = 1566,
-  CODE_FOR_neon_vqshrn_nv4si = 1567,
-  CODE_FOR_neon_vqshrn_nv2di = 1568,
-  CODE_FOR_neon_vqshrun_nv8hi = 1569,
-  CODE_FOR_neon_vqshrun_nv4si = 1570,
-  CODE_FOR_neon_vqshrun_nv2di = 1571,
-  CODE_FOR_neon_vshl_nv8qi = 1572,
-  CODE_FOR_neon_vshl_nv16qi = 1573,
-  CODE_FOR_neon_vshl_nv4hi = 1574,
-  CODE_FOR_neon_vshl_nv8hi = 1575,
-  CODE_FOR_neon_vshl_nv2si = 1576,
-  CODE_FOR_neon_vshl_nv4si = 1577,
-  CODE_FOR_neon_vshl_ndi = 1578,
-  CODE_FOR_neon_vshl_nv2di = 1579,
-  CODE_FOR_neon_vqshl_nv8qi = 1580,
-  CODE_FOR_neon_vqshl_nv16qi = 1581,
-  CODE_FOR_neon_vqshl_nv4hi = 1582,
-  CODE_FOR_neon_vqshl_nv8hi = 1583,
-  CODE_FOR_neon_vqshl_nv2si = 1584,
-  CODE_FOR_neon_vqshl_nv4si = 1585,
-  CODE_FOR_neon_vqshl_ndi = 1586,
-  CODE_FOR_neon_vqshl_nv2di = 1587,
-  CODE_FOR_neon_vqshlu_nv8qi = 1588,
-  CODE_FOR_neon_vqshlu_nv16qi = 1589,
-  CODE_FOR_neon_vqshlu_nv4hi = 1590,
-  CODE_FOR_neon_vqshlu_nv8hi = 1591,
-  CODE_FOR_neon_vqshlu_nv2si = 1592,
-  CODE_FOR_neon_vqshlu_nv4si = 1593,
-  CODE_FOR_neon_vqshlu_ndi = 1594,
-  CODE_FOR_neon_vqshlu_nv2di = 1595,
-  CODE_FOR_neon_vshll_nv8qi = 1596,
-  CODE_FOR_neon_vshll_nv4hi = 1597,
-  CODE_FOR_neon_vshll_nv2si = 1598,
-  CODE_FOR_neon_vsra_nv8qi = 1599,
-  CODE_FOR_neon_vsra_nv16qi = 1600,
-  CODE_FOR_neon_vsra_nv4hi = 1601,
-  CODE_FOR_neon_vsra_nv8hi = 1602,
-  CODE_FOR_neon_vsra_nv2si = 1603,
-  CODE_FOR_neon_vsra_nv4si = 1604,
-  CODE_FOR_neon_vsra_ndi = 1605,
-  CODE_FOR_neon_vsra_nv2di = 1606,
-  CODE_FOR_neon_vsri_nv8qi = 1607,
-  CODE_FOR_neon_vsri_nv16qi = 1608,
-  CODE_FOR_neon_vsri_nv4hi = 1609,
-  CODE_FOR_neon_vsri_nv8hi = 1610,
-  CODE_FOR_neon_vsri_nv2si = 1611,
-  CODE_FOR_neon_vsri_nv4si = 1612,
-  CODE_FOR_neon_vsri_ndi = 1613,
-  CODE_FOR_neon_vsri_nv2di = 1614,
-  CODE_FOR_neon_vsli_nv8qi = 1615,
-  CODE_FOR_neon_vsli_nv16qi = 1616,
-  CODE_FOR_neon_vsli_nv4hi = 1617,
-  CODE_FOR_neon_vsli_nv8hi = 1618,
-  CODE_FOR_neon_vsli_nv2si = 1619,
-  CODE_FOR_neon_vsli_nv4si = 1620,
-  CODE_FOR_neon_vsli_ndi = 1621,
-  CODE_FOR_neon_vsli_nv2di = 1622,
-  CODE_FOR_neon_vtbl1v8qi = 1623,
-  CODE_FOR_neon_vtbl2v8qi = 1624,
-  CODE_FOR_neon_vtbl3v8qi = 1625,
-  CODE_FOR_neon_vtbl4v8qi = 1626,
-  CODE_FOR_neon_vtbl1v16qi = 1627,
-  CODE_FOR_neon_vtbl2v16qi = 1628,
-  CODE_FOR_neon_vcombinev16qi = 1629,
-  CODE_FOR_neon_vtbx1v8qi = 1630,
-  CODE_FOR_neon_vtbx2v8qi = 1631,
-  CODE_FOR_neon_vtbx3v8qi = 1632,
-  CODE_FOR_neon_vtbx4v8qi = 1633,
-  CODE_FOR_neon_vld1v8qi = 1658,
-  CODE_FOR_neon_vld1v16qi = 1659,
-  CODE_FOR_neon_vld1v4hi = 1660,
-  CODE_FOR_neon_vld1v8hi = 1661,
-  CODE_FOR_neon_vld1v2si = 1662,
-  CODE_FOR_neon_vld1v4si = 1663,
-  CODE_FOR_neon_vld1v2sf = 1664,
-  CODE_FOR_neon_vld1v4sf = 1665,
-  CODE_FOR_neon_vld1di = 1666,
-  CODE_FOR_neon_vld1v2di = 1667,
-  CODE_FOR_neon_vld1_lanev8qi = 1668,
-  CODE_FOR_neon_vld1_lanev4hi = 1669,
-  CODE_FOR_neon_vld1_lanev2si = 1670,
-  CODE_FOR_neon_vld1_lanev2sf = 1671,
-  CODE_FOR_neon_vld1_lanedi = 1672,
-  CODE_FOR_neon_vld1_lanev16qi = 1673,
-  CODE_FOR_neon_vld1_lanev8hi = 1674,
-  CODE_FOR_neon_vld1_lanev4si = 1675,
-  CODE_FOR_neon_vld1_lanev4sf = 1676,
-  CODE_FOR_neon_vld1_lanev2di = 1677,
-  CODE_FOR_neon_vld1_dupv8qi = 1678,
-  CODE_FOR_neon_vld1_dupv4hi = 1679,
-  CODE_FOR_neon_vld1_dupv2si = 1680,
-  CODE_FOR_neon_vld1_dupv2sf = 1681,
-  CODE_FOR_neon_vld1_dupv16qi = 1682,
-  CODE_FOR_neon_vld1_dupv8hi = 1683,
-  CODE_FOR_neon_vld1_dupv4si = 1684,
-  CODE_FOR_neon_vld1_dupv4sf = 1685,
-  CODE_FOR_neon_vld1_dupv2di = 1686,
-  CODE_FOR_neon_vst1v8qi = 1687,
-  CODE_FOR_neon_vst1v16qi = 1688,
-  CODE_FOR_neon_vst1v4hi = 1689,
-  CODE_FOR_neon_vst1v8hi = 1690,
-  CODE_FOR_neon_vst1v2si = 1691,
-  CODE_FOR_neon_vst1v4si = 1692,
-  CODE_FOR_neon_vst1v2sf = 1693,
-  CODE_FOR_neon_vst1v4sf = 1694,
-  CODE_FOR_neon_vst1di = 1695,
-  CODE_FOR_neon_vst1v2di = 1696,
-  CODE_FOR_neon_vst1_lanev8qi = 1697,
-  CODE_FOR_neon_vst1_lanev4hi = 1698,
-  CODE_FOR_neon_vst1_lanev2si = 1699,
-  CODE_FOR_neon_vst1_lanev2sf = 1700,
-  CODE_FOR_neon_vst1_lanedi = 1701,
-  CODE_FOR_neon_vst1_lanev16qi = 1702,
-  CODE_FOR_neon_vst1_lanev8hi = 1703,
-  CODE_FOR_neon_vst1_lanev4si = 1704,
-  CODE_FOR_neon_vst1_lanev4sf = 1705,
-  CODE_FOR_neon_vst1_lanev2di = 1706,
-  CODE_FOR_neon_vld2v8qi = 1707,
-  CODE_FOR_neon_vld2v4hi = 1708,
-  CODE_FOR_neon_vld2v2si = 1709,
-  CODE_FOR_neon_vld2v2sf = 1710,
-  CODE_FOR_neon_vld2di = 1711,
-  CODE_FOR_neon_vld2v16qi = 1712,
-  CODE_FOR_neon_vld2v8hi = 1713,
-  CODE_FOR_neon_vld2v4si = 1714,
-  CODE_FOR_neon_vld2v4sf = 1715,
-  CODE_FOR_neon_vld2_lanev8qi = 1716,
-  CODE_FOR_neon_vld2_lanev4hi = 1717,
-  CODE_FOR_neon_vld2_lanev2si = 1718,
-  CODE_FOR_neon_vld2_lanev2sf = 1719,
-  CODE_FOR_neon_vld2_lanev8hi = 1720,
-  CODE_FOR_neon_vld2_lanev4si = 1721,
-  CODE_FOR_neon_vld2_lanev4sf = 1722,
-  CODE_FOR_neon_vld2_dupv8qi = 1723,
-  CODE_FOR_neon_vld2_dupv4hi = 1724,
-  CODE_FOR_neon_vld2_dupv2si = 1725,
-  CODE_FOR_neon_vld2_dupv2sf = 1726,
-  CODE_FOR_neon_vld2_dupdi = 1727,
-  CODE_FOR_neon_vst2v8qi = 1728,
-  CODE_FOR_neon_vst2v4hi = 1729,
-  CODE_FOR_neon_vst2v2si = 1730,
-  CODE_FOR_neon_vst2v2sf = 1731,
-  CODE_FOR_neon_vst2di = 1732,
-  CODE_FOR_neon_vst2v16qi = 1733,
-  CODE_FOR_neon_vst2v8hi = 1734,
-  CODE_FOR_neon_vst2v4si = 1735,
-  CODE_FOR_neon_vst2v4sf = 1736,
-  CODE_FOR_neon_vst2_lanev8qi = 1737,
-  CODE_FOR_neon_vst2_lanev4hi = 1738,
-  CODE_FOR_neon_vst2_lanev2si = 1739,
-  CODE_FOR_neon_vst2_lanev2sf = 1740,
-  CODE_FOR_neon_vst2_lanev8hi = 1741,
-  CODE_FOR_neon_vst2_lanev4si = 1742,
-  CODE_FOR_neon_vst2_lanev4sf = 1743,
-  CODE_FOR_neon_vld3v8qi = 1744,
-  CODE_FOR_neon_vld3v4hi = 1745,
-  CODE_FOR_neon_vld3v2si = 1746,
-  CODE_FOR_neon_vld3v2sf = 1747,
-  CODE_FOR_neon_vld3di = 1748,
-  CODE_FOR_neon_vld3qav16qi = 1749,
-  CODE_FOR_neon_vld3qav8hi = 1750,
-  CODE_FOR_neon_vld3qav4si = 1751,
-  CODE_FOR_neon_vld3qav4sf = 1752,
-  CODE_FOR_neon_vld3qbv16qi = 1753,
-  CODE_FOR_neon_vld3qbv8hi = 1754,
-  CODE_FOR_neon_vld3qbv4si = 1755,
-  CODE_FOR_neon_vld3qbv4sf = 1756,
-  CODE_FOR_neon_vld3_lanev8qi = 1757,
-  CODE_FOR_neon_vld3_lanev4hi = 1758,
-  CODE_FOR_neon_vld3_lanev2si = 1759,
-  CODE_FOR_neon_vld3_lanev2sf = 1760,
-  CODE_FOR_neon_vld3_lanev8hi = 1761,
-  CODE_FOR_neon_vld3_lanev4si = 1762,
-  CODE_FOR_neon_vld3_lanev4sf = 1763,
-  CODE_FOR_neon_vld3_dupv8qi = 1764,
-  CODE_FOR_neon_vld3_dupv4hi = 1765,
-  CODE_FOR_neon_vld3_dupv2si = 1766,
-  CODE_FOR_neon_vld3_dupv2sf = 1767,
-  CODE_FOR_neon_vld3_dupdi = 1768,
-  CODE_FOR_neon_vst3v8qi = 1769,
-  CODE_FOR_neon_vst3v4hi = 1770,
-  CODE_FOR_neon_vst3v2si = 1771,
-  CODE_FOR_neon_vst3v2sf = 1772,
-  CODE_FOR_neon_vst3di = 1773,
-  CODE_FOR_neon_vst3qav16qi = 1774,
-  CODE_FOR_neon_vst3qav8hi = 1775,
-  CODE_FOR_neon_vst3qav4si = 1776,
-  CODE_FOR_neon_vst3qav4sf = 1777,
-  CODE_FOR_neon_vst3qbv16qi = 1778,
-  CODE_FOR_neon_vst3qbv8hi = 1779,
-  CODE_FOR_neon_vst3qbv4si = 1780,
-  CODE_FOR_neon_vst3qbv4sf = 1781,
-  CODE_FOR_neon_vst3_lanev8qi = 1782,
-  CODE_FOR_neon_vst3_lanev4hi = 1783,
-  CODE_FOR_neon_vst3_lanev2si = 1784,
-  CODE_FOR_neon_vst3_lanev2sf = 1785,
-  CODE_FOR_neon_vst3_lanev8hi = 1786,
-  CODE_FOR_neon_vst3_lanev4si = 1787,
-  CODE_FOR_neon_vst3_lanev4sf = 1788,
-  CODE_FOR_neon_vld4v8qi = 1789,
-  CODE_FOR_neon_vld4v4hi = 1790,
-  CODE_FOR_neon_vld4v2si = 1791,
-  CODE_FOR_neon_vld4v2sf = 1792,
-  CODE_FOR_neon_vld4di = 1793,
-  CODE_FOR_neon_vld4qav16qi = 1794,
-  CODE_FOR_neon_vld4qav8hi = 1795,
-  CODE_FOR_neon_vld4qav4si = 1796,
-  CODE_FOR_neon_vld4qav4sf = 1797,
-  CODE_FOR_neon_vld4qbv16qi = 1798,
-  CODE_FOR_neon_vld4qbv8hi = 1799,
-  CODE_FOR_neon_vld4qbv4si = 1800,
-  CODE_FOR_neon_vld4qbv4sf = 1801,
-  CODE_FOR_neon_vld4_lanev8qi = 1802,
-  CODE_FOR_neon_vld4_lanev4hi = 1803,
-  CODE_FOR_neon_vld4_lanev2si = 1804,
-  CODE_FOR_neon_vld4_lanev2sf = 1805,
-  CODE_FOR_neon_vld4_lanev8hi = 1806,
-  CODE_FOR_neon_vld4_lanev4si = 1807,
-  CODE_FOR_neon_vld4_lanev4sf = 1808,
-  CODE_FOR_neon_vld4_dupv8qi = 1809,
-  CODE_FOR_neon_vld4_dupv4hi = 1810,
-  CODE_FOR_neon_vld4_dupv2si = 1811,
-  CODE_FOR_neon_vld4_dupv2sf = 1812,
-  CODE_FOR_neon_vld4_dupdi = 1813,
-  CODE_FOR_neon_vst4v8qi = 1814,
-  CODE_FOR_neon_vst4v4hi = 1815,
-  CODE_FOR_neon_vst4v2si = 1816,
-  CODE_FOR_neon_vst4v2sf = 1817,
-  CODE_FOR_neon_vst4di = 1818,
-  CODE_FOR_neon_vst4qav16qi = 1819,
-  CODE_FOR_neon_vst4qav8hi = 1820,
-  CODE_FOR_neon_vst4qav4si = 1821,
-  CODE_FOR_neon_vst4qav4sf = 1822,
-  CODE_FOR_neon_vst4qbv16qi = 1823,
-  CODE_FOR_neon_vst4qbv8hi = 1824,
-  CODE_FOR_neon_vst4qbv4si = 1825,
-  CODE_FOR_neon_vst4qbv4sf = 1826,
-  CODE_FOR_neon_vst4_lanev8qi = 1827,
-  CODE_FOR_neon_vst4_lanev4hi = 1828,
-  CODE_FOR_neon_vst4_lanev2si = 1829,
-  CODE_FOR_neon_vst4_lanev2sf = 1830,
-  CODE_FOR_neon_vst4_lanev8hi = 1831,
-  CODE_FOR_neon_vst4_lanev4si = 1832,
-  CODE_FOR_neon_vst4_lanev4sf = 1833,
-  CODE_FOR_neon_vec_unpacks_lo_v16qi = 1834,
-  CODE_FOR_neon_vec_unpacku_lo_v16qi = 1835,
-  CODE_FOR_neon_vec_unpacks_lo_v8hi = 1836,
-  CODE_FOR_neon_vec_unpacku_lo_v8hi = 1837,
-  CODE_FOR_neon_vec_unpacks_lo_v4si = 1838,
-  CODE_FOR_neon_vec_unpacku_lo_v4si = 1839,
-  CODE_FOR_neon_vec_unpacks_hi_v16qi = 1840,
-  CODE_FOR_neon_vec_unpacku_hi_v16qi = 1841,
-  CODE_FOR_neon_vec_unpacks_hi_v8hi = 1842,
-  CODE_FOR_neon_vec_unpacku_hi_v8hi = 1843,
-  CODE_FOR_neon_vec_unpacks_hi_v4si = 1844,
-  CODE_FOR_neon_vec_unpacku_hi_v4si = 1845,
-  CODE_FOR_neon_vec_smult_lo_v16qi = 1846,
-  CODE_FOR_neon_vec_umult_lo_v16qi = 1847,
-  CODE_FOR_neon_vec_smult_lo_v8hi = 1848,
-  CODE_FOR_neon_vec_umult_lo_v8hi = 1849,
-  CODE_FOR_neon_vec_smult_lo_v4si = 1850,
-  CODE_FOR_neon_vec_umult_lo_v4si = 1851,
-  CODE_FOR_neon_vec_smult_hi_v16qi = 1852,
-  CODE_FOR_neon_vec_umult_hi_v16qi = 1853,
-  CODE_FOR_neon_vec_smult_hi_v8hi = 1854,
-  CODE_FOR_neon_vec_umult_hi_v8hi = 1855,
-  CODE_FOR_neon_vec_smult_hi_v4si = 1856,
-  CODE_FOR_neon_vec_umult_hi_v4si = 1857,
-  CODE_FOR_neon_vec_sshiftl_v8qi = 1858,
-  CODE_FOR_neon_vec_ushiftl_v8qi = 1859,
-  CODE_FOR_neon_vec_sshiftl_v4hi = 1860,
-  CODE_FOR_neon_vec_ushiftl_v4hi = 1861,
-  CODE_FOR_neon_vec_sshiftl_v2si = 1862,
-  CODE_FOR_neon_vec_ushiftl_v2si = 1863,
-  CODE_FOR_neon_unpacks_v8qi = 1864,
-  CODE_FOR_neon_unpacku_v8qi = 1865,
-  CODE_FOR_neon_unpacks_v4hi = 1866,
-  CODE_FOR_neon_unpacku_v4hi = 1867,
-  CODE_FOR_neon_unpacks_v2si = 1868,
-  CODE_FOR_neon_unpacku_v2si = 1869,
-  CODE_FOR_neon_vec_smult_v8qi = 1870,
-  CODE_FOR_neon_vec_umult_v8qi = 1871,
-  CODE_FOR_neon_vec_smult_v4hi = 1872,
-  CODE_FOR_neon_vec_umult_v4hi = 1873,
-  CODE_FOR_neon_vec_smult_v2si = 1874,
-  CODE_FOR_neon_vec_umult_v2si = 1875,
-  CODE_FOR_vec_pack_trunc_v8hi = 1876,
-  CODE_FOR_vec_pack_trunc_v4si = 1877,
-  CODE_FOR_vec_pack_trunc_v2di = 1878,
-  CODE_FOR_neon_vec_pack_trunc_v8hi = 1879,
-  CODE_FOR_neon_vec_pack_trunc_v4si = 1880,
-  CODE_FOR_neon_vec_pack_trunc_v2di = 1881,
-  CODE_FOR_neon_vabdv8qi_2 = 1882,
-  CODE_FOR_neon_vabdv16qi_2 = 1883,
-  CODE_FOR_neon_vabdv4hi_2 = 1884,
-  CODE_FOR_neon_vabdv8hi_2 = 1885,
-  CODE_FOR_neon_vabdv2si_2 = 1886,
-  CODE_FOR_neon_vabdv4si_2 = 1887,
-  CODE_FOR_neon_vabdv2sf_2 = 1888,
-  CODE_FOR_neon_vabdv4sf_2 = 1889,
-  CODE_FOR_neon_vabdv2di_2 = 1890,
-  CODE_FOR_neon_vabdv8qi_3 = 1891,
-  CODE_FOR_neon_vabdv16qi_3 = 1892,
-  CODE_FOR_neon_vabdv4hi_3 = 1893,
-  CODE_FOR_neon_vabdv8hi_3 = 1894,
-  CODE_FOR_neon_vabdv2si_3 = 1895,
-  CODE_FOR_neon_vabdv4si_3 = 1896,
-  CODE_FOR_neon_vabdv2sf_3 = 1897,
-  CODE_FOR_neon_vabdv4sf_3 = 1898,
-  CODE_FOR_neon_vabdv2di_3 = 1899,
-  CODE_FOR_crypto_aesmc = 1900,
-  CODE_FOR_crypto_aesimc = 1901,
-  CODE_FOR_crypto_aesd = 1902,
-  CODE_FOR_crypto_aese = 1903,
-  CODE_FOR_crypto_sha1su1 = 1904,
-  CODE_FOR_crypto_sha256su0 = 1905,
-  CODE_FOR_crypto_sha1su0 = 1906,
-  CODE_FOR_crypto_sha256h = 1907,
-  CODE_FOR_crypto_sha256h2 = 1908,
-  CODE_FOR_crypto_sha256su1 = 1909,
-  CODE_FOR_crypto_sha1h = 1910,
-  CODE_FOR_crypto_vmullp64 = 1911,
-  CODE_FOR_crypto_sha1c = 1912,
-  CODE_FOR_crypto_sha1m = 1913,
-  CODE_FOR_crypto_sha1p = 1914,
-  CODE_FOR_atomic_loadqi = 1916,
-  CODE_FOR_atomic_loadhi = 1917,
-  CODE_FOR_atomic_loadsi = 1918,
-  CODE_FOR_atomic_storeqi = 1919,
-  CODE_FOR_atomic_storehi = 1920,
-  CODE_FOR_atomic_storesi = 1921,
-  CODE_FOR_atomic_loaddi_1 = 1922,
-  CODE_FOR_atomic_compare_and_swapqi_1 = 1923,
-  CODE_FOR_atomic_compare_and_swaphi_1 = 1924,
-  CODE_FOR_atomic_compare_and_swapsi_1 = 1925,
-  CODE_FOR_atomic_compare_and_swapdi_1 = 1926,
-  CODE_FOR_atomic_exchangeqi = 1927,
-  CODE_FOR_atomic_exchangehi = 1928,
-  CODE_FOR_atomic_exchangesi = 1929,
-  CODE_FOR_atomic_exchangedi = 1930,
-  CODE_FOR_atomic_addqi = 1931,
-  CODE_FOR_atomic_subqi = 1932,
-  CODE_FOR_atomic_orqi = 1933,
-  CODE_FOR_atomic_xorqi = 1934,
-  CODE_FOR_atomic_andqi = 1935,
-  CODE_FOR_atomic_addhi = 1936,
-  CODE_FOR_atomic_subhi = 1937,
-  CODE_FOR_atomic_orhi = 1938,
-  CODE_FOR_atomic_xorhi = 1939,
-  CODE_FOR_atomic_andhi = 1940,
-  CODE_FOR_atomic_addsi = 1941,
-  CODE_FOR_atomic_subsi = 1942,
-  CODE_FOR_atomic_orsi = 1943,
-  CODE_FOR_atomic_xorsi = 1944,
-  CODE_FOR_atomic_andsi = 1945,
-  CODE_FOR_atomic_adddi = 1946,
-  CODE_FOR_atomic_subdi = 1947,
-  CODE_FOR_atomic_ordi = 1948,
-  CODE_FOR_atomic_xordi = 1949,
-  CODE_FOR_atomic_anddi = 1950,
-  CODE_FOR_atomic_nandqi = 1951,
-  CODE_FOR_atomic_nandhi = 1952,
-  CODE_FOR_atomic_nandsi = 1953,
-  CODE_FOR_atomic_nanddi = 1954,
-  CODE_FOR_atomic_fetch_addqi = 1955,
-  CODE_FOR_atomic_fetch_subqi = 1956,
-  CODE_FOR_atomic_fetch_orqi = 1957,
-  CODE_FOR_atomic_fetch_xorqi = 1958,
-  CODE_FOR_atomic_fetch_andqi = 1959,
-  CODE_FOR_atomic_fetch_addhi = 1960,
-  CODE_FOR_atomic_fetch_subhi = 1961,
-  CODE_FOR_atomic_fetch_orhi = 1962,
-  CODE_FOR_atomic_fetch_xorhi = 1963,
-  CODE_FOR_atomic_fetch_andhi = 1964,
-  CODE_FOR_atomic_fetch_addsi = 1965,
-  CODE_FOR_atomic_fetch_subsi = 1966,
-  CODE_FOR_atomic_fetch_orsi = 1967,
-  CODE_FOR_atomic_fetch_xorsi = 1968,
-  CODE_FOR_atomic_fetch_andsi = 1969,
-  CODE_FOR_atomic_fetch_adddi = 1970,
-  CODE_FOR_atomic_fetch_subdi = 1971,
-  CODE_FOR_atomic_fetch_ordi = 1972,
-  CODE_FOR_atomic_fetch_xordi = 1973,
-  CODE_FOR_atomic_fetch_anddi = 1974,
-  CODE_FOR_atomic_fetch_nandqi = 1975,
-  CODE_FOR_atomic_fetch_nandhi = 1976,
-  CODE_FOR_atomic_fetch_nandsi = 1977,
-  CODE_FOR_atomic_fetch_nanddi = 1978,
-  CODE_FOR_atomic_add_fetchqi = 1979,
-  CODE_FOR_atomic_sub_fetchqi = 1980,
-  CODE_FOR_atomic_or_fetchqi = 1981,
-  CODE_FOR_atomic_xor_fetchqi = 1982,
-  CODE_FOR_atomic_and_fetchqi = 1983,
-  CODE_FOR_atomic_add_fetchhi = 1984,
-  CODE_FOR_atomic_sub_fetchhi = 1985,
-  CODE_FOR_atomic_or_fetchhi = 1986,
-  CODE_FOR_atomic_xor_fetchhi = 1987,
-  CODE_FOR_atomic_and_fetchhi = 1988,
-  CODE_FOR_atomic_add_fetchsi = 1989,
-  CODE_FOR_atomic_sub_fetchsi = 1990,
-  CODE_FOR_atomic_or_fetchsi = 1991,
-  CODE_FOR_atomic_xor_fetchsi = 1992,
-  CODE_FOR_atomic_and_fetchsi = 1993,
-  CODE_FOR_atomic_add_fetchdi = 1994,
-  CODE_FOR_atomic_sub_fetchdi = 1995,
-  CODE_FOR_atomic_or_fetchdi = 1996,
-  CODE_FOR_atomic_xor_fetchdi = 1997,
-  CODE_FOR_atomic_and_fetchdi = 1998,
-  CODE_FOR_atomic_nand_fetchqi = 1999,
-  CODE_FOR_atomic_nand_fetchhi = 2000,
-  CODE_FOR_atomic_nand_fetchsi = 2001,
-  CODE_FOR_atomic_nand_fetchdi = 2002,
-  CODE_FOR_arm_load_exclusiveqi = 2003,
-  CODE_FOR_arm_load_exclusivehi = 2004,
-  CODE_FOR_arm_load_acquire_exclusiveqi = 2005,
-  CODE_FOR_arm_load_acquire_exclusivehi = 2006,
-  CODE_FOR_arm_load_exclusivesi = 2007,
-  CODE_FOR_arm_load_acquire_exclusivesi = 2008,
-  CODE_FOR_arm_load_exclusivedi = 2009,
-  CODE_FOR_arm_load_acquire_exclusivedi = 2010,
-  CODE_FOR_arm_store_exclusiveqi = 2011,
-  CODE_FOR_arm_store_exclusivehi = 2012,
-  CODE_FOR_arm_store_exclusivesi = 2013,
-  CODE_FOR_arm_store_exclusivedi = 2014,
-  CODE_FOR_arm_store_release_exclusivedi = 2015,
-  CODE_FOR_arm_store_release_exclusiveqi = 2016,
-  CODE_FOR_arm_store_release_exclusivehi = 2017,
-  CODE_FOR_arm_store_release_exclusivesi = 2018,
-  CODE_FOR_addqq3 = 2019,
-  CODE_FOR_addhq3 = 2020,
-  CODE_FOR_addsq3 = 2021,
-  CODE_FOR_adduqq3 = 2022,
-  CODE_FOR_adduhq3 = 2023,
-  CODE_FOR_addusq3 = 2024,
-  CODE_FOR_addha3 = 2025,
-  CODE_FOR_addsa3 = 2026,
-  CODE_FOR_adduha3 = 2027,
-  CODE_FOR_addusa3 = 2028,
-  CODE_FOR_addv4qq3 = 2029,
-  CODE_FOR_addv2hq3 = 2030,
-  CODE_FOR_addv2ha3 = 2031,
-  CODE_FOR_usaddv4uqq3 = 2032,
-  CODE_FOR_usaddv2uhq3 = 2033,
-  CODE_FOR_usadduqq3 = 2034,
-  CODE_FOR_usadduhq3 = 2035,
-  CODE_FOR_usaddv2uha3 = 2036,
-  CODE_FOR_usadduha3 = 2037,
-  CODE_FOR_ssaddv4qq3 = 2038,
-  CODE_FOR_ssaddv2hq3 = 2039,
-  CODE_FOR_ssaddqq3 = 2040,
-  CODE_FOR_ssaddhq3 = 2041,
-  CODE_FOR_ssaddv2ha3 = 2042,
-  CODE_FOR_ssaddha3 = 2043,
-  CODE_FOR_ssaddsq3 = 2044,
-  CODE_FOR_ssaddsa3 = 2045,
-  CODE_FOR_subqq3 = 2046,
-  CODE_FOR_subhq3 = 2047,
-  CODE_FOR_subsq3 = 2048,
-  CODE_FOR_subuqq3 = 2049,
-  CODE_FOR_subuhq3 = 2050,
-  CODE_FOR_subusq3 = 2051,
-  CODE_FOR_subha3 = 2052,
-  CODE_FOR_subsa3 = 2053,
-  CODE_FOR_subuha3 = 2054,
-  CODE_FOR_subusa3 = 2055,
-  CODE_FOR_subv4qq3 = 2056,
-  CODE_FOR_subv2hq3 = 2057,
-  CODE_FOR_subv2ha3 = 2058,
-  CODE_FOR_ussubv4uqq3 = 2059,
-  CODE_FOR_ussubv2uhq3 = 2060,
-  CODE_FOR_ussubuqq3 = 2061,
-  CODE_FOR_ussubuhq3 = 2062,
-  CODE_FOR_ussubv2uha3 = 2063,
-  CODE_FOR_ussubuha3 = 2064,
-  CODE_FOR_sssubv4qq3 = 2065,
-  CODE_FOR_sssubv2hq3 = 2066,
-  CODE_FOR_sssubqq3 = 2067,
-  CODE_FOR_sssubhq3 = 2068,
-  CODE_FOR_sssubv2ha3 = 2069,
-  CODE_FOR_sssubha3 = 2070,
-  CODE_FOR_sssubsq3 = 2071,
-  CODE_FOR_sssubsa3 = 2072,
-  CODE_FOR_ssmulsa3 = 2073,
-  CODE_FOR_usmulusa3 = 2074,
-  CODE_FOR_arm_ssatsihi_shift = 2075,
-  CODE_FOR_arm_usatsihi = 2076,
-  CODE_FOR_adddi3 = 2077,
-  CODE_FOR_addsi3 = 2081,
-  CODE_FOR_addsf3 = 2088,
-  CODE_FOR_adddf3 = 2089,
-  CODE_FOR_subdi3 = 2090,
-  CODE_FOR_subsi3 = 2097,
-  CODE_FOR_subsf3 = 2100,
-  CODE_FOR_subdf3 = 2101,
-  CODE_FOR_mulhi3 = 2102,
-  CODE_FOR_mulsi3 = 2103,
-  CODE_FOR_maddsidi4 = 2104,
-  CODE_FOR_mulsidi3 = 2105,
-  CODE_FOR_umulsidi3 = 2106,
-  CODE_FOR_umaddsidi4 = 2107,
-  CODE_FOR_smulsi3_highpart = 2108,
-  CODE_FOR_umulsi3_highpart = 2109,
-  CODE_FOR_mulsf3 = 2110,
-  CODE_FOR_muldf3 = 2111,
-  CODE_FOR_divsf3 = 2112,
-  CODE_FOR_divdf3 = 2113,
-  CODE_FOR_anddi3 = 2118,
-  CODE_FOR_andsi3 = 2121,
-  CODE_FOR_insv = 2131,
-  CODE_FOR_iordi3 = 2135,
-  CODE_FOR_iorsi3 = 2137,
-  CODE_FOR_xordi3 = 2140,
-  CODE_FOR_xorsi3 = 2142,
-  CODE_FOR_smaxsi3 = 2150,
-  CODE_FOR_sminsi3 = 2152,
-  CODE_FOR_umaxsi3 = 2154,
-  CODE_FOR_uminsi3 = 2156,
-  CODE_FOR_ashldi3 = 2159,
-  CODE_FOR_ashlsi3 = 2160,
-  CODE_FOR_ashrdi3 = 2161,
-  CODE_FOR_ashrsi3 = 2162,
-  CODE_FOR_lshrdi3 = 2163,
-  CODE_FOR_lshrsi3 = 2164,
-  CODE_FOR_rotlsi3 = 2165,
-  CODE_FOR_rotrsi3 = 2166,
-  CODE_FOR_extzv = 2167,
-  CODE_FOR_extzv_t1 = 2168,
-  CODE_FOR_extv = 2169,
-  CODE_FOR_extv_regsi = 2170,
-  CODE_FOR_negdi2 = 2173,
-  CODE_FOR_negsi2 = 2175,
-  CODE_FOR_negsf2 = 2176,
-  CODE_FOR_negdf2 = 2177,
-  CODE_FOR_abssi2 = 2181,
-  CODE_FOR_abssf2 = 2186,
-  CODE_FOR_absdf2 = 2187,
-  CODE_FOR_sqrtsf2 = 2188,
-  CODE_FOR_sqrtdf2 = 2189,
-  CODE_FOR_one_cmplsi2 = 2191,
-  CODE_FOR_floatsihf2 = 2192,
-  CODE_FOR_floatdihf2 = 2193,
-  CODE_FOR_floatsisf2 = 2194,
-  CODE_FOR_floatsidf2 = 2195,
-  CODE_FOR_fix_trunchfsi2 = 2196,
-  CODE_FOR_fix_trunchfdi2 = 2197,
-  CODE_FOR_fix_truncsfsi2 = 2198,
-  CODE_FOR_fix_truncdfsi2 = 2199,
-  CODE_FOR_truncdfsf2 = 2200,
-  CODE_FOR_truncdfhf2 = 2201,
-  CODE_FOR_zero_extendhisi2 = 2204,
-  CODE_FOR_zero_extendqisi2 = 2206,
-  CODE_FOR_extendhisi2 = 2212,
-  CODE_FOR_extendhisi2_mem = 2214,
-  CODE_FOR_extendqihi2 = 2216,
-  CODE_FOR_extendqisi2 = 2217,
-  CODE_FOR_extendsfdf2 = 2221,
-  CODE_FOR_extendhfdf2 = 2222,
-  CODE_FOR_movdi = 2223,
-  CODE_FOR_movsi = 2243,
-  CODE_FOR_calculate_pic_address = 2250,
-  CODE_FOR_builtin_setjmp_receiver = 2254,
-  CODE_FOR_storehi = 2255,
-  CODE_FOR_storehi_bigend = 2256,
-  CODE_FOR_storeinthi = 2257,
-  CODE_FOR_storehi_single_op = 2258,
-  CODE_FOR_movhi = 2259,
-  CODE_FOR_movhi_bytes = 2260,
-  CODE_FOR_movhi_bigend = 2261,
-  CODE_FOR_thumb_movhi_clobber = 2262,
-  CODE_FOR_reload_outhi = 2263,
-  CODE_FOR_reload_inhi = 2264,
-  CODE_FOR_movqi = 2265,
-  CODE_FOR_movhf = 2266,
-  CODE_FOR_movsf = 2267,
-  CODE_FOR_movdf = 2269,
-  CODE_FOR_reload_outdf = 2270,
-  CODE_FOR_load_multiple = 2271,
-  CODE_FOR_store_multiple = 2272,
-  CODE_FOR_movmemqi = 2273,
-  CODE_FOR_cbranchsi4 = 2274,
-  CODE_FOR_cbranchqi4 = 2275,
-  CODE_FOR_cbranchsf4 = 2276,
-  CODE_FOR_cbranchdf4 = 2277,
-  CODE_FOR_cbranchdi4 = 2278,
-  CODE_FOR_cbranch_cc = 2281,
-  CODE_FOR_cstore_cc = 2282,
-  CODE_FOR_cstoresi4 = 2286,
-  CODE_FOR_cstoresf4 = 2287,
-  CODE_FOR_cstoredf4 = 2288,
-  CODE_FOR_cstoredi4 = 2289,
-  CODE_FOR_cstoresi_eq0_thumb1 = 2290,
-  CODE_FOR_cstoresi_ne0_thumb1 = 2291,
-  CODE_FOR_movsicc = 2293,
-  CODE_FOR_movsfcc = 2294,
-  CODE_FOR_movdfcc = 2295,
-  CODE_FOR_jump = 2297,
-  CODE_FOR_call = 2298,
-  CODE_FOR_call_internal = 2299,
-  CODE_FOR_call_value = 2300,
-  CODE_FOR_call_value_internal = 2301,
-  CODE_FOR_sibcall = 2302,
-  CODE_FOR_sibcall_value = 2303,
-  CODE_FOR_return = 2304,
-  CODE_FOR_simple_return = 2305,
-  CODE_FOR_return_addr_mask = 2306,
-  CODE_FOR_untyped_call = 2307,
-  CODE_FOR_untyped_return = 2308,
-  CODE_FOR_casesi = 2309,
-  CODE_FOR_thumb1_casesi_internal_pic = 2310,
-  CODE_FOR_indirect_jump = 2311,
-  CODE_FOR_prologue = 2338,
-  CODE_FOR_epilogue = 2339,
-  CODE_FOR_sibcall_epilogue = 2340,
-  CODE_FOR_eh_epilogue = 2341,
-  CODE_FOR_tablejump = 2346,
-  CODE_FOR_ctzsi2 = 2347,
-  CODE_FOR_eh_return = 2348,
-  CODE_FOR_get_thread_pointersi = 2351,
-  CODE_FOR_arm_legacy_rev = 2352,
-  CODE_FOR_thumb_legacy_rev = 2353,
-  CODE_FOR_bswapsi2 = 2354,
-  CODE_FOR_bswaphi2 = 2355,
-  CODE_FOR_movv2di = 2378,
-  CODE_FOR_movv2si = 2379,
-  CODE_FOR_movv4hi = 2380,
-  CODE_FOR_movv8qi = 2381,
-  CODE_FOR_movv2sf = 2382,
-  CODE_FOR_movv4si = 2383,
-  CODE_FOR_movv8hi = 2384,
-  CODE_FOR_movv16qi = 2385,
-  CODE_FOR_movv4sf = 2386,
-  CODE_FOR_addv2di3 = 2387,
-  CODE_FOR_addv2si3 = 2388,
-  CODE_FOR_addv4hi3 = 2389,
-  CODE_FOR_addv8qi3 = 2390,
-  CODE_FOR_addv2sf3 = 2391,
-  CODE_FOR_addv4si3 = 2392,
-  CODE_FOR_addv8hi3 = 2393,
-  CODE_FOR_addv16qi3 = 2394,
-  CODE_FOR_addv4sf3 = 2395,
-  CODE_FOR_subv2di3 = 2396,
-  CODE_FOR_subv2si3 = 2397,
-  CODE_FOR_subv4hi3 = 2398,
-  CODE_FOR_subv8qi3 = 2399,
-  CODE_FOR_subv2sf3 = 2400,
-  CODE_FOR_subv4si3 = 2401,
-  CODE_FOR_subv8hi3 = 2402,
-  CODE_FOR_subv16qi3 = 2403,
-  CODE_FOR_subv4sf3 = 2404,
-  CODE_FOR_mulv2si3 = 2405,
-  CODE_FOR_mulv4hi3 = 2406,
-  CODE_FOR_mulv8qi3 = 2407,
-  CODE_FOR_mulv2sf3 = 2408,
-  CODE_FOR_mulv4si3 = 2409,
-  CODE_FOR_mulv8hi3 = 2410,
-  CODE_FOR_mulv16qi3 = 2411,
-  CODE_FOR_mulv4sf3 = 2412,
-  CODE_FOR_sminv2si3 = 2413,
-  CODE_FOR_sminv4hi3 = 2414,
-  CODE_FOR_sminv8qi3 = 2415,
-  CODE_FOR_sminv2sf3 = 2416,
-  CODE_FOR_sminv4si3 = 2417,
-  CODE_FOR_sminv8hi3 = 2418,
-  CODE_FOR_sminv16qi3 = 2419,
-  CODE_FOR_sminv4sf3 = 2420,
-  CODE_FOR_uminv2si3 = 2421,
-  CODE_FOR_uminv4hi3 = 2422,
-  CODE_FOR_uminv8qi3 = 2423,
-  CODE_FOR_uminv4si3 = 2424,
-  CODE_FOR_uminv8hi3 = 2425,
-  CODE_FOR_uminv16qi3 = 2426,
-  CODE_FOR_smaxv2si3 = 2427,
-  CODE_FOR_smaxv4hi3 = 2428,
-  CODE_FOR_smaxv8qi3 = 2429,
-  CODE_FOR_smaxv2sf3 = 2430,
-  CODE_FOR_smaxv4si3 = 2431,
-  CODE_FOR_smaxv8hi3 = 2432,
-  CODE_FOR_smaxv16qi3 = 2433,
-  CODE_FOR_smaxv4sf3 = 2434,
-  CODE_FOR_umaxv2si3 = 2435,
-  CODE_FOR_umaxv4hi3 = 2436,
-  CODE_FOR_umaxv8qi3 = 2437,
-  CODE_FOR_umaxv4si3 = 2438,
-  CODE_FOR_umaxv8hi3 = 2439,
-  CODE_FOR_umaxv16qi3 = 2440,
-  CODE_FOR_vec_perm_constv2di = 2441,
-  CODE_FOR_vec_perm_constv2si = 2442,
-  CODE_FOR_vec_perm_constv4hi = 2443,
-  CODE_FOR_vec_perm_constv8qi = 2444,
-  CODE_FOR_vec_perm_constv2sf = 2445,
-  CODE_FOR_vec_perm_constv4si = 2446,
-  CODE_FOR_vec_perm_constv8hi = 2447,
-  CODE_FOR_vec_perm_constv16qi = 2448,
-  CODE_FOR_vec_perm_constv4sf = 2449,
-  CODE_FOR_vec_permv8qi = 2450,
-  CODE_FOR_vec_permv16qi = 2451,
-  CODE_FOR_iwmmxt_setwcgr0 = 2452,
-  CODE_FOR_iwmmxt_setwcgr1 = 2453,
-  CODE_FOR_iwmmxt_setwcgr2 = 2454,
-  CODE_FOR_iwmmxt_setwcgr3 = 2455,
-  CODE_FOR_iwmmxt_getwcgr0 = 2456,
-  CODE_FOR_iwmmxt_getwcgr1 = 2457,
-  CODE_FOR_iwmmxt_getwcgr2 = 2458,
-  CODE_FOR_iwmmxt_getwcgr3 = 2459,
-  CODE_FOR_doloop_end = 2487,
-  CODE_FOR_movti = 2488,
-  CODE_FOR_movei = 2489,
-  CODE_FOR_movoi = 2490,
-  CODE_FOR_movci = 2491,
-  CODE_FOR_movxi = 2492,
-  CODE_FOR_movmisalignv8qi = 2497,
-  CODE_FOR_movmisalignv16qi = 2498,
-  CODE_FOR_movmisalignv4hi = 2499,
-  CODE_FOR_movmisalignv8hi = 2500,
-  CODE_FOR_movmisalignv2si = 2501,
-  CODE_FOR_movmisalignv4si = 2502,
-  CODE_FOR_movmisalignv2sf = 2503,
-  CODE_FOR_movmisalignv4sf = 2504,
-  CODE_FOR_movmisaligndi = 2505,
-  CODE_FOR_movmisalignv2di = 2506,
-  CODE_FOR_vec_setv8qi = 2507,
-  CODE_FOR_vec_setv16qi = 2508,
-  CODE_FOR_vec_setv4hi = 2509,
-  CODE_FOR_vec_setv8hi = 2510,
-  CODE_FOR_vec_setv2si = 2511,
-  CODE_FOR_vec_setv4si = 2512,
-  CODE_FOR_vec_setv2sf = 2513,
-  CODE_FOR_vec_setv4sf = 2514,
-  CODE_FOR_vec_setv2di = 2515,
-  CODE_FOR_vec_initv8qi = 2516,
-  CODE_FOR_vec_initv16qi = 2517,
-  CODE_FOR_vec_initv4hi = 2518,
-  CODE_FOR_vec_initv8hi = 2519,
-  CODE_FOR_vec_initv2si = 2520,
-  CODE_FOR_vec_initv4si = 2521,
-  CODE_FOR_vec_initv2sf = 2522,
-  CODE_FOR_vec_initv4sf = 2523,
-  CODE_FOR_vec_initv2di = 2524,
-  CODE_FOR_vashrv8qi3 = 2528,
-  CODE_FOR_vashrv16qi3 = 2529,
-  CODE_FOR_vashrv4hi3 = 2530,
-  CODE_FOR_vashrv8hi3 = 2531,
-  CODE_FOR_vashrv2si3 = 2532,
-  CODE_FOR_vashrv4si3 = 2533,
-  CODE_FOR_vlshrv8qi3 = 2534,
-  CODE_FOR_vlshrv16qi3 = 2535,
-  CODE_FOR_vlshrv4hi3 = 2536,
-  CODE_FOR_vlshrv8hi3 = 2537,
-  CODE_FOR_vlshrv2si3 = 2538,
-  CODE_FOR_vlshrv4si3 = 2539,
-  CODE_FOR_vec_shr_v8qi = 2543,
-  CODE_FOR_vec_shr_v16qi = 2544,
-  CODE_FOR_vec_shr_v4hi = 2545,
-  CODE_FOR_vec_shr_v8hi = 2546,
-  CODE_FOR_vec_shr_v2si = 2547,
-  CODE_FOR_vec_shr_v4si = 2548,
-  CODE_FOR_vec_shr_v2sf = 2549,
-  CODE_FOR_vec_shr_v4sf = 2550,
-  CODE_FOR_vec_shr_v2di = 2551,
-  CODE_FOR_vec_shl_v8qi = 2552,
-  CODE_FOR_vec_shl_v16qi = 2553,
-  CODE_FOR_vec_shl_v4hi = 2554,
-  CODE_FOR_vec_shl_v8hi = 2555,
-  CODE_FOR_vec_shl_v2si = 2556,
-  CODE_FOR_vec_shl_v4si = 2557,
-  CODE_FOR_vec_shl_v2sf = 2558,
-  CODE_FOR_vec_shl_v4sf = 2559,
-  CODE_FOR_vec_shl_v2di = 2560,
-  CODE_FOR_move_hi_quad_v2di = 2561,
-  CODE_FOR_move_hi_quad_v2df = 2562,
-  CODE_FOR_move_hi_quad_v16qi = 2563,
-  CODE_FOR_move_hi_quad_v8hi = 2564,
-  CODE_FOR_move_hi_quad_v4si = 2565,
-  CODE_FOR_move_hi_quad_v4sf = 2566,
-  CODE_FOR_move_lo_quad_v2di = 2567,
-  CODE_FOR_move_lo_quad_v2df = 2568,
-  CODE_FOR_move_lo_quad_v16qi = 2569,
-  CODE_FOR_move_lo_quad_v8hi = 2570,
-  CODE_FOR_move_lo_quad_v4si = 2571,
-  CODE_FOR_move_lo_quad_v4sf = 2572,
-  CODE_FOR_reduc_splus_v8qi = 2573,
-  CODE_FOR_reduc_splus_v4hi = 2574,
-  CODE_FOR_reduc_splus_v2si = 2575,
-  CODE_FOR_reduc_splus_v2sf = 2576,
-  CODE_FOR_reduc_splus_v16qi = 2577,
-  CODE_FOR_reduc_splus_v8hi = 2578,
-  CODE_FOR_reduc_splus_v4si = 2579,
-  CODE_FOR_reduc_splus_v4sf = 2580,
-  CODE_FOR_reduc_uplus_v8qi = 2581,
-  CODE_FOR_reduc_uplus_v16qi = 2582,
-  CODE_FOR_reduc_uplus_v4hi = 2583,
-  CODE_FOR_reduc_uplus_v8hi = 2584,
-  CODE_FOR_reduc_uplus_v2si = 2585,
-  CODE_FOR_reduc_uplus_v4si = 2586,
-  CODE_FOR_reduc_uplus_v2di = 2587,
-  CODE_FOR_reduc_smin_v8qi = 2588,
-  CODE_FOR_reduc_smin_v4hi = 2589,
-  CODE_FOR_reduc_smin_v2si = 2590,
-  CODE_FOR_reduc_smin_v2sf = 2591,
-  CODE_FOR_reduc_smin_v16qi = 2592,
-  CODE_FOR_reduc_smin_v8hi = 2593,
-  CODE_FOR_reduc_smin_v4si = 2594,
-  CODE_FOR_reduc_smin_v4sf = 2595,
-  CODE_FOR_reduc_smax_v8qi = 2596,
-  CODE_FOR_reduc_smax_v4hi = 2597,
-  CODE_FOR_reduc_smax_v2si = 2598,
-  CODE_FOR_reduc_smax_v2sf = 2599,
-  CODE_FOR_reduc_smax_v16qi = 2600,
-  CODE_FOR_reduc_smax_v8hi = 2601,
-  CODE_FOR_reduc_smax_v4si = 2602,
-  CODE_FOR_reduc_smax_v4sf = 2603,
-  CODE_FOR_reduc_umin_v8qi = 2604,
-  CODE_FOR_reduc_umin_v4hi = 2605,
-  CODE_FOR_reduc_umin_v2si = 2606,
-  CODE_FOR_reduc_umin_v16qi = 2607,
-  CODE_FOR_reduc_umin_v8hi = 2608,
-  CODE_FOR_reduc_umin_v4si = 2609,
-  CODE_FOR_reduc_umax_v8qi = 2610,
-  CODE_FOR_reduc_umax_v4hi = 2611,
-  CODE_FOR_reduc_umax_v2si = 2612,
-  CODE_FOR_reduc_umax_v16qi = 2613,
-  CODE_FOR_reduc_umax_v8hi = 2614,
-  CODE_FOR_reduc_umax_v4si = 2615,
-  CODE_FOR_vcondv8qiv8qi = 2616,
-  CODE_FOR_vcondv16qiv16qi = 2617,
-  CODE_FOR_vcondv4hiv4hi = 2618,
-  CODE_FOR_vcondv8hiv8hi = 2619,
-  CODE_FOR_vcondv2siv2si = 2620,
-  CODE_FOR_vcondv4siv4si = 2621,
-  CODE_FOR_vcondv2sfv2sf = 2622,
-  CODE_FOR_vcondv4sfv4sf = 2623,
-  CODE_FOR_vconduv8qiv8qi = 2624,
-  CODE_FOR_vconduv16qiv16qi = 2625,
-  CODE_FOR_vconduv4hiv4hi = 2626,
-  CODE_FOR_vconduv8hiv8hi = 2627,
-  CODE_FOR_vconduv2siv2si = 2628,
-  CODE_FOR_vconduv4siv4si = 2629,
-  CODE_FOR_neon_vaddv8qi = 2630,
-  CODE_FOR_neon_vaddv16qi = 2631,
-  CODE_FOR_neon_vaddv4hi = 2632,
-  CODE_FOR_neon_vaddv8hi = 2633,
-  CODE_FOR_neon_vaddv2si = 2634,
-  CODE_FOR_neon_vaddv4si = 2635,
-  CODE_FOR_neon_vaddv2sf = 2636,
-  CODE_FOR_neon_vaddv4sf = 2637,
-  CODE_FOR_neon_vadddi = 2638,
-  CODE_FOR_neon_vaddv2di = 2639,
-  CODE_FOR_neon_vmlav8qi = 2640,
-  CODE_FOR_neon_vmlav16qi = 2641,
-  CODE_FOR_neon_vmlav4hi = 2642,
-  CODE_FOR_neon_vmlav8hi = 2643,
-  CODE_FOR_neon_vmlav2si = 2644,
-  CODE_FOR_neon_vmlav4si = 2645,
-  CODE_FOR_neon_vmlav2sf = 2646,
-  CODE_FOR_neon_vmlav4sf = 2647,
-  CODE_FOR_neon_vfmav2sf = 2648,
-  CODE_FOR_neon_vfmav4sf = 2649,
-  CODE_FOR_neon_vfmsv2sf = 2650,
-  CODE_FOR_neon_vfmsv4sf = 2651,
-  CODE_FOR_neon_vmlsv8qi = 2652,
-  CODE_FOR_neon_vmlsv16qi = 2653,
-  CODE_FOR_neon_vmlsv4hi = 2654,
-  CODE_FOR_neon_vmlsv8hi = 2655,
-  CODE_FOR_neon_vmlsv2si = 2656,
-  CODE_FOR_neon_vmlsv4si = 2657,
-  CODE_FOR_neon_vmlsv2sf = 2658,
-  CODE_FOR_neon_vmlsv4sf = 2659,
-  CODE_FOR_neon_vsubv8qi = 2660,
-  CODE_FOR_neon_vsubv16qi = 2661,
-  CODE_FOR_neon_vsubv4hi = 2662,
-  CODE_FOR_neon_vsubv8hi = 2663,
-  CODE_FOR_neon_vsubv2si = 2664,
-  CODE_FOR_neon_vsubv4si = 2665,
-  CODE_FOR_neon_vsubv2sf = 2666,
-  CODE_FOR_neon_vsubv4sf = 2667,
-  CODE_FOR_neon_vsubdi = 2668,
-  CODE_FOR_neon_vsubv2di = 2669,
-  CODE_FOR_neon_vpaddv8qi = 2670,
-  CODE_FOR_neon_vpaddv4hi = 2671,
-  CODE_FOR_neon_vpaddv2si = 2672,
-  CODE_FOR_neon_vpaddv2sf = 2673,
-  CODE_FOR_neon_vabsv8qi = 2674,
-  CODE_FOR_neon_vabsv16qi = 2675,
-  CODE_FOR_neon_vabsv4hi = 2676,
-  CODE_FOR_neon_vabsv8hi = 2677,
-  CODE_FOR_neon_vabsv2si = 2678,
-  CODE_FOR_neon_vabsv4si = 2679,
-  CODE_FOR_neon_vabsv2sf = 2680,
-  CODE_FOR_neon_vabsv4sf = 2681,
-  CODE_FOR_neon_vnegv8qi = 2682,
-  CODE_FOR_neon_vnegv16qi = 2683,
-  CODE_FOR_neon_vnegv4hi = 2684,
-  CODE_FOR_neon_vnegv8hi = 2685,
-  CODE_FOR_neon_vnegv2si = 2686,
-  CODE_FOR_neon_vnegv4si = 2687,
-  CODE_FOR_neon_vnegv2sf = 2688,
-  CODE_FOR_neon_vnegv4sf = 2689,
-  CODE_FOR_neon_vclzv8qi = 2690,
-  CODE_FOR_neon_vclzv16qi = 2691,
-  CODE_FOR_neon_vclzv4hi = 2692,
-  CODE_FOR_neon_vclzv8hi = 2693,
-  CODE_FOR_neon_vclzv2si = 2694,
-  CODE_FOR_neon_vclzv4si = 2695,
-  CODE_FOR_neon_vcntv8qi = 2696,
-  CODE_FOR_neon_vcntv16qi = 2697,
-  CODE_FOR_neon_vmvnv8qi = 2698,
-  CODE_FOR_neon_vmvnv16qi = 2699,
-  CODE_FOR_neon_vmvnv4hi = 2700,
-  CODE_FOR_neon_vmvnv8hi = 2701,
-  CODE_FOR_neon_vmvnv2si = 2702,
-  CODE_FOR_neon_vmvnv4si = 2703,
-  CODE_FOR_neon_vget_lanev8qi = 2704,
-  CODE_FOR_neon_vget_lanev16qi = 2705,
-  CODE_FOR_neon_vget_lanev4hi = 2706,
-  CODE_FOR_neon_vget_lanev8hi = 2707,
-  CODE_FOR_neon_vget_lanev2si = 2708,
-  CODE_FOR_neon_vget_lanev4si = 2709,
-  CODE_FOR_neon_vget_lanev2sf = 2710,
-  CODE_FOR_neon_vget_lanev4sf = 2711,
-  CODE_FOR_neon_vget_lanedi = 2712,
-  CODE_FOR_neon_vget_lanev2di = 2713,
-  CODE_FOR_neon_vset_lanev8qi = 2714,
-  CODE_FOR_neon_vset_lanev16qi = 2715,
-  CODE_FOR_neon_vset_lanev4hi = 2716,
-  CODE_FOR_neon_vset_lanev8hi = 2717,
-  CODE_FOR_neon_vset_lanev2si = 2718,
-  CODE_FOR_neon_vset_lanev4si = 2719,
-  CODE_FOR_neon_vset_lanev2sf = 2720,
-  CODE_FOR_neon_vset_lanev4sf = 2721,
-  CODE_FOR_neon_vset_lanev2di = 2722,
-  CODE_FOR_neon_vset_lanedi = 2723,
-  CODE_FOR_neon_vcreatev8qi = 2724,
-  CODE_FOR_neon_vcreatev4hi = 2725,
-  CODE_FOR_neon_vcreatev2si = 2726,
-  CODE_FOR_neon_vcreatev2sf = 2727,
-  CODE_FOR_neon_vcreatedi = 2728,
-  CODE_FOR_neon_vdup_ndi = 2729,
-  CODE_FOR_neon_vdup_lanev8qi = 2730,
-  CODE_FOR_neon_vdup_lanev16qi = 2731,
-  CODE_FOR_neon_vdup_lanev4hi = 2732,
-  CODE_FOR_neon_vdup_lanev8hi = 2733,
-  CODE_FOR_neon_vdup_lanev2si = 2734,
-  CODE_FOR_neon_vdup_lanev4si = 2735,
-  CODE_FOR_neon_vdup_lanev2sf = 2736,
-  CODE_FOR_neon_vdup_lanev4sf = 2737,
-  CODE_FOR_neon_vdup_lanedi = 2738,
-  CODE_FOR_neon_vdup_lanev2di = 2739,
-  CODE_FOR_neon_vget_highv16qi = 2745,
-  CODE_FOR_neon_vget_highv8hi = 2746,
-  CODE_FOR_neon_vget_highv4si = 2747,
-  CODE_FOR_neon_vget_highv4sf = 2748,
-  CODE_FOR_neon_vget_highv2di = 2749,
-  CODE_FOR_neon_vget_lowv16qi = 2750,
-  CODE_FOR_neon_vget_lowv8hi = 2751,
-  CODE_FOR_neon_vget_lowv4si = 2752,
-  CODE_FOR_neon_vget_lowv4sf = 2753,
-  CODE_FOR_neon_vget_lowv2di = 2754,
-  CODE_FOR_neon_vmul_nv4hi = 2755,
-  CODE_FOR_neon_vmul_nv2si = 2756,
-  CODE_FOR_neon_vmul_nv2sf = 2757,
-  CODE_FOR_neon_vmul_nv8hi = 2758,
-  CODE_FOR_neon_vmul_nv4si = 2759,
-  CODE_FOR_neon_vmul_nv4sf = 2760,
-  CODE_FOR_neon_vmull_nv4hi = 2761,
-  CODE_FOR_neon_vmull_nv2si = 2762,
-  CODE_FOR_neon_vqdmull_nv4hi = 2763,
-  CODE_FOR_neon_vqdmull_nv2si = 2764,
-  CODE_FOR_neon_vqdmulh_nv4hi = 2765,
-  CODE_FOR_neon_vqdmulh_nv2si = 2766,
-  CODE_FOR_neon_vqdmulh_nv8hi = 2767,
-  CODE_FOR_neon_vqdmulh_nv4si = 2768,
-  CODE_FOR_neon_vmla_nv4hi = 2769,
-  CODE_FOR_neon_vmla_nv2si = 2770,
-  CODE_FOR_neon_vmla_nv2sf = 2771,
-  CODE_FOR_neon_vmla_nv8hi = 2772,
-  CODE_FOR_neon_vmla_nv4si = 2773,
-  CODE_FOR_neon_vmla_nv4sf = 2774,
-  CODE_FOR_neon_vmlal_nv4hi = 2775,
-  CODE_FOR_neon_vmlal_nv2si = 2776,
-  CODE_FOR_neon_vqdmlal_nv4hi = 2777,
-  CODE_FOR_neon_vqdmlal_nv2si = 2778,
-  CODE_FOR_neon_vmls_nv4hi = 2779,
-  CODE_FOR_neon_vmls_nv2si = 2780,
-  CODE_FOR_neon_vmls_nv2sf = 2781,
-  CODE_FOR_neon_vmls_nv8hi = 2782,
-  CODE_FOR_neon_vmls_nv4si = 2783,
-  CODE_FOR_neon_vmls_nv4sf = 2784,
-  CODE_FOR_neon_vmlsl_nv4hi = 2785,
-  CODE_FOR_neon_vmlsl_nv2si = 2786,
-  CODE_FOR_neon_vqdmlsl_nv4hi = 2787,
-  CODE_FOR_neon_vqdmlsl_nv2si = 2788,
-  CODE_FOR_neon_vbslv8qi = 2789,
-  CODE_FOR_neon_vbslv16qi = 2790,
-  CODE_FOR_neon_vbslv4hi = 2791,
-  CODE_FOR_neon_vbslv8hi = 2792,
-  CODE_FOR_neon_vbslv2si = 2793,
-  CODE_FOR_neon_vbslv4si = 2794,
-  CODE_FOR_neon_vbslv2sf = 2795,
-  CODE_FOR_neon_vbslv4sf = 2796,
-  CODE_FOR_neon_vbsldi = 2797,
-  CODE_FOR_neon_vbslv2di = 2798,
-  CODE_FOR_neon_vtrnv8qi_internal = 2802,
-  CODE_FOR_neon_vtrnv16qi_internal = 2803,
-  CODE_FOR_neon_vtrnv4hi_internal = 2804,
-  CODE_FOR_neon_vtrnv8hi_internal = 2805,
-  CODE_FOR_neon_vtrnv2si_internal = 2806,
-  CODE_FOR_neon_vtrnv4si_internal = 2807,
-  CODE_FOR_neon_vtrnv2sf_internal = 2808,
-  CODE_FOR_neon_vtrnv4sf_internal = 2809,
-  CODE_FOR_neon_vtrnv8qi = 2810,
-  CODE_FOR_neon_vtrnv16qi = 2811,
-  CODE_FOR_neon_vtrnv4hi = 2812,
-  CODE_FOR_neon_vtrnv8hi = 2813,
-  CODE_FOR_neon_vtrnv2si = 2814,
-  CODE_FOR_neon_vtrnv4si = 2815,
-  CODE_FOR_neon_vtrnv2sf = 2816,
-  CODE_FOR_neon_vtrnv4sf = 2817,
-  CODE_FOR_neon_vzipv8qi_internal = 2818,
-  CODE_FOR_neon_vzipv16qi_internal = 2819,
-  CODE_FOR_neon_vzipv4hi_internal = 2820,
-  CODE_FOR_neon_vzipv8hi_internal = 2821,
-  CODE_FOR_neon_vzipv2si_internal = 2822,
-  CODE_FOR_neon_vzipv4si_internal = 2823,
-  CODE_FOR_neon_vzipv2sf_internal = 2824,
-  CODE_FOR_neon_vzipv4sf_internal = 2825,
-  CODE_FOR_neon_vzipv8qi = 2826,
-  CODE_FOR_neon_vzipv16qi = 2827,
-  CODE_FOR_neon_vzipv4hi = 2828,
-  CODE_FOR_neon_vzipv8hi = 2829,
-  CODE_FOR_neon_vzipv2si = 2830,
-  CODE_FOR_neon_vzipv4si = 2831,
-  CODE_FOR_neon_vzipv2sf = 2832,
-  CODE_FOR_neon_vzipv4sf = 2833,
-  CODE_FOR_neon_vuzpv8qi_internal = 2834,
-  CODE_FOR_neon_vuzpv16qi_internal = 2835,
-  CODE_FOR_neon_vuzpv4hi_internal = 2836,
-  CODE_FOR_neon_vuzpv8hi_internal = 2837,
-  CODE_FOR_neon_vuzpv2si_internal = 2838,
-  CODE_FOR_neon_vuzpv4si_internal = 2839,
-  CODE_FOR_neon_vuzpv2sf_internal = 2840,
-  CODE_FOR_neon_vuzpv4sf_internal = 2841,
-  CODE_FOR_neon_vuzpv8qi = 2842,
-  CODE_FOR_neon_vuzpv16qi = 2843,
-  CODE_FOR_neon_vuzpv4hi = 2844,
-  CODE_FOR_neon_vuzpv8hi = 2845,
-  CODE_FOR_neon_vuzpv2si = 2846,
-  CODE_FOR_neon_vuzpv4si = 2847,
-  CODE_FOR_neon_vuzpv2sf = 2848,
-  CODE_FOR_neon_vuzpv4sf = 2849,
-  CODE_FOR_neon_vreinterpretv8qiv8qi = 2850,
-  CODE_FOR_neon_vreinterpretv8qiv4hi = 2851,
-  CODE_FOR_neon_vreinterpretv8qiv2si = 2852,
-  CODE_FOR_neon_vreinterpretv8qiv2sf = 2853,
-  CODE_FOR_neon_vreinterpretv8qidi = 2854,
-  CODE_FOR_neon_vreinterpretv4hiv8qi = 2855,
-  CODE_FOR_neon_vreinterpretv4hiv4hi = 2856,
-  CODE_FOR_neon_vreinterpretv4hiv2si = 2857,
-  CODE_FOR_neon_vreinterpretv4hiv2sf = 2858,
-  CODE_FOR_neon_vreinterpretv4hidi = 2859,
-  CODE_FOR_neon_vreinterpretv2siv8qi = 2860,
-  CODE_FOR_neon_vreinterpretv2siv4hi = 2861,
-  CODE_FOR_neon_vreinterpretv2siv2si = 2862,
-  CODE_FOR_neon_vreinterpretv2siv2sf = 2863,
-  CODE_FOR_neon_vreinterpretv2sidi = 2864,
-  CODE_FOR_neon_vreinterpretv2sfv8qi = 2865,
-  CODE_FOR_neon_vreinterpretv2sfv4hi = 2866,
-  CODE_FOR_neon_vreinterpretv2sfv2si = 2867,
-  CODE_FOR_neon_vreinterpretv2sfv2sf = 2868,
-  CODE_FOR_neon_vreinterpretv2sfdi = 2869,
-  CODE_FOR_neon_vreinterpretdiv8qi = 2870,
-  CODE_FOR_neon_vreinterpretdiv4hi = 2871,
-  CODE_FOR_neon_vreinterpretdiv2si = 2872,
-  CODE_FOR_neon_vreinterpretdiv2sf = 2873,
-  CODE_FOR_neon_vreinterpretdidi = 2874,
-  CODE_FOR_neon_vreinterprettiv16qi = 2875,
-  CODE_FOR_neon_vreinterprettiv8hi = 2876,
-  CODE_FOR_neon_vreinterprettiv4si = 2877,
-  CODE_FOR_neon_vreinterprettiv4sf = 2878,
-  CODE_FOR_neon_vreinterprettiv2di = 2879,
-  CODE_FOR_neon_vreinterprettiti = 2880,
-  CODE_FOR_neon_vreinterpretv16qiv16qi = 2881,
-  CODE_FOR_neon_vreinterpretv16qiv8hi = 2882,
-  CODE_FOR_neon_vreinterpretv16qiv4si = 2883,
-  CODE_FOR_neon_vreinterpretv16qiv4sf = 2884,
-  CODE_FOR_neon_vreinterpretv16qiv2di = 2885,
-  CODE_FOR_neon_vreinterpretv16qiti = 2886,
-  CODE_FOR_neon_vreinterpretv8hiv16qi = 2887,
-  CODE_FOR_neon_vreinterpretv8hiv8hi = 2888,
-  CODE_FOR_neon_vreinterpretv8hiv4si = 2889,
-  CODE_FOR_neon_vreinterpretv8hiv4sf = 2890,
-  CODE_FOR_neon_vreinterpretv8hiv2di = 2891,
-  CODE_FOR_neon_vreinterpretv8hiti = 2892,
-  CODE_FOR_neon_vreinterpretv4siv16qi = 2893,
-  CODE_FOR_neon_vreinterpretv4siv8hi = 2894,
-  CODE_FOR_neon_vreinterpretv4siv4si = 2895,
-  CODE_FOR_neon_vreinterpretv4siv4sf = 2896,
-  CODE_FOR_neon_vreinterpretv4siv2di = 2897,
-  CODE_FOR_neon_vreinterpretv4siti = 2898,
-  CODE_FOR_neon_vreinterpretv4sfv16qi = 2899,
-  CODE_FOR_neon_vreinterpretv4sfv8hi = 2900,
-  CODE_FOR_neon_vreinterpretv4sfv4si = 2901,
-  CODE_FOR_neon_vreinterpretv4sfv4sf = 2902,
-  CODE_FOR_neon_vreinterpretv4sfv2di = 2903,
-  CODE_FOR_neon_vreinterpretv4sfti = 2904,
-  CODE_FOR_neon_vreinterpretv2div16qi = 2905,
-  CODE_FOR_neon_vreinterpretv2div8hi = 2906,
-  CODE_FOR_neon_vreinterpretv2div4si = 2907,
-  CODE_FOR_neon_vreinterpretv2div4sf = 2908,
-  CODE_FOR_neon_vreinterpretv2div2di = 2909,
-  CODE_FOR_neon_vreinterpretv2diti = 2910,
-  CODE_FOR_vec_load_lanesv8qiv8qi = 2911,
-  CODE_FOR_vec_load_lanesv16qiv16qi = 2912,
-  CODE_FOR_vec_load_lanesv4hiv4hi = 2913,
-  CODE_FOR_vec_load_lanesv8hiv8hi = 2914,
-  CODE_FOR_vec_load_lanesv2siv2si = 2915,
-  CODE_FOR_vec_load_lanesv4siv4si = 2916,
-  CODE_FOR_vec_load_lanesv2sfv2sf = 2917,
-  CODE_FOR_vec_load_lanesv4sfv4sf = 2918,
-  CODE_FOR_vec_load_lanesdidi = 2919,
-  CODE_FOR_vec_load_lanesv2div2di = 2920,
-  CODE_FOR_neon_vld1_dupdi = 2921,
-  CODE_FOR_vec_store_lanesv8qiv8qi = 2923,
-  CODE_FOR_vec_store_lanesv16qiv16qi = 2924,
-  CODE_FOR_vec_store_lanesv4hiv4hi = 2925,
-  CODE_FOR_vec_store_lanesv8hiv8hi = 2926,
-  CODE_FOR_vec_store_lanesv2siv2si = 2927,
-  CODE_FOR_vec_store_lanesv4siv4si = 2928,
-  CODE_FOR_vec_store_lanesv2sfv2sf = 2929,
-  CODE_FOR_vec_store_lanesv4sfv4sf = 2930,
-  CODE_FOR_vec_store_lanesdidi = 2931,
-  CODE_FOR_vec_store_lanesv2div2di = 2932,
-  CODE_FOR_vec_load_lanestiv8qi = 2933,
-  CODE_FOR_vec_load_lanestiv4hi = 2934,
-  CODE_FOR_vec_load_lanestiv2si = 2935,
-  CODE_FOR_vec_load_lanestiv2sf = 2936,
-  CODE_FOR_vec_load_lanestidi = 2937,
-  CODE_FOR_vec_load_lanesoiv16qi = 2938,
-  CODE_FOR_vec_load_lanesoiv8hi = 2939,
-  CODE_FOR_vec_load_lanesoiv4si = 2940,
-  CODE_FOR_vec_load_lanesoiv4sf = 2941,
-  CODE_FOR_vec_store_lanestiv8qi = 2942,
-  CODE_FOR_vec_store_lanestiv4hi = 2943,
-  CODE_FOR_vec_store_lanestiv2si = 2944,
-  CODE_FOR_vec_store_lanestiv2sf = 2945,
-  CODE_FOR_vec_store_lanestidi = 2946,
-  CODE_FOR_vec_store_lanesoiv16qi = 2947,
-  CODE_FOR_vec_store_lanesoiv8hi = 2948,
-  CODE_FOR_vec_store_lanesoiv4si = 2949,
-  CODE_FOR_vec_store_lanesoiv4sf = 2950,
-  CODE_FOR_vec_load_laneseiv8qi = 2951,
-  CODE_FOR_vec_load_laneseiv4hi = 2952,
-  CODE_FOR_vec_load_laneseiv2si = 2953,
-  CODE_FOR_vec_load_laneseiv2sf = 2954,
-  CODE_FOR_vec_load_laneseidi = 2955,
-  CODE_FOR_vec_load_lanesciv16qi = 2956,
-  CODE_FOR_vec_load_lanesciv8hi = 2957,
-  CODE_FOR_vec_load_lanesciv4si = 2958,
-  CODE_FOR_vec_load_lanesciv4sf = 2959,
-  CODE_FOR_neon_vld3v16qi = 2960,
-  CODE_FOR_neon_vld3v8hi = 2961,
-  CODE_FOR_neon_vld3v4si = 2962,
-  CODE_FOR_neon_vld3v4sf = 2963,
-  CODE_FOR_vec_store_laneseiv8qi = 2964,
-  CODE_FOR_vec_store_laneseiv4hi = 2965,
-  CODE_FOR_vec_store_laneseiv2si = 2966,
-  CODE_FOR_vec_store_laneseiv2sf = 2967,
-  CODE_FOR_vec_store_laneseidi = 2968,
-  CODE_FOR_vec_store_lanesciv16qi = 2969,
-  CODE_FOR_vec_store_lanesciv8hi = 2970,
-  CODE_FOR_vec_store_lanesciv4si = 2971,
-  CODE_FOR_vec_store_lanesciv4sf = 2972,
-  CODE_FOR_neon_vst3v16qi = 2973,
-  CODE_FOR_neon_vst3v8hi = 2974,
-  CODE_FOR_neon_vst3v4si = 2975,
-  CODE_FOR_neon_vst3v4sf = 2976,
-  CODE_FOR_vec_load_lanesoiv8qi = 2977,
-  CODE_FOR_vec_load_lanesoiv4hi = 2978,
-  CODE_FOR_vec_load_lanesoiv2si = 2979,
-  CODE_FOR_vec_load_lanesoiv2sf = 2980,
-  CODE_FOR_vec_load_lanesoidi = 2981,
-  CODE_FOR_vec_load_lanesxiv16qi = 2982,
-  CODE_FOR_vec_load_lanesxiv8hi = 2983,
-  CODE_FOR_vec_load_lanesxiv4si = 2984,
-  CODE_FOR_vec_load_lanesxiv4sf = 2985,
-  CODE_FOR_neon_vld4v16qi = 2986,
-  CODE_FOR_neon_vld4v8hi = 2987,
-  CODE_FOR_neon_vld4v4si = 2988,
-  CODE_FOR_neon_vld4v4sf = 2989,
-  CODE_FOR_vec_store_lanesoiv8qi = 2990,
-  CODE_FOR_vec_store_lanesoiv4hi = 2991,
-  CODE_FOR_vec_store_lanesoiv2si = 2992,
-  CODE_FOR_vec_store_lanesoiv2sf = 2993,
-  CODE_FOR_vec_store_lanesoidi = 2994,
-  CODE_FOR_vec_store_lanesxiv16qi = 2995,
-  CODE_FOR_vec_store_lanesxiv8hi = 2996,
-  CODE_FOR_vec_store_lanesxiv4si = 2997,
-  CODE_FOR_vec_store_lanesxiv4sf = 2998,
-  CODE_FOR_neon_vst4v16qi = 2999,
-  CODE_FOR_neon_vst4v8hi = 3000,
-  CODE_FOR_neon_vst4v4si = 3001,
-  CODE_FOR_neon_vst4v4sf = 3002,
-  CODE_FOR_neon_vandv8qi = 3003,
-  CODE_FOR_neon_vandv16qi = 3004,
-  CODE_FOR_neon_vandv4hi = 3005,
-  CODE_FOR_neon_vandv8hi = 3006,
-  CODE_FOR_neon_vandv2si = 3007,
-  CODE_FOR_neon_vandv4si = 3008,
-  CODE_FOR_neon_vandv2sf = 3009,
-  CODE_FOR_neon_vandv4sf = 3010,
-  CODE_FOR_neon_vanddi = 3011,
-  CODE_FOR_neon_vandv2di = 3012,
-  CODE_FOR_neon_vorrv8qi = 3013,
-  CODE_FOR_neon_vorrv16qi = 3014,
-  CODE_FOR_neon_vorrv4hi = 3015,
-  CODE_FOR_neon_vorrv8hi = 3016,
-  CODE_FOR_neon_vorrv2si = 3017,
-  CODE_FOR_neon_vorrv4si = 3018,
-  CODE_FOR_neon_vorrv2sf = 3019,
-  CODE_FOR_neon_vorrv4sf = 3020,
-  CODE_FOR_neon_vorrdi = 3021,
-  CODE_FOR_neon_vorrv2di = 3022,
-  CODE_FOR_neon_veorv8qi = 3023,
-  CODE_FOR_neon_veorv16qi = 3024,
-  CODE_FOR_neon_veorv4hi = 3025,
-  CODE_FOR_neon_veorv8hi = 3026,
-  CODE_FOR_neon_veorv2si = 3027,
-  CODE_FOR_neon_veorv4si = 3028,
-  CODE_FOR_neon_veorv2sf = 3029,
-  CODE_FOR_neon_veorv4sf = 3030,
-  CODE_FOR_neon_veordi = 3031,
-  CODE_FOR_neon_veorv2di = 3032,
-  CODE_FOR_neon_vbicv8qi = 3033,
-  CODE_FOR_neon_vbicv16qi = 3034,
-  CODE_FOR_neon_vbicv4hi = 3035,
-  CODE_FOR_neon_vbicv8hi = 3036,
-  CODE_FOR_neon_vbicv2si = 3037,
-  CODE_FOR_neon_vbicv4si = 3038,
-  CODE_FOR_neon_vbicv2sf = 3039,
-  CODE_FOR_neon_vbicv4sf = 3040,
-  CODE_FOR_neon_vbicdi = 3041,
-  CODE_FOR_neon_vbicv2di = 3042,
-  CODE_FOR_neon_vornv8qi = 3043,
-  CODE_FOR_neon_vornv16qi = 3044,
-  CODE_FOR_neon_vornv4hi = 3045,
-  CODE_FOR_neon_vornv8hi = 3046,
-  CODE_FOR_neon_vornv2si = 3047,
-  CODE_FOR_neon_vornv4si = 3048,
-  CODE_FOR_neon_vornv2sf = 3049,
-  CODE_FOR_neon_vornv4sf = 3050,
-  CODE_FOR_neon_vorndi = 3051,
-  CODE_FOR_neon_vornv2di = 3052,
-  CODE_FOR_vec_unpacks_hi_v16qi = 3053,
-  CODE_FOR_vec_unpacku_hi_v16qi = 3054,
-  CODE_FOR_vec_unpacks_hi_v8hi = 3055,
-  CODE_FOR_vec_unpacku_hi_v8hi = 3056,
-  CODE_FOR_vec_unpacks_hi_v4si = 3057,
-  CODE_FOR_vec_unpacku_hi_v4si = 3058,
-  CODE_FOR_vec_unpacks_lo_v16qi = 3059,
-  CODE_FOR_vec_unpacku_lo_v16qi = 3060,
-  CODE_FOR_vec_unpacks_lo_v8hi = 3061,
-  CODE_FOR_vec_unpacku_lo_v8hi = 3062,
-  CODE_FOR_vec_unpacks_lo_v4si = 3063,
-  CODE_FOR_vec_unpacku_lo_v4si = 3064,
-  CODE_FOR_vec_widen_smult_lo_v16qi = 3065,
-  CODE_FOR_vec_widen_umult_lo_v16qi = 3066,
-  CODE_FOR_vec_widen_smult_lo_v8hi = 3067,
-  CODE_FOR_vec_widen_umult_lo_v8hi = 3068,
-  CODE_FOR_vec_widen_smult_lo_v4si = 3069,
-  CODE_FOR_vec_widen_umult_lo_v4si = 3070,
-  CODE_FOR_vec_widen_smult_hi_v16qi = 3071,
-  CODE_FOR_vec_widen_umult_hi_v16qi = 3072,
-  CODE_FOR_vec_widen_smult_hi_v8hi = 3073,
-  CODE_FOR_vec_widen_umult_hi_v8hi = 3074,
-  CODE_FOR_vec_widen_smult_hi_v4si = 3075,
-  CODE_FOR_vec_widen_umult_hi_v4si = 3076,
-  CODE_FOR_vec_widen_sshiftl_lo_v16qi = 3077,
-  CODE_FOR_vec_widen_ushiftl_lo_v16qi = 3078,
-  CODE_FOR_vec_widen_sshiftl_lo_v8hi = 3079,
-  CODE_FOR_vec_widen_ushiftl_lo_v8hi = 3080,
-  CODE_FOR_vec_widen_sshiftl_lo_v4si = 3081,
-  CODE_FOR_vec_widen_ushiftl_lo_v4si = 3082,
-  CODE_FOR_vec_widen_sshiftl_hi_v16qi = 3083,
-  CODE_FOR_vec_widen_ushiftl_hi_v16qi = 3084,
-  CODE_FOR_vec_widen_sshiftl_hi_v8hi = 3085,
-  CODE_FOR_vec_widen_ushiftl_hi_v8hi = 3086,
-  CODE_FOR_vec_widen_sshiftl_hi_v4si = 3087,
-  CODE_FOR_vec_widen_ushiftl_hi_v4si = 3088,
-  CODE_FOR_vec_unpacks_lo_v8qi = 3089,
-  CODE_FOR_vec_unpacku_lo_v8qi = 3090,
-  CODE_FOR_vec_unpacks_lo_v4hi = 3091,
-  CODE_FOR_vec_unpacku_lo_v4hi = 3092,
-  CODE_FOR_vec_unpacks_lo_v2si = 3093,
-  CODE_FOR_vec_unpacku_lo_v2si = 3094,
-  CODE_FOR_vec_unpacks_hi_v8qi = 3095,
-  CODE_FOR_vec_unpacku_hi_v8qi = 3096,
-  CODE_FOR_vec_unpacks_hi_v4hi = 3097,
-  CODE_FOR_vec_unpacku_hi_v4hi = 3098,
-  CODE_FOR_vec_unpacks_hi_v2si = 3099,
-  CODE_FOR_vec_unpacku_hi_v2si = 3100,
-  CODE_FOR_vec_widen_smult_hi_v8qi = 3101,
-  CODE_FOR_vec_widen_umult_hi_v8qi = 3102,
-  CODE_FOR_vec_widen_smult_hi_v4hi = 3103,
-  CODE_FOR_vec_widen_umult_hi_v4hi = 3104,
-  CODE_FOR_vec_widen_smult_hi_v2si = 3105,
-  CODE_FOR_vec_widen_umult_hi_v2si = 3106,
-  CODE_FOR_vec_widen_smult_lo_v8qi = 3107,
-  CODE_FOR_vec_widen_umult_lo_v8qi = 3108,
-  CODE_FOR_vec_widen_smult_lo_v4hi = 3109,
-  CODE_FOR_vec_widen_umult_lo_v4hi = 3110,
-  CODE_FOR_vec_widen_smult_lo_v2si = 3111,
-  CODE_FOR_vec_widen_umult_lo_v2si = 3112,
-  CODE_FOR_vec_widen_sshiftl_hi_v8qi = 3113,
-  CODE_FOR_vec_widen_ushiftl_hi_v8qi = 3114,
-  CODE_FOR_vec_widen_sshiftl_hi_v4hi = 3115,
-  CODE_FOR_vec_widen_ushiftl_hi_v4hi = 3116,
-  CODE_FOR_vec_widen_sshiftl_hi_v2si = 3117,
-  CODE_FOR_vec_widen_ushiftl_hi_v2si = 3118,
-  CODE_FOR_vec_widen_sshiftl_lo_v8qi = 3119,
-  CODE_FOR_vec_widen_ushiftl_lo_v8qi = 3120,
-  CODE_FOR_vec_widen_sshiftl_lo_v4hi = 3121,
-  CODE_FOR_vec_widen_ushiftl_lo_v4hi = 3122,
-  CODE_FOR_vec_widen_sshiftl_lo_v2si = 3123,
-  CODE_FOR_vec_widen_ushiftl_lo_v2si = 3124,
-  CODE_FOR_vec_pack_trunc_v4hi = 3125,
-  CODE_FOR_vec_pack_trunc_v2si = 3126,
-  CODE_FOR_vec_pack_trunc_di = 3127,
-  CODE_FOR_memory_barrier = 3134,
-  CODE_FOR_atomic_loaddi = 3135,
-  CODE_FOR_atomic_compare_and_swapqi = 3136,
-  CODE_FOR_atomic_compare_and_swaphi = 3137,
-  CODE_FOR_atomic_compare_and_swapsi = 3138,
-  CODE_FOR_atomic_compare_and_swapdi = 3139,
-  CODE_FOR_mulqq3 = 3220,
-  CODE_FOR_mulhq3 = 3221,
-  CODE_FOR_mulsq3 = 3222,
-  CODE_FOR_mulsa3 = 3223,
-  CODE_FOR_mulusa3 = 3224,
-  CODE_FOR_mulha3 = 3225,
-  CODE_FOR_muluha3 = 3226,
-  CODE_FOR_ssmulha3 = 3227,
-  CODE_FOR_usmuluha3 = 3228,
-  LAST_INSN_CODE
-};
-
-#endif /* GCC_INSN_CODES_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/insn-constants.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/insn-constants.h
deleted file mode 100644
index 4fdf8a4..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/insn-constants.h
+++ /dev/null
@@ -1,266 +0,0 @@
-/* Generated automatically by the program `genconstants'
-   from the machine description file `md'.  */
-
-#ifndef GCC_INSN_CONSTANTS_H
-#define GCC_INSN_CONSTANTS_H
-
-#define CMP_CMP 0
-#define DOM_CC_NX_OR_Y 1
-#define DOM_CC_X_OR_Y 2
-#define NUM_OF_COND_CMP 4
-#define CC_REGNUM 100
-#define WCGR3 99
-#define SP_REGNUM 13
-#define R1_REGNUM 1
-#define PC_REGNUM 15
-#define WCGR0 96
-#define VFPCC_REGNUM 101
-#define CMP_CMN 2
-#define WCGR2 98
-#define R0_REGNUM 0
-#define WCGR1 97
-#define CMN_CMP 1
-#define LR_REGNUM 14
-#define DOM_CC_X_AND_Y 0
-#define CMN_CMN 3
-#define IP_REGNUM 12
-#define LAST_ARM_REGNUM 15
-
-enum unspec {
-  UNSPEC_PUSH_MULT = 0,
-  UNSPEC_PIC_SYM = 1,
-  UNSPEC_PIC_BASE = 2,
-  UNSPEC_PRLG_STK = 3,
-  UNSPEC_REGISTER_USE = 4,
-  UNSPEC_CHECK_ARCH = 5,
-  UNSPEC_WSHUFH = 6,
-  UNSPEC_WACC = 7,
-  UNSPEC_TMOVMSK = 8,
-  UNSPEC_WSAD = 9,
-  UNSPEC_WSADZ = 10,
-  UNSPEC_WMACS = 11,
-  UNSPEC_WMACU = 12,
-  UNSPEC_WMACSZ = 13,
-  UNSPEC_WMACUZ = 14,
-  UNSPEC_CLRDI = 15,
-  UNSPEC_WALIGNI = 16,
-  UNSPEC_TLS = 17,
-  UNSPEC_PIC_LABEL = 18,
-  UNSPEC_PIC_OFFSET = 19,
-  UNSPEC_GOTSYM_OFF = 20,
-  UNSPEC_THUMB1_CASESI = 21,
-  UNSPEC_RBIT = 22,
-  UNSPEC_SYMBOL_OFFSET = 23,
-  UNSPEC_MEMORY_BARRIER = 24,
-  UNSPEC_UNALIGNED_LOAD = 25,
-  UNSPEC_UNALIGNED_STORE = 26,
-  UNSPEC_PIC_UNIFIED = 27,
-  UNSPEC_LL = 28,
-  UNSPEC_VRINTZ = 29,
-  UNSPEC_VRINTP = 30,
-  UNSPEC_VRINTM = 31,
-  UNSPEC_VRINTR = 32,
-  UNSPEC_VRINTX = 33,
-  UNSPEC_VRINTA = 34,
-  UNSPEC_WADDC = 35,
-  UNSPEC_WABS = 36,
-  UNSPEC_WQMULWMR = 37,
-  UNSPEC_WQMULMR = 38,
-  UNSPEC_WQMULWM = 39,
-  UNSPEC_WQMULM = 40,
-  UNSPEC_WQMIAxyn = 41,
-  UNSPEC_WQMIAxy = 42,
-  UNSPEC_TANDC = 43,
-  UNSPEC_TORC = 44,
-  UNSPEC_TORVSC = 45,
-  UNSPEC_TEXTRC = 46,
-  UNSPEC_ASHIFT_SIGNED = 47,
-  UNSPEC_ASHIFT_UNSIGNED = 48,
-  UNSPEC_CRC32B = 49,
-  UNSPEC_CRC32H = 50,
-  UNSPEC_CRC32W = 51,
-  UNSPEC_CRC32CB = 52,
-  UNSPEC_CRC32CH = 53,
-  UNSPEC_CRC32CW = 54,
-  UNSPEC_AESD = 55,
-  UNSPEC_AESE = 56,
-  UNSPEC_AESIMC = 57,
-  UNSPEC_AESMC = 58,
-  UNSPEC_SHA1C = 59,
-  UNSPEC_SHA1M = 60,
-  UNSPEC_SHA1P = 61,
-  UNSPEC_SHA1H = 62,
-  UNSPEC_SHA1SU0 = 63,
-  UNSPEC_SHA1SU1 = 64,
-  UNSPEC_SHA256H = 65,
-  UNSPEC_SHA256H2 = 66,
-  UNSPEC_SHA256SU0 = 67,
-  UNSPEC_SHA256SU1 = 68,
-  UNSPEC_VMULLP64 = 69,
-  UNSPEC_LOAD_COUNT = 70,
-  UNSPEC_VABD = 71,
-  UNSPEC_VABDL = 72,
-  UNSPEC_VADD = 73,
-  UNSPEC_VADDHN = 74,
-  UNSPEC_VADDL = 75,
-  UNSPEC_VADDW = 76,
-  UNSPEC_VBSL = 77,
-  UNSPEC_VCAGE = 78,
-  UNSPEC_VCAGT = 79,
-  UNSPEC_VCEQ = 80,
-  UNSPEC_VCGE = 81,
-  UNSPEC_VCGEU = 82,
-  UNSPEC_VCGT = 83,
-  UNSPEC_VCGTU = 84,
-  UNSPEC_VCLS = 85,
-  UNSPEC_VCONCAT = 86,
-  UNSPEC_VCVT = 87,
-  UNSPEC_VCVT_N = 88,
-  UNSPEC_VEXT = 89,
-  UNSPEC_VHADD = 90,
-  UNSPEC_VHSUB = 91,
-  UNSPEC_VLD1 = 92,
-  UNSPEC_VLD1_LANE = 93,
-  UNSPEC_VLD2 = 94,
-  UNSPEC_VLD2_DUP = 95,
-  UNSPEC_VLD2_LANE = 96,
-  UNSPEC_VLD3 = 97,
-  UNSPEC_VLD3A = 98,
-  UNSPEC_VLD3B = 99,
-  UNSPEC_VLD3_DUP = 100,
-  UNSPEC_VLD3_LANE = 101,
-  UNSPEC_VLD4 = 102,
-  UNSPEC_VLD4A = 103,
-  UNSPEC_VLD4B = 104,
-  UNSPEC_VLD4_DUP = 105,
-  UNSPEC_VLD4_LANE = 106,
-  UNSPEC_VMAX = 107,
-  UNSPEC_VMIN = 108,
-  UNSPEC_VMLA = 109,
-  UNSPEC_VMLAL = 110,
-  UNSPEC_VMLA_LANE = 111,
-  UNSPEC_VMLAL_LANE = 112,
-  UNSPEC_VMLS = 113,
-  UNSPEC_VMLSL = 114,
-  UNSPEC_VMLS_LANE = 115,
-  UNSPEC_VMLSL_LANE = 116,
-  UNSPEC_VMOVL = 117,
-  UNSPEC_VMOVN = 118,
-  UNSPEC_VMUL = 119,
-  UNSPEC_VMULL = 120,
-  UNSPEC_VMUL_LANE = 121,
-  UNSPEC_VMULL_LANE = 122,
-  UNSPEC_VPADAL = 123,
-  UNSPEC_VPADD = 124,
-  UNSPEC_VPADDL = 125,
-  UNSPEC_VPMAX = 126,
-  UNSPEC_VPMIN = 127,
-  UNSPEC_VPSMAX = 128,
-  UNSPEC_VPSMIN = 129,
-  UNSPEC_VPUMAX = 130,
-  UNSPEC_VPUMIN = 131,
-  UNSPEC_VQABS = 132,
-  UNSPEC_VQADD = 133,
-  UNSPEC_VQDMLAL = 134,
-  UNSPEC_VQDMLAL_LANE = 135,
-  UNSPEC_VQDMLSL = 136,
-  UNSPEC_VQDMLSL_LANE = 137,
-  UNSPEC_VQDMULH = 138,
-  UNSPEC_VQDMULH_LANE = 139,
-  UNSPEC_VQDMULL = 140,
-  UNSPEC_VQDMULL_LANE = 141,
-  UNSPEC_VQMOVN = 142,
-  UNSPEC_VQMOVUN = 143,
-  UNSPEC_VQNEG = 144,
-  UNSPEC_VQSHL = 145,
-  UNSPEC_VQSHL_N = 146,
-  UNSPEC_VQSHLU_N = 147,
-  UNSPEC_VQSHRN_N = 148,
-  UNSPEC_VQSHRUN_N = 149,
-  UNSPEC_VQSUB = 150,
-  UNSPEC_VRECPE = 151,
-  UNSPEC_VRECPS = 152,
-  UNSPEC_VREV16 = 153,
-  UNSPEC_VREV32 = 154,
-  UNSPEC_VREV64 = 155,
-  UNSPEC_VRSQRTE = 156,
-  UNSPEC_VRSQRTS = 157,
-  UNSPEC_VSHL = 158,
-  UNSPEC_VSHLL_N = 159,
-  UNSPEC_VSHL_N = 160,
-  UNSPEC_VSHR_N = 161,
-  UNSPEC_VSHRN_N = 162,
-  UNSPEC_VSLI = 163,
-  UNSPEC_VSRA_N = 164,
-  UNSPEC_VSRI = 165,
-  UNSPEC_VST1 = 166,
-  UNSPEC_VST1_LANE = 167,
-  UNSPEC_VST2 = 168,
-  UNSPEC_VST2_LANE = 169,
-  UNSPEC_VST3 = 170,
-  UNSPEC_VST3A = 171,
-  UNSPEC_VST3B = 172,
-  UNSPEC_VST3_LANE = 173,
-  UNSPEC_VST4 = 174,
-  UNSPEC_VST4A = 175,
-  UNSPEC_VST4B = 176,
-  UNSPEC_VST4_LANE = 177,
-  UNSPEC_VSTRUCTDUMMY = 178,
-  UNSPEC_VSUB = 179,
-  UNSPEC_VSUBHN = 180,
-  UNSPEC_VSUBL = 181,
-  UNSPEC_VSUBW = 182,
-  UNSPEC_VTBL = 183,
-  UNSPEC_VTBX = 184,
-  UNSPEC_VTRN1 = 185,
-  UNSPEC_VTRN2 = 186,
-  UNSPEC_VTST = 187,
-  UNSPEC_VUZP1 = 188,
-  UNSPEC_VUZP2 = 189,
-  UNSPEC_VZIP1 = 190,
-  UNSPEC_VZIP2 = 191,
-  UNSPEC_MISALIGNED_ACCESS = 192,
-  UNSPEC_VCLE = 193,
-  UNSPEC_VCLT = 194,
-  UNSPEC_NVRINTZ = 195,
-  UNSPEC_NVRINTP = 196,
-  UNSPEC_NVRINTM = 197,
-  UNSPEC_NVRINTX = 198,
-  UNSPEC_NVRINTA = 199,
-  UNSPEC_NVRINTN = 200
-};
-#define NUM_UNSPEC_VALUES 201
-extern const char *const unspec_strings[];
-
-enum unspecv {
-  VUNSPEC_BLOCKAGE = 0,
-  VUNSPEC_EPILOGUE = 1,
-  VUNSPEC_THUMB1_INTERWORK = 2,
-  VUNSPEC_ALIGN = 3,
-  VUNSPEC_POOL_END = 4,
-  VUNSPEC_POOL_1 = 5,
-  VUNSPEC_POOL_2 = 6,
-  VUNSPEC_POOL_4 = 7,
-  VUNSPEC_POOL_8 = 8,
-  VUNSPEC_POOL_16 = 9,
-  VUNSPEC_TMRC = 10,
-  VUNSPEC_TMCR = 11,
-  VUNSPEC_ALIGN8 = 12,
-  VUNSPEC_WCMP_EQ = 13,
-  VUNSPEC_WCMP_GTU = 14,
-  VUNSPEC_WCMP_GT = 15,
-  VUNSPEC_EH_RETURN = 16,
-  VUNSPEC_ATOMIC_CAS = 17,
-  VUNSPEC_ATOMIC_XCHG = 18,
-  VUNSPEC_ATOMIC_OP = 19,
-  VUNSPEC_LL = 20,
-  VUNSPEC_SC = 21,
-  VUNSPEC_LAX = 22,
-  VUNSPEC_SLX = 23,
-  VUNSPEC_LDA = 24,
-  VUNSPEC_STL = 25
-};
-#define NUM_UNSPECV_VALUES 26
-extern const char *const unspecv_strings[];
-
-#endif /* GCC_INSN_CONSTANTS_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/insn-flags.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/insn-flags.h
deleted file mode 100644
index b0f2632..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/insn-flags.h
+++ /dev/null
@@ -1,4742 +0,0 @@
-/* Generated automatically by the program `genflags'
-   from the machine description file `md'.  */
-
-#ifndef GCC_INSN_FLAGS_H
-#define GCC_INSN_FLAGS_H
-
-#define HAVE_addsi3_compare0 (TARGET_ARM)
-#define HAVE_cmpsi2_addneg (TARGET_32BIT && INTVAL (operands[2]) == -INTVAL (operands[3]))
-#define HAVE_thumb1_subsi3_insn (TARGET_THUMB1)
-#define HAVE_subsi3_compare (TARGET_32BIT)
-#define HAVE_mulhisi3 (TARGET_DSP_MULTIPLY)
-#define HAVE_maddhisi4 (TARGET_DSP_MULTIPLY)
-#define HAVE_maddhidi4 (TARGET_DSP_MULTIPLY)
-#define HAVE_insv_zero (arm_arch_thumb2)
-#define HAVE_insv_t2 (arm_arch_thumb2)
-#define HAVE_andsi_notsi_si (TARGET_32BIT)
-#define HAVE_thumb1_bicsi3 (TARGET_THUMB1)
-#define HAVE_andsi_not_shiftsi_si (TARGET_ARM)
-#define HAVE_arm_ashldi3_1bit (TARGET_32BIT)
-#define HAVE_arm_ashrdi3_1bit (TARGET_32BIT)
-#define HAVE_arm_lshrdi3_1bit (TARGET_32BIT)
-#define HAVE_unaligned_loadsi (unaligned_access && TARGET_32BIT)
-#define HAVE_unaligned_loadhis (unaligned_access && TARGET_32BIT)
-#define HAVE_unaligned_loadhiu (unaligned_access && TARGET_32BIT)
-#define HAVE_unaligned_storesi (unaligned_access && TARGET_32BIT)
-#define HAVE_unaligned_storehi (unaligned_access && TARGET_32BIT)
-#define HAVE_unaligned_loaddi (unaligned_access && TARGET_32BIT)
-#define HAVE_unaligned_storedi (unaligned_access && TARGET_32BIT)
-#define HAVE_extzv_t2 (arm_arch_thumb2)
-#define HAVE_divsi3 (TARGET_IDIV)
-#define HAVE_udivsi3 (TARGET_IDIV)
-#define HAVE_one_cmpldi2 (TARGET_32BIT)
-#define HAVE_zero_extendqidi2 (TARGET_32BIT )
-#define HAVE_zero_extendhidi2 (TARGET_32BIT && arm_arch6)
-#define HAVE_zero_extendsidi2 (TARGET_32BIT )
-#define HAVE_extendqidi2 (TARGET_32BIT && arm_arch6)
-#define HAVE_extendhidi2 (TARGET_32BIT && arm_arch6)
-#define HAVE_extendsidi2 (TARGET_32BIT )
-#define HAVE_thumb1_extendhisi2 (TARGET_THUMB1)
-#define HAVE_thumb1_extendqisi2 (TARGET_THUMB1)
-#define HAVE_pic_load_addr_unified (flag_pic)
-#define HAVE_pic_load_addr_32bit (TARGET_32BIT && flag_pic)
-#define HAVE_pic_load_addr_thumb1 (TARGET_THUMB1 && flag_pic)
-#define HAVE_pic_add_dot_plus_four (TARGET_THUMB)
-#define HAVE_pic_add_dot_plus_eight (TARGET_ARM)
-#define HAVE_tls_load_dot_plus_eight (TARGET_ARM)
-#define HAVE_movmem12b (TARGET_THUMB1)
-#define HAVE_movmem8b (TARGET_THUMB1)
-#define HAVE_cbranchsi4_insn (TARGET_THUMB1)
-#define HAVE_cbranchsi4_scratch (TARGET_THUMB1)
-#define HAVE_arm_cond_branch (TARGET_32BIT)
-#define HAVE_cstoresi_nltu_thumb1 (TARGET_THUMB1)
-#define HAVE_cstoresi_ltu_thumb1 (TARGET_THUMB1)
-#define HAVE_thumb1_addsi3_addgeu (TARGET_THUMB1)
-#define HAVE_blockage 1
-#define HAVE_arm_casesi_internal (TARGET_ARM)
-#define HAVE_thumb1_casesi_dispatch (TARGET_THUMB1)
-#define HAVE_nop 1
-#define HAVE_trap 1
-#define HAVE_movcond_addsi (TARGET_32BIT)
-#define HAVE_movcond (TARGET_ARM)
-#define HAVE_prologue_thumb1_interwork (TARGET_THUMB1)
-#define HAVE_stack_tie 1
-#define HAVE_align_4 1
-#define HAVE_align_8 1
-#define HAVE_consttable_end 1
-#define HAVE_consttable_1 (TARGET_THUMB1)
-#define HAVE_consttable_2 (TARGET_THUMB1)
-#define HAVE_consttable_4 1
-#define HAVE_consttable_8 1
-#define HAVE_consttable_16 1
-#define HAVE_clzsi2 (TARGET_32BIT && arm_arch5)
-#define HAVE_rbitsi2 (TARGET_32BIT && arm_arch_thumb2)
-#define HAVE_prefetch (TARGET_32BIT && arm_arch5e)
-#define HAVE_force_register_use 1
-#define HAVE_arm_eh_return (TARGET_ARM)
-#define HAVE_thumb_eh_return (TARGET_THUMB1)
-#define HAVE_load_tp_hard (TARGET_HARD_TP)
-#define HAVE_load_tp_soft (TARGET_SOFT_TP)
-#define HAVE_tlscall (TARGET_GNU2_TLS)
-#define HAVE_crc32b (TARGET_CRC32)
-#define HAVE_crc32h (TARGET_CRC32)
-#define HAVE_crc32w (TARGET_CRC32)
-#define HAVE_crc32cb (TARGET_CRC32)
-#define HAVE_crc32ch (TARGET_CRC32)
-#define HAVE_crc32cw (TARGET_CRC32)
-#define HAVE_tbcstv8qi (TARGET_REALLY_IWMMXT)
-#define HAVE_tbcstv4hi (TARGET_REALLY_IWMMXT)
-#define HAVE_tbcstv2si (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_iordi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_xordi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_anddi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_nanddi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_movv2si_internal (TARGET_REALLY_IWMMXT)
-#define HAVE_movv4hi_internal (TARGET_REALLY_IWMMXT)
-#define HAVE_movv8qi_internal (TARGET_REALLY_IWMMXT)
-#define HAVE_ssaddv8qi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_ssaddv4hi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_ssaddv2si3 (TARGET_REALLY_IWMMXT)
-#define HAVE_usaddv8qi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_usaddv4hi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_usaddv2si3 (TARGET_REALLY_IWMMXT)
-#define HAVE_sssubv8qi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_sssubv4hi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_sssubv2si3 (TARGET_REALLY_IWMMXT)
-#define HAVE_ussubv8qi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_ussubv4hi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_ussubv2si3 (TARGET_REALLY_IWMMXT)
-#define HAVE_smulv4hi3_highpart (TARGET_REALLY_IWMMXT)
-#define HAVE_umulv4hi3_highpart (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmacs (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmacsz (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmacu (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmacuz (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_clrdi (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_clrv8qi (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_clrv4hi (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_clrv2si (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_uavgrndv8qi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_uavgrndv4hi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_uavgv8qi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_uavgv4hi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_tinsrb (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_tinsrh (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_tinsrw (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_textrmub (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_textrmsb (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_textrmuh (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_textrmsh (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_textrmw (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wshufh (TARGET_REALLY_IWMMXT)
-#define HAVE_eqv8qi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_eqv4hi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_eqv2si3 (TARGET_REALLY_IWMMXT)
-#define HAVE_gtuv8qi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_gtuv4hi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_gtuv2si3 (TARGET_REALLY_IWMMXT)
-#define HAVE_gtv8qi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_gtv4hi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_gtv2si3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wpackhss (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wpackwss (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wpackdss (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wpackhus (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wpackwus (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wpackdus (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wunpckihb (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wunpckihh (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wunpckihw (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wunpckilb (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wunpckilh (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wunpckilw (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wunpckehub (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wunpckehuh (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wunpckehuw (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wunpckehsb (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wunpckehsh (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wunpckehsw (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wunpckelub (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wunpckeluh (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wunpckeluw (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wunpckelsb (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wunpckelsh (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wunpckelsw (TARGET_REALLY_IWMMXT)
-#define HAVE_rorv4hi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_rorv2si3 (TARGET_REALLY_IWMMXT)
-#define HAVE_rordi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_ashrv4hi3_iwmmxt (TARGET_REALLY_IWMMXT)
-#define HAVE_ashrv2si3_iwmmxt (TARGET_REALLY_IWMMXT)
-#define HAVE_ashrdi3_iwmmxt (TARGET_REALLY_IWMMXT)
-#define HAVE_lshrv4hi3_iwmmxt (TARGET_REALLY_IWMMXT)
-#define HAVE_lshrv2si3_iwmmxt (TARGET_REALLY_IWMMXT)
-#define HAVE_lshrdi3_iwmmxt (TARGET_REALLY_IWMMXT)
-#define HAVE_ashlv4hi3_iwmmxt (TARGET_REALLY_IWMMXT)
-#define HAVE_ashlv2si3_iwmmxt (TARGET_REALLY_IWMMXT)
-#define HAVE_ashldi3_iwmmxt (TARGET_REALLY_IWMMXT)
-#define HAVE_rorv4hi3_di (TARGET_REALLY_IWMMXT)
-#define HAVE_rorv2si3_di (TARGET_REALLY_IWMMXT)
-#define HAVE_rordi3_di (TARGET_REALLY_IWMMXT)
-#define HAVE_ashrv4hi3_di (TARGET_REALLY_IWMMXT)
-#define HAVE_ashrv2si3_di (TARGET_REALLY_IWMMXT)
-#define HAVE_ashrdi3_di (TARGET_REALLY_IWMMXT)
-#define HAVE_lshrv4hi3_di (TARGET_REALLY_IWMMXT)
-#define HAVE_lshrv2si3_di (TARGET_REALLY_IWMMXT)
-#define HAVE_lshrdi3_di (TARGET_REALLY_IWMMXT)
-#define HAVE_ashlv4hi3_di (TARGET_REALLY_IWMMXT)
-#define HAVE_ashlv2si3_di (TARGET_REALLY_IWMMXT)
-#define HAVE_ashldi3_di (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmadds (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmaddu (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_tmia (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_tmiaph (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_tmiabb (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_tmiatb (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_tmiabt (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_tmiatt (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_tmovmskb (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_tmovmskh (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_tmovmskw (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_waccb (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wacch (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_waccw (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_waligni (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_walignr (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_walignr0 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_walignr1 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_walignr2 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_walignr3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wsadb (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wsadh (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wsadbz (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wsadhz (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wabsv2si3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wabsv4hi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wabsv8qi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wabsdiffb (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wabsdiffh (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wabsdiffw (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_waddsubhx (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wsubaddhx (TARGET_REALLY_IWMMXT)
-#define HAVE_addcv4hi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_addcv2si3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_avg4 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_avg4r (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmaddsx (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmaddux (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmaddsn (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmaddun (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmulwsm (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmulwum (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmulsmr (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmulumr (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmulwsmr (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmulwumr (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmulwl (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wqmulm (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wqmulwm (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wqmulmr (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wqmulwmr (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_waddbhusm (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_waddbhusl (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wqmiabb (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wqmiabt (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wqmiatb (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wqmiatt (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wqmiabbn (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wqmiabtn (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wqmiatbn (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wqmiattn (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmiabb (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmiabt (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmiatb (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmiatt (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmiabbn (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmiabtn (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmiatbn (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmiattn (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmiawbb (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmiawbt (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmiawtb (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmiawtt (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmiawbbn (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmiawbtn (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmiawtbn (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmiawttn (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_wmerge (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_tandcv2si3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_tandcv4hi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_tandcv8qi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_torcv2si3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_torcv4hi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_torcv8qi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_torvscv2si3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_torvscv4hi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_torvscv8qi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_textrcv2si3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_textrcv4hi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_textrcv8qi3 (TARGET_REALLY_IWMMXT)
-#define HAVE_fmasf4 ((TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA) && (TARGET_VFP))
-#define HAVE_fmadf4 ((TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FMA) && (TARGET_VFP_DOUBLE))
-#define HAVE_extendhfsf2 (TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FP16)
-#define HAVE_truncsfhf2 (TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_FP16)
-#define HAVE_fixuns_truncsfsi2 (TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP)
-#define HAVE_fixuns_truncdfsi2 (TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE)
-#define HAVE_floatunssisf2 (TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP)
-#define HAVE_floatunssidf2 (TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE)
-#define HAVE_btruncsf2 ((TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 ) && (TARGET_VFP))
-#define HAVE_ceilsf2 ((TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 ) && (TARGET_VFP))
-#define HAVE_floorsf2 ((TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 ) && (TARGET_VFP))
-#define HAVE_nearbyintsf2 ((TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 ) && (TARGET_VFP))
-#define HAVE_rintsf2 ((TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 ) && (TARGET_VFP))
-#define HAVE_roundsf2 ((TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 ) && (TARGET_VFP))
-#define HAVE_btruncdf2 ((TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 && TARGET_VFP_DOUBLE) && (TARGET_VFP_DOUBLE))
-#define HAVE_ceildf2 ((TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 && TARGET_VFP_DOUBLE) && (TARGET_VFP_DOUBLE))
-#define HAVE_floordf2 ((TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 && TARGET_VFP_DOUBLE) && (TARGET_VFP_DOUBLE))
-#define HAVE_nearbyintdf2 ((TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 && TARGET_VFP_DOUBLE) && (TARGET_VFP_DOUBLE))
-#define HAVE_rintdf2 ((TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 && TARGET_VFP_DOUBLE) && (TARGET_VFP_DOUBLE))
-#define HAVE_rounddf2 ((TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 && TARGET_VFP_DOUBLE) && (TARGET_VFP_DOUBLE))
-#define HAVE_smaxsf3 ((TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 ) && (TARGET_VFP))
-#define HAVE_smaxdf3 ((TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 && TARGET_VFP_DOUBLE) && (TARGET_VFP_DOUBLE))
-#define HAVE_sminsf3 ((TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 ) && (TARGET_VFP))
-#define HAVE_smindf3 ((TARGET_HARD_FLOAT && TARGET_FPU_ARMV8 && TARGET_VFP_DOUBLE) && (TARGET_VFP_DOUBLE))
-#define HAVE_tls_load_dot_plus_four (TARGET_THUMB2)
-#define HAVE_thumb2_zero_extendqisi2_v6 (TARGET_THUMB2 && arm_arch6)
-#define HAVE_thumb2_casesi_internal (TARGET_THUMB2 && !flag_pic)
-#define HAVE_thumb2_casesi_internal_pic (TARGET_THUMB2 && flag_pic)
-#define HAVE_thumb2_eh_return (TARGET_THUMB2)
-#define HAVE_thumb2_addsi3_compare0 (TARGET_THUMB2)
-#define HAVE_vec_setv8qi_internal (TARGET_NEON)
-#define HAVE_vec_setv4hi_internal (TARGET_NEON)
-#define HAVE_vec_setv2si_internal (TARGET_NEON)
-#define HAVE_vec_setv2sf_internal (TARGET_NEON)
-#define HAVE_vec_setv16qi_internal (TARGET_NEON)
-#define HAVE_vec_setv8hi_internal (TARGET_NEON)
-#define HAVE_vec_setv4si_internal (TARGET_NEON)
-#define HAVE_vec_setv4sf_internal (TARGET_NEON)
-#define HAVE_vec_setv2di_internal (TARGET_NEON)
-#define HAVE_vec_extractv8qi (TARGET_NEON)
-#define HAVE_vec_extractv4hi (TARGET_NEON)
-#define HAVE_vec_extractv2si (TARGET_NEON)
-#define HAVE_vec_extractv2sf (TARGET_NEON)
-#define HAVE_vec_extractv16qi (TARGET_NEON)
-#define HAVE_vec_extractv8hi (TARGET_NEON)
-#define HAVE_vec_extractv4si (TARGET_NEON)
-#define HAVE_vec_extractv4sf (TARGET_NEON)
-#define HAVE_vec_extractv2di (TARGET_NEON)
-#define HAVE_adddi3_neon (TARGET_NEON)
-#define HAVE_subdi3_neon (TARGET_NEON)
-#define HAVE_mulv8qi3addv8qi_neon (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_mulv16qi3addv16qi_neon (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_mulv4hi3addv4hi_neon (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_mulv8hi3addv8hi_neon (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_mulv2si3addv2si_neon (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_mulv4si3addv4si_neon (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_mulv2sf3addv2sf_neon (TARGET_NEON && (!true || flag_unsafe_math_optimizations))
-#define HAVE_mulv4sf3addv4sf_neon (TARGET_NEON && (!true || flag_unsafe_math_optimizations))
-#define HAVE_mulv8qi3negv8qiaddv8qi_neon (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_mulv16qi3negv16qiaddv16qi_neon (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_mulv4hi3negv4hiaddv4hi_neon (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_mulv8hi3negv8hiaddv8hi_neon (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_mulv2si3negv2siaddv2si_neon (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_mulv4si3negv4siaddv4si_neon (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_mulv2sf3negv2sfaddv2sf_neon (TARGET_NEON && (!true || flag_unsafe_math_optimizations))
-#define HAVE_mulv4sf3negv4sfaddv4sf_neon (TARGET_NEON && (!true || flag_unsafe_math_optimizations))
-#define HAVE_fmav2sf4 (TARGET_NEON && TARGET_FMA && flag_unsafe_math_optimizations)
-#define HAVE_fmav4sf4 (TARGET_NEON && TARGET_FMA && flag_unsafe_math_optimizations)
-#define HAVE_fmav2sf4_intrinsic (TARGET_NEON && TARGET_FMA)
-#define HAVE_fmav4sf4_intrinsic (TARGET_NEON && TARGET_FMA)
-#define HAVE_fmsubv2sf4_intrinsic (TARGET_NEON && TARGET_FMA)
-#define HAVE_fmsubv4sf4_intrinsic (TARGET_NEON && TARGET_FMA)
-#define HAVE_neon_vrintpv2sf (TARGET_NEON && TARGET_FPU_ARMV8)
-#define HAVE_neon_vrintzv2sf (TARGET_NEON && TARGET_FPU_ARMV8)
-#define HAVE_neon_vrintmv2sf (TARGET_NEON && TARGET_FPU_ARMV8)
-#define HAVE_neon_vrintxv2sf (TARGET_NEON && TARGET_FPU_ARMV8)
-#define HAVE_neon_vrintav2sf (TARGET_NEON && TARGET_FPU_ARMV8)
-#define HAVE_neon_vrintnv2sf (TARGET_NEON && TARGET_FPU_ARMV8)
-#define HAVE_neon_vrintpv4sf (TARGET_NEON && TARGET_FPU_ARMV8)
-#define HAVE_neon_vrintzv4sf (TARGET_NEON && TARGET_FPU_ARMV8)
-#define HAVE_neon_vrintmv4sf (TARGET_NEON && TARGET_FPU_ARMV8)
-#define HAVE_neon_vrintxv4sf (TARGET_NEON && TARGET_FPU_ARMV8)
-#define HAVE_neon_vrintav4sf (TARGET_NEON && TARGET_FPU_ARMV8)
-#define HAVE_neon_vrintnv4sf (TARGET_NEON && TARGET_FPU_ARMV8)
-#define HAVE_iorv8qi3 (TARGET_NEON)
-#define HAVE_iorv16qi3 (TARGET_NEON)
-#define HAVE_iorv4hi3 (TARGET_NEON)
-#define HAVE_iorv8hi3 (TARGET_NEON)
-#define HAVE_iorv2si3 (TARGET_NEON)
-#define HAVE_iorv4si3 (TARGET_NEON)
-#define HAVE_iorv2sf3 (TARGET_NEON)
-#define HAVE_iorv4sf3 (TARGET_NEON)
-#define HAVE_iorv2di3 (TARGET_NEON)
-#define HAVE_andv8qi3 (TARGET_NEON)
-#define HAVE_andv16qi3 (TARGET_NEON)
-#define HAVE_andv4hi3 (TARGET_NEON)
-#define HAVE_andv8hi3 (TARGET_NEON)
-#define HAVE_andv2si3 (TARGET_NEON)
-#define HAVE_andv4si3 (TARGET_NEON)
-#define HAVE_andv2sf3 (TARGET_NEON)
-#define HAVE_andv4sf3 (TARGET_NEON)
-#define HAVE_andv2di3 (TARGET_NEON)
-#define HAVE_ornv8qi3_neon (TARGET_NEON)
-#define HAVE_ornv16qi3_neon (TARGET_NEON)
-#define HAVE_ornv4hi3_neon (TARGET_NEON)
-#define HAVE_ornv8hi3_neon (TARGET_NEON)
-#define HAVE_ornv2si3_neon (TARGET_NEON)
-#define HAVE_ornv4si3_neon (TARGET_NEON)
-#define HAVE_ornv2sf3_neon (TARGET_NEON)
-#define HAVE_ornv4sf3_neon (TARGET_NEON)
-#define HAVE_ornv2di3_neon (TARGET_NEON)
-#define HAVE_orndi3_neon (TARGET_NEON)
-#define HAVE_bicv8qi3_neon (TARGET_NEON)
-#define HAVE_bicv16qi3_neon (TARGET_NEON)
-#define HAVE_bicv4hi3_neon (TARGET_NEON)
-#define HAVE_bicv8hi3_neon (TARGET_NEON)
-#define HAVE_bicv2si3_neon (TARGET_NEON)
-#define HAVE_bicv4si3_neon (TARGET_NEON)
-#define HAVE_bicv2sf3_neon (TARGET_NEON)
-#define HAVE_bicv4sf3_neon (TARGET_NEON)
-#define HAVE_bicv2di3_neon (TARGET_NEON)
-#define HAVE_bicdi3_neon (TARGET_NEON)
-#define HAVE_xorv8qi3 (TARGET_NEON)
-#define HAVE_xorv16qi3 (TARGET_NEON)
-#define HAVE_xorv4hi3 (TARGET_NEON)
-#define HAVE_xorv8hi3 (TARGET_NEON)
-#define HAVE_xorv2si3 (TARGET_NEON)
-#define HAVE_xorv4si3 (TARGET_NEON)
-#define HAVE_xorv2sf3 (TARGET_NEON)
-#define HAVE_xorv4sf3 (TARGET_NEON)
-#define HAVE_xorv2di3 (TARGET_NEON)
-#define HAVE_one_cmplv8qi2 (TARGET_NEON)
-#define HAVE_one_cmplv16qi2 (TARGET_NEON)
-#define HAVE_one_cmplv4hi2 (TARGET_NEON)
-#define HAVE_one_cmplv8hi2 (TARGET_NEON)
-#define HAVE_one_cmplv2si2 (TARGET_NEON)
-#define HAVE_one_cmplv4si2 (TARGET_NEON)
-#define HAVE_one_cmplv2sf2 (TARGET_NEON)
-#define HAVE_one_cmplv4sf2 (TARGET_NEON)
-#define HAVE_one_cmplv2di2 (TARGET_NEON)
-#define HAVE_absv8qi2 (TARGET_NEON)
-#define HAVE_absv16qi2 (TARGET_NEON)
-#define HAVE_absv4hi2 (TARGET_NEON)
-#define HAVE_absv8hi2 (TARGET_NEON)
-#define HAVE_absv2si2 (TARGET_NEON)
-#define HAVE_absv4si2 (TARGET_NEON)
-#define HAVE_absv2sf2 (TARGET_NEON)
-#define HAVE_absv4sf2 (TARGET_NEON)
-#define HAVE_negv8qi2 (TARGET_NEON)
-#define HAVE_negv16qi2 (TARGET_NEON)
-#define HAVE_negv4hi2 (TARGET_NEON)
-#define HAVE_negv8hi2 (TARGET_NEON)
-#define HAVE_negv2si2 (TARGET_NEON)
-#define HAVE_negv4si2 (TARGET_NEON)
-#define HAVE_negv2sf2 (TARGET_NEON)
-#define HAVE_negv4sf2 (TARGET_NEON)
-#define HAVE_negdi2_neon (TARGET_NEON)
-#define HAVE_vashlv8qi3 (TARGET_NEON)
-#define HAVE_vashlv16qi3 (TARGET_NEON)
-#define HAVE_vashlv4hi3 (TARGET_NEON)
-#define HAVE_vashlv8hi3 (TARGET_NEON)
-#define HAVE_vashlv2si3 (TARGET_NEON)
-#define HAVE_vashlv4si3 (TARGET_NEON)
-#define HAVE_vashrv8qi3_imm (TARGET_NEON)
-#define HAVE_vashrv16qi3_imm (TARGET_NEON)
-#define HAVE_vashrv4hi3_imm (TARGET_NEON)
-#define HAVE_vashrv8hi3_imm (TARGET_NEON)
-#define HAVE_vashrv2si3_imm (TARGET_NEON)
-#define HAVE_vashrv4si3_imm (TARGET_NEON)
-#define HAVE_vlshrv8qi3_imm (TARGET_NEON)
-#define HAVE_vlshrv16qi3_imm (TARGET_NEON)
-#define HAVE_vlshrv4hi3_imm (TARGET_NEON)
-#define HAVE_vlshrv8hi3_imm (TARGET_NEON)
-#define HAVE_vlshrv2si3_imm (TARGET_NEON)
-#define HAVE_vlshrv4si3_imm (TARGET_NEON)
-#define HAVE_ashlv8qi3_signed (TARGET_NEON)
-#define HAVE_ashlv16qi3_signed (TARGET_NEON)
-#define HAVE_ashlv4hi3_signed (TARGET_NEON)
-#define HAVE_ashlv8hi3_signed (TARGET_NEON)
-#define HAVE_ashlv2si3_signed (TARGET_NEON)
-#define HAVE_ashlv4si3_signed (TARGET_NEON)
-#define HAVE_ashlv2di3_signed (TARGET_NEON)
-#define HAVE_ashlv8qi3_unsigned (TARGET_NEON)
-#define HAVE_ashlv16qi3_unsigned (TARGET_NEON)
-#define HAVE_ashlv4hi3_unsigned (TARGET_NEON)
-#define HAVE_ashlv8hi3_unsigned (TARGET_NEON)
-#define HAVE_ashlv2si3_unsigned (TARGET_NEON)
-#define HAVE_ashlv4si3_unsigned (TARGET_NEON)
-#define HAVE_ashlv2di3_unsigned (TARGET_NEON)
-#define HAVE_neon_load_count (TARGET_NEON)
-#define HAVE_ashldi3_neon_noclobber (TARGET_NEON && reload_completed \
-   && (!CONST_INT_P (operands[2]) \
-       || (INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) < 64)))
-#define HAVE_ashldi3_neon (TARGET_NEON)
-#define HAVE_signed_shift_di3_neon (TARGET_NEON && reload_completed)
-#define HAVE_unsigned_shift_di3_neon (TARGET_NEON && reload_completed)
-#define HAVE_ashrdi3_neon_imm_noclobber (TARGET_NEON && reload_completed \
-   && INTVAL (operands[2]) > 0 && INTVAL (operands[2]) <= 64)
-#define HAVE_lshrdi3_neon_imm_noclobber (TARGET_NEON && reload_completed \
-   && INTVAL (operands[2]) > 0 && INTVAL (operands[2]) <= 64)
-#define HAVE_ashrdi3_neon (TARGET_NEON)
-#define HAVE_lshrdi3_neon (TARGET_NEON)
-#define HAVE_widen_ssumv8qi3 (TARGET_NEON)
-#define HAVE_widen_ssumv4hi3 (TARGET_NEON)
-#define HAVE_widen_ssumv2si3 (TARGET_NEON)
-#define HAVE_widen_usumv8qi3 (TARGET_NEON)
-#define HAVE_widen_usumv4hi3 (TARGET_NEON)
-#define HAVE_widen_usumv2si3 (TARGET_NEON)
-#define HAVE_quad_halves_plusv4si (TARGET_NEON)
-#define HAVE_quad_halves_sminv4si (TARGET_NEON)
-#define HAVE_quad_halves_smaxv4si (TARGET_NEON)
-#define HAVE_quad_halves_uminv4si (TARGET_NEON)
-#define HAVE_quad_halves_umaxv4si (TARGET_NEON)
-#define HAVE_quad_halves_plusv4sf (TARGET_NEON && flag_unsafe_math_optimizations)
-#define HAVE_quad_halves_sminv4sf (TARGET_NEON && flag_unsafe_math_optimizations)
-#define HAVE_quad_halves_smaxv4sf (TARGET_NEON && flag_unsafe_math_optimizations)
-#define HAVE_quad_halves_plusv8hi (TARGET_NEON)
-#define HAVE_quad_halves_sminv8hi (TARGET_NEON)
-#define HAVE_quad_halves_smaxv8hi (TARGET_NEON)
-#define HAVE_quad_halves_uminv8hi (TARGET_NEON)
-#define HAVE_quad_halves_umaxv8hi (TARGET_NEON)
-#define HAVE_quad_halves_plusv16qi (TARGET_NEON)
-#define HAVE_quad_halves_sminv16qi (TARGET_NEON)
-#define HAVE_quad_halves_smaxv16qi (TARGET_NEON)
-#define HAVE_quad_halves_uminv16qi (TARGET_NEON)
-#define HAVE_quad_halves_umaxv16qi (TARGET_NEON)
-#define HAVE_reduc_splus_v2di (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vpadd_internalv8qi (TARGET_NEON)
-#define HAVE_neon_vpadd_internalv4hi (TARGET_NEON)
-#define HAVE_neon_vpadd_internalv2si (TARGET_NEON)
-#define HAVE_neon_vpadd_internalv2sf (TARGET_NEON)
-#define HAVE_neon_vpsminv8qi (TARGET_NEON)
-#define HAVE_neon_vpsminv4hi (TARGET_NEON)
-#define HAVE_neon_vpsminv2si (TARGET_NEON)
-#define HAVE_neon_vpsminv2sf (TARGET_NEON)
-#define HAVE_neon_vpsmaxv8qi (TARGET_NEON)
-#define HAVE_neon_vpsmaxv4hi (TARGET_NEON)
-#define HAVE_neon_vpsmaxv2si (TARGET_NEON)
-#define HAVE_neon_vpsmaxv2sf (TARGET_NEON)
-#define HAVE_neon_vpuminv8qi (TARGET_NEON)
-#define HAVE_neon_vpuminv4hi (TARGET_NEON)
-#define HAVE_neon_vpuminv2si (TARGET_NEON)
-#define HAVE_neon_vpumaxv8qi (TARGET_NEON)
-#define HAVE_neon_vpumaxv4hi (TARGET_NEON)
-#define HAVE_neon_vpumaxv2si (TARGET_NEON)
-#define HAVE_neon_vaddv8qi_unspec (TARGET_NEON)
-#define HAVE_neon_vaddv16qi_unspec (TARGET_NEON)
-#define HAVE_neon_vaddv4hi_unspec (TARGET_NEON)
-#define HAVE_neon_vaddv8hi_unspec (TARGET_NEON)
-#define HAVE_neon_vaddv2si_unspec (TARGET_NEON)
-#define HAVE_neon_vaddv4si_unspec (TARGET_NEON)
-#define HAVE_neon_vaddv2sf_unspec (TARGET_NEON)
-#define HAVE_neon_vaddv4sf_unspec (TARGET_NEON)
-#define HAVE_neon_vadddi_unspec (TARGET_NEON)
-#define HAVE_neon_vaddv2di_unspec (TARGET_NEON)
-#define HAVE_neon_vaddlv8qi (TARGET_NEON)
-#define HAVE_neon_vaddlv4hi (TARGET_NEON)
-#define HAVE_neon_vaddlv2si (TARGET_NEON)
-#define HAVE_neon_vaddwv8qi (TARGET_NEON)
-#define HAVE_neon_vaddwv4hi (TARGET_NEON)
-#define HAVE_neon_vaddwv2si (TARGET_NEON)
-#define HAVE_neon_vhaddv8qi (TARGET_NEON)
-#define HAVE_neon_vhaddv16qi (TARGET_NEON)
-#define HAVE_neon_vhaddv4hi (TARGET_NEON)
-#define HAVE_neon_vhaddv8hi (TARGET_NEON)
-#define HAVE_neon_vhaddv2si (TARGET_NEON)
-#define HAVE_neon_vhaddv4si (TARGET_NEON)
-#define HAVE_neon_vqaddv8qi (TARGET_NEON)
-#define HAVE_neon_vqaddv16qi (TARGET_NEON)
-#define HAVE_neon_vqaddv4hi (TARGET_NEON)
-#define HAVE_neon_vqaddv8hi (TARGET_NEON)
-#define HAVE_neon_vqaddv2si (TARGET_NEON)
-#define HAVE_neon_vqaddv4si (TARGET_NEON)
-#define HAVE_neon_vqadddi (TARGET_NEON)
-#define HAVE_neon_vqaddv2di (TARGET_NEON)
-#define HAVE_neon_vaddhnv8hi (TARGET_NEON)
-#define HAVE_neon_vaddhnv4si (TARGET_NEON)
-#define HAVE_neon_vaddhnv2di (TARGET_NEON)
-#define HAVE_neon_vmulv8qi (TARGET_NEON)
-#define HAVE_neon_vmulv16qi (TARGET_NEON)
-#define HAVE_neon_vmulv4hi (TARGET_NEON)
-#define HAVE_neon_vmulv8hi (TARGET_NEON)
-#define HAVE_neon_vmulv2si (TARGET_NEON)
-#define HAVE_neon_vmulv4si (TARGET_NEON)
-#define HAVE_neon_vmulv2sf (TARGET_NEON)
-#define HAVE_neon_vmulv4sf (TARGET_NEON)
-#define HAVE_neon_vmlav8qi_unspec (TARGET_NEON)
-#define HAVE_neon_vmlav16qi_unspec (TARGET_NEON)
-#define HAVE_neon_vmlav4hi_unspec (TARGET_NEON)
-#define HAVE_neon_vmlav8hi_unspec (TARGET_NEON)
-#define HAVE_neon_vmlav2si_unspec (TARGET_NEON)
-#define HAVE_neon_vmlav4si_unspec (TARGET_NEON)
-#define HAVE_neon_vmlav2sf_unspec (TARGET_NEON)
-#define HAVE_neon_vmlav4sf_unspec (TARGET_NEON)
-#define HAVE_neon_vmlalv8qi (TARGET_NEON)
-#define HAVE_neon_vmlalv4hi (TARGET_NEON)
-#define HAVE_neon_vmlalv2si (TARGET_NEON)
-#define HAVE_neon_vmlsv8qi_unspec (TARGET_NEON)
-#define HAVE_neon_vmlsv16qi_unspec (TARGET_NEON)
-#define HAVE_neon_vmlsv4hi_unspec (TARGET_NEON)
-#define HAVE_neon_vmlsv8hi_unspec (TARGET_NEON)
-#define HAVE_neon_vmlsv2si_unspec (TARGET_NEON)
-#define HAVE_neon_vmlsv4si_unspec (TARGET_NEON)
-#define HAVE_neon_vmlsv2sf_unspec (TARGET_NEON)
-#define HAVE_neon_vmlsv4sf_unspec (TARGET_NEON)
-#define HAVE_neon_vmlslv8qi (TARGET_NEON)
-#define HAVE_neon_vmlslv4hi (TARGET_NEON)
-#define HAVE_neon_vmlslv2si (TARGET_NEON)
-#define HAVE_neon_vqdmulhv4hi (TARGET_NEON)
-#define HAVE_neon_vqdmulhv2si (TARGET_NEON)
-#define HAVE_neon_vqdmulhv8hi (TARGET_NEON)
-#define HAVE_neon_vqdmulhv4si (TARGET_NEON)
-#define HAVE_neon_vqdmlalv4hi (TARGET_NEON)
-#define HAVE_neon_vqdmlalv2si (TARGET_NEON)
-#define HAVE_neon_vqdmlslv4hi (TARGET_NEON)
-#define HAVE_neon_vqdmlslv2si (TARGET_NEON)
-#define HAVE_neon_vmullv8qi (TARGET_NEON)
-#define HAVE_neon_vmullv4hi (TARGET_NEON)
-#define HAVE_neon_vmullv2si (TARGET_NEON)
-#define HAVE_neon_vqdmullv4hi (TARGET_NEON)
-#define HAVE_neon_vqdmullv2si (TARGET_NEON)
-#define HAVE_neon_vsubv8qi_unspec (TARGET_NEON)
-#define HAVE_neon_vsubv16qi_unspec (TARGET_NEON)
-#define HAVE_neon_vsubv4hi_unspec (TARGET_NEON)
-#define HAVE_neon_vsubv8hi_unspec (TARGET_NEON)
-#define HAVE_neon_vsubv2si_unspec (TARGET_NEON)
-#define HAVE_neon_vsubv4si_unspec (TARGET_NEON)
-#define HAVE_neon_vsubv2sf_unspec (TARGET_NEON)
-#define HAVE_neon_vsubv4sf_unspec (TARGET_NEON)
-#define HAVE_neon_vsubdi_unspec (TARGET_NEON)
-#define HAVE_neon_vsubv2di_unspec (TARGET_NEON)
-#define HAVE_neon_vsublv8qi (TARGET_NEON)
-#define HAVE_neon_vsublv4hi (TARGET_NEON)
-#define HAVE_neon_vsublv2si (TARGET_NEON)
-#define HAVE_neon_vsubwv8qi (TARGET_NEON)
-#define HAVE_neon_vsubwv4hi (TARGET_NEON)
-#define HAVE_neon_vsubwv2si (TARGET_NEON)
-#define HAVE_neon_vqsubv8qi (TARGET_NEON)
-#define HAVE_neon_vqsubv16qi (TARGET_NEON)
-#define HAVE_neon_vqsubv4hi (TARGET_NEON)
-#define HAVE_neon_vqsubv8hi (TARGET_NEON)
-#define HAVE_neon_vqsubv2si (TARGET_NEON)
-#define HAVE_neon_vqsubv4si (TARGET_NEON)
-#define HAVE_neon_vqsubdi (TARGET_NEON)
-#define HAVE_neon_vqsubv2di (TARGET_NEON)
-#define HAVE_neon_vhsubv8qi (TARGET_NEON)
-#define HAVE_neon_vhsubv16qi (TARGET_NEON)
-#define HAVE_neon_vhsubv4hi (TARGET_NEON)
-#define HAVE_neon_vhsubv8hi (TARGET_NEON)
-#define HAVE_neon_vhsubv2si (TARGET_NEON)
-#define HAVE_neon_vhsubv4si (TARGET_NEON)
-#define HAVE_neon_vsubhnv8hi (TARGET_NEON)
-#define HAVE_neon_vsubhnv4si (TARGET_NEON)
-#define HAVE_neon_vsubhnv2di (TARGET_NEON)
-#define HAVE_neon_vceqv8qi (TARGET_NEON)
-#define HAVE_neon_vceqv16qi (TARGET_NEON)
-#define HAVE_neon_vceqv4hi (TARGET_NEON)
-#define HAVE_neon_vceqv8hi (TARGET_NEON)
-#define HAVE_neon_vceqv2si (TARGET_NEON)
-#define HAVE_neon_vceqv4si (TARGET_NEON)
-#define HAVE_neon_vceqv2sf (TARGET_NEON)
-#define HAVE_neon_vceqv4sf (TARGET_NEON)
-#define HAVE_neon_vcgev8qi (TARGET_NEON)
-#define HAVE_neon_vcgev16qi (TARGET_NEON)
-#define HAVE_neon_vcgev4hi (TARGET_NEON)
-#define HAVE_neon_vcgev8hi (TARGET_NEON)
-#define HAVE_neon_vcgev2si (TARGET_NEON)
-#define HAVE_neon_vcgev4si (TARGET_NEON)
-#define HAVE_neon_vcgev2sf (TARGET_NEON)
-#define HAVE_neon_vcgev4sf (TARGET_NEON)
-#define HAVE_neon_vcgeuv8qi (TARGET_NEON)
-#define HAVE_neon_vcgeuv16qi (TARGET_NEON)
-#define HAVE_neon_vcgeuv4hi (TARGET_NEON)
-#define HAVE_neon_vcgeuv8hi (TARGET_NEON)
-#define HAVE_neon_vcgeuv2si (TARGET_NEON)
-#define HAVE_neon_vcgeuv4si (TARGET_NEON)
-#define HAVE_neon_vcgtv8qi (TARGET_NEON)
-#define HAVE_neon_vcgtv16qi (TARGET_NEON)
-#define HAVE_neon_vcgtv4hi (TARGET_NEON)
-#define HAVE_neon_vcgtv8hi (TARGET_NEON)
-#define HAVE_neon_vcgtv2si (TARGET_NEON)
-#define HAVE_neon_vcgtv4si (TARGET_NEON)
-#define HAVE_neon_vcgtv2sf (TARGET_NEON)
-#define HAVE_neon_vcgtv4sf (TARGET_NEON)
-#define HAVE_neon_vcgtuv8qi (TARGET_NEON)
-#define HAVE_neon_vcgtuv16qi (TARGET_NEON)
-#define HAVE_neon_vcgtuv4hi (TARGET_NEON)
-#define HAVE_neon_vcgtuv8hi (TARGET_NEON)
-#define HAVE_neon_vcgtuv2si (TARGET_NEON)
-#define HAVE_neon_vcgtuv4si (TARGET_NEON)
-#define HAVE_neon_vclev8qi (TARGET_NEON)
-#define HAVE_neon_vclev16qi (TARGET_NEON)
-#define HAVE_neon_vclev4hi (TARGET_NEON)
-#define HAVE_neon_vclev8hi (TARGET_NEON)
-#define HAVE_neon_vclev2si (TARGET_NEON)
-#define HAVE_neon_vclev4si (TARGET_NEON)
-#define HAVE_neon_vclev2sf (TARGET_NEON)
-#define HAVE_neon_vclev4sf (TARGET_NEON)
-#define HAVE_neon_vcltv8qi (TARGET_NEON)
-#define HAVE_neon_vcltv16qi (TARGET_NEON)
-#define HAVE_neon_vcltv4hi (TARGET_NEON)
-#define HAVE_neon_vcltv8hi (TARGET_NEON)
-#define HAVE_neon_vcltv2si (TARGET_NEON)
-#define HAVE_neon_vcltv4si (TARGET_NEON)
-#define HAVE_neon_vcltv2sf (TARGET_NEON)
-#define HAVE_neon_vcltv4sf (TARGET_NEON)
-#define HAVE_neon_vcagev2sf (TARGET_NEON)
-#define HAVE_neon_vcagev4sf (TARGET_NEON)
-#define HAVE_neon_vcagtv2sf (TARGET_NEON)
-#define HAVE_neon_vcagtv4sf (TARGET_NEON)
-#define HAVE_neon_vtstv8qi (TARGET_NEON)
-#define HAVE_neon_vtstv16qi (TARGET_NEON)
-#define HAVE_neon_vtstv4hi (TARGET_NEON)
-#define HAVE_neon_vtstv8hi (TARGET_NEON)
-#define HAVE_neon_vtstv2si (TARGET_NEON)
-#define HAVE_neon_vtstv4si (TARGET_NEON)
-#define HAVE_neon_vabdv8qi (TARGET_NEON)
-#define HAVE_neon_vabdv16qi (TARGET_NEON)
-#define HAVE_neon_vabdv4hi (TARGET_NEON)
-#define HAVE_neon_vabdv8hi (TARGET_NEON)
-#define HAVE_neon_vabdv2si (TARGET_NEON)
-#define HAVE_neon_vabdv4si (TARGET_NEON)
-#define HAVE_neon_vabdv2sf (TARGET_NEON)
-#define HAVE_neon_vabdv4sf (TARGET_NEON)
-#define HAVE_neon_vabdlv8qi (TARGET_NEON)
-#define HAVE_neon_vabdlv4hi (TARGET_NEON)
-#define HAVE_neon_vabdlv2si (TARGET_NEON)
-#define HAVE_neon_vabav8qi (TARGET_NEON)
-#define HAVE_neon_vabav16qi (TARGET_NEON)
-#define HAVE_neon_vabav4hi (TARGET_NEON)
-#define HAVE_neon_vabav8hi (TARGET_NEON)
-#define HAVE_neon_vabav2si (TARGET_NEON)
-#define HAVE_neon_vabav4si (TARGET_NEON)
-#define HAVE_neon_vabalv8qi (TARGET_NEON)
-#define HAVE_neon_vabalv4hi (TARGET_NEON)
-#define HAVE_neon_vabalv2si (TARGET_NEON)
-#define HAVE_neon_vmaxv8qi (TARGET_NEON)
-#define HAVE_neon_vmaxv16qi (TARGET_NEON)
-#define HAVE_neon_vmaxv4hi (TARGET_NEON)
-#define HAVE_neon_vmaxv8hi (TARGET_NEON)
-#define HAVE_neon_vmaxv2si (TARGET_NEON)
-#define HAVE_neon_vmaxv4si (TARGET_NEON)
-#define HAVE_neon_vmaxv2sf (TARGET_NEON)
-#define HAVE_neon_vmaxv4sf (TARGET_NEON)
-#define HAVE_neon_vminv8qi (TARGET_NEON)
-#define HAVE_neon_vminv16qi (TARGET_NEON)
-#define HAVE_neon_vminv4hi (TARGET_NEON)
-#define HAVE_neon_vminv8hi (TARGET_NEON)
-#define HAVE_neon_vminv2si (TARGET_NEON)
-#define HAVE_neon_vminv4si (TARGET_NEON)
-#define HAVE_neon_vminv2sf (TARGET_NEON)
-#define HAVE_neon_vminv4sf (TARGET_NEON)
-#define HAVE_neon_vpaddlv8qi (TARGET_NEON)
-#define HAVE_neon_vpaddlv16qi (TARGET_NEON)
-#define HAVE_neon_vpaddlv4hi (TARGET_NEON)
-#define HAVE_neon_vpaddlv8hi (TARGET_NEON)
-#define HAVE_neon_vpaddlv2si (TARGET_NEON)
-#define HAVE_neon_vpaddlv4si (TARGET_NEON)
-#define HAVE_neon_vpadalv8qi (TARGET_NEON)
-#define HAVE_neon_vpadalv16qi (TARGET_NEON)
-#define HAVE_neon_vpadalv4hi (TARGET_NEON)
-#define HAVE_neon_vpadalv8hi (TARGET_NEON)
-#define HAVE_neon_vpadalv2si (TARGET_NEON)
-#define HAVE_neon_vpadalv4si (TARGET_NEON)
-#define HAVE_neon_vpmaxv8qi (TARGET_NEON)
-#define HAVE_neon_vpmaxv4hi (TARGET_NEON)
-#define HAVE_neon_vpmaxv2si (TARGET_NEON)
-#define HAVE_neon_vpmaxv2sf (TARGET_NEON)
-#define HAVE_neon_vpminv8qi (TARGET_NEON)
-#define HAVE_neon_vpminv4hi (TARGET_NEON)
-#define HAVE_neon_vpminv2si (TARGET_NEON)
-#define HAVE_neon_vpminv2sf (TARGET_NEON)
-#define HAVE_neon_vrecpsv2sf (TARGET_NEON)
-#define HAVE_neon_vrecpsv4sf (TARGET_NEON)
-#define HAVE_neon_vrsqrtsv2sf (TARGET_NEON)
-#define HAVE_neon_vrsqrtsv4sf (TARGET_NEON)
-#define HAVE_neon_vqabsv8qi (TARGET_NEON)
-#define HAVE_neon_vqabsv16qi (TARGET_NEON)
-#define HAVE_neon_vqabsv4hi (TARGET_NEON)
-#define HAVE_neon_vqabsv8hi (TARGET_NEON)
-#define HAVE_neon_vqabsv2si (TARGET_NEON)
-#define HAVE_neon_vqabsv4si (TARGET_NEON)
-#define HAVE_neon_vqnegv8qi (TARGET_NEON)
-#define HAVE_neon_vqnegv16qi (TARGET_NEON)
-#define HAVE_neon_vqnegv4hi (TARGET_NEON)
-#define HAVE_neon_vqnegv8hi (TARGET_NEON)
-#define HAVE_neon_vqnegv2si (TARGET_NEON)
-#define HAVE_neon_vqnegv4si (TARGET_NEON)
-#define HAVE_neon_vclsv8qi (TARGET_NEON)
-#define HAVE_neon_vclsv16qi (TARGET_NEON)
-#define HAVE_neon_vclsv4hi (TARGET_NEON)
-#define HAVE_neon_vclsv8hi (TARGET_NEON)
-#define HAVE_neon_vclsv2si (TARGET_NEON)
-#define HAVE_neon_vclsv4si (TARGET_NEON)
-#define HAVE_clzv8qi2 (TARGET_NEON)
-#define HAVE_clzv16qi2 (TARGET_NEON)
-#define HAVE_clzv4hi2 (TARGET_NEON)
-#define HAVE_clzv8hi2 (TARGET_NEON)
-#define HAVE_clzv2si2 (TARGET_NEON)
-#define HAVE_clzv4si2 (TARGET_NEON)
-#define HAVE_popcountv8qi2 (TARGET_NEON)
-#define HAVE_popcountv16qi2 (TARGET_NEON)
-#define HAVE_neon_vrecpev2si (TARGET_NEON)
-#define HAVE_neon_vrecpev2sf (TARGET_NEON)
-#define HAVE_neon_vrecpev4si (TARGET_NEON)
-#define HAVE_neon_vrecpev4sf (TARGET_NEON)
-#define HAVE_neon_vrsqrtev2si (TARGET_NEON)
-#define HAVE_neon_vrsqrtev2sf (TARGET_NEON)
-#define HAVE_neon_vrsqrtev4si (TARGET_NEON)
-#define HAVE_neon_vrsqrtev4sf (TARGET_NEON)
-#define HAVE_neon_vget_lanev8qi_sext_internal (TARGET_NEON)
-#define HAVE_neon_vget_lanev4hi_sext_internal (TARGET_NEON)
-#define HAVE_neon_vget_lanev2si_sext_internal (TARGET_NEON)
-#define HAVE_neon_vget_lanev2sf_sext_internal (TARGET_NEON)
-#define HAVE_neon_vget_lanev8qi_zext_internal (TARGET_NEON)
-#define HAVE_neon_vget_lanev4hi_zext_internal (TARGET_NEON)
-#define HAVE_neon_vget_lanev2si_zext_internal (TARGET_NEON)
-#define HAVE_neon_vget_lanev2sf_zext_internal (TARGET_NEON)
-#define HAVE_neon_vget_lanev16qi_sext_internal (TARGET_NEON)
-#define HAVE_neon_vget_lanev8hi_sext_internal (TARGET_NEON)
-#define HAVE_neon_vget_lanev4si_sext_internal (TARGET_NEON)
-#define HAVE_neon_vget_lanev4sf_sext_internal (TARGET_NEON)
-#define HAVE_neon_vget_lanev16qi_zext_internal (TARGET_NEON)
-#define HAVE_neon_vget_lanev8hi_zext_internal (TARGET_NEON)
-#define HAVE_neon_vget_lanev4si_zext_internal (TARGET_NEON)
-#define HAVE_neon_vget_lanev4sf_zext_internal (TARGET_NEON)
-#define HAVE_neon_vdup_nv8qi (TARGET_NEON)
-#define HAVE_neon_vdup_nv4hi (TARGET_NEON)
-#define HAVE_neon_vdup_nv16qi (TARGET_NEON)
-#define HAVE_neon_vdup_nv8hi (TARGET_NEON)
-#define HAVE_neon_vdup_nv2si (TARGET_NEON)
-#define HAVE_neon_vdup_nv2sf (TARGET_NEON)
-#define HAVE_neon_vdup_nv4si (TARGET_NEON)
-#define HAVE_neon_vdup_nv4sf (TARGET_NEON)
-#define HAVE_neon_vdup_nv2di (TARGET_NEON)
-#define HAVE_neon_vdup_lanev8qi_internal (TARGET_NEON)
-#define HAVE_neon_vdup_lanev16qi_internal (TARGET_NEON)
-#define HAVE_neon_vdup_lanev4hi_internal (TARGET_NEON)
-#define HAVE_neon_vdup_lanev8hi_internal (TARGET_NEON)
-#define HAVE_neon_vdup_lanev2si_internal (TARGET_NEON)
-#define HAVE_neon_vdup_lanev4si_internal (TARGET_NEON)
-#define HAVE_neon_vdup_lanev2sf_internal (TARGET_NEON)
-#define HAVE_neon_vdup_lanev4sf_internal (TARGET_NEON)
-#define HAVE_neon_vcombinev8qi (TARGET_NEON)
-#define HAVE_neon_vcombinev4hi (TARGET_NEON)
-#define HAVE_neon_vcombinev2si (TARGET_NEON)
-#define HAVE_neon_vcombinev2sf (TARGET_NEON)
-#define HAVE_neon_vcombinedi (TARGET_NEON)
-#define HAVE_floatv2siv2sf2 (TARGET_NEON && !flag_rounding_math)
-#define HAVE_floatv4siv4sf2 (TARGET_NEON && !flag_rounding_math)
-#define HAVE_floatunsv2siv2sf2 (TARGET_NEON && !flag_rounding_math)
-#define HAVE_floatunsv4siv4sf2 (TARGET_NEON && !flag_rounding_math)
-#define HAVE_fix_truncv2sfv2si2 (TARGET_NEON)
-#define HAVE_fix_truncv4sfv4si2 (TARGET_NEON)
-#define HAVE_fixuns_truncv2sfv2si2 (TARGET_NEON)
-#define HAVE_fixuns_truncv4sfv4si2 (TARGET_NEON)
-#define HAVE_neon_vcvtv2sf (TARGET_NEON)
-#define HAVE_neon_vcvtv4sf (TARGET_NEON)
-#define HAVE_neon_vcvtv2si (TARGET_NEON)
-#define HAVE_neon_vcvtv4si (TARGET_NEON)
-#define HAVE_neon_vcvtv4sfv4hf (TARGET_NEON && TARGET_FP16)
-#define HAVE_neon_vcvtv4hfv4sf (TARGET_NEON && TARGET_FP16)
-#define HAVE_neon_vcvt_nv2sf (TARGET_NEON)
-#define HAVE_neon_vcvt_nv4sf (TARGET_NEON)
-#define HAVE_neon_vcvt_nv2si (TARGET_NEON)
-#define HAVE_neon_vcvt_nv4si (TARGET_NEON)
-#define HAVE_neon_vmovnv8hi (TARGET_NEON)
-#define HAVE_neon_vmovnv4si (TARGET_NEON)
-#define HAVE_neon_vmovnv2di (TARGET_NEON)
-#define HAVE_neon_vqmovnv8hi (TARGET_NEON)
-#define HAVE_neon_vqmovnv4si (TARGET_NEON)
-#define HAVE_neon_vqmovnv2di (TARGET_NEON)
-#define HAVE_neon_vqmovunv8hi (TARGET_NEON)
-#define HAVE_neon_vqmovunv4si (TARGET_NEON)
-#define HAVE_neon_vqmovunv2di (TARGET_NEON)
-#define HAVE_neon_vmovlv8qi (TARGET_NEON)
-#define HAVE_neon_vmovlv4hi (TARGET_NEON)
-#define HAVE_neon_vmovlv2si (TARGET_NEON)
-#define HAVE_neon_vmul_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vmul_lanev2si (TARGET_NEON)
-#define HAVE_neon_vmul_lanev2sf (TARGET_NEON)
-#define HAVE_neon_vmul_lanev8hi (TARGET_NEON)
-#define HAVE_neon_vmul_lanev4si (TARGET_NEON)
-#define HAVE_neon_vmul_lanev4sf (TARGET_NEON)
-#define HAVE_neon_vmull_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vmull_lanev2si (TARGET_NEON)
-#define HAVE_neon_vqdmull_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vqdmull_lanev2si (TARGET_NEON)
-#define HAVE_neon_vqdmulh_lanev8hi (TARGET_NEON)
-#define HAVE_neon_vqdmulh_lanev4si (TARGET_NEON)
-#define HAVE_neon_vqdmulh_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vqdmulh_lanev2si (TARGET_NEON)
-#define HAVE_neon_vmla_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vmla_lanev2si (TARGET_NEON)
-#define HAVE_neon_vmla_lanev2sf (TARGET_NEON)
-#define HAVE_neon_vmla_lanev8hi (TARGET_NEON)
-#define HAVE_neon_vmla_lanev4si (TARGET_NEON)
-#define HAVE_neon_vmla_lanev4sf (TARGET_NEON)
-#define HAVE_neon_vmlal_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vmlal_lanev2si (TARGET_NEON)
-#define HAVE_neon_vqdmlal_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vqdmlal_lanev2si (TARGET_NEON)
-#define HAVE_neon_vmls_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vmls_lanev2si (TARGET_NEON)
-#define HAVE_neon_vmls_lanev2sf (TARGET_NEON)
-#define HAVE_neon_vmls_lanev8hi (TARGET_NEON)
-#define HAVE_neon_vmls_lanev4si (TARGET_NEON)
-#define HAVE_neon_vmls_lanev4sf (TARGET_NEON)
-#define HAVE_neon_vmlsl_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vmlsl_lanev2si (TARGET_NEON)
-#define HAVE_neon_vqdmlsl_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vqdmlsl_lanev2si (TARGET_NEON)
-#define HAVE_neon_vextv8qi (TARGET_NEON)
-#define HAVE_neon_vextv16qi (TARGET_NEON)
-#define HAVE_neon_vextv4hi (TARGET_NEON)
-#define HAVE_neon_vextv8hi (TARGET_NEON)
-#define HAVE_neon_vextv2si (TARGET_NEON)
-#define HAVE_neon_vextv4si (TARGET_NEON)
-#define HAVE_neon_vextv2sf (TARGET_NEON)
-#define HAVE_neon_vextv4sf (TARGET_NEON)
-#define HAVE_neon_vextdi (TARGET_NEON)
-#define HAVE_neon_vextv2di (TARGET_NEON)
-#define HAVE_neon_vrev64v8qi (TARGET_NEON)
-#define HAVE_neon_vrev64v16qi (TARGET_NEON)
-#define HAVE_neon_vrev64v4hi (TARGET_NEON)
-#define HAVE_neon_vrev64v8hi (TARGET_NEON)
-#define HAVE_neon_vrev64v2si (TARGET_NEON)
-#define HAVE_neon_vrev64v4si (TARGET_NEON)
-#define HAVE_neon_vrev64v2sf (TARGET_NEON)
-#define HAVE_neon_vrev64v4sf (TARGET_NEON)
-#define HAVE_neon_vrev64v2di (TARGET_NEON)
-#define HAVE_neon_vrev32v8qi (TARGET_NEON)
-#define HAVE_neon_vrev32v4hi (TARGET_NEON)
-#define HAVE_neon_vrev32v16qi (TARGET_NEON)
-#define HAVE_neon_vrev32v8hi (TARGET_NEON)
-#define HAVE_neon_vrev16v8qi (TARGET_NEON)
-#define HAVE_neon_vrev16v16qi (TARGET_NEON)
-#define HAVE_neon_vbslv8qi_internal (TARGET_NEON)
-#define HAVE_neon_vbslv16qi_internal (TARGET_NEON)
-#define HAVE_neon_vbslv4hi_internal (TARGET_NEON)
-#define HAVE_neon_vbslv8hi_internal (TARGET_NEON)
-#define HAVE_neon_vbslv2si_internal (TARGET_NEON)
-#define HAVE_neon_vbslv4si_internal (TARGET_NEON)
-#define HAVE_neon_vbslv2sf_internal (TARGET_NEON)
-#define HAVE_neon_vbslv4sf_internal (TARGET_NEON)
-#define HAVE_neon_vbsldi_internal (TARGET_NEON)
-#define HAVE_neon_vbslv2di_internal (TARGET_NEON)
-#define HAVE_neon_vshlv8qi (TARGET_NEON)
-#define HAVE_neon_vshlv16qi (TARGET_NEON)
-#define HAVE_neon_vshlv4hi (TARGET_NEON)
-#define HAVE_neon_vshlv8hi (TARGET_NEON)
-#define HAVE_neon_vshlv2si (TARGET_NEON)
-#define HAVE_neon_vshlv4si (TARGET_NEON)
-#define HAVE_neon_vshldi (TARGET_NEON)
-#define HAVE_neon_vshlv2di (TARGET_NEON)
-#define HAVE_neon_vqshlv8qi (TARGET_NEON)
-#define HAVE_neon_vqshlv16qi (TARGET_NEON)
-#define HAVE_neon_vqshlv4hi (TARGET_NEON)
-#define HAVE_neon_vqshlv8hi (TARGET_NEON)
-#define HAVE_neon_vqshlv2si (TARGET_NEON)
-#define HAVE_neon_vqshlv4si (TARGET_NEON)
-#define HAVE_neon_vqshldi (TARGET_NEON)
-#define HAVE_neon_vqshlv2di (TARGET_NEON)
-#define HAVE_neon_vshr_nv8qi (TARGET_NEON)
-#define HAVE_neon_vshr_nv16qi (TARGET_NEON)
-#define HAVE_neon_vshr_nv4hi (TARGET_NEON)
-#define HAVE_neon_vshr_nv8hi (TARGET_NEON)
-#define HAVE_neon_vshr_nv2si (TARGET_NEON)
-#define HAVE_neon_vshr_nv4si (TARGET_NEON)
-#define HAVE_neon_vshr_ndi (TARGET_NEON)
-#define HAVE_neon_vshr_nv2di (TARGET_NEON)
-#define HAVE_neon_vshrn_nv8hi (TARGET_NEON)
-#define HAVE_neon_vshrn_nv4si (TARGET_NEON)
-#define HAVE_neon_vshrn_nv2di (TARGET_NEON)
-#define HAVE_neon_vqshrn_nv8hi (TARGET_NEON)
-#define HAVE_neon_vqshrn_nv4si (TARGET_NEON)
-#define HAVE_neon_vqshrn_nv2di (TARGET_NEON)
-#define HAVE_neon_vqshrun_nv8hi (TARGET_NEON)
-#define HAVE_neon_vqshrun_nv4si (TARGET_NEON)
-#define HAVE_neon_vqshrun_nv2di (TARGET_NEON)
-#define HAVE_neon_vshl_nv8qi (TARGET_NEON)
-#define HAVE_neon_vshl_nv16qi (TARGET_NEON)
-#define HAVE_neon_vshl_nv4hi (TARGET_NEON)
-#define HAVE_neon_vshl_nv8hi (TARGET_NEON)
-#define HAVE_neon_vshl_nv2si (TARGET_NEON)
-#define HAVE_neon_vshl_nv4si (TARGET_NEON)
-#define HAVE_neon_vshl_ndi (TARGET_NEON)
-#define HAVE_neon_vshl_nv2di (TARGET_NEON)
-#define HAVE_neon_vqshl_nv8qi (TARGET_NEON)
-#define HAVE_neon_vqshl_nv16qi (TARGET_NEON)
-#define HAVE_neon_vqshl_nv4hi (TARGET_NEON)
-#define HAVE_neon_vqshl_nv8hi (TARGET_NEON)
-#define HAVE_neon_vqshl_nv2si (TARGET_NEON)
-#define HAVE_neon_vqshl_nv4si (TARGET_NEON)
-#define HAVE_neon_vqshl_ndi (TARGET_NEON)
-#define HAVE_neon_vqshl_nv2di (TARGET_NEON)
-#define HAVE_neon_vqshlu_nv8qi (TARGET_NEON)
-#define HAVE_neon_vqshlu_nv16qi (TARGET_NEON)
-#define HAVE_neon_vqshlu_nv4hi (TARGET_NEON)
-#define HAVE_neon_vqshlu_nv8hi (TARGET_NEON)
-#define HAVE_neon_vqshlu_nv2si (TARGET_NEON)
-#define HAVE_neon_vqshlu_nv4si (TARGET_NEON)
-#define HAVE_neon_vqshlu_ndi (TARGET_NEON)
-#define HAVE_neon_vqshlu_nv2di (TARGET_NEON)
-#define HAVE_neon_vshll_nv8qi (TARGET_NEON)
-#define HAVE_neon_vshll_nv4hi (TARGET_NEON)
-#define HAVE_neon_vshll_nv2si (TARGET_NEON)
-#define HAVE_neon_vsra_nv8qi (TARGET_NEON)
-#define HAVE_neon_vsra_nv16qi (TARGET_NEON)
-#define HAVE_neon_vsra_nv4hi (TARGET_NEON)
-#define HAVE_neon_vsra_nv8hi (TARGET_NEON)
-#define HAVE_neon_vsra_nv2si (TARGET_NEON)
-#define HAVE_neon_vsra_nv4si (TARGET_NEON)
-#define HAVE_neon_vsra_ndi (TARGET_NEON)
-#define HAVE_neon_vsra_nv2di (TARGET_NEON)
-#define HAVE_neon_vsri_nv8qi (TARGET_NEON)
-#define HAVE_neon_vsri_nv16qi (TARGET_NEON)
-#define HAVE_neon_vsri_nv4hi (TARGET_NEON)
-#define HAVE_neon_vsri_nv8hi (TARGET_NEON)
-#define HAVE_neon_vsri_nv2si (TARGET_NEON)
-#define HAVE_neon_vsri_nv4si (TARGET_NEON)
-#define HAVE_neon_vsri_ndi (TARGET_NEON)
-#define HAVE_neon_vsri_nv2di (TARGET_NEON)
-#define HAVE_neon_vsli_nv8qi (TARGET_NEON)
-#define HAVE_neon_vsli_nv16qi (TARGET_NEON)
-#define HAVE_neon_vsli_nv4hi (TARGET_NEON)
-#define HAVE_neon_vsli_nv8hi (TARGET_NEON)
-#define HAVE_neon_vsli_nv2si (TARGET_NEON)
-#define HAVE_neon_vsli_nv4si (TARGET_NEON)
-#define HAVE_neon_vsli_ndi (TARGET_NEON)
-#define HAVE_neon_vsli_nv2di (TARGET_NEON)
-#define HAVE_neon_vtbl1v8qi (TARGET_NEON)
-#define HAVE_neon_vtbl2v8qi (TARGET_NEON)
-#define HAVE_neon_vtbl3v8qi (TARGET_NEON)
-#define HAVE_neon_vtbl4v8qi (TARGET_NEON)
-#define HAVE_neon_vtbl1v16qi (TARGET_NEON)
-#define HAVE_neon_vtbl2v16qi (TARGET_NEON)
-#define HAVE_neon_vcombinev16qi (TARGET_NEON)
-#define HAVE_neon_vtbx1v8qi (TARGET_NEON)
-#define HAVE_neon_vtbx2v8qi (TARGET_NEON)
-#define HAVE_neon_vtbx3v8qi (TARGET_NEON)
-#define HAVE_neon_vtbx4v8qi (TARGET_NEON)
-#define HAVE_neon_vld1v8qi (TARGET_NEON)
-#define HAVE_neon_vld1v16qi (TARGET_NEON)
-#define HAVE_neon_vld1v4hi (TARGET_NEON)
-#define HAVE_neon_vld1v8hi (TARGET_NEON)
-#define HAVE_neon_vld1v2si (TARGET_NEON)
-#define HAVE_neon_vld1v4si (TARGET_NEON)
-#define HAVE_neon_vld1v2sf (TARGET_NEON)
-#define HAVE_neon_vld1v4sf (TARGET_NEON)
-#define HAVE_neon_vld1di (TARGET_NEON)
-#define HAVE_neon_vld1v2di (TARGET_NEON)
-#define HAVE_neon_vld1_lanev8qi (TARGET_NEON)
-#define HAVE_neon_vld1_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vld1_lanev2si (TARGET_NEON)
-#define HAVE_neon_vld1_lanev2sf (TARGET_NEON)
-#define HAVE_neon_vld1_lanedi (TARGET_NEON)
-#define HAVE_neon_vld1_lanev16qi (TARGET_NEON)
-#define HAVE_neon_vld1_lanev8hi (TARGET_NEON)
-#define HAVE_neon_vld1_lanev4si (TARGET_NEON)
-#define HAVE_neon_vld1_lanev4sf (TARGET_NEON)
-#define HAVE_neon_vld1_lanev2di (TARGET_NEON)
-#define HAVE_neon_vld1_dupv8qi (TARGET_NEON)
-#define HAVE_neon_vld1_dupv4hi (TARGET_NEON)
-#define HAVE_neon_vld1_dupv2si (TARGET_NEON)
-#define HAVE_neon_vld1_dupv2sf (TARGET_NEON)
-#define HAVE_neon_vld1_dupv16qi (TARGET_NEON)
-#define HAVE_neon_vld1_dupv8hi (TARGET_NEON)
-#define HAVE_neon_vld1_dupv4si (TARGET_NEON)
-#define HAVE_neon_vld1_dupv4sf (TARGET_NEON)
-#define HAVE_neon_vld1_dupv2di (TARGET_NEON)
-#define HAVE_neon_vst1v8qi (TARGET_NEON)
-#define HAVE_neon_vst1v16qi (TARGET_NEON)
-#define HAVE_neon_vst1v4hi (TARGET_NEON)
-#define HAVE_neon_vst1v8hi (TARGET_NEON)
-#define HAVE_neon_vst1v2si (TARGET_NEON)
-#define HAVE_neon_vst1v4si (TARGET_NEON)
-#define HAVE_neon_vst1v2sf (TARGET_NEON)
-#define HAVE_neon_vst1v4sf (TARGET_NEON)
-#define HAVE_neon_vst1di (TARGET_NEON)
-#define HAVE_neon_vst1v2di (TARGET_NEON)
-#define HAVE_neon_vst1_lanev8qi (TARGET_NEON)
-#define HAVE_neon_vst1_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vst1_lanev2si (TARGET_NEON)
-#define HAVE_neon_vst1_lanev2sf (TARGET_NEON)
-#define HAVE_neon_vst1_lanedi (TARGET_NEON)
-#define HAVE_neon_vst1_lanev16qi (TARGET_NEON)
-#define HAVE_neon_vst1_lanev8hi (TARGET_NEON)
-#define HAVE_neon_vst1_lanev4si (TARGET_NEON)
-#define HAVE_neon_vst1_lanev4sf (TARGET_NEON)
-#define HAVE_neon_vst1_lanev2di (TARGET_NEON)
-#define HAVE_neon_vld2v8qi (TARGET_NEON)
-#define HAVE_neon_vld2v4hi (TARGET_NEON)
-#define HAVE_neon_vld2v2si (TARGET_NEON)
-#define HAVE_neon_vld2v2sf (TARGET_NEON)
-#define HAVE_neon_vld2di (TARGET_NEON)
-#define HAVE_neon_vld2v16qi (TARGET_NEON)
-#define HAVE_neon_vld2v8hi (TARGET_NEON)
-#define HAVE_neon_vld2v4si (TARGET_NEON)
-#define HAVE_neon_vld2v4sf (TARGET_NEON)
-#define HAVE_neon_vld2_lanev8qi (TARGET_NEON)
-#define HAVE_neon_vld2_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vld2_lanev2si (TARGET_NEON)
-#define HAVE_neon_vld2_lanev2sf (TARGET_NEON)
-#define HAVE_neon_vld2_lanev8hi (TARGET_NEON)
-#define HAVE_neon_vld2_lanev4si (TARGET_NEON)
-#define HAVE_neon_vld2_lanev4sf (TARGET_NEON)
-#define HAVE_neon_vld2_dupv8qi (TARGET_NEON)
-#define HAVE_neon_vld2_dupv4hi (TARGET_NEON)
-#define HAVE_neon_vld2_dupv2si (TARGET_NEON)
-#define HAVE_neon_vld2_dupv2sf (TARGET_NEON)
-#define HAVE_neon_vld2_dupdi (TARGET_NEON)
-#define HAVE_neon_vst2v8qi (TARGET_NEON)
-#define HAVE_neon_vst2v4hi (TARGET_NEON)
-#define HAVE_neon_vst2v2si (TARGET_NEON)
-#define HAVE_neon_vst2v2sf (TARGET_NEON)
-#define HAVE_neon_vst2di (TARGET_NEON)
-#define HAVE_neon_vst2v16qi (TARGET_NEON)
-#define HAVE_neon_vst2v8hi (TARGET_NEON)
-#define HAVE_neon_vst2v4si (TARGET_NEON)
-#define HAVE_neon_vst2v4sf (TARGET_NEON)
-#define HAVE_neon_vst2_lanev8qi (TARGET_NEON)
-#define HAVE_neon_vst2_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vst2_lanev2si (TARGET_NEON)
-#define HAVE_neon_vst2_lanev2sf (TARGET_NEON)
-#define HAVE_neon_vst2_lanev8hi (TARGET_NEON)
-#define HAVE_neon_vst2_lanev4si (TARGET_NEON)
-#define HAVE_neon_vst2_lanev4sf (TARGET_NEON)
-#define HAVE_neon_vld3v8qi (TARGET_NEON)
-#define HAVE_neon_vld3v4hi (TARGET_NEON)
-#define HAVE_neon_vld3v2si (TARGET_NEON)
-#define HAVE_neon_vld3v2sf (TARGET_NEON)
-#define HAVE_neon_vld3di (TARGET_NEON)
-#define HAVE_neon_vld3qav16qi (TARGET_NEON)
-#define HAVE_neon_vld3qav8hi (TARGET_NEON)
-#define HAVE_neon_vld3qav4si (TARGET_NEON)
-#define HAVE_neon_vld3qav4sf (TARGET_NEON)
-#define HAVE_neon_vld3qbv16qi (TARGET_NEON)
-#define HAVE_neon_vld3qbv8hi (TARGET_NEON)
-#define HAVE_neon_vld3qbv4si (TARGET_NEON)
-#define HAVE_neon_vld3qbv4sf (TARGET_NEON)
-#define HAVE_neon_vld3_lanev8qi (TARGET_NEON)
-#define HAVE_neon_vld3_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vld3_lanev2si (TARGET_NEON)
-#define HAVE_neon_vld3_lanev2sf (TARGET_NEON)
-#define HAVE_neon_vld3_lanev8hi (TARGET_NEON)
-#define HAVE_neon_vld3_lanev4si (TARGET_NEON)
-#define HAVE_neon_vld3_lanev4sf (TARGET_NEON)
-#define HAVE_neon_vld3_dupv8qi (TARGET_NEON)
-#define HAVE_neon_vld3_dupv4hi (TARGET_NEON)
-#define HAVE_neon_vld3_dupv2si (TARGET_NEON)
-#define HAVE_neon_vld3_dupv2sf (TARGET_NEON)
-#define HAVE_neon_vld3_dupdi (TARGET_NEON)
-#define HAVE_neon_vst3v8qi (TARGET_NEON)
-#define HAVE_neon_vst3v4hi (TARGET_NEON)
-#define HAVE_neon_vst3v2si (TARGET_NEON)
-#define HAVE_neon_vst3v2sf (TARGET_NEON)
-#define HAVE_neon_vst3di (TARGET_NEON)
-#define HAVE_neon_vst3qav16qi (TARGET_NEON)
-#define HAVE_neon_vst3qav8hi (TARGET_NEON)
-#define HAVE_neon_vst3qav4si (TARGET_NEON)
-#define HAVE_neon_vst3qav4sf (TARGET_NEON)
-#define HAVE_neon_vst3qbv16qi (TARGET_NEON)
-#define HAVE_neon_vst3qbv8hi (TARGET_NEON)
-#define HAVE_neon_vst3qbv4si (TARGET_NEON)
-#define HAVE_neon_vst3qbv4sf (TARGET_NEON)
-#define HAVE_neon_vst3_lanev8qi (TARGET_NEON)
-#define HAVE_neon_vst3_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vst3_lanev2si (TARGET_NEON)
-#define HAVE_neon_vst3_lanev2sf (TARGET_NEON)
-#define HAVE_neon_vst3_lanev8hi (TARGET_NEON)
-#define HAVE_neon_vst3_lanev4si (TARGET_NEON)
-#define HAVE_neon_vst3_lanev4sf (TARGET_NEON)
-#define HAVE_neon_vld4v8qi (TARGET_NEON)
-#define HAVE_neon_vld4v4hi (TARGET_NEON)
-#define HAVE_neon_vld4v2si (TARGET_NEON)
-#define HAVE_neon_vld4v2sf (TARGET_NEON)
-#define HAVE_neon_vld4di (TARGET_NEON)
-#define HAVE_neon_vld4qav16qi (TARGET_NEON)
-#define HAVE_neon_vld4qav8hi (TARGET_NEON)
-#define HAVE_neon_vld4qav4si (TARGET_NEON)
-#define HAVE_neon_vld4qav4sf (TARGET_NEON)
-#define HAVE_neon_vld4qbv16qi (TARGET_NEON)
-#define HAVE_neon_vld4qbv8hi (TARGET_NEON)
-#define HAVE_neon_vld4qbv4si (TARGET_NEON)
-#define HAVE_neon_vld4qbv4sf (TARGET_NEON)
-#define HAVE_neon_vld4_lanev8qi (TARGET_NEON)
-#define HAVE_neon_vld4_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vld4_lanev2si (TARGET_NEON)
-#define HAVE_neon_vld4_lanev2sf (TARGET_NEON)
-#define HAVE_neon_vld4_lanev8hi (TARGET_NEON)
-#define HAVE_neon_vld4_lanev4si (TARGET_NEON)
-#define HAVE_neon_vld4_lanev4sf (TARGET_NEON)
-#define HAVE_neon_vld4_dupv8qi (TARGET_NEON)
-#define HAVE_neon_vld4_dupv4hi (TARGET_NEON)
-#define HAVE_neon_vld4_dupv2si (TARGET_NEON)
-#define HAVE_neon_vld4_dupv2sf (TARGET_NEON)
-#define HAVE_neon_vld4_dupdi (TARGET_NEON)
-#define HAVE_neon_vst4v8qi (TARGET_NEON)
-#define HAVE_neon_vst4v4hi (TARGET_NEON)
-#define HAVE_neon_vst4v2si (TARGET_NEON)
-#define HAVE_neon_vst4v2sf (TARGET_NEON)
-#define HAVE_neon_vst4di (TARGET_NEON)
-#define HAVE_neon_vst4qav16qi (TARGET_NEON)
-#define HAVE_neon_vst4qav8hi (TARGET_NEON)
-#define HAVE_neon_vst4qav4si (TARGET_NEON)
-#define HAVE_neon_vst4qav4sf (TARGET_NEON)
-#define HAVE_neon_vst4qbv16qi (TARGET_NEON)
-#define HAVE_neon_vst4qbv8hi (TARGET_NEON)
-#define HAVE_neon_vst4qbv4si (TARGET_NEON)
-#define HAVE_neon_vst4qbv4sf (TARGET_NEON)
-#define HAVE_neon_vst4_lanev8qi (TARGET_NEON)
-#define HAVE_neon_vst4_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vst4_lanev2si (TARGET_NEON)
-#define HAVE_neon_vst4_lanev2sf (TARGET_NEON)
-#define HAVE_neon_vst4_lanev8hi (TARGET_NEON)
-#define HAVE_neon_vst4_lanev4si (TARGET_NEON)
-#define HAVE_neon_vst4_lanev4sf (TARGET_NEON)
-#define HAVE_neon_vec_unpacks_lo_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_unpacku_lo_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_unpacks_lo_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_unpacku_lo_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_unpacks_lo_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_unpacku_lo_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_unpacks_hi_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_unpacku_hi_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_unpacks_hi_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_unpacku_hi_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_unpacks_hi_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_unpacku_hi_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_smult_lo_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_umult_lo_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_smult_lo_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_umult_lo_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_smult_lo_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_umult_lo_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_smult_hi_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_umult_hi_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_smult_hi_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_umult_hi_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_smult_hi_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_umult_hi_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_sshiftl_v8qi (TARGET_NEON)
-#define HAVE_neon_vec_ushiftl_v8qi (TARGET_NEON)
-#define HAVE_neon_vec_sshiftl_v4hi (TARGET_NEON)
-#define HAVE_neon_vec_ushiftl_v4hi (TARGET_NEON)
-#define HAVE_neon_vec_sshiftl_v2si (TARGET_NEON)
-#define HAVE_neon_vec_ushiftl_v2si (TARGET_NEON)
-#define HAVE_neon_unpacks_v8qi (TARGET_NEON)
-#define HAVE_neon_unpacku_v8qi (TARGET_NEON)
-#define HAVE_neon_unpacks_v4hi (TARGET_NEON)
-#define HAVE_neon_unpacku_v4hi (TARGET_NEON)
-#define HAVE_neon_unpacks_v2si (TARGET_NEON)
-#define HAVE_neon_unpacku_v2si (TARGET_NEON)
-#define HAVE_neon_vec_smult_v8qi (TARGET_NEON)
-#define HAVE_neon_vec_umult_v8qi (TARGET_NEON)
-#define HAVE_neon_vec_smult_v4hi (TARGET_NEON)
-#define HAVE_neon_vec_umult_v4hi (TARGET_NEON)
-#define HAVE_neon_vec_smult_v2si (TARGET_NEON)
-#define HAVE_neon_vec_umult_v2si (TARGET_NEON)
-#define HAVE_vec_pack_trunc_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_pack_trunc_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_pack_trunc_v2di (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_pack_trunc_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_pack_trunc_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vec_pack_trunc_v2di (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_neon_vabdv8qi_2 (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_neon_vabdv16qi_2 (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_neon_vabdv4hi_2 (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_neon_vabdv8hi_2 (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_neon_vabdv2si_2 (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_neon_vabdv4si_2 (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_neon_vabdv2sf_2 (TARGET_NEON && (!true || flag_unsafe_math_optimizations))
-#define HAVE_neon_vabdv4sf_2 (TARGET_NEON && (!true || flag_unsafe_math_optimizations))
-#define HAVE_neon_vabdv2di_2 (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_neon_vabdv8qi_3 (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_neon_vabdv16qi_3 (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_neon_vabdv4hi_3 (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_neon_vabdv8hi_3 (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_neon_vabdv2si_3 (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_neon_vabdv4si_3 (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_neon_vabdv2sf_3 (TARGET_NEON && (!true || flag_unsafe_math_optimizations))
-#define HAVE_neon_vabdv4sf_3 (TARGET_NEON && (!true || flag_unsafe_math_optimizations))
-#define HAVE_neon_vabdv2di_3 (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_crypto_aesmc (TARGET_CRYPTO)
-#define HAVE_crypto_aesimc (TARGET_CRYPTO)
-#define HAVE_crypto_aesd (TARGET_CRYPTO)
-#define HAVE_crypto_aese (TARGET_CRYPTO)
-#define HAVE_crypto_sha1su1 (TARGET_CRYPTO)
-#define HAVE_crypto_sha256su0 (TARGET_CRYPTO)
-#define HAVE_crypto_sha1su0 (TARGET_CRYPTO)
-#define HAVE_crypto_sha256h (TARGET_CRYPTO)
-#define HAVE_crypto_sha256h2 (TARGET_CRYPTO)
-#define HAVE_crypto_sha256su1 (TARGET_CRYPTO)
-#define HAVE_crypto_sha1h (TARGET_CRYPTO)
-#define HAVE_crypto_vmullp64 (TARGET_CRYPTO)
-#define HAVE_crypto_sha1c (TARGET_CRYPTO)
-#define HAVE_crypto_sha1m (TARGET_CRYPTO)
-#define HAVE_crypto_sha1p (TARGET_CRYPTO)
-#define HAVE_atomic_loadqi (TARGET_HAVE_LDACQ)
-#define HAVE_atomic_loadhi (TARGET_HAVE_LDACQ)
-#define HAVE_atomic_loadsi (TARGET_HAVE_LDACQ)
-#define HAVE_atomic_storeqi (TARGET_HAVE_LDACQ)
-#define HAVE_atomic_storehi (TARGET_HAVE_LDACQ)
-#define HAVE_atomic_storesi (TARGET_HAVE_LDACQ)
-#define HAVE_atomic_loaddi_1 (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN)
-#define HAVE_atomic_compare_and_swapqi_1 (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_compare_and_swaphi_1 (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_compare_and_swapsi_1 (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_compare_and_swapdi_1 (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_exchangeqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_exchangehi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_exchangesi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_exchangedi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_addqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_subqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_orqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_xorqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_andqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_addhi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_subhi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_orhi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_xorhi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_andhi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_addsi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_subsi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_orsi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_xorsi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_andsi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_adddi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_subdi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_ordi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_xordi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_anddi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_nandqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_nandhi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_nandsi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_nanddi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_addqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_subqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_orqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_xorqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_andqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_addhi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_subhi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_orhi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_xorhi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_andhi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_addsi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_subsi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_orsi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_xorsi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_andsi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_adddi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_subdi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_ordi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_xordi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_anddi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_nandqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_nandhi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_nandsi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_fetch_nanddi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_add_fetchqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_sub_fetchqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_or_fetchqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_xor_fetchqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_and_fetchqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_add_fetchhi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_sub_fetchhi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_or_fetchhi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_xor_fetchhi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_and_fetchhi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_add_fetchsi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_sub_fetchsi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_or_fetchsi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_xor_fetchsi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_and_fetchsi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_add_fetchdi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_sub_fetchdi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_or_fetchdi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_xor_fetchdi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_and_fetchdi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_nand_fetchqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_nand_fetchhi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_nand_fetchsi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_nand_fetchdi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_arm_load_exclusiveqi (TARGET_HAVE_LDREXBH)
-#define HAVE_arm_load_exclusivehi (TARGET_HAVE_LDREXBH)
-#define HAVE_arm_load_acquire_exclusiveqi (TARGET_HAVE_LDACQ)
-#define HAVE_arm_load_acquire_exclusivehi (TARGET_HAVE_LDACQ)
-#define HAVE_arm_load_exclusivesi (TARGET_HAVE_LDREX)
-#define HAVE_arm_load_acquire_exclusivesi (TARGET_HAVE_LDACQ)
-#define HAVE_arm_load_exclusivedi (TARGET_HAVE_LDREXD)
-#define HAVE_arm_load_acquire_exclusivedi (TARGET_HAVE_LDACQ && ARM_DOUBLEWORD_ALIGN)
-#define HAVE_arm_store_exclusiveqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_arm_store_exclusivehi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_arm_store_exclusivesi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_arm_store_exclusivedi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_arm_store_release_exclusivedi (TARGET_HAVE_LDACQ && ARM_DOUBLEWORD_ALIGN)
-#define HAVE_arm_store_release_exclusiveqi (TARGET_HAVE_LDACQ)
-#define HAVE_arm_store_release_exclusivehi (TARGET_HAVE_LDACQ)
-#define HAVE_arm_store_release_exclusivesi (TARGET_HAVE_LDACQ)
-#define HAVE_addqq3 (TARGET_32BIT)
-#define HAVE_addhq3 (TARGET_32BIT)
-#define HAVE_addsq3 (TARGET_32BIT)
-#define HAVE_adduqq3 (TARGET_32BIT)
-#define HAVE_adduhq3 (TARGET_32BIT)
-#define HAVE_addusq3 (TARGET_32BIT)
-#define HAVE_addha3 (TARGET_32BIT)
-#define HAVE_addsa3 (TARGET_32BIT)
-#define HAVE_adduha3 (TARGET_32BIT)
-#define HAVE_addusa3 (TARGET_32BIT)
-#define HAVE_addv4qq3 (TARGET_INT_SIMD)
-#define HAVE_addv2hq3 (TARGET_INT_SIMD)
-#define HAVE_addv2ha3 (TARGET_INT_SIMD)
-#define HAVE_usaddv4uqq3 (TARGET_INT_SIMD)
-#define HAVE_usaddv2uhq3 (TARGET_INT_SIMD)
-#define HAVE_usadduqq3 (TARGET_INT_SIMD)
-#define HAVE_usadduhq3 (TARGET_INT_SIMD)
-#define HAVE_usaddv2uha3 (TARGET_INT_SIMD)
-#define HAVE_usadduha3 (TARGET_INT_SIMD)
-#define HAVE_ssaddv4qq3 (TARGET_INT_SIMD)
-#define HAVE_ssaddv2hq3 (TARGET_INT_SIMD)
-#define HAVE_ssaddqq3 (TARGET_INT_SIMD)
-#define HAVE_ssaddhq3 (TARGET_INT_SIMD)
-#define HAVE_ssaddv2ha3 (TARGET_INT_SIMD)
-#define HAVE_ssaddha3 (TARGET_INT_SIMD)
-#define HAVE_ssaddsq3 (TARGET_INT_SIMD)
-#define HAVE_ssaddsa3 (TARGET_INT_SIMD)
-#define HAVE_subqq3 (TARGET_32BIT)
-#define HAVE_subhq3 (TARGET_32BIT)
-#define HAVE_subsq3 (TARGET_32BIT)
-#define HAVE_subuqq3 (TARGET_32BIT)
-#define HAVE_subuhq3 (TARGET_32BIT)
-#define HAVE_subusq3 (TARGET_32BIT)
-#define HAVE_subha3 (TARGET_32BIT)
-#define HAVE_subsa3 (TARGET_32BIT)
-#define HAVE_subuha3 (TARGET_32BIT)
-#define HAVE_subusa3 (TARGET_32BIT)
-#define HAVE_subv4qq3 (TARGET_INT_SIMD)
-#define HAVE_subv2hq3 (TARGET_INT_SIMD)
-#define HAVE_subv2ha3 (TARGET_INT_SIMD)
-#define HAVE_ussubv4uqq3 (TARGET_INT_SIMD)
-#define HAVE_ussubv2uhq3 (TARGET_INT_SIMD)
-#define HAVE_ussubuqq3 (TARGET_INT_SIMD)
-#define HAVE_ussubuhq3 (TARGET_INT_SIMD)
-#define HAVE_ussubv2uha3 (TARGET_INT_SIMD)
-#define HAVE_ussubuha3 (TARGET_INT_SIMD)
-#define HAVE_sssubv4qq3 (TARGET_INT_SIMD)
-#define HAVE_sssubv2hq3 (TARGET_INT_SIMD)
-#define HAVE_sssubqq3 (TARGET_INT_SIMD)
-#define HAVE_sssubhq3 (TARGET_INT_SIMD)
-#define HAVE_sssubv2ha3 (TARGET_INT_SIMD)
-#define HAVE_sssubha3 (TARGET_INT_SIMD)
-#define HAVE_sssubsq3 (TARGET_INT_SIMD)
-#define HAVE_sssubsa3 (TARGET_INT_SIMD)
-#define HAVE_ssmulsa3 (TARGET_32BIT && arm_arch6)
-#define HAVE_usmulusa3 (TARGET_32BIT && arm_arch6)
-#define HAVE_arm_ssatsihi_shift (TARGET_32BIT && arm_arch6)
-#define HAVE_arm_usatsihi (TARGET_INT_SIMD)
-#define HAVE_adddi3 1
-#define HAVE_addsi3 1
-#define HAVE_addsf3 (TARGET_32BIT && TARGET_HARD_FLOAT)
-#define HAVE_adddf3 (TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE)
-#define HAVE_subdi3 1
-#define HAVE_subsi3 1
-#define HAVE_subsf3 (TARGET_32BIT && TARGET_HARD_FLOAT)
-#define HAVE_subdf3 (TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE)
-#define HAVE_mulhi3 (TARGET_DSP_MULTIPLY)
-#define HAVE_mulsi3 1
-#define HAVE_maddsidi4 (TARGET_32BIT && arm_arch3m)
-#define HAVE_mulsidi3 (TARGET_32BIT && arm_arch3m)
-#define HAVE_umulsidi3 (TARGET_32BIT && arm_arch3m)
-#define HAVE_umaddsidi4 (TARGET_32BIT && arm_arch3m)
-#define HAVE_smulsi3_highpart (TARGET_32BIT && arm_arch3m)
-#define HAVE_umulsi3_highpart (TARGET_32BIT && arm_arch3m)
-#define HAVE_mulsf3 (TARGET_32BIT && TARGET_HARD_FLOAT)
-#define HAVE_muldf3 (TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE)
-#define HAVE_divsf3 (TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP)
-#define HAVE_divdf3 (TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE)
-#define HAVE_anddi3 (TARGET_32BIT)
-#define HAVE_andsi3 1
-#define HAVE_insv (TARGET_ARM || arm_arch_thumb2)
-#define HAVE_iordi3 (TARGET_32BIT)
-#define HAVE_iorsi3 1
-#define HAVE_xordi3 (TARGET_32BIT)
-#define HAVE_xorsi3 1
-#define HAVE_smaxsi3 (TARGET_32BIT)
-#define HAVE_sminsi3 (TARGET_32BIT)
-#define HAVE_umaxsi3 (TARGET_32BIT)
-#define HAVE_uminsi3 (TARGET_32BIT)
-#define HAVE_ashldi3 (TARGET_32BIT)
-#define HAVE_ashlsi3 1
-#define HAVE_ashrdi3 (TARGET_32BIT)
-#define HAVE_ashrsi3 1
-#define HAVE_lshrdi3 (TARGET_32BIT)
-#define HAVE_lshrsi3 1
-#define HAVE_rotlsi3 (TARGET_32BIT)
-#define HAVE_rotrsi3 1
-#define HAVE_extzv (TARGET_THUMB1 || arm_arch_thumb2)
-#define HAVE_extzv_t1 (TARGET_THUMB1)
-#define HAVE_extv (arm_arch_thumb2)
-#define HAVE_extv_regsi 1
-#define HAVE_negdi2 1
-#define HAVE_negsi2 1
-#define HAVE_negsf2 (TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP)
-#define HAVE_negdf2 (TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE)
-#define HAVE_abssi2 1
-#define HAVE_abssf2 (TARGET_32BIT && TARGET_HARD_FLOAT)
-#define HAVE_absdf2 (TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE)
-#define HAVE_sqrtsf2 (TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP)
-#define HAVE_sqrtdf2 (TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE)
-#define HAVE_one_cmplsi2 1
-#define HAVE_floatsihf2 1
-#define HAVE_floatdihf2 1
-#define HAVE_floatsisf2 (TARGET_32BIT && TARGET_HARD_FLOAT)
-#define HAVE_floatsidf2 (TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE)
-#define HAVE_fix_trunchfsi2 1
-#define HAVE_fix_trunchfdi2 1
-#define HAVE_fix_truncsfsi2 (TARGET_32BIT && TARGET_HARD_FLOAT)
-#define HAVE_fix_truncdfsi2 (TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE)
-#define HAVE_truncdfsf2 (TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE)
-#define HAVE_truncdfhf2 1
-#define HAVE_zero_extendhisi2 1
-#define HAVE_zero_extendqisi2 1
-#define HAVE_extendhisi2 1
-#define HAVE_extendhisi2_mem (TARGET_ARM)
-#define HAVE_extendqihi2 (TARGET_ARM)
-#define HAVE_extendqisi2 1
-#define HAVE_extendsfdf2 (TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE)
-#define HAVE_extendhfdf2 1
-#define HAVE_movdi 1
-#define HAVE_movsi 1
-#define HAVE_calculate_pic_address (flag_pic)
-#define HAVE_builtin_setjmp_receiver (flag_pic)
-#define HAVE_storehi (TARGET_ARM)
-#define HAVE_storehi_bigend (TARGET_ARM)
-#define HAVE_storeinthi (TARGET_ARM)
-#define HAVE_storehi_single_op (TARGET_32BIT && arm_arch4)
-#define HAVE_movhi 1
-#define HAVE_movhi_bytes (TARGET_ARM)
-#define HAVE_movhi_bigend (TARGET_ARM)
-#define HAVE_thumb_movhi_clobber (TARGET_THUMB1)
-#define HAVE_reload_outhi 1
-#define HAVE_reload_inhi 1
-#define HAVE_movqi 1
-#define HAVE_movhf 1
-#define HAVE_movsf 1
-#define HAVE_movdf 1
-#define HAVE_reload_outdf (TARGET_THUMB2)
-#define HAVE_load_multiple (TARGET_32BIT)
-#define HAVE_store_multiple (TARGET_32BIT)
-#define HAVE_movmemqi 1
-#define HAVE_cbranchsi4 1
-#define HAVE_cbranchqi4 (TARGET_THUMB1)
-#define HAVE_cbranchsf4 (TARGET_32BIT && TARGET_HARD_FLOAT)
-#define HAVE_cbranchdf4 (TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE)
-#define HAVE_cbranchdi4 (TARGET_32BIT)
-#define HAVE_cbranch_cc (TARGET_32BIT)
-#define HAVE_cstore_cc (TARGET_32BIT)
-#define HAVE_cstoresi4 (TARGET_32BIT || TARGET_THUMB1)
-#define HAVE_cstoresf4 (TARGET_32BIT && TARGET_HARD_FLOAT)
-#define HAVE_cstoredf4 (TARGET_32BIT && TARGET_HARD_FLOAT && !TARGET_VFP_SINGLE)
-#define HAVE_cstoredi4 (TARGET_32BIT)
-#define HAVE_cstoresi_eq0_thumb1 (TARGET_THUMB1)
-#define HAVE_cstoresi_ne0_thumb1 (TARGET_THUMB1)
-#define HAVE_movsicc (TARGET_32BIT)
-#define HAVE_movsfcc (TARGET_32BIT && TARGET_HARD_FLOAT)
-#define HAVE_movdfcc (TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP_DOUBLE)
-#define HAVE_jump 1
-#define HAVE_call 1
-#define HAVE_call_internal 1
-#define HAVE_call_value 1
-#define HAVE_call_value_internal 1
-#define HAVE_sibcall (TARGET_32BIT)
-#define HAVE_sibcall_value (TARGET_32BIT)
-#define HAVE_return ((TARGET_ARM || (TARGET_THUMB2 \
-                   && ARM_FUNC_TYPE (arm_current_func_type ()) == ARM_FT_NORMAL \
-                   && !IS_STACKALIGN (arm_current_func_type ()))) \
-     && USE_RETURN_INSN (FALSE))
-#define HAVE_simple_return ((TARGET_ARM || (TARGET_THUMB2 \
-                   && ARM_FUNC_TYPE (arm_current_func_type ()) == ARM_FT_NORMAL \
-                   && !IS_STACKALIGN (arm_current_func_type ()))) \
-     && use_simple_return_p ())
-#define HAVE_return_addr_mask (TARGET_ARM)
-#define HAVE_untyped_call 1
-#define HAVE_untyped_return 1
-#define HAVE_casesi (TARGET_32BIT || optimize_size || flag_pic)
-#define HAVE_thumb1_casesi_internal_pic (TARGET_THUMB1)
-#define HAVE_indirect_jump 1
-#define HAVE_prologue 1
-#define HAVE_epilogue 1
-#define HAVE_sibcall_epilogue (TARGET_32BIT)
-#define HAVE_eh_epilogue 1
-#define HAVE_tablejump (TARGET_THUMB1)
-#define HAVE_ctzsi2 (TARGET_32BIT && arm_arch_thumb2)
-#define HAVE_eh_return 1
-#define HAVE_get_thread_pointersi 1
-#define HAVE_arm_legacy_rev (TARGET_32BIT)
-#define HAVE_thumb_legacy_rev (TARGET_THUMB)
-#define HAVE_bswapsi2 (TARGET_EITHER && (arm_arch6 || !optimize_size))
-#define HAVE_bswaphi2 (arm_arch6)
-#define HAVE_movv2di (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V2DImode)))
-#define HAVE_movv2si (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V2SImode)))
-#define HAVE_movv4hi (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4HImode)))
-#define HAVE_movv8qi (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V8QImode)))
-#define HAVE_movv2sf (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V2SFmode)))
-#define HAVE_movv4si (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4SImode)))
-#define HAVE_movv8hi (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V8HImode)))
-#define HAVE_movv16qi (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V16QImode)))
-#define HAVE_movv4sf (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4SFmode)))
-#define HAVE_addv2di3 ((TARGET_NEON && ((V2DImode != V2SFmode && V2DImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V2DImode)))
-#define HAVE_addv2si3 ((TARGET_NEON && ((V2SImode != V2SFmode && V2SImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V2SImode)))
-#define HAVE_addv4hi3 ((TARGET_NEON && ((V4HImode != V2SFmode && V4HImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4HImode)))
-#define HAVE_addv8qi3 ((TARGET_NEON && ((V8QImode != V2SFmode && V8QImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V8QImode)))
-#define HAVE_addv2sf3 ((TARGET_NEON && ((V2SFmode != V2SFmode && V2SFmode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V2SFmode)))
-#define HAVE_addv4si3 ((TARGET_NEON && ((V4SImode != V2SFmode && V4SImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4SImode)))
-#define HAVE_addv8hi3 ((TARGET_NEON && ((V8HImode != V2SFmode && V8HImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V8HImode)))
-#define HAVE_addv16qi3 ((TARGET_NEON && ((V16QImode != V2SFmode && V16QImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V16QImode)))
-#define HAVE_addv4sf3 ((TARGET_NEON && ((V4SFmode != V2SFmode && V4SFmode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4SFmode)))
-#define HAVE_subv2di3 ((TARGET_NEON && ((V2DImode != V2SFmode && V2DImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V2DImode)))
-#define HAVE_subv2si3 ((TARGET_NEON && ((V2SImode != V2SFmode && V2SImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V2SImode)))
-#define HAVE_subv4hi3 ((TARGET_NEON && ((V4HImode != V2SFmode && V4HImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4HImode)))
-#define HAVE_subv8qi3 ((TARGET_NEON && ((V8QImode != V2SFmode && V8QImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V8QImode)))
-#define HAVE_subv2sf3 ((TARGET_NEON && ((V2SFmode != V2SFmode && V2SFmode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V2SFmode)))
-#define HAVE_subv4si3 ((TARGET_NEON && ((V4SImode != V2SFmode && V4SImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4SImode)))
-#define HAVE_subv8hi3 ((TARGET_NEON && ((V8HImode != V2SFmode && V8HImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V8HImode)))
-#define HAVE_subv16qi3 ((TARGET_NEON && ((V16QImode != V2SFmode && V16QImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V16QImode)))
-#define HAVE_subv4sf3 ((TARGET_NEON && ((V4SFmode != V2SFmode && V4SFmode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4SFmode)))
-#define HAVE_mulv2si3 ((TARGET_NEON && ((V2SImode != V2SFmode && V2SImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (V2SImode == V4HImode && TARGET_REALLY_IWMMXT))
-#define HAVE_mulv4hi3 ((TARGET_NEON && ((V4HImode != V2SFmode && V4HImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (V4HImode == V4HImode && TARGET_REALLY_IWMMXT))
-#define HAVE_mulv8qi3 ((TARGET_NEON && ((V8QImode != V2SFmode && V8QImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (V8QImode == V4HImode && TARGET_REALLY_IWMMXT))
-#define HAVE_mulv2sf3 ((TARGET_NEON && ((V2SFmode != V2SFmode && V2SFmode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (V2SFmode == V4HImode && TARGET_REALLY_IWMMXT))
-#define HAVE_mulv4si3 ((TARGET_NEON && ((V4SImode != V2SFmode && V4SImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (V4SImode == V4HImode && TARGET_REALLY_IWMMXT))
-#define HAVE_mulv8hi3 ((TARGET_NEON && ((V8HImode != V2SFmode && V8HImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (V8HImode == V4HImode && TARGET_REALLY_IWMMXT))
-#define HAVE_mulv16qi3 ((TARGET_NEON && ((V16QImode != V2SFmode && V16QImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (V16QImode == V4HImode && TARGET_REALLY_IWMMXT))
-#define HAVE_mulv4sf3 ((TARGET_NEON && ((V4SFmode != V2SFmode && V4SFmode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (V4SFmode == V4HImode && TARGET_REALLY_IWMMXT))
-#define HAVE_sminv2si3 ((TARGET_NEON && ((V2SImode != V2SFmode && V2SImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V2SImode)))
-#define HAVE_sminv4hi3 ((TARGET_NEON && ((V4HImode != V2SFmode && V4HImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4HImode)))
-#define HAVE_sminv8qi3 ((TARGET_NEON && ((V8QImode != V2SFmode && V8QImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V8QImode)))
-#define HAVE_sminv2sf3 ((TARGET_NEON && ((V2SFmode != V2SFmode && V2SFmode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V2SFmode)))
-#define HAVE_sminv4si3 ((TARGET_NEON && ((V4SImode != V2SFmode && V4SImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4SImode)))
-#define HAVE_sminv8hi3 ((TARGET_NEON && ((V8HImode != V2SFmode && V8HImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V8HImode)))
-#define HAVE_sminv16qi3 ((TARGET_NEON && ((V16QImode != V2SFmode && V16QImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V16QImode)))
-#define HAVE_sminv4sf3 ((TARGET_NEON && ((V4SFmode != V2SFmode && V4SFmode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4SFmode)))
-#define HAVE_uminv2si3 (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V2SImode)))
-#define HAVE_uminv4hi3 (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4HImode)))
-#define HAVE_uminv8qi3 (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V8QImode)))
-#define HAVE_uminv4si3 (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4SImode)))
-#define HAVE_uminv8hi3 (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V8HImode)))
-#define HAVE_uminv16qi3 (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V16QImode)))
-#define HAVE_smaxv2si3 ((TARGET_NEON && ((V2SImode != V2SFmode && V2SImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V2SImode)))
-#define HAVE_smaxv4hi3 ((TARGET_NEON && ((V4HImode != V2SFmode && V4HImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4HImode)))
-#define HAVE_smaxv8qi3 ((TARGET_NEON && ((V8QImode != V2SFmode && V8QImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V8QImode)))
-#define HAVE_smaxv2sf3 ((TARGET_NEON && ((V2SFmode != V2SFmode && V2SFmode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V2SFmode)))
-#define HAVE_smaxv4si3 ((TARGET_NEON && ((V4SImode != V2SFmode && V4SImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4SImode)))
-#define HAVE_smaxv8hi3 ((TARGET_NEON && ((V8HImode != V2SFmode && V8HImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V8HImode)))
-#define HAVE_smaxv16qi3 ((TARGET_NEON && ((V16QImode != V2SFmode && V16QImode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V16QImode)))
-#define HAVE_smaxv4sf3 ((TARGET_NEON && ((V4SFmode != V2SFmode && V4SFmode != V4SFmode) \
-		    || flag_unsafe_math_optimizations)) \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4SFmode)))
-#define HAVE_umaxv2si3 (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V2SImode)))
-#define HAVE_umaxv4hi3 (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4HImode)))
-#define HAVE_umaxv8qi3 (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V8QImode)))
-#define HAVE_umaxv4si3 (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4SImode)))
-#define HAVE_umaxv8hi3 (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V8HImode)))
-#define HAVE_umaxv16qi3 (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V16QImode)))
-#define HAVE_vec_perm_constv2di (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V2DImode)))
-#define HAVE_vec_perm_constv2si (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V2SImode)))
-#define HAVE_vec_perm_constv4hi (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4HImode)))
-#define HAVE_vec_perm_constv8qi (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V8QImode)))
-#define HAVE_vec_perm_constv2sf (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V2SFmode)))
-#define HAVE_vec_perm_constv4si (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4SImode)))
-#define HAVE_vec_perm_constv8hi (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V8HImode)))
-#define HAVE_vec_perm_constv16qi (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V16QImode)))
-#define HAVE_vec_perm_constv4sf (TARGET_NEON \
-   || (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (V4SFmode)))
-#define HAVE_vec_permv8qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_permv16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_iwmmxt_setwcgr0 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_setwcgr1 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_setwcgr2 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_setwcgr3 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_getwcgr0 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_getwcgr1 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_getwcgr2 (TARGET_REALLY_IWMMXT)
-#define HAVE_iwmmxt_getwcgr3 (TARGET_REALLY_IWMMXT)
-#define HAVE_doloop_end (TARGET_32BIT)
-#define HAVE_movti (TARGET_NEON)
-#define HAVE_movei (TARGET_NEON)
-#define HAVE_movoi (TARGET_NEON)
-#define HAVE_movci (TARGET_NEON)
-#define HAVE_movxi (TARGET_NEON)
-#define HAVE_movmisalignv8qi (TARGET_NEON && !BYTES_BIG_ENDIAN && unaligned_access)
-#define HAVE_movmisalignv16qi (TARGET_NEON && !BYTES_BIG_ENDIAN && unaligned_access)
-#define HAVE_movmisalignv4hi (TARGET_NEON && !BYTES_BIG_ENDIAN && unaligned_access)
-#define HAVE_movmisalignv8hi (TARGET_NEON && !BYTES_BIG_ENDIAN && unaligned_access)
-#define HAVE_movmisalignv2si (TARGET_NEON && !BYTES_BIG_ENDIAN && unaligned_access)
-#define HAVE_movmisalignv4si (TARGET_NEON && !BYTES_BIG_ENDIAN && unaligned_access)
-#define HAVE_movmisalignv2sf (TARGET_NEON && !BYTES_BIG_ENDIAN && unaligned_access)
-#define HAVE_movmisalignv4sf (TARGET_NEON && !BYTES_BIG_ENDIAN && unaligned_access)
-#define HAVE_movmisaligndi (TARGET_NEON && !BYTES_BIG_ENDIAN && unaligned_access)
-#define HAVE_movmisalignv2di (TARGET_NEON && !BYTES_BIG_ENDIAN && unaligned_access)
-#define HAVE_vec_setv8qi (TARGET_NEON)
-#define HAVE_vec_setv16qi (TARGET_NEON)
-#define HAVE_vec_setv4hi (TARGET_NEON)
-#define HAVE_vec_setv8hi (TARGET_NEON)
-#define HAVE_vec_setv2si (TARGET_NEON)
-#define HAVE_vec_setv4si (TARGET_NEON)
-#define HAVE_vec_setv2sf (TARGET_NEON)
-#define HAVE_vec_setv4sf (TARGET_NEON)
-#define HAVE_vec_setv2di (TARGET_NEON)
-#define HAVE_vec_initv8qi (TARGET_NEON)
-#define HAVE_vec_initv16qi (TARGET_NEON)
-#define HAVE_vec_initv4hi (TARGET_NEON)
-#define HAVE_vec_initv8hi (TARGET_NEON)
-#define HAVE_vec_initv2si (TARGET_NEON)
-#define HAVE_vec_initv4si (TARGET_NEON)
-#define HAVE_vec_initv2sf (TARGET_NEON)
-#define HAVE_vec_initv4sf (TARGET_NEON)
-#define HAVE_vec_initv2di (TARGET_NEON)
-#define HAVE_vashrv8qi3 (TARGET_NEON)
-#define HAVE_vashrv16qi3 (TARGET_NEON)
-#define HAVE_vashrv4hi3 (TARGET_NEON)
-#define HAVE_vashrv8hi3 (TARGET_NEON)
-#define HAVE_vashrv2si3 (TARGET_NEON)
-#define HAVE_vashrv4si3 (TARGET_NEON)
-#define HAVE_vlshrv8qi3 (TARGET_NEON)
-#define HAVE_vlshrv16qi3 (TARGET_NEON)
-#define HAVE_vlshrv4hi3 (TARGET_NEON)
-#define HAVE_vlshrv8hi3 (TARGET_NEON)
-#define HAVE_vlshrv2si3 (TARGET_NEON)
-#define HAVE_vlshrv4si3 (TARGET_NEON)
-#define HAVE_vec_shr_v8qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_shr_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_shr_v4hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_shr_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_shr_v2si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_shr_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_shr_v2sf (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_shr_v4sf (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_shr_v2di (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_shl_v8qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_shl_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_shl_v4hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_shl_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_shl_v2si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_shl_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_shl_v2sf (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_shl_v4sf (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_shl_v2di (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_move_hi_quad_v2di (TARGET_NEON)
-#define HAVE_move_hi_quad_v2df (TARGET_NEON)
-#define HAVE_move_hi_quad_v16qi (TARGET_NEON)
-#define HAVE_move_hi_quad_v8hi (TARGET_NEON)
-#define HAVE_move_hi_quad_v4si (TARGET_NEON)
-#define HAVE_move_hi_quad_v4sf (TARGET_NEON)
-#define HAVE_move_lo_quad_v2di (TARGET_NEON)
-#define HAVE_move_lo_quad_v2df (TARGET_NEON)
-#define HAVE_move_lo_quad_v16qi (TARGET_NEON)
-#define HAVE_move_lo_quad_v8hi (TARGET_NEON)
-#define HAVE_move_lo_quad_v4si (TARGET_NEON)
-#define HAVE_move_lo_quad_v4sf (TARGET_NEON)
-#define HAVE_reduc_splus_v8qi (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_reduc_splus_v4hi (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_reduc_splus_v2si (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_reduc_splus_v2sf (TARGET_NEON && (!true || flag_unsafe_math_optimizations))
-#define HAVE_reduc_splus_v16qi (TARGET_NEON && (!false || flag_unsafe_math_optimizations) \
-   && !BYTES_BIG_ENDIAN)
-#define HAVE_reduc_splus_v8hi (TARGET_NEON && (!false || flag_unsafe_math_optimizations) \
-   && !BYTES_BIG_ENDIAN)
-#define HAVE_reduc_splus_v4si (TARGET_NEON && (!false || flag_unsafe_math_optimizations) \
-   && !BYTES_BIG_ENDIAN)
-#define HAVE_reduc_splus_v4sf (TARGET_NEON && (!true || flag_unsafe_math_optimizations) \
-   && !BYTES_BIG_ENDIAN)
-#define HAVE_reduc_uplus_v8qi (TARGET_NEON && (true || !BYTES_BIG_ENDIAN))
-#define HAVE_reduc_uplus_v16qi (TARGET_NEON && (false || !BYTES_BIG_ENDIAN))
-#define HAVE_reduc_uplus_v4hi (TARGET_NEON && (true || !BYTES_BIG_ENDIAN))
-#define HAVE_reduc_uplus_v8hi (TARGET_NEON && (false || !BYTES_BIG_ENDIAN))
-#define HAVE_reduc_uplus_v2si (TARGET_NEON && (true || !BYTES_BIG_ENDIAN))
-#define HAVE_reduc_uplus_v4si (TARGET_NEON && (false || !BYTES_BIG_ENDIAN))
-#define HAVE_reduc_uplus_v2di (TARGET_NEON && (false || !BYTES_BIG_ENDIAN))
-#define HAVE_reduc_smin_v8qi (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_reduc_smin_v4hi (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_reduc_smin_v2si (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_reduc_smin_v2sf (TARGET_NEON && (!true || flag_unsafe_math_optimizations))
-#define HAVE_reduc_smin_v16qi (TARGET_NEON && (!false || flag_unsafe_math_optimizations) \
-   && !BYTES_BIG_ENDIAN)
-#define HAVE_reduc_smin_v8hi (TARGET_NEON && (!false || flag_unsafe_math_optimizations) \
-   && !BYTES_BIG_ENDIAN)
-#define HAVE_reduc_smin_v4si (TARGET_NEON && (!false || flag_unsafe_math_optimizations) \
-   && !BYTES_BIG_ENDIAN)
-#define HAVE_reduc_smin_v4sf (TARGET_NEON && (!true || flag_unsafe_math_optimizations) \
-   && !BYTES_BIG_ENDIAN)
-#define HAVE_reduc_smax_v8qi (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_reduc_smax_v4hi (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_reduc_smax_v2si (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_reduc_smax_v2sf (TARGET_NEON && (!true || flag_unsafe_math_optimizations))
-#define HAVE_reduc_smax_v16qi (TARGET_NEON && (!false || flag_unsafe_math_optimizations) \
-   && !BYTES_BIG_ENDIAN)
-#define HAVE_reduc_smax_v8hi (TARGET_NEON && (!false || flag_unsafe_math_optimizations) \
-   && !BYTES_BIG_ENDIAN)
-#define HAVE_reduc_smax_v4si (TARGET_NEON && (!false || flag_unsafe_math_optimizations) \
-   && !BYTES_BIG_ENDIAN)
-#define HAVE_reduc_smax_v4sf (TARGET_NEON && (!true || flag_unsafe_math_optimizations) \
-   && !BYTES_BIG_ENDIAN)
-#define HAVE_reduc_umin_v8qi (TARGET_NEON)
-#define HAVE_reduc_umin_v4hi (TARGET_NEON)
-#define HAVE_reduc_umin_v2si (TARGET_NEON)
-#define HAVE_reduc_umin_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_reduc_umin_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_reduc_umin_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_reduc_umax_v8qi (TARGET_NEON)
-#define HAVE_reduc_umax_v4hi (TARGET_NEON)
-#define HAVE_reduc_umax_v2si (TARGET_NEON)
-#define HAVE_reduc_umax_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_reduc_umax_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_reduc_umax_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vcondv8qiv8qi (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_vcondv16qiv16qi (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_vcondv4hiv4hi (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_vcondv8hiv8hi (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_vcondv2siv2si (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_vcondv4siv4si (TARGET_NEON && (!false || flag_unsafe_math_optimizations))
-#define HAVE_vcondv2sfv2sf (TARGET_NEON && (!true || flag_unsafe_math_optimizations))
-#define HAVE_vcondv4sfv4sf (TARGET_NEON && (!true || flag_unsafe_math_optimizations))
-#define HAVE_vconduv8qiv8qi (TARGET_NEON)
-#define HAVE_vconduv16qiv16qi (TARGET_NEON)
-#define HAVE_vconduv4hiv4hi (TARGET_NEON)
-#define HAVE_vconduv8hiv8hi (TARGET_NEON)
-#define HAVE_vconduv2siv2si (TARGET_NEON)
-#define HAVE_vconduv4siv4si (TARGET_NEON)
-#define HAVE_neon_vaddv8qi (TARGET_NEON)
-#define HAVE_neon_vaddv16qi (TARGET_NEON)
-#define HAVE_neon_vaddv4hi (TARGET_NEON)
-#define HAVE_neon_vaddv8hi (TARGET_NEON)
-#define HAVE_neon_vaddv2si (TARGET_NEON)
-#define HAVE_neon_vaddv4si (TARGET_NEON)
-#define HAVE_neon_vaddv2sf (TARGET_NEON)
-#define HAVE_neon_vaddv4sf (TARGET_NEON)
-#define HAVE_neon_vadddi (TARGET_NEON)
-#define HAVE_neon_vaddv2di (TARGET_NEON)
-#define HAVE_neon_vmlav8qi (TARGET_NEON)
-#define HAVE_neon_vmlav16qi (TARGET_NEON)
-#define HAVE_neon_vmlav4hi (TARGET_NEON)
-#define HAVE_neon_vmlav8hi (TARGET_NEON)
-#define HAVE_neon_vmlav2si (TARGET_NEON)
-#define HAVE_neon_vmlav4si (TARGET_NEON)
-#define HAVE_neon_vmlav2sf (TARGET_NEON)
-#define HAVE_neon_vmlav4sf (TARGET_NEON)
-#define HAVE_neon_vfmav2sf (TARGET_NEON && TARGET_FMA)
-#define HAVE_neon_vfmav4sf (TARGET_NEON && TARGET_FMA)
-#define HAVE_neon_vfmsv2sf (TARGET_NEON && TARGET_FMA)
-#define HAVE_neon_vfmsv4sf (TARGET_NEON && TARGET_FMA)
-#define HAVE_neon_vmlsv8qi (TARGET_NEON)
-#define HAVE_neon_vmlsv16qi (TARGET_NEON)
-#define HAVE_neon_vmlsv4hi (TARGET_NEON)
-#define HAVE_neon_vmlsv8hi (TARGET_NEON)
-#define HAVE_neon_vmlsv2si (TARGET_NEON)
-#define HAVE_neon_vmlsv4si (TARGET_NEON)
-#define HAVE_neon_vmlsv2sf (TARGET_NEON)
-#define HAVE_neon_vmlsv4sf (TARGET_NEON)
-#define HAVE_neon_vsubv8qi (TARGET_NEON)
-#define HAVE_neon_vsubv16qi (TARGET_NEON)
-#define HAVE_neon_vsubv4hi (TARGET_NEON)
-#define HAVE_neon_vsubv8hi (TARGET_NEON)
-#define HAVE_neon_vsubv2si (TARGET_NEON)
-#define HAVE_neon_vsubv4si (TARGET_NEON)
-#define HAVE_neon_vsubv2sf (TARGET_NEON)
-#define HAVE_neon_vsubv4sf (TARGET_NEON)
-#define HAVE_neon_vsubdi (TARGET_NEON)
-#define HAVE_neon_vsubv2di (TARGET_NEON)
-#define HAVE_neon_vpaddv8qi (TARGET_NEON)
-#define HAVE_neon_vpaddv4hi (TARGET_NEON)
-#define HAVE_neon_vpaddv2si (TARGET_NEON)
-#define HAVE_neon_vpaddv2sf (TARGET_NEON)
-#define HAVE_neon_vabsv8qi (TARGET_NEON)
-#define HAVE_neon_vabsv16qi (TARGET_NEON)
-#define HAVE_neon_vabsv4hi (TARGET_NEON)
-#define HAVE_neon_vabsv8hi (TARGET_NEON)
-#define HAVE_neon_vabsv2si (TARGET_NEON)
-#define HAVE_neon_vabsv4si (TARGET_NEON)
-#define HAVE_neon_vabsv2sf (TARGET_NEON)
-#define HAVE_neon_vabsv4sf (TARGET_NEON)
-#define HAVE_neon_vnegv8qi (TARGET_NEON)
-#define HAVE_neon_vnegv16qi (TARGET_NEON)
-#define HAVE_neon_vnegv4hi (TARGET_NEON)
-#define HAVE_neon_vnegv8hi (TARGET_NEON)
-#define HAVE_neon_vnegv2si (TARGET_NEON)
-#define HAVE_neon_vnegv4si (TARGET_NEON)
-#define HAVE_neon_vnegv2sf (TARGET_NEON)
-#define HAVE_neon_vnegv4sf (TARGET_NEON)
-#define HAVE_neon_vclzv8qi (TARGET_NEON)
-#define HAVE_neon_vclzv16qi (TARGET_NEON)
-#define HAVE_neon_vclzv4hi (TARGET_NEON)
-#define HAVE_neon_vclzv8hi (TARGET_NEON)
-#define HAVE_neon_vclzv2si (TARGET_NEON)
-#define HAVE_neon_vclzv4si (TARGET_NEON)
-#define HAVE_neon_vcntv8qi (TARGET_NEON)
-#define HAVE_neon_vcntv16qi (TARGET_NEON)
-#define HAVE_neon_vmvnv8qi (TARGET_NEON)
-#define HAVE_neon_vmvnv16qi (TARGET_NEON)
-#define HAVE_neon_vmvnv4hi (TARGET_NEON)
-#define HAVE_neon_vmvnv8hi (TARGET_NEON)
-#define HAVE_neon_vmvnv2si (TARGET_NEON)
-#define HAVE_neon_vmvnv4si (TARGET_NEON)
-#define HAVE_neon_vget_lanev8qi (TARGET_NEON)
-#define HAVE_neon_vget_lanev16qi (TARGET_NEON)
-#define HAVE_neon_vget_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vget_lanev8hi (TARGET_NEON)
-#define HAVE_neon_vget_lanev2si (TARGET_NEON)
-#define HAVE_neon_vget_lanev4si (TARGET_NEON)
-#define HAVE_neon_vget_lanev2sf (TARGET_NEON)
-#define HAVE_neon_vget_lanev4sf (TARGET_NEON)
-#define HAVE_neon_vget_lanedi (TARGET_NEON)
-#define HAVE_neon_vget_lanev2di (TARGET_NEON)
-#define HAVE_neon_vset_lanev8qi (TARGET_NEON)
-#define HAVE_neon_vset_lanev16qi (TARGET_NEON)
-#define HAVE_neon_vset_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vset_lanev8hi (TARGET_NEON)
-#define HAVE_neon_vset_lanev2si (TARGET_NEON)
-#define HAVE_neon_vset_lanev4si (TARGET_NEON)
-#define HAVE_neon_vset_lanev2sf (TARGET_NEON)
-#define HAVE_neon_vset_lanev4sf (TARGET_NEON)
-#define HAVE_neon_vset_lanev2di (TARGET_NEON)
-#define HAVE_neon_vset_lanedi (TARGET_NEON)
-#define HAVE_neon_vcreatev8qi (TARGET_NEON)
-#define HAVE_neon_vcreatev4hi (TARGET_NEON)
-#define HAVE_neon_vcreatev2si (TARGET_NEON)
-#define HAVE_neon_vcreatev2sf (TARGET_NEON)
-#define HAVE_neon_vcreatedi (TARGET_NEON)
-#define HAVE_neon_vdup_ndi (TARGET_NEON)
-#define HAVE_neon_vdup_lanev8qi (TARGET_NEON)
-#define HAVE_neon_vdup_lanev16qi (TARGET_NEON)
-#define HAVE_neon_vdup_lanev4hi (TARGET_NEON)
-#define HAVE_neon_vdup_lanev8hi (TARGET_NEON)
-#define HAVE_neon_vdup_lanev2si (TARGET_NEON)
-#define HAVE_neon_vdup_lanev4si (TARGET_NEON)
-#define HAVE_neon_vdup_lanev2sf (TARGET_NEON)
-#define HAVE_neon_vdup_lanev4sf (TARGET_NEON)
-#define HAVE_neon_vdup_lanedi (TARGET_NEON)
-#define HAVE_neon_vdup_lanev2di (TARGET_NEON)
-#define HAVE_neon_vget_highv16qi (TARGET_NEON)
-#define HAVE_neon_vget_highv8hi (TARGET_NEON)
-#define HAVE_neon_vget_highv4si (TARGET_NEON)
-#define HAVE_neon_vget_highv4sf (TARGET_NEON)
-#define HAVE_neon_vget_highv2di (TARGET_NEON)
-#define HAVE_neon_vget_lowv16qi (TARGET_NEON)
-#define HAVE_neon_vget_lowv8hi (TARGET_NEON)
-#define HAVE_neon_vget_lowv4si (TARGET_NEON)
-#define HAVE_neon_vget_lowv4sf (TARGET_NEON)
-#define HAVE_neon_vget_lowv2di (TARGET_NEON)
-#define HAVE_neon_vmul_nv4hi (TARGET_NEON)
-#define HAVE_neon_vmul_nv2si (TARGET_NEON)
-#define HAVE_neon_vmul_nv2sf (TARGET_NEON)
-#define HAVE_neon_vmul_nv8hi (TARGET_NEON)
-#define HAVE_neon_vmul_nv4si (TARGET_NEON)
-#define HAVE_neon_vmul_nv4sf (TARGET_NEON)
-#define HAVE_neon_vmull_nv4hi (TARGET_NEON)
-#define HAVE_neon_vmull_nv2si (TARGET_NEON)
-#define HAVE_neon_vqdmull_nv4hi (TARGET_NEON)
-#define HAVE_neon_vqdmull_nv2si (TARGET_NEON)
-#define HAVE_neon_vqdmulh_nv4hi (TARGET_NEON)
-#define HAVE_neon_vqdmulh_nv2si (TARGET_NEON)
-#define HAVE_neon_vqdmulh_nv8hi (TARGET_NEON)
-#define HAVE_neon_vqdmulh_nv4si (TARGET_NEON)
-#define HAVE_neon_vmla_nv4hi (TARGET_NEON)
-#define HAVE_neon_vmla_nv2si (TARGET_NEON)
-#define HAVE_neon_vmla_nv2sf (TARGET_NEON)
-#define HAVE_neon_vmla_nv8hi (TARGET_NEON)
-#define HAVE_neon_vmla_nv4si (TARGET_NEON)
-#define HAVE_neon_vmla_nv4sf (TARGET_NEON)
-#define HAVE_neon_vmlal_nv4hi (TARGET_NEON)
-#define HAVE_neon_vmlal_nv2si (TARGET_NEON)
-#define HAVE_neon_vqdmlal_nv4hi (TARGET_NEON)
-#define HAVE_neon_vqdmlal_nv2si (TARGET_NEON)
-#define HAVE_neon_vmls_nv4hi (TARGET_NEON)
-#define HAVE_neon_vmls_nv2si (TARGET_NEON)
-#define HAVE_neon_vmls_nv2sf (TARGET_NEON)
-#define HAVE_neon_vmls_nv8hi (TARGET_NEON)
-#define HAVE_neon_vmls_nv4si (TARGET_NEON)
-#define HAVE_neon_vmls_nv4sf (TARGET_NEON)
-#define HAVE_neon_vmlsl_nv4hi (TARGET_NEON)
-#define HAVE_neon_vmlsl_nv2si (TARGET_NEON)
-#define HAVE_neon_vqdmlsl_nv4hi (TARGET_NEON)
-#define HAVE_neon_vqdmlsl_nv2si (TARGET_NEON)
-#define HAVE_neon_vbslv8qi (TARGET_NEON)
-#define HAVE_neon_vbslv16qi (TARGET_NEON)
-#define HAVE_neon_vbslv4hi (TARGET_NEON)
-#define HAVE_neon_vbslv8hi (TARGET_NEON)
-#define HAVE_neon_vbslv2si (TARGET_NEON)
-#define HAVE_neon_vbslv4si (TARGET_NEON)
-#define HAVE_neon_vbslv2sf (TARGET_NEON)
-#define HAVE_neon_vbslv4sf (TARGET_NEON)
-#define HAVE_neon_vbsldi (TARGET_NEON)
-#define HAVE_neon_vbslv2di (TARGET_NEON)
-#define HAVE_neon_vtrnv8qi_internal (TARGET_NEON)
-#define HAVE_neon_vtrnv16qi_internal (TARGET_NEON)
-#define HAVE_neon_vtrnv4hi_internal (TARGET_NEON)
-#define HAVE_neon_vtrnv8hi_internal (TARGET_NEON)
-#define HAVE_neon_vtrnv2si_internal (TARGET_NEON)
-#define HAVE_neon_vtrnv4si_internal (TARGET_NEON)
-#define HAVE_neon_vtrnv2sf_internal (TARGET_NEON)
-#define HAVE_neon_vtrnv4sf_internal (TARGET_NEON)
-#define HAVE_neon_vtrnv8qi (TARGET_NEON)
-#define HAVE_neon_vtrnv16qi (TARGET_NEON)
-#define HAVE_neon_vtrnv4hi (TARGET_NEON)
-#define HAVE_neon_vtrnv8hi (TARGET_NEON)
-#define HAVE_neon_vtrnv2si (TARGET_NEON)
-#define HAVE_neon_vtrnv4si (TARGET_NEON)
-#define HAVE_neon_vtrnv2sf (TARGET_NEON)
-#define HAVE_neon_vtrnv4sf (TARGET_NEON)
-#define HAVE_neon_vzipv8qi_internal (TARGET_NEON)
-#define HAVE_neon_vzipv16qi_internal (TARGET_NEON)
-#define HAVE_neon_vzipv4hi_internal (TARGET_NEON)
-#define HAVE_neon_vzipv8hi_internal (TARGET_NEON)
-#define HAVE_neon_vzipv2si_internal (TARGET_NEON)
-#define HAVE_neon_vzipv4si_internal (TARGET_NEON)
-#define HAVE_neon_vzipv2sf_internal (TARGET_NEON)
-#define HAVE_neon_vzipv4sf_internal (TARGET_NEON)
-#define HAVE_neon_vzipv8qi (TARGET_NEON)
-#define HAVE_neon_vzipv16qi (TARGET_NEON)
-#define HAVE_neon_vzipv4hi (TARGET_NEON)
-#define HAVE_neon_vzipv8hi (TARGET_NEON)
-#define HAVE_neon_vzipv2si (TARGET_NEON)
-#define HAVE_neon_vzipv4si (TARGET_NEON)
-#define HAVE_neon_vzipv2sf (TARGET_NEON)
-#define HAVE_neon_vzipv4sf (TARGET_NEON)
-#define HAVE_neon_vuzpv8qi_internal (TARGET_NEON)
-#define HAVE_neon_vuzpv16qi_internal (TARGET_NEON)
-#define HAVE_neon_vuzpv4hi_internal (TARGET_NEON)
-#define HAVE_neon_vuzpv8hi_internal (TARGET_NEON)
-#define HAVE_neon_vuzpv2si_internal (TARGET_NEON)
-#define HAVE_neon_vuzpv4si_internal (TARGET_NEON)
-#define HAVE_neon_vuzpv2sf_internal (TARGET_NEON)
-#define HAVE_neon_vuzpv4sf_internal (TARGET_NEON)
-#define HAVE_neon_vuzpv8qi (TARGET_NEON)
-#define HAVE_neon_vuzpv16qi (TARGET_NEON)
-#define HAVE_neon_vuzpv4hi (TARGET_NEON)
-#define HAVE_neon_vuzpv8hi (TARGET_NEON)
-#define HAVE_neon_vuzpv2si (TARGET_NEON)
-#define HAVE_neon_vuzpv4si (TARGET_NEON)
-#define HAVE_neon_vuzpv2sf (TARGET_NEON)
-#define HAVE_neon_vuzpv4sf (TARGET_NEON)
-#define HAVE_neon_vreinterpretv8qiv8qi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv8qiv4hi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv8qiv2si (TARGET_NEON)
-#define HAVE_neon_vreinterpretv8qiv2sf (TARGET_NEON)
-#define HAVE_neon_vreinterpretv8qidi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv4hiv8qi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv4hiv4hi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv4hiv2si (TARGET_NEON)
-#define HAVE_neon_vreinterpretv4hiv2sf (TARGET_NEON)
-#define HAVE_neon_vreinterpretv4hidi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv2siv8qi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv2siv4hi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv2siv2si (TARGET_NEON)
-#define HAVE_neon_vreinterpretv2siv2sf (TARGET_NEON)
-#define HAVE_neon_vreinterpretv2sidi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv2sfv8qi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv2sfv4hi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv2sfv2si (TARGET_NEON)
-#define HAVE_neon_vreinterpretv2sfv2sf (TARGET_NEON)
-#define HAVE_neon_vreinterpretv2sfdi (TARGET_NEON)
-#define HAVE_neon_vreinterpretdiv8qi (TARGET_NEON)
-#define HAVE_neon_vreinterpretdiv4hi (TARGET_NEON)
-#define HAVE_neon_vreinterpretdiv2si (TARGET_NEON)
-#define HAVE_neon_vreinterpretdiv2sf (TARGET_NEON)
-#define HAVE_neon_vreinterpretdidi (TARGET_NEON)
-#define HAVE_neon_vreinterprettiv16qi (TARGET_NEON)
-#define HAVE_neon_vreinterprettiv8hi (TARGET_NEON)
-#define HAVE_neon_vreinterprettiv4si (TARGET_NEON)
-#define HAVE_neon_vreinterprettiv4sf (TARGET_NEON)
-#define HAVE_neon_vreinterprettiv2di (TARGET_NEON)
-#define HAVE_neon_vreinterprettiti (TARGET_NEON)
-#define HAVE_neon_vreinterpretv16qiv16qi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv16qiv8hi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv16qiv4si (TARGET_NEON)
-#define HAVE_neon_vreinterpretv16qiv4sf (TARGET_NEON)
-#define HAVE_neon_vreinterpretv16qiv2di (TARGET_NEON)
-#define HAVE_neon_vreinterpretv16qiti (TARGET_NEON)
-#define HAVE_neon_vreinterpretv8hiv16qi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv8hiv8hi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv8hiv4si (TARGET_NEON)
-#define HAVE_neon_vreinterpretv8hiv4sf (TARGET_NEON)
-#define HAVE_neon_vreinterpretv8hiv2di (TARGET_NEON)
-#define HAVE_neon_vreinterpretv8hiti (TARGET_NEON)
-#define HAVE_neon_vreinterpretv4siv16qi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv4siv8hi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv4siv4si (TARGET_NEON)
-#define HAVE_neon_vreinterpretv4siv4sf (TARGET_NEON)
-#define HAVE_neon_vreinterpretv4siv2di (TARGET_NEON)
-#define HAVE_neon_vreinterpretv4siti (TARGET_NEON)
-#define HAVE_neon_vreinterpretv4sfv16qi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv4sfv8hi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv4sfv4si (TARGET_NEON)
-#define HAVE_neon_vreinterpretv4sfv4sf (TARGET_NEON)
-#define HAVE_neon_vreinterpretv4sfv2di (TARGET_NEON)
-#define HAVE_neon_vreinterpretv4sfti (TARGET_NEON)
-#define HAVE_neon_vreinterpretv2div16qi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv2div8hi (TARGET_NEON)
-#define HAVE_neon_vreinterpretv2div4si (TARGET_NEON)
-#define HAVE_neon_vreinterpretv2div4sf (TARGET_NEON)
-#define HAVE_neon_vreinterpretv2div2di (TARGET_NEON)
-#define HAVE_neon_vreinterpretv2diti (TARGET_NEON)
-#define HAVE_vec_load_lanesv8qiv8qi (TARGET_NEON)
-#define HAVE_vec_load_lanesv16qiv16qi (TARGET_NEON)
-#define HAVE_vec_load_lanesv4hiv4hi (TARGET_NEON)
-#define HAVE_vec_load_lanesv8hiv8hi (TARGET_NEON)
-#define HAVE_vec_load_lanesv2siv2si (TARGET_NEON)
-#define HAVE_vec_load_lanesv4siv4si (TARGET_NEON)
-#define HAVE_vec_load_lanesv2sfv2sf (TARGET_NEON)
-#define HAVE_vec_load_lanesv4sfv4sf (TARGET_NEON)
-#define HAVE_vec_load_lanesdidi (TARGET_NEON)
-#define HAVE_vec_load_lanesv2div2di (TARGET_NEON)
-#define HAVE_neon_vld1_dupdi (TARGET_NEON)
-#define HAVE_vec_store_lanesv8qiv8qi (TARGET_NEON)
-#define HAVE_vec_store_lanesv16qiv16qi (TARGET_NEON)
-#define HAVE_vec_store_lanesv4hiv4hi (TARGET_NEON)
-#define HAVE_vec_store_lanesv8hiv8hi (TARGET_NEON)
-#define HAVE_vec_store_lanesv2siv2si (TARGET_NEON)
-#define HAVE_vec_store_lanesv4siv4si (TARGET_NEON)
-#define HAVE_vec_store_lanesv2sfv2sf (TARGET_NEON)
-#define HAVE_vec_store_lanesv4sfv4sf (TARGET_NEON)
-#define HAVE_vec_store_lanesdidi (TARGET_NEON)
-#define HAVE_vec_store_lanesv2div2di (TARGET_NEON)
-#define HAVE_vec_load_lanestiv8qi (TARGET_NEON)
-#define HAVE_vec_load_lanestiv4hi (TARGET_NEON)
-#define HAVE_vec_load_lanestiv2si (TARGET_NEON)
-#define HAVE_vec_load_lanestiv2sf (TARGET_NEON)
-#define HAVE_vec_load_lanestidi (TARGET_NEON)
-#define HAVE_vec_load_lanesoiv16qi (TARGET_NEON)
-#define HAVE_vec_load_lanesoiv8hi (TARGET_NEON)
-#define HAVE_vec_load_lanesoiv4si (TARGET_NEON)
-#define HAVE_vec_load_lanesoiv4sf (TARGET_NEON)
-#define HAVE_vec_store_lanestiv8qi (TARGET_NEON)
-#define HAVE_vec_store_lanestiv4hi (TARGET_NEON)
-#define HAVE_vec_store_lanestiv2si (TARGET_NEON)
-#define HAVE_vec_store_lanestiv2sf (TARGET_NEON)
-#define HAVE_vec_store_lanestidi (TARGET_NEON)
-#define HAVE_vec_store_lanesoiv16qi (TARGET_NEON)
-#define HAVE_vec_store_lanesoiv8hi (TARGET_NEON)
-#define HAVE_vec_store_lanesoiv4si (TARGET_NEON)
-#define HAVE_vec_store_lanesoiv4sf (TARGET_NEON)
-#define HAVE_vec_load_laneseiv8qi (TARGET_NEON)
-#define HAVE_vec_load_laneseiv4hi (TARGET_NEON)
-#define HAVE_vec_load_laneseiv2si (TARGET_NEON)
-#define HAVE_vec_load_laneseiv2sf (TARGET_NEON)
-#define HAVE_vec_load_laneseidi (TARGET_NEON)
-#define HAVE_vec_load_lanesciv16qi (TARGET_NEON)
-#define HAVE_vec_load_lanesciv8hi (TARGET_NEON)
-#define HAVE_vec_load_lanesciv4si (TARGET_NEON)
-#define HAVE_vec_load_lanesciv4sf (TARGET_NEON)
-#define HAVE_neon_vld3v16qi (TARGET_NEON)
-#define HAVE_neon_vld3v8hi (TARGET_NEON)
-#define HAVE_neon_vld3v4si (TARGET_NEON)
-#define HAVE_neon_vld3v4sf (TARGET_NEON)
-#define HAVE_vec_store_laneseiv8qi (TARGET_NEON)
-#define HAVE_vec_store_laneseiv4hi (TARGET_NEON)
-#define HAVE_vec_store_laneseiv2si (TARGET_NEON)
-#define HAVE_vec_store_laneseiv2sf (TARGET_NEON)
-#define HAVE_vec_store_laneseidi (TARGET_NEON)
-#define HAVE_vec_store_lanesciv16qi (TARGET_NEON)
-#define HAVE_vec_store_lanesciv8hi (TARGET_NEON)
-#define HAVE_vec_store_lanesciv4si (TARGET_NEON)
-#define HAVE_vec_store_lanesciv4sf (TARGET_NEON)
-#define HAVE_neon_vst3v16qi (TARGET_NEON)
-#define HAVE_neon_vst3v8hi (TARGET_NEON)
-#define HAVE_neon_vst3v4si (TARGET_NEON)
-#define HAVE_neon_vst3v4sf (TARGET_NEON)
-#define HAVE_vec_load_lanesoiv8qi (TARGET_NEON)
-#define HAVE_vec_load_lanesoiv4hi (TARGET_NEON)
-#define HAVE_vec_load_lanesoiv2si (TARGET_NEON)
-#define HAVE_vec_load_lanesoiv2sf (TARGET_NEON)
-#define HAVE_vec_load_lanesoidi (TARGET_NEON)
-#define HAVE_vec_load_lanesxiv16qi (TARGET_NEON)
-#define HAVE_vec_load_lanesxiv8hi (TARGET_NEON)
-#define HAVE_vec_load_lanesxiv4si (TARGET_NEON)
-#define HAVE_vec_load_lanesxiv4sf (TARGET_NEON)
-#define HAVE_neon_vld4v16qi (TARGET_NEON)
-#define HAVE_neon_vld4v8hi (TARGET_NEON)
-#define HAVE_neon_vld4v4si (TARGET_NEON)
-#define HAVE_neon_vld4v4sf (TARGET_NEON)
-#define HAVE_vec_store_lanesoiv8qi (TARGET_NEON)
-#define HAVE_vec_store_lanesoiv4hi (TARGET_NEON)
-#define HAVE_vec_store_lanesoiv2si (TARGET_NEON)
-#define HAVE_vec_store_lanesoiv2sf (TARGET_NEON)
-#define HAVE_vec_store_lanesoidi (TARGET_NEON)
-#define HAVE_vec_store_lanesxiv16qi (TARGET_NEON)
-#define HAVE_vec_store_lanesxiv8hi (TARGET_NEON)
-#define HAVE_vec_store_lanesxiv4si (TARGET_NEON)
-#define HAVE_vec_store_lanesxiv4sf (TARGET_NEON)
-#define HAVE_neon_vst4v16qi (TARGET_NEON)
-#define HAVE_neon_vst4v8hi (TARGET_NEON)
-#define HAVE_neon_vst4v4si (TARGET_NEON)
-#define HAVE_neon_vst4v4sf (TARGET_NEON)
-#define HAVE_neon_vandv8qi (TARGET_NEON)
-#define HAVE_neon_vandv16qi (TARGET_NEON)
-#define HAVE_neon_vandv4hi (TARGET_NEON)
-#define HAVE_neon_vandv8hi (TARGET_NEON)
-#define HAVE_neon_vandv2si (TARGET_NEON)
-#define HAVE_neon_vandv4si (TARGET_NEON)
-#define HAVE_neon_vandv2sf (TARGET_NEON)
-#define HAVE_neon_vandv4sf (TARGET_NEON)
-#define HAVE_neon_vanddi (TARGET_NEON)
-#define HAVE_neon_vandv2di (TARGET_NEON)
-#define HAVE_neon_vorrv8qi (TARGET_NEON)
-#define HAVE_neon_vorrv16qi (TARGET_NEON)
-#define HAVE_neon_vorrv4hi (TARGET_NEON)
-#define HAVE_neon_vorrv8hi (TARGET_NEON)
-#define HAVE_neon_vorrv2si (TARGET_NEON)
-#define HAVE_neon_vorrv4si (TARGET_NEON)
-#define HAVE_neon_vorrv2sf (TARGET_NEON)
-#define HAVE_neon_vorrv4sf (TARGET_NEON)
-#define HAVE_neon_vorrdi (TARGET_NEON)
-#define HAVE_neon_vorrv2di (TARGET_NEON)
-#define HAVE_neon_veorv8qi (TARGET_NEON)
-#define HAVE_neon_veorv16qi (TARGET_NEON)
-#define HAVE_neon_veorv4hi (TARGET_NEON)
-#define HAVE_neon_veorv8hi (TARGET_NEON)
-#define HAVE_neon_veorv2si (TARGET_NEON)
-#define HAVE_neon_veorv4si (TARGET_NEON)
-#define HAVE_neon_veorv2sf (TARGET_NEON)
-#define HAVE_neon_veorv4sf (TARGET_NEON)
-#define HAVE_neon_veordi (TARGET_NEON)
-#define HAVE_neon_veorv2di (TARGET_NEON)
-#define HAVE_neon_vbicv8qi (TARGET_NEON)
-#define HAVE_neon_vbicv16qi (TARGET_NEON)
-#define HAVE_neon_vbicv4hi (TARGET_NEON)
-#define HAVE_neon_vbicv8hi (TARGET_NEON)
-#define HAVE_neon_vbicv2si (TARGET_NEON)
-#define HAVE_neon_vbicv4si (TARGET_NEON)
-#define HAVE_neon_vbicv2sf (TARGET_NEON)
-#define HAVE_neon_vbicv4sf (TARGET_NEON)
-#define HAVE_neon_vbicdi (TARGET_NEON)
-#define HAVE_neon_vbicv2di (TARGET_NEON)
-#define HAVE_neon_vornv8qi (TARGET_NEON)
-#define HAVE_neon_vornv16qi (TARGET_NEON)
-#define HAVE_neon_vornv4hi (TARGET_NEON)
-#define HAVE_neon_vornv8hi (TARGET_NEON)
-#define HAVE_neon_vornv2si (TARGET_NEON)
-#define HAVE_neon_vornv4si (TARGET_NEON)
-#define HAVE_neon_vornv2sf (TARGET_NEON)
-#define HAVE_neon_vornv4sf (TARGET_NEON)
-#define HAVE_neon_vorndi (TARGET_NEON)
-#define HAVE_neon_vornv2di (TARGET_NEON)
-#define HAVE_vec_unpacks_hi_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_unpacku_hi_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_unpacks_hi_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_unpacku_hi_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_unpacks_hi_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_unpacku_hi_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_unpacks_lo_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_unpacku_lo_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_unpacks_lo_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_unpacku_lo_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_unpacks_lo_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_unpacku_lo_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_smult_lo_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_umult_lo_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_smult_lo_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_umult_lo_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_smult_lo_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_umult_lo_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_smult_hi_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_umult_hi_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_smult_hi_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_umult_hi_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_smult_hi_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_umult_hi_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_sshiftl_lo_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_ushiftl_lo_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_sshiftl_lo_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_ushiftl_lo_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_sshiftl_lo_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_ushiftl_lo_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_sshiftl_hi_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_ushiftl_hi_v16qi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_sshiftl_hi_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_ushiftl_hi_v8hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_sshiftl_hi_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_widen_ushiftl_hi_v4si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_unpacks_lo_v8qi (TARGET_NEON)
-#define HAVE_vec_unpacku_lo_v8qi (TARGET_NEON)
-#define HAVE_vec_unpacks_lo_v4hi (TARGET_NEON)
-#define HAVE_vec_unpacku_lo_v4hi (TARGET_NEON)
-#define HAVE_vec_unpacks_lo_v2si (TARGET_NEON)
-#define HAVE_vec_unpacku_lo_v2si (TARGET_NEON)
-#define HAVE_vec_unpacks_hi_v8qi (TARGET_NEON)
-#define HAVE_vec_unpacku_hi_v8qi (TARGET_NEON)
-#define HAVE_vec_unpacks_hi_v4hi (TARGET_NEON)
-#define HAVE_vec_unpacku_hi_v4hi (TARGET_NEON)
-#define HAVE_vec_unpacks_hi_v2si (TARGET_NEON)
-#define HAVE_vec_unpacku_hi_v2si (TARGET_NEON)
-#define HAVE_vec_widen_smult_hi_v8qi (TARGET_NEON)
-#define HAVE_vec_widen_umult_hi_v8qi (TARGET_NEON)
-#define HAVE_vec_widen_smult_hi_v4hi (TARGET_NEON)
-#define HAVE_vec_widen_umult_hi_v4hi (TARGET_NEON)
-#define HAVE_vec_widen_smult_hi_v2si (TARGET_NEON)
-#define HAVE_vec_widen_umult_hi_v2si (TARGET_NEON)
-#define HAVE_vec_widen_smult_lo_v8qi (TARGET_NEON)
-#define HAVE_vec_widen_umult_lo_v8qi (TARGET_NEON)
-#define HAVE_vec_widen_smult_lo_v4hi (TARGET_NEON)
-#define HAVE_vec_widen_umult_lo_v4hi (TARGET_NEON)
-#define HAVE_vec_widen_smult_lo_v2si (TARGET_NEON)
-#define HAVE_vec_widen_umult_lo_v2si (TARGET_NEON)
-#define HAVE_vec_widen_sshiftl_hi_v8qi (TARGET_NEON)
-#define HAVE_vec_widen_ushiftl_hi_v8qi (TARGET_NEON)
-#define HAVE_vec_widen_sshiftl_hi_v4hi (TARGET_NEON)
-#define HAVE_vec_widen_ushiftl_hi_v4hi (TARGET_NEON)
-#define HAVE_vec_widen_sshiftl_hi_v2si (TARGET_NEON)
-#define HAVE_vec_widen_ushiftl_hi_v2si (TARGET_NEON)
-#define HAVE_vec_widen_sshiftl_lo_v8qi (TARGET_NEON)
-#define HAVE_vec_widen_ushiftl_lo_v8qi (TARGET_NEON)
-#define HAVE_vec_widen_sshiftl_lo_v4hi (TARGET_NEON)
-#define HAVE_vec_widen_ushiftl_lo_v4hi (TARGET_NEON)
-#define HAVE_vec_widen_sshiftl_lo_v2si (TARGET_NEON)
-#define HAVE_vec_widen_ushiftl_lo_v2si (TARGET_NEON)
-#define HAVE_vec_pack_trunc_v4hi (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_pack_trunc_v2si (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_vec_pack_trunc_di (TARGET_NEON && !BYTES_BIG_ENDIAN)
-#define HAVE_memory_barrier (TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_loaddi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN)
-#define HAVE_atomic_compare_and_swapqi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_compare_and_swaphi (TARGET_HAVE_LDREXBH && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_compare_and_swapsi (TARGET_HAVE_LDREX && TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_atomic_compare_and_swapdi (TARGET_HAVE_LDREXD && ARM_DOUBLEWORD_ALIGN \
-	&& TARGET_HAVE_MEMORY_BARRIER)
-#define HAVE_mulqq3 (TARGET_DSP_MULTIPLY && arm_arch_thumb2)
-#define HAVE_mulhq3 (TARGET_DSP_MULTIPLY && arm_arch_thumb2)
-#define HAVE_mulsq3 (TARGET_32BIT && arm_arch3m)
-#define HAVE_mulsa3 (TARGET_32BIT && arm_arch3m)
-#define HAVE_mulusa3 (TARGET_32BIT && arm_arch3m)
-#define HAVE_mulha3 (TARGET_DSP_MULTIPLY && arm_arch_thumb2)
-#define HAVE_muluha3 (TARGET_DSP_MULTIPLY)
-#define HAVE_ssmulha3 (TARGET_32BIT && TARGET_DSP_MULTIPLY && arm_arch6)
-#define HAVE_usmuluha3 (TARGET_INT_SIMD)
-extern rtx        gen_addsi3_compare0                   (rtx, rtx, rtx);
-extern rtx        gen_cmpsi2_addneg                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_thumb1_subsi3_insn                (rtx, rtx, rtx);
-extern rtx        gen_subsi3_compare                    (rtx, rtx, rtx);
-extern rtx        gen_mulhisi3                          (rtx, rtx, rtx);
-extern rtx        gen_maddhisi4                         (rtx, rtx, rtx, rtx);
-extern rtx        gen_maddhidi4                         (rtx, rtx, rtx, rtx);
-extern rtx        gen_insv_zero                         (rtx, rtx, rtx);
-extern rtx        gen_insv_t2                           (rtx, rtx, rtx, rtx);
-extern rtx        gen_andsi_notsi_si                    (rtx, rtx, rtx);
-extern rtx        gen_thumb1_bicsi3                     (rtx, rtx, rtx);
-extern rtx        gen_andsi_not_shiftsi_si              (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_arm_ashldi3_1bit                  (rtx, rtx);
-extern rtx        gen_arm_ashrdi3_1bit                  (rtx, rtx);
-extern rtx        gen_arm_lshrdi3_1bit                  (rtx, rtx);
-extern rtx        gen_unaligned_loadsi                  (rtx, rtx);
-extern rtx        gen_unaligned_loadhis                 (rtx, rtx);
-extern rtx        gen_unaligned_loadhiu                 (rtx, rtx);
-extern rtx        gen_unaligned_storesi                 (rtx, rtx);
-extern rtx        gen_unaligned_storehi                 (rtx, rtx);
-extern rtx        gen_unaligned_loaddi                  (rtx, rtx);
-extern rtx        gen_unaligned_storedi                 (rtx, rtx);
-extern rtx        gen_extzv_t2                          (rtx, rtx, rtx, rtx);
-extern rtx        gen_divsi3                            (rtx, rtx, rtx);
-extern rtx        gen_udivsi3                           (rtx, rtx, rtx);
-extern rtx        gen_one_cmpldi2                       (rtx, rtx);
-extern rtx        gen_zero_extendqidi2                  (rtx, rtx);
-extern rtx        gen_zero_extendhidi2                  (rtx, rtx);
-extern rtx        gen_zero_extendsidi2                  (rtx, rtx);
-extern rtx        gen_extendqidi2                       (rtx, rtx);
-extern rtx        gen_extendhidi2                       (rtx, rtx);
-extern rtx        gen_extendsidi2                       (rtx, rtx);
-extern rtx        gen_thumb1_extendhisi2                (rtx, rtx);
-extern rtx        gen_thumb1_extendqisi2                (rtx, rtx);
-extern rtx        gen_pic_load_addr_unified             (rtx, rtx, rtx);
-extern rtx        gen_pic_load_addr_32bit               (rtx, rtx);
-extern rtx        gen_pic_load_addr_thumb1              (rtx, rtx);
-extern rtx        gen_pic_add_dot_plus_four             (rtx, rtx, rtx);
-extern rtx        gen_pic_add_dot_plus_eight            (rtx, rtx, rtx);
-extern rtx        gen_tls_load_dot_plus_eight           (rtx, rtx, rtx);
-static inline rtx gen_pic_offset_arm                    (rtx, rtx, rtx);
-static inline rtx
-gen_pic_offset_arm(rtx ARG_UNUSED (a), rtx ARG_UNUSED (b), rtx ARG_UNUSED (c))
-{
-  return 0;
-}
-extern rtx        gen_movmem12b                         (rtx, rtx, rtx, rtx);
-extern rtx        gen_movmem8b                          (rtx, rtx, rtx, rtx);
-extern rtx        gen_cbranchsi4_insn                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_cbranchsi4_scratch                (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_arm_cond_branch                   (rtx, rtx, rtx);
-extern rtx        gen_cstoresi_nltu_thumb1              (rtx, rtx, rtx);
-extern rtx        gen_cstoresi_ltu_thumb1               (rtx, rtx, rtx);
-extern rtx        gen_thumb1_addsi3_addgeu              (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_blockage                          (void);
-extern rtx        gen_arm_casesi_internal               (rtx, rtx, rtx, rtx);
-extern rtx        gen_thumb1_casesi_dispatch            (rtx);
-extern rtx        gen_nop                               (void);
-extern rtx        gen_trap                              (void);
-extern rtx        gen_movcond_addsi                     (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_movcond                           (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_prologue_thumb1_interwork         (void);
-extern rtx        gen_stack_tie                         (rtx, rtx);
-extern rtx        gen_align_4                           (void);
-extern rtx        gen_align_8                           (void);
-extern rtx        gen_consttable_end                    (void);
-extern rtx        gen_consttable_1                      (rtx);
-extern rtx        gen_consttable_2                      (rtx);
-extern rtx        gen_consttable_4                      (rtx);
-extern rtx        gen_consttable_8                      (rtx);
-extern rtx        gen_consttable_16                     (rtx);
-extern rtx        gen_clzsi2                            (rtx, rtx);
-extern rtx        gen_rbitsi2                           (rtx, rtx);
-extern rtx        gen_prefetch                          (rtx, rtx, rtx);
-extern rtx        gen_force_register_use                (rtx);
-extern rtx        gen_arm_eh_return                     (rtx);
-extern rtx        gen_thumb_eh_return                   (rtx);
-extern rtx        gen_load_tp_hard                      (rtx);
-extern rtx        gen_load_tp_soft                      (void);
-extern rtx        gen_tlscall                           (rtx, rtx);
-extern rtx        gen_crc32b                            (rtx, rtx, rtx);
-extern rtx        gen_crc32h                            (rtx, rtx, rtx);
-extern rtx        gen_crc32w                            (rtx, rtx, rtx);
-extern rtx        gen_crc32cb                           (rtx, rtx, rtx);
-extern rtx        gen_crc32ch                           (rtx, rtx, rtx);
-extern rtx        gen_crc32cw                           (rtx, rtx, rtx);
-extern rtx        gen_tbcstv8qi                         (rtx, rtx);
-extern rtx        gen_tbcstv4hi                         (rtx, rtx);
-extern rtx        gen_tbcstv2si                         (rtx, rtx);
-extern rtx        gen_iwmmxt_iordi3                     (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_xordi3                     (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_anddi3                     (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_nanddi3                    (rtx, rtx, rtx);
-extern rtx        gen_movv2si_internal                  (rtx, rtx);
-extern rtx        gen_movv4hi_internal                  (rtx, rtx);
-extern rtx        gen_movv8qi_internal                  (rtx, rtx);
-extern rtx        gen_ssaddv8qi3                        (rtx, rtx, rtx);
-extern rtx        gen_ssaddv4hi3                        (rtx, rtx, rtx);
-extern rtx        gen_ssaddv2si3                        (rtx, rtx, rtx);
-extern rtx        gen_usaddv8qi3                        (rtx, rtx, rtx);
-extern rtx        gen_usaddv4hi3                        (rtx, rtx, rtx);
-extern rtx        gen_usaddv2si3                        (rtx, rtx, rtx);
-extern rtx        gen_sssubv8qi3                        (rtx, rtx, rtx);
-extern rtx        gen_sssubv4hi3                        (rtx, rtx, rtx);
-extern rtx        gen_sssubv2si3                        (rtx, rtx, rtx);
-extern rtx        gen_ussubv8qi3                        (rtx, rtx, rtx);
-extern rtx        gen_ussubv4hi3                        (rtx, rtx, rtx);
-extern rtx        gen_ussubv2si3                        (rtx, rtx, rtx);
-extern rtx        gen_smulv4hi3_highpart                (rtx, rtx, rtx);
-extern rtx        gen_umulv4hi3_highpart                (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmacs                      (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmacsz                     (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmacu                      (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmacuz                     (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_clrdi                      (rtx);
-extern rtx        gen_iwmmxt_clrv8qi                    (rtx);
-extern rtx        gen_iwmmxt_clrv4hi                    (rtx);
-extern rtx        gen_iwmmxt_clrv2si                    (rtx);
-extern rtx        gen_iwmmxt_uavgrndv8qi3               (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_uavgrndv4hi3               (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_uavgv8qi3                  (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_uavgv4hi3                  (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_tinsrb                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_tinsrh                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_tinsrw                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_textrmub                   (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_textrmsb                   (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_textrmuh                   (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_textrmsh                   (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_textrmw                    (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wshufh                     (rtx, rtx, rtx);
-extern rtx        gen_eqv8qi3                           (rtx, rtx, rtx);
-extern rtx        gen_eqv4hi3                           (rtx, rtx, rtx);
-extern rtx        gen_eqv2si3                           (rtx, rtx, rtx);
-extern rtx        gen_gtuv8qi3                          (rtx, rtx, rtx);
-extern rtx        gen_gtuv4hi3                          (rtx, rtx, rtx);
-extern rtx        gen_gtuv2si3                          (rtx, rtx, rtx);
-extern rtx        gen_gtv8qi3                           (rtx, rtx, rtx);
-extern rtx        gen_gtv4hi3                           (rtx, rtx, rtx);
-extern rtx        gen_gtv2si3                           (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wpackhss                   (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wpackwss                   (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wpackdss                   (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wpackhus                   (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wpackwus                   (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wpackdus                   (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wunpckihb                  (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wunpckihh                  (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wunpckihw                  (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wunpckilb                  (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wunpckilh                  (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wunpckilw                  (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wunpckehub                 (rtx, rtx);
-extern rtx        gen_iwmmxt_wunpckehuh                 (rtx, rtx);
-extern rtx        gen_iwmmxt_wunpckehuw                 (rtx, rtx);
-extern rtx        gen_iwmmxt_wunpckehsb                 (rtx, rtx);
-extern rtx        gen_iwmmxt_wunpckehsh                 (rtx, rtx);
-extern rtx        gen_iwmmxt_wunpckehsw                 (rtx, rtx);
-extern rtx        gen_iwmmxt_wunpckelub                 (rtx, rtx);
-extern rtx        gen_iwmmxt_wunpckeluh                 (rtx, rtx);
-extern rtx        gen_iwmmxt_wunpckeluw                 (rtx, rtx);
-extern rtx        gen_iwmmxt_wunpckelsb                 (rtx, rtx);
-extern rtx        gen_iwmmxt_wunpckelsh                 (rtx, rtx);
-extern rtx        gen_iwmmxt_wunpckelsw                 (rtx, rtx);
-extern rtx        gen_rorv4hi3                          (rtx, rtx, rtx);
-extern rtx        gen_rorv2si3                          (rtx, rtx, rtx);
-extern rtx        gen_rordi3                            (rtx, rtx, rtx);
-extern rtx        gen_ashrv4hi3_iwmmxt                  (rtx, rtx, rtx);
-extern rtx        gen_ashrv2si3_iwmmxt                  (rtx, rtx, rtx);
-extern rtx        gen_ashrdi3_iwmmxt                    (rtx, rtx, rtx);
-extern rtx        gen_lshrv4hi3_iwmmxt                  (rtx, rtx, rtx);
-extern rtx        gen_lshrv2si3_iwmmxt                  (rtx, rtx, rtx);
-extern rtx        gen_lshrdi3_iwmmxt                    (rtx, rtx, rtx);
-extern rtx        gen_ashlv4hi3_iwmmxt                  (rtx, rtx, rtx);
-extern rtx        gen_ashlv2si3_iwmmxt                  (rtx, rtx, rtx);
-extern rtx        gen_ashldi3_iwmmxt                    (rtx, rtx, rtx);
-extern rtx        gen_rorv4hi3_di                       (rtx, rtx, rtx);
-extern rtx        gen_rorv2si3_di                       (rtx, rtx, rtx);
-extern rtx        gen_rordi3_di                         (rtx, rtx, rtx);
-extern rtx        gen_ashrv4hi3_di                      (rtx, rtx, rtx);
-extern rtx        gen_ashrv2si3_di                      (rtx, rtx, rtx);
-extern rtx        gen_ashrdi3_di                        (rtx, rtx, rtx);
-extern rtx        gen_lshrv4hi3_di                      (rtx, rtx, rtx);
-extern rtx        gen_lshrv2si3_di                      (rtx, rtx, rtx);
-extern rtx        gen_lshrdi3_di                        (rtx, rtx, rtx);
-extern rtx        gen_ashlv4hi3_di                      (rtx, rtx, rtx);
-extern rtx        gen_ashlv2si3_di                      (rtx, rtx, rtx);
-extern rtx        gen_ashldi3_di                        (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmadds                     (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmaddu                     (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_tmia                       (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_tmiaph                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_tmiabb                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_tmiatb                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_tmiabt                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_tmiatt                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_tmovmskb                   (rtx, rtx);
-extern rtx        gen_iwmmxt_tmovmskh                   (rtx, rtx);
-extern rtx        gen_iwmmxt_tmovmskw                   (rtx, rtx);
-extern rtx        gen_iwmmxt_waccb                      (rtx, rtx);
-extern rtx        gen_iwmmxt_wacch                      (rtx, rtx);
-extern rtx        gen_iwmmxt_waccw                      (rtx, rtx);
-extern rtx        gen_iwmmxt_waligni                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_walignr                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_walignr0                   (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_walignr1                   (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_walignr2                   (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_walignr3                   (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wsadb                      (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wsadh                      (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wsadbz                     (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wsadhz                     (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wabsv2si3                  (rtx, rtx);
-extern rtx        gen_iwmmxt_wabsv4hi3                  (rtx, rtx);
-extern rtx        gen_iwmmxt_wabsv8qi3                  (rtx, rtx);
-extern rtx        gen_iwmmxt_wabsdiffb                  (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wabsdiffh                  (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wabsdiffw                  (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_waddsubhx                  (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wsubaddhx                  (rtx, rtx, rtx);
-extern rtx        gen_addcv4hi3                         (rtx, rtx, rtx);
-extern rtx        gen_addcv2si3                         (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_avg4                       (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_avg4r                      (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmaddsx                    (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmaddux                    (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmaddsn                    (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmaddun                    (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmulwsm                    (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmulwum                    (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmulsmr                    (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmulumr                    (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmulwsmr                   (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmulwumr                   (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmulwl                     (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wqmulm                     (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wqmulwm                    (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wqmulmr                    (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wqmulwmr                   (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_waddbhusm                  (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_waddbhusl                  (rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wqmiabb                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wqmiabt                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wqmiatb                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wqmiatt                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wqmiabbn                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wqmiabtn                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wqmiatbn                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wqmiattn                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmiabb                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmiabt                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmiatb                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmiatt                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmiabbn                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmiabtn                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmiatbn                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmiattn                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmiawbb                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmiawbt                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmiawtb                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmiawtt                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmiawbbn                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmiawbtn                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmiawtbn                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmiawttn                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_wmerge                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_tandcv2si3                 (void);
-extern rtx        gen_iwmmxt_tandcv4hi3                 (void);
-extern rtx        gen_iwmmxt_tandcv8qi3                 (void);
-extern rtx        gen_iwmmxt_torcv2si3                  (void);
-extern rtx        gen_iwmmxt_torcv4hi3                  (void);
-extern rtx        gen_iwmmxt_torcv8qi3                  (void);
-extern rtx        gen_iwmmxt_torvscv2si3                (void);
-extern rtx        gen_iwmmxt_torvscv4hi3                (void);
-extern rtx        gen_iwmmxt_torvscv8qi3                (void);
-extern rtx        gen_iwmmxt_textrcv2si3                (rtx);
-extern rtx        gen_iwmmxt_textrcv4hi3                (rtx);
-extern rtx        gen_iwmmxt_textrcv8qi3                (rtx);
-extern rtx        gen_fmasf4                            (rtx, rtx, rtx, rtx);
-extern rtx        gen_fmadf4                            (rtx, rtx, rtx, rtx);
-extern rtx        gen_extendhfsf2                       (rtx, rtx);
-extern rtx        gen_truncsfhf2                        (rtx, rtx);
-extern rtx        gen_fixuns_truncsfsi2                 (rtx, rtx);
-extern rtx        gen_fixuns_truncdfsi2                 (rtx, rtx);
-extern rtx        gen_floatunssisf2                     (rtx, rtx);
-extern rtx        gen_floatunssidf2                     (rtx, rtx);
-extern rtx        gen_btruncsf2                         (rtx, rtx);
-extern rtx        gen_ceilsf2                           (rtx, rtx);
-extern rtx        gen_floorsf2                          (rtx, rtx);
-extern rtx        gen_nearbyintsf2                      (rtx, rtx);
-extern rtx        gen_rintsf2                           (rtx, rtx);
-extern rtx        gen_roundsf2                          (rtx, rtx);
-extern rtx        gen_btruncdf2                         (rtx, rtx);
-extern rtx        gen_ceildf2                           (rtx, rtx);
-extern rtx        gen_floordf2                          (rtx, rtx);
-extern rtx        gen_nearbyintdf2                      (rtx, rtx);
-extern rtx        gen_rintdf2                           (rtx, rtx);
-extern rtx        gen_rounddf2                          (rtx, rtx);
-extern rtx        gen_smaxsf3                           (rtx, rtx, rtx);
-extern rtx        gen_smaxdf3                           (rtx, rtx, rtx);
-extern rtx        gen_sminsf3                           (rtx, rtx, rtx);
-extern rtx        gen_smindf3                           (rtx, rtx, rtx);
-extern rtx        gen_tls_load_dot_plus_four            (rtx, rtx, rtx, rtx);
-extern rtx        gen_thumb2_zero_extendqisi2_v6        (rtx, rtx);
-extern rtx        gen_thumb2_casesi_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_thumb2_casesi_internal_pic        (rtx, rtx, rtx, rtx);
-extern rtx        gen_thumb2_eh_return                  (rtx);
-extern rtx        gen_thumb2_addsi3_compare0            (rtx, rtx, rtx);
-extern rtx        gen_vec_setv8qi_internal              (rtx, rtx, rtx, rtx);
-extern rtx        gen_vec_setv4hi_internal              (rtx, rtx, rtx, rtx);
-extern rtx        gen_vec_setv2si_internal              (rtx, rtx, rtx, rtx);
-extern rtx        gen_vec_setv2sf_internal              (rtx, rtx, rtx, rtx);
-extern rtx        gen_vec_setv16qi_internal             (rtx, rtx, rtx, rtx);
-extern rtx        gen_vec_setv8hi_internal              (rtx, rtx, rtx, rtx);
-extern rtx        gen_vec_setv4si_internal              (rtx, rtx, rtx, rtx);
-extern rtx        gen_vec_setv4sf_internal              (rtx, rtx, rtx, rtx);
-extern rtx        gen_vec_setv2di_internal              (rtx, rtx, rtx, rtx);
-extern rtx        gen_vec_extractv8qi                   (rtx, rtx, rtx);
-extern rtx        gen_vec_extractv4hi                   (rtx, rtx, rtx);
-extern rtx        gen_vec_extractv2si                   (rtx, rtx, rtx);
-extern rtx        gen_vec_extractv2sf                   (rtx, rtx, rtx);
-extern rtx        gen_vec_extractv16qi                  (rtx, rtx, rtx);
-extern rtx        gen_vec_extractv8hi                   (rtx, rtx, rtx);
-extern rtx        gen_vec_extractv4si                   (rtx, rtx, rtx);
-extern rtx        gen_vec_extractv4sf                   (rtx, rtx, rtx);
-extern rtx        gen_vec_extractv2di                   (rtx, rtx, rtx);
-extern rtx        gen_adddi3_neon                       (rtx, rtx, rtx);
-extern rtx        gen_subdi3_neon                       (rtx, rtx, rtx);
-extern rtx        gen_mulv8qi3addv8qi_neon              (rtx, rtx, rtx, rtx);
-extern rtx        gen_mulv16qi3addv16qi_neon            (rtx, rtx, rtx, rtx);
-extern rtx        gen_mulv4hi3addv4hi_neon              (rtx, rtx, rtx, rtx);
-extern rtx        gen_mulv8hi3addv8hi_neon              (rtx, rtx, rtx, rtx);
-extern rtx        gen_mulv2si3addv2si_neon              (rtx, rtx, rtx, rtx);
-extern rtx        gen_mulv4si3addv4si_neon              (rtx, rtx, rtx, rtx);
-extern rtx        gen_mulv2sf3addv2sf_neon              (rtx, rtx, rtx, rtx);
-extern rtx        gen_mulv4sf3addv4sf_neon              (rtx, rtx, rtx, rtx);
-extern rtx        gen_mulv8qi3negv8qiaddv8qi_neon       (rtx, rtx, rtx, rtx);
-extern rtx        gen_mulv16qi3negv16qiaddv16qi_neon    (rtx, rtx, rtx, rtx);
-extern rtx        gen_mulv4hi3negv4hiaddv4hi_neon       (rtx, rtx, rtx, rtx);
-extern rtx        gen_mulv8hi3negv8hiaddv8hi_neon       (rtx, rtx, rtx, rtx);
-extern rtx        gen_mulv2si3negv2siaddv2si_neon       (rtx, rtx, rtx, rtx);
-extern rtx        gen_mulv4si3negv4siaddv4si_neon       (rtx, rtx, rtx, rtx);
-extern rtx        gen_mulv2sf3negv2sfaddv2sf_neon       (rtx, rtx, rtx, rtx);
-extern rtx        gen_mulv4sf3negv4sfaddv4sf_neon       (rtx, rtx, rtx, rtx);
-extern rtx        gen_fmav2sf4                          (rtx, rtx, rtx, rtx);
-extern rtx        gen_fmav4sf4                          (rtx, rtx, rtx, rtx);
-extern rtx        gen_fmav2sf4_intrinsic                (rtx, rtx, rtx, rtx);
-extern rtx        gen_fmav4sf4_intrinsic                (rtx, rtx, rtx, rtx);
-extern rtx        gen_fmsubv2sf4_intrinsic              (rtx, rtx, rtx, rtx);
-extern rtx        gen_fmsubv4sf4_intrinsic              (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vrintpv2sf                   (rtx, rtx);
-extern rtx        gen_neon_vrintzv2sf                   (rtx, rtx);
-extern rtx        gen_neon_vrintmv2sf                   (rtx, rtx);
-extern rtx        gen_neon_vrintxv2sf                   (rtx, rtx);
-extern rtx        gen_neon_vrintav2sf                   (rtx, rtx);
-extern rtx        gen_neon_vrintnv2sf                   (rtx, rtx);
-extern rtx        gen_neon_vrintpv4sf                   (rtx, rtx);
-extern rtx        gen_neon_vrintzv4sf                   (rtx, rtx);
-extern rtx        gen_neon_vrintmv4sf                   (rtx, rtx);
-extern rtx        gen_neon_vrintxv4sf                   (rtx, rtx);
-extern rtx        gen_neon_vrintav4sf                   (rtx, rtx);
-extern rtx        gen_neon_vrintnv4sf                   (rtx, rtx);
-extern rtx        gen_iorv8qi3                          (rtx, rtx, rtx);
-extern rtx        gen_iorv16qi3                         (rtx, rtx, rtx);
-extern rtx        gen_iorv4hi3                          (rtx, rtx, rtx);
-extern rtx        gen_iorv8hi3                          (rtx, rtx, rtx);
-extern rtx        gen_iorv2si3                          (rtx, rtx, rtx);
-extern rtx        gen_iorv4si3                          (rtx, rtx, rtx);
-extern rtx        gen_iorv2sf3                          (rtx, rtx, rtx);
-extern rtx        gen_iorv4sf3                          (rtx, rtx, rtx);
-extern rtx        gen_iorv2di3                          (rtx, rtx, rtx);
-extern rtx        gen_andv8qi3                          (rtx, rtx, rtx);
-extern rtx        gen_andv16qi3                         (rtx, rtx, rtx);
-extern rtx        gen_andv4hi3                          (rtx, rtx, rtx);
-extern rtx        gen_andv8hi3                          (rtx, rtx, rtx);
-extern rtx        gen_andv2si3                          (rtx, rtx, rtx);
-extern rtx        gen_andv4si3                          (rtx, rtx, rtx);
-extern rtx        gen_andv2sf3                          (rtx, rtx, rtx);
-extern rtx        gen_andv4sf3                          (rtx, rtx, rtx);
-extern rtx        gen_andv2di3                          (rtx, rtx, rtx);
-extern rtx        gen_ornv8qi3_neon                     (rtx, rtx, rtx);
-extern rtx        gen_ornv16qi3_neon                    (rtx, rtx, rtx);
-extern rtx        gen_ornv4hi3_neon                     (rtx, rtx, rtx);
-extern rtx        gen_ornv8hi3_neon                     (rtx, rtx, rtx);
-extern rtx        gen_ornv2si3_neon                     (rtx, rtx, rtx);
-extern rtx        gen_ornv4si3_neon                     (rtx, rtx, rtx);
-extern rtx        gen_ornv2sf3_neon                     (rtx, rtx, rtx);
-extern rtx        gen_ornv4sf3_neon                     (rtx, rtx, rtx);
-extern rtx        gen_ornv2di3_neon                     (rtx, rtx, rtx);
-extern rtx        gen_orndi3_neon                       (rtx, rtx, rtx);
-extern rtx        gen_bicv8qi3_neon                     (rtx, rtx, rtx);
-extern rtx        gen_bicv16qi3_neon                    (rtx, rtx, rtx);
-extern rtx        gen_bicv4hi3_neon                     (rtx, rtx, rtx);
-extern rtx        gen_bicv8hi3_neon                     (rtx, rtx, rtx);
-extern rtx        gen_bicv2si3_neon                     (rtx, rtx, rtx);
-extern rtx        gen_bicv4si3_neon                     (rtx, rtx, rtx);
-extern rtx        gen_bicv2sf3_neon                     (rtx, rtx, rtx);
-extern rtx        gen_bicv4sf3_neon                     (rtx, rtx, rtx);
-extern rtx        gen_bicv2di3_neon                     (rtx, rtx, rtx);
-extern rtx        gen_bicdi3_neon                       (rtx, rtx, rtx);
-extern rtx        gen_xorv8qi3                          (rtx, rtx, rtx);
-extern rtx        gen_xorv16qi3                         (rtx, rtx, rtx);
-extern rtx        gen_xorv4hi3                          (rtx, rtx, rtx);
-extern rtx        gen_xorv8hi3                          (rtx, rtx, rtx);
-extern rtx        gen_xorv2si3                          (rtx, rtx, rtx);
-extern rtx        gen_xorv4si3                          (rtx, rtx, rtx);
-extern rtx        gen_xorv2sf3                          (rtx, rtx, rtx);
-extern rtx        gen_xorv4sf3                          (rtx, rtx, rtx);
-extern rtx        gen_xorv2di3                          (rtx, rtx, rtx);
-extern rtx        gen_one_cmplv8qi2                     (rtx, rtx);
-extern rtx        gen_one_cmplv16qi2                    (rtx, rtx);
-extern rtx        gen_one_cmplv4hi2                     (rtx, rtx);
-extern rtx        gen_one_cmplv8hi2                     (rtx, rtx);
-extern rtx        gen_one_cmplv2si2                     (rtx, rtx);
-extern rtx        gen_one_cmplv4si2                     (rtx, rtx);
-extern rtx        gen_one_cmplv2sf2                     (rtx, rtx);
-extern rtx        gen_one_cmplv4sf2                     (rtx, rtx);
-extern rtx        gen_one_cmplv2di2                     (rtx, rtx);
-extern rtx        gen_absv8qi2                          (rtx, rtx);
-extern rtx        gen_absv16qi2                         (rtx, rtx);
-extern rtx        gen_absv4hi2                          (rtx, rtx);
-extern rtx        gen_absv8hi2                          (rtx, rtx);
-extern rtx        gen_absv2si2                          (rtx, rtx);
-extern rtx        gen_absv4si2                          (rtx, rtx);
-extern rtx        gen_absv2sf2                          (rtx, rtx);
-extern rtx        gen_absv4sf2                          (rtx, rtx);
-extern rtx        gen_negv8qi2                          (rtx, rtx);
-extern rtx        gen_negv16qi2                         (rtx, rtx);
-extern rtx        gen_negv4hi2                          (rtx, rtx);
-extern rtx        gen_negv8hi2                          (rtx, rtx);
-extern rtx        gen_negv2si2                          (rtx, rtx);
-extern rtx        gen_negv4si2                          (rtx, rtx);
-extern rtx        gen_negv2sf2                          (rtx, rtx);
-extern rtx        gen_negv4sf2                          (rtx, rtx);
-extern rtx        gen_negdi2_neon                       (rtx, rtx);
-extern rtx        gen_vashlv8qi3                        (rtx, rtx, rtx);
-extern rtx        gen_vashlv16qi3                       (rtx, rtx, rtx);
-extern rtx        gen_vashlv4hi3                        (rtx, rtx, rtx);
-extern rtx        gen_vashlv8hi3                        (rtx, rtx, rtx);
-extern rtx        gen_vashlv2si3                        (rtx, rtx, rtx);
-extern rtx        gen_vashlv4si3                        (rtx, rtx, rtx);
-extern rtx        gen_vashrv8qi3_imm                    (rtx, rtx, rtx);
-extern rtx        gen_vashrv16qi3_imm                   (rtx, rtx, rtx);
-extern rtx        gen_vashrv4hi3_imm                    (rtx, rtx, rtx);
-extern rtx        gen_vashrv8hi3_imm                    (rtx, rtx, rtx);
-extern rtx        gen_vashrv2si3_imm                    (rtx, rtx, rtx);
-extern rtx        gen_vashrv4si3_imm                    (rtx, rtx, rtx);
-extern rtx        gen_vlshrv8qi3_imm                    (rtx, rtx, rtx);
-extern rtx        gen_vlshrv16qi3_imm                   (rtx, rtx, rtx);
-extern rtx        gen_vlshrv4hi3_imm                    (rtx, rtx, rtx);
-extern rtx        gen_vlshrv8hi3_imm                    (rtx, rtx, rtx);
-extern rtx        gen_vlshrv2si3_imm                    (rtx, rtx, rtx);
-extern rtx        gen_vlshrv4si3_imm                    (rtx, rtx, rtx);
-extern rtx        gen_ashlv8qi3_signed                  (rtx, rtx, rtx);
-extern rtx        gen_ashlv16qi3_signed                 (rtx, rtx, rtx);
-extern rtx        gen_ashlv4hi3_signed                  (rtx, rtx, rtx);
-extern rtx        gen_ashlv8hi3_signed                  (rtx, rtx, rtx);
-extern rtx        gen_ashlv2si3_signed                  (rtx, rtx, rtx);
-extern rtx        gen_ashlv4si3_signed                  (rtx, rtx, rtx);
-extern rtx        gen_ashlv2di3_signed                  (rtx, rtx, rtx);
-extern rtx        gen_ashlv8qi3_unsigned                (rtx, rtx, rtx);
-extern rtx        gen_ashlv16qi3_unsigned               (rtx, rtx, rtx);
-extern rtx        gen_ashlv4hi3_unsigned                (rtx, rtx, rtx);
-extern rtx        gen_ashlv8hi3_unsigned                (rtx, rtx, rtx);
-extern rtx        gen_ashlv2si3_unsigned                (rtx, rtx, rtx);
-extern rtx        gen_ashlv4si3_unsigned                (rtx, rtx, rtx);
-extern rtx        gen_ashlv2di3_unsigned                (rtx, rtx, rtx);
-extern rtx        gen_neon_load_count                   (rtx, rtx);
-extern rtx        gen_ashldi3_neon_noclobber            (rtx, rtx, rtx);
-extern rtx        gen_ashldi3_neon                      (rtx, rtx, rtx);
-extern rtx        gen_signed_shift_di3_neon             (rtx, rtx, rtx);
-extern rtx        gen_unsigned_shift_di3_neon           (rtx, rtx, rtx);
-extern rtx        gen_ashrdi3_neon_imm_noclobber        (rtx, rtx, rtx);
-extern rtx        gen_lshrdi3_neon_imm_noclobber        (rtx, rtx, rtx);
-extern rtx        gen_ashrdi3_neon                      (rtx, rtx, rtx);
-extern rtx        gen_lshrdi3_neon                      (rtx, rtx, rtx);
-extern rtx        gen_widen_ssumv8qi3                   (rtx, rtx, rtx);
-extern rtx        gen_widen_ssumv4hi3                   (rtx, rtx, rtx);
-extern rtx        gen_widen_ssumv2si3                   (rtx, rtx, rtx);
-extern rtx        gen_widen_usumv8qi3                   (rtx, rtx, rtx);
-extern rtx        gen_widen_usumv4hi3                   (rtx, rtx, rtx);
-extern rtx        gen_widen_usumv2si3                   (rtx, rtx, rtx);
-extern rtx        gen_quad_halves_plusv4si              (rtx, rtx);
-extern rtx        gen_quad_halves_sminv4si              (rtx, rtx);
-extern rtx        gen_quad_halves_smaxv4si              (rtx, rtx);
-extern rtx        gen_quad_halves_uminv4si              (rtx, rtx);
-extern rtx        gen_quad_halves_umaxv4si              (rtx, rtx);
-extern rtx        gen_quad_halves_plusv4sf              (rtx, rtx);
-extern rtx        gen_quad_halves_sminv4sf              (rtx, rtx);
-extern rtx        gen_quad_halves_smaxv4sf              (rtx, rtx);
-extern rtx        gen_quad_halves_plusv8hi              (rtx, rtx);
-extern rtx        gen_quad_halves_sminv8hi              (rtx, rtx);
-extern rtx        gen_quad_halves_smaxv8hi              (rtx, rtx);
-extern rtx        gen_quad_halves_uminv8hi              (rtx, rtx);
-extern rtx        gen_quad_halves_umaxv8hi              (rtx, rtx);
-extern rtx        gen_quad_halves_plusv16qi             (rtx, rtx);
-extern rtx        gen_quad_halves_sminv16qi             (rtx, rtx);
-extern rtx        gen_quad_halves_smaxv16qi             (rtx, rtx);
-extern rtx        gen_quad_halves_uminv16qi             (rtx, rtx);
-extern rtx        gen_quad_halves_umaxv16qi             (rtx, rtx);
-extern rtx        gen_reduc_splus_v2di                  (rtx, rtx);
-extern rtx        gen_neon_vpadd_internalv8qi           (rtx, rtx, rtx);
-extern rtx        gen_neon_vpadd_internalv4hi           (rtx, rtx, rtx);
-extern rtx        gen_neon_vpadd_internalv2si           (rtx, rtx, rtx);
-extern rtx        gen_neon_vpadd_internalv2sf           (rtx, rtx, rtx);
-extern rtx        gen_neon_vpsminv8qi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vpsminv4hi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vpsminv2si                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vpsminv2sf                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vpsmaxv8qi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vpsmaxv4hi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vpsmaxv2si                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vpsmaxv2sf                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vpuminv8qi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vpuminv4hi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vpuminv2si                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vpumaxv8qi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vpumaxv4hi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vpumaxv2si                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vaddv8qi_unspec              (rtx, rtx, rtx);
-extern rtx        gen_neon_vaddv16qi_unspec             (rtx, rtx, rtx);
-extern rtx        gen_neon_vaddv4hi_unspec              (rtx, rtx, rtx);
-extern rtx        gen_neon_vaddv8hi_unspec              (rtx, rtx, rtx);
-extern rtx        gen_neon_vaddv2si_unspec              (rtx, rtx, rtx);
-extern rtx        gen_neon_vaddv4si_unspec              (rtx, rtx, rtx);
-extern rtx        gen_neon_vaddv2sf_unspec              (rtx, rtx, rtx);
-extern rtx        gen_neon_vaddv4sf_unspec              (rtx, rtx, rtx);
-extern rtx        gen_neon_vadddi_unspec                (rtx, rtx, rtx);
-extern rtx        gen_neon_vaddv2di_unspec              (rtx, rtx, rtx);
-extern rtx        gen_neon_vaddlv8qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vaddlv4hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vaddlv2si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vaddwv8qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vaddwv4hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vaddwv2si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vhaddv8qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vhaddv16qi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vhaddv4hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vhaddv8hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vhaddv2si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vhaddv4si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqaddv8qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqaddv16qi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqaddv4hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqaddv8hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqaddv2si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqaddv4si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqadddi                      (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqaddv2di                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vaddhnv8hi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vaddhnv4si                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vaddhnv2di                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmulv8qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmulv16qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmulv4hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmulv8hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmulv2si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmulv4si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmulv2sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmulv4sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlav8qi_unspec              (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlav16qi_unspec             (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlav4hi_unspec              (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlav8hi_unspec              (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlav2si_unspec              (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlav4si_unspec              (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlav2sf_unspec              (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlav4sf_unspec              (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlalv8qi                    (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlalv4hi                    (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlalv2si                    (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlsv8qi_unspec              (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlsv16qi_unspec             (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlsv4hi_unspec              (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlsv8hi_unspec              (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlsv2si_unspec              (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlsv4si_unspec              (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlsv2sf_unspec              (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlsv4sf_unspec              (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlslv8qi                    (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlslv4hi                    (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlslv2si                    (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmulhv4hi                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmulhv2si                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmulhv8hi                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmulhv4si                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmlalv4hi                  (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmlalv2si                  (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmlslv4hi                  (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmlslv2si                  (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmullv8qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmullv4hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmullv2si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmullv4hi                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmullv2si                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsubv8qi_unspec              (rtx, rtx, rtx);
-extern rtx        gen_neon_vsubv16qi_unspec             (rtx, rtx, rtx);
-extern rtx        gen_neon_vsubv4hi_unspec              (rtx, rtx, rtx);
-extern rtx        gen_neon_vsubv8hi_unspec              (rtx, rtx, rtx);
-extern rtx        gen_neon_vsubv2si_unspec              (rtx, rtx, rtx);
-extern rtx        gen_neon_vsubv4si_unspec              (rtx, rtx, rtx);
-extern rtx        gen_neon_vsubv2sf_unspec              (rtx, rtx, rtx);
-extern rtx        gen_neon_vsubv4sf_unspec              (rtx, rtx, rtx);
-extern rtx        gen_neon_vsubdi_unspec                (rtx, rtx, rtx);
-extern rtx        gen_neon_vsubv2di_unspec              (rtx, rtx, rtx);
-extern rtx        gen_neon_vsublv8qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsublv4hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsublv2si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsubwv8qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsubwv4hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsubwv2si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqsubv8qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqsubv16qi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqsubv4hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqsubv8hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqsubv2si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqsubv4si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqsubdi                      (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqsubv2di                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vhsubv8qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vhsubv16qi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vhsubv4hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vhsubv8hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vhsubv2si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vhsubv4si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsubhnv8hi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsubhnv4si                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsubhnv2di                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vceqv8qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vceqv16qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vceqv4hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vceqv8hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vceqv2si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vceqv4si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vceqv2sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vceqv4sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgev8qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgev16qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgev4hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgev8hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgev2si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgev4si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgev2sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgev4sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgeuv8qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgeuv16qi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgeuv4hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgeuv8hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgeuv2si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgeuv4si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgtv8qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgtv16qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgtv4hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgtv8hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgtv2si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgtv4si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgtv2sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgtv4sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgtuv8qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgtuv16qi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgtuv4hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgtuv8hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgtuv2si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcgtuv4si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vclev8qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vclev16qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vclev4hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vclev8hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vclev2si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vclev4si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vclev2sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vclev4sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcltv8qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcltv16qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcltv4hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcltv8hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcltv2si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcltv4si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcltv2sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcltv4sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcagev2sf                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcagev4sf                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcagtv2sf                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcagtv4sf                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vtstv8qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vtstv16qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vtstv4hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vtstv8hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vtstv2si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vtstv4si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv8qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv16qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv4hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv8hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv2si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv4si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv2sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv4sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabdlv8qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabdlv4hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabdlv2si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabav8qi                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabav16qi                    (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabav4hi                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabav8hi                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabav2si                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabav4si                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabalv8qi                    (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabalv4hi                    (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabalv2si                    (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmaxv8qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmaxv16qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmaxv4hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmaxv8hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmaxv2si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmaxv4si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmaxv2sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmaxv4sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vminv8qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vminv16qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vminv4hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vminv8hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vminv2si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vminv4si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vminv2sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vminv4sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vpaddlv8qi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vpaddlv16qi                  (rtx, rtx, rtx);
-extern rtx        gen_neon_vpaddlv4hi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vpaddlv8hi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vpaddlv2si                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vpaddlv4si                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vpadalv8qi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vpadalv16qi                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vpadalv4hi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vpadalv8hi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vpadalv2si                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vpadalv4si                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vpmaxv8qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vpmaxv4hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vpmaxv2si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vpmaxv2sf                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vpminv8qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vpminv4hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vpminv2si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vpminv2sf                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vrecpsv2sf                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vrecpsv4sf                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vrsqrtsv2sf                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vrsqrtsv4sf                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqabsv8qi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vqabsv16qi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vqabsv4hi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vqabsv8hi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vqabsv2si                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vqabsv4si                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vqnegv8qi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vqnegv16qi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vqnegv4hi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vqnegv8hi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vqnegv2si                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vqnegv4si                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vclsv8qi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vclsv16qi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vclsv4hi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vclsv8hi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vclsv2si                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vclsv4si                     (rtx, rtx, rtx);
-extern rtx        gen_clzv8qi2                          (rtx, rtx);
-extern rtx        gen_clzv16qi2                         (rtx, rtx);
-extern rtx        gen_clzv4hi2                          (rtx, rtx);
-extern rtx        gen_clzv8hi2                          (rtx, rtx);
-extern rtx        gen_clzv2si2                          (rtx, rtx);
-extern rtx        gen_clzv4si2                          (rtx, rtx);
-extern rtx        gen_popcountv8qi2                     (rtx, rtx);
-extern rtx        gen_popcountv16qi2                    (rtx, rtx);
-extern rtx        gen_neon_vrecpev2si                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vrecpev2sf                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vrecpev4si                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vrecpev4sf                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vrsqrtev2si                  (rtx, rtx, rtx);
-extern rtx        gen_neon_vrsqrtev2sf                  (rtx, rtx, rtx);
-extern rtx        gen_neon_vrsqrtev4si                  (rtx, rtx, rtx);
-extern rtx        gen_neon_vrsqrtev4sf                  (rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev8qi_sext_internal  (rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev4hi_sext_internal  (rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev2si_sext_internal  (rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev2sf_sext_internal  (rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev8qi_zext_internal  (rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev4hi_zext_internal  (rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev2si_zext_internal  (rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev2sf_zext_internal  (rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev16qi_sext_internal (rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev8hi_sext_internal  (rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev4si_sext_internal  (rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev4sf_sext_internal  (rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev16qi_zext_internal (rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev8hi_zext_internal  (rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev4si_zext_internal  (rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev4sf_zext_internal  (rtx, rtx, rtx);
-extern rtx        gen_neon_vdup_nv8qi                   (rtx, rtx);
-extern rtx        gen_neon_vdup_nv4hi                   (rtx, rtx);
-extern rtx        gen_neon_vdup_nv16qi                  (rtx, rtx);
-extern rtx        gen_neon_vdup_nv8hi                   (rtx, rtx);
-extern rtx        gen_neon_vdup_nv2si                   (rtx, rtx);
-extern rtx        gen_neon_vdup_nv2sf                   (rtx, rtx);
-extern rtx        gen_neon_vdup_nv4si                   (rtx, rtx);
-extern rtx        gen_neon_vdup_nv4sf                   (rtx, rtx);
-extern rtx        gen_neon_vdup_nv2di                   (rtx, rtx);
-extern rtx        gen_neon_vdup_lanev8qi_internal       (rtx, rtx, rtx);
-extern rtx        gen_neon_vdup_lanev16qi_internal      (rtx, rtx, rtx);
-extern rtx        gen_neon_vdup_lanev4hi_internal       (rtx, rtx, rtx);
-extern rtx        gen_neon_vdup_lanev8hi_internal       (rtx, rtx, rtx);
-extern rtx        gen_neon_vdup_lanev2si_internal       (rtx, rtx, rtx);
-extern rtx        gen_neon_vdup_lanev4si_internal       (rtx, rtx, rtx);
-extern rtx        gen_neon_vdup_lanev2sf_internal       (rtx, rtx, rtx);
-extern rtx        gen_neon_vdup_lanev4sf_internal       (rtx, rtx, rtx);
-extern rtx        gen_neon_vcombinev8qi                 (rtx, rtx, rtx);
-extern rtx        gen_neon_vcombinev4hi                 (rtx, rtx, rtx);
-extern rtx        gen_neon_vcombinev2si                 (rtx, rtx, rtx);
-extern rtx        gen_neon_vcombinev2sf                 (rtx, rtx, rtx);
-extern rtx        gen_neon_vcombinedi                   (rtx, rtx, rtx);
-extern rtx        gen_floatv2siv2sf2                    (rtx, rtx);
-extern rtx        gen_floatv4siv4sf2                    (rtx, rtx);
-extern rtx        gen_floatunsv2siv2sf2                 (rtx, rtx);
-extern rtx        gen_floatunsv4siv4sf2                 (rtx, rtx);
-extern rtx        gen_fix_truncv2sfv2si2                (rtx, rtx);
-extern rtx        gen_fix_truncv4sfv4si2                (rtx, rtx);
-extern rtx        gen_fixuns_truncv2sfv2si2             (rtx, rtx);
-extern rtx        gen_fixuns_truncv4sfv4si2             (rtx, rtx);
-extern rtx        gen_neon_vcvtv2sf                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vcvtv4sf                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vcvtv2si                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vcvtv4si                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vcvtv4sfv4hf                 (rtx, rtx);
-extern rtx        gen_neon_vcvtv4hfv4sf                 (rtx, rtx);
-extern rtx        gen_neon_vcvt_nv2sf                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcvt_nv4sf                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcvt_nv2si                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcvt_nv4si                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmovnv8hi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vmovnv4si                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vmovnv2di                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vqmovnv8hi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vqmovnv4si                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vqmovnv2di                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vqmovunv8hi                  (rtx, rtx, rtx);
-extern rtx        gen_neon_vqmovunv4si                  (rtx, rtx, rtx);
-extern rtx        gen_neon_vqmovunv2di                  (rtx, rtx, rtx);
-extern rtx        gen_neon_vmovlv8qi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vmovlv4hi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vmovlv2si                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vmul_lanev4hi                (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmul_lanev2si                (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmul_lanev2sf                (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmul_lanev8hi                (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmul_lanev4si                (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmul_lanev4sf                (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmull_lanev4hi               (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmull_lanev2si               (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmull_lanev4hi             (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmull_lanev2si             (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmulh_lanev8hi             (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmulh_lanev4si             (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmulh_lanev4hi             (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmulh_lanev2si             (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmla_lanev4hi                (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmla_lanev2si                (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmla_lanev2sf                (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmla_lanev8hi                (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmla_lanev4si                (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmla_lanev4sf                (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlal_lanev4hi               (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlal_lanev2si               (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmlal_lanev4hi             (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmlal_lanev2si             (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmls_lanev4hi                (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmls_lanev2si                (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmls_lanev2sf                (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmls_lanev8hi                (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmls_lanev4si                (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmls_lanev4sf                (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlsl_lanev4hi               (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlsl_lanev2si               (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmlsl_lanev4hi             (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmlsl_lanev2si             (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vextv8qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vextv16qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vextv4hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vextv8hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vextv2si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vextv4si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vextv2sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vextv4sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vextdi                       (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vextv2di                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vrev64v8qi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vrev64v16qi                  (rtx, rtx, rtx);
-extern rtx        gen_neon_vrev64v4hi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vrev64v8hi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vrev64v2si                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vrev64v4si                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vrev64v2sf                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vrev64v4sf                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vrev64v2di                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vrev32v8qi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vrev32v4hi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vrev32v16qi                  (rtx, rtx, rtx);
-extern rtx        gen_neon_vrev32v8hi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vrev16v8qi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vrev16v16qi                  (rtx, rtx, rtx);
-extern rtx        gen_neon_vbslv8qi_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbslv16qi_internal           (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbslv4hi_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbslv8hi_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbslv2si_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbslv4si_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbslv2sf_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbslv4sf_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbsldi_internal              (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbslv2di_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshlv8qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshlv16qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshlv4hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshlv8hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshlv2si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshlv4si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshldi                       (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshlv2di                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshlv8qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshlv16qi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshlv4hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshlv8hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshlv2si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshlv4si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshldi                      (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshlv2di                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshr_nv8qi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshr_nv16qi                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshr_nv4hi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshr_nv8hi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshr_nv2si                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshr_nv4si                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshr_ndi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshr_nv2di                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshrn_nv8hi                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshrn_nv4si                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshrn_nv2di                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshrn_nv8hi                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshrn_nv4si                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshrn_nv2di                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshrun_nv8hi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshrun_nv4si                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshrun_nv2di                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshl_nv8qi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshl_nv16qi                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshl_nv4hi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshl_nv8hi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshl_nv2si                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshl_nv4si                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshl_ndi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshl_nv2di                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshl_nv8qi                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshl_nv16qi                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshl_nv4hi                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshl_nv8hi                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshl_nv2si                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshl_nv4si                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshl_ndi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshl_nv2di                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshlu_nv8qi                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshlu_nv16qi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshlu_nv4hi                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshlu_nv8hi                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshlu_nv2si                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshlu_nv4si                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshlu_ndi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqshlu_nv2di                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshll_nv8qi                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshll_nv4hi                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vshll_nv2si                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsra_nv8qi                   (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsra_nv16qi                  (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsra_nv4hi                   (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsra_nv8hi                   (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsra_nv2si                   (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsra_nv4si                   (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsra_ndi                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsra_nv2di                   (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsri_nv8qi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsri_nv16qi                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsri_nv4hi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsri_nv8hi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsri_nv2si                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsri_nv4si                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsri_ndi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsri_nv2di                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsli_nv8qi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsli_nv16qi                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsli_nv4hi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsli_nv8hi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsli_nv2si                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsli_nv4si                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsli_ndi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsli_nv2di                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vtbl1v8qi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vtbl2v8qi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vtbl3v8qi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vtbl4v8qi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vtbl1v16qi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vtbl2v16qi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vcombinev16qi                (rtx, rtx, rtx);
-extern rtx        gen_neon_vtbx1v8qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vtbx2v8qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vtbx3v8qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vtbx4v8qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld1v8qi                     (rtx, rtx);
-extern rtx        gen_neon_vld1v16qi                    (rtx, rtx);
-extern rtx        gen_neon_vld1v4hi                     (rtx, rtx);
-extern rtx        gen_neon_vld1v8hi                     (rtx, rtx);
-extern rtx        gen_neon_vld1v2si                     (rtx, rtx);
-extern rtx        gen_neon_vld1v4si                     (rtx, rtx);
-extern rtx        gen_neon_vld1v2sf                     (rtx, rtx);
-extern rtx        gen_neon_vld1v4sf                     (rtx, rtx);
-extern rtx        gen_neon_vld1di                       (rtx, rtx);
-extern rtx        gen_neon_vld1v2di                     (rtx, rtx);
-extern rtx        gen_neon_vld1_lanev8qi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld1_lanev4hi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld1_lanev2si                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld1_lanev2sf                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld1_lanedi                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld1_lanev16qi               (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld1_lanev8hi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld1_lanev4si                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld1_lanev4sf                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld1_lanev2di                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld1_dupv8qi                 (rtx, rtx);
-extern rtx        gen_neon_vld1_dupv4hi                 (rtx, rtx);
-extern rtx        gen_neon_vld1_dupv2si                 (rtx, rtx);
-extern rtx        gen_neon_vld1_dupv2sf                 (rtx, rtx);
-extern rtx        gen_neon_vld1_dupv16qi                (rtx, rtx);
-extern rtx        gen_neon_vld1_dupv8hi                 (rtx, rtx);
-extern rtx        gen_neon_vld1_dupv4si                 (rtx, rtx);
-extern rtx        gen_neon_vld1_dupv4sf                 (rtx, rtx);
-extern rtx        gen_neon_vld1_dupv2di                 (rtx, rtx);
-extern rtx        gen_neon_vst1v8qi                     (rtx, rtx);
-extern rtx        gen_neon_vst1v16qi                    (rtx, rtx);
-extern rtx        gen_neon_vst1v4hi                     (rtx, rtx);
-extern rtx        gen_neon_vst1v8hi                     (rtx, rtx);
-extern rtx        gen_neon_vst1v2si                     (rtx, rtx);
-extern rtx        gen_neon_vst1v4si                     (rtx, rtx);
-extern rtx        gen_neon_vst1v2sf                     (rtx, rtx);
-extern rtx        gen_neon_vst1v4sf                     (rtx, rtx);
-extern rtx        gen_neon_vst1di                       (rtx, rtx);
-extern rtx        gen_neon_vst1v2di                     (rtx, rtx);
-extern rtx        gen_neon_vst1_lanev8qi                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst1_lanev4hi                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst1_lanev2si                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst1_lanev2sf                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst1_lanedi                  (rtx, rtx, rtx);
-extern rtx        gen_neon_vst1_lanev16qi               (rtx, rtx, rtx);
-extern rtx        gen_neon_vst1_lanev8hi                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst1_lanev4si                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst1_lanev4sf                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst1_lanev2di                (rtx, rtx, rtx);
-extern rtx        gen_neon_vld2v8qi                     (rtx, rtx);
-extern rtx        gen_neon_vld2v4hi                     (rtx, rtx);
-extern rtx        gen_neon_vld2v2si                     (rtx, rtx);
-extern rtx        gen_neon_vld2v2sf                     (rtx, rtx);
-extern rtx        gen_neon_vld2di                       (rtx, rtx);
-extern rtx        gen_neon_vld2v16qi                    (rtx, rtx);
-extern rtx        gen_neon_vld2v8hi                     (rtx, rtx);
-extern rtx        gen_neon_vld2v4si                     (rtx, rtx);
-extern rtx        gen_neon_vld2v4sf                     (rtx, rtx);
-extern rtx        gen_neon_vld2_lanev8qi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld2_lanev4hi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld2_lanev2si                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld2_lanev2sf                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld2_lanev8hi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld2_lanev4si                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld2_lanev4sf                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld2_dupv8qi                 (rtx, rtx);
-extern rtx        gen_neon_vld2_dupv4hi                 (rtx, rtx);
-extern rtx        gen_neon_vld2_dupv2si                 (rtx, rtx);
-extern rtx        gen_neon_vld2_dupv2sf                 (rtx, rtx);
-extern rtx        gen_neon_vld2_dupdi                   (rtx, rtx);
-extern rtx        gen_neon_vst2v8qi                     (rtx, rtx);
-extern rtx        gen_neon_vst2v4hi                     (rtx, rtx);
-extern rtx        gen_neon_vst2v2si                     (rtx, rtx);
-extern rtx        gen_neon_vst2v2sf                     (rtx, rtx);
-extern rtx        gen_neon_vst2di                       (rtx, rtx);
-extern rtx        gen_neon_vst2v16qi                    (rtx, rtx);
-extern rtx        gen_neon_vst2v8hi                     (rtx, rtx);
-extern rtx        gen_neon_vst2v4si                     (rtx, rtx);
-extern rtx        gen_neon_vst2v4sf                     (rtx, rtx);
-extern rtx        gen_neon_vst2_lanev8qi                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst2_lanev4hi                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst2_lanev2si                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst2_lanev2sf                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst2_lanev8hi                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst2_lanev4si                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst2_lanev4sf                (rtx, rtx, rtx);
-extern rtx        gen_neon_vld3v8qi                     (rtx, rtx);
-extern rtx        gen_neon_vld3v4hi                     (rtx, rtx);
-extern rtx        gen_neon_vld3v2si                     (rtx, rtx);
-extern rtx        gen_neon_vld3v2sf                     (rtx, rtx);
-extern rtx        gen_neon_vld3di                       (rtx, rtx);
-extern rtx        gen_neon_vld3qav16qi                  (rtx, rtx);
-extern rtx        gen_neon_vld3qav8hi                   (rtx, rtx);
-extern rtx        gen_neon_vld3qav4si                   (rtx, rtx);
-extern rtx        gen_neon_vld3qav4sf                   (rtx, rtx);
-extern rtx        gen_neon_vld3qbv16qi                  (rtx, rtx, rtx);
-extern rtx        gen_neon_vld3qbv8hi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vld3qbv4si                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vld3qbv4sf                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vld3_lanev8qi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld3_lanev4hi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld3_lanev2si                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld3_lanev2sf                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld3_lanev8hi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld3_lanev4si                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld3_lanev4sf                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld3_dupv8qi                 (rtx, rtx);
-extern rtx        gen_neon_vld3_dupv4hi                 (rtx, rtx);
-extern rtx        gen_neon_vld3_dupv2si                 (rtx, rtx);
-extern rtx        gen_neon_vld3_dupv2sf                 (rtx, rtx);
-extern rtx        gen_neon_vld3_dupdi                   (rtx, rtx);
-extern rtx        gen_neon_vst3v8qi                     (rtx, rtx);
-extern rtx        gen_neon_vst3v4hi                     (rtx, rtx);
-extern rtx        gen_neon_vst3v2si                     (rtx, rtx);
-extern rtx        gen_neon_vst3v2sf                     (rtx, rtx);
-extern rtx        gen_neon_vst3di                       (rtx, rtx);
-extern rtx        gen_neon_vst3qav16qi                  (rtx, rtx);
-extern rtx        gen_neon_vst3qav8hi                   (rtx, rtx);
-extern rtx        gen_neon_vst3qav4si                   (rtx, rtx);
-extern rtx        gen_neon_vst3qav4sf                   (rtx, rtx);
-extern rtx        gen_neon_vst3qbv16qi                  (rtx, rtx);
-extern rtx        gen_neon_vst3qbv8hi                   (rtx, rtx);
-extern rtx        gen_neon_vst3qbv4si                   (rtx, rtx);
-extern rtx        gen_neon_vst3qbv4sf                   (rtx, rtx);
-extern rtx        gen_neon_vst3_lanev8qi                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst3_lanev4hi                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst3_lanev2si                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst3_lanev2sf                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst3_lanev8hi                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst3_lanev4si                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst3_lanev4sf                (rtx, rtx, rtx);
-extern rtx        gen_neon_vld4v8qi                     (rtx, rtx);
-extern rtx        gen_neon_vld4v4hi                     (rtx, rtx);
-extern rtx        gen_neon_vld4v2si                     (rtx, rtx);
-extern rtx        gen_neon_vld4v2sf                     (rtx, rtx);
-extern rtx        gen_neon_vld4di                       (rtx, rtx);
-extern rtx        gen_neon_vld4qav16qi                  (rtx, rtx);
-extern rtx        gen_neon_vld4qav8hi                   (rtx, rtx);
-extern rtx        gen_neon_vld4qav4si                   (rtx, rtx);
-extern rtx        gen_neon_vld4qav4sf                   (rtx, rtx);
-extern rtx        gen_neon_vld4qbv16qi                  (rtx, rtx, rtx);
-extern rtx        gen_neon_vld4qbv8hi                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vld4qbv4si                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vld4qbv4sf                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vld4_lanev8qi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld4_lanev4hi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld4_lanev2si                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld4_lanev2sf                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld4_lanev8hi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld4_lanev4si                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld4_lanev4sf                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vld4_dupv8qi                 (rtx, rtx);
-extern rtx        gen_neon_vld4_dupv4hi                 (rtx, rtx);
-extern rtx        gen_neon_vld4_dupv2si                 (rtx, rtx);
-extern rtx        gen_neon_vld4_dupv2sf                 (rtx, rtx);
-extern rtx        gen_neon_vld4_dupdi                   (rtx, rtx);
-extern rtx        gen_neon_vst4v8qi                     (rtx, rtx);
-extern rtx        gen_neon_vst4v4hi                     (rtx, rtx);
-extern rtx        gen_neon_vst4v2si                     (rtx, rtx);
-extern rtx        gen_neon_vst4v2sf                     (rtx, rtx);
-extern rtx        gen_neon_vst4di                       (rtx, rtx);
-extern rtx        gen_neon_vst4qav16qi                  (rtx, rtx);
-extern rtx        gen_neon_vst4qav8hi                   (rtx, rtx);
-extern rtx        gen_neon_vst4qav4si                   (rtx, rtx);
-extern rtx        gen_neon_vst4qav4sf                   (rtx, rtx);
-extern rtx        gen_neon_vst4qbv16qi                  (rtx, rtx);
-extern rtx        gen_neon_vst4qbv8hi                   (rtx, rtx);
-extern rtx        gen_neon_vst4qbv4si                   (rtx, rtx);
-extern rtx        gen_neon_vst4qbv4sf                   (rtx, rtx);
-extern rtx        gen_neon_vst4_lanev8qi                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst4_lanev4hi                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst4_lanev2si                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst4_lanev2sf                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst4_lanev8hi                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst4_lanev4si                (rtx, rtx, rtx);
-extern rtx        gen_neon_vst4_lanev4sf                (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_unpacks_lo_v16qi         (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_unpacku_lo_v16qi         (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_unpacks_lo_v8hi          (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_unpacku_lo_v8hi          (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_unpacks_lo_v4si          (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_unpacku_lo_v4si          (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_unpacks_hi_v16qi         (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_unpacku_hi_v16qi         (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_unpacks_hi_v8hi          (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_unpacku_hi_v8hi          (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_unpacks_hi_v4si          (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_unpacku_hi_v4si          (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_smult_lo_v16qi           (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vec_umult_lo_v16qi           (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vec_smult_lo_v8hi            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vec_umult_lo_v8hi            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vec_smult_lo_v4si            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vec_umult_lo_v4si            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vec_smult_hi_v16qi           (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vec_umult_hi_v16qi           (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vec_smult_hi_v8hi            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vec_umult_hi_v8hi            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vec_smult_hi_v4si            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vec_umult_hi_v4si            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vec_sshiftl_v8qi             (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_ushiftl_v8qi             (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_sshiftl_v4hi             (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_ushiftl_v4hi             (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_sshiftl_v2si             (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_ushiftl_v2si             (rtx, rtx, rtx);
-extern rtx        gen_neon_unpacks_v8qi                 (rtx, rtx);
-extern rtx        gen_neon_unpacku_v8qi                 (rtx, rtx);
-extern rtx        gen_neon_unpacks_v4hi                 (rtx, rtx);
-extern rtx        gen_neon_unpacku_v4hi                 (rtx, rtx);
-extern rtx        gen_neon_unpacks_v2si                 (rtx, rtx);
-extern rtx        gen_neon_unpacku_v2si                 (rtx, rtx);
-extern rtx        gen_neon_vec_smult_v8qi               (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_umult_v8qi               (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_smult_v4hi               (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_umult_v4hi               (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_smult_v2si               (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_umult_v2si               (rtx, rtx, rtx);
-extern rtx        gen_vec_pack_trunc_v8hi               (rtx, rtx, rtx);
-extern rtx        gen_vec_pack_trunc_v4si               (rtx, rtx, rtx);
-extern rtx        gen_vec_pack_trunc_v2di               (rtx, rtx, rtx);
-extern rtx        gen_neon_vec_pack_trunc_v8hi          (rtx, rtx);
-extern rtx        gen_neon_vec_pack_trunc_v4si          (rtx, rtx);
-extern rtx        gen_neon_vec_pack_trunc_v2di          (rtx, rtx);
-extern rtx        gen_neon_vabdv8qi_2                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv16qi_2                  (rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv4hi_2                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv8hi_2                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv2si_2                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv4si_2                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv2sf_2                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv4sf_2                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv2di_2                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv8qi_3                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv16qi_3                  (rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv4hi_3                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv8hi_3                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv2si_3                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv4si_3                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv2sf_3                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv4sf_3                   (rtx, rtx, rtx);
-extern rtx        gen_neon_vabdv2di_3                   (rtx, rtx, rtx);
-extern rtx        gen_crypto_aesmc                      (rtx, rtx);
-extern rtx        gen_crypto_aesimc                     (rtx, rtx);
-extern rtx        gen_crypto_aesd                       (rtx, rtx, rtx);
-extern rtx        gen_crypto_aese                       (rtx, rtx, rtx);
-extern rtx        gen_crypto_sha1su1                    (rtx, rtx, rtx);
-extern rtx        gen_crypto_sha256su0                  (rtx, rtx, rtx);
-extern rtx        gen_crypto_sha1su0                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_crypto_sha256h                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_crypto_sha256h2                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_crypto_sha256su1                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_crypto_sha1h                      (rtx, rtx, rtx);
-extern rtx        gen_crypto_vmullp64                   (rtx, rtx, rtx);
-extern rtx        gen_crypto_sha1c                      (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_crypto_sha1m                      (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_crypto_sha1p                      (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_loadqi                     (rtx, rtx, rtx);
-extern rtx        gen_atomic_loadhi                     (rtx, rtx, rtx);
-extern rtx        gen_atomic_loadsi                     (rtx, rtx, rtx);
-extern rtx        gen_atomic_storeqi                    (rtx, rtx, rtx);
-extern rtx        gen_atomic_storehi                    (rtx, rtx, rtx);
-extern rtx        gen_atomic_storesi                    (rtx, rtx, rtx);
-extern rtx        gen_atomic_loaddi_1                   (rtx, rtx);
-extern rtx        gen_atomic_compare_and_swapqi_1       (rtx, rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_compare_and_swaphi_1       (rtx, rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_compare_and_swapsi_1       (rtx, rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_compare_and_swapdi_1       (rtx, rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_exchangeqi                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_exchangehi                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_exchangesi                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_exchangedi                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_addqi                      (rtx, rtx, rtx);
-extern rtx        gen_atomic_subqi                      (rtx, rtx, rtx);
-extern rtx        gen_atomic_orqi                       (rtx, rtx, rtx);
-extern rtx        gen_atomic_xorqi                      (rtx, rtx, rtx);
-extern rtx        gen_atomic_andqi                      (rtx, rtx, rtx);
-extern rtx        gen_atomic_addhi                      (rtx, rtx, rtx);
-extern rtx        gen_atomic_subhi                      (rtx, rtx, rtx);
-extern rtx        gen_atomic_orhi                       (rtx, rtx, rtx);
-extern rtx        gen_atomic_xorhi                      (rtx, rtx, rtx);
-extern rtx        gen_atomic_andhi                      (rtx, rtx, rtx);
-extern rtx        gen_atomic_addsi                      (rtx, rtx, rtx);
-extern rtx        gen_atomic_subsi                      (rtx, rtx, rtx);
-extern rtx        gen_atomic_orsi                       (rtx, rtx, rtx);
-extern rtx        gen_atomic_xorsi                      (rtx, rtx, rtx);
-extern rtx        gen_atomic_andsi                      (rtx, rtx, rtx);
-extern rtx        gen_atomic_adddi                      (rtx, rtx, rtx);
-extern rtx        gen_atomic_subdi                      (rtx, rtx, rtx);
-extern rtx        gen_atomic_ordi                       (rtx, rtx, rtx);
-extern rtx        gen_atomic_xordi                      (rtx, rtx, rtx);
-extern rtx        gen_atomic_anddi                      (rtx, rtx, rtx);
-extern rtx        gen_atomic_nandqi                     (rtx, rtx, rtx);
-extern rtx        gen_atomic_nandhi                     (rtx, rtx, rtx);
-extern rtx        gen_atomic_nandsi                     (rtx, rtx, rtx);
-extern rtx        gen_atomic_nanddi                     (rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_addqi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_subqi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_orqi                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_xorqi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_andqi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_addhi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_subhi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_orhi                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_xorhi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_andhi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_addsi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_subsi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_orsi                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_xorsi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_andsi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_adddi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_subdi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_ordi                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_xordi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_anddi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_nandqi               (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_nandhi               (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_nandsi               (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_fetch_nanddi               (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_add_fetchqi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_sub_fetchqi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_or_fetchqi                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_xor_fetchqi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_and_fetchqi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_add_fetchhi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_sub_fetchhi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_or_fetchhi                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_xor_fetchhi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_and_fetchhi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_add_fetchsi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_sub_fetchsi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_or_fetchsi                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_xor_fetchsi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_and_fetchsi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_add_fetchdi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_sub_fetchdi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_or_fetchdi                 (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_xor_fetchdi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_and_fetchdi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_nand_fetchqi               (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_nand_fetchhi               (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_nand_fetchsi               (rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_nand_fetchdi               (rtx, rtx, rtx, rtx);
-extern rtx        gen_arm_load_exclusiveqi              (rtx, rtx);
-extern rtx        gen_arm_load_exclusivehi              (rtx, rtx);
-extern rtx        gen_arm_load_acquire_exclusiveqi      (rtx, rtx);
-extern rtx        gen_arm_load_acquire_exclusivehi      (rtx, rtx);
-extern rtx        gen_arm_load_exclusivesi              (rtx, rtx);
-extern rtx        gen_arm_load_acquire_exclusivesi      (rtx, rtx);
-extern rtx        gen_arm_load_exclusivedi              (rtx, rtx);
-extern rtx        gen_arm_load_acquire_exclusivedi      (rtx, rtx);
-extern rtx        gen_arm_store_exclusiveqi             (rtx, rtx, rtx);
-extern rtx        gen_arm_store_exclusivehi             (rtx, rtx, rtx);
-extern rtx        gen_arm_store_exclusivesi             (rtx, rtx, rtx);
-extern rtx        gen_arm_store_exclusivedi             (rtx, rtx, rtx);
-extern rtx        gen_arm_store_release_exclusivedi     (rtx, rtx, rtx);
-extern rtx        gen_arm_store_release_exclusiveqi     (rtx, rtx, rtx);
-extern rtx        gen_arm_store_release_exclusivehi     (rtx, rtx, rtx);
-extern rtx        gen_arm_store_release_exclusivesi     (rtx, rtx, rtx);
-extern rtx        gen_addqq3                            (rtx, rtx, rtx);
-extern rtx        gen_addhq3                            (rtx, rtx, rtx);
-extern rtx        gen_addsq3                            (rtx, rtx, rtx);
-extern rtx        gen_adduqq3                           (rtx, rtx, rtx);
-extern rtx        gen_adduhq3                           (rtx, rtx, rtx);
-extern rtx        gen_addusq3                           (rtx, rtx, rtx);
-extern rtx        gen_addha3                            (rtx, rtx, rtx);
-extern rtx        gen_addsa3                            (rtx, rtx, rtx);
-extern rtx        gen_adduha3                           (rtx, rtx, rtx);
-extern rtx        gen_addusa3                           (rtx, rtx, rtx);
-extern rtx        gen_addv4qq3                          (rtx, rtx, rtx);
-extern rtx        gen_addv2hq3                          (rtx, rtx, rtx);
-extern rtx        gen_addv2ha3                          (rtx, rtx, rtx);
-extern rtx        gen_usaddv4uqq3                       (rtx, rtx, rtx);
-extern rtx        gen_usaddv2uhq3                       (rtx, rtx, rtx);
-extern rtx        gen_usadduqq3                         (rtx, rtx, rtx);
-extern rtx        gen_usadduhq3                         (rtx, rtx, rtx);
-extern rtx        gen_usaddv2uha3                       (rtx, rtx, rtx);
-extern rtx        gen_usadduha3                         (rtx, rtx, rtx);
-extern rtx        gen_ssaddv4qq3                        (rtx, rtx, rtx);
-extern rtx        gen_ssaddv2hq3                        (rtx, rtx, rtx);
-extern rtx        gen_ssaddqq3                          (rtx, rtx, rtx);
-extern rtx        gen_ssaddhq3                          (rtx, rtx, rtx);
-extern rtx        gen_ssaddv2ha3                        (rtx, rtx, rtx);
-extern rtx        gen_ssaddha3                          (rtx, rtx, rtx);
-extern rtx        gen_ssaddsq3                          (rtx, rtx, rtx);
-extern rtx        gen_ssaddsa3                          (rtx, rtx, rtx);
-extern rtx        gen_subqq3                            (rtx, rtx, rtx);
-extern rtx        gen_subhq3                            (rtx, rtx, rtx);
-extern rtx        gen_subsq3                            (rtx, rtx, rtx);
-extern rtx        gen_subuqq3                           (rtx, rtx, rtx);
-extern rtx        gen_subuhq3                           (rtx, rtx, rtx);
-extern rtx        gen_subusq3                           (rtx, rtx, rtx);
-extern rtx        gen_subha3                            (rtx, rtx, rtx);
-extern rtx        gen_subsa3                            (rtx, rtx, rtx);
-extern rtx        gen_subuha3                           (rtx, rtx, rtx);
-extern rtx        gen_subusa3                           (rtx, rtx, rtx);
-extern rtx        gen_subv4qq3                          (rtx, rtx, rtx);
-extern rtx        gen_subv2hq3                          (rtx, rtx, rtx);
-extern rtx        gen_subv2ha3                          (rtx, rtx, rtx);
-extern rtx        gen_ussubv4uqq3                       (rtx, rtx, rtx);
-extern rtx        gen_ussubv2uhq3                       (rtx, rtx, rtx);
-extern rtx        gen_ussubuqq3                         (rtx, rtx, rtx);
-extern rtx        gen_ussubuhq3                         (rtx, rtx, rtx);
-extern rtx        gen_ussubv2uha3                       (rtx, rtx, rtx);
-extern rtx        gen_ussubuha3                         (rtx, rtx, rtx);
-extern rtx        gen_sssubv4qq3                        (rtx, rtx, rtx);
-extern rtx        gen_sssubv2hq3                        (rtx, rtx, rtx);
-extern rtx        gen_sssubqq3                          (rtx, rtx, rtx);
-extern rtx        gen_sssubhq3                          (rtx, rtx, rtx);
-extern rtx        gen_sssubv2ha3                        (rtx, rtx, rtx);
-extern rtx        gen_sssubha3                          (rtx, rtx, rtx);
-extern rtx        gen_sssubsq3                          (rtx, rtx, rtx);
-extern rtx        gen_sssubsa3                          (rtx, rtx, rtx);
-extern rtx        gen_ssmulsa3                          (rtx, rtx, rtx);
-extern rtx        gen_usmulusa3                         (rtx, rtx, rtx);
-extern rtx        gen_arm_ssatsihi_shift                (rtx, rtx, rtx, rtx);
-extern rtx        gen_arm_usatsihi                      (rtx, rtx);
-extern rtx        gen_adddi3                            (rtx, rtx, rtx);
-extern rtx        gen_addsi3                            (rtx, rtx, rtx);
-extern rtx        gen_addsf3                            (rtx, rtx, rtx);
-extern rtx        gen_adddf3                            (rtx, rtx, rtx);
-extern rtx        gen_subdi3                            (rtx, rtx, rtx);
-extern rtx        gen_subsi3                            (rtx, rtx, rtx);
-extern rtx        gen_subsf3                            (rtx, rtx, rtx);
-extern rtx        gen_subdf3                            (rtx, rtx, rtx);
-extern rtx        gen_mulhi3                            (rtx, rtx, rtx);
-extern rtx        gen_mulsi3                            (rtx, rtx, rtx);
-extern rtx        gen_maddsidi4                         (rtx, rtx, rtx, rtx);
-extern rtx        gen_mulsidi3                          (rtx, rtx, rtx);
-extern rtx        gen_umulsidi3                         (rtx, rtx, rtx);
-extern rtx        gen_umaddsidi4                        (rtx, rtx, rtx, rtx);
-extern rtx        gen_smulsi3_highpart                  (rtx, rtx, rtx);
-extern rtx        gen_umulsi3_highpart                  (rtx, rtx, rtx);
-extern rtx        gen_mulsf3                            (rtx, rtx, rtx);
-extern rtx        gen_muldf3                            (rtx, rtx, rtx);
-extern rtx        gen_divsf3                            (rtx, rtx, rtx);
-extern rtx        gen_divdf3                            (rtx, rtx, rtx);
-extern rtx        gen_anddi3                            (rtx, rtx, rtx);
-extern rtx        gen_andsi3                            (rtx, rtx, rtx);
-extern rtx        gen_insv                              (rtx, rtx, rtx, rtx);
-extern rtx        gen_iordi3                            (rtx, rtx, rtx);
-extern rtx        gen_iorsi3                            (rtx, rtx, rtx);
-extern rtx        gen_xordi3                            (rtx, rtx, rtx);
-extern rtx        gen_xorsi3                            (rtx, rtx, rtx);
-extern rtx        gen_smaxsi3                           (rtx, rtx, rtx);
-extern rtx        gen_sminsi3                           (rtx, rtx, rtx);
-extern rtx        gen_umaxsi3                           (rtx, rtx, rtx);
-extern rtx        gen_uminsi3                           (rtx, rtx, rtx);
-extern rtx        gen_ashldi3                           (rtx, rtx, rtx);
-extern rtx        gen_ashlsi3                           (rtx, rtx, rtx);
-extern rtx        gen_ashrdi3                           (rtx, rtx, rtx);
-extern rtx        gen_ashrsi3                           (rtx, rtx, rtx);
-extern rtx        gen_lshrdi3                           (rtx, rtx, rtx);
-extern rtx        gen_lshrsi3                           (rtx, rtx, rtx);
-extern rtx        gen_rotlsi3                           (rtx, rtx, rtx);
-extern rtx        gen_rotrsi3                           (rtx, rtx, rtx);
-extern rtx        gen_extzv                             (rtx, rtx, rtx, rtx);
-extern rtx        gen_extzv_t1                          (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_extv                              (rtx, rtx, rtx, rtx);
-extern rtx        gen_extv_regsi                        (rtx, rtx, rtx, rtx);
-extern rtx        gen_negdi2                            (rtx, rtx);
-extern rtx        gen_negsi2                            (rtx, rtx);
-extern rtx        gen_negsf2                            (rtx, rtx);
-extern rtx        gen_negdf2                            (rtx, rtx);
-extern rtx        gen_abssi2                            (rtx, rtx);
-extern rtx        gen_abssf2                            (rtx, rtx);
-extern rtx        gen_absdf2                            (rtx, rtx);
-extern rtx        gen_sqrtsf2                           (rtx, rtx);
-extern rtx        gen_sqrtdf2                           (rtx, rtx);
-extern rtx        gen_one_cmplsi2                       (rtx, rtx);
-extern rtx        gen_floatsihf2                        (rtx, rtx);
-extern rtx        gen_floatdihf2                        (rtx, rtx);
-extern rtx        gen_floatsisf2                        (rtx, rtx);
-extern rtx        gen_floatsidf2                        (rtx, rtx);
-extern rtx        gen_fix_trunchfsi2                    (rtx, rtx);
-extern rtx        gen_fix_trunchfdi2                    (rtx, rtx);
-extern rtx        gen_fix_truncsfsi2                    (rtx, rtx);
-extern rtx        gen_fix_truncdfsi2                    (rtx, rtx);
-extern rtx        gen_truncdfsf2                        (rtx, rtx);
-extern rtx        gen_truncdfhf2                        (rtx, rtx);
-extern rtx        gen_zero_extendhisi2                  (rtx, rtx);
-extern rtx        gen_zero_extendqisi2                  (rtx, rtx);
-extern rtx        gen_extendhisi2                       (rtx, rtx);
-extern rtx        gen_extendhisi2_mem                   (rtx, rtx);
-extern rtx        gen_extendqihi2                       (rtx, rtx);
-extern rtx        gen_extendqisi2                       (rtx, rtx);
-extern rtx        gen_extendsfdf2                       (rtx, rtx);
-extern rtx        gen_extendhfdf2                       (rtx, rtx);
-extern rtx        gen_movdi                             (rtx, rtx);
-extern rtx        gen_movsi                             (rtx, rtx);
-extern rtx        gen_calculate_pic_address             (rtx, rtx, rtx);
-extern rtx        gen_builtin_setjmp_receiver           (rtx);
-extern rtx        gen_storehi                           (rtx, rtx);
-extern rtx        gen_storehi_bigend                    (rtx, rtx);
-extern rtx        gen_storeinthi                        (rtx, rtx);
-extern rtx        gen_storehi_single_op                 (rtx, rtx);
-extern rtx        gen_movhi                             (rtx, rtx);
-extern rtx        gen_movhi_bytes                       (rtx, rtx);
-extern rtx        gen_movhi_bigend                      (rtx, rtx);
-extern rtx        gen_thumb_movhi_clobber               (rtx, rtx, rtx);
-extern rtx        gen_reload_outhi                      (rtx, rtx, rtx);
-extern rtx        gen_reload_inhi                       (rtx, rtx, rtx);
-extern rtx        gen_movqi                             (rtx, rtx);
-extern rtx        gen_movhf                             (rtx, rtx);
-extern rtx        gen_movsf                             (rtx, rtx);
-extern rtx        gen_movdf                             (rtx, rtx);
-extern rtx        gen_reload_outdf                      (rtx, rtx, rtx);
-extern rtx        gen_load_multiple                     (rtx, rtx, rtx);
-extern rtx        gen_store_multiple                    (rtx, rtx, rtx);
-extern rtx        gen_movmemqi                          (rtx, rtx, rtx, rtx);
-extern rtx        gen_cbranchsi4                        (rtx, rtx, rtx, rtx);
-extern rtx        gen_cbranchqi4                        (rtx, rtx, rtx, rtx);
-extern rtx        gen_cbranchsf4                        (rtx, rtx, rtx, rtx);
-extern rtx        gen_cbranchdf4                        (rtx, rtx, rtx, rtx);
-extern rtx        gen_cbranchdi4                        (rtx, rtx, rtx, rtx);
-extern rtx        gen_cbranch_cc                        (rtx, rtx, rtx, rtx);
-extern rtx        gen_cstore_cc                         (rtx, rtx, rtx, rtx);
-extern rtx        gen_cstoresi4                         (rtx, rtx, rtx, rtx);
-extern rtx        gen_cstoresf4                         (rtx, rtx, rtx, rtx);
-extern rtx        gen_cstoredf4                         (rtx, rtx, rtx, rtx);
-extern rtx        gen_cstoredi4                         (rtx, rtx, rtx, rtx);
-extern rtx        gen_cstoresi_eq0_thumb1               (rtx, rtx);
-extern rtx        gen_cstoresi_ne0_thumb1               (rtx, rtx);
-extern rtx        gen_movsicc                           (rtx, rtx, rtx, rtx);
-extern rtx        gen_movsfcc                           (rtx, rtx, rtx, rtx);
-extern rtx        gen_movdfcc                           (rtx, rtx, rtx, rtx);
-extern rtx        gen_jump                              (rtx);
-#define GEN_CALL(A, B, C, D) gen_call ((A), (B), (C))
-extern rtx        gen_call                              (rtx, rtx, rtx);
-extern rtx        gen_call_internal                     (rtx, rtx, rtx);
-#define GEN_CALL_VALUE(A, B, C, D, E) gen_call_value ((A), (B), (C), (D))
-extern rtx        gen_call_value                        (rtx, rtx, rtx, rtx);
-extern rtx        gen_call_value_internal               (rtx, rtx, rtx, rtx);
-#define GEN_SIBCALL(A, B, C, D) gen_sibcall ((A), (B), (C))
-extern rtx        gen_sibcall                           (rtx, rtx, rtx);
-#define GEN_SIBCALL_VALUE(A, B, C, D, E) gen_sibcall_value ((A), (B), (C), (D))
-extern rtx        gen_sibcall_value                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_return                            (void);
-extern rtx        gen_simple_return                     (void);
-extern rtx        gen_return_addr_mask                  (rtx);
-extern rtx        gen_untyped_call                      (rtx, rtx, rtx);
-extern rtx        gen_untyped_return                    (rtx, rtx);
-extern rtx        gen_casesi                            (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_thumb1_casesi_internal_pic        (rtx, rtx, rtx, rtx);
-extern rtx        gen_indirect_jump                     (rtx);
-extern rtx        gen_prologue                          (void);
-extern rtx        gen_epilogue                          (void);
-extern rtx        gen_sibcall_epilogue                  (void);
-extern rtx        gen_eh_epilogue                       (rtx, rtx, rtx);
-extern rtx        gen_tablejump                         (rtx, rtx);
-extern rtx        gen_ctzsi2                            (rtx, rtx);
-extern rtx        gen_eh_return                         (rtx);
-extern rtx        gen_get_thread_pointersi              (rtx);
-extern rtx        gen_arm_legacy_rev                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_thumb_legacy_rev                  (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_bswapsi2                          (rtx, rtx);
-extern rtx        gen_bswaphi2                          (rtx, rtx);
-extern rtx        gen_movv2di                           (rtx, rtx);
-extern rtx        gen_movv2si                           (rtx, rtx);
-extern rtx        gen_movv4hi                           (rtx, rtx);
-extern rtx        gen_movv8qi                           (rtx, rtx);
-extern rtx        gen_movv2sf                           (rtx, rtx);
-extern rtx        gen_movv4si                           (rtx, rtx);
-extern rtx        gen_movv8hi                           (rtx, rtx);
-extern rtx        gen_movv16qi                          (rtx, rtx);
-extern rtx        gen_movv4sf                           (rtx, rtx);
-extern rtx        gen_addv2di3                          (rtx, rtx, rtx);
-extern rtx        gen_addv2si3                          (rtx, rtx, rtx);
-extern rtx        gen_addv4hi3                          (rtx, rtx, rtx);
-extern rtx        gen_addv8qi3                          (rtx, rtx, rtx);
-extern rtx        gen_addv2sf3                          (rtx, rtx, rtx);
-extern rtx        gen_addv4si3                          (rtx, rtx, rtx);
-extern rtx        gen_addv8hi3                          (rtx, rtx, rtx);
-extern rtx        gen_addv16qi3                         (rtx, rtx, rtx);
-extern rtx        gen_addv4sf3                          (rtx, rtx, rtx);
-extern rtx        gen_subv2di3                          (rtx, rtx, rtx);
-extern rtx        gen_subv2si3                          (rtx, rtx, rtx);
-extern rtx        gen_subv4hi3                          (rtx, rtx, rtx);
-extern rtx        gen_subv8qi3                          (rtx, rtx, rtx);
-extern rtx        gen_subv2sf3                          (rtx, rtx, rtx);
-extern rtx        gen_subv4si3                          (rtx, rtx, rtx);
-extern rtx        gen_subv8hi3                          (rtx, rtx, rtx);
-extern rtx        gen_subv16qi3                         (rtx, rtx, rtx);
-extern rtx        gen_subv4sf3                          (rtx, rtx, rtx);
-extern rtx        gen_mulv2si3                          (rtx, rtx, rtx);
-extern rtx        gen_mulv4hi3                          (rtx, rtx, rtx);
-extern rtx        gen_mulv8qi3                          (rtx, rtx, rtx);
-extern rtx        gen_mulv2sf3                          (rtx, rtx, rtx);
-extern rtx        gen_mulv4si3                          (rtx, rtx, rtx);
-extern rtx        gen_mulv8hi3                          (rtx, rtx, rtx);
-extern rtx        gen_mulv16qi3                         (rtx, rtx, rtx);
-extern rtx        gen_mulv4sf3                          (rtx, rtx, rtx);
-extern rtx        gen_sminv2si3                         (rtx, rtx, rtx);
-extern rtx        gen_sminv4hi3                         (rtx, rtx, rtx);
-extern rtx        gen_sminv8qi3                         (rtx, rtx, rtx);
-extern rtx        gen_sminv2sf3                         (rtx, rtx, rtx);
-extern rtx        gen_sminv4si3                         (rtx, rtx, rtx);
-extern rtx        gen_sminv8hi3                         (rtx, rtx, rtx);
-extern rtx        gen_sminv16qi3                        (rtx, rtx, rtx);
-extern rtx        gen_sminv4sf3                         (rtx, rtx, rtx);
-extern rtx        gen_uminv2si3                         (rtx, rtx, rtx);
-extern rtx        gen_uminv4hi3                         (rtx, rtx, rtx);
-extern rtx        gen_uminv8qi3                         (rtx, rtx, rtx);
-extern rtx        gen_uminv4si3                         (rtx, rtx, rtx);
-extern rtx        gen_uminv8hi3                         (rtx, rtx, rtx);
-extern rtx        gen_uminv16qi3                        (rtx, rtx, rtx);
-extern rtx        gen_smaxv2si3                         (rtx, rtx, rtx);
-extern rtx        gen_smaxv4hi3                         (rtx, rtx, rtx);
-extern rtx        gen_smaxv8qi3                         (rtx, rtx, rtx);
-extern rtx        gen_smaxv2sf3                         (rtx, rtx, rtx);
-extern rtx        gen_smaxv4si3                         (rtx, rtx, rtx);
-extern rtx        gen_smaxv8hi3                         (rtx, rtx, rtx);
-extern rtx        gen_smaxv16qi3                        (rtx, rtx, rtx);
-extern rtx        gen_smaxv4sf3                         (rtx, rtx, rtx);
-extern rtx        gen_umaxv2si3                         (rtx, rtx, rtx);
-extern rtx        gen_umaxv4hi3                         (rtx, rtx, rtx);
-extern rtx        gen_umaxv8qi3                         (rtx, rtx, rtx);
-extern rtx        gen_umaxv4si3                         (rtx, rtx, rtx);
-extern rtx        gen_umaxv8hi3                         (rtx, rtx, rtx);
-extern rtx        gen_umaxv16qi3                        (rtx, rtx, rtx);
-extern rtx        gen_vec_perm_constv2di                (rtx, rtx, rtx, rtx);
-extern rtx        gen_vec_perm_constv2si                (rtx, rtx, rtx, rtx);
-extern rtx        gen_vec_perm_constv4hi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_vec_perm_constv8qi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_vec_perm_constv2sf                (rtx, rtx, rtx, rtx);
-extern rtx        gen_vec_perm_constv4si                (rtx, rtx, rtx, rtx);
-extern rtx        gen_vec_perm_constv8hi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_vec_perm_constv16qi               (rtx, rtx, rtx, rtx);
-extern rtx        gen_vec_perm_constv4sf                (rtx, rtx, rtx, rtx);
-extern rtx        gen_vec_permv8qi                      (rtx, rtx, rtx, rtx);
-extern rtx        gen_vec_permv16qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_iwmmxt_setwcgr0                   (rtx);
-extern rtx        gen_iwmmxt_setwcgr1                   (rtx);
-extern rtx        gen_iwmmxt_setwcgr2                   (rtx);
-extern rtx        gen_iwmmxt_setwcgr3                   (rtx);
-extern rtx        gen_iwmmxt_getwcgr0                   (rtx);
-extern rtx        gen_iwmmxt_getwcgr1                   (rtx);
-extern rtx        gen_iwmmxt_getwcgr2                   (rtx);
-extern rtx        gen_iwmmxt_getwcgr3                   (rtx);
-extern rtx        gen_doloop_end                        (rtx, rtx);
-extern rtx        gen_movti                             (rtx, rtx);
-extern rtx        gen_movei                             (rtx, rtx);
-extern rtx        gen_movoi                             (rtx, rtx);
-extern rtx        gen_movci                             (rtx, rtx);
-extern rtx        gen_movxi                             (rtx, rtx);
-extern rtx        gen_movmisalignv8qi                   (rtx, rtx);
-extern rtx        gen_movmisalignv16qi                  (rtx, rtx);
-extern rtx        gen_movmisalignv4hi                   (rtx, rtx);
-extern rtx        gen_movmisalignv8hi                   (rtx, rtx);
-extern rtx        gen_movmisalignv2si                   (rtx, rtx);
-extern rtx        gen_movmisalignv4si                   (rtx, rtx);
-extern rtx        gen_movmisalignv2sf                   (rtx, rtx);
-extern rtx        gen_movmisalignv4sf                   (rtx, rtx);
-extern rtx        gen_movmisaligndi                     (rtx, rtx);
-extern rtx        gen_movmisalignv2di                   (rtx, rtx);
-extern rtx        gen_vec_setv8qi                       (rtx, rtx, rtx);
-extern rtx        gen_vec_setv16qi                      (rtx, rtx, rtx);
-extern rtx        gen_vec_setv4hi                       (rtx, rtx, rtx);
-extern rtx        gen_vec_setv8hi                       (rtx, rtx, rtx);
-extern rtx        gen_vec_setv2si                       (rtx, rtx, rtx);
-extern rtx        gen_vec_setv4si                       (rtx, rtx, rtx);
-extern rtx        gen_vec_setv2sf                       (rtx, rtx, rtx);
-extern rtx        gen_vec_setv4sf                       (rtx, rtx, rtx);
-extern rtx        gen_vec_setv2di                       (rtx, rtx, rtx);
-extern rtx        gen_vec_initv8qi                      (rtx, rtx);
-extern rtx        gen_vec_initv16qi                     (rtx, rtx);
-extern rtx        gen_vec_initv4hi                      (rtx, rtx);
-extern rtx        gen_vec_initv8hi                      (rtx, rtx);
-extern rtx        gen_vec_initv2si                      (rtx, rtx);
-extern rtx        gen_vec_initv4si                      (rtx, rtx);
-extern rtx        gen_vec_initv2sf                      (rtx, rtx);
-extern rtx        gen_vec_initv4sf                      (rtx, rtx);
-extern rtx        gen_vec_initv2di                      (rtx, rtx);
-extern rtx        gen_vashrv8qi3                        (rtx, rtx, rtx);
-extern rtx        gen_vashrv16qi3                       (rtx, rtx, rtx);
-extern rtx        gen_vashrv4hi3                        (rtx, rtx, rtx);
-extern rtx        gen_vashrv8hi3                        (rtx, rtx, rtx);
-extern rtx        gen_vashrv2si3                        (rtx, rtx, rtx);
-extern rtx        gen_vashrv4si3                        (rtx, rtx, rtx);
-extern rtx        gen_vlshrv8qi3                        (rtx, rtx, rtx);
-extern rtx        gen_vlshrv16qi3                       (rtx, rtx, rtx);
-extern rtx        gen_vlshrv4hi3                        (rtx, rtx, rtx);
-extern rtx        gen_vlshrv8hi3                        (rtx, rtx, rtx);
-extern rtx        gen_vlshrv2si3                        (rtx, rtx, rtx);
-extern rtx        gen_vlshrv4si3                        (rtx, rtx, rtx);
-extern rtx        gen_vec_shr_v8qi                      (rtx, rtx, rtx);
-extern rtx        gen_vec_shr_v16qi                     (rtx, rtx, rtx);
-extern rtx        gen_vec_shr_v4hi                      (rtx, rtx, rtx);
-extern rtx        gen_vec_shr_v8hi                      (rtx, rtx, rtx);
-extern rtx        gen_vec_shr_v2si                      (rtx, rtx, rtx);
-extern rtx        gen_vec_shr_v4si                      (rtx, rtx, rtx);
-extern rtx        gen_vec_shr_v2sf                      (rtx, rtx, rtx);
-extern rtx        gen_vec_shr_v4sf                      (rtx, rtx, rtx);
-extern rtx        gen_vec_shr_v2di                      (rtx, rtx, rtx);
-extern rtx        gen_vec_shl_v8qi                      (rtx, rtx, rtx);
-extern rtx        gen_vec_shl_v16qi                     (rtx, rtx, rtx);
-extern rtx        gen_vec_shl_v4hi                      (rtx, rtx, rtx);
-extern rtx        gen_vec_shl_v8hi                      (rtx, rtx, rtx);
-extern rtx        gen_vec_shl_v2si                      (rtx, rtx, rtx);
-extern rtx        gen_vec_shl_v4si                      (rtx, rtx, rtx);
-extern rtx        gen_vec_shl_v2sf                      (rtx, rtx, rtx);
-extern rtx        gen_vec_shl_v4sf                      (rtx, rtx, rtx);
-extern rtx        gen_vec_shl_v2di                      (rtx, rtx, rtx);
-extern rtx        gen_move_hi_quad_v2di                 (rtx, rtx);
-extern rtx        gen_move_hi_quad_v2df                 (rtx, rtx);
-extern rtx        gen_move_hi_quad_v16qi                (rtx, rtx);
-extern rtx        gen_move_hi_quad_v8hi                 (rtx, rtx);
-extern rtx        gen_move_hi_quad_v4si                 (rtx, rtx);
-extern rtx        gen_move_hi_quad_v4sf                 (rtx, rtx);
-extern rtx        gen_move_lo_quad_v2di                 (rtx, rtx);
-extern rtx        gen_move_lo_quad_v2df                 (rtx, rtx);
-extern rtx        gen_move_lo_quad_v16qi                (rtx, rtx);
-extern rtx        gen_move_lo_quad_v8hi                 (rtx, rtx);
-extern rtx        gen_move_lo_quad_v4si                 (rtx, rtx);
-extern rtx        gen_move_lo_quad_v4sf                 (rtx, rtx);
-extern rtx        gen_reduc_splus_v8qi                  (rtx, rtx);
-extern rtx        gen_reduc_splus_v4hi                  (rtx, rtx);
-extern rtx        gen_reduc_splus_v2si                  (rtx, rtx);
-extern rtx        gen_reduc_splus_v2sf                  (rtx, rtx);
-extern rtx        gen_reduc_splus_v16qi                 (rtx, rtx);
-extern rtx        gen_reduc_splus_v8hi                  (rtx, rtx);
-extern rtx        gen_reduc_splus_v4si                  (rtx, rtx);
-extern rtx        gen_reduc_splus_v4sf                  (rtx, rtx);
-extern rtx        gen_reduc_uplus_v8qi                  (rtx, rtx);
-extern rtx        gen_reduc_uplus_v16qi                 (rtx, rtx);
-extern rtx        gen_reduc_uplus_v4hi                  (rtx, rtx);
-extern rtx        gen_reduc_uplus_v8hi                  (rtx, rtx);
-extern rtx        gen_reduc_uplus_v2si                  (rtx, rtx);
-extern rtx        gen_reduc_uplus_v4si                  (rtx, rtx);
-extern rtx        gen_reduc_uplus_v2di                  (rtx, rtx);
-extern rtx        gen_reduc_smin_v8qi                   (rtx, rtx);
-extern rtx        gen_reduc_smin_v4hi                   (rtx, rtx);
-extern rtx        gen_reduc_smin_v2si                   (rtx, rtx);
-extern rtx        gen_reduc_smin_v2sf                   (rtx, rtx);
-extern rtx        gen_reduc_smin_v16qi                  (rtx, rtx);
-extern rtx        gen_reduc_smin_v8hi                   (rtx, rtx);
-extern rtx        gen_reduc_smin_v4si                   (rtx, rtx);
-extern rtx        gen_reduc_smin_v4sf                   (rtx, rtx);
-extern rtx        gen_reduc_smax_v8qi                   (rtx, rtx);
-extern rtx        gen_reduc_smax_v4hi                   (rtx, rtx);
-extern rtx        gen_reduc_smax_v2si                   (rtx, rtx);
-extern rtx        gen_reduc_smax_v2sf                   (rtx, rtx);
-extern rtx        gen_reduc_smax_v16qi                  (rtx, rtx);
-extern rtx        gen_reduc_smax_v8hi                   (rtx, rtx);
-extern rtx        gen_reduc_smax_v4si                   (rtx, rtx);
-extern rtx        gen_reduc_smax_v4sf                   (rtx, rtx);
-extern rtx        gen_reduc_umin_v8qi                   (rtx, rtx);
-extern rtx        gen_reduc_umin_v4hi                   (rtx, rtx);
-extern rtx        gen_reduc_umin_v2si                   (rtx, rtx);
-extern rtx        gen_reduc_umin_v16qi                  (rtx, rtx);
-extern rtx        gen_reduc_umin_v8hi                   (rtx, rtx);
-extern rtx        gen_reduc_umin_v4si                   (rtx, rtx);
-extern rtx        gen_reduc_umax_v8qi                   (rtx, rtx);
-extern rtx        gen_reduc_umax_v4hi                   (rtx, rtx);
-extern rtx        gen_reduc_umax_v2si                   (rtx, rtx);
-extern rtx        gen_reduc_umax_v16qi                  (rtx, rtx);
-extern rtx        gen_reduc_umax_v8hi                   (rtx, rtx);
-extern rtx        gen_reduc_umax_v4si                   (rtx, rtx);
-extern rtx        gen_vcondv8qiv8qi                     (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_vcondv16qiv16qi                   (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_vcondv4hiv4hi                     (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_vcondv8hiv8hi                     (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_vcondv2siv2si                     (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_vcondv4siv4si                     (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_vcondv2sfv2sf                     (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_vcondv4sfv4sf                     (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_vconduv8qiv8qi                    (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_vconduv16qiv16qi                  (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_vconduv4hiv4hi                    (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_vconduv8hiv8hi                    (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_vconduv2siv2si                    (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_vconduv4siv4si                    (rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vaddv8qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vaddv16qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vaddv4hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vaddv8hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vaddv2si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vaddv4si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vaddv2sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vaddv4sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vadddi                       (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vaddv2di                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlav8qi                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlav16qi                    (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlav4hi                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlav8hi                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlav2si                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlav4si                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlav2sf                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlav4sf                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vfmav2sf                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vfmav4sf                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vfmsv2sf                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vfmsv4sf                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlsv8qi                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlsv16qi                    (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlsv4hi                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlsv8hi                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlsv2si                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlsv4si                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlsv2sf                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlsv4sf                     (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsubv8qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsubv16qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsubv4hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsubv8hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsubv2si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsubv4si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsubv2sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsubv4sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsubdi                       (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vsubv2di                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vpaddv8qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vpaddv4hi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vpaddv2si                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vpaddv2sf                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vabsv8qi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vabsv16qi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vabsv4hi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vabsv8hi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vabsv2si                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vabsv4si                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vabsv2sf                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vabsv4sf                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vnegv8qi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vnegv16qi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vnegv4hi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vnegv8hi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vnegv2si                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vnegv4si                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vnegv2sf                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vnegv4sf                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vclzv8qi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vclzv16qi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vclzv4hi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vclzv8hi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vclzv2si                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vclzv4si                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vcntv8qi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vcntv16qi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vmvnv8qi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vmvnv16qi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vmvnv4hi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vmvnv8hi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vmvnv2si                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vmvnv4si                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev8qi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev16qi               (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev4hi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev8hi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev2si                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev4si                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev2sf                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev4sf                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanedi                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vget_lanev2di                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vset_lanev8qi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vset_lanev16qi               (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vset_lanev4hi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vset_lanev8hi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vset_lanev2si                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vset_lanev4si                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vset_lanev2sf                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vset_lanev4sf                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vset_lanev2di                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vset_lanedi                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vcreatev8qi                  (rtx, rtx);
-extern rtx        gen_neon_vcreatev4hi                  (rtx, rtx);
-extern rtx        gen_neon_vcreatev2si                  (rtx, rtx);
-extern rtx        gen_neon_vcreatev2sf                  (rtx, rtx);
-extern rtx        gen_neon_vcreatedi                    (rtx, rtx);
-extern rtx        gen_neon_vdup_ndi                     (rtx, rtx);
-extern rtx        gen_neon_vdup_lanev8qi                (rtx, rtx, rtx);
-extern rtx        gen_neon_vdup_lanev16qi               (rtx, rtx, rtx);
-extern rtx        gen_neon_vdup_lanev4hi                (rtx, rtx, rtx);
-extern rtx        gen_neon_vdup_lanev8hi                (rtx, rtx, rtx);
-extern rtx        gen_neon_vdup_lanev2si                (rtx, rtx, rtx);
-extern rtx        gen_neon_vdup_lanev4si                (rtx, rtx, rtx);
-extern rtx        gen_neon_vdup_lanev2sf                (rtx, rtx, rtx);
-extern rtx        gen_neon_vdup_lanev4sf                (rtx, rtx, rtx);
-extern rtx        gen_neon_vdup_lanedi                  (rtx, rtx, rtx);
-extern rtx        gen_neon_vdup_lanev2di                (rtx, rtx, rtx);
-extern rtx        gen_neon_vget_highv16qi               (rtx, rtx);
-extern rtx        gen_neon_vget_highv8hi                (rtx, rtx);
-extern rtx        gen_neon_vget_highv4si                (rtx, rtx);
-extern rtx        gen_neon_vget_highv4sf                (rtx, rtx);
-extern rtx        gen_neon_vget_highv2di                (rtx, rtx);
-extern rtx        gen_neon_vget_lowv16qi                (rtx, rtx);
-extern rtx        gen_neon_vget_lowv8hi                 (rtx, rtx);
-extern rtx        gen_neon_vget_lowv4si                 (rtx, rtx);
-extern rtx        gen_neon_vget_lowv4sf                 (rtx, rtx);
-extern rtx        gen_neon_vget_lowv2di                 (rtx, rtx);
-extern rtx        gen_neon_vmul_nv4hi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmul_nv2si                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmul_nv2sf                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmul_nv8hi                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmul_nv4si                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmul_nv4sf                   (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmull_nv4hi                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmull_nv2si                  (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmull_nv4hi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmull_nv2si                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmulh_nv4hi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmulh_nv2si                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmulh_nv8hi                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmulh_nv4si                (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmla_nv4hi                   (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmla_nv2si                   (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmla_nv2sf                   (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmla_nv8hi                   (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmla_nv4si                   (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmla_nv4sf                   (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlal_nv4hi                  (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlal_nv2si                  (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmlal_nv4hi                (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmlal_nv2si                (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmls_nv4hi                   (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmls_nv2si                   (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmls_nv2sf                   (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmls_nv8hi                   (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmls_nv4si                   (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmls_nv4sf                   (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlsl_nv4hi                  (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vmlsl_nv2si                  (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmlsl_nv4hi                (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vqdmlsl_nv2si                (rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbslv8qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbslv16qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbslv4hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbslv8hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbslv2si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbslv4si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbslv2sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbslv4sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbsldi                       (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbslv2di                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vtrnv8qi_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vtrnv16qi_internal           (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vtrnv4hi_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vtrnv8hi_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vtrnv2si_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vtrnv4si_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vtrnv2sf_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vtrnv4sf_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vtrnv8qi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vtrnv16qi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vtrnv4hi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vtrnv8hi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vtrnv2si                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vtrnv4si                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vtrnv2sf                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vtrnv4sf                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vzipv8qi_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vzipv16qi_internal           (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vzipv4hi_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vzipv8hi_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vzipv2si_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vzipv4si_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vzipv2sf_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vzipv4sf_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vzipv8qi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vzipv16qi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vzipv4hi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vzipv8hi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vzipv2si                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vzipv4si                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vzipv2sf                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vzipv4sf                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vuzpv8qi_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vuzpv16qi_internal           (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vuzpv4hi_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vuzpv8hi_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vuzpv2si_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vuzpv4si_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vuzpv2sf_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vuzpv4sf_internal            (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vuzpv8qi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vuzpv16qi                    (rtx, rtx, rtx);
-extern rtx        gen_neon_vuzpv4hi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vuzpv8hi                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vuzpv2si                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vuzpv4si                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vuzpv2sf                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vuzpv4sf                     (rtx, rtx, rtx);
-extern rtx        gen_neon_vreinterpretv8qiv8qi         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv8qiv4hi         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv8qiv2si         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv8qiv2sf         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv8qidi           (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv4hiv8qi         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv4hiv4hi         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv4hiv2si         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv4hiv2sf         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv4hidi           (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv2siv8qi         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv2siv4hi         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv2siv2si         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv2siv2sf         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv2sidi           (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv2sfv8qi         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv2sfv4hi         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv2sfv2si         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv2sfv2sf         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv2sfdi           (rtx, rtx);
-extern rtx        gen_neon_vreinterpretdiv8qi           (rtx, rtx);
-extern rtx        gen_neon_vreinterpretdiv4hi           (rtx, rtx);
-extern rtx        gen_neon_vreinterpretdiv2si           (rtx, rtx);
-extern rtx        gen_neon_vreinterpretdiv2sf           (rtx, rtx);
-extern rtx        gen_neon_vreinterpretdidi             (rtx, rtx);
-extern rtx        gen_neon_vreinterprettiv16qi          (rtx, rtx);
-extern rtx        gen_neon_vreinterprettiv8hi           (rtx, rtx);
-extern rtx        gen_neon_vreinterprettiv4si           (rtx, rtx);
-extern rtx        gen_neon_vreinterprettiv4sf           (rtx, rtx);
-extern rtx        gen_neon_vreinterprettiv2di           (rtx, rtx);
-extern rtx        gen_neon_vreinterprettiti             (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv16qiv16qi       (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv16qiv8hi        (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv16qiv4si        (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv16qiv4sf        (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv16qiv2di        (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv16qiti          (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv8hiv16qi        (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv8hiv8hi         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv8hiv4si         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv8hiv4sf         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv8hiv2di         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv8hiti           (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv4siv16qi        (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv4siv8hi         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv4siv4si         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv4siv4sf         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv4siv2di         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv4siti           (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv4sfv16qi        (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv4sfv8hi         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv4sfv4si         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv4sfv4sf         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv4sfv2di         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv4sfti           (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv2div16qi        (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv2div8hi         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv2div4si         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv2div4sf         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv2div2di         (rtx, rtx);
-extern rtx        gen_neon_vreinterpretv2diti           (rtx, rtx);
-extern rtx        gen_vec_load_lanesv8qiv8qi            (rtx, rtx);
-extern rtx        gen_vec_load_lanesv16qiv16qi          (rtx, rtx);
-extern rtx        gen_vec_load_lanesv4hiv4hi            (rtx, rtx);
-extern rtx        gen_vec_load_lanesv8hiv8hi            (rtx, rtx);
-extern rtx        gen_vec_load_lanesv2siv2si            (rtx, rtx);
-extern rtx        gen_vec_load_lanesv4siv4si            (rtx, rtx);
-extern rtx        gen_vec_load_lanesv2sfv2sf            (rtx, rtx);
-extern rtx        gen_vec_load_lanesv4sfv4sf            (rtx, rtx);
-extern rtx        gen_vec_load_lanesdidi                (rtx, rtx);
-extern rtx        gen_vec_load_lanesv2div2di            (rtx, rtx);
-extern rtx        gen_neon_vld1_dupdi                   (rtx, rtx);
-extern rtx        gen_vec_store_lanesv8qiv8qi           (rtx, rtx);
-extern rtx        gen_vec_store_lanesv16qiv16qi         (rtx, rtx);
-extern rtx        gen_vec_store_lanesv4hiv4hi           (rtx, rtx);
-extern rtx        gen_vec_store_lanesv8hiv8hi           (rtx, rtx);
-extern rtx        gen_vec_store_lanesv2siv2si           (rtx, rtx);
-extern rtx        gen_vec_store_lanesv4siv4si           (rtx, rtx);
-extern rtx        gen_vec_store_lanesv2sfv2sf           (rtx, rtx);
-extern rtx        gen_vec_store_lanesv4sfv4sf           (rtx, rtx);
-extern rtx        gen_vec_store_lanesdidi               (rtx, rtx);
-extern rtx        gen_vec_store_lanesv2div2di           (rtx, rtx);
-extern rtx        gen_vec_load_lanestiv8qi              (rtx, rtx);
-extern rtx        gen_vec_load_lanestiv4hi              (rtx, rtx);
-extern rtx        gen_vec_load_lanestiv2si              (rtx, rtx);
-extern rtx        gen_vec_load_lanestiv2sf              (rtx, rtx);
-extern rtx        gen_vec_load_lanestidi                (rtx, rtx);
-extern rtx        gen_vec_load_lanesoiv16qi             (rtx, rtx);
-extern rtx        gen_vec_load_lanesoiv8hi              (rtx, rtx);
-extern rtx        gen_vec_load_lanesoiv4si              (rtx, rtx);
-extern rtx        gen_vec_load_lanesoiv4sf              (rtx, rtx);
-extern rtx        gen_vec_store_lanestiv8qi             (rtx, rtx);
-extern rtx        gen_vec_store_lanestiv4hi             (rtx, rtx);
-extern rtx        gen_vec_store_lanestiv2si             (rtx, rtx);
-extern rtx        gen_vec_store_lanestiv2sf             (rtx, rtx);
-extern rtx        gen_vec_store_lanestidi               (rtx, rtx);
-extern rtx        gen_vec_store_lanesoiv16qi            (rtx, rtx);
-extern rtx        gen_vec_store_lanesoiv8hi             (rtx, rtx);
-extern rtx        gen_vec_store_lanesoiv4si             (rtx, rtx);
-extern rtx        gen_vec_store_lanesoiv4sf             (rtx, rtx);
-extern rtx        gen_vec_load_laneseiv8qi              (rtx, rtx);
-extern rtx        gen_vec_load_laneseiv4hi              (rtx, rtx);
-extern rtx        gen_vec_load_laneseiv2si              (rtx, rtx);
-extern rtx        gen_vec_load_laneseiv2sf              (rtx, rtx);
-extern rtx        gen_vec_load_laneseidi                (rtx, rtx);
-extern rtx        gen_vec_load_lanesciv16qi             (rtx, rtx);
-extern rtx        gen_vec_load_lanesciv8hi              (rtx, rtx);
-extern rtx        gen_vec_load_lanesciv4si              (rtx, rtx);
-extern rtx        gen_vec_load_lanesciv4sf              (rtx, rtx);
-extern rtx        gen_neon_vld3v16qi                    (rtx, rtx);
-extern rtx        gen_neon_vld3v8hi                     (rtx, rtx);
-extern rtx        gen_neon_vld3v4si                     (rtx, rtx);
-extern rtx        gen_neon_vld3v4sf                     (rtx, rtx);
-extern rtx        gen_vec_store_laneseiv8qi             (rtx, rtx);
-extern rtx        gen_vec_store_laneseiv4hi             (rtx, rtx);
-extern rtx        gen_vec_store_laneseiv2si             (rtx, rtx);
-extern rtx        gen_vec_store_laneseiv2sf             (rtx, rtx);
-extern rtx        gen_vec_store_laneseidi               (rtx, rtx);
-extern rtx        gen_vec_store_lanesciv16qi            (rtx, rtx);
-extern rtx        gen_vec_store_lanesciv8hi             (rtx, rtx);
-extern rtx        gen_vec_store_lanesciv4si             (rtx, rtx);
-extern rtx        gen_vec_store_lanesciv4sf             (rtx, rtx);
-extern rtx        gen_neon_vst3v16qi                    (rtx, rtx);
-extern rtx        gen_neon_vst3v8hi                     (rtx, rtx);
-extern rtx        gen_neon_vst3v4si                     (rtx, rtx);
-extern rtx        gen_neon_vst3v4sf                     (rtx, rtx);
-extern rtx        gen_vec_load_lanesoiv8qi              (rtx, rtx);
-extern rtx        gen_vec_load_lanesoiv4hi              (rtx, rtx);
-extern rtx        gen_vec_load_lanesoiv2si              (rtx, rtx);
-extern rtx        gen_vec_load_lanesoiv2sf              (rtx, rtx);
-extern rtx        gen_vec_load_lanesoidi                (rtx, rtx);
-extern rtx        gen_vec_load_lanesxiv16qi             (rtx, rtx);
-extern rtx        gen_vec_load_lanesxiv8hi              (rtx, rtx);
-extern rtx        gen_vec_load_lanesxiv4si              (rtx, rtx);
-extern rtx        gen_vec_load_lanesxiv4sf              (rtx, rtx);
-extern rtx        gen_neon_vld4v16qi                    (rtx, rtx);
-extern rtx        gen_neon_vld4v8hi                     (rtx, rtx);
-extern rtx        gen_neon_vld4v4si                     (rtx, rtx);
-extern rtx        gen_neon_vld4v4sf                     (rtx, rtx);
-extern rtx        gen_vec_store_lanesoiv8qi             (rtx, rtx);
-extern rtx        gen_vec_store_lanesoiv4hi             (rtx, rtx);
-extern rtx        gen_vec_store_lanesoiv2si             (rtx, rtx);
-extern rtx        gen_vec_store_lanesoiv2sf             (rtx, rtx);
-extern rtx        gen_vec_store_lanesoidi               (rtx, rtx);
-extern rtx        gen_vec_store_lanesxiv16qi            (rtx, rtx);
-extern rtx        gen_vec_store_lanesxiv8hi             (rtx, rtx);
-extern rtx        gen_vec_store_lanesxiv4si             (rtx, rtx);
-extern rtx        gen_vec_store_lanesxiv4sf             (rtx, rtx);
-extern rtx        gen_neon_vst4v16qi                    (rtx, rtx);
-extern rtx        gen_neon_vst4v8hi                     (rtx, rtx);
-extern rtx        gen_neon_vst4v4si                     (rtx, rtx);
-extern rtx        gen_neon_vst4v4sf                     (rtx, rtx);
-extern rtx        gen_neon_vandv8qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vandv16qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vandv4hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vandv8hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vandv2si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vandv4si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vandv2sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vandv4sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vanddi                       (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vandv2di                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vorrv8qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vorrv16qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vorrv4hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vorrv8hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vorrv2si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vorrv4si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vorrv2sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vorrv4sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vorrdi                       (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vorrv2di                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_veorv8qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_veorv16qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_veorv4hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_veorv8hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_veorv2si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_veorv4si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_veorv2sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_veorv4sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_veordi                       (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_veorv2di                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbicv8qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbicv16qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbicv4hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbicv8hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbicv2si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbicv4si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbicv2sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbicv4sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbicdi                       (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vbicv2di                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vornv8qi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vornv16qi                    (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vornv4hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vornv8hi                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vornv2si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vornv4si                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vornv2sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vornv4sf                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vorndi                       (rtx, rtx, rtx, rtx);
-extern rtx        gen_neon_vornv2di                     (rtx, rtx, rtx, rtx);
-extern rtx        gen_vec_unpacks_hi_v16qi              (rtx, rtx);
-extern rtx        gen_vec_unpacku_hi_v16qi              (rtx, rtx);
-extern rtx        gen_vec_unpacks_hi_v8hi               (rtx, rtx);
-extern rtx        gen_vec_unpacku_hi_v8hi               (rtx, rtx);
-extern rtx        gen_vec_unpacks_hi_v4si               (rtx, rtx);
-extern rtx        gen_vec_unpacku_hi_v4si               (rtx, rtx);
-extern rtx        gen_vec_unpacks_lo_v16qi              (rtx, rtx);
-extern rtx        gen_vec_unpacku_lo_v16qi              (rtx, rtx);
-extern rtx        gen_vec_unpacks_lo_v8hi               (rtx, rtx);
-extern rtx        gen_vec_unpacku_lo_v8hi               (rtx, rtx);
-extern rtx        gen_vec_unpacks_lo_v4si               (rtx, rtx);
-extern rtx        gen_vec_unpacku_lo_v4si               (rtx, rtx);
-extern rtx        gen_vec_widen_smult_lo_v16qi          (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_umult_lo_v16qi          (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_smult_lo_v8hi           (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_umult_lo_v8hi           (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_smult_lo_v4si           (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_umult_lo_v4si           (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_smult_hi_v16qi          (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_umult_hi_v16qi          (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_smult_hi_v8hi           (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_umult_hi_v8hi           (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_smult_hi_v4si           (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_umult_hi_v4si           (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_sshiftl_lo_v16qi        (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_ushiftl_lo_v16qi        (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_sshiftl_lo_v8hi         (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_ushiftl_lo_v8hi         (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_sshiftl_lo_v4si         (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_ushiftl_lo_v4si         (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_sshiftl_hi_v16qi        (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_ushiftl_hi_v16qi        (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_sshiftl_hi_v8hi         (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_ushiftl_hi_v8hi         (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_sshiftl_hi_v4si         (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_ushiftl_hi_v4si         (rtx, rtx, rtx);
-extern rtx        gen_vec_unpacks_lo_v8qi               (rtx, rtx);
-extern rtx        gen_vec_unpacku_lo_v8qi               (rtx, rtx);
-extern rtx        gen_vec_unpacks_lo_v4hi               (rtx, rtx);
-extern rtx        gen_vec_unpacku_lo_v4hi               (rtx, rtx);
-extern rtx        gen_vec_unpacks_lo_v2si               (rtx, rtx);
-extern rtx        gen_vec_unpacku_lo_v2si               (rtx, rtx);
-extern rtx        gen_vec_unpacks_hi_v8qi               (rtx, rtx);
-extern rtx        gen_vec_unpacku_hi_v8qi               (rtx, rtx);
-extern rtx        gen_vec_unpacks_hi_v4hi               (rtx, rtx);
-extern rtx        gen_vec_unpacku_hi_v4hi               (rtx, rtx);
-extern rtx        gen_vec_unpacks_hi_v2si               (rtx, rtx);
-extern rtx        gen_vec_unpacku_hi_v2si               (rtx, rtx);
-extern rtx        gen_vec_widen_smult_hi_v8qi           (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_umult_hi_v8qi           (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_smult_hi_v4hi           (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_umult_hi_v4hi           (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_smult_hi_v2si           (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_umult_hi_v2si           (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_smult_lo_v8qi           (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_umult_lo_v8qi           (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_smult_lo_v4hi           (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_umult_lo_v4hi           (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_smult_lo_v2si           (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_umult_lo_v2si           (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_sshiftl_hi_v8qi         (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_ushiftl_hi_v8qi         (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_sshiftl_hi_v4hi         (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_ushiftl_hi_v4hi         (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_sshiftl_hi_v2si         (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_ushiftl_hi_v2si         (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_sshiftl_lo_v8qi         (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_ushiftl_lo_v8qi         (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_sshiftl_lo_v4hi         (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_ushiftl_lo_v4hi         (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_sshiftl_lo_v2si         (rtx, rtx, rtx);
-extern rtx        gen_vec_widen_ushiftl_lo_v2si         (rtx, rtx, rtx);
-extern rtx        gen_vec_pack_trunc_v4hi               (rtx, rtx, rtx);
-extern rtx        gen_vec_pack_trunc_v2si               (rtx, rtx, rtx);
-extern rtx        gen_vec_pack_trunc_di                 (rtx, rtx, rtx);
-extern rtx        gen_memory_barrier                    (void);
-extern rtx        gen_atomic_loaddi                     (rtx, rtx, rtx);
-extern rtx        gen_atomic_compare_and_swapqi         (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_compare_and_swaphi         (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_compare_and_swapsi         (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_atomic_compare_and_swapdi         (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
-extern rtx        gen_mulqq3                            (rtx, rtx, rtx);
-extern rtx        gen_mulhq3                            (rtx, rtx, rtx);
-extern rtx        gen_mulsq3                            (rtx, rtx, rtx);
-extern rtx        gen_mulsa3                            (rtx, rtx, rtx);
-extern rtx        gen_mulusa3                           (rtx, rtx, rtx);
-extern rtx        gen_mulha3                            (rtx, rtx, rtx);
-extern rtx        gen_muluha3                           (rtx, rtx, rtx);
-extern rtx        gen_ssmulha3                          (rtx, rtx, rtx);
-extern rtx        gen_usmuluha3                         (rtx, rtx, rtx);
-
-#endif /* GCC_INSN_FLAGS_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/insn-modes.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/insn-modes.h
deleted file mode 100644
index 30ffa17..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/insn-modes.h
+++ /dev/null
@@ -1,167 +0,0 @@
-/* Generated automatically from machmode.def and config/arm/arm-modes.def
-   by genmodes.  */
-
-#ifndef GCC_INSN_MODES_H
-#define GCC_INSN_MODES_H
-
-enum machine_mode
-{
-  VOIDmode,                /* machmode.def:172 */
-  BLKmode,                 /* machmode.def:176 */
-  CCmode,                  /* machmode.def:207 */
-  CC_NOOVmode,             /* config/arm/arm-modes.def:46 */
-  CC_Zmode,                /* config/arm/arm-modes.def:47 */
-  CC_CZmode,               /* config/arm/arm-modes.def:48 */
-  CC_NCVmode,              /* config/arm/arm-modes.def:49 */
-  CC_SWPmode,              /* config/arm/arm-modes.def:50 */
-  CCFPmode,                /* config/arm/arm-modes.def:51 */
-  CCFPEmode,               /* config/arm/arm-modes.def:52 */
-  CC_DNEmode,              /* config/arm/arm-modes.def:53 */
-  CC_DEQmode,              /* config/arm/arm-modes.def:54 */
-  CC_DLEmode,              /* config/arm/arm-modes.def:55 */
-  CC_DLTmode,              /* config/arm/arm-modes.def:56 */
-  CC_DGEmode,              /* config/arm/arm-modes.def:57 */
-  CC_DGTmode,              /* config/arm/arm-modes.def:58 */
-  CC_DLEUmode,             /* config/arm/arm-modes.def:59 */
-  CC_DLTUmode,             /* config/arm/arm-modes.def:60 */
-  CC_DGEUmode,             /* config/arm/arm-modes.def:61 */
-  CC_DGTUmode,             /* config/arm/arm-modes.def:62 */
-  CC_Cmode,                /* config/arm/arm-modes.def:63 */
-  CC_Nmode,                /* config/arm/arm-modes.def:64 */
-  BImode,                  /* machmode.def:179 */
-  QImode,                  /* machmode.def:187 */
-  HImode,                  /* machmode.def:188 */
-  SImode,                  /* machmode.def:189 */
-  DImode,                  /* machmode.def:190 */
-  TImode,                  /* machmode.def:191 */
-  EImode,                  /* config/arm/arm-modes.def:81 */
-  OImode,                  /* config/arm/arm-modes.def:82 */
-  CImode,                  /* config/arm/arm-modes.def:83 */
-  XImode,                  /* config/arm/arm-modes.def:84 */
-  QQmode,                  /* machmode.def:210 */
-  HQmode,                  /* machmode.def:211 */
-  SQmode,                  /* machmode.def:212 */
-  DQmode,                  /* machmode.def:213 */
-  TQmode,                  /* machmode.def:214 */
-  UQQmode,                 /* machmode.def:216 */
-  UHQmode,                 /* machmode.def:217 */
-  USQmode,                 /* machmode.def:218 */
-  UDQmode,                 /* machmode.def:219 */
-  UTQmode,                 /* machmode.def:220 */
-  HAmode,                  /* machmode.def:222 */
-  SAmode,                  /* machmode.def:223 */
-  DAmode,                  /* machmode.def:224 */
-  TAmode,                  /* machmode.def:225 */
-  UHAmode,                 /* machmode.def:227 */
-  USAmode,                 /* machmode.def:228 */
-  UDAmode,                 /* machmode.def:229 */
-  UTAmode,                 /* machmode.def:230 */
-  HFmode,                  /* config/arm/arm-modes.def:29 */
-  SFmode,                  /* machmode.def:202 */
-  DFmode,                  /* machmode.def:203 */
-  XFmode,                  /* config/arm/arm-modes.def:26 */
-  SDmode,                  /* machmode.def:242 */
-  DDmode,                  /* machmode.def:243 */
-  TDmode,                  /* machmode.def:244 */
-  CQImode,                 /* machmode.def:238 */
-  CHImode,                 /* machmode.def:238 */
-  CSImode,                 /* machmode.def:238 */
-  CDImode,                 /* machmode.def:238 */
-  CTImode,                 /* machmode.def:238 */
-  CEImode,                 /* machmode.def:238 */
-  COImode,                 /* machmode.def:238 */
-  CCImode,                 /* machmode.def:238 */
-  CXImode,                 /* machmode.def:238 */
-  HCmode,                  /* machmode.def:239 */
-  SCmode,                  /* machmode.def:239 */
-  DCmode,                  /* machmode.def:239 */
-  XCmode,                  /* machmode.def:239 */
-  V4QImode,                /* config/arm/arm-modes.def:67 */
-  V2HImode,                /* config/arm/arm-modes.def:67 */
-  V8QImode,                /* config/arm/arm-modes.def:68 */
-  V4HImode,                /* config/arm/arm-modes.def:68 */
-  V2SImode,                /* config/arm/arm-modes.def:68 */
-  V16QImode,               /* config/arm/arm-modes.def:69 */
-  V8HImode,                /* config/arm/arm-modes.def:69 */
-  V4SImode,                /* config/arm/arm-modes.def:69 */
-  V2DImode,                /* config/arm/arm-modes.def:69 */
-  V4QQmode,                /* config/arm/arm-modes.def:74 */
-  V2HQmode,                /* config/arm/arm-modes.def:74 */
-  V4UQQmode,               /* config/arm/arm-modes.def:75 */
-  V2UHQmode,               /* config/arm/arm-modes.def:75 */
-  V2HAmode,                /* config/arm/arm-modes.def:76 */
-  V2UHAmode,               /* config/arm/arm-modes.def:77 */
-  V4HFmode,                /* config/arm/arm-modes.def:70 */
-  V2SFmode,                /* config/arm/arm-modes.def:70 */
-  V8HFmode,                /* config/arm/arm-modes.def:71 */
-  V4SFmode,                /* config/arm/arm-modes.def:71 */
-  V2DFmode,                /* config/arm/arm-modes.def:71 */
-  MAX_MACHINE_MODE,
-
-  MIN_MODE_RANDOM = VOIDmode,
-  MAX_MODE_RANDOM = BLKmode,
-
-  MIN_MODE_CC = CCmode,
-  MAX_MODE_CC = CC_Nmode,
-
-  MIN_MODE_INT = QImode,
-  MAX_MODE_INT = XImode,
-
-  MIN_MODE_PARTIAL_INT = VOIDmode,
-  MAX_MODE_PARTIAL_INT = VOIDmode,
-
-  MIN_MODE_FRACT = QQmode,
-  MAX_MODE_FRACT = TQmode,
-
-  MIN_MODE_UFRACT = UQQmode,
-  MAX_MODE_UFRACT = UTQmode,
-
-  MIN_MODE_ACCUM = HAmode,
-  MAX_MODE_ACCUM = TAmode,
-
-  MIN_MODE_UACCUM = UHAmode,
-  MAX_MODE_UACCUM = UTAmode,
-
-  MIN_MODE_FLOAT = HFmode,
-  MAX_MODE_FLOAT = XFmode,
-
-  MIN_MODE_DECIMAL_FLOAT = SDmode,
-  MAX_MODE_DECIMAL_FLOAT = TDmode,
-
-  MIN_MODE_COMPLEX_INT = CQImode,
-  MAX_MODE_COMPLEX_INT = CXImode,
-
-  MIN_MODE_COMPLEX_FLOAT = HCmode,
-  MAX_MODE_COMPLEX_FLOAT = XCmode,
-
-  MIN_MODE_VECTOR_INT = V4QImode,
-  MAX_MODE_VECTOR_INT = V2DImode,
-
-  MIN_MODE_VECTOR_FRACT = V4QQmode,
-  MAX_MODE_VECTOR_FRACT = V2HQmode,
-
-  MIN_MODE_VECTOR_UFRACT = V4UQQmode,
-  MAX_MODE_VECTOR_UFRACT = V2UHQmode,
-
-  MIN_MODE_VECTOR_ACCUM = V2HAmode,
-  MAX_MODE_VECTOR_ACCUM = V2HAmode,
-
-  MIN_MODE_VECTOR_UACCUM = V2UHAmode,
-  MAX_MODE_VECTOR_UACCUM = V2UHAmode,
-
-  MIN_MODE_VECTOR_FLOAT = V4HFmode,
-  MAX_MODE_VECTOR_FLOAT = V2DFmode,
-
-  NUM_MACHINE_MODES = MAX_MACHINE_MODE
-};
-
-#define CONST_MODE_SIZE const
-#define CONST_MODE_BASE_ALIGN const
-#define CONST_MODE_IBIT const
-#define CONST_MODE_FBIT const
-
-#define BITS_PER_UNIT (8)
-#define MAX_BITSIZE_MODE_ANY_INT (64*BITS_PER_UNIT)
-#define MAX_BITSIZE_MODE_ANY_MODE (128*BITS_PER_UNIT)
-
-#endif /* insn-modes.h */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/insn-notes.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/insn-notes.def
deleted file mode 100644
index 33ebc09..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/insn-notes.def
+++ /dev/null
@@ -1,90 +0,0 @@
-/* Insn note definitions.
-   Copyright (C) 2004-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* This file defines all the codes that may appear in the
-   NOTE_LINE_NUMBER field of a NOTE insn for kinds of notes that are
-   not line numbers.  Source files define DEF_INSN_NOTE appropriately
-   before including this file.
-
-   We are slowly removing the concept of insn-chain notes from the
-   compiler.  Adding new codes to this file is STRONGLY DISCOURAGED.
-   If you think you need one, look for other ways to express what you
-   mean, such as register notes or bits in the basic-block structure.  */
-
-/* Shorthand.  */
-#define INSN_NOTE(NAME) DEF_INSN_NOTE (NOTE_INSN_##NAME)
-
-/* This note is used to get rid of an insn when it isn't safe to patch
-   the insn out of the chain.  */
-INSN_NOTE (DELETED)
-
-/* Generated in place of user-declared labels when they are deleted.  */
-INSN_NOTE (DELETED_LABEL)
-/* Similarly, but for labels that have been present in debug stmts
-   earlier and thus will only appear with -g.  These must use different
-   label namespace.  */
-INSN_NOTE (DELETED_DEBUG_LABEL)
-
-/* These are used to mark the beginning and end of a lexical block.
-   See NOTE_BLOCK and reorder_blocks.  */
-INSN_NOTE (BLOCK_BEG)
-INSN_NOTE (BLOCK_END)
-
-/* This note indicates the start of the real body of the function,
-   i.e. the point just after all of the parms have been moved into
-   their homes, etc.  */
-INSN_NOTE (FUNCTION_BEG)
-
-/* This marks the point immediately after the last prologue insn.  */
-INSN_NOTE (PROLOGUE_END)
-
-/* This marks the point immediately prior to the first epilogue insn.  */
-INSN_NOTE (EPILOGUE_BEG)
-
-/* These note where exception handling regions begin and end.
-   Uses NOTE_EH_HANDLER to identify the region in question.  */
-INSN_NOTE (EH_REGION_BEG)
-INSN_NOTE (EH_REGION_END)
-
-/* The location of a variable.  */
-INSN_NOTE (VAR_LOCATION)
-
-/* The values passed to callee.  */
-INSN_NOTE (CALL_ARG_LOCATION)
-
-/* Record the struct for the following basic block.  Uses
-   NOTE_BASIC_BLOCK.  FIXME: Redundant with the basic block pointer
-   now included in every insn.  NOTE: If there's no CFG anymore, in other words,
-   if BLOCK_FOR_INSN () == NULL, NOTE_BASIC_BLOCK cannot be considered reliable
-   anymore.  */
-INSN_NOTE (BASIC_BLOCK)
-
-/* Mark the inflection point in the instruction stream where we switch
-   between hot and cold text sections.  */
-INSN_NOTE (SWITCH_TEXT_SECTIONS)
-
-/* When emitting dwarf2 frame information, contains a directive that
-   should be emitted.  */
-INSN_NOTE (CFI)
-
-/* When emitting dwarf2 frame information, contains the number of a debug
-   label that should be emitted.  */
-INSN_NOTE (CFI_LABEL)
-
-#undef INSN_NOTE
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/internal-fn.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/internal-fn.def
deleted file mode 100644
index 31dc4c9..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/internal-fn.def
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Internal functions.
-   Copyright (C) 2011-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* This file specifies a list of internal "functions".  These functions
-   differ from built-in functions in that they have no linkage and cannot
-   be called directly by the user.  They represent operations that are only
-   synthesised by GCC itself.
-
-   Internal functions are used instead of tree codes if the operation
-   and its operands are more naturally represented as a GIMPLE_CALL
-   than a GIMPLE_ASSIGN.
-
-   Each entry in this file has the form:
-
-     DEF_INTERNAL_FN (NAME, FLAGS)
-
-   where NAME is the name of the function and FLAGS is a set of
-   ECF_* flags.  Each entry must have a corresponding expander
-   of the form:
-
-     void expand_NAME (gimple stmt)
-
-   where STMT is the statement that performs the call.  */
-
-DEF_INTERNAL_FN (LOAD_LANES, ECF_CONST | ECF_LEAF)
-DEF_INTERNAL_FN (STORE_LANES, ECF_CONST | ECF_LEAF)
-DEF_INTERNAL_FN (GOMP_SIMD_LANE, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW)
-DEF_INTERNAL_FN (GOMP_SIMD_VF, ECF_CONST | ECF_LEAF | ECF_NOTHROW)
-DEF_INTERNAL_FN (GOMP_SIMD_LAST_LANE, ECF_CONST | ECF_LEAF | ECF_NOTHROW)
-DEF_INTERNAL_FN (LOOP_VECTORIZED, ECF_NOVOPS | ECF_LEAF | ECF_NOTHROW)
-DEF_INTERNAL_FN (MASK_LOAD, ECF_PURE | ECF_LEAF)
-DEF_INTERNAL_FN (MASK_STORE, ECF_LEAF)
-DEF_INTERNAL_FN (ANNOTATE,  ECF_CONST | ECF_LEAF | ECF_NOTHROW)
-DEF_INTERNAL_FN (UBSAN_NULL, ECF_LEAF | ECF_NOTHROW)
-DEF_INTERNAL_FN (UBSAN_CHECK_ADD, ECF_CONST | ECF_LEAF | ECF_NOTHROW)
-DEF_INTERNAL_FN (UBSAN_CHECK_SUB, ECF_CONST | ECF_LEAF | ECF_NOTHROW)
-DEF_INTERNAL_FN (UBSAN_CHECK_MUL, ECF_CONST | ECF_LEAF | ECF_NOTHROW)
-DEF_INTERNAL_FN (ABNORMAL_DISPATCHER, ECF_NORETURN)
-DEF_INTERNAL_FN (BUILTIN_EXPECT, ECF_CONST | ECF_LEAF | ECF_NOTHROW)
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/internal-fn.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/internal-fn.h
deleted file mode 100644
index 9c3215f..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/internal-fn.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Internal functions.
-   Copyright (C) 2011-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_INTERNAL_FN_H
-#define GCC_INTERNAL_FN_H
-
-enum internal_fn {
-#define DEF_INTERNAL_FN(CODE, FLAGS) IFN_##CODE,
-#include "internal-fn.def"
-#undef DEF_INTERNAL_FN
-  IFN_LAST
-};
-
-/* Return the name of internal function FN.  The name is only meaningful
-   for dumps; it has no linkage.  */
-
-extern const char *const internal_fn_name_array[];
-
-static inline const char *
-internal_fn_name (enum internal_fn fn)
-{
-  return internal_fn_name_array[(int) fn];
-}
-
-/* Return the ECF_* flags for function FN.  */
-
-extern const int internal_fn_flags_array[];
-
-static inline int
-internal_fn_flags (enum internal_fn fn)
-{
-  return internal_fn_flags_array[(int) fn];
-}
-
-extern void expand_internal_call (gimple);
-
-#endif
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/intl.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/intl.h
deleted file mode 100644
index 91e7440..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/intl.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* intl.h - internationalization
-   Copyright (C) 1998-2014 Free Software Foundation, Inc.
-
-   GCC is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
-
-   GCC 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with GCC; see the file COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_INTL_H
-#define GCC_INTL_H
-
-#ifdef HAVE_LOCALE_H
-# include <locale.h>
-#endif
-
-#ifndef HAVE_SETLOCALE
-# define setlocale(category, locale) (locale)
-#endif
-
-#ifdef ENABLE_NLS
-#include <libintl.h>
-extern void gcc_init_libintl (void);
-extern size_t gcc_gettext_width (const char *);
-#else
-/* Stubs.  */
-# undef textdomain
-# define textdomain(domain) (domain)
-# undef bindtextdomain
-# define bindtextdomain(domain, directory) (domain)
-# undef gettext
-# define gettext(msgid) (msgid)
-# define ngettext(singular,plural,n) fake_ngettext (singular, plural, n)
-# define gcc_init_libintl()	/* nothing */
-# define gcc_gettext_width(s) strlen (s)
-
-extern const char *fake_ngettext (const char *singular, const char *plural,
-				  unsigned long int n);
-
-#endif
-
-#ifndef _
-# define _(msgid) gettext (msgid)
-#endif
-
-#ifndef N_
-# define N_(msgid) msgid
-#endif
-
-#ifndef G_
-# define G_(gmsgid) gmsgid
-#endif
-
-extern char *get_spaces (const char *);
-
-extern const char *open_quote;
-extern const char *close_quote;
-extern const char *locale_encoding;
-extern bool locale_utf8;
-
-#endif /* intl.h */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ipa-prop.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ipa-prop.h
deleted file mode 100644
index 70185b2..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ipa-prop.h
+++ /dev/null
@@ -1,718 +0,0 @@
-/* Interprocedural analyses.
-   Copyright (C) 2005-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef IPA_PROP_H
-#define IPA_PROP_H
-
-#include "vec.h"
-#include "cgraph.h"
-#include "alloc-pool.h"
-
-/* The following definitions and interfaces are used by
-   interprocedural analyses or parameters.  */
-
-#define IPA_UNDESCRIBED_USE -1
-
-/* ipa-prop.c stuff (ipa-cp, indirect inlining):  */
-
-/* A jump function for a callsite represents the values passed as actual
-   arguments of the callsite.  They were originally proposed in a paper called
-   "Interprocedural Constant Propagation", by David Callahan, Keith D Cooper,
-   Ken Kennedy, Linda Torczon in Comp86, pg 152-161.  There are three main
-   types of values :
-
-   Pass-through - the caller's formal parameter is passed as an actual
-                  argument, possibly one simple operation performed on it.
-   Constant     - a constant (is_gimple_ip_invariant)is passed as an actual
-                  argument.
-   Unknown      - neither of the above.
-
-   IPA_JF_ANCESTOR is a special pass-through jump function, which means that
-   the result is an address of a part of the object pointed to by the formal
-   parameter to which the function refers.  It is mainly intended to represent
-   getting addresses of of ancestor fields in C++
-   (e.g. &this_1(D)->D.1766.D.1756).  Note that if the original pointer is
-   NULL, ancestor jump function must behave like a simple pass-through.
-
-   Other pass-through functions can either simply pass on an unchanged formal
-   parameter or can apply one simple binary operation to it (such jump
-   functions are called polynomial).
-
-   IPA_JF_KNOWN_TYPE is a special type of an "unknown" function that applies
-   only to pointer parameters.  It means that even though we cannot prove that
-   the passed value is an interprocedural constant, we still know the exact
-   type of the containing object which may be valuable for devirtualization.
-
-   Jump functions are computed in ipa-prop.c by function
-   update_call_notes_after_inlining.  Some information can be lost and jump
-   functions degraded accordingly when inlining, see
-   update_call_notes_after_inlining in the same file.  */
-
-enum jump_func_type
-{
-  IPA_JF_UNKNOWN = 0,  /* newly allocated and zeroed jump functions default */
-  IPA_JF_KNOWN_TYPE,        /* represented by field known_type */
-  IPA_JF_CONST,             /* represented by field costant */
-  IPA_JF_PASS_THROUGH,	    /* represented by field pass_through */
-  IPA_JF_ANCESTOR	    /* represented by field ancestor */
-};
-
-/* Structure holding data required to describe a known type jump function.  */
-struct GTY(()) ipa_known_type_data
-{
-  /* Offset of the component of the base_type being described.  */
-  HOST_WIDE_INT offset;
-  /* Type of the whole object.  */
-  tree base_type;
-  /* Type of the component of the object that is being described.  */
-  tree component_type;
-};
-
-struct ipa_cst_ref_desc;
-
-/* Structure holding data required to describe a constant jump function.  */
-struct GTY(()) ipa_constant_data
-{
-  /* THe value of the constant.  */
-  tree value;
-  /* Pointer to the structure that describes the reference.  */
-  struct ipa_cst_ref_desc GTY((skip)) *rdesc;
-};
-
-/* Structure holding data required to describe a pass-through jump function.  */
-
-struct GTY(()) ipa_pass_through_data
-{
-  /* If an operation is to be performed on the original parameter, this is the
-     second (constant) operand.  */
-  tree operand;
-  /* Number of the caller's formal parameter being passed.  */
-  int formal_id;
-  /* Operation that is performed on the argument before it is passed on.
-     NOP_EXPR means no operation.  Otherwise oper must be a simple binary
-     arithmetic operation where the caller's parameter is the first operand and
-     operand field from this structure is the second one.  */
-  enum tree_code operation;
-  /* When the passed value is a pointer, it is set to true only when we are
-     certain that no write to the object it points to has occurred since the
-     caller functions started execution, except for changes noted in the
-     aggregate part of the jump function (see description of
-     ipa_agg_jump_function).  The flag is used only when the operation is
-     NOP_EXPR.  */
-  unsigned agg_preserved : 1;
-
-  /* When set to true, we guarantee that, if there is a C++ object pointed to
-     by this object, it does not undergo dynamic type change in the course of
-     functions decribed by this jump function.  */
-  unsigned type_preserved : 1;
-};
-
-/* Structure holding data required to describe an ancestor pass-through
-   jump function.  */
-
-struct GTY(()) ipa_ancestor_jf_data
-{
-  /* Offset of the field representing the ancestor.  */
-  HOST_WIDE_INT offset;
-  /* Type of the result.
-     When TYPE_PRESERVED is false, TYPE is NULL, since it is only
-     relevant for the devirtualization machinery.  */
-  tree type;
-  /* Number of the caller's formal parameter being passed.  */
-  int formal_id;
-  /* Flag with the same meaning like agg_preserve in ipa_pass_through_data.  */
-  unsigned agg_preserved : 1;
-  /* When set to true, we guarantee that, if there is a C++ object pointed to
-     by this object, it does not undergo dynamic type change in the course of
-     functions decribed by this jump function.  */
-  unsigned type_preserved : 1;
-};
-
-/* An element in an aggegate part of a jump function describing a known value
-   at a given offset.  When it is part of a pass-through jump function with
-   agg_preserved set or an ancestor jump function with agg_preserved set, all
-   unlisted positions are assumed to be preserved but the value can be a type
-   node, which means that the particular piece (starting at offset and having
-   the size of the type) is clobbered with an unknown value.  When
-   agg_preserved is false or the type of the containing jump function is
-   different, all unlisted parts are assumed to be unknown and all values must
-   fulfill is_gimple_ip_invariant.  */
-
-struct GTY(()) ipa_agg_jf_item
-{
-  /* The offset at which the known value is located within the aggregate.  */
-  HOST_WIDE_INT offset;
-
-  /* The known constant or type if this is a clobber.  */
-  tree value;
-};
-
-
-/* Aggregate jump function - i.e. description of contents of aggregates passed
-   either by reference or value.  */
-
-struct GTY(()) ipa_agg_jump_function
-{
-  /* Description of the individual items.  */
-  vec<ipa_agg_jf_item, va_gc> *items;
-  /* True if the data was passed by reference (as opposed to by value). */
-  bool by_ref;
-};
-
-typedef struct ipa_agg_jump_function *ipa_agg_jump_function_p;
-
-/* A jump function for a callsite represents the values passed as actual
-   arguments of the callsite. See enum jump_func_type for the various
-   types of jump functions supported.  */
-struct GTY (()) ipa_jump_func
-{
-  /* Aggregate contants description.  See struct ipa_agg_jump_function and its
-     description.  */
-  struct ipa_agg_jump_function agg;
-
-  enum jump_func_type type;
-  /* Represents a value of a jump function.  pass_through is used only in jump
-     function context.  constant represents the actual constant in constant jump
-     functions and member_cst holds constant c++ member functions.  */
-  union jump_func_value
-  {
-    struct ipa_known_type_data GTY ((tag ("IPA_JF_KNOWN_TYPE"))) known_type;
-    struct ipa_constant_data GTY ((tag ("IPA_JF_CONST"))) constant;
-    struct ipa_pass_through_data GTY ((tag ("IPA_JF_PASS_THROUGH"))) pass_through;
-    struct ipa_ancestor_jf_data GTY ((tag ("IPA_JF_ANCESTOR"))) ancestor;
-  } GTY ((desc ("%1.type"))) value;
-};
-
-
-/* Return the offset of the component that is described by a known type jump
-   function JFUNC.  */
-
-static inline HOST_WIDE_INT
-ipa_get_jf_known_type_offset (struct ipa_jump_func *jfunc)
-{
-  gcc_checking_assert (jfunc->type == IPA_JF_KNOWN_TYPE);
-  return jfunc->value.known_type.offset;
-}
-
-/* Return the base type of a known type jump function JFUNC.  */
-
-static inline tree
-ipa_get_jf_known_type_base_type (struct ipa_jump_func *jfunc)
-{
-  gcc_checking_assert (jfunc->type == IPA_JF_KNOWN_TYPE);
-  return jfunc->value.known_type.base_type;
-}
-
-/* Return the component type of a known type jump function JFUNC.  */
-
-static inline tree
-ipa_get_jf_known_type_component_type (struct ipa_jump_func *jfunc)
-{
-  gcc_checking_assert (jfunc->type == IPA_JF_KNOWN_TYPE);
-  return jfunc->value.known_type.component_type;
-}
-
-/* Return the constant stored in a constant jump functin JFUNC.  */
-
-static inline tree
-ipa_get_jf_constant (struct ipa_jump_func *jfunc)
-{
-  gcc_checking_assert (jfunc->type == IPA_JF_CONST);
-  return jfunc->value.constant.value;
-}
-
-static inline struct ipa_cst_ref_desc *
-ipa_get_jf_constant_rdesc (struct ipa_jump_func *jfunc)
-{
-  gcc_checking_assert (jfunc->type == IPA_JF_CONST);
-  return jfunc->value.constant.rdesc;
-}
-
-/* Return the operand of a pass through jmp function JFUNC.  */
-
-static inline tree
-ipa_get_jf_pass_through_operand (struct ipa_jump_func *jfunc)
-{
-  gcc_checking_assert (jfunc->type == IPA_JF_PASS_THROUGH);
-  return jfunc->value.pass_through.operand;
-}
-
-/* Return the number of the caller's formal parameter that a pass through jump
-   function JFUNC refers to.  */
-
-static inline int
-ipa_get_jf_pass_through_formal_id (struct ipa_jump_func *jfunc)
-{
-  gcc_checking_assert (jfunc->type == IPA_JF_PASS_THROUGH);
-  return jfunc->value.pass_through.formal_id;
-}
-
-/* Return operation of a pass through jump function JFUNC.  */
-
-static inline enum tree_code
-ipa_get_jf_pass_through_operation (struct ipa_jump_func *jfunc)
-{
-  gcc_checking_assert (jfunc->type == IPA_JF_PASS_THROUGH);
-  return jfunc->value.pass_through.operation;
-}
-
-/* Return the agg_preserved flag of a pass through jump function JFUNC.  */
-
-static inline bool
-ipa_get_jf_pass_through_agg_preserved (struct ipa_jump_func *jfunc)
-{
-  gcc_checking_assert (jfunc->type == IPA_JF_PASS_THROUGH);
-  return jfunc->value.pass_through.agg_preserved;
-}
-
-/* Return the type_preserved flag of a pass through jump function JFUNC.  */
-
-static inline bool
-ipa_get_jf_pass_through_type_preserved (struct ipa_jump_func *jfunc)
-{
-  gcc_checking_assert (jfunc->type == IPA_JF_PASS_THROUGH);
-  return jfunc->value.pass_through.type_preserved;
-}
-
-/* Return the offset of an ancestor jump function JFUNC.  */
-
-static inline HOST_WIDE_INT
-ipa_get_jf_ancestor_offset (struct ipa_jump_func *jfunc)
-{
-  gcc_checking_assert (jfunc->type == IPA_JF_ANCESTOR);
-  return jfunc->value.ancestor.offset;
-}
-
-/* Return the result type of an ancestor jump function JFUNC.  */
-
-static inline tree
-ipa_get_jf_ancestor_type (struct ipa_jump_func *jfunc)
-{
-  gcc_checking_assert (jfunc->type == IPA_JF_ANCESTOR);
-  return jfunc->value.ancestor.type;
-}
-
-/* Return the number of the caller's formal parameter that an ancestor jump
-   function JFUNC refers to.  */
-
-static inline int
-ipa_get_jf_ancestor_formal_id (struct ipa_jump_func *jfunc)
-{
-  gcc_checking_assert (jfunc->type == IPA_JF_ANCESTOR);
-  return jfunc->value.ancestor.formal_id;
-}
-
-/* Return the agg_preserved flag of an ancestor jump function JFUNC.  */
-
-static inline bool
-ipa_get_jf_ancestor_agg_preserved (struct ipa_jump_func *jfunc)
-{
-  gcc_checking_assert (jfunc->type == IPA_JF_ANCESTOR);
-  return jfunc->value.ancestor.agg_preserved;
-}
-
-/* Return the type_preserved flag of an ancestor jump function JFUNC.  */
-
-static inline bool
-ipa_get_jf_ancestor_type_preserved (struct ipa_jump_func *jfunc)
-{
-  gcc_checking_assert (jfunc->type == IPA_JF_ANCESTOR);
-  return jfunc->value.ancestor.type_preserved;
-}
-
-/* Summary describing a single formal parameter.  */
-
-struct ipa_param_descriptor
-{
-  /* PARAM_DECL of this parameter.  */
-  tree decl;
-  /* If all uses of the parameter are described by ipa-prop structures, this
-     says how many there are.  If any use could not be described by means of
-     ipa-prop structures, this is IPA_UNDESCRIBED_USE.  */
-  int controlled_uses;
-  unsigned int move_cost : 31;
-  /* The parameter is used.  */
-  unsigned used : 1;
-};
-
-struct ipcp_lattice;
-
-/* ipa_node_params stores information related to formal parameters of functions
-   and some other information for interprocedural passes that operate on
-   parameters (such as ipa-cp).  */
-
-struct ipa_node_params
-{
-  /* Information about individual formal parameters that are gathered when
-     summaries are generated. */
-  vec<ipa_param_descriptor> descriptors;
-  /* Pointer to an array of structures describing individual formal
-     parameters.  */
-  struct ipcp_param_lattices *lattices;
-  /* Only for versioned nodes this field would not be NULL,
-     it points to the node that IPA cp cloned from.  */
-  struct cgraph_node *ipcp_orig_node;
-  /* If this node is an ipa-cp clone, these are the known values that describe
-     what it has been specialized for.  */
-  vec<tree> known_vals;
-  /* Whether the param uses analysis has already been performed.  */
-  unsigned uses_analysis_done : 1;
-  /* Whether the function is enqueued in ipa-cp propagation stack.  */
-  unsigned node_enqueued : 1;
-  /* Whether we should create a specialized version based on values that are
-     known to be constant in all contexts.  */
-  unsigned do_clone_for_all_contexts : 1;
-  /* Set if this is an IPA-CP clone for all contexts.  */
-  unsigned is_all_contexts_clone : 1;
-  /* Node has been completely replaced by clones and will be removed after
-     ipa-cp is finished.  */
-  unsigned node_dead : 1;
-};
-
-/* ipa_node_params access functions.  Please use these to access fields that
-   are or will be shared among various passes.  */
-
-/* Return the number of formal parameters. */
-
-static inline int
-ipa_get_param_count (struct ipa_node_params *info)
-{
-  return info->descriptors.length ();
-}
-
-/* Return the declaration of Ith formal parameter of the function corresponding
-   to INFO.  Note there is no setter function as this array is built just once
-   using ipa_initialize_node_params. */
-
-static inline tree
-ipa_get_param (struct ipa_node_params *info, int i)
-{
-  gcc_checking_assert (!flag_wpa);
-  return info->descriptors[i].decl;
-}
-
-/* Return the move cost of Ith formal parameter of the function corresponding
-   to INFO.  */
-
-static inline int
-ipa_get_param_move_cost (struct ipa_node_params *info, int i)
-{
-  return info->descriptors[i].move_cost;
-}
-
-/* Set the used flag corresponding to the Ith formal parameter of the function
-   associated with INFO to VAL.  */
-
-static inline void
-ipa_set_param_used (struct ipa_node_params *info, int i, bool val)
-{
-  info->descriptors[i].used = val;
-}
-
-/* Return how many uses described by ipa-prop a parameter has or
-   IPA_UNDESCRIBED_USE if there is a use that is not described by these
-   structures.  */
-static inline int
-ipa_get_controlled_uses (struct ipa_node_params *info, int i)
-{
-  return info->descriptors[i].controlled_uses;
-}
-
-/* Set the controlled counter of a given parameter.  */
-
-static inline void
-ipa_set_controlled_uses (struct ipa_node_params *info, int i, int val)
-{
-  info->descriptors[i].controlled_uses = val;
-}
-
-/* Return the used flag corresponding to the Ith formal parameter of the
-   function associated with INFO.  */
-
-static inline bool
-ipa_is_param_used (struct ipa_node_params *info, int i)
-{
-  return info->descriptors[i].used;
-}
-
-/* Information about replacements done in aggregates for a given node (each
-   node has its linked list).  */
-struct GTY(()) ipa_agg_replacement_value
-{
-  /* Next item in the linked list.  */
-  struct ipa_agg_replacement_value *next;
-  /* Offset within the aggregate.  */
-  HOST_WIDE_INT offset;
-  /* The constant value.  */
-  tree value;
-  /* The paramter index.  */
-  int index;
-  /* Whether the value was passed by reference.  */
-  bool by_ref;
-};
-
-typedef struct ipa_agg_replacement_value *ipa_agg_replacement_value_p;
-
-void ipa_set_node_agg_value_chain (struct cgraph_node *node,
-				   struct ipa_agg_replacement_value *aggvals);
-
-/* ipa_edge_args stores information related to a callsite and particularly its
-   arguments.  It can be accessed by the IPA_EDGE_REF macro.  */
-struct GTY(()) ipa_edge_args
-{
-  /* Vector of the callsite's jump function of each parameter.  */
-  vec<ipa_jump_func, va_gc> *jump_functions;
-};
-
-/* ipa_edge_args access functions.  Please use these to access fields that
-   are or will be shared among various passes.  */
-
-/* Return the number of actual arguments. */
-
-static inline int
-ipa_get_cs_argument_count (struct ipa_edge_args *args)
-{
-  return vec_safe_length (args->jump_functions);
-}
-
-/* Returns a pointer to the jump function for the ith argument.  Please note
-   there is no setter function as jump functions are all set up in
-   ipa_compute_jump_functions. */
-
-static inline struct ipa_jump_func *
-ipa_get_ith_jump_func (struct ipa_edge_args *args, int i)
-{
-  return &(*args->jump_functions)[i];
-}
-
-/* Types of vectors holding the infos.  */
-
-/* Vector where the parameter infos are actually stored. */
-extern vec<ipa_node_params> ipa_node_params_vector;
-/* Vector of known aggregate values in cloned nodes.  */
-extern GTY(()) vec<ipa_agg_replacement_value_p, va_gc> *ipa_node_agg_replacements;
-/* Vector where the parameter infos are actually stored. */
-extern GTY(()) vec<ipa_edge_args, va_gc> *ipa_edge_args_vector;
-
-/* Return the associated parameter/argument info corresponding to the given
-   node/edge.  */
-#define IPA_NODE_REF(NODE) (&ipa_node_params_vector[(NODE)->uid])
-#define IPA_EDGE_REF(EDGE) (&(*ipa_edge_args_vector)[(EDGE)->uid])
-/* This macro checks validity of index returned by
-   ipa_get_param_decl_index function.  */
-#define IS_VALID_JUMP_FUNC_INDEX(I) ((I) != -1)
-
-/* Creating and freeing ipa_node_params and ipa_edge_args.  */
-void ipa_create_all_node_params (void);
-void ipa_create_all_edge_args (void);
-void ipa_free_edge_args_substructures (struct ipa_edge_args *);
-void ipa_free_node_params_substructures (struct ipa_node_params *);
-void ipa_free_all_node_params (void);
-void ipa_free_all_edge_args (void);
-void ipa_free_all_structures_after_ipa_cp (void);
-void ipa_free_all_structures_after_iinln (void);
-void ipa_register_cgraph_hooks (void);
-
-/* This function ensures the array of node param infos is big enough to
-   accommodate a structure for all nodes and reallocates it if not.  */
-
-static inline void
-ipa_check_create_node_params (void)
-{
-  if (!ipa_node_params_vector.exists ())
-    ipa_node_params_vector.create (cgraph_max_uid);
-
-  if (ipa_node_params_vector.length () <= (unsigned) cgraph_max_uid)
-    ipa_node_params_vector.safe_grow_cleared (cgraph_max_uid + 1);
-}
-
-/* This function ensures the array of edge arguments infos is big enough to
-   accommodate a structure for all edges and reallocates it if not.  */
-
-static inline void
-ipa_check_create_edge_args (void)
-{
-  if (vec_safe_length (ipa_edge_args_vector) <= (unsigned) cgraph_edge_max_uid)
-    vec_safe_grow_cleared (ipa_edge_args_vector, cgraph_edge_max_uid + 1);
-}
-
-/* Returns true if the array of edge infos is large enough to accommodate an
-   info for EDGE.  The main purpose of this function is that debug dumping
-   function can check info availability without causing reallocations.  */
-
-static inline bool
-ipa_edge_args_info_available_for_edge_p (struct cgraph_edge *edge)
-{
-  return ((unsigned) edge->uid < vec_safe_length (ipa_edge_args_vector));
-}
-
-/* Return the aggregate replacements for NODE, if there are any.  */
-
-static inline struct ipa_agg_replacement_value *
-ipa_get_agg_replacements_for_node (struct cgraph_node *node)
-{
-  if ((unsigned) node->uid >= vec_safe_length (ipa_node_agg_replacements))
-    return NULL;
-  return (*ipa_node_agg_replacements)[node->uid];
-}
-
-/* Function formal parameters related computations.  */
-void ipa_initialize_node_params (struct cgraph_node *node);
-bool ipa_propagate_indirect_call_infos (struct cgraph_edge *cs,
-					vec<cgraph_edge_p> *new_edges);
-
-/* Indirect edge and binfo processing.  */
-tree ipa_get_indirect_edge_target (struct cgraph_edge *ie,
-				   vec<tree> ,
-				   vec<tree> ,
-				   vec<ipa_agg_jump_function_p> );
-struct cgraph_edge *ipa_make_edge_direct_to_target (struct cgraph_edge *, tree);
-tree ipa_binfo_from_known_type_jfunc (struct ipa_jump_func *);
-tree ipa_intraprocedural_devirtualization (gimple);
-tree ipa_impossible_devirt_target (struct cgraph_edge *, tree);
-
-/* Functions related to both.  */
-void ipa_analyze_node (struct cgraph_node *);
-
-/* Aggregate jump function related functions.  */
-tree ipa_find_agg_cst_for_param (struct ipa_agg_jump_function *, HOST_WIDE_INT,
-				 bool);
-bool ipa_load_from_parm_agg (struct ipa_node_params *, gimple, tree, int *,
-			     HOST_WIDE_INT *, bool *);
-
-/* Debugging interface.  */
-void ipa_print_node_params (FILE *, struct cgraph_node *node);
-void ipa_print_all_params (FILE *);
-void ipa_print_node_jump_functions (FILE *f, struct cgraph_node *node);
-void ipa_print_all_jump_functions (FILE * f);
-void ipcp_verify_propagated_values (void);
-
-extern alloc_pool ipcp_values_pool;
-extern alloc_pool ipcp_sources_pool;
-extern alloc_pool ipcp_agg_lattice_pool;
-
-/* Operation to be performed for the parameter in ipa_parm_adjustment
-   below.  */
-enum ipa_parm_op {
-  IPA_PARM_OP_NONE,
-
-  /* This describes a brand new parameter.
-
-     The field `type' should be set to the new type, `arg_prefix'
-     should be set to the string prefix for the new DECL_NAME, and
-     `new_decl' will ultimately hold the newly created argument.  */
-  IPA_PARM_OP_NEW,
-
-  /* This new parameter is an unmodified parameter at index base_index. */
-  IPA_PARM_OP_COPY,
-
-  /* This adjustment describes a parameter that is about to be removed
-     completely.  Most users will probably need to book keep those so that they
-     don't leave behinfd any non default def ssa names belonging to them.  */
-  IPA_PARM_OP_REMOVE
-};
-
-/* Structure to describe transformations of formal parameters and actual
-   arguments.  Each instance describes one new parameter and they are meant to
-   be stored in a vector.  Additionally, most users will probably want to store
-   adjustments about parameters that are being removed altogether so that SSA
-   names belonging to them can be replaced by SSA names of an artificial
-   variable.  */
-struct ipa_parm_adjustment
-{
-  /* The original PARM_DECL itself, helpful for processing of the body of the
-     function itself.  Intended for traversing function bodies.
-     ipa_modify_formal_parameters, ipa_modify_call_arguments and
-     ipa_combine_adjustments ignore this and use base_index.
-     ipa_modify_formal_parameters actually sets this.  */
-  tree base;
-
-  /* Type of the new parameter.  However, if by_ref is true, the real type will
-     be a pointer to this type.  */
-  tree type;
-
-  /* Alias refrerence type to be used in MEM_REFs when adjusting caller
-     arguments.  */
-  tree alias_ptr_type;
-
-  /* The new declaration when creating/replacing a parameter.  Created
-     by ipa_modify_formal_parameters, useful for functions modifying
-     the body accordingly.  For brand new arguments, this is the newly
-     created argument.  */
-  tree new_decl;
-
-  /* New declaration of a substitute variable that we may use to replace all
-     non-default-def ssa names when a parm decl is going away.  */
-  tree new_ssa_base;
-
-  /* If non-NULL and the original parameter is to be removed (copy_param below
-     is NULL), this is going to be its nonlocalized vars value.  */
-  tree nonlocal_value;
-
-  /* This holds the prefix to be used for the new DECL_NAME.  */
-  const char *arg_prefix;
-
-  /* Offset into the original parameter (for the cases when the new parameter
-     is a component of an original one).  */
-  HOST_WIDE_INT offset;
-
-  /* Zero based index of the original parameter this one is based on.  */
-  int base_index;
-
-  /* Whether this parameter is a new parameter, a copy of an old one,
-     or one about to be removed.  */
-  enum ipa_parm_op op;
-
-  /* The parameter is to be passed by reference.  */
-  unsigned by_ref : 1;
-};
-
-typedef vec<ipa_parm_adjustment> ipa_parm_adjustment_vec;
-
-vec<tree> ipa_get_vector_of_formal_parms (tree fndecl);
-vec<tree> ipa_get_vector_of_formal_parm_types (tree fntype);
-void ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec);
-void ipa_modify_call_arguments (struct cgraph_edge *, gimple,
-				ipa_parm_adjustment_vec);
-ipa_parm_adjustment_vec ipa_combine_adjustments (ipa_parm_adjustment_vec,
-						 ipa_parm_adjustment_vec);
-void ipa_dump_param_adjustments (FILE *, ipa_parm_adjustment_vec, tree);
-void ipa_dump_agg_replacement_values (FILE *f,
-				      struct ipa_agg_replacement_value *av);
-void ipa_prop_write_jump_functions (void);
-void ipa_prop_read_jump_functions (void);
-void ipa_prop_write_all_agg_replacement (void);
-void ipa_prop_read_all_agg_replacement (void);
-void ipa_update_after_lto_read (void);
-int ipa_get_param_decl_index (struct ipa_node_params *, tree);
-tree ipa_value_from_jfunc (struct ipa_node_params *info,
-			   struct ipa_jump_func *jfunc);
-unsigned int ipcp_transform_function (struct cgraph_node *node);
-void ipa_dump_param (FILE *, struct ipa_node_params *info, int i);
-bool ipa_modify_expr (tree *, bool, ipa_parm_adjustment_vec);
-ipa_parm_adjustment *ipa_get_adjustment_candidate (tree **, bool *,
-						   ipa_parm_adjustment_vec,
-						   bool);
-
-
-/* From tree-sra.c:  */
-tree build_ref_for_offset (location_t, tree, HOST_WIDE_INT, tree,
-			   gimple_stmt_iterator *, bool);
-
-#endif /* IPA_PROP_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ipa-ref-inline.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ipa-ref-inline.h
deleted file mode 100644
index e12fce6..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ipa-ref-inline.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/* IPA reference lists.
-   Copyright (C) 2010-2014 Free Software Foundation, Inc.
-   Contributed by Jan Hubicka
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* Return callgraph node REF is referring.  */
-static inline struct cgraph_node *
-ipa_ref_node (struct ipa_ref *ref)
-{
-  return cgraph (ref->referred);
-}
-
-/* Return varpool node REF is referring.  */
-
-static inline varpool_node *
-ipa_ref_varpool_node (struct ipa_ref *ref)
-{
-  return varpool (ref->referred);
-}
-
-/* Return cgraph node REF is in.  */
-
-static inline struct cgraph_node *
-ipa_ref_referring_node (struct ipa_ref *ref)
-{
-  return cgraph (ref->referring);
-}
-
-/* Return varpool node REF is in.  */
-
-static inline varpool_node *
-ipa_ref_referring_varpool_node (struct ipa_ref *ref)
-{
-  return varpool (ref->referring);
-}
-
-/* Return reference list REF is in.  */
-
-static inline struct ipa_ref_list *
-ipa_ref_referring_ref_list (struct ipa_ref *ref)
-{
-  return &ref->referring->ref_list;
-}
-
-/* Return reference list REF is in.  */
-
-static inline struct ipa_ref_list *
-ipa_ref_referred_ref_list (struct ipa_ref *ref)
-{
-  return &ref->referred->ref_list;
-}
-
-/* Return first reference in LIST or NULL if empty.  */
-
-static inline struct ipa_ref *
-ipa_ref_list_first_reference (struct ipa_ref_list *list)
-{
-  if (!vec_safe_length (list->references))
-    return NULL;
-  return &(*list->references)[0];
-}
-
-/* Return first referring ref in LIST or NULL if empty.  */
-
-static inline struct ipa_ref *
-ipa_ref_list_first_referring (struct ipa_ref_list *list)
-{
-  if (!list->referring.length ())
-    return NULL;
-  return list->referring[0];
-}
-
-/* Clear reference list.  */
-
-static inline void
-ipa_empty_ref_list (struct ipa_ref_list *list)
-{
-  list->referring.create (0);
-  list->references = NULL;
-}
-
-/* Clear reference list.  */
-
-static inline unsigned int
-ipa_ref_list_nreferences (struct ipa_ref_list *list)
-{
-  return vec_safe_length (list->references);
-}
-
-#define ipa_ref_list_reference_iterate(L,I,P) \
-   vec_safe_iterate ((L)->references, (I), &(P))
-#define ipa_ref_list_referring_iterate(L,I,P) \
-   (L)->referring.iterate ((I), &(P))
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ipa-ref.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ipa-ref.h
deleted file mode 100644
index 4ce5f8d..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ipa-ref.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* IPA reference lists.
-   Copyright (C) 2010-2014 Free Software Foundation, Inc.
-   Contributed by Jan Hubicka
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-struct cgraph_node;
-class varpool_node;
-class symtab_node;
-
-
-/* How the reference is done.  */
-enum GTY(()) ipa_ref_use
-{
-  IPA_REF_LOAD,
-  IPA_REF_STORE,
-  IPA_REF_ADDR,
-  IPA_REF_ALIAS
-};
-
-/* Record of reference in callgraph or varpool.  */
-struct GTY(()) ipa_ref
-{
-  symtab_node *referring;
-  symtab_node *referred;
-  gimple stmt;
-  unsigned int lto_stmt_uid;
-  unsigned int referred_index;
-  ENUM_BITFIELD (ipa_ref_use) use:2;
-  unsigned int speculative:1;
-};
-
-typedef struct ipa_ref ipa_ref_t;
-typedef struct ipa_ref *ipa_ref_ptr;
-
-
-/* List of references.  This is stored in both callgraph and varpool nodes.  */
-struct GTY(()) ipa_ref_list
-{
-  /* Store actual references in references vector.  */
-  vec<ipa_ref_t, va_gc> *references;
-  /* Referring is vector of pointers to references.  It must not live in GGC space
-     or GGC will try to mark middle of references vectors.  */
-  vec<ipa_ref_ptr>  GTY((skip)) referring;
-};
-
-struct ipa_ref * ipa_record_reference (symtab_node *,
-				       symtab_node *,
-				       enum ipa_ref_use, gimple);
-struct ipa_ref * ipa_maybe_record_reference (symtab_node *, tree,
-					     enum ipa_ref_use, gimple);
-
-void ipa_remove_reference (struct ipa_ref *);
-void ipa_remove_all_references (struct ipa_ref_list *);
-void ipa_remove_all_referring (struct ipa_ref_list *);
-void ipa_dump_references (FILE *, struct ipa_ref_list *);
-void ipa_dump_referring (FILE *, struct ipa_ref_list *);
-void ipa_clone_references (symtab_node *, struct ipa_ref_list *);
-void ipa_clone_referring (symtab_node *, struct ipa_ref_list *);
-struct ipa_ref * ipa_clone_ref (struct ipa_ref *, symtab_node *, gimple);
-bool ipa_ref_cannot_lead_to_return (struct ipa_ref *);
-bool ipa_ref_has_aliases_p (struct ipa_ref_list *);
-struct ipa_ref * ipa_find_reference (symtab_node *, symtab_node *, gimple, unsigned int);
-void ipa_remove_stmt_references (symtab_node *, gimple);
-void ipa_clear_stmts_in_references (symtab_node *);
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ipa-reference.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ipa-reference.h
deleted file mode 100644
index c840024..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ipa-reference.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* IPA handling of references.
-   Copyright (C) 2004-2014 Free Software Foundation, Inc.
-   Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_IPA_REFERENCE_H
-#define GCC_IPA_REFERENCE_H
-#include "bitmap.h"
-#include "cgraph.h"
-
-/* In ipa-reference.c  */
-bitmap ipa_reference_get_not_read_global (struct cgraph_node *fn);
-bitmap ipa_reference_get_not_written_global (struct cgraph_node *fn);
-
-#endif  /* GCC_IPA_REFERENCE_H  */
-
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ipa-utils.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ipa-utils.h
deleted file mode 100644
index a2c985a..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ipa-utils.h
+++ /dev/null
@@ -1,191 +0,0 @@
-/* Utilities for ipa analysis.
-   Copyright (C) 2004-2014 Free Software Foundation, Inc.
-   Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_IPA_UTILS_H
-#define GCC_IPA_UTILS_H
-#include "cgraph.h"
-
-struct ipa_dfs_info {
-  int dfn_number;
-  int low_link;
-  /* This field will have the samy value for any two nodes in the same strongly
-     connected component.  */
-  int scc_no;
-  bool new_node;
-  bool on_stack;
-  struct cgraph_node* next_cycle;
-  PTR aux;
-};
-
-/* Context of polymorphic call.  This is used by ipa-devirt walkers of the
-   type inheritance graph.  */
-struct ipa_polymorphic_call_context {
-  /* The called object appears in an object of type OUTER_TYPE
-     at offset OFFSET.  */
-  HOST_WIDE_INT offset;
-  tree outer_type;
-  /* True if outer object may be in construction or destruction.  */
-  bool maybe_in_construction;
-  /* True if outer object may be of derived type.  */
-  bool maybe_derived_type;
-};
-
-/* Context representing "I know nothing".  */
-extern const ipa_polymorphic_call_context ipa_dummy_polymorphic_call_context;
-
-/* In ipa-utils.c  */
-void ipa_print_order (FILE*, const char *, struct cgraph_node**, int);
-int ipa_reduced_postorder (struct cgraph_node **, bool, bool,
-			  bool (*ignore_edge) (struct cgraph_edge *));
-void ipa_free_postorder_info (void);
-vec<cgraph_node_ptr> ipa_get_nodes_in_cycle (struct cgraph_node *);
-bool ipa_edge_within_scc (struct cgraph_edge *);
-int ipa_reverse_postorder (struct cgraph_node **);
-tree get_base_var (tree);
-void ipa_merge_profiles (struct cgraph_node *dst,
-			 struct cgraph_node *src);
-bool recursive_call_p (tree, tree);
-
-/* In ipa-profile.c  */
-bool ipa_propagate_frequency (struct cgraph_node *node);
-
-/* In ipa-devirt.c  */
-
-struct odr_type_d;
-typedef odr_type_d *odr_type;
-void build_type_inheritance_graph (void);
-void update_type_inheritance_graph (void);
-vec <cgraph_node *>
-possible_polymorphic_call_targets (tree, HOST_WIDE_INT,
-				   ipa_polymorphic_call_context,
-				   bool *final = NULL,
-				   void **cache_token = NULL,
-				   int *nonconstruction_targets = NULL);
-odr_type get_odr_type (tree, bool insert = false);
-void dump_possible_polymorphic_call_targets (FILE *, tree, HOST_WIDE_INT,
-					     const ipa_polymorphic_call_context &);
-bool possible_polymorphic_call_target_p (tree, HOST_WIDE_INT,
-				         const ipa_polymorphic_call_context &,
-					 struct cgraph_node *n);
-tree method_class_type (tree);
-tree get_polymorphic_call_info (tree, tree, tree *,
-				HOST_WIDE_INT *,
-				ipa_polymorphic_call_context *);
-bool get_polymorphic_call_info_from_invariant (ipa_polymorphic_call_context *,
-					       tree, tree, HOST_WIDE_INT);
-tree vtable_pointer_value_to_binfo (tree t);
-bool vtable_pointer_value_to_vtable (tree, tree *, unsigned HOST_WIDE_INT *);
-
-/* Return vector containing possible targets of polymorphic call E.
-   If FINALP is non-NULL, store true if the list is complette. 
-   CACHE_TOKEN (if non-NULL) will get stored to an unique ID of entry
-   in the target cache.  If user needs to visit every target list
-   just once, it can memoize them.
-
-   Returned vector is placed into cache.  It is NOT caller's responsibility
-   to free it.  The vector can be freed on cgraph_remove_node call if
-   the particular node is a virtual function present in the cache.  */
-
-inline vec <cgraph_node *>
-possible_polymorphic_call_targets (struct cgraph_edge *e,
-				   bool *final = NULL,
-				   void **cache_token = NULL,
-				   int *nonconstruction_targets = NULL)
-{
-  gcc_checking_assert (e->indirect_info->polymorphic);
-  ipa_polymorphic_call_context context = {e->indirect_info->offset,
-					  e->indirect_info->outer_type,
-					  e->indirect_info->maybe_in_construction,
-					  e->indirect_info->maybe_derived_type};
-  return possible_polymorphic_call_targets (e->indirect_info->otr_type,
-					    e->indirect_info->otr_token,
-					    context,
-					    final, cache_token,
-					    nonconstruction_targets);
-}
-
-/* Same as above but taking OBJ_TYPE_REF as an parameter.  */
-
-inline vec <cgraph_node *>
-possible_polymorphic_call_targets (tree call,
-				   bool *final = NULL,
-				   void **cache_token = NULL)
-{
-  tree otr_type;
-  HOST_WIDE_INT otr_token;
-  ipa_polymorphic_call_context context;
-
-  get_polymorphic_call_info (current_function_decl,
-			     call,
-			     &otr_type, &otr_token, &context);
-  return possible_polymorphic_call_targets (obj_type_ref_class (call),
-					    tree_to_uhwi
-					      (OBJ_TYPE_REF_TOKEN (call)),
-					    context,
-					    final, cache_token);
-}
-
-/* Dump possible targets of a polymorphic call E into F.  */
-
-inline void
-dump_possible_polymorphic_call_targets (FILE *f, struct cgraph_edge *e)
-{
-  gcc_checking_assert (e->indirect_info->polymorphic);
-  ipa_polymorphic_call_context context = {e->indirect_info->offset,
-					  e->indirect_info->outer_type,
-					  e->indirect_info->maybe_in_construction,
-					  e->indirect_info->maybe_derived_type};
-  dump_possible_polymorphic_call_targets (f, e->indirect_info->otr_type,
-					  e->indirect_info->otr_token,
-					  context);
-}
-
-/* Return true if N can be possibly target of a polymorphic call of
-   E.  */
-
-inline bool
-possible_polymorphic_call_target_p (struct cgraph_edge *e,
-				    struct cgraph_node *n)
-{
-  ipa_polymorphic_call_context context = {e->indirect_info->offset,
-					  e->indirect_info->outer_type,
-					  e->indirect_info->maybe_in_construction,
-					  e->indirect_info->maybe_derived_type};
-  return possible_polymorphic_call_target_p (e->indirect_info->otr_type,
-					     e->indirect_info->otr_token,
-					     context, n);
-}
-
-/* Return true if N can be possibly target of a polymorphic call of
-   OBJ_TYPE_REF expression CALL.  */
-
-inline bool
-possible_polymorphic_call_target_p (tree call,
-				    struct cgraph_node *n)
-{
-  return possible_polymorphic_call_target_p (obj_type_ref_class (call),
-					     tree_to_uhwi
-					       (OBJ_TYPE_REF_TOKEN (call)),
-					     ipa_dummy_polymorphic_call_context,
-					     n);
-}
-#endif  /* GCC_IPA_UTILS_H  */
-
-
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/is-a.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/is-a.h
deleted file mode 100644
index bc756b1..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/is-a.h
+++ /dev/null
@@ -1,201 +0,0 @@
-/* Dynamic testing for abstract is-a relationships.
-   Copyright (C) 2012-2014 Free Software Foundation, Inc.
-   Contributed by Lawrence Crowl.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-
-/* This header generic type query and conversion functions.
-
-
-USING THE GENERIC TYPE FACILITY
-
-
-The user functions are:
-
-bool is_a <TYPE> (pointer)
-
-    Tests whether the pointer actually points to a more derived TYPE.
-
-    Suppose you have a symtab_node *ptr, AKA symtab_node *ptr.  You can test
-    whether it points to a 'derived' cgraph_node as follows.
-
-      if (is_a <cgraph_node> (ptr))
-        ....
-
-
-TYPE *as_a <TYPE> (pointer)
-
-    Converts pointer to a TYPE*.
-
-    You can just assume that it is such a node.
-
-      do_something_with (as_a <cgraph_node> *ptr);
-
-TYPE *dyn_cast <TYPE> (pointer)
-
-    Converts pointer to TYPE* if and only if "is_a <TYPE> pointer".  Otherwise,
-    returns NULL.  This function is essentially a checked down cast.
-
-    This functions reduce compile time and increase type safety when treating a
-    generic item as a more specific item.
-
-    You can test and obtain a pointer to the 'derived' type in one indivisible
-    operation.
-
-      if (cgraph_node *cptr = dyn_cast <cgraph_node> (ptr))
-        ....
-
-    As an example, the code change is from
-
-      if (symtab_function_p (node))
-        {
-          struct cgraph_node *cnode = cgraph (node);
-          ....
-        }
-
-    to
-
-      if (cgraph_node *cnode = dyn_cast <cgraph_node> (node))
-        {
-          ....
-        }
-
-    The necessary conditional test defines a variable that holds a known good
-    pointer to the specific item and avoids subsequent conversion calls and
-    the assertion checks that may come with them.
-
-    When, the property test is embedded within a larger condition, the
-    variable declaration gets pulled out of the condition.  (This approach
-    leaves some room for using the variable inappropriately.)
-
-      if (symtab_variable_p (node) && varpool (node)->finalized)
-        varpool_analyze_node (varpool (node));
-
-    becomes
-
-      varpool_node *vnode = dyn_cast <varpool_node> (node);
-      if (vnode && vnode->finalized)
-        varpool_analyze_node (vnode);
-
-    Note that we have converted two sets of assertions in the calls to varpool
-    into safe and efficient use of a variable.
-
-
-If you use these functions and get a 'inline function not defined' or a
-'missing symbol' error message for 'is_a_helper<....>::test', it means that
-the connection between the types has not been made.  See below.
-
-
-EXTENDING THE GENERIC TYPE FACILITY
-
-Each connection between types must be made by defining a specialization of the
-template member function 'test' of the template class 'is_a_helper'.  For
-example,
-
-  template <>
-  template <>
-  inline bool
-  is_a_helper <cgraph_node>::test (symtab_node *p)
-  {
-    return p->type == SYMTAB_FUNCTION;
-  }
-
-If a simple reinterpret_cast between the pointer types is incorrect, then you
-must also specialize the template member function 'cast'.  Failure to do so
-when needed may result in a crash.  For example,
-
-  template <>
-  template <>
-  inline bool
-  is_a_helper <cgraph_node>::cast (symtab_node *p)
-  {
-    return &p->x_function;
-  }
-
-*/
-
-#ifndef GCC_IS_A_H
-#define GCC_IS_A_H
-
-/* A generic type conversion internal helper class.  */
-
-template <typename T>
-struct is_a_helper
-{
-  template <typename U>
-  static inline bool test (U *p);
-  template <typename U>
-  static inline T *cast (U *p);
-};
-
-/* Note that we deliberately do not define the 'test' member template.  Not
-   doing so will result in a build-time error for type relationships that have
-   not been defined, rather than a run-time error.  See the discussion above
-   for when to define this member.  */
-
-/* This is the generic implementation for casting from one type to another.
-   Do not use this routine directly; it is an internal function.  See the
-   discussion above for when to define this member.  */
-
-template <typename T>
-template <typename U>
-inline T *
-is_a_helper <T>::cast (U *p)
-{
-  return reinterpret_cast <T *> (p);
-}
-
-
-/* The public interface.  */
-
-/* A generic test for a type relationship.  See the discussion above for when
-   to use this function.  The question answered is "Is type T a derived type of
-   type U?".  */
-
-template <typename T, typename U>
-inline bool
-is_a (U *p)
-{
-  return is_a_helper<T>::test (p);
-}
-
-/* A generic conversion from a base type U to a derived type T.  See the
-   discussion above for when to use this function.  */
-
-template <typename T, typename U>
-inline T *
-as_a (U *p)
-{
-  gcc_checking_assert (is_a <T> (p));
-  return is_a_helper <T>::cast (p);
-}
-
-/* A generic checked conversion from a base type U to a derived type T.  See
-   the discussion above for when to use this function.  */
-
-template <typename T, typename U>
-inline T *
-dyn_cast (U *p)
-{
-  if (is_a <T> (p))
-    return is_a_helper <T>::cast (p);
-  else
-    return static_cast <T *> (0);
-}
-
-#endif  /* GCC_IS_A_H  */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/java/java-tree.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/java/java-tree.def
deleted file mode 100644
index d0f4ce2..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/java/java-tree.def
+++ /dev/null
@@ -1,38 +0,0 @@
-/* This file contains the definitions and documentation for the
-   extra tree codes used by gcj.
-   Copyright (C) 1996-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-
-/* Shift right, logical. */
-DEFTREECODE (URSHIFT_EXPR, "urshift_expr", tcc_binary, 2)
-
-/* Return -1, 0, 1 depending on whether the first argument is
-   less, equal, or greater to the second argument. */
-DEFTREECODE (COMPARE_EXPR, "compare_expr", tcc_binary, 2)
-
-/* Same as COMPARE_EXPR, but if either value is NaN, the result is -1. */
-DEFTREECODE (COMPARE_L_EXPR, "compare_l_expr", tcc_binary, 2)
-/* Same as COMPARE_EXPR, but if either value is NaN, the result is 1. */
-DEFTREECODE (COMPARE_G_EXPR, "compare_g_expr", tcc_binary, 2)
-
-/*
-Local variables:
-mode:c
-End:
-*/
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/langhooks.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/langhooks.h
deleted file mode 100644
index b5997ee..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/langhooks.h
+++ /dev/null
@@ -1,498 +0,0 @@
-/* The lang_hooks data structure.
-   Copyright (C) 2001-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_LANG_HOOKS_H
-#define GCC_LANG_HOOKS_H
-
-/* FIXME: This file should be #include-d after tree.h (for enum tree_code).  */
-
-struct diagnostic_info;
-
-struct gimplify_omp_ctx;
-
-struct array_descr_info;
-
-/* A print hook for print_tree ().  */
-typedef void (*lang_print_tree_hook) (FILE *, tree, int indent);
-
-enum classify_record
-  { RECORD_IS_STRUCT, RECORD_IS_CLASS, RECORD_IS_INTERFACE };
-
-/* The following hooks are documented in langhooks.c.  Must not be
-   NULL.  */
-
-struct lang_hooks_for_tree_inlining
-{
-  bool (*var_mod_type_p) (tree, tree);
-};
-
-/* The following hooks are used by tree-dump.c.  */
-
-struct lang_hooks_for_tree_dump
-{
-  /* Dump language-specific parts of tree nodes.  Returns nonzero if it
-     does not want the usual dumping of the second argument.  */
-  bool (*dump_tree) (void *, tree);
-
-  /* Determine type qualifiers in a language-specific way.  */
-  int (*type_quals) (const_tree);
-};
-
-/* Hooks related to types.  */
-
-struct lang_hooks_for_types
-{
-  /* Return a new type (with the indicated CODE), doing whatever
-     language-specific processing is required.  */
-  tree (*make_type) (enum tree_code);
-
-  /* Return what kind of RECORD_TYPE this is, mainly for purposes of
-     debug information.  If not defined, record types are assumed to
-     be structures.  */
-  enum classify_record (*classify_record) (tree);
-
-  /* Given MODE and UNSIGNEDP, return a suitable type-tree with that
-     mode.  */
-  tree (*type_for_mode) (enum machine_mode, int);
-
-  /* Given PRECISION and UNSIGNEDP, return a suitable type-tree for an
-     integer type with at least that precision.  */
-  tree (*type_for_size) (unsigned, int);
-
-  /* True if the type is an instantiation of a generic type,
-     e.g. C++ template implicit specializations.  */
-  bool (*generic_p) (const_tree);
-
-  /* Returns the TREE_VEC of elements of a given generic argument pack.  */
-  tree (*get_argument_pack_elems) (const_tree);
-
-  /* Given a type, apply default promotions to unnamed function
-     arguments and return the new type.  Return the same type if no
-     change.  Required by any language that supports variadic
-     arguments.  The default hook dies.  */
-  tree (*type_promotes_to) (tree);
-
-  /* Register TYPE as a builtin type with the indicated NAME.  The
-     TYPE is placed in the outermost lexical scope.  The semantics
-     should be analogous to:
-
-       typedef TYPE NAME;
-
-     in C.  The default hook ignores the declaration.  */
-  void (*register_builtin_type) (tree, const char *);
-
-  /* This routine is called in tree.c to print an error message for
-     invalid use of an incomplete type.  VALUE is the expression that
-     was used (or 0 if that isn't known) and TYPE is the type that was
-     invalid.  */
-  void (*incomplete_type_error) (const_tree value, const_tree type);
-
-  /* Called from assign_temp to return the maximum size, if there is one,
-     for a type.  */
-  tree (*max_size) (const_tree);
-
-  /* Register language specific type size variables as potentially OpenMP
-     firstprivate variables.  */
-  void (*omp_firstprivatize_type_sizes) (struct gimplify_omp_ctx *, tree);
-
-  /* Return true if TYPE is a mappable type.  */
-  bool (*omp_mappable_type) (tree type);
-
-  /* Return TRUE if TYPE1 and TYPE2 are identical for type hashing purposes.
-     Called only after doing all language independent checks.
-     At present, this function is only called when both TYPE1 and TYPE2 are
-     FUNCTION_TYPEs.  */
-  bool (*type_hash_eq) (const_tree, const_tree);
-
-  /* Return TRUE if TYPE uses a hidden descriptor and fills in information
-     for the debugger about the array bounds, strides, etc.  */
-  bool (*get_array_descr_info) (const_tree, struct array_descr_info *);
-
-  /* Fill in information for the debugger about the bounds of TYPE.  */
-  void (*get_subrange_bounds) (const_tree, tree *, tree *);
-
-  /* A type descriptive of TYPE's complex layout generated to help the
-     debugger to decode variable-length or self-referential constructs.
-     This is only used for the AT_GNAT_descriptive_type DWARF attribute.  */
-  tree (*descriptive_type) (const_tree);
-
-  /* If we requested a pointer to a vector, build up the pointers that
-     we stripped off while looking for the inner type.  Similarly for
-     return values from functions.  The argument TYPE is the top of the
-     chain, and BOTTOM is the new type which we will point to.  */
-  tree (*reconstruct_complex_type) (tree, tree);
-};
-
-/* Language hooks related to decls and the symbol table.  */
-
-struct lang_hooks_for_decls
-{
-  /* Return true if we are in the global binding level.  This hook is really
-     needed only if the language supports variable-sized types at the global
-     level, i.e. declared outside subprograms.  */
-  bool (*global_bindings_p) (void);
-
-  /* Function to add a decl to the current scope level.  Takes one
-     argument, a decl to add.  Returns that decl, or, if the same
-     symbol is already declared, may return a different decl for that
-     name.  */
-  tree (*pushdecl) (tree);
-
-  /* Returns the chain of decls so far in the current scope level.  */
-  tree (*getdecls) (void);
-
-  /* Returns true if DECL is explicit member function.  */
-  bool (*function_decl_explicit_p) (tree);
-
-  /* Returns True if the parameter is a generic parameter decl
-     of a generic type, e.g a template template parameter for the C++ FE.  */
-  bool (*generic_generic_parameter_decl_p) (const_tree);
-
-  /* Determine if a function parameter got expanded from a
-     function parameter pack.  */
-  bool (*function_parm_expanded_from_pack_p) (tree, tree);
-
-  /* Returns the generic declaration of a generic function instantiations.  */
-  tree (*get_generic_function_decl) (const_tree);
-
-  /* Returns true when we should warn for an unused global DECL.
-     We will already have checked that it has static binding.  */
-  bool (*warn_unused_global) (const_tree);
-
-  /* Obtain a list of globals and do final output on them at end
-     of compilation */
-  void (*final_write_globals) (void);
-
-  /* True if this decl may be called via a sibcall.  */
-  bool (*ok_for_sibcall) (const_tree);
-
-  /* True if OpenMP should privatize what this DECL points to rather
-     than the DECL itself.  */
-  bool (*omp_privatize_by_reference) (const_tree);
-
-  /* Return sharing kind if OpenMP sharing attribute of DECL is
-     predetermined, OMP_CLAUSE_DEFAULT_UNSPECIFIED otherwise.  */
-  enum omp_clause_default_kind (*omp_predetermined_sharing) (tree);
-
-  /* Return decl that should be reported for DEFAULT(NONE) failure
-     diagnostics.  Usually the DECL passed in.  */
-  tree (*omp_report_decl) (tree);
-
-  /* Return true if DECL's DECL_VALUE_EXPR (if any) should be
-     disregarded in OpenMP construct, because it is going to be
-     remapped during OpenMP lowering.  SHARED is true if DECL
-     is going to be shared, false if it is going to be privatized.  */
-  bool (*omp_disregard_value_expr) (tree, bool);
-
-  /* Return true if DECL that is shared iff SHARED is true should
-     be put into OMP_CLAUSE_PRIVATE_DEBUG.  */
-  bool (*omp_private_debug_clause) (tree, bool);
-
-  /* Return true if DECL in private clause needs
-     OMP_CLAUSE_PRIVATE_OUTER_REF on the private clause.  */
-  bool (*omp_private_outer_ref) (tree);
-
-  /* Build and return code for a default constructor for DECL in
-     response to CLAUSE.  OUTER is corresponding outer region's
-     variable if needed.  Return NULL if nothing to be done.  */
-  tree (*omp_clause_default_ctor) (tree clause, tree decl, tree outer);
-
-  /* Build and return code for a copy constructor from SRC to DST.  */
-  tree (*omp_clause_copy_ctor) (tree clause, tree dst, tree src);
-
-  /* Similarly, except use an assignment operator instead.  */
-  tree (*omp_clause_assign_op) (tree clause, tree dst, tree src);
-
-  /* Build and return code for a constructor of DST that sets it to
-     SRC + ADD.  */
-  tree (*omp_clause_linear_ctor) (tree clause, tree dst, tree src, tree add);
-
-  /* Build and return code destructing DECL.  Return NULL if nothing
-     to be done.  */
-  tree (*omp_clause_dtor) (tree clause, tree decl);
-
-  /* Do language specific checking on an implicitly determined clause.  */
-  void (*omp_finish_clause) (tree clause, gimple_seq *pre_p);
-};
-
-/* Language hooks related to LTO serialization.  */
-
-struct lang_hooks_for_lto
-{
-  /* Begin a new LTO section named NAME.  */
-  void (*begin_section) (const char *name);
-
-  /* Write DATA of length LEN to the currently open LTO section.  BLOCK is a
-     pointer to the dynamically allocated memory containing DATA.  The
-     append_data function is responsible for freeing it when it is no longer
-     needed.  */
-  void (*append_data) (const void *data, size_t len, void *block);
-
-  /* End the previously begun LTO section.  */
-  void (*end_section) (void);
-};
-
-/* Language-specific hooks.  See langhooks-def.h for defaults.  */
-
-struct lang_hooks
-{
-  /* String identifying the front end.  e.g. "GNU C++".  */
-  const char *name;
-
-  /* sizeof (struct lang_identifier), so make_node () creates
-     identifier nodes long enough for the language-specific slots.  */
-  size_t identifier_size;
-
-  /* Remove any parts of the tree that are used only by the FE. */
-  void (*free_lang_data) (tree);
-
-  /* Determines the size of any language-specific tcc_constant or
-     tcc_exceptional nodes.  Since it is called from make_node, the
-     only information available is the tree code.  Expected to die
-     on unrecognized codes.  */
-  size_t (*tree_size) (enum tree_code);
-
-  /* Return the language mask used for converting argv into a sequence
-     of options.  */
-  unsigned int (*option_lang_mask) (void);
-
-  /* Initialize variables in an options structure.  */
-  void (*init_options_struct) (struct gcc_options *opts);
-
-  /* After the initialize_diagnostics hook is called, do any simple
-     initialization needed before any calls to handle_option, other
-     than that done by the init_options_struct hook.  */
-  void (*init_options) (unsigned int decoded_options_count,
-			struct cl_decoded_option *decoded_options);
-
-  /* Callback used to perform language-specific initialization for the
-     global diagnostic context structure.  */
-  void (*initialize_diagnostics) (diagnostic_context *);
-
-  /* Return true if a warning should be given about option OPTION,
-     which is for the wrong language, false if it should be quietly
-     ignored.  */
-  bool (*complain_wrong_lang_p) (const struct cl_option *option);
-
-  /* Handle the switch CODE, which has real type enum opt_code from
-     options.h.  If the switch takes an argument, it is passed in ARG
-     which points to permanent storage.  The handler is responsible for
-     checking whether ARG is NULL, which indicates that no argument
-     was in fact supplied.  For -f and -W switches, VALUE is 1 or 0
-     for the positive and negative forms respectively.  HANDLERS should
-     be passed to any recursive handle_option calls.  LOC is the
-     location of the option.
-
-     Return true if the switch is valid, false if invalid.  */
-  bool (*handle_option) (size_t code, const char *arg, int value, int kind,
-			 location_t loc,
-			 const struct cl_option_handlers *handlers);
-
-  /* Called when all command line options have been parsed to allow
-     further processing and initialization
-
-     Should return true to indicate that a compiler back-end is
-     not required, such as with the -E option.
-
-     If errorcount is nonzero after this call the compiler exits
-     immediately and the finish hook is not called.  */
-  bool (*post_options) (const char **);
-
-  /* Called after post_options to initialize the front end.  Return
-     false to indicate that no further compilation be performed, in
-     which case the finish hook is called immediately.  */
-  bool (*init) (void);
-
-  /* Called at the end of compilation, as a finalizer.  */
-  void (*finish) (void);
-
-  /* Parses the entire file.  */
-  void (*parse_file) (void);
-
-  /* Determines if it's ok for a function to have no noreturn attribute.  */
-  bool (*missing_noreturn_ok_p) (tree);
-
-  /* Called to obtain the alias set to be used for an expression or type.
-     Returns -1 if the language does nothing special for it.  */
-  alias_set_type (*get_alias_set) (tree);
-
-  /* Function to finish handling an incomplete decl at the end of
-     compilation.  Default hook is does nothing.  */
-  void (*finish_incomplete_decl) (tree);
-
-  /* Replace the DECL_LANG_SPECIFIC data, which may be NULL, of the
-     DECL_NODE with a newly GC-allocated copy.  */
-  void (*dup_lang_specific_decl) (tree);
-
-  /* Set the DECL_ASSEMBLER_NAME for a node.  If it is the sort of
-     thing that the assembler should talk about, set
-     DECL_ASSEMBLER_NAME to an appropriate IDENTIFIER_NODE.
-     Otherwise, set it to the ERROR_MARK_NODE to ensure that the
-     assembler does not talk about it.  */
-  void (*set_decl_assembler_name) (tree);
-
-  /* The front end can add its own statistics to -fmem-report with
-     this hook.  It should output to stderr.  */
-  void (*print_statistics) (void);
-
-  /* Called by print_tree when there is a tree of class tcc_exceptional
-     that it doesn't know how to display.  */
-  lang_print_tree_hook print_xnode;
-
-  /* Called to print language-dependent parts of tcc_decl, tcc_type,
-     and IDENTIFIER_NODE nodes.  */
-  lang_print_tree_hook print_decl;
-  lang_print_tree_hook print_type;
-  lang_print_tree_hook print_identifier;
-
-  /* Computes the name to use to print a declaration.  DECL is the
-     non-NULL declaration in question.  VERBOSITY determines what
-     information will be printed: 0: DECL_NAME, demangled as
-     necessary.  1: and scope information.  2: and any other
-     information that might be interesting, such as function parameter
-     types in C++.  The name is in the internal character set and
-     needs to be converted to the locale character set of diagnostics,
-     or to the execution character set for strings such as
-     __PRETTY_FUNCTION__.  */
-  const char *(*decl_printable_name) (tree decl, int verbosity);
-
-  /* Computes the dwarf-2/3 name for a tree.  VERBOSITY determines what
-     information will be printed: 0: DECL_NAME, demangled as
-     necessary.  1: and scope information.  */
-  const char *(*dwarf_name) (tree, int verbosity);
-
-  /* This compares two types for equivalence ("compatible" in C-based languages).
-     This routine should only return 1 if it is sure.  It should not be used
-     in contexts where erroneously returning 0 causes problems.  */
-  int (*types_compatible_p) (tree x, tree y);
-
-  /* Called by report_error_function to print out function name.  */
-  void (*print_error_function) (diagnostic_context *, const char *,
-				struct diagnostic_info *);
-
-  /* Convert a character from the host's to the target's character
-     set.  The character should be in what C calls the "basic source
-     character set" (roughly, the set of characters defined by plain
-     old ASCII).  The default is to return the character unchanged,
-     which is correct in most circumstances.  Note that both argument
-     and result should be sign-extended under -fsigned-char,
-     zero-extended under -fno-signed-char.  */
-  HOST_WIDE_INT (*to_target_charset) (HOST_WIDE_INT);
-
-  /* Pointers to machine-independent attribute tables, for front ends
-     using attribs.c.  If one is NULL, it is ignored.  Respectively, a
-     table of attributes specific to the language, a table of
-     attributes common to two or more languages (to allow easy
-     sharing), and a table of attributes for checking formats.  */
-  const struct attribute_spec *attribute_table;
-  const struct attribute_spec *common_attribute_table;
-  const struct attribute_spec *format_attribute_table;
-
-  struct lang_hooks_for_tree_inlining tree_inlining;
-
-  struct lang_hooks_for_tree_dump tree_dump;
-
-  struct lang_hooks_for_decls decls;
-
-  struct lang_hooks_for_types types;
-  
-  struct lang_hooks_for_lto lto;
-
-  /* Returns a TREE_VEC of the generic parameters of an instantiation of
-     a generic type or decl, e.g. C++ template instantiation.  If
-     TREE_CHAIN of the return value is set, it is an INTEGER_CST
-     indicating how many of the elements are non-default.  */
-  tree (*get_innermost_generic_parms) (const_tree);
-
-  /* Returns the TREE_VEC of arguments of an instantiation
-     of a generic type of decl, e.g. C++ template instantiation.  */
-  tree (*get_innermost_generic_args) (const_tree);
-
-  /* Determine if a tree is a function parameter pack.  */
-  bool (*function_parameter_pack_p) (const_tree);
-
-  /* Perform language-specific gimplification on the argument.  Returns an
-     enum gimplify_status, though we can't see that type here.  */
-  int (*gimplify_expr) (tree *, gimple_seq *, gimple_seq *);
-
-  /* Do language specific processing in the builtin function DECL  */
-  tree (*builtin_function) (tree decl);
-
-  /* Like builtin_function, but make sure the scope is the external scope.
-     This is used to delay putting in back end builtin functions until the ISA
-     that defines the builtin is declared via function specific target options,
-     which can save memory for machines like the x86_64 that have multiple
-     ISAs.  If this points to the same function as builtin_function, the
-     backend must add all of the builtins at program initialization time.  */
-  tree (*builtin_function_ext_scope) (tree decl);
-
-  /* Used to set up the tree_contains_structure array for a frontend. */
-  void (*init_ts) (void);
-
-  /* Called by recompute_tree_invariant_for_addr_expr to go from EXPR
-     to a contained expression or DECL, possibly updating *TC or *SE
-     if in the process TREE_CONSTANT or TREE_SIDE_EFFECTS need updating.  */
-  tree (*expr_to_decl) (tree expr, bool *tc, bool *se);
-
-  /* The EH personality function decl.  */
-  tree (*eh_personality) (void);
-
-  /* Map a type to a runtime object to match type.  */
-  tree (*eh_runtime_type) (tree);
-
-  /* If non-NULL, this is a function that returns a function decl to be
-     executed if an unhandled exception is propagated out of a cleanup
-     region.  For example, in C++, an exception thrown by a destructor
-     during stack unwinding is required to result in a call to
-     `std::terminate', so the C++ version of this function returns a
-     FUNCTION_DECL for `std::terminate'.  */
-  tree (*eh_protect_cleanup_actions) (void);
-
-  /* Return true if a stmt can fallthru.  Used by block_may_fallthru
-     to possibly handle language trees.  */
-  bool (*block_may_fallthru) (const_tree);
-
-  /* True if this language uses __cxa_end_cleanup when the ARM EABI
-     is enabled.  */
-  bool eh_use_cxa_end_cleanup;
-
-  /* True if this language requires deep unsharing of tree nodes prior to
-     gimplification.  */
-  bool deep_unsharing;
-
-  /* Whenever you add entries here, make sure you adjust langhooks-def.h
-     and langhooks.c accordingly.  */
-};
-
-/* Each front end provides its own.  */
-extern struct lang_hooks lang_hooks;
-
-extern tree add_builtin_function (const char *name, tree type,
-				  int function_code, enum built_in_class cl,
-				  const char *library_name,
-				  tree attrs);
-
-extern tree add_builtin_function_ext_scope (const char *name, tree type,
-					    int function_code,
-					    enum built_in_class cl,
-					    const char *library_name,
-					    tree attrs);
-extern tree add_builtin_type (const char *name, tree type);
- 
-#endif /* GCC_LANG_HOOKS_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/libiberty.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/libiberty.h
deleted file mode 100644
index 78c42eb..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/libiberty.h
+++ /dev/null
@@ -1,686 +0,0 @@
-/* Function declarations for libiberty.
-
-   Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
-   2006, 2007, 2008, 2009, 2010, 2011, 2013 Free Software Foundation, Inc.
-   
-   Note - certain prototypes declared in this header file are for
-   functions whoes implementation copyright does not belong to the
-   FSF.  Those prototypes are present in this file for reference
-   purposes only and their presence in this file should not construed
-   as an indication of ownership by the FSF of the implementation of
-   those functions in any way or form whatsoever.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street - Fifth Floor,
-   Boston, MA 02110-1301, USA.
-   
-   Written by Cygnus Support, 1994.
-
-   The libiberty library provides a number of functions which are
-   missing on some operating systems.  We do not declare those here,
-   to avoid conflicts with the system header files on operating
-   systems that do support those functions.  In this file we only
-   declare those functions which are specific to libiberty.  */
-
-#ifndef LIBIBERTY_H
-#define LIBIBERTY_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "ansidecl.h"
-
-/* Get a definition for size_t.  */
-#include <stddef.h>
-/* Get a definition for va_list.  */
-#include <stdarg.h>
-
-#include <stdio.h>
-
-/* If the OS supports it, ensure that the supplied stream is setup to
-   avoid any multi-threaded locking.  Otherwise leave the FILE pointer
-   unchanged.  If the stream is NULL do nothing.  */
-
-extern void unlock_stream (FILE *);
-
-/* If the OS supports it, ensure that the standard I/O streams, stdin,
-   stdout and stderr are setup to avoid any multi-threaded locking.
-   Otherwise do nothing.  */
-
-extern void unlock_std_streams (void);
-
-/* Open and return a FILE pointer.  If the OS supports it, ensure that
-   the stream is setup to avoid any multi-threaded locking.  Otherwise
-   return the FILE pointer unchanged.  */
-
-extern FILE *fopen_unlocked (const char *, const char *);
-extern FILE *fdopen_unlocked (int, const char *);
-extern FILE *freopen_unlocked (const char *, const char *, FILE *);
-
-/* Build an argument vector from a string.  Allocates memory using
-   malloc.  Use freeargv to free the vector.  */
-
-extern char **buildargv (const char *) ATTRIBUTE_MALLOC;
-
-/* Free a vector returned by buildargv.  */
-
-extern void freeargv (char **);
-
-/* Duplicate an argument vector. Allocates memory using malloc.  Use
-   freeargv to free the vector.  */
-
-extern char **dupargv (char **) ATTRIBUTE_MALLOC;
-
-/* Expand "@file" arguments in argv.  */
-
-extern void expandargv (int *, char ***);
-
-/* Write argv to an @-file, inserting necessary quoting.  */
-
-extern int writeargv (char **, FILE *);
-
-/* Return the number of elements in argv.  */
-
-extern int countargv (char**);
-
-/* Return the last component of a path name.  Note that we can't use a
-   prototype here because the parameter is declared inconsistently
-   across different systems, sometimes as "char *" and sometimes as
-   "const char *" */
-
-/* HAVE_DECL_* is a three-state macro: undefined, 0 or 1.  If it is
-   undefined, we haven't run the autoconf check so provide the
-   declaration without arguments.  If it is 0, we checked and failed
-   to find the declaration so provide a fully prototyped one.  If it
-   is 1, we found it so don't provide any declaration at all.  */
-#if !HAVE_DECL_BASENAME
-#if defined (__GNU_LIBRARY__ ) || defined (__linux__) || defined (__FreeBSD__) || defined (__OpenBSD__) || defined(__NetBSD__) || defined (__CYGWIN__) || defined (__CYGWIN32__) || defined (__MINGW32__) || defined (HAVE_DECL_BASENAME)
-extern char *basename (const char *) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_NONNULL(1);
-#else
-/* Do not allow basename to be used if there is no prototype seen.  We
-   either need to use the above prototype or have one from
-   autoconf which would result in HAVE_DECL_BASENAME being set.  */
-#define basename basename_cannot_be_used_without_a_prototype
-#endif
-#endif
-
-/* A well-defined basename () that is always compiled in.  */
-
-extern const char *lbasename (const char *) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_NONNULL(1);
-
-/* Same, but assumes DOS semantics (drive name, backslash is also a
-   dir separator) regardless of host.  */
-
-extern const char *dos_lbasename (const char *) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_NONNULL(1);
-
-/* Same, but assumes Unix semantics (absolute paths always start with
-   a slash, only forward slash is accepted as dir separator)
-   regardless of host.  */
-
-extern const char *unix_lbasename (const char *) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_NONNULL(1);
-
-/* A well-defined realpath () that is always compiled in.  */
-
-extern char *lrealpath (const char *);
-
-/* Concatenate an arbitrary number of strings.  You must pass NULL as
-   the last argument of this function, to terminate the list of
-   strings.  Allocates memory using xmalloc.  */
-
-extern char *concat (const char *, ...) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_SENTINEL;
-
-/* Concatenate an arbitrary number of strings.  You must pass NULL as
-   the last argument of this function, to terminate the list of
-   strings.  Allocates memory using xmalloc.  The first argument is
-   not one of the strings to be concatenated, but if not NULL is a
-   pointer to be freed after the new string is created, similar to the
-   way xrealloc works.  */
-
-extern char *reconcat (char *, const char *, ...) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_SENTINEL;
-
-/* Determine the length of concatenating an arbitrary number of
-   strings.  You must pass NULL as the last argument of this function,
-   to terminate the list of strings.  */
-
-extern unsigned long concat_length (const char *, ...) ATTRIBUTE_SENTINEL;
-
-/* Concatenate an arbitrary number of strings into a SUPPLIED area of
-   memory.  You must pass NULL as the last argument of this function,
-   to terminate the list of strings.  The supplied memory is assumed
-   to be large enough.  */
-
-extern char *concat_copy (char *, const char *, ...) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_NONNULL(1) ATTRIBUTE_SENTINEL;
-
-/* Concatenate an arbitrary number of strings into a GLOBAL area of
-   memory.  You must pass NULL as the last argument of this function,
-   to terminate the list of strings.  The supplied memory is assumed
-   to be large enough.  */
-
-extern char *concat_copy2 (const char *, ...) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_SENTINEL;
-
-/* This is the global area used by concat_copy2.  */
-
-extern char *libiberty_concat_ptr;
-
-/* Concatenate an arbitrary number of strings.  You must pass NULL as
-   the last argument of this function, to terminate the list of
-   strings.  Allocates memory using alloca.  The arguments are
-   evaluated twice!  */
-#define ACONCAT(ACONCAT_PARAMS) \
-  (libiberty_concat_ptr = (char *) alloca (concat_length ACONCAT_PARAMS + 1), \
-   concat_copy2 ACONCAT_PARAMS)
-
-/* Check whether two file descriptors refer to the same file.  */
-
-extern int fdmatch (int fd1, int fd2);
-
-/* Return the position of the first bit set in the argument.  */
-/* Prototypes vary from system to system, so we only provide a
-   prototype on systems where we know that we need it.  */
-#if defined (HAVE_DECL_FFS) && !HAVE_DECL_FFS
-extern int ffs(int);
-#endif
-
-/* Get the working directory.  The result is cached, so don't call
-   chdir() between calls to getpwd().  */
-
-extern char * getpwd (void);
-
-/* Get the current time.  */
-/* Prototypes vary from system to system, so we only provide a
-   prototype on systems where we know that we need it.  */
-#ifdef __MINGW32__
-/* Forward declaration to avoid #include <sys/time.h>.   */
-struct timeval;
-extern int gettimeofday (struct timeval *, void *); 
-#endif
-
-/* Get the amount of time the process has run, in microseconds.  */
-
-extern long get_run_time (void);
-
-/* Generate a relocated path to some installation directory.  Allocates
-   return value using malloc.  */
-
-extern char *make_relative_prefix (const char *, const char *,
-                                   const char *) ATTRIBUTE_MALLOC;
-
-/* Generate a relocated path to some installation directory without
-   attempting to follow any soft links.  Allocates
-   return value using malloc.  */
-
-extern char *make_relative_prefix_ignore_links (const char *, const char *,
-						const char *) ATTRIBUTE_MALLOC;
-
-/* Choose a temporary directory to use for scratch files.  */
-
-extern char *choose_temp_base (void) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL;
-
-/* Return a temporary file name or NULL if unable to create one.  */
-
-extern char *make_temp_file (const char *) ATTRIBUTE_MALLOC;
-
-/* Remove a link to a file unless it is special. */
-
-extern int unlink_if_ordinary (const char *);
-
-/* Allocate memory filled with spaces.  Allocates using malloc.  */
-
-extern const char *spaces (int count);
-
-/* Return the maximum error number for which strerror will return a
-   string.  */
-
-extern int errno_max (void);
-
-/* Return the name of an errno value (e.g., strerrno (EINVAL) returns
-   "EINVAL").  */
-
-extern const char *strerrno (int);
-
-/* Given the name of an errno value, return the value.  */
-
-extern int strtoerrno (const char *);
-
-/* ANSI's strerror(), but more robust.  */
-
-extern char *xstrerror (int) ATTRIBUTE_RETURNS_NONNULL;
-
-/* Return the maximum signal number for which strsignal will return a
-   string.  */
-
-extern int signo_max (void);
-
-/* Return a signal message string for a signal number
-   (e.g., strsignal (SIGHUP) returns something like "Hangup").  */
-/* This is commented out as it can conflict with one in system headers.
-   We still document its existence though.  */
-
-/*extern const char *strsignal (int);*/
-
-/* Return the name of a signal number (e.g., strsigno (SIGHUP) returns
-   "SIGHUP").  */
-
-extern const char *strsigno (int);
-
-/* Given the name of a signal, return its number.  */
-
-extern int strtosigno (const char *);
-
-/* Register a function to be run by xexit.  Returns 0 on success.  */
-
-extern int xatexit (void (*fn) (void));
-
-/* Exit, calling all the functions registered with xatexit.  */
-
-extern void xexit (int status) ATTRIBUTE_NORETURN;
-
-/* Set the program name used by xmalloc.  */
-
-extern void xmalloc_set_program_name (const char *);
-
-/* Report an allocation failure.  */
-extern void xmalloc_failed (size_t) ATTRIBUTE_NORETURN;
-
-/* Allocate memory without fail.  If malloc fails, this will print a
-   message to stderr (using the name set by xmalloc_set_program_name,
-   if any) and then call xexit.  */
-
-extern void *xmalloc (size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL;
-
-/* Reallocate memory without fail.  This works like xmalloc.  Note,
-   realloc type functions are not suitable for attribute malloc since
-   they may return the same address across multiple calls. */
-
-extern void *xrealloc (void *, size_t) ATTRIBUTE_RETURNS_NONNULL;
-
-/* Allocate memory without fail and set it to zero.  This works like
-   xmalloc.  */
-
-extern void *xcalloc (size_t, size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL;
-
-/* Copy a string into a memory buffer without fail.  */
-
-extern char *xstrdup (const char *) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL;
-
-/* Copy at most N characters from string into a buffer without fail.  */
-
-extern char *xstrndup (const char *, size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL;
-
-/* Copy an existing memory buffer to a new memory buffer without fail.  */
-
-extern void *xmemdup (const void *, size_t, size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL;
-
-/* Physical memory routines.  Return values are in BYTES.  */
-extern double physmem_total (void);
-extern double physmem_available (void);
-
-/* Compute the 32-bit CRC of a block of memory.  */
-extern unsigned int xcrc32 (const unsigned char *, int, unsigned int);
-
-/* These macros provide a K&R/C89/C++-friendly way of allocating structures
-   with nice encapsulation.  The XDELETE*() macros are technically
-   superfluous, but provided here for symmetry.  Using them consistently
-   makes it easier to update client code to use different allocators such
-   as new/delete and new[]/delete[].  */
-
-/* Scalar allocators.  */
-
-#define XALLOCA(T)		((T *) alloca (sizeof (T)))
-#define XNEW(T)			((T *) xmalloc (sizeof (T)))
-#define XCNEW(T)		((T *) xcalloc (1, sizeof (T)))
-#define XDUP(T, P)		((T *) xmemdup ((P), sizeof (T), sizeof (T)))
-#define XDELETE(P)		free ((void*) (P))
-
-/* Array allocators.  */
-
-#define XALLOCAVEC(T, N)	((T *) alloca (sizeof (T) * (N)))
-#define XNEWVEC(T, N)		((T *) xmalloc (sizeof (T) * (N)))
-#define XCNEWVEC(T, N)		((T *) xcalloc ((N), sizeof (T)))
-#define XDUPVEC(T, P, N)	((T *) xmemdup ((P), sizeof (T) * (N), sizeof (T) * (N)))
-#define XRESIZEVEC(T, P, N)	((T *) xrealloc ((void *) (P), sizeof (T) * (N)))
-#define XDELETEVEC(P)		free ((void*) (P))
-
-/* Allocators for variable-sized structures and raw buffers.  */
-
-#define XALLOCAVAR(T, S)	((T *) alloca ((S)))
-#define XNEWVAR(T, S)		((T *) xmalloc ((S)))
-#define XCNEWVAR(T, S)		((T *) xcalloc (1, (S)))
-#define XDUPVAR(T, P, S1, S2)	((T *) xmemdup ((P), (S1), (S2)))
-#define XRESIZEVAR(T, P, S)	((T *) xrealloc ((P), (S)))
-
-/* Type-safe obstack allocator.  */
-
-#define XOBNEW(O, T)		((T *) obstack_alloc ((O), sizeof (T)))
-#define XOBNEWVEC(O, T, N)	((T *) obstack_alloc ((O), sizeof (T) * (N)))
-#define XOBNEWVAR(O, T, S)	((T *) obstack_alloc ((O), (S)))
-#define XOBFINISH(O, T)         ((T) obstack_finish ((O)))
-
-/* hex character manipulation routines */
-
-#define _hex_array_size 256
-#define _hex_bad	99
-extern const unsigned char _hex_value[_hex_array_size];
-extern void hex_init (void);
-#define hex_p(c)	(hex_value (c) != _hex_bad)
-/* If you change this, note well: Some code relies on side effects in
-   the argument being performed exactly once.  */
-#define hex_value(c)	((unsigned int) _hex_value[(unsigned char) (c)])
-
-/* Flags for pex_init.  These are bits to be or'ed together.  */
-
-/* Record subprocess times, if possible.  */
-#define PEX_RECORD_TIMES	0x1
-
-/* Use pipes for communication between processes, if possible.  */
-#define PEX_USE_PIPES		0x2
-
-/* Save files used for communication between processes.  */
-#define PEX_SAVE_TEMPS		0x4
-
-/* Prepare to execute one or more programs, with standard output of
-   each program fed to standard input of the next.
-   FLAGS	As above.
-   PNAME	The name of the program to report in error messages.
-   TEMPBASE	A base name to use for temporary files; may be NULL to
-   		use a random name.
-   Returns NULL on error.  */
-
-extern struct pex_obj *pex_init (int flags, const char *pname,
-				 const char *tempbase) ATTRIBUTE_RETURNS_NONNULL;
-
-/* Flags for pex_run.  These are bits to be or'ed together.  */
-
-/* Last program in pipeline.  Standard output of program goes to
-   OUTNAME, or, if OUTNAME is NULL, to standard output of caller.  Do
-   not set this if you want to call pex_read_output.  After this is
-   set, pex_run may no longer be called with the same struct
-   pex_obj.  */
-#define PEX_LAST		0x1
-
-/* Search for program in executable search path.  */
-#define PEX_SEARCH		0x2
-
-/* OUTNAME is a suffix.  */
-#define PEX_SUFFIX		0x4
-
-/* Send program's standard error to standard output.  */
-#define PEX_STDERR_TO_STDOUT	0x8
-
-/* Input file should be opened in binary mode.  This flag is ignored
-   on Unix.  */
-#define PEX_BINARY_INPUT	0x10
-
-/* Output file should be opened in binary mode.  This flag is ignored
-   on Unix.  For proper behaviour PEX_BINARY_INPUT and
-   PEX_BINARY_OUTPUT have to match appropriately--i.e., a call using
-   PEX_BINARY_OUTPUT should be followed by a call using
-   PEX_BINARY_INPUT.  */
-#define PEX_BINARY_OUTPUT	0x20
-
-/* Capture stderr to a pipe.  The output can be read by
-   calling pex_read_err and reading from the returned
-   FILE object.  This flag may be specified only for
-   the last program in a pipeline.  
-
-   This flag is supported only on Unix and Windows.  */
-#define PEX_STDERR_TO_PIPE	0x40
-
-/* Capture stderr in binary mode.  This flag is ignored
-   on Unix.  */
-#define PEX_BINARY_ERROR	0x80
-
-
-/* Execute one program.  Returns NULL on success.  On error returns an
-   error string (typically just the name of a system call); the error
-   string is statically allocated.
-
-   OBJ		Returned by pex_init.
-
-   FLAGS	As above.
-
-   EXECUTABLE	The program to execute.
-
-   ARGV		NULL terminated array of arguments to pass to the program.
-
-   OUTNAME	Sets the output file name as follows:
-
-		PEX_SUFFIX set (OUTNAME may not be NULL):
-		  TEMPBASE parameter to pex_init not NULL:
-		    Output file name is the concatenation of TEMPBASE
-		    and OUTNAME.
-		  TEMPBASE is NULL:
-		    Output file name is a random file name ending in
-		    OUTNAME.
-		PEX_SUFFIX not set:
-		  OUTNAME not NULL:
-		    Output file name is OUTNAME.
-		  OUTNAME NULL, TEMPBASE not NULL:
-		    Output file name is randomly chosen using
-		    TEMPBASE.
-		  OUTNAME NULL, TEMPBASE NULL:
-		    Output file name is randomly chosen.
-
-		If PEX_LAST is not set, the output file name is the
-   		name to use for a temporary file holding stdout, if
-   		any (there will not be a file if PEX_USE_PIPES is set
-   		and the system supports pipes).  If a file is used, it
-   		will be removed when no longer needed unless
-   		PEX_SAVE_TEMPS is set.
-
-		If PEX_LAST is set, and OUTNAME is not NULL, standard
-   		output is written to the output file name.  The file
-   		will not be removed.  If PEX_LAST and PEX_SUFFIX are
-   		both set, TEMPBASE may not be NULL.
-
-   ERRNAME	If not NULL, this is the name of a file to which
-		standard error is written.  If NULL, standard error of
-		the program is standard error of the caller.
-
-   ERR		On an error return, *ERR is set to an errno value, or
-   		to 0 if there is no relevant errno.
-*/
-
-extern const char *pex_run (struct pex_obj *obj, int flags,
-			    const char *executable, char * const *argv,
-			    const char *outname, const char *errname,
-			    int *err);
-
-/* As for pex_run (), but takes an extra parameter to enable the
-   environment for the child process to be specified.
-
-   ENV		The environment for the child process, specified as
-		an array of character pointers.  Each element of the
-		array should point to a string of the form VAR=VALUE,
-                with the exception of the last element which must be
-                a null pointer.
-*/
-
-extern const char *pex_run_in_environment (struct pex_obj *obj, int flags,
-			                   const char *executable,
-                                           char * const *argv,
-                                           char * const *env,
-              	          		   const char *outname,
-					   const char *errname, int *err);
-
-/* Return a stream for a temporary file to pass to the first program
-   in the pipeline as input.  The file name is chosen as for pex_run.
-   pex_run closes the file automatically; don't close it yourself.  */
-
-extern FILE *pex_input_file (struct pex_obj *obj, int flags,
-                             const char *in_name);
-
-/* Return a stream for a pipe connected to the standard input of the
-   first program in the pipeline.  You must have passed
-   `PEX_USE_PIPES' to `pex_init'.  Close the returned stream
-   yourself.  */
-
-extern FILE *pex_input_pipe (struct pex_obj *obj, int binary);
-
-/* Read the standard output of the last program to be executed.
-   pex_run can not be called after this.  BINARY should be non-zero if
-   the file should be opened in binary mode; this is ignored on Unix.
-   Returns NULL on error.  Don't call fclose on the returned FILE; it
-   will be closed by pex_free.  */
-
-extern FILE *pex_read_output (struct pex_obj *, int binary);
-
-/* Read the standard error of the last program to be executed.
-   pex_run can not be called after this.  BINARY should be non-zero if
-   the file should be opened in binary mode; this is ignored on Unix.
-   Returns NULL on error.  Don't call fclose on the returned FILE; it
-   will be closed by pex_free.  */
-
-extern FILE *pex_read_err (struct pex_obj *, int binary);
-
-/* Return exit status of all programs in VECTOR.  COUNT indicates the
-   size of VECTOR.  The status codes in the vector are in the order of
-   the calls to pex_run.  Returns 0 on error, 1 on success.  */
-
-extern int pex_get_status (struct pex_obj *, int count, int *vector);
-
-/* Return times of all programs in VECTOR.  COUNT indicates the size
-   of VECTOR.  struct pex_time is really just struct timeval, but that
-   is not portable to all systems.  Returns 0 on error, 1 on
-   success.  */
-
-struct pex_time
-{
-  unsigned long user_seconds;
-  unsigned long user_microseconds;
-  unsigned long system_seconds;
-  unsigned long system_microseconds;
-};
-
-extern int pex_get_times (struct pex_obj *, int count,
-			  struct pex_time *vector);
-
-/* Clean up a pex_obj.  If you have not called pex_get_times or
-   pex_get_status, this will try to kill the subprocesses.  */
-
-extern void pex_free (struct pex_obj *);
-
-/* Just execute one program.  Return value is as for pex_run.
-   FLAGS	Combination of PEX_SEARCH and PEX_STDERR_TO_STDOUT.
-   EXECUTABLE	As for pex_run.
-   ARGV		As for pex_run.
-   PNAME	As for pex_init.
-   OUTNAME	As for pex_run when PEX_LAST is set.
-   ERRNAME	As for pex_run.
-   STATUS	Set to exit status on success.
-   ERR		As for pex_run.
-*/
-
-extern const char *pex_one (int flags, const char *executable,
-			    char * const *argv, const char *pname,
-			    const char *outname, const char *errname,
-			    int *status, int *err);
-
-/* pexecute and pwait are the old pexecute interface, still here for
-   backward compatibility.  Don't use these for new code.  Instead,
-   use pex_init/pex_run/pex_get_status/pex_free, or pex_one.  */
-
-/* Definitions used by the pexecute routine.  */
-
-#define PEXECUTE_FIRST   1
-#define PEXECUTE_LAST    2
-#define PEXECUTE_ONE     (PEXECUTE_FIRST + PEXECUTE_LAST)
-#define PEXECUTE_SEARCH  4
-#define PEXECUTE_VERBOSE 8
-
-/* Execute a program.  */
-
-extern int pexecute (const char *, char * const *, const char *,
-                     const char *, char **, char **, int);
-
-/* Wait for pexecute to finish.  */
-
-extern int pwait (int, int *, int);
-
-#if !HAVE_DECL_ASPRINTF
-/* Like sprintf but provides a pointer to malloc'd storage, which must
-   be freed by the caller.  */
-
-extern int asprintf (char **, const char *, ...) ATTRIBUTE_PRINTF_2;
-#endif
-
-#if !HAVE_DECL_VASPRINTF
-/* Like vsprintf but provides a pointer to malloc'd storage, which
-   must be freed by the caller.  */
-
-extern int vasprintf (char **, const char *, va_list) ATTRIBUTE_PRINTF(2,0);
-#endif
-
-#if defined(HAVE_DECL_SNPRINTF) && !HAVE_DECL_SNPRINTF
-/* Like sprintf but prints at most N characters.  */
-extern int snprintf (char *, size_t, const char *, ...) ATTRIBUTE_PRINTF_3;
-#endif
-
-#if defined(HAVE_DECL_VSNPRINTF) && !HAVE_DECL_VSNPRINTF
-/* Like vsprintf but prints at most N characters.  */
-extern int vsnprintf (char *, size_t, const char *, va_list) ATTRIBUTE_PRINTF(3,0);
-#endif
-
-#if defined(HAVE_DECL_STRVERSCMP) && !HAVE_DECL_STRVERSCMP
-/* Compare version strings.  */
-extern int strverscmp (const char *, const char *);
-#endif
-
-/* Set the title of a process */
-extern void setproctitle (const char *name, ...);
-
-/* Increase stack limit if possible.  */
-extern void stack_limit_increase (unsigned long);
-
-#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
-
-/* Drastically simplified alloca configurator.  If we're using GCC,
-   we use __builtin_alloca; otherwise we use the C alloca.  The C
-   alloca is always available.  You can override GCC by defining
-   USE_C_ALLOCA yourself.  The canonical autoconf macro C_ALLOCA is
-   also set/unset as it is often used to indicate whether code needs
-   to call alloca(0).  */
-extern void *C_alloca (size_t) ATTRIBUTE_MALLOC;
-#undef alloca
-#if GCC_VERSION >= 2000 && !defined USE_C_ALLOCA
-# define alloca(x) __builtin_alloca(x)
-# undef C_ALLOCA
-# define ASTRDUP(X) \
-  (__extension__ ({ const char *const libiberty_optr = (X); \
-   const unsigned long libiberty_len = strlen (libiberty_optr) + 1; \
-   char *const libiberty_nptr = (char *const) alloca (libiberty_len); \
-   (char *) memcpy (libiberty_nptr, libiberty_optr, libiberty_len); }))
-#else
-# define alloca(x) C_alloca(x)
-# undef USE_C_ALLOCA
-# define USE_C_ALLOCA 1
-# undef C_ALLOCA
-# define C_ALLOCA 1
-extern const char *libiberty_optr;
-extern char *libiberty_nptr;
-extern unsigned long libiberty_len;
-# define ASTRDUP(X) \
-  (libiberty_optr = (X), \
-   libiberty_len = strlen (libiberty_optr) + 1, \
-   libiberty_nptr = (char *) alloca (libiberty_len), \
-   (char *) memcpy (libiberty_nptr, libiberty_optr, libiberty_len))
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* ! defined (LIBIBERTY_H) */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/line-map.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/line-map.h
deleted file mode 100644
index 9886314..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/line-map.h
+++ /dev/null
@@ -1,785 +0,0 @@
-/* Map logical line numbers to (source file, line number) pairs.
-   Copyright (C) 2001-2014 Free Software Foundation, Inc.
-
-This program is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3, 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.
-
- In other words, you are welcome to use, share and improve this program.
- You are forbidden to forbid anyone else to use, share and improve
- what you give them.   Help stamp out software-hoarding!  */
-
-#ifndef LIBCPP_LINE_MAP_H
-#define LIBCPP_LINE_MAP_H
-
-#ifndef GTY
-#define GTY(x) /* nothing */
-#endif
-
-/* Reason for creating a new line map with linemap_add.  LC_ENTER is
-   when including a new file, e.g. a #include directive in C.
-   LC_LEAVE is when reaching a file's end.  LC_RENAME is when a file
-   name or line number changes for neither of the above reasons
-   (e.g. a #line directive in C); LC_RENAME_VERBATIM is like LC_RENAME
-   but a filename of "" is not specially interpreted as standard
-   input. LC_ENTER_MACRO is when a macro expansion is about to start.  */
-enum lc_reason
-{
-  LC_ENTER = 0,
-  LC_LEAVE,
-  LC_RENAME,
-  LC_RENAME_VERBATIM,
-  LC_ENTER_MACRO
-  /* FIXME: add support for stringize and paste.  */
-};
-
-/* The type of line numbers.  */
-typedef unsigned int linenum_type;
-
-/* A logical line/column number, i.e. an "index" into a line_map.  */
-typedef unsigned int source_location;
-
-/* Memory allocation function typedef.  Works like xrealloc.  */
-typedef void *(*line_map_realloc) (void *, size_t);
-
-/* Memory allocator function that returns the actual allocated size,
-   for a given requested allocation.  */
-typedef size_t (*line_map_round_alloc_size_func) (size_t);
-
-/* An ordinary line map encodes physical source locations. Those
-   physical source locations are called "spelling locations".
-   
-   Physical source file TO_FILE at line TO_LINE at column 0 is represented
-   by the logical START_LOCATION.  TO_LINE+L at column C is represented by
-   START_LOCATION+(L*(1<<column_bits))+C, as long as C<(1<<column_bits),
-   and the result_location is less than the next line_map's start_location.
-   (The top line is line 1 and the leftmost column is column 1; line/column 0
-   means "entire file/line" or "unknown line/column" or "not applicable".)
-
-   The highest possible source location is MAX_SOURCE_LOCATION.  */
-struct GTY(()) line_map_ordinary {
-  const char *to_file;
-  linenum_type to_line;
-
-  /* An index into the set that gives the line mapping at whose end
-     the current one was included.  File(s) at the bottom of the
-     include stack have this set to -1.  */
-  int included_from;
-
-  /* SYSP is one for a system header, two for a C system header file
-     that therefore needs to be extern "C" protected in C++, and zero
-     otherwise.  This field isn't really needed now that it's in
-     cpp_buffer.  */
-  unsigned char sysp;
-
-  /* Number of the low-order source_location bits used for a column number.  */
-  unsigned int column_bits : 8;
-};
-
-/* This is the highest possible source location encoded within an
-   ordinary or macro map.  */
-#define MAX_SOURCE_LOCATION 0x7FFFFFFF
-
-struct cpp_hashnode;
-
-/* A macro line map encodes location of tokens coming from a macro
-   expansion.
-   
-   Please note that this struct line_map_macro is a field of struct
-   line_map below, go read the comments of struct line_map below and
-   then come back here.
-   
-   The offset from START_LOCATION is used to index into
-   MACRO_LOCATIONS; this holds the original location of the token.  */
-struct GTY(()) line_map_macro {
-  /* The cpp macro which expansion gave birth to this macro map.  */
-  struct cpp_hashnode * GTY ((nested_ptr (union tree_node,
-				   "%h ? CPP_HASHNODE (GCC_IDENT_TO_HT_IDENT (%h)) : NULL",
-				   "%h ? HT_IDENT_TO_GCC_IDENT (HT_NODE (%h)) : NULL")))
-    macro;
-
-  /* The number of tokens inside the replacement-list of MACRO.  */
-  unsigned int n_tokens;
-
-  /* This array of location is actually an array of pairs of
-     locations. The elements inside it thus look like:
-
-           x0,y0, x1,y1, x2,y2, ...., xn,yn.
-
-     where n == n_tokens;
-
-     Remember that these xI,yI are collected when libcpp is about to
-     expand a given macro.
-
-     yI is the location in the macro definition, either of the token
-     itself or of a macro parameter that it replaces.
-
-     Imagine this:
-
-	#define PLUS(A, B) A + B  <--- #1
-
-	int a = PLUS (1,2); <--- #2
-
-     There is a macro map for the expansion of PLUS in #2.  PLUS is
-     expanded into its expansion-list.  The expansion-list is the
-     replacement-list of PLUS where the macro parameters are replaced
-     with their arguments.  So the replacement-list of PLUS is made of
-     the tokens:
-
-        A, +, B
-
-     and the expansion-list is made of the tokens:
-
-        1, +, 2
-
-     Let's consider the case of token "+".  Its y1 [yI for I == 1] is
-     its spelling location in #1.
-
-     y0 (thus for token "1") is the spelling location of A in #1.
-
-     And y2 (of token "2") is the spelling location of B in #1.
-
-     When the token is /not/ an argument for a macro, xI is the same
-     location as yI.  Otherwise, xI is the location of the token
-     outside this macro expansion.  If this macro was expanded from
-     another macro expansion, xI is a virtual location representing
-     the token in that macro expansion; otherwise, it is the spelling
-     location of the token.
-
-     Note that a virtual location is a location returned by
-     linemap_add_macro_token.  It encodes the relevant locations (x,y
-     pairs) of that token across the macro expansions from which it
-     (the token) might come from.
-
-     In the example above x1 (for token "+") is going to be the same
-     as y1.  x0 is the spelling location for the argument token "1",
-     and x2 is the spelling location for the argument token "2".  */
-  source_location * GTY((atomic)) macro_locations;
-
-  /* This is the location of the expansion point of the current macro
-     map.  It's the location of the macro name.  That location is held
-     by the map that was current right before the current one. It
-     could have been either a macro or an ordinary map, depending on
-     if we are in a nested expansion context not.  */
-  source_location expansion;
-};
-
-/* A line_map encodes a sequence of locations.
-   There are two kinds of maps. Ordinary maps and macro expansion
-   maps, a.k.a macro maps.
-
-   A macro map encodes source locations of tokens that are part of a
-   macro replacement-list, at a macro expansion point. E.g, in:
-
-            #define PLUS(A,B) A + B
-
-   No macro map is going to be created there, because we are not at a
-   macro expansion point. We are at a macro /definition/ point. So the
-   locations of the tokens of the macro replacement-list (i.e, A + B)
-   will be locations in an ordinary map, not a macro map.
-
-   On the other hand, if we later do:
-
-        int a = PLUS (1,2);
-
-   The invocation of PLUS here is a macro expansion. So we are at a
-   macro expansion point. The preprocessor expands PLUS (1,2) and
-   replaces it with the tokens of its replacement-list: 1 + 2. A macro
-   map is going to be created to hold (or rather to map, haha ...) the
-   locations of the tokens 1, + and 2. The macro map also records the
-   location of the expansion point of PLUS. That location is mapped in
-   the map that is active right before the location of the invocation
-   of PLUS.  */
-struct GTY(()) line_map {
-  source_location start_location;
-
-  /* The reason for creation of this line map.  */
-  ENUM_BITFIELD (lc_reason) reason : CHAR_BIT;
-
-  union map_u {
-    struct line_map_ordinary GTY((tag ("0"))) ordinary;
-    struct line_map_macro GTY((tag ("1"))) macro;
-  } GTY((desc ("%1.reason == LC_ENTER_MACRO"))) d;
-};
-
-#define MAP_START_LOCATION(MAP) (MAP)->start_location
-
-#define ORDINARY_MAP_FILE_NAME(MAP) \
-  linemap_check_ordinary (MAP)->d.ordinary.to_file
-
-#define ORDINARY_MAP_STARTING_LINE_NUMBER(MAP) \
-  linemap_check_ordinary (MAP)->d.ordinary.to_line
-
-#define ORDINARY_MAP_INCLUDER_FILE_INDEX(MAP) \
-  linemap_check_ordinary (MAP)->d.ordinary.included_from
-
-#define ORDINARY_MAP_IN_SYSTEM_HEADER_P(MAP) \
-  linemap_check_ordinary (MAP)->d.ordinary.sysp
-
-#define ORDINARY_MAP_NUMBER_OF_COLUMN_BITS(MAP) \
-  linemap_check_ordinary (MAP)->d.ordinary.column_bits
-
-#define MACRO_MAP_MACRO(MAP) (MAP)->d.macro.macro
-
-#define MACRO_MAP_NUM_MACRO_TOKENS(MAP) (MAP)->d.macro.n_tokens
-
-#define MACRO_MAP_LOCATIONS(MAP) (MAP)->d.macro.macro_locations
-
-#define MACRO_MAP_EXPANSION_POINT_LOCATION(MAP) (MAP)->d.macro.expansion
-
-/* The abstraction of a set of location maps. There can be several
-   types of location maps. This abstraction contains the attributes
-   that are independent from the type of the map.  */
-struct GTY(()) maps_info {
-  /* This array contains the different line maps.
-     A line map is created for the following events:
-       - when a new preprocessing unit start. 
-       - when a preprocessing unit ends.
-       - when a macro expansion occurs.  */
-  struct line_map * GTY ((length ("%h.used"))) maps;
-
-  /* The total number of allocated maps.  */
-  unsigned int allocated;
-
-  /* The number of elements used in maps. This number is smaller
-     or equal to ALLOCATED.  */
-  unsigned int used;
-
-  unsigned int cache;
-};
-
-/* Data structure to associate an arbitrary data to a source location.  */
-struct GTY(()) location_adhoc_data {
-  source_location locus;
-  void * GTY((skip)) data;
-};
-
-struct htab;
-
-/* The following data structure encodes a location with some adhoc data
-   and maps it to a new unsigned integer (called an adhoc location)
-   that replaces the original location to represent the mapping.
-
-   The new adhoc_loc uses the highest bit as the enabling bit, i.e. if the
-   highest bit is 1, then the number is adhoc_loc. Otherwise, it serves as
-   the original location. Once identified as the adhoc_loc, the lower 31
-   bits of the integer is used to index the location_adhoc_data array,
-   in which the locus and associated data is stored.  */
-
-struct GTY(()) location_adhoc_data_map {
-  struct htab * GTY((skip)) htab;
-  source_location curr_loc;
-  unsigned int allocated;
-  struct location_adhoc_data GTY((length ("%h.allocated"))) *data;
-};
-
-/* A set of chronological line_map structures.  */
-struct GTY(()) line_maps {
-  
-  struct maps_info info_ordinary;
-
-  struct maps_info info_macro;
-
-  /* Depth of the include stack, including the current file.  */
-  unsigned int depth;
-
-  /* If true, prints an include trace a la -H.  */
-  bool trace_includes;
-
-  /* Highest source_location "given out".  */
-  source_location highest_location;
-
-  /* Start of line of highest source_location "given out".  */
-  source_location highest_line;
-
-  /* The maximum column number we can quickly allocate.  Higher numbers
-     may require allocating a new line_map.  */
-  unsigned int max_column_hint;
-
-  /* If non-null, the allocator to use when resizing 'maps'.  If null,
-     xrealloc is used.  */
-  line_map_realloc reallocator;
-
-  /* The allocators' function used to know the actual size it
-     allocated, for a certain allocation size requested.  */
-  line_map_round_alloc_size_func round_alloc_size;
-
-  struct location_adhoc_data_map location_adhoc_data_map;
-};
-
-/* Returns the pointer to the memory region where information about
-   maps are stored in the line table SET. MACRO_MAP_P is a flag
-   telling if we want macro or ordinary maps.  */
-#define LINEMAPS_MAP_INFO(SET, MACRO_MAP_P)				\
-  ((MACRO_MAP_P)							\
-   ? &((SET)->info_macro)						\
-   : &((SET)->info_ordinary))
-
-/* Returns the pointer to the memory region where maps are stored in
-   the line table SET. MAP_KIND shall be TRUE if we are interested in
-   macro maps false otherwise.  */
-#define LINEMAPS_MAPS(SET, MAP_KIND) \
-  (LINEMAPS_MAP_INFO (SET, MAP_KIND))->maps
-
-/* Returns the number of allocated maps so far. MAP_KIND shall be TRUE
-   if we are interested in macro maps, FALSE otherwise.  */
-#define LINEMAPS_ALLOCATED(SET, MAP_KIND) \
-  (LINEMAPS_MAP_INFO (SET, MAP_KIND))->allocated
-
-/* Returns the number of used maps so far. MAP_KIND shall be TRUE if
-   we are interested in macro maps, FALSE otherwise.*/
-#define LINEMAPS_USED(SET, MAP_KIND) \
-  (LINEMAPS_MAP_INFO (SET, MAP_KIND))->used
-
-/* Returns the index of the last map that was looked up with
-   linemap_lookup. MAP_KIND shall be TRUE if we are interested in
-   macro maps, FALSE otherwise.  */
-#define LINEMAPS_CACHE(SET, MAP_KIND) \
-  (LINEMAPS_MAP_INFO (SET, MAP_KIND))->cache
-
-/* Return the map at a given index.  */
-#define LINEMAPS_MAP_AT(SET, MAP_KIND, INDEX)	\
-  (&((LINEMAPS_MAPS (SET, MAP_KIND))[(INDEX)]))
-
-/* Returns the last map used in the line table SET. MAP_KIND
-   shall be TRUE if we are interested in macro maps, FALSE
-   otherwise.*/
-#define LINEMAPS_LAST_MAP(SET, MAP_KIND) \
-  LINEMAPS_MAP_AT (SET, MAP_KIND, (LINEMAPS_USED (SET, MAP_KIND) - 1))
-
-/* Returns the last map that was allocated in the line table SET.
-   MAP_KIND shall be TRUE if we are interested in macro maps, FALSE
-   otherwise.*/
-#define LINEMAPS_LAST_ALLOCATED_MAP(SET, MAP_KIND) \
-  LINEMAPS_MAP_AT (SET, MAP_KIND, LINEMAPS_ALLOCATED (SET, MAP_KIND) - 1)
-
-/* Returns a pointer to the memory region where ordinary maps are
-   allocated in the line table SET.  */
-#define LINEMAPS_ORDINARY_MAPS(SET) \
-  LINEMAPS_MAPS (SET, false)
-
-/* Returns the INDEXth ordinary map.  */
-#define LINEMAPS_ORDINARY_MAP_AT(SET, INDEX)	\
-  LINEMAPS_MAP_AT (SET, false, INDEX)
-
-/* Return the number of ordinary maps allocated in the line table
-   SET.  */
-#define LINEMAPS_ORDINARY_ALLOCATED(SET) \
-  LINEMAPS_ALLOCATED(SET, false)
-
-/* Return the number of ordinary maps used in the line table SET.  */
-#define LINEMAPS_ORDINARY_USED(SET) \
-  LINEMAPS_USED(SET, false)
-
-/* Return the index of the last ordinary map that was looked up with
-   linemap_lookup.  */
-#define LINEMAPS_ORDINARY_CACHE(SET) \
-  LINEMAPS_CACHE(SET, false)
-
-/* Returns a pointer to the last ordinary map used in the line table
-   SET.  */
-#define LINEMAPS_LAST_ORDINARY_MAP(SET) \
-  LINEMAPS_LAST_MAP(SET, false)
-
-/* Returns a pointer to the last ordinary map allocated the line table
-   SET.  */
-#define LINEMAPS_LAST_ALLOCATED_ORDINARY_MAP(SET) \
-  LINEMAPS_LAST_ALLOCATED_MAP(SET, false)
-
-/* Returns a pointer to the beginning of the region where macro maps
-   are allcoated.  */
-#define LINEMAPS_MACRO_MAPS(SET) \
-  LINEMAPS_MAPS(SET, true)
-
-/* Returns the INDEXth macro map.  */
-#define LINEMAPS_MACRO_MAP_AT(SET, INDEX)	\
-  LINEMAPS_MAP_AT (SET, true, INDEX)
-
-/* Returns the number of macro maps that were allocated in the line
-   table SET.  */
-#define LINEMAPS_MACRO_ALLOCATED(SET) \
-  LINEMAPS_ALLOCATED(SET, true)
-
-/* Returns the number of macro maps used in the line table SET.  */
-#define LINEMAPS_MACRO_USED(SET) \
-  LINEMAPS_USED(SET, true)
-
-/* Returns the index of the last macro map looked up with
-   linemap_lookup.  */
-#define LINEMAPS_MACRO_CACHE(SET) \
-  LINEMAPS_CACHE(SET, true)
-
-/* Returns the lowest location [of a token resulting from macro
-   expansion] encoded in this line table.  */
-#define LINEMAPS_MACRO_LOWEST_LOCATION(SET)			\
-  (LINEMAPS_MACRO_USED (set)					\
-   ? MAP_START_LOCATION (LINEMAPS_LAST_MACRO_MAP (set))		\
-   : MAX_SOURCE_LOCATION)
-
-/* Returns the last macro map used in the line table SET.  */
-#define LINEMAPS_LAST_MACRO_MAP(SET) \
-  LINEMAPS_LAST_MAP (SET, true)
-
-/* Returns the last macro map allocated in the line table SET.  */
-#define LINEMAPS_LAST_ALLOCATED_MACRO_MAP(SET) \
-  LINEMAPS_LAST_ALLOCATED_MAP (SET, true)
-
-extern void location_adhoc_data_fini (struct line_maps *);
-extern source_location get_combined_adhoc_loc (struct line_maps *,
-					       source_location, void *);
-extern void *get_data_from_adhoc_loc (struct line_maps *, source_location);
-extern source_location get_location_from_adhoc_loc (struct line_maps *,
-						    source_location);
-
-#define IS_ADHOC_LOC(LOC) (((LOC) & MAX_SOURCE_LOCATION) != (LOC))
-#define COMBINE_LOCATION_DATA(SET, LOC, BLOCK) \
-  get_combined_adhoc_loc ((SET), (LOC), (BLOCK))
-
-extern void rebuild_location_adhoc_htab (struct line_maps *);
-
-/* Initialize a line map set.  */
-extern void linemap_init (struct line_maps *);
-
-/* Check for and warn about line_maps entered but not exited.  */
-
-extern void linemap_check_files_exited (struct line_maps *);
-
-/* Return a source_location for the start (i.e. column==0) of
-   (physical) line TO_LINE in the current source file (as in the
-   most recent linemap_add).   MAX_COLUMN_HINT is the highest column
-   number we expect to use in this line (but it does not change
-   the highest_location).  */
-
-extern source_location linemap_line_start
-(struct line_maps *set, linenum_type to_line,  unsigned int max_column_hint);
-
-/* Add a mapping of logical source line to physical source file and
-   line number. This function creates an "ordinary map", which is a
-   map that records locations of tokens that are not part of macro
-   replacement-lists present at a macro expansion point.
-
-   The text pointed to by TO_FILE must have a lifetime
-   at least as long as the lifetime of SET.  An empty
-   TO_FILE means standard input.  If reason is LC_LEAVE, and
-   TO_FILE is NULL, then TO_FILE, TO_LINE and SYSP are given their
-   natural values considering the file we are returning to.
-
-   A call to this function can relocate the previous set of
-   maps, so any stored line_map pointers should not be used.  */
-extern const struct line_map *linemap_add
-  (struct line_maps *, enum lc_reason, unsigned int sysp,
-   const char *to_file, linenum_type to_line);
-
-/* Given a logical source location, returns the map which the
-   corresponding (source file, line, column) triplet can be deduced
-   from. Since the set is built chronologically, the logical lines are
-   monotonic increasing, and so the list is sorted and we can use a
-   binary search. If no line map have been allocated yet, this
-   function returns NULL.  */
-extern const struct line_map *linemap_lookup
-  (struct line_maps *, source_location);
-
-/* Returns TRUE if the line table set tracks token locations across
-   macro expansion, FALSE otherwise.  */
-bool linemap_tracks_macro_expansion_locs_p (struct line_maps *);
-
-/* Return TRUE if MAP encodes locations coming from a macro
-   replacement-list at macro expansion point.  */
-bool linemap_macro_expansion_map_p (const struct line_map *);
-
-/* Return the name of the macro associated to MACRO_MAP.  */
-const char* linemap_map_get_macro_name (const struct line_map*);
-
-/* Return a positive value if LOCATION is the locus of a token that is
-   located in a system header, O otherwise. It returns 1 if LOCATION
-   is the locus of a token that is located in a system header, and 2
-   if LOCATION is the locus of a token located in a C system header
-   that therefore needs to be extern "C" protected in C++.
-
-   Note that this function returns 1 if LOCATION belongs to a token
-   that is part of a macro replacement-list defined in a system
-   header, but expanded in a non-system file.  */
-int linemap_location_in_system_header_p (struct line_maps *,
-					 source_location);
-
-/* Return TRUE if LOCATION is a source code location of a token coming
-   from a macro replacement-list at a macro expansion point, FALSE
-   otherwise.  */
-bool linemap_location_from_macro_expansion_p (struct line_maps *,
-					      source_location);
-
-/* source_location values from 0 to RESERVED_LOCATION_COUNT-1 will
-   be reserved for libcpp user as special values, no token from libcpp
-   will contain any of those locations.  */
-#define RESERVED_LOCATION_COUNT	2
-
-/* Converts a map and a source_location to source line.  */
-#define SOURCE_LINE(MAP, LOC)						\
-  (((((LOC) - linemap_check_ordinary (MAP)->start_location)		\
-     >> (MAP)->d.ordinary.column_bits) + (MAP)->d.ordinary.to_line))
-
-/* Convert a map and source_location to source column number.  */
-#define SOURCE_COLUMN(MAP, LOC)						\
-  ((((LOC) - linemap_check_ordinary (MAP)->start_location)		\
-    & ((1 << (MAP)->d.ordinary.column_bits) - 1)))
-
-/* Returns the last source line number within an ordinary map.  This
-   is the (last) line of the #include, or other directive, that caused
-   a map change.  */
-#define LAST_SOURCE_LINE(MAP) \
-  SOURCE_LINE (MAP, LAST_SOURCE_LINE_LOCATION (MAP))
-
-/* Return the last column number within an ordinary map.  */
-#define LAST_SOURCE_COLUMN(MAP) \
-  SOURCE_COLUMN (MAP, LAST_SOURCE_LINE_LOCATION (MAP))
-
-/* Return the location of the last source line within an ordinary
-   map.  */
-#define LAST_SOURCE_LINE_LOCATION(MAP)					\
-  ((((linemap_check_ordinary (MAP)[1].start_location - 1		\
-      - (MAP)->start_location)						\
-     & ~((1 << (MAP)->d.ordinary.column_bits) - 1))			\
-    + (MAP)->start_location))
-
-/* Returns the map a given map was included from, or NULL if the map
-   belongs to the main file, i.e, a file that wasn't included by
-   another one.  */
-#define INCLUDED_FROM(SET, MAP)						\
-  ((linemap_check_ordinary (MAP)->d.ordinary.included_from == -1)	\
-   ? NULL								\
-   : (&LINEMAPS_ORDINARY_MAPS (SET)[(MAP)->d.ordinary.included_from]))
-
-/* Nonzero if the map is at the bottom of the include stack.  */
-#define MAIN_FILE_P(MAP)						\
-  ((linemap_check_ordinary (MAP)->d.ordinary.included_from < 0))
-
-#if defined ENABLE_CHECKING && (GCC_VERSION >= 2007)
-
-/* Assertion macro to be used in line-map code.  */
-#define linemap_assert(EXPR)			\
-  do {						\
-    if (! (EXPR))				\
-      abort ();					\
-  } while (0)
-
-/* Assert that MAP encodes locations of tokens that are not part of
-   the replacement-list of a macro expansion.  */
-#define linemap_check_ordinary(LINE_MAP) __extension__		\
-  ({linemap_assert (!linemap_macro_expansion_map_p (LINE_MAP)); \
-    (LINE_MAP);})
-#else
-#define linemap_assert(EXPR)
-#define linemap_check_ordinary(LINE_MAP) (LINE_MAP)
-#endif
-
-/* Encode and return a source_location from a column number. The
-   source line considered is the last source line used to call
-   linemap_line_start, i.e, the last source line which a location was
-   encoded from.  */
-extern source_location
-linemap_position_for_column (struct line_maps *, unsigned int);
-
-/* Encode and return a source location from a given line and
-   column.  */
-source_location linemap_position_for_line_and_column (struct line_map *,
-						      linenum_type,
-						      unsigned int);
-/* Return the file this map is for.  */
-#define LINEMAP_FILE(MAP)					\
-  (linemap_check_ordinary (MAP)->d.ordinary.to_file)
-
-/* Return the line number this map started encoding location from.  */
-#define LINEMAP_LINE(MAP)					\
-  (linemap_check_ordinary (MAP)->d.ordinary.to_line)
-
-/* Return a positive value if map encodes locations from a system
-   header, 0 otherwise. Returns 1 if MAP encodes locations in a
-   system header and 2 if it encodes locations in a C system header
-   that therefore needs to be extern "C" protected in C++.  */
-#define LINEMAP_SYSP(MAP)					\
-  (linemap_check_ordinary (MAP)->d.ordinary.sysp)
-
-/* Return a positive value if PRE denotes the location of a token that
-   comes before the token of POST, 0 if PRE denotes the location of
-   the same token as the token for POST, and a negative value
-   otherwise.  */
-int linemap_compare_locations (struct line_maps *set,
-			       source_location   pre,
-			       source_location   post);
-
-/* Return TRUE if LOC_A denotes the location a token that comes
-   topogically before the token denoted by location LOC_B, or if they
-   are equal.  */
-#define linemap_location_before_p(SET, LOC_A, LOC_B)	\
-  (linemap_compare_locations ((SET), (LOC_A), (LOC_B)) >= 0)
-
-typedef struct
-{
-  /* The name of the source file involved.  */
-  const char *file;
-
-  /* The line-location in the source file.  */
-  int line;
-
-  int column;
-
-  void *data;
-
-  /* In a system header?. */
-  bool sysp;
-} expanded_location;
-
-/* This is enum is used by the function linemap_resolve_location
-   below.  The meaning of the values is explained in the comment of
-   that function.  */
-enum location_resolution_kind
-{
-  LRK_MACRO_EXPANSION_POINT,
-  LRK_SPELLING_LOCATION,
-  LRK_MACRO_DEFINITION_LOCATION
-};
-
-/* Resolve a virtual location into either a spelling location, an
-   expansion point location or a token argument replacement point
-   location.  Return the map that encodes the virtual location as well
-   as the resolved location.
-
-   If LOC is *NOT* the location of a token resulting from the
-   expansion of a macro, then the parameter LRK (which stands for
-   Location Resolution Kind) is ignored and the resulting location
-   just equals the one given in argument.
-
-   Now if LOC *IS* the location of a token resulting from the
-   expansion of a macro, this is what happens.
-
-   * If LRK is set to LRK_MACRO_EXPANSION_POINT
-   -------------------------------
-
-   The virtual location is resolved to the first macro expansion point
-   that led to this macro expansion.
-
-   * If LRK is set to LRK_SPELLING_LOCATION
-   -------------------------------------
-
-   The virtual location is resolved to the locus where the token has
-   been spelled in the source.   This can follow through all the macro
-   expansions that led to the token.
-
-   * If LRK is set to LRK_MACRO_DEFINITION_LOCATION
-   --------------------------------------
-
-   The virtual location is resolved to the locus of the token in the
-   context of the macro definition.
-
-   If LOC is the locus of a token that is an argument of a
-   function-like macro [replacing a parameter in the replacement list
-   of the macro] the virtual location is resolved to the locus of the
-   parameter that is replaced, in the context of the definition of the
-   macro.
-
-   If LOC is the locus of a token that is not an argument of a
-   function-like macro, then the function behaves as if LRK was set to
-   LRK_SPELLING_LOCATION.
-
-   If LOC_MAP is not NULL, *LOC_MAP is set to the map encoding the
-   returned location.  Note that if the returned location wasn't originally
-   encoded by a map, the *MAP is set to NULL.  This can happen if LOC
-   resolves to a location reserved for the client code, like
-   UNKNOWN_LOCATION or BUILTINS_LOCATION in GCC.  */
-
-source_location linemap_resolve_location (struct line_maps *,
-					  source_location loc,
-					  enum location_resolution_kind lrk,
-					  const struct line_map **loc_map);
-
-/* Suppose that LOC is the virtual location of a token coming from the
-   expansion of a macro M.  This function then steps up to get the
-   location L of the point where M got expanded.  If L is a spelling
-   location inside a macro expansion M', then this function returns
-   the point where M' was expanded.  LOC_MAP is an output parameter.
-   When non-NULL, *LOC_MAP is set to the map of the returned
-   location.  */
-source_location linemap_unwind_toward_expansion (struct line_maps *,
-						 source_location loc,
-						 const struct line_map **loc_map);
-
-/* If LOC is the virtual location of a token coming from the expansion
-   of a macro M and if its spelling location is reserved (e.g, a
-   location for a built-in token), then this function unwinds (using
-   linemap_unwind_toward_expansion) the location until a location that
-   is not reserved and is not in a system header is reached.  In other
-   words, this unwinds the reserved location until a location that is
-   in real source code is reached.
-
-   Otherwise, if the spelling location for LOC is not reserved or if
-   LOC doesn't come from the expansion of a macro, the function
-   returns LOC as is and *MAP is not touched.
-
-   *MAP is set to the map of the returned location if the later is
-   different from LOC.  */
-source_location linemap_unwind_to_first_non_reserved_loc (struct line_maps *,
-							  source_location loc,
-							  const struct line_map **map);
-
-/* Expand source code location LOC and return a user readable source
-   code location.  LOC must be a spelling (non-virtual) location.  If
-   it's a location < RESERVED_LOCATION_COUNT a zeroed expanded source
-   location is returned.  */
-expanded_location linemap_expand_location (struct line_maps *,
-					   const struct line_map *,
-					   source_location loc);
-
-/* Statistics about maps allocation and usage as returned by
-   linemap_get_statistics.  */
-struct linemap_stats
-{
-  long num_ordinary_maps_allocated;
-  long num_ordinary_maps_used;
-  long ordinary_maps_allocated_size;
-  long ordinary_maps_used_size;
-  long num_expanded_macros;
-  long num_macro_tokens;
-  long num_macro_maps_used;
-  long macro_maps_allocated_size;
-  long macro_maps_used_size;
-  long macro_maps_locations_size;
-  long duplicated_macro_maps_locations_size;
-};
-
-/* Return the highest location emitted for a given file for which
-   there is a line map in SET.  FILE_NAME is the file name to
-   consider.  If the function returns TRUE, *LOC is set to the highest
-   location emitted for that file.  */
-bool linemap_get_file_highest_location (struct line_maps * set,
-					const char *file_name,
-					source_location *loc);
-
-/* Compute and return statistics about the memory consumption of some
-   parts of the line table SET.  */
-void linemap_get_statistics (struct line_maps *, struct linemap_stats *);
-
-/* Dump debugging information about source location LOC into the file
-   stream STREAM. SET is the line map set LOC comes from.  */
-void linemap_dump_location (struct line_maps *, source_location, FILE *);
-
-/* Dump line map at index IX in line table SET to STREAM.  If STREAM
-   is NULL, use stderr.  IS_MACRO is true if the caller wants to
-   dump a macro map, false otherwise.  */
-void linemap_dump (FILE *, struct line_maps *, unsigned, bool);
-
-/* Dump line table SET to STREAM.  If STREAM is NULL, stderr is used.
-   NUM_ORDINARY specifies how many ordinary maps to dump.  NUM_MACRO
-   specifies how many macro maps to dump.  */
-void line_table_dump (FILE *, struct line_maps *, unsigned int, unsigned int);
-
-#endif /* !LIBCPP_LINE_MAP_H  */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/machmode.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/machmode.h
deleted file mode 100644
index bc5d901..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/machmode.h
+++ /dev/null
@@ -1,328 +0,0 @@
-/* Machine mode definitions for GCC; included by rtl.h and tree.h.
-   Copyright (C) 1991-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef HAVE_MACHINE_MODES
-#define HAVE_MACHINE_MODES
-
-/* Make an enum class that gives all the machine modes.  */
-#include "insn-modes.h"
-
-/* Get the name of mode MODE as a string.  */
-
-extern const char * const mode_name[NUM_MACHINE_MODES];
-#define GET_MODE_NAME(MODE)  mode_name[MODE]
-
-/* Mode classes.  */
-
-#include "mode-classes.def"
-#define DEF_MODE_CLASS(M) M
-enum mode_class { MODE_CLASSES, MAX_MODE_CLASS };
-#undef DEF_MODE_CLASS
-#undef MODE_CLASSES
-
-/* Get the general kind of object that mode MODE represents
-   (integer, floating, complex, etc.)  */
-
-extern const unsigned char mode_class[NUM_MACHINE_MODES];
-#define GET_MODE_CLASS(MODE)  ((enum mode_class) mode_class[MODE])
-
-/* Nonzero if MODE is an integral mode.  */
-#define INTEGRAL_MODE_P(MODE)			\
-  (GET_MODE_CLASS (MODE) == MODE_INT		\
-   || GET_MODE_CLASS (MODE) == MODE_PARTIAL_INT \
-   || GET_MODE_CLASS (MODE) == MODE_COMPLEX_INT \
-   || GET_MODE_CLASS (MODE) == MODE_VECTOR_INT)
-
-/* Nonzero if MODE is a floating-point mode.  */
-#define FLOAT_MODE_P(MODE)		\
-  (GET_MODE_CLASS (MODE) == MODE_FLOAT	\
-   || GET_MODE_CLASS (MODE) == MODE_DECIMAL_FLOAT \
-   || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT \
-   || GET_MODE_CLASS (MODE) == MODE_VECTOR_FLOAT)
-
-/* Nonzero if MODE is a complex mode.  */
-#define COMPLEX_MODE_P(MODE)			\
-  (GET_MODE_CLASS (MODE) == MODE_COMPLEX_INT	\
-   || GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT)
-
-/* Nonzero if MODE is a vector mode.  */
-#define VECTOR_MODE_P(MODE)			\
-  (GET_MODE_CLASS (MODE) == MODE_VECTOR_INT	\
-   || GET_MODE_CLASS (MODE) == MODE_VECTOR_FLOAT	\
-   || GET_MODE_CLASS (MODE) == MODE_VECTOR_FRACT	\
-   || GET_MODE_CLASS (MODE) == MODE_VECTOR_UFRACT	\
-   || GET_MODE_CLASS (MODE) == MODE_VECTOR_ACCUM	\
-   || GET_MODE_CLASS (MODE) == MODE_VECTOR_UACCUM)
-
-/* Nonzero if MODE is a scalar integral mode.  */
-#define SCALAR_INT_MODE_P(MODE)			\
-  (GET_MODE_CLASS (MODE) == MODE_INT		\
-   || GET_MODE_CLASS (MODE) == MODE_PARTIAL_INT)
-
-/* Nonzero if MODE is a scalar floating point mode.  */
-#define SCALAR_FLOAT_MODE_P(MODE)		\
-  (GET_MODE_CLASS (MODE) == MODE_FLOAT		\
-   || GET_MODE_CLASS (MODE) == MODE_DECIMAL_FLOAT)
-
-/* Nonzero if MODE is a decimal floating point mode.  */
-#define DECIMAL_FLOAT_MODE_P(MODE)		\
-  (GET_MODE_CLASS (MODE) == MODE_DECIMAL_FLOAT)
-
-/* Nonzero if MODE is a scalar fract mode.  */
-#define SCALAR_FRACT_MODE_P(MODE)	\
-  (GET_MODE_CLASS (MODE) == MODE_FRACT)
-
-/* Nonzero if MODE is a scalar ufract mode.  */
-#define SCALAR_UFRACT_MODE_P(MODE)	\
-  (GET_MODE_CLASS (MODE) == MODE_UFRACT)
-
-/* Nonzero if MODE is a scalar fract or ufract mode.  */
-#define ALL_SCALAR_FRACT_MODE_P(MODE)	\
-  (SCALAR_FRACT_MODE_P (MODE) || SCALAR_UFRACT_MODE_P (MODE))
-
-/* Nonzero if MODE is a scalar accum mode.  */
-#define SCALAR_ACCUM_MODE_P(MODE)	\
-  (GET_MODE_CLASS (MODE) == MODE_ACCUM)
-
-/* Nonzero if MODE is a scalar uaccum mode.  */
-#define SCALAR_UACCUM_MODE_P(MODE)	\
-  (GET_MODE_CLASS (MODE) == MODE_UACCUM)
-
-/* Nonzero if MODE is a scalar accum or uaccum mode.  */
-#define ALL_SCALAR_ACCUM_MODE_P(MODE)	\
-  (SCALAR_ACCUM_MODE_P (MODE) || SCALAR_UACCUM_MODE_P (MODE))
-
-/* Nonzero if MODE is a scalar fract or accum mode.  */
-#define SIGNED_SCALAR_FIXED_POINT_MODE_P(MODE)	\
-  (SCALAR_FRACT_MODE_P (MODE) || SCALAR_ACCUM_MODE_P (MODE))
-
-/* Nonzero if MODE is a scalar ufract or uaccum mode.  */
-#define UNSIGNED_SCALAR_FIXED_POINT_MODE_P(MODE)	\
-  (SCALAR_UFRACT_MODE_P (MODE) || SCALAR_UACCUM_MODE_P (MODE))
-
-/* Nonzero if MODE is a scalar fract, ufract, accum or uaccum mode.  */
-#define ALL_SCALAR_FIXED_POINT_MODE_P(MODE)	\
-  (SIGNED_SCALAR_FIXED_POINT_MODE_P (MODE)	\
-   || UNSIGNED_SCALAR_FIXED_POINT_MODE_P (MODE))
-
-/* Nonzero if MODE is a scalar/vector fract mode.  */
-#define FRACT_MODE_P(MODE)		\
-  (GET_MODE_CLASS (MODE) == MODE_FRACT	\
-   || GET_MODE_CLASS (MODE) == MODE_VECTOR_FRACT)
-
-/* Nonzero if MODE is a scalar/vector ufract mode.  */
-#define UFRACT_MODE_P(MODE)		\
-  (GET_MODE_CLASS (MODE) == MODE_UFRACT	\
-   || GET_MODE_CLASS (MODE) == MODE_VECTOR_UFRACT)
-
-/* Nonzero if MODE is a scalar/vector fract or ufract mode.  */
-#define ALL_FRACT_MODE_P(MODE)		\
-  (FRACT_MODE_P (MODE) || UFRACT_MODE_P (MODE))
-
-/* Nonzero if MODE is a scalar/vector accum mode.  */
-#define ACCUM_MODE_P(MODE)		\
-  (GET_MODE_CLASS (MODE) == MODE_ACCUM	\
-   || GET_MODE_CLASS (MODE) == MODE_VECTOR_ACCUM)
-
-/* Nonzero if MODE is a scalar/vector uaccum mode.  */
-#define UACCUM_MODE_P(MODE)		\
-  (GET_MODE_CLASS (MODE) == MODE_UACCUM	\
-   || GET_MODE_CLASS (MODE) == MODE_VECTOR_UACCUM)
-
-/* Nonzero if MODE is a scalar/vector accum or uaccum mode.  */
-#define ALL_ACCUM_MODE_P(MODE)		\
-  (ACCUM_MODE_P (MODE) || UACCUM_MODE_P (MODE))
-
-/* Nonzero if MODE is a scalar/vector fract or accum mode.  */
-#define SIGNED_FIXED_POINT_MODE_P(MODE)		\
-  (FRACT_MODE_P (MODE) || ACCUM_MODE_P (MODE))
-
-/* Nonzero if MODE is a scalar/vector ufract or uaccum mode.  */
-#define UNSIGNED_FIXED_POINT_MODE_P(MODE)	\
-  (UFRACT_MODE_P (MODE) || UACCUM_MODE_P (MODE))
-
-/* Nonzero if MODE is a scalar/vector fract, ufract, accum or uaccum mode.  */
-#define ALL_FIXED_POINT_MODE_P(MODE)		\
-  (SIGNED_FIXED_POINT_MODE_P (MODE)		\
-   || UNSIGNED_FIXED_POINT_MODE_P (MODE))
-
-/* Nonzero if CLASS modes can be widened.  */
-#define CLASS_HAS_WIDER_MODES_P(CLASS)         \
-  (CLASS == MODE_INT                           \
-   || CLASS == MODE_PARTIAL_INT                \
-   || CLASS == MODE_FLOAT                      \
-   || CLASS == MODE_DECIMAL_FLOAT              \
-   || CLASS == MODE_COMPLEX_FLOAT              \
-   || CLASS == MODE_FRACT                      \
-   || CLASS == MODE_UFRACT                     \
-   || CLASS == MODE_ACCUM                      \
-   || CLASS == MODE_UACCUM)
-
-/* Get the size in bytes and bits of an object of mode MODE.  */
-
-extern CONST_MODE_SIZE unsigned char mode_size[NUM_MACHINE_MODES];
-#define GET_MODE_SIZE(MODE)    ((unsigned short) mode_size[MODE])
-#define GET_MODE_BITSIZE(MODE) \
-  ((unsigned short) (GET_MODE_SIZE (MODE) * BITS_PER_UNIT))
-
-/* Get the number of value bits of an object of mode MODE.  */
-extern const unsigned short mode_precision[NUM_MACHINE_MODES];
-#define GET_MODE_PRECISION(MODE)  mode_precision[MODE]
-
-/* Get the number of integral bits of an object of mode MODE.  */
-extern CONST_MODE_IBIT unsigned char mode_ibit[NUM_MACHINE_MODES];
-#define GET_MODE_IBIT(MODE) mode_ibit[MODE]
-
-/* Get the number of fractional bits of an object of mode MODE.  */
-extern CONST_MODE_FBIT unsigned char mode_fbit[NUM_MACHINE_MODES];
-#define GET_MODE_FBIT(MODE) mode_fbit[MODE]
-
-/* Get a bitmask containing 1 for all bits in a word
-   that fit within mode MODE.  */
-
-extern const unsigned HOST_WIDE_INT mode_mask_array[NUM_MACHINE_MODES];
-
-#define GET_MODE_MASK(MODE) mode_mask_array[MODE]
-
-/* Return the mode of the inner elements in a vector.  */
-
-extern const unsigned char mode_inner[NUM_MACHINE_MODES];
-#define GET_MODE_INNER(MODE) ((enum machine_mode) mode_inner[MODE])
-
-/* Get the size in bytes or bites of the basic parts of an
-   object of mode MODE.  */
-
-#define GET_MODE_UNIT_SIZE(MODE)		\
-  (GET_MODE_INNER (MODE) == VOIDmode		\
-   ? GET_MODE_SIZE (MODE)			\
-   : GET_MODE_SIZE (GET_MODE_INNER (MODE)))
-
-#define GET_MODE_UNIT_BITSIZE(MODE) \
-  ((unsigned short) (GET_MODE_UNIT_SIZE (MODE) * BITS_PER_UNIT))
-
-#define GET_MODE_UNIT_PRECISION(MODE)		\
-  (GET_MODE_INNER (MODE) == VOIDmode		\
-   ? GET_MODE_PRECISION (MODE)			\
-   : GET_MODE_PRECISION (GET_MODE_INNER (MODE)))
-
-/* Get the number of units in the object.  */
-
-extern const unsigned char mode_nunits[NUM_MACHINE_MODES];
-#define GET_MODE_NUNITS(MODE)  mode_nunits[MODE]
-
-/* Get the next wider natural mode (eg, QI -> HI -> SI -> DI -> TI).  */
-
-extern const unsigned char mode_wider[NUM_MACHINE_MODES];
-#define GET_MODE_WIDER_MODE(MODE) ((enum machine_mode) mode_wider[MODE])
-
-/* For scalars, this is a mode with twice the precision.  For vectors,
-   this is a mode with the same inner mode but with twice the elements.  */
-extern const unsigned char mode_2xwider[NUM_MACHINE_MODES];
-#define GET_MODE_2XWIDER_MODE(MODE) ((enum machine_mode) mode_2xwider[MODE])
-
-/* Return the mode for data of a given size SIZE and mode class CLASS.
-   If LIMIT is nonzero, then don't use modes bigger than MAX_FIXED_MODE_SIZE.
-   The value is BLKmode if no other mode is found.  */
-
-extern enum machine_mode mode_for_size (unsigned int, enum mode_class, int);
-
-/* Similar, but find the smallest mode for a given width.  */
-
-extern enum machine_mode smallest_mode_for_size (unsigned int,
-						 enum mode_class);
-
-
-/* Return an integer mode of the exact same size as the input mode,
-   or BLKmode on failure.  */
-
-extern enum machine_mode int_mode_for_mode (enum machine_mode);
-
-/* Return a mode that is suitable for representing a vector,
-   or BLKmode on failure.  */
-
-extern enum machine_mode mode_for_vector (enum machine_mode, unsigned);
-
-/* A class for iterating through possible bitfield modes.  */
-class bit_field_mode_iterator
-{
-public:
-  bit_field_mode_iterator (HOST_WIDE_INT, HOST_WIDE_INT,
-			   HOST_WIDE_INT, HOST_WIDE_INT,
-			   unsigned int, bool);
-  bool next_mode (enum machine_mode *);
-  bool prefer_smaller_modes ();
-
-private:
-  enum machine_mode m_mode;
-  /* We use signed values here because the bit position can be negative
-     for invalid input such as gcc.dg/pr48335-8.c.  */
-  HOST_WIDE_INT m_bitsize;
-  HOST_WIDE_INT m_bitpos;
-  HOST_WIDE_INT m_bitregion_start;
-  HOST_WIDE_INT m_bitregion_end;
-  unsigned int m_align;
-  bool m_volatilep;
-  int m_count;
-};
-
-/* Find the best mode to use to access a bit field.  */
-
-extern enum machine_mode get_best_mode (int, int,
-					unsigned HOST_WIDE_INT,
-					unsigned HOST_WIDE_INT,
-					unsigned int,
-					enum machine_mode, bool);
-
-/* Determine alignment, 1<=result<=BIGGEST_ALIGNMENT.  */
-
-extern CONST_MODE_BASE_ALIGN unsigned char mode_base_align[NUM_MACHINE_MODES];
-
-extern unsigned get_mode_alignment (enum machine_mode);
-
-#define GET_MODE_ALIGNMENT(MODE) get_mode_alignment (MODE)
-
-/* Get the precision of the mode or its inner mode if it has one.  */
-
-extern unsigned int element_precision (enum machine_mode);
-
-/* For each class, get the narrowest mode in that class.  */
-
-extern const unsigned char class_narrowest_mode[MAX_MODE_CLASS];
-#define GET_CLASS_NARROWEST_MODE(CLASS) \
-  ((enum machine_mode) class_narrowest_mode[CLASS])
-
-/* Define the integer modes whose sizes are BITS_PER_UNIT and BITS_PER_WORD
-   and the mode whose class is Pmode and whose size is POINTER_SIZE.  */
-
-extern enum machine_mode byte_mode;
-extern enum machine_mode word_mode;
-extern enum machine_mode ptr_mode;
-
-/* Target-dependent machine mode initialization - in insn-modes.c.  */
-extern void init_adjust_machine_modes (void);
-
-#define TRULY_NOOP_TRUNCATION_MODES_P(MODE1, MODE2) \
-  TRULY_NOOP_TRUNCATION (GET_MODE_PRECISION (MODE1), \
-			 GET_MODE_PRECISION (MODE2))
-
-#define HWI_COMPUTABLE_MODE_P(MODE) \
-  (SCALAR_INT_MODE_P (MODE) \
-   && GET_MODE_PRECISION (MODE) <= HOST_BITS_PER_WIDE_INT)
-
-#endif /* not HAVE_MACHINE_MODES */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/md5.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/md5.h
deleted file mode 100644
index 6da2fef..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/md5.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/* md5.h - Declaration of functions and data types used for MD5 sum
-   computing library functions.
-   Copyright 1995, 1996, 2000 Free Software Foundation, Inc.
-   NOTE: The canonical source of this file is maintained with the GNU C
-   Library.  Bugs can be reported to bug-glibc@prep.ai.mit.edu.
-
-   This program is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 2, 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software Foundation,
-   Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
-
-#ifndef _MD5_H
-#define _MD5_H 1
-
-#include <stdio.h>
-
-#if defined HAVE_LIMITS_H || _LIBC
-# include <limits.h>
-#endif
-
-#include "ansidecl.h"
-
-/* The following contortions are an attempt to use the C preprocessor
-   to determine an unsigned integral type that is 32 bits wide.  An
-   alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
-   doing that would require that the configure script compile and *run*
-   the resulting executable.  Locally running cross-compiled executables
-   is usually not possible.  */
-
-#ifdef _LIBC
-# include <sys/types.h>
-typedef u_int32_t md5_uint32;
-typedef uintptr_t md5_uintptr;
-#elif defined (HAVE_SYS_TYPES_H) && defined (HAVE_STDINT_H)
-#include <stdint.h>
-#include <sys/types.h>
-typedef uint32_t md5_uint32;
-typedef uintptr_t md5_uintptr;
-#else
-#  define INT_MAX_32_BITS 2147483647
-
-/* If UINT_MAX isn't defined, assume it's a 32-bit type.
-   This should be valid for all systems GNU cares about because
-   that doesn't include 16-bit systems, and only modern systems
-   (that certainly have <limits.h>) have 64+-bit integral types.  */
-
-# ifndef INT_MAX
-#  define INT_MAX INT_MAX_32_BITS
-# endif
-
-# if INT_MAX == INT_MAX_32_BITS
-   typedef unsigned int md5_uint32;
-# else
-#  if SHRT_MAX == INT_MAX_32_BITS
-    typedef unsigned short md5_uint32;
-#  else
-#   if LONG_MAX == INT_MAX_32_BITS
-     typedef unsigned long md5_uint32;
-#   else
-     /* The following line is intended to evoke an error.
-        Using #error is not portable enough.  */
-     "Cannot determine unsigned 32-bit data type."
-#   endif
-#  endif
-# endif
-/* We have to make a guess about the integer type equivalent in size
-   to pointers which should always be correct.  */
-typedef unsigned long int md5_uintptr;
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Structure to save state of computation between the single steps.  */
-struct md5_ctx
-{
-  md5_uint32 A;
-  md5_uint32 B;
-  md5_uint32 C;
-  md5_uint32 D;
-
-  md5_uint32 total[2];
-  md5_uint32 buflen;
-  char buffer[128] ATTRIBUTE_ALIGNED_ALIGNOF(md5_uint32);
-};
-
-/*
- * The following three functions are build up the low level used in
- * the functions `md5_stream' and `md5_buffer'.
- */
-
-/* Initialize structure containing state of computation.
-   (RFC 1321, 3.3: Step 3)  */
-extern void md5_init_ctx (struct md5_ctx *ctx);
-
-/* Starting with the result of former calls of this function (or the
-   initialization function update the context for the next LEN bytes
-   starting at BUFFER.
-   It is necessary that LEN is a multiple of 64!!! */
-extern void md5_process_block (const void *buffer, size_t len,
-                               struct md5_ctx *ctx);
-
-/* Starting with the result of former calls of this function (or the
-   initialization function update the context for the next LEN bytes
-   starting at BUFFER.
-   It is NOT required that LEN is a multiple of 64.  */
-extern void md5_process_bytes (const void *buffer, size_t len,
-                               struct md5_ctx *ctx);
-
-/* Process the remaining bytes in the buffer and put result from CTX
-   in first 16 bytes following RESBUF.  The result is always in little
-   endian byte order, so that a byte-wise output yields to the wanted
-   ASCII representation of the message digest.
-
-   IMPORTANT: On some systems it is required that RESBUF is correctly
-   aligned for a 32 bits value.  */
-extern void *md5_finish_ctx (struct md5_ctx *ctx, void *resbuf);
-
-
-/* Put result from CTX in first 16 bytes following RESBUF.  The result is
-   always in little endian byte order, so that a byte-wise output yields
-   to the wanted ASCII representation of the message digest.
-
-   IMPORTANT: On some systems it is required that RESBUF is correctly
-   aligned for a 32 bits value.  */
-extern void *md5_read_ctx (const struct md5_ctx *ctx, void *resbuf);
-
-
-/* Compute MD5 message digest for bytes read from STREAM.  The
-   resulting message digest number will be written into the 16 bytes
-   beginning at RESBLOCK.  */
-extern int md5_stream (FILE *stream, void *resblock);
-
-/* Compute MD5 message digest for LEN bytes beginning at BUFFER.  The
-   result is always in little endian byte order, so that a byte-wise
-   output yields to the wanted ASCII representation of the message
-   digest.  */
-extern void *md5_buffer (const char *buffer, size_t len, void *resblock);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/mode-classes.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/mode-classes.def
deleted file mode 100644
index 9c6a8bb..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/mode-classes.def
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Machine mode class definitions for GCC.
-   Copyright (C) 2003-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#define MODE_CLASSES							   \
-  DEF_MODE_CLASS (MODE_RANDOM),		/* other */			   \
-  DEF_MODE_CLASS (MODE_CC),		/* condition code in a register */ \
-  DEF_MODE_CLASS (MODE_INT),		/* integer */			   \
-  DEF_MODE_CLASS (MODE_PARTIAL_INT),	/* integer with padding bits */    \
-  DEF_MODE_CLASS (MODE_FRACT),		/* signed fractional number */	   \
-  DEF_MODE_CLASS (MODE_UFRACT),		/* unsigned fractional number */   \
-  DEF_MODE_CLASS (MODE_ACCUM),		/* signed accumulator */	   \
-  DEF_MODE_CLASS (MODE_UACCUM),		/* unsigned accumulator */	   \
-  DEF_MODE_CLASS (MODE_FLOAT),		/* floating point */		   \
-  DEF_MODE_CLASS (MODE_DECIMAL_FLOAT),	/* decimal floating point */	   \
-  DEF_MODE_CLASS (MODE_COMPLEX_INT), 	/* complex numbers */		   \
-  DEF_MODE_CLASS (MODE_COMPLEX_FLOAT),					   \
-  DEF_MODE_CLASS (MODE_VECTOR_INT),	/* SIMD vectors */		   \
-  DEF_MODE_CLASS (MODE_VECTOR_FRACT),	/* SIMD vectors */		   \
-  DEF_MODE_CLASS (MODE_VECTOR_UFRACT),	/* SIMD vectors */		   \
-  DEF_MODE_CLASS (MODE_VECTOR_ACCUM),	/* SIMD vectors */		   \
-  DEF_MODE_CLASS (MODE_VECTOR_UACCUM),	/* SIMD vectors */		   \
-  DEF_MODE_CLASS (MODE_VECTOR_FLOAT)
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/objc/objc-tree.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/objc/objc-tree.def
deleted file mode 100644
index 5dc7df3..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/objc/objc-tree.def
+++ /dev/null
@@ -1,76 +0,0 @@
-/* This file contains the definitions and documentation for the
-   additional tree codes used in the Objective C front end (see tree.def
-   for the standard codes).
-   Copyright (C) 1990-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-
-/* Objective-C types.  */
-DEFTREECODE (CLASS_INTERFACE_TYPE, "class_interface_type", tcc_type, 0)
-DEFTREECODE (CLASS_IMPLEMENTATION_TYPE, "class_implementation_type",
-	     tcc_type, 0)
-DEFTREECODE (CATEGORY_INTERFACE_TYPE, "category_interface_type", tcc_type, 0)
-DEFTREECODE (CATEGORY_IMPLEMENTATION_TYPE,"category_implementation_type",
-	     tcc_type, 0)
-DEFTREECODE (PROTOCOL_INTERFACE_TYPE, "protocol_interface_type", tcc_type, 0)
-
-/* Objective-C decls.  */
-DEFTREECODE (KEYWORD_DECL, "keyword_decl", tcc_declaration, 0)
-DEFTREECODE (INSTANCE_METHOD_DECL, "instance_method_decl", tcc_declaration, 0)
-DEFTREECODE (CLASS_METHOD_DECL, "class_method_decl", tcc_declaration, 0)
-DEFTREECODE (PROPERTY_DECL, "property_decl", tcc_declaration, 0)
-
-/* Objective-C expressions.  */
-DEFTREECODE (MESSAGE_SEND_EXPR, "message_send_expr", tcc_expression, 3)
-DEFTREECODE (CLASS_REFERENCE_EXPR, "class_reference_expr", tcc_expression, 1)
-
-/* This tree is used to represent the expression 'object.property',
-   where 'object' is an Objective-C object and 'property' is an
-   Objective-C property.  Operand 0 is the object (the tree
-   representing the expression), and Operand 1 is the property (the
-   PROPERTY_DECL).  Operand 2 is the 'getter' call, ready to be used;
-   we pregenerate it because it is hard to generate it properly later
-   on.  Operand 3 records whether using the 'getter' call should
-   generate a deprecation warning or not.
-
-   A PROPERTY_REF tree needs to be transformed into 'setter' and
-   'getter' calls at some point; at the moment this happens in two
-   places:
-
-     * if we detect that a modify expression is being applied to a
-       PROPERTY_REF, then we transform that into a 'getter' call (this
-       happens in build_modify_expr() or cp_build_modify_expr()).
-
-    * else, it will remain as a PROPERTY_REF until we get to
-      gimplification; at that point, we convert each PROPERTY_REF into
-      a 'getter' call during ObjC/ObjC++ gimplify.  At that point, it
-      is quite hard to build a 'getter' call, but we have already built
-      it and we just need to swap Operand 2 in, and emit the deprecation
-      warnings from Operand 3 if needed.
-
-  Please note that when the Objective-C 2.0 "dot-syntax" 'object.component'
-  is encountered, where 'component' is not a property but there are valid
-  setter/getter methods for it, an artificial PROPERTY_DECL is generated
-  and used in the PROPERTY_REF.  */
-DEFTREECODE (PROPERTY_REF, "property_ref", tcc_expression, 4)
-
-/*
-Local variables:
-mode:c
-End:
-*/
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/obstack.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/obstack.h
deleted file mode 100644
index 23487ba..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/obstack.h
+++ /dev/null
@@ -1,545 +0,0 @@
-/* obstack.h - object stack macros
-   Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-   Free Software Foundation, Inc.
-
-
-   NOTE: The canonical source of this file is maintained with the GNU C Library.
-   Bugs can be reported to bug-glibc@gnu.org.
-
-   This program is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 2, 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301,
-   USA.  */
-
-/* Summary:
-
-All the apparent functions defined here are macros. The idea
-is that you would use these pre-tested macros to solve a
-very specific set of problems, and they would run fast.
-Caution: no side-effects in arguments please!! They may be
-evaluated MANY times!!
-
-These macros operate a stack of objects.  Each object starts life
-small, and may grow to maturity.  (Consider building a word syllable
-by syllable.)  An object can move while it is growing.  Once it has
-been "finished" it never changes address again.  So the "top of the
-stack" is typically an immature growing object, while the rest of the
-stack is of mature, fixed size and fixed address objects.
-
-These routines grab large chunks of memory, using a function you
-supply, called `obstack_chunk_alloc'.  On occasion, they free chunks,
-by calling `obstack_chunk_free'.  You must define them and declare
-them before using any obstack macros.
-
-Each independent stack is represented by a `struct obstack'.
-Each of the obstack macros expects a pointer to such a structure
-as the first argument.
-
-One motivation for this package is the problem of growing char strings
-in symbol tables.  Unless you are "fascist pig with a read-only mind"
---Gosper's immortal quote from HAKMEM item 154, out of context--you
-would not like to put any arbitrary upper limit on the length of your
-symbols.
-
-In practice this often means you will build many short symbols and a
-few long symbols.  At the time you are reading a symbol you don't know
-how long it is.  One traditional method is to read a symbol into a
-buffer, realloc()ating the buffer every time you try to read a symbol
-that is longer than the buffer.  This is beaut, but you still will
-want to copy the symbol from the buffer to a more permanent
-symbol-table entry say about half the time.
-
-With obstacks, you can work differently.  Use one obstack for all symbol
-names.  As you read a symbol, grow the name in the obstack gradually.
-When the name is complete, finalize it.  Then, if the symbol exists already,
-free the newly read name.
-
-The way we do this is to take a large chunk, allocating memory from
-low addresses.  When you want to build a symbol in the chunk you just
-add chars above the current "high water mark" in the chunk.  When you
-have finished adding chars, because you got to the end of the symbol,
-you know how long the chars are, and you can create a new object.
-Mostly the chars will not burst over the highest address of the chunk,
-because you would typically expect a chunk to be (say) 100 times as
-long as an average object.
-
-In case that isn't clear, when we have enough chars to make up
-the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed)
-so we just point to it where it lies.  No moving of chars is
-needed and this is the second win: potentially long strings need
-never be explicitly shuffled. Once an object is formed, it does not
-change its address during its lifetime.
-
-When the chars burst over a chunk boundary, we allocate a larger
-chunk, and then copy the partly formed object from the end of the old
-chunk to the beginning of the new larger chunk.  We then carry on
-accreting characters to the end of the object as we normally would.
-
-A special macro is provided to add a single char at a time to a
-growing object.  This allows the use of register variables, which
-break the ordinary 'growth' macro.
-
-Summary:
-	We allocate large chunks.
-	We carve out one object at a time from the current chunk.
-	Once carved, an object never moves.
-	We are free to append data of any size to the currently
-	  growing object.
-	Exactly one object is growing in an obstack at any one time.
-	You can run one obstack per control block.
-	You may have as many control blocks as you dare.
-	Because of the way we do it, you can `unwind' an obstack
-	  back to a previous state. (You may remove objects much
-	  as you would with a stack.)
-*/
-
-
-/* Don't do the contents of this file more than once.  */
-
-#ifndef _OBSTACK_H
-#define _OBSTACK_H 1
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* We use subtraction of (char *) 0 instead of casting to int
-   because on word-addressable machines a simple cast to int
-   may ignore the byte-within-word field of the pointer.  */
-
-#ifndef __PTR_TO_INT
-# define __PTR_TO_INT(P) ((P) - (char *) 0)
-#endif
-
-#ifndef __INT_TO_PTR
-# define __INT_TO_PTR(P) ((P) + (char *) 0)
-#endif
-
-/* We need the type of the resulting object.  If __PTRDIFF_TYPE__ is
-   defined, as with GNU C, use that; that way we don't pollute the
-   namespace with <stddef.h>'s symbols.  Otherwise, if <stddef.h> is
-   available, include it and use ptrdiff_t.  In traditional C, long is
-   the best that we can do.  */
-
-#ifdef __PTRDIFF_TYPE__
-# define PTR_INT_TYPE __PTRDIFF_TYPE__
-#else
-# ifdef HAVE_STDDEF_H
-#  include <stddef.h>
-#  define PTR_INT_TYPE ptrdiff_t
-# else
-#  define PTR_INT_TYPE long
-# endif
-#endif
-
-#if defined _LIBC || defined HAVE_STRING_H
-# include <string.h>
-# define _obstack_memcpy(To, From, N) memcpy ((To), (From), (N))
-#else
-# ifdef memcpy
-#  define _obstack_memcpy(To, From, N) memcpy ((To), (char *)(From), (N))
-# else
-#  define _obstack_memcpy(To, From, N) bcopy ((char *)(From), (To), (N))
-# endif
-#endif
-
-struct _obstack_chunk		/* Lives at front of each chunk. */
-{
-  char  *limit;			/* 1 past end of this chunk */
-  struct _obstack_chunk *prev;	/* address of prior chunk or NULL */
-  char	contents[4];		/* objects begin here */
-};
-
-struct obstack		/* control current object in current chunk */
-{
-  long	chunk_size;		/* preferred size to allocate chunks in */
-  struct _obstack_chunk *chunk;	/* address of current struct obstack_chunk */
-  char	*object_base;		/* address of object we are building */
-  char	*next_free;		/* where to add next char to current object */
-  char	*chunk_limit;		/* address of char after current chunk */
-  PTR_INT_TYPE temp;		/* Temporary for some macros.  */
-  int   alignment_mask;		/* Mask of alignment for each object. */
-  /* These prototypes vary based on `use_extra_arg', and we use
-     casts to the prototypeless function type in all assignments,
-     but having prototypes here quiets -Wstrict-prototypes.  */
-  struct _obstack_chunk *(*chunkfun) (void *, long);
-  void (*freefun) (void *, struct _obstack_chunk *);
-  void *extra_arg;		/* first arg for chunk alloc/dealloc funcs */
-  unsigned use_extra_arg:1;	/* chunk alloc/dealloc funcs take extra arg */
-  unsigned maybe_empty_object:1;/* There is a possibility that the current
-				   chunk contains a zero-length object.  This
-				   prevents freeing the chunk if we allocate
-				   a bigger chunk to replace it. */
-  unsigned alloc_failed:1;	/* No longer used, as we now call the failed
-				   handler on error, but retained for binary
-				   compatibility.  */
-};
-
-/* Declare the external functions we use; they are in obstack.c.  */
-
-extern void _obstack_newchunk (struct obstack *, int);
-extern void _obstack_free (struct obstack *, void *);
-extern int _obstack_begin (struct obstack *, int, int,
-			    void *(*) (long), void (*) (void *));
-extern int _obstack_begin_1 (struct obstack *, int, int,
-			     void *(*) (void *, long),
-			     void (*) (void *, void *), void *);
-extern int _obstack_memory_used (struct obstack *);
-
-/* Do the function-declarations after the structs
-   but before defining the macros.  */
-
-void obstack_init (struct obstack *obstack);
-
-void * obstack_alloc (struct obstack *obstack, int size);
-
-void * obstack_copy (struct obstack *obstack, void *address, int size);
-void * obstack_copy0 (struct obstack *obstack, void *address, int size);
-
-void obstack_free (struct obstack *obstack, void *block);
-
-void obstack_blank (struct obstack *obstack, int size);
-
-void obstack_grow (struct obstack *obstack, void *data, int size);
-void obstack_grow0 (struct obstack *obstack, void *data, int size);
-
-void obstack_1grow (struct obstack *obstack, int data_char);
-void obstack_ptr_grow (struct obstack *obstack, void *data);
-void obstack_int_grow (struct obstack *obstack, int data);
-
-void * obstack_finish (struct obstack *obstack);
-
-int obstack_object_size (struct obstack *obstack);
-
-int obstack_room (struct obstack *obstack);
-void obstack_make_room (struct obstack *obstack, int size);
-void obstack_1grow_fast (struct obstack *obstack, int data_char);
-void obstack_ptr_grow_fast (struct obstack *obstack, void *data);
-void obstack_int_grow_fast (struct obstack *obstack, int data);
-void obstack_blank_fast (struct obstack *obstack, int size);
-
-void * obstack_base (struct obstack *obstack);
-void * obstack_next_free (struct obstack *obstack);
-int obstack_alignment_mask (struct obstack *obstack);
-int obstack_chunk_size (struct obstack *obstack);
-int obstack_memory_used (struct obstack *obstack);
-
-/* Error handler called when `obstack_chunk_alloc' failed to allocate
-   more memory.  This can be set to a user defined function.  The
-   default action is to print a message and abort.  */
-extern void (*obstack_alloc_failed_handler) (void);
-
-/* Exit value used when `print_and_abort' is used.  */
-extern int obstack_exit_failure;
-
-/* Pointer to beginning of object being allocated or to be allocated next.
-   Note that this might not be the final address of the object
-   because a new chunk might be needed to hold the final size.  */
-
-#define obstack_base(h) ((h)->object_base)
-
-/* Size for allocating ordinary chunks.  */
-
-#define obstack_chunk_size(h) ((h)->chunk_size)
-
-/* Pointer to next byte not yet allocated in current chunk.  */
-
-#define obstack_next_free(h)	((h)->next_free)
-
-/* Mask specifying low bits that should be clear in address of an object.  */
-
-#define obstack_alignment_mask(h) ((h)->alignment_mask)
-
-/* To prevent prototype warnings provide complete argument list in
-   standard C version.  */
-# define obstack_init(h) \
-  _obstack_begin ((h), 0, 0, \
-		  (void *(*) (long)) obstack_chunk_alloc, (void (*) (void *)) obstack_chunk_free)
-
-# define obstack_begin(h, size) \
-  _obstack_begin ((h), (size), 0, \
-		  (void *(*) (long)) obstack_chunk_alloc, (void (*) (void *)) obstack_chunk_free)
-
-# define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \
-  _obstack_begin ((h), (size), (alignment), \
-		    (void *(*) (long)) (chunkfun), (void (*) (void *)) (freefun))
-
-# define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \
-  _obstack_begin_1 ((h), (size), (alignment), \
-		    (void *(*) (void *, long)) (chunkfun), \
-		    (void (*) (void *, void *)) (freefun), (arg))
-
-# define obstack_chunkfun(h, newchunkfun) \
-  ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun))
-
-# define obstack_freefun(h, newfreefun) \
-  ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun))
-
-#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = (achar))
-
-#define obstack_blank_fast(h,n) ((h)->next_free += (n))
-
-#define obstack_memory_used(h) _obstack_memory_used (h)
-
-#if defined __GNUC__ && defined __STDC__ && __STDC__
-/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
-   does not implement __extension__.  But that compiler doesn't define
-   __GNUC_MINOR__.  */
-# if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__)
-#  define __extension__
-# endif
-
-/* For GNU C, if not -traditional,
-   we can define these macros to compute all args only once
-   without using a global variable.
-   Also, we can avoid using the `temp' slot, to make faster code.  */
-
-# define obstack_object_size(OBSTACK)					\
-  __extension__								\
-  ({ struct obstack *__o = (OBSTACK);					\
-     (unsigned) (__o->next_free - __o->object_base); })
-
-# define obstack_room(OBSTACK)						\
-  __extension__								\
-  ({ struct obstack *__o = (OBSTACK);					\
-     (unsigned) (__o->chunk_limit - __o->next_free); })
-
-# define obstack_make_room(OBSTACK,length)				\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   int __len = (length);						\
-   if (__o->chunk_limit - __o->next_free < __len)			\
-     _obstack_newchunk (__o, __len);					\
-   (void) 0; })
-
-# define obstack_empty_p(OBSTACK)					\
-  __extension__								\
-  ({ struct obstack *__o = (OBSTACK);					\
-     (__o->chunk->prev == 0 && __o->next_free - __o->chunk->contents == 0); })
-
-# define obstack_grow(OBSTACK,where,length)				\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   int __len = (length);						\
-   if (__o->next_free + __len > __o->chunk_limit)			\
-     _obstack_newchunk (__o, __len);					\
-   _obstack_memcpy (__o->next_free, (where), __len);			\
-   __o->next_free += __len;						\
-   (void) 0; })
-
-# define obstack_grow0(OBSTACK,where,length)				\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   int __len = (length);						\
-   if (__o->next_free + __len + 1 > __o->chunk_limit)			\
-     _obstack_newchunk (__o, __len + 1);				\
-   _obstack_memcpy (__o->next_free, (where), __len);			\
-   __o->next_free += __len;						\
-   *(__o->next_free)++ = 0;						\
-   (void) 0; })
-
-# define obstack_1grow(OBSTACK,datum)					\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   if (__o->next_free + 1 > __o->chunk_limit)				\
-     _obstack_newchunk (__o, 1);					\
-   obstack_1grow_fast (__o, datum);					\
-   (void) 0; })
-
-/* These assume that the obstack alignment is good enough for pointers or ints,
-   and that the data added so far to the current object
-   shares that much alignment.  */
-
-# define obstack_ptr_grow(OBSTACK,datum)				\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   if (__o->next_free + sizeof (void *) > __o->chunk_limit)		\
-     _obstack_newchunk (__o, sizeof (void *));				\
-   obstack_ptr_grow_fast (__o, datum); })
-
-# define obstack_int_grow(OBSTACK,datum)				\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   if (__o->next_free + sizeof (int) > __o->chunk_limit)		\
-     _obstack_newchunk (__o, sizeof (int));				\
-   obstack_int_grow_fast (__o, datum); })
-
-# define obstack_ptr_grow_fast(OBSTACK,aptr)				\
-__extension__								\
-({ struct obstack *__o1 = (OBSTACK);					\
-   *(const void **) __o1->next_free = (aptr);				\
-   __o1->next_free += sizeof (const void *);				\
-   (void) 0; })
-
-# define obstack_int_grow_fast(OBSTACK,aint)				\
-__extension__								\
-({ struct obstack *__o1 = (OBSTACK);					\
-   *(int *) __o1->next_free = (aint);					\
-   __o1->next_free += sizeof (int);					\
-   (void) 0; })
-
-# define obstack_blank(OBSTACK,length)					\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   int __len = (length);						\
-   if (__o->chunk_limit - __o->next_free < __len)			\
-     _obstack_newchunk (__o, __len);					\
-   obstack_blank_fast (__o, __len);					\
-   (void) 0; })
-
-# define obstack_alloc(OBSTACK,length)					\
-__extension__								\
-({ struct obstack *__h = (OBSTACK);					\
-   obstack_blank (__h, (length));					\
-   obstack_finish (__h); })
-
-# define obstack_copy(OBSTACK,where,length)				\
-__extension__								\
-({ struct obstack *__h = (OBSTACK);					\
-   obstack_grow (__h, (where), (length));				\
-   obstack_finish (__h); })
-
-# define obstack_copy0(OBSTACK,where,length)				\
-__extension__								\
-({ struct obstack *__h = (OBSTACK);					\
-   obstack_grow0 (__h, (where), (length));				\
-   obstack_finish (__h); })
-
-/* The local variable is named __o1 to avoid a name conflict
-   when obstack_blank is called.  */
-# define obstack_finish(OBSTACK)  					\
-__extension__								\
-({ struct obstack *__o1 = (OBSTACK);					\
-   void *value;								\
-   value = (void *) __o1->object_base;					\
-   if (__o1->next_free == value)					\
-     __o1->maybe_empty_object = 1;					\
-   __o1->next_free							\
-     = __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\
-		     & ~ (__o1->alignment_mask));			\
-   if (__o1->next_free - (char *)__o1->chunk				\
-       > __o1->chunk_limit - (char *)__o1->chunk)			\
-     __o1->next_free = __o1->chunk_limit;				\
-   __o1->object_base = __o1->next_free;					\
-   value; })
-
-# define obstack_free(OBSTACK, OBJ)					\
-__extension__								\
-({ struct obstack *__o = (OBSTACK);					\
-   void *__obj = (void *) (OBJ);					\
-   if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit)  \
-     __o->next_free = __o->object_base = (char *) __obj;		\
-   else (obstack_free) (__o, __obj); })
-
-#else /* not __GNUC__ or not __STDC__ */
-
-# define obstack_object_size(h) \
- (unsigned) ((h)->next_free - (h)->object_base)
-
-# define obstack_room(h)		\
- (unsigned) ((h)->chunk_limit - (h)->next_free)
-
-# define obstack_empty_p(h) \
- ((h)->chunk->prev == 0 && (h)->next_free - (h)->chunk->contents == 0)
-
-/* Note that the call to _obstack_newchunk is enclosed in (..., 0)
-   so that we can avoid having void expressions
-   in the arms of the conditional expression.
-   Casting the third operand to void was tried before,
-   but some compilers won't accept it.  */
-
-# define obstack_make_room(h,length)					\
-( (h)->temp = (length),							\
-  (((h)->next_free + (h)->temp > (h)->chunk_limit)			\
-   ? (_obstack_newchunk ((h), (h)->temp), 0) : 0))
-
-# define obstack_grow(h,where,length)					\
-( (h)->temp = (length),							\
-  (((h)->next_free + (h)->temp > (h)->chunk_limit)			\
-   ? (_obstack_newchunk ((h), (h)->temp), 0) : 0),			\
-  _obstack_memcpy ((h)->next_free, (where), (h)->temp),			\
-  (h)->next_free += (h)->temp)
-
-# define obstack_grow0(h,where,length)					\
-( (h)->temp = (length),							\
-  (((h)->next_free + (h)->temp + 1 > (h)->chunk_limit)			\
-   ? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0),			\
-  _obstack_memcpy ((h)->next_free, (where), (h)->temp),			\
-  (h)->next_free += (h)->temp,						\
-  *((h)->next_free)++ = 0)
-
-# define obstack_1grow(h,datum)						\
-( (((h)->next_free + 1 > (h)->chunk_limit)				\
-   ? (_obstack_newchunk ((h), 1), 0) : 0),				\
-  obstack_1grow_fast (h, datum))
-
-# define obstack_ptr_grow(h,datum)					\
-( (((h)->next_free + sizeof (char *) > (h)->chunk_limit)		\
-   ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0),		\
-  obstack_ptr_grow_fast (h, datum))
-
-# define obstack_int_grow(h,datum)					\
-( (((h)->next_free + sizeof (int) > (h)->chunk_limit)			\
-   ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0),			\
-  obstack_int_grow_fast (h, datum))
-
-# define obstack_ptr_grow_fast(h,aptr)					\
-  (((const void **) ((h)->next_free += sizeof (void *)))[-1] = (aptr))
-
-# define obstack_int_grow_fast(h,aint)					\
-  (((int *) ((h)->next_free += sizeof (int)))[-1] = (aptr))
-
-# define obstack_blank(h,length)					\
-( (h)->temp = (length),							\
-  (((h)->chunk_limit - (h)->next_free < (h)->temp)			\
-   ? (_obstack_newchunk ((h), (h)->temp), 0) : 0),			\
-  obstack_blank_fast (h, (h)->temp))
-
-# define obstack_alloc(h,length)					\
- (obstack_blank ((h), (length)), obstack_finish ((h)))
-
-# define obstack_copy(h,where,length)					\
- (obstack_grow ((h), (where), (length)), obstack_finish ((h)))
-
-# define obstack_copy0(h,where,length)					\
- (obstack_grow0 ((h), (where), (length)), obstack_finish ((h)))
-
-# define obstack_finish(h)  						\
-( ((h)->next_free == (h)->object_base					\
-   ? (((h)->maybe_empty_object = 1), 0)					\
-   : 0),								\
-  (h)->temp = __PTR_TO_INT ((h)->object_base),				\
-  (h)->next_free							\
-    = __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask)	\
-		    & ~ ((h)->alignment_mask)),				\
-  (((h)->next_free - (char *) (h)->chunk				\
-    > (h)->chunk_limit - (char *) (h)->chunk)				\
-   ? ((h)->next_free = (h)->chunk_limit) : 0),				\
-  (h)->object_base = (h)->next_free,					\
-  (void *) __INT_TO_PTR ((h)->temp))
-
-# define obstack_free(h,obj)						\
-( (h)->temp = (char *) (obj) - (char *) (h)->chunk,			\
-  (((h)->temp > 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\
-   ? (((h)->next_free = (h)->object_base				\
-	    = (h)->temp + (char *) (h)->chunk), 0)			\
-   : ((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0)))
-
-#endif /* not __GNUC__ or not __STDC__ */
-
-#ifdef __cplusplus
-}	/* C++ */
-#endif
-
-#endif /* obstack.h */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/omp-builtins.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/omp-builtins.def
deleted file mode 100644
index 08b825c..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/omp-builtins.def
+++ /dev/null
@@ -1,238 +0,0 @@
-/* This file contains the definitions and documentation for the
-   OpenMP builtins used in the GNU compiler.
-   Copyright (C) 2005-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* Before including this file, you should define a macro:
-
-     DEF_GOMP_BUILTIN (ENUM, NAME, TYPE, ATTRS)
-
-   See builtins.def for details.  */
-
-DEF_GOMP_BUILTIN (BUILT_IN_OMP_GET_THREAD_NUM, "omp_get_thread_num",
-		  BT_FN_INT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_OMP_GET_NUM_THREADS, "omp_get_num_threads",
-		  BT_FN_INT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_OMP_GET_TEAM_NUM, "omp_get_team_num",
-		  BT_FN_INT, ATTR_CONST_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_OMP_GET_NUM_TEAMS, "omp_get_num_teams",
-		  BT_FN_INT, ATTR_CONST_NOTHROW_LEAF_LIST)
-
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_ATOMIC_START, "GOMP_atomic_start",
-		  BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_ATOMIC_END, "GOMP_atomic_end",
-		  BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_BARRIER, "GOMP_barrier",
-		  BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_BARRIER_CANCEL, "GOMP_barrier_cancel",
-		  BT_FN_BOOL, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_TASKWAIT, "GOMP_taskwait",
-		  BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_TASKYIELD, "GOMP_taskyield",
-		  BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_TASKGROUP_START, "GOMP_taskgroup_start",
-		  BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_TASKGROUP_END, "GOMP_taskgroup_end",
-		  BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_CANCEL, "GOMP_cancel",
-		  BT_FN_BOOL_INT_BOOL, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_CANCELLATION_POINT, "GOMP_cancellation_point",
-		  BT_FN_BOOL_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_CRITICAL_START, "GOMP_critical_start",
-		  BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_CRITICAL_END, "GOMP_critical_end",
-		  BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_CRITICAL_NAME_START,
-		  "GOMP_critical_name_start",
-		  BT_FN_VOID_PTRPTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_CRITICAL_NAME_END,
-		  "GOMP_critical_name_end",
-		  BT_FN_VOID_PTRPTR, ATTR_NOTHROW_LEAF_LIST)
-/* NOTE: Do not change the order of BUILT_IN_GOMP_LOOP_*_START.  They
-   are used in index arithmetic with enum omp_clause_schedule_kind
-   in omp-low.c.  */
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_STATIC_START,
-		  "GOMP_loop_static_start",
-		  BT_FN_BOOL_LONG_LONG_LONG_LONG_LONGPTR_LONGPTR,
-		  ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_DYNAMIC_START,
-		  "GOMP_loop_dynamic_start",
-		  BT_FN_BOOL_LONG_LONG_LONG_LONG_LONGPTR_LONGPTR,
-		  ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_GUIDED_START,
-		  "GOMP_loop_guided_start",
-		  BT_FN_BOOL_LONG_LONG_LONG_LONG_LONGPTR_LONGPTR,
-		  ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_RUNTIME_START,
-		  "GOMP_loop_runtime_start",
-		  BT_FN_BOOL_LONG_LONG_LONG_LONGPTR_LONGPTR,
-		  ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ORDERED_STATIC_START,
-		  "GOMP_loop_ordered_static_start",
-		  BT_FN_BOOL_LONG_LONG_LONG_LONG_LONGPTR_LONGPTR,
-		  ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ORDERED_DYNAMIC_START,
-		  "GOMP_loop_ordered_dynamic_start",
-		  BT_FN_BOOL_LONG_LONG_LONG_LONG_LONGPTR_LONGPTR,
-		  ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ORDERED_GUIDED_START,
-		  "GOMP_loop_ordered_guided_start",
-		  BT_FN_BOOL_LONG_LONG_LONG_LONG_LONGPTR_LONGPTR,
-		  ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ORDERED_RUNTIME_START,
-		  "GOMP_loop_ordered_runtime_start",
-		  BT_FN_BOOL_LONG_LONG_LONG_LONGPTR_LONGPTR,
-		  ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_STATIC_NEXT, "GOMP_loop_static_next",
-		  BT_FN_BOOL_LONGPTR_LONGPTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_DYNAMIC_NEXT, "GOMP_loop_dynamic_next",
-		  BT_FN_BOOL_LONGPTR_LONGPTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_GUIDED_NEXT, "GOMP_loop_guided_next",
-		  BT_FN_BOOL_LONGPTR_LONGPTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_RUNTIME_NEXT, "GOMP_loop_runtime_next",
-		  BT_FN_BOOL_LONGPTR_LONGPTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ORDERED_STATIC_NEXT,
-		  "GOMP_loop_ordered_static_next",
-		  BT_FN_BOOL_LONGPTR_LONGPTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ORDERED_DYNAMIC_NEXT,
-		  "GOMP_loop_ordered_dynamic_next",
-		  BT_FN_BOOL_LONGPTR_LONGPTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ORDERED_GUIDED_NEXT,
-		  "GOMP_loop_ordered_guided_next",
-		  BT_FN_BOOL_LONGPTR_LONGPTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ORDERED_RUNTIME_NEXT,
-		  "GOMP_loop_ordered_runtime_next",
-		  BT_FN_BOOL_LONGPTR_LONGPTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ULL_STATIC_START,
-		  "GOMP_loop_ull_static_start",
-		  BT_FN_BOOL_BOOL_ULL_ULL_ULL_ULL_ULLPTR_ULLPTR,
-		  ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ULL_DYNAMIC_START,
-		  "GOMP_loop_ull_dynamic_start",
-		  BT_FN_BOOL_BOOL_ULL_ULL_ULL_ULL_ULLPTR_ULLPTR,
-		  ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ULL_GUIDED_START,
-		  "GOMP_loop_ull_guided_start",
-		  BT_FN_BOOL_BOOL_ULL_ULL_ULL_ULL_ULLPTR_ULLPTR,
-		  ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ULL_RUNTIME_START,
-		  "GOMP_loop_ull_runtime_start",
-		  BT_FN_BOOL_BOOL_ULL_ULL_ULL_ULLPTR_ULLPTR,
-		  ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ULL_ORDERED_STATIC_START,
-		  "GOMP_loop_ull_ordered_static_start",
-		  BT_FN_BOOL_BOOL_ULL_ULL_ULL_ULL_ULLPTR_ULLPTR,
-		  ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ULL_ORDERED_DYNAMIC_START,
-		  "GOMP_loop_ull_ordered_dynamic_start",
-		  BT_FN_BOOL_BOOL_ULL_ULL_ULL_ULL_ULLPTR_ULLPTR,
-		  ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ULL_ORDERED_GUIDED_START,
-		  "GOMP_loop_ull_ordered_guided_start",
-		  BT_FN_BOOL_BOOL_ULL_ULL_ULL_ULL_ULLPTR_ULLPTR,
-		  ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ULL_ORDERED_RUNTIME_START,
-		  "GOMP_loop_ull_ordered_runtime_start",
-		  BT_FN_BOOL_BOOL_ULL_ULL_ULL_ULLPTR_ULLPTR,
-		  ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ULL_STATIC_NEXT, "GOMP_loop_ull_static_next",
-		  BT_FN_BOOL_ULONGLONGPTR_ULONGLONGPTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ULL_DYNAMIC_NEXT, "GOMP_loop_ull_dynamic_next",
-		  BT_FN_BOOL_ULONGLONGPTR_ULONGLONGPTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ULL_GUIDED_NEXT, "GOMP_loop_ull_guided_next",
-		  BT_FN_BOOL_ULONGLONGPTR_ULONGLONGPTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ULL_RUNTIME_NEXT, "GOMP_loop_ull_runtime_next",
-		  BT_FN_BOOL_ULONGLONGPTR_ULONGLONGPTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ULL_ORDERED_STATIC_NEXT,
-		  "GOMP_loop_ull_ordered_static_next",
-		  BT_FN_BOOL_ULONGLONGPTR_ULONGLONGPTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ULL_ORDERED_DYNAMIC_NEXT,
-		  "GOMP_loop_ull_ordered_dynamic_next",
-		  BT_FN_BOOL_ULONGLONGPTR_ULONGLONGPTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ULL_ORDERED_GUIDED_NEXT,
-		  "GOMP_loop_ull_ordered_guided_next",
-		  BT_FN_BOOL_ULONGLONGPTR_ULONGLONGPTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_ULL_ORDERED_RUNTIME_NEXT,
-		  "GOMP_loop_ull_ordered_runtime_next",
-		  BT_FN_BOOL_ULONGLONGPTR_ULONGLONGPTR, ATTR_NOTHROW_LEAF_LIST)
-/* NOTE: Do not change the order of BUILT_IN_GOMP_PARALLEL_LOOP_*.
-   They are used in index arithmetic with enum omp_clause_schedule_kind
-   in omp-low.c.  */
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_PARALLEL_LOOP_STATIC,
-		  "GOMP_parallel_loop_static",
-		  BT_FN_VOID_OMPFN_PTR_UINT_LONG_LONG_LONG_LONG_UINT,
-		  ATTR_NOTHROW_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_PARALLEL_LOOP_DYNAMIC,
-		  "GOMP_parallel_loop_dynamic",
-		  BT_FN_VOID_OMPFN_PTR_UINT_LONG_LONG_LONG_LONG_UINT,
-		  ATTR_NOTHROW_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_PARALLEL_LOOP_GUIDED,
-		  "GOMP_parallel_loop_guided",
-		  BT_FN_VOID_OMPFN_PTR_UINT_LONG_LONG_LONG_LONG_UINT,
-		  ATTR_NOTHROW_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_PARALLEL_LOOP_RUNTIME,
-		  "GOMP_parallel_loop_runtime",
-		  BT_FN_VOID_OMPFN_PTR_UINT_LONG_LONG_LONG_UINT,
-		  ATTR_NOTHROW_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_END, "GOMP_loop_end",
-		  BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_END_CANCEL, "GOMP_loop_end_cancel",
-		  BT_FN_BOOL, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_LOOP_END_NOWAIT, "GOMP_loop_end_nowait",
-		  BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_ORDERED_START, "GOMP_ordered_start",
-		  BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_ORDERED_END, "GOMP_ordered_end",
-		  BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_PARALLEL, "GOMP_parallel",
-		  BT_FN_VOID_OMPFN_PTR_UINT_UINT, ATTR_NOTHROW_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_TASK, "GOMP_task",
-		  BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_BOOL_UINT_PTR,
-		  ATTR_NOTHROW_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_SECTIONS_START, "GOMP_sections_start",
-		  BT_FN_UINT_UINT, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_SECTIONS_NEXT, "GOMP_sections_next",
-		  BT_FN_UINT, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_PARALLEL_SECTIONS,
-		  "GOMP_parallel_sections",
-		  BT_FN_VOID_OMPFN_PTR_UINT_UINT_UINT, ATTR_NOTHROW_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_SECTIONS_END, "GOMP_sections_end",
-		  BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_SECTIONS_END_CANCEL,
-		  "GOMP_sections_end_cancel",
-		  BT_FN_BOOL, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_SECTIONS_END_NOWAIT,
-		  "GOMP_sections_end_nowait",
-		  BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_SINGLE_START, "GOMP_single_start",
-		  BT_FN_BOOL, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_SINGLE_COPY_START, "GOMP_single_copy_start",
-		  BT_FN_PTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_SINGLE_COPY_END, "GOMP_single_copy_end",
-		  BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_TARGET, "GOMP_target",
-		  BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR,
-		  ATTR_NOTHROW_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_TARGET_DATA, "GOMP_target_data",
-		  BT_FN_VOID_INT_PTR_SIZE_PTR_PTR_PTR, ATTR_NOTHROW_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_TARGET_END_DATA, "GOMP_target_end_data",
-		  BT_FN_VOID, ATTR_NOTHROW_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_TARGET_UPDATE, "GOMP_target_update",
-		  BT_FN_VOID_INT_PTR_SIZE_PTR_PTR_PTR, ATTR_NOTHROW_LIST)
-DEF_GOMP_BUILTIN (BUILT_IN_GOMP_TEAMS, "GOMP_teams",
-		  BT_FN_VOID_UINT_UINT, ATTR_NOTHROW_LIST)
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/options.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/options.h
deleted file mode 100644
index ec173d1..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/options.h
+++ /dev/null
@@ -1,5349 +0,0 @@
-/* This file is auto-generated by opth-gen.awk.  */
-
-#ifndef OPTIONS_H
-#define OPTIONS_H
-
-#include "flag-types.h"
-
-#include "config/arm/arm-opts.h"
-
-#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) && !defined(IN_RTS)
-#ifndef GENERATOR_FILE
-#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS)
-struct GTY(()) gcc_options
-#else
-struct gcc_options
-#endif
-{
-#endif
-#ifdef GENERATOR_FILE
-extern HOST_WIDE_INT frame_larger_than_size;
-#else
-  HOST_WIDE_INT x_frame_larger_than_size;
-#define frame_larger_than_size global_options.x_frame_larger_than_size
-#endif
-#ifdef GENERATOR_FILE
-extern HOST_WIDE_INT larger_than_size;
-#else
-  HOST_WIDE_INT x_larger_than_size;
-#define larger_than_size global_options.x_larger_than_size
-#endif
-#ifdef GENERATOR_FILE
-extern bool dump_base_name_prefixed;
-#else
-  bool x_dump_base_name_prefixed;
-#define dump_base_name_prefixed global_options.x_dump_base_name_prefixed
-#endif
-#ifdef GENERATOR_FILE
-extern bool exit_after_options;
-#else
-  bool x_exit_after_options;
-#define exit_after_options global_options.x_exit_after_options
-#endif
-#ifdef GENERATOR_FILE
-extern bool flag_dump_all_passed;
-#else
-  bool x_flag_dump_all_passed;
-#define flag_dump_all_passed global_options.x_flag_dump_all_passed
-#endif
-#ifdef GENERATOR_FILE
-extern bool flag_opts_finished;
-#else
-  bool x_flag_opts_finished;
-#define flag_opts_finished global_options.x_flag_opts_finished
-#endif
-#ifdef GENERATOR_FILE
-extern bool flag_stack_usage_info;
-#else
-  bool x_flag_stack_usage_info;
-#define flag_stack_usage_info global_options.x_flag_stack_usage_info
-#endif
-#ifdef GENERATOR_FILE
-extern bool flag_warn_unused_result;
-#else
-  bool x_flag_warn_unused_result;
-#define flag_warn_unused_result global_options.x_flag_warn_unused_result
-#endif
-#ifdef GENERATOR_FILE
-extern bool in_lto_p;
-#else
-  bool x_in_lto_p;
-#define in_lto_p global_options.x_in_lto_p
-#endif
-#ifdef GENERATOR_FILE
-extern bool use_gnu_debug_info_extensions;
-#else
-  bool x_use_gnu_debug_info_extensions;
-#define use_gnu_debug_info_extensions global_options.x_use_gnu_debug_info_extensions
-#endif
-#ifdef GENERATOR_FILE
-extern bool warn_frame_larger_than;
-#else
-  bool x_warn_frame_larger_than;
-#define warn_frame_larger_than global_options.x_warn_frame_larger_than
-#endif
-#ifdef GENERATOR_FILE
-extern bool warn_larger_than;
-#else
-  bool x_warn_larger_than;
-#define warn_larger_than global_options.x_warn_larger_than
-#endif
-#ifdef GENERATOR_FILE
-extern char *help_enum_printed;
-#else
-  char * x_help_enum_printed;
-#define help_enum_printed global_options.x_help_enum_printed
-#endif
-#ifdef GENERATOR_FILE
-extern char *help_printed;
-#else
-  char * x_help_printed;
-#define help_printed global_options.x_help_printed
-#endif
-#ifdef GENERATOR_FILE
-extern const char *main_input_basename;
-#else
-  const char * x_main_input_basename;
-#define main_input_basename global_options.x_main_input_basename
-#endif
-#ifdef GENERATOR_FILE
-extern const char *main_input_filename;
-#else
-  const char * x_main_input_filename;
-#define main_input_filename global_options.x_main_input_filename
-#endif
-#ifdef GENERATOR_FILE
-extern enum debug_info_levels debug_info_level;
-#else
-  enum debug_info_levels x_debug_info_level;
-#define debug_info_level global_options.x_debug_info_level
-#endif
-#ifdef GENERATOR_FILE
-extern enum debug_info_type write_symbols;
-#else
-  enum debug_info_type x_write_symbols;
-#define write_symbols global_options.x_write_symbols
-#endif
-#ifdef GENERATOR_FILE
-extern enum debug_struct_file debug_struct_generic[DINFO_USAGE_NUM_ENUMS];
-#else
-  enum debug_struct_file x_debug_struct_generic[DINFO_USAGE_NUM_ENUMS];
-#define debug_struct_generic global_options.x_debug_struct_generic
-#endif
-#ifdef GENERATOR_FILE
-extern enum debug_struct_file debug_struct_ordinary[DINFO_USAGE_NUM_ENUMS];
-#else
-  enum debug_struct_file x_debug_struct_ordinary[DINFO_USAGE_NUM_ENUMS];
-#define debug_struct_ordinary global_options.x_debug_struct_ordinary
-#endif
-#ifdef GENERATOR_FILE
-extern enum stack_check_type flag_stack_check;
-#else
-  enum stack_check_type x_flag_stack_check;
-#define flag_stack_check global_options.x_flag_stack_check
-#endif
-#ifdef GENERATOR_FILE
-extern int *param_values;
-#else
-  int * x_param_values;
-#define param_values global_options.x_param_values
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_complex_method;
-#else
-  int x_flag_complex_method;
-#define flag_complex_method global_options.x_flag_complex_method
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_debug_asm;
-#else
-  int x_flag_debug_asm;
-#define flag_debug_asm global_options.x_flag_debug_asm
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_dump_rtl_in_asm;
-#else
-  int x_flag_dump_rtl_in_asm;
-#define flag_dump_rtl_in_asm global_options.x_flag_dump_rtl_in_asm
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_evaluation_order;
-#else
-  int x_flag_evaluation_order;
-#define flag_evaluation_order global_options.x_flag_evaluation_order
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_gen_aux_info;
-#else
-  int x_flag_gen_aux_info;
-#define flag_gen_aux_info global_options.x_flag_gen_aux_info
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_generate_lto;
-#else
-  int x_flag_generate_lto;
-#define flag_generate_lto global_options.x_flag_generate_lto
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_print_asm_name;
-#else
-  int x_flag_print_asm_name;
-#define flag_print_asm_name global_options.x_flag_print_asm_name
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_shlib;
-#else
-  int x_flag_shlib;
-#define flag_shlib global_options.x_flag_shlib
-#endif
-#ifdef GENERATOR_FILE
-extern int main_input_baselength;
-#else
-  int x_main_input_baselength;
-#define main_input_baselength global_options.x_main_input_baselength
-#endif
-#ifdef GENERATOR_FILE
-extern int optimize;
-#else
-  int x_optimize;
-#define optimize global_options.x_optimize
-#endif
-#ifdef GENERATOR_FILE
-extern int optimize_debug;
-#else
-  int x_optimize_debug;
-#define optimize_debug global_options.x_optimize_debug
-#endif
-#ifdef GENERATOR_FILE
-extern int optimize_fast;
-#else
-  int x_optimize_fast;
-#define optimize_fast global_options.x_optimize_fast
-#endif
-#ifdef GENERATOR_FILE
-extern int optimize_size;
-#else
-  int x_optimize_size;
-#define optimize_size global_options.x_optimize_size
-#endif
-#ifdef GENERATOR_FILE
-extern int rtl_dump_and_exit;
-#else
-  int x_rtl_dump_and_exit;
-#define rtl_dump_and_exit global_options.x_rtl_dump_and_exit
-#endif
-#ifdef GENERATOR_FILE
-extern int target_flags;
-#else
-  int x_target_flags;
-#define target_flags global_options.x_target_flags
-#endif
-#ifdef GENERATOR_FILE
-extern unsigned int flag_sanitize;
-#else
-  unsigned int x_flag_sanitize;
-#define flag_sanitize global_options.x_flag_sanitize
-#endif
-#ifdef GENERATOR_FILE
-extern unsigned int help_columns;
-#else
-  unsigned int x_help_columns;
-#define help_columns global_options.x_help_columns
-#endif
-#ifdef GENERATOR_FILE
-extern unsigned int initial_max_fld_align;
-#else
-  unsigned int x_initial_max_fld_align;
-#define initial_max_fld_align global_options.x_initial_max_fld_align
-#endif
-#ifdef GENERATOR_FILE
-extern void *flag_instrument_functions_exclude_files;
-#else
-  void * x_flag_instrument_functions_exclude_files;
-#define flag_instrument_functions_exclude_files global_options.x_flag_instrument_functions_exclude_files
-#endif
-#ifdef GENERATOR_FILE
-extern void *flag_instrument_functions_exclude_functions;
-#else
-  void * x_flag_instrument_functions_exclude_functions;
-#define flag_instrument_functions_exclude_functions global_options.x_flag_instrument_functions_exclude_functions
-#endif
-#ifdef GENERATOR_FILE
-extern int help_flag;
-#else
-  int x_help_flag;
-#define help_flag global_options.x_help_flag
-#endif
-#ifdef GENERATOR_FILE
-extern int no_sysroot_suffix;
-#else
-  int x_no_sysroot_suffix;
-#define no_sysroot_suffix global_options.x_no_sysroot_suffix
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_preprocess_only;
-#else
-  int x_flag_preprocess_only;
-#define flag_preprocess_only global_options.x_flag_preprocess_only
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_abi;
-#else
-  int x_warn_abi;
-#define warn_abi global_options.x_warn_abi
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_abi_tag;
-#else
-  int x_warn_abi_tag;
-#define warn_abi_tag global_options.x_warn_abi_tag
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_address;
-#else
-  int x_warn_address;
-#define warn_address global_options.x_warn_address
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_aggregate_return;
-#else
-  int x_warn_aggregate_return;
-#define warn_aggregate_return global_options.x_warn_aggregate_return
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_aggressive_loop_optimizations;
-#else
-  int x_warn_aggressive_loop_optimizations;
-#define warn_aggressive_loop_optimizations global_options.x_warn_aggressive_loop_optimizations
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_array_bounds;
-#else
-  int x_warn_array_bounds;
-#define warn_array_bounds global_options.x_warn_array_bounds
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_assign_intercept;
-#else
-  int x_warn_assign_intercept;
-#define warn_assign_intercept global_options.x_warn_assign_intercept
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_attributes;
-#else
-  int x_warn_attributes;
-#define warn_attributes global_options.x_warn_attributes
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_bad_function_cast;
-#else
-  int x_warn_bad_function_cast;
-#define warn_bad_function_cast global_options.x_warn_bad_function_cast
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_cxx_compat;
-#else
-  int x_warn_cxx_compat;
-#define warn_cxx_compat global_options.x_warn_cxx_compat
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_cxx0x_compat;
-#else
-  int x_warn_cxx0x_compat;
-#define warn_cxx0x_compat global_options.x_warn_cxx0x_compat
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_cast_align;
-#else
-  int x_warn_cast_align;
-#define warn_cast_align global_options.x_warn_cast_align
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_cast_qual;
-#else
-  int x_warn_cast_qual;
-#define warn_cast_qual global_options.x_warn_cast_qual
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_char_subscripts;
-#else
-  int x_warn_char_subscripts;
-#define warn_char_subscripts global_options.x_warn_char_subscripts
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_clobbered;
-#else
-  int x_warn_clobbered;
-#define warn_clobbered global_options.x_warn_clobbered
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_conditionally_supported;
-#else
-  int x_warn_conditionally_supported;
-#define warn_conditionally_supported global_options.x_warn_conditionally_supported
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_conversion;
-#else
-  int x_warn_conversion;
-#define warn_conversion global_options.x_warn_conversion
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_conversion_null;
-#else
-  int x_warn_conversion_null;
-#define warn_conversion_null global_options.x_warn_conversion_null
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_coverage_mismatch;
-#else
-  int x_warn_coverage_mismatch;
-#define warn_coverage_mismatch global_options.x_warn_coverage_mismatch
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_cpp;
-#else
-  int x_warn_cpp;
-#define warn_cpp global_options.x_warn_cpp
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_ctor_dtor_privacy;
-#else
-  int x_warn_ctor_dtor_privacy;
-#define warn_ctor_dtor_privacy global_options.x_warn_ctor_dtor_privacy
-#endif
-#ifdef GENERATOR_FILE
-extern int cpp_warn_date_time;
-#else
-  int x_cpp_warn_date_time;
-#define cpp_warn_date_time global_options.x_cpp_warn_date_time
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_declaration_after_statement;
-#else
-  int x_warn_declaration_after_statement;
-#define warn_declaration_after_statement global_options.x_warn_declaration_after_statement
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_delete_incomplete;
-#else
-  int x_warn_delete_incomplete;
-#define warn_delete_incomplete global_options.x_warn_delete_incomplete
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_delnonvdtor;
-#else
-  int x_warn_delnonvdtor;
-#define warn_delnonvdtor global_options.x_warn_delnonvdtor
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_deprecated;
-#else
-  int x_warn_deprecated;
-#define warn_deprecated global_options.x_warn_deprecated
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_deprecated_decl;
-#else
-  int x_warn_deprecated_decl;
-#define warn_deprecated_decl global_options.x_warn_deprecated_decl
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_disabled_optimization;
-#else
-  int x_warn_disabled_optimization;
-#define warn_disabled_optimization global_options.x_warn_disabled_optimization
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_div_by_zero;
-#else
-  int x_warn_div_by_zero;
-#define warn_div_by_zero global_options.x_warn_div_by_zero
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_double_promotion;
-#else
-  int x_warn_double_promotion;
-#define warn_double_promotion global_options.x_warn_double_promotion
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_ecpp;
-#else
-  int x_warn_ecpp;
-#define warn_ecpp global_options.x_warn_ecpp
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_empty_body;
-#else
-  int x_warn_empty_body;
-#define warn_empty_body global_options.x_warn_empty_body
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_enum_compare;
-#else
-  int x_warn_enum_compare;
-#define warn_enum_compare global_options.x_warn_enum_compare
-#endif
-#ifdef GENERATOR_FILE
-extern int warnings_are_errors;
-#else
-  int x_warnings_are_errors;
-#define warnings_are_errors global_options.x_warnings_are_errors
-#endif
-#ifdef GENERATOR_FILE
-extern int extra_warnings;
-#else
-  int x_extra_warnings;
-#define extra_warnings global_options.x_extra_warnings
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_extraneous_semicolon;
-#else
-  int x_flag_extraneous_semicolon;
-#define flag_extraneous_semicolon global_options.x_flag_extraneous_semicolon
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_fatal_errors;
-#else
-  int x_flag_fatal_errors;
-#define flag_fatal_errors global_options.x_flag_fatal_errors
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_float_conversion;
-#else
-  int x_warn_float_conversion;
-#define warn_float_conversion global_options.x_warn_float_conversion
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_float_equal;
-#else
-  int x_warn_float_equal;
-#define warn_float_equal global_options.x_warn_float_equal
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_format_contains_nul;
-#else
-  int x_warn_format_contains_nul;
-#define warn_format_contains_nul global_options.x_warn_format_contains_nul
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_format_extra_args;
-#else
-  int x_warn_format_extra_args;
-#define warn_format_extra_args global_options.x_warn_format_extra_args
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_format_nonliteral;
-#else
-  int x_warn_format_nonliteral;
-#define warn_format_nonliteral global_options.x_warn_format_nonliteral
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_format_security;
-#else
-  int x_warn_format_security;
-#define warn_format_security global_options.x_warn_format_security
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_format_y2k;
-#else
-  int x_warn_format_y2k;
-#define warn_format_y2k global_options.x_warn_format_y2k
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_format_zero_length;
-#else
-  int x_warn_format_zero_length;
-#define warn_format_zero_length global_options.x_warn_format_zero_length
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_format;
-#else
-  int x_warn_format;
-#define warn_format global_options.x_warn_format
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_free_nonheap_object;
-#else
-  int x_warn_free_nonheap_object;
-#define warn_free_nonheap_object global_options.x_warn_free_nonheap_object
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_ignored_qualifiers;
-#else
-  int x_warn_ignored_qualifiers;
-#define warn_ignored_qualifiers global_options.x_warn_ignored_qualifiers
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_implicit;
-#else
-  int x_warn_implicit;
-#define warn_implicit global_options.x_warn_implicit
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_implicit_function_declaration;
-#else
-  int x_warn_implicit_function_declaration;
-#define warn_implicit_function_declaration global_options.x_warn_implicit_function_declaration
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_implicit_int;
-#else
-  int x_warn_implicit_int;
-#define warn_implicit_int global_options.x_warn_implicit_int
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_inh_var_ctor;
-#else
-  int x_warn_inh_var_ctor;
-#define warn_inh_var_ctor global_options.x_warn_inh_var_ctor
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_init_self;
-#else
-  int x_warn_init_self;
-#define warn_init_self global_options.x_warn_init_self
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_inline;
-#else
-  int x_warn_inline;
-#define warn_inline global_options.x_warn_inline
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_int_to_pointer_cast;
-#else
-  int x_warn_int_to_pointer_cast;
-#define warn_int_to_pointer_cast global_options.x_warn_int_to_pointer_cast
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_invalid_memory_model;
-#else
-  int x_warn_invalid_memory_model;
-#define warn_invalid_memory_model global_options.x_warn_invalid_memory_model
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_invalid_offsetof;
-#else
-  int x_warn_invalid_offsetof;
-#define warn_invalid_offsetof global_options.x_warn_invalid_offsetof
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_jump_misses_init;
-#else
-  int x_warn_jump_misses_init;
-#define warn_jump_misses_init global_options.x_warn_jump_misses_init
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_logical_op;
-#else
-  int x_warn_logical_op;
-#define warn_logical_op global_options.x_warn_logical_op
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_long_long;
-#else
-  int x_warn_long_long;
-#define warn_long_long global_options.x_warn_long_long
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_main;
-#else
-  int x_warn_main;
-#define warn_main global_options.x_warn_main
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_maybe_uninitialized;
-#else
-  int x_warn_maybe_uninitialized;
-#define warn_maybe_uninitialized global_options.x_warn_maybe_uninitialized
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_missing_braces;
-#else
-  int x_warn_missing_braces;
-#define warn_missing_braces global_options.x_warn_missing_braces
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_missing_declarations;
-#else
-  int x_warn_missing_declarations;
-#define warn_missing_declarations global_options.x_warn_missing_declarations
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_missing_field_initializers;
-#else
-  int x_warn_missing_field_initializers;
-#define warn_missing_field_initializers global_options.x_warn_missing_field_initializers
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_missing_parameter_type;
-#else
-  int x_warn_missing_parameter_type;
-#define warn_missing_parameter_type global_options.x_warn_missing_parameter_type
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_missing_prototypes;
-#else
-  int x_warn_missing_prototypes;
-#define warn_missing_prototypes global_options.x_warn_missing_prototypes
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_narrowing;
-#else
-  int x_warn_narrowing;
-#define warn_narrowing global_options.x_warn_narrowing
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_nested_externs;
-#else
-  int x_warn_nested_externs;
-#define warn_nested_externs global_options.x_warn_nested_externs
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_noexcept;
-#else
-  int x_warn_noexcept;
-#define warn_noexcept global_options.x_warn_noexcept
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_nontemplate_friend;
-#else
-  int x_warn_nontemplate_friend;
-#define warn_nontemplate_friend global_options.x_warn_nontemplate_friend
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_nonvdtor;
-#else
-  int x_warn_nonvdtor;
-#define warn_nonvdtor global_options.x_warn_nonvdtor
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_nonnull;
-#else
-  int x_warn_nonnull;
-#define warn_nonnull global_options.x_warn_nonnull
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_old_style_cast;
-#else
-  int x_warn_old_style_cast;
-#define warn_old_style_cast global_options.x_warn_old_style_cast
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_old_style_declaration;
-#else
-  int x_warn_old_style_declaration;
-#define warn_old_style_declaration global_options.x_warn_old_style_declaration
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_old_style_definition;
-#else
-  int x_warn_old_style_definition;
-#define warn_old_style_definition global_options.x_warn_old_style_definition
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_openmp_simd;
-#else
-  int x_warn_openmp_simd;
-#define warn_openmp_simd global_options.x_warn_openmp_simd
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_newer;
-#else
-  int x_flag_newer;
-#define flag_newer global_options.x_flag_newer
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_overflow;
-#else
-  int x_warn_overflow;
-#define warn_overflow global_options.x_warn_overflow
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_overlength_strings;
-#else
-  int x_warn_overlength_strings;
-#define warn_overlength_strings global_options.x_warn_overlength_strings
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_overloaded_virtual;
-#else
-  int x_warn_overloaded_virtual;
-#define warn_overloaded_virtual global_options.x_warn_overloaded_virtual
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_override_init;
-#else
-  int x_warn_override_init;
-#define warn_override_init global_options.x_warn_override_init
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_packed;
-#else
-  int x_warn_packed;
-#define warn_packed global_options.x_warn_packed
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_packed_bitfield_compat;
-#else
-  int x_warn_packed_bitfield_compat;
-#define warn_packed_bitfield_compat global_options.x_warn_packed_bitfield_compat
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_padded;
-#else
-  int x_warn_padded;
-#define warn_padded global_options.x_warn_padded
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_parentheses;
-#else
-  int x_warn_parentheses;
-#define warn_parentheses global_options.x_warn_parentheses
-#endif
-#ifdef GENERATOR_FILE
-extern int pedantic;
-#else
-  int x_pedantic;
-#define pedantic global_options.x_pedantic
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_pmf2ptr;
-#else
-  int x_warn_pmf2ptr;
-#define warn_pmf2ptr global_options.x_warn_pmf2ptr
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_pointer_arith;
-#else
-  int x_warn_pointer_arith;
-#define warn_pointer_arith global_options.x_warn_pointer_arith
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_pointer_sign;
-#else
-  int x_warn_pointer_sign;
-#define warn_pointer_sign global_options.x_warn_pointer_sign
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_pointer_to_int_cast;
-#else
-  int x_warn_pointer_to_int_cast;
-#define warn_pointer_to_int_cast global_options.x_warn_pointer_to_int_cast
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_pragmas;
-#else
-  int x_warn_pragmas;
-#define warn_pragmas global_options.x_warn_pragmas
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_property_assign_default;
-#else
-  int x_warn_property_assign_default;
-#define warn_property_assign_default global_options.x_warn_property_assign_default
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_protocol;
-#else
-  int x_warn_protocol;
-#define warn_protocol global_options.x_warn_protocol
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_psabi;
-#else
-  int x_warn_psabi;
-#define warn_psabi global_options.x_warn_psabi
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_redundant_decls;
-#else
-  int x_warn_redundant_decls;
-#define warn_redundant_decls global_options.x_warn_redundant_decls
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_redundant;
-#else
-  int x_flag_redundant;
-#define flag_redundant global_options.x_flag_redundant
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_reorder;
-#else
-  int x_warn_reorder;
-#define warn_reorder global_options.x_warn_reorder
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_return_local_addr;
-#else
-  int x_warn_return_local_addr;
-#define warn_return_local_addr global_options.x_warn_return_local_addr
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_return_type;
-#else
-  int x_warn_return_type;
-#define warn_return_type global_options.x_warn_return_type
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_selector;
-#else
-  int x_warn_selector;
-#define warn_selector global_options.x_warn_selector
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_sequence_point;
-#else
-  int x_warn_sequence_point;
-#define warn_sequence_point global_options.x_warn_sequence_point
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_shadow;
-#else
-  int x_warn_shadow;
-#define warn_shadow global_options.x_warn_shadow
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_sign_compare;
-#else
-  int x_warn_sign_compare;
-#define warn_sign_compare global_options.x_warn_sign_compare
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_sign_conversion;
-#else
-  int x_warn_sign_conversion;
-#define warn_sign_conversion global_options.x_warn_sign_conversion
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_sign_promo;
-#else
-  int x_warn_sign_promo;
-#define warn_sign_promo global_options.x_warn_sign_promo
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_sizeof_pointer_memaccess;
-#else
-  int x_warn_sizeof_pointer_memaccess;
-#define warn_sizeof_pointer_memaccess global_options.x_warn_sizeof_pointer_memaccess
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_stack_protect;
-#else
-  int x_warn_stack_protect;
-#define warn_stack_protect global_options.x_warn_stack_protect
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_stack_usage;
-#else
-  int x_warn_stack_usage;
-#define warn_stack_usage global_options.x_warn_stack_usage
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_strict_aliasing;
-#else
-  int x_warn_strict_aliasing;
-#define warn_strict_aliasing global_options.x_warn_strict_aliasing
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_strict_null_sentinel;
-#else
-  int x_warn_strict_null_sentinel;
-#define warn_strict_null_sentinel global_options.x_warn_strict_null_sentinel
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_strict_overflow;
-#else
-  int x_warn_strict_overflow;
-#define warn_strict_overflow global_options.x_warn_strict_overflow
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_strict_prototypes;
-#else
-  int x_warn_strict_prototypes;
-#define warn_strict_prototypes global_options.x_warn_strict_prototypes
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_strict_selector_match;
-#else
-  int x_warn_strict_selector_match;
-#define warn_strict_selector_match global_options.x_warn_strict_selector_match
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_suggest_attribute_const;
-#else
-  int x_warn_suggest_attribute_const;
-#define warn_suggest_attribute_const global_options.x_warn_suggest_attribute_const
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_suggest_attribute_format;
-#else
-  int x_warn_suggest_attribute_format;
-#define warn_suggest_attribute_format global_options.x_warn_suggest_attribute_format
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_suggest_attribute_noreturn;
-#else
-  int x_warn_suggest_attribute_noreturn;
-#define warn_suggest_attribute_noreturn global_options.x_warn_suggest_attribute_noreturn
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_suggest_attribute_pure;
-#else
-  int x_warn_suggest_attribute_pure;
-#define warn_suggest_attribute_pure global_options.x_warn_suggest_attribute_pure
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_switch;
-#else
-  int x_warn_switch;
-#define warn_switch global_options.x_warn_switch
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_switch_default;
-#else
-  int x_warn_switch_default;
-#define warn_switch_default global_options.x_warn_switch_default
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_switch_enum;
-#else
-  int x_warn_switch_enum;
-#define warn_switch_enum global_options.x_warn_switch_enum
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_sync_nand;
-#else
-  int x_warn_sync_nand;
-#define warn_sync_nand global_options.x_warn_sync_nand
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_synth;
-#else
-  int x_warn_synth;
-#define warn_synth global_options.x_warn_synth
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_system_headers;
-#else
-  int x_warn_system_headers;
-#define warn_system_headers global_options.x_warn_system_headers
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_traditional;
-#else
-  int x_warn_traditional;
-#define warn_traditional global_options.x_warn_traditional
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_traditional_conversion;
-#else
-  int x_warn_traditional_conversion;
-#define warn_traditional_conversion global_options.x_warn_traditional_conversion
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_trampolines;
-#else
-  int x_warn_trampolines;
-#define warn_trampolines global_options.x_warn_trampolines
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_type_limits;
-#else
-  int x_warn_type_limits;
-#define warn_type_limits global_options.x_warn_type_limits
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_undeclared_selector;
-#else
-  int x_warn_undeclared_selector;
-#define warn_undeclared_selector global_options.x_warn_undeclared_selector
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_uninitialized;
-#else
-  int x_warn_uninitialized;
-#define warn_uninitialized global_options.x_warn_uninitialized
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_unknown_pragmas;
-#else
-  int x_warn_unknown_pragmas;
-#define warn_unknown_pragmas global_options.x_warn_unknown_pragmas
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_unsafe_loop_optimizations;
-#else
-  int x_warn_unsafe_loop_optimizations;
-#define warn_unsafe_loop_optimizations global_options.x_warn_unsafe_loop_optimizations
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_unsuffixed_float_constants;
-#else
-  int x_warn_unsuffixed_float_constants;
-#define warn_unsuffixed_float_constants global_options.x_warn_unsuffixed_float_constants
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_unused;
-#else
-  int x_warn_unused;
-#define warn_unused global_options.x_warn_unused
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_unused_but_set_parameter;
-#else
-  int x_warn_unused_but_set_parameter;
-#define warn_unused_but_set_parameter global_options.x_warn_unused_but_set_parameter
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_unused_but_set_variable;
-#else
-  int x_warn_unused_but_set_variable;
-#define warn_unused_but_set_variable global_options.x_warn_unused_but_set_variable
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_unused_function;
-#else
-  int x_warn_unused_function;
-#define warn_unused_function global_options.x_warn_unused_function
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_unused_label;
-#else
-  int x_warn_unused_label;
-#define warn_unused_label global_options.x_warn_unused_label
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_unused_local_typedefs;
-#else
-  int x_warn_unused_local_typedefs;
-#define warn_unused_local_typedefs global_options.x_warn_unused_local_typedefs
-#endif
-#ifdef GENERATOR_FILE
-extern int cpp_warn_unused_macros;
-#else
-  int x_cpp_warn_unused_macros;
-#define cpp_warn_unused_macros global_options.x_cpp_warn_unused_macros
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_unused_parameter;
-#else
-  int x_warn_unused_parameter;
-#define warn_unused_parameter global_options.x_warn_unused_parameter
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_unused_result;
-#else
-  int x_warn_unused_result;
-#define warn_unused_result global_options.x_warn_unused_result
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_unused_value;
-#else
-  int x_warn_unused_value;
-#define warn_unused_value global_options.x_warn_unused_value
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_unused_variable;
-#else
-  int x_warn_unused_variable;
-#define warn_unused_variable global_options.x_warn_unused_variable
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_useless_cast;
-#else
-  int x_warn_useless_cast;
-#define warn_useless_cast global_options.x_warn_useless_cast
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_varargs;
-#else
-  int x_warn_varargs;
-#define warn_varargs global_options.x_warn_varargs
-#endif
-#ifdef GENERATOR_FILE
-extern int cpp_warn_variadic_macros;
-#else
-  int x_cpp_warn_variadic_macros;
-#define cpp_warn_variadic_macros global_options.x_cpp_warn_variadic_macros
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_vector_operation_performance;
-#else
-  int x_warn_vector_operation_performance;
-#define warn_vector_operation_performance global_options.x_warn_vector_operation_performance
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_virtual_move_assign;
-#else
-  int x_warn_virtual_move_assign;
-#define warn_virtual_move_assign global_options.x_warn_virtual_move_assign
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_vla;
-#else
-  int x_warn_vla;
-#define warn_vla global_options.x_warn_vla
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_volatile_register_var;
-#else
-  int x_warn_volatile_register_var;
-#define warn_volatile_register_var global_options.x_warn_volatile_register_var
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_write_strings;
-#else
-  int x_warn_write_strings;
-#define warn_write_strings global_options.x_warn_write_strings
-#endif
-#ifdef GENERATOR_FILE
-extern int warn_zero_as_null_pointer_constant;
-#else
-  int x_warn_zero_as_null_pointer_constant;
-#define warn_zero_as_null_pointer_constant global_options.x_warn_zero_as_null_pointer_constant
-#endif
-#ifdef GENERATOR_FILE
-extern const char *aux_info_file_name;
-#else
-  const char *x_aux_info_file_name;
-#define aux_info_file_name global_options.x_aux_info_file_name
-#endif
-#ifdef GENERATOR_FILE
-extern const char *aux_base_name;
-#else
-  const char *x_aux_base_name;
-#define aux_base_name global_options.x_aux_base_name
-#endif
-#ifdef GENERATOR_FILE
-extern const char *dump_base_name;
-#else
-  const char *x_dump_base_name;
-#define dump_base_name global_options.x_dump_base_name
-#endif
-#ifdef GENERATOR_FILE
-extern const char *dump_dir_name;
-#else
-  const char *x_dump_dir_name;
-#define dump_dir_name global_options.x_dump_dir_name
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_pic;
-#else
-  int x_flag_pic;
-#define flag_pic global_options.x_flag_pic
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_pie;
-#else
-  int x_flag_pie;
-#define flag_pie global_options.x_flag_pie
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_abi_version;
-#else
-  int x_flag_abi_version;
-#define flag_abi_version global_options.x_flag_abi_version
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_access_control;
-#else
-  int x_flag_access_control;
-#define flag_access_control global_options.x_flag_access_control
-#endif
-#ifdef GENERATOR_FILE
-extern const char *ada_specs_parent;
-#else
-  const char *x_ada_specs_parent;
-#define ada_specs_parent global_options.x_ada_specs_parent
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_aggressive_loop_optimizations;
-#else
-  int x_flag_aggressive_loop_optimizations;
-#define flag_aggressive_loop_optimizations global_options.x_flag_aggressive_loop_optimizations
-#endif
-#ifdef GENERATOR_FILE
-extern int align_functions;
-#else
-  int x_align_functions;
-#define align_functions global_options.x_align_functions
-#endif
-#ifdef GENERATOR_FILE
-extern int align_jumps;
-#else
-  int x_align_jumps;
-#define align_jumps global_options.x_align_jumps
-#endif
-#ifdef GENERATOR_FILE
-extern int align_labels;
-#else
-  int x_align_labels;
-#define align_labels global_options.x_align_labels
-#endif
-#ifdef GENERATOR_FILE
-extern int align_loops;
-#else
-  int x_align_loops;
-#define align_loops global_options.x_align_loops
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_allow_parameterless_variadic_functions;
-#else
-  int x_flag_allow_parameterless_variadic_functions;
-#define flag_allow_parameterless_variadic_functions global_options.x_flag_allow_parameterless_variadic_functions
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_no_asm;
-#else
-  int x_flag_no_asm;
-#define flag_no_asm global_options.x_flag_no_asm
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_assert;
-#else
-  int x_flag_assert;
-#define flag_assert global_options.x_flag_assert
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_associative_math;
-#else
-  int x_flag_associative_math;
-#define flag_associative_math global_options.x_flag_associative_math
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_asynchronous_unwind_tables;
-#else
-  int x_flag_asynchronous_unwind_tables;
-#define flag_asynchronous_unwind_tables global_options.x_flag_asynchronous_unwind_tables
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_auto_inc_dec;
-#else
-  int x_flag_auto_inc_dec;
-#define flag_auto_inc_dec global_options.x_flag_auto_inc_dec
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_bootstrap_classes;
-#else
-  int x_flag_bootstrap_classes;
-#define flag_bootstrap_classes global_options.x_flag_bootstrap_classes
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_bounds_check;
-#else
-  int x_flag_bounds_check;
-#define flag_bounds_check global_options.x_flag_bounds_check
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_branch_on_count_reg;
-#else
-  int x_flag_branch_on_count_reg;
-#define flag_branch_on_count_reg global_options.x_flag_branch_on_count_reg
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_branch_probabilities;
-#else
-  int x_flag_branch_probabilities;
-#define flag_branch_probabilities global_options.x_flag_branch_probabilities
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_branch_target_load_optimize;
-#else
-  int x_flag_branch_target_load_optimize;
-#define flag_branch_target_load_optimize global_options.x_flag_branch_target_load_optimize
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_branch_target_load_optimize2;
-#else
-  int x_flag_branch_target_load_optimize2;
-#define flag_branch_target_load_optimize2 global_options.x_flag_branch_target_load_optimize2
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_btr_bb_exclusive;
-#else
-  int x_flag_btr_bb_exclusive;
-#define flag_btr_bb_exclusive global_options.x_flag_btr_bb_exclusive
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_building_libgcc;
-#else
-  int x_flag_building_libgcc;
-#define flag_building_libgcc global_options.x_flag_building_libgcc
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_no_builtin;
-#else
-  int x_flag_no_builtin;
-#define flag_no_builtin global_options.x_flag_no_builtin
-#endif
-#ifdef GENERATOR_FILE
-extern void *common_deferred_options;
-#else
-  void *x_common_deferred_options;
-#define common_deferred_options global_options.x_common_deferred_options
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_caller_saves;
-#else
-  int x_flag_caller_saves;
-#define flag_caller_saves global_options.x_flag_caller_saves
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_check_data_deps;
-#else
-  int x_flag_check_data_deps;
-#define flag_check_data_deps global_options.x_flag_check_data_deps
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_check_new;
-#else
-  int x_flag_check_new;
-#define flag_check_new global_options.x_flag_check_new
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_check_references;
-#else
-  int x_flag_check_references;
-#define flag_check_references global_options.x_flag_check_references
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_cilkplus;
-#else
-  int x_flag_cilkplus;
-#define flag_cilkplus global_options.x_flag_cilkplus
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_combine_stack_adjustments;
-#else
-  int x_flag_combine_stack_adjustments;
-#define flag_combine_stack_adjustments global_options.x_flag_combine_stack_adjustments
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_no_common;
-#else
-  int x_flag_no_common;
-#define flag_no_common global_options.x_flag_no_common
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_compare_debug;
-#else
-  int x_flag_compare_debug;
-#define flag_compare_debug global_options.x_flag_compare_debug
-#endif
-#ifdef GENERATOR_FILE
-extern const char *flag_compare_debug_opt;
-#else
-  const char *x_flag_compare_debug_opt;
-#define flag_compare_debug_opt global_options.x_flag_compare_debug_opt
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_compare_elim_after_reload;
-#else
-  int x_flag_compare_elim_after_reload;
-#define flag_compare_elim_after_reload global_options.x_flag_compare_elim_after_reload
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_conserve_space;
-#else
-  int x_flag_conserve_space;
-#define flag_conserve_space global_options.x_flag_conserve_space
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_conserve_stack;
-#else
-  int x_flag_conserve_stack;
-#define flag_conserve_stack global_options.x_flag_conserve_stack
-#endif
-#ifdef GENERATOR_FILE
-extern int max_constexpr_depth;
-#else
-  int x_max_constexpr_depth;
-#define max_constexpr_depth global_options.x_max_constexpr_depth
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_cprop_registers;
-#else
-  int x_flag_cprop_registers;
-#define flag_cprop_registers global_options.x_flag_cprop_registers
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_crossjumping;
-#else
-  int x_flag_crossjumping;
-#define flag_crossjumping global_options.x_flag_crossjumping
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_cse_follow_jumps;
-#else
-  int x_flag_cse_follow_jumps;
-#define flag_cse_follow_jumps global_options.x_flag_cse_follow_jumps
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_cx_fortran_rules;
-#else
-  int x_flag_cx_fortran_rules;
-#define flag_cx_fortran_rules global_options.x_flag_cx_fortran_rules
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_cx_limited_range;
-#else
-  int x_flag_cx_limited_range;
-#define flag_cx_limited_range global_options.x_flag_cx_limited_range
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_data_sections;
-#else
-  int x_flag_data_sections;
-#define flag_data_sections global_options.x_flag_data_sections
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_dce;
-#else
-  int x_flag_dce;
-#define flag_dce global_options.x_flag_dce
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_debug_types_section;
-#else
-  int x_flag_debug_types_section;
-#define flag_debug_types_section global_options.x_flag_debug_types_section
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_declone_ctor_dtor;
-#else
-  int x_flag_declone_ctor_dtor;
-#define flag_declone_ctor_dtor global_options.x_flag_declone_ctor_dtor
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_deduce_init_list;
-#else
-  int x_flag_deduce_init_list;
-#define flag_deduce_init_list global_options.x_flag_deduce_init_list
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_defer_pop;
-#else
-  int x_flag_defer_pop;
-#define flag_defer_pop global_options.x_flag_defer_pop
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_delayed_branch;
-#else
-  int x_flag_delayed_branch;
-#define flag_delayed_branch global_options.x_flag_delayed_branch
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_delete_dead_exceptions;
-#else
-  int x_flag_delete_dead_exceptions;
-#define flag_delete_dead_exceptions global_options.x_flag_delete_dead_exceptions
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_delete_null_pointer_checks;
-#else
-  int x_flag_delete_null_pointer_checks;
-#define flag_delete_null_pointer_checks global_options.x_flag_delete_null_pointer_checks
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_devirtualize;
-#else
-  int x_flag_devirtualize;
-#define flag_devirtualize global_options.x_flag_devirtualize
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_devirtualize_speculatively;
-#else
-  int x_flag_devirtualize_speculatively;
-#define flag_devirtualize_speculatively global_options.x_flag_devirtualize_speculatively
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_diagnostics_show_color;
-#else
-  int x_flag_diagnostics_show_color;
-#define flag_diagnostics_show_color global_options.x_flag_diagnostics_show_color
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_diagnostics_show_caret;
-#else
-  int x_flag_diagnostics_show_caret;
-#define flag_diagnostics_show_caret global_options.x_flag_diagnostics_show_caret
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_diagnostics_show_option;
-#else
-  int x_flag_diagnostics_show_option;
-#define flag_diagnostics_show_option global_options.x_flag_diagnostics_show_option
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_dse;
-#else
-  int x_flag_dse;
-#define flag_dse global_options.x_flag_dse
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_dump_ada_spec;
-#else
-  int x_flag_dump_ada_spec;
-#define flag_dump_ada_spec global_options.x_flag_dump_ada_spec
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_dump_ada_spec_slim;
-#else
-  int x_flag_dump_ada_spec_slim;
-#define flag_dump_ada_spec_slim global_options.x_flag_dump_ada_spec_slim
-#endif
-#ifdef GENERATOR_FILE
-extern const char *flag_dump_final_insns;
-#else
-  const char *x_flag_dump_final_insns;
-#define flag_dump_final_insns global_options.x_flag_dump_final_insns
-#endif
-#ifdef GENERATOR_FILE
-extern const char *flag_dump_go_spec;
-#else
-  const char *x_flag_dump_go_spec;
-#define flag_dump_go_spec global_options.x_flag_dump_go_spec
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_dump_noaddr;
-#else
-  int x_flag_dump_noaddr;
-#define flag_dump_noaddr global_options.x_flag_dump_noaddr
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_dump_passes;
-#else
-  int x_flag_dump_passes;
-#define flag_dump_passes global_options.x_flag_dump_passes
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_dump_unnumbered;
-#else
-  int x_flag_dump_unnumbered;
-#define flag_dump_unnumbered global_options.x_flag_dump_unnumbered
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_dump_unnumbered_links;
-#else
-  int x_flag_dump_unnumbered_links;
-#define flag_dump_unnumbered_links global_options.x_flag_dump_unnumbered_links
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_dwarf2_cfi_asm;
-#else
-  int x_flag_dwarf2_cfi_asm;
-#define flag_dwarf2_cfi_asm global_options.x_flag_dwarf2_cfi_asm
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_early_inlining;
-#else
-  int x_flag_early_inlining;
-#define flag_early_inlining global_options.x_flag_early_inlining
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_elide_constructors;
-#else
-  int x_flag_elide_constructors;
-#define flag_elide_constructors global_options.x_flag_elide_constructors
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_eliminate_dwarf2_dups;
-#else
-  int x_flag_eliminate_dwarf2_dups;
-#define flag_eliminate_dwarf2_dups global_options.x_flag_eliminate_dwarf2_dups
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_debug_only_used_symbols;
-#else
-  int x_flag_debug_only_used_symbols;
-#define flag_debug_only_used_symbols global_options.x_flag_debug_only_used_symbols
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_eliminate_unused_debug_types;
-#else
-  int x_flag_eliminate_unused_debug_types;
-#define flag_eliminate_unused_debug_types global_options.x_flag_eliminate_unused_debug_types
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_emit_class_debug_always;
-#else
-  int x_flag_emit_class_debug_always;
-#define flag_emit_class_debug_always global_options.x_flag_emit_class_debug_always
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_emit_class_files;
-#else
-  int x_flag_emit_class_files;
-#define flag_emit_class_files global_options.x_flag_emit_class_files
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_enforce_eh_specs;
-#else
-  int x_flag_enforce_eh_specs;
-#define flag_enforce_eh_specs global_options.x_flag_enforce_eh_specs
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_exceptions;
-#else
-  int x_flag_exceptions;
-#define flag_exceptions global_options.x_flag_exceptions
-#endif
-#ifdef GENERATOR_FILE
-extern enum excess_precision flag_excess_precision_cmdline;
-#else
-  enum excess_precision x_flag_excess_precision_cmdline;
-#define flag_excess_precision_cmdline global_options.x_flag_excess_precision_cmdline
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_expensive_optimizations;
-#else
-  int x_flag_expensive_optimizations;
-#define flag_expensive_optimizations global_options.x_flag_expensive_optimizations
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_extern_tls_init;
-#else
-  int x_flag_extern_tls_init;
-#define flag_extern_tls_init global_options.x_flag_extern_tls_init
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_fat_lto_objects;
-#else
-  int x_flag_fat_lto_objects;
-#define flag_fat_lto_objects global_options.x_flag_fat_lto_objects
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_filelist_file;
-#else
-  int x_flag_filelist_file;
-#define flag_filelist_file global_options.x_flag_filelist_file
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_finite_math_only;
-#else
-  int x_flag_finite_math_only;
-#define flag_finite_math_only global_options.x_flag_finite_math_only
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_float_store;
-#else
-  int x_flag_float_store;
-#define flag_float_store global_options.x_flag_float_store
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_new_for_scope;
-#else
-  int x_flag_new_for_scope;
-#define flag_new_for_scope global_options.x_flag_new_for_scope
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_force_classes_archive_check;
-#else
-  int x_flag_force_classes_archive_check;
-#define flag_force_classes_archive_check global_options.x_flag_force_classes_archive_check
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_forward_propagate;
-#else
-  int x_flag_forward_propagate;
-#define flag_forward_propagate global_options.x_flag_forward_propagate
-#endif
-#ifdef GENERATOR_FILE
-extern enum fp_contract_mode flag_fp_contract_mode;
-#else
-  enum fp_contract_mode x_flag_fp_contract_mode;
-#define flag_fp_contract_mode global_options.x_flag_fp_contract_mode
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_friend_injection;
-#else
-  int x_flag_friend_injection;
-#define flag_friend_injection global_options.x_flag_friend_injection
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_no_function_cse;
-#else
-  int x_flag_no_function_cse;
-#define flag_no_function_cse global_options.x_flag_no_function_cse
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_function_sections;
-#else
-  int x_flag_function_sections;
-#define flag_function_sections global_options.x_flag_function_sections
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_gcse;
-#else
-  int x_flag_gcse;
-#define flag_gcse global_options.x_flag_gcse
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_gcse_after_reload;
-#else
-  int x_flag_gcse_after_reload;
-#define flag_gcse_after_reload global_options.x_flag_gcse_after_reload
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_gcse_las;
-#else
-  int x_flag_gcse_las;
-#define flag_gcse_las global_options.x_flag_gcse_las
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_gcse_lm;
-#else
-  int x_flag_gcse_lm;
-#define flag_gcse_lm global_options.x_flag_gcse_lm
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_gcse_sm;
-#else
-  int x_flag_gcse_sm;
-#define flag_gcse_sm global_options.x_flag_gcse_sm
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_no_gnu_keywords;
-#else
-  int x_flag_no_gnu_keywords;
-#define flag_no_gnu_keywords global_options.x_flag_no_gnu_keywords
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_next_runtime;
-#else
-  int x_flag_next_runtime;
-#define flag_next_runtime global_options.x_flag_next_runtime
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tm;
-#else
-  int x_flag_tm;
-#define flag_tm global_options.x_flag_tm
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_gnu_unique;
-#else
-  int x_flag_gnu_unique;
-#define flag_gnu_unique global_options.x_flag_gnu_unique
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_gnu89_inline;
-#else
-  int x_flag_gnu89_inline;
-#define flag_gnu89_inline global_options.x_flag_gnu89_inline
-#endif
-#ifdef GENERATOR_FILE
-extern int go_check_divide_overflow;
-#else
-  int x_go_check_divide_overflow;
-#define go_check_divide_overflow global_options.x_go_check_divide_overflow
-#endif
-#ifdef GENERATOR_FILE
-extern int go_check_divide_zero;
-#else
-  int x_go_check_divide_zero;
-#define go_check_divide_zero global_options.x_go_check_divide_zero
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_graphite;
-#else
-  int x_flag_graphite;
-#define flag_graphite global_options.x_flag_graphite
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_graphite_identity;
-#else
-  int x_flag_graphite_identity;
-#define flag_graphite_identity global_options.x_flag_graphite_identity
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_guess_branch_prob;
-#else
-  int x_flag_guess_branch_prob;
-#define flag_guess_branch_prob global_options.x_flag_guess_branch_prob
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_hash_synchronization;
-#else
-  int x_flag_hash_synchronization;
-#define flag_hash_synchronization global_options.x_flag_hash_synchronization
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_hoist_adjacent_loads;
-#else
-  int x_flag_hoist_adjacent_loads;
-#define flag_hoist_adjacent_loads global_options.x_flag_hoist_adjacent_loads
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_no_ident;
-#else
-  int x_flag_no_ident;
-#define flag_no_ident global_options.x_flag_no_ident
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_if_conversion;
-#else
-  int x_flag_if_conversion;
-#define flag_if_conversion global_options.x_flag_if_conversion
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_if_conversion2;
-#else
-  int x_flag_if_conversion2;
-#define flag_if_conversion2 global_options.x_flag_if_conversion2
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_implement_inlines;
-#else
-  int x_flag_implement_inlines;
-#define flag_implement_inlines global_options.x_flag_implement_inlines
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_implicit_inline_templates;
-#else
-  int x_flag_implicit_inline_templates;
-#define flag_implicit_inline_templates global_options.x_flag_implicit_inline_templates
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_implicit_templates;
-#else
-  int x_flag_implicit_templates;
-#define flag_implicit_templates global_options.x_flag_implicit_templates
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_indirect_classes;
-#else
-  int x_flag_indirect_classes;
-#define flag_indirect_classes global_options.x_flag_indirect_classes
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_indirect_dispatch;
-#else
-  int x_flag_indirect_dispatch;
-#define flag_indirect_dispatch global_options.x_flag_indirect_dispatch
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_indirect_inlining;
-#else
-  int x_flag_indirect_inlining;
-#define flag_indirect_inlining global_options.x_flag_indirect_inlining
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_inhibit_size_directive;
-#else
-  int x_flag_inhibit_size_directive;
-#define flag_inhibit_size_directive global_options.x_flag_inhibit_size_directive
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_no_inline;
-#else
-  int x_flag_no_inline;
-#define flag_no_inline global_options.x_flag_no_inline
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_inline_atomics;
-#else
-  int x_flag_inline_atomics;
-#define flag_inline_atomics global_options.x_flag_inline_atomics
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_inline_functions;
-#else
-  int x_flag_inline_functions;
-#define flag_inline_functions global_options.x_flag_inline_functions
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_inline_functions_called_once;
-#else
-  int x_flag_inline_functions_called_once;
-#define flag_inline_functions_called_once global_options.x_flag_inline_functions_called_once
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_inline_small_functions;
-#else
-  int x_flag_inline_small_functions;
-#define flag_inline_small_functions global_options.x_flag_inline_small_functions
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_instrument_function_entry_exit;
-#else
-  int x_flag_instrument_function_entry_exit;
-#define flag_instrument_function_entry_exit global_options.x_flag_instrument_function_entry_exit
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_ipa_cp;
-#else
-  int x_flag_ipa_cp;
-#define flag_ipa_cp global_options.x_flag_ipa_cp
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_ipa_cp_clone;
-#else
-  int x_flag_ipa_cp_clone;
-#define flag_ipa_cp_clone global_options.x_flag_ipa_cp_clone
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_ipa_profile;
-#else
-  int x_flag_ipa_profile;
-#define flag_ipa_profile global_options.x_flag_ipa_profile
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_ipa_pta;
-#else
-  int x_flag_ipa_pta;
-#define flag_ipa_pta global_options.x_flag_ipa_pta
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_ipa_pure_const;
-#else
-  int x_flag_ipa_pure_const;
-#define flag_ipa_pure_const global_options.x_flag_ipa_pure_const
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_ipa_reference;
-#else
-  int x_flag_ipa_reference;
-#define flag_ipa_reference global_options.x_flag_ipa_reference
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_ipa_sra;
-#else
-  int x_flag_ipa_sra;
-#define flag_ipa_sra global_options.x_flag_ipa_sra
-#endif
-#ifdef GENERATOR_FILE
-extern enum ira_algorithm flag_ira_algorithm;
-#else
-  enum ira_algorithm x_flag_ira_algorithm;
-#define flag_ira_algorithm global_options.x_flag_ira_algorithm
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_ira_hoist_pressure;
-#else
-  int x_flag_ira_hoist_pressure;
-#define flag_ira_hoist_pressure global_options.x_flag_ira_hoist_pressure
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_ira_loop_pressure;
-#else
-  int x_flag_ira_loop_pressure;
-#define flag_ira_loop_pressure global_options.x_flag_ira_loop_pressure
-#endif
-#ifdef GENERATOR_FILE
-extern enum ira_region flag_ira_region;
-#else
-  enum ira_region x_flag_ira_region;
-#define flag_ira_region global_options.x_flag_ira_region
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_ira_share_save_slots;
-#else
-  int x_flag_ira_share_save_slots;
-#define flag_ira_share_save_slots global_options.x_flag_ira_share_save_slots
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_ira_share_spill_slots;
-#else
-  int x_flag_ira_share_spill_slots;
-#define flag_ira_share_spill_slots global_options.x_flag_ira_share_spill_slots
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_ira_verbose;
-#else
-  int x_flag_ira_verbose;
-#define flag_ira_verbose global_options.x_flag_ira_verbose
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_isolate_erroneous_paths_attribute;
-#else
-  int x_flag_isolate_erroneous_paths_attribute;
-#define flag_isolate_erroneous_paths_attribute global_options.x_flag_isolate_erroneous_paths_attribute
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_isolate_erroneous_paths_dereference;
-#else
-  int x_flag_isolate_erroneous_paths_dereference;
-#define flag_isolate_erroneous_paths_dereference global_options.x_flag_isolate_erroneous_paths_dereference
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_ivopts;
-#else
-  int x_flag_ivopts;
-#define flag_ivopts global_options.x_flag_ivopts
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_jni;
-#else
-  int x_flag_jni;
-#define flag_jni global_options.x_flag_jni
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_jump_tables;
-#else
-  int x_flag_jump_tables;
-#define flag_jump_tables global_options.x_flag_jump_tables
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_keep_inline_dllexport;
-#else
-  int x_flag_keep_inline_dllexport;
-#define flag_keep_inline_dllexport global_options.x_flag_keep_inline_dllexport
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_keep_inline_functions;
-#else
-  int x_flag_keep_inline_functions;
-#define flag_keep_inline_functions global_options.x_flag_keep_inline_functions
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_keep_static_consts;
-#else
-  int x_flag_keep_static_consts;
-#define flag_keep_static_consts global_options.x_flag_keep_static_consts
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_lax_vector_conversions;
-#else
-  int x_flag_lax_vector_conversions;
-#define flag_lax_vector_conversions global_options.x_flag_lax_vector_conversions
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_leading_underscore;
-#else
-  int x_flag_leading_underscore;
-#define flag_leading_underscore global_options.x_flag_leading_underscore
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_live_range_shrinkage;
-#else
-  int x_flag_live_range_shrinkage;
-#define flag_live_range_shrinkage global_options.x_flag_live_range_shrinkage
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_loop_block;
-#else
-  int x_flag_loop_block;
-#define flag_loop_block global_options.x_flag_loop_block
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_loop_interchange;
-#else
-  int x_flag_loop_interchange;
-#define flag_loop_interchange global_options.x_flag_loop_interchange
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_loop_optimize_isl;
-#else
-  int x_flag_loop_optimize_isl;
-#define flag_loop_optimize_isl global_options.x_flag_loop_optimize_isl
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_loop_parallelize_all;
-#else
-  int x_flag_loop_parallelize_all;
-#define flag_loop_parallelize_all global_options.x_flag_loop_parallelize_all
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_loop_strip_mine;
-#else
-  int x_flag_loop_strip_mine;
-#define flag_loop_strip_mine global_options.x_flag_loop_strip_mine
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_lto_compression_level;
-#else
-  int x_flag_lto_compression_level;
-#define flag_lto_compression_level global_options.x_flag_lto_compression_level
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_lto_partition_1to1;
-#else
-  int x_flag_lto_partition_1to1;
-#define flag_lto_partition_1to1 global_options.x_flag_lto_partition_1to1
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_lto_partition_balanced;
-#else
-  int x_flag_lto_partition_balanced;
-#define flag_lto_partition_balanced global_options.x_flag_lto_partition_balanced
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_lto_partition_max;
-#else
-  int x_flag_lto_partition_max;
-#define flag_lto_partition_max global_options.x_flag_lto_partition_max
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_lto_partition_none;
-#else
-  int x_flag_lto_partition_none;
-#define flag_lto_partition_none global_options.x_flag_lto_partition_none
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_lto_report;
-#else
-  int x_flag_lto_report;
-#define flag_lto_report global_options.x_flag_lto_report
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_lto_report_wpa;
-#else
-  int x_flag_lto_report_wpa;
-#define flag_lto_report_wpa global_options.x_flag_lto_report_wpa
-#endif
-#ifdef GENERATOR_FILE
-extern const char *flag_lto;
-#else
-  const char *x_flag_lto;
-#define flag_lto global_options.x_flag_lto
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_ltrans;
-#else
-  int x_flag_ltrans;
-#define flag_ltrans global_options.x_flag_ltrans
-#endif
-#ifdef GENERATOR_FILE
-extern const char *ltrans_output_list;
-#else
-  const char *x_ltrans_output_list;
-#define ltrans_output_list global_options.x_ltrans_output_list
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_errno_math;
-#else
-  int x_flag_errno_math;
-#define flag_errno_math global_options.x_flag_errno_math
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_max_errors;
-#else
-  int x_flag_max_errors;
-#define flag_max_errors global_options.x_flag_max_errors
-#endif
-#ifdef GENERATOR_FILE
-extern int mem_report;
-#else
-  int x_mem_report;
-#define mem_report global_options.x_mem_report
-#endif
-#ifdef GENERATOR_FILE
-extern int mem_report_wpa;
-#else
-  int x_mem_report_wpa;
-#define mem_report_wpa global_options.x_mem_report_wpa
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_merge_constants;
-#else
-  int x_flag_merge_constants;
-#define flag_merge_constants global_options.x_flag_merge_constants
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_merge_debug_strings;
-#else
-  int x_flag_merge_debug_strings;
-#define flag_merge_debug_strings global_options.x_flag_merge_debug_strings
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_modulo_sched;
-#else
-  int x_flag_modulo_sched;
-#define flag_modulo_sched global_options.x_flag_modulo_sched
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_modulo_sched_allow_regmoves;
-#else
-  int x_flag_modulo_sched_allow_regmoves;
-#define flag_modulo_sched_allow_regmoves global_options.x_flag_modulo_sched_allow_regmoves
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_move_loop_invariants;
-#else
-  int x_flag_move_loop_invariants;
-#define flag_move_loop_invariants global_options.x_flag_move_loop_invariants
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_ms_extensions;
-#else
-  int x_flag_ms_extensions;
-#define flag_ms_extensions global_options.x_flag_ms_extensions
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_nil_receivers;
-#else
-  int x_flag_nil_receivers;
-#define flag_nil_receivers global_options.x_flag_nil_receivers
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_non_call_exceptions;
-#else
-  int x_flag_non_call_exceptions;
-#define flag_non_call_exceptions global_options.x_flag_non_call_exceptions
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_no_nonansi_builtin;
-#else
-  int x_flag_no_nonansi_builtin;
-#define flag_no_nonansi_builtin global_options.x_flag_no_nonansi_builtin
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_nothrow_opt;
-#else
-  int x_flag_nothrow_opt;
-#define flag_nothrow_opt global_options.x_flag_nothrow_opt
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_objc_abi;
-#else
-  int x_flag_objc_abi;
-#define flag_objc_abi global_options.x_flag_objc_abi
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_objc_call_cxx_cdtors;
-#else
-  int x_flag_objc_call_cxx_cdtors;
-#define flag_objc_call_cxx_cdtors global_options.x_flag_objc_call_cxx_cdtors
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_objc_direct_dispatch;
-#else
-  int x_flag_objc_direct_dispatch;
-#define flag_objc_direct_dispatch global_options.x_flag_objc_direct_dispatch
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_objc_exceptions;
-#else
-  int x_flag_objc_exceptions;
-#define flag_objc_exceptions global_options.x_flag_objc_exceptions
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_objc_gc;
-#else
-  int x_flag_objc_gc;
-#define flag_objc_gc global_options.x_flag_objc_gc
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_objc_nilcheck;
-#else
-  int x_flag_objc_nilcheck;
-#define flag_objc_nilcheck global_options.x_flag_objc_nilcheck
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_objc_sjlj_exceptions;
-#else
-  int x_flag_objc_sjlj_exceptions;
-#define flag_objc_sjlj_exceptions global_options.x_flag_objc_sjlj_exceptions
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_objc1_only;
-#else
-  int x_flag_objc1_only;
-#define flag_objc1_only global_options.x_flag_objc1_only
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_omit_frame_pointer;
-#else
-  int x_flag_omit_frame_pointer;
-#define flag_omit_frame_pointer global_options.x_flag_omit_frame_pointer
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_openmp;
-#else
-  int x_flag_openmp;
-#define flag_openmp global_options.x_flag_openmp
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_openmp_simd;
-#else
-  int x_flag_openmp_simd;
-#define flag_openmp_simd global_options.x_flag_openmp_simd
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_opt_info;
-#else
-  int x_flag_opt_info;
-#define flag_opt_info global_options.x_flag_opt_info
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_optimize_sibling_calls;
-#else
-  int x_flag_optimize_sibling_calls;
-#define flag_optimize_sibling_calls global_options.x_flag_optimize_sibling_calls
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_optimize_sci;
-#else
-  int x_flag_optimize_sci;
-#define flag_optimize_sci global_options.x_flag_optimize_sci
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_optimize_strlen;
-#else
-  int x_flag_optimize_strlen;
-#define flag_optimize_strlen global_options.x_flag_optimize_strlen
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_pack_struct;
-#else
-  int x_flag_pack_struct;
-#define flag_pack_struct global_options.x_flag_pack_struct
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_partial_inlining;
-#else
-  int x_flag_partial_inlining;
-#define flag_partial_inlining global_options.x_flag_partial_inlining
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_pcc_struct_return;
-#else
-  int x_flag_pcc_struct_return;
-#define flag_pcc_struct_return global_options.x_flag_pcc_struct_return
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_peel_loops;
-#else
-  int x_flag_peel_loops;
-#define flag_peel_loops global_options.x_flag_peel_loops
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_no_peephole;
-#else
-  int x_flag_no_peephole;
-#define flag_no_peephole global_options.x_flag_no_peephole
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_peephole2;
-#else
-  int x_flag_peephole2;
-#define flag_peephole2 global_options.x_flag_peephole2
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_permissive;
-#else
-  int x_flag_permissive;
-#define flag_permissive global_options.x_flag_permissive
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_plan9_extensions;
-#else
-  int x_flag_plan9_extensions;
-#define flag_plan9_extensions global_options.x_flag_plan9_extensions
-#endif
-#ifdef GENERATOR_FILE
-extern int post_ipa_mem_report;
-#else
-  int x_post_ipa_mem_report;
-#define post_ipa_mem_report global_options.x_post_ipa_mem_report
-#endif
-#ifdef GENERATOR_FILE
-extern int pre_ipa_mem_report;
-#else
-  int x_pre_ipa_mem_report;
-#define pre_ipa_mem_report global_options.x_pre_ipa_mem_report
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_predictive_commoning;
-#else
-  int x_flag_predictive_commoning;
-#define flag_predictive_commoning global_options.x_flag_predictive_commoning
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_prefetch_loop_arrays;
-#else
-  int x_flag_prefetch_loop_arrays;
-#define flag_prefetch_loop_arrays global_options.x_flag_prefetch_loop_arrays
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_pretty_templates;
-#else
-  int x_flag_pretty_templates;
-#define flag_pretty_templates global_options.x_flag_pretty_templates
-#endif
-#ifdef GENERATOR_FILE
-extern int profile_flag;
-#else
-  int x_profile_flag;
-#define profile_flag global_options.x_profile_flag
-#endif
-#ifdef GENERATOR_FILE
-extern int profile_arc_flag;
-#else
-  int x_profile_arc_flag;
-#define profile_arc_flag global_options.x_profile_arc_flag
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_profile_correction;
-#else
-  int x_flag_profile_correction;
-#define flag_profile_correction global_options.x_flag_profile_correction
-#endif
-#ifdef GENERATOR_FILE
-extern const char *profile_data_prefix;
-#else
-  const char *x_profile_data_prefix;
-#define profile_data_prefix global_options.x_profile_data_prefix
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_profile_reorder_functions;
-#else
-  int x_flag_profile_reorder_functions;
-#define flag_profile_reorder_functions global_options.x_flag_profile_reorder_functions
-#endif
-#ifdef GENERATOR_FILE
-extern int profile_report;
-#else
-  int x_profile_report;
-#define profile_report global_options.x_profile_report
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_profile_use;
-#else
-  int x_flag_profile_use;
-#define flag_profile_use global_options.x_flag_profile_use
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_profile_values;
-#else
-  int x_flag_profile_values;
-#define flag_profile_values global_options.x_flag_profile_values
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_reciprocal_math;
-#else
-  int x_flag_reciprocal_math;
-#define flag_reciprocal_math global_options.x_flag_reciprocal_math
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_record_gcc_switches;
-#else
-  int x_flag_record_gcc_switches;
-#define flag_record_gcc_switches global_options.x_flag_record_gcc_switches
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_reduced_reflection;
-#else
-  int x_flag_reduced_reflection;
-#define flag_reduced_reflection global_options.x_flag_reduced_reflection
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_ree;
-#else
-  int x_flag_ree;
-#define flag_ree global_options.x_flag_ree
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_rename_registers;
-#else
-  int x_flag_rename_registers;
-#define flag_rename_registers global_options.x_flag_rename_registers
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_reorder_blocks;
-#else
-  int x_flag_reorder_blocks;
-#define flag_reorder_blocks global_options.x_flag_reorder_blocks
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_reorder_blocks_and_partition;
-#else
-  int x_flag_reorder_blocks_and_partition;
-#define flag_reorder_blocks_and_partition global_options.x_flag_reorder_blocks_and_partition
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_reorder_functions;
-#else
-  int x_flag_reorder_functions;
-#define flag_reorder_functions global_options.x_flag_reorder_functions
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_replace_objc_classes;
-#else
-  int x_flag_replace_objc_classes;
-#define flag_replace_objc_classes global_options.x_flag_replace_objc_classes
-#endif
-#ifdef GENERATOR_FILE
-extern int go_require_return_statement;
-#else
-  int x_go_require_return_statement;
-#define go_require_return_statement global_options.x_go_require_return_statement
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_rerun_cse_after_loop;
-#else
-  int x_flag_rerun_cse_after_loop;
-#define flag_rerun_cse_after_loop global_options.x_flag_rerun_cse_after_loop
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_resched_modulo_sched;
-#else
-  int x_flag_resched_modulo_sched;
-#define flag_resched_modulo_sched global_options.x_flag_resched_modulo_sched
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_rounding_math;
-#else
-  int x_flag_rounding_math;
-#define flag_rounding_math global_options.x_flag_rounding_math
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_rtti;
-#else
-  int x_flag_rtti;
-#define flag_rtti global_options.x_flag_rtti
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_sched_critical_path_heuristic;
-#else
-  int x_flag_sched_critical_path_heuristic;
-#define flag_sched_critical_path_heuristic global_options.x_flag_sched_critical_path_heuristic
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_sched_dep_count_heuristic;
-#else
-  int x_flag_sched_dep_count_heuristic;
-#define flag_sched_dep_count_heuristic global_options.x_flag_sched_dep_count_heuristic
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_sched_group_heuristic;
-#else
-  int x_flag_sched_group_heuristic;
-#define flag_sched_group_heuristic global_options.x_flag_sched_group_heuristic
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_schedule_interblock;
-#else
-  int x_flag_schedule_interblock;
-#define flag_schedule_interblock global_options.x_flag_schedule_interblock
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_sched_last_insn_heuristic;
-#else
-  int x_flag_sched_last_insn_heuristic;
-#define flag_sched_last_insn_heuristic global_options.x_flag_sched_last_insn_heuristic
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_sched_pressure;
-#else
-  int x_flag_sched_pressure;
-#define flag_sched_pressure global_options.x_flag_sched_pressure
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_sched_rank_heuristic;
-#else
-  int x_flag_sched_rank_heuristic;
-#define flag_sched_rank_heuristic global_options.x_flag_sched_rank_heuristic
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_schedule_speculative;
-#else
-  int x_flag_schedule_speculative;
-#define flag_schedule_speculative global_options.x_flag_schedule_speculative
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_sched_spec_insn_heuristic;
-#else
-  int x_flag_sched_spec_insn_heuristic;
-#define flag_sched_spec_insn_heuristic global_options.x_flag_sched_spec_insn_heuristic
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_schedule_speculative_load;
-#else
-  int x_flag_schedule_speculative_load;
-#define flag_schedule_speculative_load global_options.x_flag_schedule_speculative_load
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_schedule_speculative_load_dangerous;
-#else
-  int x_flag_schedule_speculative_load_dangerous;
-#define flag_schedule_speculative_load_dangerous global_options.x_flag_schedule_speculative_load_dangerous
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_sched_stalled_insns;
-#else
-  int x_flag_sched_stalled_insns;
-#define flag_sched_stalled_insns global_options.x_flag_sched_stalled_insns
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_sched_stalled_insns_dep;
-#else
-  int x_flag_sched_stalled_insns_dep;
-#define flag_sched_stalled_insns_dep global_options.x_flag_sched_stalled_insns_dep
-#endif
-#ifdef GENERATOR_FILE
-extern int sched_verbose_param;
-#else
-  int x_sched_verbose_param;
-#define sched_verbose_param global_options.x_sched_verbose_param
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_sched2_use_superblocks;
-#else
-  int x_flag_sched2_use_superblocks;
-#define flag_sched2_use_superblocks global_options.x_flag_sched2_use_superblocks
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_schedule_insns;
-#else
-  int x_flag_schedule_insns;
-#define flag_schedule_insns global_options.x_flag_schedule_insns
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_schedule_insns_after_reload;
-#else
-  int x_flag_schedule_insns_after_reload;
-#define flag_schedule_insns_after_reload global_options.x_flag_schedule_insns_after_reload
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_section_anchors;
-#else
-  int x_flag_section_anchors;
-#define flag_section_anchors global_options.x_flag_section_anchors
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_sel_sched_pipelining;
-#else
-  int x_flag_sel_sched_pipelining;
-#define flag_sel_sched_pipelining global_options.x_flag_sel_sched_pipelining
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_sel_sched_pipelining_outer_loops;
-#else
-  int x_flag_sel_sched_pipelining_outer_loops;
-#define flag_sel_sched_pipelining_outer_loops global_options.x_flag_sel_sched_pipelining_outer_loops
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_sel_sched_reschedule_pipelined;
-#else
-  int x_flag_sel_sched_reschedule_pipelined;
-#define flag_sel_sched_reschedule_pipelined global_options.x_flag_sel_sched_reschedule_pipelined
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_selective_scheduling;
-#else
-  int x_flag_selective_scheduling;
-#define flag_selective_scheduling global_options.x_flag_selective_scheduling
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_selective_scheduling2;
-#else
-  int x_flag_selective_scheduling2;
-#define flag_selective_scheduling2 global_options.x_flag_selective_scheduling2
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_short_double;
-#else
-  int x_flag_short_double;
-#define flag_short_double global_options.x_flag_short_double
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_short_enums;
-#else
-  int x_flag_short_enums;
-#define flag_short_enums global_options.x_flag_short_enums
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_short_wchar;
-#else
-  int x_flag_short_wchar;
-#define flag_short_wchar global_options.x_flag_short_wchar
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_show_column;
-#else
-  int x_flag_show_column;
-#define flag_show_column global_options.x_flag_show_column
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_shrink_wrap;
-#else
-  int x_flag_shrink_wrap;
-#define flag_shrink_wrap global_options.x_flag_shrink_wrap
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_signaling_nans;
-#else
-  int x_flag_signaling_nans;
-#define flag_signaling_nans global_options.x_flag_signaling_nans
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_signed_bitfields;
-#else
-  int x_flag_signed_bitfields;
-#define flag_signed_bitfields global_options.x_flag_signed_bitfields
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_signed_char;
-#else
-  int x_flag_signed_char;
-#define flag_signed_char global_options.x_flag_signed_char
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_signed_zeros;
-#else
-  int x_flag_signed_zeros;
-#define flag_signed_zeros global_options.x_flag_signed_zeros
-#endif
-#ifdef GENERATOR_FILE
-extern enum vect_cost_model flag_simd_cost_model;
-#else
-  enum vect_cost_model x_flag_simd_cost_model;
-#define flag_simd_cost_model global_options.x_flag_simd_cost_model
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_single_precision_constant;
-#else
-  int x_flag_single_precision_constant;
-#define flag_single_precision_constant global_options.x_flag_single_precision_constant
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_split_ivs_in_unroller;
-#else
-  int x_flag_split_ivs_in_unroller;
-#define flag_split_ivs_in_unroller global_options.x_flag_split_ivs_in_unroller
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_split_stack;
-#else
-  int x_flag_split_stack;
-#define flag_split_stack global_options.x_flag_split_stack
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_split_wide_types;
-#else
-  int x_flag_split_wide_types;
-#define flag_split_wide_types global_options.x_flag_split_wide_types
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_stack_protect;
-#else
-  int x_flag_stack_protect;
-#define flag_stack_protect global_options.x_flag_stack_protect
-#endif
-#ifdef GENERATOR_FILE
-extern enum stack_reuse_level flag_stack_reuse;
-#else
-  enum stack_reuse_level x_flag_stack_reuse;
-#define flag_stack_reuse global_options.x_flag_stack_reuse
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_stack_usage;
-#else
-  int x_flag_stack_usage;
-#define flag_stack_usage global_options.x_flag_stack_usage
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_detailed_statistics;
-#else
-  int x_flag_detailed_statistics;
-#define flag_detailed_statistics global_options.x_flag_detailed_statistics
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_store_check;
-#else
-  int x_flag_store_check;
-#define flag_store_check global_options.x_flag_store_check
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_strict_aliasing;
-#else
-  int x_flag_strict_aliasing;
-#define flag_strict_aliasing global_options.x_flag_strict_aliasing
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_strict_enums;
-#else
-  int x_flag_strict_enums;
-#define flag_strict_enums global_options.x_flag_strict_enums
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_strict_overflow;
-#else
-  int x_flag_strict_overflow;
-#define flag_strict_overflow global_options.x_flag_strict_overflow
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_strict_volatile_bitfields;
-#else
-  int x_flag_strict_volatile_bitfields;
-#define flag_strict_volatile_bitfields global_options.x_flag_strict_volatile_bitfields
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_sync_libcalls;
-#else
-  int x_flag_sync_libcalls;
-#define flag_sync_libcalls global_options.x_flag_sync_libcalls
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_syntax_only;
-#else
-  int x_flag_syntax_only;
-#define flag_syntax_only global_options.x_flag_syntax_only
-#endif
-#ifdef GENERATOR_FILE
-extern int template_backtrace_limit;
-#else
-  int x_template_backtrace_limit;
-#define template_backtrace_limit global_options.x_template_backtrace_limit
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_test_coverage;
-#else
-  int x_flag_test_coverage;
-#define flag_test_coverage global_options.x_flag_test_coverage
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_thread_jumps;
-#else
-  int x_flag_thread_jumps;
-#define flag_thread_jumps global_options.x_flag_thread_jumps
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_threadsafe_statics;
-#else
-  int x_flag_threadsafe_statics;
-#define flag_threadsafe_statics global_options.x_flag_threadsafe_statics
-#endif
-#ifdef GENERATOR_FILE
-extern int time_report;
-#else
-  int x_time_report;
-#define time_report global_options.x_time_report
-#endif
-#ifdef GENERATOR_FILE
-extern enum tls_model flag_tls_default;
-#else
-  enum tls_model x_flag_tls_default;
-#define flag_tls_default global_options.x_flag_tls_default
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_toplevel_reorder;
-#else
-  int x_flag_toplevel_reorder;
-#define flag_toplevel_reorder global_options.x_flag_toplevel_reorder
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tracer;
-#else
-  int x_flag_tracer;
-#define flag_tracer global_options.x_flag_tracer
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_trapping_math;
-#else
-  int x_flag_trapping_math;
-#define flag_trapping_math global_options.x_flag_trapping_math
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_trapv;
-#else
-  int x_flag_trapv;
-#define flag_trapv global_options.x_flag_trapv
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_bit_ccp;
-#else
-  int x_flag_tree_bit_ccp;
-#define flag_tree_bit_ccp global_options.x_flag_tree_bit_ccp
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_builtin_call_dce;
-#else
-  int x_flag_tree_builtin_call_dce;
-#define flag_tree_builtin_call_dce global_options.x_flag_tree_builtin_call_dce
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_ccp;
-#else
-  int x_flag_tree_ccp;
-#define flag_tree_ccp global_options.x_flag_tree_ccp
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_ch;
-#else
-  int x_flag_tree_ch;
-#define flag_tree_ch global_options.x_flag_tree_ch
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_ssa_coalesce_vars;
-#else
-  int x_flag_ssa_coalesce_vars;
-#define flag_ssa_coalesce_vars global_options.x_flag_ssa_coalesce_vars
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_copy_prop;
-#else
-  int x_flag_tree_copy_prop;
-#define flag_tree_copy_prop global_options.x_flag_tree_copy_prop
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_copyrename;
-#else
-  int x_flag_tree_copyrename;
-#define flag_tree_copyrename global_options.x_flag_tree_copyrename
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_cselim;
-#else
-  int x_flag_tree_cselim;
-#define flag_tree_cselim global_options.x_flag_tree_cselim
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_dce;
-#else
-  int x_flag_tree_dce;
-#define flag_tree_dce global_options.x_flag_tree_dce
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_dom;
-#else
-  int x_flag_tree_dom;
-#define flag_tree_dom global_options.x_flag_tree_dom
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_dse;
-#else
-  int x_flag_tree_dse;
-#define flag_tree_dse global_options.x_flag_tree_dse
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_forwprop;
-#else
-  int x_flag_tree_forwprop;
-#define flag_tree_forwprop global_options.x_flag_tree_forwprop
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_fre;
-#else
-  int x_flag_tree_fre;
-#define flag_tree_fre global_options.x_flag_tree_fre
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_loop_distribute_patterns;
-#else
-  int x_flag_tree_loop_distribute_patterns;
-#define flag_tree_loop_distribute_patterns global_options.x_flag_tree_loop_distribute_patterns
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_loop_distribution;
-#else
-  int x_flag_tree_loop_distribution;
-#define flag_tree_loop_distribution global_options.x_flag_tree_loop_distribution
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_loop_if_convert;
-#else
-  int x_flag_tree_loop_if_convert;
-#define flag_tree_loop_if_convert global_options.x_flag_tree_loop_if_convert
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_loop_if_convert_stores;
-#else
-  int x_flag_tree_loop_if_convert_stores;
-#define flag_tree_loop_if_convert_stores global_options.x_flag_tree_loop_if_convert_stores
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_loop_im;
-#else
-  int x_flag_tree_loop_im;
-#define flag_tree_loop_im global_options.x_flag_tree_loop_im
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_loop_ivcanon;
-#else
-  int x_flag_tree_loop_ivcanon;
-#define flag_tree_loop_ivcanon global_options.x_flag_tree_loop_ivcanon
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_loop_optimize;
-#else
-  int x_flag_tree_loop_optimize;
-#define flag_tree_loop_optimize global_options.x_flag_tree_loop_optimize
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_loop_vectorize;
-#else
-  int x_flag_tree_loop_vectorize;
-#define flag_tree_loop_vectorize global_options.x_flag_tree_loop_vectorize
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_live_range_split;
-#else
-  int x_flag_tree_live_range_split;
-#define flag_tree_live_range_split global_options.x_flag_tree_live_range_split
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_parallelize_loops;
-#else
-  int x_flag_tree_parallelize_loops;
-#define flag_tree_parallelize_loops global_options.x_flag_tree_parallelize_loops
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_partial_pre;
-#else
-  int x_flag_tree_partial_pre;
-#define flag_tree_partial_pre global_options.x_flag_tree_partial_pre
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_phiprop;
-#else
-  int x_flag_tree_phiprop;
-#define flag_tree_phiprop global_options.x_flag_tree_phiprop
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_pre;
-#else
-  int x_flag_tree_pre;
-#define flag_tree_pre global_options.x_flag_tree_pre
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_pta;
-#else
-  int x_flag_tree_pta;
-#define flag_tree_pta global_options.x_flag_tree_pta
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_reassoc;
-#else
-  int x_flag_tree_reassoc;
-#define flag_tree_reassoc global_options.x_flag_tree_reassoc
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_scev_cprop;
-#else
-  int x_flag_tree_scev_cprop;
-#define flag_tree_scev_cprop global_options.x_flag_tree_scev_cprop
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_sink;
-#else
-  int x_flag_tree_sink;
-#define flag_tree_sink global_options.x_flag_tree_sink
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_slp_vectorize;
-#else
-  int x_flag_tree_slp_vectorize;
-#define flag_tree_slp_vectorize global_options.x_flag_tree_slp_vectorize
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_slsr;
-#else
-  int x_flag_tree_slsr;
-#define flag_tree_slsr global_options.x_flag_tree_slsr
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_sra;
-#else
-  int x_flag_tree_sra;
-#define flag_tree_sra global_options.x_flag_tree_sra
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_switch_conversion;
-#else
-  int x_flag_tree_switch_conversion;
-#define flag_tree_switch_conversion global_options.x_flag_tree_switch_conversion
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_tail_merge;
-#else
-  int x_flag_tree_tail_merge;
-#define flag_tree_tail_merge global_options.x_flag_tree_tail_merge
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_ter;
-#else
-  int x_flag_tree_ter;
-#define flag_tree_ter global_options.x_flag_tree_ter
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_vectorize;
-#else
-  int x_flag_tree_vectorize;
-#define flag_tree_vectorize global_options.x_flag_tree_vectorize
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_tree_vrp;
-#else
-  int x_flag_tree_vrp;
-#define flag_tree_vrp global_options.x_flag_tree_vrp
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_unit_at_a_time;
-#else
-  int x_flag_unit_at_a_time;
-#define flag_unit_at_a_time global_options.x_flag_unit_at_a_time
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_unroll_all_loops;
-#else
-  int x_flag_unroll_all_loops;
-#define flag_unroll_all_loops global_options.x_flag_unroll_all_loops
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_unroll_loops;
-#else
-  int x_flag_unroll_loops;
-#define flag_unroll_loops global_options.x_flag_unroll_loops
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_unsafe_loop_optimizations;
-#else
-  int x_flag_unsafe_loop_optimizations;
-#define flag_unsafe_loop_optimizations global_options.x_flag_unsafe_loop_optimizations
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_unsafe_math_optimizations;
-#else
-  int x_flag_unsafe_math_optimizations;
-#define flag_unsafe_math_optimizations global_options.x_flag_unsafe_math_optimizations
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_unswitch_loops;
-#else
-  int x_flag_unswitch_loops;
-#define flag_unswitch_loops global_options.x_flag_unswitch_loops
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_unwind_tables;
-#else
-  int x_flag_unwind_tables;
-#define flag_unwind_tables global_options.x_flag_unwind_tables
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_use_atomic_builtins;
-#else
-  int x_flag_use_atomic_builtins;
-#define flag_use_atomic_builtins global_options.x_flag_use_atomic_builtins
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_use_boehm_gc;
-#else
-  int x_flag_use_boehm_gc;
-#define flag_use_boehm_gc global_options.x_flag_use_boehm_gc
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_use_cxa_atexit;
-#else
-  int x_flag_use_cxa_atexit;
-#define flag_use_cxa_atexit global_options.x_flag_use_cxa_atexit
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_use_cxa_get_exception_ptr;
-#else
-  int x_flag_use_cxa_get_exception_ptr;
-#define flag_use_cxa_get_exception_ptr global_options.x_flag_use_cxa_get_exception_ptr
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_use_divide_subroutine;
-#else
-  int x_flag_use_divide_subroutine;
-#define flag_use_divide_subroutine global_options.x_flag_use_divide_subroutine
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_use_linker_plugin;
-#else
-  int x_flag_use_linker_plugin;
-#define flag_use_linker_plugin global_options.x_flag_use_linker_plugin
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_var_tracking;
-#else
-  int x_flag_var_tracking;
-#define flag_var_tracking global_options.x_flag_var_tracking
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_var_tracking_assignments;
-#else
-  int x_flag_var_tracking_assignments;
-#define flag_var_tracking_assignments global_options.x_flag_var_tracking_assignments
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_var_tracking_assignments_toggle;
-#else
-  int x_flag_var_tracking_assignments_toggle;
-#define flag_var_tracking_assignments_toggle global_options.x_flag_var_tracking_assignments_toggle
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_var_tracking_uninit;
-#else
-  int x_flag_var_tracking_uninit;
-#define flag_var_tracking_uninit global_options.x_flag_var_tracking_uninit
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_variable_expansion_in_unroller;
-#else
-  int x_flag_variable_expansion_in_unroller;
-#define flag_variable_expansion_in_unroller global_options.x_flag_variable_expansion_in_unroller
-#endif
-#ifdef GENERATOR_FILE
-extern enum vect_cost_model flag_vect_cost_model;
-#else
-  enum vect_cost_model x_flag_vect_cost_model;
-#define flag_vect_cost_model global_options.x_flag_vect_cost_model
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_verbose_asm;
-#else
-  int x_flag_verbose_asm;
-#define flag_verbose_asm global_options.x_flag_verbose_asm
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_visibility_ms_compat;
-#else
-  int x_flag_visibility_ms_compat;
-#define flag_visibility_ms_compat global_options.x_flag_visibility_ms_compat
-#endif
-#ifdef GENERATOR_FILE
-extern enum symbol_visibility default_visibility;
-#else
-  enum symbol_visibility x_default_visibility;
-#define default_visibility global_options.x_default_visibility
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_value_profile_transformations;
-#else
-  int x_flag_value_profile_transformations;
-#define flag_value_profile_transformations global_options.x_flag_value_profile_transformations
-#endif
-#ifdef GENERATOR_FILE
-extern enum vtv_priority flag_vtable_verify;
-#else
-  enum vtv_priority x_flag_vtable_verify;
-#define flag_vtable_verify global_options.x_flag_vtable_verify
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_vtv_counts;
-#else
-  int x_flag_vtv_counts;
-#define flag_vtv_counts global_options.x_flag_vtv_counts
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_vtv_debug;
-#else
-  int x_flag_vtv_debug;
-#define flag_vtv_debug global_options.x_flag_vtv_debug
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_weak;
-#else
-  int x_flag_weak;
-#define flag_weak global_options.x_flag_weak
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_web;
-#else
-  int x_flag_web;
-#define flag_web global_options.x_flag_web
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_whole_program;
-#else
-  int x_flag_whole_program;
-#define flag_whole_program global_options.x_flag_whole_program
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_working_directory;
-#else
-  int x_flag_working_directory;
-#define flag_working_directory global_options.x_flag_working_directory
-#endif
-#ifdef GENERATOR_FILE
-extern const char *flag_wpa;
-#else
-  const char *x_flag_wpa;
-#define flag_wpa global_options.x_flag_wpa
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_wrapv;
-#else
-  int x_flag_wrapv;
-#define flag_wrapv global_options.x_flag_wrapv
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_zero_initialized_in_bss;
-#else
-  int x_flag_zero_initialized_in_bss;
-#define flag_zero_initialized_in_bss global_options.x_flag_zero_initialized_in_bss
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_zero_link;
-#else
-  int x_flag_zero_link;
-#define flag_zero_link global_options.x_flag_zero_link
-#endif
-#ifdef GENERATOR_FILE
-extern int dwarf_version;
-#else
-  int x_dwarf_version;
-#define dwarf_version global_options.x_dwarf_version
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_gen_declaration;
-#else
-  int x_flag_gen_declaration;
-#define flag_gen_declaration global_options.x_flag_gen_declaration
-#endif
-#ifdef GENERATOR_FILE
-extern int debug_generate_pub_sections;
-#else
-  int x_debug_generate_pub_sections;
-#define debug_generate_pub_sections global_options.x_debug_generate_pub_sections
-#endif
-#ifdef GENERATOR_FILE
-extern int dwarf_record_gcc_switches;
-#else
-  int x_dwarf_record_gcc_switches;
-#define dwarf_record_gcc_switches global_options.x_dwarf_record_gcc_switches
-#endif
-#ifdef GENERATOR_FILE
-extern int dwarf_split_debug_info;
-#else
-  int x_dwarf_split_debug_info;
-#define dwarf_split_debug_info global_options.x_dwarf_split_debug_info
-#endif
-#ifdef GENERATOR_FILE
-extern int dwarf_strict;
-#else
-  int x_dwarf_strict;
-#define dwarf_strict global_options.x_dwarf_strict
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_gtoggle;
-#else
-  int x_flag_gtoggle;
-#define flag_gtoggle global_options.x_flag_gtoggle
-#endif
-#ifdef GENERATOR_FILE
-extern const char *imultiarch;
-#else
-  const char *x_imultiarch;
-#define imultiarch global_options.x_imultiarch
-#endif
-#ifdef GENERATOR_FILE
-extern const char *plugindir_string;
-#else
-  const char *x_plugindir_string;
-#define plugindir_string global_options.x_plugindir_string
-#endif
-#ifdef GENERATOR_FILE
-extern enum arm_abi_type arm_abi;
-#else
-  enum arm_abi_type x_arm_abi;
-#define arm_abi global_options.x_arm_abi
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_android;
-#else
-  int x_flag_android;
-#define flag_android global_options.x_flag_android
-#endif
-#ifdef GENERATOR_FILE
-extern int arm_arch_option;
-#else
-  int x_arm_arch_option;
-#define arm_arch_option global_options.x_arm_arch_option
-#endif
-#ifdef GENERATOR_FILE
-extern int linux_libc;
-#else
-  int x_linux_libc;
-#define linux_libc global_options.x_linux_libc
-#endif
-#ifdef GENERATOR_FILE
-extern enum processor_type arm_cpu_option;
-#else
-  enum processor_type x_arm_cpu_option;
-#define arm_cpu_option global_options.x_arm_cpu_option
-#endif
-#ifdef GENERATOR_FILE
-extern int fix_cm3_ldrd;
-#else
-  int x_fix_cm3_ldrd;
-#define fix_cm3_ldrd global_options.x_fix_cm3_ldrd
-#endif
-#ifdef GENERATOR_FILE
-extern enum float_abi_type arm_float_abi;
-#else
-  enum float_abi_type x_arm_float_abi;
-#define arm_float_abi global_options.x_arm_float_abi
-#endif
-#ifdef GENERATOR_FILE
-extern enum arm_fp16_format_type arm_fp16_format;
-#else
-  enum arm_fp16_format_type x_arm_fp16_format;
-#define arm_fp16_format global_options.x_arm_fp16_format
-#endif
-#ifdef GENERATOR_FILE
-extern int arm_fpu_index;
-#else
-  int x_arm_fpu_index;
-#define arm_fpu_index global_options.x_arm_fpu_index
-#endif
-#ifdef GENERATOR_FILE
-extern int arm_lra_flag;
-#else
-  int x_arm_lra_flag;
-#define arm_lra_flag global_options.x_arm_lra_flag
-#endif
-#ifdef GENERATOR_FILE
-extern int use_neon_for_64bits;
-#else
-  int x_use_neon_for_64bits;
-#define use_neon_for_64bits global_options.x_use_neon_for_64bits
-#endif
-#ifdef GENERATOR_FILE
-extern int arm_pic_data_is_text_relative;
-#else
-  int x_arm_pic_data_is_text_relative;
-#define arm_pic_data_is_text_relative global_options.x_arm_pic_data_is_text_relative
-#endif
-#ifdef GENERATOR_FILE
-extern const char *arm_pic_register_string;
-#else
-  const char *x_arm_pic_register_string;
-#define arm_pic_register_string global_options.x_arm_pic_register_string
-#endif
-#ifdef GENERATOR_FILE
-extern int arm_restrict_it;
-#else
-  int x_arm_restrict_it;
-#define arm_restrict_it global_options.x_arm_restrict_it
-#endif
-#ifdef GENERATOR_FILE
-extern int target_slow_flash_data;
-#else
-  int x_target_slow_flash_data;
-#define target_slow_flash_data global_options.x_target_slow_flash_data
-#endif
-#ifdef GENERATOR_FILE
-extern int arm_structure_size_boundary;
-#else
-  int x_arm_structure_size_boundary;
-#define arm_structure_size_boundary global_options.x_arm_structure_size_boundary
-#endif
-#ifdef GENERATOR_FILE
-extern enum arm_tls_type target_tls_dialect;
-#else
-  enum arm_tls_type x_target_tls_dialect;
-#define target_tls_dialect global_options.x_target_tls_dialect
-#endif
-#ifdef GENERATOR_FILE
-extern enum arm_tp_type target_thread_pointer;
-#else
-  enum arm_tp_type x_target_thread_pointer;
-#define target_thread_pointer global_options.x_target_thread_pointer
-#endif
-#ifdef GENERATOR_FILE
-extern enum processor_type arm_tune_option;
-#else
-  enum processor_type x_arm_tune_option;
-#define arm_tune_option global_options.x_arm_tune_option
-#endif
-#ifdef GENERATOR_FILE
-extern int unaligned_access;
-#else
-  int x_unaligned_access;
-#define unaligned_access global_options.x_unaligned_access
-#endif
-#ifdef GENERATOR_FILE
-extern int target_word_relocations;
-#else
-  int x_target_word_relocations;
-#define target_word_relocations global_options.x_target_word_relocations
-#endif
-#ifdef GENERATOR_FILE
-extern const char *asm_file_name;
-#else
-  const char *x_asm_file_name;
-#define asm_file_name global_options.x_asm_file_name
-#endif
-#ifdef GENERATOR_FILE
-extern int pass_exit_codes;
-#else
-  int x_pass_exit_codes;
-#define pass_exit_codes global_options.x_pass_exit_codes
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_pedantic_errors;
-#else
-  int x_flag_pedantic_errors;
-#define flag_pedantic_errors global_options.x_flag_pedantic_errors
-#endif
-#ifdef GENERATOR_FILE
-extern int use_pipes;
-#else
-  int x_use_pipes;
-#define use_pipes global_options.x_use_pipes
-#endif
-#ifdef GENERATOR_FILE
-extern const char *print_file_name;
-#else
-  const char *x_print_file_name;
-#define print_file_name global_options.x_print_file_name
-#endif
-#ifdef GENERATOR_FILE
-extern int print_multi_directory;
-#else
-  int x_print_multi_directory;
-#define print_multi_directory global_options.x_print_multi_directory
-#endif
-#ifdef GENERATOR_FILE
-extern int print_multi_lib;
-#else
-  int x_print_multi_lib;
-#define print_multi_lib global_options.x_print_multi_lib
-#endif
-#ifdef GENERATOR_FILE
-extern int print_multi_os_directory;
-#else
-  int x_print_multi_os_directory;
-#define print_multi_os_directory global_options.x_print_multi_os_directory
-#endif
-#ifdef GENERATOR_FILE
-extern int print_multiarch;
-#else
-  int x_print_multiarch;
-#define print_multiarch global_options.x_print_multiarch
-#endif
-#ifdef GENERATOR_FILE
-extern const char *print_prog_name;
-#else
-  const char *x_print_prog_name;
-#define print_prog_name global_options.x_print_prog_name
-#endif
-#ifdef GENERATOR_FILE
-extern int print_search_dirs;
-#else
-  int x_print_search_dirs;
-#define print_search_dirs global_options.x_print_search_dirs
-#endif
-#ifdef GENERATOR_FILE
-extern int print_sysroot;
-#else
-  int x_print_sysroot;
-#define print_sysroot global_options.x_print_sysroot
-#endif
-#ifdef GENERATOR_FILE
-extern int print_sysroot_headers_suffix;
-#else
-  int x_print_sysroot_headers_suffix;
-#define print_sysroot_headers_suffix global_options.x_print_sysroot_headers_suffix
-#endif
-#ifdef GENERATOR_FILE
-extern int quiet_flag;
-#else
-  int x_quiet_flag;
-#define quiet_flag global_options.x_quiet_flag
-#endif
-#ifdef GENERATOR_FILE
-extern int report_times;
-#else
-  int x_report_times;
-#define report_times global_options.x_report_times
-#endif
-#ifdef GENERATOR_FILE
-extern int flag_undef;
-#else
-  int x_flag_undef;
-#define flag_undef global_options.x_flag_undef
-#endif
-#ifdef GENERATOR_FILE
-extern int verbose_flag;
-#else
-  int x_verbose_flag;
-#define verbose_flag global_options.x_verbose_flag
-#endif
-#ifdef GENERATOR_FILE
-extern int version_flag;
-#else
-  int x_version_flag;
-#define version_flag global_options.x_version_flag
-#endif
-#ifdef GENERATOR_FILE
-extern int inhibit_warnings;
-#else
-  int x_inhibit_warnings;
-#define inhibit_warnings global_options.x_inhibit_warnings
-#endif
-#ifdef GENERATOR_FILE
-extern const char *wrapper_string;
-#else
-  const char *x_wrapper_string;
-#define wrapper_string global_options.x_wrapper_string
-#endif
-#ifndef GENERATOR_FILE
-  bool frontend_set_flag_associative_math;
-#endif
-#ifndef GENERATOR_FILE
-  bool frontend_set_flag_cx_limited_range;
-#endif
-#ifndef GENERATOR_FILE
-  bool frontend_set_flag_finite_math_only;
-#endif
-#ifndef GENERATOR_FILE
-  bool frontend_set_flag_errno_math;
-#endif
-#ifndef GENERATOR_FILE
-  bool frontend_set_flag_reciprocal_math;
-#endif
-#ifndef GENERATOR_FILE
-  bool frontend_set_flag_rounding_math;
-#endif
-#ifndef GENERATOR_FILE
-  bool frontend_set_flag_signaling_nans;
-#endif
-#ifndef GENERATOR_FILE
-  bool frontend_set_flag_signed_zeros;
-#endif
-#ifndef GENERATOR_FILE
-  bool frontend_set_flag_trapping_math;
-#endif
-#ifndef GENERATOR_FILE
-  bool frontend_set_flag_unsafe_math_optimizations;
-#endif
-#ifndef GENERATOR_FILE
-};
-extern struct gcc_options global_options;
-extern const struct gcc_options global_options_init;
-extern struct gcc_options global_options_set;
-#define target_flags_explicit global_options_set.x_target_flags
-#endif
-#endif
-
-#if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS) && !defined(IN_RTS)
-
-/* Structure to save/restore optimization and target specific options.  */
-struct GTY(()) cl_optimization
-{
-  int x_align_functions;
-  int x_align_jumps;
-  int x_align_labels;
-  int x_align_loops;
-  int x_flag_sched_stalled_insns;
-  int x_flag_sched_stalled_insns_dep;
-  enum fp_contract_mode x_flag_fp_contract_mode;
-  unsigned char x_optimize;
-  unsigned char x_optimize_size;
-  signed char x_flag_aggressive_loop_optimizations;
-  signed char x_flag_asynchronous_unwind_tables;
-  signed char x_flag_branch_on_count_reg;
-  signed char x_flag_branch_probabilities;
-  signed char x_flag_branch_target_load_optimize;
-  signed char x_flag_branch_target_load_optimize2;
-  signed char x_flag_btr_bb_exclusive;
-  signed char x_flag_caller_saves;
-  signed char x_flag_combine_stack_adjustments;
-  signed char x_flag_no_common;
-  signed char x_flag_compare_elim_after_reload;
-  signed char x_flag_conserve_stack;
-  signed char x_flag_cprop_registers;
-  signed char x_flag_crossjumping;
-  signed char x_flag_cse_follow_jumps;
-  signed char x_flag_cx_fortran_rules;
-  signed char x_flag_cx_limited_range;
-  signed char x_flag_data_sections;
-  signed char x_flag_dce;
-  signed char x_flag_defer_pop;
-  signed char x_flag_delayed_branch;
-  signed char x_flag_delete_null_pointer_checks;
-  signed char x_flag_devirtualize;
-  signed char x_flag_devirtualize_speculatively;
-  signed char x_flag_dse;
-  signed char x_flag_early_inlining;
-  signed char x_flag_exceptions;
-  signed char x_flag_expensive_optimizations;
-  signed char x_flag_finite_math_only;
-  signed char x_flag_float_store;
-  signed char x_flag_forward_propagate;
-  signed char x_flag_gcse;
-  signed char x_flag_gcse_after_reload;
-  signed char x_flag_gcse_las;
-  signed char x_flag_gcse_lm;
-  signed char x_flag_gcse_sm;
-  signed char x_flag_graphite_identity;
-  signed char x_flag_guess_branch_prob;
-  signed char x_flag_hoist_adjacent_loads;
-  signed char x_flag_if_conversion;
-  signed char x_flag_if_conversion2;
-  signed char x_flag_no_inline;
-  signed char x_flag_inline_atomics;
-  signed char x_flag_inline_functions;
-  signed char x_flag_inline_functions_called_once;
-  signed char x_flag_inline_small_functions;
-  signed char x_flag_ipa_cp;
-  signed char x_flag_ipa_cp_clone;
-  signed char x_flag_ipa_profile;
-  signed char x_flag_ipa_pta;
-  signed char x_flag_ipa_pure_const;
-  signed char x_flag_ipa_reference;
-  signed char x_flag_ipa_sra;
-  signed char x_flag_ira_hoist_pressure;
-  signed char x_flag_ira_loop_pressure;
-  signed char x_flag_isolate_erroneous_paths_attribute;
-  signed char x_flag_isolate_erroneous_paths_dereference;
-  signed char x_flag_ivopts;
-  signed char x_flag_jump_tables;
-  signed char x_flag_live_range_shrinkage;
-  signed char x_flag_loop_block;
-  signed char x_flag_loop_interchange;
-  signed char x_flag_loop_optimize_isl;
-  signed char x_flag_loop_parallelize_all;
-  signed char x_flag_loop_strip_mine;
-  signed char x_flag_errno_math;
-  signed char x_flag_merge_constants;
-  signed char x_flag_modulo_sched;
-  signed char x_flag_move_loop_invariants;
-  signed char x_flag_non_call_exceptions;
-  signed char x_flag_nothrow_opt;
-  signed char x_flag_omit_frame_pointer;
-  signed char x_flag_opt_info;
-  signed char x_flag_optimize_sibling_calls;
-  signed char x_flag_optimize_strlen;
-  signed char x_flag_pack_struct;
-  signed char x_flag_peel_loops;
-  signed char x_flag_no_peephole;
-  signed char x_flag_peephole2;
-  signed char x_flag_predictive_commoning;
-  signed char x_flag_prefetch_loop_arrays;
-  signed char x_flag_pcc_struct_return;
-  signed char x_flag_rename_registers;
-  signed char x_flag_reorder_blocks;
-  signed char x_flag_reorder_blocks_and_partition;
-  signed char x_flag_reorder_functions;
-  signed char x_flag_rerun_cse_after_loop;
-  signed char x_flag_resched_modulo_sched;
-  signed char x_flag_rounding_math;
-  signed char x_flag_rtti;
-  signed char x_flag_sched_critical_path_heuristic;
-  signed char x_flag_sched_dep_count_heuristic;
-  signed char x_flag_sched_group_heuristic;
-  signed char x_flag_schedule_interblock;
-  signed char x_flag_sched_last_insn_heuristic;
-  signed char x_flag_sched_pressure;
-  signed char x_flag_sched_rank_heuristic;
-  signed char x_flag_schedule_speculative;
-  signed char x_flag_sched_spec_insn_heuristic;
-  signed char x_flag_schedule_speculative_load;
-  signed char x_flag_schedule_speculative_load_dangerous;
-  signed char x_flag_sched2_use_superblocks;
-  signed char x_flag_schedule_insns;
-  signed char x_flag_schedule_insns_after_reload;
-  signed char x_flag_section_anchors;
-  signed char x_flag_sel_sched_pipelining;
-  signed char x_flag_sel_sched_pipelining_outer_loops;
-  signed char x_flag_sel_sched_reschedule_pipelined;
-  signed char x_flag_selective_scheduling;
-  signed char x_flag_selective_scheduling2;
-  signed char x_flag_short_double;
-  signed char x_flag_short_enums;
-  signed char x_flag_short_wchar;
-  signed char x_flag_shrink_wrap;
-  signed char x_flag_signaling_nans;
-  signed char x_flag_signed_zeros;
-  signed char x_flag_single_precision_constant;
-  signed char x_flag_split_ivs_in_unroller;
-  signed char x_flag_split_wide_types;
-  signed char x_flag_strict_aliasing;
-  signed char x_flag_strict_enums;
-  signed char x_flag_thread_jumps;
-  signed char x_flag_threadsafe_statics;
-  signed char x_flag_toplevel_reorder;
-  signed char x_flag_trapping_math;
-  signed char x_flag_trapv;
-  signed char x_flag_tree_bit_ccp;
-  signed char x_flag_tree_builtin_call_dce;
-  signed char x_flag_tree_ccp;
-  signed char x_flag_tree_ch;
-  signed char x_flag_ssa_coalesce_vars;
-  signed char x_flag_tree_copy_prop;
-  signed char x_flag_tree_copyrename;
-  signed char x_flag_tree_cselim;
-  signed char x_flag_tree_dce;
-  signed char x_flag_tree_dom;
-  signed char x_flag_tree_dse;
-  signed char x_flag_tree_forwprop;
-  signed char x_flag_tree_fre;
-  signed char x_flag_tree_loop_distribute_patterns;
-  signed char x_flag_tree_loop_distribution;
-  signed char x_flag_tree_loop_if_convert;
-  signed char x_flag_tree_loop_if_convert_stores;
-  signed char x_flag_tree_loop_im;
-  signed char x_flag_tree_loop_ivcanon;
-  signed char x_flag_tree_loop_optimize;
-  signed char x_flag_tree_loop_vectorize;
-  signed char x_flag_tree_live_range_split;
-  signed char x_flag_tree_partial_pre;
-  signed char x_flag_tree_phiprop;
-  signed char x_flag_tree_pre;
-  signed char x_flag_tree_pta;
-  signed char x_flag_tree_reassoc;
-  signed char x_flag_tree_scev_cprop;
-  signed char x_flag_tree_sink;
-  signed char x_flag_tree_slp_vectorize;
-  signed char x_flag_tree_slsr;
-  signed char x_flag_tree_sra;
-  signed char x_flag_tree_switch_conversion;
-  signed char x_flag_tree_tail_merge;
-  signed char x_flag_tree_ter;
-  signed char x_flag_tree_vectorize;
-  signed char x_flag_tree_vrp;
-  signed char x_flag_unit_at_a_time;
-  signed char x_flag_unroll_all_loops;
-  signed char x_flag_unroll_loops;
-  signed char x_flag_unsafe_loop_optimizations;
-  signed char x_flag_unsafe_math_optimizations;
-  signed char x_flag_unswitch_loops;
-  signed char x_flag_unwind_tables;
-  signed char x_flag_var_tracking;
-  signed char x_flag_var_tracking_assignments;
-  signed char x_flag_var_tracking_assignments_toggle;
-  signed char x_flag_var_tracking_uninit;
-  signed char x_flag_variable_expansion_in_unroller;
-  signed char x_flag_value_profile_transformations;
-  signed char x_flag_web;
-  signed char x_flag_whole_program;
-  signed char x_flag_wrapv;
-};
-
-/* Structure to save/restore selected target specific options.  */
-struct GTY(()) cl_target_option
-{
-  signed char x_arm_lra_flag;
-};
-
-
-/* Save optimization variables into a structure.  */
-extern void cl_optimization_save (struct cl_optimization *, struct gcc_options *);
-
-/* Restore optimization variables from a structure.  */
-extern void cl_optimization_restore (struct gcc_options *, struct cl_optimization *);
-
-/* Print optimization variables from a structure.  */
-extern void cl_optimization_print (FILE *, int, struct cl_optimization *);
-
-/* Save selected option variables into a structure.  */
-extern void cl_target_option_save (struct cl_target_option *, struct gcc_options *);
-
-/* Restore selected option variables from a structure.  */
-extern void cl_target_option_restore (struct gcc_options *, struct cl_target_option *);
-
-/* Print target option variables from a structure.  */
-extern void cl_target_option_print (FILE *, int, struct cl_target_option *);
-
-/* Anything that includes tm.h, does not necessarily need this.  */
-#if !defined(GCC_TM_H)
-#include "input.h" /* for location_t */
-bool                                                                  
-common_handle_option_auto (struct gcc_options *opts,                  
-                           struct gcc_options *opts_set,              
-                           const struct cl_decoded_option *decoded,   
-                           unsigned int lang_mask, int kind,          
-                           location_t loc,                            
-                           const struct cl_option_handlers *handlers, 
-                           diagnostic_context *dc);                   
-bool                                                                  
-Ada_handle_option_auto (struct gcc_options *opts,              
-                           struct gcc_options *opts_set,              
-                           size_t scode, const char *arg, int value,  
-                           unsigned int lang_mask, int kind,          
-                           location_t loc,                            
-                           const struct cl_option_handlers *handlers, 
-                           diagnostic_context *dc);                   
-bool                                                                  
-AdaSCIL_handle_option_auto (struct gcc_options *opts,              
-                           struct gcc_options *opts_set,              
-                           size_t scode, const char *arg, int value,  
-                           unsigned int lang_mask, int kind,          
-                           location_t loc,                            
-                           const struct cl_option_handlers *handlers, 
-                           diagnostic_context *dc);                   
-bool                                                                  
-AdaWhy_handle_option_auto (struct gcc_options *opts,              
-                           struct gcc_options *opts_set,              
-                           size_t scode, const char *arg, int value,  
-                           unsigned int lang_mask, int kind,          
-                           location_t loc,                            
-                           const struct cl_option_handlers *handlers, 
-                           diagnostic_context *dc);                   
-bool                                                                  
-C_handle_option_auto (struct gcc_options *opts,              
-                           struct gcc_options *opts_set,              
-                           size_t scode, const char *arg, int value,  
-                           unsigned int lang_mask, int kind,          
-                           location_t loc,                            
-                           const struct cl_option_handlers *handlers, 
-                           diagnostic_context *dc);                   
-bool                                                                  
-CXX_handle_option_auto (struct gcc_options *opts,              
-                           struct gcc_options *opts_set,              
-                           size_t scode, const char *arg, int value,  
-                           unsigned int lang_mask, int kind,          
-                           location_t loc,                            
-                           const struct cl_option_handlers *handlers, 
-                           diagnostic_context *dc);                   
-bool                                                                  
-Fortran_handle_option_auto (struct gcc_options *opts,              
-                           struct gcc_options *opts_set,              
-                           size_t scode, const char *arg, int value,  
-                           unsigned int lang_mask, int kind,          
-                           location_t loc,                            
-                           const struct cl_option_handlers *handlers, 
-                           diagnostic_context *dc);                   
-bool                                                                  
-Go_handle_option_auto (struct gcc_options *opts,              
-                           struct gcc_options *opts_set,              
-                           size_t scode, const char *arg, int value,  
-                           unsigned int lang_mask, int kind,          
-                           location_t loc,                            
-                           const struct cl_option_handlers *handlers, 
-                           diagnostic_context *dc);                   
-bool                                                                  
-Java_handle_option_auto (struct gcc_options *opts,              
-                           struct gcc_options *opts_set,              
-                           size_t scode, const char *arg, int value,  
-                           unsigned int lang_mask, int kind,          
-                           location_t loc,                            
-                           const struct cl_option_handlers *handlers, 
-                           diagnostic_context *dc);                   
-bool                                                                  
-LTO_handle_option_auto (struct gcc_options *opts,              
-                           struct gcc_options *opts_set,              
-                           size_t scode, const char *arg, int value,  
-                           unsigned int lang_mask, int kind,          
-                           location_t loc,                            
-                           const struct cl_option_handlers *handlers, 
-                           diagnostic_context *dc);                   
-bool                                                                  
-ObjC_handle_option_auto (struct gcc_options *opts,              
-                           struct gcc_options *opts_set,              
-                           size_t scode, const char *arg, int value,  
-                           unsigned int lang_mask, int kind,          
-                           location_t loc,                            
-                           const struct cl_option_handlers *handlers, 
-                           diagnostic_context *dc);                   
-bool                                                                  
-ObjCXX_handle_option_auto (struct gcc_options *opts,              
-                           struct gcc_options *opts_set,              
-                           size_t scode, const char *arg, int value,  
-                           unsigned int lang_mask, int kind,          
-                           location_t loc,                            
-                           const struct cl_option_handlers *handlers, 
-                           diagnostic_context *dc);                   
-#endif
-#endif
-
-#define MASK_ABORT_NORETURN (1 << 0)
-#define OPTION_MASK_ANDROID (1 << 0)
-#define MASK_APCS_FRAME (1 << 1)
-#define MASK_APCS_FLOAT (1 << 2)
-#define MASK_APCS_REENT (1 << 3)
-#define MASK_APCS_STACK (1 << 4)
-#define MASK_THUMB (1 << 5)
-#define MASK_BIG_END (1 << 6)
-#define MASK_CALLEE_INTERWORKING (1 << 7)
-#define MASK_CALLER_INTERWORKING (1 << 8)
-#define MASK_LONG_CALLS (1 << 9)
-#define MASK_NEW_GENERIC_COSTS (1 << 10)
-#define MASK_OLD_RTX_COSTS (1 << 11)
-#define MASK_POKE_FUNCTION_NAME (1 << 12)
-#define MASK_SCHED_PROLOG (1 << 13)
-#define MASK_SINGLE_PIC_BASE (1 << 14)
-#define MASK_INTERWORK (1 << 15)
-#define MASK_TPCS_FRAME (1 << 16)
-#define MASK_TPCS_LEAF_FRAME (1 << 17)
-#define MASK_NEON_VECTORIZE_DOUBLE (1 << 18)
-#define MASK_LITTLE_WORDS (1 << 19)
-
-#define TARGET_ABORT_NORETURN ((target_flags & MASK_ABORT_NORETURN) != 0)
-#define TARGET_ABORT_NORETURN_P(target_flags) ((target_flags & MASK_ABORT_NORETURN) != 0)
-#define TARGET_ANDROID ((flag_android & OPTION_MASK_ANDROID) != 0)
-#define TARGET_ANDROID_P(flag_android) ((flag_android & OPTION_MASK_ANDROID) != 0)
-#define TARGET_APCS_FRAME ((target_flags & MASK_APCS_FRAME) != 0)
-#define TARGET_APCS_FRAME_P(target_flags) ((target_flags & MASK_APCS_FRAME) != 0)
-#define TARGET_APCS_FLOAT ((target_flags & MASK_APCS_FLOAT) != 0)
-#define TARGET_APCS_FLOAT_P(target_flags) ((target_flags & MASK_APCS_FLOAT) != 0)
-#define TARGET_APCS_REENT ((target_flags & MASK_APCS_REENT) != 0)
-#define TARGET_APCS_REENT_P(target_flags) ((target_flags & MASK_APCS_REENT) != 0)
-#define TARGET_APCS_STACK ((target_flags & MASK_APCS_STACK) != 0)
-#define TARGET_APCS_STACK_P(target_flags) ((target_flags & MASK_APCS_STACK) != 0)
-#define TARGET_THUMB ((target_flags & MASK_THUMB) != 0)
-#define TARGET_THUMB_P(target_flags) ((target_flags & MASK_THUMB) != 0)
-#define TARGET_BIG_END ((target_flags & MASK_BIG_END) != 0)
-#define TARGET_BIG_END_P(target_flags) ((target_flags & MASK_BIG_END) != 0)
-#define TARGET_CALLEE_INTERWORKING ((target_flags & MASK_CALLEE_INTERWORKING) != 0)
-#define TARGET_CALLEE_INTERWORKING_P(target_flags) ((target_flags & MASK_CALLEE_INTERWORKING) != 0)
-#define TARGET_CALLER_INTERWORKING ((target_flags & MASK_CALLER_INTERWORKING) != 0)
-#define TARGET_CALLER_INTERWORKING_P(target_flags) ((target_flags & MASK_CALLER_INTERWORKING) != 0)
-#define TARGET_LONG_CALLS ((target_flags & MASK_LONG_CALLS) != 0)
-#define TARGET_LONG_CALLS_P(target_flags) ((target_flags & MASK_LONG_CALLS) != 0)
-#define TARGET_NEW_GENERIC_COSTS ((target_flags & MASK_NEW_GENERIC_COSTS) != 0)
-#define TARGET_NEW_GENERIC_COSTS_P(target_flags) ((target_flags & MASK_NEW_GENERIC_COSTS) != 0)
-#define TARGET_OLD_RTX_COSTS ((target_flags & MASK_OLD_RTX_COSTS) != 0)
-#define TARGET_OLD_RTX_COSTS_P(target_flags) ((target_flags & MASK_OLD_RTX_COSTS) != 0)
-#define TARGET_POKE_FUNCTION_NAME ((target_flags & MASK_POKE_FUNCTION_NAME) != 0)
-#define TARGET_POKE_FUNCTION_NAME_P(target_flags) ((target_flags & MASK_POKE_FUNCTION_NAME) != 0)
-#define TARGET_SCHED_PROLOG ((target_flags & MASK_SCHED_PROLOG) != 0)
-#define TARGET_SCHED_PROLOG_P(target_flags) ((target_flags & MASK_SCHED_PROLOG) != 0)
-#define TARGET_SINGLE_PIC_BASE ((target_flags & MASK_SINGLE_PIC_BASE) != 0)
-#define TARGET_SINGLE_PIC_BASE_P(target_flags) ((target_flags & MASK_SINGLE_PIC_BASE) != 0)
-#define TARGET_INTERWORK ((target_flags & MASK_INTERWORK) != 0)
-#define TARGET_INTERWORK_P(target_flags) ((target_flags & MASK_INTERWORK) != 0)
-#define TARGET_TPCS_FRAME ((target_flags & MASK_TPCS_FRAME) != 0)
-#define TARGET_TPCS_FRAME_P(target_flags) ((target_flags & MASK_TPCS_FRAME) != 0)
-#define TARGET_TPCS_LEAF_FRAME ((target_flags & MASK_TPCS_LEAF_FRAME) != 0)
-#define TARGET_TPCS_LEAF_FRAME_P(target_flags) ((target_flags & MASK_TPCS_LEAF_FRAME) != 0)
-#define TARGET_NEON_VECTORIZE_DOUBLE ((target_flags & MASK_NEON_VECTORIZE_DOUBLE) != 0)
-#define TARGET_NEON_VECTORIZE_DOUBLE_P(target_flags) ((target_flags & MASK_NEON_VECTORIZE_DOUBLE) != 0)
-#define TARGET_LITTLE_WORDS ((target_flags & MASK_LITTLE_WORDS) != 0)
-#define TARGET_LITTLE_WORDS_P(target_flags) ((target_flags & MASK_LITTLE_WORDS) != 0)
-
-
-#define CL_Ada        (1U << 0)
-#define CL_AdaSCIL    (1U << 1)
-#define CL_AdaWhy     (1U << 2)
-#define CL_C          (1U << 3)
-#define CL_CXX        (1U << 4)
-#define CL_Fortran    (1U << 5)
-#define CL_Go         (1U << 6)
-#define CL_Java       (1U << 7)
-#define CL_LTO        (1U << 8)
-#define CL_ObjC       (1U << 9)
-#define CL_ObjCXX     (1U << 10)
-#define CL_LANG_ALL   ((1U << 11) - 1)
-
-enum opt_code
-{
-  OPT____ = 0,                               /* -### */
-  /* OPT__CLASSPATH = 1, */                  /* --CLASSPATH */
-  /* OPT__all_warnings = 2, */               /* --all-warnings */
-  /* OPT__ansi = 3, */                       /* --ansi */
-  /* OPT__assemble = 4, */                   /* --assemble */
-  /* OPT__assert = 5, */                     /* --assert */
-  /* OPT__assert_ = 6, */                    /* --assert= */
-  /* OPT__bootclasspath = 7, */              /* --bootclasspath */
-  /* OPT__classpath = 8, */                  /* --classpath */
-  /* OPT__comments = 9, */                   /* --comments */
-  /* OPT__comments_in_macros = 10, */        /* --comments-in-macros */
-  /* OPT__compile = 11, */                   /* --compile */
-  /* OPT__coverage = 12, */                  /* --coverage */
-  /* OPT__debug = 13, */                     /* --debug */
-  /* OPT__define_macro = 14, */              /* --define-macro */
-  /* OPT__define_macro_ = 15, */             /* --define-macro= */
-  /* OPT__dependencies = 16, */              /* --dependencies */
-  /* OPT__dump = 17, */                      /* --dump */
-  /* OPT__dump_ = 18, */                     /* --dump= */
-  /* OPT__dumpbase = 19, */                  /* --dumpbase */
-  /* OPT__dumpdir = 20, */                   /* --dumpdir */
-  /* OPT__encoding = 21, */                  /* --encoding */
-  /* OPT__entry = 22, */                     /* --entry */
-  /* OPT__entry_ = 23, */                    /* --entry= */
-  /* OPT__extdirs = 24, */                   /* --extdirs */
-  /* OPT__extra_warnings = 25, */            /* --extra-warnings */
-  /* OPT__for_assembler = 26, */             /* --for-assembler */
-  /* OPT__for_assembler_ = 27, */            /* --for-assembler= */
-  /* OPT__for_linker = 28, */                /* --for-linker */
-  /* OPT__for_linker_ = 29, */               /* --for-linker= */
-  /* OPT__force_link = 30, */                /* --force-link */
-  /* OPT__force_link_ = 31, */               /* --force-link= */
-  OPT__help = 32,                            /* --help */
-  OPT__help_ = 33,                           /* --help= */
-  /* OPT__imacros = 34, */                   /* --imacros */
-  /* OPT__imacros_ = 35, */                  /* --imacros= */
-  /* OPT__include = 36, */                   /* --include */
-  /* OPT__include_barrier = 37, */           /* --include-barrier */
-  /* OPT__include_directory = 38, */         /* --include-directory */
-  /* OPT__include_directory_after = 39, */   /* --include-directory-after */
-  /* OPT__include_directory_after_ = 40, */  /* --include-directory-after= */
-  /* OPT__include_directory_ = 41, */        /* --include-directory= */
-  /* OPT__include_prefix = 42, */            /* --include-prefix */
-  /* OPT__include_prefix_ = 43, */           /* --include-prefix= */
-  /* OPT__include_with_prefix = 44, */       /* --include-with-prefix */
-  /* OPT__include_with_prefix_after = 45, */ /* --include-with-prefix-after */
-  /* OPT__include_with_prefix_after_ = 46, *//* --include-with-prefix-after= */
-  /* OPT__include_with_prefix_before = 47, *//* --include-with-prefix-before */
-  /* OPT__include_with_prefix_before_ = 48, *//* --include-with-prefix-before= */
-  /* OPT__include_with_prefix_ = 49, */      /* --include-with-prefix= */
-  /* OPT__include_ = 50, */                  /* --include= */
-  /* OPT__language = 51, */                  /* --language */
-  /* OPT__language_ = 52, */                 /* --language= */
-  /* OPT__library_directory = 53, */         /* --library-directory */
-  /* OPT__library_directory_ = 54, */        /* --library-directory= */
-  /* OPT__no_canonical_prefixes = 55, */     /* --no-canonical-prefixes */
-  /* OPT__no_integrated_cpp = 56, */         /* --no-integrated-cpp */
-  /* OPT__no_line_commands = 57, */          /* --no-line-commands */
-  /* OPT__no_standard_includes = 58, */      /* --no-standard-includes */
-  /* OPT__no_standard_libraries = 59, */     /* --no-standard-libraries */
-  OPT__no_sysroot_suffix = 60,               /* --no-sysroot-suffix */
-  /* OPT__no_warnings = 61, */               /* --no-warnings */
-  /* OPT__optimize = 62, */                  /* --optimize */
-  /* OPT__output = 63, */                    /* --output */
-  /* OPT__output_class_directory = 64, */    /* --output-class-directory */
-  /* OPT__output_class_directory_ = 65, */   /* --output-class-directory= */
-  OPT__output_pch_ = 66,                     /* --output-pch= */
-  /* OPT__output_ = 67, */                   /* --output= */
-  OPT__param = 68,                           /* --param */
-  /* OPT__param_ = 69, */                    /* --param= */
-  /* OPT__pass_exit_codes = 70, */           /* --pass-exit-codes */
-  /* OPT__pedantic = 71, */                  /* --pedantic */
-  /* OPT__pedantic_errors = 72, */           /* --pedantic-errors */
-  /* OPT__pie = 73, */                       /* --pie */
-  /* OPT__pipe = 74, */                      /* --pipe */
-  /* OPT__prefix = 75, */                    /* --prefix */
-  /* OPT__prefix_ = 76, */                   /* --prefix= */
-  /* OPT__preprocess = 77, */                /* --preprocess */
-  /* OPT__print_file_name = 78, */           /* --print-file-name */
-  /* OPT__print_file_name_ = 79, */          /* --print-file-name= */
-  /* OPT__print_libgcc_file_name = 80, */    /* --print-libgcc-file-name */
-  /* OPT__print_missing_file_dependencies = 81, *//* --print-missing-file-dependencies */
-  /* OPT__print_multi_directory = 82, */     /* --print-multi-directory */
-  /* OPT__print_multi_lib = 83, */           /* --print-multi-lib */
-  /* OPT__print_multi_os_directory = 84, */  /* --print-multi-os-directory */
-  /* OPT__print_multiarch = 85, */           /* --print-multiarch */
-  /* OPT__print_prog_name = 86, */           /* --print-prog-name */
-  /* OPT__print_prog_name_ = 87, */          /* --print-prog-name= */
-  /* OPT__print_search_dirs = 88, */         /* --print-search-dirs */
-  /* OPT__print_sysroot = 89, */             /* --print-sysroot */
-  /* OPT__print_sysroot_headers_suffix = 90, *//* --print-sysroot-headers-suffix */
-  /* OPT__profile = 91, */                   /* --profile */
-  /* OPT__resource = 92, */                  /* --resource */
-  /* OPT__resource_ = 93, */                 /* --resource= */
-  /* OPT__save_temps = 94, */                /* --save-temps */
-  /* OPT__shared = 95, */                    /* --shared */
-  /* OPT__specs = 96, */                     /* --specs */
-  /* OPT__specs_ = 97, */                    /* --specs= */
-  /* OPT__static = 98, */                    /* --static */
-  /* OPT__symbolic = 99, */                  /* --symbolic */
-  /* OPT__sysroot = 100, */                  /* --sysroot */
-  OPT__sysroot_ = 101,                       /* --sysroot= */
-  OPT__target_help = 102,                    /* --target-help */
-  /* OPT__time = 103, */                     /* --time */
-  /* OPT__trace_includes = 104, */           /* --trace-includes */
-  /* OPT__traditional = 105, */              /* --traditional */
-  /* OPT__traditional_cpp = 106, */          /* --traditional-cpp */
-  /* OPT__trigraphs = 107, */                /* --trigraphs */
-  /* OPT__undefine_macro = 108, */           /* --undefine-macro */
-  /* OPT__undefine_macro_ = 109, */          /* --undefine-macro= */
-  /* OPT__user_dependencies = 110, */        /* --user-dependencies */
-  /* OPT__verbose = 111, */                  /* --verbose */
-  OPT__version = 112,                        /* --version */
-  /* OPT__write_dependencies = 113, */       /* --write-dependencies */
-  /* OPT__write_user_dependencies = 114, */  /* --write-user-dependencies */
-  OPT_A = 115,                               /* -A */
-  OPT_B = 116,                               /* -B */
-  OPT_C = 117,                               /* -C */
-  OPT_CC = 118,                              /* -CC */
-  /* OPT_CLASSPATH = 119, */                 /* -CLASSPATH */
-  OPT_D = 120,                               /* -D */
-  OPT_E = 121,                               /* -E */
-  OPT_F = 122,                               /* -F */
-  OPT_H = 123,                               /* -H */
-  OPT_I = 124,                               /* -I */
-  OPT_J = 125,                               /* -J */
-  OPT_L = 126,                               /* -L */
-  OPT_M = 127,                               /* -M */
-  OPT_MD = 128,                              /* -MD */
-  OPT_MD_ = 129,                             /* -MD_ */
-  OPT_MF = 130,                              /* -MF */
-  OPT_MG = 131,                              /* -MG */
-  OPT_MM = 132,                              /* -MM */
-  OPT_MMD = 133,                             /* -MMD */
-  OPT_MMD_ = 134,                            /* -MMD_ */
-  OPT_MP = 135,                              /* -MP */
-  OPT_MQ = 136,                              /* -MQ */
-  OPT_MT = 137,                              /* -MT */
-  OPT_N = 138,                               /* -N */
-  OPT_O = 139,                               /* -O */
-  OPT_Ofast = 140,                           /* -Ofast */
-  OPT_Og = 141,                              /* -Og */
-  OPT_Os = 142,                              /* -Os */
-  OPT_P = 143,                               /* -P */
-  OPT_Q = 144,                               /* -Q */
-  OPT_Qn = 145,                              /* -Qn */
-  OPT_Qy = 146,                              /* -Qy */
-  OPT_R = 147,                               /* -R */
-  OPT_S = 148,                               /* -S */
-  OPT_T = 149,                               /* -T */
-  OPT_Tbss = 150,                            /* -Tbss */
-  OPT_Tbss_ = 151,                           /* -Tbss= */
-  OPT_Tdata = 152,                           /* -Tdata */
-  OPT_Tdata_ = 153,                          /* -Tdata= */
-  OPT_Ttext = 154,                           /* -Ttext */
-  OPT_Ttext_ = 155,                          /* -Ttext= */
-  OPT_U = 156,                               /* -U */
-  /* OPT_W = 157, */                         /* -W */
-  OPT_Wa_ = 158,                             /* -Wa, */
-  OPT_Wabi = 159,                            /* -Wabi */
-  OPT_Wabi_tag = 160,                        /* -Wabi-tag */
-  OPT_Waddress = 161,                        /* -Waddress */
-  OPT_Waggregate_return = 162,               /* -Waggregate-return */
-  OPT_Waggressive_loop_optimizations = 163,  /* -Waggressive-loop-optimizations */
-  OPT_Waliasing = 164,                       /* -Waliasing */
-  OPT_Walign_commons = 165,                  /* -Walign-commons */
-  OPT_Wall = 166,                            /* -Wall */
-  OPT_Wall_deprecation = 167,                /* -Wall-deprecation */
-  OPT_Wall_javadoc = 168,                    /* -Wall-javadoc */
-  OPT_Wampersand = 169,                      /* -Wampersand */
-  OPT_Warray_bounds = 170,                   /* -Warray-bounds */
-  OPT_Warray_temporaries = 171,              /* -Warray-temporaries */
-  OPT_Wassert_identifier = 172,              /* -Wassert-identifier */
-  OPT_Wassign_intercept = 173,               /* -Wassign-intercept */
-  OPT_Wattributes = 174,                     /* -Wattributes */
-  OPT_Wbad_function_cast = 175,              /* -Wbad-function-cast */
-  OPT_Wboxing = 176,                         /* -Wboxing */
-  OPT_Wbuiltin_macro_redefined = 177,        /* -Wbuiltin-macro-redefined */
-  OPT_Wc___compat = 178,                     /* -Wc++-compat */
-  OPT_Wc__0x_compat = 179,                   /* -Wc++0x-compat */
-  /* OPT_Wc__11_compat = 180, */             /* -Wc++11-compat */
-  OPT_Wc_binding_type = 181,                 /* -Wc-binding-type */
-  OPT_Wcast_align = 182,                     /* -Wcast-align */
-  OPT_Wcast_qual = 183,                      /* -Wcast-qual */
-  OPT_Wchar_concat = 184,                    /* -Wchar-concat */
-  OPT_Wchar_subscripts = 185,                /* -Wchar-subscripts */
-  OPT_Wcharacter_truncation = 186,           /* -Wcharacter-truncation */
-  OPT_Wclobbered = 187,                      /* -Wclobbered */
-  OPT_Wcomment = 188,                        /* -Wcomment */
-  /* OPT_Wcomments = 189, */                 /* -Wcomments */
-  OPT_Wcompare_reals = 190,                  /* -Wcompare-reals */
-  OPT_Wcondition_assign = 191,               /* -Wcondition-assign */
-  OPT_Wconditionally_supported = 192,        /* -Wconditionally-supported */
-  OPT_Wconstructor_name = 193,               /* -Wconstructor-name */
-  OPT_Wconversion = 194,                     /* -Wconversion */
-  OPT_Wconversion_extra = 195,               /* -Wconversion-extra */
-  OPT_Wconversion_null = 196,                /* -Wconversion-null */
-  OPT_Wcoverage_mismatch = 197,              /* -Wcoverage-mismatch */
-  OPT_Wcpp = 198,                            /* -Wcpp */
-  OPT_Wctor_dtor_privacy = 199,              /* -Wctor-dtor-privacy */
-  OPT_Wdate_time = 200,                      /* -Wdate-time */
-  OPT_Wdeclaration_after_statement = 201,    /* -Wdeclaration-after-statement */
-  OPT_Wdelete_incomplete = 202,              /* -Wdelete-incomplete */
-  OPT_Wdelete_non_virtual_dtor = 203,        /* -Wdelete-non-virtual-dtor */
-  OPT_Wdep_ann = 204,                        /* -Wdep-ann */
-  OPT_Wdeprecated = 205,                     /* -Wdeprecated */
-  OPT_Wdeprecated_declarations = 206,        /* -Wdeprecated-declarations */
-  OPT_Wdisabled_optimization = 207,          /* -Wdisabled-optimization */
-  OPT_Wdiscouraged = 208,                    /* -Wdiscouraged */
-  OPT_Wdiv_by_zero = 209,                    /* -Wdiv-by-zero */
-  OPT_Wdouble_promotion = 210,               /* -Wdouble-promotion */
-  OPT_Weffc__ = 211,                         /* -Weffc++ */
-  OPT_Wempty_block = 212,                    /* -Wempty-block */
-  OPT_Wempty_body = 213,                     /* -Wempty-body */
-  OPT_Wendif_labels = 214,                   /* -Wendif-labels */
-  OPT_Wenum_compare = 215,                   /* -Wenum-compare */
-  OPT_Wenum_identifier = 216,                /* -Wenum-identifier */
-  OPT_Wenum_switch = 217,                    /* -Wenum-switch */
-  OPT_Werror = 218,                          /* -Werror */
-  /* OPT_Werror_implicit_function_declaration = 219, *//* -Werror-implicit-function-declaration */
-  OPT_Werror_ = 220,                         /* -Werror= */
-  OPT_Wextra = 221,                          /* -Wextra */
-  OPT_Wextraneous_semicolon = 222,           /* -Wextraneous-semicolon */
-  OPT_Wfallthrough = 223,                    /* -Wfallthrough */
-  OPT_Wfatal_errors = 224,                   /* -Wfatal-errors */
-  OPT_Wfield_hiding = 225,                   /* -Wfield-hiding */
-  OPT_Wfinal_bound = 226,                    /* -Wfinal-bound */
-  OPT_Wfinally = 227,                        /* -Wfinally */
-  OPT_Wfloat_conversion = 228,               /* -Wfloat-conversion */
-  OPT_Wfloat_equal = 229,                    /* -Wfloat-equal */
-  OPT_Wforbidden = 230,                      /* -Wforbidden */
-  /* OPT_Wformat = 231, */                   /* -Wformat */
-  OPT_Wformat_contains_nul = 232,            /* -Wformat-contains-nul */
-  OPT_Wformat_extra_args = 233,              /* -Wformat-extra-args */
-  OPT_Wformat_nonliteral = 234,              /* -Wformat-nonliteral */
-  OPT_Wformat_security = 235,                /* -Wformat-security */
-  OPT_Wformat_y2k = 236,                     /* -Wformat-y2k */
-  OPT_Wformat_zero_length = 237,             /* -Wformat-zero-length */
-  OPT_Wformat_ = 238,                        /* -Wformat= */
-  OPT_Wframe_larger_than_ = 239,             /* -Wframe-larger-than= */
-  OPT_Wfree_nonheap_object = 240,            /* -Wfree-nonheap-object */
-  OPT_Wfunction_elimination = 241,           /* -Wfunction-elimination */
-  OPT_Whiding = 242,                         /* -Whiding */
-  OPT_Wignored_qualifiers = 243,             /* -Wignored-qualifiers */
-  OPT_Wimplicit = 244,                       /* -Wimplicit */
-  OPT_Wimplicit_function_declaration = 245,  /* -Wimplicit-function-declaration */
-  OPT_Wimplicit_int = 246,                   /* -Wimplicit-int */
-  OPT_Wimplicit_interface = 247,             /* -Wimplicit-interface */
-  OPT_Wimplicit_procedure = 248,             /* -Wimplicit-procedure */
-  /* OPT_Wimport = 249, */                   /* -Wimport */
-  OPT_Windirect_static = 250,                /* -Windirect-static */
-  OPT_Winherited_variadic_ctor = 251,        /* -Winherited-variadic-ctor */
-  OPT_Winit_self = 252,                      /* -Winit-self */
-  OPT_Winline = 253,                         /* -Winline */
-  OPT_Wint_to_pointer_cast = 254,            /* -Wint-to-pointer-cast */
-  OPT_Wintf_annotation = 255,                /* -Wintf-annotation */
-  OPT_Wintf_non_inherited = 256,             /* -Wintf-non-inherited */
-  OPT_Wintrinsic_shadow = 257,               /* -Wintrinsic-shadow */
-  OPT_Wintrinsics_std = 258,                 /* -Wintrinsics-std */
-  OPT_Winvalid_memory_model = 259,           /* -Winvalid-memory-model */
-  OPT_Winvalid_offsetof = 260,               /* -Winvalid-offsetof */
-  OPT_Winvalid_pch = 261,                    /* -Winvalid-pch */
-  OPT_Wjavadoc = 262,                        /* -Wjavadoc */
-  OPT_Wjump_misses_init = 263,               /* -Wjump-misses-init */
-  OPT_Wl_ = 264,                             /* -Wl, */
-  /* OPT_Wlarger_than_ = 265, */             /* -Wlarger-than- */
-  OPT_Wlarger_than_ = 266,                   /* -Wlarger-than= */
-  OPT_Wline_truncation = 267,                /* -Wline-truncation */
-  OPT_Wliteral_suffix = 268,                 /* -Wliteral-suffix */
-  OPT_Wlocal_hiding = 269,                   /* -Wlocal-hiding */
-  OPT_Wlogical_op = 270,                     /* -Wlogical-op */
-  OPT_Wlong_long = 271,                      /* -Wlong-long */
-  OPT_Wmain = 272,                           /* -Wmain */
-  OPT_Wmasked_catch_block = 273,             /* -Wmasked-catch-block */
-  OPT_Wmaybe_uninitialized = 274,            /* -Wmaybe-uninitialized */
-  OPT_Wmissing_braces = 275,                 /* -Wmissing-braces */
-  OPT_Wmissing_declarations = 276,           /* -Wmissing-declarations */
-  OPT_Wmissing_field_initializers = 277,     /* -Wmissing-field-initializers */
-  /* OPT_Wmissing_format_attribute = 278, */ /* -Wmissing-format-attribute */
-  OPT_Wmissing_include_dirs = 279,           /* -Wmissing-include-dirs */
-  /* OPT_Wmissing_noreturn = 280, */         /* -Wmissing-noreturn */
-  OPT_Wmissing_parameter_type = 281,         /* -Wmissing-parameter-type */
-  OPT_Wmissing_prototypes = 282,             /* -Wmissing-prototypes */
-  /* OPT_Wmudflap = 283, */                  /* -Wmudflap */
-  OPT_Wmultichar = 284,                      /* -Wmultichar */
-  OPT_Wnarrowing = 285,                      /* -Wnarrowing */
-  OPT_Wnested_externs = 286,                 /* -Wnested-externs */
-  OPT_Wnls = 287,                            /* -Wnls */
-  OPT_Wno_effect_assign = 288,               /* -Wno-effect-assign */
-  OPT_Wnoexcept = 289,                       /* -Wnoexcept */
-  OPT_Wnon_template_friend = 290,            /* -Wnon-template-friend */
-  OPT_Wnon_virtual_dtor = 291,               /* -Wnon-virtual-dtor */
-  OPT_Wnonnull = 292,                        /* -Wnonnull */
-  OPT_Wnormalized_ = 293,                    /* -Wnormalized= */
-  OPT_Wnull = 294,                           /* -Wnull */
-  OPT_Wold_style_cast = 295,                 /* -Wold-style-cast */
-  OPT_Wold_style_declaration = 296,          /* -Wold-style-declaration */
-  OPT_Wold_style_definition = 297,           /* -Wold-style-definition */
-  OPT_Wopenmp_simd = 298,                    /* -Wopenmp-simd */
-  OPT_Wout_of_date = 299,                    /* -Wout-of-date */
-  OPT_Wover_ann = 300,                       /* -Wover-ann */
-  OPT_Woverflow = 301,                       /* -Woverflow */
-  OPT_Woverlength_strings = 302,             /* -Woverlength-strings */
-  OPT_Woverloaded_virtual = 303,             /* -Woverloaded-virtual */
-  OPT_Woverride_init = 304,                  /* -Woverride-init */
-  OPT_Wp_ = 305,                             /* -Wp, */
-  OPT_Wpacked = 306,                         /* -Wpacked */
-  OPT_Wpacked_bitfield_compat = 307,         /* -Wpacked-bitfield-compat */
-  OPT_Wpadded = 308,                         /* -Wpadded */
-  OPT_Wparam_assign = 309,                   /* -Wparam-assign */
-  OPT_Wparentheses = 310,                    /* -Wparentheses */
-  OPT_Wpedantic = 311,                       /* -Wpedantic */
-  OPT_Wpkg_default_method = 312,             /* -Wpkg-default-method */
-  OPT_Wpmf_conversions = 313,                /* -Wpmf-conversions */
-  OPT_Wpointer_arith = 314,                  /* -Wpointer-arith */
-  OPT_Wpointer_sign = 315,                   /* -Wpointer-sign */
-  OPT_Wpointer_to_int_cast = 316,            /* -Wpointer-to-int-cast */
-  OPT_Wpragmas = 317,                        /* -Wpragmas */
-  OPT_Wproperty_assign_default = 318,        /* -Wproperty-assign-default */
-  OPT_Wprotocol = 319,                       /* -Wprotocol */
-  OPT_Wpsabi = 320,                          /* -Wpsabi */
-  OPT_Wraw = 321,                            /* -Wraw */
-  OPT_Wreal_q_constant = 322,                /* -Wreal-q-constant */
-  OPT_Wrealloc_lhs = 323,                    /* -Wrealloc-lhs */
-  OPT_Wrealloc_lhs_all = 324,                /* -Wrealloc-lhs-all */
-  OPT_Wredundant_decls = 325,                /* -Wredundant-decls */
-  OPT_Wredundant_modifiers = 326,            /* -Wredundant-modifiers */
-  OPT_Wreorder = 327,                        /* -Wreorder */
-  OPT_Wreturn_local_addr = 328,              /* -Wreturn-local-addr */
-  OPT_Wreturn_type = 329,                    /* -Wreturn-type */
-  OPT_Wselector = 330,                       /* -Wselector */
-  OPT_Wsequence_point = 331,                 /* -Wsequence-point */
-  OPT_Wserial = 332,                         /* -Wserial */
-  OPT_Wshadow = 333,                         /* -Wshadow */
-  OPT_Wsign_compare = 334,                   /* -Wsign-compare */
-  OPT_Wsign_conversion = 335,                /* -Wsign-conversion */
-  OPT_Wsign_promo = 336,                     /* -Wsign-promo */
-  OPT_Wsizeof_pointer_memaccess = 337,       /* -Wsizeof-pointer-memaccess */
-  OPT_Wspecial_param_hiding = 338,           /* -Wspecial-param-hiding */
-  OPT_Wstack_protector = 339,                /* -Wstack-protector */
-  OPT_Wstack_usage_ = 340,                   /* -Wstack-usage= */
-  OPT_Wstatic_access = 341,                  /* -Wstatic-access */
-  OPT_Wstatic_receiver = 342,                /* -Wstatic-receiver */
-  OPT_Wstrict_aliasing = 343,                /* -Wstrict-aliasing */
-  OPT_Wstrict_aliasing_ = 344,               /* -Wstrict-aliasing= */
-  OPT_Wstrict_null_sentinel = 345,           /* -Wstrict-null-sentinel */
-  OPT_Wstrict_overflow = 346,                /* -Wstrict-overflow */
-  OPT_Wstrict_overflow_ = 347,               /* -Wstrict-overflow= */
-  OPT_Wstrict_prototypes = 348,              /* -Wstrict-prototypes */
-  OPT_Wstrict_selector_match = 349,          /* -Wstrict-selector-match */
-  OPT_Wsuggest_attribute_const = 350,        /* -Wsuggest-attribute=const */
-  OPT_Wsuggest_attribute_format = 351,       /* -Wsuggest-attribute=format */
-  OPT_Wsuggest_attribute_noreturn = 352,     /* -Wsuggest-attribute=noreturn */
-  OPT_Wsuggest_attribute_pure = 353,         /* -Wsuggest-attribute=pure */
-  OPT_Wsuppress = 354,                       /* -Wsuppress */
-  OPT_Wsurprising = 355,                     /* -Wsurprising */
-  OPT_Wswitch = 356,                         /* -Wswitch */
-  OPT_Wswitch_default = 357,                 /* -Wswitch-default */
-  OPT_Wswitch_enum = 358,                    /* -Wswitch-enum */
-  OPT_Wsync_nand = 359,                      /* -Wsync-nand */
-  OPT_Wsynth = 360,                          /* -Wsynth */
-  OPT_Wsynthetic_access = 361,               /* -Wsynthetic-access */
-  OPT_Wsystem_headers = 362,                 /* -Wsystem-headers */
-  OPT_Wtabs = 363,                           /* -Wtabs */
-  OPT_Wtarget_lifetime = 364,                /* -Wtarget-lifetime */
-  OPT_Wtasks = 365,                          /* -Wtasks */
-  OPT_Wtraditional = 366,                    /* -Wtraditional */
-  OPT_Wtraditional_conversion = 367,         /* -Wtraditional-conversion */
-  OPT_Wtrampolines = 368,                    /* -Wtrampolines */
-  OPT_Wtrigraphs = 369,                      /* -Wtrigraphs */
-  OPT_Wtype_hiding = 370,                    /* -Wtype-hiding */
-  OPT_Wtype_limits = 371,                    /* -Wtype-limits */
-  OPT_Wuncheck = 372,                        /* -Wuncheck */
-  OPT_Wundeclared_selector = 373,            /* -Wundeclared-selector */
-  OPT_Wundef = 374,                          /* -Wundef */
-  OPT_Wunderflow = 375,                      /* -Wunderflow */
-  OPT_Wuninitialized = 376,                  /* -Wuninitialized */
-  OPT_Wunknown_pragmas = 377,                /* -Wunknown-pragmas */
-  OPT_Wunnecessary_else = 378,               /* -Wunnecessary-else */
-  OPT_Wunqualified_field = 379,              /* -Wunqualified-field */
-  /* OPT_Wunreachable_code = 380, */         /* -Wunreachable-code */
-  OPT_Wunsafe_loop_optimizations = 381,      /* -Wunsafe-loop-optimizations */
-  OPT_Wunsuffixed_float_constants = 382,     /* -Wunsuffixed-float-constants */
-  OPT_Wunused = 383,                         /* -Wunused */
-  OPT_Wunused_argument = 384,                /* -Wunused-argument */
-  OPT_Wunused_but_set_parameter = 385,       /* -Wunused-but-set-parameter */
-  OPT_Wunused_but_set_variable = 386,        /* -Wunused-but-set-variable */
-  OPT_Wunused_dummy_argument = 387,          /* -Wunused-dummy-argument */
-  OPT_Wunused_function = 388,                /* -Wunused-function */
-  OPT_Wunused_import = 389,                  /* -Wunused-import */
-  OPT_Wunused_label = 390,                   /* -Wunused-label */
-  OPT_Wunused_local = 391,                   /* -Wunused-local */
-  OPT_Wunused_local_typedefs = 392,          /* -Wunused-local-typedefs */
-  OPT_Wunused_macros = 393,                  /* -Wunused-macros */
-  OPT_Wunused_parameter = 394,               /* -Wunused-parameter */
-  OPT_Wunused_private = 395,                 /* -Wunused-private */
-  OPT_Wunused_result = 396,                  /* -Wunused-result */
-  OPT_Wunused_thrown = 397,                  /* -Wunused-thrown */
-  OPT_Wunused_value = 398,                   /* -Wunused-value */
-  OPT_Wunused_variable = 399,                /* -Wunused-variable */
-  OPT_Wuseless_cast = 400,                   /* -Wuseless-cast */
-  OPT_Wuseless_type_check = 401,             /* -Wuseless-type-check */
-  OPT_Wvarargs = 402,                        /* -Wvarargs */
-  OPT_Wvarargs_cast = 403,                   /* -Wvarargs-cast */
-  OPT_Wvariadic_macros = 404,                /* -Wvariadic-macros */
-  OPT_Wvector_operation_performance = 405,   /* -Wvector-operation-performance */
-  OPT_Wvirtual_move_assign = 406,            /* -Wvirtual-move-assign */
-  OPT_Wvla = 407,                            /* -Wvla */
-  OPT_Wvolatile_register_var = 408,          /* -Wvolatile-register-var */
-  OPT_Wwarning_token = 409,                  /* -Wwarning-token */
-  OPT_Wwrite_strings = 410,                  /* -Wwrite-strings */
-  OPT_Wzero_as_null_pointer_constant = 411,  /* -Wzero-as-null-pointer-constant */
-  OPT_Wzerotrip = 412,                       /* -Wzerotrip */
-  OPT_Xassembler = 413,                      /* -Xassembler */
-  OPT_Xlinker = 414,                         /* -Xlinker */
-  OPT_Xpreprocessor = 415,                   /* -Xpreprocessor */
-  OPT_Z = 416,                               /* -Z */
-  OPT_ansi = 417,                            /* -ansi */
-  OPT_aux_info = 418,                        /* -aux-info */
-  /* OPT_aux_info_ = 419, */                 /* -aux-info= */
-  OPT_auxbase = 420,                         /* -auxbase */
-  OPT_auxbase_strip = 421,                   /* -auxbase-strip */
-  /* OPT_bootclasspath = 422, */             /* -bootclasspath */
-  OPT_c = 423,                               /* -c */
-  /* OPT_classpath = 424, */                 /* -classpath */
-  OPT_coverage = 425,                        /* -coverage */
-  OPT_cpp = 426,                             /* -cpp */
-  OPT_cpp_ = 427,                            /* -cpp= */
-  OPT_d = 428,                               /* -d */
-  OPT_dumpbase = 429,                        /* -dumpbase */
-  OPT_dumpdir = 430,                         /* -dumpdir */
-  OPT_dumpmachine = 431,                     /* -dumpmachine */
-  OPT_dumpspecs = 432,                       /* -dumpspecs */
-  OPT_dumpversion = 433,                     /* -dumpversion */
-  OPT_e = 434,                               /* -e */
-  /* OPT_encoding = 435, */                  /* -encoding */
-  OPT_export_dynamic = 436,                  /* -export-dynamic */
-  OPT_extdirs = 437,                         /* -extdirs */
-  /* OPT_fCLASSPATH_ = 438, */               /* -fCLASSPATH= */
-  OPT_fPIC = 439,                            /* -fPIC */
-  OPT_fPIE = 440,                            /* -fPIE */
-  OPT_fRTS_ = 441,                           /* -fRTS= */
-  OPT_fabi_version_ = 442,                   /* -fabi-version= */
-  OPT_faccess_control = 443,                 /* -faccess-control */
-  OPT_fada_spec_parent_ = 444,               /* -fada-spec-parent= */
-  OPT_faggressive_function_elimination = 445,/* -faggressive-function-elimination */
-  OPT_faggressive_loop_optimizations = 446,  /* -faggressive-loop-optimizations */
-  OPT_falign_commons = 447,                  /* -falign-commons */
-  OPT_falign_functions = 448,                /* -falign-functions */
-  OPT_falign_functions_ = 449,               /* -falign-functions= */
-  OPT_falign_jumps = 450,                    /* -falign-jumps */
-  OPT_falign_jumps_ = 451,                   /* -falign-jumps= */
-  OPT_falign_labels = 452,                   /* -falign-labels */
-  OPT_falign_labels_ = 453,                  /* -falign-labels= */
-  OPT_falign_loops = 454,                    /* -falign-loops */
-  OPT_falign_loops_ = 455,                   /* -falign-loops= */
-  OPT_fall_intrinsics = 456,                 /* -fall-intrinsics */
-  /* OPT_fall_virtual = 457, */              /* -fall-virtual */
-  OPT_fallow_leading_underscore = 458,       /* -fallow-leading-underscore */
-  OPT_fallow_parameterless_variadic_functions = 459,/* -fallow-parameterless-variadic-functions */
-  /* OPT_falt_external_templates = 460, */   /* -falt-external-templates */
-  /* OPT_fargument_alias = 461, */           /* -fargument-alias */
-  /* OPT_fargument_noalias = 462, */         /* -fargument-noalias */
-  /* OPT_fargument_noalias_anything = 463, *//* -fargument-noalias-anything */
-  /* OPT_fargument_noalias_global = 464, */  /* -fargument-noalias-global */
-  OPT_fasm = 465,                            /* -fasm */
-  OPT_fassert = 466,                         /* -fassert */
-  OPT_fassociative_math = 467,               /* -fassociative-math */
-  OPT_fassume_compiled = 468,                /* -fassume-compiled */
-  OPT_fassume_compiled_ = 469,               /* -fassume-compiled= */
-  OPT_fasynchronous_unwind_tables = 470,     /* -fasynchronous-unwind-tables */
-  OPT_fauto_inc_dec = 471,                   /* -fauto-inc-dec */
-  OPT_fautomatic = 472,                      /* -fautomatic */
-  OPT_faux_classpath = 473,                  /* -faux-classpath */
-  OPT_fbackslash = 474,                      /* -fbackslash */
-  OPT_fbacktrace = 475,                      /* -fbacktrace */
-  OPT_fblas_matmul_limit_ = 476,             /* -fblas-matmul-limit= */
-  OPT_fbootclasspath_ = 477,                 /* -fbootclasspath= */
-  OPT_fbootstrap_classes = 478,              /* -fbootstrap-classes */
-  OPT_fbounds_check = 479,                   /* -fbounds-check */
-  OPT_fbranch_count_reg = 480,               /* -fbranch-count-reg */
-  OPT_fbranch_probabilities = 481,           /* -fbranch-probabilities */
-  OPT_fbranch_target_load_optimize = 482,    /* -fbranch-target-load-optimize */
-  OPT_fbranch_target_load_optimize2 = 483,   /* -fbranch-target-load-optimize2 */
-  OPT_fbtr_bb_exclusive = 484,               /* -fbtr-bb-exclusive */
-  OPT_fbuilding_libgcc = 485,                /* -fbuilding-libgcc */
-  OPT_fbuiltin = 486,                        /* -fbuiltin */
-  OPT_fbuiltin_ = 487,                       /* -fbuiltin- */
-  OPT_fcall_saved_ = 488,                    /* -fcall-saved- */
-  OPT_fcall_used_ = 489,                     /* -fcall-used- */
-  OPT_fcaller_saves = 490,                   /* -fcaller-saves */
-  OPT_fcanonical_system_headers = 491,       /* -fcanonical-system-headers */
-  OPT_fcheck_array_temporaries = 492,        /* -fcheck-array-temporaries */
-  OPT_fcheck_data_deps = 493,                /* -fcheck-data-deps */
-  OPT_fcheck_new = 494,                      /* -fcheck-new */
-  OPT_fcheck_references = 495,               /* -fcheck-references */
-  OPT_fcheck_ = 496,                         /* -fcheck= */
-  OPT_fcilkplus = 497,                       /* -fcilkplus */
-  OPT_fclasspath_ = 498,                     /* -fclasspath= */
-  OPT_fcoarray_ = 499,                       /* -fcoarray= */
-  OPT_fcombine_stack_adjustments = 500,      /* -fcombine-stack-adjustments */
-  OPT_fcommon = 501,                         /* -fcommon */
-  OPT_fcompare_debug = 502,                  /* -fcompare-debug */
-  OPT_fcompare_debug_second = 503,           /* -fcompare-debug-second */
-  OPT_fcompare_debug_ = 504,                 /* -fcompare-debug= */
-  OPT_fcompare_elim = 505,                   /* -fcompare-elim */
-  OPT_fcompile_resource_ = 506,              /* -fcompile-resource= */
-  OPT_fcond_mismatch = 507,                  /* -fcond-mismatch */
-  OPT_fconserve_space = 508,                 /* -fconserve-space */
-  OPT_fconserve_stack = 509,                 /* -fconserve-stack */
-  OPT_fconstant_string_class_ = 510,         /* -fconstant-string-class= */
-  OPT_fconstexpr_depth_ = 511,               /* -fconstexpr-depth= */
-  OPT_fconvert_big_endian = 512,             /* -fconvert=big-endian */
-  OPT_fconvert_little_endian = 513,          /* -fconvert=little-endian */
-  OPT_fconvert_native = 514,                 /* -fconvert=native */
-  OPT_fconvert_swap = 515,                   /* -fconvert=swap */
-  OPT_fcprop_registers = 516,                /* -fcprop-registers */
-  OPT_fcray_pointer = 517,                   /* -fcray-pointer */
-  OPT_fcrossjumping = 518,                   /* -fcrossjumping */
-  OPT_fcse_follow_jumps = 519,               /* -fcse-follow-jumps */
-  /* OPT_fcse_skip_blocks = 520, */          /* -fcse-skip-blocks */
-  OPT_fcx_fortran_rules = 521,               /* -fcx-fortran-rules */
-  OPT_fcx_limited_range = 522,               /* -fcx-limited-range */
-  OPT_fd_lines_as_code = 523,                /* -fd-lines-as-code */
-  OPT_fd_lines_as_comments = 524,            /* -fd-lines-as-comments */
-  OPT_fdata_sections = 525,                  /* -fdata-sections */
-  OPT_fdbg_cnt_list = 526,                   /* -fdbg-cnt-list */
-  OPT_fdbg_cnt_ = 527,                       /* -fdbg-cnt= */
-  OPT_fdce = 528,                            /* -fdce */
-  OPT_fdebug_cpp = 529,                      /* -fdebug-cpp */
-  OPT_fdebug_prefix_map_ = 530,              /* -fdebug-prefix-map= */
-  OPT_fdebug_types_section = 531,            /* -fdebug-types-section */
-  OPT_fdeclone_ctor_dtor = 532,              /* -fdeclone-ctor-dtor */
-  OPT_fdeduce_init_list = 533,               /* -fdeduce-init-list */
-  OPT_fdefault_double_8 = 534,               /* -fdefault-double-8 */
-  /* OPT_fdefault_inline = 535, */           /* -fdefault-inline */
-  OPT_fdefault_integer_8 = 536,              /* -fdefault-integer-8 */
-  OPT_fdefault_real_8 = 537,                 /* -fdefault-real-8 */
-  OPT_fdefer_pop = 538,                      /* -fdefer-pop */
-  OPT_fdelayed_branch = 539,                 /* -fdelayed-branch */
-  OPT_fdelete_dead_exceptions = 540,         /* -fdelete-dead-exceptions */
-  OPT_fdelete_null_pointer_checks = 541,     /* -fdelete-null-pointer-checks */
-  OPT_fdevirtualize = 542,                   /* -fdevirtualize */
-  OPT_fdevirtualize_speculatively = 543,     /* -fdevirtualize-speculatively */
-  /* OPT_fdiagnostics_color = 544, */        /* -fdiagnostics-color */
-  OPT_fdiagnostics_color_ = 545,             /* -fdiagnostics-color= */
-  OPT_fdiagnostics_show_caret = 546,         /* -fdiagnostics-show-caret */
-  OPT_fdiagnostics_show_location_ = 547,     /* -fdiagnostics-show-location= */
-  OPT_fdiagnostics_show_option = 548,        /* -fdiagnostics-show-option */
-  OPT_fdirectives_only = 549,                /* -fdirectives-only */
-  OPT_fdisable_ = 550,                       /* -fdisable- */
-  OPT_fdisable_assertions = 551,             /* -fdisable-assertions */
-  OPT_fdisable_assertions_ = 552,            /* -fdisable-assertions= */
-  OPT_fdollar_ok = 553,                      /* -fdollar-ok */
-  OPT_fdollars_in_identifiers = 554,         /* -fdollars-in-identifiers */
-  OPT_fdse = 555,                            /* -fdse */
-  OPT_fdump_ = 556,                          /* -fdump- */
-  OPT_fdump_ada_spec = 557,                  /* -fdump-ada-spec */
-  OPT_fdump_ada_spec_slim = 558,             /* -fdump-ada-spec-slim */
-  /* OPT_fdump_core = 559, */                /* -fdump-core */
-  OPT_fdump_final_insns = 560,               /* -fdump-final-insns */
-  OPT_fdump_final_insns_ = 561,              /* -fdump-final-insns= */
-  OPT_fdump_fortran_optimized = 562,         /* -fdump-fortran-optimized */
-  OPT_fdump_fortran_original = 563,          /* -fdump-fortran-original */
-  OPT_fdump_go_spec_ = 564,                  /* -fdump-go-spec= */
-  OPT_fdump_noaddr = 565,                    /* -fdump-noaddr */
-  OPT_fdump_parse_tree = 566,                /* -fdump-parse-tree */
-  OPT_fdump_passes = 567,                    /* -fdump-passes */
-  OPT_fdump_unnumbered = 568,                /* -fdump-unnumbered */
-  OPT_fdump_unnumbered_links = 569,          /* -fdump-unnumbered-links */
-  OPT_fdwarf2_cfi_asm = 570,                 /* -fdwarf2-cfi-asm */
-  OPT_fearly_inlining = 571,                 /* -fearly-inlining */
-  OPT_felide_constructors = 572,             /* -felide-constructors */
-  OPT_feliminate_dwarf2_dups = 573,          /* -feliminate-dwarf2-dups */
-  OPT_feliminate_unused_debug_symbols = 574, /* -feliminate-unused-debug-symbols */
-  OPT_feliminate_unused_debug_types = 575,   /* -feliminate-unused-debug-types */
-  OPT_femit_class_debug_always = 576,        /* -femit-class-debug-always */
-  OPT_femit_class_file = 577,                /* -femit-class-file */
-  OPT_femit_class_files = 578,               /* -femit-class-files */
-  OPT_femit_struct_debug_baseonly = 579,     /* -femit-struct-debug-baseonly */
-  OPT_femit_struct_debug_detailed_ = 580,    /* -femit-struct-debug-detailed= */
-  OPT_femit_struct_debug_reduced = 581,      /* -femit-struct-debug-reduced */
-  OPT_fenable_ = 582,                        /* -fenable- */
-  OPT_fenable_assertions = 583,              /* -fenable-assertions */
-  OPT_fenable_assertions_ = 584,             /* -fenable-assertions= */
-  OPT_fencoding_ = 585,                      /* -fencoding= */
-  OPT_fenforce_eh_specs = 586,               /* -fenforce-eh-specs */
-  /* OPT_fenum_int_equiv = 587, */           /* -fenum-int-equiv */
-  OPT_fexceptions = 588,                     /* -fexceptions */
-  OPT_fexcess_precision_ = 589,              /* -fexcess-precision= */
-  OPT_fexec_charset_ = 590,                  /* -fexec-charset= */
-  OPT_fexpensive_optimizations = 591,        /* -fexpensive-optimizations */
-  OPT_fext_numeric_literals = 592,           /* -fext-numeric-literals */
-  OPT_fextdirs_ = 593,                       /* -fextdirs= */
-  OPT_fextended_identifiers = 594,           /* -fextended-identifiers */
-  OPT_fextern_tls_init = 595,                /* -fextern-tls-init */
-  OPT_fexternal_blas = 596,                  /* -fexternal-blas */
-  /* OPT_fexternal_templates = 597, */       /* -fexternal-templates */
-  OPT_ff2c = 598,                            /* -ff2c */
-  OPT_ffast_math = 599,                      /* -ffast-math */
-  OPT_ffat_lto_objects = 600,                /* -ffat-lto-objects */
-  OPT_ffilelist_file = 601,                  /* -ffilelist-file */
-  OPT_ffinite_math_only = 602,               /* -ffinite-math-only */
-  OPT_ffixed_ = 603,                         /* -ffixed- */
-  OPT_ffixed_form = 604,                     /* -ffixed-form */
-  OPT_ffixed_line_length_ = 605,             /* -ffixed-line-length- */
-  OPT_ffixed_line_length_none = 606,         /* -ffixed-line-length-none */
-  OPT_ffloat_store = 607,                    /* -ffloat-store */
-  OPT_ffor_scope = 608,                      /* -ffor-scope */
-  /* OPT_fforce_addr = 609, */               /* -fforce-addr */
-  OPT_fforce_classes_archive_check = 610,    /* -fforce-classes-archive-check */
-  OPT_fforward_propagate = 611,              /* -fforward-propagate */
-  OPT_ffp_contract_ = 612,                   /* -ffp-contract= */
-  OPT_ffpe_summary_ = 613,                   /* -ffpe-summary= */
-  OPT_ffpe_trap_ = 614,                      /* -ffpe-trap= */
-  OPT_ffree_form = 615,                      /* -ffree-form */
-  OPT_ffree_line_length_ = 616,              /* -ffree-line-length- */
-  OPT_ffree_line_length_none = 617,          /* -ffree-line-length-none */
-  OPT_ffreestanding = 618,                   /* -ffreestanding */
-  OPT_ffriend_injection = 619,               /* -ffriend-injection */
-  OPT_ffrontend_optimize = 620,              /* -ffrontend-optimize */
-  OPT_ffunction_cse = 621,                   /* -ffunction-cse */
-  OPT_ffunction_sections = 622,              /* -ffunction-sections */
-  OPT_fgcse = 623,                           /* -fgcse */
-  OPT_fgcse_after_reload = 624,              /* -fgcse-after-reload */
-  OPT_fgcse_las = 625,                       /* -fgcse-las */
-  OPT_fgcse_lm = 626,                        /* -fgcse-lm */
-  OPT_fgcse_sm = 627,                        /* -fgcse-sm */
-  OPT_fgnu_keywords = 628,                   /* -fgnu-keywords */
-  OPT_fgnu_runtime = 629,                    /* -fgnu-runtime */
-  OPT_fgnu_tm = 630,                         /* -fgnu-tm */
-  OPT_fgnu_unique = 631,                     /* -fgnu-unique */
-  OPT_fgnu89_inline = 632,                   /* -fgnu89-inline */
-  OPT_fgo_check_divide_overflow = 633,       /* -fgo-check-divide-overflow */
-  OPT_fgo_check_divide_zero = 634,           /* -fgo-check-divide-zero */
-  OPT_fgo_dump_ = 635,                       /* -fgo-dump- */
-  OPT_fgo_optimize_ = 636,                   /* -fgo-optimize- */
-  OPT_fgo_pkgpath_ = 637,                    /* -fgo-pkgpath= */
-  OPT_fgo_prefix_ = 638,                     /* -fgo-prefix= */
-  OPT_fgo_relative_import_path_ = 639,       /* -fgo-relative-import-path= */
-  OPT_fgraphite = 640,                       /* -fgraphite */
-  OPT_fgraphite_identity = 641,              /* -fgraphite-identity */
-  OPT_fguess_branch_probability = 642,       /* -fguess-branch-probability */
-  /* OPT_fguiding_decls = 643, */            /* -fguiding-decls */
-  /* OPT_fhandle_exceptions = 644, */        /* -fhandle-exceptions */
-  OPT_fhash_synchronization = 645,           /* -fhash-synchronization */
-  /* OPT_fhelp = 646, */                     /* -fhelp */
-  /* OPT_fhelp_ = 647, */                    /* -fhelp= */
-  OPT_fhoist_adjacent_loads = 648,           /* -fhoist-adjacent-loads */
-  /* OPT_fhonor_std = 649, */                /* -fhonor-std */
-  OPT_fhosted = 650,                         /* -fhosted */
-  /* OPT_fhuge_objects = 651, */             /* -fhuge-objects */
-  OPT_fident = 652,                          /* -fident */
-  OPT_fif_conversion = 653,                  /* -fif-conversion */
-  OPT_fif_conversion2 = 654,                 /* -fif-conversion2 */
-  OPT_fimplement_inlines = 655,              /* -fimplement-inlines */
-  OPT_fimplicit_inline_templates = 656,      /* -fimplicit-inline-templates */
-  OPT_fimplicit_none = 657,                  /* -fimplicit-none */
-  OPT_fimplicit_templates = 658,             /* -fimplicit-templates */
-  OPT_findirect_classes = 659,               /* -findirect-classes */
-  OPT_findirect_dispatch = 660,              /* -findirect-dispatch */
-  OPT_findirect_inlining = 661,              /* -findirect-inlining */
-  OPT_finhibit_size_directive = 662,         /* -finhibit-size-directive */
-  OPT_finit_character_ = 663,                /* -finit-character= */
-  OPT_finit_integer_ = 664,                  /* -finit-integer= */
-  OPT_finit_local_zero = 665,                /* -finit-local-zero */
-  OPT_finit_logical_ = 666,                  /* -finit-logical= */
-  OPT_finit_real_ = 667,                     /* -finit-real= */
-  OPT_finline = 668,                         /* -finline */
-  OPT_finline_atomics = 669,                 /* -finline-atomics */
-  OPT_finline_functions = 670,               /* -finline-functions */
-  OPT_finline_functions_called_once = 671,   /* -finline-functions-called-once */
-  /* OPT_finline_limit_ = 672, */            /* -finline-limit- */
-  OPT_finline_limit_ = 673,                  /* -finline-limit= */
-  OPT_finline_small_functions = 674,         /* -finline-small-functions */
-  OPT_finput_charset_ = 675,                 /* -finput-charset= */
-  OPT_finstrument_functions = 676,           /* -finstrument-functions */
-  OPT_finstrument_functions_exclude_file_list_ = 677,/* -finstrument-functions-exclude-file-list= */
-  OPT_finstrument_functions_exclude_function_list_ = 678,/* -finstrument-functions-exclude-function-list= */
-  OPT_finteger_4_integer_8 = 679,            /* -finteger-4-integer-8 */
-  OPT_fintrinsic_modules_path = 680,         /* -fintrinsic-modules-path */
-  OPT_fintrinsic_modules_path_ = 681,        /* -fintrinsic-modules-path= */
-  OPT_fipa_cp = 682,                         /* -fipa-cp */
-  OPT_fipa_cp_clone = 683,                   /* -fipa-cp-clone */
-  /* OPT_fipa_matrix_reorg = 684, */         /* -fipa-matrix-reorg */
-  OPT_fipa_profile = 685,                    /* -fipa-profile */
-  OPT_fipa_pta = 686,                        /* -fipa-pta */
-  OPT_fipa_pure_const = 687,                 /* -fipa-pure-const */
-  OPT_fipa_reference = 688,                  /* -fipa-reference */
-  OPT_fipa_sra = 689,                        /* -fipa-sra */
-  /* OPT_fipa_struct_reorg = 690, */         /* -fipa-struct-reorg */
-  OPT_fira_algorithm_ = 691,                 /* -fira-algorithm= */
-  OPT_fira_hoist_pressure = 692,             /* -fira-hoist-pressure */
-  OPT_fira_loop_pressure = 693,              /* -fira-loop-pressure */
-  OPT_fira_region_ = 694,                    /* -fira-region= */
-  OPT_fira_share_save_slots = 695,           /* -fira-share-save-slots */
-  OPT_fira_share_spill_slots = 696,          /* -fira-share-spill-slots */
-  OPT_fira_verbose_ = 697,                   /* -fira-verbose= */
-  OPT_fisolate_erroneous_paths_attribute = 698,/* -fisolate-erroneous-paths-attribute */
-  OPT_fisolate_erroneous_paths_dereference = 699,/* -fisolate-erroneous-paths-dereference */
-  OPT_fivopts = 700,                         /* -fivopts */
-  OPT_fjni = 701,                            /* -fjni */
-  OPT_fjump_tables = 702,                    /* -fjump-tables */
-  OPT_fkeep_inline_dllexport = 703,          /* -fkeep-inline-dllexport */
-  OPT_fkeep_inline_functions = 704,          /* -fkeep-inline-functions */
-  OPT_fkeep_static_consts = 705,             /* -fkeep-static-consts */
-  /* OPT_flabels_ok = 706, */                /* -flabels-ok */
-  OPT_flax_vector_conversions = 707,         /* -flax-vector-conversions */
-  OPT_fleading_underscore = 708,             /* -fleading-underscore */
-  OPT_flive_range_shrinkage = 709,           /* -flive-range-shrinkage */
-  OPT_floop_block = 710,                     /* -floop-block */
-  /* OPT_floop_flatten = 711, */             /* -floop-flatten */
-  OPT_floop_interchange = 712,               /* -floop-interchange */
-  OPT_floop_nest_optimize = 713,             /* -floop-nest-optimize */
-  /* OPT_floop_optimize = 714, */            /* -floop-optimize */
-  OPT_floop_parallelize_all = 715,           /* -floop-parallelize-all */
-  OPT_floop_strip_mine = 716,                /* -floop-strip-mine */
-  OPT_flto = 717,                            /* -flto */
-  OPT_flto_compression_level_ = 718,         /* -flto-compression-level= */
-  OPT_flto_partition_1to1 = 719,             /* -flto-partition=1to1 */
-  OPT_flto_partition_balanced = 720,         /* -flto-partition=balanced */
-  OPT_flto_partition_max = 721,              /* -flto-partition=max */
-  OPT_flto_partition_none = 722,             /* -flto-partition=none */
-  OPT_flto_report = 723,                     /* -flto-report */
-  OPT_flto_report_wpa = 724,                 /* -flto-report-wpa */
-  OPT_flto_ = 725,                           /* -flto= */
-  OPT_fltrans = 726,                         /* -fltrans */
-  OPT_fltrans_output_list_ = 727,            /* -fltrans-output-list= */
-  OPT_fmain_ = 728,                          /* -fmain= */
-  OPT_fmath_errno = 729,                     /* -fmath-errno */
-  OPT_fmax_array_constructor_ = 730,         /* -fmax-array-constructor= */
-  OPT_fmax_errors_ = 731,                    /* -fmax-errors= */
-  OPT_fmax_identifier_length_ = 732,         /* -fmax-identifier-length= */
-  OPT_fmax_stack_var_size_ = 733,            /* -fmax-stack-var-size= */
-  OPT_fmax_subrecord_length_ = 734,          /* -fmax-subrecord-length= */
-  OPT_fmem_report = 735,                     /* -fmem-report */
-  OPT_fmem_report_wpa = 736,                 /* -fmem-report-wpa */
-  OPT_fmerge_all_constants = 737,            /* -fmerge-all-constants */
-  OPT_fmerge_constants = 738,                /* -fmerge-constants */
-  OPT_fmerge_debug_strings = 739,            /* -fmerge-debug-strings */
-  OPT_fmessage_length_ = 740,                /* -fmessage-length= */
-  OPT_fmodule_private = 741,                 /* -fmodule-private */
-  OPT_fmodulo_sched = 742,                   /* -fmodulo-sched */
-  OPT_fmodulo_sched_allow_regmoves = 743,    /* -fmodulo-sched-allow-regmoves */
-  OPT_fmove_loop_invariants = 744,           /* -fmove-loop-invariants */
-  OPT_fms_extensions = 745,                  /* -fms-extensions */
-  /* OPT_fmudflap = 746, */                  /* -fmudflap */
-  /* OPT_fmudflapir = 747, */                /* -fmudflapir */
-  /* OPT_fmudflapth = 748, */                /* -fmudflapth */
-  /* OPT_fname_mangling_version_ = 749, */   /* -fname-mangling-version- */
-  /* OPT_fnew_abi = 750, */                  /* -fnew-abi */
-  OPT_fnext_runtime = 751,                   /* -fnext-runtime */
-  OPT_fnil_receivers = 752,                  /* -fnil-receivers */
-  /* OPT_fno_vect_cost_model = 753, */       /* -fno-vect-cost-model */
-  OPT_fnon_call_exceptions = 754,            /* -fnon-call-exceptions */
-  OPT_fnonansi_builtins = 755,               /* -fnonansi-builtins */
-  /* OPT_fnonnull_objects = 756, */          /* -fnonnull-objects */
-  OPT_fnothrow_opt = 757,                    /* -fnothrow-opt */
-  OPT_fobjc_abi_version_ = 758,              /* -fobjc-abi-version= */
-  OPT_fobjc_call_cxx_cdtors = 759,           /* -fobjc-call-cxx-cdtors */
-  OPT_fobjc_direct_dispatch = 760,           /* -fobjc-direct-dispatch */
-  OPT_fobjc_exceptions = 761,                /* -fobjc-exceptions */
-  OPT_fobjc_gc = 762,                        /* -fobjc-gc */
-  OPT_fobjc_nilcheck = 763,                  /* -fobjc-nilcheck */
-  OPT_fobjc_sjlj_exceptions = 764,           /* -fobjc-sjlj-exceptions */
-  OPT_fobjc_std_objc1 = 765,                 /* -fobjc-std=objc1 */
-  OPT_fomit_frame_pointer = 766,             /* -fomit-frame-pointer */
-  OPT_fopenmp = 767,                         /* -fopenmp */
-  OPT_fopenmp_simd = 768,                    /* -fopenmp-simd */
-  OPT_foperator_names = 769,                 /* -foperator-names */
-  OPT_fopt_info = 770,                       /* -fopt-info */
-  OPT_fopt_info_ = 771,                      /* -fopt-info- */
-  /* OPT_foptimize_register_move = 772, */   /* -foptimize-register-move */
-  OPT_foptimize_sibling_calls = 773,         /* -foptimize-sibling-calls */
-  OPT_foptimize_static_class_initialization = 774,/* -foptimize-static-class-initialization */
-  OPT_foptimize_strlen = 775,                /* -foptimize-strlen */
-  /* OPT_foptional_diags = 776, */           /* -foptional-diags */
-  OPT_foutput_class_dir_ = 777,              /* -foutput-class-dir= */
-  OPT_fpack_derived = 778,                   /* -fpack-derived */
-  OPT_fpack_struct = 779,                    /* -fpack-struct */
-  OPT_fpack_struct_ = 780,                   /* -fpack-struct= */
-  OPT_fpartial_inlining = 781,               /* -fpartial-inlining */
-  OPT_fpcc_struct_return = 782,              /* -fpcc-struct-return */
-  OPT_fpch_deps = 783,                       /* -fpch-deps */
-  OPT_fpch_preprocess = 784,                 /* -fpch-preprocess */
-  OPT_fpeel_loops = 785,                     /* -fpeel-loops */
-  OPT_fpeephole = 786,                       /* -fpeephole */
-  OPT_fpeephole2 = 787,                      /* -fpeephole2 */
-  OPT_fpermissive = 788,                     /* -fpermissive */
-  OPT_fpic = 789,                            /* -fpic */
-  OPT_fpie = 790,                            /* -fpie */
-  OPT_fplan9_extensions = 791,               /* -fplan9-extensions */
-  OPT_fplugin_arg_ = 792,                    /* -fplugin-arg- */
-  OPT_fplugin_ = 793,                        /* -fplugin= */
-  OPT_fpost_ipa_mem_report = 794,            /* -fpost-ipa-mem-report */
-  OPT_fpre_ipa_mem_report = 795,             /* -fpre-ipa-mem-report */
-  OPT_fpredictive_commoning = 796,           /* -fpredictive-commoning */
-  OPT_fprefetch_loop_arrays = 797,           /* -fprefetch-loop-arrays */
-  OPT_fpreprocessed = 798,                   /* -fpreprocessed */
-  OPT_fpretty_templates = 799,               /* -fpretty-templates */
-  OPT_fprofile = 800,                        /* -fprofile */
-  OPT_fprofile_arcs = 801,                   /* -fprofile-arcs */
-  OPT_fprofile_correction = 802,             /* -fprofile-correction */
-  OPT_fprofile_dir_ = 803,                   /* -fprofile-dir= */
-  OPT_fprofile_generate = 804,               /* -fprofile-generate */
-  OPT_fprofile_generate_ = 805,              /* -fprofile-generate= */
-  OPT_fprofile_reorder_functions = 806,      /* -fprofile-reorder-functions */
-  OPT_fprofile_report = 807,                 /* -fprofile-report */
-  OPT_fprofile_use = 808,                    /* -fprofile-use */
-  OPT_fprofile_use_ = 809,                   /* -fprofile-use= */
-  OPT_fprofile_values = 810,                 /* -fprofile-values */
-  OPT_fprotect_parens = 811,                 /* -fprotect-parens */
-  OPT_frandom_seed = 812,                    /* -frandom-seed */
-  OPT_frandom_seed_ = 813,                   /* -frandom-seed= */
-  OPT_frange_check = 814,                    /* -frange-check */
-  OPT_freal_4_real_10 = 815,                 /* -freal-4-real-10 */
-  OPT_freal_4_real_16 = 816,                 /* -freal-4-real-16 */
-  OPT_freal_4_real_8 = 817,                  /* -freal-4-real-8 */
-  OPT_freal_8_real_10 = 818,                 /* -freal-8-real-10 */
-  OPT_freal_8_real_16 = 819,                 /* -freal-8-real-16 */
-  OPT_freal_8_real_4 = 820,                  /* -freal-8-real-4 */
-  OPT_frealloc_lhs = 821,                    /* -frealloc-lhs */
-  OPT_freciprocal_math = 822,                /* -freciprocal-math */
-  OPT_frecord_gcc_switches = 823,            /* -frecord-gcc-switches */
-  OPT_frecord_marker_4 = 824,                /* -frecord-marker=4 */
-  OPT_frecord_marker_8 = 825,                /* -frecord-marker=8 */
-  OPT_frecursive = 826,                      /* -frecursive */
-  OPT_freduced_reflection = 827,             /* -freduced-reflection */
-  OPT_free = 828,                            /* -free */
-  OPT_freg_struct_return = 829,              /* -freg-struct-return */
-  /* OPT_fregmove = 830, */                  /* -fregmove */
-  OPT_frename_registers = 831,               /* -frename-registers */
-  OPT_freorder_blocks = 832,                 /* -freorder-blocks */
-  OPT_freorder_blocks_and_partition = 833,   /* -freorder-blocks-and-partition */
-  OPT_freorder_functions = 834,              /* -freorder-functions */
-  OPT_frepack_arrays = 835,                  /* -frepack-arrays */
-  OPT_freplace_objc_classes = 836,           /* -freplace-objc-classes */
-  OPT_frepo = 837,                           /* -frepo */
-  OPT_frequire_return_statement = 838,       /* -frequire-return-statement */
-  OPT_frerun_cse_after_loop = 839,           /* -frerun-cse-after-loop */
-  /* OPT_frerun_loop_opt = 840, */           /* -frerun-loop-opt */
-  OPT_freschedule_modulo_scheduled_loops = 841,/* -freschedule-modulo-scheduled-loops */
-  OPT_fresolution_ = 842,                    /* -fresolution= */
-  OPT_frounding_math = 843,                  /* -frounding-math */
-  OPT_frtti = 844,                           /* -frtti */
-  OPT_fsanitize_ = 845,                      /* -fsanitize= */
-  OPT_fsaw_java_file = 846,                  /* -fsaw-java-file */
-  OPT_fsched_critical_path_heuristic = 847,  /* -fsched-critical-path-heuristic */
-  OPT_fsched_dep_count_heuristic = 848,      /* -fsched-dep-count-heuristic */
-  OPT_fsched_group_heuristic = 849,          /* -fsched-group-heuristic */
-  OPT_fsched_interblock = 850,               /* -fsched-interblock */
-  OPT_fsched_last_insn_heuristic = 851,      /* -fsched-last-insn-heuristic */
-  OPT_fsched_pressure = 852,                 /* -fsched-pressure */
-  OPT_fsched_rank_heuristic = 853,           /* -fsched-rank-heuristic */
-  OPT_fsched_spec = 854,                     /* -fsched-spec */
-  OPT_fsched_spec_insn_heuristic = 855,      /* -fsched-spec-insn-heuristic */
-  OPT_fsched_spec_load = 856,                /* -fsched-spec-load */
-  OPT_fsched_spec_load_dangerous = 857,      /* -fsched-spec-load-dangerous */
-  OPT_fsched_stalled_insns = 858,            /* -fsched-stalled-insns */
-  OPT_fsched_stalled_insns_dep = 859,        /* -fsched-stalled-insns-dep */
-  OPT_fsched_stalled_insns_dep_ = 860,       /* -fsched-stalled-insns-dep= */
-  OPT_fsched_stalled_insns_ = 861,           /* -fsched-stalled-insns= */
-  OPT_fsched_verbose_ = 862,                 /* -fsched-verbose= */
-  OPT_fsched2_use_superblocks = 863,         /* -fsched2-use-superblocks */
-  /* OPT_fsched2_use_traces = 864, */        /* -fsched2-use-traces */
-  OPT_fschedule_insns = 865,                 /* -fschedule-insns */
-  OPT_fschedule_insns2 = 866,                /* -fschedule-insns2 */
-  OPT_fsecond_underscore = 867,              /* -fsecond-underscore */
-  OPT_fsection_anchors = 868,                /* -fsection-anchors */
-  /* OPT_fsee = 869, */                      /* -fsee */
-  OPT_fsel_sched_pipelining = 870,           /* -fsel-sched-pipelining */
-  OPT_fsel_sched_pipelining_outer_loops = 871,/* -fsel-sched-pipelining-outer-loops */
-  OPT_fsel_sched_reschedule_pipelined = 872, /* -fsel-sched-reschedule-pipelined */
-  OPT_fselective_scheduling = 873,           /* -fselective-scheduling */
-  OPT_fselective_scheduling2 = 874,          /* -fselective-scheduling2 */
-  OPT_fshort_double = 875,                   /* -fshort-double */
-  OPT_fshort_enums = 876,                    /* -fshort-enums */
-  OPT_fshort_wchar = 877,                    /* -fshort-wchar */
-  OPT_fshow_column = 878,                    /* -fshow-column */
-  OPT_fshrink_wrap = 879,                    /* -fshrink-wrap */
-  OPT_fsign_zero = 880,                      /* -fsign-zero */
-  OPT_fsignaling_nans = 881,                 /* -fsignaling-nans */
-  OPT_fsigned_bitfields = 882,               /* -fsigned-bitfields */
-  OPT_fsigned_char = 883,                    /* -fsigned-char */
-  OPT_fsigned_zeros = 884,                   /* -fsigned-zeros */
-  OPT_fsimd_cost_model_ = 885,               /* -fsimd-cost-model= */
-  OPT_fsingle_precision_constant = 886,      /* -fsingle-precision-constant */
-  OPT_fsource_filename_ = 887,               /* -fsource-filename= */
-  OPT_fsource_ = 888,                        /* -fsource= */
-  OPT_fsplit_ivs_in_unroller = 889,          /* -fsplit-ivs-in-unroller */
-  OPT_fsplit_stack = 890,                    /* -fsplit-stack */
-  OPT_fsplit_wide_types = 891,               /* -fsplit-wide-types */
-  /* OPT_fsquangle = 892, */                 /* -fsquangle */
-  OPT_fstack_arrays = 893,                   /* -fstack-arrays */
-  /* OPT_fstack_check = 894, */              /* -fstack-check */
-  OPT_fstack_check_ = 895,                   /* -fstack-check= */
-  OPT_fstack_limit = 896,                    /* -fstack-limit */
-  OPT_fstack_limit_register_ = 897,          /* -fstack-limit-register= */
-  OPT_fstack_limit_symbol_ = 898,            /* -fstack-limit-symbol= */
-  OPT_fstack_protector = 899,                /* -fstack-protector */
-  OPT_fstack_protector_all = 900,            /* -fstack-protector-all */
-  OPT_fstack_protector_strong = 901,         /* -fstack-protector-strong */
-  OPT_fstack_reuse_ = 902,                   /* -fstack-reuse= */
-  OPT_fstack_usage = 903,                    /* -fstack-usage */
-  OPT_fstats = 904,                          /* -fstats */
-  OPT_fstore_check = 905,                    /* -fstore-check */
-  /* OPT_fstrength_reduce = 906, */          /* -fstrength-reduce */
-  OPT_fstrict_aliasing = 907,                /* -fstrict-aliasing */
-  OPT_fstrict_enums = 908,                   /* -fstrict-enums */
-  OPT_fstrict_overflow = 909,                /* -fstrict-overflow */
-  /* OPT_fstrict_prototype = 910, */         /* -fstrict-prototype */
-  OPT_fstrict_volatile_bitfields = 911,      /* -fstrict-volatile-bitfields */
-  OPT_fsync_libcalls = 912,                  /* -fsync-libcalls */
-  OPT_fsyntax_only = 913,                    /* -fsyntax-only */
-  OPT_ftabstop_ = 914,                       /* -ftabstop= */
-  /* OPT_ftarget_help = 915, */              /* -ftarget-help */
-  OPT_ftarget_ = 916,                        /* -ftarget= */
-  OPT_ftemplate_backtrace_limit_ = 917,      /* -ftemplate-backtrace-limit= */
-  /* OPT_ftemplate_depth_ = 918, */          /* -ftemplate-depth- */
-  OPT_ftemplate_depth_ = 919,                /* -ftemplate-depth= */
-  OPT_ftest_coverage = 920,                  /* -ftest-coverage */
-  /* OPT_fthis_is_variable = 921, */         /* -fthis-is-variable */
-  OPT_fthread_jumps = 922,                   /* -fthread-jumps */
-  OPT_fthreadsafe_statics = 923,             /* -fthreadsafe-statics */
-  OPT_ftime_report = 924,                    /* -ftime-report */
-  OPT_ftls_model_ = 925,                     /* -ftls-model= */
-  OPT_ftoplevel_reorder = 926,               /* -ftoplevel-reorder */
-  OPT_ftracer = 927,                         /* -ftracer */
-  OPT_ftrack_macro_expansion = 928,          /* -ftrack-macro-expansion */
-  OPT_ftrack_macro_expansion_ = 929,         /* -ftrack-macro-expansion= */
-  OPT_ftrapping_math = 930,                  /* -ftrapping-math */
-  OPT_ftrapv = 931,                          /* -ftrapv */
-  OPT_ftree_bit_ccp = 932,                   /* -ftree-bit-ccp */
-  OPT_ftree_builtin_call_dce = 933,          /* -ftree-builtin-call-dce */
-  OPT_ftree_ccp = 934,                       /* -ftree-ccp */
-  OPT_ftree_ch = 935,                        /* -ftree-ch */
-  OPT_ftree_coalesce_inlined_vars = 936,     /* -ftree-coalesce-inlined-vars */
-  OPT_ftree_coalesce_vars = 937,             /* -ftree-coalesce-vars */
-  OPT_ftree_copy_prop = 938,                 /* -ftree-copy-prop */
-  OPT_ftree_copyrename = 939,                /* -ftree-copyrename */
-  OPT_ftree_cselim = 940,                    /* -ftree-cselim */
-  OPT_ftree_dce = 941,                       /* -ftree-dce */
-  OPT_ftree_dominator_opts = 942,            /* -ftree-dominator-opts */
-  OPT_ftree_dse = 943,                       /* -ftree-dse */
-  OPT_ftree_forwprop = 944,                  /* -ftree-forwprop */
-  OPT_ftree_fre = 945,                       /* -ftree-fre */
-  OPT_ftree_loop_distribute_patterns = 946,  /* -ftree-loop-distribute-patterns */
-  OPT_ftree_loop_distribution = 947,         /* -ftree-loop-distribution */
-  OPT_ftree_loop_if_convert = 948,           /* -ftree-loop-if-convert */
-  OPT_ftree_loop_if_convert_stores = 949,    /* -ftree-loop-if-convert-stores */
-  OPT_ftree_loop_im = 950,                   /* -ftree-loop-im */
-  OPT_ftree_loop_ivcanon = 951,              /* -ftree-loop-ivcanon */
-  /* OPT_ftree_loop_linear = 952, */         /* -ftree-loop-linear */
-  OPT_ftree_loop_optimize = 953,             /* -ftree-loop-optimize */
-  OPT_ftree_loop_vectorize = 954,            /* -ftree-loop-vectorize */
-  OPT_ftree_lrs = 955,                       /* -ftree-lrs */
-  OPT_ftree_parallelize_loops_ = 956,        /* -ftree-parallelize-loops= */
-  OPT_ftree_partial_pre = 957,               /* -ftree-partial-pre */
-  OPT_ftree_phiprop = 958,                   /* -ftree-phiprop */
-  OPT_ftree_pre = 959,                       /* -ftree-pre */
-  OPT_ftree_pta = 960,                       /* -ftree-pta */
-  OPT_ftree_reassoc = 961,                   /* -ftree-reassoc */
-  /* OPT_ftree_salias = 962, */              /* -ftree-salias */
-  OPT_ftree_scev_cprop = 963,                /* -ftree-scev-cprop */
-  OPT_ftree_sink = 964,                      /* -ftree-sink */
-  OPT_ftree_slp_vectorize = 965,             /* -ftree-slp-vectorize */
-  OPT_ftree_slsr = 966,                      /* -ftree-slsr */
-  OPT_ftree_sra = 967,                       /* -ftree-sra */
-  /* OPT_ftree_store_ccp = 968, */           /* -ftree-store-ccp */
-  /* OPT_ftree_store_copy_prop = 969, */     /* -ftree-store-copy-prop */
-  OPT_ftree_switch_conversion = 970,         /* -ftree-switch-conversion */
-  OPT_ftree_tail_merge = 971,                /* -ftree-tail-merge */
-  OPT_ftree_ter = 972,                       /* -ftree-ter */
-  /* OPT_ftree_vect_loop_version = 973, */   /* -ftree-vect-loop-version */
-  OPT_ftree_vectorize = 974,                 /* -ftree-vectorize */
-  /* OPT_ftree_vectorizer_verbose_ = 975, */ /* -ftree-vectorizer-verbose= */
-  OPT_ftree_vrp = 976,                       /* -ftree-vrp */
-  OPT_funderscoring = 977,                   /* -funderscoring */
-  OPT_funit_at_a_time = 978,                 /* -funit-at-a-time */
-  OPT_funroll_all_loops = 979,               /* -funroll-all-loops */
-  OPT_funroll_loops = 980,                   /* -funroll-loops */
-  OPT_funsafe_loop_optimizations = 981,      /* -funsafe-loop-optimizations */
-  OPT_funsafe_math_optimizations = 982,      /* -funsafe-math-optimizations */
-  OPT_funsigned_bitfields = 983,             /* -funsigned-bitfields */
-  OPT_funsigned_char = 984,                  /* -funsigned-char */
-  OPT_funswitch_loops = 985,                 /* -funswitch-loops */
-  OPT_funwind_tables = 986,                  /* -funwind-tables */
-  OPT_fuse_atomic_builtins = 987,            /* -fuse-atomic-builtins */
-  OPT_fuse_boehm_gc = 988,                   /* -fuse-boehm-gc */
-  OPT_fuse_cxa_atexit = 989,                 /* -fuse-cxa-atexit */
-  OPT_fuse_cxa_get_exception_ptr = 990,      /* -fuse-cxa-get-exception-ptr */
-  OPT_fuse_divide_subroutine = 991,          /* -fuse-divide-subroutine */
-  OPT_fuse_ld_bfd = 992,                     /* -fuse-ld=bfd */
-  OPT_fuse_ld_gold = 993,                    /* -fuse-ld=gold */
-  OPT_fuse_linker_plugin = 994,              /* -fuse-linker-plugin */
-  OPT_fvar_tracking = 995,                   /* -fvar-tracking */
-  OPT_fvar_tracking_assignments = 996,       /* -fvar-tracking-assignments */
-  OPT_fvar_tracking_assignments_toggle = 997,/* -fvar-tracking-assignments-toggle */
-  OPT_fvar_tracking_uninit = 998,            /* -fvar-tracking-uninit */
-  OPT_fvariable_expansion_in_unroller = 999, /* -fvariable-expansion-in-unroller */
-  /* OPT_fvect_cost_model = 1000, */         /* -fvect-cost-model */
-  OPT_fvect_cost_model_ = 1001,              /* -fvect-cost-model= */
-  OPT_fverbose_asm = 1002,                   /* -fverbose-asm */
-  /* OPT_fversion = 1003, */                 /* -fversion */
-  OPT_fvisibility_inlines_hidden = 1004,     /* -fvisibility-inlines-hidden */
-  OPT_fvisibility_ms_compat = 1005,          /* -fvisibility-ms-compat */
-  OPT_fvisibility_ = 1006,                   /* -fvisibility= */
-  OPT_fvpt = 1007,                           /* -fvpt */
-  /* OPT_fvtable_gc = 1008, */               /* -fvtable-gc */
-  /* OPT_fvtable_thunks = 1009, */           /* -fvtable-thunks */
-  OPT_fvtable_verify_ = 1010,                /* -fvtable-verify= */
-  OPT_fvtv_counts = 1011,                    /* -fvtv-counts */
-  OPT_fvtv_debug = 1012,                     /* -fvtv-debug */
-  OPT_fweak = 1013,                          /* -fweak */
-  OPT_fweb = 1014,                           /* -fweb */
-  /* OPT_fwhole_file = 1015, */              /* -fwhole-file */
-  OPT_fwhole_program = 1016,                 /* -fwhole-program */
-  OPT_fwide_exec_charset_ = 1017,            /* -fwide-exec-charset= */
-  OPT_fworking_directory = 1018,             /* -fworking-directory */
-  OPT_fwpa = 1019,                           /* -fwpa */
-  OPT_fwpa_ = 1020,                          /* -fwpa= */
-  OPT_fwrapv = 1021,                         /* -fwrapv */
-  /* OPT_fxref = 1022, */                    /* -fxref */
-  /* OPT_fzee = 1023, */                     /* -fzee */
-  OPT_fzero_initialized_in_bss = 1024,       /* -fzero-initialized-in-bss */
-  OPT_fzero_link = 1025,                     /* -fzero-link */
-  OPT_g = 1026,                              /* -g */
-  OPT_gant = 1027,                           /* -gant */
-  OPT_gcoff = 1028,                          /* -gcoff */
-  OPT_gdwarf = 1029,                         /* -gdwarf */
-  OPT_gdwarf_ = 1030,                        /* -gdwarf- */
-  OPT_gen_decls = 1031,                      /* -gen-decls */
-  OPT_ggdb = 1032,                           /* -ggdb */
-  OPT_ggnu_pubnames = 1033,                  /* -ggnu-pubnames */
-  OPT_gnat = 1034,                           /* -gnat */
-  OPT_gnatO = 1035,                          /* -gnatO */
-  OPT_gno_pubnames = 1036,                   /* -gno-pubnames */
-  OPT_gno_record_gcc_switches = 1037,        /* -gno-record-gcc-switches */
-  OPT_gno_split_dwarf = 1038,                /* -gno-split-dwarf */
-  OPT_gno_strict_dwarf = 1039,               /* -gno-strict-dwarf */
-  OPT_gpubnames = 1040,                      /* -gpubnames */
-  OPT_grecord_gcc_switches = 1041,           /* -grecord-gcc-switches */
-  OPT_gsplit_dwarf = 1042,                   /* -gsplit-dwarf */
-  OPT_gstabs = 1043,                         /* -gstabs */
-  OPT_gstabs_ = 1044,                        /* -gstabs+ */
-  OPT_gstrict_dwarf = 1045,                  /* -gstrict-dwarf */
-  OPT_gtoggle = 1046,                        /* -gtoggle */
-  OPT_gvms = 1047,                           /* -gvms */
-  OPT_gxcoff = 1048,                         /* -gxcoff */
-  OPT_gxcoff_ = 1049,                        /* -gxcoff+ */
-  OPT_h = 1050,                              /* -h */
-  OPT_idirafter = 1051,                      /* -idirafter */
-  OPT_imacros = 1052,                        /* -imacros */
-  OPT_imultiarch = 1053,                     /* -imultiarch */
-  OPT_imultilib = 1054,                      /* -imultilib */
-  OPT_include = 1055,                        /* -include */
-  OPT_iplugindir_ = 1056,                    /* -iplugindir= */
-  OPT_iprefix = 1057,                        /* -iprefix */
-  OPT_iquote = 1058,                         /* -iquote */
-  OPT_isysroot = 1059,                       /* -isysroot */
-  OPT_isystem = 1060,                        /* -isystem */
-  OPT_iwithprefix = 1061,                    /* -iwithprefix */
-  OPT_iwithprefixbefore = 1062,              /* -iwithprefixbefore */
-  OPT_k8 = 1063,                             /* -k8 */
-  OPT_l = 1064,                              /* -l */
-  OPT_lang_asm = 1065,                       /* -lang-asm */
-  OPT_mabi_ = 1066,                          /* -mabi= */
-  OPT_mabort_on_noreturn = 1067,             /* -mabort-on-noreturn */
-  OPT_mandroid = 1068,                       /* -mandroid */
-  OPT_mapcs = 1069,                          /* -mapcs */
-  OPT_mapcs_float = 1070,                    /* -mapcs-float */
-  OPT_mapcs_frame = 1071,                    /* -mapcs-frame */
-  OPT_mapcs_reentrant = 1072,                /* -mapcs-reentrant */
-  OPT_mapcs_stack_check = 1073,              /* -mapcs-stack-check */
-  OPT_march_ = 1074,                         /* -march= */
-  OPT_marm = 1075,                           /* -marm */
-  OPT_mbig_endian = 1076,                    /* -mbig-endian */
-  OPT_mbionic = 1077,                        /* -mbionic */
-  OPT_mcallee_super_interworking = 1078,     /* -mcallee-super-interworking */
-  OPT_mcaller_super_interworking = 1079,     /* -mcaller-super-interworking */
-  OPT_mcpu_ = 1080,                          /* -mcpu= */
-  OPT_mfix_cortex_m3_ldrd = 1081,            /* -mfix-cortex-m3-ldrd */
-  OPT_mfloat_abi_ = 1082,                    /* -mfloat-abi= */
-  OPT_mfp16_format_ = 1083,                  /* -mfp16-format= */
-  OPT_mfpu_ = 1084,                          /* -mfpu= */
-  OPT_mglibc = 1085,                         /* -mglibc */
-  /* OPT_mhard_float = 1086, */              /* -mhard-float */
-  OPT_mlittle_endian = 1087,                 /* -mlittle-endian */
-  OPT_mlong_calls = 1088,                    /* -mlong-calls */
-  OPT_mlra = 1089,                           /* -mlra */
-  OPT_mmusl = 1090,                          /* -mmusl */
-  OPT_mneon_for_64bits = 1091,               /* -mneon-for-64bits */
-  OPT_mnew_generic_costs = 1092,             /* -mnew-generic-costs */
-  OPT_mold_rtx_costs = 1093,                 /* -mold-rtx-costs */
-  OPT_mpic_data_is_text_relative = 1094,     /* -mpic-data-is-text-relative */
-  OPT_mpic_register_ = 1095,                 /* -mpic-register= */
-  OPT_mpoke_function_name = 1096,            /* -mpoke-function-name */
-  OPT_mrestrict_it = 1097,                   /* -mrestrict-it */
-  OPT_msched_prolog = 1098,                  /* -msched-prolog */
-  OPT_msingle_pic_base = 1099,               /* -msingle-pic-base */
-  OPT_mslow_flash_data = 1100,               /* -mslow-flash-data */
-  /* OPT_msoft_float = 1101, */              /* -msoft-float */
-  OPT_mstructure_size_boundary_ = 1102,      /* -mstructure-size-boundary= */
-  OPT_mthumb = 1103,                         /* -mthumb */
-  OPT_mthumb_interwork = 1104,               /* -mthumb-interwork */
-  OPT_mtls_dialect_ = 1105,                  /* -mtls-dialect= */
-  OPT_mtp_ = 1106,                           /* -mtp= */
-  OPT_mtpcs_frame = 1107,                    /* -mtpcs-frame */
-  OPT_mtpcs_leaf_frame = 1108,               /* -mtpcs-leaf-frame */
-  OPT_mtune_ = 1109,                         /* -mtune= */
-  OPT_muclibc = 1110,                        /* -muclibc */
-  OPT_munaligned_access = 1111,              /* -munaligned-access */
-  OPT_mvectorize_with_neon_double = 1112,    /* -mvectorize-with-neon-double */
-  OPT_mvectorize_with_neon_quad = 1113,      /* -mvectorize-with-neon-quad */
-  OPT_mword_relocations = 1114,              /* -mword-relocations */
-  OPT_mwords_little_endian = 1115,           /* -mwords-little-endian */
-  OPT_n = 1116,                              /* -n */
-  OPT_no_canonical_prefixes = 1117,          /* -no-canonical-prefixes */
-  OPT_no_integrated_cpp = 1118,              /* -no-integrated-cpp */
-  OPT_nocpp = 1119,                          /* -nocpp */
-  OPT_nodefaultlibs = 1120,                  /* -nodefaultlibs */
-  OPT_nostartfiles = 1121,                   /* -nostartfiles */
-  OPT_nostdinc = 1122,                       /* -nostdinc */
-  OPT_nostdinc__ = 1123,                     /* -nostdinc++ */
-  OPT_nostdlib = 1124,                       /* -nostdlib */
-  OPT_o = 1125,                              /* -o */
-  OPT_p = 1126,                              /* -p */
-  OPT_pass_exit_codes = 1127,                /* -pass-exit-codes */
-  /* OPT_pedantic = 1128, */                 /* -pedantic */
-  OPT_pedantic_errors = 1129,                /* -pedantic-errors */
-  OPT_pg = 1130,                             /* -pg */
-  OPT_pie = 1131,                            /* -pie */
-  OPT_pipe = 1132,                           /* -pipe */
-  OPT_posix = 1133,                          /* -posix */
-  OPT_print_file_name_ = 1134,               /* -print-file-name= */
-  OPT_print_libgcc_file_name = 1135,         /* -print-libgcc-file-name */
-  OPT_print_multi_directory = 1136,          /* -print-multi-directory */
-  OPT_print_multi_lib = 1137,                /* -print-multi-lib */
-  OPT_print_multi_os_directory = 1138,       /* -print-multi-os-directory */
-  OPT_print_multiarch = 1139,                /* -print-multiarch */
-  OPT_print_objc_runtime_info = 1140,        /* -print-objc-runtime-info */
-  OPT_print_prog_name_ = 1141,               /* -print-prog-name= */
-  OPT_print_search_dirs = 1142,              /* -print-search-dirs */
-  OPT_print_sysroot = 1143,                  /* -print-sysroot */
-  OPT_print_sysroot_headers_suffix = 1144,   /* -print-sysroot-headers-suffix */
-  OPT_profile = 1145,                        /* -profile */
-  OPT_pthread = 1146,                        /* -pthread */
-  OPT_quiet = 1147,                          /* -quiet */
-  OPT_r = 1148,                              /* -r */
-  OPT_rdynamic = 1149,                       /* -rdynamic */
-  OPT_remap = 1150,                          /* -remap */
-  OPT_s = 1151,                              /* -s */
-  OPT_s_bc_abi = 1152,                       /* -s-bc-abi */
-  OPT_save_temps = 1153,                     /* -save-temps */
-  OPT_save_temps_ = 1154,                    /* -save-temps= */
-  OPT_shared = 1155,                         /* -shared */
-  OPT_shared_libgcc = 1156,                  /* -shared-libgcc */
-  /* OPT_specs = 1157, */                    /* -specs */
-  OPT_specs_ = 1158,                         /* -specs= */
-  OPT_static = 1159,                         /* -static */
-  OPT_static_libasan = 1160,                 /* -static-libasan */
-  OPT_static_libgcc = 1161,                  /* -static-libgcc */
-  OPT_static_libgcj = 1162,                  /* -static-libgcj */
-  OPT_static_libgfortran = 1163,             /* -static-libgfortran */
-  OPT_static_libgo = 1164,                   /* -static-libgo */
-  OPT_static_liblsan = 1165,                 /* -static-liblsan */
-  OPT_static_libstdc__ = 1166,               /* -static-libstdc++ */
-  OPT_static_libtsan = 1167,                 /* -static-libtsan */
-  OPT_static_libubsan = 1168,                /* -static-libubsan */
-  /* OPT_std_c__03 = 1169, */                /* -std=c++03 */
-  /* OPT_std_c__0x = 1170, */                /* -std=c++0x */
-  OPT_std_c__11 = 1171,                      /* -std=c++11 */
-  /* OPT_std_c__14 = 1172, */                /* -std=c++14 */
-  OPT_std_c__1y = 1173,                      /* -std=c++1y */
-  OPT_std_c__98 = 1174,                      /* -std=c++98 */
-  OPT_std_c11 = 1175,                        /* -std=c11 */
-  /* OPT_std_c1x = 1176, */                  /* -std=c1x */
-  /* OPT_std_c89 = 1177, */                  /* -std=c89 */
-  OPT_std_c90 = 1178,                        /* -std=c90 */
-  OPT_std_c99 = 1179,                        /* -std=c99 */
-  /* OPT_std_c9x = 1180, */                  /* -std=c9x */
-  OPT_std_f2003 = 1181,                      /* -std=f2003 */
-  OPT_std_f2008 = 1182,                      /* -std=f2008 */
-  OPT_std_f2008ts = 1183,                    /* -std=f2008ts */
-  OPT_std_f95 = 1184,                        /* -std=f95 */
-  OPT_std_gnu = 1185,                        /* -std=gnu */
-  /* OPT_std_gnu__03 = 1186, */              /* -std=gnu++03 */
-  /* OPT_std_gnu__0x = 1187, */              /* -std=gnu++0x */
-  OPT_std_gnu__11 = 1188,                    /* -std=gnu++11 */
-  /* OPT_std_gnu__14 = 1189, */              /* -std=gnu++14 */
-  OPT_std_gnu__1y = 1190,                    /* -std=gnu++1y */
-  OPT_std_gnu__98 = 1191,                    /* -std=gnu++98 */
-  OPT_std_gnu11 = 1192,                      /* -std=gnu11 */
-  /* OPT_std_gnu1x = 1193, */                /* -std=gnu1x */
-  /* OPT_std_gnu89 = 1194, */                /* -std=gnu89 */
-  OPT_std_gnu90 = 1195,                      /* -std=gnu90 */
-  OPT_std_gnu99 = 1196,                      /* -std=gnu99 */
-  /* OPT_std_gnu9x = 1197, */                /* -std=gnu9x */
-  /* OPT_std_iso9899_1990 = 1198, */         /* -std=iso9899:1990 */
-  OPT_std_iso9899_199409 = 1199,             /* -std=iso9899:199409 */
-  /* OPT_std_iso9899_1999 = 1200, */         /* -std=iso9899:1999 */
-  /* OPT_std_iso9899_199x = 1201, */         /* -std=iso9899:199x */
-  /* OPT_std_iso9899_2011 = 1202, */         /* -std=iso9899:2011 */
-  OPT_std_legacy = 1203,                     /* -std=legacy */
-  OPT_symbolic = 1204,                       /* -symbolic */
-  OPT_t = 1205,                              /* -t */
-  OPT_time = 1206,                           /* -time */
-  OPT_time_ = 1207,                          /* -time= */
-  OPT_tno_android_cc = 1208,                 /* -tno-android-cc */
-  OPT_tno_android_ld = 1209,                 /* -tno-android-ld */
-  OPT_traditional = 1210,                    /* -traditional */
-  OPT_traditional_cpp = 1211,                /* -traditional-cpp */
-  OPT_trigraphs = 1212,                      /* -trigraphs */
-  OPT_u = 1213,                              /* -u */
-  OPT_undef = 1214,                          /* -undef */
-  OPT_v = 1215,                              /* -v */
-  OPT_version = 1216,                        /* -version */
-  OPT_w = 1217,                              /* -w */
-  OPT_wrapper = 1218,                        /* -wrapper */
-  OPT_x = 1219,                              /* -x */
-  OPT_z = 1220,                              /* -z */
-  N_OPTS,
-  OPT_SPECIAL_unknown,
-  OPT_SPECIAL_ignore,
-  OPT_SPECIAL_program_name,
-  OPT_SPECIAL_input_file
-};
-
-#endif /* OPTIONS_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/opts.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/opts.h
deleted file mode 100644
index f694082..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/opts.h
+++ /dev/null
@@ -1,404 +0,0 @@
-/* Command line option handling.
-   Copyright (C) 2002-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_OPTS_H
-#define GCC_OPTS_H
-
-#include "input.h"
-#include "vec.h"
-#include "obstack.h"
-
-/* Specifies how a switch's VAR_VALUE relates to its FLAG_VAR.  */
-enum cl_var_type {
-  /* The switch is enabled when FLAG_VAR is nonzero.  */
-  CLVC_BOOLEAN,
-
-  /* The switch is enabled when FLAG_VAR == VAR_VALUE.  */
-  CLVC_EQUAL,
-
-  /* The switch is enabled when VAR_VALUE is not set in FLAG_VAR.  */
-  CLVC_BIT_CLEAR,
-
-  /* The switch is enabled when VAR_VALUE is set in FLAG_VAR.  */
-  CLVC_BIT_SET,
-
-  /* The switch takes a string argument and FLAG_VAR points to that
-     argument.  */
-  CLVC_STRING,
-
-  /* The switch takes an enumerated argument (VAR_ENUM says what
-     enumeration) and FLAG_VAR points to that argument.  */
-  CLVC_ENUM,
-
-  /* The switch should be stored in the VEC pointed to by FLAG_VAR for
-     later processing.  */
-  CLVC_DEFER
-};
-
-struct cl_option
-{
-  /* Text of the option, including initial '-'.  */
-  const char *opt_text;
-  /* Help text for --help, or NULL.  */
-  const char *help;
-  /* Error message for missing argument, or NULL.  */
-  const char *missing_argument_error;
-  /* Warning to give when this option is used, or NULL.  */
-  const char *warn_message;
-  /* Argument of alias target when positive option given, or NULL.  */
-  const char *alias_arg;
-  /* Argument of alias target when negative option given, or NULL.  */
-  const char *neg_alias_arg;
-  /* Alias target, or N_OPTS if not an alias.  */
-  unsigned short alias_target;
-  /* Previous option that is an initial substring of this one, or
-     N_OPTS if none.  */
-  unsigned short back_chain;
-  /* Option length, not including initial '-'.  */
-  unsigned char opt_len;
-  /* Next option in a sequence marked with Negative, or -1 if none.  */
-  int neg_index;
-  /* CL_* flags for this option.  */
-  unsigned int flags;
-  /* Disabled in this configuration.  */
-  BOOL_BITFIELD cl_disabled : 1;
-  /* Options marked with CL_SEPARATE take a number of separate
-     arguments (1 to 4) that is one more than the number in this
-     bit-field.  */
-  unsigned int cl_separate_nargs : 2;
-  /* Option is an alias when used with separate argument.  */
-  BOOL_BITFIELD cl_separate_alias : 1;
-  /* Alias to negative form of option.  */
-  BOOL_BITFIELD cl_negative_alias : 1;
-  /* Option takes no argument in the driver.  */
-  BOOL_BITFIELD cl_no_driver_arg : 1;
-  /* Reject this option in the driver.  */
-  BOOL_BITFIELD cl_reject_driver : 1;
-  /* Reject no- form.  */
-  BOOL_BITFIELD cl_reject_negative : 1;
-  /* Missing argument OK (joined).  */
-  BOOL_BITFIELD cl_missing_ok : 1;
-  /* Argument is an integer >=0.  */
-  BOOL_BITFIELD cl_uinteger : 1;
-  /* Argument is a HOST_WIDE_INT.  */
-  BOOL_BITFIELD cl_host_wide_int : 1;
-  /* Argument should be converted to lowercase.  */
-  BOOL_BITFIELD cl_tolower : 1;
-  /* Report argument with -fverbose-asm  */
-  BOOL_BITFIELD cl_report : 1;
-  /* Offset of field for this option in struct gcc_options, or
-     (unsigned short) -1 if none.  */
-  unsigned short flag_var_offset;
-  /* Index in cl_enums of enum used for this option's arguments, for
-     CLVC_ENUM options.  */
-  unsigned short var_enum;
-  /* How this option's value is determined and sets a field.  */
-  enum cl_var_type var_type;
-  /* Value or bit-mask with which to set a field.  */
-  HOST_WIDE_INT var_value;
-};
-
-/* Records that the state of an option consists of SIZE bytes starting
-   at DATA.  DATA might point to CH in some cases.  */
-struct cl_option_state {
-  const void *data;
-  size_t size;
-  char ch;
-};
-
-extern const struct cl_option cl_options[];
-extern const unsigned int cl_options_count;
-extern const char *const lang_names[];
-extern const unsigned int cl_lang_count;
-
-#define CL_PARAMS               (1U << 16) /* Fake entry.  Used to display --param info with --help.  */
-#define CL_WARNING		(1U << 17) /* Enables an (optional) warning message.  */
-#define CL_OPTIMIZATION		(1U << 18) /* Enables an (optional) optimization.  */
-#define CL_DRIVER		(1U << 19) /* Driver option.  */
-#define CL_TARGET		(1U << 20) /* Target-specific option.  */
-#define CL_COMMON		(1U << 21) /* Language-independent.  */
-
-#define CL_MIN_OPTION_CLASS	CL_PARAMS
-#define CL_MAX_OPTION_CLASS	CL_COMMON
-
-/* From here on the bits describe attributes of the options.
-   Before this point the bits have described the class of the option.
-   This distinction is important because --help will not list options
-   which only have these higher bits set.  */
-
-#define CL_JOINED		(1U << 22) /* If takes joined argument.  */
-#define CL_SEPARATE		(1U << 23) /* If takes a separate argument.  */
-#define CL_UNDOCUMENTED		(1U << 24) /* Do not output with --help.  */
-#define CL_NO_DWARF_RECORD	(1U << 25) /* Do not add to producer string.  */
-#define CL_PCH_IGNORE		(1U << 26) /* Do compare state for pch.  */
-
-/* Flags for an enumerated option argument.  */
-#define CL_ENUM_CANONICAL	(1 << 0) /* Canonical for this value.  */
-#define CL_ENUM_DRIVER_ONLY	(1 << 1) /* Only accepted in the driver.  */
-
-/* Structure describing an enumerated option argument.  */
-
-struct cl_enum_arg
-{
-  /* The argument text, or NULL at the end of the array.  */
-  const char *arg;
-
-  /* The corresponding integer value.  */
-  int value;
-
-  /* Flags associated with this argument.  */
-  unsigned int flags;
-};
-
-/* Structure describing an enumerated set of option arguments.  */
-
-struct cl_enum
-{
-  /* Help text, or NULL if the values should not be listed in --help
-     output.  */
-  const char *help;
-
-  /* Error message for unknown arguments, or NULL to use a generic
-     error.  */
-  const char *unknown_error;
-
-  /* Array of possible values.  */
-  const struct cl_enum_arg *values;
-
-  /* The size of the type used to store a value.  */
-  size_t var_size;
-
-  /* Function to set a variable of this type.  */
-  void (*set) (void *var, int value);
-
-  /* Function to get the value of a variable of this type.  */
-  int (*get) (const void *var);
-};
-
-extern const struct cl_enum cl_enums[];
-extern const unsigned int cl_enums_count;
-
-/* Possible ways in which a command-line option may be erroneous.
-   These do not include not being known at all; an option index of
-   OPT_SPECIAL_unknown is used for that.  */
-
-#define CL_ERR_DISABLED		(1 << 0) /* Disabled in this configuration.  */
-#define CL_ERR_MISSING_ARG	(1 << 1) /* Argument required but missing.  */
-#define CL_ERR_WRONG_LANG	(1 << 2) /* Option for wrong language.  */
-#define CL_ERR_UINT_ARG		(1 << 3) /* Bad unsigned integer argument.  */
-#define CL_ERR_ENUM_ARG		(1 << 4) /* Bad enumerated argument.  */
-#define CL_ERR_NEGATIVE		(1 << 5) /* Negative form of option
-					    not permitted (together
-					    with OPT_SPECIAL_unknown).  */
-
-/* Structure describing the result of decoding an option.  */
-
-struct cl_decoded_option
-{
-  /* The index of this option, or an OPT_SPECIAL_* value for
-     non-options and unknown options.  */
-  size_t opt_index;
-
-  /* Any warning to give for use of this option, or NULL if none.  */
-  const char *warn_message;
-
-  /* The string argument, or NULL if none.  For OPT_SPECIAL_* cases,
-     the option or non-option command-line argument.  */
-  const char *arg;
-
-  /* The original text of option plus arguments, with separate argv
-     elements concatenated into one string with spaces separating
-     them.  This is for such uses as diagnostics and
-     -frecord-gcc-switches.  */
-  const char *orig_option_with_args_text;
-
-  /* The canonical form of the option and its argument, for when it is
-     necessary to reconstruct argv elements (in particular, for
-     processing specs and passing options to subprocesses from the
-     driver).  */
-  const char *canonical_option[4];
-
-  /* The number of elements in the canonical form of the option and
-     arguments; always at least 1.  */
-  size_t canonical_option_num_elements;
-
-  /* For a boolean option, 1 for the true case and 0 for the "no-"
-     case.  For an unsigned integer option, the value of the
-     argument.  1 in all other cases.  */
-  int value;
-
-  /* Any flags describing errors detected in this option.  */
-  int errors;
-};
-
-/* Structure describing an option deferred for handling after the main
-   option handlers.  */
-
-struct cl_deferred_option
-{
-  /* Elements from struct cl_decoded_option used for deferred
-     options.  */
-  size_t opt_index;
-  const char *arg;
-  int value;
-};
-
-/* Structure describing a single option-handling callback.  */
-
-struct cl_option_handler_func
-{
-  /* The function called to handle the option.  */
-  bool (*handler) (struct gcc_options *opts,
-		   struct gcc_options *opts_set,
-		   const struct cl_decoded_option *decoded,
-		   unsigned int lang_mask, int kind, location_t loc,
-		   const struct cl_option_handlers *handlers,
-		   diagnostic_context *dc);
-
-  /* The mask that must have some bit in common with the flags for the
-     option for this particular handler to be used.  */
-  unsigned int mask;
-};
-
-/* Structure describing the callbacks used in handling options.  */
-
-struct cl_option_handlers
-{
-  /* Callback for an unknown option to determine whether to give an
-     error for it, and possibly store information to diagnose the
-     option at a later point.  Return true if an error should be
-     given, false otherwise.  */
-  bool (*unknown_option_callback) (const struct cl_decoded_option *decoded);
-
-  /* Callback to handle, and possibly diagnose, an option for another
-     language.  */
-  void (*wrong_lang_callback) (const struct cl_decoded_option *decoded,
-			       unsigned int lang_mask);
-
-  /* The number of individual handlers.  */
-  size_t num_handlers;
-
-  /* The handlers themselves.  */
-  struct cl_option_handler_func handlers[3];
-};
-
-/* Input file names.  */
-
-extern const char **in_fnames;
-
-/* The count of input filenames.  */
-
-extern unsigned num_in_fnames;
-
-extern char *opts_concat (const char *first, ...);
-
-/* Obstack for option strings.  */
-
-extern struct obstack opts_obstack;
-
-size_t find_opt (const char *input, unsigned int lang_mask);
-extern int integral_argument (const char *arg);
-extern bool enum_value_to_arg (const struct cl_enum_arg *enum_args,
-			       const char **argp, int value,
-			       unsigned int lang_mask);
-extern void decode_cmdline_options_to_array (unsigned int argc,
-					     const char **argv, 
-					     unsigned int lang_mask,
-					     struct cl_decoded_option **decoded_options,
-					     unsigned int *decoded_options_count);
-extern void init_options_once (void);
-extern void init_options_struct (struct gcc_options *opts,
-				 struct gcc_options *opts_set);
-extern void decode_cmdline_options_to_array_default_mask (unsigned int argc,
-							  const char **argv, 
-							  struct cl_decoded_option **decoded_options,
-							  unsigned int *decoded_options_count);
-extern void set_default_handlers (struct cl_option_handlers *handlers);
-extern void decode_options (struct gcc_options *opts,
-			    struct gcc_options *opts_set,
-			    struct cl_decoded_option *decoded_options,
-			    unsigned int decoded_options_count,
-			    location_t loc,
-			    diagnostic_context *dc);
-extern int option_enabled (int opt_idx, void *opts);
-extern bool get_option_state (struct gcc_options *, int,
-			      struct cl_option_state *);
-extern void set_option (struct gcc_options *opts,
-			struct gcc_options *opts_set,
-			int opt_index, int value, const char *arg, int kind,
-			location_t loc, diagnostic_context *dc);
-extern void *option_flag_var (int opt_index, struct gcc_options *opts);
-bool handle_generated_option (struct gcc_options *opts,
-			      struct gcc_options *opts_set,
-			      size_t opt_index, const char *arg, int value,
-			      unsigned int lang_mask, int kind, location_t loc,
-			      const struct cl_option_handlers *handlers,
-			      diagnostic_context *dc);
-void generate_option (size_t opt_index, const char *arg, int value,
-		      unsigned int lang_mask,
-		      struct cl_decoded_option *decoded);
-void generate_option_input_file (const char *file,
-				 struct cl_decoded_option *decoded);
-extern void read_cmdline_option (struct gcc_options *opts,
-				 struct gcc_options *opts_set,
-				 struct cl_decoded_option *decoded,
-				 location_t loc,
-				 unsigned int lang_mask,
-				 const struct cl_option_handlers *handlers,
-				 diagnostic_context *dc);
-extern void control_warning_option (unsigned int opt_index, int kind,
-				    bool imply, location_t loc,
-				    unsigned int lang_mask,
-				    const struct cl_option_handlers *handlers,
-				    struct gcc_options *opts,
-				    struct gcc_options *opts_set,
-				    diagnostic_context *dc);
-extern void print_ignored_options (void);
-extern void handle_common_deferred_options (void);
-extern bool common_handle_option (struct gcc_options *opts,
-				  struct gcc_options *opts_set,
-				  const struct cl_decoded_option *decoded,
-				  unsigned int lang_mask, int kind,
-				  location_t loc,
-				  const struct cl_option_handlers *handlers,
-				  diagnostic_context *dc);
-extern bool target_handle_option (struct gcc_options *opts,
-				  struct gcc_options *opts_set,
-				  const struct cl_decoded_option *decoded,
-				  unsigned int lang_mask, int kind,
-				  location_t loc,
-				  const struct cl_option_handlers *handlers,
-				  diagnostic_context *dc);
-extern void finish_options (struct gcc_options *opts,
-			    struct gcc_options *opts_set,
-			    location_t loc);
-extern void default_options_optimization (struct gcc_options *opts,
-					  struct gcc_options *opts_set,
-					  struct cl_decoded_option *decoded_options,
-					  unsigned int decoded_options_count,
-					  location_t loc,
-					  unsigned int lang_mask,
-					  const struct cl_option_handlers *handlers,
-					  diagnostic_context *dc);
-extern void set_struct_debug_option (struct gcc_options *opts,
-				     location_t loc,
-				     const char *value);
-extern bool opt_enum_arg_to_value (size_t opt_index, const char *arg,
-				   int *value, unsigned int lang_mask);
-#endif
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/output.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/output.h
deleted file mode 100644
index 2b32601..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/output.h
+++ /dev/null
@@ -1,608 +0,0 @@
-/* Declarations for insn-output.c and other code to write to asm_out_file.
-   These functions are defined in final.c, and varasm.c.
-   Copyright (C) 1987-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_OUTPUT_H
-#define GCC_OUTPUT_H
-
-/* Initialize data in final at the beginning of a compilation.  */
-extern void init_final (const char *);
-
-/* Enable APP processing of subsequent output.
-   Used before the output from an `asm' statement.  */
-extern void app_enable (void);
-
-/* Disable APP processing of subsequent output.
-   Called from varasm.c before most kinds of output.  */
-extern void app_disable (void);
-
-/* Return the number of slots filled in the current
-   delayed branch sequence (we don't count the insn needing the
-   delay slot).   Zero if not in a delayed branch sequence.  */
-extern int dbr_sequence_length (void);
-
-/* Indicate that branch shortening hasn't yet been done.  */
-extern void init_insn_lengths (void);
-
-/* Obtain the current length of an insn.  If branch shortening has been done,
-   get its actual length.  Otherwise, get its maximum length.  */
-extern int get_attr_length (rtx);
-
-/* Obtain the current length of an insn.  If branch shortening has been done,
-   get its actual length.  Otherwise, get its minimum length.  */
-extern int get_attr_min_length (rtx);
-
-/* Make a pass over all insns and compute their actual lengths by shortening
-   any branches of variable length if possible.  */
-extern void shorten_branches (rtx);
-
-/* Output assembler code for the start of a function,
-   and initialize some of the variables in this file
-   for the new function.  The label for the function and associated
-   assembler pseudo-ops have already been output in
-   `assemble_start_function'.  */
-extern void final_start_function (rtx, FILE *, int);
-
-/* Output assembler code for the end of a function.
-   For clarity, args are same as those of `final_start_function'
-   even though not all of them are needed.  */
-extern void final_end_function (void);
-
-/* Output assembler code for some insns: all or part of a function.  */
-extern void final (rtx, FILE *, int);
-
-/* The final scan for one insn, INSN.  Args are same as in `final', except
-   that INSN is the insn being scanned.  Value returned is the next insn to
-   be scanned.  */
-extern rtx final_scan_insn (rtx, FILE *, int, int, int *);
-
-/* Replace a SUBREG with a REG or a MEM, based on the thing it is a
-   subreg of.  */
-extern rtx alter_subreg (rtx *, bool);
-
-/* Print an operand using machine-dependent assembler syntax.  */
-extern void output_operand (rtx, int);
-
-/* Report inconsistency between the assembler template and the operands.
-   In an `asm', it's the user's fault; otherwise, the compiler's fault.  */
-extern void output_operand_lossage (const char *, ...) ATTRIBUTE_PRINTF_1;
-
-/* Output a string of assembler code, substituting insn operands.
-   Defined in final.c.  */
-extern void output_asm_insn (const char *, rtx *);
-
-/* Compute a worst-case reference address of a branch so that it
-   can be safely used in the presence of aligned labels.
-   Defined in final.c.  */
-extern int insn_current_reference_address (rtx);
-
-/* Find the alignment associated with a CODE_LABEL.
-   Defined in final.c.  */
-extern int label_to_alignment (rtx);
-
-/* Find the alignment maximum skip associated with a CODE_LABEL.
-   Defined in final.c.  */
-extern int label_to_max_skip (rtx);
-
-/* Output a LABEL_REF, or a bare CODE_LABEL, as an assembler symbol.  */
-extern void output_asm_label (rtx);
-
-/* Marks SYMBOL_REFs in x as referenced through use of assemble_external.  */
-extern void mark_symbol_refs_as_used (rtx);
-
-/* Print a memory reference operand for address X
-   using machine-dependent assembler syntax.  */
-extern void output_address (rtx);
-
-/* Print an integer constant expression in assembler syntax.
-   Addition and subtraction are the only arithmetic
-   that may appear in these expressions.  */
-extern void output_addr_const (FILE *, rtx);
-
-/* Output a string of assembler code, substituting numbers, strings
-   and fixed syntactic prefixes.  */
-#if GCC_VERSION >= 3004
-#define ATTRIBUTE_ASM_FPRINTF(m, n) __attribute__ ((__format__ (__asm_fprintf__, m, n))) ATTRIBUTE_NONNULL(m)
-#else
-#define ATTRIBUTE_ASM_FPRINTF(m, n) ATTRIBUTE_NONNULL(m)
-#endif
-
-extern void fprint_whex (FILE *, unsigned HOST_WIDE_INT);
-extern void fprint_ul (FILE *, unsigned long);
-extern int sprint_ul (char *, unsigned long);
-
-extern void asm_fprintf (FILE *file, const char *p, ...)
-     ATTRIBUTE_ASM_FPRINTF(2, 3);
-
-/* Return nonzero if this function has no function calls.  */
-extern int leaf_function_p (void);
-
-/* Return 1 if branch is a forward branch.
-   Uses insn_shuid array, so it works only in the final pass.  May be used by
-   output templates to add branch prediction hints, for example.  */
-extern int final_forward_branch_p (rtx);
-
-/* Return 1 if this function uses only the registers that can be
-   safely renumbered.  */
-extern int only_leaf_regs_used (void);
-
-/* Scan IN_RTX and its subexpressions, and renumber all regs into those
-   available in leaf functions.  */
-extern void leaf_renumber_regs_insn (rtx);
-
-/* Locate the proper template for the given insn-code.  */
-extern const char *get_insn_template (int, rtx);
-
-/* Functions in varasm.c.  */
-
-/* Emit any pending weak declarations.  */
-extern void weak_finish (void);
-
-/* Decode an `asm' spec for a declaration as a register name.
-   Return the register number, or -1 if nothing specified,
-   or -2 if the ASMSPEC is not `cc' or `memory' and is not recognized,
-   or -3 if ASMSPEC is `cc' and is not recognized,
-   or -4 if ASMSPEC is `memory' and is not recognized.
-   Accept an exact spelling or a decimal number.
-   Prefixes such as % are optional.  */
-extern int decode_reg_name (const char *);
-
-/* Similar to decode_reg_name, but takes an extra parameter that is a
-   pointer to the number of (internal) registers described by the
-   external name.  */
-extern int decode_reg_name_and_count (const char *, int *);
-
-extern void do_assemble_alias (tree, tree);
-
-extern void default_assemble_visibility (tree, int);
-
-/* Output a string of literal assembler code
-   for an `asm' keyword used between functions.  */
-extern void assemble_asm (tree);
-
-/* Output assembler code for the constant pool of a function and associated
-   with defining the name of the function.  DECL describes the function.
-   NAME is the function's name.  For the constant pool, we use the current
-   constant pool data.  */
-extern void assemble_start_function (tree, const char *);
-
-/* Output assembler code associated with defining the size of the
-   function.  DECL describes the function.  NAME is the function's name.  */
-extern void assemble_end_function (tree, const char *);
-
-/* Assemble everything that is needed for a variable or function declaration.
-   Not used for automatic variables, and not used for function definitions.
-   Should not be called for variables of incomplete structure type.
-
-   TOP_LEVEL is nonzero if this variable has file scope.
-   AT_END is nonzero if this is the special handling, at end of compilation,
-   to define things that have had only tentative definitions.
-   DONT_OUTPUT_DATA if nonzero means don't actually output the
-   initial value (that will be done by the caller).  */
-extern void assemble_variable (tree, int, int, int);
-
-/* Put the vtable verification constructor initialization function
-   into the preinit array.  */
-extern void assemble_vtv_preinit_initializer (tree);
-
-/* Compute the alignment of variable specified by DECL.
-   DONT_OUTPUT_DATA is from assemble_variable.  */
-extern void align_variable (tree decl, bool dont_output_data);
-
-/* Queue for outputting something to declare an external symbol to the
-   assembler.  (Most assemblers don't need this, so we normally output
-   nothing.)  Do nothing if DECL is not external.  */
-extern void assemble_external (tree);
-
-/* Assemble code to leave SIZE bytes of zeros.  */
-extern void assemble_zeros (unsigned HOST_WIDE_INT);
-
-/* Assemble an alignment pseudo op for an ALIGN-bit boundary.  */
-extern void assemble_align (int);
-
-/* Assemble a string constant with the specified C string as contents.  */
-extern void assemble_string (const char *, int);
-
-/* Similar, for calling a library function FUN.  */
-extern void assemble_external_libcall (rtx);
-
-/* Assemble a label named NAME.  */
-extern void assemble_label (FILE *, const char *);
-
-/* Output to FILE (an assembly file) a reference to NAME.  If NAME
-   starts with a *, the rest of NAME is output verbatim.  Otherwise
-   NAME is transformed in a target-specific way (usually by the
-   addition of an underscore).  */
-extern void assemble_name_raw (FILE *, const char *);
-
-/* Like assemble_name_raw, but should be used when NAME might refer to
-   an entity that is also represented as a tree (like a function or
-   variable).  If NAME does refer to such an entity, that entity will
-   be marked as referenced.  */
-extern void assemble_name (FILE *, const char *);
-
-/* Return the assembler directive for creating a given kind of integer
-   object.  SIZE is the number of bytes in the object and ALIGNED_P
-   indicates whether it is known to be aligned.  Return NULL if the
-   assembly dialect has no such directive.
-
-   The returned string should be printed at the start of a new line and
-   be followed immediately by the object's initial value.  */
-extern const char *integer_asm_op (int, int);
-
-/* Use directive OP to assemble an integer object X.  Print OP at the
-   start of the line, followed immediately by the value of X.  */
-extern void assemble_integer_with_op (const char *, rtx);
-
-/* The default implementation of the asm_out.integer target hook.  */
-extern bool default_assemble_integer (rtx, unsigned int, int);
-
-/* Assemble the integer constant X into an object of SIZE bytes.  ALIGN is
-   the alignment of the integer in bits.  Return 1 if we were able to output
-   the constant, otherwise 0.  If FORCE is nonzero the constant must
-   be outputable. */
-extern bool assemble_integer (rtx, unsigned, unsigned, int);
-
-/* Return section for TEXT_SECITON_NAME if DECL or DECL_SECTION_NAME (DECL)
-   is NULL.  */
-extern section *get_named_text_section (tree, const char *, const char *);
-
-/* An interface to assemble_integer for the common case in which a value is
-   fully aligned and must be printed.  VALUE is the value of the integer
-   object and SIZE is the number of bytes it contains.  */
-#define assemble_aligned_integer(SIZE, VALUE) \
-  assemble_integer (VALUE, SIZE, (SIZE) * BITS_PER_UNIT, 1)
-
-#ifdef REAL_VALUE_TYPE_SIZE
-/* Assemble the floating-point constant D into an object of size MODE.  */
-extern void assemble_real (REAL_VALUE_TYPE, enum machine_mode, unsigned);
-#endif
-
-/* Write the address of the entity given by SYMBOL to SEC.  */
-extern void assemble_addr_to_section (rtx, section *);
-
-/* Return the size of the constant pool.  */
-extern int get_pool_size (void);
-
-#ifdef HAVE_peephole
-extern rtx peephole (rtx);
-#endif
-
-extern void output_shared_constant_pool (void);
-
-extern void output_object_blocks (void);
-
-extern void output_quoted_string (FILE *, const char *);
-
-/* When outputting delayed branch sequences, this rtx holds the
-   sequence being output.  It is null when no delayed branch
-   sequence is being output, so it can be used as a test in the
-   insn output code.
-
-   This variable is defined  in final.c.  */
-extern rtx final_sequence;
-
-/* The line number of the beginning of the current function.  Various
-   md code needs this so that it can output relative linenumbers.  */
-
-#ifdef SDB_DEBUGGING_INFO /* Avoid undef sym in certain broken linkers.  */
-extern int sdb_begin_function_line;
-#endif
-
-/* File in which assembler code is being written.  */
-
-#ifdef BUFSIZ
-extern FILE *asm_out_file;
-#endif
-
-/* The first global object in the file.  */
-extern const char *first_global_object_name;
-
-/* The first weak object in the file.  */
-extern const char *weak_global_object_name;
-
-/* Nonnull if the insn currently being emitted was a COND_EXEC pattern.  */
-extern rtx current_insn_predicate;
-
-/* Last insn processed by final_scan_insn.  */
-extern rtx current_output_insn;
-
-/* Nonzero while outputting an `asm' with operands.
-   This means that inconsistencies are the user's fault, so don't die.
-   The precise value is the insn being output, to pass to error_for_asm.  */
-extern rtx this_is_asm_operands;
-
-/* Carry information from ASM_DECLARE_OBJECT_NAME
-   to ASM_FINISH_DECLARE_OBJECT.  */
-extern int size_directive_output;
-extern tree last_assemble_variable_decl;
-
-extern bool first_function_block_is_cold;
-
-/* Decide whether DECL needs to be in a writable section.
-   RELOC is the same as for SELECT_SECTION.  */
-extern bool decl_readonly_section (const_tree, int);
-
-/* This can be used to compute RELOC for the function above, when
-   given a constant expression.  */
-extern int compute_reloc_for_constant (tree);
-
-/* User label prefix in effect for this compilation.  */
-extern const char *user_label_prefix;
-
-/* Default target function prologue and epilogue assembler output.  */
-extern void default_function_pro_epilogue (FILE *, HOST_WIDE_INT);
-
-/* Default target function switched text sections.  */
-extern void default_function_switched_text_sections (FILE *, tree, bool);
-
-/* Default target hook that outputs nothing to a stream.  */
-extern void no_asm_to_stream (FILE *);
-
-/* Flags controlling properties of a section.  */
-#define SECTION_ENTSIZE	 0x000ff	/* entity size in section */
-#define SECTION_CODE	 0x00100	/* contains code */
-#define SECTION_WRITE	 0x00200	/* data is writable */
-#define SECTION_DEBUG	 0x00400	/* contains debug data */
-#define SECTION_LINKONCE 0x00800	/* is linkonce */
-#define SECTION_SMALL	 0x01000	/* contains "small data" */
-#define SECTION_BSS	 0x02000	/* contains zeros only */
-#define SECTION_FORGET	 0x04000	/* forget that we've entered the section */
-#define SECTION_MERGE	 0x08000	/* contains mergeable data */
-#define SECTION_STRINGS  0x10000	/* contains zero terminated strings without
-					   embedded zeros */
-#define SECTION_OVERRIDE 0x20000	/* allow override of default flags */
-#define SECTION_TLS	 0x40000	/* contains thread-local storage */
-#define SECTION_NOTYPE	 0x80000	/* don't output @progbits */
-#define SECTION_DECLARED 0x100000	/* section has been used */
-#define SECTION_STYLE_MASK 0x600000	/* bits used for SECTION_STYLE */
-#define SECTION_COMMON   0x800000	/* contains common data */
-#define SECTION_RELRO	 0x1000000	/* data is readonly after relocation processing */
-#define SECTION_EXCLUDE  0x2000000	/* discarded by the linker */
-#define SECTION_MACH_DEP 0x4000000	/* subsequent bits reserved for target */
-
-/* This SECTION_STYLE is used for unnamed sections that we can switch
-   to using a special assembler directive.  */
-#define SECTION_UNNAMED	 0x000000
-
-/* This SECTION_STYLE is used for named sections that we can switch
-   to using a general section directive.  */
-#define SECTION_NAMED	 0x200000
-
-/* This SECTION_STYLE is used for sections that we cannot switch to at
-   all.  The choice of section is implied by the directive that we use
-   to declare the object.  */
-#define SECTION_NOSWITCH 0x400000
-
-/* A helper function for default_elf_select_section and
-   default_elf_unique_section.  Categorizes the DECL.  */
-
-enum section_category
-{
-  SECCAT_TEXT,
-
-  SECCAT_RODATA,
-  SECCAT_RODATA_MERGE_STR,
-  SECCAT_RODATA_MERGE_STR_INIT,
-  SECCAT_RODATA_MERGE_CONST,
-  SECCAT_SRODATA,
-
-  SECCAT_DATA,
-
-  /* To optimize loading of shared programs, define following subsections
-     of data section:
-	_REL	Contains data that has relocations, so they get grouped
-		together and dynamic linker will visit fewer pages in memory.
-	_RO	Contains data that is otherwise read-only.  This is useful
-		with prelinking as most relocations won't be dynamically
-		linked and thus stay read only.
-	_LOCAL	Marks data containing relocations only to local objects.
-		These relocations will get fully resolved by prelinking.  */
-  SECCAT_DATA_REL,
-  SECCAT_DATA_REL_LOCAL,
-  SECCAT_DATA_REL_RO,
-  SECCAT_DATA_REL_RO_LOCAL,
-
-  SECCAT_SDATA,
-  SECCAT_TDATA,
-
-  SECCAT_BSS,
-  SECCAT_SBSS,
-  SECCAT_TBSS
-};
-
-/* Information that is provided by all instances of the section type.  */
-struct GTY(()) section_common {
-  /* The set of SECTION_* flags that apply to this section.  */
-  unsigned int flags;
-};
-
-/* Information about a SECTION_NAMED section.  */
-struct GTY(()) named_section {
-  struct section_common common;
-
-  /* The name of the section.  */
-  const char *name;
-
-  /* If nonnull, the VAR_DECL or FUNCTION_DECL with which the
-     section is associated.  */
-  tree decl;
-};
-
-/* A callback that writes the assembly code for switching to an unnamed
-   section.  The argument provides callback-specific data.  */
-typedef void (*unnamed_section_callback) (const void *);
-
-/* Information about a SECTION_UNNAMED section.  */
-struct GTY(()) unnamed_section {
-  struct section_common common;
-
-  /* The callback used to switch to the section, and the data that
-     should be passed to the callback.  */
-  unnamed_section_callback GTY ((skip)) callback;
-  const void *GTY ((skip)) data;
-
-  /* The next entry in the chain of unnamed sections.  */
-  section *next;
-};
-
-/* A callback that writes the assembly code for a decl in a
-   SECTION_NOSWITCH section.  DECL is the decl that should be assembled
-   and NAME is the name of its SYMBOL_REF.  SIZE is the size of the decl
-   in bytes and ROUNDED is that size rounded up to the next
-   BIGGEST_ALIGNMENT / BITS_PER_UNIT boundary.
-
-   Return true if the callback used DECL_ALIGN to set the object's
-   alignment.  A false return value implies that we are relying
-   on the rounded size to align the decl.  */
-typedef bool (*noswitch_section_callback) (tree decl, const char *name,
-					   unsigned HOST_WIDE_INT size,
-					   unsigned HOST_WIDE_INT rounded);
-
-/* Information about a SECTION_NOSWITCH section.  */
-struct GTY(()) noswitch_section {
-  struct section_common common;
-
-  /* The callback used to assemble decls in this section.  */
-  noswitch_section_callback GTY ((skip)) callback;
-};
-
-/* Information about a section, which may be named or unnamed.  */
-union GTY ((desc ("SECTION_STYLE (&(%h))"))) section {
-  struct section_common GTY ((skip)) common;
-  struct named_section GTY ((tag ("SECTION_NAMED"))) named;
-  struct unnamed_section GTY ((tag ("SECTION_UNNAMED"))) unnamed;
-  struct noswitch_section GTY ((tag ("SECTION_NOSWITCH"))) noswitch;
-};
-
-/* Return the style of section SECT.  */
-#define SECTION_STYLE(SECT) ((SECT)->common.flags & SECTION_STYLE_MASK)
-
-struct object_block;
-
-/* Special well-known sections.  */
-extern GTY(()) section *text_section;
-extern GTY(()) section *data_section;
-extern GTY(()) section *readonly_data_section;
-extern GTY(()) section *sdata_section;
-extern GTY(()) section *ctors_section;
-extern GTY(()) section *dtors_section;
-extern GTY(()) section *bss_section;
-extern GTY(()) section *sbss_section;
-extern GTY(()) section *exception_section;
-extern GTY(()) section *eh_frame_section;
-extern GTY(()) section *tls_comm_section;
-extern GTY(()) section *comm_section;
-extern GTY(()) section *lcomm_section;
-extern GTY(()) section *bss_noswitch_section;
-
-extern GTY(()) section *in_section;
-extern GTY(()) bool in_cold_section_p;
-
-extern section *get_unnamed_section (unsigned int, void (*) (const void *),
-				     const void *);
-extern section *get_section (const char *, unsigned int, tree);
-extern section *get_named_section (tree, const char *, int);
-extern section *get_variable_section (tree, bool);
-extern void place_block_symbol (rtx);
-extern rtx get_section_anchor (struct object_block *, HOST_WIDE_INT,
-			       enum tls_model);
-extern section *mergeable_constant_section (enum machine_mode,
-					    unsigned HOST_WIDE_INT,
-					    unsigned int);
-extern section *function_section (tree);
-extern section *unlikely_text_section (void);
-extern section *current_function_section (void);
-
-/* Return the numbered .ctors.N (if CONSTRUCTOR_P) or .dtors.N (if
-   not) section for PRIORITY.  */
-extern section *get_cdtor_priority_section (int, bool);
-
-extern bool unlikely_text_section_p (section *);
-extern void switch_to_section (section *);
-extern void output_section_asm_op (const void *);
-
-extern void record_tm_clone_pair (tree, tree);
-extern void finish_tm_clone_pairs (void);
-extern tree get_tm_clone_pair (tree);
-
-extern void default_asm_output_source_filename (FILE *, const char *);
-extern void output_file_directive (FILE *, const char *);
-
-extern unsigned int default_section_type_flags (tree, const char *, int);
-
-extern bool have_global_bss_p (void);
-extern bool bss_initializer_p (const_tree);
-
-extern void default_no_named_section (const char *, unsigned int, tree);
-extern void default_elf_asm_named_section (const char *, unsigned int, tree);
-extern enum section_category categorize_decl_for_section (const_tree, int);
-extern void default_coff_asm_named_section (const char *, unsigned int, tree);
-extern void default_pe_asm_named_section (const char *, unsigned int, tree);
-
-extern void default_named_section_asm_out_destructor (rtx, int);
-extern void default_dtor_section_asm_out_destructor (rtx, int);
-extern void default_named_section_asm_out_constructor (rtx, int);
-extern void default_ctor_section_asm_out_constructor (rtx, int);
-
-extern section *default_select_section (tree, int, unsigned HOST_WIDE_INT);
-extern section *default_elf_select_section (tree, int, unsigned HOST_WIDE_INT);
-extern void default_unique_section (tree, int);
-extern section *default_function_rodata_section (tree);
-extern section *default_no_function_rodata_section (tree);
-extern section *default_clone_table_section (void);
-extern section *default_select_rtx_section (enum machine_mode, rtx,
-					    unsigned HOST_WIDE_INT);
-extern section *default_elf_select_rtx_section (enum machine_mode, rtx,
-						unsigned HOST_WIDE_INT);
-extern void default_encode_section_info (tree, rtx, int);
-extern const char *default_strip_name_encoding (const char *);
-extern void default_asm_output_anchor (rtx);
-extern bool default_use_anchors_for_symbol_p (const_rtx);
-extern bool default_binds_local_p (const_tree);
-extern bool default_binds_local_p_1 (const_tree, int);
-extern void default_globalize_label (FILE *, const char *);
-extern void default_globalize_decl_name (FILE *, tree);
-extern void default_emit_unwind_label (FILE *, tree, int, int);
-extern void default_emit_except_table_label (FILE *);
-extern void default_generate_internal_label (char *, const char *,
-					     unsigned long);
-extern void default_internal_label (FILE *, const char *, unsigned long);
-extern void default_asm_declare_constant_name (FILE *, const char *,
-					       const_tree, HOST_WIDE_INT);
-extern void default_file_start (void);
-extern void file_end_indicate_exec_stack (void);
-extern void file_end_indicate_split_stack (void);
-
-extern void default_elf_asm_output_external (FILE *file, tree,
-					     const char *);
-extern void default_elf_asm_output_limited_string (FILE *, const char *);
-extern void default_elf_asm_output_ascii (FILE *, const char *, unsigned int);
-extern void default_elf_internal_label (FILE *, const char *, unsigned long);
-
-extern void default_elf_init_array_asm_out_constructor (rtx, int);
-extern void default_elf_fini_array_asm_out_destructor (rtx, int);
-extern int maybe_assemble_visibility (tree);
-
-extern int default_address_cost (rtx, enum machine_mode, addr_space_t, bool);
-
-/* Output stack usage information.  */
-extern void output_stack_usage (void);
-
-#endif /* ! GCC_OUTPUT_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/params.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/params.def
deleted file mode 100644
index dd2e2cd..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/params.def
+++ /dev/null
@@ -1,1097 +0,0 @@
-/* params.def - Run-time parameters.
-   Copyright (C) 2001-2014 Free Software Foundation, Inc.
-   Written by Mark Mitchell <mark@codesourcery.com>.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* This file contains definitions for language-independent
-   parameters.  The DEFPARAM macro takes 6 arguments:
-
-     - The enumeral corresponding to this parameter.
-
-     - The name that can be used to set this parameter using the
-       command-line option `--param <name>=<value>'.
-
-     - A help string explaining how the parameter is used.
-
-     - A default value for the parameter.
-
-     - The minimum acceptable value for the parameter.
-
-     - The maximum acceptable value for the parameter (if greater than
-     the minimum).
-
-   Be sure to add an entry to invoke.texi summarizing the parameter.  */
-
-/* When branch is predicted to be taken with probability lower than this
-   threshold (in percent), then it is considered well predictable. */
-DEFPARAM (PARAM_PREDICTABLE_BRANCH_OUTCOME,
-	  "predictable-branch-outcome",
-	  "Maximal estimated outcome of branch considered predictable",
-	  2, 0, 50)
-
-DEFPARAM (PARAM_INLINE_MIN_SPEEDUP,
-	  "inline-min-speedup",
-	  "The minimal estimated speedup allowing inliner to ignore inline-insns-single and inline-isnsns-auto",
-	  10, 0, 0)
-
-/* The single function inlining limit. This is the maximum size
-   of a function counted in internal gcc instructions (not in
-   real machine instructions) that is eligible for inlining
-   by the tree inliner.
-   The default value is 450.
-   Only functions marked inline (or methods defined in the class
-   definition for C++) are affected by this.
-   There are more restrictions to inlining: If inlined functions
-   call other functions, the already inlined instructions are
-   counted and once the recursive inline limit (see
-   "max-inline-insns" parameter) is exceeded, the acceptable size
-   gets decreased.  */
-DEFPARAM (PARAM_MAX_INLINE_INSNS_SINGLE,
-	  "max-inline-insns-single",
-	  "The maximum number of instructions in a single function eligible for inlining",
-	  400, 0, 0)
-
-/* The single function inlining limit for functions that are
-   inlined by virtue of -finline-functions (-O3).
-   This limit should be chosen to be below or equal to the limit
-   that is applied to functions marked inlined (or defined in the
-   class declaration in C++) given by the "max-inline-insns-single"
-   parameter.
-   The default value is 40.  */
-DEFPARAM (PARAM_MAX_INLINE_INSNS_AUTO,
-	  "max-inline-insns-auto",
-	  "The maximum number of instructions when automatically inlining",
-	  40, 0, 0)
-
-DEFPARAM (PARAM_MAX_INLINE_INSNS_RECURSIVE,
-	  "max-inline-insns-recursive",
-	  "The maximum number of instructions inline function can grow to via recursive inlining",
-	  450, 0, 0)
-
-DEFPARAM (PARAM_MAX_INLINE_INSNS_RECURSIVE_AUTO,
-	  "max-inline-insns-recursive-auto",
-	  "The maximum number of instructions non-inline function can grow to via recursive inlining",
-	  450, 0, 0)
-
-DEFPARAM (PARAM_MAX_INLINE_RECURSIVE_DEPTH,
-	  "max-inline-recursive-depth",
-	  "The maximum depth of recursive inlining for inline functions",
-	  8, 0, 0)
-
-DEFPARAM (PARAM_MAX_INLINE_RECURSIVE_DEPTH_AUTO,
-	  "max-inline-recursive-depth-auto",
-	  "The maximum depth of recursive inlining for non-inline functions",
-	  8, 0, 0)
-
-DEFPARAM (PARAM_MIN_INLINE_RECURSIVE_PROBABILITY,
-	  "min-inline-recursive-probability",
-	  "Inline recursively only when the probability of call being executed exceeds the parameter",
-	  10, 0, 0)
-
-/* Limit of iterations of early inliner.  This basically bounds number of
-   nested indirect calls early inliner can resolve.  Deeper chains are still
-   handled by late inlining.  */
-DEFPARAM (PARAM_EARLY_INLINER_MAX_ITERATIONS,
-	  "max-early-inliner-iterations",
-	  "The maximum number of nested indirect inlining performed by early inliner",
-	  1, 0, 0)
-
-/* Limit on probability of entry BB.  */
-DEFPARAM (PARAM_COMDAT_SHARING_PROBABILITY,
-	  "comdat-sharing-probability",
-	  "Probability that COMDAT function will be shared with different compilation unit",
-	  20, 0, 0)
-
-/* Limit on probability of entry BB.  */
-DEFPARAM (PARAM_PARTIAL_INLINING_ENTRY_PROBABILITY,
-	  "partial-inlining-entry-probability",
-	  "Maximum probability of the entry BB of split region (in percent relative to entry BB of the function) to make partial inlining happen",
-	  70, 0, 0)
-
-/* Limit the number of expansions created by the variable expansion
-   optimization to avoid register pressure.  */
-DEFPARAM (PARAM_MAX_VARIABLE_EXPANSIONS,
-	  "max-variable-expansions-in-unroller",
-	  "If -fvariable-expansion-in-unroller is used, the maximum number of times that an individual variable will be expanded during loop unrolling",
-          1, 0, 0)
-
-/* Limit loop autovectorization to loops with large enough iteration count.  */
-DEFPARAM (PARAM_MIN_VECT_LOOP_BOUND,
-	  "min-vect-loop-bound",
-	  "If -ftree-vectorize is used, the minimal loop bound of a loop to be considered for vectorization",
-	  1, 1, 0)
-
-/* The maximum number of instructions to consider when looking for an
-   instruction to fill a delay slot.  If more than this arbitrary
-   number of instructions is searched, the time savings from filling
-   the delay slot will be minimal so stop searching.  Increasing
-   values mean more aggressive optimization, making the compile time
-   increase with probably small improvement in executable run time.  */
-DEFPARAM (PARAM_MAX_DELAY_SLOT_INSN_SEARCH,
-	  "max-delay-slot-insn-search",
-	  "The maximum number of instructions to consider to fill a delay slot",
-	  100, 0, 0)
-
-/* When trying to fill delay slots, the maximum number of instructions
-   to consider when searching for a block with valid live register
-   information.  Increasing this arbitrarily chosen value means more
-   aggressive optimization, increasing the compile time.  This
-   parameter should be removed when the delay slot code is rewritten
-   to maintain the control-flow graph.  */
-DEFPARAM(PARAM_MAX_DELAY_SLOT_LIVE_SEARCH,
-	 "max-delay-slot-live-search",
-	 "The maximum number of instructions to consider to find accurate live register information",
-	 333, 0, 0)
-
-/* This parameter limits the number of branch elements that the
-   scheduler will track anti-dependencies through without resetting
-   the tracking mechanism.  Large functions with few calls or barriers
-   can generate lists containing many 1000's of dependencies.  Generally
-   the compiler either uses all available memory, or runs for far too long.  */
-DEFPARAM(PARAM_MAX_PENDING_LIST_LENGTH,
-	 "max-pending-list-length",
-	 "The maximum length of scheduling's pending operations list",
-	 32, 0, 0)
-
-/* This parameter limits the number of backtracking attempts when using the
-   haifa scheduler for modulo scheduling.  */
-DEFPARAM(PARAM_MAX_MODULO_BACKTRACK_ATTEMPTS,
-	 "max-modulo-backtrack-attempts",
-	 "The maximum number of backtrack attempts the scheduler should make when modulo scheduling a loop",
-	 40, 0, 0)
-
-DEFPARAM(PARAM_LARGE_FUNCTION_INSNS,
-	 "large-function-insns",
-	 "The size of function body to be considered large",
-	 2700, 0, 0)
-DEFPARAM(PARAM_LARGE_FUNCTION_GROWTH,
-	 "large-function-growth",
-	 "Maximal growth due to inlining of large function (in percent)",
-	 100, 0, 0)
-DEFPARAM(PARAM_LARGE_UNIT_INSNS,
-	 "large-unit-insns",
-	 "The size of translation unit to be considered large",
-	 10000, 0, 0)
-DEFPARAM(PARAM_INLINE_UNIT_GROWTH,
-	 "inline-unit-growth",
-	 "How much can given compilation unit grow because of the inlining (in percent)",
-	 30, 0, 0)
-DEFPARAM(PARAM_IPCP_UNIT_GROWTH,
-	 "ipcp-unit-growth",
-	 "How much can given compilation unit grow because of the interprocedural constant propagation (in percent)",
-	 10, 0, 0)
-DEFPARAM(PARAM_EARLY_INLINING_INSNS,
-	 "early-inlining-insns",
-	 "Maximal estimated growth of function body caused by early inlining of single call",
-	 11, 0, 0)
-DEFPARAM(PARAM_LARGE_STACK_FRAME,
-	 "large-stack-frame",
-	 "The size of stack frame to be considered large",
-	 256, 0, 0)
-DEFPARAM(PARAM_STACK_FRAME_GROWTH,
-	 "large-stack-frame-growth",
-	 "Maximal stack frame growth due to inlining (in percent)",
-	 1000, 0, 0)
-
-/* The GCSE optimization will be disabled if it would require
-   significantly more memory than this value.  */
-DEFPARAM(PARAM_MAX_GCSE_MEMORY,
-	 "max-gcse-memory",
-	 "The maximum amount of memory to be allocated by GCSE",
-	 50 * 1024 * 1024, 0, 0)
-
-/* The GCSE optimization of an expression will avoided if the ratio of
-   insertions to deletions is greater than this value.  */
-DEFPARAM(PARAM_MAX_GCSE_INSERTION_RATIO,
-	 "max-gcse-insertion-ratio",
-	 "The maximum ratio of insertions to deletions of expressions in GCSE",
-	 20, 0, 0)
-
-/* This is the threshold ratio when to perform partial redundancy
-   elimination after reload. We perform partial redundancy elimination
-   when the following holds:
-   (Redundant load execution count)
-   ------------------------------- >= GCSE_AFTER_RELOAD_PARTIAL_FRACTION
-   (Added loads execution count)					  */
-DEFPARAM(PARAM_GCSE_AFTER_RELOAD_PARTIAL_FRACTION,
-	"gcse-after-reload-partial-fraction",
-	"The threshold ratio for performing partial redundancy elimination after reload",
-        3, 0, 0)
-/* This is the threshold ratio of the critical edges execution count compared to
-   the redundant loads execution count that permits performing the load
-   redundancy elimination in gcse after reload.  */
-DEFPARAM(PARAM_GCSE_AFTER_RELOAD_CRITICAL_FRACTION,
-	"gcse-after-reload-critical-fraction",
-	"The threshold ratio of critical edges execution count that permit performing redundancy elimination after reload",
-        10, 0, 0)
-
-/* GCSE will use GCSE_COST_DISTANCE_RATION as a scaling factor
-   to calculate maximum distance for which an expression is allowed to move
-   from its rtx_cost.  */
-DEFPARAM(PARAM_GCSE_COST_DISTANCE_RATIO,
-	 "gcse-cost-distance-ratio",
-	 "Scaling factor in calculation of maximum distance an expression can be moved by GCSE optimizations",
-	 10, 0, 0)
-/* GCSE won't restrict distance for which an expression with rtx_cost greater
-   than COSTS_N_INSN(GCSE_UNRESTRICTED_COST) is allowed to move.  */
-DEFPARAM(PARAM_GCSE_UNRESTRICTED_COST,
-	 "gcse-unrestricted-cost",
-	 "Cost at which GCSE optimizations will not constraint the distance an expression can travel",
-	 3, 0, 0)
-
-/* How deep from a given basic block the dominator tree should be searched
-   for expressions to hoist to the block.  The value of 0 will avoid limiting
-   the search.  */
-DEFPARAM(PARAM_MAX_HOIST_DEPTH,
-	 "max-hoist-depth",
-	 "Maximum depth of search in the dominator tree for expressions to hoist",
-	 30, 0, 0)
-
-/* This parameter limits the number of insns in a loop that will be unrolled,
-   and by how much the loop is unrolled.
-
-   This limit should be at most half of the peeling limits:  loop unroller
-   decides to not unroll loops that iterate fewer than 2*number of allowed
-   unrollings and thus we would have loops that are neither peeled or unrolled
-   otherwise.  */
-DEFPARAM(PARAM_MAX_UNROLLED_INSNS,
-	 "max-unrolled-insns",
-	 "The maximum number of instructions to consider to unroll in a loop",
-	 200, 0, 0)
-/* This parameter limits how many times the loop is unrolled depending
-   on number of insns really executed in each iteration.  */
-DEFPARAM(PARAM_MAX_AVERAGE_UNROLLED_INSNS,
-	 "max-average-unrolled-insns",
-	 "The maximum number of instructions to consider to unroll in a loop on average",
-	 80, 0, 0)
-/* The maximum number of unrollings of a single loop.  */
-DEFPARAM(PARAM_MAX_UNROLL_TIMES,
-	"max-unroll-times",
-	"The maximum number of unrollings of a single loop",
-	8, 0, 0)
-/* The maximum number of insns of a peeled loop.  */
-DEFPARAM(PARAM_MAX_PEELED_INSNS,
-	"max-peeled-insns",
-	"The maximum number of insns of a peeled loop",
-	100, 0, 0)
-/* The maximum number of peelings of a single loop.  */
-DEFPARAM(PARAM_MAX_PEEL_TIMES,
-	"max-peel-times",
-	"The maximum number of peelings of a single loop",
-	16, 0, 0)
-/* The maximum number of peelings of a single loop that is peeled completely.  */
-DEFPARAM(PARAM_MAX_PEEL_BRANCHES,
-	"max-peel-branches",
-	"The maximum number of branches on the path through the peeled sequence",
-	32, 0, 0)
-/* The maximum number of insns of a peeled loop.  */
-DEFPARAM(PARAM_MAX_COMPLETELY_PEELED_INSNS,
-	"max-completely-peeled-insns",
-	"The maximum number of insns of a completely peeled loop",
-	100, 0, 0)
-/* The maximum number of peelings of a single loop that is peeled completely.  */
-DEFPARAM(PARAM_MAX_COMPLETELY_PEEL_TIMES,
-	"max-completely-peel-times",
-	"The maximum number of peelings of a single loop that is peeled completely",
-	16, 0, 0)
-/* The maximum number of insns of a peeled loop that rolls only once.  */
-DEFPARAM(PARAM_MAX_ONCE_PEELED_INSNS,
-	"max-once-peeled-insns",
-	"The maximum number of insns of a peeled loop that rolls only once",
-	400, 0, 0)
-/* The maximum depth of a loop nest we completely peel.  */
-DEFPARAM(PARAM_MAX_UNROLL_ITERATIONS,
-	 "max-completely-peel-loop-nest-depth",
-	 "The maximum depth of a loop nest we completely peel",
-	 8, 0, 0)
-
-/* The maximum number of insns of an unswitched loop.  */
-DEFPARAM(PARAM_MAX_UNSWITCH_INSNS,
-	"max-unswitch-insns",
-	"The maximum number of insns of an unswitched loop",
-	50, 0, 0)
-/* The maximum level of recursion in unswitch_single_loop.  */
-DEFPARAM(PARAM_MAX_UNSWITCH_LEVEL,
-	"max-unswitch-level",
-	"The maximum number of unswitchings in a single loop",
-	3, 0, 0)
-
-/* The maximum number of iterations of a loop the brute force algorithm
-   for analysis of # of iterations of the loop tries to evaluate.  */
-DEFPARAM(PARAM_MAX_ITERATIONS_TO_TRACK,
-	"max-iterations-to-track",
-	"Bound on the number of iterations the brute force # of iterations analysis algorithm evaluates",
-	1000, 0, 0)
-/* A cutoff to avoid costly computations of the number of iterations in
-   the doloop transformation.  */
-DEFPARAM(PARAM_MAX_ITERATIONS_COMPUTATION_COST,
-	"max-iterations-computation-cost",
-	"Bound on the cost of an expression to compute the number of iterations",
-	10, 0, 0)
-
-/* This parameter is used to tune SMS MAX II calculations.  */
-DEFPARAM(PARAM_SMS_MAX_II_FACTOR,
-	 "sms-max-ii-factor",
-	 "A factor for tuning the upper bound that swing modulo scheduler uses for scheduling a loop",
-	 100, 0, 0)
-/* The minimum value of stage count that swing modulo scheduler will generate.  */
-DEFPARAM(PARAM_SMS_MIN_SC,
-        "sms-min-sc",
-        "The minimum value of stage count that swing modulo scheduler will generate.",
-        2, 1, 1)
-DEFPARAM(PARAM_SMS_DFA_HISTORY,
-	 "sms-dfa-history",
-	 "The number of cycles the swing modulo scheduler considers when checking conflicts using DFA",
-	 0, 0, 0)
-DEFPARAM(PARAM_SMS_LOOP_AVERAGE_COUNT_THRESHOLD,
-	 "sms-loop-average-count-threshold",
-	 "A threshold on the average loop count considered by the swing modulo scheduler",
-	 0, 0, 0)
-
-DEFPARAM(HOT_BB_COUNT_WS_PERMILLE,
-	 "hot-bb-count-ws-permille",
-         "A basic block profile count is considered hot if it contributes to "
-         "the given permillage of the entire profiled execution",
-	 999, 0, 1000)
-DEFPARAM(HOT_BB_FREQUENCY_FRACTION,
-	 "hot-bb-frequency-fraction",
-	 "Select fraction of the maximal frequency of executions of basic block in function given basic block needs to have to be considered hot",
-	 1000, 0, 0)
-
-DEFPARAM(UNLIKELY_BB_COUNT_FRACTION,
-	 "unlikely-bb-count-fraction",
-         "The minimum fraction of profile runs a given basic block execution count must be not to be considered unlikely",
-	 20, 1, 10000)
-
-DEFPARAM (PARAM_ALIGN_THRESHOLD,
-	  "align-threshold",
-	  "Select fraction of the maximal frequency of executions of basic block in function given basic block get alignment",
-	  100, 1, 0)
-
-DEFPARAM (PARAM_ALIGN_LOOP_ITERATIONS,
-	  "align-loop-iterations",
-	  "Loops iterating at least selected number of iterations will get loop alignement.",
-	  4, 0, 0)
-
-/* For guessed profiles, the loops having unknown number of iterations
-   are predicted to iterate relatively few (10) times at average.
-   For functions containing one loop with large known number of iterations
-   and other loops having unbounded loops we would end up predicting all
-   the other loops cold that is not usually the case.  So we need to artificially
-   flatten the profile.
-
-   We need to cut the maximal predicted iterations to large enough iterations
-   so the loop appears important, but safely within maximum hotness
-   range.  */
-
-DEFPARAM(PARAM_MAX_PREDICTED_ITERATIONS,
-	 "max-predicted-iterations",
-	 "The maximum number of loop iterations we predict statically",
-	 100, 0, 0)
-
-/* This parameter controls the probability of builtin_expect. The default
-   value is 90%. This empirical value is obtained through the weighted
-   probability of FDO counters (with the FDO count value as the weight)
-   in some real world programs:  
-   (1) Google performance test benchmarks: the probability is 0.9081.
-   (2) Linux 3.3 kernel running Google search workload: the probability
-   is 0.8717.  */
-
-DEFPARAM(BUILTIN_EXPECT_PROBABILITY,
-	 "builtin-expect-probability",
-	 "Set the estimated probability in percentage for builtin expect. The default value is 90% probability.",
-	 90, 0, 100)
-DEFPARAM(TRACER_DYNAMIC_COVERAGE_FEEDBACK,
-	 "tracer-dynamic-coverage-feedback",
-	 "The percentage of function, weighted by execution frequency, that must be covered by trace formation. Used when profile feedback is available",
-	 95, 0, 100)
-DEFPARAM(TRACER_DYNAMIC_COVERAGE,
-	 "tracer-dynamic-coverage",
-	 "The percentage of function, weighted by execution frequency, that must be covered by trace formation. Used when profile feedback is not available",
-	 75, 0, 100)
-DEFPARAM(TRACER_MAX_CODE_GROWTH,
-	 "tracer-max-code-growth",
-	 "Maximal code growth caused by tail duplication (in percent)",
-	 100, 0, 0)
-DEFPARAM(TRACER_MIN_BRANCH_RATIO,
-	 "tracer-min-branch-ratio",
-	 "Stop reverse growth if the reverse probability of best edge is less than this threshold (in percent)",
-	 10, 0, 100)
-DEFPARAM(TRACER_MIN_BRANCH_PROBABILITY_FEEDBACK,
-	 "tracer-min-branch-probability-feedback",
-	 "Stop forward growth if the probability of best edge is less than this threshold (in percent). Used when profile feedback is available",
-	 80, 0, 100)
-DEFPARAM(TRACER_MIN_BRANCH_PROBABILITY,
-	 "tracer-min-branch-probability",
-	 "Stop forward growth if the probability of best edge is less than this threshold (in percent). Used when profile feedback is not available",
-	 50, 0, 100)
-
-/* The maximum number of incoming edges to consider for crossjumping.  */
-DEFPARAM(PARAM_MAX_CROSSJUMP_EDGES,
-	 "max-crossjump-edges",
-	 "The maximum number of incoming edges to consider for crossjumping",
-	 100, 0, 0)
-
-/* The minimum number of matching instructions to consider for crossjumping.  */
-DEFPARAM(PARAM_MIN_CROSSJUMP_INSNS,
-     "min-crossjump-insns",
-     "The minimum number of matching instructions to consider for crossjumping",
-     5, 1, 0)
-
-/* The maximum number expansion factor when copying basic blocks.  */
-DEFPARAM(PARAM_MAX_GROW_COPY_BB_INSNS,
-     "max-grow-copy-bb-insns",
-     "The maximum expansion factor when copying basic blocks",
-     8, 0, 0)
-
-/* The maximum number of insns to duplicate when unfactoring computed gotos.  */
-DEFPARAM(PARAM_MAX_GOTO_DUPLICATION_INSNS,
-     "max-goto-duplication-insns",
-     "The maximum number of insns to duplicate when unfactoring computed gotos",
-     8, 0, 0)
-
-/* The maximum length of path considered in cse.  */
-DEFPARAM(PARAM_MAX_CSE_PATH_LENGTH,
-	 "max-cse-path-length",
-	 "The maximum length of path considered in cse",
-	 10, 1, 0)
-DEFPARAM(PARAM_MAX_CSE_INSNS,
-	 "max-cse-insns",
-	 "The maximum instructions CSE process before flushing",
-	 1000, 0, 0)
-
-/* The cost of expression in loop invariant motion that is considered
-   expensive.  */
-DEFPARAM(PARAM_LIM_EXPENSIVE,
-	 "lim-expensive",
-	 "The minimum cost of an expensive expression in the loop invariant motion",
-	 20, 0, 0)
-
-/* Bound on number of candidates for induction variables below that
-   all candidates are considered for each use in induction variable
-   optimizations.  */
-
-DEFPARAM(PARAM_IV_CONSIDER_ALL_CANDIDATES_BOUND,
-	 "iv-consider-all-candidates-bound",
-	 "Bound on number of candidates below that all candidates are considered in iv optimizations",
-	 30, 0, 0)
-
-/* The induction variable optimizations give up on loops that contain more
-   induction variable uses.  */
-
-DEFPARAM(PARAM_IV_MAX_CONSIDERED_USES,
-	 "iv-max-considered-uses",
-	 "Bound on number of iv uses in loop optimized in iv optimizations",
-	 250, 0, 0)
-
-/* If there are at most this number of ivs in the set, try removing unnecessary
-   ivs from the set always.  */
-
-DEFPARAM(PARAM_IV_ALWAYS_PRUNE_CAND_SET_BOUND,
-	 "iv-always-prune-cand-set-bound",
-	 "If number of candidates in the set is smaller, we always try to remove unused ivs during its optimization",
-	 10, 0, 0)
-
-DEFPARAM(PARAM_SCEV_MAX_EXPR_SIZE,
- 	 "scev-max-expr-size",
-	 "Bound on size of expressions used in the scalar evolutions analyzer",
-	 100, 0, 0)
-
-DEFPARAM(PARAM_SCEV_MAX_EXPR_COMPLEXITY,
-	 "scev-max-expr-complexity",
-	 "Bound on the complexity of the expressions in the scalar evolutions analyzer",
-	 10, 0, 0)
-
-DEFPARAM(PARAM_OMEGA_MAX_VARS,
- 	 "omega-max-vars",
-	 "Bound on the number of variables in Omega constraint systems",
-	 128, 0, 0)
-
-DEFPARAM(PARAM_OMEGA_MAX_GEQS,
- 	 "omega-max-geqs",
-	 "Bound on the number of inequalities in Omega constraint systems",
-	 256, 0, 0)
-
-DEFPARAM(PARAM_OMEGA_MAX_EQS,
- 	 "omega-max-eqs",
-	 "Bound on the number of equalities in Omega constraint systems",
-	 128, 0, 0)
-
-DEFPARAM(PARAM_OMEGA_MAX_WILD_CARDS,
- 	 "omega-max-wild-cards",
-	 "Bound on the number of wild cards in Omega constraint systems",
-	 18, 0, 0)
-
-DEFPARAM(PARAM_OMEGA_HASH_TABLE_SIZE,
- 	 "omega-hash-table-size",
-	 "Bound on the size of the hash table in Omega constraint systems",
-	 550, 0, 0)
-
-DEFPARAM(PARAM_OMEGA_MAX_KEYS,
- 	 "omega-max-keys",
-	 "Bound on the number of keys in Omega constraint systems",
-	 500, 0, 0)
-
-DEFPARAM(PARAM_OMEGA_ELIMINATE_REDUNDANT_CONSTRAINTS,
- 	 "omega-eliminate-redundant-constraints",
-	 "When set to 1, use expensive methods to eliminate all redundant constraints",
-	 0, 0, 1)
-
-DEFPARAM(PARAM_VECT_MAX_VERSION_FOR_ALIGNMENT_CHECKS,
-         "vect-max-version-for-alignment-checks",
-         "Bound on number of runtime checks inserted by the vectorizer's loop versioning for alignment check",
-         6, 0, 0)
-
-DEFPARAM(PARAM_VECT_MAX_VERSION_FOR_ALIAS_CHECKS,
-         "vect-max-version-for-alias-checks",
-         "Bound on number of runtime checks inserted by the vectorizer's loop versioning for alias check",
-         10, 0, 0)
-
-DEFPARAM(PARAM_VECT_MAX_PEELING_FOR_ALIGNMENT,
-         "vect-max-peeling-for-alignment",
-         "Max number of loop peels to enhancement alignment of data references in a loop",
-         -1, -1, 64)
-
-DEFPARAM(PARAM_MAX_CSELIB_MEMORY_LOCATIONS,
-	 "max-cselib-memory-locations",
-	 "The maximum memory locations recorded by cselib",
-	 500, 0, 0)
-
-#ifdef ENABLE_GC_ALWAYS_COLLECT
-# define GGC_MIN_EXPAND_DEFAULT 0
-# define GGC_MIN_HEAPSIZE_DEFAULT 0
-#else
-# define GGC_MIN_EXPAND_DEFAULT 30
-# define GGC_MIN_HEAPSIZE_DEFAULT 4096
-#endif
-
-DEFPARAM(GGC_MIN_EXPAND,
-	 "ggc-min-expand",
-	 "Minimum heap expansion to trigger garbage collection, as a percentage of the total size of the heap",
-	 GGC_MIN_EXPAND_DEFAULT, 0, 0)
-
-DEFPARAM(GGC_MIN_HEAPSIZE,
-	 "ggc-min-heapsize",
-	 "Minimum heap size before we start collecting garbage, in kilobytes",
-	 GGC_MIN_HEAPSIZE_DEFAULT, 0, 0)
-
-#undef GGC_MIN_EXPAND_DEFAULT
-#undef GGC_MIN_HEAPSIZE_DEFAULT
-
-DEFPARAM(PARAM_MAX_RELOAD_SEARCH_INSNS,
-	 "max-reload-search-insns",
-	 "The maximum number of instructions to search backward when looking for equivalent reload",
-	 100, 0, 0)
-
-DEFPARAM(PARAM_SINK_FREQUENCY_THRESHOLD,
-	 "sink-frequency-threshold",
-	 "Target block's relative execution frequency (as a percentage) required to sink a statement",
-	 75, 0, 100)
-
-DEFPARAM(PARAM_MAX_SCHED_REGION_BLOCKS,
-	 "max-sched-region-blocks",
-	 "The maximum number of blocks in a region to be considered for interblock scheduling",
-	 10, 0, 0)
-
-DEFPARAM(PARAM_MAX_SCHED_REGION_INSNS,
-	 "max-sched-region-insns",
-	 "The maximum number of insns in a region to be considered for interblock scheduling",
-	 100, 0, 0)
-
-DEFPARAM(PARAM_MAX_PIPELINE_REGION_BLOCKS,
-	 "max-pipeline-region-blocks",
-	 "The maximum number of blocks in a region to be considered for interblock scheduling",
-	 15, 0, 0)
-
-DEFPARAM(PARAM_MAX_PIPELINE_REGION_INSNS,
-	 "max-pipeline-region-insns",
-	 "The maximum number of insns in a region to be considered for interblock scheduling",
-	 200, 0, 0)
-
-DEFPARAM(PARAM_MIN_SPEC_PROB,
-         "min-spec-prob",
-         "The minimum probability of reaching a source block for interblock speculative scheduling",
-         40, 0, 0)
-
-DEFPARAM(PARAM_MAX_SCHED_EXTEND_REGIONS_ITERS,
-         "max-sched-extend-regions-iters",
-         "The maximum number of iterations through CFG to extend regions",
-         0, 0, 0)
-
-DEFPARAM(PARAM_MAX_SCHED_INSN_CONFLICT_DELAY,
-         "max-sched-insn-conflict-delay",
-         "The maximum conflict delay for an insn to be considered for speculative motion",
-         3, 1, 10)
-
-DEFPARAM(PARAM_SCHED_SPEC_PROB_CUTOFF,
-         "sched-spec-prob-cutoff",
-         "The minimal probability of speculation success (in percents), so that speculative insn will be scheduled.",
-         40, 0, 100)
-
-DEFPARAM(PARAM_SCHED_STATE_EDGE_PROB_CUTOFF,
-         "sched-state-edge-prob-cutoff",
-         "The minimum probability an edge must have for the scheduler to save its state across it.",
-         10, 0, 100)
-
-DEFPARAM(PARAM_SELSCHED_MAX_LOOKAHEAD,
-         "selsched-max-lookahead",
-         "The maximum size of the lookahead window of selective scheduling",
-         50, 0, 0)
-
-DEFPARAM(PARAM_SELSCHED_MAX_SCHED_TIMES,
-         "selsched-max-sched-times",
-         "Maximum number of times that an insn could be scheduled",
-         2, 0, 0)
-
-DEFPARAM(PARAM_SELSCHED_INSNS_TO_RENAME,
-         "selsched-insns-to-rename",
-         "Maximum number of instructions in the ready list that are considered eligible for renaming",
-         2, 0, 0)
-
-DEFPARAM (PARAM_SCHED_MEM_TRUE_DEP_COST,
-	  "sched-mem-true-dep-cost",
-	  "Minimal distance between possibly conflicting store and load",
-	  1, 0, 0)
-
-DEFPARAM(PARAM_MAX_LAST_VALUE_RTL,
-	 "max-last-value-rtl",
-	 "The maximum number of RTL nodes that can be recorded as combiner's last value",
-	 10000, 0, 0)
-
-/* INTEGER_CST nodes are shared for values [{-1,0} .. N) for
-   {signed,unsigned} integral types.  This determines N.
-   Experimentation shows 251 to be a good value that generates the
-   least amount of garbage for allocating the TREE_VEC storage.  */
-DEFPARAM (PARAM_INTEGER_SHARE_LIMIT,
-	  "integer-share-limit",
-	  "The upper bound for sharing integer constants",
-	  251, 2, 2)
-
-DEFPARAM (PARAM_SSP_BUFFER_SIZE,
-	  "ssp-buffer-size",
-	  "The lower bound for a buffer to be considered for stack smashing protection",
-	  8, 1, 0)
-
-DEFPARAM (PARAM_MIN_SIZE_FOR_STACK_SHARING,
-	  "min-size-for-stack-sharing",
-	  "The minimum size of variables taking part in stack slot sharing "
-	  "when not optimizing",
-	  32, 0, 0)
-
-/* When we thread through a block we have to make copies of the
-   statements within the block.  Clearly for large blocks the code
-   duplication is bad.
-
-   PARAM_MAX_JUMP_THREAD_DUPLICATION_STMTS specifies the maximum number
-   of statements and PHI nodes allowed in a block which is going to
-   be duplicated for thread jumping purposes.
-
-   Some simple analysis showed that more than 99% of the jump
-   threading opportunities are for blocks with less than 15
-   statements.  So we can get the benefits of jump threading
-   without excessive code bloat for pathological cases with the
-   throttle set at 15 statements.  */
-DEFPARAM (PARAM_MAX_JUMP_THREAD_DUPLICATION_STMTS,
-	  "max-jump-thread-duplication-stmts",
-          "Maximum number of statements allowed in a block that needs to be duplicated when threading jumps",
-	  15, 0, 0)
-
-/* This is the maximum number of fields a variable may have before the pointer analysis machinery
-   will stop trying to treat it in a field-sensitive manner.
-   There are programs out there with thousands of fields per structure, and handling them
-   field-sensitively is not worth the cost.  */
-DEFPARAM (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE,
-          "max-fields-for-field-sensitive",
-	  "Maximum number of fields in a structure before pointer analysis treats the structure as a single variable",
-	  0, 0, 0)
-
-DEFPARAM(PARAM_MAX_SCHED_READY_INSNS,
-	 "max-sched-ready-insns",
-	 "The maximum number of instructions ready to be issued to be considered by the scheduler during the first scheduling pass",
-	 100, 0, 0)
-
-/* This is the maximum number of active local stores RTL DSE will consider.  */
-DEFPARAM (PARAM_MAX_DSE_ACTIVE_LOCAL_STORES,
-	  "max-dse-active-local-stores",
-	  "Maximum number of active local stores in RTL dead store elimination",
-	  5000, 0, 0)
-
-/* Prefetching and cache-optimizations related parameters.  Default values are
-   usually set by machine description.  */
-
-/* The number of insns executed before prefetch is completed.  */
-
-DEFPARAM (PARAM_PREFETCH_LATENCY,
-	 "prefetch-latency",
-	 "The number of insns executed before prefetch is completed",
-	 200, 0, 0)
-
-/* The number of prefetches that can run at the same time.  */
-
-DEFPARAM (PARAM_SIMULTANEOUS_PREFETCHES,
-	  "simultaneous-prefetches",
-	  "The number of prefetches that can run at the same time",
-	  3, 0, 0)
-
-/* The size of L1 cache in kB.  */
-
-DEFPARAM (PARAM_L1_CACHE_SIZE,
-	  "l1-cache-size",
-	  "The size of L1 cache",
-	  64, 0, 0)
-
-/* The size of L1 cache line in bytes.  */
-
-DEFPARAM (PARAM_L1_CACHE_LINE_SIZE,
-	  "l1-cache-line-size",
-	  "The size of L1 cache line",
-	  32, 0, 0)
-
-/* The size of L2 cache in kB.  */
-
-DEFPARAM (PARAM_L2_CACHE_SIZE,
-	  "l2-cache-size",
-	  "The size of L2 cache",
-	  512, 0, 0)
-
-/* Whether we should use canonical types rather than deep "structural"
-   type checking.  Setting this value to 1 (the default) improves
-   compilation performance in the C++ and Objective-C++ front end;
-   this value should only be set to zero to work around bugs in the
-   canonical type system by disabling it.  */
-
-DEFPARAM (PARAM_USE_CANONICAL_TYPES,
-	  "use-canonical-types",
-	  "Whether to use canonical types",
-	  1, 0, 1)
-
-DEFPARAM (PARAM_MAX_PARTIAL_ANTIC_LENGTH,
-	  "max-partial-antic-length",
-	  "Maximum length of partial antic set when performing tree pre optimization",
-	  100, 0, 0)
-
-/* The following is used as a stop-gap limit for cases where really huge
-   SCCs blow up memory and compile-time use too much.  If we hit this limit,
-   SCCVN and such FRE and PRE will be not done at all for the current
-   function.  */
-
-DEFPARAM (PARAM_SCCVN_MAX_SCC_SIZE,
-	  "sccvn-max-scc-size",
-	  "Maximum size of a SCC before SCCVN stops processing a function",
-	  10000, 10, 0)
-
-/* The following is used as a stop-gap limit for cases where really huge
-   functions blow up compile-time use too much.  It limits the number of
-   alias-queries we do for finding common subexpressions for memory loads and
-   stores.  The number of alias-queries is otherwise limited by the number of
-   stores on paths to function entry.  */
-
-DEFPARAM (PARAM_SCCVN_MAX_ALIAS_QUERIES_PER_ACCESS,
-	  "sccvn-max-alias-queries-per-access",
-	  "Maximum number of disambiguations to perform per memory access",
-	  1000, 0, 0)
-
-DEFPARAM (PARAM_IRA_MAX_LOOPS_NUM,
-	  "ira-max-loops-num",
-	  "Max loops number for regional RA",
-	  100, 0, 0)
-
-DEFPARAM (PARAM_IRA_MAX_CONFLICT_TABLE_SIZE,
-	  "ira-max-conflict-table-size",
-	  "Max size of conflict table in MB",
-	  1000, 0, 0)
-
-DEFPARAM (PARAM_IRA_LOOP_RESERVED_REGS,
-	  "ira-loop-reserved-regs",
-	  "The number of registers in each class kept unused by loop invariant motion",
-	  2, 0, 0)
-
-DEFPARAM (PARAM_LRA_MAX_CONSIDERED_RELOAD_PSEUDOS,
-	  "lra-max-considered-reload-pseudos",
-	  "The max number of reload pseudos which are considered during spilling a non-reload pseudo",
-	  500, 0, 0)
-
-/* Switch initialization conversion will refuse to create arrays that are
-   bigger than this parameter times the number of switch branches.  */
-
-DEFPARAM (PARAM_SWITCH_CONVERSION_BRANCH_RATIO,
-	  "switch-conversion-max-branch-ratio",
-	  "The maximum ratio between array size and switch branches for "
-	  "a switch conversion to take place",
-	  8, 1, 0)
-
-/* Size of tiles when doing loop blocking.  */
-
-DEFPARAM (PARAM_LOOP_BLOCK_TILE_SIZE,
-	  "loop-block-tile-size",
-	  "size of tiles for loop blocking",
-	  51, 0, 0)
-
-/* Maximal number of parameters that we allow in a SCoP.  */
-
-DEFPARAM (PARAM_GRAPHITE_MAX_NB_SCOP_PARAMS,
-	  "graphite-max-nb-scop-params",
-	  "maximum number of parameters in a SCoP",
-	  10, 0, 0)
-
-/* Maximal number of basic blocks in the functions analyzed by Graphite.  */
-
-DEFPARAM (PARAM_GRAPHITE_MAX_BBS_PER_FUNCTION,
-	  "graphite-max-bbs-per-function",
-	  "maximum number of basic blocks per function to be analyzed by Graphite",
-	  100, 0, 0)
-
-/* Avoid data dependence analysis on very large loops.  */
-DEFPARAM (PARAM_LOOP_MAX_DATAREFS_FOR_DATADEPS,
-	  "loop-max-datarefs-for-datadeps",
-	  "Maximum number of datarefs in loop for building loop data dependencies",
-	  1000, 0, 0)
-
-/* Avoid doing loop invariant motion on very large loops.  */
-
-DEFPARAM (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP,
-	  "loop-invariant-max-bbs-in-loop",
-	  "Max basic blocks number in loop for loop invariant motion",
-	  10000, 0, 0)
-
-/* Avoid SLP vectorization of large basic blocks.  */
-DEFPARAM (PARAM_SLP_MAX_INSNS_IN_BB,
-          "slp-max-insns-in-bb",
-          "Maximum number of instructions in basic block to be considered for SLP vectorization",
-          1000, 0, 0)
-
-DEFPARAM (PARAM_MIN_INSN_TO_PREFETCH_RATIO,
-	  "min-insn-to-prefetch-ratio",
-	  "Min. ratio of insns to prefetches to enable prefetching for "
-          "a loop with an unknown trip count",
-	  9, 0, 0)
-
-DEFPARAM (PARAM_PREFETCH_MIN_INSN_TO_MEM_RATIO,
-	  "prefetch-min-insn-to-mem-ratio",
-	  "Min. ratio of insns to mem ops to enable prefetching in a loop",
-	  3, 0, 0)
-
-/* Set maximum hash table size for var tracking.  */
-
-DEFPARAM (PARAM_MAX_VARTRACK_SIZE,
-	  "max-vartrack-size",
-	  "Max. size of var tracking hash tables",
-	  50000000, 0, 0)
-
-/* Set maximum recursion depth for var tracking expression expansion
-   and resolution.  */
-
-DEFPARAM (PARAM_MAX_VARTRACK_EXPR_DEPTH,
-	  "max-vartrack-expr-depth",
-	  "Max. recursion depth for expanding var tracking expressions",
-	  12, 0, 0)
-
-/* Set maximum length of value location list for which var tracking
-   should add reverse operations.  */
-
-DEFPARAM (PARAM_MAX_VARTRACK_REVERSE_OP_SIZE,
-	  "max-vartrack-reverse-op-size",
-	  "Max. size of loc list for which reverse ops should be added",
-	  50, 0, 0)
-
-/* Set minimum insn uid for non-debug insns.  */
-
-DEFPARAM (PARAM_MIN_NONDEBUG_INSN_UID,
-	  "min-nondebug-insn-uid",
-	  "The minimum UID to be used for a nondebug insn",
-	  0, 1, 0)
-
-DEFPARAM (PARAM_IPA_SRA_PTR_GROWTH_FACTOR,
-	  "ipa-sra-ptr-growth-factor",
-	  "Maximum allowed growth of size of new parameters ipa-sra replaces "
-	  "a pointer to an aggregate with",
-	  2, 0, 0)
-
-DEFPARAM (PARAM_TM_MAX_AGGREGATE_SIZE,
-	  "tm-max-aggregate-size",
-	  "Size in bytes after which thread-local aggregates should be "
-	  "instrumented with the logging functions instead of save/restore "
-	  "pairs",
-	  9, 0, 0)
-
-DEFPARAM (PARAM_IPA_CP_VALUE_LIST_SIZE,
-	  "ipa-cp-value-list-size",
-	  "Maximum size of a list of values associated with each parameter for "
-	  "interprocedural constant propagation",
-	  8, 0, 0)
-
-DEFPARAM (PARAM_IPA_CP_EVAL_THRESHOLD,
-	  "ipa-cp-eval-threshold",
-	  "Threshold ipa-cp opportunity evaluation that is still considered "
-	  "beneficial to clone.",
-	  500, 0, 0)
-
-DEFPARAM (PARAM_IPA_MAX_AGG_ITEMS,
-	  "ipa-max-agg-items",
-	  "Maximum number of aggregate content items for a parameter in "
-	  "jump functions and lattices",
-	  16, 0, 0)
-
-DEFPARAM (PARAM_IPA_CP_LOOP_HINT_BONUS,
-	  "ipa-cp-loop-hint-bonus",
-	  "Compile-time bonus IPA-CP assigns to candidates which make loop "
-	  "bounds or strides known.",
-	  64, 0, 0)
-
-DEFPARAM (PARAM_IPA_CP_ARRAY_INDEX_HINT_BONUS,
-	  "ipa-cp-array-index-hint-bonus",
-	  "Compile-time bonus IPA-CP assigns to candidates which make an array "
-	  "index known.",
-	  48, 0, 0)
-
-/* WHOPR partitioning configuration.  */
-
-DEFPARAM (PARAM_LTO_PARTITIONS,
-	  "lto-partitions",
-	  "Number of partitions the program should be split to",
-	  32, 1, 0)
-
-DEFPARAM (MIN_PARTITION_SIZE,
-	  "lto-min-partition",
-	  "Minimal size of a partition for LTO (in estimated instructions)",
-	  1000, 0, 0)
-
-/* Diagnostic parameters.  */
-
-DEFPARAM (CXX_MAX_NAMESPACES_FOR_DIAGNOSTIC_HELP,
-	  "cxx-max-namespaces-for-diagnostic-help",
-	  "Maximum number of namespaces to search for alternatives when "
-	  "name lookup fails",
-	  1000, 0, 0)
-
-/* Maximum number of conditional store pairs that can be sunk.  */
-DEFPARAM (PARAM_MAX_STORES_TO_SINK,
-          "max-stores-to-sink",
-          "Maximum number of conditional store pairs that can be sunk",
-          2, 0, 0)
-
-/* Override CASE_VALUES_THRESHOLD of when to switch from doing switch
-   statements via if statements to using a table jump operation.  If the value
-   is 0, the default CASE_VALUES_THRESHOLD will be used.  */
-DEFPARAM (PARAM_CASE_VALUES_THRESHOLD,
-          "case-values-threshold",
-          "The smallest number of different values for which it is best to "
-	  "use a jump-table instead of a tree of conditional branches, "
-	  "if 0, use the default for the machine",
-          0, 0, 0)
-
-/* Data race flags for C++0x memory model compliance.  */
-DEFPARAM (PARAM_ALLOW_LOAD_DATA_RACES,
-	  "allow-load-data-races",
-	  "Allow new data races on loads to be introduced",
-	  1, 0, 1)
-
-DEFPARAM (PARAM_ALLOW_STORE_DATA_RACES,
-	  "allow-store-data-races",
-	  "Allow new data races on stores to be introduced",
-	  1, 0, 1)
-
-DEFPARAM (PARAM_ALLOW_PACKED_LOAD_DATA_RACES,
-	  "allow-packed-load-data-races",
-	  "Allow new data races on packed data loads to be introduced",
-	  1, 0, 1)
-
-DEFPARAM (PARAM_ALLOW_PACKED_STORE_DATA_RACES,
-	  "allow-packed-store-data-races",
-	  "Allow new data races on packed data stores to be introduced",
-	  1, 0, 1)
-
-/* Reassociation width to be used by tree reassoc optimization.  */
-DEFPARAM (PARAM_TREE_REASSOC_WIDTH,
-	  "tree-reassoc-width",
-	  "Set the maximum number of instructions executed in parallel in "
-	  "reassociated tree. If 0, use the target dependent heuristic.",
-	  0, 0, 0)
-
-DEFPARAM (PARAM_MAX_TAIL_MERGE_COMPARISONS,
-          "max-tail-merge-comparisons",
-          "Maximum amount of similar bbs to compare a bb with",
-          10, 0, 0)
-
-DEFPARAM (PARAM_MAX_TAIL_MERGE_ITERATIONS,
-          "max-tail-merge-iterations",
-          "Maximum amount of iterations of the pass over a function",
-          2, 0, 0)
-
-/* Maximum number of strings for which strlen optimization pass will
-   track string lenths.  */
-DEFPARAM (PARAM_MAX_TRACKED_STRLENS,
-	  "max-tracked-strlens",
-	  "Maximum number of strings for which strlen optimization pass will "
-	  "track string lengths",
-	  1000, 0, 0)
-
-/* Keep this in sync with the sched_pressure_algorithm enum.  */
-DEFPARAM (PARAM_SCHED_PRESSURE_ALGORITHM,
-	  "sched-pressure-algorithm",
-	  "Which -fsched-pressure algorithm to apply",
-	  1, 1, 2)
-
-/* Maximum length of candidate scans in straight-line strength reduction.  */
-DEFPARAM (PARAM_MAX_SLSR_CANDIDATE_SCAN,
-	  "max-slsr-cand-scan",
-	  "Maximum length of candidate scans for straight-line "
-	  "strength reduction",
-	  50, 1, 999999)
-
-DEFPARAM (PARAM_ASAN_STACK,
-         "asan-stack",
-         "Enable asan stack protection",
-         1, 0, 1)
-
-DEFPARAM (PARAM_ASAN_GLOBALS,
-         "asan-globals",
-         "Enable asan globals protection",
-         1, 0, 1)
-
-DEFPARAM (PARAM_ASAN_INSTRUMENT_WRITES,
-         "asan-instrument-writes",
-         "Enable asan store operations protection",
-         1, 0, 1)
-
-DEFPARAM (PARAM_ASAN_INSTRUMENT_READS,
-         "asan-instrument-reads",
-         "Enable asan load operations protection",
-         1, 0, 1)
-
-DEFPARAM (PARAM_ASAN_MEMINTRIN,
-         "asan-memintrin",
-         "Enable asan builtin functions protection",
-         1, 0, 1)
-
-DEFPARAM (PARAM_ASAN_USE_AFTER_RETURN,
-         "asan-use-after-return",
-         "Enable asan builtin functions protection",
-         1, 0, 1)
-
-DEFPARAM (PARAM_UNINIT_CONTROL_DEP_ATTEMPTS,
-	  "uninit-control-dep-attempts",
-	  "Maximum number of nested calls to search for control dependencies "
-	  "during uninitialized variable analysis",
-	  1000, 1, 0)
-/*
-
-Local variables:
-mode:c
-End:
-*/
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/params.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/params.h
deleted file mode 100644
index 0d6daa2..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/params.h
+++ /dev/null
@@ -1,236 +0,0 @@
-/* params.h - Run-time parameters.
-   Copyright (C) 2001-2014 Free Software Foundation, Inc.
-   Written by Mark Mitchell <mark@codesourcery.com>.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* This module provides a means for setting integral parameters
-   dynamically.  Instead of encoding magic numbers in various places,
-   use this module to organize all the magic numbers in a single
-   place.  The values of the parameters can be set on the
-   command-line, thereby providing a way to control the amount of
-   effort spent on particular optimization passes, or otherwise tune
-   the behavior of the compiler.
-
-   Since their values can be set on the command-line, these parameters
-   should not be used for non-dynamic memory allocation.  */
-
-#ifndef GCC_PARAMS_H
-#define GCC_PARAMS_H
-
-/* No parameter shall have this value.  */
-
-#define INVALID_PARAM_VAL (-1)
-
-/* The information associated with each parameter.  */
-
-struct param_info
-{
-  /* The name used with the `--param <name>=<value>' switch to set this
-     value.  */
-  const char *const option;
-
-  /* The default value.  */
-  int default_value;
-
-  /* Minimum acceptable value.  */
-  int min_value;
-
-  /* Maximum acceptable value, if greater than minimum  */
-  int max_value;
-
-  /* A short description of the option.  */
-  const char *const help;
-};
-
-/* An array containing the compiler parameters and their current
-   values.  */
-
-extern param_info *compiler_params;
-
-/* Returns the number of entries in the table, for the use by plugins.  */
-extern size_t get_num_compiler_params (void);
-
-/* Add the N PARAMS to the current list of compiler parameters.  */
-
-extern void add_params (const param_info params[], size_t n);
-
-/* Set the VALUE associated with the parameter given by NAME in the
-   table PARAMS using PARAMS_SET to indicate which have been
-   explicitly set.  */
-
-extern void set_param_value (const char *name, int value,
-			     int *params, int *params_set);
-
-
-/* The parameters in use by language-independent code.  */
-
-enum compiler_param
-{
-#define DEFPARAM(enumerator, option, msgid, default, min, max) \
-  enumerator,
-#include "params.def"
-#undef DEFPARAM
-  LAST_PARAM
-};
-
-/* The value of the parameter given by ENUM.  Not an lvalue.  */
-#define PARAM_VALUE(ENUM) \
-  ((int) global_options.x_param_values[(int) ENUM])
-
-/* Set the value of the parameter given by NUM to VALUE, implicitly,
-   if it has not been set explicitly by the user, in the table PARAMS
-   using PARAMS_SET to indicate which have been explicitly set.  */
-
-extern void maybe_set_param_value (compiler_param num, int value,
-				   int *params, int *params_set);
-
-/* Set the default value of a parameter given by NUM to VALUE, before
-   option processing.  */
-
-extern void set_default_param_value (compiler_param num, int value);
-
-/* Add all parameters and default values that can be set in both the
-   driver and the compiler proper.  */
-
-extern void global_init_params (void);
-
-/* Note that all parameters have been added and all default values
-   set.  */
-extern void finish_params (void);
-
-/* Return the default value of parameter NUM.  */
-
-extern int default_param_value (compiler_param num);
-
-/* Initialize an array PARAMS with default values of the
-   parameters.  */
-extern void init_param_values (int *params);
-
-/* Macros for the various parameters.  */
-#define MAX_INLINE_INSNS_SINGLE \
-  PARAM_VALUE (PARAM_MAX_INLINE_INSNS_SINGLE)
-#define MAX_INLINE_INSNS \
-  PARAM_VALUE (PARAM_MAX_INLINE_INSNS)
-#define MAX_INLINE_SLOPE \
-  PARAM_VALUE (PARAM_MAX_INLINE_SLOPE)
-#define MIN_INLINE_INSNS \
-  PARAM_VALUE (PARAM_MIN_INLINE_INSNS)
-#define MAX_INLINE_INSNS_AUTO \
-  PARAM_VALUE (PARAM_MAX_INLINE_INSNS_AUTO)
-#define MAX_VARIABLE_EXPANSIONS \
-  PARAM_VALUE (PARAM_MAX_VARIABLE_EXPANSIONS)
-#define MIN_VECT_LOOP_BOUND \
-  PARAM_VALUE (PARAM_MIN_VECT_LOOP_BOUND)
-#define MAX_DELAY_SLOT_INSN_SEARCH \
-  PARAM_VALUE (PARAM_MAX_DELAY_SLOT_INSN_SEARCH)
-#define MAX_DELAY_SLOT_LIVE_SEARCH \
-  PARAM_VALUE (PARAM_MAX_DELAY_SLOT_LIVE_SEARCH)
-#define MAX_PENDING_LIST_LENGTH \
-  PARAM_VALUE (PARAM_MAX_PENDING_LIST_LENGTH)
-#define MAX_GCSE_MEMORY \
-  ((size_t) PARAM_VALUE (PARAM_MAX_GCSE_MEMORY))
-#define MAX_GCSE_INSERTION_RATIO \
-  ((size_t) PARAM_VALUE (PARAM_MAX_GCSE_INSERTION_RATIO))
-#define GCSE_AFTER_RELOAD_PARTIAL_FRACTION \
-  PARAM_VALUE (PARAM_GCSE_AFTER_RELOAD_PARTIAL_FRACTION)
-#define GCSE_AFTER_RELOAD_CRITICAL_FRACTION \
-  PARAM_VALUE (PARAM_GCSE_AFTER_RELOAD_CRITICAL_FRACTION)
-#define GCSE_COST_DISTANCE_RATIO \
-  PARAM_VALUE (PARAM_GCSE_COST_DISTANCE_RATIO)
-#define GCSE_UNRESTRICTED_COST \
-  PARAM_VALUE (PARAM_GCSE_UNRESTRICTED_COST)
-#define MAX_HOIST_DEPTH \
-  PARAM_VALUE (PARAM_MAX_HOIST_DEPTH)
-#define MAX_UNROLLED_INSNS \
-  PARAM_VALUE (PARAM_MAX_UNROLLED_INSNS)
-#define MAX_SMS_LOOP_NUMBER \
-  PARAM_VALUE (PARAM_MAX_SMS_LOOP_NUMBER)
-#define SMS_MAX_II_FACTOR \
-  PARAM_VALUE (PARAM_SMS_MAX_II_FACTOR)
-#define SMS_DFA_HISTORY \
-  PARAM_VALUE (PARAM_SMS_DFA_HISTORY)
-#define SMS_LOOP_AVERAGE_COUNT_THRESHOLD \
-  PARAM_VALUE (PARAM_SMS_LOOP_AVERAGE_COUNT_THRESHOLD)
-#define INTEGER_SHARE_LIMIT \
-  PARAM_VALUE (PARAM_INTEGER_SHARE_LIMIT)
-#define MAX_LAST_VALUE_RTL \
-  PARAM_VALUE (PARAM_MAX_LAST_VALUE_RTL)
-#define MIN_VIRTUAL_MAPPINGS \
-  PARAM_VALUE (PARAM_MIN_VIRTUAL_MAPPINGS)
-#define VIRTUAL_MAPPINGS_TO_SYMS_RATIO \
-  PARAM_VALUE (PARAM_VIRTUAL_MAPPINGS_TO_SYMS_RATIO)
-#define MAX_FIELDS_FOR_FIELD_SENSITIVE \
-  ((size_t) PARAM_VALUE (PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE))
-#define MAX_SCHED_READY_INSNS \
-  PARAM_VALUE (PARAM_MAX_SCHED_READY_INSNS)
-#define PREFETCH_LATENCY \
-  PARAM_VALUE (PARAM_PREFETCH_LATENCY)
-#define SIMULTANEOUS_PREFETCHES \
-  PARAM_VALUE (PARAM_SIMULTANEOUS_PREFETCHES)
-#define L1_CACHE_SIZE \
-  PARAM_VALUE (PARAM_L1_CACHE_SIZE)
-#define L1_CACHE_LINE_SIZE \
-  PARAM_VALUE (PARAM_L1_CACHE_LINE_SIZE)
-#define L2_CACHE_SIZE \
-  PARAM_VALUE (PARAM_L2_CACHE_SIZE)
-#define USE_CANONICAL_TYPES \
-  PARAM_VALUE (PARAM_USE_CANONICAL_TYPES)
-#define IRA_MAX_LOOPS_NUM \
-  PARAM_VALUE (PARAM_IRA_MAX_LOOPS_NUM)
-#define IRA_MAX_CONFLICT_TABLE_SIZE \
-  PARAM_VALUE (PARAM_IRA_MAX_CONFLICT_TABLE_SIZE)
-#define IRA_LOOP_RESERVED_REGS \
-  PARAM_VALUE (PARAM_IRA_LOOP_RESERVED_REGS)
-#define LRA_MAX_CONSIDERED_RELOAD_PSEUDOS \
-  PARAM_VALUE (PARAM_LRA_MAX_CONSIDERED_RELOAD_PSEUDOS)
-#define SWITCH_CONVERSION_BRANCH_RATIO \
-  PARAM_VALUE (PARAM_SWITCH_CONVERSION_BRANCH_RATIO)
-#define LOOP_INVARIANT_MAX_BBS_IN_LOOP \
-  PARAM_VALUE (PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP)
-#define SLP_MAX_INSNS_IN_BB \
-  PARAM_VALUE (PARAM_SLP_MAX_INSNS_IN_BB)
-#define MIN_INSN_TO_PREFETCH_RATIO \
-  PARAM_VALUE (PARAM_MIN_INSN_TO_PREFETCH_RATIO)
-#define PREFETCH_MIN_INSN_TO_MEM_RATIO \
-  PARAM_VALUE (PARAM_PREFETCH_MIN_INSN_TO_MEM_RATIO)
-#define MIN_NONDEBUG_INSN_UID \
-  PARAM_VALUE (PARAM_MIN_NONDEBUG_INSN_UID)
-#define MAX_STORES_TO_SINK \
-  PARAM_VALUE (PARAM_MAX_STORES_TO_SINK)
-#define ALLOW_LOAD_DATA_RACES \
-  PARAM_VALUE (PARAM_ALLOW_LOAD_DATA_RACES)
-#define ALLOW_STORE_DATA_RACES \
-  PARAM_VALUE (PARAM_ALLOW_STORE_DATA_RACES)
-#define ALLOW_PACKED_LOAD_DATA_RACES \
-  PARAM_VALUE (PARAM_ALLOW_PACKED_LOAD_DATA_RACES)
-#define ALLOW_PACKED_STORE_DATA_RACES \
-  PARAM_VALUE (PARAM_ALLOW_PACKED_STORE_DATA_RACES)
-#define ASAN_STACK \
-  PARAM_VALUE (PARAM_ASAN_STACK)
-#define ASAN_GLOBALS \
-  PARAM_VALUE (PARAM_ASAN_GLOBALS)
-#define ASAN_INSTRUMENT_READS \
-  PARAM_VALUE (PARAM_ASAN_INSTRUMENT_READS)
-#define ASAN_INSTRUMENT_WRITES \
-  PARAM_VALUE (PARAM_ASAN_INSTRUMENT_WRITES)
-#define ASAN_MEMINTRIN \
-  PARAM_VALUE (PARAM_ASAN_MEMINTRIN)
-#define ASAN_USE_AFTER_RETURN \
-  PARAM_VALUE (PARAM_ASAN_USE_AFTER_RETURN)
-
-#endif /* ! GCC_PARAMS_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/pass_manager.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/pass_manager.h
deleted file mode 100644
index e1d8143..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/pass_manager.h
+++ /dev/null
@@ -1,136 +0,0 @@
-/* pass_manager.h - The pipeline of optimization passes
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_PASS_MANAGER_H
-#define GCC_PASS_MANAGER_H
-
-class opt_pass;
-struct register_pass_info;
-
-/* Define a list of pass lists so that both passes.c and plugins can easily
-   find all the pass lists.  */
-#define GCC_PASS_LISTS \
-  DEF_PASS_LIST (all_lowering_passes) \
-  DEF_PASS_LIST (all_small_ipa_passes) \
-  DEF_PASS_LIST (all_regular_ipa_passes) \
-  DEF_PASS_LIST (all_passes)
-
-#define DEF_PASS_LIST(LIST) PASS_LIST_NO_##LIST,
-enum pass_list
-{
-  GCC_PASS_LISTS
-  PASS_LIST_NUM
-};
-#undef DEF_PASS_LIST
-
-namespace gcc {
-
-class context;
-
-class pass_manager
-{
-public:
-  void *operator new (size_t sz);
-
-  pass_manager (context *ctxt);
-
-  void register_pass (struct register_pass_info *pass_info);
-  void register_one_dump_file (opt_pass *pass);
-
-  opt_pass *get_pass_for_id (int id) const;
-
-  void dump_passes () const;
-
-  void dump_profile_report () const;
-
-  void finish_optimization_passes ();
-
-  /* Access to specific passes, so that the majority can be private.  */
-  void execute_early_local_passes ();
-  unsigned int execute_pass_mode_switching ();
-
-  /* Various passes are manually cloned by epiphany. */
-  opt_pass *get_pass_split_all_insns () const {
-    return pass_split_all_insns_1;
-  }
-  opt_pass *get_pass_mode_switching () const {
-    return pass_mode_switching_1;
-  }
-  opt_pass *get_pass_peephole2 () const { return pass_peephole2_1; }
-  opt_pass *get_pass_profile () const { return pass_profile_1; }
-
-public:
-  /* The root of the compilation pass tree, once constructed.  */
-  opt_pass *all_passes;
-  opt_pass *all_small_ipa_passes;
-  opt_pass *all_lowering_passes;
-  opt_pass *all_regular_ipa_passes;
-  opt_pass *all_late_ipa_passes;
-
-  /* A map from static pass id to optimization pass.  */
-  opt_pass **passes_by_id;
-  int passes_by_id_size;
-
-  opt_pass **pass_lists[PASS_LIST_NUM];
-
-private:
-  void set_pass_for_id (int id, opt_pass *pass);
-  int register_dump_files_1 (opt_pass *pass, int properties);
-  void register_dump_files (opt_pass *pass, int properties);
-
-private:
-  context *m_ctxt;
-
-  /* References to all of the individual passes.
-     These fields are generated via macro expansion.
-
-     For example:
-         NEXT_PASS (pass_build_cfg, 1);
-     within pass-instances.def means that there is a field:
-         opt_pass *pass_build_cfg_1;
-
-     Similarly, the various:
-        NEXT_PASS (pass_copy_prop, 1);
-        ...
-        NEXT_PASS (pass_copy_prop, 8);
-     in pass-instances.def lead to fields:
-        opt_pass *pass_copy_prop_1;
-        ...
-        opt_pass *pass_copy_prop_8;  */
-
-#define INSERT_PASSES_AFTER(PASS)
-#define PUSH_INSERT_PASSES_WITHIN(PASS)
-#define POP_INSERT_PASSES()
-#define NEXT_PASS(PASS, NUM) opt_pass *PASS ## _ ## NUM
-#define TERMINATE_PASS_LIST()
-
-#include "pass-instances.def"
-
-#undef INSERT_PASSES_AFTER
-#undef PUSH_INSERT_PASSES_WITHIN
-#undef POP_INSERT_PASSES
-#undef NEXT_PASS
-#undef TERMINATE_PASS_LIST
-
-}; // class pass_manager
-
-} // namespace gcc
-
-#endif /* ! GCC_PASS_MANAGER_H */
-
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/plugin-api.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/plugin-api.h
deleted file mode 100644
index 5797d4d..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/plugin-api.h
+++ /dev/null
@@ -1,432 +0,0 @@
-/* plugin-api.h -- External linker plugin API.  */
-
-/* Copyright 2009, 2010 Free Software Foundation, Inc.
-   Written by Cary Coutant <ccoutant@google.com>.
-
-   This file is part of binutils.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-/* This file defines the interface for writing a linker plugin, which is
-   described at < http://gcc.gnu.org/wiki/whopr/driver >.  */
-
-#ifndef PLUGIN_API_H
-#define PLUGIN_API_H
-
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#elif defined(HAVE_INTTYPES_H)
-#include <inttypes.h>
-#endif
-#include <sys/types.h>
-#if !defined(HAVE_STDINT_H) && !defined(HAVE_INTTYPES_H) && \
-    !defined(UINT64_MAX) && !defined(uint64_t)
-#error can not find uint64_t type
-#endif
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-/* Status code returned by most API routines.  */
-
-enum ld_plugin_status
-{
-  LDPS_OK = 0,
-  LDPS_NO_SYMS,         /* Attempt to get symbols that haven't been added. */
-  LDPS_BAD_HANDLE,      /* No claimed object associated with given handle. */
-  LDPS_ERR
-  /* Additional Error codes TBD.  */
-};
-
-/* The version of the API specification.  */
-
-enum ld_plugin_api_version
-{
-  LD_PLUGIN_API_VERSION = 1
-};
-
-/* The type of output file being generated by the linker.  */
-
-enum ld_plugin_output_file_type
-{
-  LDPO_REL,
-  LDPO_EXEC,
-  LDPO_DYN,
-  LDPO_PIE
-};
-
-/* An input file managed by the plugin library.  */
-
-struct ld_plugin_input_file
-{
-  const char *name;
-  int fd;
-  off_t offset;
-  off_t filesize;
-  void *handle;
-};
-
-/* A symbol belonging to an input file managed by the plugin library.  */
-
-struct ld_plugin_symbol
-{
-  char *name;
-  char *version;
-  int def;
-  int visibility;
-  uint64_t size;
-  char *comdat_key;
-  int resolution;
-};
-
-/* An object's section.  */
-
-struct ld_plugin_section
-{
-  const void* handle;
-  unsigned int shndx;
-};
-
-/* Whether the symbol is a definition, reference, or common, weak or not.  */
-
-enum ld_plugin_symbol_kind
-{
-  LDPK_DEF,
-  LDPK_WEAKDEF,
-  LDPK_UNDEF,
-  LDPK_WEAKUNDEF,
-  LDPK_COMMON
-};
-
-/* The visibility of the symbol.  */
-
-enum ld_plugin_symbol_visibility
-{
-  LDPV_DEFAULT,
-  LDPV_PROTECTED,
-  LDPV_INTERNAL,
-  LDPV_HIDDEN
-};
-
-/* How a symbol is resolved.  */
-
-enum ld_plugin_symbol_resolution
-{
-  LDPR_UNKNOWN = 0,
-
-  /* Symbol is still undefined at this point.  */
-  LDPR_UNDEF,
-
-  /* This is the prevailing definition of the symbol, with references from
-     regular object code.  */
-  LDPR_PREVAILING_DEF,
-
-  /* This is the prevailing definition of the symbol, with no
-     references from regular objects.  It is only referenced from IR
-     code.  */
-  LDPR_PREVAILING_DEF_IRONLY,
-
-  /* This definition was pre-empted by a definition in a regular
-     object file.  */
-  LDPR_PREEMPTED_REG,
-
-  /* This definition was pre-empted by a definition in another IR file.  */
-  LDPR_PREEMPTED_IR,
-
-  /* This symbol was resolved by a definition in another IR file.  */
-  LDPR_RESOLVED_IR,
-
-  /* This symbol was resolved by a definition in a regular object
-     linked into the main executable.  */
-  LDPR_RESOLVED_EXEC,
-
-  /* This symbol was resolved by a definition in a shared object.  */
-  LDPR_RESOLVED_DYN,
-
-  /* This is the prevailing definition of the symbol, with no
-     references from regular objects.  It is only referenced from IR
-     code, but the symbol is exported and may be referenced from
-     a dynamic object (not seen at link time).  */
-  LDPR_PREVAILING_DEF_IRONLY_EXP
-};
-
-/* The plugin library's "claim file" handler.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_claim_file_handler) (
-  const struct ld_plugin_input_file *file, int *claimed);
-
-/* The plugin library's "all symbols read" handler.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_all_symbols_read_handler) (void);
-
-/* The plugin library's cleanup handler.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_cleanup_handler) (void);
-
-/* The linker's interface for registering the "claim file" handler.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_register_claim_file) (ld_plugin_claim_file_handler handler);
-
-/* The linker's interface for registering the "all symbols read" handler.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_register_all_symbols_read) (
-  ld_plugin_all_symbols_read_handler handler);
-
-/* The linker's interface for registering the cleanup handler.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_register_cleanup) (ld_plugin_cleanup_handler handler);
-
-/* The linker's interface for adding symbols from a claimed input file.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_add_symbols) (void *handle, int nsyms,
-                          const struct ld_plugin_symbol *syms);
-
-/* The linker's interface for getting the input file information with
-   an open (possibly re-opened) file descriptor.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_get_input_file) (const void *handle,
-                             struct ld_plugin_input_file *file);
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_get_view) (const void *handle, const void **viewp);
-
-/* The linker's interface for releasing the input file.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_release_input_file) (const void *handle);
-
-/* The linker's interface for retrieving symbol resolution information.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_get_symbols) (const void *handle, int nsyms,
-                          struct ld_plugin_symbol *syms);
-
-/* The linker's interface for adding a compiled input file.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_add_input_file) (const char *pathname);
-
-/* The linker's interface for adding a library that should be searched.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_add_input_library) (const char *libname);
-
-/* The linker's interface for adding a library path that should be searched.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_set_extra_library_path) (const char *path);
-
-/* The linker's interface for issuing a warning or error message.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_message) (int level, const char *format, ...);
-
-/* The linker's interface for retrieving the number of sections in an object.
-   The handle is obtained in the claim_file handler.  This interface should
-   only be invoked in the claim_file handler.   This function sets *COUNT to
-   the number of sections in the object.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_get_input_section_count) (const void* handle, unsigned int *count);
-
-/* The linker's interface for retrieving the section type of a specific
-   section in an object.  This interface should only be invoked in the
-   claim_file handler.  This function sets *TYPE to an ELF SHT_xxx value.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_get_input_section_type) (const struct ld_plugin_section section,
-                                     unsigned int *type);
-
-/* The linker's interface for retrieving the name of a specific section in
-   an object. This interface should only be invoked in the claim_file handler.
-   This function sets *SECTION_NAME_PTR to a null-terminated buffer allocated
-   by malloc.  The plugin must free *SECTION_NAME_PTR.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_get_input_section_name) (const struct ld_plugin_section section,
-                                     char **section_name_ptr);
-
-/* The linker's interface for retrieving the contents of a specific section
-   in an object.  This interface should only be invoked in the claim_file
-   handler.  This function sets *SECTION_CONTENTS to point to a buffer that is
-   valid until clam_file handler returns.  It sets *LEN to the size of the
-   buffer.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_get_input_section_contents) (const struct ld_plugin_section section,
-                                         const unsigned char **section_contents,
-                                         size_t* len);
-
-/* The linker's interface for specifying the desired order of sections.
-   The sections should be specifed using the array SECTION_LIST in the
-   order in which they should appear in the final layout.  NUM_SECTIONS
-   specifies the number of entries in each array.  This should be invoked
-   in the all_symbols_read handler.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_update_section_order) (const struct ld_plugin_section *section_list,
-				   unsigned int num_sections);
-
-/* The linker's interface for specifying that reordering of sections is
-   desired so that the linker can prepare for it.  This should be invoked
-   before update_section_order, preferably in the claim_file handler.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_allow_section_ordering) (void);
-
-/* The linker's interface for specifying that a subset of sections is
-   to be mapped to a unique segment.  If the plugin wants to call
-   unique_segment_for_sections, it must call this function from a
-   claim_file_handler or when it is first loaded.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_allow_unique_segment_for_sections) (void);
-
-/* The linker's interface for specifying that a specific set of sections
-   must be mapped to a unique segment.  ELF segments do not have names
-   and the NAME is used as the name of the newly created output section
-   that is then placed in the unique PT_LOAD segment.  FLAGS is used to
-   specify if any additional segment flags need to be set.  For instance,
-   a specific segment flag can be set to identify this segment.  Unsetting
-   segment flags that would be set by default is not possible.  The
-   parameter SEGMENT_ALIGNMENT when non-zero will override the default.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_unique_segment_for_sections) (
-    const char* segment_name,
-    uint64_t segment_flags,
-    uint64_t segment_alignment,
-    const struct ld_plugin_section * section_list,
-    unsigned int num_sections);
-
-enum ld_plugin_level
-{
-  LDPL_INFO,
-  LDPL_WARNING,
-  LDPL_ERROR,
-  LDPL_FATAL
-};
-
-/* Values for the tv_tag field of the transfer vector.  */
-
-enum ld_plugin_tag
-{
-  LDPT_NULL = 0,
-  LDPT_API_VERSION = 1,
-  LDPT_GOLD_VERSION = 2,
-  LDPT_LINKER_OUTPUT = 3,
-  LDPT_OPTION = 4,
-  LDPT_REGISTER_CLAIM_FILE_HOOK = 5,
-  LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK = 6,
-  LDPT_REGISTER_CLEANUP_HOOK = 7,
-  LDPT_ADD_SYMBOLS = 8,
-  LDPT_GET_SYMBOLS = 9,
-  LDPT_ADD_INPUT_FILE = 10,
-  LDPT_MESSAGE = 11,
-  LDPT_GET_INPUT_FILE = 12,
-  LDPT_RELEASE_INPUT_FILE = 13,
-  LDPT_ADD_INPUT_LIBRARY = 14,
-  LDPT_OUTPUT_NAME = 15,
-  LDPT_SET_EXTRA_LIBRARY_PATH = 16,
-  LDPT_GNU_LD_VERSION = 17,
-  LDPT_GET_VIEW = 18,
-  LDPT_GET_INPUT_SECTION_COUNT = 19,
-  LDPT_GET_INPUT_SECTION_TYPE = 20,
-  LDPT_GET_INPUT_SECTION_NAME = 21,
-  LDPT_GET_INPUT_SECTION_CONTENTS = 22,
-  LDPT_UPDATE_SECTION_ORDER = 23,
-  LDPT_ALLOW_SECTION_ORDERING = 24,
-  LDPT_GET_SYMBOLS_V2 = 25,
-  LDPT_ALLOW_UNIQUE_SEGMENT_FOR_SECTIONS = 26,
-  LDPT_UNIQUE_SEGMENT_FOR_SECTIONS = 27
-};
-
-/* The plugin transfer vector.  */
-
-struct ld_plugin_tv
-{
-  enum ld_plugin_tag tv_tag;
-  union
-  {
-    int tv_val;
-    const char *tv_string;
-    ld_plugin_register_claim_file tv_register_claim_file;
-    ld_plugin_register_all_symbols_read tv_register_all_symbols_read;
-    ld_plugin_register_cleanup tv_register_cleanup;
-    ld_plugin_add_symbols tv_add_symbols;
-    ld_plugin_get_symbols tv_get_symbols;
-    ld_plugin_add_input_file tv_add_input_file;
-    ld_plugin_message tv_message;
-    ld_plugin_get_input_file tv_get_input_file;
-    ld_plugin_get_view tv_get_view;
-    ld_plugin_release_input_file tv_release_input_file;
-    ld_plugin_add_input_library tv_add_input_library;
-    ld_plugin_set_extra_library_path tv_set_extra_library_path;
-    ld_plugin_get_input_section_count tv_get_input_section_count;
-    ld_plugin_get_input_section_type tv_get_input_section_type;
-    ld_plugin_get_input_section_name tv_get_input_section_name;
-    ld_plugin_get_input_section_contents tv_get_input_section_contents;
-    ld_plugin_update_section_order tv_update_section_order;
-    ld_plugin_allow_section_ordering tv_allow_section_ordering;
-    ld_plugin_allow_unique_segment_for_sections tv_allow_unique_segment_for_sections; 
-    ld_plugin_unique_segment_for_sections tv_unique_segment_for_sections;
-  } tv_u;
-};
-
-/* The plugin library's "onload" entry point.  */
-
-typedef
-enum ld_plugin_status
-(*ld_plugin_onload) (struct ld_plugin_tv *tv);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* !defined(PLUGIN_API_H) */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/plugin-version.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/plugin-version.h
deleted file mode 100644
index 5a92a6f..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/plugin-version.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#include "configargs.h"
-
-#define GCCPLUGIN_VERSION_MAJOR   4
-#define GCCPLUGIN_VERSION_MINOR   9
-#define GCCPLUGIN_VERSION_PATCHLEVEL   1
-#define GCCPLUGIN_VERSION  (GCCPLUGIN_VERSION_MAJOR*1000 + GCCPLUGIN_VERSION_MINOR)
-
-static char basever[] = "4.9.1";
-static char datestamp[] = "20140716";
-static char devphase[] = "";
-static char revision[] = "";
-
-/* FIXME plugins: We should make the version information more precise.
-   One way to do is to add a checksum. */
-
-static struct plugin_gcc_version gcc_version = {basever, datestamp,
-						devphase, revision,
-						configuration_arguments};
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/plugin.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/plugin.def
deleted file mode 100644
index df5d383..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/plugin.def
+++ /dev/null
@@ -1,106 +0,0 @@
-/* This file contains the definitions for plugin events in GCC.
-   Copyright (C) 2009-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-
-/* To hook into pass manager.  */
-DEFEVENT (PLUGIN_PASS_MANAGER_SETUP)
-
-/* After finishing parsing a type.  */
-DEFEVENT (PLUGIN_FINISH_TYPE)
-
-/* After finishing parsing a declaration. */
-DEFEVENT (PLUGIN_FINISH_DECL)
-
-/* Useful for summary processing.  */
-DEFEVENT (PLUGIN_FINISH_UNIT)
-
-/* Allows to see low level AST in C and C++ frontends. */
-DEFEVENT (PLUGIN_PRE_GENERICIZE)
-
-/* Called before GCC exits.  */
-DEFEVENT (PLUGIN_FINISH)
-
-/* Information about the plugin. */
-DEFEVENT (PLUGIN_INFO)
-
-/* Called at start of GCC Garbage Collection. */
-DEFEVENT (PLUGIN_GGC_START)
-
-/* Extend the GGC marking. */
-DEFEVENT (PLUGIN_GGC_MARKING)
-
-/* Called at end of GGC. */
-DEFEVENT (PLUGIN_GGC_END)
-
-/* Register an extra GGC root table. */
-DEFEVENT (PLUGIN_REGISTER_GGC_ROOTS)
-
-/* Register an extra GGC cache table. */
-DEFEVENT (PLUGIN_REGISTER_GGC_CACHES)
-
-/* Called during attribute registration.  */
-DEFEVENT (PLUGIN_ATTRIBUTES)
-
-/* Called before processing a translation unit.  */
-DEFEVENT (PLUGIN_START_UNIT)
-
-/* Called during pragma registration.  */
-DEFEVENT (PLUGIN_PRAGMAS)
-
-/* Called before first pass from all_passes.  */
-DEFEVENT (PLUGIN_ALL_PASSES_START)
-
-/* Called after last pass from all_passes.  */
-DEFEVENT (PLUGIN_ALL_PASSES_END)
-
-/* Called before first ipa pass.  */
-DEFEVENT (PLUGIN_ALL_IPA_PASSES_START)
-
-/* Called after last ipa pass.  */
-DEFEVENT (PLUGIN_ALL_IPA_PASSES_END)
-
-/* Allows to override pass gate decision for current_pass.  */
-DEFEVENT (PLUGIN_OVERRIDE_GATE)
-
-/* Called before executing a pass.  */
-DEFEVENT (PLUGIN_PASS_EXECUTION)
-
-/* Called before executing subpasses of a GIMPLE_PASS in
-   execute_ipa_pass_list.  */
-DEFEVENT (PLUGIN_EARLY_GIMPLE_PASSES_START)
-
-/* Called after executing subpasses of a GIMPLE_PASS in
-   execute_ipa_pass_list.  */
-DEFEVENT (PLUGIN_EARLY_GIMPLE_PASSES_END)
-
-/* Called when a pass is first instantiated.  */
-DEFEVENT (PLUGIN_NEW_PASS)
-
-/* Called when a file is #include-d or given via the #line directive.
-   this could happen many times.  The event data is the included file path,
-   as a const char* pointer.  */
-DEFEVENT (PLUGIN_INCLUDE_FILE)
-
-/* When adding a new hard-coded plugin event, don't forget to edit in
-   file plugin.c the functions register_callback and
-   invoke_plugin_callbacks_full accordingly!  */
-
-/* After the hard-coded events above, plugins can dynamically allocate events
-   at run time.
-   PLUGIN_EVENT_FIRST_DYNAMIC only appears as last enum element.  */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/plugin.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/plugin.h
deleted file mode 100644
index 8802183..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/plugin.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Header file for internal GCC plugin mechanism.
-   Copyright (C) 2009-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef PLUGIN_H
-#define PLUGIN_H
-
-#include "gcc-plugin.h"
-
-struct attribute_spec;
-struct scoped_attributes;
-
-extern void add_new_plugin (const char *);
-extern void parse_plugin_arg_opt (const char *);
-extern int invoke_plugin_callbacks_full (int, void *);
-extern void initialize_plugins (void);
-extern bool plugins_active_p (void);
-extern void dump_active_plugins (FILE *);
-extern void debug_active_plugins (void);
-extern void warn_if_plugins (void);
-extern void plugins_internal_error_function (diagnostic_context *,
-					     const char *, va_list *);
-extern void print_plugins_versions (FILE *file, const char *indent);
-extern void print_plugins_help (FILE *file, const char *indent);
-extern void finalize_plugins (void);
-
-extern bool flag_plugin_added;
-
-/* Called from inside GCC.  Invoke all plugin callbacks registered with
-   the specified event.
-   Return PLUGEVT_SUCCESS if at least one callback was called,
-   PLUGEVT_NO_CALLBACK if there was no callback.
-
-   EVENT    - the event identifier
-   GCC_DATA - event-specific data provided by the compiler  */
-
-static inline int
-invoke_plugin_callbacks (int event ATTRIBUTE_UNUSED,
-			 void *gcc_data ATTRIBUTE_UNUSED)
-{
-#ifdef ENABLE_PLUGIN
-  /* True iff at least one plugin has been added.  */
-  if (flag_plugin_added)
-    return invoke_plugin_callbacks_full (event, gcc_data);
-#endif
-
-  return PLUGEVT_NO_CALLBACK;
-}
-
-/* In attribs.c.  */
-
-extern void register_attribute (const struct attribute_spec *attr);
-extern struct scoped_attributes* register_scoped_attributes (const struct attribute_spec *,
-							     const char *);
-
-#endif /* PLUGIN_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/pointer-set.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/pointer-set.h
deleted file mode 100644
index a426534..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/pointer-set.h
+++ /dev/null
@@ -1,170 +0,0 @@
-/* Set operations on pointers
-   Copyright (C) 2004-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef POINTER_SET_H
-#define POINTER_SET_H
-
-
-/* A pointer set is represented as a simple open-addressing hash
-   table.  Simplifications: The hash code is based on the value of the
-   pointer, not what it points to.  The number of buckets is always a
-   power of 2.  Null pointers are a reserved value.  Deletion is not
-   supported (yet).  There is no mechanism for user control of hash
-   function, equality comparison, initial size, or resizing policy.  */
-
-struct pointer_set_t
-{
-  size_t log_slots;
-  size_t n_slots;		/* n_slots = 2^log_slots */
-  size_t n_elements;
-  const void **slots;
-};
-
-struct pointer_set_t *pointer_set_create (void);
-void pointer_set_destroy (struct pointer_set_t *pset);
-int pointer_set_contains (const struct pointer_set_t *pset, const void *p);
-int pointer_set_insert (struct pointer_set_t *pset, const void *p);
-void pointer_set_traverse (const struct pointer_set_t *,
-			   bool (*) (const void *, void *),
-			   void *);
-bool pointer_set_lookup (const pointer_set_t *, const void *, size_t *);
-
-/* A pointer map is represented the same way as a pointer_set, so
-   the hash code is based on the address of the key, rather than
-   its contents.  Null keys are a reserved value.  Deletion is not
-   supported (yet).  There is no mechanism for user control of hash
-   function, equality comparison, initial size, or resizing policy.  */
-
-template <typename T>
-class pointer_map : protected pointer_set_t
-{
-  T *values;
-
-public:
-  pointer_map ();
-  ~pointer_map ();
-  T *contains (const void *p);
-  T *insert (const void *p, bool *existed_p = NULL);
-  void traverse (bool (*fn) (const void *, T *, void *), void *data);
-};
-
-/* Allocate an empty pointer map.  */
-template <typename T>
-pointer_map<T>::pointer_map (void)
-{
-  n_elements = 0;
-  log_slots = 8;
-  n_slots = (size_t) 1 << log_slots;
-
-  slots = XCNEWVEC (const void *, n_slots);
-  values = XNEWVEC (T, n_slots);
-}
-
-/* Reclaims all memory associated with PMAP.  */
-template <typename T>
-pointer_map<T>::~pointer_map (void)
-{
-  XDELETEVEC (slots);
-  XDELETEVEC (values);
-}
-
-/* Returns a pointer to the value to which P maps, if PMAP contains P.  P
-   must be nonnull.  Return NULL if PMAP does not contain P.
-
-   Collisions are resolved by linear probing.  */
-template <typename T>
-T *
-pointer_map<T>::contains (const void *p)
-{
-  size_t n;
-  if (!pointer_set_lookup (this, p, &n))
-    return NULL;
-  return &values[n];
-}
-
-/* Inserts P into PMAP if it wasn't already there.  Returns a pointer
-   to the value.  P must be nonnull.  */
-template <typename T>
-T *
-pointer_map<T>::insert (const void *p, bool *existed_p)
-{
-  size_t n;
-
-  /* For simplicity, expand the map even if P is already there.  This can be
-     superfluous but can happen at most once.  */
-  /* ???  Fugly that we have to inline that here.  */
-  if (n_elements > n_slots / 4)
-    {
-      size_t old_n_slots = n_slots;
-      const void **old_keys = slots;
-      T *old_values = values;
-      log_slots = log_slots + 1;
-      n_slots = n_slots * 2;
-      slots = XCNEWVEC (const void *, n_slots);
-      values = XNEWVEC (T, n_slots);
-      for (size_t i = 0; i < old_n_slots; ++i)
-	if (old_keys[i])
-	  {
-	    const void *key = old_keys[i];
-	    pointer_set_lookup (this, key, &n);
-	    slots[n] = key;
-	    values[n] = old_values[i];
-	  }
-      XDELETEVEC (old_keys);
-      XDELETEVEC (old_values);
-    }
-
-  if (!pointer_set_lookup (this, p, &n))
-    {
-      ++n_elements;
-      slots[n] = p;
-      if (existed_p)
-	*existed_p = false;
-    }
-  else if (existed_p)
-    *existed_p = true;
-
-  return &values[n];
-}
-
-/* Pass each pointer in PMAP to the function in FN, together with the pointer
-   to the value and the fixed parameter DATA.  If FN returns false, the
-   iteration stops.  */
-
-template <class T>
-void
-pointer_map<T>::traverse (bool (*fn) (const void *, T *, void *), void *data)
-{
-  for (size_t i = 0; i < n_slots; ++i)
-    if (slots[i] && !fn (slots[i], &values[i], data))
-      break;
-}
-
-
-struct pointer_map_t;
-pointer_map_t *pointer_map_create (void);
-void pointer_map_destroy (pointer_map_t *pmap);
-
-void **pointer_map_contains (const pointer_map_t *pmap, const void *p);
-void **pointer_map_insert (pointer_map_t *pmap, const void *p);
-void pointer_map_traverse (const pointer_map_t *,
-			   bool (*) (const void *, void **, void *), void *);
-
-
-#endif  /* POINTER_SET_H  */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/predict.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/predict.def
deleted file mode 100644
index 145330c..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/predict.def
+++ /dev/null
@@ -1,178 +0,0 @@
-/* Definitions for the branch prediction routines in the GNU compiler.
-   Copyright (C) 2001-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* Before including this file, you should define a macro:
-
-     DEF_PREDICTOR (ENUM, NAME, HITRATE)
-
-   This macro will be called once for each predictor.  The ENUM will
-   be of type `enum predictor', and will enumerate all supported
-   predictors.  The order of DEF_PREDICTOR calls is important, as
-   in the first match combining heuristics, the predictor appearing
-   first in this file will win.
-
-   NAME is used in the debugging output to determine predictor type.
-
-   HITRATE is the probability that edge predicted by predictor as taken
-   will be really taken (so it should be always above
-   REG_BR_PROB_BASE / 2).  */
-
-
-/* A value used as final outcome of all heuristics.  */
-DEF_PREDICTOR (PRED_COMBINED, "combined", PROB_ALWAYS, 0)
-
-/* An outcome estimated by Dempster-Shaffer theory.  */
-DEF_PREDICTOR (PRED_DS_THEORY, "DS theory", PROB_ALWAYS, 0)
-
-/* A combined heuristics using probability determined by first
-   matching heuristics from this list.  */
-DEF_PREDICTOR (PRED_FIRST_MATCH, "first match", PROB_ALWAYS, 0)
-
-/* Heuristic applying when no heuristic below applies.  */
-DEF_PREDICTOR (PRED_NO_PREDICTION, "no prediction", PROB_ALWAYS, 0)
-
-/* Mark unconditional jump as taken.  */
-DEF_PREDICTOR (PRED_UNCONDITIONAL, "unconditional jump", PROB_ALWAYS,
-	       PRED_FLAG_FIRST_MATCH)
-
-/* Use number of loop iterations determined by # of iterations
-   analysis to set probability.  We don't want to use Dempster-Shaffer
-   theory here, as the predictions is exact.  */
-DEF_PREDICTOR (PRED_LOOP_ITERATIONS, "loop iterations", PROB_ALWAYS,
-	       PRED_FLAG_FIRST_MATCH)
-
-/* Assume that any given atomic operation has low contention,
-   and thus the compare-and-swap operation succeeds. */
-DEF_PREDICTOR (PRED_COMPARE_AND_SWAP, "compare and swap", PROB_VERY_LIKELY,
-	       PRED_FLAG_FIRST_MATCH)
-
-/* Hints dropped by user via __builtin_expect feature.  Note: the
-   probability of PROB_VERY_LIKELY is now overwritten by param
-   builtin_expect_probability with a default value of HITRATE(90).
-   Refer to param.def for details.  */
-DEF_PREDICTOR (PRED_BUILTIN_EXPECT, "__builtin_expect", PROB_VERY_LIKELY,
-	       PRED_FLAG_FIRST_MATCH)
-
-/* Use number of loop iterations guessed by the contents of the loop.  */
-DEF_PREDICTOR (PRED_LOOP_ITERATIONS_GUESSED, "guessed loop iterations",
-	       PROB_ALWAYS, PRED_FLAG_FIRST_MATCH)
-
-/* Branch containing goto is probably not taken.  */
-DEF_PREDICTOR (PRED_CONTINUE, "continue", HITRATE (50), 0)
-
-/* Branch to basic block containing call marked by noreturn attribute.  */
-DEF_PREDICTOR (PRED_NORETURN, "noreturn call", PROB_VERY_LIKELY,
-	       PRED_FLAG_FIRST_MATCH)
-
-/* Branch to basic block containing call marked by cold function attribute.  */
-DEF_PREDICTOR (PRED_COLD_FUNCTION, "cold function call", PROB_VERY_LIKELY,
-	       PRED_FLAG_FIRST_MATCH)
-
-/* Loopback edge is taken.  */
-DEF_PREDICTOR (PRED_LOOP_BRANCH, "loop branch", HITRATE (86),
-	       PRED_FLAG_FIRST_MATCH)
-
-/* Edge causing loop to terminate is probably not taken.  */
-DEF_PREDICTOR (PRED_LOOP_EXIT, "loop exit", HITRATE (91),
-	       PRED_FLAG_FIRST_MATCH)
-
-/* Pointers are usually not NULL.  */
-DEF_PREDICTOR (PRED_POINTER, "pointer", HITRATE (85), 0)
-DEF_PREDICTOR (PRED_TREE_POINTER, "pointer (on trees)", HITRATE (85), 0)
-
-/* NE is probable, EQ not etc...  */
-DEF_PREDICTOR (PRED_OPCODE_POSITIVE, "opcode values positive", HITRATE (79), 0)
-DEF_PREDICTOR (PRED_OPCODE_NONEQUAL, "opcode values nonequal", HITRATE (71), 0)
-DEF_PREDICTOR (PRED_FPOPCODE, "fp_opcode", HITRATE (90), 0)
-DEF_PREDICTOR (PRED_TREE_OPCODE_POSITIVE, "opcode values positive (on trees)", HITRATE (73), 0)
-DEF_PREDICTOR (PRED_TREE_OPCODE_NONEQUAL, "opcode values nonequal (on trees)", HITRATE (72), 0)
-DEF_PREDICTOR (PRED_TREE_FPOPCODE, "fp_opcode (on trees)", HITRATE (90), 0)
-
-/* Branch guarding call is probably taken.  */
-DEF_PREDICTOR (PRED_CALL, "call", HITRATE (71), 0)
-
-/* Branch causing function to terminate is probably not taken.  */
-DEF_PREDICTOR (PRED_TREE_EARLY_RETURN, "early return (on trees)", HITRATE (61), 0)
-
-/* Branch containing goto is probably not taken.  */
-DEF_PREDICTOR (PRED_GOTO, "goto", HITRATE (70), 0)
-
-/* Branch ending with return constant is probably not taken.  */
-DEF_PREDICTOR (PRED_CONST_RETURN, "const return", HITRATE (67), 0)
-
-/* Branch ending with return negative constant is probably not taken.  */
-DEF_PREDICTOR (PRED_NEGATIVE_RETURN, "negative return", HITRATE (96), 0)
-
-/* Branch ending with return; is probably not taken */
-DEF_PREDICTOR (PRED_NULL_RETURN, "null return", HITRATE (90), 0)
-
-/* Branches to compare induction variable to a loop bound is
-   extremely likely.  */
-DEF_PREDICTOR (PRED_LOOP_IV_COMPARE_GUESS, "guess loop iv compare",
-	       PROB_VERY_LIKELY, 0)
-
-/* Use number of loop iterations determined by # of iterations analysis
-   to set probability of branches that compares IV to loop bound variable.  */
-DEF_PREDICTOR (PRED_LOOP_IV_COMPARE, "loop iv compare", PROB_VERY_LIKELY,
-	       PRED_FLAG_FIRST_MATCH)
-
-/* Branches to hot labels are likely.  */
-DEF_PREDICTOR (PRED_HOT_LABEL, "hot label", HITRATE (85), 0)
-
-/* Branches to cold labels are extremely unlikely.  */
-DEF_PREDICTOR (PRED_COLD_LABEL, "cold label", PROB_VERY_LIKELY,
-	       PRED_FLAG_FIRST_MATCH)
-
-
-/* The following predictors are used in Fortran. */
-
-/* Branch leading to an integer overflow are extremely unlikely.  */
-DEF_PREDICTOR (PRED_FORTRAN_OVERFLOW, "overflow", PROB_ALWAYS,
-	       PRED_FLAG_FIRST_MATCH)
-
-/* Branch leading to a failure status are unlikely.  This can occur for out
-   of memory or when trying to allocate an already allocated allocated or
-   deallocating an already deallocated allocatable.  This predictor only
-   occurs when the user explicitly asked for a return status.  By default,
-   the code aborts, which is handled via PRED_NORETURN.  */
-DEF_PREDICTOR (PRED_FORTRAN_FAIL_ALLOC, "fail alloc", PROB_VERY_LIKELY, 0)
-
-/* Branch leading to an I/O failure status are unlikely.  This predictor is
-   used for I/O failures such as for invalid unit numbers.  This predictor
-   only occurs when the user explicitly asked for a return status.  By default,
-   the code aborts, which is handled via PRED_NORETURN.  */
-DEF_PREDICTOR (PRED_FORTRAN_FAIL_IO, "fail alloc", HITRATE(85), 0)
-
-/* Branch leading to a run-time warning message which is printed only once
-   are unlikely.  The print-warning branch itself can be likely or unlikely.  */
-DEF_PREDICTOR (PRED_FORTRAN_WARN_ONCE, "warn once", HITRATE (75), 0)
-
-/* Branch belonging to a zero-sized array.  */
-DEF_PREDICTOR (PRED_FORTRAN_SIZE_ZERO, "zero-sized array", HITRATE(70), 0)
-
-/* Branch belonging to an invalid bound index, in a context where it is
-   standard conform and well defined but rather pointless and, hence, rather
-   unlikely to occur.  */
-DEF_PREDICTOR (PRED_FORTRAN_INVALID_BOUND, "zero-sized array", HITRATE(90), 0)
-
-/* Branch belonging to the handling of absent optional arguments.  This
-   predictor is used when an optional dummy argument, associated with an
-   absent argument, is passed on as actual argument to another procedure,
-   which in turn has an optional argument.  */
-DEF_PREDICTOR (PRED_FORTRAN_ABSENT_DUMMY, "absent dummy", HITRATE(60), 0)
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/predict.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/predict.h
deleted file mode 100644
index 1555f80..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/predict.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Definitions for branch prediction routines in the GNU compiler.
-   Copyright (C) 2001-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_PREDICT_H
-#define GCC_PREDICT_H
-
-/* Random guesstimation given names.
-   PROB_VERY_UNLIKELY should be small enough so basic block predicted
-   by it gets below HOT_BB_FREQUENCY_FRACTION.  */
-#define PROB_VERY_UNLIKELY	(REG_BR_PROB_BASE / 2000 - 1)
-#define PROB_EVEN		(REG_BR_PROB_BASE / 2)
-#define PROB_VERY_LIKELY	(REG_BR_PROB_BASE - PROB_VERY_UNLIKELY)
-#define PROB_ALWAYS		(REG_BR_PROB_BASE)
-#define PROB_UNLIKELY           (REG_BR_PROB_BASE / 5 - 1)
-#define PROB_LIKELY             (REG_BR_PROB_BASE - PROB_UNLIKELY)
-
-#define DEF_PREDICTOR(ENUM, NAME, HITRATE, FLAGS) ENUM,
-enum br_predictor
-{
-#include "predict.def"
-
-  /* Upper bound on non-language-specific builtins.  */
-  END_PREDICTORS
-};
-#undef DEF_PREDICTOR
-enum prediction
-{
-   NOT_TAKEN,
-   TAKEN
-};
-
-extern void predict_insn_def (rtx, enum br_predictor, enum prediction);
-extern int counts_to_freqs (void);
-extern void handle_missing_profiles (void);
-extern void estimate_bb_frequencies (bool);
-extern const char *predictor_name (enum br_predictor);
-extern tree build_predict_expr (enum br_predictor, enum prediction);
-extern void tree_estimate_probability (void);
-extern void compute_function_frequency (void);
-extern void rebuild_frequencies (void);
-
-#endif  /* GCC_PREDICT_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/prefix.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/prefix.h
deleted file mode 100644
index 97bbac6..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/prefix.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Provide prototypes for functions exported from prefix.c.
-   Copyright (C) 1999-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU Library General Public License as published by
-the Free Software Foundation; either version 3 of the License, or (at
-your option) any later version.
-
-GCC 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-
-#ifndef GCC_PREFIX_H
-#define GCC_PREFIX_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* These functions are called by the Ada frontend with C convention.  */
-
-/* Update PATH using KEY if PATH starts with PREFIX.  The returned
-   string is always malloc-ed, and the caller is responsible for
-   freeing it.  */
-extern char *update_path (const char *path, const char *key);
-extern void set_std_prefix (const char *, int);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* ! GCC_PREFIX_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/pretty-print.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/pretty-print.h
deleted file mode 100644
index 247b25c..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/pretty-print.h
+++ /dev/null
@@ -1,338 +0,0 @@
-/* Various declarations for language-independent pretty-print subroutines.
-   Copyright (C) 2002-2014 Free Software Foundation, Inc.
-   Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_PRETTY_PRINT_H
-#define GCC_PRETTY_PRINT_H
-
-#include "obstack.h"
-#include "input.h"
-
-/* Maximum number of format string arguments.  */
-#define PP_NL_ARGMAX   30
-
-/* The type of a text to be formatted according a format specification
-   along with a list of things.  */
-struct text_info
-{
-  const char *format_spec;
-  va_list *args_ptr;
-  int err_no;  /* for %m */
-  location_t *locus;
-  void **x_data;
-};
-
-/* How often diagnostics are prefixed by their locations:
-   o DIAGNOSTICS_SHOW_PREFIX_NEVER: never - not yet supported;
-   o DIAGNOSTICS_SHOW_PREFIX_ONCE: emit only once;
-   o DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE: emit each time a physical
-   line is started.  */
-enum diagnostic_prefixing_rule_t
-{
-  DIAGNOSTICS_SHOW_PREFIX_ONCE       = 0x0,
-  DIAGNOSTICS_SHOW_PREFIX_NEVER      = 0x1,
-  DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE = 0x2
-};
-
-/* The chunk_info data structure forms a stack of the results from the
-   first phase of formatting (pp_format) which have not yet been
-   output (pp_output_formatted_text).  A stack is necessary because
-   the diagnostic starter may decide to generate its own output by way
-   of the formatter.  */
-struct chunk_info
-{
-  /* Pointer to previous chunk on the stack.  */
-  struct chunk_info *prev;
-
-  /* Array of chunks to output.  Each chunk is a NUL-terminated string.
-     In the first phase of formatting, even-numbered chunks are
-     to be output verbatim, odd-numbered chunks are format specifiers.
-     The second phase replaces all odd-numbered chunks with formatted
-     text, and the third phase simply emits all the chunks in sequence
-     with appropriate line-wrapping.  */
-  const char *args[PP_NL_ARGMAX * 2];
-};
-
-/* The output buffer datatype.  This is best seen as an abstract datatype
-   whose fields should not be accessed directly by clients.  */
-struct output_buffer
-{
-  output_buffer ();
-  ~output_buffer ();
-
-  /* Obstack where the text is built up.  */
-  struct obstack formatted_obstack;
-
-  /* Obstack containing a chunked representation of the format
-     specification plus arguments.  */
-  struct obstack chunk_obstack;
-
-  /* Currently active obstack: one of the above two.  This is used so
-     that the text formatters don't need to know which phase we're in.  */
-  struct obstack *obstack;
-
-  /* Stack of chunk arrays.  These come from the chunk_obstack.  */
-  struct chunk_info *cur_chunk_array;
-
-  /* Where to output formatted text.  */
-  FILE *stream;
-
-  /* The amount of characters output so far.  */
-  int line_length;
-
-  /* This must be large enough to hold any printed integer or
-     floating-point value.  */
-  char digit_buffer[128];
-};
-
-/* The type of pretty-printer flags passed to clients.  */
-typedef unsigned int pp_flags;
-
-enum pp_padding
-{
-  pp_none, pp_before, pp_after
-};
-
-/* Structure for switching in and out of verbatim mode in a convenient
-   manner.  */
-struct pp_wrapping_mode_t
-{
-  /* Current prefixing rule.  */
-  diagnostic_prefixing_rule_t rule;
-
-  /* The ideal upper bound of number of characters per line, as suggested
-     by front-end.  */
-  int line_cutoff;
-};
-
-/* Maximum characters per line in automatic line wrapping mode.
-   Zero means don't wrap lines.  */
-#define pp_line_cutoff(PP)  (PP)->wrapping.line_cutoff
-
-/* Prefixing rule used in formatting a diagnostic message.  */
-#define pp_prefixing_rule(PP)  (PP)->wrapping.rule
-
-/* Get or set the wrapping mode as a single entity.  */
-#define pp_wrapping_mode(PP) (PP)->wrapping
-
-/* The type of a hook that formats client-specific data onto a pretty_pinter.
-   A client-supplied formatter returns true if everything goes well,
-   otherwise it returns false.  */
-typedef bool (*printer_fn) (pretty_printer *, text_info *, const char *,
-			    int, bool, bool, bool);
-
-/* Client supplied function used to decode formats.  */
-#define pp_format_decoder(PP) (PP)->format_decoder
-
-/* TRUE if a newline character needs to be added before further
-   formatting.  */
-#define pp_needs_newline(PP)  (PP)->need_newline
-
-/* True if PRETTY-PRINTER is in line-wrapping mode.  */
-#define pp_is_wrapping_line(PP) (pp_line_cutoff (PP) > 0)
-
-/* The amount of whitespace to be emitted when starting a new line.  */
-#define pp_indentation(PP) (PP)->indent_skip
-
-/* True if identifiers are translated to the locale character set on
-   output.  */
-#define pp_translate_identifiers(PP) (PP)->translate_identifiers
-
-/* True if colors should be shown.  */
-#define pp_show_color(PP) (PP)->show_color
-
-/* The data structure that contains the bare minimum required to do
-   proper pretty-printing.  Clients may derived from this structure
-   and add additional fields they need.  */
-struct pretty_printer
-{
-  // Default construct a pretty printer with specified prefix
-  // and a maximum line length cut off limit.
-  explicit pretty_printer (const char* = NULL, int = 0);
-
-  virtual ~pretty_printer ();
-
-  /* Where we print external representation of ENTITY.  */
-  output_buffer *buffer;
-
-  /* The prefix for each new line.  */
-  const char *prefix;
-
-  /* Where to put whitespace around the entity being formatted.  */
-  pp_padding padding;
-
-  /* The real upper bound of number of characters per line, taking into
-     account the case of a very very looong prefix.  */
-  int maximum_length;
-
-  /* Indentation count.  */
-  int indent_skip;
-
-  /* Current wrapping mode.  */
-  pp_wrapping_mode_t wrapping;
-
-  /* If non-NULL, this function formats a TEXT into the BUFFER.  When called,
-     TEXT->format_spec points to a format code.  FORMAT_DECODER should call
-     pp_string (and related functions) to add data to the BUFFER.
-     FORMAT_DECODER can read arguments from *TEXT->args_pts using VA_ARG.
-     If the BUFFER needs additional characters from the format string, it
-     should advance the TEXT->format_spec as it goes.  When FORMAT_DECODER
-     returns, TEXT->format_spec should point to the last character processed.
-  */
-  printer_fn format_decoder;
-
-  /* Nonzero if current PREFIX was emitted at least once.  */
-  bool emitted_prefix;
-
-  /* Nonzero means one should emit a newline before outputting anything.  */
-  bool need_newline;
-
-  /* Nonzero means identifiers are translated to the locale character
-     set on output.  */
-  bool translate_identifiers;
-
-  /* Nonzero means that text should be colorized.  */
-  bool show_color;
-};
-
-static inline const char *
-pp_get_prefix (const pretty_printer *pp) { return pp->prefix; }
-
-#define pp_space(PP)            pp_character (PP, ' ')
-#define pp_left_paren(PP)       pp_character (PP, '(')
-#define pp_right_paren(PP)      pp_character (PP, ')')
-#define pp_left_bracket(PP)     pp_character (PP, '[')
-#define pp_right_bracket(PP)    pp_character (PP, ']')
-#define pp_left_brace(PP)       pp_character (PP, '{')
-#define pp_right_brace(PP)      pp_character (PP, '}')
-#define pp_semicolon(PP)        pp_character (PP, ';')
-#define pp_comma(PP)            pp_character (PP, ',')
-#define pp_dot(PP)              pp_character (PP, '.')
-#define pp_colon(PP)            pp_character (PP, ':')
-#define pp_colon_colon(PP)      pp_string (PP, "::")
-#define pp_arrow(PP)            pp_string (PP, "->")
-#define pp_equal(PP)            pp_character (PP, '=')
-#define pp_question(PP)         pp_character (PP, '?')
-#define pp_bar(PP)              pp_character (PP, '|')
-#define pp_bar_bar(PP)          pp_string (PP, "||")
-#define pp_carret(PP)           pp_character (PP, '^')
-#define pp_ampersand(PP)        pp_character (PP, '&')
-#define pp_ampersand_ampersand(PP) pp_string (PP, "&&")
-#define pp_less(PP)             pp_character (PP, '<')
-#define pp_less_equal(PP)       pp_string (PP, "<=")
-#define pp_greater(PP)          pp_character (PP, '>')
-#define pp_greater_equal(PP)    pp_string (PP, ">=")
-#define pp_plus(PP)             pp_character (PP, '+')
-#define pp_minus(PP)            pp_character (PP, '-')
-#define pp_star(PP)             pp_character (PP, '*')
-#define pp_slash(PP)            pp_character (PP, '/')
-#define pp_modulo(PP)           pp_character (PP, '%')
-#define pp_exclamation(PP)      pp_character (PP, '!')
-#define pp_complement(PP)       pp_character (PP, '~')
-#define pp_quote(PP)            pp_character (PP, '\'')
-#define pp_backquote(PP)        pp_character (PP, '`')
-#define pp_doublequote(PP)      pp_character (PP, '"')
-#define pp_underscore(PP)       pp_character (PP, '_')
-#define pp_maybe_newline_and_indent(PP, N) \
-  if (pp_needs_newline (PP)) pp_newline_and_indent (PP, N)
-#define pp_scalar(PP, FORMAT, SCALAR)	                      \
-  do					        	      \
-    {			         			      \
-      sprintf (pp_buffer (PP)->digit_buffer, FORMAT, SCALAR); \
-      pp_string (PP, pp_buffer (PP)->digit_buffer);           \
-    }						              \
-  while (0)
-#define pp_decimal_int(PP, I)  pp_scalar (PP, "%d", I)
-#define pp_unsigned_wide_integer(PP, I) \
-   pp_scalar (PP, HOST_WIDE_INT_PRINT_UNSIGNED, (unsigned HOST_WIDE_INT) I)
-#define pp_wide_integer(PP, I) \
-   pp_scalar (PP, HOST_WIDE_INT_PRINT_DEC, (HOST_WIDE_INT) I)
-#define pp_widest_integer(PP, I) \
-   pp_scalar (PP, HOST_WIDEST_INT_PRINT_DEC, (HOST_WIDEST_INT) I)
-#define pp_pointer(PP, P)      pp_scalar (PP, "%p", P)
-
-#define pp_identifier(PP, ID)  pp_string (PP, (pp_translate_identifiers (PP) \
-					  ? identifier_to_locale (ID)	\
-					  : (ID)))
-
-
-#define pp_buffer(PP) (PP)->buffer
-
-extern void pp_set_line_maximum_length (pretty_printer *, int);
-extern void pp_set_prefix (pretty_printer *, const char *);
-extern void pp_destroy_prefix (pretty_printer *);
-extern int pp_remaining_character_count_for_line (pretty_printer *);
-extern void pp_clear_output_area (pretty_printer *);
-extern const char *pp_formatted_text (pretty_printer *);
-extern const char *pp_last_position_in_text (const pretty_printer *);
-extern void pp_emit_prefix (pretty_printer *);
-extern void pp_append_text (pretty_printer *, const char *, const char *);
-extern void pp_newline_and_flush (pretty_printer *);
-extern void pp_newline_and_indent (pretty_printer *, int);
-extern void pp_separate_with (pretty_printer *, char);
-
-/* If we haven't already defined a front-end-specific diagnostics
-   style, use the generic one.  */
-#ifdef GCC_DIAG_STYLE
-#define GCC_PPDIAG_STYLE GCC_DIAG_STYLE
-#else
-#define GCC_PPDIAG_STYLE __gcc_diag__
-#endif
-
-/* This header may be included before diagnostics-core.h, hence the duplicate
-   definitions to allow for GCC-specific formats.  */
-#if GCC_VERSION >= 3005
-#define ATTRIBUTE_GCC_PPDIAG(m, n) __attribute__ ((__format__ (GCC_PPDIAG_STYLE, m ,n))) ATTRIBUTE_NONNULL(m)
-#else
-#define ATTRIBUTE_GCC_PPDIAG(m, n) ATTRIBUTE_NONNULL(m)
-#endif
-extern void pp_printf (pretty_printer *, const char *, ...)
-     ATTRIBUTE_GCC_PPDIAG(2,3);
-
-extern void pp_verbatim (pretty_printer *, const char *, ...)
-     ATTRIBUTE_GCC_PPDIAG(2,3);
-extern void pp_flush (pretty_printer *);
-extern void pp_format (pretty_printer *, text_info *);
-extern void pp_output_formatted_text (pretty_printer *);
-extern void pp_format_verbatim (pretty_printer *, text_info *);
-
-extern void pp_indent (pretty_printer *);
-extern void pp_newline (pretty_printer *);
-extern void pp_character (pretty_printer *, int);
-extern void pp_string (pretty_printer *, const char *);
-extern void pp_write_text_to_stream (pretty_printer *);
-extern void pp_write_text_as_dot_label_to_stream (pretty_printer *, bool);
-extern void pp_maybe_space (pretty_printer *);
-
-/* Switch into verbatim mode and return the old mode.  */
-static inline pp_wrapping_mode_t
-pp_set_verbatim_wrapping_ (pretty_printer *pp)
-{
-  pp_wrapping_mode_t oldmode = pp_wrapping_mode (pp);
-  pp_line_cutoff (pp) = 0;
-  pp_prefixing_rule (pp) = DIAGNOSTICS_SHOW_PREFIX_NEVER;
-  return oldmode;
-}
-#define pp_set_verbatim_wrapping(PP) pp_set_verbatim_wrapping_ (PP)
-
-extern const char *identifier_to_locale (const char *);
-extern void *(*identifier_to_locale_alloc) (size_t);
-extern void (*identifier_to_locale_free) (void *);
-
-#endif /* GCC_PRETTY_PRINT_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/print-rtl.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/print-rtl.h
deleted file mode 100644
index 28293d3..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/print-rtl.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Print RTL for GCC.
-   Copyright (C) 1987-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_PRINT_RTL_H
-#define GCC_PRINT_RTL_H
-
-#ifdef BUFSIZ
-extern void print_rtl (FILE *, const_rtx);
-#endif
-
-#endif  // GCC_PRINT_RTL_H
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/print-tree.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/print-tree.h
deleted file mode 100644
index 873e207..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/print-tree.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Declarations for printing trees in human readable form
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_PRINT_TREE_H
-#define GCC_PRINT_TREE_H
-
-extern void debug_tree (tree);
-extern void debug_raw (const tree_node &ref);
-extern void debug_raw (const tree_node *ptr);
-extern void debug (const tree_node &ref);
-extern void debug (const tree_node *ptr);
-extern void debug_verbose (const tree_node &ref);
-extern void debug_verbose (const tree_node *ptr);
-extern void debug_head (const tree_node &ref);
-extern void debug_head (const tree_node *ptr);
-extern void debug_body (const tree_node &ref);
-extern void debug_body (const tree_node *ptr);
-extern void debug_vec_tree (vec<tree, va_gc> *);
-extern void debug (vec<tree, va_gc> &ref);
-extern void debug (vec<tree, va_gc> *ptr);
-extern void debug_raw (vec<tree, va_gc> &ref);
-extern void debug_raw (vec<tree, va_gc> *ptr);
-#ifdef BUFSIZ
-extern void dump_addr (FILE*, const char *, const void *);
-extern void print_node (FILE *, const char *, tree, int);
-extern void print_node_brief (FILE *, const char *, const_tree, int);
-extern void indent_to (FILE *, int);
-#endif
-
-#endif  // GCC_PRINT_TREE_H
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/real.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/real.h
deleted file mode 100644
index ff0c523..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/real.h
+++ /dev/null
@@ -1,488 +0,0 @@
-/* Definitions of floating-point access for GNU compiler.
-   Copyright (C) 1989-2014 Free Software Foundation, Inc.
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify it under
-   the terms of the GNU General Public License as published by the Free
-   Software Foundation; either version 3, or (at your option) any later
-   version.
-
-   GCC 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 General Public License
-   for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with GCC; see the file COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_REAL_H
-#define GCC_REAL_H
-
-#include "machmode.h"
-
-/* An expanded form of the represented number.  */
-
-/* Enumerate the special cases of numbers that we encounter.  */
-enum real_value_class {
-  rvc_zero,
-  rvc_normal,
-  rvc_inf,
-  rvc_nan
-};
-
-#define SIGNIFICAND_BITS	(128 + HOST_BITS_PER_LONG)
-#define EXP_BITS		(32 - 6)
-#define MAX_EXP			((1 << (EXP_BITS - 1)) - 1)
-#define SIGSZ			(SIGNIFICAND_BITS / HOST_BITS_PER_LONG)
-#define SIG_MSB			((unsigned long)1 << (HOST_BITS_PER_LONG - 1))
-
-struct GTY(()) real_value {
-  /* Use the same underlying type for all bit-fields, so as to make
-     sure they're packed together, otherwise REAL_VALUE_TYPE_SIZE will
-     be miscomputed.  */
-  unsigned int /* ENUM_BITFIELD (real_value_class) */ cl : 2;
-  unsigned int decimal : 1;
-  unsigned int sign : 1;
-  unsigned int signalling : 1;
-  unsigned int canonical : 1;
-  unsigned int uexp : EXP_BITS;
-  unsigned long sig[SIGSZ];
-};
-
-#define REAL_EXP(REAL) \
-  ((int)((REAL)->uexp ^ (unsigned int)(1 << (EXP_BITS - 1))) \
-   - (1 << (EXP_BITS - 1)))
-#define SET_REAL_EXP(REAL, EXP) \
-  ((REAL)->uexp = ((unsigned int)(EXP) & (unsigned int)((1 << EXP_BITS) - 1)))
-
-/* Various headers condition prototypes on #ifdef REAL_VALUE_TYPE, so it
-   needs to be a macro.  We do need to continue to have a structure tag
-   so that other headers can forward declare it.  */
-#define REAL_VALUE_TYPE struct real_value
-
-/* We store a REAL_VALUE_TYPE into an rtx, and we do this by putting it in
-   consecutive "w" slots.  Moreover, we've got to compute the number of "w"
-   slots at preprocessor time, which means we can't use sizeof.  Guess.  */
-
-#define REAL_VALUE_TYPE_SIZE (SIGNIFICAND_BITS + 32)
-#define REAL_WIDTH \
-  (REAL_VALUE_TYPE_SIZE/HOST_BITS_PER_WIDE_INT \
-   + (REAL_VALUE_TYPE_SIZE%HOST_BITS_PER_WIDE_INT ? 1 : 0)) /* round up */
-
-/* Verify the guess.  */
-extern char test_real_width
-  [sizeof (REAL_VALUE_TYPE) <= REAL_WIDTH * sizeof (HOST_WIDE_INT) ? 1 : -1];
-
-/* Calculate the format for CONST_DOUBLE.  We need as many slots as
-   are necessary to overlay a REAL_VALUE_TYPE on them.  This could be
-   as many as four (32-bit HOST_WIDE_INT, 128-bit REAL_VALUE_TYPE).
-
-   A number of places assume that there are always at least two 'w'
-   slots in a CONST_DOUBLE, so we provide them even if one would suffice.  */
-
-#if REAL_WIDTH == 1
-# define CONST_DOUBLE_FORMAT	 "ww"
-#else
-# if REAL_WIDTH == 2
-#  define CONST_DOUBLE_FORMAT	 "ww"
-# else
-#  if REAL_WIDTH == 3
-#   define CONST_DOUBLE_FORMAT	 "www"
-#  else
-#   if REAL_WIDTH == 4
-#    define CONST_DOUBLE_FORMAT	 "wwww"
-#   else
-#    if REAL_WIDTH == 5
-#     define CONST_DOUBLE_FORMAT "wwwww"
-#    else
-#     if REAL_WIDTH == 6
-#      define CONST_DOUBLE_FORMAT "wwwwww"
-#     else
-       #error "REAL_WIDTH > 6 not supported"
-#     endif
-#    endif
-#   endif
-#  endif
-# endif
-#endif
-
-
-/* Describes the properties of the specific target format in use.  */
-struct real_format
-{
-  /* Move to and from the target bytes.  */
-  void (*encode) (const struct real_format *, long *,
-		  const REAL_VALUE_TYPE *);
-  void (*decode) (const struct real_format *, REAL_VALUE_TYPE *,
-		  const long *);
-
-  /* The radix of the exponent and digits of the significand.  */
-  int b;
-
-  /* Size of the significand in digits of radix B.  */
-  int p;
-
-  /* Size of the significant of a NaN, in digits of radix B.  */
-  int pnan;
-
-  /* The minimum negative integer, x, such that b**(x-1) is normalized.  */
-  int emin;
-
-  /* The maximum integer, x, such that b**(x-1) is representable.  */
-  int emax;
-
-  /* The bit position of the sign bit, for determining whether a value
-     is positive/negative, or -1 for a complex encoding.  */
-  int signbit_ro;
-
-  /* The bit position of the sign bit, for changing the sign of a number,
-     or -1 for a complex encoding.  */
-  int signbit_rw;
-
-  /* Default rounding mode for operations on this format.  */
-  bool round_towards_zero;
-  bool has_sign_dependent_rounding;
-
-  /* Properties of the format.  */
-  bool has_nans;
-  bool has_inf;
-  bool has_denorm;
-  bool has_signed_zero;
-  bool qnan_msb_set;
-  bool canonical_nan_lsbs_set;
-};
-
-
-/* The target format used for each floating point mode.
-   Float modes are followed by decimal float modes, with entries for
-   float modes indexed by (MODE - first float mode), and entries for
-   decimal float modes indexed by (MODE - first decimal float mode) +
-   the number of float modes.  */
-extern const struct real_format *
-  real_format_for_mode[MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1
-		       + MAX_MODE_DECIMAL_FLOAT - MIN_MODE_DECIMAL_FLOAT + 1];
-
-#define REAL_MODE_FORMAT(MODE)						\
-  (real_format_for_mode[DECIMAL_FLOAT_MODE_P (MODE)			\
-			? (((MODE) - MIN_MODE_DECIMAL_FLOAT)		\
-			   + (MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1))	\
-			: ((MODE) - MIN_MODE_FLOAT)])
-
-#define FLOAT_MODE_FORMAT(MODE) \
-  (REAL_MODE_FORMAT (SCALAR_FLOAT_MODE_P (MODE)? (MODE) \
-					       : GET_MODE_INNER (MODE)))
-
-/* The following macro determines whether the floating point format is
-   composite, i.e. may contain non-consecutive mantissa bits, in which
-   case compile-time FP overflow may not model run-time overflow.  */
-#define MODE_COMPOSITE_P(MODE) \
-  (FLOAT_MODE_P (MODE) \
-   && FLOAT_MODE_FORMAT (MODE)->pnan < FLOAT_MODE_FORMAT (MODE)->p)
-
-/* Accessor macros for format properties.  */
-#define MODE_HAS_NANS(MODE) \
-  (FLOAT_MODE_P (MODE) && FLOAT_MODE_FORMAT (MODE)->has_nans)
-#define MODE_HAS_INFINITIES(MODE) \
-  (FLOAT_MODE_P (MODE) && FLOAT_MODE_FORMAT (MODE)->has_inf)
-#define MODE_HAS_SIGNED_ZEROS(MODE) \
-  (FLOAT_MODE_P (MODE) && FLOAT_MODE_FORMAT (MODE)->has_signed_zero)
-#define MODE_HAS_SIGN_DEPENDENT_ROUNDING(MODE) \
-  (FLOAT_MODE_P (MODE) \
-   && FLOAT_MODE_FORMAT (MODE)->has_sign_dependent_rounding)
-
-/* True if the given mode has a NaN representation and the treatment of
-   NaN operands is important.  Certain optimizations, such as folding
-   x * 0 into 0, are not correct for NaN operands, and are normally
-   disabled for modes with NaNs.  The user can ask for them to be
-   done anyway using the -funsafe-math-optimizations switch.  */
-#define HONOR_NANS(MODE) \
-  (MODE_HAS_NANS (MODE) && !flag_finite_math_only)
-
-/* Like HONOR_NANs, but true if we honor signaling NaNs (or sNaNs).  */
-#define HONOR_SNANS(MODE) (flag_signaling_nans && HONOR_NANS (MODE))
-
-/* As for HONOR_NANS, but true if the mode can represent infinity and
-   the treatment of infinite values is important.  */
-#define HONOR_INFINITIES(MODE) \
-  (MODE_HAS_INFINITIES (MODE) && !flag_finite_math_only)
-
-/* Like HONOR_NANS, but true if the given mode distinguishes between
-   positive and negative zero, and the sign of zero is important.  */
-#define HONOR_SIGNED_ZEROS(MODE) \
-  (MODE_HAS_SIGNED_ZEROS (MODE) && flag_signed_zeros)
-
-/* Like HONOR_NANS, but true if given mode supports sign-dependent rounding,
-   and the rounding mode is important.  */
-#define HONOR_SIGN_DEPENDENT_ROUNDING(MODE) \
-  (MODE_HAS_SIGN_DEPENDENT_ROUNDING (MODE) && flag_rounding_math)
-
-/* Declare functions in real.c.  */
-
-/* Binary or unary arithmetic on tree_code.  */
-extern bool real_arithmetic (REAL_VALUE_TYPE *, int, const REAL_VALUE_TYPE *,
-			     const REAL_VALUE_TYPE *);
-
-/* Compare reals by tree_code.  */
-extern bool real_compare (int, const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
-
-/* Determine whether a floating-point value X is infinite.  */
-extern bool real_isinf (const REAL_VALUE_TYPE *);
-
-/* Determine whether a floating-point value X is a NaN.  */
-extern bool real_isnan (const REAL_VALUE_TYPE *);
-
-/* Determine whether a floating-point value X is finite.  */
-extern bool real_isfinite (const REAL_VALUE_TYPE *);
-
-/* Determine whether a floating-point value X is negative.  */
-extern bool real_isneg (const REAL_VALUE_TYPE *);
-
-/* Determine whether a floating-point value X is minus zero.  */
-extern bool real_isnegzero (const REAL_VALUE_TYPE *);
-
-/* Compare two floating-point objects for bitwise identity.  */
-extern bool real_identical (const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
-
-/* Extend or truncate to a new mode.  */
-extern void real_convert (REAL_VALUE_TYPE *, enum machine_mode,
-			  const REAL_VALUE_TYPE *);
-
-/* Return true if truncating to NEW is exact.  */
-extern bool exact_real_truncate (enum machine_mode, const REAL_VALUE_TYPE *);
-
-/* Render R as a decimal floating point constant.  */
-extern void real_to_decimal (char *, const REAL_VALUE_TYPE *, size_t,
-			     size_t, int);
-
-/* Render R as a decimal floating point constant, rounded so as to be
-   parsed back to the same value when interpreted in mode MODE.  */
-extern void real_to_decimal_for_mode (char *, const REAL_VALUE_TYPE *, size_t,
-				      size_t, int, enum machine_mode);
-
-/* Render R as a hexadecimal floating point constant.  */
-extern void real_to_hexadecimal (char *, const REAL_VALUE_TYPE *,
-				 size_t, size_t, int);
-
-/* Render R as an integer.  */
-extern HOST_WIDE_INT real_to_integer (const REAL_VALUE_TYPE *);
-extern void real_to_integer2 (HOST_WIDE_INT *, HOST_WIDE_INT *,
-			      const REAL_VALUE_TYPE *);
-
-/* Initialize R from a decimal or hexadecimal string.  Return -1 if
-   the value underflows, +1 if overflows, and 0 otherwise.  */
-extern int real_from_string (REAL_VALUE_TYPE *, const char *);
-/* Wrapper to allow different internal representation for decimal floats. */
-extern void real_from_string3 (REAL_VALUE_TYPE *, const char *, enum machine_mode);
-
-/* Initialize R from an integer pair HIGH/LOW.  */
-extern void real_from_integer (REAL_VALUE_TYPE *, enum machine_mode,
-			       unsigned HOST_WIDE_INT, HOST_WIDE_INT, int);
-
-extern long real_to_target_fmt (long *, const REAL_VALUE_TYPE *,
-				const struct real_format *);
-extern long real_to_target (long *, const REAL_VALUE_TYPE *, enum machine_mode);
-
-extern void real_from_target_fmt (REAL_VALUE_TYPE *, const long *,
-				  const struct real_format *);
-extern void real_from_target (REAL_VALUE_TYPE *, const long *,
-			      enum machine_mode);
-
-extern void real_inf (REAL_VALUE_TYPE *);
-
-extern bool real_nan (REAL_VALUE_TYPE *, const char *, int, enum machine_mode);
-
-extern void real_maxval (REAL_VALUE_TYPE *, int, enum machine_mode);
-
-extern void real_2expN (REAL_VALUE_TYPE *, int, enum machine_mode);
-
-extern unsigned int real_hash (const REAL_VALUE_TYPE *);
-
-
-/* Target formats defined in real.c.  */
-extern const struct real_format ieee_single_format;
-extern const struct real_format mips_single_format;
-extern const struct real_format motorola_single_format;
-extern const struct real_format spu_single_format;
-extern const struct real_format ieee_double_format;
-extern const struct real_format mips_double_format;
-extern const struct real_format motorola_double_format;
-extern const struct real_format ieee_extended_motorola_format;
-extern const struct real_format ieee_extended_intel_96_format;
-extern const struct real_format ieee_extended_intel_96_round_53_format;
-extern const struct real_format ieee_extended_intel_128_format;
-extern const struct real_format ibm_extended_format;
-extern const struct real_format mips_extended_format;
-extern const struct real_format ieee_quad_format;
-extern const struct real_format mips_quad_format;
-extern const struct real_format vax_f_format;
-extern const struct real_format vax_d_format;
-extern const struct real_format vax_g_format;
-extern const struct real_format real_internal_format;
-extern const struct real_format decimal_single_format;
-extern const struct real_format decimal_double_format;
-extern const struct real_format decimal_quad_format;
-extern const struct real_format ieee_half_format;
-extern const struct real_format arm_half_format;
-
-
-/* ====================================================================== */
-/* Crap.  */
-
-#define REAL_ARITHMETIC(value, code, d1, d2) \
-  real_arithmetic (&(value), code, &(d1), &(d2))
-
-#define REAL_VALUES_IDENTICAL(x, y)	real_identical (&(x), &(y))
-#define REAL_VALUES_EQUAL(x, y)		real_compare (EQ_EXPR, &(x), &(y))
-#define REAL_VALUES_LESS(x, y)		real_compare (LT_EXPR, &(x), &(y))
-
-/* Determine whether a floating-point value X is infinite.  */
-#define REAL_VALUE_ISINF(x)		real_isinf (&(x))
-
-/* Determine whether a floating-point value X is a NaN.  */
-#define REAL_VALUE_ISNAN(x)		real_isnan (&(x))
-
-/* Determine whether a floating-point value X is negative.  */
-#define REAL_VALUE_NEGATIVE(x)		real_isneg (&(x))
-
-/* Determine whether a floating-point value X is minus zero.  */
-#define REAL_VALUE_MINUS_ZERO(x)	real_isnegzero (&(x))
-
-/* IN is a REAL_VALUE_TYPE.  OUT is an array of longs.  */
-#define REAL_VALUE_TO_TARGET_LONG_DOUBLE(IN, OUT)			\
-  real_to_target (OUT, &(IN),						\
-		  mode_for_size (LONG_DOUBLE_TYPE_SIZE, MODE_FLOAT, 0))
-
-#define REAL_VALUE_TO_TARGET_DOUBLE(IN, OUT) \
-  real_to_target (OUT, &(IN), mode_for_size (64, MODE_FLOAT, 0))
-
-/* IN is a REAL_VALUE_TYPE.  OUT is a long.  */
-#define REAL_VALUE_TO_TARGET_SINGLE(IN, OUT) \
-  ((OUT) = real_to_target (NULL, &(IN), mode_for_size (32, MODE_FLOAT, 0)))
-
-#define REAL_VALUE_FROM_INT(r, lo, hi, mode) \
-  real_from_integer (&(r), mode, lo, hi, 0)
-
-#define REAL_VALUE_FROM_UNSIGNED_INT(r, lo, hi, mode) \
-  real_from_integer (&(r), mode, lo, hi, 1)
-
-/* Real values to IEEE 754 decimal floats.  */
-
-/* IN is a REAL_VALUE_TYPE.  OUT is an array of longs.  */
-#define REAL_VALUE_TO_TARGET_DECIMAL128(IN, OUT) \
-  real_to_target (OUT, &(IN), mode_for_size (128, MODE_DECIMAL_FLOAT, 0))
-
-#define REAL_VALUE_TO_TARGET_DECIMAL64(IN, OUT) \
-  real_to_target (OUT, &(IN), mode_for_size (64, MODE_DECIMAL_FLOAT, 0))
-
-/* IN is a REAL_VALUE_TYPE.  OUT is a long.  */
-#define REAL_VALUE_TO_TARGET_DECIMAL32(IN, OUT) \
-  ((OUT) = real_to_target (NULL, &(IN), mode_for_size (32, MODE_DECIMAL_FLOAT, 0)))
-
-extern REAL_VALUE_TYPE real_value_truncate (enum machine_mode,
-					    REAL_VALUE_TYPE);
-
-#define REAL_VALUE_TO_INT(plow, phigh, r) \
-  real_to_integer2 (plow, phigh, &(r))
-
-extern REAL_VALUE_TYPE real_value_negate (const REAL_VALUE_TYPE *);
-extern REAL_VALUE_TYPE real_value_abs (const REAL_VALUE_TYPE *);
-
-extern int significand_size (enum machine_mode);
-
-extern REAL_VALUE_TYPE real_from_string2 (const char *, enum machine_mode);
-
-#define REAL_VALUE_ATOF(s, m) \
-  real_from_string2 (s, m)
-
-#define CONST_DOUBLE_ATOF(s, m) \
-  CONST_DOUBLE_FROM_REAL_VALUE (real_from_string2 (s, m), m)
-
-#define REAL_VALUE_FIX(r) \
-  real_to_integer (&(r))
-
-/* ??? Not quite right.  */
-#define REAL_VALUE_UNSIGNED_FIX(r) \
-  real_to_integer (&(r))
-
-/* ??? These were added for Paranoia support.  */
-
-/* Return floor log2(R).  */
-extern int real_exponent (const REAL_VALUE_TYPE *);
-
-/* R = A * 2**EXP.  */
-extern void real_ldexp (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, int);
-
-/* **** End of software floating point emulator interface macros **** */
-
-/* Constant real values 0, 1, 2, -1 and 0.5.  */
-
-extern REAL_VALUE_TYPE dconst0;
-extern REAL_VALUE_TYPE dconst1;
-extern REAL_VALUE_TYPE dconst2;
-extern REAL_VALUE_TYPE dconstm1;
-extern REAL_VALUE_TYPE dconsthalf;
-
-#define dconst_e()  (*dconst_e_ptr ())
-#define dconst_third()  (*dconst_third_ptr ())
-#define dconst_sqrt2()  (*dconst_sqrt2_ptr ())
-
-/* Function to return the real value special constant 'e'.  */
-extern const REAL_VALUE_TYPE * dconst_e_ptr (void);
-
-/* Returns the special REAL_VALUE_TYPE corresponding to 1/3.  */
-extern const REAL_VALUE_TYPE * dconst_third_ptr (void);
-
-/* Returns the special REAL_VALUE_TYPE corresponding to sqrt(2).  */
-extern const REAL_VALUE_TYPE * dconst_sqrt2_ptr (void);
-
-/* Function to return a real value (not a tree node)
-   from a given integer constant.  */
-REAL_VALUE_TYPE real_value_from_int_cst (const_tree, const_tree);
-
-/* Given a CONST_DOUBLE in FROM, store into TO the value it represents.  */
-#define REAL_VALUE_FROM_CONST_DOUBLE(to, from) \
-  ((to) = *CONST_DOUBLE_REAL_VALUE (from))
-
-/* Return a CONST_DOUBLE with value R and mode M.  */
-#define CONST_DOUBLE_FROM_REAL_VALUE(r, m) \
-  const_double_from_real_value (r, m)
-extern rtx const_double_from_real_value (REAL_VALUE_TYPE, enum machine_mode);
-
-/* Replace R by 1/R in the given machine mode, if the result is exact.  */
-extern bool exact_real_inverse (enum machine_mode, REAL_VALUE_TYPE *);
-
-/* Return true if arithmetic on values in IMODE that were promoted
-   from values in TMODE is equivalent to direct arithmetic on values
-   in TMODE.  */
-bool real_can_shorten_arithmetic (enum machine_mode, enum machine_mode);
-
-/* In tree.c: wrap up a REAL_VALUE_TYPE in a tree node.  */
-extern tree build_real (tree, REAL_VALUE_TYPE);
-
-/* Calculate R as X raised to the integer exponent N in mode MODE.  */
-extern bool real_powi (REAL_VALUE_TYPE *, enum machine_mode,
-		       const REAL_VALUE_TYPE *, HOST_WIDE_INT);
-
-/* Standard round to integer value functions.  */
-extern void real_trunc (REAL_VALUE_TYPE *, enum machine_mode,
-			const REAL_VALUE_TYPE *);
-extern void real_floor (REAL_VALUE_TYPE *, enum machine_mode,
-			const REAL_VALUE_TYPE *);
-extern void real_ceil (REAL_VALUE_TYPE *, enum machine_mode,
-		       const REAL_VALUE_TYPE *);
-extern void real_round (REAL_VALUE_TYPE *, enum machine_mode,
-			const REAL_VALUE_TYPE *);
-
-/* Set the sign of R to the sign of X.  */
-extern void real_copysign (REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *);
-
-/* Check whether the real constant value given is an integer.  */
-extern bool real_isinteger (const REAL_VALUE_TYPE *c, enum machine_mode mode);
-
-/* Write into BUF the maximum representable finite floating-point
-   number, (1 - b**-p) * b**emax for a given FP format FMT as a hex
-   float string.  BUF must be large enough to contain the result.  */
-extern void get_max_float (const struct real_format *, char *, size_t);
-#endif /* ! GCC_REAL_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/realmpfr.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/realmpfr.h
deleted file mode 100644
index 0595f39..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/realmpfr.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Definitions of floating-point conversion from compiler
-   internal format to MPFR.
-   Copyright (C) 2010-2014 Free Software Foundation, Inc.
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify it under
-   the terms of the GNU General Public License as published by the Free
-   Software Foundation; either version 3, or (at your option) any later
-   version.
-
-   GCC 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 General Public License
-   for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with GCC; see the file COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_REALGMP_H
-#define GCC_REALGMP_H
-
-#include <mpfr.h>
-#include <mpc.h>
-#include "real.h"
-
-/* In builtins.c.  */
-extern tree do_mpc_arg2 (tree, tree, tree, int, int (*)(mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t));
-
-/* Convert between MPFR and REAL_VALUE_TYPE.  The caller is
-   responsible for initializing and clearing the MPFR parameter.  */
-
-extern void real_from_mpfr (REAL_VALUE_TYPE *, mpfr_srcptr, tree, mp_rnd_t);
-extern void mpfr_from_real (mpfr_ptr, const REAL_VALUE_TYPE *, mp_rnd_t);
-
-#endif /* ! GCC_REALGMP_H */
-
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/reg-notes.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/reg-notes.def
deleted file mode 100644
index 31cd171..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/reg-notes.def
+++ /dev/null
@@ -1,213 +0,0 @@
-/* Register note definitions.
-   Copyright (C) 2004-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* This file defines all the codes that may appear on individual
-   EXPR_LIST, INSN_LIST and INT_LIST rtxes in the REG_NOTES chain of an insn.
-   The codes are stored in the mode field of the rtx.  Source files
-   define DEF_REG_NOTE appropriately before including this file.  */
-
-/* Shorthand.  */
-#define REG_NOTE(NAME) DEF_REG_NOTE (REG_##NAME)
-
-/* REG_DEP_TRUE is used in scheduler dependencies lists to represent a
-   read-after-write dependency (i.e. a true data dependency).  This is
-   here, not grouped with REG_DEP_ANTI and REG_DEP_OUTPUT, because some
-   passes use a literal 0 for it.  */
-REG_NOTE (DEP_TRUE)
-
-/* The value in REG dies in this insn (i.e., it is not needed past
-   this insn).  If REG is set in this insn, the REG_DEAD note may,
-   but need not, be omitted.  */
-REG_NOTE (DEAD)
-
-/* The REG is autoincremented or autodecremented in this insn.  */
-REG_NOTE (INC)
-
-/* Describes the insn as a whole; it says that the insn sets a
-   register to a constant value or to be equivalent to a memory
-   address.  If the register is spilled to the stack then the constant
-   value should be substituted for it.  The contents of the REG_EQUIV
-   is the constant value or memory address, which may be different
-   from the source of the SET although it has the same value.  A
-   REG_EQUIV note may also appear on an insn which copies a register
-   parameter to a pseudo-register, if there is a memory address which
-   could be used to hold that pseudo-register throughout the function.  */
-REG_NOTE (EQUIV)
-
-/* Like REG_EQUIV except that the destination is only momentarily
-   equal to the specified rtx.  Therefore, it cannot be used for
-   substitution; but it can be used for cse.  */
-REG_NOTE (EQUAL)
-
-/* The register is always nonnegative during the containing loop.
-   This is used in branches so that decrement and branch instructions
-   terminating on zero can be matched.  There must be an insn pattern
-   in the md file named `decrement_and_branch_until_zero' or else this
-   will never be added to any instructions.  */
-REG_NOTE (NONNEG)
-
-/* Identifies a register set in this insn and never used.  */
-REG_NOTE (UNUSED)
-
-/* REG_CC_SETTER and REG_CC_USER link a pair of insns that set and use
-   CC0, respectively.  Normally, these are required to be consecutive
-   insns, but we permit putting a cc0-setting insn in the delay slot
-   of a branch as long as only one copy of the insn exists.  In that
-   case, these notes point from one to the other to allow code
-   generation to determine what any require information and to
-   properly update CC_STATUS.  These notes are INSN_LISTs.  */
-REG_NOTE (CC_SETTER)
-REG_NOTE (CC_USER)
-
-/* Points to a CODE_LABEL.  Used by JUMP_INSNs to say that the CODE_LABEL
-   contained in the REG_LABEL_TARGET note is a possible jump target of
-   this insn.  This note is an INSN_LIST.  */
-REG_NOTE (LABEL_TARGET)
-
-/* Points to a CODE_LABEL.  Used by any insn to say that the CODE_LABEL
-   contained in the REG_LABEL_OPERAND note is used by the insn, but as an
-   operand, not as a jump target (though it may indirectly be a jump
-   target for a later jump insn).  This note is an INSN_LIST.  */
-REG_NOTE (LABEL_OPERAND)
-
-/* REG_DEP_OUTPUT and REG_DEP_ANTI are used in scheduler dependencies lists
-   to represent write-after-write and write-after-read dependencies
-   respectively.  */
-REG_NOTE (DEP_OUTPUT)
-REG_NOTE (DEP_ANTI)
-REG_NOTE (DEP_CONTROL)
-
-/* REG_BR_PROB is attached to JUMP_INSNs and CALL_INSNs.  It has an
-   integer value (in an INT_LIST).  For jumps, it is the probability
-   that this is a taken branch.  For calls, it is the probability that
-   this call won't return.  */
-REG_NOTE (BR_PROB)
-
-/* Attached to a call insn; indicates that the call is malloc-like and
-   that the pointer returned cannot alias anything else.  */
-REG_NOTE (NOALIAS)
-
-/* REG_BR_PRED is attached to JUMP_INSNs and CALL_INSNSs.  It contains
-   CONCAT of two integer value.  First specifies the branch predictor
-   that added the note, second specifies the predicted hitrate of
-   branch in the same format as REG_BR_PROB note uses.  */
-REG_NOTE (BR_PRED)
-
-/* Attached to insns that are RTX_FRAME_RELATED_P, but are too complex
-   for DWARF to interpret what they imply.  The attached rtx is used
-   instead of intuition.  */
-REG_NOTE (FRAME_RELATED_EXPR)
-
-/* Attached to insns that are RTX_FRAME_RELATED_P, but are too complex
-   for FRAME_RELATED_EXPR intuition.  The insn's first pattern must be
-   a SET, and the destination must be the CFA register.  The attached
-   rtx is an expression that defines the CFA.  In the simplest case, the
-   rtx could be just the stack_pointer_rtx; more common would be a PLUS
-   with a base register and a constant offset.  In the most complicated
-   cases, this will result in a DW_CFA_def_cfa_expression with the rtx
-   expression rendered in a dwarf location expression.  */
-REG_NOTE (CFA_DEF_CFA)
-
-/* Attached to insns that are RTX_FRAME_RELATED_P, but are too complex
-   for FRAME_RELATED_EXPR intuition.  This note adjusts the expression
-   from which the CFA is computed.  The attached rtx defines a new CFA
-   expression, relative to the old CFA expression.  This rtx must be of
-   the form (SET new-cfa-reg (PLUS old-cfa-reg const_int)).  If the note
-   rtx is NULL, we use the first SET of the insn.  */
-REG_NOTE (CFA_ADJUST_CFA)
-
-/* Similar to FRAME_RELATED_EXPR, with the additional information that
-   this is a save to memory, i.e. will result in DW_CFA_offset or the
-   like.  The pattern or the insn should be a simple store relative to
-   the CFA.  */
-REG_NOTE (CFA_OFFSET)
-
-/* Similar to FRAME_RELATED_EXPR, with the additional information that this
-   is a save to a register, i.e. will result in DW_CFA_register.  The insn
-   or the pattern should be simple reg-reg move.  */
-REG_NOTE (CFA_REGISTER)
-
-/* Attached to insns that are RTX_FRAME_RELATED_P, but are too complex
-   for FRAME_RELATED_EXPR intuition.  This is a save to memory, i.e. will
-   result in a DW_CFA_expression.  The pattern or the insn should be a
-   store of a register to an arbitrary (non-validated) memory address.  */
-REG_NOTE (CFA_EXPRESSION)
-
-/* Attached to insns that are RTX_FRAME_RELATED_P, with the information
-   that this is a restore operation, i.e. will result in DW_CFA_restore
-   or the like.  Either the attached rtx, or the destination of the insn's
-   first pattern is the register to be restored.  */
-REG_NOTE (CFA_RESTORE)
-
-/* Attached to insns that are RTX_FRAME_RELATED_P, marks insn that sets
-   vDRAP from DRAP.  If vDRAP is a register, vdrap_reg is initalized
-   to the argument, if it is a MEM, it is ignored.  */
-REG_NOTE (CFA_SET_VDRAP)
-
-/* Attached to insns that are RTX_FRAME_RELATED_P, indicating a window
-   save operation, i.e. will result in a DW_CFA_GNU_window_save.
-   The argument is ignored.  */
-REG_NOTE (CFA_WINDOW_SAVE)
-
-/* Attached to insns that are RTX_FRAME_RELATED_P, marks the insn as
-   requiring that all queued information should be flushed *before* insn,
-   regardless of what is visible in the rtl.  The argument is ignored.
-   This is normally used for a call instruction which is not exposed to
-   the rest of the compiler as a CALL_INSN.  */
-REG_NOTE (CFA_FLUSH_QUEUE)
-
-/* Indicates what exception region an INSN belongs in.  This is used
-   to indicate what region to which a call may throw.  REGION 0
-   indicates that a call cannot throw at all.  REGION -1 indicates
-   that it cannot throw, nor will it execute a non-local goto.  */
-REG_NOTE (EH_REGION)
-
-/* Used by haifa-sched to save NOTE_INSN notes across scheduling.  */
-REG_NOTE (SAVE_NOTE)
-
-/* Indicates that a call does not return.  */
-REG_NOTE (NORETURN)
-
-/* Indicates that an indirect jump is a non-local goto instead of a
-   computed goto.  */
-REG_NOTE (NON_LOCAL_GOTO)
-
-/* Indicates that a jump crosses between hot and cold sections in a
-   (partitioned) assembly or .o file, and therefore should not be
-   reduced to a simpler jump by optimizations.  */
-REG_NOTE (CROSSING_JUMP)
-
-/* This kind of note is generated at each to `setjmp', and similar
-   functions that can return twice.  */
-REG_NOTE (SETJMP)
-
-/* This kind of note is generated at each transactional memory
-   builtin, to indicate we need to generate transaction restart
-   edges for this insn.  */
-REG_NOTE (TM)
-
-/* Indicates the cumulative offset of the stack pointer accounting
-   for pushed arguments.  This will only be generated when
-   ACCUMULATE_OUTGOING_ARGS is false.  */
-REG_NOTE (ARGS_SIZE)
-
-/* Used for communication between IRA and caller-save.c, indicates
-   that the return value of a call can be used to reinitialize a
-   pseudo reg.  */
-REG_NOTE (RETURNED)
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/regset.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/regset.h
deleted file mode 100644
index d3df5b1..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/regset.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/* Define regsets.
-   Copyright (C) 1987-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_REGSET_H
-#define GCC_REGSET_H
-
-/* TODO: regset is just a bitmap in its implementation.  The compiler does
-   not consistently use one or the other, i.e. sometimes variables are
-   declared as bitmap but they are actually regsets and regset accessors
-   are used, and vice versa, or mixed (see e.g. spilled_regs in IRA).
-
-   This should be cleaned up, either by just dropping the regset type, or
-   by changing all bitmaps that are really regsets to the regset type.  For
-   the latter option, a good start would be to change everything allocated
-   on the reg_obstack to regset.  */
-
-#include "bitmap.h"		/* For bitmap_iterator.  */
-#include "hard-reg-set.h"
-
-/* Head of register set linked list.  */
-typedef bitmap_head regset_head;
-
-/* A pointer to a regset_head.  */
-typedef bitmap regset;
-
-/* Allocate a register set with oballoc.  */
-#define ALLOC_REG_SET(OBSTACK) BITMAP_ALLOC (OBSTACK)
-
-/* Do any cleanup needed on a regset when it is no longer used.  */
-#define FREE_REG_SET(REGSET) BITMAP_FREE (REGSET)
-
-/* Initialize a new regset.  */
-#define INIT_REG_SET(HEAD) bitmap_initialize (HEAD, &reg_obstack)
-
-/* Clear a register set by freeing up the linked list.  */
-#define CLEAR_REG_SET(HEAD) bitmap_clear (HEAD)
-
-/* Copy a register set to another register set.  */
-#define COPY_REG_SET(TO, FROM) bitmap_copy (TO, FROM)
-
-/* Compare two register sets.  */
-#define REG_SET_EQUAL_P(A, B) bitmap_equal_p (A, B)
-
-/* `and' a register set with a second register set.  */
-#define AND_REG_SET(TO, FROM) bitmap_and_into (TO, FROM)
-
-/* `and' the complement of a register set with a register set.  */
-#define AND_COMPL_REG_SET(TO, FROM) bitmap_and_compl_into (TO, FROM)
-
-/* Inclusive or a register set with a second register set.  */
-#define IOR_REG_SET(TO, FROM) bitmap_ior_into (TO, FROM)
-
-/* Exclusive or a register set with a second register set.  */
-#define XOR_REG_SET(TO, FROM) bitmap_xor_into (TO, FROM)
-
-/* Or into TO the register set FROM1 `and'ed with the complement of FROM2.  */
-#define IOR_AND_COMPL_REG_SET(TO, FROM1, FROM2) \
-  bitmap_ior_and_compl_into (TO, FROM1, FROM2)
-
-/* Clear a single register in a register set.  */
-#define CLEAR_REGNO_REG_SET(HEAD, REG) bitmap_clear_bit (HEAD, REG)
-
-/* Set a single register in a register set.  */
-#define SET_REGNO_REG_SET(HEAD, REG) bitmap_set_bit (HEAD, REG)
-
-/* Return true if a register is set in a register set.  */
-#define REGNO_REG_SET_P(TO, REG) bitmap_bit_p (TO, REG)
-
-/* Copy the hard registers in a register set to the hard register set.  */
-extern void reg_set_to_hard_reg_set (HARD_REG_SET *, const_bitmap);
-#define REG_SET_TO_HARD_REG_SET(TO, FROM)				\
-do {									\
-  CLEAR_HARD_REG_SET (TO);						\
-  reg_set_to_hard_reg_set (&TO, FROM);					\
-} while (0)
-
-typedef bitmap_iterator reg_set_iterator;
-
-/* Loop over all registers in REGSET, starting with MIN, setting REGNUM to the
-   register number and executing CODE for all registers that are set.  */
-#define EXECUTE_IF_SET_IN_REG_SET(REGSET, MIN, REGNUM, RSI)	\
-  EXECUTE_IF_SET_IN_BITMAP (REGSET, MIN, REGNUM, RSI)
-
-/* Loop over all registers in REGSET1 and REGSET2, starting with MIN, setting
-   REGNUM to the register number and executing CODE for all registers that are
-   set in the first regset and not set in the second.  */
-#define EXECUTE_IF_AND_COMPL_IN_REG_SET(REGSET1, REGSET2, MIN, REGNUM, RSI) \
-  EXECUTE_IF_AND_COMPL_IN_BITMAP (REGSET1, REGSET2, MIN, REGNUM, RSI)
-
-/* Loop over all registers in REGSET1 and REGSET2, starting with MIN, setting
-   REGNUM to the register number and executing CODE for all registers that are
-   set in both regsets.  */
-#define EXECUTE_IF_AND_IN_REG_SET(REGSET1, REGSET2, MIN, REGNUM, RSI) \
-  EXECUTE_IF_AND_IN_BITMAP (REGSET1, REGSET2, MIN, REGNUM, RSI)	\
-
-/* Same information as REGS_INVALIDATED_BY_CALL but in regset form to be used
-   in dataflow more conveniently.  */
-
-extern regset regs_invalidated_by_call_regset;
-
-/* Same information as FIXED_REG_SET but in regset form.  */
-extern regset fixed_reg_set_regset;
-
-/* An obstack for regsets.  */
-extern bitmap_obstack reg_obstack;
-
-/* In df-core.c (which should use regset consistently instead of bitmap...)  */
-extern void dump_regset (regset, FILE *);
-
-#endif /* GCC_REGSET_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/resource.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/resource.h
deleted file mode 100644
index a1a1f34..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/resource.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Definitions for computing resource usage of specific insns.
-   Copyright (C) 1999-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_RESOURCE_H
-#define GCC_RESOURCE_H
-
-#include "hard-reg-set.h"
-#include "df.h"
-
-/* Macro to clear all resources.  */
-#define CLEAR_RESOURCE(RES)	\
- do { (RES)->memory = (RES)->volatil = (RES)->cc = 0; \
-      CLEAR_HARD_REG_SET ((RES)->regs); } while (0)
-
-/* The resources used by a given insn.  */
-struct resources
-{
-  char memory;		/* Insn sets or needs a memory location.  */
-  char volatil;		/* Insn sets or needs a volatile memory loc.  */
-  char cc;		/* Insn sets or needs the condition codes.  */
-  HARD_REG_SET regs;	/* Which registers are set or needed.  */
-};
-
-/* The kinds of rtl mark_*_resources will consider */
-enum mark_resource_type
-{
-  MARK_SRC_DEST = 0,
-  MARK_SRC_DEST_CALL = 1
-};
-
-extern void mark_target_live_regs (rtx, rtx, struct resources *);
-extern void mark_set_resources (rtx, struct resources *, int,
-				enum mark_resource_type);
-extern void mark_referenced_resources (rtx, struct resources *, bool);
-extern void clear_hashed_info_for_insn (rtx);
-extern void incr_ticks_for_insn (rtx);
-extern void mark_end_of_function_resources (rtx, bool);
-extern void init_resource_info (rtx);
-extern void free_resource_info (void);
-
-#endif /* GCC_RESOURCE_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/rtl.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/rtl.def
deleted file mode 100644
index 56418c7..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/rtl.def
+++ /dev/null
@@ -1,1352 +0,0 @@
-/* This file contains the definitions and documentation for the
-   Register Transfer Expressions (rtx's) that make up the
-   Register Transfer Language (rtl) used in the Back End of the GNU compiler.
-   Copyright (C) 1987-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-
-/* Expression definitions and descriptions for all targets are in this file.
-   Some will not be used for some targets.
-
-   The fields in the cpp macro call "DEF_RTL_EXPR()"
-   are used to create declarations in the C source of the compiler.
-
-   The fields are:
-
-   1.  The internal name of the rtx used in the C source.
-   It is a tag in the enumeration "enum rtx_code" defined in "rtl.h".
-   By convention these are in UPPER_CASE.
-
-   2.  The name of the rtx in the external ASCII format read by
-   read_rtx(), and printed by print_rtx().
-   These names are stored in rtx_name[].
-   By convention these are the internal (field 1) names in lower_case.
-
-   3.  The print format, and type of each rtx->u.fld[] (field) in this rtx.
-   These formats are stored in rtx_format[].
-   The meaning of the formats is documented in front of this array in rtl.c
-
-   4.  The class of the rtx.  These are stored in rtx_class and are accessed
-   via the GET_RTX_CLASS macro.  They are defined as follows:
-
-     RTX_CONST_OBJ
-         an rtx code that can be used to represent a constant object
-         (e.g, CONST_INT)
-     RTX_OBJ
-         an rtx code that can be used to represent an object (e.g, REG, MEM)
-     RTX_COMPARE
-         an rtx code for a comparison (e.g, LT, GT)
-     RTX_COMM_COMPARE
-         an rtx code for a commutative comparison (e.g, EQ, NE, ORDERED)
-     RTX_UNARY
-         an rtx code for a unary arithmetic expression (e.g, NEG, NOT)
-     RTX_COMM_ARITH
-         an rtx code for a commutative binary operation (e.g,, PLUS, MULT)
-     RTX_TERNARY
-         an rtx code for a non-bitfield three input operation (IF_THEN_ELSE)
-     RTX_BIN_ARITH
-         an rtx code for a non-commutative binary operation (e.g., MINUS, DIV)
-     RTX_BITFIELD_OPS
-         an rtx code for a bit-field operation (ZERO_EXTRACT, SIGN_EXTRACT)
-     RTX_INSN
-         an rtx code for a machine insn (INSN, JUMP_INSN, CALL_INSN) or
-	 data that will be output as assembly pseudo-ops (DEBUG_INSN)
-     RTX_MATCH
-         an rtx code for something that matches in insns (e.g, MATCH_DUP)
-     RTX_AUTOINC
-         an rtx code for autoincrement addressing modes (e.g. POST_DEC)
-     RTX_EXTRA
-         everything else
-
-   All of the expressions that appear only in machine descriptions,
-   not in RTL used by the compiler itself, are at the end of the file.  */
-
-/* Unknown, or no such operation; the enumeration constant should have
-   value zero.  */
-DEF_RTL_EXPR(UNKNOWN, "UnKnown", "*", RTX_EXTRA)
-
-/* Used in the cselib routines to describe a value.  Objects of this
-   kind are only allocated in cselib.c, in an alloc pool instead of in
-   GC memory.  The only operand of a VALUE is a cselib_val.
-   var-tracking requires this to have a distinct integral value from
-   DECL codes in trees.  */
-DEF_RTL_EXPR(VALUE, "value", "0", RTX_OBJ)
-
-/* The RTL generated for a DEBUG_EXPR_DECL.  It links back to the
-   DEBUG_EXPR_DECL in the first operand.  */
-DEF_RTL_EXPR(DEBUG_EXPR, "debug_expr", "0", RTX_OBJ)
-
-/* ---------------------------------------------------------------------
-   Expressions used in constructing lists.
-   --------------------------------------------------------------------- */
-
-/* A linked list of expressions.  */
-DEF_RTL_EXPR(EXPR_LIST, "expr_list", "ee", RTX_EXTRA)
-
-/* A linked list of instructions.
-   The insns are represented in print by their uids.  */
-DEF_RTL_EXPR(INSN_LIST, "insn_list", "ue", RTX_EXTRA)
-
-/* A linked list of integers.  */
-DEF_RTL_EXPR(INT_LIST, "int_list", "ie", RTX_EXTRA)
-
-/* SEQUENCE is used in late passes of the compiler to group insns for
-   one reason or another.
-
-   For example, after delay slot filling, branch instructions with filled
-   delay slots are represented as a SEQUENCE of length 1 + n_delay_slots,
-   with the branch instruction in XEXPVEC(seq, 0, 0) and the instructions
-   occupying the delay slots in the remaining XEXPVEC slots.
-
-   Another place where a SEQUENCE may appear, is in REG_FRAME_RELATED_EXPR
-   notes, to express complex operations that are not obvious from the insn
-   to which the REG_FRAME_RELATED_EXPR note is attached.  In this usage of
-   SEQUENCE, the sequence vector slots do not hold real instructions but
-   only pseudo-instructions that can be translated to DWARF CFA expressions.
-
-   Some back ends also use SEQUENCE to group insns in bundles.
-
-   Much of the compiler infrastructure is not prepared to handle SEQUENCE
-   objects.  Only passes after pass_free_cfg are expected to handle them.  */
-DEF_RTL_EXPR(SEQUENCE, "sequence", "E", RTX_EXTRA)
-
-/* Represents a non-global base address.  This is only used in alias.c.  */
-DEF_RTL_EXPR(ADDRESS, "address", "i", RTX_EXTRA)
-
-/* ----------------------------------------------------------------------
-   Expression types used for things in the instruction chain.
-
-   All formats must start with "iuu" to handle the chain.
-   Each insn expression holds an rtl instruction and its semantics
-   during back-end processing.
-   See macros's in "rtl.h" for the meaning of each rtx->u.fld[].
-
-   ---------------------------------------------------------------------- */
-
-/* An annotation for variable assignment tracking.  */
-DEF_RTL_EXPR(DEBUG_INSN, "debug_insn", "iuuBeiie", RTX_INSN)
-
-/* An instruction that cannot jump.  */
-DEF_RTL_EXPR(INSN, "insn", "iuuBeiie", RTX_INSN)
-
-/* An instruction that can possibly jump.
-   Fields ( rtx->u.fld[] ) have exact same meaning as INSN's.  */
-DEF_RTL_EXPR(JUMP_INSN, "jump_insn", "iuuBeiie0", RTX_INSN)
-
-/* An instruction that can possibly call a subroutine
-   but which will not change which instruction comes next
-   in the current function.
-   Field ( rtx->u.fld[8] ) is CALL_INSN_FUNCTION_USAGE.
-   All other fields ( rtx->u.fld[] ) have exact same meaning as INSN's.  */
-DEF_RTL_EXPR(CALL_INSN, "call_insn", "iuuBeiiee", RTX_INSN)
-
-/* Placeholder for tablejump JUMP_INSNs.  The pattern of this kind
-   of rtx is always either an ADDR_VEC or an ADDR_DIFF_VEC.  These
-   placeholders do not appear as real instructions inside a basic
-   block, but are considered active_insn_p instructions for historical
-   reasons, when jump table data was represented with JUMP_INSNs.  */
-DEF_RTL_EXPR(JUMP_TABLE_DATA, "jump_table_data", "iuuBe0000", RTX_INSN)
-
-/* A marker that indicates that control will not flow through.  */
-DEF_RTL_EXPR(BARRIER, "barrier", "iuu00000", RTX_EXTRA)
-
-/* Holds a label that is followed by instructions.
-   Operand:
-   4: is used in jump.c for the use-count of the label.
-   5: is used in the sh backend.
-   6: is a number that is unique in the entire compilation.
-   7: is the user-given name of the label, if any.  */
-DEF_RTL_EXPR(CODE_LABEL, "code_label", "iuuB00is", RTX_EXTRA)
-
-/* Say where in the code a source line starts, for symbol table's sake.
-   Operand:
-   4: note-specific data
-   5: enum insn_note
-   6: unique number if insn_note == note_insn_deleted_label.  */
-DEF_RTL_EXPR(NOTE, "note", "iuuB0ni", RTX_EXTRA)
-
-/* ----------------------------------------------------------------------
-   Top level constituents of INSN, JUMP_INSN and CALL_INSN.
-   ---------------------------------------------------------------------- */
-
-/* Conditionally execute code.
-   Operand 0 is the condition that if true, the code is executed.
-   Operand 1 is the code to be executed (typically a SET).
-
-   Semantics are that there are no side effects if the condition
-   is false.  This pattern is created automatically by the if_convert
-   pass run after reload or by target-specific splitters.  */
-DEF_RTL_EXPR(COND_EXEC, "cond_exec", "ee", RTX_EXTRA)
-
-/* Several operations to be done in parallel (perhaps under COND_EXEC).  */
-DEF_RTL_EXPR(PARALLEL, "parallel", "E", RTX_EXTRA)
-
-/* A string that is passed through to the assembler as input.
-     One can obviously pass comments through by using the
-     assembler comment syntax.
-     These occur in an insn all by themselves as the PATTERN.
-     They also appear inside an ASM_OPERANDS
-     as a convenient way to hold a string.  */
-DEF_RTL_EXPR(ASM_INPUT, "asm_input", "si", RTX_EXTRA)
-
-/* An assembler instruction with operands.
-   1st operand is the instruction template.
-   2nd operand is the constraint for the output.
-   3rd operand is the number of the output this expression refers to.
-     When an insn stores more than one value, a separate ASM_OPERANDS
-     is made for each output; this integer distinguishes them.
-   4th is a vector of values of input operands.
-   5th is a vector of modes and constraints for the input operands.
-     Each element is an ASM_INPUT containing a constraint string
-     and whose mode indicates the mode of the input operand.
-   6th is a vector of labels that may be branched to by the asm.
-   7th is the source line number.  */
-DEF_RTL_EXPR(ASM_OPERANDS, "asm_operands", "ssiEEEi", RTX_EXTRA)
-
-/* A machine-specific operation.
-   1st operand is a vector of operands being used by the operation so that
-     any needed reloads can be done.
-   2nd operand is a unique value saying which of a number of machine-specific
-     operations is to be performed.
-   (Note that the vector must be the first operand because of the way that
-   genrecog.c record positions within an insn.)
-
-   UNSPEC can occur all by itself in a PATTERN, as a component of a PARALLEL,
-   or inside an expression.
-   UNSPEC by itself or as a component of a PARALLEL
-   is currently considered not deletable.
-
-   FIXME: Replace all uses of UNSPEC that appears by itself or as a component
-   of a PARALLEL with USE.
-   */
-DEF_RTL_EXPR(UNSPEC, "unspec", "Ei", RTX_EXTRA)
-
-/* Similar, but a volatile operation and one which may trap.  */
-DEF_RTL_EXPR(UNSPEC_VOLATILE, "unspec_volatile", "Ei", RTX_EXTRA)
-
-/* ----------------------------------------------------------------------
-   Table jump addresses.
-   ---------------------------------------------------------------------- */
-
-/* Vector of addresses, stored as full words.
-   Each element is a LABEL_REF to a CODE_LABEL whose address we want.  */
-DEF_RTL_EXPR(ADDR_VEC, "addr_vec", "E", RTX_EXTRA)
-
-/* Vector of address differences X0 - BASE, X1 - BASE, ...
-   First operand is BASE; the vector contains the X's.
-   The machine mode of this rtx says how much space to leave
-   for each difference and is adjusted by branch shortening if
-   CASE_VECTOR_SHORTEN_MODE is defined.
-   The third and fourth operands store the target labels with the
-   minimum and maximum addresses respectively.
-   The fifth operand stores flags for use by branch shortening.
-  Set at the start of shorten_branches:
-   min_align: the minimum alignment for any of the target labels.
-   base_after_vec: true iff BASE is after the ADDR_DIFF_VEC.
-   min_after_vec: true iff minimum addr target label is after the ADDR_DIFF_VEC.
-   max_after_vec: true iff maximum addr target label is after the ADDR_DIFF_VEC.
-   min_after_base: true iff minimum address target label is after BASE.
-   max_after_base: true iff maximum address target label is after BASE.
-  Set by the actual branch shortening process:
-   offset_unsigned: true iff offsets have to be treated as unsigned.
-   scale: scaling that is necessary to make offsets fit into the mode.
-
-   The third, fourth and fifth operands are only valid when
-   CASE_VECTOR_SHORTEN_MODE is defined, and only in an optimizing
-   compilation.  */
-DEF_RTL_EXPR(ADDR_DIFF_VEC, "addr_diff_vec", "eEee0", RTX_EXTRA)
-
-/* Memory prefetch, with attributes supported on some targets.
-   Operand 1 is the address of the memory to fetch.
-   Operand 2 is 1 for a write access, 0 otherwise.
-   Operand 3 is the level of temporal locality; 0 means there is no
-   temporal locality and 1, 2, and 3 are for increasing levels of temporal
-   locality.
-
-   The attributes specified by operands 2 and 3 are ignored for targets
-   whose prefetch instructions do not support them.  */
-DEF_RTL_EXPR(PREFETCH, "prefetch", "eee", RTX_EXTRA)
-
-/* ----------------------------------------------------------------------
-   At the top level of an instruction (perhaps under PARALLEL).
-   ---------------------------------------------------------------------- */
-
-/* Assignment.
-   Operand 1 is the location (REG, MEM, PC, CC0 or whatever) assigned to.
-   Operand 2 is the value stored there.
-   ALL assignment must use SET.
-   Instructions that do multiple assignments must use multiple SET,
-   under PARALLEL.  */
-DEF_RTL_EXPR(SET, "set", "ee", RTX_EXTRA)
-
-/* Indicate something is used in a way that we don't want to explain.
-   For example, subroutine calls will use the register
-   in which the static chain is passed.
-
-   USE can not appear as an operand of other rtx except for PARALLEL.
-   USE is not deletable, as it indicates that the operand
-   is used in some unknown way.  */
-DEF_RTL_EXPR(USE, "use", "e", RTX_EXTRA)
-
-/* Indicate something is clobbered in a way that we don't want to explain.
-   For example, subroutine calls will clobber some physical registers
-   (the ones that are by convention not saved).
-
-   CLOBBER can not appear as an operand of other rtx except for PARALLEL.
-   CLOBBER of a hard register appearing by itself (not within PARALLEL)
-   is considered undeletable before reload.  */
-DEF_RTL_EXPR(CLOBBER, "clobber", "e", RTX_EXTRA)
-
-/* Call a subroutine.
-   Operand 1 is the address to call.
-   Operand 2 is the number of arguments.  */
-
-DEF_RTL_EXPR(CALL, "call", "ee", RTX_EXTRA)
-
-/* Return from a subroutine.  */
-
-DEF_RTL_EXPR(RETURN, "return", "", RTX_EXTRA)
-
-/* Like RETURN, but truly represents only a function return, while
-   RETURN may represent an insn that also performs other functions
-   of the function epilogue.  Like RETURN, this may also occur in
-   conditional jumps.  */
-DEF_RTL_EXPR(SIMPLE_RETURN, "simple_return", "", RTX_EXTRA)
-
-/* Special for EH return from subroutine.  */
-
-DEF_RTL_EXPR(EH_RETURN, "eh_return", "", RTX_EXTRA)
-
-/* Conditional trap.
-   Operand 1 is the condition.
-   Operand 2 is the trap code.
-   For an unconditional trap, make the condition (const_int 1).  */
-DEF_RTL_EXPR(TRAP_IF, "trap_if", "ee", RTX_EXTRA)
-
-/* ----------------------------------------------------------------------
-   Primitive values for use in expressions.
-   ---------------------------------------------------------------------- */
-
-/* numeric integer constant */
-DEF_RTL_EXPR(CONST_INT, "const_int", "w", RTX_CONST_OBJ)
-
-/* fixed-point constant */
-DEF_RTL_EXPR(CONST_FIXED, "const_fixed", "www", RTX_CONST_OBJ)
-
-/* numeric floating point or integer constant.  If the mode is
-   VOIDmode it is an int otherwise it has a floating point mode and a
-   floating point value.  Operands hold the value.  They are all 'w'
-   and there may be from 2 to 6; see real.h.  */
-DEF_RTL_EXPR(CONST_DOUBLE, "const_double", CONST_DOUBLE_FORMAT, RTX_CONST_OBJ)
-
-/* Describes a vector constant.  */
-DEF_RTL_EXPR(CONST_VECTOR, "const_vector", "E", RTX_CONST_OBJ)
-
-/* String constant.  Used for attributes in machine descriptions and
-   for special cases in DWARF2 debug output.  NOT used for source-
-   language string constants.  */
-DEF_RTL_EXPR(CONST_STRING, "const_string", "s", RTX_OBJ)
-
-/* This is used to encapsulate an expression whose value is constant
-   (such as the sum of a SYMBOL_REF and a CONST_INT) so that it will be
-   recognized as a constant operand rather than by arithmetic instructions.  */
-
-DEF_RTL_EXPR(CONST, "const", "e", RTX_CONST_OBJ)
-
-/* program counter.  Ordinary jumps are represented
-   by a SET whose first operand is (PC).  */
-DEF_RTL_EXPR(PC, "pc", "", RTX_OBJ)
-
-/* A register.  The "operand" is the register number, accessed with
-   the REGNO macro.  If this number is less than FIRST_PSEUDO_REGISTER
-   than a hardware register is being referred to.  The second operand
-   holds the original register number - this will be different for a
-   pseudo register that got turned into a hard register.  The third
-   operand points to a reg_attrs structure.
-   This rtx needs to have as many (or more) fields as a MEM, since we
-   can change REG rtx's into MEMs during reload.  */
-DEF_RTL_EXPR(REG, "reg", "i00", RTX_OBJ)
-
-/* A scratch register.  This represents a register used only within a
-   single insn.  It will be turned into a REG during register allocation
-   or reload unless the constraint indicates that the register won't be
-   needed, in which case it can remain a SCRATCH.  This code is
-   marked as having one operand so it can be turned into a REG.  */
-DEF_RTL_EXPR(SCRATCH, "scratch", "0", RTX_OBJ)
-
-/* A reference to a part of another value.  The first operand is the
-   complete value and the second is the byte offset of the selected part.   */
-DEF_RTL_EXPR(SUBREG, "subreg", "ei", RTX_EXTRA)
-
-/* This one-argument rtx is used for move instructions
-   that are guaranteed to alter only the low part of a destination.
-   Thus, (SET (SUBREG:HI (REG...)) (MEM:HI ...))
-   has an unspecified effect on the high part of REG,
-   but (SET (STRICT_LOW_PART (SUBREG:HI (REG...))) (MEM:HI ...))
-   is guaranteed to alter only the bits of REG that are in HImode.
-
-   The actual instruction used is probably the same in both cases,
-   but the register constraints may be tighter when STRICT_LOW_PART
-   is in use.  */
-
-DEF_RTL_EXPR(STRICT_LOW_PART, "strict_low_part", "e", RTX_EXTRA)
-
-/* (CONCAT a b) represents the virtual concatenation of a and b
-   to make a value that has as many bits as a and b put together.
-   This is used for complex values.  Normally it appears only
-   in DECL_RTLs and during RTL generation, but not in the insn chain.  */
-DEF_RTL_EXPR(CONCAT, "concat", "ee", RTX_OBJ)
-
-/* (CONCATN [a1 a2 ... an]) represents the virtual concatenation of
-   all An to make a value.  This is an extension of CONCAT to larger
-   number of components.  Like CONCAT, it should not appear in the
-   insn chain.  Every element of the CONCATN is the same size.  */
-DEF_RTL_EXPR(CONCATN, "concatn", "E", RTX_OBJ)
-
-/* A memory location; operand is the address.  The second operand is the
-   alias set to which this MEM belongs.  We use `0' instead of `w' for this
-   field so that the field need not be specified in machine descriptions.  */
-DEF_RTL_EXPR(MEM, "mem", "e0", RTX_OBJ)
-
-/* Reference to an assembler label in the code for this function.
-   The operand is a CODE_LABEL found in the insn chain.  */
-DEF_RTL_EXPR(LABEL_REF, "label_ref", "u", RTX_CONST_OBJ)
-
-/* Reference to a named label:
-   Operand 0: label name
-   Operand 1: flags (see SYMBOL_FLAG_* in rtl.h)
-   Operand 2: tree from which this symbol is derived, or null.
-   This is either a DECL node, or some kind of constant.  */
-DEF_RTL_EXPR(SYMBOL_REF, "symbol_ref", "s00", RTX_CONST_OBJ)
-
-/* The condition code register is represented, in our imagination,
-   as a register holding a value that can be compared to zero.
-   In fact, the machine has already compared them and recorded the
-   results; but instructions that look at the condition code
-   pretend to be looking at the entire value and comparing it.  */
-DEF_RTL_EXPR(CC0, "cc0", "", RTX_OBJ)
-
-/* ----------------------------------------------------------------------
-   Expressions for operators in an rtl pattern
-   ---------------------------------------------------------------------- */
-
-/* if_then_else.  This is used in representing ordinary
-   conditional jump instructions.
-     Operand:
-     0:  condition
-     1:  then expr
-     2:  else expr */
-DEF_RTL_EXPR(IF_THEN_ELSE, "if_then_else", "eee", RTX_TERNARY)
-
-/* Comparison, produces a condition code result.  */
-DEF_RTL_EXPR(COMPARE, "compare", "ee", RTX_BIN_ARITH)
-
-/* plus */
-DEF_RTL_EXPR(PLUS, "plus", "ee", RTX_COMM_ARITH)
-
-/* Operand 0 minus operand 1.  */
-DEF_RTL_EXPR(MINUS, "minus", "ee", RTX_BIN_ARITH)
-
-/* Minus operand 0.  */
-DEF_RTL_EXPR(NEG, "neg", "e", RTX_UNARY)
-
-DEF_RTL_EXPR(MULT, "mult", "ee", RTX_COMM_ARITH)
-
-/* Multiplication with signed saturation */
-DEF_RTL_EXPR(SS_MULT, "ss_mult", "ee", RTX_COMM_ARITH)
-/* Multiplication with unsigned saturation */
-DEF_RTL_EXPR(US_MULT, "us_mult", "ee", RTX_COMM_ARITH)
-
-/* Operand 0 divided by operand 1.  */
-DEF_RTL_EXPR(DIV, "div", "ee", RTX_BIN_ARITH)
-/* Division with signed saturation */
-DEF_RTL_EXPR(SS_DIV, "ss_div", "ee", RTX_BIN_ARITH)
-/* Division with unsigned saturation */
-DEF_RTL_EXPR(US_DIV, "us_div", "ee", RTX_BIN_ARITH)
-
-/* Remainder of operand 0 divided by operand 1.  */
-DEF_RTL_EXPR(MOD, "mod", "ee", RTX_BIN_ARITH)
-
-/* Unsigned divide and remainder.  */
-DEF_RTL_EXPR(UDIV, "udiv", "ee", RTX_BIN_ARITH)
-DEF_RTL_EXPR(UMOD, "umod", "ee", RTX_BIN_ARITH)
-
-/* Bitwise operations.  */
-DEF_RTL_EXPR(AND, "and", "ee", RTX_COMM_ARITH)
-DEF_RTL_EXPR(IOR, "ior", "ee", RTX_COMM_ARITH)
-DEF_RTL_EXPR(XOR, "xor", "ee", RTX_COMM_ARITH)
-DEF_RTL_EXPR(NOT, "not", "e", RTX_UNARY)
-
-/* Operand:
-     0:  value to be shifted.
-     1:  number of bits.  */
-DEF_RTL_EXPR(ASHIFT, "ashift", "ee", RTX_BIN_ARITH) /* shift left */
-DEF_RTL_EXPR(ROTATE, "rotate", "ee", RTX_BIN_ARITH) /* rotate left */
-DEF_RTL_EXPR(ASHIFTRT, "ashiftrt", "ee", RTX_BIN_ARITH) /* arithmetic shift right */
-DEF_RTL_EXPR(LSHIFTRT, "lshiftrt", "ee", RTX_BIN_ARITH) /* logical shift right */
-DEF_RTL_EXPR(ROTATERT, "rotatert", "ee", RTX_BIN_ARITH) /* rotate right */
-
-/* Minimum and maximum values of two operands.  We need both signed and
-   unsigned forms.  (We cannot use MIN for SMIN because it conflicts
-   with a macro of the same name.)   The signed variants should be used
-   with floating point.  Further, if both operands are zeros, or if either
-   operand is NaN, then it is unspecified which of the two operands is
-   returned as the result.  */
-
-DEF_RTL_EXPR(SMIN, "smin", "ee", RTX_COMM_ARITH)
-DEF_RTL_EXPR(SMAX, "smax", "ee", RTX_COMM_ARITH)
-DEF_RTL_EXPR(UMIN, "umin", "ee", RTX_COMM_ARITH)
-DEF_RTL_EXPR(UMAX, "umax", "ee", RTX_COMM_ARITH)
-
-/* These unary operations are used to represent incrementation
-   and decrementation as they occur in memory addresses.
-   The amount of increment or decrement are not represented
-   because they can be understood from the machine-mode of the
-   containing MEM.  These operations exist in only two cases:
-   1. pushes onto the stack.
-   2. created automatically by the auto-inc-dec pass.  */
-DEF_RTL_EXPR(PRE_DEC, "pre_dec", "e", RTX_AUTOINC)
-DEF_RTL_EXPR(PRE_INC, "pre_inc", "e", RTX_AUTOINC)
-DEF_RTL_EXPR(POST_DEC, "post_dec", "e", RTX_AUTOINC)
-DEF_RTL_EXPR(POST_INC, "post_inc", "e", RTX_AUTOINC)
-
-/* These binary operations are used to represent generic address
-   side-effects in memory addresses, except for simple incrementation
-   or decrementation which use the above operations.  They are
-   created automatically by the life_analysis pass in flow.c.
-   The first operand is a REG which is used as the address.
-   The second operand is an expression that is assigned to the
-   register, either before (PRE_MODIFY) or after (POST_MODIFY)
-   evaluating the address.
-   Currently, the compiler can only handle second operands of the
-   form (plus (reg) (reg)) and (plus (reg) (const_int)), where
-   the first operand of the PLUS has to be the same register as
-   the first operand of the *_MODIFY.  */
-DEF_RTL_EXPR(PRE_MODIFY, "pre_modify", "ee", RTX_AUTOINC)
-DEF_RTL_EXPR(POST_MODIFY, "post_modify", "ee", RTX_AUTOINC)
-
-/* Comparison operations.  The ordered comparisons exist in two
-   flavors, signed and unsigned.  */
-DEF_RTL_EXPR(NE, "ne", "ee", RTX_COMM_COMPARE)
-DEF_RTL_EXPR(EQ, "eq", "ee", RTX_COMM_COMPARE)
-DEF_RTL_EXPR(GE, "ge", "ee", RTX_COMPARE)
-DEF_RTL_EXPR(GT, "gt", "ee", RTX_COMPARE)
-DEF_RTL_EXPR(LE, "le", "ee", RTX_COMPARE)
-DEF_RTL_EXPR(LT, "lt", "ee", RTX_COMPARE)
-DEF_RTL_EXPR(GEU, "geu", "ee", RTX_COMPARE)
-DEF_RTL_EXPR(GTU, "gtu", "ee", RTX_COMPARE)
-DEF_RTL_EXPR(LEU, "leu", "ee", RTX_COMPARE)
-DEF_RTL_EXPR(LTU, "ltu", "ee", RTX_COMPARE)
-
-/* Additional floating point unordered comparison flavors.  */
-DEF_RTL_EXPR(UNORDERED, "unordered", "ee", RTX_COMM_COMPARE)
-DEF_RTL_EXPR(ORDERED, "ordered", "ee", RTX_COMM_COMPARE)
-
-/* These are equivalent to unordered or ...  */
-DEF_RTL_EXPR(UNEQ, "uneq", "ee", RTX_COMM_COMPARE)
-DEF_RTL_EXPR(UNGE, "unge", "ee", RTX_COMPARE)
-DEF_RTL_EXPR(UNGT, "ungt", "ee", RTX_COMPARE)
-DEF_RTL_EXPR(UNLE, "unle", "ee", RTX_COMPARE)
-DEF_RTL_EXPR(UNLT, "unlt", "ee", RTX_COMPARE)
-
-/* This is an ordered NE, ie !UNEQ, ie false for NaN.  */
-DEF_RTL_EXPR(LTGT, "ltgt", "ee", RTX_COMM_COMPARE)
-
-/* Represents the result of sign-extending the sole operand.
-   The machine modes of the operand and of the SIGN_EXTEND expression
-   determine how much sign-extension is going on.  */
-DEF_RTL_EXPR(SIGN_EXTEND, "sign_extend", "e", RTX_UNARY)
-
-/* Similar for zero-extension (such as unsigned short to int).  */
-DEF_RTL_EXPR(ZERO_EXTEND, "zero_extend", "e", RTX_UNARY)
-
-/* Similar but here the operand has a wider mode.  */
-DEF_RTL_EXPR(TRUNCATE, "truncate", "e", RTX_UNARY)
-
-/* Similar for extending floating-point values (such as SFmode to DFmode).  */
-DEF_RTL_EXPR(FLOAT_EXTEND, "float_extend", "e", RTX_UNARY)
-DEF_RTL_EXPR(FLOAT_TRUNCATE, "float_truncate", "e", RTX_UNARY)
-
-/* Conversion of fixed point operand to floating point value.  */
-DEF_RTL_EXPR(FLOAT, "float", "e", RTX_UNARY)
-
-/* With fixed-point machine mode:
-   Conversion of floating point operand to fixed point value.
-   Value is defined only when the operand's value is an integer.
-   With floating-point machine mode (and operand with same mode):
-   Operand is rounded toward zero to produce an integer value
-   represented in floating point.  */
-DEF_RTL_EXPR(FIX, "fix", "e", RTX_UNARY)
-
-/* Conversion of unsigned fixed point operand to floating point value.  */
-DEF_RTL_EXPR(UNSIGNED_FLOAT, "unsigned_float", "e", RTX_UNARY)
-
-/* With fixed-point machine mode:
-   Conversion of floating point operand to *unsigned* fixed point value.
-   Value is defined only when the operand's value is an integer.  */
-DEF_RTL_EXPR(UNSIGNED_FIX, "unsigned_fix", "e", RTX_UNARY)
-
-/* Conversions involving fractional fixed-point types without saturation,
-   including:
-     fractional to fractional (of different precision),
-     signed integer to fractional,
-     fractional to signed integer,
-     floating point to fractional,
-     fractional to floating point.
-   NOTE: fractional can be either signed or unsigned for conversions.  */
-DEF_RTL_EXPR(FRACT_CONVERT, "fract_convert", "e", RTX_UNARY)
-
-/* Conversions involving fractional fixed-point types and unsigned integer
-   without saturation, including:
-     unsigned integer to fractional,
-     fractional to unsigned integer.
-   NOTE: fractional can be either signed or unsigned for conversions.  */
-DEF_RTL_EXPR(UNSIGNED_FRACT_CONVERT, "unsigned_fract_convert", "e", RTX_UNARY)
-
-/* Conversions involving fractional fixed-point types with saturation,
-   including:
-     fractional to fractional (of different precision),
-     signed integer to fractional,
-     floating point to fractional.
-   NOTE: fractional can be either signed or unsigned for conversions.  */
-DEF_RTL_EXPR(SAT_FRACT, "sat_fract", "e", RTX_UNARY)
-
-/* Conversions involving fractional fixed-point types and unsigned integer
-   with saturation, including:
-     unsigned integer to fractional.
-   NOTE: fractional can be either signed or unsigned for conversions.  */
-DEF_RTL_EXPR(UNSIGNED_SAT_FRACT, "unsigned_sat_fract", "e", RTX_UNARY)
-
-/* Absolute value */
-DEF_RTL_EXPR(ABS, "abs", "e", RTX_UNARY)
-
-/* Square root */
-DEF_RTL_EXPR(SQRT, "sqrt", "e", RTX_UNARY)
-
-/* Swap bytes.  */
-DEF_RTL_EXPR(BSWAP, "bswap", "e", RTX_UNARY)
-
-/* Find first bit that is set.
-   Value is 1 + number of trailing zeros in the arg.,
-   or 0 if arg is 0.  */
-DEF_RTL_EXPR(FFS, "ffs", "e", RTX_UNARY)
-
-/* Count number of leading redundant sign bits (number of leading
-   sign bits minus one).  */
-DEF_RTL_EXPR(CLRSB, "clrsb", "e", RTX_UNARY)
-
-/* Count leading zeros.  */
-DEF_RTL_EXPR(CLZ, "clz", "e", RTX_UNARY)
-
-/* Count trailing zeros.  */
-DEF_RTL_EXPR(CTZ, "ctz", "e", RTX_UNARY)
-
-/* Population count (number of 1 bits).  */
-DEF_RTL_EXPR(POPCOUNT, "popcount", "e", RTX_UNARY)
-
-/* Population parity (number of 1 bits modulo 2).  */
-DEF_RTL_EXPR(PARITY, "parity", "e", RTX_UNARY)
-
-/* Reference to a signed bit-field of specified size and position.
-   Operand 0 is the memory unit (usually SImode or QImode) which
-   contains the field's first bit.  Operand 1 is the width, in bits.
-   Operand 2 is the number of bits in the memory unit before the
-   first bit of this field.
-   If BITS_BIG_ENDIAN is defined, the first bit is the msb and
-   operand 2 counts from the msb of the memory unit.
-   Otherwise, the first bit is the lsb and operand 2 counts from
-   the lsb of the memory unit.
-   This kind of expression can not appear as an lvalue in RTL.  */
-DEF_RTL_EXPR(SIGN_EXTRACT, "sign_extract", "eee", RTX_BITFIELD_OPS)
-
-/* Similar for unsigned bit-field.
-   But note!  This kind of expression _can_ appear as an lvalue.  */
-DEF_RTL_EXPR(ZERO_EXTRACT, "zero_extract", "eee", RTX_BITFIELD_OPS)
-
-/* For RISC machines.  These save memory when splitting insns.  */
-
-/* HIGH are the high-order bits of a constant expression.  */
-DEF_RTL_EXPR(HIGH, "high", "e", RTX_CONST_OBJ)
-
-/* LO_SUM is the sum of a register and the low-order bits
-   of a constant expression.  */
-DEF_RTL_EXPR(LO_SUM, "lo_sum", "ee", RTX_OBJ)
-
-/* Describes a merge operation between two vector values.
-   Operands 0 and 1 are the vectors to be merged, operand 2 is a bitmask
-   that specifies where the parts of the result are taken from.  Set bits
-   indicate operand 0, clear bits indicate operand 1.  The parts are defined
-   by the mode of the vectors.  */
-DEF_RTL_EXPR(VEC_MERGE, "vec_merge", "eee", RTX_TERNARY)
-
-/* Describes an operation that selects parts of a vector.
-   Operands 0 is the source vector, operand 1 is a PARALLEL that contains
-   a CONST_INT for each of the subparts of the result vector, giving the
-   number of the source subpart that should be stored into it.  */
-DEF_RTL_EXPR(VEC_SELECT, "vec_select", "ee", RTX_BIN_ARITH)
-
-/* Describes a vector concat operation.  Operands 0 and 1 are the source
-   vectors, the result is a vector that is as long as operands 0 and 1
-   combined and is the concatenation of the two source vectors.  */
-DEF_RTL_EXPR(VEC_CONCAT, "vec_concat", "ee", RTX_BIN_ARITH)
-
-/* Describes an operation that converts a small vector into a larger one by
-   duplicating the input values.  The output vector mode must have the same
-   submodes as the input vector mode, and the number of output parts must be
-   an integer multiple of the number of input parts.  */
-DEF_RTL_EXPR(VEC_DUPLICATE, "vec_duplicate", "e", RTX_UNARY)
-
-/* Addition with signed saturation */
-DEF_RTL_EXPR(SS_PLUS, "ss_plus", "ee", RTX_COMM_ARITH)
-
-/* Addition with unsigned saturation */
-DEF_RTL_EXPR(US_PLUS, "us_plus", "ee", RTX_COMM_ARITH)
-
-/* Operand 0 minus operand 1, with signed saturation.  */
-DEF_RTL_EXPR(SS_MINUS, "ss_minus", "ee", RTX_BIN_ARITH)
-
-/* Negation with signed saturation.  */
-DEF_RTL_EXPR(SS_NEG, "ss_neg", "e", RTX_UNARY)
-/* Negation with unsigned saturation.  */
-DEF_RTL_EXPR(US_NEG, "us_neg", "e", RTX_UNARY)
-
-/* Absolute value with signed saturation.  */
-DEF_RTL_EXPR(SS_ABS, "ss_abs", "e", RTX_UNARY)
-
-/* Shift left with signed saturation.  */
-DEF_RTL_EXPR(SS_ASHIFT, "ss_ashift", "ee", RTX_BIN_ARITH)
-
-/* Shift left with unsigned saturation.  */
-DEF_RTL_EXPR(US_ASHIFT, "us_ashift", "ee", RTX_BIN_ARITH)
-
-/* Operand 0 minus operand 1, with unsigned saturation.  */
-DEF_RTL_EXPR(US_MINUS, "us_minus", "ee", RTX_BIN_ARITH)
-
-/* Signed saturating truncate.  */
-DEF_RTL_EXPR(SS_TRUNCATE, "ss_truncate", "e", RTX_UNARY)
-
-/* Unsigned saturating truncate.  */
-DEF_RTL_EXPR(US_TRUNCATE, "us_truncate", "e", RTX_UNARY)
-
-/* Floating point multiply/add combined instruction.  */
-DEF_RTL_EXPR(FMA, "fma", "eee", RTX_TERNARY)
-
-/* Information about the variable and its location.  */
-/* Changed 'te' to 'tei'; the 'i' field is for recording
-   initialization status of variables.  */
-DEF_RTL_EXPR(VAR_LOCATION, "var_location", "tei", RTX_EXTRA)
-
-/* Used in VAR_LOCATION for a pointer to a decl that is no longer
-   addressable.  */
-DEF_RTL_EXPR(DEBUG_IMPLICIT_PTR, "debug_implicit_ptr", "t", RTX_OBJ)
-
-/* Represents value that argument had on function entry.  The
-   single argument is the DECL_INCOMING_RTL of the corresponding
-   parameter.  */
-DEF_RTL_EXPR(ENTRY_VALUE, "entry_value", "0", RTX_OBJ)
-
-/* Used in VAR_LOCATION for a reference to a parameter that has
-   been optimized away completely.  */
-DEF_RTL_EXPR(DEBUG_PARAMETER_REF, "debug_parameter_ref", "t", RTX_OBJ)
-
-/* All expressions from this point forward appear only in machine
-   descriptions.  */
-#ifdef GENERATOR_FILE
-
-/* Pattern-matching operators:  */
-
-/* Use the function named by the second arg (the string)
-   as a predicate; if matched, store the structure that was matched
-   in the operand table at index specified by the first arg (the integer).
-   If the second arg is the null string, the structure is just stored.
-
-   A third string argument indicates to the register allocator restrictions
-   on where the operand can be allocated.
-
-   If the target needs no restriction on any instruction this field should
-   be the null string.
-
-   The string is prepended by:
-   '=' to indicate the operand is only written to.
-   '+' to indicate the operand is both read and written to.
-
-   Each character in the string represents an allocable class for an operand.
-   'g' indicates the operand can be any valid class.
-   'i' indicates the operand can be immediate (in the instruction) data.
-   'r' indicates the operand can be in a register.
-   'm' indicates the operand can be in memory.
-   'o' a subset of the 'm' class.  Those memory addressing modes that
-       can be offset at compile time (have a constant added to them).
-
-   Other characters indicate target dependent operand classes and
-   are described in each target's machine description.
-
-   For instructions with more than one operand, sets of classes can be
-   separated by a comma to indicate the appropriate multi-operand constraints.
-   There must be a 1 to 1 correspondence between these sets of classes in
-   all operands for an instruction.
-   */
-DEF_RTL_EXPR(MATCH_OPERAND, "match_operand", "iss", RTX_MATCH)
-
-/* Match a SCRATCH or a register.  When used to generate rtl, a
-   SCRATCH is generated.  As for MATCH_OPERAND, the mode specifies
-   the desired mode and the first argument is the operand number.
-   The second argument is the constraint.  */
-DEF_RTL_EXPR(MATCH_SCRATCH, "match_scratch", "is", RTX_MATCH)
-
-/* Apply a predicate, AND match recursively the operands of the rtx.
-   Operand 0 is the operand-number, as in match_operand.
-   Operand 1 is a predicate to apply (as a string, a function name).
-   Operand 2 is a vector of expressions, each of which must match
-   one subexpression of the rtx this construct is matching.  */
-DEF_RTL_EXPR(MATCH_OPERATOR, "match_operator", "isE", RTX_MATCH)
-
-/* Match a PARALLEL of arbitrary length.  The predicate is applied
-   to the PARALLEL and the initial expressions in the PARALLEL are matched.
-   Operand 0 is the operand-number, as in match_operand.
-   Operand 1 is a predicate to apply to the PARALLEL.
-   Operand 2 is a vector of expressions, each of which must match the
-   corresponding element in the PARALLEL.  */
-DEF_RTL_EXPR(MATCH_PARALLEL, "match_parallel", "isE", RTX_MATCH)
-
-/* Match only something equal to what is stored in the operand table
-   at the index specified by the argument.  Use with MATCH_OPERAND.  */
-DEF_RTL_EXPR(MATCH_DUP, "match_dup", "i", RTX_MATCH)
-
-/* Match only something equal to what is stored in the operand table
-   at the index specified by the argument.  Use with MATCH_OPERATOR.  */
-DEF_RTL_EXPR(MATCH_OP_DUP, "match_op_dup", "iE", RTX_MATCH)
-
-/* Match only something equal to what is stored in the operand table
-   at the index specified by the argument.  Use with MATCH_PARALLEL.  */
-DEF_RTL_EXPR(MATCH_PAR_DUP, "match_par_dup", "iE", RTX_MATCH)
-
-/* Appears only in define_predicate/define_special_predicate
-   expressions.  Evaluates true only if the operand has an RTX code
-   from the set given by the argument (a comma-separated list).  If the
-   second argument is present and nonempty, it is a sequence of digits
-   and/or letters which indicates the subexpression to test, using the
-   same syntax as genextract/genrecog's location strings: 0-9 for
-   XEXP (op, n), a-z for XVECEXP (op, 0, n); each character applies to
-   the result of the one before it.  */
-DEF_RTL_EXPR(MATCH_CODE, "match_code", "ss", RTX_MATCH)
-
-/* Used to inject a C conditional expression into an .md file.  It can
-   appear in a predicate definition or an attribute expression.  */
-DEF_RTL_EXPR(MATCH_TEST, "match_test", "s", RTX_MATCH)
-
-/* Insn (and related) definitions.  */
-
-/* Definition of the pattern for one kind of instruction.
-   Operand:
-   0: names this instruction.
-      If the name is the null string, the instruction is in the
-      machine description just to be recognized, and will never be emitted by
-      the tree to rtl expander.
-   1: is the pattern.
-   2: is a string which is a C expression
-      giving an additional condition for recognizing this pattern.
-      A null string means no extra condition.
-   3: is the action to execute if this pattern is matched.
-      If this assembler code template starts with a * then it is a fragment of
-      C code to run to decide on a template to use.  Otherwise, it is the
-      template to use.
-   4: optionally, a vector of attributes for this insn.
-     */
-DEF_RTL_EXPR(DEFINE_INSN, "define_insn", "sEsTV", RTX_EXTRA)
-
-/* Definition of a peephole optimization.
-   1st operand: vector of insn patterns to match
-   2nd operand: C expression that must be true
-   3rd operand: template or C code to produce assembler output.
-   4: optionally, a vector of attributes for this insn.
-
-   This form is deprecated; use define_peephole2 instead.  */
-DEF_RTL_EXPR(DEFINE_PEEPHOLE, "define_peephole", "EsTV", RTX_EXTRA)
-
-/* Definition of a split operation.
-   1st operand: insn pattern to match
-   2nd operand: C expression that must be true
-   3rd operand: vector of insn patterns to place into a SEQUENCE
-   4th operand: optionally, some C code to execute before generating the
-	insns.  This might, for example, create some RTX's and store them in
-	elements of `recog_data.operand' for use by the vector of
-	insn-patterns.
-	(`operands' is an alias here for `recog_data.operand').  */
-DEF_RTL_EXPR(DEFINE_SPLIT, "define_split", "EsES", RTX_EXTRA)
-
-/* Definition of an insn and associated split.
-   This is the concatenation, with a few modifications, of a define_insn
-   and a define_split which share the same pattern.
-   Operand:
-   0: names this instruction.
-      If the name is the null string, the instruction is in the
-      machine description just to be recognized, and will never be emitted by
-      the tree to rtl expander.
-   1: is the pattern.
-   2: is a string which is a C expression
-      giving an additional condition for recognizing this pattern.
-      A null string means no extra condition.
-   3: is the action to execute if this pattern is matched.
-      If this assembler code template starts with a * then it is a fragment of
-      C code to run to decide on a template to use.  Otherwise, it is the
-      template to use.
-   4: C expression that must be true for split.  This may start with "&&"
-      in which case the split condition is the logical and of the insn
-      condition and what follows the "&&" of this operand.
-   5: vector of insn patterns to place into a SEQUENCE
-   6: optionally, some C code to execute before generating the
-	insns.  This might, for example, create some RTX's and store them in
-	elements of `recog_data.operand' for use by the vector of
-	insn-patterns.
-	(`operands' is an alias here for `recog_data.operand').
-   7: optionally, a vector of attributes for this insn.  */
-DEF_RTL_EXPR(DEFINE_INSN_AND_SPLIT, "define_insn_and_split", "sEsTsESV", RTX_EXTRA)
-
-/* Definition of an RTL peephole operation.
-   Follows the same arguments as define_split.  */
-DEF_RTL_EXPR(DEFINE_PEEPHOLE2, "define_peephole2", "EsES", RTX_EXTRA)
-
-/* Define how to generate multiple insns for a standard insn name.
-   1st operand: the insn name.
-   2nd operand: vector of insn-patterns.
-	Use match_operand to substitute an element of `recog_data.operand'.
-   3rd operand: C expression that must be true for this to be available.
-	This may not test any operands.
-   4th operand: Extra C code to execute before generating the insns.
-	This might, for example, create some RTX's and store them in
-	elements of `recog_data.operand' for use by the vector of
-	insn-patterns.
-	(`operands' is an alias here for `recog_data.operand').
-   5th: optionally, a vector of attributes for this expand.  */
-DEF_RTL_EXPR(DEFINE_EXPAND, "define_expand", "sEssV", RTX_EXTRA)
-
-/* Define a requirement for delay slots.
-   1st operand: Condition involving insn attributes that, if true,
-	        indicates that the insn requires the number of delay slots
-		shown.
-   2nd operand: Vector whose length is the three times the number of delay
-		slots required.
-	        Each entry gives three conditions, each involving attributes.
-		The first must be true for an insn to occupy that delay slot
-		location.  The second is true for all insns that can be
-		annulled if the branch is true and the third is true for all
-		insns that can be annulled if the branch is false.
-
-   Multiple DEFINE_DELAYs may be present.  They indicate differing
-   requirements for delay slots.  */
-DEF_RTL_EXPR(DEFINE_DELAY, "define_delay", "eE", RTX_EXTRA)
-
-/* Define attribute computation for `asm' instructions.  */
-DEF_RTL_EXPR(DEFINE_ASM_ATTRIBUTES, "define_asm_attributes", "V", RTX_EXTRA)
-
-/* Definition of a conditional execution meta operation.  Automatically
-   generates new instances of DEFINE_INSN, selected by having attribute
-   "predicable" true.  The new pattern will contain a COND_EXEC and the
-   predicate at top-level.
-
-   Operand:
-   0: The predicate pattern.  The top-level form should match a
-      relational operator.  Operands should have only one alternative.
-   1: A C expression giving an additional condition for recognizing
-      the generated pattern.
-   2: A template or C code to produce assembler output.
-   3: A vector of attributes to append to the resulting cond_exec insn.  */
-DEF_RTL_EXPR(DEFINE_COND_EXEC, "define_cond_exec", "EssV", RTX_EXTRA)
-
-/* Definition of an operand predicate.  The difference between
-   DEFINE_PREDICATE and DEFINE_SPECIAL_PREDICATE is that genrecog will
-   not warn about a match_operand with no mode if it has a predicate
-   defined with DEFINE_SPECIAL_PREDICATE.
-
-   Operand:
-   0: The name of the predicate.
-   1: A boolean expression which computes whether or not the predicate
-      matches.  This expression can use IOR, AND, NOT, MATCH_OPERAND,
-      MATCH_CODE, and MATCH_TEST.  It must be specific enough that genrecog
-      can calculate the set of RTX codes that can possibly match.
-   2: A C function body which must return true for the predicate to match.
-      Optional.  Use this when the test is too complicated to fit into a
-      match_test expression.  */
-DEF_RTL_EXPR(DEFINE_PREDICATE, "define_predicate", "ses", RTX_EXTRA)
-DEF_RTL_EXPR(DEFINE_SPECIAL_PREDICATE, "define_special_predicate", "ses", RTX_EXTRA)
-
-/* Definition of a register operand constraint.  This simply maps the
-   constraint string to a register class.
-
-   Operand:
-   0: The name of the constraint (often, but not always, a single letter).
-   1: A C expression which evaluates to the appropriate register class for
-      this constraint.  If this is not just a constant, it should look only
-      at -m switches and the like.
-   2: A docstring for this constraint, in Texinfo syntax; not currently
-      used, in future will be incorporated into the manual's list of
-      machine-specific operand constraints.  */
-DEF_RTL_EXPR(DEFINE_REGISTER_CONSTRAINT, "define_register_constraint", "sss", RTX_EXTRA)
-
-/* Definition of a non-register operand constraint.  These look at the
-   operand and decide whether it fits the constraint.
-
-   DEFINE_CONSTRAINT gets no special treatment if it fails to match.
-   It is appropriate for constant-only constraints, and most others.
-
-   DEFINE_MEMORY_CONSTRAINT tells reload that this constraint can be made
-   to match, if it doesn't already, by converting the operand to the form
-   (mem (reg X)) where X is a base register.  It is suitable for constraints
-   that describe a subset of all memory references.
-
-   DEFINE_ADDRESS_CONSTRAINT tells reload that this constraint can be made
-   to match, if it doesn't already, by converting the operand to the form
-   (reg X) where X is a base register.  It is suitable for constraints that
-   describe a subset of all address references.
-
-   When in doubt, use plain DEFINE_CONSTRAINT.
-
-   Operand:
-   0: The name of the constraint (often, but not always, a single letter).
-   1: A docstring for this constraint, in Texinfo syntax; not currently
-      used, in future will be incorporated into the manual's list of
-      machine-specific operand constraints.
-   2: A boolean expression which computes whether or not the constraint
-      matches.  It should follow the same rules as a define_predicate
-      expression, including the bit about specifying the set of RTX codes
-      that could possibly match.  MATCH_TEST subexpressions may make use of
-      these variables:
-        `op'    - the RTL object defining the operand.
-        `mode'  - the mode of `op'.
-	`ival'  - INTVAL(op), if op is a CONST_INT.
-        `hval'  - CONST_DOUBLE_HIGH(op), if op is an integer CONST_DOUBLE.
-        `lval'  - CONST_DOUBLE_LOW(op), if op is an integer CONST_DOUBLE.
-        `rval'  - CONST_DOUBLE_REAL_VALUE(op), if op is a floating-point
-                  CONST_DOUBLE.
-      Do not use ival/hval/lval/rval if op is not the appropriate kind of
-      RTL object.  */
-DEF_RTL_EXPR(DEFINE_CONSTRAINT, "define_constraint", "sse", RTX_EXTRA)
-DEF_RTL_EXPR(DEFINE_MEMORY_CONSTRAINT, "define_memory_constraint", "sse", RTX_EXTRA)
-DEF_RTL_EXPR(DEFINE_ADDRESS_CONSTRAINT, "define_address_constraint", "sse", RTX_EXTRA)
-
-
-/* Constructions for CPU pipeline description described by NDFAs.  */
-
-/* (define_cpu_unit string [string]) describes cpu functional
-   units (separated by comma).
-
-   1st operand: Names of cpu functional units.
-   2nd operand: Name of automaton (see comments for DEFINE_AUTOMATON).
-
-   All define_reservations, define_cpu_units, and
-   define_query_cpu_units should have unique names which may not be
-   "nothing".  */
-DEF_RTL_EXPR(DEFINE_CPU_UNIT, "define_cpu_unit", "sS", RTX_EXTRA)
-
-/* (define_query_cpu_unit string [string]) describes cpu functional
-   units analogously to define_cpu_unit.  The reservation of such
-   units can be queried for automaton state.  */
-DEF_RTL_EXPR(DEFINE_QUERY_CPU_UNIT, "define_query_cpu_unit", "sS", RTX_EXTRA)
-
-/* (exclusion_set string string) means that each CPU functional unit
-   in the first string can not be reserved simultaneously with any
-   unit whose name is in the second string and vise versa.  CPU units
-   in the string are separated by commas.  For example, it is useful
-   for description CPU with fully pipelined floating point functional
-   unit which can execute simultaneously only single floating point
-   insns or only double floating point insns.  All CPU functional
-   units in a set should belong to the same automaton.  */
-DEF_RTL_EXPR(EXCLUSION_SET, "exclusion_set", "ss", RTX_EXTRA)
-
-/* (presence_set string string) means that each CPU functional unit in
-   the first string can not be reserved unless at least one of pattern
-   of units whose names are in the second string is reserved.  This is
-   an asymmetric relation.  CPU units or unit patterns in the strings
-   are separated by commas.  Pattern is one unit name or unit names
-   separated by white-spaces.
-
-   For example, it is useful for description that slot1 is reserved
-   after slot0 reservation for a VLIW processor.  We could describe it
-   by the following construction
-
-      (presence_set "slot1" "slot0")
-
-   Or slot1 is reserved only after slot0 and unit b0 reservation.  In
-   this case we could write
-
-      (presence_set "slot1" "slot0 b0")
-
-   All CPU functional units in a set should belong to the same
-   automaton.  */
-DEF_RTL_EXPR(PRESENCE_SET, "presence_set", "ss", RTX_EXTRA)
-
-/* (final_presence_set string string) is analogous to `presence_set'.
-   The difference between them is when checking is done.  When an
-   instruction is issued in given automaton state reflecting all
-   current and planned unit reservations, the automaton state is
-   changed.  The first state is a source state, the second one is a
-   result state.  Checking for `presence_set' is done on the source
-   state reservation, checking for `final_presence_set' is done on the
-   result reservation.  This construction is useful to describe a
-   reservation which is actually two subsequent reservations.  For
-   example, if we use
-
-      (presence_set "slot1" "slot0")
-
-   the following insn will be never issued (because slot1 requires
-   slot0 which is absent in the source state).
-
-      (define_reservation "insn_and_nop" "slot0 + slot1")
-
-   but it can be issued if we use analogous `final_presence_set'.  */
-DEF_RTL_EXPR(FINAL_PRESENCE_SET, "final_presence_set", "ss", RTX_EXTRA)
-
-/* (absence_set string string) means that each CPU functional unit in
-   the first string can be reserved only if each pattern of units
-   whose names are in the second string is not reserved.  This is an
-   asymmetric relation (actually exclusion set is analogous to this
-   one but it is symmetric).  CPU units or unit patterns in the string
-   are separated by commas.  Pattern is one unit name or unit names
-   separated by white-spaces.
-
-   For example, it is useful for description that slot0 can not be
-   reserved after slot1 or slot2 reservation for a VLIW processor.  We
-   could describe it by the following construction
-
-      (absence_set "slot2" "slot0, slot1")
-
-   Or slot2 can not be reserved if slot0 and unit b0 are reserved or
-   slot1 and unit b1 are reserved .  In this case we could write
-
-      (absence_set "slot2" "slot0 b0, slot1 b1")
-
-   All CPU functional units in a set should to belong the same
-   automaton.  */
-DEF_RTL_EXPR(ABSENCE_SET, "absence_set", "ss", RTX_EXTRA)
-
-/* (final_absence_set string string) is analogous to `absence_set' but
-   checking is done on the result (state) reservation.  See comments
-   for `final_presence_set'.  */
-DEF_RTL_EXPR(FINAL_ABSENCE_SET, "final_absence_set", "ss", RTX_EXTRA)
-
-/* (define_bypass number out_insn_names in_insn_names) names bypass
-   with given latency (the first number) from insns given by the first
-   string (see define_insn_reservation) into insns given by the second
-   string.  Insn names in the strings are separated by commas.  The
-   third operand is optional name of function which is additional
-   guard for the bypass.  The function will get the two insns as
-   parameters.  If the function returns zero the bypass will be
-   ignored for this case.  Additional guard is necessary to recognize
-   complicated bypasses, e.g. when consumer is load address.  If there
-   are more one bypass with the same output and input insns, the
-   chosen bypass is the first bypass with a guard in description whose
-   guard function returns nonzero.  If there is no such bypass, then
-   bypass without the guard function is chosen.  */
-DEF_RTL_EXPR(DEFINE_BYPASS, "define_bypass", "issS", RTX_EXTRA)
-
-/* (define_automaton string) describes names of automata generated and
-   used for pipeline hazards recognition.  The names are separated by
-   comma.  Actually it is possibly to generate the single automaton
-   but unfortunately it can be very large.  If we use more one
-   automata, the summary size of the automata usually is less than the
-   single one.  The automaton name is used in define_cpu_unit and
-   define_query_cpu_unit.  All automata should have unique names.  */
-DEF_RTL_EXPR(DEFINE_AUTOMATON, "define_automaton", "s", RTX_EXTRA)
-
-/* (automata_option string) describes option for generation of
-   automata.  Currently there are the following options:
-
-   o "no-minimization" which makes no minimization of automata.  This
-     is only worth to do when we are debugging the description and
-     need to look more accurately at reservations of states.
-
-   o "time" which means printing additional time statistics about
-      generation of automata.
-
-   o "v" which means generation of file describing the result
-     automata.  The file has suffix `.dfa' and can be used for the
-     description verification and debugging.
-
-   o "w" which means generation of warning instead of error for
-     non-critical errors.
-
-   o "ndfa" which makes nondeterministic finite state automata.
-
-   o "progress" which means output of a progress bar showing how many
-     states were generated so far for automaton being processed.  */
-DEF_RTL_EXPR(AUTOMATA_OPTION, "automata_option", "s", RTX_EXTRA)
-
-/* (define_reservation string string) names reservation (the first
-   string) of cpu functional units (the 2nd string).  Sometimes unit
-   reservations for different insns contain common parts.  In such
-   case, you can describe common part and use its name (the 1st
-   parameter) in regular expression in define_insn_reservation.  All
-   define_reservations, define_cpu_units, and define_query_cpu_units
-   should have unique names which may not be "nothing".  */
-DEF_RTL_EXPR(DEFINE_RESERVATION, "define_reservation", "ss", RTX_EXTRA)
-
-/* (define_insn_reservation name default_latency condition regexpr)
-   describes reservation of cpu functional units (the 3nd operand) for
-   instruction which is selected by the condition (the 2nd parameter).
-   The first parameter is used for output of debugging information.
-   The reservations are described by a regular expression according
-   the following syntax:
-
-       regexp = regexp "," oneof
-              | oneof
-
-       oneof = oneof "|" allof
-             | allof
-
-       allof = allof "+" repeat
-             | repeat
-
-       repeat = element "*" number
-              | element
-
-       element = cpu_function_unit_name
-               | reservation_name
-               | result_name
-               | "nothing"
-               | "(" regexp ")"
-
-       1. "," is used for describing start of the next cycle in
-       reservation.
-
-       2. "|" is used for describing the reservation described by the
-       first regular expression *or* the reservation described by the
-       second regular expression *or* etc.
-
-       3. "+" is used for describing the reservation described by the
-       first regular expression *and* the reservation described by the
-       second regular expression *and* etc.
-
-       4. "*" is used for convenience and simply means sequence in
-       which the regular expression are repeated NUMBER times with
-       cycle advancing (see ",").
-
-       5. cpu functional unit name which means its reservation.
-
-       6. reservation name -- see define_reservation.
-
-       7. string "nothing" means no units reservation.  */
-
-DEF_RTL_EXPR(DEFINE_INSN_RESERVATION, "define_insn_reservation", "sies", RTX_EXTRA)
-
-/* Expressions used for insn attributes.  */
-
-/* Definition of an insn attribute.
-   1st operand: name of the attribute
-   2nd operand: comma-separated list of possible attribute values
-   3rd operand: expression for the default value of the attribute.  */
-DEF_RTL_EXPR(DEFINE_ATTR, "define_attr", "sse", RTX_EXTRA)
-
-/* Definition of an insn attribute that uses an existing enumerated type.
-   1st operand: name of the attribute
-   2nd operand: the name of the enumerated type
-   3rd operand: expression for the default value of the attribute.  */
-DEF_RTL_EXPR(DEFINE_ENUM_ATTR, "define_enum_attr", "sse", RTX_EXTRA)
-
-/* Marker for the name of an attribute.  */
-DEF_RTL_EXPR(ATTR, "attr", "s", RTX_EXTRA)
-
-/* For use in the last (optional) operand of DEFINE_INSN or DEFINE_PEEPHOLE and
-   in DEFINE_ASM_INSN to specify an attribute to assign to insns matching that
-   pattern.
-
-   (set_attr "name" "value") is equivalent to
-   (set (attr "name") (const_string "value"))  */
-DEF_RTL_EXPR(SET_ATTR, "set_attr", "ss", RTX_EXTRA)
-
-/* In the last operand of DEFINE_INSN and DEFINE_PEEPHOLE, this can be used to
-   specify that attribute values are to be assigned according to the
-   alternative matched.
-
-   The following three expressions are equivalent:
-
-   (set (attr "att") (cond [(eq_attrq "alternative" "1") (const_string "a1")
-			    (eq_attrq "alternative" "2") (const_string "a2")]
-			   (const_string "a3")))
-   (set_attr_alternative "att" [(const_string "a1") (const_string "a2")
-				 (const_string "a3")])
-   (set_attr "att" "a1,a2,a3")
- */
-DEF_RTL_EXPR(SET_ATTR_ALTERNATIVE, "set_attr_alternative", "sE", RTX_EXTRA)
-
-/* A conditional expression true if the value of the specified attribute of
-   the current insn equals the specified value.  The first operand is the
-   attribute name and the second is the comparison value.  */
-DEF_RTL_EXPR(EQ_ATTR, "eq_attr", "ss", RTX_EXTRA)
-
-/* A special case of the above representing a set of alternatives.  The first
-   operand is bitmap of the set, the second one is the default value.  */
-DEF_RTL_EXPR(EQ_ATTR_ALT, "eq_attr_alt", "ii", RTX_EXTRA)
-
-/* A conditional expression which is true if the specified flag is
-   true for the insn being scheduled in reorg.
-
-   genattr.c defines the following flags which can be tested by
-   (attr_flag "foo") expressions in eligible_for_delay: forward, backward.  */
-
-DEF_RTL_EXPR (ATTR_FLAG, "attr_flag", "s", RTX_EXTRA)
-
-/* General conditional. The first operand is a vector composed of pairs of
-   expressions.  The first element of each pair is evaluated, in turn.
-   The value of the conditional is the second expression of the first pair
-   whose first expression evaluates nonzero.  If none of the expressions is
-   true, the second operand will be used as the value of the conditional.  */
-DEF_RTL_EXPR(COND, "cond", "Ee", RTX_EXTRA)
-
-/* Definition of a pattern substitution meta operation on a DEFINE_EXPAND
-   or a DEFINE_INSN.  Automatically generates new instances of DEFINE_INSNs
-   that match the substitution pattern.
-
-   Operand:
-   0: The name of the substitition template.
-   1: Input template to match to see if a substitution is applicable.
-   2: A C expression giving an additional condition for the generated
-      new define_expand or define_insn.
-   3: Output tempalate to generate via substitution.
-
-   Within a DEFINE_SUBST template, the meaning of some RTL expressions is
-   different from their usual interpretation: a MATCH_OPERAND matches any
-   expression tree with matching machine mode or with VOIDmode.  Likewise,
-   MATCH_OP_DUP and MATCH_DUP match more liberally in a DEFINE_SUBST than
-   in other RTL expressions.  MATCH_OPERATOR matches all common operators
-   but also UNSPEC, UNSPEC_VOLATILE, and MATCH_OPERATORS from the input
-   DEFINE_EXPAND or DEFINE_INSN.  */
-DEF_RTL_EXPR(DEFINE_SUBST, "define_subst", "sEsE", RTX_EXTRA)
-
-/* Substitution attribute to apply a DEFINE_SUBST to a pattern.
-
-   Operand:
-   0: The name of the subst-attribute.
-   1: The name of the DEFINE_SUBST to be applied for this attribute.
-   2: String to substitute for the subst-attribute name in the pattern
-      name, for the case that the DEFINE_SUBST is not applied (i.e. the
-      unmodified version of the pattern).
-   3: String to substitute for the subst-attribute name in the pattern
-      name, for the case that the DEFINE_SUBST is applied to the patten.
-      
-   The use of DEFINE_SUBST and DEFINE_SUBST_ATTR is explained in the
-   GCC internals manual, under "RTL Templates Transformations".  */
-DEF_RTL_EXPR(DEFINE_SUBST_ATTR, "define_subst_attr", "ssss", RTX_EXTRA)
-
-#endif /* GENERATOR_FILE */
-
-/*
-Local variables:
-mode:c
-End:
-*/
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/rtl.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/rtl.h
deleted file mode 100644
index f1cda4c..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/rtl.h
+++ /dev/null
@@ -1,2803 +0,0 @@
-/* Register Transfer Language (RTL) definitions for GCC
-   Copyright (C) 1987-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_RTL_H
-#define GCC_RTL_H
-
-#include "statistics.h"
-#include "machmode.h"
-#include "input.h"
-#include "real.h"
-#include "vec.h"
-#include "fixed-value.h"
-#include "alias.h"
-#include "hashtab.h"
-#include "flags.h"
-
-/* Value used by some passes to "recognize" noop moves as valid
- instructions.  */
-#define NOOP_MOVE_INSN_CODE	INT_MAX
-
-/* Register Transfer Language EXPRESSIONS CODES */
-
-#define RTX_CODE	enum rtx_code
-enum rtx_code  {
-
-#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   ENUM ,
-#include "rtl.def"		/* rtl expressions are documented here */
-#undef DEF_RTL_EXPR
-
-  LAST_AND_UNUSED_RTX_CODE};	/* A convenient way to get a value for
-				   NUM_RTX_CODE.
-				   Assumes default enum value assignment.  */
-
-/* The cast here, saves many elsewhere.  */
-#define NUM_RTX_CODE ((int) LAST_AND_UNUSED_RTX_CODE)
-
-/* Similar, but since generator files get more entries... */
-#ifdef GENERATOR_FILE
-# define NON_GENERATOR_NUM_RTX_CODE ((int) MATCH_OPERAND)
-#endif
-
-/* Register Transfer Language EXPRESSIONS CODE CLASSES */
-
-enum rtx_class  {
-  /* We check bit 0-1 of some rtx class codes in the predicates below.  */
-
-  /* Bit 0 = comparison if 0, arithmetic is 1
-     Bit 1 = 1 if commutative.  */
-  RTX_COMPARE,		/* 0 */
-  RTX_COMM_COMPARE,
-  RTX_BIN_ARITH,
-  RTX_COMM_ARITH,
-
-  /* Must follow the four preceding values.  */
-  RTX_UNARY,		/* 4 */
-
-  RTX_EXTRA,
-  RTX_MATCH,
-  RTX_INSN,
-
-  /* Bit 0 = 1 if constant.  */
-  RTX_OBJ,		/* 8 */
-  RTX_CONST_OBJ,
-
-  RTX_TERNARY,
-  RTX_BITFIELD_OPS,
-  RTX_AUTOINC
-};
-
-#define RTX_OBJ_MASK (~1)
-#define RTX_OBJ_RESULT (RTX_OBJ & RTX_OBJ_MASK)
-#define RTX_COMPARE_MASK (~1)
-#define RTX_COMPARE_RESULT (RTX_COMPARE & RTX_COMPARE_MASK)
-#define RTX_ARITHMETIC_MASK (~1)
-#define RTX_ARITHMETIC_RESULT (RTX_COMM_ARITH & RTX_ARITHMETIC_MASK)
-#define RTX_BINARY_MASK (~3)
-#define RTX_BINARY_RESULT (RTX_COMPARE & RTX_BINARY_MASK)
-#define RTX_COMMUTATIVE_MASK (~2)
-#define RTX_COMMUTATIVE_RESULT (RTX_COMM_COMPARE & RTX_COMMUTATIVE_MASK)
-#define RTX_NON_COMMUTATIVE_RESULT (RTX_COMPARE & RTX_COMMUTATIVE_MASK)
-
-extern const unsigned char rtx_length[NUM_RTX_CODE];
-#define GET_RTX_LENGTH(CODE)		(rtx_length[(int) (CODE)])
-
-extern const char * const rtx_name[NUM_RTX_CODE];
-#define GET_RTX_NAME(CODE)		(rtx_name[(int) (CODE)])
-
-extern const char * const rtx_format[NUM_RTX_CODE];
-#define GET_RTX_FORMAT(CODE)		(rtx_format[(int) (CODE)])
-
-extern const enum rtx_class rtx_class[NUM_RTX_CODE];
-#define GET_RTX_CLASS(CODE)		(rtx_class[(int) (CODE)])
-
-extern const unsigned char rtx_code_size[NUM_RTX_CODE];
-extern const unsigned char rtx_next[NUM_RTX_CODE];
-
-/* The flags and bitfields of an ADDR_DIFF_VEC.  BASE is the base label
-   relative to which the offsets are calculated, as explained in rtl.def.  */
-struct addr_diff_vec_flags
-{
-  /* Set at the start of shorten_branches - ONLY WHEN OPTIMIZING - : */
-  unsigned min_align: 8;
-  /* Flags: */
-  unsigned base_after_vec: 1; /* BASE is after the ADDR_DIFF_VEC.  */
-  unsigned min_after_vec: 1;  /* minimum address target label is
-				 after the ADDR_DIFF_VEC.  */
-  unsigned max_after_vec: 1;  /* maximum address target label is
-				 after the ADDR_DIFF_VEC.  */
-  unsigned min_after_base: 1; /* minimum address target label is
-				 after BASE.  */
-  unsigned max_after_base: 1; /* maximum address target label is
-				 after BASE.  */
-  /* Set by the actual branch shortening process - ONLY WHEN OPTIMIZING - : */
-  unsigned offset_unsigned: 1; /* offsets have to be treated as unsigned.  */
-  unsigned : 2;
-  unsigned scale : 8;
-};
-
-/* Structure used to describe the attributes of a MEM.  These are hashed
-   so MEMs that the same attributes share a data structure.  This means
-   they cannot be modified in place.  */
-struct GTY(()) mem_attrs
-{
-  /* The expression that the MEM accesses, or null if not known.
-     This expression might be larger than the memory reference itself.
-     (In other words, the MEM might access only part of the object.)  */
-  tree expr;
-
-  /* The offset of the memory reference from the start of EXPR.
-     Only valid if OFFSET_KNOWN_P.  */
-  HOST_WIDE_INT offset;
-
-  /* The size of the memory reference in bytes.  Only valid if
-     SIZE_KNOWN_P.  */
-  HOST_WIDE_INT size;
-
-  /* The alias set of the memory reference.  */
-  alias_set_type alias;
-
-  /* The alignment of the reference in bits.  Always a multiple of
-     BITS_PER_UNIT.  Note that EXPR may have a stricter alignment
-     than the memory reference itself.  */
-  unsigned int align;
-
-  /* The address space that the memory reference uses.  */
-  unsigned char addrspace;
-
-  /* True if OFFSET is known.  */
-  bool offset_known_p;
-
-  /* True if SIZE is known.  */
-  bool size_known_p;
-};
-
-/* Structure used to describe the attributes of a REG in similar way as
-   mem_attrs does for MEM above.  Note that the OFFSET field is calculated
-   in the same way as for mem_attrs, rather than in the same way as a
-   SUBREG_BYTE.  For example, if a big-endian target stores a byte
-   object in the low part of a 4-byte register, the OFFSET field
-   will be -3 rather than 0.  */
-
-struct GTY(()) reg_attrs {
-  tree decl;			/* decl corresponding to REG.  */
-  HOST_WIDE_INT offset;		/* Offset from start of DECL.  */
-};
-
-/* Common union for an element of an rtx.  */
-
-union rtunion
-{
-  int rt_int;
-  unsigned int rt_uint;
-  const char *rt_str;
-  rtx rt_rtx;
-  rtvec rt_rtvec;
-  enum machine_mode rt_type;
-  addr_diff_vec_flags rt_addr_diff_vec_flags;
-  struct cselib_val *rt_cselib;
-  tree rt_tree;
-  basic_block rt_bb;
-  mem_attrs *rt_mem;
-  reg_attrs *rt_reg;
-  struct constant_descriptor_rtx *rt_constant;
-  struct dw_cfi_node *rt_cfi;
-};
-
-/* This structure remembers the position of a SYMBOL_REF within an
-   object_block structure.  A SYMBOL_REF only provides this information
-   if SYMBOL_REF_HAS_BLOCK_INFO_P is true.  */
-struct GTY(()) block_symbol {
-  /* The usual SYMBOL_REF fields.  */
-  rtunion GTY ((skip)) fld[3];
-
-  /* The block that contains this object.  */
-  struct object_block *block;
-
-  /* The offset of this object from the start of its block.  It is negative
-     if the symbol has not yet been assigned an offset.  */
-  HOST_WIDE_INT offset;
-};
-
-/* Describes a group of objects that are to be placed together in such
-   a way that their relative positions are known.  */
-struct GTY(()) object_block {
-  /* The section in which these objects should be placed.  */
-  section *sect;
-
-  /* The alignment of the first object, measured in bits.  */
-  unsigned int alignment;
-
-  /* The total size of the objects, measured in bytes.  */
-  HOST_WIDE_INT size;
-
-  /* The SYMBOL_REFs for each object.  The vector is sorted in
-     order of increasing offset and the following conditions will
-     hold for each element X:
-
-	 SYMBOL_REF_HAS_BLOCK_INFO_P (X)
-	 !SYMBOL_REF_ANCHOR_P (X)
-	 SYMBOL_REF_BLOCK (X) == [address of this structure]
-	 SYMBOL_REF_BLOCK_OFFSET (X) >= 0.  */
-  vec<rtx, va_gc> *objects;
-
-  /* All the anchor SYMBOL_REFs used to address these objects, sorted
-     in order of increasing offset, and then increasing TLS model.
-     The following conditions will hold for each element X in this vector:
-
-	 SYMBOL_REF_HAS_BLOCK_INFO_P (X)
-	 SYMBOL_REF_ANCHOR_P (X)
-	 SYMBOL_REF_BLOCK (X) == [address of this structure]
-	 SYMBOL_REF_BLOCK_OFFSET (X) >= 0.  */
-  vec<rtx, va_gc> *anchors;
-};
-
-/* RTL expression ("rtx").  */
-
-struct GTY((chain_next ("RTX_NEXT (&%h)"),
-	    chain_prev ("RTX_PREV (&%h)"), variable_size)) rtx_def {
-  /* The kind of expression this is.  */
-  ENUM_BITFIELD(rtx_code) code: 16;
-
-  /* The kind of value the expression has.  */
-  ENUM_BITFIELD(machine_mode) mode : 8;
-
-  /* 1 in a MEM if we should keep the alias set for this mem unchanged
-     when we access a component.
-     1 in a CALL_INSN if it is a sibling call.
-     1 in a SET that is for a return.
-     In a CODE_LABEL, part of the two-bit alternate entry field.
-     1 in a CONCAT is VAL_EXPR_IS_COPIED in var-tracking.c.
-     1 in a VALUE is SP_BASED_VALUE_P in cselib.c.
-     1 in a SUBREG generated by LRA for reload insns.  */
-  unsigned int jump : 1;
-  /* In a CODE_LABEL, part of the two-bit alternate entry field.
-     1 in a MEM if it cannot trap.
-     1 in a CALL_INSN logically equivalent to
-       ECF_LOOPING_CONST_OR_PURE and DECL_LOOPING_CONST_OR_PURE_P. */
-  unsigned int call : 1;
-  /* 1 in a REG, MEM, or CONCAT if the value is set at most once, anywhere.
-     1 in a SUBREG used for SUBREG_PROMOTED_UNSIGNED_P.
-     1 in a SYMBOL_REF if it addresses something in the per-function
-     constants pool.
-     1 in a CALL_INSN logically equivalent to ECF_CONST and TREE_READONLY.
-     1 in a NOTE, or EXPR_LIST for a const call.
-     1 in a JUMP_INSN of an annulling branch.
-     1 in a CONCAT is VAL_EXPR_IS_CLOBBERED in var-tracking.c.
-     1 in a preserved VALUE is PRESERVED_VALUE_P in cselib.c.
-     1 in a clobber temporarily created for LRA.  */
-  unsigned int unchanging : 1;
-  /* 1 in a MEM or ASM_OPERANDS expression if the memory reference is volatile.
-     1 in an INSN, CALL_INSN, JUMP_INSN, CODE_LABEL, BARRIER, or NOTE
-     if it has been deleted.
-     1 in a REG expression if corresponds to a variable declared by the user,
-     0 for an internally generated temporary.
-     1 in a SUBREG used for SUBREG_PROMOTED_UNSIGNED_P.
-     1 in a LABEL_REF, REG_LABEL_TARGET or REG_LABEL_OPERAND note for a
-     non-local label.
-     In a SYMBOL_REF, this flag is used for machine-specific purposes.
-     In a PREFETCH, this flag indicates that it should be considered a scheduling
-     barrier.
-     1 in a CONCAT is VAL_NEEDS_RESOLUTION in var-tracking.c.  */
-  unsigned int volatil : 1;
-  /* 1 in a REG if the register is used only in exit code a loop.
-     1 in a SUBREG expression if was generated from a variable with a
-     promoted mode.
-     1 in a CODE_LABEL if the label is used for nonlocal gotos
-     and must not be deleted even if its count is zero.
-     1 in an INSN, JUMP_INSN or CALL_INSN if this insn must be scheduled
-     together with the preceding insn.  Valid only within sched.
-     1 in an INSN, JUMP_INSN, or CALL_INSN if insn is in a delay slot and
-     from the target of a branch.  Valid from reorg until end of compilation;
-     cleared before used.
-
-     The name of the field is historical.  It used to be used in MEMs
-     to record whether the MEM accessed part of a structure.  */
-  unsigned int in_struct : 1;
-  /* At the end of RTL generation, 1 if this rtx is used.  This is used for
-     copying shared structure.  See `unshare_all_rtl'.
-     In a REG, this is not needed for that purpose, and used instead
-     in `leaf_renumber_regs_insn'.
-     1 in a SYMBOL_REF, means that emit_library_call
-     has used it as the function.
-     1 in a CONCAT is VAL_HOLDS_TRACK_EXPR in var-tracking.c.
-     1 in a VALUE or DEBUG_EXPR is VALUE_RECURSED_INTO in var-tracking.c.  */
-  unsigned int used : 1;
-  /* 1 in an INSN or a SET if this rtx is related to the call frame,
-     either changing how we compute the frame address or saving and
-     restoring registers in the prologue and epilogue.
-     1 in a REG or MEM if it is a pointer.
-     1 in a SYMBOL_REF if it addresses something in the per-function
-     constant string pool.
-     1 in a VALUE is VALUE_CHANGED in var-tracking.c.  */
-  unsigned frame_related : 1;
-  /* 1 in a REG or PARALLEL that is the current function's return value.
-     1 in a SYMBOL_REF for a weak symbol.
-     1 in a CALL_INSN logically equivalent to ECF_PURE and DECL_PURE_P.
-     1 in a CONCAT is VAL_EXPR_HAS_REVERSE in var-tracking.c.
-     1 in a VALUE or DEBUG_EXPR is NO_LOC_P in var-tracking.c.  */
-  unsigned return_val : 1;
-
-  /* The first element of the operands of this rtx.
-     The number of operands and their types are controlled
-     by the `code' field, according to rtl.def.  */
-  union u {
-    rtunion fld[1];
-    HOST_WIDE_INT hwint[1];
-    struct block_symbol block_sym;
-    struct real_value rv;
-    struct fixed_value fv;
-  } GTY ((special ("rtx_def"), desc ("GET_CODE (&%0)"))) u;
-};
-
-/* The size in bytes of an rtx header (code, mode and flags).  */
-#define RTX_HDR_SIZE offsetof (struct rtx_def, u)
-
-/* The size in bytes of an rtx with code CODE.  */
-#define RTX_CODE_SIZE(CODE) rtx_code_size[CODE]
-
-#define NULL_RTX (rtx) 0
-
-/* The "next" and "previous" RTX, relative to this one.  */
-
-#define RTX_NEXT(X) (rtx_next[GET_CODE (X)] == 0 ? NULL			\
-		     : *(rtx *)(((char *)X) + rtx_next[GET_CODE (X)]))
-
-/* FIXME: the "NEXT_INSN (PREV_INSN (X)) == X" condition shouldn't be needed.
- */
-#define RTX_PREV(X) ((INSN_P (X)       			\
-                      || NOTE_P (X)       		\
-                      || JUMP_TABLE_DATA_P (X)		\
-                      || BARRIER_P (X)        		\
-                      || LABEL_P (X))    		\
-                     && PREV_INSN (X) != NULL           \
-                     && NEXT_INSN (PREV_INSN (X)) == X  \
-                     ? PREV_INSN (X) : NULL)
-
-/* Define macros to access the `code' field of the rtx.  */
-
-#define GET_CODE(RTX)	    ((enum rtx_code) (RTX)->code)
-#define PUT_CODE(RTX, CODE) ((RTX)->code = (CODE))
-
-#define GET_MODE(RTX)	    ((enum machine_mode) (RTX)->mode)
-#define PUT_MODE(RTX, MODE) ((RTX)->mode = (MODE))
-
-/* RTL vector.  These appear inside RTX's when there is a need
-   for a variable number of things.  The principle use is inside
-   PARALLEL expressions.  */
-
-struct GTY((variable_size)) rtvec_def {
-  int num_elem;		/* number of elements */
-  rtx GTY ((length ("%h.num_elem"))) elem[1];
-};
-
-#define NULL_RTVEC (rtvec) 0
-
-#define GET_NUM_ELEM(RTVEC)		((RTVEC)->num_elem)
-#define PUT_NUM_ELEM(RTVEC, NUM)	((RTVEC)->num_elem = (NUM))
-
-/* Predicate yielding nonzero iff X is an rtx for a register.  */
-#define REG_P(X) (GET_CODE (X) == REG)
-
-/* Predicate yielding nonzero iff X is an rtx for a memory location.  */
-#define MEM_P(X) (GET_CODE (X) == MEM)
-
-/* Match CONST_*s that can represent compile-time constant integers.  */
-#define CASE_CONST_SCALAR_INT \
-   case CONST_INT: \
-   case CONST_DOUBLE
-
-/* Match CONST_*s for which pointer equality corresponds to value equality.  */
-#define CASE_CONST_UNIQUE \
-   case CONST_INT: \
-   case CONST_DOUBLE: \
-   case CONST_FIXED
-
-/* Match all CONST_* rtxes.  */
-#define CASE_CONST_ANY \
-   case CONST_INT: \
-   case CONST_DOUBLE: \
-   case CONST_FIXED: \
-   case CONST_VECTOR
-
-/* Predicate yielding nonzero iff X is an rtx for a constant integer.  */
-#define CONST_INT_P(X) (GET_CODE (X) == CONST_INT)
-
-/* Predicate yielding nonzero iff X is an rtx for a constant fixed-point.  */
-#define CONST_FIXED_P(X) (GET_CODE (X) == CONST_FIXED)
-
-/* Predicate yielding true iff X is an rtx for a double-int
-   or floating point constant.  */
-#define CONST_DOUBLE_P(X) (GET_CODE (X) == CONST_DOUBLE)
-
-/* Predicate yielding true iff X is an rtx for a double-int.  */
-#define CONST_DOUBLE_AS_INT_P(X) \
-  (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == VOIDmode)
-
-/* Predicate yielding true iff X is an rtx for a integer const.  */
-#define CONST_SCALAR_INT_P(X) \
-  (CONST_INT_P (X) || CONST_DOUBLE_AS_INT_P (X))
-
-/* Predicate yielding true iff X is an rtx for a double-int.  */
-#define CONST_DOUBLE_AS_FLOAT_P(X) \
-  (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) != VOIDmode)
-
-/* Predicate yielding nonzero iff X is a label insn.  */
-#define LABEL_P(X) (GET_CODE (X) == CODE_LABEL)
-
-/* Predicate yielding nonzero iff X is a jump insn.  */
-#define JUMP_P(X) (GET_CODE (X) == JUMP_INSN)
-
-/* Predicate yielding nonzero iff X is a call insn.  */
-#define CALL_P(X) (GET_CODE (X) == CALL_INSN)
-
-/* Predicate yielding nonzero iff X is an insn that cannot jump.  */
-#define NONJUMP_INSN_P(X) (GET_CODE (X) == INSN)
-
-/* Predicate yielding nonzero iff X is a debug note/insn.  */
-#define DEBUG_INSN_P(X) (GET_CODE (X) == DEBUG_INSN)
-
-/* Predicate yielding nonzero iff X is an insn that is not a debug insn.  */
-#define NONDEBUG_INSN_P(X) (INSN_P (X) && !DEBUG_INSN_P (X))
-
-/* Nonzero if DEBUG_INSN_P may possibly hold.  */
-#define MAY_HAVE_DEBUG_INSNS (flag_var_tracking_assignments)
-
-/* Predicate yielding nonzero iff X is a real insn.  */
-#define INSN_P(X) \
-  (NONJUMP_INSN_P (X) || DEBUG_INSN_P (X) || JUMP_P (X) || CALL_P (X))
-
-/* Predicate yielding nonzero iff X is a note insn.  */
-#define NOTE_P(X) (GET_CODE (X) == NOTE)
-
-/* Predicate yielding nonzero iff X is a barrier insn.  */
-#define BARRIER_P(X) (GET_CODE (X) == BARRIER)
-
-/* Predicate yielding nonzero iff X is a data for a jump table.  */
-#define JUMP_TABLE_DATA_P(INSN) (GET_CODE (INSN) == JUMP_TABLE_DATA)
-
-/* Predicate yielding nonzero iff X is a return or simple_return.  */
-#define ANY_RETURN_P(X) \
-  (GET_CODE (X) == RETURN || GET_CODE (X) == SIMPLE_RETURN)
-
-/* 1 if X is a unary operator.  */
-
-#define UNARY_P(X)   \
-  (GET_RTX_CLASS (GET_CODE (X)) == RTX_UNARY)
-
-/* 1 if X is a binary operator.  */
-
-#define BINARY_P(X)   \
-  ((GET_RTX_CLASS (GET_CODE (X)) & RTX_BINARY_MASK) == RTX_BINARY_RESULT)
-
-/* 1 if X is an arithmetic operator.  */
-
-#define ARITHMETIC_P(X)   \
-  ((GET_RTX_CLASS (GET_CODE (X)) & RTX_ARITHMETIC_MASK)			\
-    == RTX_ARITHMETIC_RESULT)
-
-/* 1 if X is an arithmetic operator.  */
-
-#define COMMUTATIVE_ARITH_P(X)   \
-  (GET_RTX_CLASS (GET_CODE (X)) == RTX_COMM_ARITH)
-
-/* 1 if X is a commutative arithmetic operator or a comparison operator.
-   These two are sometimes selected together because it is possible to
-   swap the two operands.  */
-
-#define SWAPPABLE_OPERANDS_P(X)   \
-  ((1 << GET_RTX_CLASS (GET_CODE (X)))					\
-    & ((1 << RTX_COMM_ARITH) | (1 << RTX_COMM_COMPARE)			\
-       | (1 << RTX_COMPARE)))
-
-/* 1 if X is a non-commutative operator.  */
-
-#define NON_COMMUTATIVE_P(X)   \
-  ((GET_RTX_CLASS (GET_CODE (X)) & RTX_COMMUTATIVE_MASK)		\
-    == RTX_NON_COMMUTATIVE_RESULT)
-
-/* 1 if X is a commutative operator on integers.  */
-
-#define COMMUTATIVE_P(X)   \
-  ((GET_RTX_CLASS (GET_CODE (X)) & RTX_COMMUTATIVE_MASK)		\
-    == RTX_COMMUTATIVE_RESULT)
-
-/* 1 if X is a relational operator.  */
-
-#define COMPARISON_P(X)   \
-  ((GET_RTX_CLASS (GET_CODE (X)) & RTX_COMPARE_MASK) == RTX_COMPARE_RESULT)
-
-/* 1 if X is a constant value that is an integer.  */
-
-#define CONSTANT_P(X)   \
-  (GET_RTX_CLASS (GET_CODE (X)) == RTX_CONST_OBJ)
-
-/* 1 if X can be used to represent an object.  */
-#define OBJECT_P(X)							\
-  ((GET_RTX_CLASS (GET_CODE (X)) & RTX_OBJ_MASK) == RTX_OBJ_RESULT)
-
-/* General accessor macros for accessing the fields of an rtx.  */
-
-#if defined ENABLE_RTL_CHECKING && (GCC_VERSION >= 2007)
-/* The bit with a star outside the statement expr and an & inside is
-   so that N can be evaluated only once.  */
-#define RTL_CHECK1(RTX, N, C1) __extension__				\
-(*({ __typeof (RTX) const _rtx = (RTX); const int _n = (N);		\
-     const enum rtx_code _code = GET_CODE (_rtx);			\
-     if (_n < 0 || _n >= GET_RTX_LENGTH (_code))			\
-       rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__,		\
-				__FUNCTION__);				\
-     if (GET_RTX_FORMAT (_code)[_n] != C1)				\
-       rtl_check_failed_type1 (_rtx, _n, C1, __FILE__, __LINE__,	\
-			       __FUNCTION__);				\
-     &_rtx->u.fld[_n]; }))
-
-#define RTL_CHECK2(RTX, N, C1, C2) __extension__			\
-(*({ __typeof (RTX) const _rtx = (RTX); const int _n = (N);		\
-     const enum rtx_code _code = GET_CODE (_rtx);			\
-     if (_n < 0 || _n >= GET_RTX_LENGTH (_code))			\
-       rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__,		\
-				__FUNCTION__);				\
-     if (GET_RTX_FORMAT (_code)[_n] != C1				\
-	 && GET_RTX_FORMAT (_code)[_n] != C2)				\
-       rtl_check_failed_type2 (_rtx, _n, C1, C2, __FILE__, __LINE__,	\
-			       __FUNCTION__);				\
-     &_rtx->u.fld[_n]; }))
-
-#define RTL_CHECKC1(RTX, N, C) __extension__				\
-(*({ __typeof (RTX) const _rtx = (RTX); const int _n = (N);		\
-     if (GET_CODE (_rtx) != (C))					\
-       rtl_check_failed_code1 (_rtx, (C), __FILE__, __LINE__,		\
-			       __FUNCTION__);				\
-     &_rtx->u.fld[_n]; }))
-
-#define RTL_CHECKC2(RTX, N, C1, C2) __extension__			\
-(*({ __typeof (RTX) const _rtx = (RTX); const int _n = (N);		\
-     const enum rtx_code _code = GET_CODE (_rtx);			\
-     if (_code != (C1) && _code != (C2))				\
-       rtl_check_failed_code2 (_rtx, (C1), (C2), __FILE__, __LINE__,	\
-			       __FUNCTION__); \
-     &_rtx->u.fld[_n]; }))
-
-#define RTVEC_ELT(RTVEC, I) __extension__				\
-(*({ __typeof (RTVEC) const _rtvec = (RTVEC); const int _i = (I);	\
-     if (_i < 0 || _i >= GET_NUM_ELEM (_rtvec))				\
-       rtvec_check_failed_bounds (_rtvec, _i, __FILE__, __LINE__,	\
-				  __FUNCTION__);			\
-     &_rtvec->elem[_i]; }))
-
-#define XWINT(RTX, N) __extension__					\
-(*({ __typeof (RTX) const _rtx = (RTX); const int _n = (N);		\
-     const enum rtx_code _code = GET_CODE (_rtx);			\
-     if (_n < 0 || _n >= GET_RTX_LENGTH (_code))			\
-       rtl_check_failed_bounds (_rtx, _n, __FILE__, __LINE__,		\
-				__FUNCTION__);				\
-     if (GET_RTX_FORMAT (_code)[_n] != 'w')				\
-       rtl_check_failed_type1 (_rtx, _n, 'w', __FILE__, __LINE__,	\
-			       __FUNCTION__);				\
-     &_rtx->u.hwint[_n]; }))
-
-#define XCWINT(RTX, N, C) __extension__					\
-(*({ __typeof (RTX) const _rtx = (RTX);					\
-     if (GET_CODE (_rtx) != (C))					\
-       rtl_check_failed_code1 (_rtx, (C), __FILE__, __LINE__,		\
-			       __FUNCTION__);				\
-     &_rtx->u.hwint[N]; }))
-
-#define XCMWINT(RTX, N, C, M) __extension__				\
-(*({ __typeof (RTX) const _rtx = (RTX);					\
-     if (GET_CODE (_rtx) != (C) || GET_MODE (_rtx) != (M))		\
-       rtl_check_failed_code_mode (_rtx, (C), (M), false, __FILE__,	\
-				   __LINE__, __FUNCTION__);		\
-     &_rtx->u.hwint[N]; }))
-
-#define XCNMPRV(RTX, C, M) __extension__				\
-({ __typeof (RTX) const _rtx = (RTX);					\
-   if (GET_CODE (_rtx) != (C) || GET_MODE (_rtx) == (M))		\
-     rtl_check_failed_code_mode (_rtx, (C), (M), true, __FILE__,	\
-				 __LINE__, __FUNCTION__);		\
-   &_rtx->u.rv; })
-
-#define XCNMPFV(RTX, C, M) __extension__				\
-({ __typeof (RTX) const _rtx = (RTX);					\
-   if (GET_CODE (_rtx) != (C) || GET_MODE (_rtx) == (M))		\
-     rtl_check_failed_code_mode (_rtx, (C), (M), true, __FILE__,	\
-				 __LINE__, __FUNCTION__);		\
-   &_rtx->u.fv; })
-
-#define BLOCK_SYMBOL_CHECK(RTX) __extension__				\
-({ __typeof (RTX) const _symbol = (RTX);				\
-   const unsigned int flags = RTL_CHECKC1 (_symbol, 1, SYMBOL_REF).rt_int; \
-   if ((flags & SYMBOL_FLAG_HAS_BLOCK_INFO) == 0)			\
-     rtl_check_failed_block_symbol (__FILE__, __LINE__,			\
-				    __FUNCTION__);			\
-   &_symbol->u.block_sym; })
-
-extern void rtl_check_failed_bounds (const_rtx, int, const char *, int,
-				     const char *)
-    ATTRIBUTE_NORETURN;
-extern void rtl_check_failed_type1 (const_rtx, int, int, const char *, int,
-				    const char *)
-    ATTRIBUTE_NORETURN;
-extern void rtl_check_failed_type2 (const_rtx, int, int, int, const char *,
-				    int, const char *)
-    ATTRIBUTE_NORETURN;
-extern void rtl_check_failed_code1 (const_rtx, enum rtx_code, const char *,
-				    int, const char *)
-    ATTRIBUTE_NORETURN;
-extern void rtl_check_failed_code2 (const_rtx, enum rtx_code, enum rtx_code,
-				    const char *, int, const char *)
-    ATTRIBUTE_NORETURN;
-extern void rtl_check_failed_code_mode (const_rtx, enum rtx_code, enum machine_mode,
-					bool, const char *, int, const char *)
-    ATTRIBUTE_NORETURN;
-extern void rtl_check_failed_block_symbol (const char *, int, const char *)
-    ATTRIBUTE_NORETURN;
-extern void rtvec_check_failed_bounds (const_rtvec, int, const char *, int,
-				       const char *)
-    ATTRIBUTE_NORETURN;
-
-#else   /* not ENABLE_RTL_CHECKING */
-
-#define RTL_CHECK1(RTX, N, C1)      ((RTX)->u.fld[N])
-#define RTL_CHECK2(RTX, N, C1, C2)  ((RTX)->u.fld[N])
-#define RTL_CHECKC1(RTX, N, C)	    ((RTX)->u.fld[N])
-#define RTL_CHECKC2(RTX, N, C1, C2) ((RTX)->u.fld[N])
-#define RTVEC_ELT(RTVEC, I)	    ((RTVEC)->elem[I])
-#define XWINT(RTX, N)		    ((RTX)->u.hwint[N])
-#define XCWINT(RTX, N, C)	    ((RTX)->u.hwint[N])
-#define XCMWINT(RTX, N, C, M)	    ((RTX)->u.hwint[N])
-#define XCNMWINT(RTX, N, C, M)	    ((RTX)->u.hwint[N])
-#define XCNMPRV(RTX, C, M)	    (&(RTX)->u.rv)
-#define XCNMPFV(RTX, C, M)	    (&(RTX)->u.fv)
-#define BLOCK_SYMBOL_CHECK(RTX)	    (&(RTX)->u.block_sym)
-
-#endif
-
-/* General accessor macros for accessing the flags of an rtx.  */
-
-/* Access an individual rtx flag, with no checking of any kind.  */
-#define RTX_FLAG(RTX, FLAG)	((RTX)->FLAG)
-
-#if defined ENABLE_RTL_FLAG_CHECKING && (GCC_VERSION >= 2007)
-#define RTL_FLAG_CHECK1(NAME, RTX, C1) __extension__			\
-({ __typeof (RTX) const _rtx = (RTX);					\
-   if (GET_CODE (_rtx) != C1)						\
-     rtl_check_failed_flag  (NAME, _rtx, __FILE__, __LINE__,		\
-			     __FUNCTION__);				\
-   _rtx; })
-
-#define RTL_FLAG_CHECK2(NAME, RTX, C1, C2) __extension__		\
-({ __typeof (RTX) const _rtx = (RTX);					\
-   if (GET_CODE (_rtx) != C1 && GET_CODE(_rtx) != C2)			\
-     rtl_check_failed_flag  (NAME,_rtx, __FILE__, __LINE__,		\
-			      __FUNCTION__);				\
-   _rtx; })
-
-#define RTL_FLAG_CHECK3(NAME, RTX, C1, C2, C3) __extension__		\
-({ __typeof (RTX) const _rtx = (RTX);					\
-   if (GET_CODE (_rtx) != C1 && GET_CODE(_rtx) != C2			\
-       && GET_CODE (_rtx) != C3)					\
-     rtl_check_failed_flag  (NAME, _rtx, __FILE__, __LINE__,		\
-			     __FUNCTION__);				\
-   _rtx; })
-
-#define RTL_FLAG_CHECK4(NAME, RTX, C1, C2, C3, C4) __extension__	\
-({ __typeof (RTX) const _rtx = (RTX);					\
-   if (GET_CODE (_rtx) != C1 && GET_CODE(_rtx) != C2			\
-       && GET_CODE (_rtx) != C3 && GET_CODE(_rtx) != C4)		\
-     rtl_check_failed_flag  (NAME, _rtx, __FILE__, __LINE__,		\
-			      __FUNCTION__);				\
-   _rtx; })
-
-#define RTL_FLAG_CHECK5(NAME, RTX, C1, C2, C3, C4, C5) __extension__	\
-({ __typeof (RTX) const _rtx = (RTX);					\
-   if (GET_CODE (_rtx) != C1 && GET_CODE (_rtx) != C2			\
-       && GET_CODE (_rtx) != C3 && GET_CODE (_rtx) != C4		\
-       && GET_CODE (_rtx) != C5)					\
-     rtl_check_failed_flag  (NAME, _rtx, __FILE__, __LINE__,		\
-			     __FUNCTION__);				\
-   _rtx; })
-
-#define RTL_FLAG_CHECK6(NAME, RTX, C1, C2, C3, C4, C5, C6)		\
-  __extension__								\
-({ __typeof (RTX) const _rtx = (RTX);					\
-   if (GET_CODE (_rtx) != C1 && GET_CODE (_rtx) != C2			\
-       && GET_CODE (_rtx) != C3 && GET_CODE (_rtx) != C4		\
-       && GET_CODE (_rtx) != C5 && GET_CODE (_rtx) != C6)		\
-     rtl_check_failed_flag  (NAME,_rtx, __FILE__, __LINE__,		\
-			     __FUNCTION__);				\
-   _rtx; })
-
-#define RTL_FLAG_CHECK7(NAME, RTX, C1, C2, C3, C4, C5, C6, C7)		\
-  __extension__								\
-({ __typeof (RTX) const _rtx = (RTX);					\
-   if (GET_CODE (_rtx) != C1 && GET_CODE (_rtx) != C2			\
-       && GET_CODE (_rtx) != C3 && GET_CODE (_rtx) != C4		\
-       && GET_CODE (_rtx) != C5 && GET_CODE (_rtx) != C6		\
-       && GET_CODE (_rtx) != C7)					\
-     rtl_check_failed_flag  (NAME, _rtx, __FILE__, __LINE__,		\
-			     __FUNCTION__);				\
-   _rtx; })
-
-#define RTL_FLAG_CHECK8(NAME, RTX, C1, C2, C3, C4, C5, C6, C7, C8)	\
-  __extension__								\
-({ __typeof (RTX) const _rtx = (RTX);					\
-   if (GET_CODE (_rtx) != C1 && GET_CODE (_rtx) != C2			\
-       && GET_CODE (_rtx) != C3 && GET_CODE (_rtx) != C4		\
-       && GET_CODE (_rtx) != C5 && GET_CODE (_rtx) != C6		\
-       && GET_CODE (_rtx) != C7 && GET_CODE (_rtx) != C8)		\
-     rtl_check_failed_flag  (NAME, _rtx, __FILE__, __LINE__,		\
-			     __FUNCTION__);				\
-   _rtx; })
-
-extern void rtl_check_failed_flag (const char *, const_rtx, const char *,
-				   int, const char *)
-    ATTRIBUTE_NORETURN
-    ;
-
-#else	/* not ENABLE_RTL_FLAG_CHECKING */
-
-#define RTL_FLAG_CHECK1(NAME, RTX, C1)					(RTX)
-#define RTL_FLAG_CHECK2(NAME, RTX, C1, C2)				(RTX)
-#define RTL_FLAG_CHECK3(NAME, RTX, C1, C2, C3)				(RTX)
-#define RTL_FLAG_CHECK4(NAME, RTX, C1, C2, C3, C4)			(RTX)
-#define RTL_FLAG_CHECK5(NAME, RTX, C1, C2, C3, C4, C5)		(RTX)
-#define RTL_FLAG_CHECK6(NAME, RTX, C1, C2, C3, C4, C5, C6)		(RTX)
-#define RTL_FLAG_CHECK7(NAME, RTX, C1, C2, C3, C4, C5, C6, C7)		(RTX)
-#define RTL_FLAG_CHECK8(NAME, RTX, C1, C2, C3, C4, C5, C6, C7, C8)	(RTX)
-#endif
-
-#define XINT(RTX, N)	(RTL_CHECK2 (RTX, N, 'i', 'n').rt_int)
-#define XUINT(RTX, N)   (RTL_CHECK2 (RTX, N, 'i', 'n').rt_uint)
-#define XSTR(RTX, N)	(RTL_CHECK2 (RTX, N, 's', 'S').rt_str)
-#define XEXP(RTX, N)	(RTL_CHECK2 (RTX, N, 'e', 'u').rt_rtx)
-#define XVEC(RTX, N)	(RTL_CHECK2 (RTX, N, 'E', 'V').rt_rtvec)
-#define XMODE(RTX, N)	(RTL_CHECK1 (RTX, N, 'M').rt_type)
-#define XTREE(RTX, N)   (RTL_CHECK1 (RTX, N, 't').rt_tree)
-#define XBBDEF(RTX, N)	(RTL_CHECK1 (RTX, N, 'B').rt_bb)
-#define XTMPL(RTX, N)	(RTL_CHECK1 (RTX, N, 'T').rt_str)
-#define XCFI(RTX, N)	(RTL_CHECK1 (RTX, N, 'C').rt_cfi)
-
-#define XVECEXP(RTX, N, M)	RTVEC_ELT (XVEC (RTX, N), M)
-#define XVECLEN(RTX, N)		GET_NUM_ELEM (XVEC (RTX, N))
-
-/* These are like XINT, etc. except that they expect a '0' field instead
-   of the normal type code.  */
-
-#define X0INT(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_int)
-#define X0UINT(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_uint)
-#define X0STR(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_str)
-#define X0EXP(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_rtx)
-#define X0VEC(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_rtvec)
-#define X0MODE(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_type)
-#define X0TREE(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_tree)
-#define X0BBDEF(RTX, N)	   (RTL_CHECK1 (RTX, N, '0').rt_bb)
-#define X0ADVFLAGS(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_addr_diff_vec_flags)
-#define X0CSELIB(RTX, N)   (RTL_CHECK1 (RTX, N, '0').rt_cselib)
-#define X0MEMATTR(RTX, N)  (RTL_CHECKC1 (RTX, N, MEM).rt_mem)
-#define X0REGATTR(RTX, N)  (RTL_CHECKC1 (RTX, N, REG).rt_reg)
-#define X0CONSTANT(RTX, N) (RTL_CHECK1 (RTX, N, '0').rt_constant)
-
-/* Access a '0' field with any type.  */
-#define X0ANY(RTX, N)	   RTL_CHECK1 (RTX, N, '0')
-
-#define XCINT(RTX, N, C)      (RTL_CHECKC1 (RTX, N, C).rt_int)
-#define XCUINT(RTX, N, C)     (RTL_CHECKC1 (RTX, N, C).rt_uint)
-#define XCSTR(RTX, N, C)      (RTL_CHECKC1 (RTX, N, C).rt_str)
-#define XCEXP(RTX, N, C)      (RTL_CHECKC1 (RTX, N, C).rt_rtx)
-#define XCVEC(RTX, N, C)      (RTL_CHECKC1 (RTX, N, C).rt_rtvec)
-#define XCMODE(RTX, N, C)     (RTL_CHECKC1 (RTX, N, C).rt_type)
-#define XCTREE(RTX, N, C)     (RTL_CHECKC1 (RTX, N, C).rt_tree)
-#define XCBBDEF(RTX, N, C)    (RTL_CHECKC1 (RTX, N, C).rt_bb)
-#define XCCFI(RTX, N, C)      (RTL_CHECKC1 (RTX, N, C).rt_cfi)
-#define XCCSELIB(RTX, N, C)   (RTL_CHECKC1 (RTX, N, C).rt_cselib)
-
-#define XCVECEXP(RTX, N, M, C)	RTVEC_ELT (XCVEC (RTX, N, C), M)
-#define XCVECLEN(RTX, N, C)	GET_NUM_ELEM (XCVEC (RTX, N, C))
-
-#define XC2EXP(RTX, N, C1, C2)      (RTL_CHECKC2 (RTX, N, C1, C2).rt_rtx)
-
-/* ACCESS MACROS for particular fields of insns.  */
-
-/* Holds a unique number for each insn.
-   These are not necessarily sequentially increasing.  */
-#define INSN_UID(INSN)  XINT (INSN, 0)
-
-/* Chain insns together in sequence.  */
-#define PREV_INSN(INSN)	XEXP (INSN, 1)
-#define NEXT_INSN(INSN)	XEXP (INSN, 2)
-
-#define BLOCK_FOR_INSN(INSN) XBBDEF (INSN, 3)
-
-/* The body of an insn.  */
-#define PATTERN(INSN)	XEXP (INSN, 4)
-
-#define INSN_LOCATION(INSN) XUINT (INSN, 5)
-
-#define INSN_HAS_LOCATION(INSN) ((LOCATION_LOCUS (INSN_LOCATION (INSN)))\
-  != UNKNOWN_LOCATION)
-
-/* LOCATION of an RTX if relevant.  */
-#define RTL_LOCATION(X) (INSN_P (X) ? \
-			 INSN_LOCATION (X) : UNKNOWN_LOCATION)
-
-/* Code number of instruction, from when it was recognized.
-   -1 means this instruction has not been recognized yet.  */
-#define INSN_CODE(INSN) XINT (INSN, 6)
-
-#define RTX_FRAME_RELATED_P(RTX)					\
-  (RTL_FLAG_CHECK6 ("RTX_FRAME_RELATED_P", (RTX), DEBUG_INSN, INSN,	\
-		    CALL_INSN, JUMP_INSN, BARRIER, SET)->frame_related)
-
-/* 1 if RTX is an insn that has been deleted.  */
-#define INSN_DELETED_P(RTX)						\
-  (RTL_FLAG_CHECK8 ("INSN_DELETED_P", (RTX), DEBUG_INSN, INSN,		\
-		    CALL_INSN, JUMP_INSN, JUMP_TABLE_DATA,		\
-		    CODE_LABEL, BARRIER, NOTE)->volatil)
-
-/* 1 if RTX is a call to a const function.  Built from ECF_CONST and
-   TREE_READONLY.  */
-#define RTL_CONST_CALL_P(RTX)					\
-  (RTL_FLAG_CHECK1 ("RTL_CONST_CALL_P", (RTX), CALL_INSN)->unchanging)
-
-/* 1 if RTX is a call to a pure function.  Built from ECF_PURE and
-   DECL_PURE_P.  */
-#define RTL_PURE_CALL_P(RTX)					\
-  (RTL_FLAG_CHECK1 ("RTL_PURE_CALL_P", (RTX), CALL_INSN)->return_val)
-
-/* 1 if RTX is a call to a const or pure function.  */
-#define RTL_CONST_OR_PURE_CALL_P(RTX) \
-  (RTL_CONST_CALL_P (RTX) || RTL_PURE_CALL_P (RTX))
-
-/* 1 if RTX is a call to a looping const or pure function.  Built from
-   ECF_LOOPING_CONST_OR_PURE and DECL_LOOPING_CONST_OR_PURE_P.  */
-#define RTL_LOOPING_CONST_OR_PURE_CALL_P(RTX)				\
-  (RTL_FLAG_CHECK1 ("CONST_OR_PURE_CALL_P", (RTX), CALL_INSN)->call)
-
-/* 1 if RTX is a call_insn for a sibling call.  */
-#define SIBLING_CALL_P(RTX)						\
-  (RTL_FLAG_CHECK1 ("SIBLING_CALL_P", (RTX), CALL_INSN)->jump)
-
-/* 1 if RTX is a jump_insn, call_insn, or insn that is an annulling branch.  */
-#define INSN_ANNULLED_BRANCH_P(RTX)					\
-  (RTL_FLAG_CHECK1 ("INSN_ANNULLED_BRANCH_P", (RTX), JUMP_INSN)->unchanging)
-
-/* 1 if RTX is an insn in a delay slot and is from the target of the branch.
-   If the branch insn has INSN_ANNULLED_BRANCH_P set, this insn should only be
-   executed if the branch is taken.  For annulled branches with this bit
-   clear, the insn should be executed only if the branch is not taken.  */
-#define INSN_FROM_TARGET_P(RTX)						\
-  (RTL_FLAG_CHECK3 ("INSN_FROM_TARGET_P", (RTX), INSN, JUMP_INSN, \
-		    CALL_INSN)->in_struct)
-
-/* In an ADDR_DIFF_VEC, the flags for RTX for use by branch shortening.
-   See the comments for ADDR_DIFF_VEC in rtl.def.  */
-#define ADDR_DIFF_VEC_FLAGS(RTX) X0ADVFLAGS (RTX, 4)
-
-/* In a VALUE, the value cselib has assigned to RTX.
-   This is a "struct cselib_val", see cselib.h.  */
-#define CSELIB_VAL_PTR(RTX) X0CSELIB (RTX, 0)
-
-/* Holds a list of notes on what this insn does to various REGs.
-   It is a chain of EXPR_LIST rtx's, where the second operand is the
-   chain pointer and the first operand is the REG being described.
-   The mode field of the EXPR_LIST contains not a real machine mode
-   but a value from enum reg_note.  */
-#define REG_NOTES(INSN)	XEXP(INSN, 7)
-
-/* In an ENTRY_VALUE this is the DECL_INCOMING_RTL of the argument in
-   question.  */
-#define ENTRY_VALUE_EXP(RTX) (RTL_CHECKC1 (RTX, 0, ENTRY_VALUE).rt_rtx)
-
-enum reg_note
-{
-#define DEF_REG_NOTE(NAME) NAME,
-#include "reg-notes.def"
-#undef DEF_REG_NOTE
-  REG_NOTE_MAX
-};
-
-/* Define macros to extract and insert the reg-note kind in an EXPR_LIST.  */
-#define REG_NOTE_KIND(LINK) ((enum reg_note) GET_MODE (LINK))
-#define PUT_REG_NOTE_KIND(LINK, KIND) \
-  PUT_MODE (LINK, (enum machine_mode) (KIND))
-
-/* Names for REG_NOTE's in EXPR_LIST insn's.  */
-
-extern const char * const reg_note_name[];
-#define GET_REG_NOTE_NAME(MODE) (reg_note_name[(int) (MODE)])
-
-/* This field is only present on CALL_INSNs.  It holds a chain of EXPR_LIST of
-   USE and CLOBBER expressions.
-     USE expressions list the registers filled with arguments that
-   are passed to the function.
-     CLOBBER expressions document the registers explicitly clobbered
-   by this CALL_INSN.
-     Pseudo registers can not be mentioned in this list.  */
-#define CALL_INSN_FUNCTION_USAGE(INSN)	XEXP(INSN, 8)
-
-/* The label-number of a code-label.  The assembler label
-   is made from `L' and the label-number printed in decimal.
-   Label numbers are unique in a compilation.  */
-#define CODE_LABEL_NUMBER(INSN)	XINT (INSN, 6)
-
-/* In a NOTE that is a line number, this is a string for the file name that the
-   line is in.  We use the same field to record block numbers temporarily in
-   NOTE_INSN_BLOCK_BEG and NOTE_INSN_BLOCK_END notes.  (We avoid lots of casts
-   between ints and pointers if we use a different macro for the block number.)
-   */
-
-/* Opaque data.  */
-#define NOTE_DATA(INSN)	        RTL_CHECKC1 (INSN, 4, NOTE)
-#define NOTE_DELETED_LABEL_NAME(INSN) XCSTR (INSN, 4, NOTE)
-#define SET_INSN_DELETED(INSN) set_insn_deleted (INSN);
-#define NOTE_BLOCK(INSN)	XCTREE (INSN, 4, NOTE)
-#define NOTE_EH_HANDLER(INSN)	XCINT (INSN, 4, NOTE)
-#define NOTE_BASIC_BLOCK(INSN)	XCBBDEF (INSN, 4, NOTE)
-#define NOTE_VAR_LOCATION(INSN)	XCEXP (INSN, 4, NOTE)
-#define NOTE_CFI(INSN)		XCCFI (INSN, 4, NOTE)
-#define NOTE_LABEL_NUMBER(INSN)	XCINT (INSN, 4, NOTE)
-
-/* In a NOTE that is a line number, this is the line number.
-   Other kinds of NOTEs are identified by negative numbers here.  */
-#define NOTE_KIND(INSN) XCINT (INSN, 5, NOTE)
-
-/* Nonzero if INSN is a note marking the beginning of a basic block.  */
-#define NOTE_INSN_BASIC_BLOCK_P(INSN) \
-  (NOTE_P (INSN) && NOTE_KIND (INSN) == NOTE_INSN_BASIC_BLOCK)
-
-/* Variable declaration and the location of a variable.  */
-#define PAT_VAR_LOCATION_DECL(PAT) (XCTREE ((PAT), 0, VAR_LOCATION))
-#define PAT_VAR_LOCATION_LOC(PAT) (XCEXP ((PAT), 1, VAR_LOCATION))
-
-/* Initialization status of the variable in the location.  Status
-   can be unknown, uninitialized or initialized.  See enumeration
-   type below.  */
-#define PAT_VAR_LOCATION_STATUS(PAT) \
-  ((enum var_init_status) (XCINT ((PAT), 2, VAR_LOCATION)))
-
-/* Accessors for a NOTE_INSN_VAR_LOCATION.  */
-#define NOTE_VAR_LOCATION_DECL(NOTE) \
-  PAT_VAR_LOCATION_DECL (NOTE_VAR_LOCATION (NOTE))
-#define NOTE_VAR_LOCATION_LOC(NOTE) \
-  PAT_VAR_LOCATION_LOC (NOTE_VAR_LOCATION (NOTE))
-#define NOTE_VAR_LOCATION_STATUS(NOTE) \
-  PAT_VAR_LOCATION_STATUS (NOTE_VAR_LOCATION (NOTE))
-
-/* The VAR_LOCATION rtx in a DEBUG_INSN.  */
-#define INSN_VAR_LOCATION(INSN) PATTERN (INSN)
-
-/* Accessors for a tree-expanded var location debug insn.  */
-#define INSN_VAR_LOCATION_DECL(INSN) \
-  PAT_VAR_LOCATION_DECL (INSN_VAR_LOCATION (INSN))
-#define INSN_VAR_LOCATION_LOC(INSN) \
-  PAT_VAR_LOCATION_LOC (INSN_VAR_LOCATION (INSN))
-#define INSN_VAR_LOCATION_STATUS(INSN) \
-  PAT_VAR_LOCATION_STATUS (INSN_VAR_LOCATION (INSN))
-
-/* Expand to the RTL that denotes an unknown variable location in a
-   DEBUG_INSN.  */
-#define gen_rtx_UNKNOWN_VAR_LOC() (gen_rtx_CLOBBER (VOIDmode, const0_rtx))
-
-/* Determine whether X is such an unknown location.  */
-#define VAR_LOC_UNKNOWN_P(X) \
-  (GET_CODE (X) == CLOBBER && XEXP ((X), 0) == const0_rtx)
-
-/* 1 if RTX is emitted after a call, but it should take effect before
-   the call returns.  */
-#define NOTE_DURING_CALL_P(RTX)				\
-  (RTL_FLAG_CHECK1 ("NOTE_VAR_LOCATION_DURING_CALL_P", (RTX), NOTE)->call)
-
-/* DEBUG_EXPR_DECL corresponding to a DEBUG_EXPR RTX.  */
-#define DEBUG_EXPR_TREE_DECL(RTX) XCTREE (RTX, 0, DEBUG_EXPR)
-
-/* VAR_DECL/PARM_DECL DEBUG_IMPLICIT_PTR takes address of.  */
-#define DEBUG_IMPLICIT_PTR_DECL(RTX) XCTREE (RTX, 0, DEBUG_IMPLICIT_PTR)
-
-/* PARM_DECL DEBUG_PARAMETER_REF references.  */
-#define DEBUG_PARAMETER_REF_DECL(RTX) XCTREE (RTX, 0, DEBUG_PARAMETER_REF)
-
-/* Codes that appear in the NOTE_KIND field for kinds of notes
-   that are not line numbers.  These codes are all negative.
-
-   Notice that we do not try to use zero here for any of
-   the special note codes because sometimes the source line
-   actually can be zero!  This happens (for example) when we
-   are generating code for the per-translation-unit constructor
-   and destructor routines for some C++ translation unit.  */
-
-enum insn_note
-{
-#define DEF_INSN_NOTE(NAME) NAME,
-#include "insn-notes.def"
-#undef DEF_INSN_NOTE
-
-  NOTE_INSN_MAX
-};
-
-/* Names for NOTE insn's other than line numbers.  */
-
-extern const char * const note_insn_name[NOTE_INSN_MAX];
-#define GET_NOTE_INSN_NAME(NOTE_CODE) \
-  (note_insn_name[(NOTE_CODE)])
-
-/* The name of a label, in case it corresponds to an explicit label
-   in the input source code.  */
-#define LABEL_NAME(RTX) XCSTR (RTX, 7, CODE_LABEL)
-
-/* In jump.c, each label contains a count of the number
-   of LABEL_REFs that point at it, so unused labels can be deleted.  */
-#define LABEL_NUSES(RTX) XCINT (RTX, 5, CODE_LABEL)
-
-/* Labels carry a two-bit field composed of the ->jump and ->call
-   bits.  This field indicates whether the label is an alternate
-   entry point, and if so, what kind.  */
-enum label_kind
-{
-  LABEL_NORMAL = 0,	/* ordinary label */
-  LABEL_STATIC_ENTRY,	/* alternate entry point, not exported */
-  LABEL_GLOBAL_ENTRY,	/* alternate entry point, exported */
-  LABEL_WEAK_ENTRY	/* alternate entry point, exported as weak symbol */
-};
-
-#if defined ENABLE_RTL_FLAG_CHECKING && (GCC_VERSION > 2007)
-
-/* Retrieve the kind of LABEL.  */
-#define LABEL_KIND(LABEL) __extension__					\
-({ __typeof (LABEL) const _label = (LABEL);				\
-   if (! LABEL_P (_label))						\
-     rtl_check_failed_flag ("LABEL_KIND", _label, __FILE__, __LINE__,	\
-			    __FUNCTION__);				\
-   (enum label_kind) ((_label->jump << 1) | _label->call); })
-
-/* Set the kind of LABEL.  */
-#define SET_LABEL_KIND(LABEL, KIND) do {				\
-   __typeof (LABEL) const _label = (LABEL);				\
-   const unsigned int _kind = (KIND);					\
-   if (! LABEL_P (_label))						\
-     rtl_check_failed_flag ("SET_LABEL_KIND", _label, __FILE__, __LINE__, \
-			    __FUNCTION__);				\
-   _label->jump = ((_kind >> 1) & 1);					\
-   _label->call = (_kind & 1);						\
-} while (0)
-
-#else
-
-/* Retrieve the kind of LABEL.  */
-#define LABEL_KIND(LABEL) \
-   ((enum label_kind) (((LABEL)->jump << 1) | (LABEL)->call))
-
-/* Set the kind of LABEL.  */
-#define SET_LABEL_KIND(LABEL, KIND) do {				\
-   rtx const _label = (LABEL);						\
-   const unsigned int _kind = (KIND);					\
-   _label->jump = ((_kind >> 1) & 1);					\
-   _label->call = (_kind & 1);						\
-} while (0)
-
-#endif /* rtl flag checking */
-
-#define LABEL_ALT_ENTRY_P(LABEL) (LABEL_KIND (LABEL) != LABEL_NORMAL)
-
-/* In jump.c, each JUMP_INSN can point to a label that it can jump to,
-   so that if the JUMP_INSN is deleted, the label's LABEL_NUSES can
-   be decremented and possibly the label can be deleted.  */
-#define JUMP_LABEL(INSN)   XCEXP (INSN, 8, JUMP_INSN)
-
-/* Once basic blocks are found, each CODE_LABEL starts a chain that
-   goes through all the LABEL_REFs that jump to that label.  The chain
-   eventually winds up at the CODE_LABEL: it is circular.  */
-#define LABEL_REFS(LABEL) XCEXP (LABEL, 4, CODE_LABEL)
-
-/* For a REG rtx, REGNO extracts the register number.  REGNO can only
-   be used on RHS.  Use SET_REGNO to change the value.  */
-#define REGNO(RTX) (rhs_regno(RTX))
-#define SET_REGNO(RTX,N) \
-  (df_ref_change_reg_with_loc (REGNO (RTX), N, RTX), XCUINT (RTX, 0, REG) = N)
-#define SET_REGNO_RAW(RTX,N) (XCUINT (RTX, 0, REG) = N)
-
-/* ORIGINAL_REGNO holds the number the register originally had; for a
-   pseudo register turned into a hard reg this will hold the old pseudo
-   register number.  */
-#define ORIGINAL_REGNO(RTX) X0UINT (RTX, 1)
-
-/* Force the REGNO macro to only be used on the lhs.  */
-static inline unsigned int
-rhs_regno (const_rtx x)
-{
-  return XCUINT (x, 0, REG);
-}
-
-
-/* 1 if RTX is a reg or parallel that is the current function's return
-   value.  */
-#define REG_FUNCTION_VALUE_P(RTX)					\
-  (RTL_FLAG_CHECK2 ("REG_FUNCTION_VALUE_P", (RTX), REG, PARALLEL)->return_val)
-
-/* 1 if RTX is a reg that corresponds to a variable declared by the user.  */
-#define REG_USERVAR_P(RTX)						\
-  (RTL_FLAG_CHECK1 ("REG_USERVAR_P", (RTX), REG)->volatil)
-
-/* 1 if RTX is a reg that holds a pointer value.  */
-#define REG_POINTER(RTX)						\
-  (RTL_FLAG_CHECK1 ("REG_POINTER", (RTX), REG)->frame_related)
-
-/* 1 if RTX is a mem that holds a pointer value.  */
-#define MEM_POINTER(RTX)						\
-  (RTL_FLAG_CHECK1 ("MEM_POINTER", (RTX), MEM)->frame_related)
-
-/* 1 if the given register REG corresponds to a hard register.  */
-#define HARD_REGISTER_P(REG) (HARD_REGISTER_NUM_P (REGNO (REG)))
-
-/* 1 if the given register number REG_NO corresponds to a hard register.  */
-#define HARD_REGISTER_NUM_P(REG_NO) ((REG_NO) < FIRST_PSEUDO_REGISTER)
-
-/* For a CONST_INT rtx, INTVAL extracts the integer.  */
-#define INTVAL(RTX) XCWINT (RTX, 0, CONST_INT)
-#define UINTVAL(RTX) ((unsigned HOST_WIDE_INT) INTVAL (RTX))
-
-/* For a CONST_DOUBLE:
-   For a VOIDmode, there are two integers CONST_DOUBLE_LOW is the
-     low-order word and ..._HIGH the high-order.
-   For a float, there is a REAL_VALUE_TYPE structure, and
-     CONST_DOUBLE_REAL_VALUE(r) is a pointer to it.  */
-#define CONST_DOUBLE_LOW(r) XCMWINT (r, 0, CONST_DOUBLE, VOIDmode)
-#define CONST_DOUBLE_HIGH(r) XCMWINT (r, 1, CONST_DOUBLE, VOIDmode)
-#define CONST_DOUBLE_REAL_VALUE(r) \
-  ((const struct real_value *) XCNMPRV (r, CONST_DOUBLE, VOIDmode))
-
-#define CONST_FIXED_VALUE(r) \
-  ((const struct fixed_value *) XCNMPFV (r, CONST_FIXED, VOIDmode))
-#define CONST_FIXED_VALUE_HIGH(r) \
-  ((HOST_WIDE_INT) (CONST_FIXED_VALUE (r)->data.high))
-#define CONST_FIXED_VALUE_LOW(r) \
-  ((HOST_WIDE_INT) (CONST_FIXED_VALUE (r)->data.low))
-
-/* For a CONST_VECTOR, return element #n.  */
-#define CONST_VECTOR_ELT(RTX, N) XCVECEXP (RTX, 0, N, CONST_VECTOR)
-
-/* For a CONST_VECTOR, return the number of elements in a vector.  */
-#define CONST_VECTOR_NUNITS(RTX) XCVECLEN (RTX, 0, CONST_VECTOR)
-
-/* For a SUBREG rtx, SUBREG_REG extracts the value we want a subreg of.
-   SUBREG_BYTE extracts the byte-number.  */
-
-#define SUBREG_REG(RTX) XCEXP (RTX, 0, SUBREG)
-#define SUBREG_BYTE(RTX) XCUINT (RTX, 1, SUBREG)
-
-/* in rtlanal.c */
-/* Return the right cost to give to an operation
-   to make the cost of the corresponding register-to-register instruction
-   N times that of a fast register-to-register instruction.  */
-#define COSTS_N_INSNS(N) ((N) * 4)
-
-/* Maximum cost of an rtl expression.  This value has the special meaning
-   not to use an rtx with this cost under any circumstances.  */
-#define MAX_COST INT_MAX
-
-/* A structure to hold all available cost information about an rtl
-   expression.  */
-struct full_rtx_costs
-{
-  int speed;
-  int size;
-};
-
-/* Initialize a full_rtx_costs structure C to the maximum cost.  */
-static inline void
-init_costs_to_max (struct full_rtx_costs *c)
-{
-  c->speed = MAX_COST;
-  c->size = MAX_COST;
-}
-
-/* Initialize a full_rtx_costs structure C to zero cost.  */
-static inline void
-init_costs_to_zero (struct full_rtx_costs *c)
-{
-  c->speed = 0;
-  c->size = 0;
-}
-
-/* Compare two full_rtx_costs structures A and B, returning true
-   if A < B when optimizing for speed.  */
-static inline bool
-costs_lt_p (struct full_rtx_costs *a, struct full_rtx_costs *b,
-	    bool speed)
-{
-  if (speed)
-    return (a->speed < b->speed
-	    || (a->speed == b->speed && a->size < b->size));
-  else
-    return (a->size < b->size
-	    || (a->size == b->size && a->speed < b->speed));
-}
-
-/* Increase both members of the full_rtx_costs structure C by the
-   cost of N insns.  */
-static inline void
-costs_add_n_insns (struct full_rtx_costs *c, int n)
-{
-  c->speed += COSTS_N_INSNS (n);
-  c->size += COSTS_N_INSNS (n);
-}
-
-/* Information about an address.  This structure is supposed to be able
-   to represent all supported target addresses.  Please extend it if it
-   is not yet general enough.  */
-struct address_info {
-  /* The mode of the value being addressed, or VOIDmode if this is
-     a load-address operation with no known address mode.  */
-  enum machine_mode mode;
-
-  /* The address space.  */
-  addr_space_t as;
-
-  /* A pointer to the top-level address.  */
-  rtx *outer;
-
-  /* A pointer to the inner address, after all address mutations
-     have been stripped from the top-level address.  It can be one
-     of the following:
-
-     - A {PRE,POST}_{INC,DEC} of *BASE.  SEGMENT, INDEX and DISP are null.
-
-     - A {PRE,POST}_MODIFY of *BASE.  In this case either INDEX or DISP
-       points to the step value, depending on whether the step is variable
-       or constant respectively.  SEGMENT is null.
-
-     - A plain sum of the form SEGMENT + BASE + INDEX + DISP,
-       with null fields evaluating to 0.  */
-  rtx *inner;
-
-  /* Components that make up *INNER.  Each one may be null or nonnull.
-     When nonnull, their meanings are as follows:
-
-     - *SEGMENT is the "segment" of memory to which the address refers.
-       This value is entirely target-specific and is only called a "segment"
-       because that's its most typical use.  It contains exactly one UNSPEC,
-       pointed to by SEGMENT_TERM.  The contents of *SEGMENT do not need
-       reloading.
-
-     - *BASE is a variable expression representing a base address.
-       It contains exactly one REG, SUBREG or MEM, pointed to by BASE_TERM.
-
-     - *INDEX is a variable expression representing an index value.
-       It may be a scaled expression, such as a MULT.  It has exactly
-       one REG, SUBREG or MEM, pointed to by INDEX_TERM.
-
-     - *DISP is a constant, possibly mutated.  DISP_TERM points to the
-       unmutated RTX_CONST_OBJ.  */
-  rtx *segment;
-  rtx *base;
-  rtx *index;
-  rtx *disp;
-
-  rtx *segment_term;
-  rtx *base_term;
-  rtx *index_term;
-  rtx *disp_term;
-
-  /* In a {PRE,POST}_MODIFY address, this points to a second copy
-     of BASE_TERM, otherwise it is null.  */
-  rtx *base_term2;
-
-  /* ADDRESS if this structure describes an address operand, MEM if
-     it describes a MEM address.  */
-  enum rtx_code addr_outer_code;
-
-  /* If BASE is nonnull, this is the code of the rtx that contains it.  */
-  enum rtx_code base_outer_code;
-
-  /* True if this is an RTX_AUTOINC address.  */
-  bool autoinc_p;
-};
-
-extern void init_rtlanal (void);
-extern int rtx_cost (rtx, enum rtx_code, int, bool);
-extern int address_cost (rtx, enum machine_mode, addr_space_t, bool);
-extern void get_full_rtx_cost (rtx, enum rtx_code, int,
-			       struct full_rtx_costs *);
-extern unsigned int subreg_lsb (const_rtx);
-extern unsigned int subreg_lsb_1 (enum machine_mode, enum machine_mode,
-				  unsigned int);
-extern unsigned int subreg_regno_offset	(unsigned int, enum machine_mode,
-					 unsigned int, enum machine_mode);
-extern bool subreg_offset_representable_p (unsigned int, enum machine_mode,
-					   unsigned int, enum machine_mode);
-extern unsigned int subreg_regno (const_rtx);
-extern int simplify_subreg_regno (unsigned int, enum machine_mode,
-				  unsigned int, enum machine_mode);
-extern unsigned int subreg_nregs (const_rtx);
-extern unsigned int subreg_nregs_with_regno (unsigned int, const_rtx);
-extern unsigned HOST_WIDE_INT nonzero_bits (const_rtx, enum machine_mode);
-extern unsigned int num_sign_bit_copies (const_rtx, enum machine_mode);
-extern bool constant_pool_constant_p (rtx);
-extern bool truncated_to_mode (enum machine_mode, const_rtx);
-extern int low_bitmask_len (enum machine_mode, unsigned HOST_WIDE_INT);
-extern void split_double (rtx, rtx *, rtx *);
-extern rtx *strip_address_mutations (rtx *, enum rtx_code * = 0);
-extern void decompose_address (struct address_info *, rtx *,
-			       enum machine_mode, addr_space_t, enum rtx_code);
-extern void decompose_lea_address (struct address_info *, rtx *);
-extern void decompose_mem_address (struct address_info *, rtx);
-extern void update_address (struct address_info *);
-extern HOST_WIDE_INT get_index_scale (const struct address_info *);
-extern enum rtx_code get_index_code (const struct address_info *);
-
-#ifndef GENERATOR_FILE
-/* Return the cost of SET X.  SPEED_P is true if optimizing for speed
-   rather than size.  */
-
-static inline int
-set_rtx_cost (rtx x, bool speed_p)
-{
-  return rtx_cost (x, INSN, 4, speed_p);
-}
-
-/* Like set_rtx_cost, but return both the speed and size costs in C.  */
-
-static inline void
-get_full_set_rtx_cost (rtx x, struct full_rtx_costs *c)
-{
-  get_full_rtx_cost (x, INSN, 4, c);
-}
-
-/* Return the cost of moving X into a register, relative to the cost
-   of a register move.  SPEED_P is true if optimizing for speed rather
-   than size.  */
-
-static inline int
-set_src_cost (rtx x, bool speed_p)
-{
-  return rtx_cost (x, SET, 1, speed_p);
-}
-
-/* Like set_src_cost, but return both the speed and size costs in C.  */
-
-static inline void
-get_full_set_src_cost (rtx x, struct full_rtx_costs *c)
-{
-  get_full_rtx_cost (x, SET, 1, c);
-}
-#endif
-
-/* 1 if RTX is a subreg containing a reg that is already known to be
-   sign- or zero-extended from the mode of the subreg to the mode of
-   the reg.  SUBREG_PROMOTED_UNSIGNED_P gives the signedness of the
-   extension.
-
-   When used as a LHS, is means that this extension must be done
-   when assigning to SUBREG_REG.  */
-
-#define SUBREG_PROMOTED_VAR_P(RTX)					\
-  (RTL_FLAG_CHECK1 ("SUBREG_PROMOTED", (RTX), SUBREG)->in_struct)
-
-#define SUBREG_PROMOTED_UNSIGNED_SET(RTX, VAL)				\
-do {									\
-  rtx const _rtx = RTL_FLAG_CHECK1 ("SUBREG_PROMOTED_UNSIGNED_SET",	\
-				    (RTX), SUBREG);			\
-  if ((VAL) < 0)							\
-    _rtx->volatil = 1;							\
-  else {								\
-    _rtx->volatil = 0;							\
-    _rtx->unchanging = (VAL);						\
-  }									\
-} while (0)
-
-/* Valid for subregs which are SUBREG_PROMOTED_VAR_P().  In that case
-   this gives the necessary extensions:
-   0  - signed
-   1  - normal unsigned
-   -1 - pointer unsigned, which most often can be handled like unsigned
-        extension, except for generating instructions where we need to
-	emit special code (ptr_extend insns) on some architectures.  */
-
-#define SUBREG_PROMOTED_UNSIGNED_P(RTX)	\
-  ((RTL_FLAG_CHECK1 ("SUBREG_PROMOTED_UNSIGNED_P", (RTX), SUBREG)->volatil) \
-   ? -1 : (int) (RTX)->unchanging)
-
-/* True if the subreg was generated by LRA for reload insns.  Such
-   subregs are valid only during LRA.  */
-#define LRA_SUBREG_P(RTX)	\
-  (RTL_FLAG_CHECK1 ("LRA_SUBREG_P", (RTX), SUBREG)->jump)
-
-/* Access various components of an ASM_OPERANDS rtx.  */
-
-#define ASM_OPERANDS_TEMPLATE(RTX) XCSTR (RTX, 0, ASM_OPERANDS)
-#define ASM_OPERANDS_OUTPUT_CONSTRAINT(RTX) XCSTR (RTX, 1, ASM_OPERANDS)
-#define ASM_OPERANDS_OUTPUT_IDX(RTX) XCINT (RTX, 2, ASM_OPERANDS)
-#define ASM_OPERANDS_INPUT_VEC(RTX) XCVEC (RTX, 3, ASM_OPERANDS)
-#define ASM_OPERANDS_INPUT_CONSTRAINT_VEC(RTX) XCVEC (RTX, 4, ASM_OPERANDS)
-#define ASM_OPERANDS_INPUT(RTX, N) XCVECEXP (RTX, 3, N, ASM_OPERANDS)
-#define ASM_OPERANDS_INPUT_LENGTH(RTX) XCVECLEN (RTX, 3, ASM_OPERANDS)
-#define ASM_OPERANDS_INPUT_CONSTRAINT_EXP(RTX, N) \
-  XCVECEXP (RTX, 4, N, ASM_OPERANDS)
-#define ASM_OPERANDS_INPUT_CONSTRAINT(RTX, N) \
-  XSTR (XCVECEXP (RTX, 4, N, ASM_OPERANDS), 0)
-#define ASM_OPERANDS_INPUT_MODE(RTX, N)  \
-  GET_MODE (XCVECEXP (RTX, 4, N, ASM_OPERANDS))
-#define ASM_OPERANDS_LABEL_VEC(RTX) XCVEC (RTX, 5, ASM_OPERANDS)
-#define ASM_OPERANDS_LABEL_LENGTH(RTX) XCVECLEN (RTX, 5, ASM_OPERANDS)
-#define ASM_OPERANDS_LABEL(RTX, N) XCVECEXP (RTX, 5, N, ASM_OPERANDS)
-#define ASM_OPERANDS_SOURCE_LOCATION(RTX) XCUINT (RTX, 6, ASM_OPERANDS)
-#define ASM_INPUT_SOURCE_LOCATION(RTX) XCUINT (RTX, 1, ASM_INPUT)
-
-/* 1 if RTX is a mem that is statically allocated in read-only memory.  */
-#define MEM_READONLY_P(RTX) \
-  (RTL_FLAG_CHECK1 ("MEM_READONLY_P", (RTX), MEM)->unchanging)
-
-/* 1 if RTX is a mem and we should keep the alias set for this mem
-   unchanged when we access a component.  Set to 1, or example, when we
-   are already in a non-addressable component of an aggregate.  */
-#define MEM_KEEP_ALIAS_SET_P(RTX)					\
-  (RTL_FLAG_CHECK1 ("MEM_KEEP_ALIAS_SET_P", (RTX), MEM)->jump)
-
-/* 1 if RTX is a mem or asm_operand for a volatile reference.  */
-#define MEM_VOLATILE_P(RTX)						\
-  (RTL_FLAG_CHECK3 ("MEM_VOLATILE_P", (RTX), MEM, ASM_OPERANDS,		\
-		    ASM_INPUT)->volatil)
-
-/* 1 if RTX is a mem that cannot trap.  */
-#define MEM_NOTRAP_P(RTX) \
-  (RTL_FLAG_CHECK1 ("MEM_NOTRAP_P", (RTX), MEM)->call)
-
-/* The memory attribute block.  We provide access macros for each value
-   in the block and provide defaults if none specified.  */
-#define MEM_ATTRS(RTX) X0MEMATTR (RTX, 1)
-
-/* The register attribute block.  We provide access macros for each value
-   in the block and provide defaults if none specified.  */
-#define REG_ATTRS(RTX) X0REGATTR (RTX, 2)
-
-#ifndef GENERATOR_FILE
-/* For a MEM rtx, the alias set.  If 0, this MEM is not in any alias
-   set, and may alias anything.  Otherwise, the MEM can only alias
-   MEMs in a conflicting alias set.  This value is set in a
-   language-dependent manner in the front-end, and should not be
-   altered in the back-end.  These set numbers are tested with
-   alias_sets_conflict_p.  */
-#define MEM_ALIAS_SET(RTX) (get_mem_attrs (RTX)->alias)
-
-/* For a MEM rtx, the decl it is known to refer to, if it is known to
-   refer to part of a DECL.  It may also be a COMPONENT_REF.  */
-#define MEM_EXPR(RTX) (get_mem_attrs (RTX)->expr)
-
-/* For a MEM rtx, true if its MEM_OFFSET is known.  */
-#define MEM_OFFSET_KNOWN_P(RTX) (get_mem_attrs (RTX)->offset_known_p)
-
-/* For a MEM rtx, the offset from the start of MEM_EXPR.  */
-#define MEM_OFFSET(RTX) (get_mem_attrs (RTX)->offset)
-
-/* For a MEM rtx, the address space.  */
-#define MEM_ADDR_SPACE(RTX) (get_mem_attrs (RTX)->addrspace)
-
-/* For a MEM rtx, true if its MEM_SIZE is known.  */
-#define MEM_SIZE_KNOWN_P(RTX) (get_mem_attrs (RTX)->size_known_p)
-
-/* For a MEM rtx, the size in bytes of the MEM.  */
-#define MEM_SIZE(RTX) (get_mem_attrs (RTX)->size)
-
-/* For a MEM rtx, the alignment in bits.  We can use the alignment of the
-   mode as a default when STRICT_ALIGNMENT, but not if not.  */
-#define MEM_ALIGN(RTX) (get_mem_attrs (RTX)->align)
-#else
-#define MEM_ADDR_SPACE(RTX) ADDR_SPACE_GENERIC
-#endif
-
-/* For a REG rtx, the decl it is known to refer to, if it is known to
-   refer to part of a DECL.  */
-#define REG_EXPR(RTX) (REG_ATTRS (RTX) == 0 ? 0 : REG_ATTRS (RTX)->decl)
-
-/* For a REG rtx, the offset from the start of REG_EXPR, if known, as an
-   HOST_WIDE_INT.  */
-#define REG_OFFSET(RTX) (REG_ATTRS (RTX) == 0 ? 0 : REG_ATTRS (RTX)->offset)
-
-/* Copy the attributes that apply to memory locations from RHS to LHS.  */
-#define MEM_COPY_ATTRIBUTES(LHS, RHS)				\
-  (MEM_VOLATILE_P (LHS) = MEM_VOLATILE_P (RHS),			\
-   MEM_NOTRAP_P (LHS) = MEM_NOTRAP_P (RHS),			\
-   MEM_READONLY_P (LHS) = MEM_READONLY_P (RHS),			\
-   MEM_KEEP_ALIAS_SET_P (LHS) = MEM_KEEP_ALIAS_SET_P (RHS),	\
-   MEM_POINTER (LHS) = MEM_POINTER (RHS),			\
-   MEM_ATTRS (LHS) = MEM_ATTRS (RHS))
-
-/* 1 if RTX is a label_ref for a nonlocal label.  */
-/* Likewise in an expr_list for a REG_LABEL_OPERAND or
-   REG_LABEL_TARGET note.  */
-#define LABEL_REF_NONLOCAL_P(RTX)					\
-  (RTL_FLAG_CHECK1 ("LABEL_REF_NONLOCAL_P", (RTX), LABEL_REF)->volatil)
-
-/* 1 if RTX is a code_label that should always be considered to be needed.  */
-#define LABEL_PRESERVE_P(RTX)						\
-  (RTL_FLAG_CHECK2 ("LABEL_PRESERVE_P", (RTX), CODE_LABEL, NOTE)->in_struct)
-
-/* During sched, 1 if RTX is an insn that must be scheduled together
-   with the preceding insn.  */
-#define SCHED_GROUP_P(RTX)						\
-  (RTL_FLAG_CHECK4 ("SCHED_GROUP_P", (RTX), DEBUG_INSN, INSN,		\
-		    JUMP_INSN, CALL_INSN)->in_struct)
-
-/* For a SET rtx, SET_DEST is the place that is set
-   and SET_SRC is the value it is set to.  */
-#define SET_DEST(RTX) XC2EXP (RTX, 0, SET, CLOBBER)
-#define SET_SRC(RTX) XCEXP (RTX, 1, SET)
-#define SET_IS_RETURN_P(RTX)						\
-  (RTL_FLAG_CHECK1 ("SET_IS_RETURN_P", (RTX), SET)->jump)
-
-/* For a TRAP_IF rtx, TRAP_CONDITION is an expression.  */
-#define TRAP_CONDITION(RTX) XCEXP (RTX, 0, TRAP_IF)
-#define TRAP_CODE(RTX) XCEXP (RTX, 1, TRAP_IF)
-
-/* For a COND_EXEC rtx, COND_EXEC_TEST is the condition to base
-   conditionally executing the code on, COND_EXEC_CODE is the code
-   to execute if the condition is true.  */
-#define COND_EXEC_TEST(RTX) XCEXP (RTX, 0, COND_EXEC)
-#define COND_EXEC_CODE(RTX) XCEXP (RTX, 1, COND_EXEC)
-
-/* 1 if RTX is a symbol_ref that addresses this function's rtl
-   constants pool.  */
-#define CONSTANT_POOL_ADDRESS_P(RTX)					\
-  (RTL_FLAG_CHECK1 ("CONSTANT_POOL_ADDRESS_P", (RTX), SYMBOL_REF)->unchanging)
-
-/* 1 if RTX is a symbol_ref that addresses a value in the file's
-   tree constant pool.  This information is private to varasm.c.  */
-#define TREE_CONSTANT_POOL_ADDRESS_P(RTX)				\
-  (RTL_FLAG_CHECK1 ("TREE_CONSTANT_POOL_ADDRESS_P",			\
-		    (RTX), SYMBOL_REF)->frame_related)
-
-/* Used if RTX is a symbol_ref, for machine-specific purposes.  */
-#define SYMBOL_REF_FLAG(RTX)						\
-  (RTL_FLAG_CHECK1 ("SYMBOL_REF_FLAG", (RTX), SYMBOL_REF)->volatil)
-
-/* 1 if RTX is a symbol_ref that has been the library function in
-   emit_library_call.  */
-#define SYMBOL_REF_USED(RTX)						\
-  (RTL_FLAG_CHECK1 ("SYMBOL_REF_USED", (RTX), SYMBOL_REF)->used)
-
-/* 1 if RTX is a symbol_ref for a weak symbol.  */
-#define SYMBOL_REF_WEAK(RTX)						\
-  (RTL_FLAG_CHECK1 ("SYMBOL_REF_WEAK", (RTX), SYMBOL_REF)->return_val)
-
-/* A pointer attached to the SYMBOL_REF; either SYMBOL_REF_DECL or
-   SYMBOL_REF_CONSTANT.  */
-#define SYMBOL_REF_DATA(RTX) X0ANY ((RTX), 2)
-
-/* Set RTX's SYMBOL_REF_DECL to DECL.  RTX must not be a constant
-   pool symbol.  */
-#define SET_SYMBOL_REF_DECL(RTX, DECL) \
-  (gcc_assert (!CONSTANT_POOL_ADDRESS_P (RTX)), X0TREE ((RTX), 2) = (DECL))
-
-/* The tree (decl or constant) associated with the symbol, or null.  */
-#define SYMBOL_REF_DECL(RTX) \
-  (CONSTANT_POOL_ADDRESS_P (RTX) ? NULL : X0TREE ((RTX), 2))
-
-/* Set RTX's SYMBOL_REF_CONSTANT to C.  RTX must be a constant pool symbol.  */
-#define SET_SYMBOL_REF_CONSTANT(RTX, C) \
-  (gcc_assert (CONSTANT_POOL_ADDRESS_P (RTX)), X0CONSTANT ((RTX), 2) = (C))
-
-/* The rtx constant pool entry for a symbol, or null.  */
-#define SYMBOL_REF_CONSTANT(RTX) \
-  (CONSTANT_POOL_ADDRESS_P (RTX) ? X0CONSTANT ((RTX), 2) : NULL)
-
-/* A set of flags on a symbol_ref that are, in some respects, redundant with
-   information derivable from the tree decl associated with this symbol.
-   Except that we build a *lot* of SYMBOL_REFs that aren't associated with a
-   decl.  In some cases this is a bug.  But beyond that, it's nice to cache
-   this information to avoid recomputing it.  Finally, this allows space for
-   the target to store more than one bit of information, as with
-   SYMBOL_REF_FLAG.  */
-#define SYMBOL_REF_FLAGS(RTX)	X0INT ((RTX), 1)
-
-/* These flags are common enough to be defined for all targets.  They
-   are computed by the default version of targetm.encode_section_info.  */
-
-/* Set if this symbol is a function.  */
-#define SYMBOL_FLAG_FUNCTION	(1 << 0)
-#define SYMBOL_REF_FUNCTION_P(RTX) \
-  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_FUNCTION) != 0)
-/* Set if targetm.binds_local_p is true.  */
-#define SYMBOL_FLAG_LOCAL	(1 << 1)
-#define SYMBOL_REF_LOCAL_P(RTX) \
-  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_LOCAL) != 0)
-/* Set if targetm.in_small_data_p is true.  */
-#define SYMBOL_FLAG_SMALL	(1 << 2)
-#define SYMBOL_REF_SMALL_P(RTX) \
-  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_SMALL) != 0)
-/* The three-bit field at [5:3] is true for TLS variables; use
-   SYMBOL_REF_TLS_MODEL to extract the field as an enum tls_model.  */
-#define SYMBOL_FLAG_TLS_SHIFT	3
-#define SYMBOL_REF_TLS_MODEL(RTX) \
-  ((enum tls_model) ((SYMBOL_REF_FLAGS (RTX) >> SYMBOL_FLAG_TLS_SHIFT) & 7))
-/* Set if this symbol is not defined in this translation unit.  */
-#define SYMBOL_FLAG_EXTERNAL	(1 << 6)
-#define SYMBOL_REF_EXTERNAL_P(RTX) \
-  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_EXTERNAL) != 0)
-/* Set if this symbol has a block_symbol structure associated with it.  */
-#define SYMBOL_FLAG_HAS_BLOCK_INFO (1 << 7)
-#define SYMBOL_REF_HAS_BLOCK_INFO_P(RTX) \
-  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_HAS_BLOCK_INFO) != 0)
-/* Set if this symbol is a section anchor.  SYMBOL_REF_ANCHOR_P implies
-   SYMBOL_REF_HAS_BLOCK_INFO_P.  */
-#define SYMBOL_FLAG_ANCHOR	(1 << 8)
-#define SYMBOL_REF_ANCHOR_P(RTX) \
-  ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_ANCHOR) != 0)
-
-/* Subsequent bits are available for the target to use.  */
-#define SYMBOL_FLAG_MACH_DEP_SHIFT	9
-#define SYMBOL_FLAG_MACH_DEP		(1 << SYMBOL_FLAG_MACH_DEP_SHIFT)
-
-/* If SYMBOL_REF_HAS_BLOCK_INFO_P (RTX), this is the object_block
-   structure to which the symbol belongs, or NULL if it has not been
-   assigned a block.  */
-#define SYMBOL_REF_BLOCK(RTX) (BLOCK_SYMBOL_CHECK (RTX)->block)
-
-/* If SYMBOL_REF_HAS_BLOCK_INFO_P (RTX), this is the offset of RTX from
-   the first object in SYMBOL_REF_BLOCK (RTX).  The value is negative if
-   RTX has not yet been assigned to a block, or it has not been given an
-   offset within that block.  */
-#define SYMBOL_REF_BLOCK_OFFSET(RTX) (BLOCK_SYMBOL_CHECK (RTX)->offset)
-
-/* True if RTX is flagged to be a scheduling barrier.  */
-#define PREFETCH_SCHEDULE_BARRIER_P(RTX)					\
-  (RTL_FLAG_CHECK1 ("PREFETCH_SCHEDULE_BARRIER_P", (RTX), PREFETCH)->volatil)
-
-/* Indicate whether the machine has any sort of auto increment addressing.
-   If not, we can avoid checking for REG_INC notes.  */
-
-#if (defined (HAVE_PRE_INCREMENT) || defined (HAVE_PRE_DECREMENT) \
-     || defined (HAVE_POST_INCREMENT) || defined (HAVE_POST_DECREMENT) \
-     || defined (HAVE_PRE_MODIFY_DISP) || defined (HAVE_POST_MODIFY_DISP) \
-     || defined (HAVE_PRE_MODIFY_REG) || defined (HAVE_POST_MODIFY_REG))
-#define AUTO_INC_DEC
-#endif
-
-/* Define a macro to look for REG_INC notes,
-   but save time on machines where they never exist.  */
-
-#ifdef AUTO_INC_DEC
-#define FIND_REG_INC_NOTE(INSN, REG)			\
-  ((REG) != NULL_RTX && REG_P ((REG))			\
-   ? find_regno_note ((INSN), REG_INC, REGNO (REG))	\
-   : find_reg_note ((INSN), REG_INC, (REG)))
-#else
-#define FIND_REG_INC_NOTE(INSN, REG) 0
-#endif
-
-#ifndef HAVE_PRE_INCREMENT
-#define HAVE_PRE_INCREMENT 0
-#endif
-
-#ifndef HAVE_PRE_DECREMENT
-#define HAVE_PRE_DECREMENT 0
-#endif
-
-#ifndef HAVE_POST_INCREMENT
-#define HAVE_POST_INCREMENT 0
-#endif
-
-#ifndef HAVE_POST_DECREMENT
-#define HAVE_POST_DECREMENT 0
-#endif
-
-#ifndef HAVE_POST_MODIFY_DISP
-#define HAVE_POST_MODIFY_DISP 0
-#endif
-
-#ifndef HAVE_POST_MODIFY_REG
-#define HAVE_POST_MODIFY_REG 0
-#endif
-
-#ifndef HAVE_PRE_MODIFY_DISP
-#define HAVE_PRE_MODIFY_DISP 0
-#endif
-
-#ifndef HAVE_PRE_MODIFY_REG
-#define HAVE_PRE_MODIFY_REG 0
-#endif
-
-
-/* Some architectures do not have complete pre/post increment/decrement
-   instruction sets, or only move some modes efficiently.  These macros
-   allow us to tune autoincrement generation.  */
-
-#ifndef USE_LOAD_POST_INCREMENT
-#define USE_LOAD_POST_INCREMENT(MODE)   HAVE_POST_INCREMENT
-#endif
-
-#ifndef USE_LOAD_POST_DECREMENT
-#define USE_LOAD_POST_DECREMENT(MODE)   HAVE_POST_DECREMENT
-#endif
-
-#ifndef USE_LOAD_PRE_INCREMENT
-#define USE_LOAD_PRE_INCREMENT(MODE)    HAVE_PRE_INCREMENT
-#endif
-
-#ifndef USE_LOAD_PRE_DECREMENT
-#define USE_LOAD_PRE_DECREMENT(MODE)    HAVE_PRE_DECREMENT
-#endif
-
-#ifndef USE_STORE_POST_INCREMENT
-#define USE_STORE_POST_INCREMENT(MODE)  HAVE_POST_INCREMENT
-#endif
-
-#ifndef USE_STORE_POST_DECREMENT
-#define USE_STORE_POST_DECREMENT(MODE)  HAVE_POST_DECREMENT
-#endif
-
-#ifndef USE_STORE_PRE_INCREMENT
-#define USE_STORE_PRE_INCREMENT(MODE)   HAVE_PRE_INCREMENT
-#endif
-
-#ifndef USE_STORE_PRE_DECREMENT
-#define USE_STORE_PRE_DECREMENT(MODE)   HAVE_PRE_DECREMENT
-#endif
-
-/* Nonzero when we are generating CONCATs.  */
-extern int generating_concat_p;
-
-/* Nonzero when we are expanding trees to RTL.  */
-extern int currently_expanding_to_rtl;
-
-/* Generally useful functions.  */
-
-/* In explow.c */
-extern HOST_WIDE_INT trunc_int_for_mode	(HOST_WIDE_INT, enum machine_mode);
-extern rtx plus_constant (enum machine_mode, rtx, HOST_WIDE_INT);
-
-/* In rtl.c */
-extern rtx rtx_alloc_stat (RTX_CODE MEM_STAT_DECL);
-#define rtx_alloc(c) rtx_alloc_stat (c MEM_STAT_INFO)
-
-extern rtvec rtvec_alloc (int);
-extern rtvec shallow_copy_rtvec (rtvec);
-extern bool shared_const_p (const_rtx);
-extern rtx copy_rtx (rtx);
-extern void dump_rtx_statistics (void);
-
-/* In emit-rtl.c */
-extern rtx copy_rtx_if_shared (rtx);
-
-/* In rtl.c */
-extern unsigned int rtx_size (const_rtx);
-extern rtx shallow_copy_rtx_stat (const_rtx MEM_STAT_DECL);
-#define shallow_copy_rtx(a) shallow_copy_rtx_stat (a MEM_STAT_INFO)
-extern int rtx_equal_p (const_rtx, const_rtx);
-extern hashval_t iterative_hash_rtx (const_rtx, hashval_t);
-
-/* In emit-rtl.c */
-extern rtvec gen_rtvec_v (int, rtx *);
-extern rtx gen_reg_rtx (enum machine_mode);
-extern rtx gen_rtx_REG_offset (rtx, enum machine_mode, unsigned int, int);
-extern rtx gen_reg_rtx_offset (rtx, enum machine_mode, int);
-extern rtx gen_reg_rtx_and_attrs (rtx);
-extern rtx gen_label_rtx (void);
-extern rtx gen_lowpart_common (enum machine_mode, rtx);
-
-/* In cse.c */
-extern rtx gen_lowpart_if_possible (enum machine_mode, rtx);
-
-/* In emit-rtl.c */
-extern rtx gen_highpart (enum machine_mode, rtx);
-extern rtx gen_highpart_mode (enum machine_mode, enum machine_mode, rtx);
-extern rtx operand_subword (rtx, unsigned int, int, enum machine_mode);
-
-/* In emit-rtl.c */
-extern rtx operand_subword_force (rtx, unsigned int, enum machine_mode);
-extern bool paradoxical_subreg_p (const_rtx);
-extern int subreg_lowpart_p (const_rtx);
-extern unsigned int subreg_lowpart_offset (enum machine_mode,
-					   enum machine_mode);
-extern unsigned int subreg_highpart_offset (enum machine_mode,
-					    enum machine_mode);
-extern int byte_lowpart_offset (enum machine_mode, enum machine_mode);
-extern rtx make_safe_from (rtx, rtx);
-extern rtx convert_memory_address_addr_space (enum machine_mode, rtx,
-					      addr_space_t);
-#define convert_memory_address(to_mode,x) \
-	convert_memory_address_addr_space ((to_mode), (x), ADDR_SPACE_GENERIC)
-extern const char *get_insn_name (int);
-extern rtx get_last_insn_anywhere (void);
-extern rtx get_first_nonnote_insn (void);
-extern rtx get_last_nonnote_insn (void);
-extern void start_sequence (void);
-extern void push_to_sequence (rtx);
-extern void push_to_sequence2 (rtx, rtx);
-extern void end_sequence (void);
-extern double_int rtx_to_double_int (const_rtx);
-extern rtx immed_double_int_const (double_int, enum machine_mode);
-extern rtx immed_double_const (HOST_WIDE_INT, HOST_WIDE_INT,
-			       enum machine_mode);
-
-/* In loop-iv.c  */
-
-extern rtx lowpart_subreg (enum machine_mode, rtx, enum machine_mode);
-
-/* In varasm.c  */
-extern rtx force_const_mem (enum machine_mode, rtx);
-
-/* In varasm.c  */
-
-struct function;
-extern rtx get_pool_constant (rtx);
-extern rtx get_pool_constant_mark (rtx, bool *);
-extern enum machine_mode get_pool_mode (const_rtx);
-extern rtx simplify_subtraction (rtx);
-extern void decide_function_section (tree);
-
-/* In function.c  */
-extern rtx assign_stack_local (enum machine_mode, HOST_WIDE_INT, int);
-#define ASLK_REDUCE_ALIGN 1
-#define ASLK_RECORD_PAD 2
-extern rtx assign_stack_local_1 (enum machine_mode, HOST_WIDE_INT, int, int);
-extern rtx assign_stack_temp (enum machine_mode, HOST_WIDE_INT);
-extern rtx assign_stack_temp_for_type (enum machine_mode, HOST_WIDE_INT, tree);
-extern rtx assign_temp (tree, int, int);
-
-/* In emit-rtl.c */
-extern rtx emit_insn_before (rtx, rtx);
-extern rtx emit_insn_before_noloc (rtx, rtx, basic_block);
-extern rtx emit_insn_before_setloc (rtx, rtx, int);
-extern rtx emit_jump_insn_before (rtx, rtx);
-extern rtx emit_jump_insn_before_noloc (rtx, rtx);
-extern rtx emit_jump_insn_before_setloc (rtx, rtx, int);
-extern rtx emit_call_insn_before (rtx, rtx);
-extern rtx emit_call_insn_before_noloc (rtx, rtx);
-extern rtx emit_call_insn_before_setloc (rtx, rtx, int);
-extern rtx emit_debug_insn_before (rtx, rtx);
-extern rtx emit_debug_insn_before_noloc (rtx, rtx);
-extern rtx emit_debug_insn_before_setloc (rtx, rtx, int);
-extern rtx emit_barrier_before (rtx);
-extern rtx emit_label_before (rtx, rtx);
-extern rtx emit_note_before (enum insn_note, rtx);
-extern rtx emit_insn_after (rtx, rtx);
-extern rtx emit_insn_after_noloc (rtx, rtx, basic_block);
-extern rtx emit_insn_after_setloc (rtx, rtx, int);
-extern rtx emit_jump_insn_after (rtx, rtx);
-extern rtx emit_jump_insn_after_noloc (rtx, rtx);
-extern rtx emit_jump_insn_after_setloc (rtx, rtx, int);
-extern rtx emit_call_insn_after (rtx, rtx);
-extern rtx emit_call_insn_after_noloc (rtx, rtx);
-extern rtx emit_call_insn_after_setloc (rtx, rtx, int);
-extern rtx emit_debug_insn_after (rtx, rtx);
-extern rtx emit_debug_insn_after_noloc (rtx, rtx);
-extern rtx emit_debug_insn_after_setloc (rtx, rtx, int);
-extern rtx emit_barrier_after (rtx);
-extern rtx emit_label_after (rtx, rtx);
-extern rtx emit_note_after (enum insn_note, rtx);
-extern rtx emit_insn (rtx);
-extern rtx emit_debug_insn (rtx);
-extern rtx emit_jump_insn (rtx);
-extern rtx emit_call_insn (rtx);
-extern rtx emit_label (rtx);
-extern rtx emit_jump_table_data (rtx);
-extern rtx emit_barrier (void);
-extern rtx emit_note (enum insn_note);
-extern rtx emit_note_copy (rtx);
-extern rtx gen_clobber (rtx);
-extern rtx emit_clobber (rtx);
-extern rtx gen_use (rtx);
-extern rtx emit_use (rtx);
-extern rtx make_insn_raw (rtx);
-extern void add_function_usage_to (rtx, rtx);
-extern rtx last_call_insn (void);
-extern rtx previous_insn (rtx);
-extern rtx next_insn (rtx);
-extern rtx prev_nonnote_insn (rtx);
-extern rtx prev_nonnote_insn_bb (rtx);
-extern rtx next_nonnote_insn (rtx);
-extern rtx next_nonnote_insn_bb (rtx);
-extern rtx prev_nondebug_insn (rtx);
-extern rtx next_nondebug_insn (rtx);
-extern rtx prev_nonnote_nondebug_insn (rtx);
-extern rtx next_nonnote_nondebug_insn (rtx);
-extern rtx prev_real_insn (rtx);
-extern rtx next_real_insn (rtx);
-extern rtx prev_active_insn (rtx);
-extern rtx next_active_insn (rtx);
-extern int active_insn_p (const_rtx);
-extern rtx next_cc0_user (rtx);
-extern rtx prev_cc0_setter (rtx);
-
-/* In emit-rtl.c  */
-extern int insn_line (const_rtx);
-extern const char * insn_file (const_rtx);
-extern tree insn_scope (const_rtx);
-extern location_t prologue_location, epilogue_location;
-
-/* In jump.c */
-extern enum rtx_code reverse_condition (enum rtx_code);
-extern enum rtx_code reverse_condition_maybe_unordered (enum rtx_code);
-extern enum rtx_code swap_condition (enum rtx_code);
-extern enum rtx_code unsigned_condition (enum rtx_code);
-extern enum rtx_code signed_condition (enum rtx_code);
-extern void mark_jump_label (rtx, rtx, int);
-
-/* In jump.c */
-extern rtx delete_related_insns (rtx);
-
-/* In recog.c  */
-extern rtx *find_constant_term_loc (rtx *);
-
-/* In emit-rtl.c  */
-extern rtx try_split (rtx, rtx, int);
-extern int split_branch_probability;
-
-/* In unknown file  */
-extern rtx split_insns (rtx, rtx);
-
-/* In simplify-rtx.c  */
-extern rtx simplify_const_unary_operation (enum rtx_code, enum machine_mode,
-					   rtx, enum machine_mode);
-extern rtx simplify_unary_operation (enum rtx_code, enum machine_mode, rtx,
-				     enum machine_mode);
-extern rtx simplify_const_binary_operation (enum rtx_code, enum machine_mode,
-					    rtx, rtx);
-extern rtx simplify_binary_operation (enum rtx_code, enum machine_mode, rtx,
-				      rtx);
-extern rtx simplify_ternary_operation (enum rtx_code, enum machine_mode,
-				       enum machine_mode, rtx, rtx, rtx);
-extern rtx simplify_const_relational_operation (enum rtx_code,
-						enum machine_mode, rtx, rtx);
-extern rtx simplify_relational_operation (enum rtx_code, enum machine_mode,
-					  enum machine_mode, rtx, rtx);
-extern rtx simplify_gen_binary (enum rtx_code, enum machine_mode, rtx, rtx);
-extern rtx simplify_gen_unary (enum rtx_code, enum machine_mode, rtx,
-			       enum machine_mode);
-extern rtx simplify_gen_ternary (enum rtx_code, enum machine_mode,
-				 enum machine_mode, rtx, rtx, rtx);
-extern rtx simplify_gen_relational (enum rtx_code, enum machine_mode,
-				    enum machine_mode, rtx, rtx);
-extern rtx simplify_subreg (enum machine_mode, rtx, enum machine_mode,
-			    unsigned int);
-extern rtx simplify_gen_subreg (enum machine_mode, rtx, enum machine_mode,
-				unsigned int);
-extern rtx simplify_replace_fn_rtx (rtx, const_rtx,
-				    rtx (*fn) (rtx, const_rtx, void *), void *);
-extern rtx simplify_replace_rtx (rtx, const_rtx, rtx);
-extern rtx simplify_rtx (const_rtx);
-extern rtx avoid_constant_pool_reference (rtx);
-extern rtx delegitimize_mem_from_attrs (rtx);
-extern bool mode_signbit_p (enum machine_mode, const_rtx);
-extern bool val_signbit_p (enum machine_mode, unsigned HOST_WIDE_INT);
-extern bool val_signbit_known_set_p (enum machine_mode,
-				     unsigned HOST_WIDE_INT);
-extern bool val_signbit_known_clear_p (enum machine_mode,
-				       unsigned HOST_WIDE_INT);
-
-/* In reginfo.c  */
-extern enum machine_mode choose_hard_reg_mode (unsigned int, unsigned int,
-					       bool);
-
-/* In emit-rtl.c  */
-extern rtx set_unique_reg_note (rtx, enum reg_note, rtx);
-extern rtx set_dst_reg_note (rtx, enum reg_note, rtx, rtx);
-extern void set_insn_deleted (rtx);
-
-/* Functions in rtlanal.c */
-
-/* Single set is implemented as macro for performance reasons.  */
-#define single_set(I) (INSN_P (I) \
-		       ? (GET_CODE (PATTERN (I)) == SET \
-			  ? PATTERN (I) : single_set_1 (I)) \
-		       : NULL_RTX)
-#define single_set_1(I) single_set_2 (I, PATTERN (I))
-
-/* Structure used for passing data to REPLACE_LABEL.  */
-struct replace_label_data
-{
-  rtx r1;
-  rtx r2;
-  bool update_label_nuses;
-};
-
-extern enum machine_mode get_address_mode (rtx mem);
-extern int rtx_addr_can_trap_p (const_rtx);
-extern bool nonzero_address_p (const_rtx);
-extern int rtx_unstable_p (const_rtx);
-extern bool rtx_varies_p (const_rtx, bool);
-extern bool rtx_addr_varies_p (const_rtx, bool);
-extern rtx get_call_rtx_from (rtx);
-extern HOST_WIDE_INT get_integer_term (const_rtx);
-extern rtx get_related_value (const_rtx);
-extern bool offset_within_block_p (const_rtx, HOST_WIDE_INT);
-extern void split_const (rtx, rtx *, rtx *);
-extern bool unsigned_reg_p (rtx);
-extern int reg_mentioned_p (const_rtx, const_rtx);
-extern int count_occurrences (const_rtx, const_rtx, int);
-extern int reg_referenced_p (const_rtx, const_rtx);
-extern int reg_used_between_p (const_rtx, const_rtx, const_rtx);
-extern int reg_set_between_p (const_rtx, const_rtx, const_rtx);
-extern int commutative_operand_precedence (rtx);
-extern bool swap_commutative_operands_p (rtx, rtx);
-extern int modified_between_p (const_rtx, const_rtx, const_rtx);
-extern int no_labels_between_p (const_rtx, const_rtx);
-extern int modified_in_p (const_rtx, const_rtx);
-extern int reg_set_p (const_rtx, const_rtx);
-extern rtx single_set_2 (const_rtx, const_rtx);
-extern int multiple_sets (const_rtx);
-extern int set_noop_p (const_rtx);
-extern int noop_move_p (const_rtx);
-extern rtx find_last_value (rtx, rtx *, rtx, int);
-extern int refers_to_regno_p (unsigned int, unsigned int, const_rtx, rtx *);
-extern int reg_overlap_mentioned_p (const_rtx, const_rtx);
-extern const_rtx set_of (const_rtx, const_rtx);
-extern void record_hard_reg_sets (rtx, const_rtx, void *);
-extern void record_hard_reg_uses (rtx *, void *);
-#ifdef HARD_CONST
-extern void find_all_hard_reg_sets (const_rtx, HARD_REG_SET *);
-#endif
-extern void note_stores (const_rtx, void (*) (rtx, const_rtx, void *), void *);
-extern void note_uses (rtx *, void (*) (rtx *, void *), void *);
-extern int dead_or_set_p (const_rtx, const_rtx);
-extern int dead_or_set_regno_p (const_rtx, unsigned int);
-extern rtx find_reg_note (const_rtx, enum reg_note, const_rtx);
-extern rtx find_regno_note (const_rtx, enum reg_note, unsigned int);
-extern rtx find_reg_equal_equiv_note (const_rtx);
-extern rtx find_constant_src (const_rtx);
-extern int find_reg_fusage (const_rtx, enum rtx_code, const_rtx);
-extern int find_regno_fusage (const_rtx, enum rtx_code, unsigned int);
-extern rtx alloc_reg_note (enum reg_note, rtx, rtx);
-extern void add_reg_note (rtx, enum reg_note, rtx);
-extern void add_int_reg_note (rtx, enum reg_note, int);
-extern void add_shallow_copy_of_reg_note (rtx, rtx);
-extern void remove_note (rtx, const_rtx);
-extern void remove_reg_equal_equiv_notes (rtx);
-extern void remove_reg_equal_equiv_notes_for_regno (unsigned int);
-extern int side_effects_p (const_rtx);
-extern int volatile_refs_p (const_rtx);
-extern int volatile_insn_p (const_rtx);
-extern int may_trap_p_1 (const_rtx, unsigned);
-extern int may_trap_p (const_rtx);
-extern int may_trap_or_fault_p (const_rtx);
-extern bool can_throw_internal (const_rtx);
-extern bool can_throw_external (const_rtx);
-extern bool insn_could_throw_p (const_rtx);
-extern bool insn_nothrow_p (const_rtx);
-extern bool can_nonlocal_goto (const_rtx);
-extern void copy_reg_eh_region_note_forward (rtx, rtx, rtx);
-extern void copy_reg_eh_region_note_backward (rtx, rtx, rtx);
-extern int inequality_comparisons_p (const_rtx);
-extern rtx replace_rtx (rtx, rtx, rtx);
-extern int replace_label (rtx *, void *);
-extern int rtx_referenced_p (rtx, rtx);
-extern bool tablejump_p (const_rtx, rtx *, rtx *);
-extern int computed_jump_p (const_rtx);
-
-typedef int (*rtx_function) (rtx *, void *);
-extern int for_each_rtx (rtx *, rtx_function, void *);
-
-/* Callback for for_each_inc_dec, to process the autoinc operation OP
-   within MEM that sets DEST to SRC + SRCOFF, or SRC if SRCOFF is
-   NULL.  The callback is passed the same opaque ARG passed to
-   for_each_inc_dec.  Return zero to continue looking for other
-   autoinc operations, -1 to skip OP's operands, and any other value
-   to interrupt the traversal and return that value to the caller of
-   for_each_inc_dec.  */
-typedef int (*for_each_inc_dec_fn) (rtx mem, rtx op, rtx dest, rtx src,
-				    rtx srcoff, void *arg);
-extern int for_each_inc_dec (rtx *, for_each_inc_dec_fn, void *arg);
-
-typedef int (*rtx_equal_p_callback_function) (const_rtx *, const_rtx *,
-                                              rtx *, rtx *);
-extern int rtx_equal_p_cb (const_rtx, const_rtx,
-                           rtx_equal_p_callback_function);
-
-typedef int (*hash_rtx_callback_function) (const_rtx, enum machine_mode, rtx *,
-                                           enum machine_mode *);
-extern unsigned hash_rtx_cb (const_rtx, enum machine_mode, int *, int *,
-                             bool, hash_rtx_callback_function);
-
-extern rtx regno_use_in (unsigned int, rtx);
-extern int auto_inc_p (const_rtx);
-extern int in_expr_list_p (const_rtx, const_rtx);
-extern void remove_node_from_expr_list (const_rtx, rtx *);
-extern int loc_mentioned_in_p (rtx *, const_rtx);
-extern rtx find_first_parameter_load (rtx, rtx);
-extern bool keep_with_call_p (const_rtx);
-extern bool label_is_jump_target_p (const_rtx, const_rtx);
-extern int insn_rtx_cost (rtx, bool);
-
-/* Given an insn and condition, return a canonical description of
-   the test being made.  */
-extern rtx canonicalize_condition (rtx, rtx, int, rtx *, rtx, int, int);
-
-/* Given a JUMP_INSN, return a canonical description of the test
-   being made.  */
-extern rtx get_condition (rtx, rtx *, int, int);
-
-/* Information about a subreg of a hard register.  */
-struct subreg_info
-{
-  /* Offset of first hard register involved in the subreg.  */
-  int offset;
-  /* Number of hard registers involved in the subreg.  */
-  int nregs;
-  /* Whether this subreg can be represented as a hard reg with the new
-     mode.  */
-  bool representable_p;
-};
-
-extern void subreg_get_info (unsigned int, enum machine_mode,
-			     unsigned int, enum machine_mode,
-			     struct subreg_info *);
-
-/* lists.c */
-
-extern void free_EXPR_LIST_list (rtx *);
-extern void free_INSN_LIST_list (rtx *);
-extern void free_EXPR_LIST_node (rtx);
-extern void free_INSN_LIST_node (rtx);
-extern rtx alloc_INSN_LIST (rtx, rtx);
-extern rtx copy_INSN_LIST (rtx);
-extern rtx concat_INSN_LIST (rtx, rtx);
-extern rtx alloc_EXPR_LIST (int, rtx, rtx);
-extern void remove_free_INSN_LIST_elem (rtx, rtx *);
-extern rtx remove_list_elem (rtx, rtx *);
-extern rtx remove_free_INSN_LIST_node (rtx *);
-extern rtx remove_free_EXPR_LIST_node (rtx *);
-
-
-/* reginfo.c */
-
-/* Resize reg info.  */
-extern bool resize_reg_info (void);
-/* Free up register info memory.  */
-extern void free_reg_info (void);
-extern void init_subregs_of_mode (void);
-extern void finish_subregs_of_mode (void);
-
-/* recog.c */
-extern rtx extract_asm_operands (rtx);
-extern int asm_noperands (const_rtx);
-extern const char *decode_asm_operands (rtx, rtx *, rtx **, const char **,
-					enum machine_mode *, location_t *);
-extern void get_referenced_operands (const char *, bool *, unsigned int);
-
-extern enum reg_class reg_preferred_class (int);
-extern enum reg_class reg_alternate_class (int);
-extern enum reg_class reg_allocno_class (int);
-extern void setup_reg_classes (int, enum reg_class, enum reg_class,
-			       enum reg_class);
-
-extern void split_all_insns (void);
-extern unsigned int split_all_insns_noflow (void);
-
-#define MAX_SAVED_CONST_INT 64
-extern GTY(()) rtx const_int_rtx[MAX_SAVED_CONST_INT * 2 + 1];
-
-#define const0_rtx	(const_int_rtx[MAX_SAVED_CONST_INT])
-#define const1_rtx	(const_int_rtx[MAX_SAVED_CONST_INT+1])
-#define const2_rtx	(const_int_rtx[MAX_SAVED_CONST_INT+2])
-#define constm1_rtx	(const_int_rtx[MAX_SAVED_CONST_INT-1])
-extern GTY(()) rtx const_true_rtx;
-
-extern GTY(()) rtx const_tiny_rtx[4][(int) MAX_MACHINE_MODE];
-
-/* Returns a constant 0 rtx in mode MODE.  Integer modes are treated the
-   same as VOIDmode.  */
-
-#define CONST0_RTX(MODE) (const_tiny_rtx[0][(int) (MODE)])
-
-/* Likewise, for the constants 1 and 2 and -1.  */
-
-#define CONST1_RTX(MODE) (const_tiny_rtx[1][(int) (MODE)])
-#define CONST2_RTX(MODE) (const_tiny_rtx[2][(int) (MODE)])
-#define CONSTM1_RTX(MODE) (const_tiny_rtx[3][(int) (MODE)])
-
-extern GTY(()) rtx pc_rtx;
-extern GTY(()) rtx cc0_rtx;
-extern GTY(()) rtx ret_rtx;
-extern GTY(()) rtx simple_return_rtx;
-
-/* If HARD_FRAME_POINTER_REGNUM is defined, then a special dummy reg
-   is used to represent the frame pointer.  This is because the
-   hard frame pointer and the automatic variables are separated by an amount
-   that cannot be determined until after register allocation.  We can assume
-   that in this case ELIMINABLE_REGS will be defined, one action of which
-   will be to eliminate FRAME_POINTER_REGNUM into HARD_FRAME_POINTER_REGNUM.  */
-#ifndef HARD_FRAME_POINTER_REGNUM
-#define HARD_FRAME_POINTER_REGNUM FRAME_POINTER_REGNUM
-#endif
-
-#ifndef HARD_FRAME_POINTER_IS_FRAME_POINTER
-#define HARD_FRAME_POINTER_IS_FRAME_POINTER \
-  (HARD_FRAME_POINTER_REGNUM == FRAME_POINTER_REGNUM)
-#endif
-
-#ifndef HARD_FRAME_POINTER_IS_ARG_POINTER
-#define HARD_FRAME_POINTER_IS_ARG_POINTER \
-  (HARD_FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM)
-#endif
-
-/* Index labels for global_rtl.  */
-enum global_rtl_index
-{
-  GR_STACK_POINTER,
-  GR_FRAME_POINTER,
-/* For register elimination to work properly these hard_frame_pointer_rtx,
-   frame_pointer_rtx, and arg_pointer_rtx must be the same if they refer to
-   the same register.  */
-#if FRAME_POINTER_REGNUM == ARG_POINTER_REGNUM
-  GR_ARG_POINTER = GR_FRAME_POINTER,
-#endif
-#if HARD_FRAME_POINTER_IS_FRAME_POINTER
-  GR_HARD_FRAME_POINTER = GR_FRAME_POINTER,
-#else
-  GR_HARD_FRAME_POINTER,
-#endif
-#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
-#if HARD_FRAME_POINTER_IS_ARG_POINTER
-  GR_ARG_POINTER = GR_HARD_FRAME_POINTER,
-#else
-  GR_ARG_POINTER,
-#endif
-#endif
-  GR_VIRTUAL_INCOMING_ARGS,
-  GR_VIRTUAL_STACK_ARGS,
-  GR_VIRTUAL_STACK_DYNAMIC,
-  GR_VIRTUAL_OUTGOING_ARGS,
-  GR_VIRTUAL_CFA,
-  GR_VIRTUAL_PREFERRED_STACK_BOUNDARY,
-
-  GR_MAX
-};
-
-/* Target-dependent globals.  */
-struct GTY(()) target_rtl {
-  /* All references to the hard registers in global_rtl_index go through
-     these unique rtl objects.  On machines where the frame-pointer and
-     arg-pointer are the same register, they use the same unique object.
-
-     After register allocation, other rtl objects which used to be pseudo-regs
-     may be clobbered to refer to the frame-pointer register.
-     But references that were originally to the frame-pointer can be
-     distinguished from the others because they contain frame_pointer_rtx.
-
-     When to use frame_pointer_rtx and hard_frame_pointer_rtx is a little
-     tricky: until register elimination has taken place hard_frame_pointer_rtx
-     should be used if it is being set, and frame_pointer_rtx otherwise.  After
-     register elimination hard_frame_pointer_rtx should always be used.
-     On machines where the two registers are same (most) then these are the
-     same.  */
-  rtx x_global_rtl[GR_MAX];
-
-  /* A unique representation of (REG:Pmode PIC_OFFSET_TABLE_REGNUM).  */
-  rtx x_pic_offset_table_rtx;
-
-  /* A unique representation of (REG:Pmode RETURN_ADDRESS_POINTER_REGNUM).
-     This is used to implement __builtin_return_address for some machines;
-     see for instance the MIPS port.  */
-  rtx x_return_address_pointer_rtx;
-
-  /* Commonly used RTL for hard registers.  These objects are not
-     necessarily unique, so we allocate them separately from global_rtl.
-     They are initialized once per compilation unit, then copied into
-     regno_reg_rtx at the beginning of each function.  */
-  rtx x_initial_regno_reg_rtx[FIRST_PSEUDO_REGISTER];
-
-  /* A sample (mem:M stack_pointer_rtx) rtx for each mode M.  */
-  rtx x_top_of_stack[MAX_MACHINE_MODE];
-
-  /* Static hunks of RTL used by the aliasing code; these are treated
-     as persistent to avoid unnecessary RTL allocations.  */
-  rtx x_static_reg_base_value[FIRST_PSEUDO_REGISTER];
-
-  /* The default memory attributes for each mode.  */
-  struct mem_attrs *x_mode_mem_attrs[(int) MAX_MACHINE_MODE];
-};
-
-extern GTY(()) struct target_rtl default_target_rtl;
-#if SWITCHABLE_TARGET
-extern struct target_rtl *this_target_rtl;
-#else
-#define this_target_rtl (&default_target_rtl)
-#endif
-
-#define global_rtl				\
-  (this_target_rtl->x_global_rtl)
-#define pic_offset_table_rtx \
-  (this_target_rtl->x_pic_offset_table_rtx)
-#define return_address_pointer_rtx \
-  (this_target_rtl->x_return_address_pointer_rtx)
-#define top_of_stack \
-  (this_target_rtl->x_top_of_stack)
-#define mode_mem_attrs \
-  (this_target_rtl->x_mode_mem_attrs)
-
-/* All references to certain hard regs, except those created
-   by allocating pseudo regs into them (when that's possible),
-   go through these unique rtx objects.  */
-#define stack_pointer_rtx       (global_rtl[GR_STACK_POINTER])
-#define frame_pointer_rtx       (global_rtl[GR_FRAME_POINTER])
-#define hard_frame_pointer_rtx	(global_rtl[GR_HARD_FRAME_POINTER])
-#define arg_pointer_rtx		(global_rtl[GR_ARG_POINTER])
-
-#ifndef GENERATOR_FILE
-/* Return the attributes of a MEM rtx.  */
-static inline struct mem_attrs *
-get_mem_attrs (const_rtx x)
-{
-  struct mem_attrs *attrs;
-
-  attrs = MEM_ATTRS (x);
-  if (!attrs)
-    attrs = mode_mem_attrs[(int) GET_MODE (x)];
-  return attrs;
-}
-#endif
-
-/* Include the RTL generation functions.  */
-
-#ifndef GENERATOR_FILE
-#include "genrtl.h"
-#undef gen_rtx_ASM_INPUT
-#define gen_rtx_ASM_INPUT(MODE, ARG0)				\
-  gen_rtx_fmt_si (ASM_INPUT, (MODE), (ARG0), 0)
-#define gen_rtx_ASM_INPUT_loc(MODE, ARG0, LOC)			\
-  gen_rtx_fmt_si (ASM_INPUT, (MODE), (ARG0), (LOC))
-#endif
-
-/* There are some RTL codes that require special attention; the
-   generation functions included above do the raw handling.  If you
-   add to this list, modify special_rtx in gengenrtl.c as well.  */
-
-extern rtx gen_rtx_CONST_INT (enum machine_mode, HOST_WIDE_INT);
-extern rtx gen_rtx_CONST_VECTOR (enum machine_mode, rtvec);
-extern rtx gen_raw_REG (enum machine_mode, int);
-extern rtx gen_rtx_REG (enum machine_mode, unsigned);
-extern rtx gen_rtx_SUBREG (enum machine_mode, rtx, int);
-extern rtx gen_rtx_MEM (enum machine_mode, rtx);
-
-#define GEN_INT(N)  gen_rtx_CONST_INT (VOIDmode, (N))
-
-/* Virtual registers are used during RTL generation to refer to locations into
-   the stack frame when the actual location isn't known until RTL generation
-   is complete.  The routine instantiate_virtual_regs replaces these with
-   the proper value, which is normally {frame,arg,stack}_pointer_rtx plus
-   a constant.  */
-
-#define FIRST_VIRTUAL_REGISTER	(FIRST_PSEUDO_REGISTER)
-
-/* This points to the first word of the incoming arguments passed on the stack,
-   either by the caller or by the callee when pretending it was passed by the
-   caller.  */
-
-#define virtual_incoming_args_rtx       (global_rtl[GR_VIRTUAL_INCOMING_ARGS])
-
-#define VIRTUAL_INCOMING_ARGS_REGNUM	(FIRST_VIRTUAL_REGISTER)
-
-/* If FRAME_GROWS_DOWNWARD, this points to immediately above the first
-   variable on the stack.  Otherwise, it points to the first variable on
-   the stack.  */
-
-#define virtual_stack_vars_rtx	        (global_rtl[GR_VIRTUAL_STACK_ARGS])
-
-#define VIRTUAL_STACK_VARS_REGNUM	((FIRST_VIRTUAL_REGISTER) + 1)
-
-/* This points to the location of dynamically-allocated memory on the stack
-   immediately after the stack pointer has been adjusted by the amount
-   desired.  */
-
-#define virtual_stack_dynamic_rtx	(global_rtl[GR_VIRTUAL_STACK_DYNAMIC])
-
-#define VIRTUAL_STACK_DYNAMIC_REGNUM	((FIRST_VIRTUAL_REGISTER) + 2)
-
-/* This points to the location in the stack at which outgoing arguments should
-   be written when the stack is pre-pushed (arguments pushed using push
-   insns always use sp).  */
-
-#define virtual_outgoing_args_rtx	(global_rtl[GR_VIRTUAL_OUTGOING_ARGS])
-
-#define VIRTUAL_OUTGOING_ARGS_REGNUM	((FIRST_VIRTUAL_REGISTER) + 3)
-
-/* This points to the Canonical Frame Address of the function.  This
-   should correspond to the CFA produced by INCOMING_FRAME_SP_OFFSET,
-   but is calculated relative to the arg pointer for simplicity; the
-   frame pointer nor stack pointer are necessarily fixed relative to
-   the CFA until after reload.  */
-
-#define virtual_cfa_rtx			(global_rtl[GR_VIRTUAL_CFA])
-
-#define VIRTUAL_CFA_REGNUM		((FIRST_VIRTUAL_REGISTER) + 4)
-
-#define LAST_VIRTUAL_POINTER_REGISTER	((FIRST_VIRTUAL_REGISTER) + 4)
-
-/* This is replaced by crtl->preferred_stack_boundary / BITS_PER_UNIT
-   when finalized.  */
-
-#define virtual_preferred_stack_boundary_rtx \
-	(global_rtl[GR_VIRTUAL_PREFERRED_STACK_BOUNDARY])
-
-#define VIRTUAL_PREFERRED_STACK_BOUNDARY_REGNUM \
-					((FIRST_VIRTUAL_REGISTER) + 5)
-
-#define LAST_VIRTUAL_REGISTER		((FIRST_VIRTUAL_REGISTER) + 5)
-
-/* Nonzero if REGNUM is a pointer into the stack frame.  */
-#define REGNO_PTR_FRAME_P(REGNUM)		\
-  ((REGNUM) == STACK_POINTER_REGNUM		\
-   || (REGNUM) == FRAME_POINTER_REGNUM		\
-   || (REGNUM) == HARD_FRAME_POINTER_REGNUM	\
-   || (REGNUM) == ARG_POINTER_REGNUM		\
-   || ((REGNUM) >= FIRST_VIRTUAL_REGISTER	\
-       && (REGNUM) <= LAST_VIRTUAL_POINTER_REGISTER))
-
-/* REGNUM never really appearing in the INSN stream.  */
-#define INVALID_REGNUM			(~(unsigned int) 0)
-
-/* REGNUM for which no debug information can be generated.  */
-#define IGNORED_DWARF_REGNUM            (INVALID_REGNUM - 1)
-
-extern rtx output_constant_def (tree, int);
-extern rtx lookup_constant_def (tree);
-
-/* Nonzero after end of reload pass.
-   Set to 1 or 0 by reload1.c.  */
-
-extern int reload_completed;
-
-/* Nonzero after thread_prologue_and_epilogue_insns has run.  */
-extern int epilogue_completed;
-
-/* Set to 1 while reload_as_needed is operating.
-   Required by some machines to handle any generated moves differently.  */
-
-extern int reload_in_progress;
-
-/* Set to 1 while in lra.  */
-extern int lra_in_progress;
-
-/* This macro indicates whether you may create a new
-   pseudo-register.  */
-
-#define can_create_pseudo_p() (!reload_in_progress && !reload_completed)
-
-#ifdef STACK_REGS
-/* Nonzero after end of regstack pass.
-   Set to 1 or 0 by reg-stack.c.  */
-extern int regstack_completed;
-#endif
-
-/* If this is nonzero, we do not bother generating VOLATILE
-   around volatile memory references, and we are willing to
-   output indirect addresses.  If cse is to follow, we reject
-   indirect addresses so a useful potential cse is generated;
-   if it is used only once, instruction combination will produce
-   the same indirect address eventually.  */
-extern int cse_not_expected;
-
-/* Translates rtx code to tree code, for those codes needed by
-   REAL_ARITHMETIC.  The function returns an int because the caller may not
-   know what `enum tree_code' means.  */
-
-extern int rtx_to_tree_code (enum rtx_code);
-
-/* In cse.c */
-extern int delete_trivially_dead_insns (rtx, int);
-extern int exp_equiv_p (const_rtx, const_rtx, int, bool);
-extern unsigned hash_rtx (const_rtx x, enum machine_mode, int *, int *, bool);
-
-/* In dse.c */
-extern bool check_for_inc_dec (rtx insn);
-
-/* In jump.c */
-extern int comparison_dominates_p (enum rtx_code, enum rtx_code);
-extern bool jump_to_label_p (rtx);
-extern int condjump_p (const_rtx);
-extern int any_condjump_p (const_rtx);
-extern int any_uncondjump_p (const_rtx);
-extern rtx pc_set (const_rtx);
-extern rtx condjump_label (const_rtx);
-extern int simplejump_p (const_rtx);
-extern int returnjump_p (rtx);
-extern int eh_returnjump_p (rtx);
-extern int onlyjump_p (const_rtx);
-extern int only_sets_cc0_p (const_rtx);
-extern int sets_cc0_p (const_rtx);
-extern int invert_jump_1 (rtx, rtx);
-extern int invert_jump (rtx, rtx, int);
-extern int rtx_renumbered_equal_p (const_rtx, const_rtx);
-extern int true_regnum (const_rtx);
-extern unsigned int reg_or_subregno (const_rtx);
-extern int redirect_jump_1 (rtx, rtx);
-extern void redirect_jump_2 (rtx, rtx, rtx, int, int);
-extern int redirect_jump (rtx, rtx, int);
-extern void rebuild_jump_labels (rtx);
-extern void rebuild_jump_labels_chain (rtx);
-extern rtx reversed_comparison (const_rtx, enum machine_mode);
-extern enum rtx_code reversed_comparison_code (const_rtx, const_rtx);
-extern enum rtx_code reversed_comparison_code_parts (enum rtx_code, const_rtx,
-						     const_rtx, const_rtx);
-extern void delete_for_peephole (rtx, rtx);
-extern int condjump_in_parallel_p (const_rtx);
-
-/* In emit-rtl.c.  */
-extern int max_reg_num (void);
-extern int max_label_num (void);
-extern int get_first_label_num (void);
-extern void maybe_set_first_label_num (rtx);
-extern void delete_insns_since (rtx);
-extern void mark_reg_pointer (rtx, int);
-extern void mark_user_reg (rtx);
-extern void reset_used_flags (rtx);
-extern void set_used_flags (rtx);
-extern void reorder_insns (rtx, rtx, rtx);
-extern void reorder_insns_nobb (rtx, rtx, rtx);
-extern int get_max_insn_count (void);
-extern int in_sequence_p (void);
-extern void init_emit (void);
-extern void init_emit_regs (void);
-extern void init_emit_once (void);
-extern void push_topmost_sequence (void);
-extern void pop_topmost_sequence (void);
-extern void set_new_first_and_last_insn (rtx, rtx);
-extern unsigned int unshare_all_rtl (void);
-extern void unshare_all_rtl_again (rtx);
-extern void unshare_all_rtl_in_chain (rtx);
-extern void verify_rtl_sharing (void);
-extern void add_insn (rtx);
-extern void add_insn_before (rtx, rtx, basic_block);
-extern void add_insn_after (rtx, rtx, basic_block);
-extern void remove_insn (rtx);
-extern rtx emit (rtx);
-extern void delete_insn (rtx);
-extern rtx entry_of_function (void);
-extern void emit_insn_at_entry (rtx);
-extern void delete_insn_chain (rtx, rtx, bool);
-extern rtx unlink_insn_chain (rtx, rtx);
-extern void delete_insn_and_edges (rtx);
-extern rtx gen_lowpart_SUBREG (enum machine_mode, rtx);
-extern rtx gen_const_mem (enum machine_mode, rtx);
-extern rtx gen_frame_mem (enum machine_mode, rtx);
-extern rtx gen_tmp_stack_mem (enum machine_mode, rtx);
-extern bool validate_subreg (enum machine_mode, enum machine_mode,
-			     const_rtx, unsigned int);
-
-/* In combine.c  */
-extern unsigned int extended_count (const_rtx, enum machine_mode, int);
-extern rtx remove_death (unsigned int, rtx);
-extern void dump_combine_stats (FILE *);
-extern void dump_combine_total_stats (FILE *);
-extern rtx make_compound_operation (rtx, enum rtx_code);
-
-/* In cfgcleanup.c  */
-extern void delete_dead_jumptables (void);
-
-/* In sched-rgn.c.  */
-extern void schedule_insns (void);
-
-/* In sched-ebb.c.  */
-extern void schedule_ebbs (void);
-
-/* In sel-sched-dump.c.  */
-extern void sel_sched_fix_param (const char *param, const char *val);
-
-/* In print-rtl.c */
-extern const char *print_rtx_head;
-extern void debug (const rtx_def &ref);
-extern void debug (const rtx_def *ptr);
-extern void debug_rtx (const_rtx);
-extern void debug_rtx_list (const_rtx, int);
-extern void debug_rtx_range (const_rtx, const_rtx);
-extern const_rtx debug_rtx_find (const_rtx, int);
-extern void print_mem_expr (FILE *, const_tree);
-extern void print_rtl (FILE *, const_rtx);
-extern void print_simple_rtl (FILE *, const_rtx);
-extern int print_rtl_single (FILE *, const_rtx);
-extern int print_rtl_single_with_indent (FILE *, const_rtx, int);
-extern void print_inline_rtx (FILE *, const_rtx, int);
-
-/* Functions in sched-vis.c.  FIXME: Ideally these functions would
-   not be in sched-vis.c but in rtl.c, because they are not only used
-   by the scheduler anymore but for all "slim" RTL dumping.  */
-extern void dump_value_slim (FILE *, const_rtx, int);
-extern void dump_insn_slim (FILE *, const_rtx);
-extern void dump_rtl_slim (FILE *, const_rtx, const_rtx, int, int);
-extern void print_value (pretty_printer *, const_rtx, int);
-extern void print_pattern (pretty_printer *, const_rtx, int);
-extern void print_insn (pretty_printer *, const_rtx, int);
-extern void rtl_dump_bb_for_graph (pretty_printer *, basic_block);
-extern const char *str_pattern_slim (const_rtx);
-
-/* In function.c */
-extern void reposition_prologue_and_epilogue_notes (void);
-extern int prologue_epilogue_contains (const_rtx);
-extern int sibcall_epilogue_contains (const_rtx);
-extern void update_temp_slot_address (rtx, rtx);
-extern void maybe_copy_prologue_epilogue_insn (rtx, rtx);
-extern void set_return_jump_label (rtx);
-
-/* In stmt.c */
-extern void expand_null_return (void);
-extern void expand_naked_return (void);
-extern void emit_jump (rtx);
-
-/* In expr.c */
-extern rtx move_by_pieces (rtx, rtx, unsigned HOST_WIDE_INT,
-			   unsigned int, int);
-extern HOST_WIDE_INT find_args_size_adjust (rtx);
-extern int fixup_args_size_notes (rtx, rtx, int);
-
-/* In cfgrtl.c */
-extern void print_rtl_with_bb (FILE *, const_rtx, int);
-extern rtx duplicate_insn_chain (rtx, rtx);
-
-/* In expmed.c */
-extern void init_expmed (void);
-extern void expand_inc (rtx, rtx);
-extern void expand_dec (rtx, rtx);
-
-/* In lower-subreg.c */
-extern void init_lower_subreg (void);
-
-/* In gcse.c */
-extern bool can_copy_p (enum machine_mode);
-extern bool can_assign_to_reg_without_clobbers_p (rtx);
-extern rtx fis_get_condition (rtx);
-
-/* In ira.c */
-#ifdef HARD_CONST
-extern HARD_REG_SET eliminable_regset;
-#endif
-extern void mark_elimination (int, int);
-
-/* In reginfo.c */
-extern int reg_classes_intersect_p (reg_class_t, reg_class_t);
-extern int reg_class_subset_p (reg_class_t, reg_class_t);
-extern void globalize_reg (tree, int);
-extern void init_reg_modes_target (void);
-extern void init_regs (void);
-extern void reinit_regs (void);
-extern void init_fake_stack_mems (void);
-extern void save_register_info (void);
-extern void init_reg_sets (void);
-extern void regclass (rtx, int);
-extern void reg_scan (rtx, unsigned int);
-extern void fix_register (const char *, int, int);
-extern bool invalid_mode_change_p (unsigned int, enum reg_class);
-
-/* In reload1.c */
-extern int function_invariant_p (const_rtx);
-
-/* In calls.c */
-enum libcall_type
-{
-  LCT_NORMAL = 0,
-  LCT_CONST = 1,
-  LCT_PURE = 2,
-  LCT_NORETURN = 3,
-  LCT_THROW = 4,
-  LCT_RETURNS_TWICE = 5
-};
-
-extern void emit_library_call (rtx, enum libcall_type, enum machine_mode, int,
-			       ...);
-extern rtx emit_library_call_value (rtx, rtx, enum libcall_type,
-				    enum machine_mode, int, ...);
-
-/* In varasm.c */
-extern void init_varasm_once (void);
-
-extern rtx make_debug_expr_from_rtl (const_rtx);
-
-/* In read-rtl.c */
-extern bool read_rtx (const char *, rtx *);
-
-/* In alias.c */
-extern rtx canon_rtx (rtx);
-extern int true_dependence (const_rtx, enum machine_mode, const_rtx);
-extern rtx get_addr (rtx);
-extern int canon_true_dependence (const_rtx, enum machine_mode, rtx,
-				  const_rtx, rtx);
-extern int read_dependence (const_rtx, const_rtx);
-extern int anti_dependence (const_rtx, const_rtx);
-extern int canon_anti_dependence (const_rtx, bool,
-				  const_rtx, enum machine_mode, rtx);
-extern int output_dependence (const_rtx, const_rtx);
-extern int may_alias_p (const_rtx, const_rtx);
-extern void init_alias_target (void);
-extern void init_alias_analysis (void);
-extern void end_alias_analysis (void);
-extern void vt_equate_reg_base_value (const_rtx, const_rtx);
-extern bool memory_modified_in_insn_p (const_rtx, const_rtx);
-extern bool memory_must_be_modified_in_insn_p (const_rtx, const_rtx);
-extern bool may_be_sp_based_p (rtx);
-extern rtx gen_hard_reg_clobber (enum machine_mode, unsigned int);
-extern rtx get_reg_known_value (unsigned int);
-extern bool get_reg_known_equiv_p (unsigned int);
-extern rtx get_reg_base_value (unsigned int);
-
-#ifdef STACK_REGS
-extern int stack_regs_mentioned (const_rtx insn);
-#endif
-
-/* In toplev.c */
-extern GTY(()) rtx stack_limit_rtx;
-
-/* In predict.c */
-extern void invert_br_probabilities (rtx);
-extern bool expensive_function_p (int);
-
-/* In var-tracking.c */
-extern unsigned int variable_tracking_main (void);
-
-/* In stor-layout.c.  */
-extern void get_mode_bounds (enum machine_mode, int, enum machine_mode,
-			     rtx *, rtx *);
-
-/* In loop-unswitch.c  */
-extern rtx reversed_condition (rtx);
-extern rtx compare_and_jump_seq (rtx, rtx, enum rtx_code, rtx, int, rtx);
-
-/* In loop-iv.c  */
-extern rtx canon_condition (rtx);
-extern void simplify_using_condition (rtx, rtx *, bitmap);
-
-/* In final.c  */
-extern unsigned int compute_alignments (void);
-extern void update_alignments (vec<rtx> &);
-extern int asm_str_count (const char *templ);
-
-struct rtl_hooks
-{
-  rtx (*gen_lowpart) (enum machine_mode, rtx);
-  rtx (*gen_lowpart_no_emit) (enum machine_mode, rtx);
-  rtx (*reg_nonzero_bits) (const_rtx, enum machine_mode, const_rtx, enum machine_mode,
-			   unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT *);
-  rtx (*reg_num_sign_bit_copies) (const_rtx, enum machine_mode, const_rtx, enum machine_mode,
-				  unsigned int, unsigned int *);
-  bool (*reg_truncated_to_mode) (enum machine_mode, const_rtx);
-
-  /* Whenever you add entries here, make sure you adjust rtlhooks-def.h.  */
-};
-
-/* Each pass can provide its own.  */
-extern struct rtl_hooks rtl_hooks;
-
-/* ... but then it has to restore these.  */
-extern const struct rtl_hooks general_rtl_hooks;
-
-/* Keep this for the nonce.  */
-#define gen_lowpart rtl_hooks.gen_lowpart
-
-extern void insn_locations_init (void);
-extern void insn_locations_finalize (void);
-extern void set_curr_insn_location (location_t);
-extern location_t curr_insn_location (void);
-extern bool optimize_insn_for_size_p (void);
-extern bool optimize_insn_for_speed_p (void);
-
-/* rtl-error.c */
-extern void _fatal_insn_not_found (const_rtx, const char *, int, const char *)
-     ATTRIBUTE_NORETURN;
-extern void _fatal_insn (const char *, const_rtx, const char *, int, const char *)
-     ATTRIBUTE_NORETURN;
-
-#define fatal_insn(msgid, insn) \
-	_fatal_insn (msgid, insn, __FILE__, __LINE__, __FUNCTION__)
-#define fatal_insn_not_found(insn) \
-	_fatal_insn_not_found (insn, __FILE__, __LINE__, __FUNCTION__)
-
-/* reginfo.c */
-extern tree GTY(()) global_regs_decl[FIRST_PSEUDO_REGISTER];
-
-
-#endif /* ! GCC_RTL_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/safe-ctype.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/safe-ctype.h
deleted file mode 100644
index 0266bf1..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/safe-ctype.h
+++ /dev/null
@@ -1,150 +0,0 @@
-/* <ctype.h> replacement macros.
-
-   Copyright (C) 2000, 2001 Free Software Foundation, Inc.
-   Contributed by Zack Weinberg <zackw@stanford.edu>.
-
-This file is part of the libiberty library.
-Libiberty is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public
-License as published by the Free Software Foundation; either
-version 2 of the License, or (at your option) any later version.
-
-Libiberty 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with libiberty; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
-Boston, MA 02110-1301, USA.  */
-
-/* This is a compatible replacement of the standard C library's <ctype.h>
-   with the following properties:
-
-   - Implements all isxxx() macros required by C99.
-   - Also implements some character classes useful when
-     parsing C-like languages.
-   - Does not change behavior depending on the current locale.
-   - Behaves properly for all values in the range of a signed or
-     unsigned char.
-
-   To avoid conflicts, this header defines the isxxx functions in upper
-   case, e.g. ISALPHA not isalpha.  */
-
-#ifndef SAFE_CTYPE_H
-#define SAFE_CTYPE_H
-
-/* Determine host character set.  */
-#define HOST_CHARSET_UNKNOWN 0
-#define HOST_CHARSET_ASCII   1
-#define HOST_CHARSET_EBCDIC  2
-
-#if  '\n' == 0x0A && ' ' == 0x20 && '0' == 0x30 \
-   && 'A' == 0x41 && 'a' == 0x61 && '!' == 0x21
-#  define HOST_CHARSET HOST_CHARSET_ASCII
-#else
-# if '\n' == 0x15 && ' ' == 0x40 && '0' == 0xF0 \
-   && 'A' == 0xC1 && 'a' == 0x81 && '!' == 0x5A
-#  define HOST_CHARSET HOST_CHARSET_EBCDIC
-# else
-#  define HOST_CHARSET HOST_CHARSET_UNKNOWN
-# endif
-#endif
-
-/* Categories.  */
-
-enum {
-  /* In C99 */
-  _sch_isblank  = 0x0001,	/* space \t */
-  _sch_iscntrl  = 0x0002,	/* nonprinting characters */
-  _sch_isdigit  = 0x0004,	/* 0-9 */
-  _sch_islower  = 0x0008,	/* a-z */
-  _sch_isprint  = 0x0010,	/* any printing character including ' ' */
-  _sch_ispunct  = 0x0020,	/* all punctuation */
-  _sch_isspace  = 0x0040,	/* space \t \n \r \f \v */
-  _sch_isupper  = 0x0080,	/* A-Z */
-  _sch_isxdigit = 0x0100,	/* 0-9A-Fa-f */
-
-  /* Extra categories useful to cpplib.  */
-  _sch_isidst	= 0x0200,	/* A-Za-z_ */
-  _sch_isvsp    = 0x0400,	/* \n \r */
-  _sch_isnvsp   = 0x0800,	/* space \t \f \v \0 */
-
-  /* Combinations of the above.  */
-  _sch_isalpha  = _sch_isupper|_sch_islower,	/* A-Za-z */
-  _sch_isalnum  = _sch_isalpha|_sch_isdigit,	/* A-Za-z0-9 */
-  _sch_isidnum  = _sch_isidst|_sch_isdigit,	/* A-Za-z0-9_ */
-  _sch_isgraph  = _sch_isalnum|_sch_ispunct,	/* isprint and not space */
-  _sch_iscppsp  = _sch_isvsp|_sch_isnvsp,	/* isspace + \0 */
-  _sch_isbasic  = _sch_isprint|_sch_iscppsp     /* basic charset of ISO C
-						   (plus ` and @)  */
-};
-
-/* Character classification.  */
-extern const unsigned short _sch_istable[256];
-
-#define _sch_test(c, bit) (_sch_istable[(c) & 0xff] & (unsigned short)(bit))
-
-#define ISALPHA(c)  _sch_test(c, _sch_isalpha)
-#define ISALNUM(c)  _sch_test(c, _sch_isalnum)
-#define ISBLANK(c)  _sch_test(c, _sch_isblank)
-#define ISCNTRL(c)  _sch_test(c, _sch_iscntrl)
-#define ISDIGIT(c)  _sch_test(c, _sch_isdigit)
-#define ISGRAPH(c)  _sch_test(c, _sch_isgraph)
-#define ISLOWER(c)  _sch_test(c, _sch_islower)
-#define ISPRINT(c)  _sch_test(c, _sch_isprint)
-#define ISPUNCT(c)  _sch_test(c, _sch_ispunct)
-#define ISSPACE(c)  _sch_test(c, _sch_isspace)
-#define ISUPPER(c)  _sch_test(c, _sch_isupper)
-#define ISXDIGIT(c) _sch_test(c, _sch_isxdigit)
-
-#define ISIDNUM(c)	_sch_test(c, _sch_isidnum)
-#define ISIDST(c)	_sch_test(c, _sch_isidst)
-#define IS_ISOBASIC(c)	_sch_test(c, _sch_isbasic)
-#define IS_VSPACE(c)	_sch_test(c, _sch_isvsp)
-#define IS_NVSPACE(c)	_sch_test(c, _sch_isnvsp)
-#define IS_SPACE_OR_NUL(c)	_sch_test(c, _sch_iscppsp)
-
-/* Character transformation.  */
-extern const unsigned char  _sch_toupper[256];
-extern const unsigned char  _sch_tolower[256];
-#define TOUPPER(c) _sch_toupper[(c) & 0xff]
-#define TOLOWER(c) _sch_tolower[(c) & 0xff]
-
-/* Prevent the users of safe-ctype.h from accidently using the routines
-   from ctype.h.  Initially, the approach was to produce an error when
-   detecting that ctype.h has been included.  But this was causing
-   trouble as ctype.h might get indirectly included as a result of
-   including another system header (for instance gnulib's stdint.h).
-   So we include ctype.h here and then immediately redefine its macros.  */
-
-#include <ctype.h>
-#undef isalpha
-#define isalpha(c) do_not_use_isalpha_with_safe_ctype
-#undef isalnum
-#define isalnum(c) do_not_use_isalnum_with_safe_ctype
-#undef iscntrl
-#define iscntrl(c) do_not_use_iscntrl_with_safe_ctype
-#undef isdigit
-#define isdigit(c) do_not_use_isdigit_with_safe_ctype
-#undef isgraph
-#define isgraph(c) do_not_use_isgraph_with_safe_ctype
-#undef islower
-#define islower(c) do_not_use_islower_with_safe_ctype
-#undef isprint
-#define isprint(c) do_not_use_isprint_with_safe_ctype
-#undef ispunct
-#define ispunct(c) do_not_use_ispunct_with_safe_ctype
-#undef isspace
-#define isspace(c) do_not_use_isspace_with_safe_ctype
-#undef isupper
-#define isupper(c) do_not_use_isupper_with_safe_ctype
-#undef isxdigit
-#define isxdigit(c) do_not_use_isxdigit_with_safe_ctype
-#undef toupper
-#define toupper(c) do_not_use_toupper_with_safe_ctype
-#undef tolower
-#define tolower(c) do_not_use_tolower_with_safe_ctype
-
-#endif /* SAFE_CTYPE_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/sanitizer.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/sanitizer.def
deleted file mode 100644
index 015b1d8..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/sanitizer.def
+++ /dev/null
@@ -1,337 +0,0 @@
-/* This file contains the definitions and documentation for the
-   Address Sanitizer and Thread Sanitizer builtins used in the GNU compiler.
-   Copyright (C) 2012-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* Before including this file, you should define a macro:
-
-     DEF_SANITIZER_BUILTIN (ENUM, NAME, TYPE, ATTRS)
-
-   See builtins.def for details.
-   The builtins are created by the C-family of FEs in c-family/c-common.c,
-   for other FEs by asan.c.  */
-
-/* Address Sanitizer */
-DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_INIT, "__asan_init_v3",
-		      BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
-/* Do not reorder the BUILT_IN_ASAN_REPORT* builtins, e.g. cfgcleanup.c
-   relies on this order.  */
-DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_REPORT_LOAD1, "__asan_report_load1",
-		      BT_FN_VOID_PTR, ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_REPORT_LOAD2, "__asan_report_load2",
-		      BT_FN_VOID_PTR, ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_REPORT_LOAD4, "__asan_report_load4",
-		      BT_FN_VOID_PTR, ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_REPORT_LOAD8, "__asan_report_load8",
-		      BT_FN_VOID_PTR, ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_REPORT_LOAD16, "__asan_report_load16",
-		      BT_FN_VOID_PTR, ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_REPORT_STORE1, "__asan_report_store1",
-		      BT_FN_VOID_PTR, ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_REPORT_STORE2, "__asan_report_store2",
-		      BT_FN_VOID_PTR, ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_REPORT_STORE4, "__asan_report_store4",
-		      BT_FN_VOID_PTR, ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_REPORT_STORE8, "__asan_report_store8",
-		      BT_FN_VOID_PTR, ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_REPORT_STORE16, "__asan_report_store16",
-		      BT_FN_VOID_PTR, ATTR_TMPURE_NORETURN_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_REGISTER_GLOBALS,
-		      "__asan_register_globals",
-		      BT_FN_VOID_PTR_PTRMODE, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_UNREGISTER_GLOBALS,
-		      "__asan_unregister_globals",
-		      BT_FN_VOID_PTR_PTRMODE, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_HANDLE_NO_RETURN,
-		      "__asan_handle_no_return",
-		      BT_FN_VOID, ATTR_TMPURE_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT,
-		      "__asan_before_dynamic_init",
-		      BT_FN_VOID_CONST_PTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_AFTER_DYNAMIC_INIT,
-		      "__asan_after_dynamic_init",
-		      BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
-
-/* Thread Sanitizer */
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_INIT, "__tsan_init", 
-		      BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_FUNC_ENTRY, "__tsan_func_entry",
-		      BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_FUNC_EXIT, "__tsan_func_exit",
-		      BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_VPTR_UPDATE, "__tsan_vptr_update",
-		      BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_READ1, "__tsan_read1",
-		      BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_READ2, "__tsan_read2",
-		      BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_READ4, "__tsan_read4",
-		      BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_READ8, "__tsan_read8",
-		      BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_READ16, "__tsan_read16",
-		      BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_WRITE1, "__tsan_write1",
-		      BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_WRITE2, "__tsan_write2",
-		      BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_WRITE4, "__tsan_write4",
-		      BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_WRITE8, "__tsan_write8",
-		      BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_WRITE16, "__tsan_write16",
-		      BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
-
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC8_LOAD,
-		      "__tsan_atomic8_load",
-		      BT_FN_I1_CONST_VPTR_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC16_LOAD,
-		      "__tsan_atomic16_load",
-		      BT_FN_I2_CONST_VPTR_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC32_LOAD,
-		      "__tsan_atomic32_load",
-		      BT_FN_I4_CONST_VPTR_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC64_LOAD,
-		      "__tsan_atomic64_load",
-		      BT_FN_I8_CONST_VPTR_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC128_LOAD,
-		      "__tsan_atomic128_load",
-		      BT_FN_I16_CONST_VPTR_INT, ATTR_NOTHROW_LEAF_LIST)
-
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC8_STORE,
-		      "__tsan_atomic8_store",
-		      BT_FN_VOID_VPTR_I1_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC16_STORE,
-		      "__tsan_atomic16_store",
-		      BT_FN_VOID_VPTR_I2_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC32_STORE,
-		      "__tsan_atomic32_store",
-		      BT_FN_VOID_VPTR_I4_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC64_STORE,
-		      "__tsan_atomic64_store",
-		      BT_FN_VOID_VPTR_I8_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC128_STORE,
-		      "__tsan_atomic128_store",
-		      BT_FN_VOID_VPTR_I16_INT, ATTR_NOTHROW_LEAF_LIST)
-
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC8_EXCHANGE,
-		      "__tsan_atomic8_exchange",
-		      BT_FN_I1_VPTR_I1_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC16_EXCHANGE,
-		      "__tsan_atomic16_exchange",
-		      BT_FN_I2_VPTR_I2_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC32_EXCHANGE,
-		      "__tsan_atomic32_exchange",
-		      BT_FN_I4_VPTR_I4_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC64_EXCHANGE,
-		      "__tsan_atomic64_exchange",
-		      BT_FN_I8_VPTR_I8_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC128_EXCHANGE,
-		      "__tsan_atomic128_exchange",
-		      BT_FN_I16_VPTR_I16_INT, ATTR_NOTHROW_LEAF_LIST)
-
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC8_FETCH_ADD,
-		      "__tsan_atomic8_fetch_add",
-		      BT_FN_I1_VPTR_I1_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC16_FETCH_ADD,
-		      "__tsan_atomic16_fetch_add",
-		      BT_FN_I2_VPTR_I2_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC32_FETCH_ADD,
-		      "__tsan_atomic32_fetch_add",
-		      BT_FN_I4_VPTR_I4_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC64_FETCH_ADD,
-		      "__tsan_atomic64_fetch_add",
-		      BT_FN_I8_VPTR_I8_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC128_FETCH_ADD,
-		      "__tsan_atomic128_fetch_add",
-		      BT_FN_I16_VPTR_I16_INT, ATTR_NOTHROW_LEAF_LIST)
-
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC8_FETCH_SUB,
-		      "__tsan_atomic8_fetch_sub",
-		      BT_FN_I1_VPTR_I1_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC16_FETCH_SUB,
-		      "__tsan_atomic16_fetch_sub",
-		      BT_FN_I2_VPTR_I2_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC32_FETCH_SUB,
-		      "__tsan_atomic32_fetch_sub",
-		      BT_FN_I4_VPTR_I4_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC64_FETCH_SUB,
-		      "__tsan_atomic64_fetch_sub",
-		      BT_FN_I8_VPTR_I8_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC128_FETCH_SUB,
-		      "__tsan_atomic128_fetch_sub",
-		      BT_FN_I16_VPTR_I16_INT, ATTR_NOTHROW_LEAF_LIST)
-
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC8_FETCH_AND,
-		      "__tsan_atomic8_fetch_and",
-		      BT_FN_I1_VPTR_I1_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC16_FETCH_AND,
-		      "__tsan_atomic16_fetch_and",
-		      BT_FN_I2_VPTR_I2_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC32_FETCH_AND,
-		      "__tsan_atomic32_fetch_and",
-		      BT_FN_I4_VPTR_I4_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC64_FETCH_AND,
-		      "__tsan_atomic64_fetch_and",
-		      BT_FN_I8_VPTR_I8_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC128_FETCH_AND,
-		      "__tsan_atomic128_fetch_and",
-		      BT_FN_I16_VPTR_I16_INT, ATTR_NOTHROW_LEAF_LIST)
-
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC8_FETCH_OR,
-		      "__tsan_atomic8_fetch_or",
-		      BT_FN_I1_VPTR_I1_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC16_FETCH_OR,
-		      "__tsan_atomic16_fetch_or",
-		      BT_FN_I2_VPTR_I2_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC32_FETCH_OR,
-		      "__tsan_atomic32_fetch_or",
-		      BT_FN_I4_VPTR_I4_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC64_FETCH_OR,
-		      "__tsan_atomic64_fetch_or",
-		      BT_FN_I8_VPTR_I8_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC128_FETCH_OR,
-		      "__tsan_atomic128_fetch_or",
-		      BT_FN_I16_VPTR_I16_INT, ATTR_NOTHROW_LEAF_LIST)
-
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC8_FETCH_XOR,
-		      "__tsan_atomic8_fetch_xor",
-		      BT_FN_I1_VPTR_I1_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC16_FETCH_XOR,
-		      "__tsan_atomic16_fetch_xor",
-		      BT_FN_I2_VPTR_I2_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC32_FETCH_XOR,
-		      "__tsan_atomic32_fetch_xor",
-		      BT_FN_I4_VPTR_I4_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC64_FETCH_XOR,
-		      "__tsan_atomic64_fetch_xor",
-		      BT_FN_I8_VPTR_I8_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC128_FETCH_XOR,
-		      "__tsan_atomic128_fetch_xor",
-		      BT_FN_I16_VPTR_I16_INT, ATTR_NOTHROW_LEAF_LIST)
-
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC8_FETCH_NAND,
-		      "__tsan_atomic8_fetch_nand",
-		      BT_FN_I1_VPTR_I1_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC16_FETCH_NAND,
-		      "__tsan_atomic16_fetch_nand",
-		      BT_FN_I2_VPTR_I2_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC32_FETCH_NAND,
-		      "__tsan_atomic32_fetch_nand",
-		      BT_FN_I4_VPTR_I4_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC64_FETCH_NAND,
-		      "__tsan_atomic64_fetch_nand",
-		      BT_FN_I8_VPTR_I8_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC128_FETCH_NAND,
-		      "__tsan_atomic128_fetch_nand",
-		      BT_FN_I16_VPTR_I16_INT, ATTR_NOTHROW_LEAF_LIST)
-
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC8_COMPARE_EXCHANGE_STRONG,
-		      "__tsan_atomic8_compare_exchange_strong",
-		      BT_FN_BOOL_VPTR_PTR_I1_INT_INT,
-		      ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC16_COMPARE_EXCHANGE_STRONG,
-		      "__tsan_atomic16_compare_exchange_strong",
-		      BT_FN_BOOL_VPTR_PTR_I2_INT_INT,
-		      ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC32_COMPARE_EXCHANGE_STRONG,
-		      "__tsan_atomic32_compare_exchange_strong",
-		      BT_FN_BOOL_VPTR_PTR_I4_INT_INT,
-		      ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC64_COMPARE_EXCHANGE_STRONG,
-		      "__tsan_atomic64_compare_exchange_strong",
-		      BT_FN_BOOL_VPTR_PTR_I8_INT_INT,
-		      ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC128_COMPARE_EXCHANGE_STRONG,
-		      "__tsan_atomic128_compare_exchange_strong",
-		      BT_FN_BOOL_VPTR_PTR_I16_INT_INT,
-		      ATTR_NOTHROW_LEAF_LIST)
-
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC8_COMPARE_EXCHANGE_WEAK,
-		      "__tsan_atomic8_compare_exchange_weak",
-		      BT_FN_BOOL_VPTR_PTR_I1_INT_INT,
-		      ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC16_COMPARE_EXCHANGE_WEAK,
-		      "__tsan_atomic16_compare_exchange_weak",
-		      BT_FN_BOOL_VPTR_PTR_I2_INT_INT,
-		      ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC32_COMPARE_EXCHANGE_WEAK,
-		      "__tsan_atomic32_compare_exchange_weak",
-		      BT_FN_BOOL_VPTR_PTR_I4_INT_INT,
-		      ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC64_COMPARE_EXCHANGE_WEAK,
-		      "__tsan_atomic64_compare_exchange_weak",
-		      BT_FN_BOOL_VPTR_PTR_I8_INT_INT,
-		      ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC128_COMPARE_EXCHANGE_WEAK,
-		      "__tsan_atomic128_compare_exchange_weak",
-		      BT_FN_BOOL_VPTR_PTR_I16_INT_INT,
-		      ATTR_NOTHROW_LEAF_LIST)
-
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC_THREAD_FENCE,
-		      "__tsan_atomic_thread_fence",
-		      BT_FN_VOID_INT, ATTR_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_ATOMIC_SIGNAL_FENCE,
-		      "__tsan_atomic_signal_fence",
-		      BT_FN_VOID_INT, ATTR_NOTHROW_LEAF_LIST)
-
-/* Undefined Behavior Sanitizer */
-DEF_SANITIZER_BUILTIN(BUILT_IN_UBSAN_HANDLE_DIVREM_OVERFLOW,
-		      "__ubsan_handle_divrem_overflow",
-		      BT_FN_VOID_PTR_PTR_PTR,
-		      ATTR_COLD_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_UBSAN_HANDLE_SHIFT_OUT_OF_BOUNDS,
-		      "__ubsan_handle_shift_out_of_bounds",
-		      BT_FN_VOID_PTR_PTR_PTR,
-		      ATTR_COLD_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_UBSAN_HANDLE_BUILTIN_UNREACHABLE,
-		      "__ubsan_handle_builtin_unreachable",
-		      BT_FN_VOID_PTR,
-		      ATTR_COLD_NORETURN_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_UBSAN_HANDLE_MISSING_RETURN,
-		      "__ubsan_handle_missing_return",
-		      BT_FN_VOID_PTR,
-		      ATTR_NORETURN_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_UBSAN_HANDLE_VLA_BOUND_NOT_POSITIVE,
-		      "__ubsan_handle_vla_bound_not_positive",
-		      BT_FN_VOID_PTR_PTR,
-		      ATTR_COLD_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_UBSAN_HANDLE_TYPE_MISMATCH,
-		      "__ubsan_handle_type_mismatch",
-		      BT_FN_VOID_PTR_PTR,
-		      ATTR_COLD_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_UBSAN_HANDLE_ADD_OVERFLOW,
-		      "__ubsan_handle_add_overflow",
-		      BT_FN_VOID_PTR_PTR_PTR,
-		      ATTR_COLD_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_UBSAN_HANDLE_SUB_OVERFLOW,
-		      "__ubsan_handle_sub_overflow",
-		      BT_FN_VOID_PTR_PTR_PTR,
-		      ATTR_COLD_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_UBSAN_HANDLE_MUL_OVERFLOW,
-		      "__ubsan_handle_mul_overflow",
-		      BT_FN_VOID_PTR_PTR_PTR,
-		      ATTR_COLD_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_UBSAN_HANDLE_NEGATE_OVERFLOW,
-		      "__ubsan_handle_negate_overflow",
-		      BT_FN_VOID_PTR_PTR,
-		      ATTR_COLD_NOTHROW_LEAF_LIST)
-DEF_SANITIZER_BUILTIN(BUILT_IN_UBSAN_HANDLE_LOAD_INVALID_VALUE,
-		      "__ubsan_handle_load_invalid_value",
-		      BT_FN_VOID_PTR_PTR,
-		      ATTR_COLD_NOTHROW_LEAF_LIST)
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/sbitmap.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/sbitmap.h
deleted file mode 100644
index 487e392..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/sbitmap.h
+++ /dev/null
@@ -1,265 +0,0 @@
-/* Simple bitmaps.
-   Copyright (C) 1999-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_SBITMAP_H
-#define GCC_SBITMAP_H
-
-/* Implementation of sets using simple bitmap vectors.
-
-   This set representation is suitable for non-sparse sets with a known
-   (a priori) universe.  The set is represented as a simple array of the
-   host's fastest unsigned integer.  For a given member I in the set:
-     - the element for I will be at sbitmap[I / (bits per element)]
-     - the position for I within element is I % (bits per element)
-
-   This representation is very space-efficient for large non-sparse sets
-   with random access patterns.
-
-   The following operations can be performed in O(1) time:
-
-     * set_size			: SBITMAP_SIZE
-     * member_p			: bitmap_bit_p
-     * add_member		: bitmap_set_bit
-     * remove_member		: bitmap_clear_bit
-
-   Most other operations on this set representation are O(U) where U is
-   the size of the set universe:
-
-     * clear			: bitmap_clear
-     * choose_one		: bitmap_first_set_bit /
-				  bitmap_last_set_bit
-     * forall			: EXECUTE_IF_SET_IN_BITMAP
-     * set_copy			: bitmap_copy
-     * set_intersection		: bitmap_and
-     * set_union		: bitmap_ior
-     * set_difference		: bitmap_and_compl
-     * set_disjuction		: (not implemented)
-     * set_compare		: bitmap_equal_p
-
-   Some operations on 3 sets that occur frequently in in data flow problems
-   are also implemented:
-
-      * A | (B & C)		: bitmap_or_and
-      * A | (B & ~C)		: bitmap_ior_and_compl
-      * A & (B | C)		: bitmap_and_or
-
-   Most of the set functions have two variants: One that returns non-zero
-   if members were added or removed from the target set, and one that just
-   performs the operation without feedback.  The former operations are a
-   bit more expensive but the result can often be used to avoid iterations
-   on other sets.
-
-   Allocating a bitmap is done with sbitmap_alloc, and resizing is
-   performed with sbitmap_resize.
-
-   The storage requirements for simple bitmap sets is O(U) where U is the
-   size of the set universe (colloquially the number of bits in the bitmap).
-
-   This set representation works well for relatively small data flow problems
-   (there are special routines for that, see sbitmap_vector_*).  The set
-   operations can be vectorized and there is almost no computating overhead,
-   so that even sparse simple bitmap sets outperform dedicated sparse set
-   representations like linked-list bitmaps.  For larger problems, the size
-   overhead of simple bitmap sets gets too high and other set representations
-   have to be used.  */
-
-#define SBITMAP_ELT_BITS (HOST_BITS_PER_WIDEST_FAST_INT * 1u)
-#define SBITMAP_ELT_TYPE unsigned HOST_WIDEST_FAST_INT
-
-struct simple_bitmap_def
-{
-  unsigned char *popcount;      /* Population count.  */
-  unsigned int n_bits;		/* Number of bits.  */
-  unsigned int size;		/* Size in elements.  */
-  SBITMAP_ELT_TYPE elms[1];	/* The elements.  */
-};
-
-/* Return the set size needed for N elements.  */
-#define SBITMAP_SET_SIZE(N) (((N) + SBITMAP_ELT_BITS - 1) / SBITMAP_ELT_BITS)
-
-/* Return the number of bits in BITMAP.  */
-#define SBITMAP_SIZE(BITMAP) ((BITMAP)->n_bits)
-
-/* Test if bit number bitno in the bitmap is set.  */
-static inline SBITMAP_ELT_TYPE
-bitmap_bit_p (const_sbitmap map, int bitno)
-{
-  size_t i = bitno / SBITMAP_ELT_BITS;
-  unsigned int s = bitno % SBITMAP_ELT_BITS;
-  return (map->elms[i] >> s) & (SBITMAP_ELT_TYPE) 1;
-}
-
-/* Set bit number BITNO in the sbitmap MAP.  */
-
-static inline void
-bitmap_set_bit (sbitmap map, int bitno)
-{
-  gcc_checking_assert (! map->popcount);
-  map->elms[bitno / SBITMAP_ELT_BITS]
-    |= (SBITMAP_ELT_TYPE) 1 << (bitno) % SBITMAP_ELT_BITS;
-}
-
-/* Reset bit number BITNO in the sbitmap MAP.  */
-
-static inline void
-bitmap_clear_bit (sbitmap map, int bitno)
-{
-  gcc_checking_assert (! map->popcount);
-  map->elms[bitno / SBITMAP_ELT_BITS]
-    &= ~((SBITMAP_ELT_TYPE) 1 << (bitno) % SBITMAP_ELT_BITS);
-}
-
-/* The iterator for sbitmap.  */
-struct sbitmap_iterator {
-  /* The pointer to the first word of the bitmap.  */
-  const SBITMAP_ELT_TYPE *ptr;
-
-  /* The size of the bitmap.  */
-  unsigned int size;
-
-  /* The current word index.  */
-  unsigned int word_num;
-
-  /* The current bit index (not modulo SBITMAP_ELT_BITS).  */
-  unsigned int bit_num;
-
-  /* The words currently visited.  */
-  SBITMAP_ELT_TYPE word;
-};
-
-/* Initialize the iterator I with sbitmap BMP and the initial index
-   MIN.  */
-
-static inline void
-bmp_iter_set_init (sbitmap_iterator *i, const_sbitmap bmp,
-		   unsigned int min, unsigned *bit_no ATTRIBUTE_UNUSED)
-{
-  i->word_num = min / (unsigned int) SBITMAP_ELT_BITS;
-  i->bit_num = min;
-  i->size = bmp->size;
-  i->ptr = bmp->elms;
-
-  if (i->word_num >= i->size)
-    i->word = 0;
-  else
-    i->word = (i->ptr[i->word_num]
-	       >> (i->bit_num % (unsigned int) SBITMAP_ELT_BITS));
-}
-
-/* Return true if we have more bits to visit, in which case *N is set
-   to the index of the bit to be visited.  Otherwise, return
-   false.  */
-
-static inline bool
-bmp_iter_set (sbitmap_iterator *i, unsigned int *n)
-{
-  /* Skip words that are zeros.  */
-  for (; i->word == 0; i->word = i->ptr[i->word_num])
-    {
-      i->word_num++;
-
-      /* If we have reached the end, break.  */
-      if (i->word_num >= i->size)
-	return false;
-
-      i->bit_num = i->word_num * SBITMAP_ELT_BITS;
-    }
-
-  /* Skip bits that are zero.  */
-  for (; (i->word & 1) == 0; i->word >>= 1)
-    i->bit_num++;
-
-  *n = i->bit_num;
-
-  return true;
-}
-
-/* Advance to the next bit.  */
-
-static inline void
-bmp_iter_next (sbitmap_iterator *i, unsigned *bit_no ATTRIBUTE_UNUSED)
-{
-  i->word >>= 1;
-  i->bit_num++;
-}
-
-/* Loop over all elements of SBITMAP, starting with MIN.  In each
-   iteration, N is set to the index of the bit being visited.  ITER is
-   an instance of sbitmap_iterator used to iterate the bitmap.  */
-
-#ifndef EXECUTE_IF_SET_IN_BITMAP
-/* See bitmap.h for the other definition of EXECUTE_IF_SET_IN_BITMAP.  */
-#define EXECUTE_IF_SET_IN_BITMAP(BITMAP, MIN, BITNUM, ITER)	\
-  for (bmp_iter_set_init (&(ITER), (BITMAP), (MIN), &(BITNUM));	\
-       bmp_iter_set (&(ITER), &(BITNUM));			\
-       bmp_iter_next (&(ITER), &(BITNUM)))
-#endif
-
-inline void sbitmap_free (sbitmap map)
-{
-  free (map->popcount);
-  free (map);
-}
-
-inline void sbitmap_vector_free (sbitmap * vec)
-{
-  free (vec);
-}
-
-extern void dump_bitmap (FILE *, const_sbitmap);
-extern void debug_raw (const simple_bitmap_def &ref);
-extern void debug_raw (const simple_bitmap_def *ptr);
-extern void dump_bitmap_file (FILE *, const_sbitmap);
-extern void debug (const simple_bitmap_def &ref);
-extern void debug (const simple_bitmap_def *ptr);
-extern void dump_bitmap_vector (FILE *, const char *, const char *, sbitmap *,
-				 int);
-extern sbitmap sbitmap_alloc (unsigned int);
-extern sbitmap sbitmap_alloc_with_popcount (unsigned int);
-extern sbitmap *sbitmap_vector_alloc (unsigned int, unsigned int);
-extern sbitmap sbitmap_resize (sbitmap, unsigned int, int);
-extern void bitmap_copy (sbitmap, const_sbitmap);
-extern int bitmap_equal_p (const_sbitmap, const_sbitmap);
-extern bool bitmap_empty_p (const_sbitmap);
-extern void bitmap_clear (sbitmap);
-extern void bitmap_ones (sbitmap);
-extern void bitmap_vector_clear (sbitmap *, unsigned int);
-extern void bitmap_vector_ones (sbitmap *, unsigned int);
-
-extern bool bitmap_ior_and_compl (sbitmap, const_sbitmap,
-				      const_sbitmap, const_sbitmap);
-extern void bitmap_and_compl (sbitmap, const_sbitmap, const_sbitmap);
-extern void bitmap_not (sbitmap, const_sbitmap);
-extern bool bitmap_or_and (sbitmap, const_sbitmap,
-				     const_sbitmap, const_sbitmap);
-extern bool bitmap_and_or (sbitmap, const_sbitmap,
-				     const_sbitmap, const_sbitmap);
-extern bool bitmap_intersect_p (const_sbitmap, const_sbitmap);
-extern bool bitmap_and (sbitmap, const_sbitmap, const_sbitmap);
-extern bool bitmap_ior (sbitmap, const_sbitmap, const_sbitmap);
-extern bool bitmap_xor (sbitmap, const_sbitmap, const_sbitmap);
-extern bool bitmap_subset_p (const_sbitmap, const_sbitmap);
-
-extern int bitmap_first_set_bit (const_sbitmap);
-extern int bitmap_last_set_bit (const_sbitmap);
-
-extern void debug_bitmap (const_sbitmap);
-extern sbitmap sbitmap_realloc (sbitmap, unsigned int);
-extern unsigned long sbitmap_popcount (const_sbitmap, unsigned long);
-#endif /* ! GCC_SBITMAP_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/splay-tree.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/splay-tree.h
deleted file mode 100644
index a26135a..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/splay-tree.h
+++ /dev/null
@@ -1,161 +0,0 @@
-/* A splay-tree datatype.  
-   Copyright 1998, 1999, 2000, 2002, 2005, 2007, 2009, 2010
-   Free Software Foundation, Inc.
-   Contributed by Mark Mitchell (mark@markmitchell.com).
-
-   This file is part of GCC.
-   
-   GCC is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
-   GCC 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
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with GCC; see the file COPYING.  If not, write to
-   the Free Software Foundation, 51 Franklin Street - Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-/* For an easily readable description of splay-trees, see:
-
-     Lewis, Harry R. and Denenberg, Larry.  Data Structures and Their
-     Algorithms.  Harper-Collins, Inc.  1991.  
-
-   The major feature of splay trees is that all basic tree operations
-   are amortized O(log n) time for a tree with n nodes.  */
-
-#ifndef _SPLAY_TREE_H
-#define _SPLAY_TREE_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-#include "ansidecl.h"
-
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
-
-#ifndef GTY
-#define GTY(X)
-#endif
-
-/* Use typedefs for the key and data types to facilitate changing
-   these types, if necessary.  These types should be sufficiently wide
-   that any pointer or scalar can be cast to these types, and then
-   cast back, without loss of precision.  */
-typedef uintptr_t splay_tree_key;
-typedef uintptr_t splay_tree_value;
-
-/* Forward declaration for a node in the tree.  */
-typedef struct splay_tree_node_s *splay_tree_node;
-
-/* The type of a function which compares two splay-tree keys.  The
-   function should return values as for qsort.  */
-typedef int (*splay_tree_compare_fn) (splay_tree_key, splay_tree_key);
-
-/* The type of a function used to deallocate any resources associated
-   with the key.  */
-typedef void (*splay_tree_delete_key_fn) (splay_tree_key);
-
-/* The type of a function used to deallocate any resources associated
-   with the value.  */
-typedef void (*splay_tree_delete_value_fn) (splay_tree_value);
-
-/* The type of a function used to iterate over the tree.  */
-typedef int (*splay_tree_foreach_fn) (splay_tree_node, void*);
-
-/* The type of a function used to allocate memory for tree root and
-   node structures.  The first argument is the number of bytes needed;
-   the second is a data pointer the splay tree functions pass through
-   to the allocator.  This function must never return zero.  */
-typedef void *(*splay_tree_allocate_fn) (int, void *);
-
-/* The type of a function used to free memory allocated using the
-   corresponding splay_tree_allocate_fn.  The first argument is the
-   memory to be freed; the latter is a data pointer the splay tree
-   functions pass through to the freer.  */
-typedef void (*splay_tree_deallocate_fn) (void *, void *);
-
-/* The nodes in the splay tree.  */
-struct GTY(()) splay_tree_node_s {
-  /* The key.  */
-  splay_tree_key GTY ((use_param1)) key;
-
-  /* The value.  */
-  splay_tree_value GTY ((use_param2)) value;
-
-  /* The left and right children, respectively.  */
-  splay_tree_node GTY ((use_params)) left;
-  splay_tree_node GTY ((use_params)) right;
-};
-
-/* The splay tree itself.  */
-struct GTY(()) splay_tree_s {
-  /* The root of the tree.  */
-  splay_tree_node GTY ((use_params)) root;
-
-  /* The comparision function.  */
-  splay_tree_compare_fn comp;
-
-  /* The deallocate-key function.  NULL if no cleanup is necessary.  */
-  splay_tree_delete_key_fn delete_key;
-
-  /* The deallocate-value function.  NULL if no cleanup is necessary.  */
-  splay_tree_delete_value_fn delete_value;
-
-  /* Node allocate function.  Takes allocate_data as a parameter. */
-  splay_tree_allocate_fn allocate;
-
-  /* Free function for nodes and trees.  Takes allocate_data as a parameter.  */
-  splay_tree_deallocate_fn deallocate;
-
-  /* Parameter for allocate/free functions.  */
-  void * GTY((skip)) allocate_data;
-};
-
-typedef struct splay_tree_s *splay_tree;
-
-extern splay_tree splay_tree_new (splay_tree_compare_fn,
-				  splay_tree_delete_key_fn,
-				  splay_tree_delete_value_fn);
-extern splay_tree splay_tree_new_with_allocator (splay_tree_compare_fn,
-						 splay_tree_delete_key_fn,
-						 splay_tree_delete_value_fn,
-						 splay_tree_allocate_fn,
-						 splay_tree_deallocate_fn,
-						 void *);
-extern splay_tree splay_tree_new_typed_alloc (splay_tree_compare_fn,
-					      splay_tree_delete_key_fn,
-					      splay_tree_delete_value_fn,
-					      splay_tree_allocate_fn,
-					      splay_tree_allocate_fn,
-					      splay_tree_deallocate_fn,
-					      void *);
-extern void splay_tree_delete (splay_tree);
-extern splay_tree_node splay_tree_insert (splay_tree,
-					  splay_tree_key,
-					  splay_tree_value);
-extern void splay_tree_remove	(splay_tree, splay_tree_key);
-extern splay_tree_node splay_tree_lookup (splay_tree, splay_tree_key);
-extern splay_tree_node splay_tree_predecessor (splay_tree, splay_tree_key);
-extern splay_tree_node splay_tree_successor (splay_tree, splay_tree_key);
-extern splay_tree_node splay_tree_max (splay_tree);
-extern splay_tree_node splay_tree_min (splay_tree);
-extern int splay_tree_foreach (splay_tree, splay_tree_foreach_fn, void*);
-extern int splay_tree_compare_ints (splay_tree_key, splay_tree_key);
-extern int splay_tree_compare_pointers (splay_tree_key,	splay_tree_key);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* _SPLAY_TREE_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ssa-iterators.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ssa-iterators.h
deleted file mode 100644
index 2c75e4a..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/ssa-iterators.h
+++ /dev/null
@@ -1,996 +0,0 @@
-/* Header file for SSA iterators.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_SSA_ITERATORS_H
-#define GCC_SSA_ITERATORS_H
-
-/* Immediate use lists are used to directly access all uses for an SSA
-   name and get pointers to the statement for each use.
-
-   The structure ssa_use_operand_t consists of PREV and NEXT pointers
-   to maintain the list.  A USE pointer, which points to address where
-   the use is located and a LOC pointer which can point to the
-   statement where the use is located, or, in the case of the root
-   node, it points to the SSA name itself.
-
-   The list is anchored by an occurrence of ssa_operand_d *in* the
-   ssa_name node itself (named 'imm_uses').  This node is uniquely
-   identified by having a NULL USE pointer. and the LOC pointer
-   pointing back to the ssa_name node itself.  This node forms the
-   base for a circular list, and initially this is the only node in
-   the list.
-
-   Fast iteration allows each use to be examined, but does not allow
-   any modifications to the uses or stmts.
-
-   Normal iteration allows insertion, deletion, and modification. the
-   iterator manages this by inserting a marker node into the list
-   immediately before the node currently being examined in the list.
-   this marker node is uniquely identified by having null stmt *and* a
-   null use pointer.
-
-   When iterating to the next use, the iteration routines check to see
-   if the node after the marker has changed. if it has, then the node
-   following the marker is now the next one to be visited. if not, the
-   marker node is moved past that node in the list (visualize it as
-   bumping the marker node through the list).  this continues until
-   the marker node is moved to the original anchor position. the
-   marker node is then removed from the list.
-
-   If iteration is halted early, the marker node must be removed from
-   the list before continuing.  */
-struct imm_use_iterator
-{
-  /* This is the current use the iterator is processing.  */
-  ssa_use_operand_t *imm_use;
-  /* This marks the last use in the list (use node from SSA_NAME)  */
-  ssa_use_operand_t *end_p;
-  /* This node is inserted and used to mark the end of the uses for a stmt.  */
-  ssa_use_operand_t iter_node;
-  /* This is the next ssa_name to visit.  IMM_USE may get removed before
-     the next one is traversed to, so it must be cached early.  */
-  ssa_use_operand_t *next_imm_name;
-};
-
-
-/* Use this iterator when simply looking at stmts.  Adding, deleting or
-   modifying stmts will cause this iterator to malfunction.  */
-
-#define FOR_EACH_IMM_USE_FAST(DEST, ITER, SSAVAR)		\
-  for ((DEST) = first_readonly_imm_use (&(ITER), (SSAVAR));	\
-       !end_readonly_imm_use_p (&(ITER));			\
-       (void) ((DEST) = next_readonly_imm_use (&(ITER))))
-
-/* Use this iterator to visit each stmt which has a use of SSAVAR.  */
-
-#define FOR_EACH_IMM_USE_STMT(STMT, ITER, SSAVAR)		\
-  for ((STMT) = first_imm_use_stmt (&(ITER), (SSAVAR));		\
-       !end_imm_use_stmt_p (&(ITER));				\
-       (void) ((STMT) = next_imm_use_stmt (&(ITER))))
-
-/* Use this to terminate the FOR_EACH_IMM_USE_STMT loop early.  Failure to
-   do so will result in leaving a iterator marker node in the immediate
-   use list, and nothing good will come from that.   */
-#define BREAK_FROM_IMM_USE_STMT(ITER)				\
-   {								\
-     end_imm_use_stmt_traverse (&(ITER));			\
-     break;							\
-   }
-
-
-/* Use this iterator in combination with FOR_EACH_IMM_USE_STMT to
-   get access to each occurrence of ssavar on the stmt returned by
-   that iterator..  for instance:
-
-     FOR_EACH_IMM_USE_STMT (stmt, iter, ssavar)
-       {
-         FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
-	   {
-	     SET_USE (use_p, blah);
-	   }
-	 update_stmt (stmt);
-       }							 */
-
-#define FOR_EACH_IMM_USE_ON_STMT(DEST, ITER)			\
-  for ((DEST) = first_imm_use_on_stmt (&(ITER));		\
-       !end_imm_use_on_stmt_p (&(ITER));			\
-       (void) ((DEST) = next_imm_use_on_stmt (&(ITER))))
-
-
-
-extern bool has_zero_uses_1 (const ssa_use_operand_t *head);
-extern bool single_imm_use_1 (const ssa_use_operand_t *head,
-			      use_operand_p *use_p, gimple *stmt);
-
-
-enum ssa_op_iter_type {
-  ssa_op_iter_none = 0,
-  ssa_op_iter_tree,
-  ssa_op_iter_use,
-  ssa_op_iter_def
-};
-
-/* This structure is used in the operand iterator loops.  It contains the
-   items required to determine which operand is retrieved next.  During
-   optimization, this structure is scalarized, and any unused fields are
-   optimized away, resulting in little overhead.  */
-
-struct ssa_op_iter
-{
-  enum ssa_op_iter_type iter_type;
-  bool done;
-  int flags;
-  unsigned i;
-  unsigned numops;
-  use_optype_p uses;
-  gimple stmt;
-};
-
-/* NOTE: Keep these in sync with doc/tree-ssa.texi.  */
-/* These flags are used to determine which operands are returned during
-   execution of the loop.  */
-#define SSA_OP_USE		0x01	/* Real USE operands.  */
-#define SSA_OP_DEF		0x02	/* Real DEF operands.  */
-#define SSA_OP_VUSE		0x04	/* VUSE operands.  */
-#define SSA_OP_VDEF		0x08	/* VDEF operands.  */
-/* These are commonly grouped operand flags.  */
-#define SSA_OP_VIRTUAL_USES	(SSA_OP_VUSE)
-#define SSA_OP_VIRTUAL_DEFS	(SSA_OP_VDEF)
-#define SSA_OP_ALL_VIRTUALS     (SSA_OP_VIRTUAL_USES | SSA_OP_VIRTUAL_DEFS)
-#define SSA_OP_ALL_USES		(SSA_OP_VIRTUAL_USES | SSA_OP_USE)
-#define SSA_OP_ALL_DEFS		(SSA_OP_VIRTUAL_DEFS | SSA_OP_DEF)
-#define SSA_OP_ALL_OPERANDS	(SSA_OP_ALL_USES | SSA_OP_ALL_DEFS)
-
-/* This macro executes a loop over the operands of STMT specified in FLAG,
-   returning each operand as a 'tree' in the variable TREEVAR.  ITER is an
-   ssa_op_iter structure used to control the loop.  */
-#define FOR_EACH_SSA_TREE_OPERAND(TREEVAR, STMT, ITER, FLAGS)	\
-  for (TREEVAR = op_iter_init_tree (&(ITER), STMT, FLAGS);	\
-       !op_iter_done (&(ITER));					\
-       (void) (TREEVAR = op_iter_next_tree (&(ITER))))
-
-/* This macro executes a loop over the operands of STMT specified in FLAG,
-   returning each operand as a 'use_operand_p' in the variable USEVAR.
-   ITER is an ssa_op_iter structure used to control the loop.  */
-#define FOR_EACH_SSA_USE_OPERAND(USEVAR, STMT, ITER, FLAGS)	\
-  for (USEVAR = op_iter_init_use (&(ITER), STMT, FLAGS);	\
-       !op_iter_done (&(ITER));					\
-       USEVAR = op_iter_next_use (&(ITER)))
-
-/* This macro executes a loop over the operands of STMT specified in FLAG,
-   returning each operand as a 'def_operand_p' in the variable DEFVAR.
-   ITER is an ssa_op_iter structure used to control the loop.  */
-#define FOR_EACH_SSA_DEF_OPERAND(DEFVAR, STMT, ITER, FLAGS)	\
-  for (DEFVAR = op_iter_init_def (&(ITER), STMT, FLAGS);	\
-       !op_iter_done (&(ITER));					\
-       DEFVAR = op_iter_next_def (&(ITER)))
-
-/* This macro will execute a loop over all the arguments of a PHI which
-   match FLAGS.   A use_operand_p is always returned via USEVAR.  FLAGS
-   can be either SSA_OP_USE or SSA_OP_VIRTUAL_USES or SSA_OP_ALL_USES.  */
-#define FOR_EACH_PHI_ARG(USEVAR, STMT, ITER, FLAGS)		\
-  for ((USEVAR) = op_iter_init_phiuse (&(ITER), STMT, FLAGS);	\
-       !op_iter_done (&(ITER));					\
-       (USEVAR) = op_iter_next_use (&(ITER)))
-
-
-/* This macro will execute a loop over a stmt, regardless of whether it is
-   a real stmt or a PHI node, looking at the USE nodes matching FLAGS.  */
-#define FOR_EACH_PHI_OR_STMT_USE(USEVAR, STMT, ITER, FLAGS)	\
-  for ((USEVAR) = (gimple_code (STMT) == GIMPLE_PHI 		\
-		   ? op_iter_init_phiuse (&(ITER), STMT, FLAGS)	\
-		   : op_iter_init_use (&(ITER), STMT, FLAGS));	\
-       !op_iter_done (&(ITER));					\
-       (USEVAR) = op_iter_next_use (&(ITER)))
-
-/* This macro will execute a loop over a stmt, regardless of whether it is
-   a real stmt or a PHI node, looking at the DEF nodes matching FLAGS.  */
-#define FOR_EACH_PHI_OR_STMT_DEF(DEFVAR, STMT, ITER, FLAGS)	\
-  for ((DEFVAR) = (gimple_code (STMT) == GIMPLE_PHI 		\
-		   ? op_iter_init_phidef (&(ITER), STMT, FLAGS)	\
-		   : op_iter_init_def (&(ITER), STMT, FLAGS));	\
-       !op_iter_done (&(ITER));					\
-       (DEFVAR) = op_iter_next_def (&(ITER)))
-
-/* This macro returns an operand in STMT as a tree if it is the ONLY
-   operand matching FLAGS.  If there are 0 or more than 1 operand matching
-   FLAGS, then NULL_TREE is returned.  */
-#define SINGLE_SSA_TREE_OPERAND(STMT, FLAGS)			\
-  single_ssa_tree_operand (STMT, FLAGS)
-
-/* This macro returns an operand in STMT as a use_operand_p if it is the ONLY
-   operand matching FLAGS.  If there are 0 or more than 1 operand matching
-   FLAGS, then NULL_USE_OPERAND_P is returned.  */
-#define SINGLE_SSA_USE_OPERAND(STMT, FLAGS)			\
-  single_ssa_use_operand (STMT, FLAGS)
-
-/* This macro returns an operand in STMT as a def_operand_p if it is the ONLY
-   operand matching FLAGS.  If there are 0 or more than 1 operand matching
-   FLAGS, then NULL_DEF_OPERAND_P is returned.  */
-#define SINGLE_SSA_DEF_OPERAND(STMT, FLAGS)			\
-  single_ssa_def_operand (STMT, FLAGS)
-
-/* This macro returns TRUE if there are no operands matching FLAGS in STMT.  */
-#define ZERO_SSA_OPERANDS(STMT, FLAGS) 	zero_ssa_operands (STMT, FLAGS)
-
-/* This macro counts the number of operands in STMT matching FLAGS.  */
-#define NUM_SSA_OPERANDS(STMT, FLAGS)	num_ssa_operands (STMT, FLAGS)
-
-
-/* Delink an immediate_uses node from its chain.  */
-static inline void
-delink_imm_use (ssa_use_operand_t *linknode)
-{
-  /* Return if this node is not in a list.  */
-  if (linknode->prev == NULL)
-    return;
-
-  linknode->prev->next = linknode->next;
-  linknode->next->prev = linknode->prev;
-  linknode->prev = NULL;
-  linknode->next = NULL;
-}
-
-/* Link ssa_imm_use node LINKNODE into the chain for LIST.  */
-static inline void
-link_imm_use_to_list (ssa_use_operand_t *linknode, ssa_use_operand_t *list)
-{
-  /* Link the new node at the head of the list.  If we are in the process of
-     traversing the list, we won't visit any new nodes added to it.  */
-  linknode->prev = list;
-  linknode->next = list->next;
-  list->next->prev = linknode;
-  list->next = linknode;
-}
-
-/* Link ssa_imm_use node LINKNODE into the chain for DEF.  */
-static inline void
-link_imm_use (ssa_use_operand_t *linknode, tree def)
-{
-  ssa_use_operand_t *root;
-
-  if (!def || TREE_CODE (def) != SSA_NAME)
-    linknode->prev = NULL;
-  else
-    {
-      root = &(SSA_NAME_IMM_USE_NODE (def));
-      if (linknode->use)
-        gcc_checking_assert (*(linknode->use) == def);
-      link_imm_use_to_list (linknode, root);
-    }
-}
-
-/* Set the value of a use pointed to by USE to VAL.  */
-static inline void
-set_ssa_use_from_ptr (use_operand_p use, tree val)
-{
-  delink_imm_use (use);
-  *(use->use) = val;
-  link_imm_use (use, val);
-}
-
-/* Link ssa_imm_use node LINKNODE into the chain for DEF, with use occurring
-   in STMT.  */
-static inline void
-link_imm_use_stmt (ssa_use_operand_t *linknode, tree def, gimple stmt)
-{
-  if (stmt)
-    link_imm_use (linknode, def);
-  else
-    link_imm_use (linknode, NULL);
-  linknode->loc.stmt = stmt;
-}
-
-/* Relink a new node in place of an old node in the list.  */
-static inline void
-relink_imm_use (ssa_use_operand_t *node, ssa_use_operand_t *old)
-{
-  /* The node one had better be in the same list.  */
-  gcc_checking_assert (*(old->use) == *(node->use));
-  node->prev = old->prev;
-  node->next = old->next;
-  if (old->prev)
-    {
-      old->prev->next = node;
-      old->next->prev = node;
-      /* Remove the old node from the list.  */
-      old->prev = NULL;
-    }
-}
-
-/* Relink ssa_imm_use node LINKNODE into the chain for OLD, with use occurring
-   in STMT.  */
-static inline void
-relink_imm_use_stmt (ssa_use_operand_t *linknode, ssa_use_operand_t *old,
-		     gimple stmt)
-{
-  if (stmt)
-    relink_imm_use (linknode, old);
-  else
-    link_imm_use (linknode, NULL);
-  linknode->loc.stmt = stmt;
-}
-
-
-/* Return true is IMM has reached the end of the immediate use list.  */
-static inline bool
-end_readonly_imm_use_p (const imm_use_iterator *imm)
-{
-  return (imm->imm_use == imm->end_p);
-}
-
-/* Initialize iterator IMM to process the list for VAR.  */
-static inline use_operand_p
-first_readonly_imm_use (imm_use_iterator *imm, tree var)
-{
-  imm->end_p = &(SSA_NAME_IMM_USE_NODE (var));
-  imm->imm_use = imm->end_p->next;
-#ifdef ENABLE_CHECKING
-  imm->iter_node.next = imm->imm_use->next;
-#endif
-  if (end_readonly_imm_use_p (imm))
-    return NULL_USE_OPERAND_P;
-  return imm->imm_use;
-}
-
-/* Bump IMM to the next use in the list.  */
-static inline use_operand_p
-next_readonly_imm_use (imm_use_iterator *imm)
-{
-  use_operand_p old = imm->imm_use;
-
-#ifdef ENABLE_CHECKING
-  /* If this assertion fails, it indicates the 'next' pointer has changed
-     since the last bump.  This indicates that the list is being modified
-     via stmt changes, or SET_USE, or somesuch thing, and you need to be
-     using the SAFE version of the iterator.  */
-  gcc_assert (imm->iter_node.next == old->next);
-  imm->iter_node.next = old->next->next;
-#endif
-
-  imm->imm_use = old->next;
-  if (end_readonly_imm_use_p (imm))
-    return NULL_USE_OPERAND_P;
-  return imm->imm_use;
-}
-
-
-/* Return true if VAR has no nondebug uses.  */
-static inline bool
-has_zero_uses (const_tree var)
-{
-  const ssa_use_operand_t *const ptr = &(SSA_NAME_IMM_USE_NODE (var));
-
-  /* A single use_operand means there is no items in the list.  */
-  if (ptr == ptr->next)
-    return true;
-
-  /* If there are debug stmts, we have to look at each use and see
-     whether there are any nondebug uses.  */
-  if (!MAY_HAVE_DEBUG_STMTS)
-    return false;
-
-  return has_zero_uses_1 (ptr);
-}
-
-/* Return true if VAR has a single nondebug use.  */
-static inline bool
-has_single_use (const_tree var)
-{
-  const ssa_use_operand_t *const ptr = &(SSA_NAME_IMM_USE_NODE (var));
-
-  /* If there aren't any uses whatsoever, we're done.  */
-  if (ptr == ptr->next)
-    return false;
-
-  /* If there's a single use, check that it's not a debug stmt.  */
-  if (ptr == ptr->next->next)
-    return !is_gimple_debug (USE_STMT (ptr->next));
-
-  /* If there are debug stmts, we have to look at each of them.  */
-  if (!MAY_HAVE_DEBUG_STMTS)
-    return false;
-
-  return single_imm_use_1 (ptr, NULL, NULL);
-}
-
-
-/* If VAR has only a single immediate nondebug use, return true, and
-   set USE_P and STMT to the use pointer and stmt of occurrence.  */
-static inline bool
-single_imm_use (const_tree var, use_operand_p *use_p, gimple *stmt)
-{
-  const ssa_use_operand_t *const ptr = &(SSA_NAME_IMM_USE_NODE (var));
-
-  /* If there aren't any uses whatsoever, we're done.  */
-  if (ptr == ptr->next)
-    {
-    return_false:
-      *use_p = NULL_USE_OPERAND_P;
-      *stmt = NULL;
-      return false;
-    }
-
-  /* If there's a single use, check that it's not a debug stmt.  */
-  if (ptr == ptr->next->next)
-    {
-      if (!is_gimple_debug (USE_STMT (ptr->next)))
-	{
-	  *use_p = ptr->next;
-	  *stmt = ptr->next->loc.stmt;
-	  return true;
-	}
-      else
-	goto return_false;
-    }
-
-  /* If there are debug stmts, we have to look at each of them.  */
-  if (!MAY_HAVE_DEBUG_STMTS)
-    goto return_false;
-
-  return single_imm_use_1 (ptr, use_p, stmt);
-}
-
-/* Return the number of nondebug immediate uses of VAR.  */
-static inline unsigned int
-num_imm_uses (const_tree var)
-{
-  const ssa_use_operand_t *const start = &(SSA_NAME_IMM_USE_NODE (var));
-  const ssa_use_operand_t *ptr;
-  unsigned int num = 0;
-
-  if (!MAY_HAVE_DEBUG_STMTS)
-    for (ptr = start->next; ptr != start; ptr = ptr->next)
-      num++;
-  else
-    for (ptr = start->next; ptr != start; ptr = ptr->next)
-      if (!is_gimple_debug (USE_STMT (ptr)))
-	num++;
-
-  return num;
-}
-
-/*  -----------------------------------------------------------------------  */
-
-/* The following set of routines are used to iterator over various type of
-   SSA operands.  */
-
-/* Return true if PTR is finished iterating.  */
-static inline bool
-op_iter_done (const ssa_op_iter *ptr)
-{
-  return ptr->done;
-}
-
-/* Get the next iterator use value for PTR.  */
-static inline use_operand_p
-op_iter_next_use (ssa_op_iter *ptr)
-{
-  use_operand_p use_p;
-  gcc_checking_assert (ptr->iter_type == ssa_op_iter_use);
-  if (ptr->uses)
-    {
-      use_p = USE_OP_PTR (ptr->uses);
-      ptr->uses = ptr->uses->next;
-      return use_p;
-    }
-  if (ptr->i < ptr->numops)
-    {
-      return PHI_ARG_DEF_PTR (ptr->stmt, (ptr->i)++);
-    }
-  ptr->done = true;
-  return NULL_USE_OPERAND_P;
-}
-
-/* Get the next iterator def value for PTR.  */
-static inline def_operand_p
-op_iter_next_def (ssa_op_iter *ptr)
-{
-  gcc_checking_assert (ptr->iter_type == ssa_op_iter_def);
-  if (ptr->flags & SSA_OP_VDEF)
-    {
-      tree *p;
-      ptr->flags &= ~SSA_OP_VDEF;
-      p = gimple_vdef_ptr (ptr->stmt);
-      if (p && *p)
-	return p;
-    }
-  if (ptr->flags & SSA_OP_DEF)
-    {
-      while (ptr->i < ptr->numops)
-	{
-	  tree *val = gimple_op_ptr (ptr->stmt, ptr->i);
-	  ptr->i++;
-	  if (*val)
-	    {
-	      if (TREE_CODE (*val) == TREE_LIST)
-		val = &TREE_VALUE (*val);
-	      if (TREE_CODE (*val) == SSA_NAME
-		  || is_gimple_reg (*val))
-		return val;
-	    }
-	}
-      ptr->flags &= ~SSA_OP_DEF;
-    }
-
-  ptr->done = true;
-  return NULL_DEF_OPERAND_P;
-}
-
-/* Get the next iterator tree value for PTR.  */
-static inline tree
-op_iter_next_tree (ssa_op_iter *ptr)
-{
-  tree val;
-  gcc_checking_assert (ptr->iter_type == ssa_op_iter_tree);
-  if (ptr->uses)
-    {
-      val = USE_OP (ptr->uses);
-      ptr->uses = ptr->uses->next;
-      return val;
-    }
-  if (ptr->flags & SSA_OP_VDEF)
-    {
-      ptr->flags &= ~SSA_OP_VDEF;
-      if ((val = gimple_vdef (ptr->stmt)))
-	return val;
-    }
-  if (ptr->flags & SSA_OP_DEF)
-    {
-      while (ptr->i < ptr->numops)
-	{
-	  val = gimple_op (ptr->stmt, ptr->i);
-	  ptr->i++;
-	  if (val)
-	    {
-	      if (TREE_CODE (val) == TREE_LIST)
-		val = TREE_VALUE (val);
-	      if (TREE_CODE (val) == SSA_NAME
-		  || is_gimple_reg (val))
-		return val;
-	    }
-	}
-      ptr->flags &= ~SSA_OP_DEF;
-    }
-
-  ptr->done = true;
-  return NULL_TREE;
-}
-
-
-/* This functions clears the iterator PTR, and marks it done.  This is normally
-   used to prevent warnings in the compile about might be uninitialized
-   components.  */
-
-static inline void
-clear_and_done_ssa_iter (ssa_op_iter *ptr)
-{
-  ptr->i = 0;
-  ptr->numops = 0;
-  ptr->uses = NULL;
-  ptr->iter_type = ssa_op_iter_none;
-  ptr->stmt = NULL;
-  ptr->done = true;
-  ptr->flags = 0;
-}
-
-/* Initialize the iterator PTR to the virtual defs in STMT.  */
-static inline void
-op_iter_init (ssa_op_iter *ptr, gimple stmt, int flags)
-{
-  /* PHI nodes require a different iterator initialization path.  We
-     do not support iterating over virtual defs or uses without
-     iterating over defs or uses at the same time.  */
-  gcc_checking_assert (gimple_code (stmt) != GIMPLE_PHI
-		       && (!(flags & SSA_OP_VDEF) || (flags & SSA_OP_DEF))
-		       && (!(flags & SSA_OP_VUSE) || (flags & SSA_OP_USE)));
-  ptr->numops = 0;
-  if (flags & (SSA_OP_DEF | SSA_OP_VDEF))
-    {
-      switch (gimple_code (stmt))
-	{
-	  case GIMPLE_ASSIGN:
-	  case GIMPLE_CALL:
-	    ptr->numops = 1;
-	    break;
-	  case GIMPLE_ASM:
-	    ptr->numops = gimple_asm_noutputs (stmt);
-	    break;
-	  default:
-	    ptr->numops = 0;
-	    flags &= ~(SSA_OP_DEF | SSA_OP_VDEF);
-	    break;
-	}
-    }
-  ptr->uses = (flags & (SSA_OP_USE|SSA_OP_VUSE)) ? gimple_use_ops (stmt) : NULL;
-  if (!(flags & SSA_OP_VUSE)
-      && ptr->uses
-      && gimple_vuse (stmt) != NULL_TREE)
-    ptr->uses = ptr->uses->next;
-  ptr->done = false;
-  ptr->i = 0;
-
-  ptr->stmt = stmt;
-  ptr->flags = flags;
-}
-
-/* Initialize iterator PTR to the use operands in STMT based on FLAGS. Return
-   the first use.  */
-static inline use_operand_p
-op_iter_init_use (ssa_op_iter *ptr, gimple stmt, int flags)
-{
-  gcc_checking_assert ((flags & SSA_OP_ALL_DEFS) == 0
-		       && (flags & SSA_OP_USE));
-  op_iter_init (ptr, stmt, flags);
-  ptr->iter_type = ssa_op_iter_use;
-  return op_iter_next_use (ptr);
-}
-
-/* Initialize iterator PTR to the def operands in STMT based on FLAGS. Return
-   the first def.  */
-static inline def_operand_p
-op_iter_init_def (ssa_op_iter *ptr, gimple stmt, int flags)
-{
-  gcc_checking_assert ((flags & SSA_OP_ALL_USES) == 0
-		       && (flags & SSA_OP_DEF));
-  op_iter_init (ptr, stmt, flags);
-  ptr->iter_type = ssa_op_iter_def;
-  return op_iter_next_def (ptr);
-}
-
-/* Initialize iterator PTR to the operands in STMT based on FLAGS. Return
-   the first operand as a tree.  */
-static inline tree
-op_iter_init_tree (ssa_op_iter *ptr, gimple stmt, int flags)
-{
-  op_iter_init (ptr, stmt, flags);
-  ptr->iter_type = ssa_op_iter_tree;
-  return op_iter_next_tree (ptr);
-}
-
-
-/* If there is a single operand in STMT matching FLAGS, return it.  Otherwise
-   return NULL.  */
-static inline tree
-single_ssa_tree_operand (gimple stmt, int flags)
-{
-  tree var;
-  ssa_op_iter iter;
-
-  var = op_iter_init_tree (&iter, stmt, flags);
-  if (op_iter_done (&iter))
-    return NULL_TREE;
-  op_iter_next_tree (&iter);
-  if (op_iter_done (&iter))
-    return var;
-  return NULL_TREE;
-}
-
-
-/* If there is a single operand in STMT matching FLAGS, return it.  Otherwise
-   return NULL.  */
-static inline use_operand_p
-single_ssa_use_operand (gimple stmt, int flags)
-{
-  use_operand_p var;
-  ssa_op_iter iter;
-
-  var = op_iter_init_use (&iter, stmt, flags);
-  if (op_iter_done (&iter))
-    return NULL_USE_OPERAND_P;
-  op_iter_next_use (&iter);
-  if (op_iter_done (&iter))
-    return var;
-  return NULL_USE_OPERAND_P;
-}
-
-
-
-/* If there is a single operand in STMT matching FLAGS, return it.  Otherwise
-   return NULL.  */
-static inline def_operand_p
-single_ssa_def_operand (gimple stmt, int flags)
-{
-  def_operand_p var;
-  ssa_op_iter iter;
-
-  var = op_iter_init_def (&iter, stmt, flags);
-  if (op_iter_done (&iter))
-    return NULL_DEF_OPERAND_P;
-  op_iter_next_def (&iter);
-  if (op_iter_done (&iter))
-    return var;
-  return NULL_DEF_OPERAND_P;
-}
-
-
-/* Return true if there are zero operands in STMT matching the type
-   given in FLAGS.  */
-static inline bool
-zero_ssa_operands (gimple stmt, int flags)
-{
-  ssa_op_iter iter;
-
-  op_iter_init_tree (&iter, stmt, flags);
-  return op_iter_done (&iter);
-}
-
-
-/* Return the number of operands matching FLAGS in STMT.  */
-static inline int
-num_ssa_operands (gimple stmt, int flags)
-{
-  ssa_op_iter iter;
-  tree t;
-  int num = 0;
-
-  gcc_checking_assert (gimple_code (stmt) != GIMPLE_PHI);
-  FOR_EACH_SSA_TREE_OPERAND (t, stmt, iter, flags)
-    num++;
-  return num;
-}
-
-/* If there is a single DEF in the PHI node which matches FLAG, return it.
-   Otherwise return NULL_DEF_OPERAND_P.  */
-static inline tree
-single_phi_def (gimple stmt, int flags)
-{
-  tree def = PHI_RESULT (stmt);
-  if ((flags & SSA_OP_DEF) && is_gimple_reg (def))
-    return def;
-  if ((flags & SSA_OP_VIRTUAL_DEFS) && !is_gimple_reg (def))
-    return def;
-  return NULL_TREE;
-}
-
-/* Initialize the iterator PTR for uses matching FLAGS in PHI.  FLAGS should
-   be either SSA_OP_USES or SSA_OP_VIRTUAL_USES.  */
-static inline use_operand_p
-op_iter_init_phiuse (ssa_op_iter *ptr, gimple phi, int flags)
-{
-  tree phi_def = gimple_phi_result (phi);
-  int comp;
-
-  clear_and_done_ssa_iter (ptr);
-  ptr->done = false;
-
-  gcc_checking_assert ((flags & (SSA_OP_USE | SSA_OP_VIRTUAL_USES)) != 0);
-
-  comp = (is_gimple_reg (phi_def) ? SSA_OP_USE : SSA_OP_VIRTUAL_USES);
-
-  /* If the PHI node doesn't the operand type we care about, we're done.  */
-  if ((flags & comp) == 0)
-    {
-      ptr->done = true;
-      return NULL_USE_OPERAND_P;
-    }
-
-  ptr->stmt = phi;
-  ptr->numops = gimple_phi_num_args (phi);
-  ptr->iter_type = ssa_op_iter_use;
-  ptr->flags = flags;
-  return op_iter_next_use (ptr);
-}
-
-
-/* Start an iterator for a PHI definition.  */
-
-static inline def_operand_p
-op_iter_init_phidef (ssa_op_iter *ptr, gimple phi, int flags)
-{
-  tree phi_def = PHI_RESULT (phi);
-  int comp;
-
-  clear_and_done_ssa_iter (ptr);
-  ptr->done = false;
-
-  gcc_checking_assert ((flags & (SSA_OP_DEF | SSA_OP_VIRTUAL_DEFS)) != 0);
-
-  comp = (is_gimple_reg (phi_def) ? SSA_OP_DEF : SSA_OP_VIRTUAL_DEFS);
-
-  /* If the PHI node doesn't have the operand type we care about,
-     we're done.  */
-  if ((flags & comp) == 0)
-    {
-      ptr->done = true;
-      return NULL_DEF_OPERAND_P;
-    }
-
-  ptr->iter_type = ssa_op_iter_def;
-  /* The first call to op_iter_next_def will terminate the iterator since
-     all the fields are NULL.  Simply return the result here as the first and
-     therefore only result.  */
-  return PHI_RESULT_PTR (phi);
-}
-
-/* Return true is IMM has reached the end of the immediate use stmt list.  */
-
-static inline bool
-end_imm_use_stmt_p (const imm_use_iterator *imm)
-{
-  return (imm->imm_use == imm->end_p);
-}
-
-/* Finished the traverse of an immediate use stmt list IMM by removing the
-   placeholder node from the list.  */
-
-static inline void
-end_imm_use_stmt_traverse (imm_use_iterator *imm)
-{
-  delink_imm_use (&(imm->iter_node));
-}
-
-/* Immediate use traversal of uses within a stmt require that all the
-   uses on a stmt be sequentially listed.  This routine is used to build up
-   this sequential list by adding USE_P to the end of the current list
-   currently delimited by HEAD and LAST_P.  The new LAST_P value is
-   returned.  */
-
-static inline use_operand_p
-move_use_after_head (use_operand_p use_p, use_operand_p head,
-		      use_operand_p last_p)
-{
-  gcc_checking_assert (USE_FROM_PTR (use_p) == USE_FROM_PTR (head));
-  /* Skip head when we find it.  */
-  if (use_p != head)
-    {
-      /* If use_p is already linked in after last_p, continue.  */
-      if (last_p->next == use_p)
-	last_p = use_p;
-      else
-	{
-	  /* Delink from current location, and link in at last_p.  */
-	  delink_imm_use (use_p);
-	  link_imm_use_to_list (use_p, last_p);
-	  last_p = use_p;
-	}
-    }
-  return last_p;
-}
-
-
-/* This routine will relink all uses with the same stmt as HEAD into the list
-   immediately following HEAD for iterator IMM.  */
-
-static inline void
-link_use_stmts_after (use_operand_p head, imm_use_iterator *imm)
-{
-  use_operand_p use_p;
-  use_operand_p last_p = head;
-  gimple head_stmt = USE_STMT (head);
-  tree use = USE_FROM_PTR (head);
-  ssa_op_iter op_iter;
-  int flag;
-
-  /* Only look at virtual or real uses, depending on the type of HEAD.  */
-  flag = (is_gimple_reg (use) ? SSA_OP_USE : SSA_OP_VIRTUAL_USES);
-
-  if (gimple_code (head_stmt) == GIMPLE_PHI)
-    {
-      FOR_EACH_PHI_ARG (use_p, head_stmt, op_iter, flag)
-	if (USE_FROM_PTR (use_p) == use)
-	  last_p = move_use_after_head (use_p, head, last_p);
-    }
-  else
-    {
-      if (flag == SSA_OP_USE)
-	{
-	  FOR_EACH_SSA_USE_OPERAND (use_p, head_stmt, op_iter, flag)
-	    if (USE_FROM_PTR (use_p) == use)
-	      last_p = move_use_after_head (use_p, head, last_p);
-	}
-      else if ((use_p = gimple_vuse_op (head_stmt)) != NULL_USE_OPERAND_P)
-	{
-	  if (USE_FROM_PTR (use_p) == use)
-	    last_p = move_use_after_head (use_p, head, last_p);
-	}
-    }
-  /* Link iter node in after last_p.  */
-  if (imm->iter_node.prev != NULL)
-    delink_imm_use (&imm->iter_node);
-  link_imm_use_to_list (&(imm->iter_node), last_p);
-}
-
-/* Initialize IMM to traverse over uses of VAR.  Return the first statement.  */
-static inline gimple
-first_imm_use_stmt (imm_use_iterator *imm, tree var)
-{
-  imm->end_p = &(SSA_NAME_IMM_USE_NODE (var));
-  imm->imm_use = imm->end_p->next;
-  imm->next_imm_name = NULL_USE_OPERAND_P;
-
-  /* iter_node is used as a marker within the immediate use list to indicate
-     where the end of the current stmt's uses are.  Initialize it to NULL
-     stmt and use, which indicates a marker node.  */
-  imm->iter_node.prev = NULL_USE_OPERAND_P;
-  imm->iter_node.next = NULL_USE_OPERAND_P;
-  imm->iter_node.loc.stmt = NULL;
-  imm->iter_node.use = NULL;
-
-  if (end_imm_use_stmt_p (imm))
-    return NULL;
-
-  link_use_stmts_after (imm->imm_use, imm);
-
-  return USE_STMT (imm->imm_use);
-}
-
-/* Bump IMM to the next stmt which has a use of var.  */
-
-static inline gimple
-next_imm_use_stmt (imm_use_iterator *imm)
-{
-  imm->imm_use = imm->iter_node.next;
-  if (end_imm_use_stmt_p (imm))
-    {
-      if (imm->iter_node.prev != NULL)
-	delink_imm_use (&imm->iter_node);
-      return NULL;
-    }
-
-  link_use_stmts_after (imm->imm_use, imm);
-  return USE_STMT (imm->imm_use);
-}
-
-/* This routine will return the first use on the stmt IMM currently refers
-   to.  */
-
-static inline use_operand_p
-first_imm_use_on_stmt (imm_use_iterator *imm)
-{
-  imm->next_imm_name = imm->imm_use->next;
-  return imm->imm_use;
-}
-
-/*  Return TRUE if the last use on the stmt IMM refers to has been visited.  */
-
-static inline bool
-end_imm_use_on_stmt_p (const imm_use_iterator *imm)
-{
-  return (imm->imm_use == &(imm->iter_node));
-}
-
-/* Bump to the next use on the stmt IMM refers to, return NULL if done.  */
-
-static inline use_operand_p
-next_imm_use_on_stmt (imm_use_iterator *imm)
-{
-  imm->imm_use = imm->next_imm_name;
-  if (end_imm_use_on_stmt_p (imm))
-    return NULL_USE_OPERAND_P;
-  else
-    {
-      imm->next_imm_name = imm->imm_use->next;
-      return imm->imm_use;
-    }
-}
-
-/* Delink all immediate_use information for STMT.  */
-static inline void
-delink_stmt_imm_use (gimple stmt)
-{
-   ssa_op_iter iter;
-   use_operand_p use_p;
-
-   if (ssa_operands_active (cfun))
-     FOR_EACH_PHI_OR_STMT_USE (use_p, stmt, iter, SSA_OP_ALL_USES)
-       delink_imm_use (use_p);
-}
-
-#endif /* GCC_TREE_SSA_ITERATORS_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/statistics.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/statistics.h
deleted file mode 100644
index 5e87841..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/statistics.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Memory and optimization statistics helpers.
-   Copyright (C) 2004-2014 Free Software Foundation, Inc.
-   Contributed by Cygnus Solutions.
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
-
-   GCC 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 General Public
-   License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with GCC; see the file COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_STATISTICS
-#define GCC_STATISTICS
-
-#if ! defined GATHER_STATISTICS
-#error GATHER_STATISTICS must be defined
-#endif
-
-#define GCC_MEM_STAT_ARGUMENTS const char * ARG_UNUSED (_loc_name), int ARG_UNUSED (_loc_line), const char * ARG_UNUSED (_loc_function)
-#if GATHER_STATISTICS
-#define ALONE_MEM_STAT_DECL GCC_MEM_STAT_ARGUMENTS
-#define ALONE_FINAL_MEM_STAT_DECL ALONE_MEM_STAT_DECL
-#define ALONE_PASS_MEM_STAT _loc_name, _loc_line,  _loc_function
-#define ALONE_FINAL_PASS_MEM_STAT ALONE_PASS_MEM_STAT
-#define ALONE_MEM_STAT_INFO __FILE__, __LINE__, __FUNCTION__
-#define MEM_STAT_DECL , ALONE_MEM_STAT_DECL
-#define FINAL_MEM_STAT_DECL , ALONE_FINAL_MEM_STAT_DECL
-#define PASS_MEM_STAT , ALONE_PASS_MEM_STAT
-#define FINAL_PASS_MEM_STAT , ALONE_FINAL_PASS_MEM_STAT
-#define MEM_STAT_INFO , ALONE_MEM_STAT_INFO
-#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
-#define ALONE_CXX_MEM_STAT_INFO const char * _loc_name = __builtin_FILE (), int _loc_line = __builtin_LINE (), const char * _loc_function = __builtin_FUNCTION ()
-#else
-#define ALONE_CXX_MEM_STAT_INFO const char * _loc_name = __FILE__, int _loc_line = __LINE__, const char * _loc_function = NULL
-#endif
-#define CXX_MEM_STAT_INFO , ALONE_CXX_MEM_STAT_INFO
-#else
-#define ALONE_MEM_STAT_DECL void
-#define ALONE_FINAL_MEM_STAT_DECL GCC_MEM_STAT_ARGUMENTS
-#define ALONE_PASS_MEM_STAT
-#define ALONE_FINAL_PASS_MEM_STAT 0,0,0
-#define ALONE_MEM_STAT_INFO
-#define MEM_STAT_DECL
-#define FINAL_MEM_STAT_DECL , ALONE_FINAL_MEM_STAT_DECL
-#define PASS_MEM_STAT
-#define FINAL_PASS_MEM_STAT , ALONE_FINAL_PASS_MEM_STAT
-#define MEM_STAT_INFO ALONE_MEM_STAT_INFO
-#define ALONE_CXX_MEM_STAT_INFO
-#define CXX_MEM_STAT_INFO
-#endif
-
-struct function;
-
-/* In statistics.c */
-extern void statistics_early_init (void);
-extern void statistics_init (void);
-extern void statistics_fini (void);
-extern void statistics_fini_pass (void);
-extern void statistics_counter_event (struct function *, const char *, int);
-extern void statistics_histogram_event (struct function *, const char *, int);
-
-#endif
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/stmt.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/stmt.h
deleted file mode 100644
index 3ccd1c4..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/stmt.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Declarations and data structures for stmt.c.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_STMT_H
-#define GCC_STMT_H
-
-extern void expand_label (tree);
-extern bool parse_output_constraint (const char **, int, int, int,
-				     bool *, bool *, bool *);
-extern bool parse_input_constraint (const char **, int, int, int, int,
-				    const char * const *, bool *, bool *);
-extern tree resolve_asm_operand_names (tree, tree, tree, tree);
-#ifdef HARD_CONST
-/* Silly ifdef to avoid having all includers depend on hard-reg-set.h.  */
-extern tree tree_overlaps_hard_reg_set (tree, HARD_REG_SET *);
-#endif
-
-#endif  // GCC_STMT_H
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/stor-layout.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/stor-layout.h
deleted file mode 100644
index 74a2c6c..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/stor-layout.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/* Definitions and declarations for stor-layout.c.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_STOR_LAYOUT_H
-#define GCC_STOR_LAYOUT_H
-
-extern void set_min_and_max_values_for_integral_type (tree, int, bool);
-extern void fixup_signed_type (tree);
-extern void internal_reference_types (void);
-extern unsigned int update_alignment_for_field (record_layout_info, tree,
-                                                unsigned int);
-extern record_layout_info start_record_layout (tree);
-extern tree bit_from_pos (tree, tree);
-extern tree byte_from_pos (tree, tree);
-extern void pos_from_bit (tree *, tree *, unsigned int, tree);
-extern void normalize_offset (tree *, tree *, unsigned int);
-extern tree rli_size_unit_so_far (record_layout_info);
-extern tree rli_size_so_far (record_layout_info);
-extern void normalize_rli (record_layout_info);
-extern void place_field (record_layout_info, tree);
-extern void compute_record_mode (tree);
-extern void finish_record_layout (record_layout_info, int);
-extern unsigned int element_precision (const_tree);
-extern void finalize_size_functions (void);
-extern void fixup_unsigned_type (tree);
-extern void initialize_sizetypes (void);
-
-/* Finish up a builtin RECORD_TYPE. Give it a name and provide its
-   fields. Optionally specify an alignment, and then lay it out.  */
-extern void finish_builtin_struct (tree, const char *, tree, tree);
-
-/* Given a VAR_DECL, PARM_DECL, RESULT_DECL or FIELD_DECL node,
-   calculates the DECL_SIZE, DECL_SIZE_UNIT, DECL_ALIGN and DECL_MODE
-   fields.  Call this only once for any given decl node.
-
-   Second argument is the boundary that this field can be assumed to
-   be starting at (in bits).  Zero means it can be assumed aligned
-   on any boundary that may be needed.  */
-extern void layout_decl (tree, unsigned);
-
-/* Given a ..._TYPE node, calculate the TYPE_SIZE, TYPE_SIZE_UNIT,
-   TYPE_ALIGN and TYPE_MODE fields.  If called more than once on one
-   node, does nothing except for the first time.  */
-extern void layout_type (tree);
-
-/* Construct various nodes representing fract or accum data types.  */
-extern tree make_fract_type (int, int, int);
-extern tree make_accum_type (int, int, int);
-
-#define make_signed_fract_type(P) make_fract_type (P, 0, 0)
-#define make_unsigned_fract_type(P) make_fract_type (P, 1, 0)
-#define make_sat_signed_fract_type(P) make_fract_type (P, 0, 1)
-#define make_sat_unsigned_fract_type(P) make_fract_type (P, 1, 1)
-#define make_signed_accum_type(P) make_accum_type (P, 0, 0)
-#define make_unsigned_accum_type(P) make_accum_type (P, 1, 0)
-#define make_sat_signed_accum_type(P) make_accum_type (P, 0, 1)
-#define make_sat_unsigned_accum_type(P) make_accum_type (P, 1, 1)
-
-#define make_or_reuse_signed_fract_type(P) \
-		make_or_reuse_fract_type (P, 0, 0)
-#define make_or_reuse_unsigned_fract_type(P) \
-		make_or_reuse_fract_type (P, 1, 0)
-#define make_or_reuse_sat_signed_fract_type(P) \
-		make_or_reuse_fract_type (P, 0, 1)
-#define make_or_reuse_sat_unsigned_fract_type(P) \
-		make_or_reuse_fract_type (P, 1, 1)
-#define make_or_reuse_signed_accum_type(P) \
-		make_or_reuse_accum_type (P, 0, 0)
-#define make_or_reuse_unsigned_accum_type(P) \
-		make_or_reuse_accum_type (P, 1, 0)
-#define make_or_reuse_sat_signed_accum_type(P) \
-		make_or_reuse_accum_type (P, 0, 1)
-#define make_or_reuse_sat_unsigned_accum_type(P) \
-		make_or_reuse_accum_type (P, 1, 1)
-
-extern tree make_signed_type (int);
-extern tree make_unsigned_type (int);
-
-/* Return the mode for data of a given size SIZE and mode class CLASS.
-   If LIMIT is nonzero, then don't use modes bigger than MAX_FIXED_MODE_SIZE.
-   The value is BLKmode if no other mode is found.  This is like
-   mode_for_size, but is passed a tree.  */
-extern enum machine_mode mode_for_size_tree (const_tree, enum mode_class, int);
-
-/* Given a VAR_DECL, PARM_DECL or RESULT_DECL, clears the results of
-   a previous call to layout_decl and calls it again.  */
-extern void relayout_decl (tree);
-
-/* variable_size (EXP) is like save_expr (EXP) except that it
-   is for the special case of something that is part of a
-   variable size for a data type.  It makes special arrangements
-   to compute the value at the right time when the data type
-   belongs to a function parameter.  */
-extern tree variable_size (tree);
-
-/* Vector types need to check target flags to determine type.  */
-extern enum machine_mode vector_type_mode (const_tree);
-
-#endif  // GCC_STOR_LAYOUT_H
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/stringpool.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/stringpool.h
deleted file mode 100644
index 8788f0b..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/stringpool.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Declarations and definitons for stringpool.c.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_STRINGPOOL_H
-#define GCC_STRINGPOOL_H
-
-/* Return the (unique) IDENTIFIER_NODE node for a given name.
-   The name is supplied as a char *.  */
-extern tree get_identifier (const char *);
-
-/* If an identifier with the name TEXT (a null-terminated string) has
-   previously been referred to, return that node; otherwise return
-   NULL_TREE.  */
-extern tree maybe_get_identifier (const char *);
-
-/* Identical to get_identifier, except that the length is assumed
-   known.  */
-extern tree get_identifier_with_length (const char *, size_t);
-
-#if GCC_VERSION >= 3000
-#define get_identifier(str) \
-  (__builtin_constant_p (str)				\
-    ? get_identifier_with_length ((str), strlen (str))  \
-    : get_identifier (str))
-#endif
-
-#endif  // GCC_STRINGPOOL_H
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/symtab.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/symtab.h
deleted file mode 100644
index 91a56c7..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/symtab.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/* Hash tables.
-   Copyright (C) 2000-2014 Free Software Foundation, Inc.
-
-This program is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3, 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef LIBCPP_SYMTAB_H
-#define LIBCPP_SYMTAB_H
-
-#include "obstack.h"
-
-#ifndef GTY
-#define GTY(x) /* nothing */
-#endif
-
-/* This is what each hash table entry points to.  It may be embedded
-   deeply within another object.  */
-typedef struct ht_identifier ht_identifier;
-typedef struct ht_identifier *ht_identifier_ptr;
-struct GTY(()) ht_identifier {
-  const unsigned char *str;
-  unsigned int len;
-  unsigned int hash_value;
-};
-
-#define HT_LEN(NODE) ((NODE)->len)
-#define HT_STR(NODE) ((NODE)->str)
-
-typedef struct ht cpp_hash_table;
-typedef struct ht_identifier *hashnode;
-
-enum ht_lookup_option {HT_NO_INSERT = 0, HT_ALLOC};
-
-/* An identifier hash table for cpplib and the front ends.  */
-struct ht
-{
-  /* Identifiers are allocated from here.  */
-  struct obstack stack;
-
-  hashnode *entries;
-  /* Call back, allocate a node.  */
-  hashnode (*alloc_node) (cpp_hash_table *);
-  /* Call back, allocate something that hangs off a node like a cpp_macro.  
-     NULL means use the usual allocator.  */
-  void * (*alloc_subobject) (size_t);
-
-  unsigned int nslots;		/* Total slots in the entries array.  */
-  unsigned int nelements;	/* Number of live elements.  */
-
-  /* Link to reader, if any.  For the benefit of cpplib.  */
-  struct cpp_reader *pfile;
-
-  /* Table usage statistics.  */
-  unsigned int searches;
-  unsigned int collisions;
-
-  /* Should 'entries' be freed when it is no longer needed?  */
-  bool entries_owned;
-};
-
-/* Initialize the hashtable with 2 ^ order entries.  */
-extern cpp_hash_table *ht_create (unsigned int order);
-
-/* Frees all memory associated with a hash table.  */
-extern void ht_destroy (cpp_hash_table *);
-
-extern hashnode ht_lookup (cpp_hash_table *, const unsigned char *,
-			   size_t, enum ht_lookup_option);
-extern hashnode ht_lookup_with_hash (cpp_hash_table *, const unsigned char *,
-                                     size_t, unsigned int,
-                                     enum ht_lookup_option);
-#define HT_HASHSTEP(r, c) ((r) * 67 + ((c) - 113));
-#define HT_HASHFINISH(r, len) ((r) + (len))
-
-/* For all nodes in TABLE, make a callback.  The callback takes
-   TABLE->PFILE, the node, and a PTR, and the callback sequence stops
-   if the callback returns zero.  */
-typedef int (*ht_cb) (struct cpp_reader *, hashnode, const void *);
-extern void ht_forall (cpp_hash_table *, ht_cb, const void *);
-
-/* For all nodes in TABLE, call the callback.  If the callback returns
-   a nonzero value, the node is removed from the table.  */
-extern void ht_purge (cpp_hash_table *, ht_cb, const void *);
-
-/* Restore the hash table.  */
-extern void ht_load (cpp_hash_table *ht, hashnode *entries,
-		     unsigned int nslots, unsigned int nelements, bool own);
-
-/* Dump allocation statistics to stderr.  */
-extern void ht_dump_statistics (cpp_hash_table *);
-
-#endif /* LIBCPP_SYMTAB_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/sync-builtins.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/sync-builtins.def
deleted file mode 100644
index 2ed5e76..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/sync-builtins.def
+++ /dev/null
@@ -1,614 +0,0 @@
-/* This file contains the definitions and documentation for the
-   synchronization builtins used in the GNU compiler.
-   Copyright (C) 2005-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* Before including this file, you should define a macro:
-
-     DEF_SYNC_BUILTIN (ENUM, NAME, TYPE, ATTRS)
-
-   See builtins.def for details.  */
-
-/* Synchronization Primitives.  The "_N" version is the one that the user
-   is supposed to be using.  It's overloaded, and is resolved to one of the
-   "_1" through "_16" versions, plus some extra casts.  */
-
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_ADD_N, "__sync_fetch_and_add",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_ADD_1, "__sync_fetch_and_add_1",
-		  BT_FN_I1_VPTR_I1, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_ADD_2, "__sync_fetch_and_add_2",
-		  BT_FN_I2_VPTR_I2, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_ADD_4, "__sync_fetch_and_add_4",
-		  BT_FN_I4_VPTR_I4, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_ADD_8, "__sync_fetch_and_add_8",
-		  BT_FN_I8_VPTR_I8, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_ADD_16, "__sync_fetch_and_add_16",
-		  BT_FN_I16_VPTR_I16, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_SUB_N, "__sync_fetch_and_sub",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_SUB_1, "__sync_fetch_and_sub_1",
-		  BT_FN_I1_VPTR_I1, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_SUB_2, "__sync_fetch_and_sub_2",
-		  BT_FN_I2_VPTR_I2, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_SUB_4, "__sync_fetch_and_sub_4",
-		  BT_FN_I4_VPTR_I4, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_SUB_8, "__sync_fetch_and_sub_8",
-		  BT_FN_I8_VPTR_I8, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_SUB_16, "__sync_fetch_and_sub_16",
-		  BT_FN_I16_VPTR_I16, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_OR_N, "__sync_fetch_and_or",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_OR_1, "__sync_fetch_and_or_1",
-		  BT_FN_I1_VPTR_I1, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_OR_2, "__sync_fetch_and_or_2",
-		  BT_FN_I2_VPTR_I2, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_OR_4, "__sync_fetch_and_or_4",
-		  BT_FN_I4_VPTR_I4, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_OR_8, "__sync_fetch_and_or_8",
-		  BT_FN_I8_VPTR_I8, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_OR_16, "__sync_fetch_and_or_16",
-		  BT_FN_I16_VPTR_I16, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_AND_N, "__sync_fetch_and_and",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_AND_1, "__sync_fetch_and_and_1",
-		  BT_FN_I1_VPTR_I1, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_AND_2, "__sync_fetch_and_and_2",
-		  BT_FN_I2_VPTR_I2, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_AND_4, "__sync_fetch_and_and_4",
-		  BT_FN_I4_VPTR_I4, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_AND_8, "__sync_fetch_and_and_8",
-		  BT_FN_I8_VPTR_I8, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_AND_16, "__sync_fetch_and_and_16",
-		  BT_FN_I16_VPTR_I16, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_XOR_N, "__sync_fetch_and_xor",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_XOR_1, "__sync_fetch_and_xor_1",
-		  BT_FN_I1_VPTR_I1, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_XOR_2, "__sync_fetch_and_xor_2",
-		  BT_FN_I2_VPTR_I2, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_XOR_4, "__sync_fetch_and_xor_4",
-		  BT_FN_I4_VPTR_I4, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_XOR_8, "__sync_fetch_and_xor_8",
-		  BT_FN_I8_VPTR_I8, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_XOR_16, "__sync_fetch_and_xor_16",
-		  BT_FN_I16_VPTR_I16, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_NAND_N, "__sync_fetch_and_nand",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_NAND_1, "__sync_fetch_and_nand_1",
-		  BT_FN_I1_VPTR_I1, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_NAND_2, "__sync_fetch_and_nand_2",
-		  BT_FN_I2_VPTR_I2, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_NAND_4, "__sync_fetch_and_nand_4",
-		  BT_FN_I4_VPTR_I4, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_NAND_8, "__sync_fetch_and_nand_8",
-		  BT_FN_I8_VPTR_I8, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_FETCH_AND_NAND_16, "__sync_fetch_and_nand_16",
-		  BT_FN_I16_VPTR_I16, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_ADD_AND_FETCH_N, "__sync_add_and_fetch",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_ADD_AND_FETCH_1, "__sync_add_and_fetch_1",
-		  BT_FN_I1_VPTR_I1, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_ADD_AND_FETCH_2, "__sync_add_and_fetch_2",
-		  BT_FN_I2_VPTR_I2, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_ADD_AND_FETCH_4, "__sync_add_and_fetch_4",
-		  BT_FN_I4_VPTR_I4, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_ADD_AND_FETCH_8, "__sync_add_and_fetch_8",
-		  BT_FN_I8_VPTR_I8, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_ADD_AND_FETCH_16, "__sync_add_and_fetch_16",
-		  BT_FN_I16_VPTR_I16, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_SUB_AND_FETCH_N, "__sync_sub_and_fetch",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_SUB_AND_FETCH_1, "__sync_sub_and_fetch_1",
-		  BT_FN_I1_VPTR_I1, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_SUB_AND_FETCH_2, "__sync_sub_and_fetch_2",
-		  BT_FN_I2_VPTR_I2, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_SUB_AND_FETCH_4, "__sync_sub_and_fetch_4",
-		  BT_FN_I4_VPTR_I4, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_SUB_AND_FETCH_8, "__sync_sub_and_fetch_8",
-		  BT_FN_I8_VPTR_I8, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_SUB_AND_FETCH_16, "__sync_sub_and_fetch_16",
-		  BT_FN_I16_VPTR_I16, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_OR_AND_FETCH_N, "__sync_or_and_fetch",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_OR_AND_FETCH_1, "__sync_or_and_fetch_1",
-		  BT_FN_I1_VPTR_I1, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_OR_AND_FETCH_2, "__sync_or_and_fetch_2",
-		  BT_FN_I2_VPTR_I2, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_OR_AND_FETCH_4, "__sync_or_and_fetch_4",
-		  BT_FN_I4_VPTR_I4, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_OR_AND_FETCH_8, "__sync_or_and_fetch_8",
-		  BT_FN_I8_VPTR_I8, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_OR_AND_FETCH_16, "__sync_or_and_fetch_16",
-		  BT_FN_I16_VPTR_I16, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_AND_AND_FETCH_N, "__sync_and_and_fetch",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_AND_AND_FETCH_1, "__sync_and_and_fetch_1",
-		  BT_FN_I1_VPTR_I1, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_AND_AND_FETCH_2, "__sync_and_and_fetch_2",
-		  BT_FN_I2_VPTR_I2, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_AND_AND_FETCH_4, "__sync_and_and_fetch_4",
-		  BT_FN_I4_VPTR_I4, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_AND_AND_FETCH_8, "__sync_and_and_fetch_8",
-		  BT_FN_I8_VPTR_I8, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_AND_AND_FETCH_16, "__sync_and_and_fetch_16",
-		  BT_FN_I16_VPTR_I16, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_XOR_AND_FETCH_N, "__sync_xor_and_fetch",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_XOR_AND_FETCH_1, "__sync_xor_and_fetch_1",
-		  BT_FN_I1_VPTR_I1, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_XOR_AND_FETCH_2, "__sync_xor_and_fetch_2",
-		  BT_FN_I2_VPTR_I2, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_XOR_AND_FETCH_4, "__sync_xor_and_fetch_4",
-		  BT_FN_I4_VPTR_I4, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_XOR_AND_FETCH_8, "__sync_xor_and_fetch_8",
-		  BT_FN_I8_VPTR_I8, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_XOR_AND_FETCH_16, "__sync_xor_and_fetch_16",
-		  BT_FN_I16_VPTR_I16, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_NAND_AND_FETCH_N, "__sync_nand_and_fetch",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_NAND_AND_FETCH_1, "__sync_nand_and_fetch_1",
-		  BT_FN_I1_VPTR_I1, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_NAND_AND_FETCH_2, "__sync_nand_and_fetch_2",
-		  BT_FN_I2_VPTR_I2, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_NAND_AND_FETCH_4, "__sync_nand_and_fetch_4",
-		  BT_FN_I4_VPTR_I4, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_NAND_AND_FETCH_8, "__sync_nand_and_fetch_8",
-		  BT_FN_I8_VPTR_I8, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_NAND_AND_FETCH_16, "__sync_nand_and_fetch_16",
-		  BT_FN_I16_VPTR_I16, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_N,
-		  "__sync_bool_compare_and_swap",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_1,
-		  "__sync_bool_compare_and_swap_1",
-		  BT_FN_BOOL_VPTR_I1_I1, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_2,
-		  "__sync_bool_compare_and_swap_2",
-		  BT_FN_BOOL_VPTR_I2_I2, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_4,
-		  "__sync_bool_compare_and_swap_4",
-		  BT_FN_BOOL_VPTR_I4_I4, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_8,
-		  "__sync_bool_compare_and_swap_8",
-		  BT_FN_BOOL_VPTR_I8_I8, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_16,
-		  "__sync_bool_compare_and_swap_16",
-		  BT_FN_BOOL_VPTR_I16_I16, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_N,
-		  "__sync_val_compare_and_swap",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_1,
-		  "__sync_val_compare_and_swap_1",
-		  BT_FN_I1_VPTR_I1_I1, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_2,
-		  "__sync_val_compare_and_swap_2",
-		  BT_FN_I2_VPTR_I2_I2, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_4,
-		  "__sync_val_compare_and_swap_4",
-		  BT_FN_I4_VPTR_I4_I4, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_8,
-		  "__sync_val_compare_and_swap_8",
-		  BT_FN_I8_VPTR_I8_I8, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_16,
-		  "__sync_val_compare_and_swap_16",
-		  BT_FN_I16_VPTR_I16_I16, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_LOCK_TEST_AND_SET_N,
-		  "__sync_lock_test_and_set",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_LOCK_TEST_AND_SET_1,
-		  "__sync_lock_test_and_set_1",
-		  BT_FN_I1_VPTR_I1, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_LOCK_TEST_AND_SET_2,
-		  "__sync_lock_test_and_set_2",
-		  BT_FN_I2_VPTR_I2, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_LOCK_TEST_AND_SET_4,
-		  "__sync_lock_test_and_set_4",
-		  BT_FN_I4_VPTR_I4, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_LOCK_TEST_AND_SET_8,
-		  "__sync_lock_test_and_set_8",
-		  BT_FN_I8_VPTR_I8, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_LOCK_TEST_AND_SET_16,
-		  "__sync_lock_test_and_set_16",
-		  BT_FN_I16_VPTR_I16, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_LOCK_RELEASE_N, "__sync_lock_release",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_LOCK_RELEASE_1, "__sync_lock_release_1",
-		  BT_FN_VOID_VPTR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_LOCK_RELEASE_2, "__sync_lock_release_2",
-		  BT_FN_VOID_VPTR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_LOCK_RELEASE_4, "__sync_lock_release_4",
-		  BT_FN_VOID_VPTR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_LOCK_RELEASE_8, "__sync_lock_release_8",
-		  BT_FN_VOID_VPTR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_LOCK_RELEASE_16, "__sync_lock_release_16",
-		  BT_FN_VOID_VPTR, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_SYNC_SYNCHRONIZE, "__sync_synchronize",
-		  BT_FN_VOID, ATTR_NOTHROWCALL_LEAF_LIST)
-
-/* __sync* builtins for the C++ memory model.  */
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_TEST_AND_SET, "__atomic_test_and_set",
-		  BT_FN_BOOL_VPTR_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_CLEAR, "__atomic_clear", BT_FN_VOID_VPTR_INT,
-		  ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_EXCHANGE,
-		  "__atomic_exchange",
-		  BT_FN_VOID_SIZE_VPTR_PTR_PTR_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_EXCHANGE_N,
-		  "__atomic_exchange_n",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_EXCHANGE_1,
-		  "__atomic_exchange_1",
-		  BT_FN_I1_VPTR_I1_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_EXCHANGE_2,
-		  "__atomic_exchange_2",
-		  BT_FN_I2_VPTR_I2_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_EXCHANGE_4,
-		  "__atomic_exchange_4",
-		  BT_FN_I4_VPTR_I4_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_EXCHANGE_8,
-		  "__atomic_exchange_8",
-		  BT_FN_I8_VPTR_I8_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_EXCHANGE_16,
-		  "__atomic_exchange_16",
-		  BT_FN_I16_VPTR_I16_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_LOAD,
-		  "__atomic_load",
-		  BT_FN_VOID_SIZE_CONST_VPTR_PTR_INT,
-		  ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_LOAD_N,
-		  "__atomic_load_n",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_LOAD_1,
-		  "__atomic_load_1",
-		  BT_FN_I1_CONST_VPTR_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_LOAD_2,
-		  "__atomic_load_2",
-		  BT_FN_I2_CONST_VPTR_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_LOAD_4,
-		  "__atomic_load_4",
-		  BT_FN_I4_CONST_VPTR_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_LOAD_8,
-		  "__atomic_load_8",
-		  BT_FN_I8_CONST_VPTR_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_LOAD_16,
-		  "__atomic_load_16",
-		  BT_FN_I16_CONST_VPTR_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_COMPARE_EXCHANGE,
-		  "__atomic_compare_exchange",
-		  BT_FN_BOOL_SIZE_VPTR_PTR_PTR_INT_INT,
-		  ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_COMPARE_EXCHANGE_N,
-		  "__atomic_compare_exchange_n",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_COMPARE_EXCHANGE_1,
-		  "__atomic_compare_exchange_1",
-		  BT_FN_BOOL_VPTR_PTR_I1_BOOL_INT_INT,
-		  ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_COMPARE_EXCHANGE_2,
-		  "__atomic_compare_exchange_2",
-		  BT_FN_BOOL_VPTR_PTR_I2_BOOL_INT_INT,
-		  ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_COMPARE_EXCHANGE_4,
-		  "__atomic_compare_exchange_4",
-		  BT_FN_BOOL_VPTR_PTR_I4_BOOL_INT_INT,
-		  ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_COMPARE_EXCHANGE_8,
-		  "__atomic_compare_exchange_8",
-		  BT_FN_BOOL_VPTR_PTR_I8_BOOL_INT_INT,
-		  ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_COMPARE_EXCHANGE_16,
-		  "__atomic_compare_exchange_16",
-		  BT_FN_BOOL_VPTR_PTR_I16_BOOL_INT_INT,
-		  ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_STORE,
-		  "__atomic_store",
-		  BT_FN_VOID_SIZE_VPTR_PTR_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_STORE_N,
-		  "__atomic_store_n",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_STORE_1,
-		  "__atomic_store_1",
-		  BT_FN_VOID_VPTR_I1_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_STORE_2,
-		  "__atomic_store_2",
-		  BT_FN_VOID_VPTR_I2_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_STORE_4,
-		  "__atomic_store_4",
-		  BT_FN_VOID_VPTR_I4_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_STORE_8,
-		  "__atomic_store_8",
-		  BT_FN_VOID_VPTR_I8_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_STORE_16,
-		  "__atomic_store_16",
-		  BT_FN_VOID_VPTR_I16_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_ADD_FETCH_N,
-		  "__atomic_add_fetch",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_ADD_FETCH_1,
-		  "__atomic_add_fetch_1",
-		  BT_FN_I1_VPTR_I1_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_ADD_FETCH_2,
-		  "__atomic_add_fetch_2",
-		  BT_FN_I2_VPTR_I2_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_ADD_FETCH_4,
-		  "__atomic_add_fetch_4",
-		  BT_FN_I4_VPTR_I4_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_ADD_FETCH_8,
-		  "__atomic_add_fetch_8",
-		  BT_FN_I8_VPTR_I8_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_ADD_FETCH_16,
-		  "__atomic_add_fetch_16",
-		  BT_FN_I16_VPTR_I16_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_SUB_FETCH_N,
-		  "__atomic_sub_fetch",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_SUB_FETCH_1,
-		  "__atomic_sub_fetch_1",
-		  BT_FN_I1_VPTR_I1_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_SUB_FETCH_2,
-		  "__atomic_sub_fetch_2",
-		  BT_FN_I2_VPTR_I2_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_SUB_FETCH_4,
-		  "__atomic_sub_fetch_4",
-		  BT_FN_I4_VPTR_I4_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_SUB_FETCH_8,
-		  "__atomic_sub_fetch_8",
-		  BT_FN_I8_VPTR_I8_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_SUB_FETCH_16,
-		  "__atomic_sub_fetch_16",
-		  BT_FN_I16_VPTR_I16_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_AND_FETCH_N,
-		  "__atomic_and_fetch",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_AND_FETCH_1,
-		  "__atomic_and_fetch_1",
-		  BT_FN_I1_VPTR_I1_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_AND_FETCH_2,
-		  "__atomic_and_fetch_2",
-		  BT_FN_I2_VPTR_I2_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_AND_FETCH_4,
-		  "__atomic_and_fetch_4",
-		  BT_FN_I4_VPTR_I4_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_AND_FETCH_8,
-		  "__atomic_and_fetch_8",
-		  BT_FN_I8_VPTR_I8_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_AND_FETCH_16,
-		  "__atomic_and_fetch_16",
-		  BT_FN_I16_VPTR_I16_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_NAND_FETCH_N,
-		  "__atomic_nand_fetch",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_NAND_FETCH_1,
-		  "__atomic_nand_fetch_1",
-		  BT_FN_I1_VPTR_I1_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_NAND_FETCH_2,
-		  "__atomic_nand_fetch_2",
-		  BT_FN_I2_VPTR_I2_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_NAND_FETCH_4,
-		  "__atomic_nand_fetch_4",
-		  BT_FN_I4_VPTR_I4_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_NAND_FETCH_8,
-		  "__atomic_nand_fetch_8",
-		  BT_FN_I8_VPTR_I8_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_NAND_FETCH_16,
-		  "__atomic_nand_fetch_16",
-		  BT_FN_I16_VPTR_I16_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_XOR_FETCH_N,
-		  "__atomic_xor_fetch",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_XOR_FETCH_1,
-		  "__atomic_xor_fetch_1",
-		  BT_FN_I1_VPTR_I1_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_XOR_FETCH_2,
-		  "__atomic_xor_fetch_2",
-		  BT_FN_I2_VPTR_I2_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_XOR_FETCH_4,
-		  "__atomic_xor_fetch_4",
-		  BT_FN_I4_VPTR_I4_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_XOR_FETCH_8,
-		  "__atomic_xor_fetch_8",
-		  BT_FN_I8_VPTR_I8_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_XOR_FETCH_16,
-		  "__atomic_xor_fetch_16",
-		  BT_FN_I16_VPTR_I16_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_OR_FETCH_N,
-		  "__atomic_or_fetch",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_OR_FETCH_1,
-		  "__atomic_or_fetch_1",
-		  BT_FN_I1_VPTR_I1_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_OR_FETCH_2,
-		  "__atomic_or_fetch_2",
-		  BT_FN_I2_VPTR_I2_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_OR_FETCH_4,
-		  "__atomic_or_fetch_4",
-		  BT_FN_I4_VPTR_I4_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_OR_FETCH_8,
-		  "__atomic_or_fetch_8",
-		  BT_FN_I8_VPTR_I8_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_OR_FETCH_16,
-		  "__atomic_or_fetch_16",
-		  BT_FN_I16_VPTR_I16_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_ADD_N,
-		  "__atomic_fetch_add",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_ADD_1,
-		  "__atomic_fetch_add_1",
-		  BT_FN_I1_VPTR_I1_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_ADD_2,
-		  "__atomic_fetch_add_2",
-		  BT_FN_I2_VPTR_I2_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_ADD_4,
-		  "__atomic_fetch_add_4",
-		  BT_FN_I4_VPTR_I4_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_ADD_8,
-		  "__atomic_fetch_add_8",
-		  BT_FN_I8_VPTR_I8_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_ADD_16,
-		  "__atomic_fetch_add_16",
-		  BT_FN_I16_VPTR_I16_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_SUB_N,
-		  "__atomic_fetch_sub",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_SUB_1,
-		  "__atomic_fetch_sub_1",
-		  BT_FN_I1_VPTR_I1_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_SUB_2,
-		  "__atomic_fetch_sub_2",
-		  BT_FN_I2_VPTR_I2_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_SUB_4,
-		  "__atomic_fetch_sub_4",
-		  BT_FN_I4_VPTR_I4_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_SUB_8,
-		  "__atomic_fetch_sub_8",
-		  BT_FN_I8_VPTR_I8_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_SUB_16,
-		  "__atomic_fetch_sub_16",
-		  BT_FN_I16_VPTR_I16_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_AND_N,
-		  "__atomic_fetch_and",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_AND_1,
-		  "__atomic_fetch_and_1",
-		  BT_FN_I1_VPTR_I1_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_AND_2,
-		  "__atomic_fetch_and_2",
-		  BT_FN_I2_VPTR_I2_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_AND_4,
-		  "__atomic_fetch_and_4",
-		  BT_FN_I4_VPTR_I4_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_AND_8,
-		  "__atomic_fetch_and_8",
-		  BT_FN_I8_VPTR_I8_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_AND_16,
-		  "__atomic_fetch_and_16",
-		  BT_FN_I16_VPTR_I16_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_NAND_N,
-		  "__atomic_fetch_nand",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_NAND_1,
-		  "__atomic_fetch_nand_1",
-		  BT_FN_I1_VPTR_I1_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_NAND_2,
-		  "__atomic_fetch_nand_2",
-		  BT_FN_I2_VPTR_I2_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_NAND_4,
-		  "__atomic_fetch_nand_4",
-		  BT_FN_I4_VPTR_I4_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_NAND_8,
-		  "__atomic_fetch_nand_8",
-		  BT_FN_I8_VPTR_I8_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_NAND_16,
-		  "__atomic_fetch_nand_16",
-		  BT_FN_I16_VPTR_I16_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_XOR_N,
-		  "__atomic_fetch_xor",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_XOR_1,
-		  "__atomic_fetch_xor_1",
-		  BT_FN_I1_VPTR_I1_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_XOR_2,
-		  "__atomic_fetch_xor_2",
-		  BT_FN_I2_VPTR_I2_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_XOR_4,
-		  "__atomic_fetch_xor_4",
-		  BT_FN_I4_VPTR_I4_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_XOR_8,
-		  "__atomic_fetch_xor_8",
-		  BT_FN_I8_VPTR_I8_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_XOR_16,
-		  "__atomic_fetch_xor_16",
-		  BT_FN_I16_VPTR_I16_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_OR_N,
-		  "__atomic_fetch_or",
-		  BT_FN_VOID_VAR, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_OR_1,
-		  "__atomic_fetch_or_1",
-		  BT_FN_I1_VPTR_I1_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_OR_2,
-		  "__atomic_fetch_or_2",
-		  BT_FN_I2_VPTR_I2_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_OR_4,
-		  "__atomic_fetch_or_4",
-		  BT_FN_I4_VPTR_I4_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_OR_8,
-		  "__atomic_fetch_or_8",
-		  BT_FN_I8_VPTR_I8_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FETCH_OR_16,
-		  "__atomic_fetch_or_16",
-		  BT_FN_I16_VPTR_I16_INT, ATTR_NOTHROWCALL_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_ALWAYS_LOCK_FREE,
-		  "__atomic_always_lock_free",
-		  BT_FN_BOOL_SIZE_CONST_VPTR, ATTR_CONST_NOTHROW_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_IS_LOCK_FREE,
-		  "__atomic_is_lock_free",
-		  BT_FN_BOOL_SIZE_CONST_VPTR, ATTR_CONST_NOTHROW_LEAF_LIST)
-
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_THREAD_FENCE,
-		  "__atomic_thread_fence",
-		  BT_FN_VOID_INT, ATTR_NOTHROW_LEAF_LIST)
-
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_SIGNAL_FENCE,
-		  "__atomic_signal_fence",
-		  BT_FN_VOID_INT, ATTR_NOTHROW_LEAF_LIST)
-
-/* This one is actually a function in libatomic and not expected to be
-   inlined, declared here for convenience of targets generating calls
-   to it.  */
-DEF_SYNC_BUILTIN (BUILT_IN_ATOMIC_FERAISEEXCEPT,
-		  "__atomic_feraiseexcept",
-		  BT_FN_VOID_INT, ATTR_LEAF_LIST)
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/system.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/system.h
deleted file mode 100644
index 42bc509..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/system.h
+++ /dev/null
@@ -1,1066 +0,0 @@
-/* Get common system includes and various definitions and declarations based
-   on autoconf macros.
-   Copyright (C) 1998-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-
-#ifndef GCC_SYSTEM_H
-#define GCC_SYSTEM_H
-
-/* We must include stdarg.h before stdio.h.  */
-#include <stdarg.h>
-
-#ifndef va_copy
-# ifdef __va_copy
-#   define va_copy(d,s)  __va_copy (d, s)
-# else
-#   define va_copy(d,s)  ((d) = (s))
-# endif
-#endif
-
-#ifdef HAVE_STDDEF_H
-# include <stddef.h>
-#endif
-
-#include <stdio.h>
-
-/* Define a generic NULL if one hasn't already been defined.  */
-#ifndef NULL
-#define NULL 0
-#endif
-
-/* Use the unlocked open routines from libiberty.  */
-
-/* Some of these are #define on some systems, e.g. on AIX to redirect
-   the names to 64bit capable functions for LARGE_FILES support. These
-   redefs are pointless here so we can override them.  */
-
-#undef fopen 
-#undef freopen 
-
-#define fopen(PATH, MODE) fopen_unlocked (PATH, MODE)
-#define fdopen(FILDES, MODE) fdopen_unlocked (FILDES, MODE)
-#define freopen(PATH, MODE, STREAM) freopen_unlocked (PATH, MODE, STREAM)
-
-/* The compiler is not a multi-threaded application and therefore we
-   do not have to use the locking functions.  In fact, using the locking
-   functions can cause the compiler to be significantly slower under
-   I/O bound conditions (such as -g -O0 on very large source files).
-
-   HAVE_DECL_PUTC_UNLOCKED actually indicates whether or not the stdio
-   code is multi-thread safe by default.  If it is set to 0, then do
-   not worry about using the _unlocked functions.
-
-   fputs_unlocked, fwrite_unlocked, and fprintf_unlocked are
-   extensions and need to be prototyped by hand (since we do not
-   define _GNU_SOURCE).  */
-
-#if defined HAVE_DECL_PUTC_UNLOCKED && HAVE_DECL_PUTC_UNLOCKED
-
-# ifdef HAVE_PUTC_UNLOCKED
-#  undef putc
-#  define putc(C, Stream) putc_unlocked (C, Stream)
-# endif
-# ifdef HAVE_PUTCHAR_UNLOCKED
-#  undef putchar
-#  define putchar(C) putchar_unlocked (C)
-# endif
-# ifdef HAVE_GETC_UNLOCKED
-#  undef getc
-#  define getc(Stream) getc_unlocked (Stream)
-# endif
-# ifdef HAVE_GETCHAR_UNLOCKED
-#  undef getchar
-#  define getchar() getchar_unlocked ()
-# endif
-# ifdef HAVE_FPUTC_UNLOCKED
-#  undef fputc
-#  define fputc(C, Stream) fputc_unlocked (C, Stream)
-# endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-# ifdef HAVE_CLEARERR_UNLOCKED
-#  undef clearerr
-#  define clearerr(Stream) clearerr_unlocked (Stream)
-#  if defined (HAVE_DECL_CLEARERR_UNLOCKED) && !HAVE_DECL_CLEARERR_UNLOCKED
-extern void clearerr_unlocked (FILE *);
-#  endif
-# endif
-# ifdef HAVE_FEOF_UNLOCKED
-#  undef feof
-#  define feof(Stream) feof_unlocked (Stream)
-#  if defined (HAVE_DECL_FEOF_UNLOCKED) && !HAVE_DECL_FEOF_UNLOCKED
-extern int feof_unlocked (FILE *);
-#  endif
-# endif
-# ifdef HAVE_FILENO_UNLOCKED
-#  undef fileno
-#  define fileno(Stream) fileno_unlocked (Stream)
-#  if defined (HAVE_DECL_FILENO_UNLOCKED) && !HAVE_DECL_FILENO_UNLOCKED
-extern int fileno_unlocked (FILE *);
-#  endif
-# endif
-# ifdef HAVE_FFLUSH_UNLOCKED
-#  undef fflush
-#  define fflush(Stream) fflush_unlocked (Stream)
-#  if defined (HAVE_DECL_FFLUSH_UNLOCKED) && !HAVE_DECL_FFLUSH_UNLOCKED
-extern int fflush_unlocked (FILE *);
-#  endif
-# endif
-# ifdef HAVE_FGETC_UNLOCKED
-#  undef fgetc
-#  define fgetc(Stream) fgetc_unlocked (Stream)
-#  if defined (HAVE_DECL_FGETC_UNLOCKED) && !HAVE_DECL_FGETC_UNLOCKED
-extern int fgetc_unlocked (FILE *);
-#  endif
-# endif
-# ifdef HAVE_FGETS_UNLOCKED
-#  undef fgets
-#  define fgets(S, n, Stream) fgets_unlocked (S, n, Stream)
-#  if defined (HAVE_DECL_FGETS_UNLOCKED) && !HAVE_DECL_FGETS_UNLOCKED
-extern char *fgets_unlocked (char *, int, FILE *);
-#  endif
-# endif
-# ifdef HAVE_FPUTS_UNLOCKED
-#  undef fputs
-#  define fputs(String, Stream) fputs_unlocked (String, Stream)
-#  if defined (HAVE_DECL_FPUTS_UNLOCKED) && !HAVE_DECL_FPUTS_UNLOCKED
-extern int fputs_unlocked (const char *, FILE *);
-#  endif
-# endif
-# ifdef HAVE_FERROR_UNLOCKED
-#  undef ferror
-#  define ferror(Stream) ferror_unlocked (Stream)
-#  if defined (HAVE_DECL_FERROR_UNLOCKED) && !HAVE_DECL_FERROR_UNLOCKED
-extern int ferror_unlocked (FILE *);
-#  endif
-# endif
-# ifdef HAVE_FREAD_UNLOCKED
-#  undef fread
-#  define fread(Ptr, Size, N, Stream) fread_unlocked (Ptr, Size, N, Stream)
-#  if defined (HAVE_DECL_FREAD_UNLOCKED) && !HAVE_DECL_FREAD_UNLOCKED
-extern size_t fread_unlocked (void *, size_t, size_t, FILE *);
-#  endif
-# endif
-# ifdef HAVE_FWRITE_UNLOCKED
-#  undef fwrite
-#  define fwrite(Ptr, Size, N, Stream) fwrite_unlocked (Ptr, Size, N, Stream)
-#  if defined (HAVE_DECL_FWRITE_UNLOCKED) && !HAVE_DECL_FWRITE_UNLOCKED
-extern size_t fwrite_unlocked (const void *, size_t, size_t, FILE *);
-#  endif
-# endif
-# ifdef HAVE_FPRINTF_UNLOCKED
-#  undef fprintf
-/* We can't use a function-like macro here because we don't know if
-   we have varargs macros.  */
-#  define fprintf fprintf_unlocked
-#  if defined (HAVE_DECL_FPRINTF_UNLOCKED) && !HAVE_DECL_FPRINTF_UNLOCKED
-extern int fprintf_unlocked (FILE *, const char *, ...);
-#  endif
-# endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
-/* ??? Glibc's fwrite/fread_unlocked macros cause
-   "warning: signed and unsigned type in conditional expression".  */
-#undef fread_unlocked
-#undef fwrite_unlocked
-
-/* There are an extraordinary number of issues with <ctype.h>.
-   The last straw is that it varies with the locale.  Use libiberty's
-   replacement instead.  */
-#include "safe-ctype.h"
-
-#include <sys/types.h>
-
-#include <errno.h>
-
-#if !defined (errno) && defined (HAVE_DECL_ERRNO) && !HAVE_DECL_ERRNO
-extern int errno;
-#endif
-
-#ifdef __cplusplus
-# include <cstring>
-#endif
-
-/* Some of glibc's string inlines cause warnings.  Plus we'd rather
-   rely on (and therefore test) GCC's string builtins.  */
-#define __NO_STRING_INLINES
-
-#ifdef STRING_WITH_STRINGS
-# include <string.h>
-# include <strings.h>
-#else
-# ifdef HAVE_STRING_H
-#  include <string.h>
-# else
-#  ifdef HAVE_STRINGS_H
-#   include <strings.h>
-#  endif
-# endif
-#endif
-
-#ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-#endif
-
-/* When compiling C++ we need to include <cstdlib> as well as <stdlib.h> so
-   that it is processed before we poison "malloc"; otherwise, if a source
-   file uses a standard library header that includes <cstdlib>, we will get
-   an error about 'using std::malloc'.  */
-#ifdef __cplusplus
-#include <cstdlib>
-#endif
-
-/* Undef vec_free from AIX stdlib.h header which conflicts with vec.h.  */
-#undef vec_free
-
-/* If we don't have an overriding definition, set SUCCESS_EXIT_CODE and
-   FATAL_EXIT_CODE to EXIT_SUCCESS and EXIT_FAILURE respectively,
-   or 0 and 1 if those macros are not defined.  */
-#ifndef SUCCESS_EXIT_CODE
-# ifdef EXIT_SUCCESS
-#  define SUCCESS_EXIT_CODE EXIT_SUCCESS
-# else
-#  define SUCCESS_EXIT_CODE 0
-# endif
-#endif
-
-#ifndef FATAL_EXIT_CODE
-# ifdef EXIT_FAILURE
-#  define FATAL_EXIT_CODE EXIT_FAILURE
-# else
-#  define FATAL_EXIT_CODE 1
-# endif
-#endif
-
-#define ICE_EXIT_CODE 4
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef HAVE_SYS_PARAM_H
-# include <sys/param.h>
-/* We use these identifiers later and they appear in some vendor param.h's.  */
-# undef PREFETCH
-# undef m_slot
-#endif
-
-#if HAVE_LIMITS_H
-# include <limits.h>
-#endif
-
-/* A macro to determine whether a VALUE lies inclusively within a
-   certain range without evaluating the VALUE more than once.  This
-   macro won't warn if the VALUE is unsigned and the LOWER bound is
-   zero, as it would e.g. with "VALUE >= 0 && ...".  Note the LOWER
-   bound *is* evaluated twice, and LOWER must not be greater than
-   UPPER.  However the bounds themselves can be either positive or
-   negative.  */
-#define IN_RANGE(VALUE, LOWER, UPPER) \
-  ((unsigned HOST_WIDE_INT) (VALUE) - (unsigned HOST_WIDE_INT) (LOWER) \
-   <= (unsigned HOST_WIDE_INT) (UPPER) - (unsigned HOST_WIDE_INT) (LOWER))
-
-/* Infrastructure for defining missing _MAX and _MIN macros.  Note that
-   macros defined with these cannot be used in #if.  */
-
-/* The extra casts work around common compiler bugs.  */
-#define INTTYPE_SIGNED(t) (! ((t) 0 < (t) -1))
-/* The outer cast is needed to work around a bug in Cray C 5.0.3.0.
-   It is necessary at least when t == time_t.  */
-#define INTTYPE_MINIMUM(t) ((t) (INTTYPE_SIGNED (t) \
-                             ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) : (t) 0))
-#define INTTYPE_MAXIMUM(t) ((t) (~ (t) 0 - INTTYPE_MINIMUM (t)))
-
-/* Use that infrastructure to provide a few constants.  */
-#ifndef UCHAR_MAX
-# define UCHAR_MAX INTTYPE_MAXIMUM (unsigned char)
-#endif
-
-#ifdef TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  ifdef HAVE_TIME_H
-#   include <time.h>
-#  endif
-# endif
-#endif
-
-#ifdef HAVE_FCNTL_H
-# include <fcntl.h>
-#else
-# ifdef HAVE_SYS_FILE_H
-#  include <sys/file.h>
-# endif
-#endif
-
-#ifndef SEEK_SET
-# define SEEK_SET 0
-# define SEEK_CUR 1
-# define SEEK_END 2
-#endif
-#ifndef F_OK
-# define F_OK 0
-# define X_OK 1
-# define W_OK 2
-# define R_OK 4
-#endif
-#ifndef O_RDONLY
-# define O_RDONLY 0
-#endif
-#ifndef O_WRONLY
-# define O_WRONLY 1
-#endif
-#ifndef O_BINARY
-# define O_BINARY 0
-#endif
-
-/* Some systems define these in, e.g., param.h.  We undefine these names
-   here to avoid the warnings.  We prefer to use our definitions since we
-   know they are correct.  */
-
-#undef MIN
-#undef MAX
-#define MIN(X,Y) ((X) < (Y) ? (X) : (Y))
-#define MAX(X,Y) ((X) > (Y) ? (X) : (Y))
-
-/* Returns the least number N such that N * Y >= X.  */
-#define CEIL(x,y) (((x) + (y) - 1) / (y))
-
-#ifdef HAVE_SYS_WAIT_H
-#include <sys/wait.h>
-#endif
-
-#ifndef WIFSIGNALED
-#define WIFSIGNALED(S) (((S) & 0xff) != 0 && ((S) & 0xff) != 0x7f)
-#endif
-#ifndef WTERMSIG
-#define WTERMSIG(S) ((S) & 0x7f)
-#endif
-#ifndef WIFEXITED
-#define WIFEXITED(S) (((S) & 0xff) == 0)
-#endif
-#ifndef WEXITSTATUS
-#define WEXITSTATUS(S) (((S) & 0xff00) >> 8)
-#endif
-#ifndef WSTOPSIG
-#define WSTOPSIG WEXITSTATUS
-#endif
-#ifndef WCOREDUMP
-#define WCOREDUMP(S) ((S) & WCOREFLG)
-#endif
-#ifndef WCOREFLG
-#define WCOREFLG 0200
-#endif
-
-#include <signal.h>
-#if !defined (SIGCHLD) && defined (SIGCLD)
-# define SIGCHLD SIGCLD
-#endif
-
-#ifdef HAVE_SYS_MMAN_H
-# include <sys/mman.h>
-#endif
-
-#ifndef MAP_FAILED
-# define MAP_FAILED ((void *)-1)
-#endif
-
-#if !defined (MAP_ANONYMOUS) && defined (MAP_ANON)
-# define MAP_ANONYMOUS MAP_ANON
-#endif
-
-#ifdef HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
-#endif
-
-#ifdef HAVE_SYS_TIMES_H
-# include <sys/times.h>
-#endif
-
-/* The HAVE_DECL_* macros are three-state, undefined, 0 or 1.  If they
-   are defined to 0 then we must provide the relevant declaration
-   here.  These checks will be in the undefined state while configure
-   is running so be careful to test "defined (HAVE_DECL_*)".  */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if defined (HAVE_DECL_ATOF) && !HAVE_DECL_ATOF
-extern double atof (const char *);
-#endif
-
-#if defined (HAVE_DECL_ATOL) && !HAVE_DECL_ATOL
-extern long atol (const char *);
-#endif
-
-#if defined (HAVE_DECL_FREE) && !HAVE_DECL_FREE
-extern void free (void *);
-#endif
-
-#if defined (HAVE_DECL_GETCWD) && !HAVE_DECL_GETCWD
-extern char *getcwd (char *, size_t);
-#endif
-
-#if defined (HAVE_DECL_GETENV) && !HAVE_DECL_GETENV
-extern char *getenv (const char *);
-#endif
-
-#if defined (HAVE_DECL_GETOPT) && !HAVE_DECL_GETOPT
-extern int getopt (int, char * const *, const char *);
-#endif
-
-#if defined (HAVE_DECL_GETPAGESIZE) && !HAVE_DECL_GETPAGESIZE
-extern int getpagesize (void);
-#endif
-
-#if defined (HAVE_DECL_GETWD) && !HAVE_DECL_GETWD
-extern char *getwd (char *);
-#endif
-
-#if defined (HAVE_DECL_SBRK) && !HAVE_DECL_SBRK
-extern void *sbrk (int);
-#endif
-
-#if defined (HAVE_DECL_STRSTR) && !HAVE_DECL_STRSTR
-extern char *strstr (const char *, const char *);
-#endif
-
-#if defined (HAVE_DECL_STPCPY) && !HAVE_DECL_STPCPY
-extern char *stpcpy (char *, const char *);
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#ifdef HAVE_MALLOC_H
-#include <malloc.h>
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if defined (HAVE_DECL_MALLOC) && !HAVE_DECL_MALLOC
-extern void *malloc (size_t);
-#endif
-
-#if defined (HAVE_DECL_CALLOC) && !HAVE_DECL_CALLOC
-extern void *calloc (size_t, size_t);
-#endif
-
-#if defined (HAVE_DECL_REALLOC) && !HAVE_DECL_REALLOC
-extern void *realloc (void *, size_t);
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#ifdef HAVE_STDINT_H
-#include <stdint.h>
-#endif
-
-#ifdef HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* If the system doesn't provide strsignal, we get it defined in
-   libiberty but no declaration is supplied.  */
-#if !defined (HAVE_STRSIGNAL) \
-    || (defined (HAVE_DECL_STRSIGNAL) && !HAVE_DECL_STRSIGNAL)
-# ifndef strsignal
-extern const char *strsignal (int);
-# endif
-#endif
-
-#ifdef HAVE_GETRLIMIT
-# if defined (HAVE_DECL_GETRLIMIT) && !HAVE_DECL_GETRLIMIT
-#  ifndef getrlimit
-struct rlimit;
-extern int getrlimit (int, struct rlimit *);
-#  endif
-# endif
-#endif
-
-#ifdef HAVE_SETRLIMIT
-# if defined (HAVE_DECL_SETRLIMIT) && !HAVE_DECL_SETRLIMIT
-#  ifndef setrlimit
-struct rlimit;
-extern int setrlimit (int, const struct rlimit *);
-#  endif
-# endif
-#endif
-
-#if defined (HAVE_DECL_ABORT) && !HAVE_DECL_ABORT
-extern void abort (void);
-#endif
-
-#if defined (HAVE_DECL_SNPRINTF) && !HAVE_DECL_SNPRINTF
-extern int snprintf (char *, size_t, const char *, ...);
-#endif
-
-#if defined (HAVE_DECL_VSNPRINTF) && !HAVE_DECL_VSNPRINTF
-extern int vsnprintf (char *, size_t, const char *, va_list);
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-/* 1 if we have C99 designated initializers.  */
-#if !defined(HAVE_DESIGNATED_INITIALIZERS)
-#define HAVE_DESIGNATED_INITIALIZERS \
-  (((GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L)) \
-   && !defined(__cplusplus))
-#endif
-
-#if !defined(HAVE_DESIGNATED_UNION_INITIALIZERS)
-#define HAVE_DESIGNATED_UNION_INITIALIZERS \
-  (((GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L)) \
-   && (!defined(__cplusplus) || (GCC_VERSION >= 4007)))
-#endif
-
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-
-/* Test if something is a normal file.  */
-#ifndef S_ISREG
-#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
-#endif
-
-/* Test if something is a directory.  */
-#ifndef S_ISDIR
-#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
-#endif
-
-/* Test if something is a character special file.  */
-#ifndef S_ISCHR
-#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
-#endif
-
-/* Test if something is a block special file.  */
-#ifndef S_ISBLK
-#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
-#endif
-
-/* Test if something is a socket.  */
-#ifndef S_ISSOCK
-# ifdef S_IFSOCK
-#   define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
-# else
-#   define S_ISSOCK(m) 0
-# endif
-#endif
-
-/* Test if something is a FIFO.  */
-#ifndef S_ISFIFO
-# ifdef S_IFIFO
-#  define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
-# else
-#  define S_ISFIFO(m) 0
-# endif
-#endif
-
-/* Define well known filenos if the system does not define them.  */
-#ifndef STDIN_FILENO
-# define STDIN_FILENO   0
-#endif
-#ifndef STDOUT_FILENO
-# define STDOUT_FILENO  1
-#endif
-#ifndef STDERR_FILENO
-# define STDERR_FILENO  2
-#endif
-
-/* Some systems have mkdir that takes a single argument.  */
-#ifdef MKDIR_TAKES_ONE_ARG
-# define mkdir(a,b) mkdir (a)
-#endif
-
-#ifndef HAVE_KILL
-# define kill(p,s) raise (s)
-#endif
-
-/* Provide a way to print an address via printf.  */
-#ifndef HOST_PTR_PRINTF
-#define HOST_PTR_PRINTF "%p"
-#endif /* ! HOST_PTR_PRINTF */
-
-/* By default, colon separates directories in a path.  */
-#ifndef PATH_SEPARATOR
-#define PATH_SEPARATOR ':'
-#endif
-
-/* Filename handling macros.  */
-#include "filenames.h"
-
-/* These should be phased out in favor of IS_DIR_SEPARATOR, where possible.  */
-#ifndef DIR_SEPARATOR
-# define DIR_SEPARATOR '/'
-# ifdef HAVE_DOS_BASED_FILE_SYSTEM
-#  define DIR_SEPARATOR_2 '\\'
-# endif
-#endif
-
-#if defined (ENABLE_PLUGIN) && defined (HAVE_DLFCN_H)
-/* If plugin support is enabled, we could use libdl.  */
-#include <dlfcn.h>
-#endif
-
-/* Do not introduce a gmp.h dependency on the build system.  */
-#ifndef GENERATOR_FILE
-#include <gmp.h>
-#endif
-
-/* Get libiberty declarations.  */
-#include "libiberty.h"
-
-#undef FFS  /* Some systems predefine this symbol; don't let it interfere.  */
-#undef FLOAT /* Likewise.  */
-#undef ABS /* Likewise.  */
-#undef PC /* Likewise.  */
-
-/* Provide a default for the HOST_BIT_BUCKET.
-   This suffices for POSIX-like hosts.  */
-
-#ifndef HOST_BIT_BUCKET
-#define HOST_BIT_BUCKET "/dev/null"
-#endif
-
-#ifndef offsetof
-#define offsetof(TYPE, MEMBER)	((size_t) &((TYPE *) 0)->MEMBER)
-#endif
-
-/* Various error reporting routines want to use __FUNCTION__.  */
-#if (GCC_VERSION < 2007)
-#ifndef __FUNCTION__
-#define __FUNCTION__ "?"
-#endif /* ! __FUNCTION__ */
-#endif
-
-/* __builtin_expect(A, B) evaluates to A, but notifies the compiler that
-   the most likely value of A is B.  This feature was added at some point
-   between 2.95 and 3.0.  Let's use 3.0 as the lower bound for now.  */
-#if (GCC_VERSION < 3000)
-#define __builtin_expect(a, b) (a)
-#endif
-
-/* Redefine abort to report an internal error w/o coredump, and
-   reporting the location of the error in the source file.  */
-extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN;
-#define abort() fancy_abort (__FILE__, __LINE__, __FUNCTION__)
-
-/* Use gcc_assert(EXPR) to test invariants.  */
-#if ENABLE_ASSERT_CHECKING
-#define gcc_assert(EXPR) 						\
-   ((void)(!(EXPR) ? fancy_abort (__FILE__, __LINE__, __FUNCTION__), 0 : 0))
-#elif (GCC_VERSION >= 4005)
-#define gcc_assert(EXPR) 						\
-  ((void)(__builtin_expect (!(EXPR), 0) ? __builtin_unreachable (), 0 : 0))
-#else
-/* Include EXPR, so that unused variable warnings do not occur.  */
-#define gcc_assert(EXPR) ((void)(0 && (EXPR)))
-#endif
-
-#ifdef ENABLE_CHECKING
-#define gcc_checking_assert(EXPR) gcc_assert (EXPR)
-#else
-#define gcc_checking_assert(EXPR) ((void)(0 && (EXPR)))
-#endif
-
-/* Use gcc_unreachable() to mark unreachable locations (like an
-   unreachable default case of a switch.  Do not use gcc_assert(0).  */
-#if (GCC_VERSION >= 4005) && !ENABLE_ASSERT_CHECKING
-#define gcc_unreachable() __builtin_unreachable ()
-#else
-#define gcc_unreachable() (fancy_abort (__FILE__, __LINE__, __FUNCTION__))
-#endif
-
-/* Provide a fake boolean type.  We make no attempt to use the
-   C99 _Bool, as it may not be available in the bootstrap compiler,
-   and even if it is, it is liable to be buggy.
-   This must be after all inclusion of system headers, as some of
-   them will mess us up.  */
-
-#undef TRUE
-#undef FALSE
-
-#ifdef __cplusplus
-  /* Obsolete.  */
-# define TRUE true
-# define FALSE false
-#else /* !__cplusplus */
-# undef bool
-# undef true
-# undef false
-
-# define bool unsigned char
-# define true 1
-# define false 0
-
-  /* Obsolete.  */
-# define TRUE true
-# define FALSE false
-#endif /* !__cplusplus */
-
-/* Some compilers do not allow the use of unsigned char in bitfields.  */
-#define BOOL_BITFIELD unsigned int
-
-/* As the last action in this file, we poison the identifiers that
-   shouldn't be used.  Note, luckily gcc-3.0's token-based integrated
-   preprocessor won't trip on poisoned identifiers that arrive from
-   the expansion of macros.  E.g. #define strrchr rindex, won't error
-   if rindex is poisoned after this directive is issued and later on
-   strrchr is called.
-
-   Note: We define bypass macros for the few cases where we really
-   want to use the libc memory allocation routines.  Otherwise we
-   insist you use the "x" versions from libiberty.  */
-
-#define really_call_malloc malloc
-#define really_call_calloc calloc
-#define really_call_realloc realloc
-
-#if defined(FLEX_SCANNER) || defined(YYBISON) || defined(YYBYACC)
-/* Flex and bison use malloc and realloc.  Yuk.  Note that this means
-   really_call_* cannot be used in a .l or .y file.  */
-#define malloc xmalloc
-#define realloc xrealloc
-#endif
-
-#if (GCC_VERSION >= 3000)
-
-/* Note autoconf checks for prototype declarations and includes
-   system.h while doing so.  Only poison these tokens if actually
-   compiling gcc, so that the autoconf declaration tests for malloc
-   etc don't spuriously fail.  */
-#ifdef IN_GCC
-#undef calloc
-#undef strdup
- #pragma GCC poison calloc strdup
-
-#if !defined(FLEX_SCANNER) && !defined(YYBISON)
-#undef malloc
-#undef realloc
- #pragma GCC poison malloc realloc
-#endif
-
-/* The %m format should be used when GCC's main diagnostic functions
-   supporting %m are available, and xstrerror from libiberty
-   otherwise.  */
-#undef strerror
- #pragma GCC poison strerror
-
-/* loc_t is defined on some systems and too inviting for some
-   programmers to avoid.  */
-#undef loc_t
- #pragma GCC poison loc_t
-
-/* Old target macros that have moved to the target hooks structure.  */
- #pragma GCC poison ASM_OPEN_PAREN ASM_CLOSE_PAREN			\
-	FUNCTION_PROLOGUE FUNCTION_EPILOGUE				\
-	FUNCTION_END_PROLOGUE FUNCTION_BEGIN_EPILOGUE			\
-	DECL_MACHINE_ATTRIBUTES COMP_TYPE_ATTRIBUTES INSERT_ATTRIBUTES	\
-	VALID_MACHINE_DECL_ATTRIBUTE VALID_MACHINE_TYPE_ATTRIBUTE	\
-	SET_DEFAULT_TYPE_ATTRIBUTES SET_DEFAULT_DECL_ATTRIBUTES		\
-	MERGE_MACHINE_TYPE_ATTRIBUTES MERGE_MACHINE_DECL_ATTRIBUTES	\
-	MD_INIT_BUILTINS MD_EXPAND_BUILTIN ASM_OUTPUT_CONSTRUCTOR	\
-	ASM_OUTPUT_DESTRUCTOR SIGNED_CHAR_SPEC MAX_CHAR_TYPE_SIZE	\
-	WCHAR_UNSIGNED UNIQUE_SECTION SELECT_SECTION SELECT_RTX_SECTION	\
-	ENCODE_SECTION_INFO STRIP_NAME_ENCODING ASM_GLOBALIZE_LABEL	\
-	ASM_OUTPUT_MI_THUNK CONST_COSTS RTX_COSTS DEFAULT_RTX_COSTS	\
-	ADDRESS_COST MACHINE_DEPENDENT_REORG ASM_FILE_START ASM_FILE_END \
-	ASM_SIMPLIFY_DWARF_ADDR INIT_TARGET_OPTABS INIT_SUBTARGET_OPTABS \
-	INIT_GOFAST_OPTABS MULSI3_LIBCALL MULDI3_LIBCALL DIVSI3_LIBCALL \
-	DIVDI3_LIBCALL UDIVSI3_LIBCALL UDIVDI3_LIBCALL MODSI3_LIBCALL	\
-	MODDI3_LIBCALL UMODSI3_LIBCALL UMODDI3_LIBCALL BUILD_VA_LIST_TYPE \
-	PRETEND_OUTGOING_VARARGS_NAMED STRUCT_VALUE_INCOMING_REGNUM	\
-	ASM_OUTPUT_SECTION_NAME PROMOTE_FUNCTION_ARGS PROMOTE_FUNCTION_MODE \
-	STRUCT_VALUE_INCOMING STRICT_ARGUMENT_NAMING			\
-	PROMOTE_FUNCTION_RETURN PROMOTE_PROTOTYPES STRUCT_VALUE_REGNUM	\
-	SETUP_INCOMING_VARARGS EXPAND_BUILTIN_SAVEREGS			\
-	DEFAULT_SHORT_ENUMS SPLIT_COMPLEX_ARGS MD_ASM_CLOBBERS		\
-	HANDLE_PRAGMA_REDEFINE_EXTNAME HANDLE_PRAGMA_EXTERN_PREFIX	\
-	MUST_PASS_IN_STACK FUNCTION_ARG_PASS_BY_REFERENCE               \
-        VECTOR_MODE_SUPPORTED_P TARGET_SUPPORTS_HIDDEN 			\
-	FUNCTION_ARG_PARTIAL_NREGS ASM_OUTPUT_DWARF_DTPREL		\
-	ALLOCATE_INITIAL_VALUE LEGITIMIZE_ADDRESS FRAME_POINTER_REQUIRED \
-	CAN_ELIMINATE TRAMPOLINE_TEMPLATE INITIALIZE_TRAMPOLINE		\
-	TRAMPOLINE_ADJUST_ADDRESS STATIC_CHAIN STATIC_CHAIN_INCOMING	\
-	RETURN_POPS_ARGS UNITS_PER_SIMD_WORD OVERRIDE_OPTIONS		\
-	OPTIMIZATION_OPTIONS CLASS_LIKELY_SPILLED_P			\
-	USING_SJLJ_EXCEPTIONS TARGET_UNWIND_INFO			\
-	LABEL_ALIGN_MAX_SKIP LOOP_ALIGN_MAX_SKIP			\
-	LABEL_ALIGN_AFTER_BARRIER_MAX_SKIP JUMP_ALIGN_MAX_SKIP 		\
-	CAN_DEBUG_WITHOUT_FP UNLIKELY_EXECUTED_TEXT_SECTION_NAME	\
-	HOT_TEXT_SECTION_NAME LEGITIMATE_CONSTANT_P ALWAYS_STRIP_DOTDOT	\
-	OUTPUT_ADDR_CONST_EXTRA SMALL_REGISTER_CLASSES ASM_OUTPUT_IDENT	\
-	ASM_BYTE_OP MEMBER_TYPE_FORCES_BLK
-
-/* Target macros only used for code built for the target, that have
-   moved to libgcc-tm.h or have never been present elsewhere.  */
- #pragma GCC poison DECLARE_LIBRARY_RENAMES LIBGCC2_GNU_PREFIX		\
-	MD_UNWIND_SUPPORT MD_FROB_UPDATE_CONTEXT ENABLE_EXECUTE_STACK	\
-	REG_VALUE_IN_UNWIND_CONTEXT ASSUME_EXTENDED_UNWIND_CONTEXT
-
-/* Other obsolete target macros, or macros that used to be in target
-   headers and were not used, and may be obsolete or may never have
-   been used.  */
- #pragma GCC poison INT_ASM_OP ASM_OUTPUT_EH_REGION_BEG CPP_PREDEFINES	   \
-	ASM_OUTPUT_EH_REGION_END ASM_OUTPUT_LABELREF_AS_INT SMALL_STACK    \
-	DOESNT_NEED_UNWINDER EH_TABLE_LOOKUP OBJC_SELECTORS_WITHOUT_LABELS \
-	OMIT_EH_TABLE EASY_DIV_EXPR IMPLICIT_FIX_EXPR			   \
-	LONGJMP_RESTORE_FROM_STACK MAX_INT_TYPE_SIZE ASM_IDENTIFY_GCC	   \
-	STDC_VALUE TRAMPOLINE_ALIGN ASM_IDENTIFY_GCC_AFTER_SOURCE	   \
-	SLOW_ZERO_EXTEND SUBREG_REGNO_OFFSET DWARF_LINE_MIN_INSTR_LENGTH   \
-	TRADITIONAL_RETURN_FLOAT NO_BUILTIN_SIZE_TYPE			   \
-	NO_BUILTIN_PTRDIFF_TYPE NO_BUILTIN_WCHAR_TYPE NO_BUILTIN_WINT_TYPE \
-	BLOCK_PROFILER BLOCK_PROFILER_CODE FUNCTION_BLOCK_PROFILER	   \
-	FUNCTION_BLOCK_PROFILER_EXIT MACHINE_STATE_SAVE			   \
-	MACHINE_STATE_RESTORE SCCS_DIRECTIVE SECTION_ASM_OP BYTEORDER	   \
-	ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL HOST_WORDS_BIG_ENDIAN	   \
-	OBJC_PROLOGUE ALLOCATE_TRAMPOLINE HANDLE_PRAGMA ROUND_TYPE_SIZE	   \
-	ROUND_TYPE_SIZE_UNIT CONST_SECTION_ASM_OP CRT_GET_RFIB_TEXT	   \
-	DBX_LBRAC_FIRST DBX_OUTPUT_ENUM DBX_OUTPUT_SOURCE_FILENAME	   \
-	DBX_WORKING_DIRECTORY INSN_CACHE_DEPTH INSN_CACHE_SIZE		   \
-	INSN_CACHE_LINE_WIDTH INIT_SECTION_PREAMBLE NEED_ATEXIT ON_EXIT	   \
-	EXIT_BODY OBJECT_FORMAT_ROSE MULTIBYTE_CHARS MAP_CHARACTER	   \
-	LIBGCC_NEEDS_DOUBLE FINAL_PRESCAN_LABEL DEFAULT_CALLER_SAVES	   \
-	LOAD_ARGS_REVERSED MAX_INTEGER_COMPUTATION_MODE			   \
-	CONVERT_HARD_REGISTER_TO_SSA_P ASM_OUTPUT_MAIN_SOURCE_FILENAME	   \
-	FIRST_INSN_ADDRESS TEXT_SECTION SHARED_BSS_SECTION_ASM_OP	   \
-	PROMOTED_MODE EXPAND_BUILTIN_VA_END				   \
-	LINKER_DOES_NOT_WORK_WITH_DWARF2 FUNCTION_ARG_KEEP_AS_REFERENCE	   \
-	GIV_SORT_CRITERION MAX_LONG_TYPE_SIZE MAX_LONG_DOUBLE_TYPE_SIZE	   \
-	MAX_WCHAR_TYPE_SIZE SHARED_SECTION_ASM_OP INTEGRATE_THRESHOLD      \
-	FINAL_REG_PARM_STACK_SPACE MAYBE_REG_PARM_STACK_SPACE		   \
-	TRADITIONAL_PIPELINE_INTERFACE DFA_PIPELINE_INTERFACE		   \
-	DBX_OUTPUT_STANDARD_TYPES BUILTIN_SETJMP_FRAME_VALUE		   \
-	SUNOS4_SHARED_LIBRARIES PROMOTE_FOR_CALL_ONLY			   \
-	SPACE_AFTER_L_OPTION NO_RECURSIVE_FUNCTION_CSE			   \
-	DEFAULT_MAIN_RETURN TARGET_MEM_FUNCTIONS EXPAND_BUILTIN_VA_ARG	   \
-	COLLECT_PARSE_FLAG DWARF2_GENERATE_TEXT_SECTION_LABEL WINNING_GDB  \
-	ASM_OUTPUT_FILENAME ASM_OUTPUT_SOURCE_LINE FILE_NAME_JOINER	   \
-	GDB_INV_REF_REGPARM_STABS_LETTER DBX_MEMPARM_STABS_LETTER	   \
-	PUT_SDB_SRC_FILE STABS_GCC_MARKER DBX_OUTPUT_FUNCTION_END	   \
-	DBX_OUTPUT_GCC_MARKER DBX_FINISH_SYMBOL SDB_GENERATE_FAKE	   \
-	NON_SAVING_SETJMP TARGET_LATE_RTL_PROLOGUE_EPILOGUE		   \
-	CASE_DROPS_THROUGH TARGET_BELL TARGET_BS TARGET_CR TARGET_DIGIT0   \
-        TARGET_ESC TARGET_FF TARGET_NEWLINE TARGET_TAB TARGET_VT	   \
-        LINK_LIBGCC_SPECIAL DONT_ACCESS_GBLS_AFTER_EPILOGUE		   \
-	TARGET_OPTIONS TARGET_SWITCHES EXTRA_CC_MODES FINALIZE_PIC	   \
-	PREDICATE_CODES SPECIAL_MODE_PREDICATES	UNALIGNED_WORD_ASM_OP	   \
-	EXTRA_SECTIONS EXTRA_SECTION_FUNCTIONS READONLY_DATA_SECTION	   \
-	TARGET_ASM_EXCEPTION_SECTION TARGET_ASM_EH_FRAME_SECTION	   \
-	SMALL_ARG_MAX ASM_OUTPUT_SHARED_BSS ASM_OUTPUT_SHARED_COMMON	   \
-	ASM_OUTPUT_SHARED_LOCAL ASM_MAKE_LABEL_LINKONCE			   \
-	STACK_CHECK_PROBE_INTERVAL STACK_CHECK_PROBE_LOAD		   \
-	ORDER_REGS_FOR_LOCAL_ALLOC FUNCTION_OUTGOING_VALUE		   \
-	ASM_DECLARE_CONSTANT_NAME MODIFY_TARGET_NAME SWITCHES_NEED_SPACES  \
-	SWITCH_CURTAILS_COMPILATION SWITCH_TAKES_ARG WORD_SWITCH_TAKES_ARG \
-	TARGET_OPTION_TRANSLATE_TABLE HANDLE_PRAGMA_PACK_PUSH_POP	   \
-	HANDLE_SYSV_PRAGMA HANDLE_PRAGMA_WEAK CONDITIONAL_REGISTER_USAGE   \
-	FUNCTION_ARG_BOUNDARY MUST_USE_SJLJ_EXCEPTIONS US_SOFTWARE_GOFAST  \
-	USING_SVR4_H SVR4_ASM_SPEC FUNCTION_ARG FUNCTION_ARG_ADVANCE	   \
-	FUNCTION_INCOMING_ARG IRA_COVER_CLASSES TARGET_VERSION		   \
-	MACHINE_TYPE TARGET_HAS_TARGETCM ASM_OUTPUT_BSS			   \
-	SETJMP_VIA_SAVE_AREA FORBIDDEN_INC_DEC_CLASSES			   \
-	PREFERRED_OUTPUT_RELOAD_CLASS SYSTEM_INCLUDE_DIR		   \
-	STANDARD_INCLUDE_DIR STANDARD_INCLUDE_COMPONENT			   \
-	LINK_ELIMINATE_DUPLICATE_LDIRECTORIES MIPS_DEBUGGING_INFO	   \
-	IDENT_ASM_OP ALL_COP_ADDITIONAL_REGISTER_NAMES DBX_OUTPUT_LBRAC	   \
-	DBX_OUTPUT_NFUN DBX_OUTPUT_RBRAC RANGE_TEST_NON_SHORT_CIRCUIT	   \
-	REAL_VALUE_TRUNCATE REVERSE_CONDEXEC_PREDICATES_P		   \
-	TARGET_ALIGN_ANON_BITFIELDS TARGET_NARROW_VOLATILE_BITFIELDS	   \
-	IDENT_ASM_OP UNALIGNED_SHORT_ASM_OP UNALIGNED_INT_ASM_OP	   \
-	UNALIGNED_LONG_ASM_OP UNALIGNED_DOUBLE_INT_ASM_OP		   \
-	USE_COMMON_FOR_ONE_ONLY IFCVT_EXTRA_FIELDS IFCVT_INIT_EXTRA_FIELDS \
-	CASE_USE_BIT_TESTS FIXUNS_TRUNC_LIKE_FIX_TRUNC                     \
-        GO_IF_MODE_DEPENDENT_ADDRESS DELAY_SLOTS_FOR_EPILOGUE              \
-        ELIGIBLE_FOR_EPILOGUE_DELAY TARGET_C99_FUNCTIONS TARGET_HAS_SINCOS
-
-/* Hooks that are no longer used.  */
- #pragma GCC poison LANG_HOOKS_FUNCTION_MARK LANG_HOOKS_FUNCTION_FREE	\
-	LANG_HOOKS_MARK_TREE LANG_HOOKS_INSERT_DEFAULT_ATTRIBUTES \
-	LANG_HOOKS_TREE_INLINING_ESTIMATE_NUM_INSNS \
-	LANG_HOOKS_PUSHLEVEL LANG_HOOKS_SET_BLOCK \
-	LANG_HOOKS_MAYBE_BUILD_CLEANUP LANG_HOOKS_UPDATE_DECL_AFTER_SAVING \
-	LANG_HOOKS_POPLEVEL LANG_HOOKS_TRUTHVALUE_CONVERSION \
-	TARGET_PROMOTE_FUNCTION_ARGS TARGET_PROMOTE_FUNCTION_RETURN \
-	LANG_HOOKS_MISSING_ARGUMENT LANG_HOOKS_HASH_TYPES \
-	TARGET_HANDLE_OFAST TARGET_OPTION_OPTIMIZATION \
-	TARGET_IRA_COVER_CLASSES TARGET_HELP \
-	TARGET_HANDLE_PRAGMA_EXTERN_PREFIX \
-	TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN \
-	TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD \
-
-/* Arrays that were deleted in favor of a functional interface.  */
- #pragma GCC poison built_in_decls implicit_built_in_decls
-
-/* Hooks into libgcc2.  */
- #pragma GCC poison LIBGCC2_DOUBLE_TYPE_SIZE LIBGCC2_WORDS_BIG_ENDIAN \
-   LIBGCC2_FLOAT_WORDS_BIG_ENDIAN
-
-/* Miscellaneous macros that are no longer used.  */
- #pragma GCC poison USE_MAPPED_LOCATION GET_ENVIRONMENT
-
-/* Libiberty macros that are no longer used in GCC.  */
-#undef ANSI_PROTOTYPES
-#undef PTR_CONST
-#undef LONG_DOUBLE
-#undef VPARAMS
-#undef VA_OPEN
-#undef VA_FIXEDARG
-#undef VA_CLOSE
-#undef VA_START
- #pragma GCC poison ANSI_PROTOTYPES PTR_CONST LONG_DOUBLE VPARAMS VA_OPEN \
-  VA_FIXEDARG VA_CLOSE VA_START
-#endif /* IN_GCC */
-
-/* Front ends should never have to include middle-end headers.  Enforce
-   this by poisoning the header double-include protection defines.  */
-#ifdef IN_GCC_FRONTEND
-#pragma GCC poison GCC_RTL_H GCC_EXCEPT_H GCC_EXPR_H
-#endif
-
-/* Note: not all uses of the `index' token (e.g. variable names and
-   structure members) have been eliminated.  */
-#undef bcopy
-#undef bzero
-#undef bcmp
-#undef rindex
- #pragma GCC poison bcopy bzero bcmp rindex
-
-#endif /* GCC >= 3.0 */
-
-/* This macro allows casting away const-ness to pass -Wcast-qual
-   warnings.  DO NOT USE THIS UNLESS YOU REALLY HAVE TO!  It should
-   only be used in certain specific cases.  One valid case is where
-   the C standard definitions or prototypes force you to.  E.g. if you
-   need to free a const object, or if you pass a const string to
-   execv, et al.  Another valid use would be in an allocation function
-   that creates const objects that need to be initialized.  In some
-   cases we have non-const functions that return the argument
-   (e.g. next_nonnote_insn).  Rather than create const shadow
-   functions, we can cast away const-ness in calling these interfaces
-   if we're careful to verify that the called function does indeed not
-   modify its argument and the return value is only used in a const
-   context.  (This can be somewhat dangerous as these assumptions can
-   change after the fact).  Beyond these uses, most other cases of
-   using this macro should be viewed with extreme caution.  */
-
-#ifdef __cplusplus
-#define CONST_CAST2(TOTYPE,FROMTYPE,X) (const_cast<TOTYPE> (X))
-#else
-#if defined(__GNUC__) && GCC_VERSION > 4000
-/* GCC 4.0.x has a bug where it may ICE on this expression,
-   so does GCC 3.4.x (PR17436).  */
-#define CONST_CAST2(TOTYPE,FROMTYPE,X) ((__extension__(union {FROMTYPE _q; TOTYPE _nq;})(X))._nq)
-#elif defined(__GNUC__)
-static inline char *
-helper_const_non_const_cast (const char *p)
-{
-  union {
-    const char *const_c;
-    char *c;
-  } val;
-  val.const_c = p;
-  return val.c;
-}
-
-#define CONST_CAST2(TOTYPE,FROMTYPE,X) \
-	((TOTYPE) helper_const_non_const_cast ((const char *) (FROMTYPE) (X)))
-#else
-#define CONST_CAST2(TOTYPE,FROMTYPE,X) ((TOTYPE)(FROMTYPE)(X))
-#endif
-#endif
-#define CONST_CAST(TYPE,X) CONST_CAST2 (TYPE, const TYPE, (X))
-#define CONST_CAST_TREE(X) CONST_CAST (union tree_node *, (X))
-#define CONST_CAST_RTX(X) CONST_CAST (struct rtx_def *, (X))
-#define CONST_CAST_BB(X) CONST_CAST (struct basic_block_def *, (X))
-#define CONST_CAST_GIMPLE(X) CONST_CAST (struct gimple_statement_base *, (X))
-
-/* Activate certain diagnostics as warnings (not errors via the
-   -Werror flag).  */
-#if GCC_VERSION >= 4003
-/* If asserts are disabled, activate -Wuninitialized as a warning (not
-   an error/-Werror).  */
-#ifndef ENABLE_ASSERT_CHECKING
-#pragma GCC diagnostic warning "-Wuninitialized"
-#endif
-#endif
-
-#ifdef ENABLE_VALGRIND_CHECKING
-# ifdef HAVE_VALGRIND_MEMCHECK_H
-#  include <valgrind/memcheck.h>
-# elif defined HAVE_MEMCHECK_H
-#  include <memcheck.h>
-# else
-#  include <valgrind.h>
-# endif
-/* Compatibility macros to let valgrind 3.1 work.  */
-# ifndef VALGRIND_MAKE_MEM_NOACCESS
-#  define VALGRIND_MAKE_MEM_NOACCESS VALGRIND_MAKE_NOACCESS
-# endif
-# ifndef VALGRIND_MAKE_MEM_DEFINED
-#  define VALGRIND_MAKE_MEM_DEFINED VALGRIND_MAKE_READABLE
-# endif
-# ifndef VALGRIND_MAKE_MEM_UNDEFINED
-#  define VALGRIND_MAKE_MEM_UNDEFINED VALGRIND_MAKE_WRITABLE
-# endif
-#else
-/* Avoid #ifdef:s when we can help it.  */
-#define VALGRIND_DISCARD(x)
-#define VALGRIND_MALLOCLIKE_BLOCK(w,x,y,z)
-#define VALGRIND_FREELIKE_BLOCK(x,y)
-#endif
-
-/* In LTO -fwhole-program build we still want to keep the debug functions available
-   for debugger.  Mark them as used to prevent removal.  */
-#if (GCC_VERSION > 4000)
-#define DEBUG_FUNCTION __attribute__ ((__used__))
-#define DEBUG_VARIABLE __attribute__ ((__used__))
-#else
-#define DEBUG_FUNCTION
-#define DEBUG_VARIABLE
-#endif
-
-/* Get definitions of HOST_WIDE_INT and HOST_WIDEST_INT.  */
-#include "hwint.h"
-
-#endif /* ! GCC_SYSTEM_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/target-hooks-macros.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/target-hooks-macros.h
deleted file mode 100644
index 5cf4cb1..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/target-hooks-macros.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/* Common macros for target hook definitions.
-   Copyright (C) 2001-2014 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 3, 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; see the file COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-/* The following macros should be provided by the including file:
-
-   DEFHOOK(NAME, DOC, TYPE, PARAMS, INIT): Define a function-valued hook.
-   DEFHOOKPOD(DOC, TYPE, NAME, INIT): Define a piece-of-data 'hook'.  */
-
-/* Defaults for optional macros:
-   DEFHOOKPODX(NAME, TYPE, INIT): Like DEFHOOKPOD, but share documentation
-   with the previous 'hook'.  */
-#ifndef DEFHOOKPODX
-#define DEFHOOKPODX(NAME, TYPE, INIT) DEFHOOKPOD (NAME, 0, TYPE, INIT)
-#endif
-   
-/* HOOKSTRUCT(FRAGMENT): Declarator fragments to encapsulate all the
-   members into a struct gcc_target, which in turn contains several
-   sub-structs.  */
-#ifndef HOOKSTRUCT
-#define HOOKSTRUCT(FRAGMENT)
-#endif
-/* HOOK_VECTOR: Start a struct declaration, which then gets its own initializer.
-   HOOK_VECTOR_END: Close a struct declaration, providing a member declarator
-                    name for nested use.  */
-#ifndef HOOK_VECTOR_1
-#define HOOK_VECTOR_1(NAME, FRAGMENT) HOOKSTRUCT (FRAGMENT)
-#endif
-#define HOOK_VECTOR(INIT_NAME, SNAME) HOOK_VECTOR_1 (INIT_NAME, struct SNAME {)
-#define HOOK_VECTOR_END(DECL_NAME) HOOK_VECTOR_1(,} DECL_NAME ;)
-
-/* FIXME: For pre-existing hooks, we can't place the documentation in the
-   documentation field here till we get permission from the FSF to include
-   it in GPLed software - the target hook documentation is so far only
-   available under the GFDL.  */
-
-/* A hook should generally be documented by a string in the DOC parameter,
-   which should contain texinfo markup.  If the documentation is only available
-   under the GPL, but not under the GFDL, put it in a comment above the hook
-   definition.  If the function declaration is available both under GPL and
-   GFDL, but the documentation is only available under the GFDL, put the
-   documentaton in tm.texi.in, heading with @hook <hookname> and closing
-   the paragraph with @end deftypefn / deftypevr as appropriate, and marking
-   the next autogenerated hook with @hook <hookname>.
-   In both these cases, leave the DOC string empty, i.e. "".
-   Sometimes, for some historic reason the function declaration 
-   has to be documented differently
-   than what it is.  In that case, use DEFHOOK_UNDOC to suppress auto-generation
-   of documentation.  DEFHOOK_UNDOC takes a DOC string which it ignores, so
-   you can put GPLed documentation string there if you have hopes that you
-   can clear the declaration & documentation for GFDL distribution later,
-   in which case you can then simply change the DEFHOOK_UNDOC to DEFHOOK
-   to turn on the autogeneration of the documentation.
-
-    A documentation string of "*" means not to emit any documentation at all,
-   and is mainly used internally for DEFHOOK_UNDOC.  It should generally not
-   be used otherwise, but it has its use for exceptional cases where automatic
-   documentation is not wanted, and the real documentation is elsewere, like
-   for TARGET_ASM_{,UN}ALIGNED_INT_OP, which are hooks only for implementation
-   purposes; they refer to structs, the components of which are documented as
-   separate hooks TARGET_ASM_{,UN}ALIGNED_[HSDT]I_OP.
-   A DOC string of 0 is for internal use of DEFHOOKPODX and special table
-   entries only.  */
-
-/* Empty macro arguments are undefined in C90, so use an empty macro
-   to close top-level hook structures.  */
-#define C90_EMPTY_HACK
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/target.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/target.def
deleted file mode 100644
index 3a64cd1..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/target.def
+++ /dev/null
@@ -1,5349 +0,0 @@
-/* Target hook definitions.
-   Copyright (C) 2001-2014 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 3, 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; see the file COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.
-
-   In other words, you are welcome to use, share and improve this program.
-   You are forbidden to forbid anyone else to use, share and improve
-   what you give them.   Help stamp out software-hoarding!  */
-
-/* See target-hooks-macros.h for details of macros that should be
-   provided by the including file, and how to use them here.  */
-#include "target-hooks-macros.h"
-
-#undef HOOK_TYPE
-#define HOOK_TYPE "Target Hook"
-
-HOOK_VECTOR (TARGET_INITIALIZER, gcc_target)
-
-/* Functions that output assembler for the target.  */
-#define HOOK_PREFIX "TARGET_ASM_"
-HOOK_VECTOR (TARGET_ASM_OUT, asm_out)
-
-/* Opening and closing parentheses for asm expression grouping.  */
-DEFHOOKPOD
-(open_paren,
- "These target hooks are C string constants, describing the syntax in the\n\
-assembler for grouping arithmetic expressions.  If not overridden, they\n\
-default to normal parentheses, which is correct for most assemblers.",
- const char *, "(")
-DEFHOOKPODX (close_paren, const char *, ")")
-
-/* Assembler instructions for creating various kinds of integer object.  */
-DEFHOOKPOD
-(byte_op,
- "@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_HI_OP\n\
-@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_SI_OP\n\
-@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_DI_OP\n\
-@deftypevrx {Target Hook} {const char *} TARGET_ASM_ALIGNED_TI_OP\n\
-@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_HI_OP\n\
-@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_SI_OP\n\
-@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_DI_OP\n\
-@deftypevrx {Target Hook} {const char *} TARGET_ASM_UNALIGNED_TI_OP\n\
-These hooks specify assembly directives for creating certain kinds\n\
-of integer object.  The @code{TARGET_ASM_BYTE_OP} directive creates a\n\
-byte-sized object, the @code{TARGET_ASM_ALIGNED_HI_OP} one creates an\n\
-aligned two-byte object, and so on.  Any of the hooks may be\n\
-@code{NULL}, indicating that no suitable directive is available.\n\
-\n\
-The compiler will print these strings at the start of a new line,\n\
-followed immediately by the object's initial value.  In most cases,\n\
-the string should contain a tab, a pseudo-op, and then another tab.",
- const char *, "\t.byte\t")
-DEFHOOKPOD (aligned_op, "*", struct asm_int_op, TARGET_ASM_ALIGNED_INT_OP)
-DEFHOOKPOD (unaligned_op, "*", struct asm_int_op, TARGET_ASM_UNALIGNED_INT_OP)
-
-/* The maximum number of bytes to skip when applying
-   LABEL_ALIGN_AFTER_BARRIER.  */
-DEFHOOK
-(label_align_after_barrier_max_skip,
- "The maximum number of bytes to skip before @var{label} when applying\n\
-@code{LABEL_ALIGN_AFTER_BARRIER}.  This works only if\n\
-@code{ASM_OUTPUT_MAX_SKIP_ALIGN} is defined.",
- int, (rtx label),
- default_label_align_after_barrier_max_skip)
-
-/* The maximum number of bytes to skip when applying
-   LOOP_ALIGN.  */
-DEFHOOK
-(loop_align_max_skip,
- "The maximum number of bytes to skip when applying @code{LOOP_ALIGN} to\n\
-@var{label}.  This works only if @code{ASM_OUTPUT_MAX_SKIP_ALIGN} is\n\
-defined.",
- int, (rtx label),
- default_loop_align_max_skip)
-
-/* The maximum number of bytes to skip when applying
-   LABEL_ALIGN.  */
-DEFHOOK
-(label_align_max_skip,
- "The maximum number of bytes to skip when applying @code{LABEL_ALIGN}\n\
-to @var{label}.  This works only if @code{ASM_OUTPUT_MAX_SKIP_ALIGN}\n\
-is defined.",
- int, (rtx label),
- default_label_align_max_skip)
-
-/* The maximum number of bytes to skip when applying
-   JUMP_ALIGN.  */
-DEFHOOK
-(jump_align_max_skip,
- "The maximum number of bytes to skip before @var{label} when applying\n\
-@code{JUMP_ALIGN}.  This works only if\n\
-@code{ASM_OUTPUT_MAX_SKIP_ALIGN} is defined.",
- int, (rtx label),
- default_jump_align_max_skip)
-
-/* Try to output the assembler code for an integer object whose
-   value is given by X.  SIZE is the size of the object in bytes and
-   ALIGNED_P indicates whether it is aligned.  Return true if
-   successful.  Only handles cases for which BYTE_OP, ALIGNED_OP
-   and UNALIGNED_OP are NULL.  */
-DEFHOOK
-(integer,
- "The @code{assemble_integer} function uses this hook to output an\n\
-integer object.  @var{x} is the object's value, @var{size} is its size\n\
-in bytes and @var{aligned_p} indicates whether it is aligned.  The\n\
-function should return @code{true} if it was able to output the\n\
-object.  If it returns false, @code{assemble_integer} will try to\n\
-split the object into smaller parts.\n\
-\n\
-The default implementation of this hook will use the\n\
-@code{TARGET_ASM_BYTE_OP} family of strings, returning @code{false}\n\
-when the relevant string is @code{NULL}.",
- /* Only handles cases for which BYTE_OP, ALIGNED_OP and UNALIGNED_OP are
-    NULL.  */
- bool, (rtx x, unsigned int size, int aligned_p),
- default_assemble_integer)
-
-/* Output code that will globalize a label.  */
-DEFHOOK
-(globalize_label,
- "This target hook is a function to output to the stdio stream\n\
-@var{stream} some commands that will make the label @var{name} global;\n\
-that is, available for reference from other files.\n\
-\n\
-The default implementation relies on a proper definition of\n\
-@code{GLOBAL_ASM_OP}.",
- void, (FILE *stream, const char *name),
- default_globalize_label)
-
-/* Output code that will globalize a declaration.  */
-DEFHOOK
-(globalize_decl_name,
- "This target hook is a function to output to the stdio stream\n\
-@var{stream} some commands that will make the name associated with @var{decl}\n\
-global; that is, available for reference from other files.\n\
-\n\
-The default implementation uses the TARGET_ASM_GLOBALIZE_LABEL target hook.",
- void, (FILE *stream, tree decl), default_globalize_decl_name)
-
-/* Output code that will emit a label for unwind info, if this
-   target requires such labels.  Second argument is the decl the
-   unwind info is associated with, third is a boolean: true if
-   this is for exception handling, fourth is a boolean: true if
-   this is only a placeholder for an omitted FDE.  */
-DEFHOOK
-(emit_unwind_label,
- "This target hook emits a label at the beginning of each FDE@.  It\n\
-should be defined on targets where FDEs need special labels, and it\n\
-should write the appropriate label, for the FDE associated with the\n\
-function declaration @var{decl}, to the stdio stream @var{stream}.\n\
-The third argument, @var{for_eh}, is a boolean: true if this is for an\n\
-exception table.  The fourth argument, @var{empty}, is a boolean:\n\
-true if this is a placeholder label for an omitted FDE@.\n\
-\n\
-The default is that FDEs are not given nonlocal labels.",
- void, (FILE *stream, tree decl, int for_eh, int empty),
- default_emit_unwind_label)
-
-/* Output code that will emit a label to divide up the exception table.  */
-DEFHOOK
-(emit_except_table_label,
- "This target hook emits a label at the beginning of the exception table.\n\
-It should be defined on targets where it is desirable for the table\n\
-to be broken up according to function.\n\
-\n\
-The default is that no label is emitted.",
- void, (FILE *stream),
- default_emit_except_table_label)
-
-/* Emit a directive for setting the personality for the function.  */
-DEFHOOK
-(emit_except_personality,
- "If the target implements @code{TARGET_ASM_UNWIND_EMIT}, this hook may be\
- used to emit a directive to install a personality hook into the unwind\
- info.  This hook should not be used if dwarf2 unwind info is used.",
- void, (rtx personality),
- NULL)
-
-/* Emit any directives required to unwind this instruction.  */
-DEFHOOK
-(unwind_emit,
- "This target hook emits assembly directives required to unwind the\n\
-given instruction.  This is only used when @code{TARGET_EXCEPT_UNWIND_INFO}\n\
-returns @code{UI_TARGET}.",
- void, (FILE *stream, rtx insn),
- NULL)
-
-DEFHOOKPOD
-(unwind_emit_before_insn,
- "True if the @code{TARGET_ASM_UNWIND_EMIT} hook should be called before\
- the assembly for @var{insn} has been emitted, false if the hook should\
- be called afterward.",
- bool, true)
-
-/* Generate an internal label.
-   For now this is just a wrapper for ASM_GENERATE_INTERNAL_LABEL.  */
-DEFHOOK_UNDOC
-(generate_internal_label,
- "",
- void, (char *buf, const char *prefix, unsigned long labelno),
- default_generate_internal_label)
-
-/* Output an internal label.  */
-DEFHOOK
-(internal_label,
- "A function to output to the stdio stream @var{stream} a label whose\n\
-name is made from the string @var{prefix} and the number @var{labelno}.\n\
-\n\
-It is absolutely essential that these labels be distinct from the labels\n\
-used for user-level functions and variables.  Otherwise, certain programs\n\
-will have name conflicts with internal labels.\n\
-\n\
-It is desirable to exclude internal labels from the symbol table of the\n\
-object file.  Most assemblers have a naming convention for labels that\n\
-should be excluded; on many systems, the letter @samp{L} at the\n\
-beginning of a label has this effect.  You should find out what\n\
-convention your system uses, and follow it.\n\
-\n\
-The default version of this function utilizes @code{ASM_GENERATE_INTERNAL_LABEL}.",
- void, (FILE *stream, const char *prefix, unsigned long labelno),
- default_internal_label)
-
-/* Output label for the constant.  */
-DEFHOOK
-(declare_constant_name,
- "A target hook to output to the stdio stream @var{file} any text necessary\n\
-for declaring the name @var{name} of a constant which is being defined.  This\n\
-target hook is responsible for outputting the label definition (perhaps using\n\
-@code{assemble_label}).  The argument @var{exp} is the value of the constant,\n\
-and @var{size} is the size of the constant in bytes.  The @var{name}\n\
-will be an internal label.\n\
-\n\
-The default version of this target hook, define the @var{name} in the\n\
-usual manner as a label (by means of @code{assemble_label}).\n\
-\n\
-You may wish to use @code{ASM_OUTPUT_TYPE_DIRECTIVE} in this target hook.",
- void, (FILE *file, const char *name, const_tree expr, HOST_WIDE_INT size),
- default_asm_declare_constant_name)
-
-/* Emit a ttype table reference to a typeinfo object.  */
-DEFHOOK
-(ttype,
- "This hook is used to output a reference from a frame unwinding table to\n\
-the type_info object identified by @var{sym}.  It should return @code{true}\n\
-if the reference was output.  Returning @code{false} will cause the\n\
-reference to be output using the normal Dwarf2 routines.",
- bool, (rtx sym),
- hook_bool_rtx_false)
-
-/* Emit an assembler directive to set visibility for the symbol
-   associated with the tree decl.  */
-DEFHOOK
-(assemble_visibility,
- "This target hook is a function to output to @var{asm_out_file} some\n\
-commands that will make the symbol(s) associated with @var{decl} have\n\
-hidden, protected or internal visibility as specified by @var{visibility}.",
- void, (tree decl, int visibility),
- default_assemble_visibility)
-
-/* Output the assembler code for entry to a function.  */
-DEFHOOK
-(function_prologue,
- "If defined, a function that outputs the assembler code for entry to a\n\
-function.  The prologue is responsible for setting up the stack frame,\n\
-initializing the frame pointer register, saving registers that must be\n\
-saved, and allocating @var{size} additional bytes of storage for the\n\
-local variables.  @var{size} is an integer.  @var{file} is a stdio\n\
-stream to which the assembler code should be output.\n\
-\n\
-The label for the beginning of the function need not be output by this\n\
-macro.  That has already been done when the macro is run.\n\
-\n\
-@findex regs_ever_live\n\
-To determine which registers to save, the macro can refer to the array\n\
-@code{regs_ever_live}: element @var{r} is nonzero if hard register\n\
-@var{r} is used anywhere within the function.  This implies the function\n\
-prologue should save register @var{r}, provided it is not one of the\n\
-call-used registers.  (@code{TARGET_ASM_FUNCTION_EPILOGUE} must likewise use\n\
-@code{regs_ever_live}.)\n\
-\n\
-On machines that have ``register windows'', the function entry code does\n\
-not save on the stack the registers that are in the windows, even if\n\
-they are supposed to be preserved by function calls; instead it takes\n\
-appropriate steps to ``push'' the register stack, if any non-call-used\n\
-registers are used in the function.\n\
-\n\
-@findex frame_pointer_needed\n\
-On machines where functions may or may not have frame-pointers, the\n\
-function entry code must vary accordingly; it must set up the frame\n\
-pointer if one is wanted, and not otherwise.  To determine whether a\n\
-frame pointer is in wanted, the macro can refer to the variable\n\
-@code{frame_pointer_needed}.  The variable's value will be 1 at run\n\
-time in a function that needs a frame pointer.  @xref{Elimination}.\n\
-\n\
-The function entry code is responsible for allocating any stack space\n\
-required for the function.  This stack space consists of the regions\n\
-listed below.  In most cases, these regions are allocated in the\n\
-order listed, with the last listed region closest to the top of the\n\
-stack (the lowest address if @code{STACK_GROWS_DOWNWARD} is defined, and\n\
-the highest address if it is not defined).  You can use a different order\n\
-for a machine if doing so is more convenient or required for\n\
-compatibility reasons.  Except in cases where required by standard\n\
-or by a debugger, there is no reason why the stack layout used by GCC\n\
-need agree with that used by other compilers for a machine.",
- void, (FILE *file, HOST_WIDE_INT size),
- default_function_pro_epilogue)
-
-/* Output the assembler code for end of prologue.  */
-DEFHOOK
-(function_end_prologue,
- "If defined, a function that outputs assembler code at the end of a\n\
-prologue.  This should be used when the function prologue is being\n\
-emitted as RTL, and you have some extra assembler that needs to be\n\
-emitted.  @xref{prologue instruction pattern}.",
- void, (FILE *file),
- no_asm_to_stream)
-
-/* Output the assembler code for start of epilogue.  */
-DEFHOOK
-(function_begin_epilogue,
- "If defined, a function that outputs assembler code at the start of an\n\
-epilogue.  This should be used when the function epilogue is being\n\
-emitted as RTL, and you have some extra assembler that needs to be\n\
-emitted.  @xref{epilogue instruction pattern}.",
- void, (FILE *file),
- no_asm_to_stream)
-
-/* Output the assembler code for function exit.  */
-DEFHOOK
-(function_epilogue,
- "If defined, a function that outputs the assembler code for exit from a\n\
-function.  The epilogue is responsible for restoring the saved\n\
-registers and stack pointer to their values when the function was\n\
-called, and returning control to the caller.  This macro takes the\n\
-same arguments as the macro @code{TARGET_ASM_FUNCTION_PROLOGUE}, and the\n\
-registers to restore are determined from @code{regs_ever_live} and\n\
-@code{CALL_USED_REGISTERS} in the same way.\n\
-\n\
-On some machines, there is a single instruction that does all the work\n\
-of returning from the function.  On these machines, give that\n\
-instruction the name @samp{return} and do not define the macro\n\
-@code{TARGET_ASM_FUNCTION_EPILOGUE} at all.\n\
-\n\
-Do not define a pattern named @samp{return} if you want the\n\
-@code{TARGET_ASM_FUNCTION_EPILOGUE} to be used.  If you want the target\n\
-switches to control whether return instructions or epilogues are used,\n\
-define a @samp{return} pattern with a validity condition that tests the\n\
-target switches appropriately.  If the @samp{return} pattern's validity\n\
-condition is false, epilogues will be used.\n\
-\n\
-On machines where functions may or may not have frame-pointers, the\n\
-function exit code must vary accordingly.  Sometimes the code for these\n\
-two cases is completely different.  To determine whether a frame pointer\n\
-is wanted, the macro can refer to the variable\n\
-@code{frame_pointer_needed}.  The variable's value will be 1 when compiling\n\
-a function that needs a frame pointer.\n\
-\n\
-Normally, @code{TARGET_ASM_FUNCTION_PROLOGUE} and\n\
-@code{TARGET_ASM_FUNCTION_EPILOGUE} must treat leaf functions specially.\n\
-The C variable @code{current_function_is_leaf} is nonzero for such a\n\
-function.  @xref{Leaf Functions}.\n\
-\n\
-On some machines, some functions pop their arguments on exit while\n\
-others leave that for the caller to do.  For example, the 68020 when\n\
-given @option{-mrtd} pops arguments in functions that take a fixed\n\
-number of arguments.\n\
-\n\
-@findex pops_args\n\
-@findex crtl->args.pops_args\n\
-Your definition of the macro @code{RETURN_POPS_ARGS} decides which\n\
-functions pop their own arguments.  @code{TARGET_ASM_FUNCTION_EPILOGUE}\n\
-needs to know what was decided.  The number of bytes of the current\n\
-function's arguments that this function should pop is available in\n\
-@code{crtl->args.pops_args}.  @xref{Scalar Return}.",
- void, (FILE *file, HOST_WIDE_INT size),
- default_function_pro_epilogue)
-
-/* Initialize target-specific sections.  */
-DEFHOOK
-(init_sections,
- "Define this hook if you need to do something special to set up the\n\
-@file{varasm.c} sections, or if your target has some special sections\n\
-of its own that you need to create.\n\
-\n\
-GCC calls this hook after processing the command line, but before writing\n\
-any assembly code, and before calling any of the section-returning hooks\n\
-described below.",
- void, (void),
- hook_void_void)
-
-/* Tell assembler to change to section NAME with attributes FLAGS.
-   If DECL is non-NULL, it is the VAR_DECL or FUNCTION_DECL with
-   which this section is associated.  */
-DEFHOOK
-(named_section,
- "Output assembly directives to switch to section @var{name}.  The section\n\
-should have attributes as specified by @var{flags}, which is a bit mask\n\
-of the @code{SECTION_*} flags defined in @file{output.h}.  If @var{decl}\n\
-is non-NULL, it is the @code{VAR_DECL} or @code{FUNCTION_DECL} with which\n\
-this section is associated.",
- void, (const char *name, unsigned int flags, tree decl),
- default_no_named_section)
-
-/* Return preferred text (sub)section for function DECL.
-   Main purpose of this function is to separate cold, normal and hot
-   functions. STARTUP is true when function is known to be used only 
-   at startup (from static constructors or it is main()).
-   EXIT is true when function is known to be used only at exit
-   (from static destructors).
-   Return NULL if function should go to default text section.  */
-DEFHOOK
-(function_section,
- "Return preferred text (sub)section for function @var{decl}.\n\
-Main purpose of this function is to separate cold, normal and hot\n\
-functions. @var{startup} is true when function is known to be used only\n\
-at startup (from static constructors or it is @code{main()}).\n\
-@var{exit} is true when function is known to be used only at exit\n\
-(from static destructors).\n\
-Return NULL if function should go to default text section.",
- section *, (tree decl, enum node_frequency freq, bool startup, bool exit),
- default_function_section)
-
-/* Output the assembler code for function exit.  */
-DEFHOOK
-(function_switched_text_sections,
- "Used by the target to emit any assembler directives or additional\
-  labels needed when a function is partitioned between different\
-  sections.  Output should be written to @var{file}.  The function\
-  decl is available as @var{decl} and the new section is `cold' if\
-  @var{new_is_cold} is @code{true}.",
- void, (FILE *file, tree decl, bool new_is_cold),
- default_function_switched_text_sections)
-
-/* Return a mask describing how relocations should be treated when
-   selecting sections.  Bit 1 should be set if global relocations
-   should be placed in a read-write section; bit 0 should be set if
-   local relocations should be placed in a read-write section.  */
-DEFHOOK
-(reloc_rw_mask,
- "Return a mask describing how relocations should be treated when\n\
-selecting sections.  Bit 1 should be set if global relocations\n\
-should be placed in a read-write section; bit 0 should be set if\n\
-local relocations should be placed in a read-write section.\n\
-\n\
-The default version of this function returns 3 when @option{-fpic}\n\
-is in effect, and 0 otherwise.  The hook is typically redefined\n\
-when the target cannot support (some kinds of) dynamic relocations\n\
-in read-only sections even in executables.",
- int, (void),
- default_reloc_rw_mask)
-
- /* Return a section for EXP.  It may be a DECL or a constant.  RELOC
-    is nonzero if runtime relocations must be applied; bit 1 will be
-    set if the runtime relocations require non-local name resolution.
-    ALIGN is the required alignment of the data.  */
-DEFHOOK
-(select_section,
- "Return the section into which @var{exp} should be placed.  You can\n\
-assume that @var{exp} is either a @code{VAR_DECL} node or a constant of\n\
-some sort.  @var{reloc} indicates whether the initial value of @var{exp}\n\
-requires link-time relocations.  Bit 0 is set when variable contains\n\
-local relocations only, while bit 1 is set for global relocations.\n\
-@var{align} is the constant alignment in bits.\n\
-\n\
-The default version of this function takes care of putting read-only\n\
-variables in @code{readonly_data_section}.\n\
-\n\
-See also @var{USE_SELECT_SECTION_FOR_FUNCTIONS}.",
- section *, (tree exp, int reloc, unsigned HOST_WIDE_INT align),
- default_select_section)
-
-/* Return a section for X.  MODE is X's mode and ALIGN is its
-   alignment in bits.  */
-DEFHOOK
-(select_rtx_section,
- "Return the section into which a constant @var{x}, of mode @var{mode},\n\
-should be placed.  You can assume that @var{x} is some kind of\n\
-constant in RTL@.  The argument @var{mode} is redundant except in the\n\
-case of a @code{const_int} rtx.  @var{align} is the constant alignment\n\
-in bits.\n\
-\n\
-The default version of this function takes care of putting symbolic\n\
-constants in @code{flag_pic} mode in @code{data_section} and everything\n\
-else in @code{readonly_data_section}.",
- section *, (enum machine_mode mode, rtx x, unsigned HOST_WIDE_INT align),
- default_select_rtx_section)
-
-/* Select a unique section name for DECL.  RELOC is the same as
-   for SELECT_SECTION.  */
-DEFHOOK
-(unique_section,
- "Build up a unique section name, expressed as a @code{STRING_CST} node,\n\
-and assign it to @samp{DECL_SECTION_NAME (@var{decl})}.\n\
-As with @code{TARGET_ASM_SELECT_SECTION}, @var{reloc} indicates whether\n\
-the initial value of @var{exp} requires link-time relocations.\n\
-\n\
-The default version of this function appends the symbol name to the\n\
-ELF section name that would normally be used for the symbol.  For\n\
-example, the function @code{foo} would be placed in @code{.text.foo}.\n\
-Whatever the actual target object format, this is often good enough.",
- void, (tree decl, int reloc),
- default_unique_section)
-
-/* Return the readonly data section associated with function DECL.  */
-DEFHOOK
-(function_rodata_section,
- "Return the readonly data section associated with\n\
-@samp{DECL_SECTION_NAME (@var{decl})}.\n\
-The default version of this function selects @code{.gnu.linkonce.r.name} if\n\
-the function's section is @code{.gnu.linkonce.t.name}, @code{.rodata.name}\n\
-if function is in @code{.text.name}, and the normal readonly-data section\n\
-otherwise.",
- section *, (tree decl),
- default_function_rodata_section)
-
-/* Nonnull if the target wants to override the default ".rodata" prefix
-   for mergeable data sections.  */
-DEFHOOKPOD
-(mergeable_rodata_prefix,
- "Usually, the compiler uses the prefix @code{\".rodata\"} to construct\n\
-section names for mergeable constant data.  Define this macro to override\n\
-the string if a different section name should be used.",
- const char *, ".rodata")
-
-/* Return the section to be used for transactional memory clone tables.  */
-DEFHOOK
-(tm_clone_table_section,
- "Return the section that should be used for transactional memory clone\
-  tables.",
- section *, (void), default_clone_table_section)
-
-/* Output a constructor for a symbol with a given priority.  */
-DEFHOOK
-(constructor,
- "If defined, a function that outputs assembler code to arrange to call\n\
-the function referenced by @var{symbol} at initialization time.\n\
-\n\
-Assume that @var{symbol} is a @code{SYMBOL_REF} for a function taking\n\
-no arguments and with no return value.  If the target supports initialization\n\
-priorities, @var{priority} is a value between 0 and @code{MAX_INIT_PRIORITY};\n\
-otherwise it must be @code{DEFAULT_INIT_PRIORITY}.\n\
-\n\
-If this macro is not defined by the target, a suitable default will\n\
-be chosen if (1) the target supports arbitrary section names, (2) the\n\
-target defines @code{CTORS_SECTION_ASM_OP}, or (3) @code{USE_COLLECT2}\n\
-is not defined.",
- void, (rtx symbol, int priority), NULL)
-
-/* Output a destructor for a symbol with a given priority.  */
-DEFHOOK
-(destructor,
- "This is like @code{TARGET_ASM_CONSTRUCTOR} but used for termination\n\
-functions rather than initialization functions.",
- void, (rtx symbol, int priority), NULL)
-
-/* Output the assembler code for a thunk function.  THUNK_DECL is the
-   declaration for the thunk function itself, FUNCTION is the decl for
-   the target function.  DELTA is an immediate constant offset to be
-   added to THIS.  If VCALL_OFFSET is nonzero, the word at
-   *(*this + vcall_offset) should be added to THIS.  */
-DEFHOOK
-(output_mi_thunk,
- "A function that outputs the assembler code for a thunk\n\
-function, used to implement C++ virtual function calls with multiple\n\
-inheritance.  The thunk acts as a wrapper around a virtual function,\n\
-adjusting the implicit object parameter before handing control off to\n\
-the real function.\n\
-\n\
-First, emit code to add the integer @var{delta} to the location that\n\
-contains the incoming first argument.  Assume that this argument\n\
-contains a pointer, and is the one used to pass the @code{this} pointer\n\
-in C++.  This is the incoming argument @emph{before} the function prologue,\n\
-e.g.@: @samp{%o0} on a sparc.  The addition must preserve the values of\n\
-all other incoming arguments.\n\
-\n\
-Then, if @var{vcall_offset} is nonzero, an additional adjustment should be\n\
-made after adding @code{delta}.  In particular, if @var{p} is the\n\
-adjusted pointer, the following adjustment should be made:\n\
-\n\
-@smallexample\n\
-p += (*((ptrdiff_t **)p))[vcall_offset/sizeof(ptrdiff_t)]\n\
-@end smallexample\n\
-\n\
-After the additions, emit code to jump to @var{function}, which is a\n\
-@code{FUNCTION_DECL}.  This is a direct pure jump, not a call, and does\n\
-not touch the return address.  Hence returning from @var{FUNCTION} will\n\
-return to whoever called the current @samp{thunk}.\n\
-\n\
-The effect must be as if @var{function} had been called directly with\n\
-the adjusted first argument.  This macro is responsible for emitting all\n\
-of the code for a thunk function; @code{TARGET_ASM_FUNCTION_PROLOGUE}\n\
-and @code{TARGET_ASM_FUNCTION_EPILOGUE} are not invoked.\n\
-\n\
-The @var{thunk_fndecl} is redundant.  (@var{delta} and @var{function}\n\
-have already been extracted from it.)  It might possibly be useful on\n\
-some targets, but probably not.\n\
-\n\
-If you do not define this macro, the target-independent code in the C++\n\
-front end will generate a less efficient heavyweight thunk that calls\n\
-@var{function} instead of jumping to it.  The generic approach does\n\
-not support varargs.",
- void, (FILE *file, tree thunk_fndecl, HOST_WIDE_INT delta,
-	HOST_WIDE_INT vcall_offset, tree function),
- NULL)
-
-/* Determine whether output_mi_thunk would succeed.  */
-/* ??? Ideally, this hook would not exist, and success or failure
-   would be returned from output_mi_thunk directly.  But there's
-   too much undo-able setup involved in invoking output_mi_thunk.
-   Could be fixed by making output_mi_thunk emit rtl instead of
-   text to the output file.  */
-DEFHOOK
-(can_output_mi_thunk,
- "A function that returns true if TARGET_ASM_OUTPUT_MI_THUNK would be able\n\
-to output the assembler code for the thunk function specified by the\n\
-arguments it is passed, and false otherwise.  In the latter case, the\n\
-generic approach will be used by the C++ front end, with the limitations\n\
-previously exposed.",
- bool, (const_tree thunk_fndecl, HOST_WIDE_INT delta,
-	HOST_WIDE_INT vcall_offset, const_tree function),
- hook_bool_const_tree_hwi_hwi_const_tree_false)
-
-/* Output any boilerplate text needed at the beginning of a
-   translation unit.  */
-DEFHOOK
-(file_start,
- "Output to @code{asm_out_file} any text which the assembler expects to\n\
-find at the beginning of a file.  The default behavior is controlled\n\
-by two flags, documented below.  Unless your target's assembler is\n\
-quite unusual, if you override the default, you should call\n\
-@code{default_file_start} at some point in your target hook.  This\n\
-lets other target files rely on these variables.",
- void, (void),
- default_file_start)
-
-/* Output any boilerplate text needed at the end of a translation unit.  */
-DEFHOOK
-(file_end,
- "Output to @code{asm_out_file} any text which the assembler expects\n\
-to find at the end of a file.  The default is to output nothing.",
- void, (void),
- hook_void_void)
-
-/* Output any boilerplate text needed at the beginning of an
-   LTO output stream.  */
-DEFHOOK
-(lto_start,
- "Output to @code{asm_out_file} any text which the assembler expects\n\
-to find at the start of an LTO section.  The default is to output\n\
-nothing.",
- void, (void),
- hook_void_void)
-
-/* Output any boilerplate text needed at the end of an
-   LTO output stream.  */
-DEFHOOK
-(lto_end,
- "Output to @code{asm_out_file} any text which the assembler expects\n\
-to find at the end of an LTO section.  The default is to output\n\
-nothing.",
- void, (void),
- hook_void_void)
-
-/* Output any boilerplace text needed at the end of a
-   translation unit before debug and unwind info is emitted.  */
-DEFHOOK
-(code_end,
- "Output to @code{asm_out_file} any text which is needed before emitting\n\
-unwind info and debug info at the end of a file.  Some targets emit\n\
-here PIC setup thunks that cannot be emitted at the end of file,\n\
-because they couldn't have unwind info then.  The default is to output\n\
-nothing.",
- void, (void),
- hook_void_void)
-
-/* Output an assembler pseudo-op to declare a library function name
-   external.  */
-DEFHOOK
-(external_libcall,
- "This target hook is a function to output to @var{asm_out_file} an assembler\n\
-pseudo-op to declare a library function name external.  The name of the\n\
-library function is given by @var{symref}, which is a @code{symbol_ref}.",
- void, (rtx symref),
- default_external_libcall)
-
-/* Output an assembler directive to mark decl live. This instructs
-   linker to not dead code strip this symbol.  */
-DEFHOOK
-(mark_decl_preserved,
- "This target hook is a function to output to @var{asm_out_file} an assembler\n\
-directive to annotate @var{symbol} as used.  The Darwin target uses the\n\
-.no_dead_code_strip directive.",
- void, (const char *symbol),
- hook_void_constcharptr)
-
-/* Output a record of the command line switches that have been passed.  */
-DEFHOOK
-(record_gcc_switches,
- "Provides the target with the ability to record the gcc command line\n\
-switches that have been passed to the compiler, and options that are\n\
-enabled.  The @var{type} argument specifies what is being recorded.\n\
-It can take the following values:\n\
-\n\
-@table @gcctabopt\n\
-@item SWITCH_TYPE_PASSED\n\
-@var{text} is a command line switch that has been set by the user.\n\
-\n\
-@item SWITCH_TYPE_ENABLED\n\
-@var{text} is an option which has been enabled.  This might be as a\n\
-direct result of a command line switch, or because it is enabled by\n\
-default or because it has been enabled as a side effect of a different\n\
-command line switch.  For example, the @option{-O2} switch enables\n\
-various different individual optimization passes.\n\
-\n\
-@item SWITCH_TYPE_DESCRIPTIVE\n\
-@var{text} is either NULL or some descriptive text which should be\n\
-ignored.  If @var{text} is NULL then it is being used to warn the\n\
-target hook that either recording is starting or ending.  The first\n\
-time @var{type} is SWITCH_TYPE_DESCRIPTIVE and @var{text} is NULL, the\n\
-warning is for start up and the second time the warning is for\n\
-wind down.  This feature is to allow the target hook to make any\n\
-necessary preparations before it starts to record switches and to\n\
-perform any necessary tidying up after it has finished recording\n\
-switches.\n\
-\n\
-@item SWITCH_TYPE_LINE_START\n\
-This option can be ignored by this target hook.\n\
-\n\
-@item  SWITCH_TYPE_LINE_END\n\
-This option can be ignored by this target hook.\n\
-@end table\n\
-\n\
-The hook's return value must be zero.  Other return values may be\n\
-supported in the future.\n\
-\n\
-By default this hook is set to NULL, but an example implementation is\n\
-provided for ELF based targets.  Called @var{elf_record_gcc_switches},\n\
-it records the switches as ASCII text inside a new, string mergeable\n\
-section in the assembler output file.  The name of the new section is\n\
-provided by the @code{TARGET_ASM_RECORD_GCC_SWITCHES_SECTION} target\n\
-hook.",
- int, (print_switch_type type, const char *text),
- NULL)
-
-/* The name of the section that the example ELF implementation of
-   record_gcc_switches will use to store the information.  Target
-   specific versions of record_gcc_switches may or may not use
-   this information.  */
-DEFHOOKPOD
-(record_gcc_switches_section,
- "This is the name of the section that will be created by the example\n\
-ELF implementation of the @code{TARGET_ASM_RECORD_GCC_SWITCHES} target\n\
-hook.",
- const char *, ".GCC.command.line")
-
-/* Output the definition of a section anchor.  */
-DEFHOOK
-(output_anchor,
- "Write the assembly code to define section anchor @var{x}, which is a\n\
-@code{SYMBOL_REF} for which @samp{SYMBOL_REF_ANCHOR_P (@var{x})} is true.\n\
-The hook is called with the assembly output position set to the beginning\n\
-of @code{SYMBOL_REF_BLOCK (@var{x})}.\n\
-\n\
-If @code{ASM_OUTPUT_DEF} is available, the hook's default definition uses\n\
-it to define the symbol as @samp{. + SYMBOL_REF_BLOCK_OFFSET (@var{x})}.\n\
-If @code{ASM_OUTPUT_DEF} is not available, the hook's default definition\n\
-is @code{NULL}, which disables the use of section anchors altogether.",
- void, (rtx x),
- default_asm_output_anchor)
-
-DEFHOOK
-(output_ident,
- "Output a string based on @var{name}, suitable for the @samp{#ident} \
- directive, or the equivalent directive or pragma in non-C-family languages. \
- If this hook is not defined, nothing is output for the @samp{#ident} \
- directive.",
- void, (const char *name),
- hook_void_constcharptr)
-
-/* Output a DTP-relative reference to a TLS symbol.  */
-DEFHOOK
-(output_dwarf_dtprel,
- "If defined, this target hook is a function which outputs a DTP-relative\n\
-reference to the given TLS symbol of the specified size.",
- void, (FILE *file, int size, rtx x),
- NULL)
-
-/* Some target machines need to postscan each insn after it is output.  */
-DEFHOOK
-(final_postscan_insn,
- "If defined, this target hook is a function which is executed just after the\n\
-output of assembler code for @var{insn}, to change the mode of the assembler\n\
-if necessary.\n\
-\n\
-Here the argument @var{opvec} is the vector containing the operands\n\
-extracted from @var{insn}, and @var{noperands} is the number of\n\
-elements of the vector which contain meaningful data for this insn.\n\
-The contents of this vector are what was used to convert the insn\n\
-template into assembler code, so you can change the assembler mode\n\
-by checking the contents of the vector.",
- void, (FILE *file, rtx insn, rtx *opvec, int noperands),
- NULL)
-
-/* Emit the trampoline template.  This hook may be NULL.  */
-DEFHOOK
-(trampoline_template,
- "This hook is called by @code{assemble_trampoline_template} to output,\n\
-on the stream @var{f}, assembler code for a block of data that contains\n\
-the constant parts of a trampoline.  This code should not include a\n\
-label---the label is taken care of automatically.\n\
-\n\
-If you do not define this hook, it means no template is needed\n\
-for the target.  Do not define this hook on systems where the block move\n\
-code to copy the trampoline into place would be larger than the code\n\
-to generate it on the spot.",
- void, (FILE *f),
- NULL)
-
-DEFHOOK
-(output_source_filename,
- "Output COFF information or DWARF debugging information which indicates\
- that filename @var{name} is the current source file to the stdio\
- stream @var{file}.\n\
- \n\
- This target hook need not be defined if the standard form of output\
- for the file format in use is appropriate.",
- void ,(FILE *file, const char *name),
- default_asm_output_source_filename)
-
-DEFHOOK
-(output_addr_const_extra,
- "A target hook to recognize @var{rtx} patterns that @code{output_addr_const}\n\
-can't deal with, and output assembly code to @var{file} corresponding to\n\
-the pattern @var{x}.  This may be used to allow machine-dependent\n\
-@code{UNSPEC}s to appear within constants.\n\
-\n\
-If target hook fails to recognize a pattern, it must return @code{false},\n\
-so that a standard error message is printed.  If it prints an error message\n\
-itself, by calling, for example, @code{output_operand_lossage}, it may just\n\
-return @code{true}.",
- bool, (FILE *file, rtx x),
- hook_bool_FILEptr_rtx_false)
-
-/* ??? The TARGET_PRINT_OPERAND* hooks are part of the asm_out struct,
-   even though that is not reflected in the macro name to override their
-   initializers.  */
-#undef HOOK_PREFIX
-#define HOOK_PREFIX "TARGET_"
-
-/* Emit a machine-specific insn operand.  */
-/* ??? tm.texi only documents the old macro PRINT_OPERAND,
-   not this  hook, and uses a different name for the argument FILE.  */
-DEFHOOK_UNDOC
-(print_operand,
- "",
- void, (FILE *file, rtx x, int code),
- default_print_operand)
-
-/* Emit a machine-specific memory address.  */
-/* ??? tm.texi only documents the old macro PRINT_OPERAND_ADDRESS,
-   not this  hook, and uses different argument names.  */
-DEFHOOK_UNDOC
-(print_operand_address,
- "",
- void, (FILE *file, rtx addr),
- default_print_operand_address)
-
-/* Determine whether CODE is a valid punctuation character for the
-   `print_operand' hook.  */
-/* ??? tm.texi only documents the old macro PRINT_OPERAND_PUNCT_VALID_P,
-   not this  hook.  */
-DEFHOOK_UNDOC
-(print_operand_punct_valid_p,
- "",
- bool ,(unsigned char code),
- default_print_operand_punct_valid_p)
-
-/* Given a symbol name, perform same mangling as assemble_name and
-   ASM_OUTPUT_LABELREF, returning result as an IDENTIFIER_NODE.  */
-DEFHOOK
-(mangle_assembler_name,
- "Given a symbol @var{name}, perform same mangling as @code{varasm.c}'s\
- @code{assemble_name}, but in memory rather than to a file stream, returning\
- result as an @code{IDENTIFIER_NODE}.  Required for correct LTO symtabs.  The\
- default implementation calls the @code{TARGET_STRIP_NAME_ENCODING} hook and\
- then prepends the @code{USER_LABEL_PREFIX}, if any.",
- tree, (const char *name),
- default_mangle_assembler_name)
-
-HOOK_VECTOR_END (asm_out)
-
-/* Functions relating to instruction scheduling.  All of these
-   default to null pointers, which haifa-sched.c looks for and handles.  */
-#undef HOOK_PREFIX
-#define HOOK_PREFIX "TARGET_SCHED_"
-HOOK_VECTOR (TARGET_SCHED, sched)
-
-/* Given the current cost, COST, of an insn, INSN, calculate and
-   return a new cost based on its relationship to DEP_INSN through
-   the dependence LINK.  The default is to make no adjustment.  */
-DEFHOOK
-(adjust_cost,
- "This function corrects the value of @var{cost} based on the\n\
-relationship between @var{insn} and @var{dep_insn} through the\n\
-dependence @var{link}.  It should return the new value.  The default\n\
-is to make no adjustment to @var{cost}.  This can be used for example\n\
-to specify to the scheduler using the traditional pipeline description\n\
-that an output- or anti-dependence does not incur the same cost as a\n\
-data-dependence.  If the scheduler using the automaton based pipeline\n\
-description, the cost of anti-dependence is zero and the cost of\n\
-output-dependence is maximum of one and the difference of latency\n\
-times of the first and the second insns.  If these values are not\n\
-acceptable, you could use the hook to modify them too.  See also\n\
-@pxref{Processor pipeline description}.",
- int, (rtx insn, rtx link, rtx dep_insn, int cost), NULL)
-
-/* Adjust the priority of an insn as you see fit.  Returns the new priority.  */
-DEFHOOK
-(adjust_priority,
- "This hook adjusts the integer scheduling priority @var{priority} of\n\
-@var{insn}.  It should return the new priority.  Increase the priority to\n\
-execute @var{insn} earlier, reduce the priority to execute @var{insn}\n\
-later.  Do not define this hook if you do not need to adjust the\n\
-scheduling priorities of insns.",
- int, (rtx insn, int priority), NULL)
-
-/* Function which returns the maximum number of insns that can be
-   scheduled in the same machine cycle.  This must be constant
-   over an entire compilation.  The default is 1.  */
-DEFHOOK
-(issue_rate,
- "This hook returns the maximum number of instructions that can ever\n\
-issue at the same time on the target machine.  The default is one.\n\
-Although the insn scheduler can define itself the possibility of issue\n\
-an insn on the same cycle, the value can serve as an additional\n\
-constraint to issue insns on the same simulated processor cycle (see\n\
-hooks @samp{TARGET_SCHED_REORDER} and @samp{TARGET_SCHED_REORDER2}).\n\
-This value must be constant over the entire compilation.  If you need\n\
-it to vary depending on what the instructions are, you must use\n\
-@samp{TARGET_SCHED_VARIABLE_ISSUE}.",
- int, (void), NULL)
-
-/* Calculate how much this insn affects how many more insns we
-   can emit this cycle.  Default is they all cost the same.  */
-DEFHOOK
-(variable_issue,
- "This hook is executed by the scheduler after it has scheduled an insn\n\
-from the ready list.  It should return the number of insns which can\n\
-still be issued in the current cycle.  The default is\n\
-@samp{@w{@var{more} - 1}} for insns other than @code{CLOBBER} and\n\
-@code{USE}, which normally are not counted against the issue rate.\n\
-You should define this hook if some insns take more machine resources\n\
-than others, so that fewer insns can follow them in the same cycle.\n\
-@var{file} is either a null pointer, or a stdio stream to write any\n\
-debug output to.  @var{verbose} is the verbose level provided by\n\
-@option{-fsched-verbose-@var{n}}.  @var{insn} is the instruction that\n\
-was scheduled.",
- int, (FILE *file, int verbose, rtx insn, int more), NULL)
-
-/* Initialize machine-dependent scheduling code.  */
-DEFHOOK
-(init,
- "This hook is executed by the scheduler at the beginning of each block of\n\
-instructions that are to be scheduled.  @var{file} is either a null\n\
-pointer, or a stdio stream to write any debug output to.  @var{verbose}\n\
-is the verbose level provided by @option{-fsched-verbose-@var{n}}.\n\
-@var{max_ready} is the maximum number of insns in the current scheduling\n\
-region that can be live at the same time.  This can be used to allocate\n\
-scratch space if it is needed, e.g.@: by @samp{TARGET_SCHED_REORDER}.",
- void, (FILE *file, int verbose, int max_ready), NULL)
-
-/* Finalize machine-dependent scheduling code.  */
-DEFHOOK
-(finish,
- "This hook is executed by the scheduler at the end of each block of\n\
-instructions that are to be scheduled.  It can be used to perform\n\
-cleanup of any actions done by the other scheduling hooks.  @var{file}\n\
-is either a null pointer, or a stdio stream to write any debug output\n\
-to.  @var{verbose} is the verbose level provided by\n\
-@option{-fsched-verbose-@var{n}}.",
- void, (FILE *file, int verbose), NULL)
-
- /* Initialize machine-dependent function wide scheduling code.  */
-DEFHOOK
-(init_global,
- "This hook is executed by the scheduler after function level initializations.\n\
-@var{file} is either a null pointer, or a stdio stream to write any debug output to.\n\
-@var{verbose} is the verbose level provided by @option{-fsched-verbose-@var{n}}.\n\
-@var{old_max_uid} is the maximum insn uid when scheduling begins.",
- void, (FILE *file, int verbose, int old_max_uid), NULL)
-
-/* Finalize machine-dependent function wide scheduling code.  */
-DEFHOOK
-(finish_global,
- "This is the cleanup hook corresponding to @code{TARGET_SCHED_INIT_GLOBAL}.\n\
-@var{file} is either a null pointer, or a stdio stream to write any debug output to.\n\
-@var{verbose} is the verbose level provided by @option{-fsched-verbose-@var{n}}.",
- void, (FILE *file, int verbose), NULL)
-
-/* Reorder insns in a machine-dependent fashion, in two different
-       places.  Default does nothing.  */
-DEFHOOK
-(reorder,
- "This hook is executed by the scheduler after it has scheduled the ready\n\
-list, to allow the machine description to reorder it (for example to\n\
-combine two small instructions together on @samp{VLIW} machines).\n\
-@var{file} is either a null pointer, or a stdio stream to write any\n\
-debug output to.  @var{verbose} is the verbose level provided by\n\
-@option{-fsched-verbose-@var{n}}.  @var{ready} is a pointer to the ready\n\
-list of instructions that are ready to be scheduled.  @var{n_readyp} is\n\
-a pointer to the number of elements in the ready list.  The scheduler\n\
-reads the ready list in reverse order, starting with\n\
-@var{ready}[@var{*n_readyp} @minus{} 1] and going to @var{ready}[0].  @var{clock}\n\
-is the timer tick of the scheduler.  You may modify the ready list and\n\
-the number of ready insns.  The return value is the number of insns that\n\
-can issue this cycle; normally this is just @code{issue_rate}.  See also\n\
-@samp{TARGET_SCHED_REORDER2}.",
- int, (FILE *file, int verbose, rtx *ready, int *n_readyp, int clock), NULL)
-
-DEFHOOK
-(reorder2,
- "Like @samp{TARGET_SCHED_REORDER}, but called at a different time.  That\n\
-function is called whenever the scheduler starts a new cycle.  This one\n\
-is called once per iteration over a cycle, immediately after\n\
-@samp{TARGET_SCHED_VARIABLE_ISSUE}; it can reorder the ready list and\n\
-return the number of insns to be scheduled in the same cycle.  Defining\n\
-this hook can be useful if there are frequent situations where\n\
-scheduling one insn causes other insns to become ready in the same\n\
-cycle.  These other insns can then be taken into account properly.",
- int, (FILE *file, int verbose, rtx *ready, int *n_readyp, int clock), NULL)
-
-DEFHOOK
-(macro_fusion_p,
- "This hook is used to check whether target platform supports macro fusion.",
- bool, (void), NULL)
-
-DEFHOOK
-(macro_fusion_pair_p,
- "This hook is used to check whether two insns could be macro fused for\n\
-target microarchitecture. If this hook returns true for the given insn pair\n\
-(@var{condgen} and @var{condjmp}), scheduler will put them into a sched\n\
-group, and they will not be scheduled apart.",
- bool, (rtx condgen, rtx condjmp), NULL)
-
-/* The following member value is a pointer to a function called
-   after evaluation forward dependencies of insns in chain given
-   by two parameter values (head and tail correspondingly).  */
-DEFHOOK
-(dependencies_evaluation_hook,
- "This hook is called after evaluation forward dependencies of insns in\n\
-chain given by two parameter values (@var{head} and @var{tail}\n\
-correspondingly) but before insns scheduling of the insn chain.  For\n\
-example, it can be used for better insn classification if it requires\n\
-analysis of dependencies.  This hook can use backward and forward\n\
-dependencies of the insn scheduler because they are already\n\
-calculated.",
- void, (rtx head, rtx tail), NULL)
-
-/* The values of the following four members are pointers to functions
-   used to simplify the automaton descriptions.  dfa_pre_cycle_insn and
-   dfa_post_cycle_insn give functions returning insns which are used to
-   change the pipeline hazard recognizer state when the new simulated
-   processor cycle correspondingly starts and finishes.  The function
-   defined by init_dfa_pre_cycle_insn and init_dfa_post_cycle_insn are
-   used to initialize the corresponding insns.  The default values of
-   the members result in not changing the automaton state when the
-   new simulated processor cycle correspondingly starts and finishes.  */
-
-DEFHOOK
-(init_dfa_pre_cycle_insn,
- "The hook can be used to initialize data used by the previous hook.",
- void, (void), NULL)
-
-DEFHOOK
-(dfa_pre_cycle_insn,
- "The hook returns an RTL insn.  The automaton state used in the\n\
-pipeline hazard recognizer is changed as if the insn were scheduled\n\
-when the new simulated processor cycle starts.  Usage of the hook may\n\
-simplify the automaton pipeline description for some @acronym{VLIW}\n\
-processors.  If the hook is defined, it is used only for the automaton\n\
-based pipeline description.  The default is not to change the state\n\
-when the new simulated processor cycle starts.",
- rtx, (void), NULL)
-
-DEFHOOK
-(init_dfa_post_cycle_insn,
- "The hook is analogous to @samp{TARGET_SCHED_INIT_DFA_PRE_CYCLE_INSN} but\n\
-used to initialize data used by the previous hook.",
- void, (void), NULL)
-
-DEFHOOK
-(dfa_post_cycle_insn,
- "The hook is analogous to @samp{TARGET_SCHED_DFA_PRE_CYCLE_INSN} but used\n\
-to changed the state as if the insn were scheduled when the new\n\
-simulated processor cycle finishes.",
- rtx, (void), NULL)
-
-/* The values of the following two members are pointers to
-   functions used to simplify the automaton descriptions.
-   dfa_pre_advance_cycle and dfa_post_advance_cycle are getting called
-   immediately before and after cycle is advanced.  */
-
-DEFHOOK
-(dfa_pre_advance_cycle,
- "The hook to notify target that the current simulated cycle is about to finish.\n\
-The hook is analogous to @samp{TARGET_SCHED_DFA_PRE_CYCLE_INSN} but used\n\
-to change the state in more complicated situations - e.g., when advancing\n\
-state on a single insn is not enough.",
- void, (void), NULL)
-
-DEFHOOK
-(dfa_post_advance_cycle,
- "The hook to notify target that new simulated cycle has just started.\n\
-The hook is analogous to @samp{TARGET_SCHED_DFA_POST_CYCLE_INSN} but used\n\
-to change the state in more complicated situations - e.g., when advancing\n\
-state on a single insn is not enough.",
- void, (void), NULL)
-
-/* The following member value is a pointer to a function returning value
-   which defines how many insns in queue `ready' will we try for
-   multi-pass scheduling.  If the member value is nonzero and the
-   function returns positive value, the DFA based scheduler will make
-   multi-pass scheduling for the first cycle.  In other words, we will
-   try to choose ready insn which permits to start maximum number of
-   insns on the same cycle.  */
-DEFHOOK
-(first_cycle_multipass_dfa_lookahead,
- "This hook controls better choosing an insn from the ready insn queue\n\
-for the @acronym{DFA}-based insn scheduler.  Usually the scheduler\n\
-chooses the first insn from the queue.  If the hook returns a positive\n\
-value, an additional scheduler code tries all permutations of\n\
-@samp{TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD ()}\n\
-subsequent ready insns to choose an insn whose issue will result in\n\
-maximal number of issued insns on the same cycle.  For the\n\
-@acronym{VLIW} processor, the code could actually solve the problem of\n\
-packing simple insns into the @acronym{VLIW} insn.  Of course, if the\n\
-rules of @acronym{VLIW} packing are described in the automaton.\n\
-\n\
-This code also could be used for superscalar @acronym{RISC}\n\
-processors.  Let us consider a superscalar @acronym{RISC} processor\n\
-with 3 pipelines.  Some insns can be executed in pipelines @var{A} or\n\
-@var{B}, some insns can be executed only in pipelines @var{B} or\n\
-@var{C}, and one insn can be executed in pipeline @var{B}.  The\n\
-processor may issue the 1st insn into @var{A} and the 2nd one into\n\
-@var{B}.  In this case, the 3rd insn will wait for freeing @var{B}\n\
-until the next cycle.  If the scheduler issues the 3rd insn the first,\n\
-the processor could issue all 3 insns per cycle.\n\
-\n\
-Actually this code demonstrates advantages of the automaton based\n\
-pipeline hazard recognizer.  We try quickly and easy many insn\n\
-schedules to choose the best one.\n\
-\n\
-The default is no multipass scheduling.",
- int, (void), NULL)
-
-/* The following member value is pointer to a function controlling
-   what insns from the ready insn queue will be considered for the
-   multipass insn scheduling.  If the hook returns zero for insn
-   passed as the parameter, the insn will be not chosen to be issued.  */
-DEFHOOK
-(first_cycle_multipass_dfa_lookahead_guard,
- "\n\
-This hook controls what insns from the ready insn queue will be\n\
-considered for the multipass insn scheduling.  If the hook returns\n\
-zero for @var{insn}, the insn will be not chosen to\n\
-be issued.\n\
-\n\
-The default is that any ready insns can be chosen to be issued.",
- int, (rtx insn), NULL)
-
-/* This hook prepares the target for a new round of multipass
-   scheduling.
-   DATA is a pointer to target-specific data used for multipass scheduling.
-   READY_TRY and N_READY represent the current state of search in the
-   optimization space.  The target can filter out instructions that
-   should not be tried during current round by setting corresponding
-   elements in READY_TRY to non-zero.
-   FIRST_CYCLE_INSN_P is true if this is the first round of multipass
-   scheduling on current cycle.  */
-DEFHOOK
-(first_cycle_multipass_begin,
- "This hook prepares the target backend for a new round of multipass\n\
-scheduling.",
- void, (void *data, char *ready_try, int n_ready, bool first_cycle_insn_p),
- NULL)
-
-/* This hook is called when multipass scheduling evaluates instruction INSN.
-   DATA is a pointer to target-specific data that can be used to record effects
-   of INSN on CPU that are not described in DFA.
-   READY_TRY and N_READY represent the current state of search in the
-   optimization space.  The target can filter out instructions that
-   should not be tried after issuing INSN by setting corresponding
-   elements in READY_TRY to non-zero.
-   INSN is the instruction being evaluated.
-   PREV_DATA is a pointer to target-specific data corresponding
-   to a state before issuing INSN.  */
-DEFHOOK
-(first_cycle_multipass_issue,
- "This hook is called when multipass scheduling evaluates instruction INSN.",
- void, (void *data, char *ready_try, int n_ready, rtx insn,
-	const void *prev_data), NULL)
-
-/* This hook is called when multipass scheduling backtracks from evaluation of
-   instruction corresponding to DATA.
-   DATA is a pointer to target-specific data that stores the effects
-   of instruction from which the algorithm backtracks on CPU that are not
-   described in DFA.
-   READY_TRY and N_READY represent the current state of search in the
-   optimization space.  The target can filter out instructions that
-   should not be tried after issuing INSN by setting corresponding
-   elements in READY_TRY to non-zero.  */
-DEFHOOK
-(first_cycle_multipass_backtrack,
- "This is called when multipass scheduling backtracks from evaluation of\n\
-an instruction.",
- void, (const void *data, char *ready_try, int n_ready), NULL)
-
-/* This hook notifies the target about the result of the concluded current
-   round of multipass scheduling.
-   DATA is a pointer.
-   If DATA is non-NULL it points to target-specific data used for multipass
-   scheduling which corresponds to instruction at the start of the chain of
-   the winning solution.  DATA is NULL when multipass scheduling cannot find
-   a good enough solution on current cycle and decides to retry later,
-   usually after advancing the cycle count.  */
-DEFHOOK
-(first_cycle_multipass_end,
- "This hook notifies the target about the result of the concluded current\n\
-round of multipass scheduling.",
- void, (const void *data), NULL)
-
-/* This hook is called to initialize target-specific data for multipass
-   scheduling after it has been allocated.
-   DATA is a pointer to target-specific data that stores the effects
-   of instruction from which the algorithm backtracks on CPU that are not
-   described in DFA.  */
-DEFHOOK
-(first_cycle_multipass_init,
- "This hook initializes target-specific data used in multipass scheduling.",
- void, (void *data), NULL)
-
-/* This hook is called to finalize target-specific data for multipass
-   scheduling before it is deallocated.
-   DATA is a pointer to target-specific data that stores the effects
-   of instruction from which the algorithm backtracks on CPU that are not
-   described in DFA.  */
-DEFHOOK
-(first_cycle_multipass_fini,
- "This hook finalizes target-specific data used in multipass scheduling.",
- void, (void *data), NULL)
-
-/* The following member value is pointer to a function called by
-   the insn scheduler before issuing insn passed as the third
-   parameter on given cycle.  If the hook returns nonzero, the
-   insn is not issued on given processors cycle.  Instead of that,
-   the processor cycle is advanced.  If the value passed through
-   the last parameter is zero, the insn ready queue is not sorted
-   on the new cycle start as usually.  The first parameter passes
-   file for debugging output.  The second one passes the scheduler
-   verbose level of the debugging output.  The forth and the fifth
-   parameter values are correspondingly processor cycle on which
-   the previous insn has been issued and the current processor cycle.  */
-DEFHOOK
-(dfa_new_cycle,
- "This hook is called by the insn scheduler before issuing @var{insn}\n\
-on cycle @var{clock}.  If the hook returns nonzero,\n\
-@var{insn} is not issued on this processor cycle.  Instead,\n\
-the processor cycle is advanced.  If *@var{sort_p}\n\
-is zero, the insn ready queue is not sorted on the new cycle\n\
-start as usually.  @var{dump} and @var{verbose} specify the file and\n\
-verbosity level to use for debugging output.\n\
-@var{last_clock} and @var{clock} are, respectively, the\n\
-processor cycle on which the previous insn has been issued,\n\
-and the current processor cycle.",
- int, (FILE *dump, int verbose, rtx insn, int last_clock,
-       int clock, int *sort_p),
- NULL)
-
-/* The following member value is a pointer to a function called by the
-   insn scheduler.  It should return true if there exists a dependence
-   which is considered costly by the target, between the insn
-   DEP_PRO (&_DEP), and the insn DEP_CON (&_DEP).  The first parameter is
-   the dep that represents the dependence between the two insns.  The
-   second argument is the cost of the dependence as estimated by
-   the scheduler.  The last argument is the distance in cycles
-   between the already scheduled insn (first parameter) and the
-   second insn (second parameter).  */
-DEFHOOK
-(is_costly_dependence,
- "This hook is used to define which dependences are considered costly by\n\
-the target, so costly that it is not advisable to schedule the insns that\n\
-are involved in the dependence too close to one another.  The parameters\n\
-to this hook are as follows:  The first parameter @var{_dep} is the dependence\n\
-being evaluated.  The second parameter @var{cost} is the cost of the\n\
-dependence as estimated by the scheduler, and the third\n\
-parameter @var{distance} is the distance in cycles between the two insns.\n\
-The hook returns @code{true} if considering the distance between the two\n\
-insns the dependence between them is considered costly by the target,\n\
-and @code{false} otherwise.\n\
-\n\
-Defining this hook can be useful in multiple-issue out-of-order machines,\n\
-where (a) it's practically hopeless to predict the actual data/resource\n\
-delays, however: (b) there's a better chance to predict the actual grouping\n\
-that will be formed, and (c) correctly emulating the grouping can be very\n\
-important.  In such targets one may want to allow issuing dependent insns\n\
-closer to one another---i.e., closer than the dependence distance;  however,\n\
-not in cases of ``costly dependences'', which this hooks allows to define.",
- bool, (struct _dep *_dep, int cost, int distance), NULL)
-
-DEFHOOK_UNDOC
-(adjust_cost_2,
- "Given the current cost, @var{cost}, of an insn, @var{insn}, calculate and\
- return a new cost based on its relationship to @var{dep_insn} through the\
- dependence of weakness @var{dw}.  The default is to make no adjustment.",
- int, (rtx insn, int dep_type1, rtx dep_insn, int cost, unsigned int dw), NULL)
-
-/* The following member value is a pointer to a function called
-   by the insn scheduler. This hook is called to notify the backend
-   that new instructions were emitted.  */
-DEFHOOK
-(h_i_d_extended,
- "This hook is called by the insn scheduler after emitting a new instruction to\n\
-the instruction stream.  The hook notifies a target backend to extend its\n\
-per instruction data structures.",
- void, (void), NULL)
-
-/* Next 5 functions are for multi-point scheduling.  */
-
-/* Allocate memory for scheduler context.  */
-DEFHOOK
-(alloc_sched_context,
- "Return a pointer to a store large enough to hold target scheduling context.",
- void *, (void), NULL)
-
-/* Fills the context from the local machine scheduler context.  */
-DEFHOOK
-(init_sched_context,
- "Initialize store pointed to by @var{tc} to hold target scheduling context.\n\
-It @var{clean_p} is true then initialize @var{tc} as if scheduler is at the\n\
-beginning of the block.  Otherwise, copy the current context into @var{tc}.",
- void, (void *tc, bool clean_p), NULL)
-
-/* Sets local machine scheduler context to a saved value.  */
-DEFHOOK
-(set_sched_context,
- "Copy target scheduling context pointed to by @var{tc} to the current context.",
- void, (void *tc), NULL)
-
-/* Clears a scheduler context so it becomes like after init.  */
-DEFHOOK
-(clear_sched_context,
- "Deallocate internal data in target scheduling context pointed to by @var{tc}.",
- void, (void *tc), NULL)
-
-/* Frees the scheduler context.  */
-DEFHOOK
-(free_sched_context,
- "Deallocate a store for target scheduling context pointed to by @var{tc}.",
- void, (void *tc), NULL)
-
-/* The following member value is a pointer to a function called
-   by the insn scheduler.
-   The first parameter is an instruction, the second parameter is the type
-   of the requested speculation, and the third parameter is a pointer to the
-   speculative pattern of the corresponding type (set if return value == 1).
-   It should return
-   -1, if there is no pattern, that will satisfy the requested speculation type,
-   0, if current pattern satisfies the requested speculation type,
-   1, if pattern of the instruction should be changed to the newly
-   generated one.  */
-DEFHOOK
-(speculate_insn,
- "This hook is called by the insn scheduler when @var{insn} has only\n\
-speculative dependencies and therefore can be scheduled speculatively.\n\
-The hook is used to check if the pattern of @var{insn} has a speculative\n\
-version and, in case of successful check, to generate that speculative\n\
-pattern.  The hook should return 1, if the instruction has a speculative form,\n\
-or @minus{}1, if it doesn't.  @var{request} describes the type of requested\n\
-speculation.  If the return value equals 1 then @var{new_pat} is assigned\n\
-the generated speculative pattern.",
- int, (rtx insn, unsigned int dep_status, rtx *new_pat), NULL)
-
-/* The following member value is a pointer to a function called
-   by the insn scheduler.  It should return true if the check instruction
-   passed as the parameter needs a recovery block.  */
-DEFHOOK
-(needs_block_p,
- "This hook is called by the insn scheduler during generation of recovery code\n\
-for @var{insn}.  It should return @code{true}, if the corresponding check\n\
-instruction should branch to recovery code, or @code{false} otherwise.",
- bool, (unsigned int dep_status), NULL)
-
-/* The following member value is a pointer to a function called
-   by the insn scheduler.  It should return a pattern for the check
-   instruction.
-   The first parameter is a speculative instruction, the second parameter
-   is the label of the corresponding recovery block (or null, if it is a
-   simple check).  The third parameter is the kind of speculation that
-   is being performed.  */
-DEFHOOK
-(gen_spec_check,
- "This hook is called by the insn scheduler to generate a pattern for recovery\n\
-check instruction.  If @var{mutate_p} is zero, then @var{insn} is a\n\
-speculative instruction for which the check should be generated.\n\
-@var{label} is either a label of a basic block, where recovery code should\n\
-be emitted, or a null pointer, when requested check doesn't branch to\n\
-recovery code (a simple check).  If @var{mutate_p} is nonzero, then\n\
-a pattern for a branchy check corresponding to a simple check denoted by\n\
-@var{insn} should be generated.  In this case @var{label} can't be null.",
- rtx, (rtx insn, rtx label, unsigned int ds), NULL)
-
-/* The following member value is a pointer to a function controlling
-   what insns from the ready insn queue will be considered for the
-   multipass insn scheduling.  If the hook returns zero for the insn
-   passed as the parameter, the insn will not be chosen to be
-   issued.  This hook is used to discard speculative instructions,
-   that stand at the first position of the ready list.  */
-DEFHOOK
-(first_cycle_multipass_dfa_lookahead_guard_spec,
- "This hook is used as a workaround for\n\
-@samp{TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD_GUARD} not being\n\
-called on the first instruction of the ready list.  The hook is used to\n\
-discard speculative instructions that stand first in the ready list from\n\
-being scheduled on the current cycle.  If the hook returns @code{false},\n\
-@var{insn} will not be chosen to be issued.\n\
-For non-speculative instructions,\n\
-the hook should always return @code{true}.  For example, in the ia64 backend\n\
-the hook is used to cancel data speculative insns when the ALAT table\n\
-is nearly full.",
- bool, (const_rtx insn), NULL)
-
-/* The following member value is a pointer to a function that provides
-   information about the speculation capabilities of the target.
-   The parameter is a pointer to spec_info variable.  */
-DEFHOOK
-(set_sched_flags,
- "This hook is used by the insn scheduler to find out what features should be\n\
-enabled/used.\n\
-The structure *@var{spec_info} should be filled in by the target.\n\
-The structure describes speculation types that can be used in the scheduler.",
- void, (struct spec_info_def *spec_info), NULL)
-
-DEFHOOK_UNDOC
-(get_insn_spec_ds,
- "Return speculation types of instruction @var{insn}.",
- unsigned int, (rtx insn), NULL)
-
-DEFHOOK_UNDOC
-(get_insn_checked_ds,
- "Return speculation types that are checked for instruction @var{insn}",
- unsigned int, (rtx insn), NULL)
-
-DEFHOOK_UNDOC
-(skip_rtx_p,
- "Return bool if rtx scanning should just skip current layer and\
- advance to the inner rtxes.",
- bool, (const_rtx x), NULL)
-
-/* The following member value is a pointer to a function that provides
-   information about the target resource-based lower bound which is
-   used by the swing modulo scheduler.  The parameter is a pointer
-   to ddg variable.  */
-DEFHOOK
-(sms_res_mii,
- "This hook is called by the swing modulo scheduler to calculate a\n\
-resource-based lower bound which is based on the resources available in\n\
-the machine and the resources required by each instruction.  The target\n\
-backend can use @var{g} to calculate such bound.  A very simple lower\n\
-bound will be used in case this hook is not implemented: the total number\n\
-of instructions divided by the issue rate.",
- int, (struct ddg *g), NULL)
-
-/* The following member value is a function that initializes dispatch
-   schedling and adds instructions to dispatch window according to its
-   parameters.  */
-DEFHOOK
-(dispatch_do,
-"This hook is called by Haifa Scheduler.  It performs the operation specified\n\
-in its second parameter.",
-void, (rtx insn, int x),
-hook_void_rtx_int)
-
-/* The following member value is a a function that returns true is
-   dispatch schedling is supported in hardware and condition passed
-   as the second parameter is true.  */
-DEFHOOK
-(dispatch,
-"This hook is called by Haifa Scheduler.  It returns true if dispatch scheduling\n\
-is supported in hardware and the condition specified in the parameter is true.",
-bool, (rtx insn, int x),
-hook_bool_rtx_int_false)
-
-DEFHOOKPOD
-(exposed_pipeline,
-"True if the processor has an exposed pipeline, which means that not just\n\
-the order of instructions is important for correctness when scheduling, but\n\
-also the latencies of operations.",
-bool, false)
-
-/* The following member value is a function that returns number
-   of operations reassociator should try to put in parallel for
-   statements of the given type.  By default 1 is used.  */
-DEFHOOK
-(reassociation_width,
-"This hook is called by tree reassociator to determine a level of\n\
-parallelism required in output calculations chain.",
-int, (unsigned int opc, enum machine_mode mode),
-hook_int_uint_mode_1)
-
-HOOK_VECTOR_END (sched)
-
-/* Functions relating to OpenMP and Cilk Plus SIMD clones.  */
-#undef HOOK_PREFIX
-#define HOOK_PREFIX "TARGET_SIMD_CLONE_"
-HOOK_VECTOR (TARGET_SIMD_CLONE, simd_clone)
-
-DEFHOOK
-(compute_vecsize_and_simdlen,
-"This hook should set @var{vecsize_mangle}, @var{vecsize_int}, @var{vecsize_float}\n\
-fields in @var{simd_clone} structure pointed by @var{clone_info} argument and also\n\
-@var{simdlen} field if it was previously 0.\n\
-The hook should return 0 if SIMD clones shouldn't be emitted,\n\
-or number of @var{vecsize_mangle} variants that should be emitted.",
-int, (struct cgraph_node *, struct cgraph_simd_clone *, tree, int), NULL)
-
-DEFHOOK
-(adjust,
-"This hook should add implicit @code{attribute(target(\"...\"))} attribute\n\
-to SIMD clone @var{node} if needed.",
-void, (struct cgraph_node *), NULL)
-
-DEFHOOK
-(usable,
-"This hook should return -1 if SIMD clone @var{node} shouldn't be used\n\
-in vectorized loops in current function, or non-negative number if it is\n\
-usable.  In that case, the smaller the number is, the more desirable it is\n\
-to use it.",
-int, (struct cgraph_node *), NULL)
-
-HOOK_VECTOR_END (simd_clone)
-
-/* Functions relating to vectorization.  */
-#undef HOOK_PREFIX
-#define HOOK_PREFIX "TARGET_VECTORIZE_"
-HOOK_VECTOR (TARGET_VECTORIZE, vectorize)
-
-/* The following member value is a pointer to a function called
-   by the vectorizer, and return the decl of the target builtin
-   function.  */
-DEFHOOK
-(builtin_mask_for_load,
- "This hook should return the DECL of a function @var{f} that given an\n\
-address @var{addr} as an argument returns a mask @var{m} that can be\n\
-used to extract from two vectors the relevant data that resides in\n\
-@var{addr} in case @var{addr} is not properly aligned.\n\
-\n\
-The autovectorizer, when vectorizing a load operation from an address\n\
-@var{addr} that may be unaligned, will generate two vector loads from\n\
-the two aligned addresses around @var{addr}. It then generates a\n\
-@code{REALIGN_LOAD} operation to extract the relevant data from the\n\
-two loaded vectors. The first two arguments to @code{REALIGN_LOAD},\n\
-@var{v1} and @var{v2}, are the two vectors, each of size @var{VS}, and\n\
-the third argument, @var{OFF}, defines how the data will be extracted\n\
-from these two vectors: if @var{OFF} is 0, then the returned vector is\n\
-@var{v2}; otherwise, the returned vector is composed from the last\n\
-@var{VS}-@var{OFF} elements of @var{v1} concatenated to the first\n\
-@var{OFF} elements of @var{v2}.\n\
-\n\
-If this hook is defined, the autovectorizer will generate a call\n\
-to @var{f} (using the DECL tree that this hook returns) and will\n\
-use the return value of @var{f} as the argument @var{OFF} to\n\
-@code{REALIGN_LOAD}. Therefore, the mask @var{m} returned by @var{f}\n\
-should comply with the semantics expected by @code{REALIGN_LOAD}\n\
-described above.\n\
-If this hook is not defined, then @var{addr} will be used as\n\
-the argument @var{OFF} to @code{REALIGN_LOAD}, in which case the low\n\
-log2(@var{VS}) @minus{} 1 bits of @var{addr} will be considered.",
- tree, (void), NULL)
-
-/* Returns a code for builtin that realizes vectorized version of
-   function, or NULL_TREE if not available.  */
-DEFHOOK
-(builtin_vectorized_function,
- "This hook should return the decl of a function that implements the\n\
-vectorized variant of the builtin function with builtin function code\n\
-@var{code} or @code{NULL_TREE} if such a function is not available.\n\
-The value of @var{fndecl} is the builtin function declaration.  The\n\
-return type of the vectorized function shall be of vector type\n\
-@var{vec_type_out} and the argument types should be @var{vec_type_in}.",
- tree, (tree fndecl, tree vec_type_out, tree vec_type_in),
- default_builtin_vectorized_function)
-
-/* Returns a function declaration for a builtin that realizes the
-   vector conversion, or NULL_TREE if not available.  */
-DEFHOOK
-(builtin_conversion,
- "This hook should return the DECL of a function that implements conversion of the\n\
-input vector of type @var{src_type} to type @var{dest_type}.\n\
-The value of @var{code} is one of the enumerators in @code{enum tree_code} and\n\
-specifies how the conversion is to be applied\n\
-(truncation, rounding, etc.).\n\
-\n\
-If this hook is defined, the autovectorizer will use the\n\
-@code{TARGET_VECTORIZE_BUILTIN_CONVERSION} target hook when vectorizing\n\
-conversion. Otherwise, it will return @code{NULL_TREE}.",
- tree, (unsigned code, tree dest_type, tree src_type),
- default_builtin_vectorized_conversion)
-
-/* Cost of different vector/scalar statements in vectorization cost
-   model. In case of misaligned vector loads and stores the cost depends
-   on the data type and misalignment value.  */
-DEFHOOK
-(builtin_vectorization_cost,
- "Returns cost of different scalar or vector statements for vectorization cost model.\n\
-For vector memory operations the cost may depend on type (@var{vectype}) and\n\
-misalignment value (@var{misalign}).",
- int, (enum vect_cost_for_stmt type_of_cost, tree vectype, int misalign),
- default_builtin_vectorization_cost)
-
-/* Return true if vector alignment is reachable (by peeling N
-   iterations) for the given type.  */
-DEFHOOK
-(vector_alignment_reachable,
- "Return true if vector alignment is reachable (by peeling N iterations) for the given type.",
- bool, (const_tree type, bool is_packed),
- default_builtin_vector_alignment_reachable)
-
-/* Return true if a vector created for vec_perm_const is valid.
-   A NULL indicates that all constants are valid permutations.  */
-DEFHOOK
-(vec_perm_const_ok,
- "Return true if a vector created for @code{vec_perm_const} is valid.",
- bool, (enum machine_mode, const unsigned char *sel),
- NULL)
-
-/* Return true if the target supports misaligned store/load of a
-   specific factor denoted in the third parameter.  The last parameter
-   is true if the access is defined in a packed struct.  */
-DEFHOOK
-(support_vector_misalignment,
- "This hook should return true if the target supports misaligned vector\n\
-store/load of a specific factor denoted in the @var{misalignment}\n\
-parameter.  The vector store/load should be of machine mode @var{mode} and\n\
-the elements in the vectors should be of type @var{type}.  @var{is_packed}\n\
-parameter is true if the memory access is defined in a packed struct.",
- bool,
- (enum machine_mode mode, const_tree type, int misalignment, bool is_packed),
- default_builtin_support_vector_misalignment)
-
-/* Return the builtin decl needed to load a vector of TYPE.  */
-DEFHOOK
-(builtin_tm_load,
- "This hook should return the built-in decl needed to load a vector of the "
- "given type within a transaction.",
- tree,
- (tree),
- default_builtin_tm_load_store)
-
-/* Return the builtin decl needed to store a vector of TYPE.  */
-DEFHOOK
-(builtin_tm_store,
- "This hook should return the built-in decl needed to store a vector of the "
- "given type within a transaction.",
- tree,
- (tree),
- default_builtin_tm_load_store)
-
-/* Returns the preferred mode for SIMD operations for the specified
-   scalar mode.  */
-DEFHOOK
-(preferred_simd_mode,
- "This hook should return the preferred mode for vectorizing scalar\n\
-mode @var{mode}.  The default is\n\
-equal to @code{word_mode}, because the vectorizer can do some\n\
-transformations even in absence of specialized @acronym{SIMD} hardware.",
- enum machine_mode,
- (enum machine_mode mode),
- default_preferred_simd_mode)
-
-/* Returns a mask of vector sizes to iterate over when auto-vectorizing
-   after processing the preferred one derived from preferred_simd_mode.  */
-DEFHOOK
-(autovectorize_vector_sizes,
- "This hook should return a mask of sizes that should be iterated over\n\
-after trying to autovectorize using the vector size derived from the\n\
-mode returned by @code{TARGET_VECTORIZE_PREFERRED_SIMD_MODE}.\n\
-The default is zero which means to not iterate over other vector sizes.",
- unsigned int,
- (void),
- default_autovectorize_vector_sizes)
-
-/* Target builtin that implements vector gather operation.  */
-DEFHOOK
-(builtin_gather,
- "Target builtin that implements vector gather operation.  @var{mem_vectype}\n\
-is the vector type of the load and @var{index_type} is scalar type of\n\
-the index, scaled by @var{scale}.\n\
-The default is @code{NULL_TREE} which means to not vectorize gather\n\
-loads.",
- tree,
- (const_tree mem_vectype, const_tree index_type, int scale),
- NULL)
-
-/* Target function to initialize the cost model for a loop or block.  */
-DEFHOOK
-(init_cost,
- "This hook should initialize target-specific data structures in preparation "
- "for modeling the costs of vectorizing a loop or basic block.  The default "
- "allocates three unsigned integers for accumulating costs for the prologue, "
- "body, and epilogue of the loop or basic block.  If @var{loop_info} is "
- "non-NULL, it identifies the loop being vectorized; otherwise a single block "
- "is being vectorized.",
- void *,
- (struct loop *loop_info),
- default_init_cost)
-
-/* Target function to record N statements of the given kind using the
-   given vector type within the cost model data for the current loop or
-    block.  */
-DEFHOOK
-(add_stmt_cost,
- "This hook should update the target-specific @var{data} in response to "
- "adding @var{count} copies of the given @var{kind} of statement to a "
- "loop or basic block.  The default adds the builtin vectorizer cost for "
- "the copies of the statement to the accumulator specified by @var{where}, "
- "(the prologue, body, or epilogue) and returns the amount added.  The "
- "return value should be viewed as a tentative cost that may later be "
- "revised.",
- unsigned,
- (void *data, int count, enum vect_cost_for_stmt kind,
-  struct _stmt_vec_info *stmt_info, int misalign,
-  enum vect_cost_model_location where),
- default_add_stmt_cost)
-
-/* Target function to calculate the total cost of the current vectorized
-   loop or block.  */
-DEFHOOK
-(finish_cost,
- "This hook should complete calculations of the cost of vectorizing a loop "
- "or basic block based on @var{data}, and return the prologue, body, and "
- "epilogue costs as unsigned integers.  The default returns the value of "
- "the three accumulators.",
- void,
- (void *data, unsigned *prologue_cost, unsigned *body_cost,
-  unsigned *epilogue_cost),
- default_finish_cost)
-
-/* Function to delete target-specific cost modeling data.  */
-DEFHOOK
-(destroy_cost_data,
- "This hook should release @var{data} and any related data structures "
- "allocated by TARGET_VECTORIZE_INIT_COST.  The default releases the "
- "accumulator.",
- void,
- (void *data),
- default_destroy_cost_data)
-
-HOOK_VECTOR_END (vectorize)
-
-#undef HOOK_PREFIX
-#define HOOK_PREFIX "TARGET_"
-
-/* Allow target specific overriding of option settings after options have
-  been changed by an attribute or pragma or when it is reset at the
-  end of the code affected by an attribute or pragma.  */
-DEFHOOK
-(override_options_after_change,
- "This target function is similar to the hook @code{TARGET_OPTION_OVERRIDE}\n\
-but is called when the optimize level is changed via an attribute or\n\
-pragma or when it is reset at the end of the code affected by the\n\
-attribute or pragma.  It is not called at the beginning of compilation\n\
-when @code{TARGET_OPTION_OVERRIDE} is called so if you want to perform these\n\
-actions then, you should have @code{TARGET_OPTION_OVERRIDE} call\n\
-@code{TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE}.",
- void, (void),
- hook_void_void)
-
-DEFHOOK_UNDOC
-(eh_return_filter_mode,
- "Return machine mode for filter value.",
- enum machine_mode, (void),
- default_eh_return_filter_mode)
-
-/* Return machine mode for libgcc expanded cmp instructions.  */
-DEFHOOK
-(libgcc_cmp_return_mode,
- "This target hook should return the mode to be used for the return value\n\
-of compare instructions expanded to libgcc calls.  If not defined\n\
-@code{word_mode} is returned which is the right choice for a majority of\n\
-targets.",
- enum machine_mode, (void),
- default_libgcc_cmp_return_mode)
-
-/* Return machine mode for libgcc expanded shift instructions.  */
-DEFHOOK
-(libgcc_shift_count_mode,
- "This target hook should return the mode to be used for the shift count operand\n\
-of shift instructions expanded to libgcc calls.  If not defined\n\
-@code{word_mode} is returned which is the right choice for a majority of\n\
-targets.",
- enum machine_mode, (void),
- default_libgcc_shift_count_mode)
-
-/* Return machine mode to be used for _Unwind_Word type.  */
-DEFHOOK
-(unwind_word_mode,
- "Return machine mode to be used for @code{_Unwind_Word} type.\n\
-The default is to use @code{word_mode}.",
- enum machine_mode, (void),
- default_unwind_word_mode)
-
-/* Given two decls, merge their attributes and return the result.  */
-DEFHOOK
-(merge_decl_attributes,
- "Define this target hook if the merging of decl attributes needs special\n\
-handling.  If defined, the result is a list of the combined\n\
-@code{DECL_ATTRIBUTES} of @var{olddecl} and @var{newdecl}.\n\
-@var{newdecl} is a duplicate declaration of @var{olddecl}.  Examples of\n\
-when this is needed are when one attribute overrides another, or when an\n\
-attribute is nullified by a subsequent definition.  This function may\n\
-call @code{merge_attributes} to handle machine-independent merging.\n\
-\n\
-@findex TARGET_DLLIMPORT_DECL_ATTRIBUTES\n\
-If the only target-specific handling you require is @samp{dllimport}\n\
-for Microsoft Windows targets, you should define the macro\n\
-@code{TARGET_DLLIMPORT_DECL_ATTRIBUTES} to @code{1}.  The compiler\n\
-will then define a function called\n\
-@code{merge_dllimport_decl_attributes} which can then be defined as\n\
-the expansion of @code{TARGET_MERGE_DECL_ATTRIBUTES}.  You can also\n\
-add @code{handle_dll_attribute} in the attribute table for your port\n\
-to perform initial processing of the @samp{dllimport} and\n\
-@samp{dllexport} attributes.  This is done in @file{i386/cygwin.h} and\n\
-@file{i386/i386.c}, for example.",
- tree, (tree olddecl, tree newdecl),
- merge_decl_attributes)
-
-/* Given two types, merge their attributes and return the result.  */
-DEFHOOK
-(merge_type_attributes,
- "Define this target hook if the merging of type attributes needs special\n\
-handling.  If defined, the result is a list of the combined\n\
-@code{TYPE_ATTRIBUTES} of @var{type1} and @var{type2}.  It is assumed\n\
-that @code{comptypes} has already been called and returned 1.  This\n\
-function may call @code{merge_attributes} to handle machine-independent\n\
-merging.",
- tree, (tree type1, tree type2),
- merge_type_attributes)
-
-/* Table of machine attributes and functions to handle them.
-   Ignored if NULL.  */
-DEFHOOKPOD
-(attribute_table,
- "If defined, this target hook points to an array of @samp{struct\n\
-attribute_spec} (defined in @file{tree.h}) specifying the machine\n\
-specific attributes for this target and some of the restrictions on the\n\
-entities to which these attributes are applied and the arguments they\n\
-take.",
- const struct attribute_spec *, NULL)
-
-/* Return true iff attribute NAME expects a plain identifier as its first
-   argument.  */
-DEFHOOK
-(attribute_takes_identifier_p,
- "If defined, this target hook is a function which returns true if the\n\
-machine-specific attribute named @var{name} expects an identifier\n\
-given as its first argument to be passed on as a plain identifier, not\n\
-subjected to name lookup.  If this is not defined, the default is\n\
-false for all machine-specific attributes.",
- bool, (const_tree name),
- hook_bool_const_tree_false)
-
-/* Return zero if the attributes on TYPE1 and TYPE2 are incompatible,
-   one if they are compatible and two if they are nearly compatible
-   (which causes a warning to be generated).  */
-DEFHOOK
-(comp_type_attributes,
- "If defined, this target hook is a function which returns zero if the attributes on\n\
-@var{type1} and @var{type2} are incompatible, one if they are compatible,\n\
-and two if they are nearly compatible (which causes a warning to be\n\
-generated).  If this is not defined, machine-specific attributes are\n\
-supposed always to be compatible.",
- int, (const_tree type1, const_tree type2),
- hook_int_const_tree_const_tree_1)
-
-/* Assign default attributes to the newly defined TYPE.  */
-DEFHOOK
-(set_default_type_attributes,
- "If defined, this target hook is a function which assigns default attributes to\n\
-the newly defined @var{type}.",
- void, (tree type),
- hook_void_tree)
-
-/* Insert attributes on the newly created DECL.  */
-DEFHOOK
-(insert_attributes,
- "Define this target hook if you want to be able to add attributes to a decl\n\
-when it is being created.  This is normally useful for back ends which\n\
-wish to implement a pragma by using the attributes which correspond to\n\
-the pragma's effect.  The @var{node} argument is the decl which is being\n\
-created.  The @var{attr_ptr} argument is a pointer to the attribute list\n\
-for this decl.  The list itself should not be modified, since it may be\n\
-shared with other decls, but attributes may be chained on the head of\n\
-the list and @code{*@var{attr_ptr}} modified to point to the new\n\
-attributes, or a copy of the list may be made if further changes are\n\
-needed.",
- void, (tree node, tree *attr_ptr),
- hook_void_tree_treeptr)
-
-/* Return true if FNDECL (which has at least one machine attribute)
-   can be inlined despite its machine attributes, false otherwise.  */
-DEFHOOK
-(function_attribute_inlinable_p,
- "@cindex inlining\n\
-This target hook returns @code{true} if it is OK to inline @var{fndecl}\n\
-into the current function, despite its having target-specific\n\
-attributes, @code{false} otherwise.  By default, if a function has a\n\
-target specific attribute attached to it, it will not be inlined.",
- bool, (const_tree fndecl),
- hook_bool_const_tree_false)
-
-/* Return true if bitfields in RECORD_TYPE should follow the
-   Microsoft Visual C++ bitfield layout rules.  */
-DEFHOOK
-(ms_bitfield_layout_p,
- "This target hook returns @code{true} if bit-fields in the given\n\
-@var{record_type} are to be laid out following the rules of Microsoft\n\
-Visual C/C++, namely: (i) a bit-field won't share the same storage\n\
-unit with the previous bit-field if their underlying types have\n\
-different sizes, and the bit-field will be aligned to the highest\n\
-alignment of the underlying types of itself and of the previous\n\
-bit-field; (ii) a zero-sized bit-field will affect the alignment of\n\
-the whole enclosing structure, even if it is unnamed; except that\n\
-(iii) a zero-sized bit-field will be disregarded unless it follows\n\
-another bit-field of nonzero size.  If this hook returns @code{true},\n\
-other macros that control bit-field layout are ignored.\n\
-\n\
-When a bit-field is inserted into a packed record, the whole size\n\
-of the underlying type is used by one or more same-size adjacent\n\
-bit-fields (that is, if its long:3, 32 bits is used in the record,\n\
-and any additional adjacent long bit-fields are packed into the same\n\
-chunk of 32 bits.  However, if the size changes, a new field of that\n\
-size is allocated).  In an unpacked record, this is the same as using\n\
-alignment, but not equivalent when packing.\n\
-\n\
-If both MS bit-fields and @samp{__attribute__((packed))} are used,\n\
-the latter will take precedence.  If @samp{__attribute__((packed))} is\n\
-used on a single field when MS bit-fields are in use, it will take\n\
-precedence for that field, but the alignment of the rest of the structure\n\
-may affect its placement.",
- bool, (const_tree record_type),
- hook_bool_const_tree_false)
-
-/* For now this is only an interface to WORDS_BIG_ENDIAN for
-   target-independent code like the front ends, need performance testing
-   before switching completely to the target hook.  */
-DEFHOOK_UNDOC
-(words_big_endian,
- "",
- bool, (void),
- targhook_words_big_endian)
-
-/* Likewise for FLOAT_WORDS_BIG_ENDIAN.  */
-DEFHOOK_UNDOC
-(float_words_big_endian,
- "",
- bool, (void),
- targhook_float_words_big_endian)
-
-DEFHOOK
-(float_exceptions_rounding_supported_p,
- "Returns true if the target supports IEEE 754 floating-point exceptions\
- and rounding modes, false otherwise.  This is intended to relate to the\
- @code{float} and @code{double} types, but not necessarily @code{long double}.\
- By default, returns true if the @code{adddf3} instruction pattern is\
- available and false otherwise, on the assumption that hardware floating\
- point supports exceptions and rounding modes but software floating point\
- does not.",
- bool, (void),
- default_float_exceptions_rounding_supported_p)
-
-/* True if the target supports decimal floating point.  */
-DEFHOOK
-(decimal_float_supported_p,
- "Returns true if the target supports decimal floating point.",
- bool, (void),
- default_decimal_float_supported_p)
-
-/* True if the target supports fixed-point.  */
-DEFHOOK
-(fixed_point_supported_p,
- "Returns true if the target supports fixed-point arithmetic.",
- bool, (void),
- default_fixed_point_supported_p)
-
-/* Return true if anonymous bitfields affect structure alignment.  */
-DEFHOOK
-(align_anon_bitfield,
- "When @code{PCC_BITFIELD_TYPE_MATTERS} is true this hook will determine\n\
-whether unnamed bitfields affect the alignment of the containing\n\
-structure.  The hook should return true if the structure should inherit\n\
-the alignment requirements of an unnamed bitfield's type.",
- bool, (void),
- hook_bool_void_false)
-
-/* Return true if volatile bitfields should use the narrowest type possible.
-   Return false if they should use the container type.  */
-DEFHOOK
-(narrow_volatile_bitfield,
- "This target hook should return @code{true} if accesses to volatile bitfields\n\
-should use the narrowest mode possible.  It should return @code{false} if\n\
-these accesses should use the bitfield container type.\n\
-\n\
-The default is @code{false}.",
- bool, (void),
- hook_bool_void_false)
-
-/* Set up target-specific built-in functions.  */
-DEFHOOK
-(init_builtins,
- "Define this hook if you have any machine-specific built-in functions\n\
-that need to be defined.  It should be a function that performs the\n\
-necessary setup.\n\
-\n\
-Machine specific built-in functions can be useful to expand special machine\n\
-instructions that would otherwise not normally be generated because\n\
-they have no equivalent in the source language (for example, SIMD vector\n\
-instructions or prefetch instructions).\n\
-\n\
-To create a built-in function, call the function\n\
-@code{lang_hooks.builtin_function}\n\
-which is defined by the language front end.  You can use any type nodes set\n\
-up by @code{build_common_tree_nodes};\n\
-only language front ends that use those two functions will call\n\
-@samp{TARGET_INIT_BUILTINS}.",
- void, (void),
- hook_void_void)
-
-/* Initialize (if INITIALIZE_P is true) and return the target-specific
-   built-in function decl for CODE.
-   Return NULL if that is not possible.  Return error_mark_node if CODE
-   is outside of the range of valid target builtin function codes.  */
-DEFHOOK
-(builtin_decl,
- "Define this hook if you have any machine-specific built-in functions\n\
-that need to be defined.  It should be a function that returns the\n\
-builtin function declaration for the builtin function code @var{code}.\n\
-If there is no such builtin and it cannot be initialized at this time\n\
-if @var{initialize_p} is true the function should return @code{NULL_TREE}.\n\
-If @var{code} is out of range the function should return\n\
-@code{error_mark_node}.",
- tree, (unsigned code, bool initialize_p), NULL)
-
-/* Expand a target-specific builtin.  */
-DEFHOOK
-(expand_builtin,
- "\n\
-Expand a call to a machine specific built-in function that was set up by\n\
-@samp{TARGET_INIT_BUILTINS}.  @var{exp} is the expression for the\n\
-function call; the result should go to @var{target} if that is\n\
-convenient, and have mode @var{mode} if that is convenient.\n\
-@var{subtarget} may be used as the target for computing one of\n\
-@var{exp}'s operands.  @var{ignore} is nonzero if the value is to be\n\
-ignored.  This function should return the result of the call to the\n\
-built-in function.",
- rtx,
- (tree exp, rtx target, rtx subtarget, enum machine_mode mode, int ignore),
- default_expand_builtin)
-
-/* Select a replacement for a target-specific builtin.  This is done
-   *before* regular type checking, and so allows the target to
-   implement a crude form of function overloading.  The result is a
-   complete expression that implements the operation.  PARAMS really
-   has type VEC(tree,gc)*, but we don't want to include tree.h here.  */
-DEFHOOK
-(resolve_overloaded_builtin,
- "Select a replacement for a machine specific built-in function that\n\
-was set up by @samp{TARGET_INIT_BUILTINS}.  This is done\n\
-@emph{before} regular type checking, and so allows the target to\n\
-implement a crude form of function overloading.  @var{fndecl} is the\n\
-declaration of the built-in function.  @var{arglist} is the list of\n\
-arguments passed to the built-in function.  The result is a\n\
-complete expression that implements the operation, usually\n\
-another @code{CALL_EXPR}.\n\
-@var{arglist} really has type @samp{VEC(tree,gc)*}",
- tree, (unsigned int /*location_t*/ loc, tree fndecl, void *arglist), NULL)
-
-/* Fold a target-specific builtin to a tree valid for both GIMPLE
-   and GENERIC.  */
-DEFHOOK
-(fold_builtin,
- "Fold a call to a machine specific built-in function that was set up by\n\
-@samp{TARGET_INIT_BUILTINS}.  @var{fndecl} is the declaration of the\n\
-built-in function.  @var{n_args} is the number of arguments passed to\n\
-the function; the arguments themselves are pointed to by @var{argp}.\n\
-The result is another tree, valid for both GIMPLE and GENERIC,\n\
-containing a simplified expression for the call's result.  If\n\
-@var{ignore} is true the value will be ignored.",
- tree, (tree fndecl, int n_args, tree *argp, bool ignore),
- hook_tree_tree_int_treep_bool_null)
-
-/* Fold a target-specific builtin to a valid GIMPLE tree.  */
-DEFHOOK
-(gimple_fold_builtin,
- "Fold a call to a machine specific built-in function that was set up\n\
-by @samp{TARGET_INIT_BUILTINS}.  @var{gsi} points to the gimple\n\
-statement holding the function call.  Returns true if any change\n\
-was made to the GIMPLE stream.",
- bool, (gimple_stmt_iterator *gsi),
- hook_bool_gsiptr_false)
-
-/* Target hook is used to compare the target attributes in two functions to
-   determine which function's features get higher priority.  This is used
-   during function multi-versioning to figure out the order in which two
-   versions must be dispatched.  A function version with a higher priority
-   is checked for dispatching earlier.  DECL1 and DECL2 are
-   the two function decls that will be compared. It returns positive value
-   if DECL1 is higher priority,  negative value if DECL2 is higher priority
-   and 0 if they are the same. */
-DEFHOOK
-(compare_version_priority,
- "This hook is used to compare the target attributes in two functions to\n\
-determine which function's features get higher priority.  This is used\n\
-during function multi-versioning to figure out the order in which two\n\
-versions must be dispatched.  A function version with a higher priority\n\
-is checked for dispatching earlier.  @var{decl1} and @var{decl2} are\n\
- the two function decls that will be compared.",
- int, (tree decl1, tree decl2), NULL)
-
-/*  Target hook is used to generate the dispatcher logic to invoke the right
-    function version at run-time for a given set of function versions.
-    ARG points to the callgraph node of the dispatcher function whose body
-    must be generated.  */
-DEFHOOK
-(generate_version_dispatcher_body,
- "This hook is used to generate the dispatcher logic to invoke the right\n\
-function version at run-time for a given set of function versions.\n\
-@var{arg} points to the callgraph node of the dispatcher function whose\n\
-body must be generated.",
- tree, (void *arg), NULL) 
-
-/* Target hook is used to get the dispatcher function for a set of function
-   versions.  The dispatcher function is called to invoke the right function
-   version at run-time.  DECL is one version from a set of semantically
-   identical versions.  */
-DEFHOOK
-(get_function_versions_dispatcher,
- "This hook is used to get the dispatcher function for a set of function\n\
-versions.  The dispatcher function is called to invoke the right function\n\
-version at run-time. @var{decl} is one version from a set of semantically\n\
-identical versions.",
- tree, (void *decl), NULL)
-
-/* Returns a code for a target-specific builtin that implements
-   reciprocal of the function, or NULL_TREE if not available.  */
-DEFHOOK
-(builtin_reciprocal,
- "This hook should return the DECL of a function that implements reciprocal of\n\
-the builtin function with builtin function code @var{fn}, or\n\
-@code{NULL_TREE} if such a function is not available.  @var{md_fn} is true\n\
-when @var{fn} is a code of a machine-dependent builtin function.  When\n\
-@var{sqrt} is true, additional optimizations that apply only to the reciprocal\n\
-of a square root function are performed, and only reciprocals of @code{sqrt}\n\
-function are valid.",
- tree, (unsigned fn, bool md_fn, bool sqrt),
- default_builtin_reciprocal)
-
-/* For a vendor-specific TYPE, return a pointer to a statically-allocated
-   string containing the C++ mangling for TYPE.  In all other cases, return
-   NULL.  */
-DEFHOOK
-(mangle_type,
- "If your target defines any fundamental types, or any types your target\n\
-uses should be mangled differently from the default, define this hook\n\
-to return the appropriate encoding for these types as part of a C++\n\
-mangled name.  The @var{type} argument is the tree structure representing\n\
-the type to be mangled.  The hook may be applied to trees which are\n\
-not target-specific fundamental types; it should return @code{NULL}\n\
-for all such types, as well as arguments it does not recognize.  If the\n\
-return value is not @code{NULL}, it must point to a statically-allocated\n\
-string constant.\n\
-\n\
-Target-specific fundamental types might be new fundamental types or\n\
-qualified versions of ordinary fundamental types.  Encode new\n\
-fundamental types as @samp{@w{u @var{n} @var{name}}}, where @var{name}\n\
-is the name used for the type in source code, and @var{n} is the\n\
-length of @var{name} in decimal.  Encode qualified versions of\n\
-ordinary types as @samp{@w{U @var{n} @var{name} @var{code}}}, where\n\
-@var{name} is the name used for the type qualifier in source code,\n\
-@var{n} is the length of @var{name} as above, and @var{code} is the\n\
-code used to represent the unqualified version of this type.  (See\n\
-@code{write_builtin_type} in @file{cp/mangle.c} for the list of\n\
-codes.)  In both cases the spaces are for clarity; do not include any\n\
-spaces in your string.\n\
-\n\
-This hook is applied to types prior to typedef resolution.  If the mangled\n\
-name for a particular type depends only on that type's main variant, you\n\
-can perform typedef resolution yourself using @code{TYPE_MAIN_VARIANT}\n\
-before mangling.\n\
-\n\
-The default version of this hook always returns @code{NULL}, which is\n\
-appropriate for a target that does not define any new fundamental\n\
-types.",
- const char *, (const_tree type),
- hook_constcharptr_const_tree_null)
-
-/* Make any adjustments to libfunc names needed for this target.  */
-DEFHOOK
-(init_libfuncs,
- "This hook should declare additional library routines or rename\n\
-existing ones, using the functions @code{set_optab_libfunc} and\n\
-@code{init_one_libfunc} defined in @file{optabs.c}.\n\
-@code{init_optabs} calls this macro after initializing all the normal\n\
-library routines.\n\
-\n\
-The default is to do nothing.  Most ports don't need to define this hook.",
- void, (void),
- hook_void_void)
-
- /* Add a __gnu_ prefix to library functions rather than just __.  */
-DEFHOOKPOD
-(libfunc_gnu_prefix,
- "If false (the default), internal library routines start with two\n\
-underscores.  If set to true, these routines start with @code{__gnu_}\n\
-instead.  E.g., @code{__muldi3} changes to @code{__gnu_muldi3}.  This\n\
-currently only affects functions defined in @file{libgcc2.c}.  If this\n\
-is set to true, the @file{tm.h} file must also\n\
-@code{#define LIBGCC2_GNU_PREFIX}.",
-  bool, false)
-
-/* Given a decl, a section name, and whether the decl initializer
-   has relocs, choose attributes for the section.  */
-/* ??? Should be merged with SELECT_SECTION and UNIQUE_SECTION.  */
-DEFHOOK
-(section_type_flags,
- "Choose a set of section attributes for use by @code{TARGET_ASM_NAMED_SECTION}\n\
-based on a variable or function decl, a section name, and whether or not the\n\
-declaration's initializer may contain runtime relocations.  @var{decl} may be\n\
-null, in which case read-write data should be assumed.\n\
-\n\
-The default version of this function handles choosing code vs data,\n\
-read-only vs read-write data, and @code{flag_pic}.  You should only\n\
-need to override this if your target has special flags that might be\n\
-set via @code{__attribute__}.",
- unsigned int, (tree decl, const char *name, int reloc),
- default_section_type_flags)
-
-DEFHOOK
-(libc_has_function,
- "This hook determines whether a function from a class of functions\n\
-@var{fn_class} is present at the runtime.",
- bool, (enum function_class fn_class),
- default_libc_has_function)
-
-/* True if new jumps cannot be created, to replace existing ones or
-   not, at the current point in the compilation.  */
-DEFHOOK
-(cannot_modify_jumps_p,
- "This target hook returns @code{true} past the point in which new jump\n\
-instructions could be created.  On machines that require a register for\n\
-every jump such as the SHmedia ISA of SH5, this point would typically be\n\
-reload, so this target hook should be defined to a function such as:\n\
-\n\
-@smallexample\n\
-static bool\n\
-cannot_modify_jumps_past_reload_p ()\n\
-@{\n\
-  return (reload_completed || reload_in_progress);\n\
-@}\n\
-@end smallexample",
- bool, (void),
- hook_bool_void_false)
-
-/* True if FOLLOWER may be modified to follow FOLLOWEE.  */
-DEFHOOK
-(can_follow_jump,
- "FOLLOWER and FOLLOWEE are JUMP_INSN instructions;\
-  return true if FOLLOWER may be modified to follow FOLLOWEE;\
-  false, if it can't.\
-  For example, on some targets, certain kinds of branches can't be made to\
-  follow through a hot/cold partitioning.",
- bool, (const_rtx follower, const_rtx followee),
- hook_bool_const_rtx_const_rtx_true)
-
-/* Return a register class for which branch target register
-   optimizations should be applied.  */
-DEFHOOK
-(branch_target_register_class,
- "This target hook returns a register class for which branch target register\n\
-optimizations should be applied.  All registers in this class should be\n\
-usable interchangeably.  After reload, registers in this class will be\n\
-re-allocated and loads will be hoisted out of loops and be subjected\n\
-to inter-block scheduling.",
- reg_class_t, (void),
- default_branch_target_register_class)
-
-/* Return true if branch target register optimizations should include
-   callee-saved registers that are not already live during the current
-   function.  AFTER_PE_GEN is true if prologues and epilogues have
-   already been generated.  */
-DEFHOOK
-(branch_target_register_callee_saved,
- "Branch target register optimization will by default exclude callee-saved\n\
-registers\n\
-that are not already live during the current function; if this target hook\n\
-returns true, they will be included.  The target code must than make sure\n\
-that all target registers in the class returned by\n\
-@samp{TARGET_BRANCH_TARGET_REGISTER_CLASS} that might need saving are\n\
-saved.  @var{after_prologue_epilogue_gen} indicates if prologues and\n\
-epilogues have already been generated.  Note, even if you only return\n\
-true when @var{after_prologue_epilogue_gen} is false, you still are likely\n\
-to have to make special provisions in @code{INITIAL_ELIMINATION_OFFSET}\n\
-to reserve space for caller-saved target registers.",
- bool, (bool after_prologue_epilogue_gen),
- hook_bool_bool_false)
-
-/* Return true if the target supports conditional execution.  */
-DEFHOOK
-(have_conditional_execution,
- "This target hook returns true if the target supports conditional execution.\n\
-This target hook is required only when the target has several different\n\
-modes and they have different conditional execution capability, such as ARM.",
- bool, (void),
- default_have_conditional_execution)
-
-/* Return a new value for loop unroll size.  */
-DEFHOOK
-(loop_unroll_adjust,
- "This target hook returns a new value for the number of times @var{loop}\n\
-should be unrolled. The parameter @var{nunroll} is the number of times\n\
-the loop is to be unrolled. The parameter @var{loop} is a pointer to\n\
-the loop, which is going to be checked for unrolling. This target hook\n\
-is required only when the target has special constraints like maximum\n\
-number of memory accesses.",
- unsigned, (unsigned nunroll, struct loop *loop),
- NULL)
-
-/* True if X is a legitimate MODE-mode immediate operand.  */
-DEFHOOK
-(legitimate_constant_p,
- "This hook returns true if @var{x} is a legitimate constant for a\n\
-@var{mode}-mode immediate operand on the target machine.  You can assume that\n\
-@var{x} satisfies @code{CONSTANT_P}, so you need not check this.\n\
-\n\
-The default definition returns true.",
- bool, (enum machine_mode mode, rtx x),
- hook_bool_mode_rtx_true)
-
-/* True if the constant X cannot be placed in the constant pool.  */
-DEFHOOK
-(cannot_force_const_mem,
- "This hook should return true if @var{x} is of a form that cannot (or\n\
-should not) be spilled to the constant pool.  @var{mode} is the mode\n\
-of @var{x}.\n\
-\n\
-The default version of this hook returns false.\n\
-\n\
-The primary reason to define this hook is to prevent reload from\n\
-deciding that a non-legitimate constant would be better reloaded\n\
-from the constant pool instead of spilling and reloading a register\n\
-holding the constant.  This restriction is often true of addresses\n\
-of TLS symbols for various targets.",
- bool, (enum machine_mode mode, rtx x),
- hook_bool_mode_rtx_false)
-
-DEFHOOK_UNDOC
-(cannot_copy_insn_p,
- "True if the insn @var{x} cannot be duplicated.",
- bool, (rtx), NULL)
-
-/* True if X is considered to be commutative.  */
-DEFHOOK
-(commutative_p,
- "This target hook returns @code{true} if @var{x} is considered to be commutative.\n\
-Usually, this is just COMMUTATIVE_P (@var{x}), but the HP PA doesn't consider\n\
-PLUS to be commutative inside a MEM@.  @var{outer_code} is the rtx code\n\
-of the enclosing rtl, if known, otherwise it is UNKNOWN.",
- bool, (const_rtx x, int outer_code),
- hook_bool_const_rtx_commutative_p)
-
-/* True if ADDR is an address-expression whose effect depends
-   on the mode of the memory reference it is used in.  */
-DEFHOOK
-(mode_dependent_address_p,
- "This hook returns @code{true} if memory address @var{addr} in address\n\
-space @var{addrspace} can have\n\
-different meanings depending on the machine mode of the memory\n\
-reference it is used for or if the address is valid for some modes\n\
-but not others.\n\
-\n\
-Autoincrement and autodecrement addresses typically have mode-dependent\n\
-effects because the amount of the increment or decrement is the size\n\
-of the operand being addressed.  Some machines have other mode-dependent\n\
-addresses.  Many RISC machines have no mode-dependent addresses.\n\
-\n\
-You may assume that @var{addr} is a valid address for the machine.\n\
-\n\
-The default version of this hook returns @code{false}.",
- bool, (const_rtx addr, addr_space_t addrspace),
- default_mode_dependent_address_p)
-
-/* Given an invalid address X for a given machine mode, try machine-specific
-   ways to make it legitimate.  Return X or an invalid address on failure.  */
-DEFHOOK
-(legitimize_address,
- "This hook is given an invalid memory address @var{x} for an\n\
-operand of mode @var{mode} and should try to return a valid memory\n\
-address.\n\
-\n\
-@findex break_out_memory_refs\n\
-@var{x} will always be the result of a call to @code{break_out_memory_refs},\n\
-and @var{oldx} will be the operand that was given to that function to produce\n\
-@var{x}.\n\
-\n\
-The code of the hook should not alter the substructure of\n\
-@var{x}.  If it transforms @var{x} into a more legitimate form, it\n\
-should return the new @var{x}.\n\
-\n\
-It is not necessary for this hook to come up with a legitimate address,\n\
-with the exception of native TLS addresses (@pxref{Emulated TLS}).\n\
-The compiler has standard ways of doing so in all cases.  In fact, if\n\
-the target supports only emulated TLS, it\n\
-is safe to omit this hook or make it return @var{x} if it cannot find\n\
-a valid way to legitimize the address.  But often a machine-dependent\n\
-strategy can generate better code.",
- rtx, (rtx x, rtx oldx, enum machine_mode mode),
- default_legitimize_address)
-
-/* Given an address RTX, undo the effects of LEGITIMIZE_ADDRESS.  */
-DEFHOOK
-(delegitimize_address,
- "This hook is used to undo the possibly obfuscating effects of the\n\
-@code{LEGITIMIZE_ADDRESS} and @code{LEGITIMIZE_RELOAD_ADDRESS} target\n\
-macros.  Some backend implementations of these macros wrap symbol\n\
-references inside an @code{UNSPEC} rtx to represent PIC or similar\n\
-addressing modes.  This target hook allows GCC's optimizers to understand\n\
-the semantics of these opaque @code{UNSPEC}s by converting them back\n\
-into their original form.",
- rtx, (rtx x),
- delegitimize_mem_from_attrs)
-
-/* Given an RTX, return true if it is not ok to emit it into debug info
-   section.  */
-DEFHOOK
-(const_not_ok_for_debug_p,
- "This hook should return true if @var{x} should not be emitted into\n\
-debug sections.",
- bool, (rtx x),
- hook_bool_rtx_false)
-
-/* Given an address RTX, say whether it is valid.  */
-DEFHOOK
-(legitimate_address_p,
- "A function that returns whether @var{x} (an RTX) is a legitimate memory\n\
-address on the target machine for a memory operand of mode @var{mode}.\n\
-\n\
-Legitimate addresses are defined in two variants: a strict variant and a\n\
-non-strict one.  The @var{strict} parameter chooses which variant is\n\
-desired by the caller.\n\
-\n\
-The strict variant is used in the reload pass.  It must be defined so\n\
-that any pseudo-register that has not been allocated a hard register is\n\
-considered a memory reference.  This is because in contexts where some\n\
-kind of register is required, a pseudo-register with no hard register\n\
-must be rejected.  For non-hard registers, the strict variant should look\n\
-up the @code{reg_renumber} array; it should then proceed using the hard\n\
-register number in the array, or treat the pseudo as a memory reference\n\
-if the array holds @code{-1}.\n\
-\n\
-The non-strict variant is used in other passes.  It must be defined to\n\
-accept all pseudo-registers in every context where some kind of\n\
-register is required.\n\
-\n\
-Normally, constant addresses which are the sum of a @code{symbol_ref}\n\
-and an integer are stored inside a @code{const} RTX to mark them as\n\
-constant.  Therefore, there is no need to recognize such sums\n\
-specifically as legitimate addresses.  Normally you would simply\n\
-recognize any @code{const} as legitimate.\n\
-\n\
-Usually @code{PRINT_OPERAND_ADDRESS} is not prepared to handle constant\n\
-sums that are not marked with  @code{const}.  It assumes that a naked\n\
-@code{plus} indicates indexing.  If so, then you @emph{must} reject such\n\
-naked constant sums as illegitimate addresses, so that none of them will\n\
-be given to @code{PRINT_OPERAND_ADDRESS}.\n\
-\n\
-@cindex @code{TARGET_ENCODE_SECTION_INFO} and address validation\n\
-On some machines, whether a symbolic address is legitimate depends on\n\
-the section that the address refers to.  On these machines, define the\n\
-target hook @code{TARGET_ENCODE_SECTION_INFO} to store the information\n\
-into the @code{symbol_ref}, and then check for it here.  When you see a\n\
-@code{const}, you will have to look inside it to find the\n\
-@code{symbol_ref} in order to determine the section.  @xref{Assembler\n\
-Format}.\n\
-\n\
-@cindex @code{GO_IF_LEGITIMATE_ADDRESS}\n\
-Some ports are still using a deprecated legacy substitute for\n\
-this hook, the @code{GO_IF_LEGITIMATE_ADDRESS} macro.  This macro\n\
-has this syntax:\n\
-\n\
-@example\n\
-#define GO_IF_LEGITIMATE_ADDRESS (@var{mode}, @var{x}, @var{label})\n\
-@end example\n\
-\n\
-@noindent\n\
-and should @code{goto @var{label}} if the address @var{x} is a valid\n\
-address on the target machine for a memory operand of mode @var{mode}.\n\
-\n\
-@findex REG_OK_STRICT\n\
-Compiler source files that want to use the strict variant of this\n\
-macro define the macro @code{REG_OK_STRICT}.  You should use an\n\
-@code{#ifdef REG_OK_STRICT} conditional to define the strict variant in\n\
-that case and the non-strict variant otherwise.\n\
-\n\
-Using the hook is usually simpler because it limits the number of\n\
-files that are recompiled when changes are made.",
- bool, (enum machine_mode mode, rtx x, bool strict),
- default_legitimate_address_p)
-
-/* True if the given constant can be put into an object_block.  */
-DEFHOOK
-(use_blocks_for_constant_p,
- "This hook should return true if pool entries for constant @var{x} can\n\
-be placed in an @code{object_block} structure.  @var{mode} is the mode\n\
-of @var{x}.\n\
-\n\
-The default version returns false for all constants.",
- bool, (enum machine_mode mode, const_rtx x),
- hook_bool_mode_const_rtx_false)
-
-/* True if the given decl can be put into an object_block.  */
-DEFHOOK
-(use_blocks_for_decl_p,
- "This hook should return true if pool entries for @var{decl} should\n\
-be placed in an @code{object_block} structure.\n\
-\n\
-The default version returns true for all decls.",
- bool, (const_tree decl),
- hook_bool_const_tree_true)
-
-/* The minimum and maximum byte offsets for anchored addresses.  */
-DEFHOOKPOD
-(min_anchor_offset,
- "The minimum offset that should be applied to a section anchor.\n\
-On most targets, it should be the smallest offset that can be\n\
-applied to a base register while still giving a legitimate address\n\
-for every mode.  The default value is 0.",
- HOST_WIDE_INT, 0)
-
-DEFHOOKPOD
-(max_anchor_offset,
- "Like @code{TARGET_MIN_ANCHOR_OFFSET}, but the maximum (inclusive)\n\
-offset that should be applied to section anchors.  The default\n\
-value is 0.",
- HOST_WIDE_INT, 0)
-
-/* True if section anchors can be used to access the given symbol.  */
-DEFHOOK
-(use_anchors_for_symbol_p,
- "Return true if GCC should attempt to use anchors to access @code{SYMBOL_REF}\n\
-@var{x}.  You can assume @samp{SYMBOL_REF_HAS_BLOCK_INFO_P (@var{x})} and\n\
-@samp{!SYMBOL_REF_ANCHOR_P (@var{x})}.\n\
-\n\
-The default version is correct for most targets, but you might need to\n\
-intercept this hook to handle things like target-specific attributes\n\
-or target-specific sections.",
- bool, (const_rtx x),
- default_use_anchors_for_symbol_p)
-
-/* True if target supports indirect functions.  */
-DEFHOOK
-(has_ifunc_p,
- "It returns true if the target supports GNU indirect functions.\n\
-The support includes the assembler, linker and dynamic linker.\n\
-The default value of this hook is based on target's libc.",
- bool, (void),
- default_has_ifunc_p)
-
-/* True if it is OK to do sibling call optimization for the specified
-   call expression EXP.  DECL will be the called function, or NULL if
-   this is an indirect call.  */
-DEFHOOK
-(function_ok_for_sibcall,
- "True if it is OK to do sibling call optimization for the specified\n\
-call expression @var{exp}.  @var{decl} will be the called function,\n\
-or @code{NULL} if this is an indirect call.\n\
-\n\
-It is not uncommon for limitations of calling conventions to prevent\n\
-tail calls to functions outside the current unit of translation, or\n\
-during PIC compilation.  The hook is used to enforce these restrictions,\n\
-as the @code{sibcall} md pattern can not fail, or fall over to a\n\
-``normal'' call.  The criteria for successful sibling call optimization\n\
-may vary greatly between different architectures.",
- bool, (tree decl, tree exp),
- hook_bool_tree_tree_false)
-
-/* Establish appropriate back-end context for processing the function
-   FNDECL.  The argument might be NULL to indicate processing at top
-   level, outside of any function scope.  */
-DEFHOOK
-(set_current_function,
- "The compiler invokes this hook whenever it changes its current function\n\
-context (@code{cfun}).  You can define this function if\n\
-the back end needs to perform any initialization or reset actions on a\n\
-per-function basis.  For example, it may be used to implement function\n\
-attributes that affect register usage or code generation patterns.\n\
-The argument @var{decl} is the declaration for the new function context,\n\
-and may be null to indicate that the compiler has left a function context\n\
-and is returning to processing at the top level.\n\
-The default hook function does nothing.\n\
-\n\
-GCC sets @code{cfun} to a dummy function context during initialization of\n\
-some parts of the back end.  The hook function is not invoked in this\n\
-situation; you need not worry about the hook being invoked recursively,\n\
-or when the back end is in a partially-initialized state.\n\
-@code{cfun} might be @code{NULL} to indicate processing at top level,\n\
-outside of any function scope.",
- void, (tree decl), hook_void_tree)
-
-/* True if EXP should be placed in a "small data" section.  */
-DEFHOOK
-(in_small_data_p,
- "Returns true if @var{exp} should be placed into a ``small data'' section.\n\
-The default version of this hook always returns false.",
- bool, (const_tree exp),
- hook_bool_const_tree_false)
-
-/* True if EXP names an object for which name resolution must resolve
-   to the current executable or shared library.  */
-DEFHOOK
-(binds_local_p,
- "Returns true if @var{exp} names an object for which name resolution\n\
-rules must resolve to the current ``module'' (dynamic shared library\n\
-or executable image).\n\
-\n\
-The default version of this hook implements the name resolution rules\n\
-for ELF, which has a looser model of global name binding than other\n\
-currently supported object file formats.",
- bool, (const_tree exp),
- default_binds_local_p)
-
-/* Check if profiling code is before or after prologue.  */
-DEFHOOK
-(profile_before_prologue,
- "It returns true if target wants profile code emitted before prologue.\n\n\
-The default version of this hook use the target macro\n\
-@code{PROFILE_BEFORE_PROLOGUE}.",
- bool, (void),
- default_profile_before_prologue)
-
-/* Modify and return the identifier of a DECL's external name,
-   originally identified by ID, as required by the target,
-   (eg, append @nn to windows32 stdcall function names).
-   The default is to return ID without modification. */
-DEFHOOK
-(mangle_decl_assembler_name,
- "Define this hook if you need to postprocess the assembler name generated\n\
-by target-independent code.  The @var{id} provided to this hook will be\n\
-the computed name (e.g., the macro @code{DECL_NAME} of the @var{decl} in C,\n\
-or the mangled name of the @var{decl} in C++).  The return value of the\n\
-hook is an @code{IDENTIFIER_NODE} for the appropriate mangled name on\n\
-your target system.  The default implementation of this hook just\n\
-returns the @var{id} provided.",
- tree, (tree decl, tree  id),
- default_mangle_decl_assembler_name)
-
-/* Do something target-specific to record properties of the DECL into
-   the associated SYMBOL_REF.  */
-DEFHOOK
-(encode_section_info,
- "Define this hook if references to a symbol or a constant must be\n\
-treated differently depending on something about the variable or\n\
-function named by the symbol (such as what section it is in).\n\
-\n\
-The hook is executed immediately after rtl has been created for\n\
-@var{decl}, which may be a variable or function declaration or\n\
-an entry in the constant pool.  In either case, @var{rtl} is the\n\
-rtl in question.  Do @emph{not} use @code{DECL_RTL (@var{decl})}\n\
-in this hook; that field may not have been initialized yet.\n\
-\n\
-In the case of a constant, it is safe to assume that the rtl is\n\
-a @code{mem} whose address is a @code{symbol_ref}.  Most decls\n\
-will also have this form, but that is not guaranteed.  Global\n\
-register variables, for instance, will have a @code{reg} for their\n\
-rtl.  (Normally the right thing to do with such unusual rtl is\n\
-leave it alone.)\n\
-\n\
-The @var{new_decl_p} argument will be true if this is the first time\n\
-that @code{TARGET_ENCODE_SECTION_INFO} has been invoked on this decl.  It will\n\
-be false for subsequent invocations, which will happen for duplicate\n\
-declarations.  Whether or not anything must be done for the duplicate\n\
-declaration depends on whether the hook examines @code{DECL_ATTRIBUTES}.\n\
-@var{new_decl_p} is always true when the hook is called for a constant.\n\
-\n\
-@cindex @code{SYMBOL_REF_FLAG}, in @code{TARGET_ENCODE_SECTION_INFO}\n\
-The usual thing for this hook to do is to record flags in the\n\
-@code{symbol_ref}, using @code{SYMBOL_REF_FLAG} or @code{SYMBOL_REF_FLAGS}.\n\
-Historically, the name string was modified if it was necessary to\n\
-encode more than one bit of information, but this practice is now\n\
-discouraged; use @code{SYMBOL_REF_FLAGS}.\n\
-\n\
-The default definition of this hook, @code{default_encode_section_info}\n\
-in @file{varasm.c}, sets a number of commonly-useful bits in\n\
-@code{SYMBOL_REF_FLAGS}.  Check whether the default does what you need\n\
-before overriding it.",
- void, (tree decl, rtx rtl, int new_decl_p),
- default_encode_section_info)
-
-/* Undo the effects of encode_section_info on the symbol string.  */
-DEFHOOK
-(strip_name_encoding,
- "Decode @var{name} and return the real name part, sans\n\
-the characters that @code{TARGET_ENCODE_SECTION_INFO}\n\
-may have added.",
- const char *, (const char *name),
- default_strip_name_encoding)
-
-/* If shift optabs for MODE are known to always truncate the shift count,
-   return the mask that they apply.  Return 0 otherwise.  */
-DEFHOOK
-(shift_truncation_mask,
- "This function describes how the standard shift patterns for @var{mode}\n\
-deal with shifts by negative amounts or by more than the width of the mode.\n\
-@xref{shift patterns}.\n\
-\n\
-On many machines, the shift patterns will apply a mask @var{m} to the\n\
-shift count, meaning that a fixed-width shift of @var{x} by @var{y} is\n\
-equivalent to an arbitrary-width shift of @var{x} by @var{y & m}.  If\n\
-this is true for mode @var{mode}, the function should return @var{m},\n\
-otherwise it should return 0.  A return value of 0 indicates that no\n\
-particular behavior is guaranteed.\n\
-\n\
-Note that, unlike @code{SHIFT_COUNT_TRUNCATED}, this function does\n\
-@emph{not} apply to general shift rtxes; it applies only to instructions\n\
-that are generated by the named shift patterns.\n\
-\n\
-The default implementation of this function returns\n\
-@code{GET_MODE_BITSIZE (@var{mode}) - 1} if @code{SHIFT_COUNT_TRUNCATED}\n\
-and 0 otherwise.  This definition is always safe, but if\n\
-@code{SHIFT_COUNT_TRUNCATED} is false, and some shift patterns\n\
-nevertheless truncate the shift count, you may get better code\n\
-by overriding it.",
- unsigned HOST_WIDE_INT, (enum machine_mode mode),
- default_shift_truncation_mask)
-
-/* Return the number of divisions in the given MODE that should be present,
-   so that it is profitable to turn the division into a multiplication by
-   the reciprocal.  */
-DEFHOOK
-(min_divisions_for_recip_mul,
- "When @option{-ffast-math} is in effect, GCC tries to optimize\n\
-divisions by the same divisor, by turning them into multiplications by\n\
-the reciprocal.  This target hook specifies the minimum number of divisions\n\
-that should be there for GCC to perform the optimization for a variable\n\
-of mode @var{mode}.  The default implementation returns 3 if the machine\n\
-has an instruction for the division, and 2 if it does not.",
- unsigned int, (enum machine_mode mode),
- default_min_divisions_for_recip_mul)
-
-/* If the representation of integral MODE is such that values are
-   always sign-extended to a wider mode MODE_REP then return
-   SIGN_EXTEND.  Return UNKNOWN otherwise.  */
-/* Note that the return type ought to be RTX_CODE, but that's not
-   necessarily defined at this point.  */
-DEFHOOK
-(mode_rep_extended,
- "The representation of an integral mode can be such that the values\n\
-are always extended to a wider integral mode.  Return\n\
-@code{SIGN_EXTEND} if values of @var{mode} are represented in\n\
-sign-extended form to @var{rep_mode}.  Return @code{UNKNOWN}\n\
-otherwise.  (Currently, none of the targets use zero-extended\n\
-representation this way so unlike @code{LOAD_EXTEND_OP},\n\
-@code{TARGET_MODE_REP_EXTENDED} is expected to return either\n\
-@code{SIGN_EXTEND} or @code{UNKNOWN}.  Also no target extends\n\
-@var{mode} to @var{rep_mode} so that @var{rep_mode} is not the next\n\
-widest integral mode and currently we take advantage of this fact.)\n\
-\n\
-Similarly to @code{LOAD_EXTEND_OP} you may return a non-@code{UNKNOWN}\n\
-value even if the extension is not performed on certain hard registers\n\
-as long as for the @code{REGNO_REG_CLASS} of these hard registers\n\
-@code{CANNOT_CHANGE_MODE_CLASS} returns nonzero.\n\
-\n\
-Note that @code{TARGET_MODE_REP_EXTENDED} and @code{LOAD_EXTEND_OP}\n\
-describe two related properties.  If you define\n\
-@code{TARGET_MODE_REP_EXTENDED (mode, word_mode)} you probably also want\n\
-to define @code{LOAD_EXTEND_OP (mode)} to return the same type of\n\
-extension.\n\
-\n\
-In order to enforce the representation of @code{mode},\n\
-@code{TRULY_NOOP_TRUNCATION} should return false when truncating to\n\
-@code{mode}.",
- int, (enum machine_mode mode, enum machine_mode rep_mode),
- default_mode_rep_extended)
-
-/* True if MODE is valid for a pointer in __attribute__((mode("MODE"))).  */
-DEFHOOK
-(valid_pointer_mode,
- "Define this to return nonzero if the port can handle pointers\n\
-with machine mode @var{mode}.  The default version of this\n\
-hook returns true for both @code{ptr_mode} and @code{Pmode}.",
- bool, (enum machine_mode mode),
- default_valid_pointer_mode)
-
-/* Disambiguate with errno.  */
-DEFHOOK
-(ref_may_alias_errno,
- "Define this to return nonzero if the memory reference @var{ref}\
-  may alias with the system C library errno location.  The default\
-  version of this hook assumes the system C library errno location\
-  is either a declaration of type int or accessed by dereferencing\
-  a pointer to int.",
- bool, (struct ao_ref *ref),
- default_ref_may_alias_errno)
-
-/* Support for named address spaces.  */
-#undef HOOK_PREFIX
-#define HOOK_PREFIX "TARGET_ADDR_SPACE_"
-HOOK_VECTOR (TARGET_ADDR_SPACE_HOOKS, addr_space)
-
-/* MODE to use for a pointer into another address space.  */
-DEFHOOK
-(pointer_mode,
- "Define this to return the machine mode to use for pointers to\n\
-@var{address_space} if the target supports named address spaces.\n\
-The default version of this hook returns @code{ptr_mode} for the\n\
-generic address space only.",
- enum machine_mode, (addr_space_t address_space),
- default_addr_space_pointer_mode)
-
-/* MODE to use for an address in another address space.  */
-DEFHOOK
-(address_mode,
- "Define this to return the machine mode to use for addresses in\n\
-@var{address_space} if the target supports named address spaces.\n\
-The default version of this hook returns @code{Pmode} for the\n\
-generic address space only.",
- enum machine_mode, (addr_space_t address_space),
- default_addr_space_address_mode)
-
-/* True if MODE is valid for a pointer in __attribute__((mode("MODE")))
-   in another address space.  */
-DEFHOOK
-(valid_pointer_mode,
- "Define this to return nonzero if the port can handle pointers\n\
-with machine mode @var{mode} to address space @var{as}.  This target\n\
-hook is the same as the @code{TARGET_VALID_POINTER_MODE} target hook,\n\
-except that it includes explicit named address space support.  The default\n\
-version of this hook returns true for the modes returned by either the\n\
-@code{TARGET_ADDR_SPACE_POINTER_MODE} or @code{TARGET_ADDR_SPACE_ADDRESS_MODE}\n\
-target hooks for the given address space.",
- bool, (enum machine_mode mode, addr_space_t as),
- default_addr_space_valid_pointer_mode)
-
-/* True if an address is a valid memory address to a given named address
-   space for a given mode.  */
-DEFHOOK
-(legitimate_address_p,
- "Define this to return true if @var{exp} is a valid address for mode\n\
-@var{mode} in the named address space @var{as}.  The @var{strict}\n\
-parameter says whether strict addressing is in effect after reload has\n\
-finished.  This target hook is the same as the\n\
-@code{TARGET_LEGITIMATE_ADDRESS_P} target hook, except that it includes\n\
-explicit named address space support.",
- bool, (enum machine_mode mode, rtx exp, bool strict, addr_space_t as),
- default_addr_space_legitimate_address_p)
-
-/* Return an updated address to convert an invalid pointer to a named
-   address space to a valid one.  If NULL_RTX is returned use machine
-   independent methods to make the address valid.  */
-DEFHOOK
-(legitimize_address,
- "Define this to modify an invalid address @var{x} to be a valid address\n\
-with mode @var{mode} in the named address space @var{as}.  This target\n\
-hook is the same as the @code{TARGET_LEGITIMIZE_ADDRESS} target hook,\n\
-except that it includes explicit named address space support.",
- rtx, (rtx x, rtx oldx, enum machine_mode mode, addr_space_t as),
- default_addr_space_legitimize_address)
-
-/* True if one named address space is a subset of another named address. */
-DEFHOOK
-(subset_p,
- "Define this to return whether the @var{subset} named address space is\n\
-contained within the @var{superset} named address space.  Pointers to\n\
-a named address space that is a subset of another named address space\n\
-will be converted automatically without a cast if used together in\n\
-arithmetic operations.  Pointers to a superset address space can be\n\
-converted to pointers to a subset address space via explicit casts.",
- bool, (addr_space_t subset, addr_space_t superset),
- default_addr_space_subset_p)
-
-/* Function to convert an rtl expression from one address space to another.  */
-DEFHOOK
-(convert,
- "Define this to convert the pointer expression represented by the RTL\n\
-@var{op} with type @var{from_type} that points to a named address\n\
-space to a new pointer expression with type @var{to_type} that points\n\
-to a different named address space.  When this hook it called, it is\n\
-guaranteed that one of the two address spaces is a subset of the other,\n\
-as determined by the @code{TARGET_ADDR_SPACE_SUBSET_P} target hook.",
- rtx, (rtx op, tree from_type, tree to_type),
- default_addr_space_convert)
-
-HOOK_VECTOR_END (addr_space)
-
-#undef HOOK_PREFIX
-#define HOOK_PREFIX "TARGET_"
-
-/* True if MODE is valid for the target.  By "valid", we mean able to
-   be manipulated in non-trivial ways.  In particular, this means all
-   the arithmetic is supported.  */
-DEFHOOK
-(scalar_mode_supported_p,
- "Define this to return nonzero if the port is prepared to handle\n\
-insns involving scalar mode @var{mode}.  For a scalar mode to be\n\
-considered supported, all the basic arithmetic and comparisons\n\
-must work.\n\
-\n\
-The default version of this hook returns true for any mode\n\
-required to handle the basic C types (as defined by the port).\n\
-Included here are the double-word arithmetic supported by the\n\
-code in @file{optabs.c}.",
- bool, (enum machine_mode mode),
- default_scalar_mode_supported_p)
-
-/* Similarly for vector modes.  "Supported" here is less strict.  At
-   least some operations are supported; need to check optabs or builtins
-   for further details.  */
-DEFHOOK
-(vector_mode_supported_p,
- "Define this to return nonzero if the port is prepared to handle\n\
-insns involving vector mode @var{mode}.  At the very least, it\n\
-must have move patterns for this mode.",
- bool, (enum machine_mode mode),
- hook_bool_mode_false)
-
-DEFHOOK
-(vector_alignment,
- "This hook can be used to define the alignment for a vector of type\n\
-@var{type}, in order to comply with a platform ABI.  The default is to\n\
-require natural alignment for vector types.  The alignment returned by\n\
-this hook must be a power-of-two multiple of the default alignment of\n\
-the vector element type.",
- HOST_WIDE_INT, (const_tree type),
- default_vector_alignment)
-
-/* True if we should try to use a scalar mode to represent an array,
-   overriding the usual MAX_FIXED_MODE limit.  */
-DEFHOOK
-(array_mode_supported_p,
- "Return true if GCC should try to use a scalar mode to store an array\n\
-of @var{nelems} elements, given that each element has mode @var{mode}.\n\
-Returning true here overrides the usual @code{MAX_FIXED_MODE} limit\n\
-and allows GCC to use any defined integer mode.\n\
-\n\
-One use of this hook is to support vector load and store operations\n\
-that operate on several homogeneous vectors.  For example, ARM NEON\n\
-has operations like:\n\
-\n\
-@smallexample\n\
-int8x8x3_t vld3_s8 (const int8_t *)\n\
-@end smallexample\n\
-\n\
-where the return type is defined as:\n\
-\n\
-@smallexample\n\
-typedef struct int8x8x3_t\n\
-@{\n\
-  int8x8_t val[3];\n\
-@} int8x8x3_t;\n\
-@end smallexample\n\
-\n\
-If this hook allows @code{val} to have a scalar mode, then\n\
-@code{int8x8x3_t} can have the same mode.  GCC can then store\n\
-@code{int8x8x3_t}s in registers rather than forcing them onto the stack.",
- bool, (enum machine_mode mode, unsigned HOST_WIDE_INT nelems),
- hook_bool_mode_uhwi_false)
-
-/* Compute cost of moving data from a register of class FROM to one of
-   TO, using MODE.  */
-DEFHOOK
-(register_move_cost,
- "This target hook should return the cost of moving data of mode @var{mode}\n\
-from a register in class @var{from} to one in class @var{to}.  The classes\n\
-are expressed using the enumeration values such as @code{GENERAL_REGS}.\n\
-A value of 2 is the default; other values are interpreted relative to\n\
-that.\n\
-\n\
-It is not required that the cost always equal 2 when @var{from} is the\n\
-same as @var{to}; on some machines it is expensive to move between\n\
-registers if they are not general registers.\n\
-\n\
-If reload sees an insn consisting of a single @code{set} between two\n\
-hard registers, and if @code{TARGET_REGISTER_MOVE_COST} applied to their\n\
-classes returns a value of 2, reload does not check to ensure that the\n\
-constraints of the insn are met.  Setting a cost of other than 2 will\n\
-allow reload to verify that the constraints are met.  You should do this\n\
-if the @samp{mov@var{m}} pattern's constraints do not allow such copying.\n\
-\n\
-The default version of this function returns 2.",
- int, (enum machine_mode mode, reg_class_t from, reg_class_t to),
- default_register_move_cost)
-
-/* Compute cost of moving registers to/from memory.  */
-/* ??? Documenting the argument types for this hook requires a GFDL
-   license grant.  Also, the documentation uses a different name for RCLASS.  */
-DEFHOOK
-(memory_move_cost,
- "This target hook should return the cost of moving data of mode @var{mode}\n\
-between a register of class @var{rclass} and memory; @var{in} is @code{false}\n\
-if the value is to be written to memory, @code{true} if it is to be read in.\n\
-This cost is relative to those in @code{TARGET_REGISTER_MOVE_COST}.\n\
-If moving between registers and memory is more expensive than between two\n\
-registers, you should add this target hook to express the relative cost.\n\
-\n\
-If you do not add this target hook, GCC uses a default cost of 4 plus\n\
-the cost of copying via a secondary reload register, if one is\n\
-needed.  If your machine requires a secondary reload register to copy\n\
-between memory and a register of @var{rclass} but the reload mechanism is\n\
-more complex than copying via an intermediate, use this target hook to\n\
-reflect the actual cost of the move.\n\
-\n\
-GCC defines the function @code{memory_move_secondary_cost} if\n\
-secondary reloads are needed.  It computes the costs due to copying via\n\
-a secondary register.  If your machine copies from memory using a\n\
-secondary register in the conventional way but the default base value of\n\
-4 is not correct for your machine, use this target hook to add some other\n\
-value to the result of that function.  The arguments to that function\n\
-are the same as to this target hook.",
- int, (enum machine_mode mode, reg_class_t rclass, bool in),
- default_memory_move_cost)
-
-/* True for MODE if the target expects that registers in this mode will
-   be allocated to registers in a small register class.  The compiler is
-   allowed to use registers explicitly used in the rtl as spill registers
-   but it should prevent extending the lifetime of these registers.  */
-DEFHOOK
-(small_register_classes_for_mode_p,
- "Define this to return nonzero for machine modes for which the port has\n\
-small register classes.  If this target hook returns nonzero for a given\n\
-@var{mode}, the compiler will try to minimize the lifetime of registers\n\
-in @var{mode}.  The hook may be called with @code{VOIDmode} as argument.\n\
-In this case, the hook is expected to return nonzero if it returns nonzero\n\
-for any mode.\n\
-\n\
-On some machines, it is risky to let hard registers live across arbitrary\n\
-insns.  Typically, these machines have instructions that require values\n\
-to be in specific registers (like an accumulator), and reload will fail\n\
-if the required hard register is used for another purpose across such an\n\
-insn.\n\
-\n\
-Passes before reload do not know which hard registers will be used\n\
-in an instruction, but the machine modes of the registers set or used in\n\
-the instruction are already known.  And for some machines, register\n\
-classes are small for, say, integer registers but not for floating point\n\
-registers.  For example, the AMD x86-64 architecture requires specific\n\
-registers for the legacy x86 integer instructions, but there are many\n\
-SSE registers for floating point operations.  On such targets, a good\n\
-strategy may be to return nonzero from this hook for @code{INTEGRAL_MODE_P}\n\
-machine modes but zero for the SSE register classes.\n\
-\n\
-The default version of this hook returns false for any mode.  It is always\n\
-safe to redefine this hook to return with a nonzero value.  But if you\n\
-unnecessarily define it, you will reduce the amount of optimizations\n\
-that can be performed in some cases.  If you do not define this hook\n\
-to return a nonzero value when it is required, the compiler will run out\n\
-of spill registers and print a fatal error message.",
- bool, (enum machine_mode mode),
- hook_bool_mode_false)
-
-/* Register number for a flags register.  Only needs to be defined if the
-   target is constrainted to use post-reload comparison elimination.  */
-DEFHOOKPOD
-(flags_regnum,
- "If the target has a dedicated flags register, and it needs to use the\
- post-reload comparison elimination pass, then this value should be set\
- appropriately.",
- unsigned int, INVALID_REGNUM)
-
-/* Compute a (partial) cost for rtx X.  Return true if the complete
-   cost has been computed, and false if subexpressions should be
-   scanned.  In either case, *TOTAL contains the cost result.  */
-/* Note that CODE and OUTER_CODE ought to be RTX_CODE, but that's
-   not necessarily defined at this point.  */
-DEFHOOK
-(rtx_costs,
- "This target hook describes the relative costs of RTL expressions.\n\
-\n\
-The cost may depend on the precise form of the expression, which is\n\
-available for examination in @var{x}, and the fact that @var{x} appears\n\
-as operand @var{opno} of an expression with rtx code @var{outer_code}.\n\
-That is, the hook can assume that there is some rtx @var{y} such\n\
-that @samp{GET_CODE (@var{y}) == @var{outer_code}} and such that\n\
-either (a) @samp{XEXP (@var{y}, @var{opno}) == @var{x}} or\n\
-(b) @samp{XVEC (@var{y}, @var{opno})} contains @var{x}.\n\
-\n\
-@var{code} is @var{x}'s expression code---redundant, since it can be\n\
-obtained with @code{GET_CODE (@var{x})}.\n\
-\n\
-In implementing this hook, you can use the construct\n\
-@code{COSTS_N_INSNS (@var{n})} to specify a cost equal to @var{n} fast\n\
-instructions.\n\
-\n\
-On entry to the hook, @code{*@var{total}} contains a default estimate\n\
-for the cost of the expression.  The hook should modify this value as\n\
-necessary.  Traditionally, the default costs are @code{COSTS_N_INSNS (5)}\n\
-for multiplications, @code{COSTS_N_INSNS (7)} for division and modulus\n\
-operations, and @code{COSTS_N_INSNS (1)} for all other operations.\n\
-\n\
-When optimizing for code size, i.e.@: when @code{speed} is\n\
-false, this target hook should be used to estimate the relative\n\
-size cost of an expression, again relative to @code{COSTS_N_INSNS}.\n\
-\n\
-The hook returns true when all subexpressions of @var{x} have been\n\
-processed, and false when @code{rtx_cost} should recurse.",
- bool, (rtx x, int code, int outer_code, int opno, int *total, bool speed),
- hook_bool_rtx_int_int_int_intp_bool_false)
-
-/* Compute the cost of X, used as an address.  Never called with
-   invalid addresses.  */
-DEFHOOK
-(address_cost,
- "This hook computes the cost of an addressing mode that contains\n\
-@var{address}.  If not defined, the cost is computed from\n\
-the @var{address} expression and the @code{TARGET_RTX_COST} hook.\n\
-\n\
-For most CISC machines, the default cost is a good approximation of the\n\
-true cost of the addressing mode.  However, on RISC machines, all\n\
-instructions normally have the same length and execution time.  Hence\n\
-all addresses will have equal costs.\n\
-\n\
-In cases where more than one form of an address is known, the form with\n\
-the lowest cost will be used.  If multiple forms have the same, lowest,\n\
-cost, the one that is the most complex will be used.\n\
-\n\
-For example, suppose an address that is equal to the sum of a register\n\
-and a constant is used twice in the same basic block.  When this macro\n\
-is not defined, the address will be computed in a register and memory\n\
-references will be indirect through that register.  On machines where\n\
-the cost of the addressing mode containing the sum is no higher than\n\
-that of a simple indirect reference, this will produce an additional\n\
-instruction and possibly require an additional register.  Proper\n\
-specification of this macro eliminates this overhead for such machines.\n\
-\n\
-This hook is never called with an invalid address.\n\
-\n\
-On machines where an address involving more than one register is as\n\
-cheap as an address computation involving only one register, defining\n\
-@code{TARGET_ADDRESS_COST} to reflect this can cause two registers to\n\
-be live over a region of code where only one would have been if\n\
-@code{TARGET_ADDRESS_COST} were not defined in that manner.  This effect\n\
-should be considered in the definition of this macro.  Equivalent costs\n\
-should probably only be given to addresses with different numbers of\n\
-registers on machines with lots of registers.",
- int, (rtx address, enum machine_mode mode, addr_space_t as, bool speed),
- default_address_cost)
-
-/* Return where to allocate pseudo for a given hard register initial value.  */
-DEFHOOK
-(allocate_initial_value,
- "\n\
-When the initial value of a hard register has been copied in a pseudo\n\
-register, it is often not necessary to actually allocate another register\n\
-to this pseudo register, because the original hard register or a stack slot\n\
-it has been saved into can be used.  @code{TARGET_ALLOCATE_INITIAL_VALUE}\n\
-is called at the start of register allocation once for each hard register\n\
-that had its initial value copied by using\n\
-@code{get_func_hard_reg_initial_val} or @code{get_hard_reg_initial_val}.\n\
-Possible values are @code{NULL_RTX}, if you don't want\n\
-to do any special allocation, a @code{REG} rtx---that would typically be\n\
-the hard register itself, if it is known not to be clobbered---or a\n\
-@code{MEM}.\n\
-If you are returning a @code{MEM}, this is only a hint for the allocator;\n\
-it might decide to use another register anyways.\n\
-You may use @code{current_function_is_leaf} or \n\
-@code{REG_N_SETS} in the hook to determine if the hard\n\
-register in question will not be clobbered.\n\
-The default value of this hook is @code{NULL}, which disables any special\n\
-allocation.",
- rtx, (rtx hard_reg), NULL)
-
-/* Return nonzero if evaluating UNSPEC X might cause a trap.
-   FLAGS has the same meaning as in rtlanal.c: may_trap_p_1.  */
-DEFHOOK
-(unspec_may_trap_p,
- "This target hook returns nonzero if @var{x}, an @code{unspec} or\n\
-@code{unspec_volatile} operation, might cause a trap.  Targets can use\n\
-this hook to enhance precision of analysis for @code{unspec} and\n\
-@code{unspec_volatile} operations.  You may call @code{may_trap_p_1}\n\
-to analyze inner elements of @var{x} in which case @var{flags} should be\n\
-passed along.",
- int, (const_rtx x, unsigned flags),
- default_unspec_may_trap_p)
-
-/* Given a register, this hook should return a parallel of registers
-   to represent where to find the register pieces.  Define this hook
-   if the register and its mode are represented in Dwarf in
-   non-contiguous locations, or if the register should be
-   represented in more than one register in Dwarf.  Otherwise, this
-   hook should return NULL_RTX.  */
-DEFHOOK
-(dwarf_register_span,
- "Given a register, this hook should return a parallel of registers to\n\
-represent where to find the register pieces.  Define this hook if the\n\
-register and its mode are represented in Dwarf in non-contiguous\n\
-locations, or if the register should be represented in more than one\n\
-register in Dwarf.  Otherwise, this hook should return @code{NULL_RTX}.\n\
-If not defined, the default is to return @code{NULL_RTX}.",
- rtx, (rtx reg),
- hook_rtx_rtx_null)
-
-/* If expand_builtin_init_dwarf_reg_sizes needs to fill in table
-   entries not corresponding directly to registers below
-   FIRST_PSEUDO_REGISTER, this hook should generate the necessary
-   code, given the address of the table.  */
-DEFHOOK
-(init_dwarf_reg_sizes_extra,
- "If some registers are represented in Dwarf-2 unwind information in\n\
-multiple pieces, define this hook to fill in information about the\n\
-sizes of those pieces in the table used by the unwinder at runtime.\n\
-It will be called by @code{expand_builtin_init_dwarf_reg_sizes} after\n\
-filling in a single size corresponding to each hard register;\n\
-@var{address} is the address of the table.",
- void, (tree address),
- hook_void_tree)
-
-/* Fetch the fixed register(s) which hold condition codes, for
-   targets where it makes sense to look for duplicate assignments to
-   the condition codes.  This should return true if there is such a
-   register, false otherwise.  The arguments should be set to the
-   fixed register numbers.  Up to two condition code registers are
-   supported.  If there is only one for this target, the int pointed
-   at by the second argument should be set to -1.  */
-DEFHOOK
-(fixed_condition_code_regs,
- "On targets which do not use @code{(cc0)}, and which use a hard\n\
-register rather than a pseudo-register to hold condition codes, the\n\
-regular CSE passes are often not able to identify cases in which the\n\
-hard register is set to a common value.  Use this hook to enable a\n\
-small pass which optimizes such cases.  This hook should return true\n\
-to enable this pass, and it should set the integers to which its\n\
-arguments point to the hard register numbers used for condition codes.\n\
-When there is only one such register, as is true on most systems, the\n\
-integer pointed to by @var{p2} should be set to\n\
-@code{INVALID_REGNUM}.\n\
-\n\
-The default version of this hook returns false.",
- bool, (unsigned int *p1, unsigned int *p2),
- hook_bool_uintp_uintp_false)
-
-/* If two condition code modes are compatible, return a condition
-     code mode which is compatible with both, such that a comparison
-     done in the returned mode will work for both of the original
-     modes.  If the condition code modes are not compatible, return
-     VOIDmode.  */
-DEFHOOK
-(cc_modes_compatible,
- "On targets which use multiple condition code modes in class\n\
-@code{MODE_CC}, it is sometimes the case that a comparison can be\n\
-validly done in more than one mode.  On such a system, define this\n\
-target hook to take two mode arguments and to return a mode in which\n\
-both comparisons may be validly done.  If there is no such mode,\n\
-return @code{VOIDmode}.\n\
-\n\
-The default version of this hook checks whether the modes are the\n\
-same.  If they are, it returns that mode.  If they are different, it\n\
-returns @code{VOIDmode}.",
- enum machine_mode, (enum machine_mode m1, enum machine_mode m2),
- default_cc_modes_compatible)
-
-/* Do machine-dependent code transformations.  Called just before
-     delayed-branch scheduling.  */
-DEFHOOK
-(machine_dependent_reorg,
- "If non-null, this hook performs a target-specific pass over the\n\
-instruction stream.  The compiler will run it at all optimization levels,\n\
-just before the point at which it normally does delayed-branch scheduling.\n\
-\n\
-The exact purpose of the hook varies from target to target.  Some use\n\
-it to do transformations that are necessary for correctness, such as\n\
-laying out in-function constant pools or avoiding hardware hazards.\n\
-Others use it as an opportunity to do some machine-dependent optimizations.\n\
-\n\
-You need not implement the hook if it has nothing to do.  The default\n\
-definition is null.",
- void, (void), NULL)
-
-/* Create the __builtin_va_list type.  */
-DEFHOOK
-(build_builtin_va_list,
- "This hook returns a type node for @code{va_list} for the target.\n\
-The default version of the hook returns @code{void*}.",
- tree, (void),
- std_build_builtin_va_list)
-
-/* Enumerate the va list variants.  */
-DEFHOOK
-(enum_va_list_p,
- "This target hook is used in function @code{c_common_nodes_and_builtins}\n\
-to iterate through the target specific builtin types for va_list. The\n\
-variable @var{idx} is used as iterator. @var{pname} has to be a pointer\n\
-to a @code{const char *} and @var{ptree} a pointer to a @code{tree} typed\n\
-variable.\n\
-The arguments @var{pname} and @var{ptree} are used to store the result of\n\
-this macro and are set to the name of the va_list builtin type and its\n\
-internal type.\n\
-If the return value of this macro is zero, then there is no more element.\n\
-Otherwise the @var{IDX} should be increased for the next call of this\n\
-macro to iterate through all types.",
- int, (int idx, const char **pname, tree *ptree),
- NULL)
-
-/* Get the cfun/fndecl calling abi __builtin_va_list type.  */
-DEFHOOK
-(fn_abi_va_list,
- "This hook returns the va_list type of the calling convention specified by\n\
-@var{fndecl}.\n\
-The default version of this hook returns @code{va_list_type_node}.",
- tree, (tree fndecl),
- std_fn_abi_va_list)
-
-/* Get the __builtin_va_list type dependent on input type.  */
-DEFHOOK
-(canonical_va_list_type,
- "This hook returns the va_list type of the calling convention specified by the\n\
-type of @var{type}. If @var{type} is not a valid va_list type, it returns\n\
-@code{NULL_TREE}.",
- tree, (tree type),
- std_canonical_va_list_type)
-
-/* ??? Documenting this hook requires a GFDL license grant.  */
-DEFHOOK_UNDOC
-(expand_builtin_va_start,
-"Expand the @code{__builtin_va_start} builtin.",
- void, (tree valist, rtx nextarg), NULL)
-
-/* Gimplifies a VA_ARG_EXPR.  */
-DEFHOOK
-(gimplify_va_arg_expr,
- "This hook performs target-specific gimplification of\n\
-@code{VA_ARG_EXPR}.  The first two parameters correspond to the\n\
-arguments to @code{va_arg}; the latter two are as in\n\
-@code{gimplify.c:gimplify_expr}.",
- tree, (tree valist, tree type, gimple_seq *pre_p, gimple_seq *post_p),
- std_gimplify_va_arg_expr)
-
-/* Validity-checking routines for PCH files, target-specific.
-   get_pch_validity returns a pointer to the data to be stored,
-   and stores the size in its argument.  pch_valid_p gets the same
-   information back and returns NULL if the PCH is valid,
-   or an error message if not.  */
-DEFHOOK
-(get_pch_validity,
- "This hook returns a pointer to the data needed by\n\
-@code{TARGET_PCH_VALID_P} and sets\n\
-@samp{*@var{sz}} to the size of the data in bytes.",
- void *, (size_t *sz),
- default_get_pch_validity)
-
-DEFHOOK
-(pch_valid_p,
- "This hook checks whether the options used to create a PCH file are\n\
-compatible with the current settings.  It returns @code{NULL}\n\
-if so and a suitable error message if not.  Error messages will\n\
-be presented to the user and must be localized using @samp{_(@var{msg})}.\n\
-\n\
-@var{data} is the data that was returned by @code{TARGET_GET_PCH_VALIDITY}\n\
-when the PCH file was created and @var{sz} is the size of that data in bytes.\n\
-It's safe to assume that the data was created by the same version of the\n\
-compiler, so no format checking is needed.\n\
-\n\
-The default definition of @code{default_pch_valid_p} should be\n\
-suitable for most targets.",
- const char *, (const void *data, size_t sz),
- default_pch_valid_p)
-
-DEFHOOK
-(prepare_pch_save,
- "Called before writing out a PCH file.  If the target has some\n\
-garbage-collected data that needs to be in a particular state on PCH loads,\n\
-it can use this hook to enforce that state.  Very few targets need\n\
-to do anything here.",
- void, (void),
- hook_void_void)
-
-/* If nonnull, this function checks whether a PCH file with the
-   given set of target flags can be used.  It returns NULL if so,
-   otherwise it returns an error message.  */
-DEFHOOK
-(check_pch_target_flags,
- "If this hook is nonnull, the default implementation of\n\
-@code{TARGET_PCH_VALID_P} will use it to check for compatible values\n\
-of @code{target_flags}.  @var{pch_flags} specifies the value that\n\
-@code{target_flags} had when the PCH file was created.  The return\n\
-value is the same as for @code{TARGET_PCH_VALID_P}.",
- const char *, (int pch_flags), NULL)
-
-/* True if the compiler should give an enum type only as many
-   bytes as it takes to represent the range of possible values of
-   that type.  */
-DEFHOOK
-(default_short_enums,
- "This target hook should return true if the compiler should give an\n\
-@code{enum} type only as many bytes as it takes to represent the range\n\
-of possible values of that type.  It should return false if all\n\
-@code{enum} types should be allocated like @code{int}.\n\
-\n\
-The default is to return false.",
- bool, (void),
- hook_bool_void_false)
-
-/* This target hook returns an rtx that is used to store the address
-   of the current frame into the built-in setjmp buffer.  */
-DEFHOOK
-(builtin_setjmp_frame_value,
- "This target hook should return an rtx that is used to store\n\
-the address of the current frame into the built in @code{setjmp} buffer.\n\
-The default value, @code{virtual_stack_vars_rtx}, is correct for most\n\
-machines.  One reason you may need to define this target hook is if\n\
-@code{hard_frame_pointer_rtx} is the appropriate value on your machine.",
- rtx, (void),
- default_builtin_setjmp_frame_value)
-
-/* This target hook should add STRING_CST trees for any hard regs
-   the port wishes to automatically clobber for an asm.  */
-DEFHOOK
-(md_asm_clobbers,
- "This target hook should add to @var{clobbers} @code{STRING_CST} trees for\n\
-any hard regs the port wishes to automatically clobber for an asm.\n\
-It should return the result of the last @code{tree_cons} used to add a\n\
-clobber.  The @var{outputs}, @var{inputs} and @var{clobber} lists are the\n\
-corresponding parameters to the asm and may be inspected to avoid\n\
-clobbering a register that is an input or output of the asm.  You can use\n\
-@code{tree_overlaps_hard_reg_set}, declared in @file{tree.h}, to test\n\
-for overlap with regards to asm-declared registers.",
- tree, (tree outputs, tree inputs, tree clobbers),
- hook_tree_tree_tree_tree_3rd_identity)
-
-/* This target hook allows the backend to specify a calling convention
-   in the debug information.  This function actually returns an
-   enum dwarf_calling_convention, but because of forward declarations
-   and not wanting to include dwarf2.h everywhere target.h is included
-   the function is being declared as an int.  */
-DEFHOOK
-(dwarf_calling_convention,
- "Define this to enable the dwarf attribute @code{DW_AT_calling_convention} to\n\
-be emitted for each function.  Instead of an integer return the enum\n\
-value for the @code{DW_CC_} tag.",
- int, (const_tree function),
- hook_int_const_tree_0)
-
-/* This target hook allows the backend to emit frame-related insns that
-   contain UNSPECs or UNSPEC_VOLATILEs.  The call frame debugging info
-   engine will invoke it on insns of the form
-     (set (reg) (unspec [...] UNSPEC_INDEX))
-   and
-     (set (reg) (unspec_volatile [...] UNSPECV_INDEX))
-   to let the backend emit the call frame instructions.  */
-DEFHOOK
-(dwarf_handle_frame_unspec,
- "This target hook allows the backend to emit frame-related insns that\n\
-contain UNSPECs or UNSPEC_VOLATILEs.  The DWARF 2 call frame debugging\n\
-info engine will invoke it on insns of the form\n\
-@smallexample\n\
-(set (reg) (unspec [@dots{}] UNSPEC_INDEX))\n\
-@end smallexample\n\
-and\n\
-@smallexample\n\
-(set (reg) (unspec_volatile [@dots{}] UNSPECV_INDEX)).\n\
-@end smallexample\n\
-to let the backend emit the call frame instructions.  @var{label} is\n\
-the CFI label attached to the insn, @var{pattern} is the pattern of\n\
-the insn and @var{index} is @code{UNSPEC_INDEX} or @code{UNSPECV_INDEX}.",
- void, (const char *label, rtx pattern, int index), NULL)
-
-/* ??? Documenting this hook requires a GFDL license grant.  */
-DEFHOOK_UNDOC
-(stdarg_optimize_hook,
-"Perform architecture specific checking of statements gimplified\
- from @code{VA_ARG_EXPR}.  @var{stmt} is the statement.  Returns true if\
- the statement doesn't need to be checked for @code{va_list} references.",
- bool, (struct stdarg_info *ai, const_gimple stmt), NULL)
-
-/* This target hook allows the operating system to override the DECL
-   that represents the external variable that contains the stack
-   protection guard variable.  The type of this DECL is ptr_type_node.  */
-DEFHOOK
-(stack_protect_guard,
- "This hook returns a @code{DECL} node for the external variable to use\n\
-for the stack protection guard.  This variable is initialized by the\n\
-runtime to some random value and is used to initialize the guard value\n\
-that is placed at the top of the local stack frame.  The type of this\n\
-variable must be @code{ptr_type_node}.\n\
-\n\
-The default version of this hook creates a variable called\n\
-@samp{__stack_chk_guard}, which is normally defined in @file{libgcc2.c}.",
- tree, (void),
- default_stack_protect_guard)
-
-/* This target hook allows the operating system to override the CALL_EXPR
-   that is invoked when a check vs the guard variable fails.  */
-DEFHOOK
-(stack_protect_fail,
- "This hook returns a @code{CALL_EXPR} that alerts the runtime that the\n\
-stack protect guard variable has been modified.  This expression should\n\
-involve a call to a @code{noreturn} function.\n\
-\n\
-The default version of this hook invokes a function called\n\
-@samp{__stack_chk_fail}, taking no arguments.  This function is\n\
-normally defined in @file{libgcc2.c}.",
- tree, (void),
- default_external_stack_protect_fail)
-
-DEFHOOK
-(can_use_doloop_p,
- "Return true if it is possible to use low-overhead loops (@code{doloop_end}\n\
-and @code{doloop_begin}) for a particular loop.  @var{iterations} gives the\n\
-exact number of iterations, or 0 if not known.  @var{iterations_max} gives\n\
-the maximum number of iterations, or 0 if not known.  @var{loop_depth} is\n\
-the nesting depth of the loop, with 1 for innermost loops, 2 for loops that\n\
-contain innermost loops, and so on.  @var{entered_at_top} is true if the\n\
-loop is only entered from the top.\n\
-\n\
-This hook is only used if @code{doloop_end} is available.  The default\n\
-implementation returns true.  You can use @code{can_use_doloop_if_innermost}\n\
-if the loop must be the innermost, and if there are no other restrictions.",
- bool, (double_int iterations, double_int iterations_max,
-	unsigned int loop_depth, bool entered_at_top),
- hook_bool_dint_dint_uint_bool_true)
-
-/* Returns NULL if target supports the insn within a doloop block,
-   otherwise it returns an error message.  */
-DEFHOOK
-(invalid_within_doloop,
- "\n\
-Take an instruction in @var{insn} and return NULL if it is valid within a\n\
-low-overhead loop, otherwise return a string explaining why doloop\n\
-could not be applied.\n\
-\n\
-Many targets use special registers for low-overhead looping. For any\n\
-instruction that clobbers these this function should return a string indicating\n\
-the reason why the doloop could not be applied.\n\
-By default, the RTL loop optimizer does not use a present doloop pattern for\n\
-loops containing function calls or branch on table instructions.",
- const char *, (const_rtx insn),
- default_invalid_within_doloop)
-
-/* Returns true for a legitimate combined insn.  */
-DEFHOOK
-(legitimate_combined_insn,
-"Take an instruction in @var{insn} and return @code{false} if the instruction\
- is not appropriate as a combination of two or more instructions.  The\
- default is to accept all instructions.",
- bool, (rtx insn),
- hook_bool_rtx_true)
-
-DEFHOOK
-(valid_dllimport_attribute_p,
-"@var{decl} is a variable or function with @code{__attribute__((dllimport))}\
- specified.  Use this hook if the target needs to add extra validation\
- checks to @code{handle_dll_attribute}.",
- bool, (const_tree decl),
- hook_bool_const_tree_true)
-
-/* If non-zero, align constant anchors in CSE to a multiple of this
-   value.  */
-DEFHOOKPOD
-(const_anchor,
- "On some architectures it can take multiple instructions to synthesize\n\
-a constant.  If there is another constant already in a register that\n\
-is close enough in value then it is preferable that the new constant\n\
-is computed from this register using immediate addition or\n\
-subtraction.  We accomplish this through CSE.  Besides the value of\n\
-the constant we also add a lower and an upper constant anchor to the\n\
-available expressions.  These are then queried when encountering new\n\
-constants.  The anchors are computed by rounding the constant up and\n\
-down to a multiple of the value of @code{TARGET_CONST_ANCHOR}.\n\
-@code{TARGET_CONST_ANCHOR} should be the maximum positive value\n\
-accepted by immediate-add plus one.  We currently assume that the\n\
-value of @code{TARGET_CONST_ANCHOR} is a power of 2.  For example, on\n\
-MIPS, where add-immediate takes a 16-bit signed value,\n\
-@code{TARGET_CONST_ANCHOR} is set to @samp{0x8000}.  The default value\n\
-is zero, which disables this optimization.",
- unsigned HOST_WIDE_INT, 0)
-
-/* Defines, which target-dependent bits (upper 16) are used by port  */
-DEFHOOK
-(memmodel_check,
- "Validate target specific memory model mask bits. When NULL no target specific\n\
-memory model bits are allowed.",
- unsigned HOST_WIDE_INT, (unsigned HOST_WIDE_INT val), NULL)
-
-/* Defines an offset bitwise ored into shifted address to get corresponding
-   Address Sanitizer shadow address, or -1 if Address Sanitizer is not
-   supported by the target.  */
-DEFHOOK
-(asan_shadow_offset,
- "Return the offset bitwise ored into shifted address to get corresponding\n\
-Address Sanitizer shadow memory address.  NULL if Address Sanitizer is not\n\
-supported by the target.",
- unsigned HOST_WIDE_INT, (void),
- NULL)
-
-/* Functions relating to calls - argument passing, returns, etc.  */
-/* Members of struct call have no special macro prefix.  */
-HOOK_VECTOR (TARGET_CALLS, calls)
-
-DEFHOOK
-(promote_function_mode,
- "Like @code{PROMOTE_MODE}, but it is applied to outgoing function arguments or\n\
-function return values.  The target hook should return the new mode\n\
-and possibly change @code{*@var{punsignedp}} if the promotion should\n\
-change signedness.  This function is called only for scalar @emph{or\n\
-pointer} types.\n\
-\n\
-@var{for_return} allows to distinguish the promotion of arguments and\n\
-return values.  If it is @code{1}, a return value is being promoted and\n\
-@code{TARGET_FUNCTION_VALUE} must perform the same promotions done here.\n\
-If it is @code{2}, the returned mode should be that of the register in\n\
-which an incoming parameter is copied, or the outgoing result is computed;\n\
-then the hook should return the same mode as @code{promote_mode}, though\n\
-the signedness may be different.\n\
-\n\
-@var{type} can be NULL when promoting function arguments of libcalls.\n\
-\n\
-The default is to not promote arguments and return values.  You can\n\
-also define the hook to @code{default_promote_function_mode_always_promote}\n\
-if you would like to apply the same rules given by @code{PROMOTE_MODE}.",
- enum machine_mode, (const_tree type, enum machine_mode mode, int *punsignedp,
-		     const_tree funtype, int for_return),
- default_promote_function_mode)
-
-DEFHOOK
-(promote_prototypes,
- "This target hook returns @code{true} if an argument declared in a\n\
-prototype as an integral type smaller than @code{int} should actually be\n\
-passed as an @code{int}.  In addition to avoiding errors in certain\n\
-cases of mismatch, it also makes for better code on certain machines.\n\
-The default is to not promote prototypes.",
- bool, (const_tree fntype),
- hook_bool_const_tree_false)
-
-DEFHOOK
-(struct_value_rtx,
- "This target hook should return the location of the structure value\n\
-address (normally a @code{mem} or @code{reg}), or 0 if the address is\n\
-passed as an ``invisible'' first argument.  Note that @var{fndecl} may\n\
-be @code{NULL}, for libcalls.  You do not need to define this target\n\
-hook if the address is always passed as an ``invisible'' first\n\
-argument.\n\
-\n\
-On some architectures the place where the structure value address\n\
-is found by the called function is not the same place that the\n\
-caller put it.  This can be due to register windows, or it could\n\
-be because the function prologue moves it to a different place.\n\
-@var{incoming} is @code{1} or @code{2} when the location is needed in\n\
-the context of the called function, and @code{0} in the context of\n\
-the caller.\n\
-\n\
-If @var{incoming} is nonzero and the address is to be found on the\n\
-stack, return a @code{mem} which refers to the frame pointer. If\n\
-@var{incoming} is @code{2}, the result is being used to fetch the\n\
-structure value address at the beginning of a function.  If you need\n\
-to emit adjusting code, you should do it at this point.",
- rtx, (tree fndecl, int incoming),
- hook_rtx_tree_int_null)
-DEFHOOK
-(return_in_memory,
- "This target hook should return a nonzero value to say to return the\n\
-function value in memory, just as large structures are always returned.\n\
-Here @var{type} will be the data type of the value, and @var{fntype}\n\
-will be the type of the function doing the returning, or @code{NULL} for\n\
-libcalls.\n\
-\n\
-Note that values of mode @code{BLKmode} must be explicitly handled\n\
-by this function.  Also, the option @option{-fpcc-struct-return}\n\
-takes effect regardless of this macro.  On most systems, it is\n\
-possible to leave the hook undefined; this causes a default\n\
-definition to be used, whose value is the constant 1 for @code{BLKmode}\n\
-values, and 0 otherwise.\n\
-\n\
-Do not use this hook to indicate that structures and unions should always\n\
-be returned in memory.  You should instead use @code{DEFAULT_PCC_STRUCT_RETURN}\n\
-to indicate this.",
- bool, (const_tree type, const_tree fntype),
- default_return_in_memory)
-
-DEFHOOK
-(return_in_msb,
- "This hook should return true if values of type @var{type} are returned\n\
-at the most significant end of a register (in other words, if they are\n\
-padded at the least significant end).  You can assume that @var{type}\n\
-is returned in a register; the caller is required to check this.\n\
-\n\
-Note that the register provided by @code{TARGET_FUNCTION_VALUE} must\n\
-be able to hold the complete return value.  For example, if a 1-, 2-\n\
-or 3-byte structure is returned at the most significant end of a\n\
-4-byte register, @code{TARGET_FUNCTION_VALUE} should provide an\n\
-@code{SImode} rtx.",
- bool, (const_tree type),
- hook_bool_const_tree_false)
-
-/* Return true if a parameter must be passed by reference.  TYPE may
-   be null if this is a libcall.  CA may be null if this query is
-   from __builtin_va_arg.  */
-DEFHOOK
-(pass_by_reference,
- "This target hook should return @code{true} if an argument at the\n\
-position indicated by @var{cum} should be passed by reference.  This\n\
-predicate is queried after target independent reasons for being\n\
-passed by reference, such as @code{TREE_ADDRESSABLE (type)}.\n\
-\n\
-If the hook returns true, a copy of that argument is made in memory and a\n\
-pointer to the argument is passed instead of the argument itself.\n\
-The pointer is passed in whatever way is appropriate for passing a pointer\n\
-to that type.",
- bool,
- (cumulative_args_t cum, enum machine_mode mode, const_tree type, bool named),
- hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false)
-
-DEFHOOK
-(expand_builtin_saveregs,
- "If defined, this hook produces the machine-specific code for a call to\n\
-@code{__builtin_saveregs}.  This code will be moved to the very\n\
-beginning of the function, before any parameter access are made.  The\n\
-return value of this function should be an RTX that contains the value\n\
-to use as the return of @code{__builtin_saveregs}.",
- rtx, (void),
- default_expand_builtin_saveregs)
-
-/* Returns pretend_argument_size.  */
-DEFHOOK
-(setup_incoming_varargs,
- "This target hook offers an alternative to using\n\
-@code{__builtin_saveregs} and defining the hook\n\
-@code{TARGET_EXPAND_BUILTIN_SAVEREGS}.  Use it to store the anonymous\n\
-register arguments into the stack so that all the arguments appear to\n\
-have been passed consecutively on the stack.  Once this is done, you can\n\
-use the standard implementation of varargs that works for machines that\n\
-pass all their arguments on the stack.\n\
-\n\
-The argument @var{args_so_far} points to the @code{CUMULATIVE_ARGS} data\n\
-structure, containing the values that are obtained after processing the\n\
-named arguments.  The arguments @var{mode} and @var{type} describe the\n\
-last named argument---its machine mode and its data type as a tree node.\n\
-\n\
-The target hook should do two things: first, push onto the stack all the\n\
-argument registers @emph{not} used for the named arguments, and second,\n\
-store the size of the data thus pushed into the @code{int}-valued\n\
-variable pointed to by @var{pretend_args_size}.  The value that you\n\
-store here will serve as additional offset for setting up the stack\n\
-frame.\n\
-\n\
-Because you must generate code to push the anonymous arguments at\n\
-compile time without knowing their data types,\n\
-@code{TARGET_SETUP_INCOMING_VARARGS} is only useful on machines that\n\
-have just a single category of argument register and use it uniformly\n\
-for all data types.\n\
-\n\
-If the argument @var{second_time} is nonzero, it means that the\n\
-arguments of the function are being analyzed for the second time.  This\n\
-happens for an inline function, which is not actually compiled until the\n\
-end of the source file.  The hook @code{TARGET_SETUP_INCOMING_VARARGS} should\n\
-not generate any instructions in this case.",
- void, (cumulative_args_t args_so_far, enum machine_mode mode, tree type,
-	int *pretend_args_size, int second_time),
- default_setup_incoming_varargs)
-
-DEFHOOK
-(strict_argument_naming,
- "Define this hook to return @code{true} if the location where a function\n\
-argument is passed depends on whether or not it is a named argument.\n\
-\n\
-This hook controls how the @var{named} argument to @code{TARGET_FUNCTION_ARG}\n\
-is set for varargs and stdarg functions.  If this hook returns\n\
-@code{true}, the @var{named} argument is always true for named\n\
-arguments, and false for unnamed arguments.  If it returns @code{false},\n\
-but @code{TARGET_PRETEND_OUTGOING_VARARGS_NAMED} returns @code{true},\n\
-then all arguments are treated as named.  Otherwise, all named arguments\n\
-except the last are treated as named.\n\
-\n\
-You need not define this hook if it always returns @code{false}.",
- bool, (cumulative_args_t ca),
- hook_bool_CUMULATIVE_ARGS_false)
-
-/* Returns true if we should use
-   targetm.calls.setup_incoming_varargs() and/or
-   targetm.calls.strict_argument_naming().  */
-DEFHOOK
-(pretend_outgoing_varargs_named,
- "If you need to conditionally change ABIs so that one works with\n\
-@code{TARGET_SETUP_INCOMING_VARARGS}, but the other works like neither\n\
-@code{TARGET_SETUP_INCOMING_VARARGS} nor @code{TARGET_STRICT_ARGUMENT_NAMING} was\n\
-defined, then define this hook to return @code{true} if\n\
-@code{TARGET_SETUP_INCOMING_VARARGS} is used, @code{false} otherwise.\n\
-Otherwise, you should not define this hook.",
- bool, (cumulative_args_t ca),
- default_pretend_outgoing_varargs_named)
-
-/* Given a complex type T, return true if a parameter of type T
-   should be passed as two scalars.  */
-DEFHOOK
-(split_complex_arg,
- "This hook should return true if parameter of type @var{type} are passed\n\
-as two scalar parameters.  By default, GCC will attempt to pack complex\n\
-arguments into the target's word size.  Some ABIs require complex arguments\n\
-to be split and treated as their individual components.  For example, on\n\
-AIX64, complex floats should be passed in a pair of floating point\n\
-registers, even though a complex float would fit in one 64-bit floating\n\
-point register.\n\
-\n\
-The default value of this hook is @code{NULL}, which is treated as always\n\
-false.",
- bool, (const_tree type), NULL)
-
-/* Return true if type T, mode MODE, may not be passed in registers,
-   but must be passed on the stack.  */
-/* ??? This predicate should be applied strictly after pass-by-reference.
-   Need audit to verify that this is the case.  */
-DEFHOOK
-(must_pass_in_stack,
- "This target hook should return @code{true} if we should not pass @var{type}\n\
-solely in registers.  The file @file{expr.h} defines a\n\
-definition that is usually appropriate, refer to @file{expr.h} for additional\n\
-documentation.",
- bool, (enum machine_mode mode, const_tree type),
- must_pass_in_stack_var_size_or_pad)
-
-/* Return true if type TYPE, mode MODE, which is passed by reference,
-   should have the object copy generated by the callee rather than
-   the caller.  It is never called for TYPE requiring constructors.  */
-DEFHOOK
-(callee_copies,
- "The function argument described by the parameters to this hook is\n\
-known to be passed by reference.  The hook should return true if the\n\
-function argument should be copied by the callee instead of copied\n\
-by the caller.\n\
-\n\
-For any argument for which the hook returns true, if it can be\n\
-determined that the argument is not modified, then a copy need\n\
-not be generated.\n\
-\n\
-The default version of this hook always returns false.",
- bool,
- (cumulative_args_t cum, enum machine_mode mode, const_tree type, bool named),
- hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false)
-
-/* Return zero for arguments passed entirely on the stack or entirely
-   in registers.  If passed in both, return the number of bytes passed
-   in registers; the balance is therefore passed on the stack.  */
-DEFHOOK
-(arg_partial_bytes,
- "This target hook returns the number of bytes at the beginning of an\n\
-argument that must be put in registers.  The value must be zero for\n\
-arguments that are passed entirely in registers or that are entirely\n\
-pushed on the stack.\n\
-\n\
-On some machines, certain arguments must be passed partially in\n\
-registers and partially in memory.  On these machines, typically the\n\
-first few words of arguments are passed in registers, and the rest\n\
-on the stack.  If a multi-word argument (a @code{double} or a\n\
-structure) crosses that boundary, its first few words must be passed\n\
-in registers and the rest must be pushed.  This macro tells the\n\
-compiler when this occurs, and how many bytes should go in registers.\n\
-\n\
-@code{TARGET_FUNCTION_ARG} for these arguments should return the first\n\
-register to be used by the caller for this argument; likewise\n\
-@code{TARGET_FUNCTION_INCOMING_ARG}, for the called function.",
- int, (cumulative_args_t cum, enum machine_mode mode, tree type, bool named),
- hook_int_CUMULATIVE_ARGS_mode_tree_bool_0)
-
-/* Update the state in CA to advance past an argument in the
-   argument list.  The values MODE, TYPE, and NAMED describe that
-   argument.  */
-DEFHOOK
-(function_arg_advance,
- "This hook updates the summarizer variable pointed to by @var{ca} to\n\
-advance past an argument in the argument list.  The values @var{mode},\n\
-@var{type} and @var{named} describe that argument.  Once this is done,\n\
-the variable @var{cum} is suitable for analyzing the @emph{following}\n\
-argument with @code{TARGET_FUNCTION_ARG}, etc.\n\
-\n\
-This hook need not do anything if the argument in question was passed\n\
-on the stack.  The compiler knows how to track the amount of stack space\n\
-used for arguments without any special help.",
- void,
- (cumulative_args_t ca, enum machine_mode mode, const_tree type, bool named),
- default_function_arg_advance)
-
-/* Return zero if the argument described by the state of CA should
-   be placed on a stack, or a hard register in which to store the
-   argument.  The values MODE, TYPE, and NAMED describe that
-   argument.  */
-DEFHOOK
-(function_arg,
- "Return an RTX indicating whether a function argument is passed in a\n\
-register and if so, which register.\n\
-\n\
-The arguments are @var{ca}, which summarizes all the previous\n\
-arguments; @var{mode}, the machine mode of the argument; @var{type},\n\
-the data type of the argument as a tree node or 0 if that is not known\n\
-(which happens for C support library functions); and @var{named},\n\
-which is @code{true} for an ordinary argument and @code{false} for\n\
-nameless arguments that correspond to @samp{@dots{}} in the called\n\
-function's prototype.  @var{type} can be an incomplete type if a\n\
-syntax error has previously occurred.\n\
-\n\
-The return value is usually either a @code{reg} RTX for the hard\n\
-register in which to pass the argument, or zero to pass the argument\n\
-on the stack.\n\
-\n\
-The value of the expression can also be a @code{parallel} RTX@.  This is\n\
-used when an argument is passed in multiple locations.  The mode of the\n\
-@code{parallel} should be the mode of the entire argument.  The\n\
-@code{parallel} holds any number of @code{expr_list} pairs; each one\n\
-describes where part of the argument is passed.  In each\n\
-@code{expr_list} the first operand must be a @code{reg} RTX for the hard\n\
-register in which to pass this part of the argument, and the mode of the\n\
-register RTX indicates how large this part of the argument is.  The\n\
-second operand of the @code{expr_list} is a @code{const_int} which gives\n\
-the offset in bytes into the entire argument of where this part starts.\n\
-As a special exception the first @code{expr_list} in the @code{parallel}\n\
-RTX may have a first operand of zero.  This indicates that the entire\n\
-argument is also stored on the stack.\n\
-\n\
-The last time this hook is called, it is called with @code{MODE ==\n\
-VOIDmode}, and its result is passed to the @code{call} or @code{call_value}\n\
-pattern as operands 2 and 3 respectively.\n\
-\n\
-@cindex @file{stdarg.h} and register arguments\n\
-The usual way to make the ISO library @file{stdarg.h} work on a\n\
-machine where some arguments are usually passed in registers, is to\n\
-cause nameless arguments to be passed on the stack instead.  This is\n\
-done by making @code{TARGET_FUNCTION_ARG} return 0 whenever\n\
-@var{named} is @code{false}.\n\
-\n\
-@cindex @code{TARGET_MUST_PASS_IN_STACK}, and @code{TARGET_FUNCTION_ARG}\n\
-@cindex @code{REG_PARM_STACK_SPACE}, and @code{TARGET_FUNCTION_ARG}\n\
-You may use the hook @code{targetm.calls.must_pass_in_stack}\n\
-in the definition of this macro to determine if this argument is of a\n\
-type that must be passed in the stack.  If @code{REG_PARM_STACK_SPACE}\n\
-is not defined and @code{TARGET_FUNCTION_ARG} returns nonzero for such an\n\
-argument, the compiler will abort.  If @code{REG_PARM_STACK_SPACE} is\n\
-defined, the argument will be computed in the stack and then loaded into\n\
-a register.",
- rtx, (cumulative_args_t ca, enum machine_mode mode, const_tree type,
-       bool named),
- default_function_arg)
-
-/* Likewise, but for machines with register windows.  Return the
-   location where the argument will appear to the callee.  */
-DEFHOOK
-(function_incoming_arg,
- "Define this hook if the target machine has ``register windows'', so\n\
-that the register in which a function sees an arguments is not\n\
-necessarily the same as the one in which the caller passed the\n\
-argument.\n\
-\n\
-For such machines, @code{TARGET_FUNCTION_ARG} computes the register in\n\
-which the caller passes the value, and\n\
-@code{TARGET_FUNCTION_INCOMING_ARG} should be defined in a similar\n\
-fashion to tell the function being called where the arguments will\n\
-arrive.\n\
-\n\
-If @code{TARGET_FUNCTION_INCOMING_ARG} is not defined,\n\
-@code{TARGET_FUNCTION_ARG} serves both purposes.",
- rtx, (cumulative_args_t ca, enum machine_mode mode, const_tree type,
-       bool named),
- default_function_incoming_arg)
-
-DEFHOOK
-(function_arg_boundary,
- "This hook returns the alignment boundary, in bits, of an argument\n\
-with the specified mode and type.  The default hook returns\n\
-@code{PARM_BOUNDARY} for all arguments.",
- unsigned int, (enum machine_mode mode, const_tree type),
- default_function_arg_boundary)
-
-DEFHOOK
-(function_arg_round_boundary,
- "Normally, the size of an argument is rounded up to @code{PARM_BOUNDARY},\n\
-which is the default value for this hook.  You can define this hook to\n\
-return a different value if an argument size must be rounded to a larger\n\
-value.",
- unsigned int, (enum machine_mode mode, const_tree type),
- default_function_arg_round_boundary)
-
-/* Return the diagnostic message string if function without a prototype
-   is not allowed for this 'val' argument; NULL otherwise. */
-DEFHOOK
-(invalid_arg_for_unprototyped_fn,
- "If defined, this macro returns the diagnostic message when it is\n\
-illegal to pass argument @var{val} to function @var{funcdecl}\n\
-with prototype @var{typelist}.",
- const char *, (const_tree typelist, const_tree funcdecl, const_tree val),
- hook_invalid_arg_for_unprototyped_fn)
-
-/* Return an rtx for the return value location of the function
-   specified by FN_DECL_OR_TYPE with a return type of RET_TYPE.  */
-DEFHOOK
-(function_value,
- "\n\
-Define this to return an RTX representing the place where a function\n\
-returns or receives a value of data type @var{ret_type}, a tree node\n\
-representing a data type.  @var{fn_decl_or_type} is a tree node\n\
-representing @code{FUNCTION_DECL} or @code{FUNCTION_TYPE} of a\n\
-function being called.  If @var{outgoing} is false, the hook should\n\
-compute the register in which the caller will see the return value.\n\
-Otherwise, the hook should return an RTX representing the place where\n\
-a function returns a value.\n\
-\n\
-On many machines, only @code{TYPE_MODE (@var{ret_type})} is relevant.\n\
-(Actually, on most machines, scalar values are returned in the same\n\
-place regardless of mode.)  The value of the expression is usually a\n\
-@code{reg} RTX for the hard register where the return value is stored.\n\
-The value can also be a @code{parallel} RTX, if the return value is in\n\
-multiple places.  See @code{TARGET_FUNCTION_ARG} for an explanation of the\n\
-@code{parallel} form.   Note that the callee will populate every\n\
-location specified in the @code{parallel}, but if the first element of\n\
-the @code{parallel} contains the whole return value, callers will use\n\
-that element as the canonical location and ignore the others.  The m68k\n\
-port uses this type of @code{parallel} to return pointers in both\n\
-@samp{%a0} (the canonical location) and @samp{%d0}.\n\
-\n\
-If @code{TARGET_PROMOTE_FUNCTION_RETURN} returns true, you must apply\n\
-the same promotion rules specified in @code{PROMOTE_MODE} if\n\
-@var{valtype} is a scalar type.\n\
-\n\
-If the precise function being called is known, @var{func} is a tree\n\
-node (@code{FUNCTION_DECL}) for it; otherwise, @var{func} is a null\n\
-pointer.  This makes it possible to use a different value-returning\n\
-convention for specific functions when all their calls are\n\
-known.\n\
-\n\
-Some target machines have ``register windows'' so that the register in\n\
-which a function returns its value is not the same as the one in which\n\
-the caller sees the value.  For such machines, you should return\n\
-different RTX depending on @var{outgoing}.\n\
-\n\
-@code{TARGET_FUNCTION_VALUE} is not used for return values with\n\
-aggregate data types, because these are returned in another way.  See\n\
-@code{TARGET_STRUCT_VALUE_RTX} and related macros, below.",
- rtx, (const_tree ret_type, const_tree fn_decl_or_type, bool outgoing),
- default_function_value)
-
-/* Return the rtx for the result of a libcall of mode MODE,
-   calling the function FN_NAME.  */
-DEFHOOK
-(libcall_value,
- "Define this hook if the back-end needs to know the name of the libcall\n\
-function in order to determine where the result should be returned.\n\
-\n\
-The mode of the result is given by @var{mode} and the name of the called\n\
-library function is given by @var{fun}.  The hook should return an RTX\n\
-representing the place where the library function result will be returned.\n\
-\n\
-If this hook is not defined, then LIBCALL_VALUE will be used.",
- rtx, (enum machine_mode mode, const_rtx fun),
- default_libcall_value)
-
-/* Return true if REGNO is a possible register number for
-   a function value as seen by the caller.  */
-DEFHOOK
-(function_value_regno_p,
- "A target hook that return @code{true} if @var{regno} is the number of a hard\n\
-register in which the values of called function may come back.\n\
-\n\
-A register whose use for returning values is limited to serving as the\n\
-second of a pair (for a value of type @code{double}, say) need not be\n\
-recognized by this target hook.\n\
-\n\
-If the machine has register windows, so that the caller and the called\n\
-function use different registers for the return value, this target hook\n\
-should recognize only the caller's register numbers.\n\
-\n\
-If this hook is not defined, then FUNCTION_VALUE_REGNO_P will be used.",
- bool, (const unsigned int regno),
- default_function_value_regno_p)
-
-/* ??? Documenting this hook requires a GFDL license grant.  */
-DEFHOOK_UNDOC
-(internal_arg_pointer,
-"Return an rtx for the argument pointer incoming to the\
- current function.",
- rtx, (void),
- default_internal_arg_pointer)
-
-/* Update the current function stack boundary if needed.  */
-DEFHOOK
-(update_stack_boundary,
- "Define this macro to update the current function stack boundary if\n\
-necessary.",
- void, (void), NULL)
-
-/* Handle stack alignment and return an rtx for Dynamic Realign
-   Argument Pointer if necessary.  */
-DEFHOOK
-(get_drap_rtx,
- "This hook should return an rtx for Dynamic Realign Argument Pointer (DRAP) if a\n\
-different argument pointer register is needed to access the function's\n\
-argument list due to stack realignment.  Return @code{NULL} if no DRAP\n\
-is needed.",
- rtx, (void), NULL)
-
-/* Return true if all function parameters should be spilled to the
-   stack.  */
-DEFHOOK
-(allocate_stack_slots_for_args,
- "When optimization is disabled, this hook indicates whether or not\n\
-arguments should be allocated to stack slots.  Normally, GCC allocates\n\
-stacks slots for arguments when not optimizing in order to make\n\
-debugging easier.  However, when a function is declared with\n\
-@code{__attribute__((naked))}, there is no stack frame, and the compiler\n\
-cannot safely move arguments from the registers in which they are passed\n\
-to the stack.  Therefore, this hook should return true in general, but\n\
-false for naked functions.  The default implementation always returns true.",
- bool, (void),
- hook_bool_void_true)
-
-/* Return an rtx for the static chain for FNDECL.  If INCOMING_P is true,
-       then it should be for the callee; otherwise for the caller.  */
-DEFHOOK
-(static_chain,
- "This hook replaces the use of @code{STATIC_CHAIN_REGNUM} et al for\n\
-targets that may use different static chain locations for different\n\
-nested functions.  This may be required if the target has function\n\
-attributes that affect the calling conventions of the function and\n\
-those calling conventions use different static chain locations.\n\
-\n\
-The default version of this hook uses @code{STATIC_CHAIN_REGNUM} et al.\n\
-\n\
-If the static chain is passed in memory, this hook should be used to\n\
-provide rtx giving @code{mem} expressions that denote where they are stored.\n\
-Often the @code{mem} expression as seen by the caller will be at an offset\n\
-from the stack pointer and the @code{mem} expression as seen by the callee\n\
-will be at an offset from the frame pointer.\n\
-@findex stack_pointer_rtx\n\
-@findex frame_pointer_rtx\n\
-@findex arg_pointer_rtx\n\
-The variables @code{stack_pointer_rtx}, @code{frame_pointer_rtx}, and\n\
-@code{arg_pointer_rtx} will have been initialized and should be used\n\
-to refer to those items.",
- rtx, (const_tree fndecl, bool incoming_p),
- default_static_chain)
-
-/* Fill in the trampoline at MEM with a call to FNDECL and a
-   static chain value of CHAIN.  */
-DEFHOOK
-(trampoline_init,
- "This hook is called to initialize a trampoline.\n\
-@var{m_tramp} is an RTX for the memory block for the trampoline; @var{fndecl}\n\
-is the @code{FUNCTION_DECL} for the nested function; @var{static_chain} is an\n\
-RTX for the static chain value that should be passed to the function\n\
-when it is called.\n\
-\n\
-If the target defines @code{TARGET_ASM_TRAMPOLINE_TEMPLATE}, then the\n\
-first thing this hook should do is emit a block move into @var{m_tramp}\n\
-from the memory block returned by @code{assemble_trampoline_template}.\n\
-Note that the block move need only cover the constant parts of the\n\
-trampoline.  If the target isolates the variable parts of the trampoline\n\
-to the end, not all @code{TRAMPOLINE_SIZE} bytes need be copied.\n\
-\n\
-If the target requires any other actions, such as flushing caches or\n\
-enabling stack execution, these actions should be performed after\n\
-initializing the trampoline proper.",
- void, (rtx m_tramp, tree fndecl, rtx static_chain),
- default_trampoline_init)
-
-/* Adjust the address of the trampoline in a target-specific way.  */
-DEFHOOK
-(trampoline_adjust_address,
- "This hook should perform any machine-specific adjustment in\n\
-the address of the trampoline.  Its argument contains the address of the\n\
-memory block that was passed to @code{TARGET_TRAMPOLINE_INIT}.  In case\n\
-the address to be used for a function call should be different from the\n\
-address at which the template was stored, the different address should\n\
-be returned; otherwise @var{addr} should be returned unchanged.\n\
-If this hook is not defined, @var{addr} will be used for function calls.",
- rtx, (rtx addr), NULL)
-
-/* Return the number of bytes of its own arguments that a function
-   pops on returning, or 0 if the function pops no arguments and the
-   caller must therefore pop them all after the function returns.  */
-/* ??? tm.texi has no types for the parameters.  */
-DEFHOOK
-(return_pops_args,
- "This target hook returns the number of bytes of its own arguments that\n\
-a function pops on returning, or 0 if the function pops no arguments\n\
-and the caller must therefore pop them all after the function returns.\n\
-\n\
-@var{fundecl} is a C variable whose value is a tree node that describes\n\
-the function in question.  Normally it is a node of type\n\
-@code{FUNCTION_DECL} that describes the declaration of the function.\n\
-From this you can obtain the @code{DECL_ATTRIBUTES} of the function.\n\
-\n\
-@var{funtype} is a C variable whose value is a tree node that\n\
-describes the function in question.  Normally it is a node of type\n\
-@code{FUNCTION_TYPE} that describes the data type of the function.\n\
-From this it is possible to obtain the data types of the value and\n\
-arguments (if known).\n\
-\n\
-When a call to a library function is being considered, @var{fundecl}\n\
-will contain an identifier node for the library function.  Thus, if\n\
-you need to distinguish among various library functions, you can do so\n\
-by their names.  Note that ``library function'' in this context means\n\
-a function used to perform arithmetic, whose name is known specially\n\
-in the compiler and was not mentioned in the C code being compiled.\n\
-\n\
-@var{size} is the number of bytes of arguments passed on the\n\
-stack.  If a variable number of bytes is passed, it is zero, and\n\
-argument popping will always be the responsibility of the calling function.\n\
-\n\
-On the VAX, all functions always pop their arguments, so the definition\n\
-of this macro is @var{size}.  On the 68000, using the standard\n\
-calling convention, no functions pop their arguments, so the value of\n\
-the macro is always 0 in this case.  But an alternative calling\n\
-convention is available in which functions that take a fixed number of\n\
-arguments pop them but other functions (such as @code{printf}) pop\n\
-nothing (the caller pops all).  When this convention is in use,\n\
-@var{funtype} is examined to determine whether a function takes a fixed\n\
-number of arguments.",
- int, (tree fundecl, tree funtype, int size),
- default_return_pops_args)
-
-/* Return a mode wide enough to copy any function value that might be
-   returned.  */
-DEFHOOK
-(get_raw_result_mode,
- "This target hook returns the mode to be used when accessing raw return\
- registers in @code{__builtin_return}.  Define this macro if the value\
- in @var{reg_raw_mode} is not correct.",
- enum machine_mode, (int regno),
- default_get_reg_raw_mode)
-
-/* Return a mode wide enough to copy any argument value that might be
-   passed.  */
-DEFHOOK
-(get_raw_arg_mode,
- "This target hook returns the mode to be used when accessing raw argument\
- registers in @code{__builtin_apply_args}.  Define this macro if the value\
- in @var{reg_raw_mode} is not correct.",
- enum machine_mode, (int regno),
- default_get_reg_raw_mode)
-
-HOOK_VECTOR_END (calls)
-
-/* Return the diagnostic message string if conversion from FROMTYPE
-   to TOTYPE is not allowed, NULL otherwise.  */
-DEFHOOK
-(invalid_conversion,
- "If defined, this macro returns the diagnostic message when it is\n\
-invalid to convert from @var{fromtype} to @var{totype}, or @code{NULL}\n\
-if validity should be determined by the front end.",
- const char *, (const_tree fromtype, const_tree totype),
- hook_constcharptr_const_tree_const_tree_null)
-
-/* Return the diagnostic message string if the unary operation OP is
-   not permitted on TYPE, NULL otherwise.  */
-DEFHOOK
-(invalid_unary_op,
- "If defined, this macro returns the diagnostic message when it is\n\
-invalid to apply operation @var{op} (where unary plus is denoted by\n\
-@code{CONVERT_EXPR}) to an operand of type @var{type}, or @code{NULL}\n\
-if validity should be determined by the front end.",
- const char *, (int op, const_tree type),
- hook_constcharptr_int_const_tree_null)
-
-/* Return the diagnostic message string if the binary operation OP
-   is not permitted on TYPE1 and TYPE2, NULL otherwise.  */
-DEFHOOK
-(invalid_binary_op,
- "If defined, this macro returns the diagnostic message when it is\n\
-invalid to apply operation @var{op} to operands of types @var{type1}\n\
-and @var{type2}, or @code{NULL} if validity should be determined by\n\
-the front end.",
- const char *, (int op, const_tree type1, const_tree type2),
- hook_constcharptr_int_const_tree_const_tree_null)
-
-/* Return the diagnostic message string if TYPE is not valid as a
-   function parameter type, NULL otherwise.  */
-DEFHOOK
-(invalid_parameter_type,
- "If defined, this macro returns the diagnostic message when it is\n\
-invalid for functions to include parameters of type @var{type},\n\
-or @code{NULL} if validity should be determined by\n\
-the front end.  This is currently used only by the C and C++ front ends.",
- const char *, (const_tree type),
- hook_constcharptr_const_tree_null)
-
-/* Return the diagnostic message string if TYPE is not valid as a
-   function return type, NULL otherwise.  */
-DEFHOOK
-(invalid_return_type,
- "If defined, this macro returns the diagnostic message when it is\n\
-invalid for functions to have return type @var{type},\n\
-or @code{NULL} if validity should be determined by\n\
-the front end.  This is currently used only by the C and C++ front ends.",
- const char *, (const_tree type),
- hook_constcharptr_const_tree_null)
-
-/* If values of TYPE are promoted to some other type when used in
-   expressions (analogous to the integer promotions), return that type,
-   or NULL_TREE otherwise.  */
-DEFHOOK
-(promoted_type,
- "If defined, this target hook returns the type to which values of\n\
-@var{type} should be promoted when they appear in expressions,\n\
-analogous to the integer promotions, or @code{NULL_TREE} to use the\n\
-front end's normal promotion rules.  This hook is useful when there are\n\
-target-specific types with special promotion rules.\n\
-This is currently used only by the C and C++ front ends.",
- tree, (const_tree type),
- hook_tree_const_tree_null)
-
-/* Convert EXPR to TYPE, if target-specific types with special conversion
-   rules are involved.  Return the converted expression, or NULL to apply
-   the standard conversion rules.  */
-DEFHOOK
-(convert_to_type,
- "If defined, this hook returns the result of converting @var{expr} to\n\
-@var{type}.  It should return the converted expression,\n\
-or @code{NULL_TREE} to apply the front end's normal conversion rules.\n\
-This hook is useful when there are target-specific types with special\n\
-conversion rules.\n\
-This is currently used only by the C and C++ front ends.",
- tree, (tree type, tree expr),
- hook_tree_tree_tree_null)
-
-/* Return true if we use LRA instead of reload.  */
-DEFHOOK
-(lra_p,
- "A target hook which returns true if we use LRA instead of reload pass.\
-  It means that LRA was ported to the target.\
-  \
-  The default version of this target hook returns always false.",
- bool, (void),
- default_lra_p)
-
-/* Return register priority of given hard regno for the current target.  */
-DEFHOOK
-(register_priority,
- "A target hook which returns the register priority number to which the\
-  register @var{hard_regno} belongs to.  The bigger the number, the\
-  more preferable the hard register usage (when all other conditions are\
-  the same).  This hook can be used to prefer some hard register over\
-  others in LRA.  For example, some x86-64 register usage needs\
-  additional prefix which makes instructions longer.  The hook can\
-  return lower priority number for such registers make them less favorable\
-  and as result making the generated code smaller.\
-  \
-  The default version of this target hook returns always zero.",
- int, (int),
- default_register_priority)
-
-/* Return true if we need register usage leveling.  */
-DEFHOOK
-(register_usage_leveling_p,
- "A target hook which returns true if we need register usage leveling.\
-  That means if a few hard registers are equally good for the\
-  assignment, we choose the least used hard register.  The register\
-  usage leveling may be profitable for some targets.  Don't use the\
-  usage leveling for targets with conditional execution or targets\
-  with big register files as it hurts if-conversion and cross-jumping\
-  optimizations.\
-  \
-  The default version of this target hook returns always false.",
- bool, (void),
- default_register_usage_leveling_p)
-
-/* Return true if maximal address displacement can be different.  */
-DEFHOOK
-(different_addr_displacement_p,
- "A target hook which returns true if an address with the same structure\
-  can have different maximal legitimate displacement.  For example, the\
-  displacement can depend on memory mode or on operand combinations in\
-  the insn.\
-  \
-  The default version of this target hook returns always false.",
- bool, (void),
- default_different_addr_displacement_p)
-
-/* Determine class for spilling pseudos of given mode into registers
-   instead of memory.  */
-DEFHOOK
-(spill_class,
- "This hook defines a class of registers which could be used for spilling\
-  pseudos of the given mode and class, or @code{NO_REGS} if only memory\
-  should be used.  Not defining this hook is equivalent to returning\
-  @code{NO_REGS} for all inputs.",
- reg_class_t, (reg_class_t, enum machine_mode),
- NULL)
-
-DEFHOOK
-(cstore_mode,
- "This hook defines the machine mode to use for the boolean result of\
-  conditional store patterns.  The ICODE argument is the instruction code\
-  for the cstore being performed.  Not definiting this hook is the same\
-  as accepting the mode encoded into operand 0 of the cstore expander\
-  patterns.",
-  enum machine_mode, (enum insn_code icode),
-  default_cstore_mode)
-
-/* True if a structure, union or array with MODE containing FIELD should
-   be accessed using BLKmode.  */
-DEFHOOK
-(member_type_forces_blk,
- "Return true if a structure, union or array containing @var{field} should\n\
-be accessed using @code{BLKMODE}.\n\
-\n\
-If @var{field} is the only field in the structure, @var{mode} is its\n\
-mode, otherwise @var{mode} is VOIDmode.  @var{mode} is provided in the\n\
-case where structures of one field would require the structure's mode to\n\
-retain the field's mode.\n\
-\n\
-Normally, this is not needed.",
- bool, (const_tree field, enum machine_mode mode),
- default_member_type_forces_blk)
-
-/* Return the class for a secondary reload, and fill in extra information.  */
-DEFHOOK
-(secondary_reload,
- "Many machines have some registers that cannot be copied directly to or\n\
-from memory or even from other types of registers.  An example is the\n\
-@samp{MQ} register, which on most machines, can only be copied to or\n\
-from general registers, but not memory.  Below, we shall be using the\n\
-term 'intermediate register' when a move operation cannot be performed\n\
-directly, but has to be done by copying the source into the intermediate\n\
-register first, and then copying the intermediate register to the\n\
-destination.  An intermediate register always has the same mode as\n\
-source and destination.  Since it holds the actual value being copied,\n\
-reload might apply optimizations to re-use an intermediate register\n\
-and eliding the copy from the source when it can determine that the\n\
-intermediate register still holds the required value.\n\
-\n\
-Another kind of secondary reload is required on some machines which\n\
-allow copying all registers to and from memory, but require a scratch\n\
-register for stores to some memory locations (e.g., those with symbolic\n\
-address on the RT, and those with certain symbolic address on the SPARC\n\
-when compiling PIC)@.  Scratch registers need not have the same mode\n\
-as the value being copied, and usually hold a different value than\n\
-that being copied.  Special patterns in the md file are needed to\n\
-describe how the copy is performed with the help of the scratch register;\n\
-these patterns also describe the number, register class(es) and mode(s)\n\
-of the scratch register(s).\n\
-\n\
-In some cases, both an intermediate and a scratch register are required.\n\
-\n\
-For input reloads, this target hook is called with nonzero @var{in_p},\n\
-and @var{x} is an rtx that needs to be copied to a register of class\n\
-@var{reload_class} in @var{reload_mode}.  For output reloads, this target\n\
-hook is called with zero @var{in_p}, and a register of class @var{reload_class}\n\
-needs to be copied to rtx @var{x} in @var{reload_mode}.\n\
-\n\
-If copying a register of @var{reload_class} from/to @var{x} requires\n\
-an intermediate register, the hook @code{secondary_reload} should\n\
-return the register class required for this intermediate register.\n\
-If no intermediate register is required, it should return NO_REGS.\n\
-If more than one intermediate register is required, describe the one\n\
-that is closest in the copy chain to the reload register.\n\
-\n\
-If scratch registers are needed, you also have to describe how to\n\
-perform the copy from/to the reload register to/from this\n\
-closest intermediate register.  Or if no intermediate register is\n\
-required, but still a scratch register is needed, describe the\n\
-copy  from/to the reload register to/from the reload operand @var{x}.\n\
-\n\
-You do this by setting @code{sri->icode} to the instruction code of a pattern\n\
-in the md file which performs the move.  Operands 0 and 1 are the output\n\
-and input of this copy, respectively.  Operands from operand 2 onward are\n\
-for scratch operands.  These scratch operands must have a mode, and a\n\
-single-register-class\n\
-@c [later: or memory]\n\
-output constraint.\n\
-\n\
-When an intermediate register is used, the @code{secondary_reload}\n\
-hook will be called again to determine how to copy the intermediate\n\
-register to/from the reload operand @var{x}, so your hook must also\n\
-have code to handle the register class of the intermediate operand.\n\
-\n\
-@c [For later: maybe we'll allow multi-alternative reload patterns -\n\
-@c   the port maintainer could name a mov<mode> pattern that has clobbers -\n\
-@c   and match the constraints of input and output to determine the required\n\
-@c   alternative.  A restriction would be that constraints used to match\n\
-@c   against reloads registers would have to be written as register class\n\
-@c   constraints, or we need a new target macro / hook that tells us if an\n\
-@c   arbitrary constraint can match an unknown register of a given class.\n\
-@c   Such a macro / hook would also be useful in other places.]\n\
-\n\
-\n\
-@var{x} might be a pseudo-register or a @code{subreg} of a\n\
-pseudo-register, which could either be in a hard register or in memory.\n\
-Use @code{true_regnum} to find out; it will return @minus{}1 if the pseudo is\n\
-in memory and the hard register number if it is in a register.\n\
-\n\
-Scratch operands in memory (constraint @code{\"=m\"} / @code{\"=&m\"}) are\n\
-currently not supported.  For the time being, you will have to continue\n\
-to use @code{SECONDARY_MEMORY_NEEDED} for that purpose.\n\
-\n\
-@code{copy_cost} also uses this target hook to find out how values are\n\
-copied.  If you want it to include some extra cost for the need to allocate\n\
-(a) scratch register(s), set @code{sri->extra_cost} to the additional cost.\n\
-Or if two dependent moves are supposed to have a lower cost than the sum\n\
-of the individual moves due to expected fortuitous scheduling and/or special\n\
-forwarding logic, you can set @code{sri->extra_cost} to a negative amount.",
- reg_class_t,
- (bool in_p, rtx x, reg_class_t reload_class, enum machine_mode reload_mode,
-  secondary_reload_info *sri),
- default_secondary_reload)
-
-/* Given an rtx X being reloaded into a reg required to be in class CLASS,
-   return the class of reg to actually use.  */
-DEFHOOK
-(preferred_reload_class,
- "A target hook that places additional restrictions on the register class\n\
-to use when it is necessary to copy value @var{x} into a register in class\n\
-@var{rclass}.  The value is a register class; perhaps @var{rclass}, or perhaps\n\
-another, smaller class.\n\
-\n\
-The default version of this hook always returns value of @code{rclass} argument.\n\
-\n\
-Sometimes returning a more restrictive class makes better code.  For\n\
-example, on the 68000, when @var{x} is an integer constant that is in range\n\
-for a @samp{moveq} instruction, the value of this macro is always\n\
-@code{DATA_REGS} as long as @var{rclass} includes the data registers.\n\
-Requiring a data register guarantees that a @samp{moveq} will be used.\n\
-\n\
-One case where @code{TARGET_PREFERRED_RELOAD_CLASS} must not return\n\
-@var{rclass} is if @var{x} is a legitimate constant which cannot be\n\
-loaded into some register class.  By returning @code{NO_REGS} you can\n\
-force @var{x} into a memory location.  For example, rs6000 can load\n\
-immediate values into general-purpose registers, but does not have an\n\
-instruction for loading an immediate value into a floating-point\n\
-register, so @code{TARGET_PREFERRED_RELOAD_CLASS} returns @code{NO_REGS} when\n\
-@var{x} is a floating-point constant.  If the constant can't be loaded\n\
-into any kind of register, code generation will be better if\n\
-@code{TARGET_LEGITIMATE_CONSTANT_P} makes the constant illegitimate instead\n\
-of using @code{TARGET_PREFERRED_RELOAD_CLASS}.\n\
-\n\
-If an insn has pseudos in it after register allocation, reload will go\n\
-through the alternatives and call repeatedly @code{TARGET_PREFERRED_RELOAD_CLASS}\n\
-to find the best one.  Returning @code{NO_REGS}, in this case, makes\n\
-reload add a @code{!} in front of the constraint: the x86 back-end uses\n\
-this feature to discourage usage of 387 registers when math is done in\n\
-the SSE registers (and vice versa).",
- reg_class_t,
- (rtx x, reg_class_t rclass),
- default_preferred_reload_class)
-
-/* Like TARGET_PREFERRED_RELOAD_CLASS, but for output reloads instead of
-   input reloads.  */
-DEFHOOK
-(preferred_output_reload_class,
- "Like @code{TARGET_PREFERRED_RELOAD_CLASS}, but for output reloads instead of\n\
-input reloads.\n\
-\n\
-The default version of this hook always returns value of @code{rclass}\n\
-argument.\n\
-\n\
-You can also use @code{TARGET_PREFERRED_OUTPUT_RELOAD_CLASS} to discourage\n\
-reload from using some alternatives, like @code{TARGET_PREFERRED_RELOAD_CLASS}.",
- reg_class_t,
- (rtx x, reg_class_t rclass),
- default_preferred_output_reload_class)
-
-DEFHOOK
-(class_likely_spilled_p,
- "A target hook which returns @code{true} if pseudos that have been assigned\n\
-to registers of class @var{rclass} would likely be spilled because\n\
-registers of @var{rclass} are needed for spill registers.\n\
-\n\
-The default version of this target hook returns @code{true} if @var{rclass}\n\
-has exactly one register and @code{false} otherwise.  On most machines, this\n\
-default should be used.  For generally register-starved machines, such as\n\
-i386, or machines with right register constraints, such as SH, this hook\n\
-can be used to avoid excessive spilling.\n\
-\n\
-This hook is also used by some of the global intra-procedural code\n\
-transformations to throtle code motion, to avoid increasing register\n\
-pressure.",
- bool, (reg_class_t rclass),
- default_class_likely_spilled_p)
-
-/* Return the maximum number of consecutive registers
-   needed to represent mode MODE in a register of class RCLASS.  */
-DEFHOOK
-(class_max_nregs,
- "A target hook returns the maximum number of consecutive registers\n\
-of class @var{rclass} needed to hold a value of mode @var{mode}.\n\
-\n\
-This is closely related to the macro @code{HARD_REGNO_NREGS}.  In fact,\n\
-the value returned by @code{TARGET_CLASS_MAX_NREGS (@var{rclass},\n\
-@var{mode})} target hook should be the maximum value of\n\
-@code{HARD_REGNO_NREGS (@var{regno}, @var{mode})} for all @var{regno}\n\
-values in the class @var{rclass}.\n\
-\n\
-This target hook helps control the handling of multiple-word values\n\
-in the reload pass.\n\
-\n\
-The default version of this target hook returns the size of @var{mode}\n\
-in words.",
- unsigned char, (reg_class_t rclass, enum machine_mode mode),
- default_class_max_nregs)
-
-DEFHOOK
-(preferred_rename_class,
- "A target hook that places additional preference on the register\
- class to use when it is necessary to rename a register in class\
- @var{rclass} to another class, or perhaps @var{NO_REGS}, if no\
- preferred register class is found or hook @code{preferred_rename_class}\
- is not implemented.\
- Sometimes returning a more restrictive class makes better code.  For\
- example, on ARM, thumb-2 instructions using @code{LO_REGS} may be\
- smaller than instructions using @code{GENERIC_REGS}.  By returning\
- @code{LO_REGS} from @code{preferred_rename_class}, code size can\
- be reduced.",
- reg_class_t, (reg_class_t rclass),
- default_preferred_rename_class)
-
-/* This target hook allows the backend to perform additional
-   processing while initializing for variable expansion.  */
-DEFHOOK
-(expand_to_rtl_hook,
- "This hook is called just before expansion into rtl, allowing the target\n\
-to perform additional initializations or analysis before the expansion.\n\
-For example, the rs6000 port uses it to allocate a scratch stack slot\n\
-for use in copying SDmode values between memory and floating point\n\
-registers whenever the function being expanded has any SDmode\n\
-usage.",
- void, (void),
- hook_void_void)
-
-/* This target hook allows the backend to perform additional
-   instantiations on rtx that are not actually in insns yet,
-   but will be later.  */
-DEFHOOK
-(instantiate_decls,
- "This hook allows the backend to perform additional instantiations on rtl\n\
-that are not actually in any insns yet, but will be later.",
- void, (void),
- hook_void_void)
-
-/* Return true if is OK to use a hard register REGNO as scratch register
-   in peephole2.  */
-DEFHOOK
-(hard_regno_scratch_ok,
- "This target hook should return @code{true} if it is OK to use a hard register\n\
-@var{regno} as scratch reg in peephole2.\n\
-\n\
-One common use of this macro is to prevent using of a register that\n\
-is not saved by a prologue in an interrupt handler.\n\
-\n\
-The default version of this hook always returns @code{true}.",
- bool, (unsigned int regno),
- default_hard_regno_scratch_ok)
-
-/* Return the smallest number of different values for which it is best to
-   use a jump-table instead of a tree of conditional branches.  */
-DEFHOOK
-(case_values_threshold,
- "This function return the smallest number of different values for which it\n\
-is best to use a jump-table instead of a tree of conditional branches.\n\
-The default is four for machines with a @code{casesi} instruction and\n\
-five otherwise.  This is best for most machines.",
- unsigned int, (void),
- default_case_values_threshold)
-
-/* Retutn true if a function must have and use a frame pointer.  */
-DEFHOOK
-(frame_pointer_required,
- "This target hook should return @code{true} if a function must have and use\n\
-a frame pointer.  This target hook is called in the reload pass.  If its return\n\
-value is @code{true} the function will have a frame pointer.\n\
-\n\
-This target hook can in principle examine the current function and decide\n\
-according to the facts, but on most machines the constant @code{false} or the\n\
-constant @code{true} suffices.  Use @code{false} when the machine allows code\n\
-to be generated with no frame pointer, and doing so saves some time or space.\n\
-Use @code{true} when there is no possible advantage to avoiding a frame\n\
-pointer.\n\
-\n\
-In certain cases, the compiler does not know how to produce valid code\n\
-without a frame pointer.  The compiler recognizes those cases and\n\
-automatically gives the function a frame pointer regardless of what\n\
-@code{TARGET_FRAME_POINTER_REQUIRED} returns.  You don't need to worry about\n\
-them.\n\
-\n\
-In a function that does not require a frame pointer, the frame pointer\n\
-register can be allocated for ordinary usage, unless you mark it as a\n\
-fixed register.  See @code{FIXED_REGISTERS} for more information.\n\
-\n\
-Default return value is @code{false}.",
- bool, (void),
- hook_bool_void_false)
-
-/* Returns true if the compiler is allowed to try to replace register number
-   from-reg with register number to-reg.  */
-DEFHOOK
-(can_eliminate,
- "This target hook should returns @code{true} if the compiler is allowed to\n\
-try to replace register number @var{from_reg} with register number\n\
-@var{to_reg}.  This target hook need only be defined if @code{ELIMINABLE_REGS}\n\
-is defined, and will usually be @code{true}, since most of the cases\n\
-preventing register elimination are things that the compiler already\n\
-knows about.\n\
-\n\
-Default return value is @code{true}.",
- bool, (const int from_reg, const int to_reg),
- hook_bool_const_int_const_int_true)
-
-/* Modify any or all of fixed_regs, call_used_regs, global_regs,
-   reg_names, and reg_class_contents to account of the vagaries of the
-   target.  */
-DEFHOOK
-(conditional_register_usage,
- "This hook may conditionally modify five variables\n\
-@code{fixed_regs}, @code{call_used_regs}, @code{global_regs},\n\
-@code{reg_names}, and @code{reg_class_contents}, to take into account\n\
-any dependence of these register sets on target flags.  The first three\n\
-of these are of type @code{char []} (interpreted as Boolean vectors).\n\
-@code{global_regs} is a @code{const char *[]}, and\n\
-@code{reg_class_contents} is a @code{HARD_REG_SET}.  Before the macro is\n\
-called, @code{fixed_regs}, @code{call_used_regs},\n\
-@code{reg_class_contents}, and @code{reg_names} have been initialized\n\
-from @code{FIXED_REGISTERS}, @code{CALL_USED_REGISTERS},\n\
-@code{REG_CLASS_CONTENTS}, and @code{REGISTER_NAMES}, respectively.\n\
-@code{global_regs} has been cleared, and any @option{-ffixed-@var{reg}},\n\
-@option{-fcall-used-@var{reg}} and @option{-fcall-saved-@var{reg}}\n\
-command options have been applied.\n\
-\n\
-@cindex disabling certain registers\n\
-@cindex controlling register usage\n\
-If the usage of an entire class of registers depends on the target\n\
-flags, you may indicate this to GCC by using this macro to modify\n\
-@code{fixed_regs} and @code{call_used_regs} to 1 for each of the\n\
-registers in the classes which should not be used by GCC@.  Also define\n\
-the macro @code{REG_CLASS_FROM_LETTER} / @code{REG_CLASS_FROM_CONSTRAINT}\n\
-to return @code{NO_REGS} if it\n\
-is called with a letter for a class that shouldn't be used.\n\
-\n\
-(However, if this class is not included in @code{GENERAL_REGS} and all\n\
-of the insn patterns whose constraints permit this class are\n\
-controlled by target switches, then GCC will automatically avoid using\n\
-these registers when the target switches are opposed to them.)",
- void, (void),
- hook_void_void)
-
-/* Functions specific to the C family of frontends.  */
-#undef HOOK_PREFIX
-#define HOOK_PREFIX "TARGET_C_"
-HOOK_VECTOR (TARGET_C, c)
-
-/* ??? Documenting this hook requires a GFDL license grant.  */
-DEFHOOK_UNDOC
-(mode_for_suffix,
-"Return machine mode for non-standard constant literal suffix @var{c},\
- or VOIDmode if non-standard suffixes are unsupported.",
- enum machine_mode, (char c),
- default_mode_for_suffix)
-
-HOOK_VECTOR_END (c)
-
-/* Functions specific to the C++ frontend.  */
-#undef HOOK_PREFIX
-#define HOOK_PREFIX "TARGET_CXX_"
-HOOK_VECTOR (TARGET_CXX, cxx)
-
-/* Return the integer type used for guard variables.  */
-DEFHOOK
-(guard_type,
- "Define this hook to override the integer type used for guard variables.\n\
-These are used to implement one-time construction of static objects.  The\n\
-default is long_long_integer_type_node.",
- tree, (void),
- default_cxx_guard_type)
-
-/* Return true if only the low bit of the guard should be tested.  */
-DEFHOOK
-(guard_mask_bit,
- "This hook determines how guard variables are used.  It should return\n\
-@code{false} (the default) if the first byte should be used.  A return value of\n\
-@code{true} indicates that only the least significant bit should be used.",
- bool, (void),
- hook_bool_void_false)
-
-/* Returns the size of the array cookie for an array of type.  */
-DEFHOOK
-(get_cookie_size,
- "This hook returns the size of the cookie to use when allocating an array\n\
-whose elements have the indicated @var{type}.  Assumes that it is already\n\
-known that a cookie is needed.  The default is\n\
-@code{max(sizeof (size_t), alignof(type))}, as defined in section 2.7 of the\n\
-IA64/Generic C++ ABI@.",
- tree, (tree type),
- default_cxx_get_cookie_size)
-
-/* Returns true if the element size should be stored in the array cookie.  */
-DEFHOOK
-(cookie_has_size,
- "This hook should return @code{true} if the element size should be stored in\n\
-array cookies.  The default is to return @code{false}.",
- bool, (void),
- hook_bool_void_false)
-
-/* Allows backends to perform additional processing when
-   deciding if a class should be exported or imported.  */
-DEFHOOK
-(import_export_class,
- "If defined by a backend this hook allows the decision made to export\n\
-class @var{type} to be overruled.  Upon entry @var{import_export}\n\
-will contain 1 if the class is going to be exported, @minus{}1 if it is going\n\
-to be imported and 0 otherwise.  This function should return the\n\
-modified value and perform any other actions necessary to support the\n\
-backend's targeted operating system.",
- int, (tree type, int import_export), NULL)
-
-/* Returns true if constructors and destructors return "this".  */
-DEFHOOK
-(cdtor_returns_this,
- "This hook should return @code{true} if constructors and destructors return\n\
-the address of the object created/destroyed.  The default is to return\n\
-@code{false}.",
- bool, (void),
- hook_bool_void_false)
-
-/* Returns true if the key method for a class can be an inline
-   function, so long as it is not declared inline in the class
-   itself.  Returning true is the behavior required by the Itanium C++ ABI.  */
-DEFHOOK
-(key_method_may_be_inline,
- "This hook returns true if the key method for a class (i.e., the method\n\
-which, if defined in the current translation unit, causes the virtual\n\
-table to be emitted) may be an inline function.  Under the standard\n\
-Itanium C++ ABI the key method may be an inline function so long as\n\
-the function is not declared inline in the class definition.  Under\n\
-some variants of the ABI, an inline function can never be the key\n\
-method.  The default is to return @code{true}.",
- bool, (void),
- hook_bool_void_true)
-
-DEFHOOK
-(determine_class_data_visibility,
-"@var{decl} is a virtual table, virtual table table, typeinfo object,\
- or other similar implicit class data object that will be emitted with\
- external linkage in this translation unit.  No ELF visibility has been\
- explicitly specified.  If the target needs to specify a visibility\
- other than that of the containing class, use this hook to set\
- @code{DECL_VISIBILITY} and @code{DECL_VISIBILITY_SPECIFIED}.",
- void, (tree decl),
- hook_void_tree)
-
-/* Returns true (the default) if virtual tables and other
-   similar implicit class data objects are always COMDAT if they
-   have external linkage.  If this hook returns false, then
-   class data for classes whose virtual table will be emitted in
-   only one translation unit will not be COMDAT.  */
-DEFHOOK
-(class_data_always_comdat,
- "This hook returns true (the default) if virtual tables and other\n\
-similar implicit class data objects are always COMDAT if they have\n\
-external linkage.  If this hook returns false, then class data for\n\
-classes whose virtual table will be emitted in only one translation\n\
-unit will not be COMDAT.",
- bool, (void),
- hook_bool_void_true)
-
-/* Returns true (the default) if the RTTI for the basic types,
-   which is always defined in the C++ runtime, should be COMDAT;
-   false if it should not be COMDAT.  */
-DEFHOOK
-(library_rtti_comdat,
- "This hook returns true (the default) if the RTTI information for\n\
-the basic types which is defined in the C++ runtime should always\n\
-be COMDAT, false if it should not be COMDAT.",
- bool, (void),
- hook_bool_void_true)
-
-/* Returns true if __aeabi_atexit should be used to register static
-   destructors.  */
-DEFHOOK
-(use_aeabi_atexit,
- "This hook returns true if @code{__aeabi_atexit} (as defined by the ARM EABI)\n\
-should be used to register static destructors when @option{-fuse-cxa-atexit}\n\
-is in effect.  The default is to return false to use @code{__cxa_atexit}.",
- bool, (void),
- hook_bool_void_false)
-
-/* Returns true if target may use atexit in the same manner as
-   __cxa_atexit  to register static destructors.  */
-DEFHOOK
-(use_atexit_for_cxa_atexit,
- "This hook returns true if the target @code{atexit} function can be used\n\
-in the same manner as @code{__cxa_atexit} to register C++ static\n\
-destructors. This requires that @code{atexit}-registered functions in\n\
-shared libraries are run in the correct order when the libraries are\n\
-unloaded. The default is to return false.",
- bool, (void),
- hook_bool_void_false)
-
-DEFHOOK
-(adjust_class_at_definition,
-"@var{type} is a C++ class (i.e., RECORD_TYPE or UNION_TYPE) that has just\
- been defined.  Use this hook to make adjustments to the class (eg, tweak\
- visibility or perform any other required target modifications).",
- void, (tree type),
- hook_void_tree)
-
-DEFHOOK
-(decl_mangling_context,
- "Return target-specific mangling context of @var{decl} or @code{NULL_TREE}.",
- tree, (const_tree decl),
- hook_tree_const_tree_null)
-
-HOOK_VECTOR_END (cxx)
-
-/* Functions and data for emulated TLS support.  */
-#undef HOOK_PREFIX
-#define HOOK_PREFIX "TARGET_EMUTLS_"
-HOOK_VECTOR (TARGET_EMUTLS, emutls)
-
-/* Name of the address and common functions.  */
-DEFHOOKPOD
-(get_address,
- "Contains the name of the helper function that uses a TLS control\n\
-object to locate a TLS instance.  The default causes libgcc's\n\
-emulated TLS helper function to be used.",
- const char *, "__builtin___emutls_get_address")
-
-DEFHOOKPOD
-(register_common,
- "Contains the name of the helper function that should be used at\n\
-program startup to register TLS objects that are implicitly\n\
-initialized to zero.  If this is @code{NULL}, all TLS objects will\n\
-have explicit initializers.  The default causes libgcc's emulated TLS\n\
-registration function to be used.",
- const char *, "__builtin___emutls_register_common")
-
-/* Prefixes for proxy variable and template.  */
-DEFHOOKPOD
-(var_section,
- "Contains the name of the section in which TLS control variables should\n\
-be placed.  The default of @code{NULL} allows these to be placed in\n\
-any section.",
- const char *, NULL)
-
-DEFHOOKPOD
-(tmpl_section,
- "Contains the name of the section in which TLS initializers should be\n\
-placed.  The default of @code{NULL} allows these to be placed in any\n\
-section.",
- const char *, NULL)
-
-/* Prefixes for proxy variable and template.  */
-DEFHOOKPOD
-(var_prefix,
- "Contains the prefix to be prepended to TLS control variable names.\n\
-The default of @code{NULL} uses a target-specific prefix.",
- const char *, NULL)
-
-DEFHOOKPOD
-(tmpl_prefix,
- "Contains the prefix to be prepended to TLS initializer objects.  The\n\
-default of @code{NULL} uses a target-specific prefix.",
- const char *, NULL)
-
-/* Function to generate field definitions of the proxy variable.  */
-DEFHOOK
-(var_fields,
- "Specifies a function that generates the FIELD_DECLs for a TLS control\n\
-object type.  @var{type} is the RECORD_TYPE the fields are for and\n\
-@var{name} should be filled with the structure tag, if the default of\n\
-@code{__emutls_object} is unsuitable.  The default creates a type suitable\n\
-for libgcc's emulated TLS function.",
- tree, (tree type, tree *name),
- default_emutls_var_fields)
-
-/* Function to initialize a proxy variable.  */
-DEFHOOK
-(var_init,
- "Specifies a function that generates the CONSTRUCTOR to initialize a\n\
-TLS control object.  @var{var} is the TLS control object, @var{decl}\n\
-is the TLS object and @var{tmpl_addr} is the address of the\n\
-initializer.  The default initializes libgcc's emulated TLS control object.",
- tree, (tree var, tree decl, tree tmpl_addr),
- default_emutls_var_init)
-
-/* Whether we are allowed to alter the usual alignment of the
-   proxy variable.  */
-DEFHOOKPOD
-(var_align_fixed,
- "Specifies whether the alignment of TLS control variable objects is\n\
-fixed and should not be increased as some backends may do to optimize\n\
-single objects.  The default is false.",
- bool, false)
-
-/* Whether we can emit debug information for TLS vars.  */
-DEFHOOKPOD
-(debug_form_tls_address,
- "Specifies whether a DWARF @code{DW_OP_form_tls_address} location descriptor\n\
-may be used to describe emulated TLS control objects.",
- bool, false)
-
-HOOK_VECTOR_END (emutls)
-
-#undef HOOK_PREFIX
-#define HOOK_PREFIX "TARGET_OPTION_"
-HOOK_VECTOR (TARGET_OPTION_HOOKS, target_option_hooks)
-
-/* Function to validate the attribute((target(...))) strings.  If
-   the option is validated, the hook should also fill in
-   DECL_FUNCTION_SPECIFIC_TARGET in the function decl node.  */
-DEFHOOK
-(valid_attribute_p,
- "This hook is called to parse @code{attribute(target(\"...\"))}, which\n\
-allows setting target-specific options on individual functions.\n\
-These function-specific options may differ\n\
-from the options specified on the command line.  The hook should return\n\
-@code{true} if the options are valid.\n\
-\n\
-The hook should set the @code{DECL_FUNCTION_SPECIFIC_TARGET} field in\n\
-the function declaration to hold a pointer to a target-specific\n\
-@code{struct cl_target_option} structure.",
- bool, (tree fndecl, tree name, tree args, int flags),
- default_target_option_valid_attribute_p)
-
-/* Function to save any extra target state in the target options structure.  */
-DEFHOOK
-(save,
- "This hook is called to save any additional target-specific information\n\
-in the @code{struct cl_target_option} structure for function-specific\n\
-options from the @code{struct gcc_options} structure.\n\
-@xref{Option file format}.",
- void, (struct cl_target_option *ptr, struct gcc_options *opts), NULL)
-
-/* Function to restore any extra target state from the target options
-   structure.  */
-DEFHOOK
-(restore,
- "This hook is called to restore any additional target-specific\n\
-information in the @code{struct cl_target_option} structure for\n\
-function-specific options to the @code{struct gcc_options} structure.",
- void, (struct gcc_options *opts, struct cl_target_option *ptr), NULL)
-
-/* Function to print any extra target state from the target options
-   structure.  */
-DEFHOOK
-(print,
- "This hook is called to print any additional target-specific\n\
-information in the @code{struct cl_target_option} structure for\n\
-function-specific options.",
- void, (FILE *file, int indent, struct cl_target_option *ptr), NULL)
-
-/* Function to parse arguments to be validated for #pragma target, and to
-   change the state if the options are valid.  If the first argument is
-   NULL, the second argument specifies the default options to use.  Return
-   true if the options are valid, and set the current state.  */
-DEFHOOK
-(pragma_parse,
- "This target hook parses the options for @code{#pragma GCC target}, which\n\
-sets the target-specific options for functions that occur later in the\n\
-input stream.  The options accepted should be the same as those handled by the\n\
-@code{TARGET_OPTION_VALID_ATTRIBUTE_P} hook.",
- bool, (tree args, tree pop_target),
- default_target_option_pragma_parse)
-
-/* Do option overrides for the target.  */
-DEFHOOK
-(override,
- "Sometimes certain combinations of command options do not make sense on\n\
-a particular target machine.  You can override the hook\n\
-@code{TARGET_OPTION_OVERRIDE} to take account of this.  This hooks is called\n\
-once just after all the command options have been parsed.\n\
-\n\
-Don't use this hook to turn on various extra optimizations for\n\
-@option{-O}.  That is what @code{TARGET_OPTION_OPTIMIZATION} is for.\n\
-\n\
-If you need to do something whenever the optimization level is\n\
-changed via the optimize attribute or pragma, see\n\
-@code{TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE}",
- void, (void),
- hook_void_void)
-
-/* This function returns true if DECL1 and DECL2 are versions of the same
-   function.  DECL1 and DECL2 are function versions if and only if they
-   have the same function signature and different target specific attributes,
-   that is, they are compiled for different target machines.  */
-DEFHOOK
-(function_versions,
- "This target hook returns @code{true} if @var{DECL1} and @var{DECL2} are\n\
-versions of the same function.  @var{DECL1} and @var{DECL2} are function\n\
-versions if and only if they have the same function signature and\n\
-different target specific attributes, that is, they are compiled for\n\
-different target machines.",
- bool, (tree decl1, tree decl2),
- hook_bool_tree_tree_false)
-
-/* Function to determine if one function can inline another function.  */
-#undef HOOK_PREFIX
-#define HOOK_PREFIX "TARGET_"
-DEFHOOK
-(can_inline_p,
- "This target hook returns @code{false} if the @var{caller} function\n\
-cannot inline @var{callee}, based on target specific information.  By\n\
-default, inlining is not allowed if the callee function has function\n\
-specific target options and the caller does not use the same options.",
- bool, (tree caller, tree callee),
- default_target_can_inline_p)
-
-HOOK_VECTOR_END (target_option)
-
-/* For targets that need to mark extra registers as live on entry to
-   the function, they should define this target hook and set their
-   bits in the bitmap passed in. */
-DEFHOOK
-(extra_live_on_entry,
- "Add any hard registers to @var{regs} that are live on entry to the\n\
-function.  This hook only needs to be defined to provide registers that\n\
-cannot be found by examination of FUNCTION_ARG_REGNO_P, the callee saved\n\
-registers, STATIC_CHAIN_INCOMING_REGNUM, STATIC_CHAIN_REGNUM,\n\
-TARGET_STRUCT_VALUE_RTX, FRAME_POINTER_REGNUM, EH_USES,\n\
-FRAME_POINTER_REGNUM, ARG_POINTER_REGNUM, and the PIC_OFFSET_TABLE_REGNUM.",
- void, (bitmap regs),
- hook_void_bitmap)
-
-/* Fill in additional registers set up by prologue into a regset.  */
-DEFHOOK
-(set_up_by_prologue,
- "This hook should add additional registers that are computed by the prologue\
- to the hard regset for shrink-wrapping optimization purposes.",
- void, (struct hard_reg_set_container *),
- NULL)
-
-/* For targets that have attributes that can affect whether a
-   function's return statements need checking.  For instance a 'naked'
-   function attribute.  */
-DEFHOOK
-(warn_func_return,
- "True if a function's return statements should be checked for matching the function's return type.  This includes checking for falling off the end of a non-void function.  Return false if no such check should be made.",
- bool, (tree),
- hook_bool_tree_true)
-
-/* Determine the type of unwind info to emit for debugging.  */
-DEFHOOK
-(debug_unwind_info,
- "This hook defines the mechanism that will be used for describing frame\n\
-unwind information to the debugger.  Normally the hook will return\n\
-@code{UI_DWARF2} if DWARF 2 debug information is enabled, and\n\
-return @code{UI_NONE} otherwise.\n\
-\n\
-A target may return @code{UI_DWARF2} even when DWARF 2 debug information\n\
-is disabled in order to always output DWARF 2 frame information.\n\
-\n\
-A target may return @code{UI_TARGET} if it has ABI specified unwind tables.\n\
-This will suppress generation of the normal debug frame unwind information.",
- enum unwind_info_type, (void),
- default_debug_unwind_info)
-
-/* The code parameter should be of type enum rtx_code but this is not
-   defined at this time.  */
-DEFHOOK
-(canonicalize_comparison,
- "On some machines not all possible comparisons are defined, but you can\n\
-convert an invalid comparison into a valid one.  For example, the Alpha\n\
-does not have a @code{GT} comparison, but you can use an @code{LT}\n\
-comparison instead and swap the order of the operands.\n\
-\n\
-On such machines, implement this hook to do any required conversions.\n\
-@var{code} is the initial comparison code and @var{op0} and @var{op1}\n\
-are the left and right operands of the comparison, respectively.  If\n\
-@var{op0_preserve_value} is @code{true} the implementation is not\n\
-allowed to change the value of @var{op0} since the value might be used\n\
-in RTXs which aren't comparisons.  E.g. the implementation is not\n\
-allowed to swap operands in that case.\n\
-\n\
-GCC will not assume that the comparison resulting from this macro is\n\
-valid but will see if the resulting insn matches a pattern in the\n\
-@file{md} file.\n\
-\n\
-You need not to implement this hook if it would never change the\n\
-comparison code or operands.",
- void, (int *code, rtx *op0, rtx *op1, bool op0_preserve_value),
- default_canonicalize_comparison)
-
-DEFHOOKPOD
-(atomic_test_and_set_trueval,
- "This value should be set if the result written by\
- @code{atomic_test_and_set} is not exactly 1, i.e. the\
- @code{bool} @code{true}.",
- unsigned char, 1)
-
-/* Return an unsigned int representing the alignment (in bits) of the atomic
-   type which maps to machine MODE.  This allows alignment to be overridden
-   as needed.  */
-DEFHOOK
-(atomic_align_for_mode,
-"If defined, this function returns an appropriate alignment in bits for an\
- atomic object of machine_mode @var{mode}.  If 0 is returned then the\
- default alignment for the specified mode is used. ",
- unsigned int, (enum machine_mode mode),
- hook_uint_mode_0)
-
-DEFHOOK
-(atomic_assign_expand_fenv,
-"ISO C11 requires atomic compound assignments that may raise floating-point\
- exceptions to raise exceptions corresponding to the arithmetic operation\
- whose result was successfully stored in a compare-and-exchange sequence. \
- This requires code equivalent to calls to @code{feholdexcept},\
- @code{feclearexcept} and @code{feupdateenv} to be generated at\
- appropriate points in the compare-and-exchange sequence.  This hook should\
- set @code{*@var{hold}} to an expression equivalent to the call to\
- @code{feholdexcept}, @code{*@var{clear}} to an expression equivalent to\
- the call to @code{feclearexcept} and @code{*@var{update}} to an expression\
- equivalent to the call to @code{feupdateenv}.  The three expressions are\
- @code{NULL_TREE} on entry to the hook and may be left as @code{NULL_TREE}\
- if no code is required in a particular place.  The default implementation\
- leaves all three expressions as @code{NULL_TREE}.  The\
- @code{__atomic_feraiseexcept} function from @code{libatomic} may be of use\
- as part of the code generated in @code{*@var{update}}.",
- void, (tree *hold, tree *clear, tree *update),
- default_atomic_assign_expand_fenv)
-
-/* Leave the boolean fields at the end.  */
-
-/* True if we can create zeroed data by switching to a BSS section
-   and then using ASM_OUTPUT_SKIP to allocate the space.  */
-DEFHOOKPOD
-(have_switchable_bss_sections,
- "This flag is true if we can create zeroed data by switching to a BSS\n\
-section and then using @code{ASM_OUTPUT_SKIP} to allocate the space.\n\
-This is true on most ELF targets.",
- bool, false)
-
-/* True if "native" constructors and destructors are supported,
-   false if we're using collect2 for the job.  */
-DEFHOOKPOD
-(have_ctors_dtors,
- "This value is true if the target supports some ``native'' method of\n\
-collecting constructors and destructors to be run at startup and exit.\n\
-It is false if we must use @command{collect2}.",
- bool, false)
-
-/* True if thread-local storage is supported.  */
-DEFHOOKPOD
-(have_tls,
- "Contains the value true if the target supports thread-local storage.\n\
-The default value is false.",
- bool, false)
-
-/* True if a small readonly data section is supported.  */
-DEFHOOKPOD
-(have_srodata_section,
- "Contains the value true if the target places read-only\n\
-``small data'' into a separate section.  The default value is false.",
- bool, false)
-
-/* True if EH frame info sections should be zero-terminated.  */
-DEFHOOKPOD
-(terminate_dw2_eh_frame_info,
- "Contains the value true if the target should add a zero word onto the\n\
-end of a Dwarf-2 frame info section when used for exception handling.\n\
-Default value is false if @code{EH_FRAME_SECTION_NAME} is defined, and\n\
-true otherwise.",
- bool, true)
-
-/* True if #NO_APP should be emitted at the beginning of assembly output.  */
-DEFHOOKPOD
-(asm_file_start_app_off,
- "If this flag is true, the text of the macro @code{ASM_APP_OFF} will be\n\
-printed as the very first line in the assembly file, unless\n\
-@option{-fverbose-asm} is in effect.  (If that macro has been defined\n\
-to the empty string, this variable has no effect.)  With the normal\n\
-definition of @code{ASM_APP_OFF}, the effect is to notify the GNU\n\
-assembler that it need not bother stripping comments or extra\n\
-whitespace from its input.  This allows it to work a bit faster.\n\
-\n\
-The default is false.  You should not set it to true unless you have\n\
-verified that your port does not generate any extra whitespace or\n\
-comments that will cause GAS to issue errors in NO_APP mode.",
- bool, false)
-
-/* True if output_file_directive should be called for main_input_filename
-   at the beginning of assembly output.  */
-DEFHOOKPOD
-(asm_file_start_file_directive,
- "If this flag is true, @code{output_file_directive} will be called\n\
-for the primary source file, immediately after printing\n\
-@code{ASM_APP_OFF} (if that is enabled).  Most ELF assemblers expect\n\
-this to be done.  The default is false.",
- bool, false)
-
-/* True if the target is allowed to reorder memory accesses unless
-   synchronization is explicitly requested.  */
-DEFHOOKPOD
-(relaxed_ordering,
- "If set to @code{true}, means that the target's memory model does not\n\
-guarantee that loads which do not depend on one another will access\n\
-main memory in the order of the instruction stream; if ordering is\n\
-important, an explicit memory barrier must be used.  This is true of\n\
-many recent processors which implement a policy of ``relaxed,''\n\
-``weak,'' or ``release'' memory consistency, such as Alpha, PowerPC,\n\
-and ia64.  The default is @code{false}.",
- bool, false)
-
-/* Returns true if we should generate exception tables for use with the
-   ARM EABI.  The effects the encoding of function exception specifications.  */
-DEFHOOKPOD
-(arm_eabi_unwinder,
- "This flag should be set to @code{true} on targets that use an ARM EABI\n\
-based unwinding library, and @code{false} on other targets.  This effects\n\
-the format of unwinding tables, and how the unwinder in entered after\n\
-running a cleanup.  The default is @code{false}.",
- bool, false)
-
-DEFHOOKPOD
-(want_debug_pub_sections,
- "True if the @code{.debug_pubtypes} and @code{.debug_pubnames} sections\
- should be emitted.  These sections are not used on most platforms, and\
- in particular GDB does not use them.",
- bool, false)
-
-DEFHOOKPOD
-(force_at_comp_dir,
- "True if the @code{DW_AT_comp_dir} attribute should be emitted for each \
- compilation unit.  This attribute is required for the darwin linker \
- to emit debug information.",
- bool, false)
-
-DEFHOOKPOD
-(delay_sched2, "True if sched2 is not to be run at its normal place.  \
-This usually means it will be run as part of machine-specific reorg.",
-bool, false)
-
-DEFHOOKPOD
-(delay_vartrack, "True if vartrack is not to be run at its normal place.  \
-This usually means it will be run as part of machine-specific reorg.",
-bool, false)
-
-/* Leave the boolean fields at the end.  */
-
-/* Close the 'struct gcc_target' definition.  */
-HOOK_VECTOR_END (C90_EMPTY_HACK)
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/target.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/target.h
deleted file mode 100644
index 7c28efa..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/target.h
+++ /dev/null
@@ -1,207 +0,0 @@
-/* Data structure definitions for a generic GCC target.
-   Copyright (C) 2001-2014 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 3, 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; see the file COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.
-
-   In other words, you are welcome to use, share and improve this program.
-   You are forbidden to forbid anyone else to use, share and improve
-   what you give them.   Help stamp out software-hoarding!  */
-
-
-/* This file contains a data structure that describes a GCC target.
-   At present it is incomplete, but in future it should grow to
-   contain most or all target machine and target O/S specific
-   information.
-
-   This structure has its initializer declared in target-def.h in the
-   form of large macro TARGET_INITIALIZER that expands to many smaller
-   macros.
-
-   The smaller macros each initialize one component of the structure,
-   and each has a default.  Each target should have a file that
-   includes target.h and target-def.h, and overrides any inappropriate
-   defaults by undefining the relevant macro and defining a suitable
-   replacement.  That file should then contain the definition of
-   "targetm" like so:
-
-   struct gcc_target targetm = TARGET_INITIALIZER;
-
-   Doing things this way allows us to bring together everything that
-   defines a GCC target.  By supplying a default that is appropriate
-   to most targets, we can easily add new items without needing to
-   edit dozens of target configuration files.  It should also allow us
-   to gradually reduce the amount of conditional compilation that is
-   scattered throughout GCC.  */
-
-#ifndef GCC_TARGET_H
-#define GCC_TARGET_H
-
-#include "insn-modes.h"
-#include "insn-codes.h"
-#include "double-int.h"
-
-#ifdef ENABLE_CHECKING
-
-struct cumulative_args_t { void *magic; void *p; };
-
-#else /* !ENABLE_CHECKING */
-
-/* When using a GCC build compiler, we could use
-   __attribute__((transparent_union)) to get cumulative_args_t function
-   arguments passed like scalars where the ABI would mandate a less
-   efficient way of argument passing otherwise.  However, that would come
-   at the cost of less type-safe !ENABLE_CHECKING compilation.  */
-
-union cumulative_args_t { void *p; };
-
-#endif /* !ENABLE_CHECKING */
-
-/* Types used by the record_gcc_switches() target function.  */
-enum print_switch_type
-{
-  SWITCH_TYPE_PASSED,		/* A switch passed on the command line.  */
-  SWITCH_TYPE_ENABLED,		/* An option that is currently enabled.  */
-  SWITCH_TYPE_DESCRIPTIVE,	/* Descriptive text, not a switch or option.  */
-  SWITCH_TYPE_LINE_START,	/* Please emit any necessary text at the start of a line.  */
-  SWITCH_TYPE_LINE_END		/* Please emit a line terminator.  */
-};
-
-typedef int (* print_switch_fn_type) (print_switch_type, const char *);
-
-/* An example implementation for ELF targets.  Defined in varasm.c  */
-extern int elf_record_gcc_switches (print_switch_type type, const char *);
-
-/* Some places still assume that all pointer or address modes are the
-   standard Pmode and ptr_mode.  These optimizations become invalid if
-   the target actually supports multiple different modes.  For now,
-   we disable such optimizations on such targets, using this function.  */
-extern bool target_default_pointer_address_modes_p (void);
-
-struct stdarg_info;
-struct spec_info_def;
-struct hard_reg_set_container;
-struct cgraph_node;
-struct cgraph_simd_clone;
-
-/* The struct used by the secondary_reload target hook.  */
-struct secondary_reload_info
-{
-  /* icode is actually an enum insn_code, but we don't want to force every
-     file that includes target.h to include optabs.h .  */
-  int icode;
-  int extra_cost; /* Cost for using (a) scratch register(s) to be taken
-		     into account by copy_cost.  */
-  /* The next two members are for the use of the backward
-     compatibility hook.  */
-  struct secondary_reload_info *prev_sri;
-  int t_icode; /* Actually an enum insn_code - see above.  */
-};
-
-/* This is defined in sched-int.h .  */
-struct _dep;
-
-/* This is defined in ddg.h .  */
-struct ddg;
-
-/* This is defined in cfgloop.h .  */
-struct loop;
-
-/* This is defined in tree-ssa-alias.h.  */
-struct ao_ref;
-
-/* This is defined in tree-vectorizer.h.  */
-struct _stmt_vec_info;
-
-/* These are defined in tree-vect-stmts.c.  */
-extern tree stmt_vectype (struct _stmt_vec_info *);
-extern bool stmt_in_inner_loop_p (struct _stmt_vec_info *);
-
-/* Assembler instructions for creating various kinds of integer object.  */
-
-struct asm_int_op
-{
-  const char *hi;
-  const char *si;
-  const char *di;
-  const char *ti;
-};
-
-/* Types of costs for vectorizer cost model.  */
-enum vect_cost_for_stmt
-{
-  scalar_stmt,
-  scalar_load,
-  scalar_store,
-  vector_stmt,
-  vector_load,
-  unaligned_load,
-  unaligned_store,
-  vector_store,
-  vec_to_scalar,
-  scalar_to_vec,
-  cond_branch_not_taken,
-  cond_branch_taken,
-  vec_perm,
-  vec_promote_demote,
-  vec_construct
-};
-
-/* Separate locations for which the vectorizer cost model should
-   track costs.  */
-enum vect_cost_model_location {
-  vect_prologue = 0,
-  vect_body = 1,
-  vect_epilogue = 2
-};
-
-/* The target structure.  This holds all the backend hooks.  */
-#define DEFHOOKPOD(NAME, DOC, TYPE, INIT) TYPE NAME;
-#define DEFHOOK(NAME, DOC, TYPE, PARAMS, INIT) TYPE (* NAME) PARAMS;
-#define DEFHOOK_UNDOC DEFHOOK
-#define HOOKSTRUCT(FRAGMENT) FRAGMENT
-
-#include "target.def"
-
-extern struct gcc_target targetm;
-
-#ifdef GCC_TM_H
-
-#ifndef CUMULATIVE_ARGS_MAGIC
-#define CUMULATIVE_ARGS_MAGIC ((void *) &targetm.calls)
-#endif
-
-static inline CUMULATIVE_ARGS *
-get_cumulative_args (cumulative_args_t arg)
-{
-#ifdef ENABLE_CHECKING
-  gcc_assert (arg.magic == CUMULATIVE_ARGS_MAGIC);
-#endif /* ENABLE_CHECKING */
-  return (CUMULATIVE_ARGS *) arg.p;
-}
-
-static inline cumulative_args_t
-pack_cumulative_args (CUMULATIVE_ARGS *arg)
-{
-  cumulative_args_t ret;
-
-#ifdef ENABLE_CHECKING
-  ret.magic = CUMULATIVE_ARGS_MAGIC;
-#endif /* ENABLE_CHECKING */
-  ret.p = (void *) arg;
-  return ret;
-}
-#endif /* GCC_TM_H */
-
-#endif /* GCC_TARGET_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/timevar.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/timevar.def
deleted file mode 100644
index 9faf98b..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/timevar.def
+++ /dev/null
@@ -1,277 +0,0 @@
-/* This file contains the definitions for timing variables used to
-   measure run-time performance of the compiler.
-   Copyright (C) 2000-2014 Free Software Foundation, Inc.
-   Contributed by Alex Samuel <samuel@codesourcery.com>
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
-
-   GCC 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with GCC; see the file COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This file contains timing variable definitions, used by timevar.h
-   and timevar.c.
-
-   Syntax:
-
-     DEFTIMEVAR (id, name)
-
-   where ID is the enumeral value used to identify the timing
-   variable, and NAME is a character string describing its purpose.  */
-
-/* The total execution time.  */
-DEFTIMEVAR (TV_TOTAL                 , "total time")
-/* The compiler phases.  These must be mutually exclusive.
-   Ideally, they would sum to near the total time.  */
-DEFTIMEVAR (TV_PHASE_SETUP           , "phase setup")
-DEFTIMEVAR (TV_PHASE_PARSING         , "phase parsing")
-DEFTIMEVAR (TV_PHASE_DEFERRED        , "phase lang. deferred")
-DEFTIMEVAR (TV_PHASE_OPT_GEN         , "phase opt and generate")
-DEFTIMEVAR (TV_PHASE_DBGINFO         , "phase debug info")
-DEFTIMEVAR (TV_PHASE_CHECK_DBGINFO   , "phase check & debug info")
-DEFTIMEVAR (TV_PHASE_LATE_ASM        , "phase last asm")
-DEFTIMEVAR (TV_PHASE_STREAM_IN       , "phase stream in")
-DEFTIMEVAR (TV_PHASE_STREAM_OUT      , "phase stream out")
-DEFTIMEVAR (TV_PHASE_FINALIZE        , "phase finalize")
-
-/* Concurrent timers, indicated by "|".  */
-DEFTIMEVAR (TV_NAME_LOOKUP           , "|name lookup")
-DEFTIMEVAR (TV_OVERLOAD              , "|overload resolution")
-
-/* Time spent garbage-collecting.  */
-DEFTIMEVAR (TV_GC                    , "garbage collection")
-
-/* Time spent generating dump files.  */
-DEFTIMEVAR (TV_DUMP                  , "dump files")
-
-/* Time spent saving/restoring PCH state.  */
-DEFTIMEVAR (TV_PCH_SAVE              , "PCH main state save")
-DEFTIMEVAR (TV_PCH_CPP_SAVE          , "PCH preprocessor state save")
-DEFTIMEVAR (TV_PCH_PTR_REALLOC       , "PCH pointer reallocation")
-DEFTIMEVAR (TV_PCH_PTR_SORT          , "PCH pointer sort")
-DEFTIMEVAR (TV_PCH_RESTORE           , "PCH main state restore")
-DEFTIMEVAR (TV_PCH_CPP_RESTORE       , "PCH preprocessor state restore")
-
-DEFTIMEVAR (TV_CGRAPH                , "callgraph construction")
-DEFTIMEVAR (TV_CGRAPHOPT             , "callgraph optimization")
-DEFTIMEVAR (TV_IPA_UNREACHABLE       , "ipa dead code removal")
-DEFTIMEVAR (TV_IPA_INHERITANCE       , "ipa inheritance graph")
-DEFTIMEVAR (TV_IPA_VIRTUAL_CALL      , "ipa virtual call target")
-DEFTIMEVAR (TV_IPA_DEVIRT	     , "ipa devirtualization")
-DEFTIMEVAR (TV_IPA_CONSTANT_PROP     , "ipa cp")
-DEFTIMEVAR (TV_IPA_INLINING          , "ipa inlining heuristics")
-DEFTIMEVAR (TV_IPA_FNSPLIT           , "ipa function splitting")
-DEFTIMEVAR (TV_IPA_OPT		     , "ipa various optimizations")
-DEFTIMEVAR (TV_IPA_LTO_GIMPLE_IN     , "ipa lto gimple in")
-DEFTIMEVAR (TV_IPA_LTO_GIMPLE_OUT    , "ipa lto gimple out")
-DEFTIMEVAR (TV_IPA_LTO_DECL_IN       , "ipa lto decl in")
-DEFTIMEVAR (TV_IPA_LTO_DECL_OUT      , "ipa lto decl out")
-DEFTIMEVAR (TV_IPA_LTO_DECL_INIT_IO  , "ipa lto decl init I/O")
-DEFTIMEVAR (TV_IPA_LTO_CGRAPH_IO     , "ipa lto cgraph I/O")
-DEFTIMEVAR (TV_IPA_LTO_DECL_MERGE    , "ipa lto decl merge")
-DEFTIMEVAR (TV_IPA_LTO_CGRAPH_MERGE  , "ipa lto cgraph merge")
-DEFTIMEVAR (TV_LTO                   , "lto")
-DEFTIMEVAR (TV_WHOPR_WPA             , "whopr wpa")
-DEFTIMEVAR (TV_WHOPR_WPA_IO          , "whopr wpa I/O")
-DEFTIMEVAR (TV_WHOPR_PARTITIONING    , "whopr partitioning")
-DEFTIMEVAR (TV_WHOPR_LTRANS          , "whopr ltrans")
-DEFTIMEVAR (TV_IPA_REFERENCE         , "ipa reference")
-DEFTIMEVAR (TV_IPA_PROFILE           , "ipa profile")
-DEFTIMEVAR (TV_IPA_PURE_CONST        , "ipa pure const")
-DEFTIMEVAR (TV_IPA_PTA               , "ipa points-to")
-DEFTIMEVAR (TV_IPA_SRA               , "ipa SRA")
-DEFTIMEVAR (TV_IPA_FREE_LANG_DATA    , "ipa free lang data")
-DEFTIMEVAR (TV_IPA_FREE_INLINE_SUMMARY, "ipa free inline summary")
-/* Time spent by constructing CFG.  */
-DEFTIMEVAR (TV_CFG                   , "cfg construction")
-/* Time spent by cleaning up CFG.  */
-DEFTIMEVAR (TV_CLEANUP_CFG           , "cfg cleanup")
-DEFTIMEVAR (TV_CFG_VERIFY            , "CFG verifier")
-DEFTIMEVAR (TV_DELETE_TRIVIALLY_DEAD , "trivially dead code")
-
-/* Time spent in dataflow problems.  */
-DEFTIMEVAR (TV_DF_SCAN		     , "df scan insns")
-DEFTIMEVAR (TV_DF_MD		     , "df multiple defs")
-DEFTIMEVAR (TV_DF_RD		     , "df reaching defs")
-DEFTIMEVAR (TV_DF_LR		     , "df live regs")
-DEFTIMEVAR (TV_DF_LIVE		     , "df live&initialized regs")
-DEFTIMEVAR (TV_DF_CHAIN		     , "df use-def / def-use chains")
-DEFTIMEVAR (TV_DF_WORD_LR	     , "df live reg subwords")
-DEFTIMEVAR (TV_DF_NOTE		     , "df reg dead/unused notes")
-DEFTIMEVAR (TV_REG_STATS	     , "register information")
-
-DEFTIMEVAR (TV_ALIAS_ANALYSIS	     , "alias analysis")
-DEFTIMEVAR (TV_ALIAS_STMT_WALK	     , "alias stmt walking")
-DEFTIMEVAR (TV_REG_SCAN		     , "register scan")
-DEFTIMEVAR (TV_REBUILD_JUMP	     , "rebuild jump labels")
-/* Timing in various stages of the compiler.  */
-DEFTIMEVAR (TV_CPP		     , "preprocessing")
-DEFTIMEVAR (TV_LEX		     , "lexical analysis")
-DEFTIMEVAR (TV_PARSE_GLOBAL          , "parser (global)")
-DEFTIMEVAR (TV_PARSE_STRUCT          , "parser struct body")
-DEFTIMEVAR (TV_PARSE_ENUM            , "parser enumerator list")
-DEFTIMEVAR (TV_PARSE_FUNC            , "parser function body")
-DEFTIMEVAR (TV_PARSE_INLINE          , "parser inl. func. body")
-DEFTIMEVAR (TV_PARSE_INMETH          , "parser inl. meth. body")
-DEFTIMEVAR (TV_TEMPLATE_INST         , "template instantiation")
-DEFTIMEVAR (TV_FLATTEN_INLINING      , "flatten inlining")
-DEFTIMEVAR (TV_EARLY_INLINING        , "early inlining heuristics")
-DEFTIMEVAR (TV_INLINE_PARAMETERS     , "inline parameters")
-DEFTIMEVAR (TV_INTEGRATION           , "integration")
-DEFTIMEVAR (TV_TREE_GIMPLIFY	     , "tree gimplify")
-DEFTIMEVAR (TV_TREE_EH		     , "tree eh")
-DEFTIMEVAR (TV_TREE_CFG		     , "tree CFG construction")
-DEFTIMEVAR (TV_TREE_CLEANUP_CFG	     , "tree CFG cleanup")
-DEFTIMEVAR (TV_TREE_TAIL_MERGE       , "tree tail merge")
-DEFTIMEVAR (TV_TREE_VRP              , "tree VRP")
-DEFTIMEVAR (TV_TREE_COPY_PROP        , "tree copy propagation")
-DEFTIMEVAR (TV_FIND_REFERENCED_VARS  , "tree find ref. vars")
-DEFTIMEVAR (TV_TREE_PTA		     , "tree PTA")
-DEFTIMEVAR (TV_TREE_INSERT_PHI_NODES , "tree PHI insertion")
-DEFTIMEVAR (TV_TREE_SSA_REWRITE_BLOCKS, "tree SSA rewrite")
-DEFTIMEVAR (TV_TREE_SSA_OTHER	     , "tree SSA other")
-DEFTIMEVAR (TV_TREE_SSA_INCREMENTAL  , "tree SSA incremental")
-DEFTIMEVAR (TV_TREE_OPS	             , "tree operand scan")
-DEFTIMEVAR (TV_TREE_SSA_DOMINATOR_OPTS   , "dominator optimization")
-DEFTIMEVAR (TV_TREE_SRA              , "tree SRA")
-DEFTIMEVAR (TV_ISOLATE_ERRONEOUS_PATHS    , "isolate eroneous paths")
-DEFTIMEVAR (TV_TREE_CCP		     , "tree CCP")
-DEFTIMEVAR (TV_TREE_PHI_CPROP	     , "tree PHI const/copy prop")
-DEFTIMEVAR (TV_TREE_SPLIT_EDGES      , "tree split crit edges")
-DEFTIMEVAR (TV_TREE_REASSOC          , "tree reassociation")
-DEFTIMEVAR (TV_TREE_PRE		     , "tree PRE")
-DEFTIMEVAR (TV_TREE_FRE		     , "tree FRE")
-DEFTIMEVAR (TV_TREE_SINK             , "tree code sinking")
-DEFTIMEVAR (TV_TREE_PHIOPT	     , "tree linearize phis")
-DEFTIMEVAR (TV_TREE_FORWPROP	     , "tree forward propagate")
-DEFTIMEVAR (TV_TREE_PHIPROP	     , "tree phiprop")
-DEFTIMEVAR (TV_TREE_DCE		     , "tree conservative DCE")
-DEFTIMEVAR (TV_TREE_CD_DCE	     , "tree aggressive DCE")
-DEFTIMEVAR (TV_TREE_CALL_CDCE	     , "tree buildin call DCE")
-DEFTIMEVAR (TV_TREE_DSE		     , "tree DSE")
-DEFTIMEVAR (TV_TREE_MERGE_PHI	     , "PHI merge")
-DEFTIMEVAR (TV_TREE_LOOP	     , "tree loop optimization")
-DEFTIMEVAR (TV_TREE_LOOP_BOUNDS	     , "tree loop bounds")
-DEFTIMEVAR (TV_LIM                   , "tree loop invariant motion")
-DEFTIMEVAR (TV_TREE_LOOP_IVCANON     , "tree canonical iv")
-DEFTIMEVAR (TV_SCEV_CONST            , "scev constant prop")
-DEFTIMEVAR (TV_TREE_LOOP_UNSWITCH    , "tree loop unswitching")
-DEFTIMEVAR (TV_COMPLETE_UNROLL       , "complete unrolling")
-DEFTIMEVAR (TV_TREE_PARALLELIZE_LOOPS, "tree parallelize loops")
-DEFTIMEVAR (TV_TREE_VECTORIZATION    , "tree vectorization")
-DEFTIMEVAR (TV_TREE_SLP_VECTORIZATION, "tree slp vectorization")
-DEFTIMEVAR (TV_GRAPHITE              , "Graphite")
-DEFTIMEVAR (TV_GRAPHITE_TRANSFORMS   , "Graphite loop transforms")
-DEFTIMEVAR (TV_GRAPHITE_DATA_DEPS    , "Graphite data dep analysis")
-DEFTIMEVAR (TV_GRAPHITE_CODE_GEN     , "Graphite code generation")
-DEFTIMEVAR (TV_TREE_LOOP_DISTRIBUTION, "tree loop distribution")
-DEFTIMEVAR (TV_CHECK_DATA_DEPS       , "tree check data dependences")
-DEFTIMEVAR (TV_TREE_PREFETCH	     , "tree prefetching")
-DEFTIMEVAR (TV_TREE_LOOP_IVOPTS	     , "tree iv optimization")
-DEFTIMEVAR (TV_PREDCOM		     , "predictive commoning")
-DEFTIMEVAR (TV_TREE_CH		     , "tree copy headers")
-DEFTIMEVAR (TV_TREE_SSA_UNCPROP	     , "tree SSA uncprop")
-DEFTIMEVAR (TV_TREE_NRV		     , "tree NRV optimization")
-DEFTIMEVAR (TV_TREE_COPY_RENAME	     , "tree rename SSA copies")
-DEFTIMEVAR (TV_TREE_SSA_VERIFY       , "tree SSA verifier")
-DEFTIMEVAR (TV_TREE_STMT_VERIFY      , "tree STMT verifier")
-DEFTIMEVAR (TV_TREE_SWITCH_CONVERSION, "tree switch conversion")
-DEFTIMEVAR (TV_TRANS_MEM             , "transactional memory")
-DEFTIMEVAR (TV_TREE_STRLEN           , "tree strlen optimization")
-DEFTIMEVAR (TV_CGRAPH_VERIFY         , "callgraph verifier")
-DEFTIMEVAR (TV_DOM_FRONTIERS         , "dominance frontiers")
-DEFTIMEVAR (TV_DOMINANCE             , "dominance computation")
-DEFTIMEVAR (TV_CONTROL_DEPENDENCES   , "control dependences")
-DEFTIMEVAR (TV_OUT_OF_SSA	     , "out of ssa")
-DEFTIMEVAR (TV_VAR_EXPAND	     , "expand vars")
-DEFTIMEVAR (TV_EXPAND		     , "expand")
-DEFTIMEVAR (TV_POST_EXPAND	     , "post expand cleanups")
-DEFTIMEVAR (TV_VARCONST              , "varconst")
-DEFTIMEVAR (TV_LOWER_SUBREG	     , "lower subreg")
-DEFTIMEVAR (TV_JUMP                  , "jump")
-DEFTIMEVAR (TV_FWPROP                , "forward prop")
-DEFTIMEVAR (TV_CSE                   , "CSE")
-DEFTIMEVAR (TV_DCE                   , "dead code elimination")
-DEFTIMEVAR (TV_DSE1                  , "dead store elim1")
-DEFTIMEVAR (TV_DSE2                  , "dead store elim2")
-DEFTIMEVAR (TV_LOOP                  , "loop analysis")
-DEFTIMEVAR (TV_LOOP_INIT	     , "loop init")
-DEFTIMEVAR (TV_LOOP_MOVE_INVARIANTS  , "loop invariant motion")
-DEFTIMEVAR (TV_LOOP_UNSWITCH         , "loop unswitching")
-DEFTIMEVAR (TV_LOOP_UNROLL           , "loop unrolling")
-DEFTIMEVAR (TV_LOOP_DOLOOP           , "loop doloop")
-DEFTIMEVAR (TV_LOOP_FINI	     , "loop fini")
-DEFTIMEVAR (TV_CPROP                 , "CPROP")
-DEFTIMEVAR (TV_PRE                   , "PRE")
-DEFTIMEVAR (TV_HOIST                 , "code hoisting")
-DEFTIMEVAR (TV_LSM                   , "LSM")
-DEFTIMEVAR (TV_TRACER                , "tracer")
-DEFTIMEVAR (TV_WEB                   , "web")
-DEFTIMEVAR (TV_AUTO_INC_DEC          , "auto inc dec")
-DEFTIMEVAR (TV_CSE2                  , "CSE 2")
-DEFTIMEVAR (TV_BRANCH_PROB           , "branch prediction")
-DEFTIMEVAR (TV_COMBINE               , "combiner")
-DEFTIMEVAR (TV_IFCVT		     , "if-conversion")
-DEFTIMEVAR (TV_MODE_SWITCH           , "mode switching")
-DEFTIMEVAR (TV_SMS		     , "sms modulo scheduling")
-DEFTIMEVAR (TV_LIVE_RANGE_SHRINKAGE  , "live range shrinkage")
-DEFTIMEVAR (TV_SCHED                 , "scheduling")
-DEFTIMEVAR (TV_IRA		     , "integrated RA")
-DEFTIMEVAR (TV_LRA		     , "LRA non-specific")
-DEFTIMEVAR (TV_LRA_ELIMINATE	     , "LRA virtuals elimination")
-DEFTIMEVAR (TV_LRA_INHERITANCE	     , "LRA reload inheritance")
-DEFTIMEVAR (TV_LRA_CREATE_LIVE_RANGES, "LRA create live ranges")
-DEFTIMEVAR (TV_LRA_ASSIGN	     , "LRA hard reg assignment")
-DEFTIMEVAR (TV_LRA_COALESCE	     , "LRA coalesce pseudo regs")
-DEFTIMEVAR (TV_RELOAD		     , "reload")
-DEFTIMEVAR (TV_RELOAD_CSE_REGS       , "reload CSE regs")
-DEFTIMEVAR (TV_GCSE_AFTER_RELOAD     , "load CSE after reload")
-DEFTIMEVAR (TV_REE		     , "ree")
-DEFTIMEVAR (TV_THREAD_PROLOGUE_AND_EPILOGUE, "thread pro- & epilogue")
-DEFTIMEVAR (TV_IFCVT2		     , "if-conversion 2")
-DEFTIMEVAR (TV_COMBINE_STACK_ADJUST  , "combine stack adjustments")
-DEFTIMEVAR (TV_PEEPHOLE2             , "peephole 2")
-DEFTIMEVAR (TV_RENAME_REGISTERS      , "rename registers")
-DEFTIMEVAR (TV_CPROP_REGISTERS       , "hard reg cprop")
-DEFTIMEVAR (TV_SCHED2                , "scheduling 2")
-DEFTIMEVAR (TV_MACH_DEP              , "machine dep reorg")
-DEFTIMEVAR (TV_DBR_SCHED             , "delay branch sched")
-DEFTIMEVAR (TV_REORDER_BLOCKS        , "reorder blocks")
-DEFTIMEVAR (TV_SHORTEN_BRANCH        , "shorten branches")
-DEFTIMEVAR (TV_REG_STACK             , "reg stack")
-DEFTIMEVAR (TV_FINAL                 , "final")
-DEFTIMEVAR (TV_VAROUT                , "variable output")
-DEFTIMEVAR (TV_SYMOUT                , "symout")
-DEFTIMEVAR (TV_VAR_TRACKING          , "variable tracking")
-DEFTIMEVAR (TV_VAR_TRACKING_DATAFLOW , "var-tracking dataflow")
-DEFTIMEVAR (TV_VAR_TRACKING_EMIT     , "var-tracking emit")
-DEFTIMEVAR (TV_TREE_IFCOMBINE        , "tree if-combine")
-DEFTIMEVAR (TV_TREE_UNINIT           , "uninit var analysis")
-DEFTIMEVAR (TV_PLUGIN_INIT           , "plugin initialization")
-DEFTIMEVAR (TV_PLUGIN_RUN            , "plugin execution")
-DEFTIMEVAR (TV_GIMPLE_SLSR           , "straight-line strength reduction")
-DEFTIMEVAR (TV_VTABLE_VERIFICATION   , "vtable verification")
-DEFTIMEVAR (TV_TREE_UBSAN            , "tree ubsan")
-
-/* Everything else in rest_of_compilation not included above.  */
-DEFTIMEVAR (TV_EARLY_LOCAL	     , "early local passes")
-DEFTIMEVAR (TV_OPTIMIZE		     , "unaccounted optimizations")
-DEFTIMEVAR (TV_REST_OF_COMPILATION   , "rest of compilation")
-DEFTIMEVAR (TV_POSTRELOAD	     , "unaccounted post reload")
-DEFTIMEVAR (TV_REMOVE_UNUSED	     , "remove unused locals")
-DEFTIMEVAR (TV_ADDRESS_TAKEN	     , "address taken")
-DEFTIMEVAR (TV_TODO		     , "unaccounted todo")
-DEFTIMEVAR (TV_VERIFY_LOOP_CLOSED    , "verify loop closed")
-DEFTIMEVAR (TV_VERIFY_RTL_SHARING    , "verify RTL sharing")
-DEFTIMEVAR (TV_REBUILD_FREQUENCIES   , "rebuild frequencies")
-DEFTIMEVAR (TV_REPAIR_LOOPS	     , "repair loop structures")
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/timevar.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/timevar.h
deleted file mode 100644
index 6703cc9..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/timevar.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/* Timing variables for measuring compiler performance.
-   Copyright (C) 2000-2014 Free Software Foundation, Inc.
-   Contributed by Alex Samuel <samuel@codesourcery.com>
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
-
-   GCC 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 General Public
-   License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with GCC; see the file COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TIMEVAR_H
-#define GCC_TIMEVAR_H
-
-/* Timing variables are used to measure elapsed time in various
-   portions of the compiler.  Each measures elapsed user, system, and
-   wall-clock time, as appropriate to and supported by the host
-   system.
-
-   Timing variables are defined using the DEFTIMEVAR macro in
-   timevar.def.  Each has an enumeral identifier, used when referring
-   to the timing variable in code, and a character string name.
-
-   Timing variables can be used in two ways:
-
-     - On the timing stack, using timevar_push and timevar_pop.
-       Timing variables may be pushed onto the stack; elapsed time is
-       attributed to the topmost timing variable on the stack.  When
-       another variable is pushed on, the previous topmost variable is
-       `paused' until the pushed variable is popped back off.
-
-     - As a standalone timer, using timevar_start and timevar_stop.
-       All time elapsed between the two calls is attributed to the
-       variable.
-*/
-
-/* This structure stores the various varieties of time that can be
-   measured.  Times are stored in seconds.  The time may be an
-   absolute time or a time difference; in the former case, the time
-   base is undefined, except that the difference between two times
-   produces a valid time difference.  */
-
-struct timevar_time_def
-{
-  /* User time in this process.  */
-  double user;
-
-  /* System time (if applicable for this host platform) in this
-     process.  */
-  double sys;
-
-  /* Wall clock time.  */
-  double wall;
-
-  /* Garbage collector memory.  */
-  size_t ggc_mem;
-};
-
-/* An enumeration of timing variable identifiers.  Constructed from
-   the contents of timevar.def.  */
-
-#define DEFTIMEVAR(identifier__, name__) \
-    identifier__,
-typedef enum
-{
-  TV_NONE,
-#include "timevar.def"
-  TIMEVAR_LAST
-}
-timevar_id_t;
-#undef DEFTIMEVAR
-
-/* True if timevars should be used.  In GCC, this happens with
-   the -ftime-report flag.  */
-extern bool timevar_enable;
-
-/* Total amount of memory allocated by garbage collector.  */
-extern size_t timevar_ggc_mem_total;
-
-extern void timevar_init (void);
-extern void timevar_push_1 (timevar_id_t);
-extern void timevar_pop_1 (timevar_id_t);
-extern void timevar_start (timevar_id_t);
-extern void timevar_stop (timevar_id_t);
-extern bool timevar_cond_start (timevar_id_t);
-extern void timevar_cond_stop (timevar_id_t, bool);
-extern void timevar_print (FILE *);
-
-/* Provided for backward compatibility.  */
-static inline void
-timevar_push (timevar_id_t tv)
-{
-  if (timevar_enable)
-    timevar_push_1 (tv);
-}
-
-static inline void
-timevar_pop (timevar_id_t tv)
-{
-  if (timevar_enable)
-    timevar_pop_1 (tv);
-}
-
-extern void print_time (const char *, long);
-
-#endif /* ! GCC_TIMEVAR_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tm-preds.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tm-preds.h
deleted file mode 100644
index 458045f..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tm-preds.h
+++ /dev/null
@@ -1,234 +0,0 @@
-/* Generated automatically by the program 'build/genpreds'
-   from the machine description file '../../gcc/config/arm/arm.md'.  */
-
-#ifndef GCC_TM_PREDS_H
-#define GCC_TM_PREDS_H
-
-#ifdef HAVE_MACHINE_MODES
-extern int general_operand (rtx, enum machine_mode);
-extern int address_operand (rtx, enum machine_mode);
-extern int register_operand (rtx, enum machine_mode);
-extern int pmode_register_operand (rtx, enum machine_mode);
-extern int scratch_operand (rtx, enum machine_mode);
-extern int immediate_operand (rtx, enum machine_mode);
-extern int const_int_operand (rtx, enum machine_mode);
-extern int const_double_operand (rtx, enum machine_mode);
-extern int nonimmediate_operand (rtx, enum machine_mode);
-extern int nonmemory_operand (rtx, enum machine_mode);
-extern int push_operand (rtx, enum machine_mode);
-extern int pop_operand (rtx, enum machine_mode);
-extern int memory_operand (rtx, enum machine_mode);
-extern int indirect_operand (rtx, enum machine_mode);
-extern int ordered_comparison_operator (rtx, enum machine_mode);
-extern int comparison_operator (rtx, enum machine_mode);
-extern int s_register_operand (rtx, enum machine_mode);
-extern int imm_for_neon_inv_logic_operand (rtx, enum machine_mode);
-extern int neon_inv_logic_op2 (rtx, enum machine_mode);
-extern int imm_for_neon_logic_operand (rtx, enum machine_mode);
-extern int neon_logic_op2 (rtx, enum machine_mode);
-extern int arm_hard_general_register_operand (rtx, enum machine_mode);
-extern int low_register_operand (rtx, enum machine_mode);
-extern int low_reg_or_int_operand (rtx, enum machine_mode);
-extern int arm_general_register_operand (rtx, enum machine_mode);
-extern int vfp_register_operand (rtx, enum machine_mode);
-extern int vfp_hard_register_operand (rtx, enum machine_mode);
-extern int zero_operand (rtx, enum machine_mode);
-extern int reg_or_zero_operand (rtx, enum machine_mode);
-extern int subreg_lowpart_operator (rtx, enum machine_mode);
-extern int reg_or_int_operand (rtx, enum machine_mode);
-extern int arm_immediate_operand (rtx, enum machine_mode);
-extern int arm_immediate_di_operand (rtx, enum machine_mode);
-extern int arm_neg_immediate_operand (rtx, enum machine_mode);
-extern int arm_not_immediate_operand (rtx, enum machine_mode);
-extern int const0_operand (rtx, enum machine_mode);
-extern int arm_rhs_operand (rtx, enum machine_mode);
-extern int arm_rhsm_operand (rtx, enum machine_mode);
-extern int const_int_I_operand (rtx, enum machine_mode);
-extern int const_int_M_operand (rtx, enum machine_mode);
-extern int shift_amount_operand (rtx, enum machine_mode);
-extern int const_neon_scalar_shift_amount_operand (rtx, enum machine_mode);
-extern int ldrd_strd_offset_operand (rtx, enum machine_mode);
-extern int arm_add_operand (rtx, enum machine_mode);
-extern int arm_anddi_operand_neon (rtx, enum machine_mode);
-extern int arm_iordi_operand_neon (rtx, enum machine_mode);
-extern int arm_xordi_operand (rtx, enum machine_mode);
-extern int arm_adddi_operand (rtx, enum machine_mode);
-extern int arm_addimm_operand (rtx, enum machine_mode);
-extern int arm_not_operand (rtx, enum machine_mode);
-extern int arm_di_operand (rtx, enum machine_mode);
-extern int offsettable_memory_operand (rtx, enum machine_mode);
-extern int call_memory_operand (rtx, enum machine_mode);
-extern int arm_reload_memory_operand (rtx, enum machine_mode);
-extern int vfp_compare_operand (rtx, enum machine_mode);
-extern int arm_float_compare_operand (rtx, enum machine_mode);
-extern int index_operand (rtx, enum machine_mode);
-extern int shiftable_operator (rtx, enum machine_mode);
-extern int shiftable_operator_strict_it (rtx, enum machine_mode);
-extern int logical_binary_operator (rtx, enum machine_mode);
-extern int commutative_binary_operator (rtx, enum machine_mode);
-extern int shift_operator (rtx, enum machine_mode);
-extern int sat_shift_operator (rtx, enum machine_mode);
-extern int mult_operator (rtx, enum machine_mode);
-extern int thumb_16bit_operator (rtx, enum machine_mode);
-extern int equality_operator (rtx, enum machine_mode);
-extern int expandable_comparison_operator (rtx, enum machine_mode);
-extern int arm_comparison_operator (rtx, enum machine_mode);
-extern int lt_ge_comparison_operator (rtx, enum machine_mode);
-extern int arm_vsel_comparison_operator (rtx, enum machine_mode);
-extern int arm_cond_move_operator (rtx, enum machine_mode);
-extern int noov_comparison_operator (rtx, enum machine_mode);
-extern int minmax_operator (rtx, enum machine_mode);
-extern int cc_register (rtx, enum machine_mode);
-extern int dominant_cc_register (rtx, enum machine_mode);
-extern int arm_extendqisi_mem_op (rtx, enum machine_mode);
-extern int arm_reg_or_extendqisi_mem_op (rtx, enum machine_mode);
-extern int power_of_two_operand (rtx, enum machine_mode);
-extern int nonimmediate_di_operand (rtx, enum machine_mode);
-extern int di_operand (rtx, enum machine_mode);
-extern int nonimmediate_soft_df_operand (rtx, enum machine_mode);
-extern int soft_df_operand (rtx, enum machine_mode);
-extern int load_multiple_operation (rtx, enum machine_mode);
-extern int store_multiple_operation (rtx, enum machine_mode);
-extern int pop_multiple_return (rtx, enum machine_mode);
-extern int pop_multiple_fp (rtx, enum machine_mode);
-extern int multi_register_push (rtx, enum machine_mode);
-extern int push_mult_memory_operand (rtx, enum machine_mode);
-extern int thumb1_cmp_operand (rtx, enum machine_mode);
-extern int thumb1_cmpneg_operand (rtx, enum machine_mode);
-extern int thumb_cbrch_target_operand (rtx, enum machine_mode);
-extern int imm_or_reg_operand (rtx, enum machine_mode);
-extern int const_multiple_of_8_operand (rtx, enum machine_mode);
-extern int imm_for_neon_mov_operand (rtx, enum machine_mode);
-extern int imm_for_neon_lshift_operand (rtx, enum machine_mode);
-extern int imm_for_neon_rshift_operand (rtx, enum machine_mode);
-extern int imm_lshift_or_reg_neon (rtx, enum machine_mode);
-extern int imm_rshift_or_reg_neon (rtx, enum machine_mode);
-extern int cmpdi_operand (rtx, enum machine_mode);
-extern int arm_sync_memory_operand (rtx, enum machine_mode);
-extern int vect_par_constant_high (rtx, enum machine_mode);
-extern int vect_par_constant_low (rtx, enum machine_mode);
-extern int const_double_vcvt_power_of_two_reciprocal (rtx, enum machine_mode);
-extern int const_double_vcvt_power_of_two (rtx, enum machine_mode);
-extern int neon_struct_operand (rtx, enum machine_mode);
-extern int neon_permissive_struct_operand (rtx, enum machine_mode);
-extern int neon_perm_struct_or_reg_operand (rtx, enum machine_mode);
-extern int add_operator (rtx, enum machine_mode);
-extern int mem_noofs_operand (rtx, enum machine_mode);
-extern int call_insn_operand (rtx, enum machine_mode);
-#endif /* HAVE_MACHINE_MODES */
-
-#define CONSTRAINT_NUM_DEFINED_P 1
-enum constraint_num
-{
-  CONSTRAINT__UNKNOWN = 0,
-  CONSTRAINT_t,
-  CONSTRAINT_w,
-  CONSTRAINT_x,
-  CONSTRAINT_y,
-  CONSTRAINT_z,
-  CONSTRAINT_l,
-  CONSTRAINT_h,
-  CONSTRAINT_j,
-  CONSTRAINT_Pj,
-  CONSTRAINT_PJ,
-  CONSTRAINT_k,
-  CONSTRAINT_q,
-  CONSTRAINT_b,
-  CONSTRAINT_c,
-  CONSTRAINT_Cs,
-  CONSTRAINT_I,
-  CONSTRAINT_J,
-  CONSTRAINT_K,
-  CONSTRAINT_L,
-  CONSTRAINT_M,
-  CONSTRAINT_N,
-  CONSTRAINT_O,
-  CONSTRAINT_Pa,
-  CONSTRAINT_Pb,
-  CONSTRAINT_Pc,
-  CONSTRAINT_Pd,
-  CONSTRAINT_Pe,
-  CONSTRAINT_Ps,
-  CONSTRAINT_Pt,
-  CONSTRAINT_Pu,
-  CONSTRAINT_Pv,
-  CONSTRAINT_Pw,
-  CONSTRAINT_Px,
-  CONSTRAINT_Py,
-  CONSTRAINT_Pz,
-  CONSTRAINT_G,
-  CONSTRAINT_Dz,
-  CONSTRAINT_Da,
-  CONSTRAINT_Db,
-  CONSTRAINT_Dc,
-  CONSTRAINT_Dd,
-  CONSTRAINT_De,
-  CONSTRAINT_Df,
-  CONSTRAINT_Dg,
-  CONSTRAINT_Di,
-  CONSTRAINT_Dn,
-  CONSTRAINT_Dl,
-  CONSTRAINT_DL,
-  CONSTRAINT_Do,
-  CONSTRAINT_Dv,
-  CONSTRAINT_Dy,
-  CONSTRAINT_Dt,
-  CONSTRAINT_Dp,
-  CONSTRAINT_Ts,
-  CONSTRAINT_Ua,
-  CONSTRAINT_Ut,
-  CONSTRAINT_Uv,
-  CONSTRAINT_Uy,
-  CONSTRAINT_Un,
-  CONSTRAINT_Um,
-  CONSTRAINT_Us,
-  CONSTRAINT_Uq,
-  CONSTRAINT_Q,
-  CONSTRAINT_Uu,
-  CONSTRAINT_Uw,
-  CONSTRAINT_US,
-  CONSTRAINT__LIMIT
-};
-
-extern enum constraint_num lookup_constraint (const char *);
-extern bool constraint_satisfied_p (rtx, enum constraint_num);
-
-static inline size_t
-insn_constraint_len (char fc, const char *str ATTRIBUTE_UNUSED)
-{
-  switch (fc)
-    {
-    case 'C': return 2;
-    case 'D': return 2;
-    case 'P': return 2;
-    case 'T': return 2;
-    case 'U': return 2;
-    default: break;
-    }
-  return 1;
-}
-
-#define CONSTRAINT_LEN(c_,s_) insn_constraint_len (c_,s_)
-
-extern enum reg_class regclass_for_constraint (enum constraint_num);
-#define REG_CLASS_FROM_CONSTRAINT(c_,s_) \
-    regclass_for_constraint (lookup_constraint (s_))
-#define REG_CLASS_FOR_CONSTRAINT(x_) \
-    regclass_for_constraint (x_)
-
-extern bool insn_const_int_ok_for_constraint (HOST_WIDE_INT, enum constraint_num);
-#define CONST_OK_FOR_CONSTRAINT_P(v_,c_,s_) \
-    insn_const_int_ok_for_constraint (v_, lookup_constraint (s_))
-
-#define CONST_DOUBLE_OK_FOR_CONSTRAINT_P(v_,c_,s_) \
-    constraint_satisfied_p (v_, lookup_constraint (s_))
-
-#define EXTRA_CONSTRAINT_STR(v_,c_,s_) \
-    constraint_satisfied_p (v_, lookup_constraint (s_))
-
-extern bool insn_extra_memory_constraint (enum constraint_num);
-#define EXTRA_MEMORY_CONSTRAINT(c_,s_) insn_extra_memory_constraint (lookup_constraint (s_))
-
-#define EXTRA_ADDRESS_CONSTRAINT(c_,s_) false
-
-#endif /* tm-preds.h */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tm.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tm.h
deleted file mode 100644
index 4320e07..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tm.h
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef GCC_TM_H
-#define GCC_TM_H
-#define TARGET_CPU_DEFAULT (TARGET_CPU_cortexa9)
-#ifndef LIBC_GLIBC
-# define LIBC_GLIBC 1
-#endif
-#ifndef LIBC_UCLIBC
-# define LIBC_UCLIBC 2
-#endif
-#ifndef LIBC_BIONIC
-# define LIBC_BIONIC 3
-#endif
-#ifndef LIBC_MUSL
-# define LIBC_MUSL 4
-#endif
-#ifndef DEFAULT_LIBC
-# define DEFAULT_LIBC LIBC_GLIBC
-#endif
-#ifndef ANDROID_DEFAULT
-# define ANDROID_DEFAULT 0
-#endif
-#ifdef IN_GCC
-# include "options.h"
-# include "insn-constants.h"
-# include "config/dbxelf.h"
-# include "config/elfos.h"
-# include "config/gnu-user.h"
-# include "config/linux.h"
-# include "config/linux-android.h"
-# include "config/glibc-stdint.h"
-# include "config/arm/elf.h"
-# include "config/arm/linux-gas.h"
-# include "config/arm/linux-elf.h"
-# include "config/arm/bpabi.h"
-# include "config/arm/linux-eabi.h"
-# include "config/arm/aout.h"
-# include "config/vxworks-dummy.h"
-# include "config/arm/arm.h"
-# include "config/initfini-array.h"
-#endif
-#if defined IN_GCC && !defined GENERATOR_FILE && !defined USED_FOR_TARGET
-# include "insn-flags.h"
-#endif
-#if defined IN_GCC && !defined GENERATOR_FILE
-# include "insn-modes.h"
-#endif
-# include "defaults.h"
-#endif /* GCC_TM_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tm_p.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tm_p.h
deleted file mode 100644
index 27700c3..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tm_p.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef GCC_TM_P_H
-#define GCC_TM_P_H
-#ifdef IN_GCC
-# include "config/arm/arm-protos.h"
-# include "config/arm/aarch-common-protos.h"
-# include "config/linux-protos.h"
-# include "tm-preds.h"
-#endif
-#endif /* GCC_TM_P_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/toplev.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/toplev.h
deleted file mode 100644
index 0290be3..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/toplev.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/* toplev.h - Various declarations for functions found in toplev.c
-   Copyright (C) 1998-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TOPLEV_H
-#define GCC_TOPLEV_H
-
-/* Decoded options, and number of such options.  */
-extern struct cl_decoded_option *save_decoded_options;
-extern unsigned int save_decoded_options_count;
-
-extern int toplev_main (int, char **);
-extern void rest_of_decl_compilation (tree, int, int);
-extern void rest_of_type_compilation (tree, int);
-extern void init_optimization_passes (void);
-extern bool enable_rtl_dump_file (void);
-
-/* In except.c.  Initialize exception handling.  This is used by the Ada
-   and LTO front ends to initialize EH "on demand".  See lto-streamer-in.c
-   and ada/gcc-interface/misc.c.  */
-extern void init_eh (void);
-
-extern void announce_function (tree);
-
-extern void wrapup_global_declaration_1 (tree);
-extern bool wrapup_global_declaration_2 (tree);
-extern bool wrapup_global_declarations (tree *, int);
-extern void check_global_declaration_1 (tree);
-extern void check_global_declarations (tree *, int);
-extern void emit_debug_global_declarations (tree *, int);
-extern void write_global_declarations (void);
-
-extern void dump_memory_report (bool);
-extern void dump_profile_report (void);
-
-extern void target_reinit (void);
-
-/* A unique local time stamp, might be zero if none is available.  */
-extern unsigned local_tick;
-
-/* True if the user has tagged the function with the 'section'
-   attribute.  */
-
-extern bool user_defined_section_attribute;
-
-/* See toplev.c.  */
-extern int flag_rerun_cse_after_global_opts;
-
-extern void print_version (FILE *, const char *);
-
-/* The hashtable, so that the C front ends can pass it to cpplib.  */
-extern struct ht *ident_hash;
-
-/* Functions used to get and set GCC's notion of in what directory
-   compilation was started.  */
-
-extern const char *get_src_pwd	       (void);
-extern bool set_src_pwd		       (const char *);
-
-/* Functions used to manipulate the random seed.  */
-
-extern HOST_WIDE_INT get_random_seed (bool);
-extern const char *set_random_seed (const char *);
-
-#endif /* ! GCC_TOPLEV_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-cfg.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-cfg.h
deleted file mode 100644
index a115df5..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-cfg.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/* Data and Control Flow Analysis for Trees.
-   Copyright (C) 2001-2014 Free Software Foundation, Inc.
-   Contributed by Diego Novillo <dnovillo@redhat.com>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef _TREE_CFG_H
-#define _TREE_CFG_H
-
-/* Location to track pending stmt for edge insertion.  */
-#define PENDING_STMT(e)	((e)->insns.g)
-
-extern void init_empty_tree_cfg_for_function (struct function *);
-extern void init_empty_tree_cfg (void);
-extern void fold_cond_expr_cond (void);
-extern void start_recording_case_labels (void);
-extern void end_recording_case_labels (void);
-extern basic_block label_to_block_fn (struct function *, tree);
-#define label_to_block(t) (label_to_block_fn (cfun, t))
-extern void cleanup_dead_labels (void);
-extern void group_case_labels_stmt (gimple);
-extern void group_case_labels (void);
-extern void replace_uses_by (tree, tree);
-extern basic_block single_noncomplex_succ (basic_block bb);
-extern void notice_special_calls (gimple);
-extern void clear_special_calls (void);
-extern edge find_taken_edge (basic_block, tree);
-extern void gimple_debug_bb (basic_block);
-extern basic_block gimple_debug_bb_n (int);
-extern void gimple_debug_cfg (int);
-extern void gimple_dump_cfg (FILE *, int);
-extern void dump_cfg_stats (FILE *);
-extern void debug_cfg_stats (void);
-extern bool computed_goto_p (gimple);
-extern bool stmt_can_make_abnormal_goto (gimple);
-extern basic_block get_abnormal_succ_dispatcher (basic_block);
-extern bool is_ctrl_stmt (gimple);
-extern bool is_ctrl_altering_stmt (gimple);
-extern bool simple_goto_p (gimple);
-extern bool stmt_ends_bb_p (gimple);
-extern bool assert_unreachable_fallthru_edge_p (edge);
-extern void delete_tree_cfg_annotations (void);
-extern gimple first_stmt (basic_block);
-extern gimple last_stmt (basic_block);
-extern gimple last_and_only_stmt (basic_block);
-extern void verify_gimple_in_seq (gimple_seq);
-extern void verify_gimple_in_cfg (struct function *);
-extern tree gimple_block_label (basic_block);
-extern void add_phi_args_after_copy_bb (basic_block);
-extern void add_phi_args_after_copy (basic_block *, unsigned, edge);
-extern bool gimple_duplicate_sese_region (edge, edge, basic_block *, unsigned,
-					basic_block *, bool);
-extern bool gimple_duplicate_sese_tail (edge, edge, basic_block *, unsigned,
-				      basic_block *);
-extern void gather_blocks_in_sese_region (basic_block entry, basic_block exit,
-					  vec<basic_block> *bbs_p);
-extern basic_block move_sese_region_to_fn (struct function *, basic_block,
-				           basic_block, tree);
-extern void dump_function_to_file (tree, FILE *, int);
-extern void debug_function (tree, int) ;
-extern void print_loops_bb (FILE *, basic_block, int, int);
-extern void print_loops (FILE *, int);
-extern void debug (struct loop &ref);
-extern void debug (struct loop *ptr);
-extern void debug_verbose (struct loop &ref);
-extern void debug_verbose (struct loop *ptr);
-extern void debug_loops (int);
-extern void debug_loop (struct loop *, int);
-extern void debug_loop_num (unsigned, int);
-extern void remove_edge_and_dominated_blocks (edge);
-extern bool gimple_purge_dead_eh_edges (basic_block);
-extern bool gimple_purge_all_dead_eh_edges (const_bitmap);
-extern bool gimple_purge_dead_abnormal_call_edges (basic_block);
-extern bool gimple_purge_all_dead_abnormal_call_edges (const_bitmap);
-extern tree gimplify_build3 (gimple_stmt_iterator *, enum tree_code,
-			     tree, tree, tree, tree);
-extern tree gimplify_build2 (gimple_stmt_iterator *, enum tree_code,
-			     tree, tree, tree);
-extern tree gimplify_build1 (gimple_stmt_iterator *, enum tree_code,
-			     tree, tree);
-extern void extract_true_false_edges_from_block (basic_block, edge *, edge *);
-extern unsigned int execute_fixup_cfg (void);
-extern unsigned int split_critical_edges (void);
-
-#endif /* _TREE_CFG_H  */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-cfgcleanup.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-cfgcleanup.h
deleted file mode 100644
index 19ff170..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-cfgcleanup.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Header file for CFG cleanup for trees.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_CFGCLEANUP_H
-#define GCC_TREE_CFGCLEANUP_H
-
-/* In tree-cfgcleanup.c  */
-extern bitmap cfgcleanup_altered_bbs;
-extern bool cleanup_tree_cfg (void);
-extern bool fixup_noreturn_call (gimple stmt);
-
-#endif /* GCC_TREE_CFGCLEANUP_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-check.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-check.h
deleted file mode 100644
index 20d80aa..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-check.h
+++ /dev/null
@@ -1,321 +0,0 @@
-/* This file is generated using gencheck. Do not edit. */
-
-#ifndef GCC_TREE_CHECK_H
-#define GCC_TREE_CHECK_H
-
-#define ERROR_MARK_CHECK(t)	TREE_CHECK (t, ERROR_MARK)
-#define IDENTIFIER_NODE_CHECK(t)	TREE_CHECK (t, IDENTIFIER_NODE)
-#define TREE_LIST_CHECK(t)	TREE_CHECK (t, TREE_LIST)
-#define TREE_VEC_CHECK(t)	TREE_CHECK (t, TREE_VEC)
-#define BLOCK_CHECK(t)	TREE_CHECK (t, BLOCK)
-#define OFFSET_TYPE_CHECK(t)	TREE_CHECK (t, OFFSET_TYPE)
-#define ENUMERAL_TYPE_CHECK(t)	TREE_CHECK (t, ENUMERAL_TYPE)
-#define BOOLEAN_TYPE_CHECK(t)	TREE_CHECK (t, BOOLEAN_TYPE)
-#define INTEGER_TYPE_CHECK(t)	TREE_CHECK (t, INTEGER_TYPE)
-#define REAL_TYPE_CHECK(t)	TREE_CHECK (t, REAL_TYPE)
-#define POINTER_TYPE_CHECK(t)	TREE_CHECK (t, POINTER_TYPE)
-#define REFERENCE_TYPE_CHECK(t)	TREE_CHECK (t, REFERENCE_TYPE)
-#define NULLPTR_TYPE_CHECK(t)	TREE_CHECK (t, NULLPTR_TYPE)
-#define FIXED_POINT_TYPE_CHECK(t)	TREE_CHECK (t, FIXED_POINT_TYPE)
-#define COMPLEX_TYPE_CHECK(t)	TREE_CHECK (t, COMPLEX_TYPE)
-#define VECTOR_TYPE_CHECK(t)	TREE_CHECK (t, VECTOR_TYPE)
-#define ARRAY_TYPE_CHECK(t)	TREE_CHECK (t, ARRAY_TYPE)
-#define RECORD_TYPE_CHECK(t)	TREE_CHECK (t, RECORD_TYPE)
-#define UNION_TYPE_CHECK(t)	TREE_CHECK (t, UNION_TYPE)
-#define QUAL_UNION_TYPE_CHECK(t)	TREE_CHECK (t, QUAL_UNION_TYPE)
-#define VOID_TYPE_CHECK(t)	TREE_CHECK (t, VOID_TYPE)
-#define FUNCTION_TYPE_CHECK(t)	TREE_CHECK (t, FUNCTION_TYPE)
-#define METHOD_TYPE_CHECK(t)	TREE_CHECK (t, METHOD_TYPE)
-#define LANG_TYPE_CHECK(t)	TREE_CHECK (t, LANG_TYPE)
-#define INTEGER_CST_CHECK(t)	TREE_CHECK (t, INTEGER_CST)
-#define REAL_CST_CHECK(t)	TREE_CHECK (t, REAL_CST)
-#define FIXED_CST_CHECK(t)	TREE_CHECK (t, FIXED_CST)
-#define COMPLEX_CST_CHECK(t)	TREE_CHECK (t, COMPLEX_CST)
-#define VECTOR_CST_CHECK(t)	TREE_CHECK (t, VECTOR_CST)
-#define STRING_CST_CHECK(t)	TREE_CHECK (t, STRING_CST)
-#define FUNCTION_DECL_CHECK(t)	TREE_CHECK (t, FUNCTION_DECL)
-#define LABEL_DECL_CHECK(t)	TREE_CHECK (t, LABEL_DECL)
-#define FIELD_DECL_CHECK(t)	TREE_CHECK (t, FIELD_DECL)
-#define VAR_DECL_CHECK(t)	TREE_CHECK (t, VAR_DECL)
-#define CONST_DECL_CHECK(t)	TREE_CHECK (t, CONST_DECL)
-#define PARM_DECL_CHECK(t)	TREE_CHECK (t, PARM_DECL)
-#define TYPE_DECL_CHECK(t)	TREE_CHECK (t, TYPE_DECL)
-#define RESULT_DECL_CHECK(t)	TREE_CHECK (t, RESULT_DECL)
-#define DEBUG_EXPR_DECL_CHECK(t)	TREE_CHECK (t, DEBUG_EXPR_DECL)
-#define NAMESPACE_DECL_CHECK(t)	TREE_CHECK (t, NAMESPACE_DECL)
-#define IMPORTED_DECL_CHECK(t)	TREE_CHECK (t, IMPORTED_DECL)
-#define NAMELIST_DECL_CHECK(t)	TREE_CHECK (t, NAMELIST_DECL)
-#define TRANSLATION_UNIT_DECL_CHECK(t)	TREE_CHECK (t, TRANSLATION_UNIT_DECL)
-#define COMPONENT_REF_CHECK(t)	TREE_CHECK (t, COMPONENT_REF)
-#define BIT_FIELD_REF_CHECK(t)	TREE_CHECK (t, BIT_FIELD_REF)
-#define ARRAY_REF_CHECK(t)	TREE_CHECK (t, ARRAY_REF)
-#define ARRAY_RANGE_REF_CHECK(t)	TREE_CHECK (t, ARRAY_RANGE_REF)
-#define REALPART_EXPR_CHECK(t)	TREE_CHECK (t, REALPART_EXPR)
-#define IMAGPART_EXPR_CHECK(t)	TREE_CHECK (t, IMAGPART_EXPR)
-#define VIEW_CONVERT_EXPR_CHECK(t)	TREE_CHECK (t, VIEW_CONVERT_EXPR)
-#define INDIRECT_REF_CHECK(t)	TREE_CHECK (t, INDIRECT_REF)
-#define OBJ_TYPE_REF_CHECK(t)	TREE_CHECK (t, OBJ_TYPE_REF)
-#define CONSTRUCTOR_CHECK(t)	TREE_CHECK (t, CONSTRUCTOR)
-#define COMPOUND_EXPR_CHECK(t)	TREE_CHECK (t, COMPOUND_EXPR)
-#define MODIFY_EXPR_CHECK(t)	TREE_CHECK (t, MODIFY_EXPR)
-#define INIT_EXPR_CHECK(t)	TREE_CHECK (t, INIT_EXPR)
-#define TARGET_EXPR_CHECK(t)	TREE_CHECK (t, TARGET_EXPR)
-#define COND_EXPR_CHECK(t)	TREE_CHECK (t, COND_EXPR)
-#define VEC_COND_EXPR_CHECK(t)	TREE_CHECK (t, VEC_COND_EXPR)
-#define VEC_PERM_EXPR_CHECK(t)	TREE_CHECK (t, VEC_PERM_EXPR)
-#define BIND_EXPR_CHECK(t)	TREE_CHECK (t, BIND_EXPR)
-#define CALL_EXPR_CHECK(t)	TREE_CHECK (t, CALL_EXPR)
-#define WITH_CLEANUP_EXPR_CHECK(t)	TREE_CHECK (t, WITH_CLEANUP_EXPR)
-#define CLEANUP_POINT_EXPR_CHECK(t)	TREE_CHECK (t, CLEANUP_POINT_EXPR)
-#define PLACEHOLDER_EXPR_CHECK(t)	TREE_CHECK (t, PLACEHOLDER_EXPR)
-#define PLUS_EXPR_CHECK(t)	TREE_CHECK (t, PLUS_EXPR)
-#define MINUS_EXPR_CHECK(t)	TREE_CHECK (t, MINUS_EXPR)
-#define MULT_EXPR_CHECK(t)	TREE_CHECK (t, MULT_EXPR)
-#define POINTER_PLUS_EXPR_CHECK(t)	TREE_CHECK (t, POINTER_PLUS_EXPR)
-#define MULT_HIGHPART_EXPR_CHECK(t)	TREE_CHECK (t, MULT_HIGHPART_EXPR)
-#define TRUNC_DIV_EXPR_CHECK(t)	TREE_CHECK (t, TRUNC_DIV_EXPR)
-#define CEIL_DIV_EXPR_CHECK(t)	TREE_CHECK (t, CEIL_DIV_EXPR)
-#define FLOOR_DIV_EXPR_CHECK(t)	TREE_CHECK (t, FLOOR_DIV_EXPR)
-#define ROUND_DIV_EXPR_CHECK(t)	TREE_CHECK (t, ROUND_DIV_EXPR)
-#define TRUNC_MOD_EXPR_CHECK(t)	TREE_CHECK (t, TRUNC_MOD_EXPR)
-#define CEIL_MOD_EXPR_CHECK(t)	TREE_CHECK (t, CEIL_MOD_EXPR)
-#define FLOOR_MOD_EXPR_CHECK(t)	TREE_CHECK (t, FLOOR_MOD_EXPR)
-#define ROUND_MOD_EXPR_CHECK(t)	TREE_CHECK (t, ROUND_MOD_EXPR)
-#define RDIV_EXPR_CHECK(t)	TREE_CHECK (t, RDIV_EXPR)
-#define EXACT_DIV_EXPR_CHECK(t)	TREE_CHECK (t, EXACT_DIV_EXPR)
-#define FIX_TRUNC_EXPR_CHECK(t)	TREE_CHECK (t, FIX_TRUNC_EXPR)
-#define FLOAT_EXPR_CHECK(t)	TREE_CHECK (t, FLOAT_EXPR)
-#define NEGATE_EXPR_CHECK(t)	TREE_CHECK (t, NEGATE_EXPR)
-#define MIN_EXPR_CHECK(t)	TREE_CHECK (t, MIN_EXPR)
-#define MAX_EXPR_CHECK(t)	TREE_CHECK (t, MAX_EXPR)
-#define ABS_EXPR_CHECK(t)	TREE_CHECK (t, ABS_EXPR)
-#define LSHIFT_EXPR_CHECK(t)	TREE_CHECK (t, LSHIFT_EXPR)
-#define RSHIFT_EXPR_CHECK(t)	TREE_CHECK (t, RSHIFT_EXPR)
-#define LROTATE_EXPR_CHECK(t)	TREE_CHECK (t, LROTATE_EXPR)
-#define RROTATE_EXPR_CHECK(t)	TREE_CHECK (t, RROTATE_EXPR)
-#define BIT_IOR_EXPR_CHECK(t)	TREE_CHECK (t, BIT_IOR_EXPR)
-#define BIT_XOR_EXPR_CHECK(t)	TREE_CHECK (t, BIT_XOR_EXPR)
-#define BIT_AND_EXPR_CHECK(t)	TREE_CHECK (t, BIT_AND_EXPR)
-#define BIT_NOT_EXPR_CHECK(t)	TREE_CHECK (t, BIT_NOT_EXPR)
-#define TRUTH_ANDIF_EXPR_CHECK(t)	TREE_CHECK (t, TRUTH_ANDIF_EXPR)
-#define TRUTH_ORIF_EXPR_CHECK(t)	TREE_CHECK (t, TRUTH_ORIF_EXPR)
-#define TRUTH_AND_EXPR_CHECK(t)	TREE_CHECK (t, TRUTH_AND_EXPR)
-#define TRUTH_OR_EXPR_CHECK(t)	TREE_CHECK (t, TRUTH_OR_EXPR)
-#define TRUTH_XOR_EXPR_CHECK(t)	TREE_CHECK (t, TRUTH_XOR_EXPR)
-#define TRUTH_NOT_EXPR_CHECK(t)	TREE_CHECK (t, TRUTH_NOT_EXPR)
-#define LT_EXPR_CHECK(t)	TREE_CHECK (t, LT_EXPR)
-#define LE_EXPR_CHECK(t)	TREE_CHECK (t, LE_EXPR)
-#define GT_EXPR_CHECK(t)	TREE_CHECK (t, GT_EXPR)
-#define GE_EXPR_CHECK(t)	TREE_CHECK (t, GE_EXPR)
-#define EQ_EXPR_CHECK(t)	TREE_CHECK (t, EQ_EXPR)
-#define NE_EXPR_CHECK(t)	TREE_CHECK (t, NE_EXPR)
-#define UNORDERED_EXPR_CHECK(t)	TREE_CHECK (t, UNORDERED_EXPR)
-#define ORDERED_EXPR_CHECK(t)	TREE_CHECK (t, ORDERED_EXPR)
-#define UNLT_EXPR_CHECK(t)	TREE_CHECK (t, UNLT_EXPR)
-#define UNLE_EXPR_CHECK(t)	TREE_CHECK (t, UNLE_EXPR)
-#define UNGT_EXPR_CHECK(t)	TREE_CHECK (t, UNGT_EXPR)
-#define UNGE_EXPR_CHECK(t)	TREE_CHECK (t, UNGE_EXPR)
-#define UNEQ_EXPR_CHECK(t)	TREE_CHECK (t, UNEQ_EXPR)
-#define LTGT_EXPR_CHECK(t)	TREE_CHECK (t, LTGT_EXPR)
-#define RANGE_EXPR_CHECK(t)	TREE_CHECK (t, RANGE_EXPR)
-#define PAREN_EXPR_CHECK(t)	TREE_CHECK (t, PAREN_EXPR)
-#define CONVERT_EXPR_CHECK(t)	TREE_CHECK (t, CONVERT_EXPR)
-#define ADDR_SPACE_CONVERT_EXPR_CHECK(t)	TREE_CHECK (t, ADDR_SPACE_CONVERT_EXPR)
-#define FIXED_CONVERT_EXPR_CHECK(t)	TREE_CHECK (t, FIXED_CONVERT_EXPR)
-#define NOP_EXPR_CHECK(t)	TREE_CHECK (t, NOP_EXPR)
-#define NON_LVALUE_EXPR_CHECK(t)	TREE_CHECK (t, NON_LVALUE_EXPR)
-#define COMPOUND_LITERAL_EXPR_CHECK(t)	TREE_CHECK (t, COMPOUND_LITERAL_EXPR)
-#define SAVE_EXPR_CHECK(t)	TREE_CHECK (t, SAVE_EXPR)
-#define ADDR_EXPR_CHECK(t)	TREE_CHECK (t, ADDR_EXPR)
-#define FDESC_EXPR_CHECK(t)	TREE_CHECK (t, FDESC_EXPR)
-#define COMPLEX_EXPR_CHECK(t)	TREE_CHECK (t, COMPLEX_EXPR)
-#define CONJ_EXPR_CHECK(t)	TREE_CHECK (t, CONJ_EXPR)
-#define PREDECREMENT_EXPR_CHECK(t)	TREE_CHECK (t, PREDECREMENT_EXPR)
-#define PREINCREMENT_EXPR_CHECK(t)	TREE_CHECK (t, PREINCREMENT_EXPR)
-#define POSTDECREMENT_EXPR_CHECK(t)	TREE_CHECK (t, POSTDECREMENT_EXPR)
-#define POSTINCREMENT_EXPR_CHECK(t)	TREE_CHECK (t, POSTINCREMENT_EXPR)
-#define VA_ARG_EXPR_CHECK(t)	TREE_CHECK (t, VA_ARG_EXPR)
-#define TRY_CATCH_EXPR_CHECK(t)	TREE_CHECK (t, TRY_CATCH_EXPR)
-#define TRY_FINALLY_EXPR_CHECK(t)	TREE_CHECK (t, TRY_FINALLY_EXPR)
-#define DECL_EXPR_CHECK(t)	TREE_CHECK (t, DECL_EXPR)
-#define LABEL_EXPR_CHECK(t)	TREE_CHECK (t, LABEL_EXPR)
-#define GOTO_EXPR_CHECK(t)	TREE_CHECK (t, GOTO_EXPR)
-#define RETURN_EXPR_CHECK(t)	TREE_CHECK (t, RETURN_EXPR)
-#define EXIT_EXPR_CHECK(t)	TREE_CHECK (t, EXIT_EXPR)
-#define LOOP_EXPR_CHECK(t)	TREE_CHECK (t, LOOP_EXPR)
-#define SWITCH_EXPR_CHECK(t)	TREE_CHECK (t, SWITCH_EXPR)
-#define CASE_LABEL_EXPR_CHECK(t)	TREE_CHECK (t, CASE_LABEL_EXPR)
-#define ASM_EXPR_CHECK(t)	TREE_CHECK (t, ASM_EXPR)
-#define SSA_NAME_CHECK(t)	TREE_CHECK (t, SSA_NAME)
-#define CATCH_EXPR_CHECK(t)	TREE_CHECK (t, CATCH_EXPR)
-#define EH_FILTER_EXPR_CHECK(t)	TREE_CHECK (t, EH_FILTER_EXPR)
-#define SCEV_KNOWN_CHECK(t)	TREE_CHECK (t, SCEV_KNOWN)
-#define SCEV_NOT_KNOWN_CHECK(t)	TREE_CHECK (t, SCEV_NOT_KNOWN)
-#define POLYNOMIAL_CHREC_CHECK(t)	TREE_CHECK (t, POLYNOMIAL_CHREC)
-#define STATEMENT_LIST_CHECK(t)	TREE_CHECK (t, STATEMENT_LIST)
-#define ASSERT_EXPR_CHECK(t)	TREE_CHECK (t, ASSERT_EXPR)
-#define TREE_BINFO_CHECK(t)	TREE_CHECK (t, TREE_BINFO)
-#define WITH_SIZE_EXPR_CHECK(t)	TREE_CHECK (t, WITH_SIZE_EXPR)
-#define REALIGN_LOAD_EXPR_CHECK(t)	TREE_CHECK (t, REALIGN_LOAD_EXPR)
-#define TARGET_MEM_REF_CHECK(t)	TREE_CHECK (t, TARGET_MEM_REF)
-#define MEM_REF_CHECK(t)	TREE_CHECK (t, MEM_REF)
-#define OMP_PARALLEL_CHECK(t)	TREE_CHECK (t, OMP_PARALLEL)
-#define OMP_TASK_CHECK(t)	TREE_CHECK (t, OMP_TASK)
-#define OMP_FOR_CHECK(t)	TREE_CHECK (t, OMP_FOR)
-#define OMP_SIMD_CHECK(t)	TREE_CHECK (t, OMP_SIMD)
-#define CILK_SIMD_CHECK(t)	TREE_CHECK (t, CILK_SIMD)
-#define OMP_DISTRIBUTE_CHECK(t)	TREE_CHECK (t, OMP_DISTRIBUTE)
-#define OMP_TEAMS_CHECK(t)	TREE_CHECK (t, OMP_TEAMS)
-#define OMP_TARGET_DATA_CHECK(t)	TREE_CHECK (t, OMP_TARGET_DATA)
-#define OMP_TARGET_CHECK(t)	TREE_CHECK (t, OMP_TARGET)
-#define OMP_SECTIONS_CHECK(t)	TREE_CHECK (t, OMP_SECTIONS)
-#define OMP_SINGLE_CHECK(t)	TREE_CHECK (t, OMP_SINGLE)
-#define OMP_SECTION_CHECK(t)	TREE_CHECK (t, OMP_SECTION)
-#define OMP_MASTER_CHECK(t)	TREE_CHECK (t, OMP_MASTER)
-#define OMP_TASKGROUP_CHECK(t)	TREE_CHECK (t, OMP_TASKGROUP)
-#define OMP_ORDERED_CHECK(t)	TREE_CHECK (t, OMP_ORDERED)
-#define OMP_CRITICAL_CHECK(t)	TREE_CHECK (t, OMP_CRITICAL)
-#define OMP_TARGET_UPDATE_CHECK(t)	TREE_CHECK (t, OMP_TARGET_UPDATE)
-#define OMP_ATOMIC_CHECK(t)	TREE_CHECK (t, OMP_ATOMIC)
-#define OMP_ATOMIC_READ_CHECK(t)	TREE_CHECK (t, OMP_ATOMIC_READ)
-#define OMP_ATOMIC_CAPTURE_OLD_CHECK(t)	TREE_CHECK (t, OMP_ATOMIC_CAPTURE_OLD)
-#define OMP_ATOMIC_CAPTURE_NEW_CHECK(t)	TREE_CHECK (t, OMP_ATOMIC_CAPTURE_NEW)
-#define OMP_CLAUSE_CHECK(t)	TREE_CHECK (t, OMP_CLAUSE)
-#define TRANSACTION_EXPR_CHECK(t)	TREE_CHECK (t, TRANSACTION_EXPR)
-#define REDUC_MAX_EXPR_CHECK(t)	TREE_CHECK (t, REDUC_MAX_EXPR)
-#define REDUC_MIN_EXPR_CHECK(t)	TREE_CHECK (t, REDUC_MIN_EXPR)
-#define REDUC_PLUS_EXPR_CHECK(t)	TREE_CHECK (t, REDUC_PLUS_EXPR)
-#define DOT_PROD_EXPR_CHECK(t)	TREE_CHECK (t, DOT_PROD_EXPR)
-#define WIDEN_SUM_EXPR_CHECK(t)	TREE_CHECK (t, WIDEN_SUM_EXPR)
-#define WIDEN_MULT_EXPR_CHECK(t)	TREE_CHECK (t, WIDEN_MULT_EXPR)
-#define WIDEN_MULT_PLUS_EXPR_CHECK(t)	TREE_CHECK (t, WIDEN_MULT_PLUS_EXPR)
-#define WIDEN_MULT_MINUS_EXPR_CHECK(t)	TREE_CHECK (t, WIDEN_MULT_MINUS_EXPR)
-#define WIDEN_LSHIFT_EXPR_CHECK(t)	TREE_CHECK (t, WIDEN_LSHIFT_EXPR)
-#define FMA_EXPR_CHECK(t)	TREE_CHECK (t, FMA_EXPR)
-#define VEC_LSHIFT_EXPR_CHECK(t)	TREE_CHECK (t, VEC_LSHIFT_EXPR)
-#define VEC_RSHIFT_EXPR_CHECK(t)	TREE_CHECK (t, VEC_RSHIFT_EXPR)
-#define VEC_WIDEN_MULT_HI_EXPR_CHECK(t)	TREE_CHECK (t, VEC_WIDEN_MULT_HI_EXPR)
-#define VEC_WIDEN_MULT_LO_EXPR_CHECK(t)	TREE_CHECK (t, VEC_WIDEN_MULT_LO_EXPR)
-#define VEC_WIDEN_MULT_EVEN_EXPR_CHECK(t)	TREE_CHECK (t, VEC_WIDEN_MULT_EVEN_EXPR)
-#define VEC_WIDEN_MULT_ODD_EXPR_CHECK(t)	TREE_CHECK (t, VEC_WIDEN_MULT_ODD_EXPR)
-#define VEC_UNPACK_HI_EXPR_CHECK(t)	TREE_CHECK (t, VEC_UNPACK_HI_EXPR)
-#define VEC_UNPACK_LO_EXPR_CHECK(t)	TREE_CHECK (t, VEC_UNPACK_LO_EXPR)
-#define VEC_UNPACK_FLOAT_HI_EXPR_CHECK(t)	TREE_CHECK (t, VEC_UNPACK_FLOAT_HI_EXPR)
-#define VEC_UNPACK_FLOAT_LO_EXPR_CHECK(t)	TREE_CHECK (t, VEC_UNPACK_FLOAT_LO_EXPR)
-#define VEC_PACK_TRUNC_EXPR_CHECK(t)	TREE_CHECK (t, VEC_PACK_TRUNC_EXPR)
-#define VEC_PACK_SAT_EXPR_CHECK(t)	TREE_CHECK (t, VEC_PACK_SAT_EXPR)
-#define VEC_PACK_FIX_TRUNC_EXPR_CHECK(t)	TREE_CHECK (t, VEC_PACK_FIX_TRUNC_EXPR)
-#define VEC_WIDEN_LSHIFT_HI_EXPR_CHECK(t)	TREE_CHECK (t, VEC_WIDEN_LSHIFT_HI_EXPR)
-#define VEC_WIDEN_LSHIFT_LO_EXPR_CHECK(t)	TREE_CHECK (t, VEC_WIDEN_LSHIFT_LO_EXPR)
-#define PREDICT_EXPR_CHECK(t)	TREE_CHECK (t, PREDICT_EXPR)
-#define OPTIMIZATION_NODE_CHECK(t)	TREE_CHECK (t, OPTIMIZATION_NODE)
-#define TARGET_OPTION_NODE_CHECK(t)	TREE_CHECK (t, TARGET_OPTION_NODE)
-#define ANNOTATE_EXPR_CHECK(t)	TREE_CHECK (t, ANNOTATE_EXPR)
-#define CILK_SPAWN_STMT_CHECK(t)	TREE_CHECK (t, CILK_SPAWN_STMT)
-#define CILK_SYNC_STMT_CHECK(t)	TREE_CHECK (t, CILK_SYNC_STMT)
-#define C_MAYBE_CONST_EXPR_CHECK(t)	TREE_CHECK (t, C_MAYBE_CONST_EXPR)
-#define EXCESS_PRECISION_EXPR_CHECK(t)	TREE_CHECK (t, EXCESS_PRECISION_EXPR)
-#define USERDEF_LITERAL_CHECK(t)	TREE_CHECK (t, USERDEF_LITERAL)
-#define SIZEOF_EXPR_CHECK(t)	TREE_CHECK (t, SIZEOF_EXPR)
-#define ARRAY_NOTATION_REF_CHECK(t)	TREE_CHECK (t, ARRAY_NOTATION_REF)
-#define UNCONSTRAINED_ARRAY_TYPE_CHECK(t)	TREE_CHECK (t, UNCONSTRAINED_ARRAY_TYPE)
-#define UNCONSTRAINED_ARRAY_REF_CHECK(t)	TREE_CHECK (t, UNCONSTRAINED_ARRAY_REF)
-#define NULL_EXPR_CHECK(t)	TREE_CHECK (t, NULL_EXPR)
-#define PLUS_NOMOD_EXPR_CHECK(t)	TREE_CHECK (t, PLUS_NOMOD_EXPR)
-#define MINUS_NOMOD_EXPR_CHECK(t)	TREE_CHECK (t, MINUS_NOMOD_EXPR)
-#define ATTR_ADDR_EXPR_CHECK(t)	TREE_CHECK (t, ATTR_ADDR_EXPR)
-#define STMT_STMT_CHECK(t)	TREE_CHECK (t, STMT_STMT)
-#define LOOP_STMT_CHECK(t)	TREE_CHECK (t, LOOP_STMT)
-#define EXIT_STMT_CHECK(t)	TREE_CHECK (t, EXIT_STMT)
-#define OFFSET_REF_CHECK(t)	TREE_CHECK (t, OFFSET_REF)
-#define PTRMEM_CST_CHECK(t)	TREE_CHECK (t, PTRMEM_CST)
-#define NEW_EXPR_CHECK(t)	TREE_CHECK (t, NEW_EXPR)
-#define VEC_NEW_EXPR_CHECK(t)	TREE_CHECK (t, VEC_NEW_EXPR)
-#define DELETE_EXPR_CHECK(t)	TREE_CHECK (t, DELETE_EXPR)
-#define VEC_DELETE_EXPR_CHECK(t)	TREE_CHECK (t, VEC_DELETE_EXPR)
-#define SCOPE_REF_CHECK(t)	TREE_CHECK (t, SCOPE_REF)
-#define MEMBER_REF_CHECK(t)	TREE_CHECK (t, MEMBER_REF)
-#define TYPE_EXPR_CHECK(t)	TREE_CHECK (t, TYPE_EXPR)
-#define AGGR_INIT_EXPR_CHECK(t)	TREE_CHECK (t, AGGR_INIT_EXPR)
-#define VEC_INIT_EXPR_CHECK(t)	TREE_CHECK (t, VEC_INIT_EXPR)
-#define THROW_EXPR_CHECK(t)	TREE_CHECK (t, THROW_EXPR)
-#define EMPTY_CLASS_EXPR_CHECK(t)	TREE_CHECK (t, EMPTY_CLASS_EXPR)
-#define BASELINK_CHECK(t)	TREE_CHECK (t, BASELINK)
-#define TEMPLATE_DECL_CHECK(t)	TREE_CHECK (t, TEMPLATE_DECL)
-#define TEMPLATE_PARM_INDEX_CHECK(t)	TREE_CHECK (t, TEMPLATE_PARM_INDEX)
-#define TEMPLATE_TEMPLATE_PARM_CHECK(t)	TREE_CHECK (t, TEMPLATE_TEMPLATE_PARM)
-#define TEMPLATE_TYPE_PARM_CHECK(t)	TREE_CHECK (t, TEMPLATE_TYPE_PARM)
-#define TYPENAME_TYPE_CHECK(t)	TREE_CHECK (t, TYPENAME_TYPE)
-#define TYPEOF_TYPE_CHECK(t)	TREE_CHECK (t, TYPEOF_TYPE)
-#define BOUND_TEMPLATE_TEMPLATE_PARM_CHECK(t)	TREE_CHECK (t, BOUND_TEMPLATE_TEMPLATE_PARM)
-#define UNBOUND_CLASS_TEMPLATE_CHECK(t)	TREE_CHECK (t, UNBOUND_CLASS_TEMPLATE)
-#define USING_DECL_CHECK(t)	TREE_CHECK (t, USING_DECL)
-#define USING_STMT_CHECK(t)	TREE_CHECK (t, USING_STMT)
-#define DEFAULT_ARG_CHECK(t)	TREE_CHECK (t, DEFAULT_ARG)
-#define DEFERRED_NOEXCEPT_CHECK(t)	TREE_CHECK (t, DEFERRED_NOEXCEPT)
-#define TEMPLATE_ID_EXPR_CHECK(t)	TREE_CHECK (t, TEMPLATE_ID_EXPR)
-#define OVERLOAD_CHECK(t)	TREE_CHECK (t, OVERLOAD)
-#define PSEUDO_DTOR_EXPR_CHECK(t)	TREE_CHECK (t, PSEUDO_DTOR_EXPR)
-#define MODOP_EXPR_CHECK(t)	TREE_CHECK (t, MODOP_EXPR)
-#define CAST_EXPR_CHECK(t)	TREE_CHECK (t, CAST_EXPR)
-#define REINTERPRET_CAST_EXPR_CHECK(t)	TREE_CHECK (t, REINTERPRET_CAST_EXPR)
-#define CONST_CAST_EXPR_CHECK(t)	TREE_CHECK (t, CONST_CAST_EXPR)
-#define STATIC_CAST_EXPR_CHECK(t)	TREE_CHECK (t, STATIC_CAST_EXPR)
-#define DYNAMIC_CAST_EXPR_CHECK(t)	TREE_CHECK (t, DYNAMIC_CAST_EXPR)
-#define IMPLICIT_CONV_EXPR_CHECK(t)	TREE_CHECK (t, IMPLICIT_CONV_EXPR)
-#define DOTSTAR_EXPR_CHECK(t)	TREE_CHECK (t, DOTSTAR_EXPR)
-#define TYPEID_EXPR_CHECK(t)	TREE_CHECK (t, TYPEID_EXPR)
-#define NOEXCEPT_EXPR_CHECK(t)	TREE_CHECK (t, NOEXCEPT_EXPR)
-#define NON_DEPENDENT_EXPR_CHECK(t)	TREE_CHECK (t, NON_DEPENDENT_EXPR)
-#define CTOR_INITIALIZER_CHECK(t)	TREE_CHECK (t, CTOR_INITIALIZER)
-#define TRY_BLOCK_CHECK(t)	TREE_CHECK (t, TRY_BLOCK)
-#define EH_SPEC_BLOCK_CHECK(t)	TREE_CHECK (t, EH_SPEC_BLOCK)
-#define HANDLER_CHECK(t)	TREE_CHECK (t, HANDLER)
-#define MUST_NOT_THROW_EXPR_CHECK(t)	TREE_CHECK (t, MUST_NOT_THROW_EXPR)
-#define CLEANUP_STMT_CHECK(t)	TREE_CHECK (t, CLEANUP_STMT)
-#define IF_STMT_CHECK(t)	TREE_CHECK (t, IF_STMT)
-#define FOR_STMT_CHECK(t)	TREE_CHECK (t, FOR_STMT)
-#define RANGE_FOR_STMT_CHECK(t)	TREE_CHECK (t, RANGE_FOR_STMT)
-#define WHILE_STMT_CHECK(t)	TREE_CHECK (t, WHILE_STMT)
-#define DO_STMT_CHECK(t)	TREE_CHECK (t, DO_STMT)
-#define BREAK_STMT_CHECK(t)	TREE_CHECK (t, BREAK_STMT)
-#define CONTINUE_STMT_CHECK(t)	TREE_CHECK (t, CONTINUE_STMT)
-#define SWITCH_STMT_CHECK(t)	TREE_CHECK (t, SWITCH_STMT)
-#define EXPR_STMT_CHECK(t)	TREE_CHECK (t, EXPR_STMT)
-#define TAG_DEFN_CHECK(t)	TREE_CHECK (t, TAG_DEFN)
-#define OFFSETOF_EXPR_CHECK(t)	TREE_CHECK (t, OFFSETOF_EXPR)
-#define ARROW_EXPR_CHECK(t)	TREE_CHECK (t, ARROW_EXPR)
-#define ALIGNOF_EXPR_CHECK(t)	TREE_CHECK (t, ALIGNOF_EXPR)
-#define AT_ENCODE_EXPR_CHECK(t)	TREE_CHECK (t, AT_ENCODE_EXPR)
-#define STMT_EXPR_CHECK(t)	TREE_CHECK (t, STMT_EXPR)
-#define UNARY_PLUS_EXPR_CHECK(t)	TREE_CHECK (t, UNARY_PLUS_EXPR)
-#define STATIC_ASSERT_CHECK(t)	TREE_CHECK (t, STATIC_ASSERT)
-#define TYPE_ARGUMENT_PACK_CHECK(t)	TREE_CHECK (t, TYPE_ARGUMENT_PACK)
-#define NONTYPE_ARGUMENT_PACK_CHECK(t)	TREE_CHECK (t, NONTYPE_ARGUMENT_PACK)
-#define TYPE_PACK_EXPANSION_CHECK(t)	TREE_CHECK (t, TYPE_PACK_EXPANSION)
-#define EXPR_PACK_EXPANSION_CHECK(t)	TREE_CHECK (t, EXPR_PACK_EXPANSION)
-#define ARGUMENT_PACK_SELECT_CHECK(t)	TREE_CHECK (t, ARGUMENT_PACK_SELECT)
-#define TRAIT_EXPR_CHECK(t)	TREE_CHECK (t, TRAIT_EXPR)
-#define LAMBDA_EXPR_CHECK(t)	TREE_CHECK (t, LAMBDA_EXPR)
-#define DECLTYPE_TYPE_CHECK(t)	TREE_CHECK (t, DECLTYPE_TYPE)
-#define UNDERLYING_TYPE_CHECK(t)	TREE_CHECK (t, UNDERLYING_TYPE)
-#define BASES_CHECK(t)	TREE_CHECK (t, BASES)
-#define TEMPLATE_INFO_CHECK(t)	TREE_CHECK (t, TEMPLATE_INFO)
-#define URSHIFT_EXPR_CHECK(t)	TREE_CHECK (t, URSHIFT_EXPR)
-#define COMPARE_EXPR_CHECK(t)	TREE_CHECK (t, COMPARE_EXPR)
-#define COMPARE_L_EXPR_CHECK(t)	TREE_CHECK (t, COMPARE_L_EXPR)
-#define COMPARE_G_EXPR_CHECK(t)	TREE_CHECK (t, COMPARE_G_EXPR)
-#define CLASS_INTERFACE_TYPE_CHECK(t)	TREE_CHECK (t, CLASS_INTERFACE_TYPE)
-#define CLASS_IMPLEMENTATION_TYPE_CHECK(t)	TREE_CHECK (t, CLASS_IMPLEMENTATION_TYPE)
-#define CATEGORY_INTERFACE_TYPE_CHECK(t)	TREE_CHECK (t, CATEGORY_INTERFACE_TYPE)
-#define CATEGORY_IMPLEMENTATION_TYPE_CHECK(t)	TREE_CHECK (t, CATEGORY_IMPLEMENTATION_TYPE)
-#define PROTOCOL_INTERFACE_TYPE_CHECK(t)	TREE_CHECK (t, PROTOCOL_INTERFACE_TYPE)
-#define KEYWORD_DECL_CHECK(t)	TREE_CHECK (t, KEYWORD_DECL)
-#define INSTANCE_METHOD_DECL_CHECK(t)	TREE_CHECK (t, INSTANCE_METHOD_DECL)
-#define CLASS_METHOD_DECL_CHECK(t)	TREE_CHECK (t, CLASS_METHOD_DECL)
-#define PROPERTY_DECL_CHECK(t)	TREE_CHECK (t, PROPERTY_DECL)
-#define MESSAGE_SEND_EXPR_CHECK(t)	TREE_CHECK (t, MESSAGE_SEND_EXPR)
-#define CLASS_REFERENCE_EXPR_CHECK(t)	TREE_CHECK (t, CLASS_REFERENCE_EXPR)
-#define PROPERTY_REF_CHECK(t)	TREE_CHECK (t, PROPERTY_REF)
-
-#endif /* GCC_TREE_CHECK_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-core.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-core.h
deleted file mode 100644
index 40443d4..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-core.h
+++ /dev/null
@@ -1,1848 +0,0 @@
-/* Core data structures for the 'tree' type.
-   Copyright (C) 1989-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_CORE_H
-#define GCC_TREE_CORE_H
-
-#include "hashtab.h"
-#include "machmode.h"
-#include "input.h"
-#include "statistics.h"
-#include "vec.h"
-#include "double-int.h"
-#include "real.h"
-#include "fixed-value.h"
-#include "alias.h"
-#include "flags.h"
-#include "symtab.h"
-
-/* This file contains all the data structures that define the 'tree' type.
-   There are no accessor macros nor functions in this file. Only the
-   basic data structures, extern declarations and type definitions.  */
-
-/*---------------------------------------------------------------------------
-   Forward type declarations.  Mostly to avoid including unnecessary headers
----------------------------------------------------------------------------*/
-struct function;
-struct real_value;
-struct fixed_value;
-struct ptr_info_def;
-struct range_info_def;
-struct die_struct;
-struct pointer_set_t;
-
-
-/*---------------------------------------------------------------------------
-                              #defined constants
----------------------------------------------------------------------------*/
-/* Nonzero if this is a call to a function whose return value depends
-   solely on its arguments, has no side effects, and does not read
-   global memory.  This corresponds to TREE_READONLY for function
-   decls.  */
-#define ECF_CONST		  (1 << 0)
-
-/* Nonzero if this is a call to "pure" function (like const function,
-   but may read memory.  This corresponds to DECL_PURE_P for function
-   decls.  */
-#define ECF_PURE		  (1 << 1)
-
-/* Nonzero if this is ECF_CONST or ECF_PURE but cannot be proven to no
-   infinite loop.  This corresponds to DECL_LOOPING_CONST_OR_PURE_P
-   for function decls.*/
-#define ECF_LOOPING_CONST_OR_PURE (1 << 2)
-
-/* Nonzero if this call will never return.  */
-#define ECF_NORETURN		  (1 << 3)
-
-/* Nonzero if this is a call to malloc or a related function.  */
-#define ECF_MALLOC		  (1 << 4)
-
-/* Nonzero if it is plausible that this is a call to alloca.  */
-#define ECF_MAY_BE_ALLOCA	  (1 << 5)
-
-/* Nonzero if this is a call to a function that won't throw an exception.  */
-#define ECF_NOTHROW		  (1 << 6)
-
-/* Nonzero if this is a call to setjmp or a related function.  */
-#define ECF_RETURNS_TWICE	  (1 << 7)
-
-/* Nonzero if this call replaces the current stack frame.  */
-#define ECF_SIBCALL		  (1 << 8)
-
-/* Function does not read or write memory (but may have side effects, so
-   it does not necessarily fit ECF_CONST).  */
-#define ECF_NOVOPS		  (1 << 9)
-
-/* The function does not lead to calls within current function unit.  */
-#define ECF_LEAF		  (1 << 10)
-
-/* Nonzero if this call does not affect transactions.  */
-#define ECF_TM_PURE		  (1 << 11)
-
-/* Nonzero if this call is into the transaction runtime library.  */
-#define ECF_TM_BUILTIN		  (1 << 12)
-
-/* Call argument flags.  */
-/* Nonzero if the argument is not dereferenced recursively, thus only
-   directly reachable memory is read or written.  */
-#define EAF_DIRECT		(1 << 0)
-
-/* Nonzero if memory reached by the argument is not clobbered.  */
-#define EAF_NOCLOBBER		(1 << 1)
-
-/* Nonzero if the argument does not escape.  */
-#define EAF_NOESCAPE		(1 << 2)
-
-/* Nonzero if the argument is not used by the function.  */
-#define EAF_UNUSED		(1 << 3)
-
-/* Call return flags.  */
-/* Mask for the argument number that is returned.  Lower two bits of
-   the return flags, encodes argument slots zero to three.  */
-#define ERF_RETURN_ARG_MASK	(3)
-
-/* Nonzero if the return value is equal to the argument number
-   flags & ERF_RETURN_ARG_MASK.  */
-#define ERF_RETURNS_ARG		(1 << 2)
-
-/* Nonzero if the return value does not alias with anything.  Functions
-   with the malloc attribute have this set on their return value.  */
-#define ERF_NOALIAS		(1 << 3)
-
-
-/*---------------------------------------------------------------------------
-                                  Enumerations
----------------------------------------------------------------------------*/
-/* Codes of tree nodes.  */
-#define DEFTREECODE(SYM, STRING, TYPE, NARGS)   SYM,
-#define END_OF_BASE_TREE_CODES LAST_AND_UNUSED_TREE_CODE,
-
-enum tree_code {
-#include "all-tree.def"
-MAX_TREE_CODES
-};
-
-#undef DEFTREECODE
-#undef END_OF_BASE_TREE_CODES
-
-/* Number of language-independent tree codes.  */
-#define NUM_TREE_CODES \
-  ((int) LAST_AND_UNUSED_TREE_CODE)
-
-#define CODE_CONTAINS_STRUCT(CODE, STRUCT) \
-  (tree_contains_struct[(CODE)][(STRUCT)])
-
-
-/* Classify which part of the compiler has defined a given builtin function.
-   Note that we assume below that this is no more than two bits.  */
-enum built_in_class {
-  NOT_BUILT_IN = 0,
-  BUILT_IN_FRONTEND,
-  BUILT_IN_MD,
-  BUILT_IN_NORMAL
-};
-
-/* Last marker used for LTO stremaing of built_in_class.  We can not add it
-   to the enum since we need the enumb to fit in 2 bits.  */
-#define BUILT_IN_LAST (BUILT_IN_NORMAL + 1)
-
-/* Codes that identify the various built in functions
-   so that expand_call can identify them quickly.  */
-#define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA, AT, IM, COND) ENUM,
-enum built_in_function {
-#include "builtins.def"
-
-  /* Complex division routines in libgcc.  These are done via builtins
-     because emit_library_call_value can't handle complex values.  */
-  BUILT_IN_COMPLEX_MUL_MIN,
-  BUILT_IN_COMPLEX_MUL_MAX
-    = BUILT_IN_COMPLEX_MUL_MIN
-      + MAX_MODE_COMPLEX_FLOAT
-      - MIN_MODE_COMPLEX_FLOAT,
-
-  BUILT_IN_COMPLEX_DIV_MIN,
-  BUILT_IN_COMPLEX_DIV_MAX
-    = BUILT_IN_COMPLEX_DIV_MIN
-      + MAX_MODE_COMPLEX_FLOAT
-      - MIN_MODE_COMPLEX_FLOAT,
-
-  /* Upper bound on non-language-specific builtins.  */
-  END_BUILTINS
-};
-#undef DEF_BUILTIN
-
-/* Tree code classes.  Each tree_code has an associated code class
-   represented by a TREE_CODE_CLASS.  */
-enum tree_code_class {
-  tcc_exceptional, /* An exceptional code (fits no category).  */
-  tcc_constant,    /* A constant.  */
-  /* Order of tcc_type and tcc_declaration is important.  */
-  tcc_type,        /* A type object code.  */
-  tcc_declaration, /* A declaration (also serving as variable refs).  */
-  tcc_reference,   /* A reference to storage.  */
-  tcc_comparison,  /* A comparison expression.  */
-  tcc_unary,       /* A unary arithmetic expression.  */
-  tcc_binary,      /* A binary arithmetic expression.  */
-  tcc_statement,   /* A statement expression, which have side effects
-		      but usually no interesting value.  */
-  tcc_vl_exp,      /* A function call or other expression with a
-		      variable-length operand vector.  */
-  tcc_expression   /* Any other expression.  */
-};
-
-/* OMP_CLAUSE codes.  Do not reorder, as this is used to index into
-   the tables omp_clause_num_ops and omp_clause_code_name.  */
-enum omp_clause_code {
-  /* Clause zero is special-cased inside the parser
-     (c_parser_omp_variable_list).  */
-  OMP_CLAUSE_ERROR = 0,
-
-  /* OpenMP clause: private (variable_list).  */
-  OMP_CLAUSE_PRIVATE,
-
-  /* OpenMP clause: shared (variable_list).  */
-  OMP_CLAUSE_SHARED,
-
-  /* OpenMP clause: firstprivate (variable_list).  */
-  OMP_CLAUSE_FIRSTPRIVATE,
-
-  /* OpenMP clause: lastprivate (variable_list).  */
-  OMP_CLAUSE_LASTPRIVATE,
-
-  /* OpenMP clause: reduction (operator:variable_list).
-     OMP_CLAUSE_REDUCTION_CODE: The tree_code of the operator.
-     Operand 1: OMP_CLAUSE_REDUCTION_INIT: Stmt-list to initialize the var.
-     Operand 2: OMP_CLAUSE_REDUCTION_MERGE: Stmt-list to merge private var
-                into the shared one.
-     Operand 3: OMP_CLAUSE_REDUCTION_PLACEHOLDER: A dummy VAR_DECL
-                placeholder used in OMP_CLAUSE_REDUCTION_{INIT,MERGE}.  */
-  OMP_CLAUSE_REDUCTION,
-
-  /* OpenMP clause: copyin (variable_list).  */
-  OMP_CLAUSE_COPYIN,
-
-  /* OpenMP clause: copyprivate (variable_list).  */
-  OMP_CLAUSE_COPYPRIVATE,
-
-  /* OpenMP clause: linear (variable-list[:linear-step]).  */
-  OMP_CLAUSE_LINEAR,
-
-  /* OpenMP clause: aligned (variable-list[:alignment]).  */
-  OMP_CLAUSE_ALIGNED,
-
-  /* OpenMP clause: depend ({in,out,inout}:variable-list).  */
-  OMP_CLAUSE_DEPEND,
-
-  /* OpenMP clause: uniform (argument-list).  */
-  OMP_CLAUSE_UNIFORM,
-
-  /* OpenMP clause: from (variable-list).  */
-  OMP_CLAUSE_FROM,
-
-  /* OpenMP clause: to (variable-list).  */
-  OMP_CLAUSE_TO,
-
-  /* OpenMP clause: map ({alloc:,to:,from:,tofrom:,}variable-list).  */
-  OMP_CLAUSE_MAP,
-
-  /* Internal clause: temporary for combined loops expansion.  */
-  OMP_CLAUSE__LOOPTEMP_,
-
-  /* OpenMP clause: if (scalar-expression).  */
-  OMP_CLAUSE_IF,
-
-  /* OpenMP clause: num_threads (integer-expression).  */
-  OMP_CLAUSE_NUM_THREADS,
-
-  /* OpenMP clause: schedule.  */
-  OMP_CLAUSE_SCHEDULE,
-
-  /* OpenMP clause: nowait.  */
-  OMP_CLAUSE_NOWAIT,
-
-  /* OpenMP clause: ordered.  */
-  OMP_CLAUSE_ORDERED,
-
-  /* OpenMP clause: default.  */
-  OMP_CLAUSE_DEFAULT,
-
-  /* OpenMP clause: collapse (constant-integer-expression).  */
-  OMP_CLAUSE_COLLAPSE,
-
-  /* OpenMP clause: untied.  */
-  OMP_CLAUSE_UNTIED,
-
-  /* OpenMP clause: final (scalar-expression).  */
-  OMP_CLAUSE_FINAL,
-
-  /* OpenMP clause: mergeable.  */
-  OMP_CLAUSE_MERGEABLE,
-
-  /* OpenMP clause: device (integer-expression).  */
-  OMP_CLAUSE_DEVICE,
-
-  /* OpenMP clause: dist_schedule (static[:chunk-size]).  */
-  OMP_CLAUSE_DIST_SCHEDULE,
-
-  /* OpenMP clause: inbranch.  */
-  OMP_CLAUSE_INBRANCH,
-
-  /* OpenMP clause: notinbranch.  */
-  OMP_CLAUSE_NOTINBRANCH,
-
-  /* OpenMP clause: num_teams(integer-expression).  */
-  OMP_CLAUSE_NUM_TEAMS,
-
-  /* OpenMP clause: thread_limit(integer-expression).  */
-  OMP_CLAUSE_THREAD_LIMIT,
-
-  /* OpenMP clause: proc_bind ({master,close,spread}).  */
-  OMP_CLAUSE_PROC_BIND,
-
-  /* OpenMP clause: safelen (constant-integer-expression).  */
-  OMP_CLAUSE_SAFELEN,
-
-  /* OpenMP clause: simdlen (constant-integer-expression).  */
-  OMP_CLAUSE_SIMDLEN,
-
-  /* OpenMP clause: for.  */
-  OMP_CLAUSE_FOR,
-
-  /* OpenMP clause: parallel.  */
-  OMP_CLAUSE_PARALLEL,
-
-  /* OpenMP clause: sections.  */
-  OMP_CLAUSE_SECTIONS,
-
-  /* OpenMP clause: taskgroup.  */
-  OMP_CLAUSE_TASKGROUP,
-
-  /* Internally used only clause, holding SIMD uid.  */
-  OMP_CLAUSE__SIMDUID_
-};
-
-#undef DEFTREESTRUCT
-#define DEFTREESTRUCT(ENUM, NAME) ENUM,
-enum tree_node_structure_enum {
-#include "treestruct.def"
-  LAST_TS_ENUM
-};
-#undef DEFTREESTRUCT
-
-enum omp_clause_schedule_kind {
-  OMP_CLAUSE_SCHEDULE_STATIC,
-  OMP_CLAUSE_SCHEDULE_DYNAMIC,
-  OMP_CLAUSE_SCHEDULE_GUIDED,
-  OMP_CLAUSE_SCHEDULE_AUTO,
-  OMP_CLAUSE_SCHEDULE_RUNTIME,
-  OMP_CLAUSE_SCHEDULE_LAST
-};
-
-enum omp_clause_default_kind {
-  OMP_CLAUSE_DEFAULT_UNSPECIFIED,
-  OMP_CLAUSE_DEFAULT_SHARED,
-  OMP_CLAUSE_DEFAULT_NONE,
-  OMP_CLAUSE_DEFAULT_PRIVATE,
-  OMP_CLAUSE_DEFAULT_FIRSTPRIVATE,
-  OMP_CLAUSE_DEFAULT_LAST
-};
-
-/* There is a TYPE_QUAL value for each type qualifier.  They can be
-   combined by bitwise-or to form the complete set of qualifiers for a
-   type.  */
-enum cv_qualifier {
-  TYPE_UNQUALIFIED   = 0x0,
-  TYPE_QUAL_CONST    = 0x1,
-  TYPE_QUAL_VOLATILE = 0x2,
-  TYPE_QUAL_RESTRICT = 0x4,
-  TYPE_QUAL_ATOMIC   = 0x8
-};
-
-/* Enumerate visibility settings.  */
-#ifndef SYMBOL_VISIBILITY_DEFINED
-#define SYMBOL_VISIBILITY_DEFINED
-enum symbol_visibility {
-  VISIBILITY_DEFAULT,
-  VISIBILITY_PROTECTED,
-  VISIBILITY_HIDDEN,
-  VISIBILITY_INTERNAL
-};
-#endif  // SYMBOL_VISIBILITY_DEFINED
-
-/* Standard named or nameless data types of the C compiler.  */
-enum tree_index {
-  TI_ERROR_MARK,
-  TI_INTQI_TYPE,
-  TI_INTHI_TYPE,
-  TI_INTSI_TYPE,
-  TI_INTDI_TYPE,
-  TI_INTTI_TYPE,
-
-  TI_UINTQI_TYPE,
-  TI_UINTHI_TYPE,
-  TI_UINTSI_TYPE,
-  TI_UINTDI_TYPE,
-  TI_UINTTI_TYPE,
-
-  TI_ATOMICQI_TYPE,
-  TI_ATOMICHI_TYPE,
-  TI_ATOMICSI_TYPE,
-  TI_ATOMICDI_TYPE,
-  TI_ATOMICTI_TYPE,
-
-  TI_UINT16_TYPE,
-  TI_UINT32_TYPE,
-  TI_UINT64_TYPE,
-
-  TI_INTEGER_ZERO,
-  TI_INTEGER_ONE,
-  TI_INTEGER_THREE,
-  TI_INTEGER_MINUS_ONE,
-  TI_NULL_POINTER,
-
-  TI_SIZE_ZERO,
-  TI_SIZE_ONE,
-
-  TI_BITSIZE_ZERO,
-  TI_BITSIZE_ONE,
-  TI_BITSIZE_UNIT,
-
-  TI_PUBLIC,
-  TI_PROTECTED,
-  TI_PRIVATE,
-
-  TI_BOOLEAN_FALSE,
-  TI_BOOLEAN_TRUE,
-
-  TI_COMPLEX_INTEGER_TYPE,
-  TI_COMPLEX_FLOAT_TYPE,
-  TI_COMPLEX_DOUBLE_TYPE,
-  TI_COMPLEX_LONG_DOUBLE_TYPE,
-
-  TI_FLOAT_TYPE,
-  TI_DOUBLE_TYPE,
-  TI_LONG_DOUBLE_TYPE,
-
-  TI_FLOAT_PTR_TYPE,
-  TI_DOUBLE_PTR_TYPE,
-  TI_LONG_DOUBLE_PTR_TYPE,
-  TI_INTEGER_PTR_TYPE,
-
-  TI_VOID_TYPE,
-  TI_PTR_TYPE,
-  TI_CONST_PTR_TYPE,
-  TI_SIZE_TYPE,
-  TI_PID_TYPE,
-  TI_PTRDIFF_TYPE,
-  TI_VA_LIST_TYPE,
-  TI_VA_LIST_GPR_COUNTER_FIELD,
-  TI_VA_LIST_FPR_COUNTER_FIELD,
-  TI_BOOLEAN_TYPE,
-  TI_FILEPTR_TYPE,
-  TI_POINTER_SIZED_TYPE,
-
-  TI_DFLOAT32_TYPE,
-  TI_DFLOAT64_TYPE,
-  TI_DFLOAT128_TYPE,
-  TI_DFLOAT32_PTR_TYPE,
-  TI_DFLOAT64_PTR_TYPE,
-  TI_DFLOAT128_PTR_TYPE,
-
-  TI_VOID_LIST_NODE,
-
-  TI_MAIN_IDENTIFIER,
-
-  TI_SAT_SFRACT_TYPE,
-  TI_SAT_FRACT_TYPE,
-  TI_SAT_LFRACT_TYPE,
-  TI_SAT_LLFRACT_TYPE,
-  TI_SAT_USFRACT_TYPE,
-  TI_SAT_UFRACT_TYPE,
-  TI_SAT_ULFRACT_TYPE,
-  TI_SAT_ULLFRACT_TYPE,
-  TI_SFRACT_TYPE,
-  TI_FRACT_TYPE,
-  TI_LFRACT_TYPE,
-  TI_LLFRACT_TYPE,
-  TI_USFRACT_TYPE,
-  TI_UFRACT_TYPE,
-  TI_ULFRACT_TYPE,
-  TI_ULLFRACT_TYPE,
-  TI_SAT_SACCUM_TYPE,
-  TI_SAT_ACCUM_TYPE,
-  TI_SAT_LACCUM_TYPE,
-  TI_SAT_LLACCUM_TYPE,
-  TI_SAT_USACCUM_TYPE,
-  TI_SAT_UACCUM_TYPE,
-  TI_SAT_ULACCUM_TYPE,
-  TI_SAT_ULLACCUM_TYPE,
-  TI_SACCUM_TYPE,
-  TI_ACCUM_TYPE,
-  TI_LACCUM_TYPE,
-  TI_LLACCUM_TYPE,
-  TI_USACCUM_TYPE,
-  TI_UACCUM_TYPE,
-  TI_ULACCUM_TYPE,
-  TI_ULLACCUM_TYPE,
-  TI_QQ_TYPE,
-  TI_HQ_TYPE,
-  TI_SQ_TYPE,
-  TI_DQ_TYPE,
-  TI_TQ_TYPE,
-  TI_UQQ_TYPE,
-  TI_UHQ_TYPE,
-  TI_USQ_TYPE,
-  TI_UDQ_TYPE,
-  TI_UTQ_TYPE,
-  TI_SAT_QQ_TYPE,
-  TI_SAT_HQ_TYPE,
-  TI_SAT_SQ_TYPE,
-  TI_SAT_DQ_TYPE,
-  TI_SAT_TQ_TYPE,
-  TI_SAT_UQQ_TYPE,
-  TI_SAT_UHQ_TYPE,
-  TI_SAT_USQ_TYPE,
-  TI_SAT_UDQ_TYPE,
-  TI_SAT_UTQ_TYPE,
-  TI_HA_TYPE,
-  TI_SA_TYPE,
-  TI_DA_TYPE,
-  TI_TA_TYPE,
-  TI_UHA_TYPE,
-  TI_USA_TYPE,
-  TI_UDA_TYPE,
-  TI_UTA_TYPE,
-  TI_SAT_HA_TYPE,
-  TI_SAT_SA_TYPE,
-  TI_SAT_DA_TYPE,
-  TI_SAT_TA_TYPE,
-  TI_SAT_UHA_TYPE,
-  TI_SAT_USA_TYPE,
-  TI_SAT_UDA_TYPE,
-  TI_SAT_UTA_TYPE,
-
-  TI_OPTIMIZATION_DEFAULT,
-  TI_OPTIMIZATION_CURRENT,
-  TI_TARGET_OPTION_DEFAULT,
-  TI_TARGET_OPTION_CURRENT,
-  TI_CURRENT_TARGET_PRAGMA,
-  TI_CURRENT_OPTIMIZE_PRAGMA,
-
-  TI_MAX
-};
-
-/* An enumeration of the standard C integer types.  These must be
-   ordered so that shorter types appear before longer ones, and so
-   that signed types appear before unsigned ones, for the correct
-   functioning of interpret_integer() in c-lex.c.  */
-enum integer_type_kind {
-  itk_char,
-  itk_signed_char,
-  itk_unsigned_char,
-  itk_short,
-  itk_unsigned_short,
-  itk_int,
-  itk_unsigned_int,
-  itk_long,
-  itk_unsigned_long,
-  itk_long_long,
-  itk_unsigned_long_long,
-  itk_int128,
-  itk_unsigned_int128,
-  itk_none
-};
-
-/* A pointer-to-function member type looks like:
-
-     struct {
-       __P __pfn;
-       ptrdiff_t __delta;
-     };
-
-   If __pfn is NULL, it is a NULL pointer-to-member-function.
-
-   (Because the vtable is always the first thing in the object, we
-   don't need its offset.)  If the function is virtual, then PFN is
-   one plus twice the index into the vtable; otherwise, it is just a
-   pointer to the function.
-
-   Unfortunately, using the lowest bit of PFN doesn't work in
-   architectures that don't impose alignment requirements on function
-   addresses, or that use the lowest bit to tell one ISA from another,
-   for example.  For such architectures, we use the lowest bit of
-   DELTA instead of the lowest bit of the PFN, and DELTA will be
-   multiplied by 2.  */
-enum ptrmemfunc_vbit_where_t {
-  ptrmemfunc_vbit_in_pfn,
-  ptrmemfunc_vbit_in_delta
-};
-
-/* Flags that may be passed in the third argument of decl_attributes, and
-   to handler functions for attributes.  */
-enum attribute_flags {
-  /* The type passed in is the type of a DECL, and any attributes that
-     should be passed in again to be applied to the DECL rather than the
-     type should be returned.  */
-  ATTR_FLAG_DECL_NEXT = 1,
-  /* The type passed in is a function return type, and any attributes that
-     should be passed in again to be applied to the function type rather
-     than the return type should be returned.  */
-  ATTR_FLAG_FUNCTION_NEXT = 2,
-  /* The type passed in is an array element type, and any attributes that
-     should be passed in again to be applied to the array type rather
-     than the element type should be returned.  */
-  ATTR_FLAG_ARRAY_NEXT = 4,
-  /* The type passed in is a structure, union or enumeration type being
-     created, and should be modified in place.  */
-  ATTR_FLAG_TYPE_IN_PLACE = 8,
-  /* The attributes are being applied by default to a library function whose
-     name indicates known behavior, and should be silently ignored if they
-     are not in fact compatible with the function type.  */
-  ATTR_FLAG_BUILT_IN = 16,
-  /* A given attribute has been parsed as a C++-11 attribute.  */
-  ATTR_FLAG_CXX11 = 32
-};
-
-/* Types used to represent sizes.  */
-enum size_type_kind {
-  stk_sizetype,		/* Normal representation of sizes in bytes.  */
-  stk_ssizetype,	/* Signed representation of sizes in bytes.  */
-  stk_bitsizetype,	/* Normal representation of sizes in bits.  */
-  stk_sbitsizetype,	/* Signed representation of sizes in bits.  */
-  stk_type_kind_last
-};
-
-enum operand_equal_flag {
-  OEP_ONLY_CONST = 1,
-  OEP_PURE_SAME = 2,
-  OEP_CONSTANT_ADDRESS_OF = 4
-};
-
-/* Enum and arrays used for tree allocation stats.
-   Keep in sync with tree.c:tree_node_kind_names.  */
-enum tree_node_kind {
-  d_kind,
-  t_kind,
-  b_kind,
-  s_kind,
-  r_kind,
-  e_kind,
-  c_kind,
-  id_kind,
-  vec_kind,
-  binfo_kind,
-  ssa_name_kind,
-  constr_kind,
-  x_kind,
-  lang_decl,
-  lang_type,
-  omp_clause_kind,
-  all_kinds
-};
-
-enum annot_expr_kind {
-  annot_expr_ivdep_kind
-};
-
-
-/*---------------------------------------------------------------------------
-                                Type definitions
----------------------------------------------------------------------------*/
-/* When processing aliases at the symbol table level, we need the
-   declaration of target. For this reason we need to queue aliases and
-   process them after all declarations has been produced.  */
-struct GTY(()) alias_pair {
-  tree decl;
-  tree target;
-};
-
-/* An initialization priority.  */
-typedef unsigned short priority_type;
-
-/* The type of a callback function for walking over tree structure.  */
-typedef tree (*walk_tree_fn) (tree *, int *, void *);
-
-/* The type of a callback function that represents a custom walk_tree.  */
-typedef tree (*walk_tree_lh) (tree *, int *, tree (*) (tree *, int *, void *),
-			      void *, struct pointer_set_t*);
-
-
-/*---------------------------------------------------------------------------
-                              Main data structures
----------------------------------------------------------------------------*/
-/* A tree node can represent a data type, a variable, an expression
-   or a statement.  Each node has a TREE_CODE which says what kind of
-   thing it represents.  Some common codes are:
-   INTEGER_TYPE -- represents a type of integers.
-   ARRAY_TYPE -- represents a type of pointer.
-   VAR_DECL -- represents a declared variable.
-   INTEGER_CST -- represents a constant integer value.
-   PLUS_EXPR -- represents a sum (an expression).
-
-   As for the contents of a tree node: there are some fields
-   that all nodes share.  Each TREE_CODE has various special-purpose
-   fields as well.  The fields of a node are never accessed directly,
-   always through accessor macros.  */
-
-/* Every kind of tree node starts with this structure,
-   so all nodes have these fields.
-
-   See the accessor macros, defined below, for documentation of the
-   fields, and the table below which connects the fields and the
-   accessor macros.  */
-
-struct GTY(()) tree_base {
-  ENUM_BITFIELD(tree_code) code : 16;
-
-  unsigned side_effects_flag : 1;
-  unsigned constant_flag : 1;
-  unsigned addressable_flag : 1;
-  unsigned volatile_flag : 1;
-  unsigned readonly_flag : 1;
-  unsigned asm_written_flag: 1;
-  unsigned nowarning_flag : 1;
-  unsigned visited : 1;
-
-  unsigned used_flag : 1;
-  unsigned nothrow_flag : 1;
-  unsigned static_flag : 1;
-  unsigned public_flag : 1;
-  unsigned private_flag : 1;
-  unsigned protected_flag : 1;
-  unsigned deprecated_flag : 1;
-  unsigned default_def_flag : 1;
-
-  union {
-    /* The bits in the following structure should only be used with
-       accessor macros that constrain inputs with tree checking.  */
-    struct {
-      unsigned lang_flag_0 : 1;
-      unsigned lang_flag_1 : 1;
-      unsigned lang_flag_2 : 1;
-      unsigned lang_flag_3 : 1;
-      unsigned lang_flag_4 : 1;
-      unsigned lang_flag_5 : 1;
-      unsigned lang_flag_6 : 1;
-      unsigned saturating_flag : 1;
-
-      unsigned unsigned_flag : 1;
-      unsigned packed_flag : 1;
-      unsigned user_align : 1;
-      unsigned nameless_flag : 1;
-      unsigned atomic_flag : 1;
-      unsigned spare0 : 3;
-
-      unsigned spare1 : 8;
-
-      /* This field is only used with TREE_TYPE nodes; the only reason it is
-	 present in tree_base instead of tree_type is to save space.  The size
-	 of the field must be large enough to hold addr_space_t values.  */
-      unsigned address_space : 8;
-    } bits;
-    /* The following fields are present in tree_base to save space.  The
-       nodes using them do not require any of the flags above and so can
-       make better use of the 4-byte sized word.  */
-    /* VEC length.  This field is only used with TREE_VEC.  */
-    int length;
-    /* SSA version number.  This field is only used with SSA_NAME.  */
-    unsigned int version;
-  } GTY((skip(""))) u;
-};
-
-/* The following table lists the uses of each of the above flags and
-   for which types of nodes they are defined.
-
-   addressable_flag:
-
-       TREE_ADDRESSABLE in
-           VAR_DECL, PARM_DECL, RESULT_DECL, FUNCTION_DECL, LABEL_DECL
-           SSA_NAME
-           all types
-           CONSTRUCTOR, IDENTIFIER_NODE
-           STMT_EXPR
-
-       CALL_EXPR_TAILCALL in
-           CALL_EXPR
-
-       CASE_LOW_SEEN in
-           CASE_LABEL_EXPR
-
-       PREDICT_EXPR_OUTCOME in
-	   PREDICT_EXPR
-
-   static_flag:
-
-       TREE_STATIC in
-           VAR_DECL, FUNCTION_DECL
-           CONSTRUCTOR
-
-       TREE_NO_TRAMPOLINE in
-           ADDR_EXPR
-
-       BINFO_VIRTUAL_P in
-           TREE_BINFO
-
-       TREE_SYMBOL_REFERENCED in
-           IDENTIFIER_NODE
-
-       CLEANUP_EH_ONLY in
-           TARGET_EXPR, WITH_CLEANUP_EXPR
-
-       TRY_CATCH_IS_CLEANUP in
-           TRY_CATCH_EXPR
-
-       ASM_INPUT_P in
-           ASM_EXPR
-
-       TYPE_REF_CAN_ALIAS_ALL in
-           POINTER_TYPE, REFERENCE_TYPE
-
-       CASE_HIGH_SEEN in
-           CASE_LABEL_EXPR
-
-       ENUM_IS_SCOPED in
-	   ENUMERAL_TYPE
-
-       TRANSACTION_EXPR_OUTER in
-	   TRANSACTION_EXPR
-
-       SSA_NAME_ANTI_RANGE_P in
-	   SSA_NAME
-
-   public_flag:
-
-       TREE_OVERFLOW in
-           INTEGER_CST, REAL_CST, COMPLEX_CST, VECTOR_CST
-
-       TREE_PUBLIC in
-           VAR_DECL, FUNCTION_DECL
-           IDENTIFIER_NODE
-
-       CONSTRUCTOR_NO_CLEARING in
-           CONSTRUCTOR
-
-       ASM_VOLATILE_P in
-           ASM_EXPR
-
-       CALL_EXPR_VA_ARG_PACK in
-           CALL_EXPR
-
-       TYPE_CACHED_VALUES_P in
-           all types
-
-       SAVE_EXPR_RESOLVED_P in
-           SAVE_EXPR
-
-       OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE in
-           OMP_CLAUSE_LASTPRIVATE
-
-       OMP_CLAUSE_PRIVATE_DEBUG in
-           OMP_CLAUSE_PRIVATE
-
-       OMP_CLAUSE_LINEAR_NO_COPYIN in
-	   OMP_CLAUSE_LINEAR
-
-       OMP_CLAUSE_MAP_ZERO_BIAS_ARRAY_SECTION in
-	   OMP_CLAUSE_MAP
-
-       OMP_CLAUSE_REDUCTION_OMP_ORIG_REF in
-	   OMP_CLAUSE_REDUCTION
-
-       TRANSACTION_EXPR_RELAXED in
-	   TRANSACTION_EXPR
-
-   private_flag:
-
-       TREE_PRIVATE in
-           all decls
-
-       CALL_EXPR_RETURN_SLOT_OPT in
-           CALL_EXPR
-
-       OMP_SECTION_LAST in
-           OMP_SECTION
-
-       OMP_PARALLEL_COMBINED in
-           OMP_PARALLEL
-
-       OMP_ATOMIC_SEQ_CST in
-	   OMP_ATOMIC*
-
-       OMP_CLAUSE_PRIVATE_OUTER_REF in
-	   OMP_CLAUSE_PRIVATE
-
-       OMP_CLAUSE_LINEAR_NO_COPYOUT in
-	   OMP_CLAUSE_LINEAR
-
-       TYPE_REF_IS_RVALUE in
-	   REFERENCE_TYPE
-
-       ENUM_IS_OPAQUE in
-	   ENUMERAL_TYPE
-
-   protected_flag:
-
-       TREE_PROTECTED in
-           BLOCK
-           all decls
-
-       CALL_FROM_THUNK_P and
-       CALL_ALLOCA_FOR_VAR_P in
-           CALL_EXPR
-
-       OMP_CLAUSE_LINEAR_VARIABLE_STRIDE in
-	   OMP_CLAUSE_LINEAR
-
-   side_effects_flag:
-
-       TREE_SIDE_EFFECTS in
-           all expressions
-           all decls
-           all constants
-
-       FORCED_LABEL in
-           LABEL_DECL
-
-   volatile_flag:
-
-       TREE_THIS_VOLATILE in
-           all expressions
-           all decls
-
-       TYPE_VOLATILE in
-           all types
-
-   readonly_flag:
-
-       TREE_READONLY in
-           all expressions
-           all decls
-
-       TYPE_READONLY in
-           all types
-
-   constant_flag:
-
-       TREE_CONSTANT in
-           all expressions
-           all decls
-           all constants
-
-       TYPE_SIZES_GIMPLIFIED in
-           all types
-
-   unsigned_flag:
-
-       TYPE_UNSIGNED in
-           all types
-
-       DECL_UNSIGNED in
-           all decls
-
-   asm_written_flag:
-
-       TREE_ASM_WRITTEN in
-           VAR_DECL, FUNCTION_DECL, TYPE_DECL
-           RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE
-           BLOCK, STRING_CST
-
-       SSA_NAME_OCCURS_IN_ABNORMAL_PHI in
-           SSA_NAME
-
-   used_flag:
-
-       TREE_USED in
-           all expressions
-           all decls
-           IDENTIFIER_NODE
-
-   nothrow_flag:
-
-       TREE_NOTHROW in
-           CALL_EXPR
-           FUNCTION_DECL
-
-       TYPE_ALIGN_OK in
-           all types
-
-       TREE_THIS_NOTRAP in
-          INDIRECT_REF, MEM_REF, TARGET_MEM_REF, ARRAY_REF, ARRAY_RANGE_REF
-
-       SSA_NAME_IN_FREELIST in
-          SSA_NAME
-
-       DECL_NONALIASED in
-	  VAR_DECL
-
-   deprecated_flag:
-
-       TREE_DEPRECATED in
-           all decls
-	   all types
-
-       IDENTIFIER_TRANSPARENT_ALIAS in
-           IDENTIFIER_NODE
-
-   visited:
-
-       TREE_VISITED in
-           all trees (used liberally by many passes)
-
-   saturating_flag:
-
-       TYPE_SATURATING in
-           all types
-
-       VAR_DECL_IS_VIRTUAL_OPERAND in
-	   VAR_DECL
-
-   nowarning_flag:
-
-       TREE_NO_WARNING in
-           all expressions
-           all decls
-
-       TYPE_ARTIFICIAL in
-           all types
-
-   default_def_flag:
-
-       TYPE_VECTOR_OPAQUE in
-	   VECTOR_TYPE
-
-       SSA_NAME_IS_DEFAULT_DEF in
-           SSA_NAME
-
-       DECL_NONLOCAL_FRAME in
-	   VAR_DECL
-
-       TYPE_FINAL_P in
-	   RECORD_TYPE, UNION_TYPE and QUAL_UNION_TYPE
-*/
-
-struct GTY(()) tree_typed {
-  struct tree_base base;
-  tree type;
-};
-
-struct GTY(()) tree_common {
-  struct tree_typed typed;
-  tree chain;
-};
-
-struct GTY(()) tree_int_cst {
-  struct tree_typed typed;
-  double_int int_cst;
-};
-
-
-struct GTY(()) tree_real_cst {
-  struct tree_typed typed;
-  struct real_value * real_cst_ptr;
-};
-
-struct GTY(()) tree_fixed_cst {
-  struct tree_typed typed;
-  struct fixed_value * fixed_cst_ptr;
-};
-
-struct GTY(()) tree_string {
-  struct tree_typed typed;
-  int length;
-  char str[1];
-};
-
-struct GTY(()) tree_complex {
-  struct tree_typed typed;
-  tree real;
-  tree imag;
-};
-
-struct GTY(()) tree_vector {
-  struct tree_typed typed;
-  tree GTY ((length ("TYPE_VECTOR_SUBPARTS (TREE_TYPE ((tree)&%h))"))) elts[1];
-};
-
-struct GTY(()) tree_identifier {
-  struct tree_common common;
-  struct ht_identifier id;
-};
-
-struct GTY(()) tree_list {
-  struct tree_common common;
-  tree purpose;
-  tree value;
-};
-
-struct GTY(()) tree_vec {
-  struct tree_common common;
-  tree GTY ((length ("TREE_VEC_LENGTH ((tree)&%h)"))) a[1];
-};
-
-/* A single element of a CONSTRUCTOR. VALUE holds the actual value of the
-   element. INDEX can optionally design the position of VALUE: in arrays,
-   it is the index where VALUE has to be placed; in structures, it is the
-   FIELD_DECL of the member.  */
-struct GTY(()) constructor_elt {
-  tree index;
-  tree value;
-};
-
-struct GTY(()) tree_constructor {
-  struct tree_typed typed;
-  vec<constructor_elt, va_gc> *elts;
-};
-
-enum omp_clause_depend_kind
-{
-  OMP_CLAUSE_DEPEND_IN,
-  OMP_CLAUSE_DEPEND_OUT,
-  OMP_CLAUSE_DEPEND_INOUT,
-  OMP_CLAUSE_DEPEND_LAST
-};
-
-enum omp_clause_map_kind
-{
-  OMP_CLAUSE_MAP_ALLOC,
-  OMP_CLAUSE_MAP_TO,
-  OMP_CLAUSE_MAP_FROM,
-  OMP_CLAUSE_MAP_TOFROM,
-  /* The following kind is an internal only map kind, used for pointer based
-     array sections.  OMP_CLAUSE_SIZE for these is not the pointer size,
-     which is implicitly POINTER_SIZE / BITS_PER_UNIT, but the bias.  */
-  OMP_CLAUSE_MAP_POINTER,
-  /* Also internal, behaves like OMP_CLAUS_MAP_TO, but additionally any
-     OMP_CLAUSE_MAP_POINTER records consecutive after it which have addresses
-     falling into that range will not be ignored if OMP_CLAUSE_MAP_TO_PSET
-     wasn't mapped already.  */
-  OMP_CLAUSE_MAP_TO_PSET,
-  OMP_CLAUSE_MAP_LAST
-};
-
-enum omp_clause_proc_bind_kind
-{
-  /* Numbers should match omp_proc_bind_t enum in omp.h.  */
-  OMP_CLAUSE_PROC_BIND_FALSE = 0,
-  OMP_CLAUSE_PROC_BIND_TRUE = 1,
-  OMP_CLAUSE_PROC_BIND_MASTER = 2,
-  OMP_CLAUSE_PROC_BIND_CLOSE = 3,
-  OMP_CLAUSE_PROC_BIND_SPREAD = 4,
-  OMP_CLAUSE_PROC_BIND_LAST
-};
-
-struct GTY(()) tree_exp {
-  struct tree_typed typed;
-  location_t locus;
-  tree GTY ((special ("tree_exp"),
-	     desc ("TREE_CODE ((tree) &%0)")))
-    operands[1];
-};
-
-/* Immediate use linking structure.  This structure is used for maintaining
-   a doubly linked list of uses of an SSA_NAME.  */
-struct GTY(()) ssa_use_operand_t {
-  struct ssa_use_operand_t* GTY((skip(""))) prev;
-  struct ssa_use_operand_t* GTY((skip(""))) next;
-  /* Immediate uses for a given SSA name are maintained as a cyclic
-     list.  To recognize the root of this list, the location field
-     needs to point to the original SSA name.  Since statements and
-     SSA names are of different data types, we need this union.  See
-     the explanation in struct imm_use_iterator.  */
-  union { gimple stmt; tree ssa_name; } GTY((skip(""))) loc;
-  tree *GTY((skip(""))) use;
-};
-
-struct GTY(()) tree_ssa_name {
-  struct tree_typed typed;
-
-  /* _DECL wrapped by this SSA name.  */
-  tree var;
-
-  /* Statement that defines this SSA name.  */
-  gimple def_stmt;
-
-  /* Value range information.  */
-  union ssa_name_info_type {
-    /* Pointer attributes used for alias analysis.  */
-    struct GTY ((tag ("0"))) ptr_info_def *ptr_info;
-    /* Value range attributes used for zero/sign extension elimination.  */
-    struct GTY ((tag ("1"))) range_info_def *range_info;
-  } GTY ((desc ("%1.typed.type ?" \
-		"!POINTER_TYPE_P (TREE_TYPE ((tree)&%1)) : 2"))) info;
-
-  /* Immediate uses list for this SSA_NAME.  */
-  struct ssa_use_operand_t imm_uses;
-};
-
-struct GTY(()) phi_arg_d {
-  /* imm_use MUST be the first element in struct because we do some
-     pointer arithmetic with it.  See phi_arg_index_from_use.  */
-  struct ssa_use_operand_t imm_use;
-  tree def;
-  location_t locus;
-};
-
-struct GTY(()) tree_omp_clause {
-  struct tree_common common;
-  location_t locus;
-  enum omp_clause_code code;
-  union omp_clause_subcode {
-    enum omp_clause_default_kind   default_kind;
-    enum omp_clause_schedule_kind  schedule_kind;
-    enum omp_clause_depend_kind    depend_kind;
-    enum omp_clause_map_kind       map_kind;
-    enum omp_clause_proc_bind_kind proc_bind_kind;
-    enum tree_code                 reduction_code;
-  } GTY ((skip)) subcode;
-
-  /* The gimplification of OMP_CLAUSE_REDUCTION_{INIT,MERGE} for omp-low's
-     usage.  */
-  gimple_seq gimple_reduction_init;
-  gimple_seq gimple_reduction_merge;
-
-  tree GTY ((length ("omp_clause_num_ops[OMP_CLAUSE_CODE ((tree)&%h)]")))
-    ops[1];
-};
-
-struct GTY(()) tree_block {
-  struct tree_base base;
-  tree chain;
-
-  unsigned abstract_flag : 1;
-  unsigned block_num : 31;
-
-  location_t locus;
-
-  tree vars;
-  vec<tree, va_gc> *nonlocalized_vars;
-
-  tree subblocks;
-  tree supercontext;
-  tree abstract_origin;
-  tree fragment_origin;
-  tree fragment_chain;
-};
-
-struct GTY(()) tree_type_common {
-  struct tree_common common;
-  tree size;
-  tree size_unit;
-  tree attributes;
-  unsigned int uid;
-
-  unsigned int precision : 10;
-  unsigned no_force_blk_flag : 1;
-  unsigned needs_constructing_flag : 1;
-  unsigned transparent_aggr_flag : 1;
-  unsigned restrict_flag : 1;
-  unsigned contains_placeholder_bits : 2;
-
-  ENUM_BITFIELD(machine_mode) mode : 8;
-
-  unsigned string_flag : 1;
-  unsigned lang_flag_0 : 1;
-  unsigned lang_flag_1 : 1;
-  unsigned lang_flag_2 : 1;
-  unsigned lang_flag_3 : 1;
-  unsigned lang_flag_4 : 1;
-  unsigned lang_flag_5 : 1;
-  unsigned lang_flag_6 : 1;
-
-  unsigned int align;
-  alias_set_type alias_set;
-  tree pointer_to;
-  tree reference_to;
-  union tree_type_symtab {
-    int GTY ((tag ("TYPE_SYMTAB_IS_ADDRESS"))) address;
-    const char * GTY ((tag ("TYPE_SYMTAB_IS_POINTER"))) pointer;
-    struct die_struct * GTY ((tag ("TYPE_SYMTAB_IS_DIE"))) die;
-  } GTY ((desc ("debug_hooks->tree_type_symtab_field"))) symtab;
-  tree canonical;
-  tree next_variant;
-  tree main_variant;
-  tree context;
-  tree name;
-};
-
-struct GTY(()) tree_type_with_lang_specific {
-  struct tree_type_common common;
-  /* Points to a structure whose details depend on the language in use.  */
-  struct lang_type *lang_specific;
-};
-
-struct GTY(()) tree_type_non_common {
-  struct tree_type_with_lang_specific with_lang_specific;
-  tree values;
-  tree minval;
-  tree maxval;
-  tree binfo;
-};
-
-struct GTY (()) tree_binfo {
-  struct tree_common common;
-
-  tree offset;
-  tree vtable;
-  tree virtuals;
-  tree vptr_field;
-  vec<tree, va_gc> *base_accesses;
-  tree inheritance;
-
-  tree vtt_subvtt;
-  tree vtt_vptr;
-
-  vec<tree, va_gc> base_binfos;
-};
-
-struct GTY(()) tree_decl_minimal {
-  struct tree_common common;
-  location_t locus;
-  unsigned int uid;
-  tree name;
-  tree context;
-};
-
-struct GTY(()) tree_decl_common {
-  struct tree_decl_minimal common;
-  tree size;
-
-  ENUM_BITFIELD(machine_mode) mode : 8;
-
-  unsigned nonlocal_flag : 1;
-  unsigned virtual_flag : 1;
-  unsigned ignored_flag : 1;
-  unsigned abstract_flag : 1;
-  unsigned artificial_flag : 1;
-  unsigned preserve_flag: 1;
-  unsigned debug_expr_is_from : 1;
-
-  unsigned lang_flag_0 : 1;
-  unsigned lang_flag_1 : 1;
-  unsigned lang_flag_2 : 1;
-  unsigned lang_flag_3 : 1;
-  unsigned lang_flag_4 : 1;
-  unsigned lang_flag_5 : 1;
-  unsigned lang_flag_6 : 1;
-  unsigned lang_flag_7 : 1;
-  unsigned lang_flag_8 : 1;
-
-  /* In VAR_DECL and PARM_DECL, this is DECL_REGISTER.  */
-  unsigned decl_flag_0 : 1;
-  /* In FIELD_DECL, this is DECL_BIT_FIELD
-     In VAR_DECL and FUNCTION_DECL, this is DECL_EXTERNAL.
-     In TYPE_DECL, this is TYPE_DECL_SUPPRESS_DEBUG.  */
-  unsigned decl_flag_1 : 1;
-  /* In FIELD_DECL, this is DECL_NONADDRESSABLE_P
-     In VAR_DECL, PARM_DECL and RESULT_DECL, this is
-     DECL_HAS_VALUE_EXPR_P.  */
-  unsigned decl_flag_2 : 1;
-  /* 1 bit unused.  */
-  unsigned decl_flag_3 : 1;
-  /* Logically, these two would go in a theoretical base shared by var and
-     parm decl. */
-  unsigned gimple_reg_flag : 1;
-  /* In VAR_DECL, PARM_DECL and RESULT_DECL, this is DECL_BY_REFERENCE.  */
-  unsigned decl_by_reference_flag : 1;
-  /* In a VAR_DECL and PARM_DECL, this is DECL_READ_P.  */
-  unsigned decl_read_flag : 1;
-  /* In a VAR_DECL or RESULT_DECL, this is DECL_NONSHAREABLE.  */
-  unsigned decl_nonshareable_flag : 1;
-
-  /* DECL_OFFSET_ALIGN, used only for FIELD_DECLs.  */
-  unsigned int off_align : 8;
-
-  /* 24 bits unused.  */
-
-  /* DECL_ALIGN.  It should have the same size as TYPE_ALIGN.  */
-  unsigned int align;
-
-  /* UID for points-to sets, stable over copying from inlining.  */
-  unsigned int pt_uid;
-
-  tree size_unit;
-  tree initial;
-  tree attributes;
-  tree abstract_origin;
-
-  /* Points to a structure whose details depend on the language in use.  */
-  struct lang_decl *lang_specific;
-};
-
-struct GTY(()) tree_decl_with_rtl {
-  struct tree_decl_common common;
-  rtx rtl;
-};
-
-struct GTY(()) tree_field_decl {
-  struct tree_decl_common common;
-
-  tree offset;
-  tree bit_field_type;
-  tree qualifier;
-  tree bit_offset;
-  tree fcontext;
-};
-
-struct GTY(()) tree_label_decl {
-  struct tree_decl_with_rtl common;
-  int label_decl_uid;
-  int eh_landing_pad_nr;
-};
-
-struct GTY(()) tree_result_decl {
-  struct tree_decl_with_rtl common;
-};
-
-struct GTY(()) tree_const_decl {
-  struct tree_decl_common common;
-};
-
-struct GTY(()) tree_parm_decl {
-  struct tree_decl_with_rtl common;
-  rtx incoming_rtl;
-};
-
-struct GTY(()) tree_decl_with_vis {
- struct tree_decl_with_rtl common;
- tree assembler_name;
- tree section_name;
- tree comdat_group;
-
- /* Belong to VAR_DECL exclusively.  */
- unsigned defer_output : 1;
- unsigned hard_register : 1;
- unsigned common_flag : 1;
- unsigned in_text_section : 1;
- unsigned in_constant_pool : 1;
- unsigned dllimport_flag : 1;
- /* Don't belong to VAR_DECL exclusively.  */
- unsigned weak_flag : 1;
- /* When SECTION_NAME is implied by -ffunction-section.  */
- unsigned implicit_section_name_p : 1;
-
- unsigned seen_in_bind_expr : 1;
- unsigned comdat_flag : 1;
- ENUM_BITFIELD(symbol_visibility) visibility : 2;
- unsigned visibility_specified : 1;
- /* Belongs to VAR_DECL exclusively.  */
- ENUM_BITFIELD(tls_model) tls_model : 3;
-
- /* Belong to FUNCTION_DECL exclusively.  */
- unsigned init_priority_p : 1;
- /* Used by C++ only.  Might become a generic decl flag.  */
- unsigned shadowed_for_var_p : 1;
- /* Belong to FUNCTION_DECL exclusively.  */
- unsigned cxx_constructor : 1;
- /* Belong to FUNCTION_DECL exclusively.  */
- unsigned cxx_destructor : 1;
- /* Belong to FUNCTION_DECL exclusively.  */
- unsigned final : 1;
- /* 11 unused bits. */
-};
-
-struct GTY(()) tree_var_decl {
-  struct tree_decl_with_vis common;
-};
-
-struct GTY(()) tree_decl_non_common {
-  struct tree_decl_with_vis common;
-  /* C++ uses this in namespaces.  */
-  tree saved_tree;
-  /* C++ uses this in templates.  */
-  tree arguments;
-  /* Almost all FE's use this.  */
-  tree result;
-  /* C++ uses this in namespaces and function_decls.  */
-  tree vindex;
-};
-
-/* FUNCTION_DECL inherits from DECL_NON_COMMON because of the use of the
-   arguments/result/saved_tree fields by front ends.   It was either inherit
-   FUNCTION_DECL from non_common, or inherit non_common from FUNCTION_DECL,
-   which seemed a bit strange.  */
-
-struct GTY(()) tree_function_decl {
-  struct tree_decl_non_common common;
-
-  struct function *f;
-
-  /* The personality function. Used for stack unwinding. */
-  tree personality;
-
-  /* Function specific options that are used by this function.  */
-  tree function_specific_target;	/* target options */
-  tree function_specific_optimization;	/* optimization options */
-
-  /* In a FUNCTION_DECL for which DECL_BUILT_IN holds, this is
-     DECL_FUNCTION_CODE.  Otherwise unused.
-     ???  The bitfield needs to be able to hold all target function
-	  codes as well.  */
-  ENUM_BITFIELD(built_in_function) function_code : 11;
-  ENUM_BITFIELD(built_in_class) built_in_class : 2;
-
-  unsigned static_ctor_flag : 1;
-  unsigned static_dtor_flag : 1;
-  unsigned uninlinable : 1;
-
-  unsigned possibly_inlined : 1;
-  unsigned novops_flag : 1;
-  unsigned returns_twice_flag : 1;
-  unsigned malloc_flag : 1;
-  unsigned operator_new_flag : 1;
-  unsigned declared_inline_flag : 1;
-  unsigned regdecl_flag : 1;
-  unsigned no_inline_warning_flag : 1;
-
-  unsigned no_instrument_function_entry_exit : 1;
-  unsigned no_limit_stack : 1;
-  unsigned disregard_inline_limits : 1;
-  unsigned pure_flag : 1;
-  unsigned looping_const_or_pure_flag : 1;
-  unsigned has_debug_args_flag : 1;
-  unsigned tm_clone_flag : 1;
-  unsigned versioned_function : 1;
-  /* No bits left.  */
-};
-
-struct GTY(()) tree_translation_unit_decl {
-  struct tree_decl_common common;
-  /* Source language of this translation unit.  Used for DWARF output.  */
-  const char * GTY((skip(""))) language;
-  /* TODO: Non-optimization used to build this translation unit.  */
-  /* TODO: Root of a partial DWARF tree for global types and decls.  */
-};
-
-struct GTY(()) tree_type_decl {
-  struct tree_decl_non_common common;
-
-};
-
-struct GTY ((chain_next ("%h.next"), chain_prev ("%h.prev"))) tree_statement_list_node
- {
-  struct tree_statement_list_node *prev;
-  struct tree_statement_list_node *next;
-  tree stmt;
-};
-
-struct GTY(()) tree_statement_list
- {
-  struct tree_typed typed;
-  struct tree_statement_list_node *head;
-  struct tree_statement_list_node *tail;
-};
-
-
-/* Optimization options used by a function.  */
-
-struct GTY(()) tree_optimization_option {
-  struct tree_common common;
-
-  /* The optimization options used by the user.  */
-  struct cl_optimization opts;
-
-  /* Target optabs for this set of optimization options.  This is of
-     type `struct target_optabs *'.  */
-  void *GTY ((atomic)) optabs;
-
-  /* The value of this_target_optabs against which the optabs above were
-     generated.  */
-  struct target_optabs *GTY ((skip)) base_optabs;
-};
-
-/* Forward declaration, defined in target-globals.h.  */
-
-struct GTY(()) target_globals;
-
-/* Target options used by a function.  */
-
-struct GTY(()) tree_target_option {
-  struct tree_common common;
-
-  /* Target globals for the corresponding target option.  */
-  struct target_globals *globals;
-
-  /* The optimization options used by the user.  */
-  struct cl_target_option opts;
-};
-
-/* Define the overall contents of a tree node.
-   It may be any of the structures declared above
-   for various types of node.  */
-union GTY ((ptr_alias (union lang_tree_node),
-	    desc ("tree_node_structure (&%h)"), variable_size)) tree_node {
-  struct tree_base GTY ((tag ("TS_BASE"))) base;
-  struct tree_typed GTY ((tag ("TS_TYPED"))) typed;
-  struct tree_common GTY ((tag ("TS_COMMON"))) common;
-  struct tree_int_cst GTY ((tag ("TS_INT_CST"))) int_cst;
-  struct tree_real_cst GTY ((tag ("TS_REAL_CST"))) real_cst;
-  struct tree_fixed_cst GTY ((tag ("TS_FIXED_CST"))) fixed_cst;
-  struct tree_vector GTY ((tag ("TS_VECTOR"))) vector;
-  struct tree_string GTY ((tag ("TS_STRING"))) string;
-  struct tree_complex GTY ((tag ("TS_COMPLEX"))) complex;
-  struct tree_identifier GTY ((tag ("TS_IDENTIFIER"))) identifier;
-  struct tree_decl_minimal GTY((tag ("TS_DECL_MINIMAL"))) decl_minimal;
-  struct tree_decl_common GTY ((tag ("TS_DECL_COMMON"))) decl_common;
-  struct tree_decl_with_rtl GTY ((tag ("TS_DECL_WRTL"))) decl_with_rtl;
-  struct tree_decl_non_common  GTY ((tag ("TS_DECL_NON_COMMON")))
-    decl_non_common;
-  struct tree_parm_decl  GTY  ((tag ("TS_PARM_DECL"))) parm_decl;
-  struct tree_decl_with_vis GTY ((tag ("TS_DECL_WITH_VIS"))) decl_with_vis;
-  struct tree_var_decl GTY ((tag ("TS_VAR_DECL"))) var_decl;
-  struct tree_field_decl GTY ((tag ("TS_FIELD_DECL"))) field_decl;
-  struct tree_label_decl GTY ((tag ("TS_LABEL_DECL"))) label_decl;
-  struct tree_result_decl GTY ((tag ("TS_RESULT_DECL"))) result_decl;
-  struct tree_const_decl GTY ((tag ("TS_CONST_DECL"))) const_decl;
-  struct tree_type_decl GTY ((tag ("TS_TYPE_DECL"))) type_decl;
-  struct tree_function_decl GTY ((tag ("TS_FUNCTION_DECL"))) function_decl;
-  struct tree_translation_unit_decl GTY ((tag ("TS_TRANSLATION_UNIT_DECL")))
-    translation_unit_decl;
-  struct tree_type_common GTY ((tag ("TS_TYPE_COMMON"))) type_common;
-  struct tree_type_with_lang_specific GTY ((tag ("TS_TYPE_WITH_LANG_SPECIFIC")))
-    type_with_lang_specific;
-  struct tree_type_non_common GTY ((tag ("TS_TYPE_NON_COMMON")))
-    type_non_common;
-  struct tree_list GTY ((tag ("TS_LIST"))) list;
-  struct tree_vec GTY ((tag ("TS_VEC"))) vec;
-  struct tree_exp GTY ((tag ("TS_EXP"))) exp;
-  struct tree_ssa_name GTY ((tag ("TS_SSA_NAME"))) ssa_name;
-  struct tree_block GTY ((tag ("TS_BLOCK"))) block;
-  struct tree_binfo GTY ((tag ("TS_BINFO"))) binfo;
-  struct tree_statement_list GTY ((tag ("TS_STATEMENT_LIST"))) stmt_list;
-  struct tree_constructor GTY ((tag ("TS_CONSTRUCTOR"))) constructor;
-  struct tree_omp_clause GTY ((tag ("TS_OMP_CLAUSE"))) omp_clause;
-  struct tree_optimization_option GTY ((tag ("TS_OPTIMIZATION"))) optimization;
-  struct tree_target_option GTY ((tag ("TS_TARGET_OPTION"))) target_option;
-};
-
-/* Structure describing an attribute and a function to handle it.  */
-struct attribute_spec {
-  /* The name of the attribute (without any leading or trailing __),
-     or NULL to mark the end of a table of attributes.  */
-  const char *name;
-  /* The minimum length of the list of arguments of the attribute.  */
-  int min_length;
-  /* The maximum length of the list of arguments of the attribute
-     (-1 for no maximum).  */
-  int max_length;
-  /* Whether this attribute requires a DECL.  If it does, it will be passed
-     from types of DECLs, function return types and array element types to
-     the DECLs, function types and array types respectively; but when
-     applied to a type in any other circumstances, it will be ignored with
-     a warning.  (If greater control is desired for a given attribute,
-     this should be false, and the flags argument to the handler may be
-     used to gain greater control in that case.)  */
-  bool decl_required;
-  /* Whether this attribute requires a type.  If it does, it will be passed
-     from a DECL to the type of that DECL.  */
-  bool type_required;
-  /* Whether this attribute requires a function (or method) type.  If it does,
-     it will be passed from a function pointer type to the target type,
-     and from a function return type (which is not itself a function
-     pointer type) to the function type.  */
-  bool function_type_required;
-  /* Function to handle this attribute.  NODE points to the node to which
-     the attribute is to be applied.  If a DECL, it should be modified in
-     place; if a TYPE, a copy should be created.  NAME is the name of the
-     attribute (possibly with leading or trailing __).  ARGS is the TREE_LIST
-     of the arguments (which may be NULL).  FLAGS gives further information
-     about the context of the attribute.  Afterwards, the attributes will
-     be added to the DECL_ATTRIBUTES or TYPE_ATTRIBUTES, as appropriate,
-     unless *NO_ADD_ATTRS is set to true (which should be done on error,
-     as well as in any other cases when the attributes should not be added
-     to the DECL or TYPE).  Depending on FLAGS, any attributes to be
-     applied to another type or DECL later may be returned;
-     otherwise the return value should be NULL_TREE.  This pointer may be
-     NULL if no special handling is required beyond the checks implied
-     by the rest of this structure.  */
-  tree (*handler) (tree *node, tree name, tree args,
-		   int flags, bool *no_add_attrs);
-  /* Specifies if attribute affects type's identity.  */
-  bool affects_type_identity;
-};
-
-/* These functions allow a front-end to perform a manual layout of a
-   RECORD_TYPE.  (For instance, if the placement of subsequent fields
-   depends on the placement of fields so far.)  Begin by calling
-   start_record_layout.  Then, call place_field for each of the
-   fields.  Then, call finish_record_layout.  See layout_type for the
-   default way in which these functions are used.  */
-typedef struct record_layout_info_s {
-  /* The RECORD_TYPE that we are laying out.  */
-  tree t;
-  /* The offset into the record so far, in bytes, not including bits in
-     BITPOS.  */
-  tree offset;
-  /* The last known alignment of SIZE.  */
-  unsigned int offset_align;
-  /* The bit position within the last OFFSET_ALIGN bits, in bits.  */
-  tree bitpos;
-  /* The alignment of the record so far, in bits.  */
-  unsigned int record_align;
-  /* The alignment of the record so far, ignoring #pragma pack and
-     __attribute__ ((packed)), in bits.  */
-  unsigned int unpacked_align;
-  /* The previous field laid out.  */
-  tree prev_field;
-  /* The static variables (i.e., class variables, as opposed to
-     instance variables) encountered in T.  */
-  vec<tree, va_gc> *pending_statics;
-  /* Bits remaining in the current alignment group */
-  int remaining_in_alignment;
-  /* True if we've seen a packed field that didn't have normal
-     alignment anyway.  */
-  int packed_maybe_necessary;
-} *record_layout_info;
-
-/* Iterator for going through the function arguments.  */
-struct function_args_iterator {
-  tree next;			/* TREE_LIST pointing to the next argument */
-};
-
-/* Structures to map from a tree to another tree.  */
-struct GTY(()) tree_map_base {
-  tree from;
-};
-
-/* Map from a tree to another tree.  */
-
-struct GTY(()) tree_map {
-  struct tree_map_base base;
-  unsigned int hash;
-  tree to;
-};
-
-/* Map from a decl tree to another tree.  */
-struct GTY(()) tree_decl_map {
-  struct tree_map_base base;
-  tree to;
-};
-
-/* Map from a tree to an int.  */
-struct GTY(()) tree_int_map {
-  struct tree_map_base base;
-  unsigned int to;
-};
-
-/* Map from a tree to initialization/finalization priorities.  */
-struct GTY(()) tree_priority_map {
-  struct tree_map_base base;
-  priority_type init;
-  priority_type fini;
-};
-
-/* Map from a decl tree to a tree vector.  */
-struct GTY(()) tree_vec_map {
-  struct tree_map_base base;
-  vec<tree, va_gc> *to;
-};
-
-/* Abstract iterators for CALL_EXPRs.  These static inline definitions
-   have to go towards the end of tree.h so that union tree_node is fully
-   defined by this point.  */
-
-/* Structure containing iterator state.  */
-struct call_expr_arg_iterator {
-  tree t;	/* the call_expr */
-  int n;	/* argument count */
-  int i;	/* next argument index */
-};
-
-struct const_call_expr_arg_iterator {
-  const_tree t;	/* the call_expr */
-  int n;	/* argument count */
-  int i;	/* next argument index */
-};
-
-/* The builtin_info structure holds the FUNCTION_DECL of the standard builtin
-   function, and a flag that says if the function is available implicitly, or
-   whether the user has to code explicit calls to __builtin_<xxx>.  */
-struct GTY(()) builtin_info_type {
-  tree decl[(int)END_BUILTINS];
-  bool implicit_p[(int)END_BUILTINS];
-};
-
-
-/*---------------------------------------------------------------------------
-                                Global variables
----------------------------------------------------------------------------*/
-/* Matrix describing the structures contained in a given tree code.  */
-extern unsigned char tree_contains_struct[MAX_TREE_CODES][64];
-
-/* Class of tree given its code.  */
-extern const enum tree_code_class tree_code_type[];
-
-/* Each tree code class has an associated string representation.
-   These must correspond to the tree_code_class entries.  */
-extern const char *const tree_code_class_strings[];
-
-/* Number of argument-words in each kind of tree-node.  */
-extern const unsigned char tree_code_length[];
-
-/* Vector of all alias pairs for global symbols.  */
-extern GTY(()) vec<alias_pair, va_gc> *alias_pairs;
-
-/* Names of all the built_in classes.  */
-extern const char *const built_in_class_names[BUILT_IN_LAST];
-
-/* Names of all the built_in functions.  */
-extern const char * built_in_names[(int) END_BUILTINS];
-
-/* Number of operands and names for each OMP_CLAUSE node.  */
-extern unsigned const char omp_clause_num_ops[];
-extern const char * const omp_clause_code_name[];
-
-/* A vector of all translation-units.  */
-extern GTY (()) vec<tree, va_gc> *all_translation_units;
-
-/* Vector of standard trees used by the C compiler.  */
-extern GTY(()) tree global_trees[TI_MAX];
-
-/* The standard C integer types.  Use integer_type_kind to index into
-   this array.  */
-extern GTY(()) tree integer_types[itk_none];
-
-/* Types used to represent sizes.  */
-extern GTY(()) tree sizetype_tab[(int) stk_type_kind_last];
-
-/* Arrays for keeping track of tree node statistics.  */
-extern int tree_node_counts[];
-extern int tree_node_sizes[];
-
-/* True if we are in gimple form and the actions of the folders need to
-   be restricted.  False if we are not in gimple form and folding is not
-   restricted to creating gimple expressions.  */
-extern bool in_gimple_form;
-
-/* Functional interface to the builtin functions.  */
-extern GTY(()) builtin_info_type builtin_info;
-
-/* If nonzero, an upper limit on alignment of structure fields, in bits,  */
-extern unsigned int maximum_field_alignment;
-
-/* Nonzero means lvalues are limited to those valid in pedantic ANSI C.
-   Zero means allow extended lvalues.  */
-extern int pedantic_lvalues;
-
-/* Points to the FUNCTION_DECL of the function whose body we are reading.  */
-extern GTY(()) tree current_function_decl;
-
-/* Nonzero means a FUNC_BEGIN label was emitted.  */
-extern GTY(()) const char * current_function_func_begin_label;
-
-#endif  // GCC_TREE_CORE_H
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-dfa.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-dfa.h
deleted file mode 100644
index 86590ad..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-dfa.h
+++ /dev/null
@@ -1,184 +0,0 @@
-/* Header file for tree data flow functions.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_DFA_H
-#define GCC_TREE_DFA_H
-
-extern void renumber_gimple_stmt_uids (void);
-extern void renumber_gimple_stmt_uids_in_blocks (basic_block *, int);
-extern void dump_variable (FILE *, tree);
-extern void debug_variable (tree);
-extern void dump_dfa_stats (FILE *);
-extern void debug_dfa_stats (void);
-extern tree ssa_default_def (struct function *, tree);
-extern void set_ssa_default_def (struct function *, tree, tree);
-extern tree get_or_create_ssa_default_def (struct function *, tree);
-extern tree get_ref_base_and_extent (tree, HOST_WIDE_INT *,
-				     HOST_WIDE_INT *, HOST_WIDE_INT *);
-extern tree get_addr_base_and_unit_offset (tree, HOST_WIDE_INT *);
-extern bool stmt_references_abnormal_ssa_name (gimple);
-extern void dump_enumerated_decls (FILE *, int);
-
-/* Returns the base object and a constant BITS_PER_UNIT offset in *POFFSET that
-   denotes the starting address of the memory access EXP.
-   Returns NULL_TREE if the offset is not constant or any component
-   is not BITS_PER_UNIT-aligned.
-   VALUEIZE if non-NULL is used to valueize SSA names.  It should return
-   its argument or a constant if the argument is known to be constant.  */
-/* ??? This is a static inline here to avoid the overhead of the indirect calls
-   to VALUEIZE.  But is this overhead really that significant?  And should we
-   perhaps just rely on WHOPR to specialize the function?  */
-
-static inline tree
-get_addr_base_and_unit_offset_1 (tree exp, HOST_WIDE_INT *poffset,
-				 tree (*valueize) (tree))
-{
-  HOST_WIDE_INT byte_offset = 0;
-
-  /* Compute cumulative byte-offset for nested component-refs and array-refs,
-     and find the ultimate containing object.  */
-  while (1)
-    {
-      switch (TREE_CODE (exp))
-	{
-	case BIT_FIELD_REF:
-	  {
-	    HOST_WIDE_INT this_off = TREE_INT_CST_LOW (TREE_OPERAND (exp, 2));
-	    if (this_off % BITS_PER_UNIT)
-	      return NULL_TREE;
-	    byte_offset += this_off / BITS_PER_UNIT;
-	  }
-	  break;
-
-	case COMPONENT_REF:
-	  {
-	    tree field = TREE_OPERAND (exp, 1);
-	    tree this_offset = component_ref_field_offset (exp);
-	    HOST_WIDE_INT hthis_offset;
-
-	    if (!this_offset
-		|| TREE_CODE (this_offset) != INTEGER_CST
-		|| (TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field))
-		    % BITS_PER_UNIT))
-	      return NULL_TREE;
-
-	    hthis_offset = TREE_INT_CST_LOW (this_offset);
-	    hthis_offset += (TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field))
-			     / BITS_PER_UNIT);
-	    byte_offset += hthis_offset;
-	  }
-	  break;
-
-	case ARRAY_REF:
-	case ARRAY_RANGE_REF:
-	  {
-	    tree index = TREE_OPERAND (exp, 1);
-	    tree low_bound, unit_size;
-
-	    if (valueize
-		&& TREE_CODE (index) == SSA_NAME)
-	      index = (*valueize) (index);
-
-	    /* If the resulting bit-offset is constant, track it.  */
-	    if (TREE_CODE (index) == INTEGER_CST
-		&& (low_bound = array_ref_low_bound (exp),
-		    TREE_CODE (low_bound) == INTEGER_CST)
-		&& (unit_size = array_ref_element_size (exp),
-		    TREE_CODE (unit_size) == INTEGER_CST))
-	      {
-		double_int doffset
-		  = (TREE_INT_CST (index) - TREE_INT_CST (low_bound))
-		    .sext (TYPE_PRECISION (TREE_TYPE (index)));
-		doffset *= tree_to_double_int (unit_size);
-		byte_offset += doffset.to_shwi ();
-	      }
-	    else
-	      return NULL_TREE;
-	  }
-	  break;
-
-	case REALPART_EXPR:
-	  break;
-
-	case IMAGPART_EXPR:
-	  byte_offset += TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (exp)));
-	  break;
-
-	case VIEW_CONVERT_EXPR:
-	  break;
-
-	case MEM_REF:
-	  {
-	    tree base = TREE_OPERAND (exp, 0);
-	    if (valueize
-		&& TREE_CODE (base) == SSA_NAME)
-	      base = (*valueize) (base);
-
-	    /* Hand back the decl for MEM[&decl, off].  */
-	    if (TREE_CODE (base) == ADDR_EXPR)
-	      {
-		if (!integer_zerop (TREE_OPERAND (exp, 1)))
-		  {
-		    double_int off = mem_ref_offset (exp);
-		    gcc_assert (off.high == -1 || off.high == 0);
-		    byte_offset += off.to_shwi ();
-		  }
-		exp = TREE_OPERAND (base, 0);
-	      }
-	    goto done;
-	  }
-
-	case TARGET_MEM_REF:
-	  {
-	    tree base = TREE_OPERAND (exp, 0);
-	    if (valueize
-		&& TREE_CODE (base) == SSA_NAME)
-	      base = (*valueize) (base);
-
-	    /* Hand back the decl for MEM[&decl, off].  */
-	    if (TREE_CODE (base) == ADDR_EXPR)
-	      {
-		if (TMR_INDEX (exp) || TMR_INDEX2 (exp))
-		  return NULL_TREE;
-		if (!integer_zerop (TMR_OFFSET (exp)))
-		  {
-		    double_int off = mem_ref_offset (exp);
-		    gcc_assert (off.high == -1 || off.high == 0);
-		    byte_offset += off.to_shwi ();
-		  }
-		exp = TREE_OPERAND (base, 0);
-	      }
-	    goto done;
-	  }
-
-	default:
-	  goto done;
-	}
-
-      exp = TREE_OPERAND (exp, 0);
-    }
-done:
-
-  *poffset = byte_offset;
-  return exp;
-}
-
-
-
-#endif /* GCC_TREE_DFA_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-dump.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-dump.h
deleted file mode 100644
index 0684596..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-dump.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Tree-dumping functionality for intermediate representation.
-   Copyright (C) 1999-2014 Free Software Foundation, Inc.
-   Written by Mark Mitchell <mark@codesourcery.com>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_DUMP_H
-#define GCC_TREE_DUMP_H
-
-#include "splay-tree.h"
-#include "dumpfile.h"
-
-typedef struct dump_info *dump_info_p;
-
-/* Flags used with queue functions.  */
-#define DUMP_NONE     0
-#define DUMP_BINFO    1
-
-/* Information about a node to be dumped.  */
-
-typedef struct dump_node_info
-{
-  /* The index for the node.  */
-  unsigned int index;
-  /* Nonzero if the node is a binfo.  */
-  unsigned int binfo_p : 1;
-} *dump_node_info_p;
-
-/* A dump_queue is a link in the queue of things to be dumped.  */
-
-typedef struct dump_queue
-{
-  /* The queued tree node.  */
-  splay_tree_node node;
-  /* The next node in the queue.  */
-  struct dump_queue *next;
-} *dump_queue_p;
-
-/* A dump_info gives information about how we should perform the dump
-   and about the current state of the dump.  */
-
-struct dump_info
-{
-  /* The stream on which to dump the information.  */
-  FILE *stream;
-  /* The original node.  */
-  const_tree node;
-  /* User flags.  */
-  int flags;
-  /* The next unused node index.  */
-  unsigned int index;
-  /* The next column.  */
-  unsigned int column;
-  /* The first node in the queue of nodes to be written out.  */
-  dump_queue_p queue;
-  /* The last node in the queue.  */
-  dump_queue_p queue_end;
-  /* Free queue nodes.  */
-  dump_queue_p free_list;
-  /* The tree nodes which we have already written out.  The
-     keys are the addresses of the nodes; the values are the integer
-     indices we assigned them.  */
-  splay_tree nodes;
-};
-
-/* Dump the CHILD and its children.  */
-#define dump_child(field, child) \
-  queue_and_dump_index (di, field, child, DUMP_NONE)
-
-extern void dump_pointer (dump_info_p, const char *, void *);
-extern void dump_int (dump_info_p, const char *, int);
-extern void dump_string (dump_info_p, const char *);
-extern void dump_string_field (dump_info_p, const char *, const char *);
-extern void queue_and_dump_index (dump_info_p, const char *, const_tree, int);
-extern void queue_and_dump_type (dump_info_p, const_tree);
-extern void dump_function (int, tree);
-extern int dump_flag (dump_info_p, int, const_tree);
-
-#endif /* ! GCC_TREE_DUMP_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-eh.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-eh.h
deleted file mode 100644
index cd9b40d..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-eh.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* Header file for exception handling.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_EH_H
-#define GCC_TREE_EH_H
-
-extern void using_eh_for_cleanups (void);
-extern void add_stmt_to_eh_lp (gimple, int);
-extern bool remove_stmt_from_eh_lp_fn (struct function *, gimple);
-extern bool remove_stmt_from_eh_lp (gimple);
-extern int lookup_stmt_eh_lp_fn (struct function *, gimple);
-extern int lookup_stmt_eh_lp (gimple);
-extern bool make_eh_dispatch_edges (gimple);
-extern void make_eh_edges (gimple);
-extern edge redirect_eh_edge (edge, basic_block);
-extern void redirect_eh_dispatch_edge (gimple, edge, basic_block);
-extern bool operation_could_trap_helper_p (enum tree_code, bool, bool, bool,
-					   bool, tree, bool *);
-extern bool operation_could_trap_p (enum tree_code, bool, bool, tree);
-extern bool tree_could_trap_p (tree);
-extern bool stmt_could_throw_p (gimple);
-extern bool tree_could_throw_p (tree);
-extern bool stmt_can_throw_external (gimple);
-extern bool stmt_can_throw_internal (gimple);
-extern bool maybe_clean_eh_stmt_fn (struct function *, gimple);
-extern bool maybe_clean_eh_stmt (gimple);
-extern bool maybe_clean_or_replace_eh_stmt (gimple, gimple);
-extern bool maybe_duplicate_eh_stmt_fn (struct function *, gimple,
-					struct function *, gimple,
-					struct pointer_map_t *, int);
-extern bool maybe_duplicate_eh_stmt (gimple, gimple);
-extern void maybe_remove_unreachable_handlers (void);
-extern bool verify_eh_edges (gimple);
-extern bool verify_eh_dispatch_edge (gimple);
-
-#endif /* GCC_TREE_EH_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-hasher.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-hasher.h
deleted file mode 100644
index 6b28008..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-hasher.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Hash Table Helper for Trees
-   Copyright (C) 2012-2014 Free Software Foundation, Inc.
-   Contributed by Lawrence Crowl <crowl@google.com>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_HASHER_H
-#define GCC_TREE_HASHER_H 1
-
-#include "hash-table.h"
-
-struct int_tree_map {
-  unsigned int uid;
-  tree to;
-};
-
-/* Hashtable helpers.  */
-
-struct int_tree_hasher : typed_free_remove <int_tree_map>
-{
-  typedef int_tree_map value_type;
-  typedef int_tree_map compare_type;
-  static inline hashval_t hash (const value_type *);
-  static inline bool equal (const value_type *, const compare_type *);
-};
-
-/* Hash a UID in a int_tree_map.  */
-
-inline hashval_t
-int_tree_hasher::hash (const value_type *item)
-{
-  return item->uid;
-}
-
-/* Return true if the uid in both int tree maps are equal.  */
-
-inline bool
-int_tree_hasher::equal (const value_type *a, const compare_type *b)
-{
-  return (a->uid == b->uid);
-}
-
-typedef hash_table <int_tree_hasher> int_tree_htab_type;
-
-#endif /* GCC_TREE_HASHER_H  */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-inline.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-inline.h
deleted file mode 100644
index 13c5516..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-inline.h
+++ /dev/null
@@ -1,208 +0,0 @@
-/* Tree inlining hooks and declarations.
-   Copyright (C) 2001-2014 Free Software Foundation, Inc.
-   Contributed by Alexandre Oliva  <aoliva@redhat.com>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_INLINE_H
-#define GCC_TREE_INLINE_H
-
-struct cgraph_edge;
-
-/* Indicate the desired behavior wrt call graph edges.  We can either
-   duplicate the edge (inlining, cloning), move the edge (versioning,
-   parallelization), or move the edges of the clones (saving).  */
-
-enum copy_body_cge_which
-{
-  CB_CGE_DUPLICATE,
-  CB_CGE_MOVE,
-  CB_CGE_MOVE_CLONES
-};
-
-/* Data required for function body duplication.  */
-
-struct copy_body_data
-{
-  /* FUNCTION_DECL for function being inlined, or in general the
-     source function providing the original trees.  */
-  tree src_fn;
-
-  /* FUNCTION_DECL for function being inlined into, or in general
-     the destination function receiving the new trees.  */
-  tree dst_fn;
-
-  /* Callgraph node of the source function.  */
-  struct cgraph_node *src_node;
-
-  /* Callgraph node of the destination function.  */
-  struct cgraph_node *dst_node;
-
-  /* struct function for function being inlined.  Usually this is the same
-     as DECL_STRUCT_FUNCTION (src_fn), but can be different if saved_cfg
-     and saved_eh are in use.  */
-  struct function *src_cfun;
-
-  /* The VAR_DECL for the return value.  */
-  tree retvar;
-
-  /* The map from local declarations in the inlined function to
-     equivalents in the function into which it is being inlined.  */
-  struct pointer_map_t *decl_map;
-
-  /* Create a new decl to replace DECL in the destination function.  */
-  tree (*copy_decl) (tree, struct copy_body_data *);
-
-  /* Current BLOCK.  */
-  tree block;
-
-  /* GIMPLE_CALL if va arg parameter packs should be expanded or NULL
-     is not.  */
-  gimple gimple_call;
-
-  /* Exception landing pad the inlined call lies in.  */
-  int eh_lp_nr;
-
-  /* Maps region and landing pad structures from the function being copied
-     to duplicates created within the function we inline into.  */
-  struct pointer_map_t *eh_map;
-
-  /* We use the same mechanism do all sorts of different things.  Rather
-     than enumerating the different cases, we categorize the behavior
-     in the various situations.  */
-
-  /* What to do with call graph edges.  */
-  enum copy_body_cge_which transform_call_graph_edges;
-
-  /* True if a new CFG should be created.  False for inlining, true for
-     everything else.  */
-  bool transform_new_cfg;
-
-  /* True if RETURN_EXPRs should be transformed to just the contained
-     MODIFY_EXPR.  The branch semantics of the return will be handled
-     by manipulating the CFG rather than a statement.  */
-  bool transform_return_to_modify;
-
-  /* True if the parameters of the source function are transformed.
-     Only true for inlining.  */
-  bool transform_parameter;
-
-  /* True if this statement will need to be regimplified.  */
-  bool regimplify;
-
-  /* True if trees should not be unshared.  */
-  bool do_not_unshare;
-
-  /* > 0 if we are remapping a type currently.  */
-  int remapping_type_depth;
-
-  /* A function to be called when duplicating BLOCK nodes.  */
-  void (*transform_lang_insert_block) (tree);
-
-  /* Statements that might be possibly folded.  */
-  struct pointer_set_t *statements_to_fold;
-
-  /* Entry basic block to currently copied body.  */
-  basic_block entry_bb;
-
-  /* For partial function versioning, bitmap of bbs to be copied,
-     otherwise NULL.  */
-  bitmap blocks_to_copy;
-
-  /* Debug statements that need processing.  */
-  vec<gimple> debug_stmts;
-
-  /* A map from local declarations in the inlined function to
-     equivalents in the function into which it is being inlined, where
-     the originals have been mapped to a value rather than to a
-     variable.  */
-  struct pointer_map_t *debug_map;
- 
-  /* Cilk keywords currently need to replace some variables that
-     ordinary nested functions do not.  */ 
-  bool remap_var_for_cilk;
-};
-
-/* Weights of constructions for estimate_num_insns.  */
-
-typedef struct eni_weights_d
-{
-  /* Cost per call.  */
-  unsigned call_cost;
-
-  /* Cost per indirect call.  */
-  unsigned indirect_call_cost;
-
-  /* Cost per call to a target specific builtin */
-  unsigned target_builtin_call_cost;
-
-  /* Cost of "expensive" div and mod operations.  */
-  unsigned div_mod_cost;
-
-  /* Cost for omp construct.  */
-  unsigned omp_cost;
-
-  /* Cost for tm transaction.  */
-  unsigned tm_cost;
-
-  /* Cost of return.  */
-  unsigned return_cost;
-
-  /* True when time of statement should be estimated.  Thus, the
-     cost of a switch statement is logarithmic rather than linear in number
-     of cases.  */
-  bool time_based;
-} eni_weights;
-
-/* Weights that estimate_num_insns uses for heuristics in inlining.  */
-
-extern eni_weights eni_inlining_weights;
-
-/* Weights that estimate_num_insns uses to estimate the size of the
-   produced code.  */
-
-extern eni_weights eni_size_weights;
-
-/* Weights that estimate_num_insns uses to estimate the time necessary
-   to execute the produced code.  */
-
-extern eni_weights eni_time_weights;
-
-/* Function prototypes.  */
-void init_inline_once (void);
-extern tree copy_tree_body_r (tree *, int *, void *);
-extern void insert_decl_map (copy_body_data *, tree, tree);
-unsigned int optimize_inline_calls (tree);
-tree maybe_inline_call_in_expr (tree);
-bool tree_inlinable_function_p (tree);
-tree copy_tree_r (tree *, int *, void *);
-tree copy_decl_no_change (tree decl, copy_body_data *id);
-int estimate_move_cost (tree type);
-int estimate_num_insns (gimple, eni_weights *);
-int estimate_num_insns_fn (tree, eni_weights *);
-int count_insns_seq (gimple_seq, eni_weights *);
-bool tree_versionable_function_p (tree);
-extern tree remap_decl (tree decl, copy_body_data *id);
-extern tree remap_type (tree type, copy_body_data *id);
-extern gimple_seq copy_gimple_seq_and_replace_locals (gimple_seq seq);
-extern bool debug_find_tree (tree, tree);
-
-/* This is in tree-inline.c since the routine uses
-   data structures from the inliner.  */
-extern tree build_duplicate_type (tree);
-
-#endif /* GCC_TREE_INLINE_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-into-ssa.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-into-ssa.h
deleted file mode 100644
index 977f6e7..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-into-ssa.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* Header file for normal form into SSA.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_INTO_SSA_H
-#define GCC_TREE_INTO_SSA_H
-
-extern tree get_current_def (tree);
-extern void set_current_def (tree, tree);
-void delete_update_ssa (void);
-tree create_new_def_for (tree, gimple, def_operand_p);
-void mark_virtual_operands_for_renaming (struct function *);
-void mark_virtual_operand_for_renaming (tree);
-void mark_virtual_phi_result_for_renaming (gimple);
-bool need_ssa_update_p (struct function *);
-bool name_registered_for_update_p (tree);
-void release_ssa_name_after_update_ssa (tree);
-void update_ssa (unsigned);
-
-/* Prototypes for debugging functions.  */
-extern void debug_decl_set (bitmap set);
-extern void dump_defs_stack (FILE *, int);
-extern void debug_defs_stack (int);
-extern void dump_currdefs (FILE *);
-extern void debug_currdefs (void);
-extern void dump_tree_ssa (FILE *);
-extern void debug_tree_ssa (void);
-extern void dump_tree_ssa_stats (FILE *);
-extern void debug_tree_ssa_stats (void);
-extern void dump_var_infos (FILE *);
-extern void debug_var_infos (void);
-extern void dump_names_replaced_by (FILE *, tree);
-extern void debug_names_replaced_by (tree);
-extern void dump_update_ssa (FILE *);
-extern void debug_update_ssa (void);
-
-#endif /* GCC_TREE_INTO_SSA_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-iterator.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-iterator.h
deleted file mode 100644
index 5088fac..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-iterator.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/* Iterator routines for manipulating GENERIC tree statement list.
-   Copyright (C) 2003-2014 Free Software Foundation, Inc.
-   Contributed by Andrew MacLeod  <amacleod@redhat.com>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-
-/* This file is dependent upon the implementation of tree's. It provides an
-   abstract interface to the tree objects such that if all tree creation and
-   manipulations are done through this interface, we can easily change the
-   implementation of tree's, and not impact other code.  */
-
-#ifndef GCC_TREE_ITERATOR_H
-#define GCC_TREE_ITERATOR_H 1
-
-/* Iterator object for GENERIC or GIMPLE TREE statements.  */
-
-struct tree_stmt_iterator {
-  struct tree_statement_list_node *ptr;
-  tree container;
-};
-
-static inline tree_stmt_iterator
-tsi_start (tree t)
-{
-  tree_stmt_iterator i;
-
-  i.ptr = STATEMENT_LIST_HEAD (t);
-  i.container = t;
-
-  return i;
-}
-
-static inline tree_stmt_iterator
-tsi_last (tree t)
-{
-  tree_stmt_iterator i;
-
-  i.ptr = STATEMENT_LIST_TAIL (t);
-  i.container = t;
-
-  return i;
-}
-
-static inline bool
-tsi_end_p (tree_stmt_iterator i)
-{
-  return i.ptr == NULL;
-}
-
-static inline bool
-tsi_one_before_end_p (tree_stmt_iterator i)
-{
-  return i.ptr != NULL && i.ptr->next == NULL;
-}
-
-static inline void
-tsi_next (tree_stmt_iterator *i)
-{
-  i->ptr = i->ptr->next;
-}
-
-static inline void
-tsi_prev (tree_stmt_iterator *i)
-{
-  i->ptr = i->ptr->prev;
-}
-
-static inline tree *
-tsi_stmt_ptr (tree_stmt_iterator i)
-{
-  return &i.ptr->stmt;
-}
-
-static inline tree
-tsi_stmt (tree_stmt_iterator i)
-{
-  return i.ptr->stmt;
-}
-
-enum tsi_iterator_update
-{
-  TSI_NEW_STMT,		/* Only valid when single statement is added, move
-			   iterator to it.  */
-  TSI_SAME_STMT,	/* Leave the iterator at the same statement.  */
-  TSI_CHAIN_START,	/* Only valid when chain of statements is added, move
-			   iterator to the first statement in the chain.  */
-  TSI_CHAIN_END,	/* Only valid when chain of statements is added, move
-			   iterator to the last statement in the chain.  */
-  TSI_CONTINUE_LINKING	/* Move iterator to whatever position is suitable for
-			   linking other statements/chains of statements in
-			   the same direction.  */
-};
-
-extern void tsi_link_before (tree_stmt_iterator *, tree,
-			     enum tsi_iterator_update);
-extern void tsi_link_after (tree_stmt_iterator *, tree,
-			    enum tsi_iterator_update);
-
-extern void tsi_delink (tree_stmt_iterator *);
-
-extern tree alloc_stmt_list (void);
-extern void free_stmt_list (tree);
-extern void append_to_statement_list (tree, tree *);
-extern void append_to_statement_list_force (tree, tree *);
-extern tree expr_first (tree);
-extern tree expr_last (tree);
-
-#endif /* GCC_TREE_ITERATOR_H  */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-nested.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-nested.h
deleted file mode 100644
index ca45a7d..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-nested.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Header file for Nested function decomposition for GIMPLE.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_NESTED_H
-#define GCC_TREE_NESTED_H
-
-extern tree build_addr (tree, tree);
-extern void insert_field_into_struct (tree, tree);
-extern void lower_nested_functions (tree);
-
-#endif /* GCC_TREE_NESTED_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-object-size.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-object-size.h
deleted file mode 100644
index 70f648c..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-object-size.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Declarations for tree-object-size.c.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_OBJECT_SIZE_H
-#define GCC_TREE_OBJECT_SIZE_H
-
-extern void init_object_sizes (void);
-extern unsigned HOST_WIDE_INT compute_builtin_object_size (tree, int);
-
-#endif  // GCC_TREE_OBJECT_SIZE_H
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-outof-ssa.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-outof-ssa.h
deleted file mode 100644
index a8c3194..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-outof-ssa.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Routines for expanding from SSA form to RTL.
-   Copyright (C) 2009-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-
-#ifndef GCC_TREE_OUTOF_SSA_H
-#define GCC_TREE_OUTOF_SSA_H
-
-
-/* This structure (of which only a singleton SA exists) is used to
-   pass around information between the outof-SSA functions, cfgexpand
-   and expand itself.  */
-struct ssaexpand
-{
-  /* The computed partitions of SSA names are stored here.  */
-  var_map map;
-
-  /* For an SSA name version V bit V is set iff TER decided that
-     its definition should be forwarded.  */
-  bitmap values;
-
-  /* For a partition number I partition_to_pseudo[I] contains the
-     RTL expression of the allocated space of it (either a MEM or
-     a pseudos REG).  */
-  rtx *partition_to_pseudo;
-
-  /* If partition I contains an SSA name that has a default def,
-     bit I will be set in this bitmap.  */
-  bitmap partition_has_default_def;
-};
-
-/* This is the singleton described above.  */
-extern struct ssaexpand SA;
-
-/* Returns the RTX expression representing the storage of the outof-SSA
-   partition that the SSA name EXP is a member of.  */
-static inline rtx
-get_rtx_for_ssa_name (tree exp)
-{
-  int p = partition_find (SA.map->var_partition, SSA_NAME_VERSION (exp));
-  if (SA.map->partition_to_view)
-    p = SA.map->partition_to_view[p];
-  gcc_assert (p != NO_PARTITION);
-  return SA.partition_to_pseudo[p];
-}
-
-/* If TER decided to forward the definition of SSA name EXP this function
-   returns the defining statement, otherwise NULL.  */
-static inline gimple
-get_gimple_for_ssa_name (tree exp)
-{
-  int v = SSA_NAME_VERSION (exp);
-  if (SA.values && bitmap_bit_p (SA.values, v))
-    return SSA_NAME_DEF_STMT (exp);
-  return NULL;
-}
-
-extern bool ssa_is_replaceable_p (gimple stmt);
-extern void finish_out_of_ssa (struct ssaexpand *sa);
-extern unsigned int rewrite_out_of_ssa (struct ssaexpand *sa);
-extern void expand_phi_nodes (struct ssaexpand *sa);
-
-#endif /* GCC_TREE_OUTOF_SSA_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-parloops.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-parloops.h
deleted file mode 100644
index 7aabf85..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-parloops.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Header file for loop autoparallelization.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_PARLOOPS_H
-#define GCC_TREE_PARLOOPS_H
-
-extern bool parallelized_function_p (tree);
-extern bool parallelize_loops (void);
-
-#endif /* GCC_TREE_PARLOOPS_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-pass.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-pass.h
deleted file mode 100644
index 3b86770..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-pass.h
+++ /dev/null
@@ -1,627 +0,0 @@
-/* Definitions for describing one tree-ssa optimization pass.
-   Copyright (C) 2004-2014 Free Software Foundation, Inc.
-   Contributed by Richard Henderson <rth@redhat.com>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-
-#ifndef GCC_TREE_PASS_H
-#define GCC_TREE_PASS_H 1
-
-#include "timevar.h"
-#include "dumpfile.h"
-
-/* Optimization pass type.  */
-enum opt_pass_type
-{
-  GIMPLE_PASS,
-  RTL_PASS,
-  SIMPLE_IPA_PASS,
-  IPA_PASS
-};
-
-/* Metadata for a pass, non-varying across all instances of a pass.  */
-struct pass_data
-{
-  /* Optimization pass type.  */
-  enum opt_pass_type type;
-
-  /* Terse name of the pass used as a fragment of the dump file
-     name.  If the name starts with a star, no dump happens. */
-  const char *name;
-
-  /* The -fopt-info optimization group flags as defined in dumpfile.h. */
-  unsigned int optinfo_flags;
-
-  /* If true, this pass has its own implementation of the opt_pass::gate
-     method.  */
-  bool has_gate;
-
-  /* If true, this pass has its own implementation of the opt_pass::execute
-     method.  */
-  bool has_execute;
-
-  /* The timevar id associated with this pass.  */
-  /* ??? Ideally would be dynamically assigned.  */
-  timevar_id_t tv_id;
-
-  /* Sets of properties input and output from this pass.  */
-  unsigned int properties_required;
-  unsigned int properties_provided;
-  unsigned int properties_destroyed;
-
-  /* Flags indicating common sets things to do before and after.  */
-  unsigned int todo_flags_start;
-  unsigned int todo_flags_finish;
-};
-
-namespace gcc
-{
-  class context;
-} // namespace gcc
-
-/* An instance of a pass.  This is also "pass_data" to minimize the
-   changes in existing code.  */
-class opt_pass : public pass_data
-{
-public:
-  virtual ~opt_pass () { }
-
-  /* Create a copy of this pass.
-
-     Passes that can have multiple instances must provide their own
-     implementation of this, to ensure that any sharing of state between
-     this instance and the copy is "wired up" correctly.
-
-     The default implementation prints an error message and aborts.  */
-  virtual opt_pass *clone ();
-
-  /* If has_gate is set, this pass and all sub-passes are executed only if
-     the function returns true.
-     The default implementation returns true.  */
-  virtual bool gate ();
-
-  /* This is the code to run.  If has_execute is false, then there should
-     be sub-passes otherwise this pass does nothing.
-     The return value contains TODOs to execute in addition to those in
-     TODO_flags_finish.   */
-  virtual unsigned int execute ();
-
-protected:
-  opt_pass (const pass_data&, gcc::context *);
-
-public:
-  /* A list of sub-passes to run, dependent on gate predicate.  */
-  opt_pass *sub;
-
-  /* Next in the list of passes to run, independent of gate predicate.  */
-  opt_pass *next;
-
-  /* Static pass number, used as a fragment of the dump file name.  */
-  int static_pass_number;
-
-  /* When a given dump file is being initialized, this flag is set to
-     true if the corresponding TDF_graph dump file has also been
-     initialized.  */
-  bool graph_dump_initialized;
-
-protected:
-  gcc::context *m_ctxt;
-};
-
-/* Description of GIMPLE pass.  */
-class gimple_opt_pass : public opt_pass
-{
-protected:
-  gimple_opt_pass (const pass_data& data, gcc::context *ctxt)
-    : opt_pass (data, ctxt)
-  {
-  }
-};
-
-/* Description of RTL pass.  */
-class rtl_opt_pass : public opt_pass
-{
-protected:
-  rtl_opt_pass (const pass_data& data, gcc::context *ctxt)
-    : opt_pass (data, ctxt)
-  {
-  }
-};
-
-class varpool_node;
-struct cgraph_node;
-struct lto_symtab_encoder_d;
-
-/* Description of IPA pass with generate summary, write, execute, read and
-   transform stages.  */
-class ipa_opt_pass_d : public opt_pass
-{
-public:
-  /* IPA passes can analyze function body and variable initializers
-      using this hook and produce summary.  */
-  void (*generate_summary) (void);
-
-  /* This hook is used to serialize IPA summaries on disk.  */
-  void (*write_summary) (void);
-
-  /* This hook is used to deserialize IPA summaries from disk.  */
-  void (*read_summary) (void);
-
-  /* This hook is used to serialize IPA optimization summaries on disk.  */
-  void (*write_optimization_summary) (void);
-
-  /* This hook is used to deserialize IPA summaries from disk.  */
-  void (*read_optimization_summary) (void);
-
-  /* Hook to convert gimple stmt uids into true gimple statements.  The second
-     parameter is an array of statements indexed by their uid. */
-  void (*stmt_fixup) (struct cgraph_node *, gimple *);
-
-  /* Results of interprocedural propagation of an IPA pass is applied to
-     function body via this hook.  */
-  unsigned int function_transform_todo_flags_start;
-  unsigned int (*function_transform) (struct cgraph_node *);
-  void (*variable_transform) (varpool_node *);
-
-protected:
-  ipa_opt_pass_d (const pass_data& data, gcc::context *ctxt,
-		  void (*generate_summary) (void),
-		  void (*write_summary) (void),
-		  void (*read_summary) (void),
-		  void (*write_optimization_summary) (void),
-		  void (*read_optimization_summary) (void),
-		  void (*stmt_fixup) (struct cgraph_node *, gimple *),
-		  unsigned int function_transform_todo_flags_start,
-		  unsigned int (*function_transform) (struct cgraph_node *),
-		  void (*variable_transform) (varpool_node *))
-    : opt_pass (data, ctxt),
-      generate_summary (generate_summary),
-      write_summary (write_summary),
-      read_summary (read_summary),
-      write_optimization_summary (write_optimization_summary),
-      read_optimization_summary (read_optimization_summary),
-      stmt_fixup (stmt_fixup),
-      function_transform_todo_flags_start (function_transform_todo_flags_start),
-      function_transform (function_transform),
-      variable_transform (variable_transform)
-  {
-  }
-};
-
-/* Description of simple IPA pass.  Simple IPA passes have just one execute
-   hook.  */
-class simple_ipa_opt_pass : public opt_pass
-{
-protected:
-  simple_ipa_opt_pass (const pass_data& data, gcc::context *ctxt)
-    : opt_pass (data, ctxt)
-  {
-  }
-};
-
-/* Pass properties.  */
-#define PROP_gimple_any		(1 << 0)	/* entire gimple grammar */
-#define PROP_gimple_lcf		(1 << 1)	/* lowered control flow */
-#define PROP_gimple_leh		(1 << 2)	/* lowered eh */
-#define PROP_cfg		(1 << 3)
-#define PROP_ssa		(1 << 5)
-#define PROP_no_crit_edges      (1 << 6)
-#define PROP_rtl		(1 << 7)
-#define PROP_gimple_lomp	(1 << 8)	/* lowered OpenMP directives */
-#define PROP_cfglayout	 	(1 << 9)	/* cfglayout mode on RTL */
-#define PROP_gimple_lcx		(1 << 10)       /* lowered complex */
-#define PROP_loops		(1 << 11)	/* preserve loop structures */
-#define PROP_gimple_lvec	(1 << 12)       /* lowered vector */
-
-#define PROP_trees \
-  (PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh | PROP_gimple_lomp)
-
-/* To-do flags.  */
-#define TODO_do_not_ggc_collect		(1 << 1)
-#define TODO_verify_ssa			(1 << 2)
-#define TODO_verify_flow		(1 << 3)
-#define TODO_verify_stmts		(1 << 4)
-#define TODO_cleanup_cfg        	(1 << 5)
-#define TODO_dump_symtab		(1 << 7)
-#define TODO_remove_functions		(1 << 8)
-#define TODO_rebuild_frequencies	(1 << 9)
-#define TODO_verify_rtl_sharing         (1 << 10)
-
-/* To-do flags for calls to update_ssa.  */
-
-/* Update the SSA form inserting PHI nodes for newly exposed symbols
-   and virtual names marked for updating.  When updating real names,
-   only insert PHI nodes for a real name O_j in blocks reached by all
-   the new and old definitions for O_j.  If the iterated dominance
-   frontier for O_j is not pruned, we may end up inserting PHI nodes
-   in blocks that have one or more edges with no incoming definition
-   for O_j.  This would lead to uninitialized warnings for O_j's
-   symbol.  */
-#define TODO_update_ssa			(1 << 11)
-
-/* Update the SSA form without inserting any new PHI nodes at all.
-   This is used by passes that have either inserted all the PHI nodes
-   themselves or passes that need only to patch use-def and def-def
-   chains for virtuals (e.g., DCE).  */
-#define TODO_update_ssa_no_phi		(1 << 12)
-
-/* Insert PHI nodes everywhere they are needed.  No pruning of the
-   IDF is done.  This is used by passes that need the PHI nodes for
-   O_j even if it means that some arguments will come from the default
-   definition of O_j's symbol.
-
-   WARNING: If you need to use this flag, chances are that your pass
-   may be doing something wrong.  Inserting PHI nodes for an old name
-   where not all edges carry a new replacement may lead to silent
-   codegen errors or spurious uninitialized warnings.  */
-#define TODO_update_ssa_full_phi	(1 << 13)
-
-/* Passes that update the SSA form on their own may want to delegate
-   the updating of virtual names to the generic updater.  Since FUD
-   chains are easier to maintain, this simplifies the work they need
-   to do.  NOTE: If this flag is used, any OLD->NEW mappings for real
-   names are explicitly destroyed and only the symbols marked for
-   renaming are processed.  */
-#define TODO_update_ssa_only_virtuals	(1 << 14)
-
-/* Some passes leave unused local variables that can be removed from
-   cfun->local_decls.  This reduces the size of dump files
-   and the memory footprint for VAR_DECLs.  */
-#define TODO_remove_unused_locals	(1 << 15)
-
-/* Call df_finish at the end of the pass.  This is done after all of
-   the dumpers have been allowed to run so that they have access to
-   the instance before it is destroyed.  */
-#define TODO_df_finish                  (1 << 17)
-
-/* Call df_verify at the end of the pass if checking is enabled.  */
-#define TODO_df_verify                  (1 << 18)
-
-/* Internally used for the first instance of a pass.  */
-#define TODO_mark_first_instance	(1 << 19)
-
-/* Rebuild aliasing info.  */
-#define TODO_rebuild_alias              (1 << 20)
-
-/* Rebuild the addressable-vars bitmap and do register promotion.  */
-#define TODO_update_address_taken	(1 << 21)
-
-/* Rebuild the callgraph edges.  */
-#define TODO_rebuild_cgraph_edges       (1 << 22)
-
-/* Internally used in execute_function_todo().  */
-#define TODO_update_ssa_any		\
-    (TODO_update_ssa			\
-     | TODO_update_ssa_no_phi		\
-     | TODO_update_ssa_full_phi		\
-     | TODO_update_ssa_only_virtuals)
-
-#define TODO_verify_all \
-  (TODO_verify_ssa | TODO_verify_flow | TODO_verify_stmts)
-
-
-/* Register pass info. */
-
-enum pass_positioning_ops
-{
-  PASS_POS_INSERT_AFTER,  /* Insert after the reference pass.  */
-  PASS_POS_INSERT_BEFORE, /* Insert before the reference pass.  */
-  PASS_POS_REPLACE        /* Replace the reference pass.  */
-};
-
-struct register_pass_info
-{
-  opt_pass *pass;		    /* New pass to register.  */
-  const char *reference_pass_name;  /* Name of the reference pass for hooking
-                                       up the new pass.  */
-  int ref_pass_instance_number;     /* Insert the pass at the specified
-                                       instance number of the reference pass.
-                                       Do it for every instance if it is 0.  */
-  enum pass_positioning_ops pos_op; /* how to insert the new pass.  */
-};
-
-/* Registers a new pass.  Either fill out the register_pass_info or specify
-   the individual parameters.  The pass object is expected to have been
-   allocated using operator new and the pass manager takes the ownership of
-   the pass object.  */
-extern void register_pass (register_pass_info *);
-extern void register_pass (opt_pass* pass, pass_positioning_ops pos,
-			   const char* ref_pass_name, int ref_pass_inst_number);
-
-extern gimple_opt_pass *make_pass_asan (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_asan_O0 (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_tsan (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_tsan_O0 (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_lower_cf (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_refactor_eh (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_lower_eh (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_lower_eh_dispatch (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_lower_resx (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_build_cfg (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_early_tree_profile (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_cleanup_eh (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_sra (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_sra_early (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_early_ipa_sra (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_tail_recursion (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_tail_calls (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_tree_loop (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_tree_loop_init (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_lim (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_tree_unswitch (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_predcom (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_iv_canon (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_scev_cprop (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_empty_loop (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_record_bounds (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_graphite (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_graphite_transforms (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_if_conversion (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_loop_distribution (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_vectorize (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_slp_vectorize (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_complete_unroll (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_complete_unrolli (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_parallelize_loops (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_loop_prefetch (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_iv_optimize (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_tree_loop_done (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_ch (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_ccp (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_phi_only_cprop (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_build_ssa (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_build_alias (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_build_ealias (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_dominator (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_dce (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_dce_loop (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_cd_dce (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_call_cdce (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_merge_phi (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_split_crit_edges (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_pre (gcc::context *ctxt);
-extern unsigned int tail_merge_optimize (unsigned int);
-extern gimple_opt_pass *make_pass_profile (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_strip_predict_hints (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_lower_complex_O0 (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_lower_complex (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_lower_vector (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_lower_vector_ssa (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_lower_omp (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_diagnose_omp_blocks (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_expand_omp (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_object_sizes (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_strlen (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_fold_builtins (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_stdarg (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_early_warn_uninitialized (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_late_warn_uninitialized (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_cse_reciprocals (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_cse_sincos (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_optimize_bswap (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_optimize_widening_mul (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_warn_function_return (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_warn_function_noreturn (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_cselim (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_phiopt (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_forwprop (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_phiprop (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_tree_ifcombine (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_dse (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_nrv (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_rename_ssa_copies (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_sink_code (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_fre (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_check_data_deps (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_copy_prop (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_isolate_erroneous_paths (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_vrp (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_uncprop (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_return_slot (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_reassoc (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_rebuild_cgraph_edges (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_remove_cgraph_callee_edges (gcc::context
-							      *ctxt);
-extern gimple_opt_pass *make_pass_build_cgraph_edges (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_local_pure_const (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_tracer (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_warn_unused_result (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_diagnose_tm_blocks (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_lower_tm (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_tm_init (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_tm_mark (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_tm_memopt (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_tm_edges (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_split_functions (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_feedback_split_functions (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_strength_reduction (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_vtable_verify (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_ubsan (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_sanopt (gcc::context *ctxt);
-
-/* IPA Passes */
-extern simple_ipa_opt_pass *make_pass_ipa_lower_emutls (gcc::context *ctxt);
-extern simple_ipa_opt_pass
-							      *make_pass_ipa_function_and_variable_visibility (gcc::context *ctxt);
-extern simple_ipa_opt_pass *make_pass_ipa_tree_profile (gcc::context *ctxt);
-
-extern simple_ipa_opt_pass *make_pass_early_local_passes (gcc::context *ctxt);
-
-extern ipa_opt_pass_d *make_pass_ipa_whole_program_visibility (gcc::context
-							       *ctxt);
-extern simple_ipa_opt_pass *make_pass_ipa_increase_alignment (gcc::context
-							      *ctxt);
-extern ipa_opt_pass_d *make_pass_ipa_inline (gcc::context *ctxt);
-extern simple_ipa_opt_pass *make_pass_ipa_free_lang_data (gcc::context *ctxt);
-extern simple_ipa_opt_pass *make_pass_ipa_free_inline_summary (gcc::context
-							       *ctxt);
-extern ipa_opt_pass_d *make_pass_ipa_cp (gcc::context *ctxt);
-extern ipa_opt_pass_d *make_pass_ipa_devirt (gcc::context *ctxt);
-extern ipa_opt_pass_d *make_pass_ipa_reference (gcc::context *ctxt);
-extern ipa_opt_pass_d *make_pass_ipa_pure_const (gcc::context *ctxt);
-extern simple_ipa_opt_pass *make_pass_ipa_pta (gcc::context *ctxt);
-extern simple_ipa_opt_pass *make_pass_ipa_tm (gcc::context *ctxt);
-extern simple_ipa_opt_pass *make_pass_omp_simd_clone (gcc::context *ctxt);
-extern ipa_opt_pass_d *make_pass_ipa_profile (gcc::context *ctxt);
-extern ipa_opt_pass_d *make_pass_ipa_cdtor_merge (gcc::context *ctxt);
-
-extern gimple_opt_pass *make_pass_cleanup_cfg_post_optimizing (gcc::context
-							       *ctxt);
-extern gimple_opt_pass *make_pass_init_datastructures (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_fixup_cfg (gcc::context *ctxt);
-
-extern rtl_opt_pass *make_pass_expand (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_instantiate_virtual_regs (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_rtl_fwprop (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_rtl_fwprop_addr (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_jump (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_jump2 (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_lower_subreg (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_cse (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_fast_rtl_dce (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_ud_rtl_dce (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_rtl_dce (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_rtl_dse1 (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_rtl_dse2 (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_rtl_dse3 (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_rtl_cprop (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_rtl_pre (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_rtl_hoist (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_rtl_store_motion (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_cse_after_global_opts (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_rtl_ifcvt (gcc::context *ctxt);
-
-extern rtl_opt_pass *make_pass_into_cfg_layout_mode (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_outof_cfg_layout_mode (gcc::context *ctxt);
-
-extern rtl_opt_pass *make_pass_loop2 (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_rtl_loop_init (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_rtl_move_loop_invariants (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_rtl_unswitch (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_rtl_unroll_and_peel_loops (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_rtl_doloop (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_rtl_loop_done (gcc::context *ctxt);
-
-extern rtl_opt_pass *make_pass_web (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_cse2 (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_df_initialize_opt (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_df_initialize_no_opt (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_reginfo_init (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_inc_dec (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_stack_ptr_mod (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_initialize_regs (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_combine (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_if_after_combine (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_ree (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_partition_blocks (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_match_asm_constraints (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_split_all_insns (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_fast_rtl_byte_dce (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_lower_subreg2 (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_mode_switching (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_sms (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_sched (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_live_range_shrinkage (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_ira (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_reload (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_clean_state (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_branch_prob (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_value_profile_transformations (gcc::context
-							      *ctxt);
-extern rtl_opt_pass *make_pass_postreload_cse (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_gcse2 (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_split_after_reload (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_branch_target_load_optimize1 (gcc::context
-							     *ctxt);
-extern rtl_opt_pass *make_pass_thread_prologue_and_epilogue (gcc::context
-							     *ctxt);
-extern rtl_opt_pass *make_pass_stack_adjustments (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_peephole2 (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_if_after_reload (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_regrename (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_cprop_hardreg (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_reorder_blocks (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_branch_target_load_optimize2 (gcc::context
-							     *ctxt);
-extern rtl_opt_pass *make_pass_leaf_regs (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_split_before_sched2 (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_compare_elim_after_reload (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_sched2 (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_stack_regs (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_stack_regs_run (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_df_finish (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_compute_alignments (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_duplicate_computed_gotos (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_variable_tracking (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_free_cfg (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_machine_reorg (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_cleanup_barriers (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_delay_slots (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_split_for_shorten_branches (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_split_before_regstack (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_convert_to_eh_region_ranges (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_shorten_branches (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_set_nothrow_function_flags (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_dwarf2_frame (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_final (gcc::context *ctxt);
-extern rtl_opt_pass *make_pass_rtl_seqabstr (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_release_ssa_names (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_early_inline (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_inline_parameters (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_update_address_taken (gcc::context *ctxt);
-extern gimple_opt_pass *make_pass_convert_switch (gcc::context *ctxt);
-
-/* Current optimization pass.  */
-extern opt_pass *current_pass;
-
-extern bool execute_one_pass (opt_pass *);
-extern void execute_pass_list (opt_pass *);
-extern void execute_ipa_pass_list (opt_pass *);
-extern void execute_ipa_summary_passes (ipa_opt_pass_d *);
-extern void execute_all_ipa_transforms (void);
-extern void execute_all_ipa_stmt_fixups (struct cgraph_node *, gimple *);
-extern bool pass_init_dump_file (opt_pass *);
-extern void pass_fini_dump_file (opt_pass *);
-
-extern const char *get_current_pass_name (void);
-extern void print_current_pass (FILE *);
-extern void debug_pass (void);
-extern void ipa_write_summaries (void);
-extern void ipa_write_optimization_summaries (struct lto_symtab_encoder_d *);
-extern void ipa_read_summaries (void);
-extern void ipa_read_optimization_summaries (void);
-extern void register_one_dump_file (opt_pass *);
-extern bool function_called_by_processed_nodes_p (void);
-
-/* Set to true if the pass is called the first time during compilation of the
-   current function.  Note that using this information in the optimization
-   passes is considered not to be clean, and it should be avoided if possible.
-   This flag is currently used to prevent loops from being peeled repeatedly
-   in jump threading; it will be removed once we preserve loop structures
-   throughout the compilation -- we will be able to mark the affected loops
-   directly in jump threading, and avoid peeling them next time.  */
-extern bool first_pass_instance;
-
-/* Declare for plugins.  */
-extern void do_per_function_toporder (void (*) (void *), void *);
-
-extern void disable_pass (const char *);
-extern void enable_pass (const char *);
-extern void dump_passes (void);
-
-#endif /* GCC_TREE_PASS_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-phinodes.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-phinodes.h
deleted file mode 100644
index 1e5df83..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-phinodes.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* Header file for PHI node routines
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_PHINODES_H
-#define GCC_TREE_PHINODES_H
-
-extern void phinodes_print_statistics (void);
-extern void release_phi_node (gimple);
-extern void reserve_phi_args_for_new_edge (basic_block);
-extern void add_phi_node_to_bb (gimple phi, basic_block bb);
-extern gimple create_phi_node (tree, basic_block);
-extern void add_phi_arg (gimple, tree, edge, source_location);
-extern void remove_phi_args (edge);
-extern void remove_phi_node (gimple_stmt_iterator *, bool);
-extern void remove_phi_nodes (basic_block);
-extern tree degenerate_phi_result (gimple);
-extern void set_phi_nodes (basic_block, gimple_seq);
-
-static inline use_operand_p
-gimple_phi_arg_imm_use_ptr (gimple gs, int i)
-{
-  return &gimple_phi_arg (gs, i)->imm_use;
-}
-
-/* Return the phi argument which contains the specified use.  */
-
-static inline int
-phi_arg_index_from_use (use_operand_p use)
-{
-  struct phi_arg_d *element, *root;
-  size_t index;
-  gimple phi;
-
-  /* Since the use is the first thing in a PHI argument element, we can
-     calculate its index based on casting it to an argument, and performing
-     pointer arithmetic.  */
-
-  phi = USE_STMT (use);
-
-  element = (struct phi_arg_d *)use;
-  root = gimple_phi_arg (phi, 0);
-  index = element - root;
-
-  /* Make sure the calculation doesn't have any leftover bytes.  If it does,
-     then imm_use is likely not the first element in phi_arg_d.  */
-  gcc_checking_assert ((((char *)element - (char *)root)
-			% sizeof (struct phi_arg_d)) == 0
-		       && index < gimple_phi_capacity (phi));
-
- return index;
-}
-
-#endif /* GCC_TREE_PHINODES_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-pretty-print.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-pretty-print.h
deleted file mode 100644
index d2ab0b7..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-pretty-print.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Various declarations for language-independent pretty-print
-   subroutines that are only for use in the compilers proper and not
-   the driver or other programs.
-   Copyright (C) 2002-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_PRETTY_PRINT_H
-#define GCC_TREE_PRETTY_PRINT_H
-
-#include "pretty-print.h"
-#include "double-int.h"
-
-#define pp_unsupported_tree(PP, T)                         \
-  pp_verbatim (PP, "#%qs not supported by %s#", \
-	       get_tree_code_name (TREE_CODE (T)), __FUNCTION__)
-
-#define pp_ti_abstract_origin(TI) ((tree *) (TI)->x_data)
-
-
-extern void debug_generic_expr (tree);
-extern void debug_generic_stmt (tree);
-extern void debug_tree_chain (tree);
-extern void print_generic_decl (FILE *, tree, int);
-extern void print_generic_stmt (FILE *, tree, int);
-extern void print_generic_stmt_indented (FILE *, tree, int, int);
-extern void print_generic_expr (FILE *, tree, int);
-extern void dump_omp_clauses (pretty_printer *, tree, int, int);
-extern int dump_generic_node (pretty_printer *, tree, int, int, bool);
-extern void print_declaration (pretty_printer *, tree, int, int);
-extern int op_code_prio (enum tree_code);
-extern int op_prio (const_tree);
-extern const char *op_symbol_code (enum tree_code);
-extern void print_call_name (pretty_printer *, tree, int);
-extern void percent_K_format (text_info *);
-extern void pp_tree_identifier (pretty_printer *, tree);
-extern void dump_function_header (FILE *, tree, int);
-extern void pp_double_int (pretty_printer *pp, double_int d, bool uns);
-
-#endif /* ! GCC_TREE_PRETTY_PRINT_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-address.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-address.h
deleted file mode 100644
index 4eabc05..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-address.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Header file for memory address lowering and mode selection.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_SSA_ADDRESS_H
-#define GCC_TREE_SSA_ADDRESS_H
-
-extern rtx addr_for_mem_ref (struct mem_address *, addr_space_t, bool);
-extern rtx addr_for_mem_ref (tree exp, addr_space_t as, bool really_expand);
-extern void get_address_description (tree, struct mem_address *);
-extern tree tree_mem_ref_addr (tree, tree);
-tree create_mem_ref (gimple_stmt_iterator *, tree,
-		     struct aff_tree *, tree, tree, tree, bool);
-extern void copy_ref_info (tree, tree);
-tree maybe_fold_tmr (tree);
-
-#endif /* GCC_TREE_SSA_ADDRESS_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-alias.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-alias.h
deleted file mode 100644
index 3544aaf..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-alias.h
+++ /dev/null
@@ -1,172 +0,0 @@
-/* Tree based alias analysis and alias oracle.
-   Copyright (C) 2008-2014 Free Software Foundation, Inc.
-   Contributed by Richard Guenther  <rguenther@suse.de>
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify
-   under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   GCC 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with GCC; see the file COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef TREE_SSA_ALIAS_H
-#define TREE_SSA_ALIAS_H
-
-/* The points-to solution.
-
-   The points-to solution is a union of pt_vars and the abstract
-   sets specified by the flags.  */
-struct GTY(()) pt_solution
-{
-  /* Nonzero if points-to analysis couldn't determine where this pointer
-     is pointing to.  */
-  unsigned int anything : 1;
-
-  /* Nonzero if the points-to set includes any global memory.  Note that
-     even if this is zero pt_vars can still include global variables.  */
-  unsigned int nonlocal : 1;
-
-  /* Nonzero if the points-to set includes the local escaped solution by
-     reference.  */
-  unsigned int escaped : 1;
-
-  /* Nonzero if the points-to set includes the IPA escaped solution by
-     reference.  */
-  unsigned int ipa_escaped : 1;
-
-  /* Nonzero if the points-to set includes 'nothing', the points-to set
-     includes memory at address NULL.  */
-  unsigned int null : 1;
-
-
-  /* Nonzero if the vars bitmap includes a variable included in 'nonlocal'.  */
-  unsigned int vars_contains_nonlocal : 1;
-  /* Nonzero if the vars bitmap includes a variable included in 'escaped'.  */
-  unsigned int vars_contains_escaped : 1;
-  /* Nonzero if the vars bitmap includes a anonymous heap variable that
-     escaped the function and thus became global.  */
-  unsigned int vars_contains_escaped_heap : 1;
-
-  /* Set of variables that this pointer may point to.  */
-  bitmap vars;
-};
-
-
-/* Simplified and cached information about a memory reference tree.
-   Used by the alias-oracle internally and externally in alternate
-   interfaces.  */
-struct ao_ref
-{
-  /* The original full memory reference tree or NULL_TREE if that is
-     not available.  */
-  tree ref;
-
-  /* The following fields are the decomposed reference as returned
-     by get_ref_base_and_extent.  */
-  /* The base object of the memory reference or NULL_TREE if all of
-     the following fields are not yet computed.  */
-  tree base;
-  /* The offset relative to the base.  */
-  HOST_WIDE_INT offset;
-  /* The size of the access.  */
-  HOST_WIDE_INT size;
-  /* The maximum possible extent of the access or -1 if unconstrained.  */
-  HOST_WIDE_INT max_size;
-
-  /* The alias set of the access or -1 if not yet computed.  */
-  alias_set_type ref_alias_set;
-
-  /* The alias set of the base object or -1 if not yet computed.  */
-  alias_set_type base_alias_set;
-
-  /* Whether the memory is considered a volatile access.  */
-  bool volatile_p;
-};
-
-
-/* In tree-ssa-alias.c  */
-extern void ao_ref_init (ao_ref *, tree);
-extern void ao_ref_init_from_ptr_and_size (ao_ref *, tree, tree);
-extern tree ao_ref_base (ao_ref *);
-extern alias_set_type ao_ref_alias_set (ao_ref *);
-extern bool ptr_deref_may_alias_global_p (tree);
-extern bool ptr_derefs_may_alias_p (tree, tree);
-extern bool ref_may_alias_global_p (tree);
-extern bool refs_may_alias_p (tree, tree);
-extern bool refs_may_alias_p_1 (ao_ref *, ao_ref *, bool);
-extern bool refs_anti_dependent_p (tree, tree);
-extern bool refs_output_dependent_p (tree, tree);
-extern bool ref_maybe_used_by_stmt_p (gimple, tree);
-extern bool stmt_may_clobber_global_p (gimple);
-extern bool stmt_may_clobber_ref_p (gimple, tree);
-extern bool stmt_may_clobber_ref_p_1 (gimple, ao_ref *);
-extern bool call_may_clobber_ref_p (gimple, tree);
-extern bool stmt_kills_ref_p (gimple, tree);
-extern tree get_continuation_for_phi (gimple, ao_ref *,
-				      unsigned int *, bitmap *, bool);
-extern void *walk_non_aliased_vuses (ao_ref *, tree,
-				     void *(*)(ao_ref *, tree,
-					       unsigned int, void *),
-				     void *(*)(ao_ref *, tree, void *), void *);
-extern unsigned int walk_aliased_vdefs (ao_ref *, tree,
-					bool (*)(ao_ref *, tree, void *),
-					void *, bitmap *);
-extern void dump_alias_info (FILE *);
-extern void debug_alias_info (void);
-extern void dump_points_to_solution (FILE *, struct pt_solution *);
-extern void debug (pt_solution &ref);
-extern void debug (pt_solution *ptr);
-extern void dump_points_to_info_for (FILE *, tree);
-extern void debug_points_to_info_for (tree);
-extern void dump_alias_stats (FILE *);
-
-
-/* In tree-ssa-structalias.c  */
-extern unsigned int compute_may_aliases (void);
-extern bool pt_solution_empty_p (struct pt_solution *);
-extern bool pt_solution_singleton_p (struct pt_solution *, unsigned *);
-extern bool pt_solution_includes_global (struct pt_solution *);
-extern bool pt_solution_includes (struct pt_solution *, const_tree);
-extern bool pt_solutions_intersect (struct pt_solution *, struct pt_solution *);
-extern void pt_solution_reset (struct pt_solution *);
-extern void pt_solution_set (struct pt_solution *, bitmap, bool);
-extern void pt_solution_set_var (struct pt_solution *, tree);
-
-extern void dump_pta_stats (FILE *);
-
-extern GTY(()) struct pt_solution ipa_escaped_pt;
-
-/* Return true, if the two ranges [POS1, SIZE1] and [POS2, SIZE2]
-   overlap.  SIZE1 and/or SIZE2 can be (unsigned)-1 in which case the
-   range is open-ended.  Otherwise return false.  */
-
-static inline bool
-ranges_overlap_p (HOST_WIDE_INT pos1,
-		  unsigned HOST_WIDE_INT size1,
-		  HOST_WIDE_INT pos2,
-		  unsigned HOST_WIDE_INT size2)
-{
-  if (pos1 >= pos2
-      && (size2 == (unsigned HOST_WIDE_INT)-1
-	  || pos1 < (pos2 + (HOST_WIDE_INT) size2)))
-    return true;
-  if (pos2 >= pos1
-      && (size1 == (unsigned HOST_WIDE_INT)-1
-	  || pos2 < (pos1 + (HOST_WIDE_INT) size1)))
-    return true;
-
-  return false;
-}
-
-
-
-#endif /* TREE_SSA_ALIAS_H  */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-coalesce.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-coalesce.h
deleted file mode 100644
index 6760a16..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-coalesce.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Header file for tree-ssa-coalesce.c exports.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_SSA_COALESCE_H
-#define GCC_TREE_SSA_COALESCE_H
-
-extern var_map coalesce_ssa_name (void);
-
-#endif /* GCC_TREE_SSA_COALESCE_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-dom.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-dom.h
deleted file mode 100644
index af2f128..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-dom.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Header file for SSA dominator optimizations.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_SSA_DOM_H
-#define GCC_TREE_SSA_DOM_H
-
-extern void dump_dominator_optimization_stats (FILE *);
-extern void debug_dominator_optimization_stats (void);
-extern int loop_depth_of_name (tree);
-extern bool simple_iv_increment_p (gimple);
-
-#endif /* GCC_TREE_SSA_DOM_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-loop-ivopts.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-loop-ivopts.h
deleted file mode 100644
index 330bbe5..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-loop-ivopts.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Header file for Induction variable optimizations.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_SSA_LOOP_IVOPTS_H
-#define GCC_TREE_SSA_LOOP_IVOPTS_H
-
-extern edge single_dom_exit (struct loop *);
-extern void dump_iv (FILE *, struct iv *);
-extern void dump_use (FILE *, struct iv_use *);
-extern void dump_uses (FILE *, struct ivopts_data *);
-extern void dump_cand (FILE *, struct iv_cand *);
-extern bool contains_abnormal_ssa_name_p (tree);
-extern struct loop *outermost_invariant_loop_for_expr (struct loop *, tree);
-extern bool expr_invariant_in_loop_p (struct loop *, tree);
-bool may_be_nonaddressable_p (tree expr);
-bool multiplier_allowed_in_address_p (HOST_WIDE_INT, enum machine_mode,
-				      addr_space_t);
-void tree_ssa_iv_optimize (void);
-
-#endif /* GCC_TREE_SSA_LOOP_IVOPTS_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-loop-manip.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-loop-manip.h
deleted file mode 100644
index 67f9352..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-loop-manip.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Header file for High-level loop manipulation functions.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_SSA_LOOP_MANIP_H
-#define GCC_TREE_SSA_LOOP_MANIP_H
-
-typedef void (*transform_callback)(struct loop *, void *);
-
-extern void create_iv (tree, tree, tree, struct loop *, gimple_stmt_iterator *,
-		       bool, tree *, tree *);
-extern void rewrite_into_loop_closed_ssa (bitmap, unsigned);
-extern void verify_loop_closed_ssa (bool);
-extern basic_block split_loop_exit_edge (edge);
-extern basic_block ip_end_pos (struct loop *);
-extern basic_block ip_normal_pos (struct loop *);
-extern void standard_iv_increment_position (struct loop *,
-					    gimple_stmt_iterator *, bool *);
-extern bool gimple_duplicate_loop_to_header_edge (struct loop *, edge,
-						  unsigned int, sbitmap,
-						  edge, vec<edge> *,
-						  int);
-extern bool can_unroll_loop_p (struct loop *loop, unsigned factor,
-			       struct tree_niter_desc *niter);
-extern void tree_transform_and_unroll_loop (struct loop *, unsigned,
-					    edge, struct tree_niter_desc *,
-					    transform_callback, void *);
-extern void tree_unroll_loop (struct loop *, unsigned,
-			      edge, struct tree_niter_desc *);
-extern tree canonicalize_loop_ivs (struct loop *, tree *, bool);
-
-
-
-#endif /* GCC_TREE_SSA_LOOP_MANIP_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-loop-niter.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-loop-niter.h
deleted file mode 100644
index df0d64d..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-loop-niter.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Header file for loop interation estimates.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_SSA_LOOP_NITER_H
-#define GCC_TREE_SSA_LOOP_NITER_H
-
-extern tree expand_simple_operations (tree);
-extern bool loop_only_exit_p (const struct loop *, const_edge);
-extern bool number_of_iterations_exit (struct loop *, edge,
-				       struct tree_niter_desc *niter, bool,
-				       bool every_iteration = true);
-extern tree find_loop_niter (struct loop *, edge *);
-extern bool finite_loop_p (struct loop *);
-extern tree loop_niter_by_eval (struct loop *, edge);
-extern tree find_loop_niter_by_eval (struct loop *, edge *);
-extern bool estimated_loop_iterations (struct loop *, double_int *);
-extern HOST_WIDE_INT estimated_loop_iterations_int (struct loop *);
-extern bool max_loop_iterations (struct loop *, double_int *);
-extern HOST_WIDE_INT max_loop_iterations_int (struct loop *);
-extern HOST_WIDE_INT max_stmt_executions_int (struct loop *);
-extern HOST_WIDE_INT estimated_stmt_executions_int (struct loop *);
-extern bool max_stmt_executions (struct loop *, double_int *);
-extern bool estimated_stmt_executions (struct loop *, double_int *);
-extern void estimate_numbers_of_iterations (void);
-extern bool stmt_dominates_stmt_p (gimple, gimple);
-extern bool nowrap_type_p (tree);
-extern bool scev_probably_wraps_p (tree, tree, gimple, struct loop *, bool);
-extern void free_numbers_of_iterations_estimates_loop (struct loop *);
-extern void free_numbers_of_iterations_estimates (void);
-extern void substitute_in_loop_info (struct loop *, tree, tree);
-
-#endif /* GCC_TREE_SSA_LOOP_NITER_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-loop.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-loop.h
deleted file mode 100644
index 4684cda..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-loop.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* Header file for SSA loop optimizations.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_SSA_LOOP_H
-#define GCC_TREE_SSA_LOOP_H
-
-/* Affine iv.  */
-
-struct affine_iv
-{
-  /* Iv = BASE + STEP * i.  */
-  tree base, step;
-
-  /* True if this iv does not overflow.  */
-  bool no_overflow;
-};
-
-/* Description of number of iterations of a loop.  All the expressions inside
-   the structure can be evaluated at the end of the loop's preheader
-   (and due to ssa form, also anywhere inside the body of the loop).  */
-
-struct tree_niter_desc
-{
-  tree assumptions;	/* The boolean expression.  If this expression evaluates
-			   to false, then the other fields in this structure
-			   should not be used; there is no guarantee that they
-			   will be correct.  */
-  tree may_be_zero;	/* The boolean expression.  If it evaluates to true,
-			   the loop will exit in the first iteration (i.e.
-			   its latch will not be executed), even if the niter
-			   field says otherwise.  */
-  tree niter;		/* The expression giving the number of iterations of
-			   a loop (provided that assumptions == true and
-			   may_be_zero == false), more precisely the number
-			   of executions of the latch of the loop.  */
-  double_int max;	/* The upper bound on the number of iterations of
-			   the loop.  */
-
-  /* The simplified shape of the exit condition.  The loop exits if
-     CONTROL CMP BOUND is false, where CMP is one of NE_EXPR,
-     LT_EXPR, or GT_EXPR, and step of CONTROL is positive if CMP is
-     LE_EXPR and negative if CMP is GE_EXPR.  This information is used
-     by loop unrolling.  */
-  affine_iv control;
-  tree bound;
-  enum tree_code cmp;
-};
-
-extern bool for_each_index (tree *, bool (*) (tree, tree *, void *), void *);
-extern char *get_lsm_tmp_name (tree ref, unsigned n, const char *suffix = NULL);
-extern unsigned tree_num_loop_insns (struct loop *, struct eni_weights_d *);
-
-/* Returns the loop of the statement STMT.  */
-
-static inline struct loop *
-loop_containing_stmt (gimple stmt)
-{
-  basic_block bb = gimple_bb (stmt);
-  if (!bb)
-    return NULL;
-
-  return bb->loop_father;
-}
-
-#endif /* GCC_TREE_SSA_LOOP_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-operands.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-operands.h
deleted file mode 100644
index 5f9edd4..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-operands.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/* SSA operand management for trees.
-   Copyright (C) 2003-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_SSA_OPERANDS_H
-#define GCC_TREE_SSA_OPERANDS_H
-
-/* Interface to SSA operands.  */
-
-
-/* This represents a pointer to a DEF operand.  */
-typedef tree *def_operand_p;
-
-/* This represents a pointer to a USE operand.  */
-typedef ssa_use_operand_t *use_operand_p;
-
-/* NULL operand types.  */
-#define NULL_USE_OPERAND_P 		((use_operand_p)NULL)
-#define NULL_DEF_OPERAND_P 		((def_operand_p)NULL)
-
-/* This represents the USE operands of a stmt.  */
-struct use_optype_d
-{
-  struct use_optype_d *next;
-  struct ssa_use_operand_t use_ptr;
-};
-typedef struct use_optype_d *use_optype_p;
-
-/* This structure represents a variable sized buffer which is allocated by the
-   operand memory manager.  Operands are suballocated out of this block.  The
-   MEM array varies in size.  */
-
-struct GTY((chain_next("%h.next"), variable_size)) ssa_operand_memory_d {
-  struct ssa_operand_memory_d *next;
-  char mem[1];
-};
-
-/* Per-function operand caches.  */
-struct GTY(()) ssa_operands {
-   struct ssa_operand_memory_d *operand_memory;
-   unsigned operand_memory_index;
-   /* Current size of the operand memory buffer.  */
-   unsigned int ssa_operand_mem_size;
-
-   bool ops_active;
-
-   struct use_optype_d * GTY ((skip (""))) free_uses;
-};
-
-#define USE_FROM_PTR(PTR)	get_use_from_ptr (PTR)
-#define DEF_FROM_PTR(PTR)	get_def_from_ptr (PTR)
-#define SET_USE(USE, V)		set_ssa_use_from_ptr (USE, V)
-#define SET_DEF(DEF, V)		((*(DEF)) = (V))
-
-#define USE_STMT(USE)		(USE)->loc.stmt
-
-#define USE_OP_PTR(OP)		(&((OP)->use_ptr))
-#define USE_OP(OP)		(USE_FROM_PTR (USE_OP_PTR (OP)))
-
-#define PHI_RESULT_PTR(PHI)	gimple_phi_result_ptr (PHI)
-#define PHI_RESULT(PHI)		DEF_FROM_PTR (PHI_RESULT_PTR (PHI))
-#define SET_PHI_RESULT(PHI, V)	SET_DEF (PHI_RESULT_PTR (PHI), (V))
-/*
-#define PHI_ARG_DEF(PHI, I)	USE_FROM_PTR (PHI_ARG_DEF_PTR ((PHI), (I)))
-*/
-#define PHI_ARG_DEF_PTR(PHI, I)	gimple_phi_arg_imm_use_ptr ((PHI), (I))
-#define PHI_ARG_DEF(PHI, I)	gimple_phi_arg_def ((PHI), (I))
-#define SET_PHI_ARG_DEF(PHI, I, V)					\
-				SET_USE (PHI_ARG_DEF_PTR ((PHI), (I)), (V))
-#define PHI_ARG_DEF_FROM_EDGE(PHI, E)					\
-				PHI_ARG_DEF ((PHI), (E)->dest_idx)
-#define PHI_ARG_DEF_PTR_FROM_EDGE(PHI, E)				\
-				PHI_ARG_DEF_PTR ((PHI), (E)->dest_idx)
-#define PHI_ARG_INDEX_FROM_USE(USE)   phi_arg_index_from_use (USE)
-
-
-extern bool ssa_operands_active (struct function *);
-extern void init_ssa_operands (struct function *fn);
-extern void fini_ssa_operands (struct function *);
-extern bool verify_ssa_operands (struct function *, gimple stmt);
-extern void free_stmt_operands (struct function *, gimple);
-extern void update_stmt_operands (struct function *, gimple);
-extern void swap_ssa_operands (gimple, tree *, tree *);
-extern bool verify_imm_links (FILE *f, tree var);
-
-extern void dump_immediate_uses_for (FILE *file, tree var);
-extern void dump_immediate_uses (FILE *file);
-extern void debug_immediate_uses (void);
-extern void debug_immediate_uses_for (tree var);
-
-extern void unlink_stmt_vdef (gimple);
-
-/* Return the tree pointed-to by USE.  */
-static inline tree
-get_use_from_ptr (use_operand_p use)
-{
-  return *(use->use);
-}
-
-/* Return the tree pointed-to by DEF.  */
-static inline tree
-get_def_from_ptr (def_operand_p def)
-{
-  return *def;
-}
-
-#endif  /* GCC_TREE_SSA_OPERANDS_H  */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-sccvn.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-sccvn.h
deleted file mode 100644
index f52783a..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-sccvn.h
+++ /dev/null
@@ -1,244 +0,0 @@
-/* Tree SCC value numbering
-   Copyright (C) 2007-2014 Free Software Foundation, Inc.
-   Contributed by Daniel Berlin <dberlin@dberlin.org>
-
-   This file is part of GCC.
-
-   GCC is free software; you can redistribute it and/or modify
-   under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   GCC 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 General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with GCC; see the file COPYING3.  If not see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef TREE_SSA_SCCVN_H
-#define TREE_SSA_SCCVN_H
-
-/* In tree-ssa-sccvn.c  */
-bool expressions_equal_p (tree, tree);
-
-
-/* TOP of the VN lattice.  */
-extern tree VN_TOP;
-
-/* N-ary operations in the hashtable consist of length operands, an
-   opcode, and a type.  Result is the value number of the operation,
-   and hashcode is stored to avoid having to calculate it
-   repeatedly.  */
-
-typedef struct vn_nary_op_s
-{
-  /* Unique identify that all expressions with the same value have. */
-  unsigned int value_id;
-  ENUM_BITFIELD(tree_code) opcode : 16;
-  unsigned length : 16;
-  hashval_t hashcode;
-  tree result;
-  tree type;
-  tree op[1];
-} *vn_nary_op_t;
-typedef const struct vn_nary_op_s *const_vn_nary_op_t;
-
-/* Return the size of a vn_nary_op_t with LENGTH operands.  */
-
-static inline size_t
-sizeof_vn_nary_op (unsigned int length)
-{
-  return sizeof (struct vn_nary_op_s) + sizeof (tree) * length - sizeof (tree);
-}
-
-/* Phi nodes in the hashtable consist of their non-VN_TOP phi
-   arguments, and the basic block the phi is in. Result is the value
-   number of the operation, and hashcode is stored to avoid having to
-   calculate it repeatedly.  Phi nodes not in the same block are never
-   considered equivalent.  */
-
-typedef struct vn_phi_s
-{
-  /* Unique identifier that all expressions with the same value have. */
-  unsigned int value_id;
-  hashval_t hashcode;
-  vec<tree> phiargs;
-  basic_block block;
-  tree type;
-  tree result;
-} *vn_phi_t;
-typedef const struct vn_phi_s *const_vn_phi_t;
-
-/* Reference operands only exist in reference operations structures.
-   They consist of an opcode, type, and some number of operands.  For
-   a given opcode, some, all, or none of the operands may be used.
-   The operands are there to store the information that makes up the
-   portion of the addressing calculation that opcode performs.  */
-
-typedef struct vn_reference_op_struct
-{
-  enum tree_code opcode;
-  /* Constant offset this op adds or -1 if it is variable.  */
-  HOST_WIDE_INT off;
-  tree type;
-  tree op0;
-  tree op1;
-  tree op2;
-} vn_reference_op_s;
-typedef vn_reference_op_s *vn_reference_op_t;
-typedef const vn_reference_op_s *const_vn_reference_op_t;
-
-
-/* A reference operation in the hashtable is representation as
-   the vuse, representing the memory state at the time of
-   the operation, and a collection of operands that make up the
-   addressing calculation.  If two vn_reference_t's have the same set
-   of operands, they access the same memory location. We also store
-   the resulting value number, and the hashcode.  */
-
-typedef struct vn_reference_s
-{
-  /* Unique identifier that all expressions with the same value have. */
-  unsigned int value_id;
-  hashval_t hashcode;
-  tree vuse;
-  alias_set_type set;
-  tree type;
-  vec<vn_reference_op_s> operands;
-  tree result;
-  tree result_vdef;
-} *vn_reference_t;
-typedef const struct vn_reference_s *const_vn_reference_t;
-
-typedef struct vn_constant_s
-{
-  unsigned int value_id;
-  hashval_t hashcode;
-  tree constant;
-} *vn_constant_t;
-
-enum vn_kind { VN_NONE, VN_CONSTANT, VN_NARY, VN_REFERENCE, VN_PHI };
-enum vn_kind vn_get_stmt_kind (gimple);
-
-/* Hash the type TYPE using bits that distinguishes it in the
-   types_compatible_p sense.  */
-
-static inline hashval_t
-vn_hash_type (tree type)
-{
-  return (INTEGRAL_TYPE_P (type)
-	  + (INTEGRAL_TYPE_P (type)
-	     ? TYPE_PRECISION (type) + TYPE_UNSIGNED (type) : 0));
-}
-
-/* Hash the constant CONSTANT with distinguishing type incompatible
-   constants in the types_compatible_p sense.  */
-
-static inline hashval_t
-vn_hash_constant_with_type (tree constant)
-{
-  return (iterative_hash_expr (constant, 0)
-	  + vn_hash_type (TREE_TYPE (constant)));
-}
-
-/* Compare the constants C1 and C2 with distinguishing type incompatible
-   constants in the types_compatible_p sense.  */
-
-static inline bool
-vn_constant_eq_with_type (tree c1, tree c2)
-{
-  return (expressions_equal_p (c1, c2)
-	  && types_compatible_p (TREE_TYPE (c1), TREE_TYPE (c2)));
-}
-
-typedef struct vn_ssa_aux
-{
-  /* Value number. This may be an SSA name or a constant.  */
-  tree valnum;
-  /* Representative expression, if not a direct constant. */
-  tree expr;
-
-  /* Unique identifier that all expressions with the same value have. */
-  unsigned int value_id;
-
-  /* SCC information.  */
-  unsigned int dfsnum;
-  unsigned int low;
-  unsigned visited : 1;
-  unsigned on_sccstack : 1;
-
-  /* Whether the representative expression contains constants.  */
-  unsigned has_constants : 1;
-  /* Whether the SSA_NAME has been value numbered already.  This is
-     only saying whether visit_use has been called on it at least
-     once.  It cannot be used to avoid visitation for SSA_NAME's
-     involved in non-singleton SCC's.  */
-  unsigned use_processed : 1;
-
-  /* Whether the SSA_NAME has no defining statement and thus an
-     insertion of such with EXPR as definition is required before
-     a use can be created of it.  */
-  unsigned needs_insertion : 1;
-} *vn_ssa_aux_t;
-
-typedef enum { VN_NOWALK, VN_WALK, VN_WALKREWRITE } vn_lookup_kind;
-
-/* Return the value numbering info for an SSA_NAME.  */
-extern vn_ssa_aux_t VN_INFO (tree);
-extern vn_ssa_aux_t VN_INFO_GET (tree);
-tree vn_get_expr_for (tree);
-bool run_scc_vn (vn_lookup_kind);
-void free_scc_vn (void);
-tree vn_nary_op_lookup (tree, vn_nary_op_t *);
-tree vn_nary_op_lookup_stmt (gimple, vn_nary_op_t *);
-tree vn_nary_op_lookup_pieces (unsigned int, enum tree_code,
-			       tree, tree *, vn_nary_op_t *);
-vn_nary_op_t vn_nary_op_insert (tree, tree);
-vn_nary_op_t vn_nary_op_insert_stmt (gimple, tree);
-vn_nary_op_t vn_nary_op_insert_pieces (unsigned int, enum tree_code,
-				       tree, tree *, tree, unsigned int);
-void vn_reference_fold_indirect (vec<vn_reference_op_s> *,
-				 unsigned int *);
-void copy_reference_ops_from_ref (tree, vec<vn_reference_op_s> *);
-void copy_reference_ops_from_call (gimple, vec<vn_reference_op_s> *);
-bool ao_ref_init_from_vn_reference (ao_ref *, alias_set_type, tree,
-				    vec<vn_reference_op_s> );
-tree vn_reference_lookup_pieces (tree, alias_set_type, tree,
-				 vec<vn_reference_op_s> ,
-				 vn_reference_t *, vn_lookup_kind);
-tree vn_reference_lookup (tree, tree, vn_lookup_kind, vn_reference_t *);
-vn_reference_t vn_reference_insert (tree, tree, tree, tree);
-vn_reference_t vn_reference_insert_pieces (tree, alias_set_type, tree,
-					   vec<vn_reference_op_s> ,
-					   tree, unsigned int);
-
-hashval_t vn_nary_op_compute_hash (const vn_nary_op_t);
-bool vn_nary_op_eq (const_vn_nary_op_t const vno1,
-		    const_vn_nary_op_t const vno2);
-bool vn_nary_may_trap (vn_nary_op_t);
-hashval_t vn_reference_compute_hash (const vn_reference_t);
-bool vn_reference_eq (const_vn_reference_t const, const_vn_reference_t const);
-unsigned int get_max_value_id (void);
-unsigned int get_next_value_id (void);
-unsigned int get_constant_value_id (tree);
-unsigned int get_or_alloc_constant_value_id (tree);
-bool value_id_constant_p (unsigned int);
-tree fully_constant_vn_reference_p (vn_reference_t);
-
-/* Valueize NAME if it is an SSA name, otherwise just return it.  */
-
-static inline tree
-vn_valueize (tree name)
-{
-  if (TREE_CODE (name) == SSA_NAME)
-    {
-      tree tem = VN_INFO (name)->valnum;
-      return tem == VN_TOP ? name : tem;
-    }
-  return name;
-}
-
-#endif /* TREE_SSA_SCCVN_H  */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-ter.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-ter.h
deleted file mode 100644
index b9348be..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-ter.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Header file for tree-ssa-ter.c exports.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_SSA_TER_H
-#define GCC_TREE_SSA_TER_H
-
-extern bitmap find_replaceable_exprs (var_map);
-extern void dump_replaceable_exprs (FILE *, bitmap);
-
-#endif /* GCC_TREE_SSA_TER_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-threadedge.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-threadedge.h
deleted file mode 100644
index f005607..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-threadedge.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Header file for SSA jump threading.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_SSA_THREADEDGE_H
-#define GCC_TREE_SSA_THREADEDGE_H
-
-extern vec<tree> ssa_name_values;
-#define SSA_NAME_VALUE(x) \
-    (SSA_NAME_VERSION (x) < ssa_name_values.length () \
-     ? ssa_name_values[SSA_NAME_VERSION (x)] \
-     : NULL_TREE)
-extern void set_ssa_name_value (tree, tree);
-extern void threadedge_initialize_values (void);
-extern void threadedge_finalize_values (void);
-extern bool potentially_threadable_block (basic_block);
-extern void propagate_threaded_block_debug_into (basic_block, basic_block);
-extern void thread_across_edge (gimple, edge, bool,
-				vec<tree> *, tree (*) (gimple, gimple));
-
-#endif /* GCC_TREE_SSA_THREADEDGE_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-threadupdate.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-threadupdate.h
deleted file mode 100644
index 426aca5..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa-threadupdate.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Communication between registering jump thread requests and
-   updating the SSA/CFG for jump threading.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
-
-GCC 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef _TREE_SSA_THREADUPDATE_H
-#define _TREE_SSA_THREADUPDATE_H 1
-
-/* In tree-ssa-threadupdate.c.  */
-extern bool thread_through_all_blocks (bool);
-enum jump_thread_edge_type
-{
-  EDGE_START_JUMP_THREAD,
-  EDGE_COPY_SRC_BLOCK,
-  EDGE_COPY_SRC_JOINER_BLOCK,
-  EDGE_NO_COPY_SRC_BLOCK
-};
-
-class jump_thread_edge
-{
-public:
-  jump_thread_edge (edge e, enum jump_thread_edge_type type)
-    : e (e), type (type) {}
-
-  edge e;
-  enum jump_thread_edge_type type;
-};
-
-extern void register_jump_thread (vec <class jump_thread_edge *> *);
-extern void delete_jump_thread_path (vec <class jump_thread_edge *> *);
-#endif
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa.h
deleted file mode 100644
index 1b1a986..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssa.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/* Header file for any pass which requires SSA routines.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_SSA_H
-#define GCC_TREE_SSA_H
-
-/* Mapping for redirected edges.  */
-struct _edge_var_map {
-  tree result;			/* PHI result.  */
-  tree def;			/* PHI arg definition.  */
-  source_location locus;        /* PHI arg location.  */
-};
-typedef struct _edge_var_map edge_var_map;
-
-/* A vector of var maps.  */
-typedef vec<edge_var_map, va_heap, vl_embed> edge_var_map_vector;
-
-
-extern void redirect_edge_var_map_add (edge, tree, tree, source_location);
-extern void redirect_edge_var_map_clear (edge);
-extern void redirect_edge_var_map_dup (edge, edge);
-extern edge_var_map_vector *redirect_edge_var_map_vector (edge);
-extern void redirect_edge_var_map_destroy (void);
-extern edge ssa_redirect_edge (edge, basic_block);
-extern void flush_pending_stmts (edge);
-extern void gimple_replace_ssa_lhs (gimple, tree);
-extern tree target_for_debug_bind (tree);
-extern void insert_debug_temp_for_var_def (gimple_stmt_iterator *, tree);
-extern void insert_debug_temps_for_defs (gimple_stmt_iterator *);
-extern void reset_debug_uses (gimple);
-extern void release_defs_bitset (bitmap toremove);
-extern void verify_ssa (bool);
-extern void init_tree_ssa (struct function *);
-extern void delete_tree_ssa (void);
-extern bool tree_ssa_useless_type_conversion (tree);
-extern tree tree_ssa_strip_useless_type_conversions (tree);
-
-extern bool ssa_undefined_value_p (tree);
-extern void execute_update_addresses_taken (void);
-
-/* Given an edge_var_map V, return the PHI arg definition.  */
-
-static inline tree
-redirect_edge_var_map_def (edge_var_map *v)
-{
-  return v->def;
-}
-
-/* Given an edge_var_map V, return the PHI result.  */
-
-static inline tree
-redirect_edge_var_map_result (edge_var_map *v)
-{
-  return v->result;
-}
-
-/* Given an edge_var_map V, return the PHI arg location.  */
-
-static inline source_location
-redirect_edge_var_map_location (edge_var_map *v)
-{
-  return v->locus;
-}
-
-
-#endif /* GCC_TREE_SSA_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssanames.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssanames.h
deleted file mode 100644
index bb3b5e6..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree-ssanames.h
+++ /dev/null
@@ -1,152 +0,0 @@
-/* SSA name expresssons routines
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
- for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_SSANAMES_H
-#define GCC_TREE_SSANAMES_H
-
-/* Aliasing information for SSA_NAMEs representing pointer variables.  */
-
-struct GTY(()) ptr_info_def
-{
-  /* The points-to solution.  */
-  struct pt_solution pt;
-
-  /* Alignment and misalignment of the pointer in bytes.  Together
-     align and misalign specify low known bits of the pointer.
-     ptr & (align - 1) == misalign.  */
-
-  /* When known, this is the power-of-two byte alignment of the object this
-     pointer points into.  This is usually DECL_ALIGN_UNIT for decls and
-     MALLOC_ABI_ALIGNMENT for allocated storage.  When the alignment is not
-     known, it is zero.  Do not access directly but use functions
-     get_ptr_info_alignment, set_ptr_info_alignment,
-     mark_ptr_info_alignment_unknown and similar.  */
-  unsigned int align;
-
-  /* When alignment is known, the byte offset this pointer differs from the
-     above alignment.  Access only through the same helper functions as align
-     above.  */
-  unsigned int misalign;
-};
-
-/* Value range information for SSA_NAMEs representing non-pointer variables.  */
-
-struct GTY (()) range_info_def {
-  /* Minimum for value range.  */
-  double_int min;
-  /* Maximum for value range.  */
-  double_int max;
-  /* Non-zero bits - bits not set are guaranteed to be always zero.  */
-  double_int nonzero_bits;
-};
-
-
-#define SSANAMES(fun) (fun)->gimple_df->ssa_names
-#define MODIFIED_NORETURN_CALLS(fun) (fun)->gimple_df->modified_noreturn_calls
-#define DEFAULT_DEFS(fun) (fun)->gimple_df->default_defs
-
-#define num_ssa_names (vec_safe_length (cfun->gimple_df->ssa_names))
-#define ssa_name(i) ((*cfun->gimple_df->ssa_names)[(i)])
-
-
-/* Type of value ranges.  See value_range_d In tree-vrp.c for a
-   description of these types.  */
-enum value_range_type { VR_UNDEFINED, VR_RANGE, VR_ANTI_RANGE, VR_VARYING };
-
-/* Sets the value range to SSA.  */
-extern void set_range_info (tree, enum value_range_type, double_int,
-			    double_int);
-/* Gets the value range from SSA.  */
-extern enum value_range_type get_range_info (const_tree, double_int *,
-					     double_int *);
-extern void set_nonzero_bits (tree, double_int);
-extern double_int get_nonzero_bits (const_tree);
-extern void init_ssanames (struct function *, int);
-extern void fini_ssanames (void);
-extern void ssanames_print_statistics (void);
-extern tree make_ssa_name_fn (struct function *, tree, gimple);
-extern void release_ssa_name_fn (struct function *, tree);
-extern bool get_ptr_info_alignment (struct ptr_info_def *, unsigned int *,
-				    unsigned int *);
-extern void mark_ptr_info_alignment_unknown (struct ptr_info_def *);
-extern void set_ptr_info_alignment (struct ptr_info_def *, unsigned int,
-				    unsigned int);
-extern void adjust_ptr_info_misalignment (struct ptr_info_def *,
-					  unsigned int);
-extern struct ptr_info_def *get_ptr_info (tree);
-
-extern tree copy_ssa_name_fn (struct function *, tree, gimple);
-extern void duplicate_ssa_name_ptr_info (tree, struct ptr_info_def *);
-extern tree duplicate_ssa_name_fn (struct function *, tree, gimple);
-extern void duplicate_ssa_name_range_info (tree, enum value_range_type,
-					   struct range_info_def *);
-extern void release_defs (gimple);
-extern void replace_ssa_name_symbol (tree, tree);
-
-
-/* Return an SSA_NAME node for variable VAR defined in statement STMT
-   in function cfun.  */
-
-static inline tree
-make_ssa_name (tree var, gimple stmt)
-{
-  return make_ssa_name_fn (cfun, var, stmt);
-}
-
-/* Return an SSA_NAME node using the template SSA name NAME defined in
-   statement STMT in function cfun.  */
-
-static inline tree
-copy_ssa_name (tree var, gimple stmt)
-{
-  return copy_ssa_name_fn (cfun, var, stmt);
-}
-
-/*  Creates a duplicate of a SSA name NAME tobe defined by statement STMT
-    in function cfun.  */
-
-static inline tree
-duplicate_ssa_name (tree var, gimple stmt)
-{
-  return duplicate_ssa_name_fn (cfun, var, stmt);
-}
-
-/* Release the SSA name NAME used in function cfun.  */
-
-static inline void
-release_ssa_name (tree name)
-{
-  release_ssa_name_fn (cfun, name);
-}
-
-/* Return an anonymous SSA_NAME node for type TYPE defined in statement STMT
-   in function cfun.  Arrange so that it uses NAME in dumps.  */
-
-static inline tree
-make_temp_ssa_name (tree type, gimple stmt, const char *name)
-{
-  tree ssa_name;
-  gcc_checking_assert (TYPE_P (type));
-  ssa_name = make_ssa_name_fn (cfun, type, stmt);
-  SET_SSA_NAME_VAR_OR_IDENTIFIER (ssa_name, get_identifier (name));
-  return ssa_name;
-}
-
-
-#endif /* GCC_TREE_SSANAMES_H */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree.def
deleted file mode 100644
index f8d6444..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree.def
+++ /dev/null
@@ -1,1297 +0,0 @@
-/* This file contains the definitions and documentation for the
-   tree codes used in GCC.
-   Copyright (C) 1987-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-
-/* For tcc_references, tcc_expression, tcc_comparison, tcc_unary,
-   tcc_binary, and tcc_statement nodes, which use struct tree_exp, the
-   4th element is the number of argument slots to allocate.  This
-   determines the size of the tree node object.  Other nodes use
-   different structures, and the size is determined by the tree_union
-   member structure; the 4th element should be zero.  Languages that
-   define language-specific tcc_exceptional or tcc_constant codes must
-   define the tree_size langhook to say how big they are.
-
-   These tree codes have been sorted so that the macros in tree.h that
-   check for various tree codes are optimized into range checks.  This
-   gives a measurable performance improvement.  When adding a new
-   code, consider its placement in relation to the other codes.  */
-
-/* Any erroneous construct is parsed into a node of this type.
-   This type of node is accepted without complaint in all contexts
-   by later parsing activities, to avoid multiple error messages
-   for one error.
-   No fields in these nodes are used except the TREE_CODE.  */
-DEFTREECODE (ERROR_MARK, "error_mark", tcc_exceptional, 0)
-
-/* Used to represent a name (such as, in the DECL_NAME of a decl node).
-   Internally it looks like a STRING_CST node.
-   There is only one IDENTIFIER_NODE ever made for any particular name.
-   Use `get_identifier' to get it (or create it, the first time).  */
-DEFTREECODE (IDENTIFIER_NODE, "identifier_node", tcc_exceptional, 0)
-
-/* Has the TREE_VALUE and TREE_PURPOSE fields.  */
-/* These nodes are made into lists by chaining through the
-   TREE_CHAIN field.  The elements of the list live in the
-   TREE_VALUE fields, while TREE_PURPOSE fields are occasionally
-   used as well to get the effect of Lisp association lists.  */
-DEFTREECODE (TREE_LIST, "tree_list", tcc_exceptional, 0)
-
-/* These nodes contain an array of tree nodes.  */
-DEFTREECODE (TREE_VEC, "tree_vec", tcc_exceptional, 0)
-
-/* A symbol binding block.  These are arranged in a tree,
-   where the BLOCK_SUBBLOCKS field contains a chain of subblocks
-   chained through the BLOCK_CHAIN field.
-   BLOCK_SUPERCONTEXT points to the parent block.
-     For a block which represents the outermost scope of a function, it
-     points to the FUNCTION_DECL node.
-   BLOCK_VARS points to a chain of decl nodes.
-   BLOCK_CHAIN points to the next BLOCK at the same level.
-   BLOCK_ABSTRACT_ORIGIN points to the original (abstract) tree node which
-   this block is an instance of, or else is NULL to indicate that this
-   block is not an instance of anything else.  When non-NULL, the value
-   could either point to another BLOCK node or it could point to a
-   FUNCTION_DECL node (e.g. in the case of a block representing the
-   outermost scope of a particular inlining of a function).
-   BLOCK_ABSTRACT is nonzero if the block represents an abstract
-   instance of a block (i.e. one which is nested within an abstract
-   instance of an inline function).
-   TREE_ASM_WRITTEN is nonzero if the block was actually referenced
-   in the generated assembly.  */
-DEFTREECODE (BLOCK, "block", tcc_exceptional, 0)
-
-/* Each data type is represented by a tree node whose code is one of
-   the following:  */
-/* Each node that represents a data type has a component TYPE_SIZE
-   containing a tree that is an expression for the size in bits.
-   The TYPE_MODE contains the machine mode for values of this type.
-   The TYPE_POINTER_TO field contains a type for a pointer to this type,
-     or zero if no such has been created yet.
-   The TYPE_NEXT_VARIANT field is used to chain together types
-     that are variants made by type modifiers such as "const" and "volatile".
-   The TYPE_MAIN_VARIANT field, in any member of such a chain,
-     points to the start of the chain.
-   The TYPE_NAME field contains info on the name used in the program
-     for this type (for GDB symbol table output).  It is either a
-     TYPE_DECL node, for types that are typedefs, or an IDENTIFIER_NODE
-     in the case of structs, unions or enums that are known with a tag,
-     or zero for types that have no special name.
-   The TYPE_CONTEXT for any sort of type which could have a name or
-    which could have named members (e.g. tagged types in C/C++) will
-    point to the node which represents the scope of the given type, or
-    will be NULL_TREE if the type has "file scope".  For most types, this
-    will point to a BLOCK node or a FUNCTION_DECL node, but it could also
-    point to a FUNCTION_TYPE node (for types whose scope is limited to the
-    formal parameter list of some function type specification) or it
-    could point to a RECORD_TYPE, UNION_TYPE or QUAL_UNION_TYPE node
-    (for C++ "member" types).
-    For non-tagged-types, TYPE_CONTEXT need not be set to anything in
-    particular, since any type which is of some type category  (e.g.
-    an array type or a function type) which cannot either have a name
-    itself or have named members doesn't really have a "scope" per se.
-  The TREE_CHAIN field is used as a forward-references to names for
-    ENUMERAL_TYPE, RECORD_TYPE, UNION_TYPE, and QUAL_UNION_TYPE nodes;
-    see below.  */
-
-/* The ordering of the following codes is optimized for the checking
-   macros in tree.h.  Changing the order will degrade the speed of the
-   compiler.  OFFSET_TYPE, ENUMERAL_TYPE, BOOLEAN_TYPE, INTEGER_TYPE,
-   REAL_TYPE, POINTER_TYPE.  */
-
-/* An offset is a pointer relative to an object.
-   The TREE_TYPE field is the type of the object at the offset.
-   The TYPE_OFFSET_BASETYPE points to the node for the type of object
-   that the offset is relative to.  */
-DEFTREECODE (OFFSET_TYPE, "offset_type", tcc_type, 0)
-
-/* C enums.  The type node looks just like an INTEGER_TYPE node.
-   The symbols for the values of the enum type are defined by
-   CONST_DECL nodes, but the type does not point to them;
-   however, the TYPE_VALUES is a list in which each element's TREE_PURPOSE
-   is a name and the TREE_VALUE is the value (an INTEGER_CST node).  */
-/* A forward reference `enum foo' when no enum named foo is defined yet
-   has zero (a null pointer) in its TYPE_SIZE.  The tag name is in
-   the TYPE_NAME field.  If the type is later defined, the normal
-   fields are filled in.
-   RECORD_TYPE, UNION_TYPE, and QUAL_UNION_TYPE forward refs are
-   treated similarly.  */
-DEFTREECODE (ENUMERAL_TYPE, "enumeral_type", tcc_type, 0)
-
-/* Boolean type (true or false are the only values).  Looks like an
-   INTEGRAL_TYPE.  */
-DEFTREECODE (BOOLEAN_TYPE, "boolean_type", tcc_type, 0)
-
-/* Integer types in all languages, including char in C.
-   Also used for sub-ranges of other discrete types.
-   Has components TYPE_MIN_VALUE, TYPE_MAX_VALUE (expressions, inclusive)
-   and TYPE_PRECISION (number of bits used by this type).
-   In the case of a subrange type in Pascal, the TREE_TYPE
-   of this will point at the supertype (another INTEGER_TYPE,
-   or an ENUMERAL_TYPE or BOOLEAN_TYPE).
-   Otherwise, the TREE_TYPE is zero.  */
-DEFTREECODE (INTEGER_TYPE, "integer_type", tcc_type, 0)
-
-/* C's float and double.  Different floating types are distinguished
-   by machine mode and by the TYPE_SIZE and the TYPE_PRECISION.  */
-DEFTREECODE (REAL_TYPE, "real_type", tcc_type, 0)
-
-/* The ordering of the following codes is optimized for the checking
-   macros in tree.h.  Changing the order will degrade the speed of the
-   compiler.  POINTER_TYPE, REFERENCE_TYPE.  Note that this range
-   overlaps the previous range of ordered types.  */
-
-/* All pointer-to-x types have code POINTER_TYPE.
-   The TREE_TYPE points to the node for the type pointed to.  */
-DEFTREECODE (POINTER_TYPE, "pointer_type", tcc_type, 0)
-
-/* A reference is like a pointer except that it is coerced
-   automatically to the value it points to.  Used in C++.  */
-DEFTREECODE (REFERENCE_TYPE, "reference_type", tcc_type, 0)
-
-/* The C++ decltype(nullptr) type.  */
-DEFTREECODE (NULLPTR_TYPE, "nullptr_type", tcc_type, 0)
-
-/* _Fract and _Accum types in Embedded-C.  Different fixed-point types
-   are distinguished by machine mode and by the TYPE_SIZE and the
-   TYPE_PRECISION.  */
-DEFTREECODE (FIXED_POINT_TYPE, "fixed_point_type", tcc_type, 0)
-
-/* The ordering of the following codes is optimized for the checking
-   macros in tree.h.  Changing the order will degrade the speed of the
-   compiler.  COMPLEX_TYPE, VECTOR_TYPE, ARRAY_TYPE.  */
-
-/* Complex number types.  The TREE_TYPE field is the data type
-   of the real and imaginary parts.  It must be of scalar
-   arithmetic type, not including pointer type.  */
-DEFTREECODE (COMPLEX_TYPE, "complex_type", tcc_type, 0)
-
-/* Vector types.  The TREE_TYPE field is the data type of the vector
-   elements.  The TYPE_PRECISION field is the number of subparts of
-   the vector.  */
-DEFTREECODE (VECTOR_TYPE, "vector_type", tcc_type, 0)
-
-/* The ordering of the following codes is optimized for the checking
-   macros in tree.h.  Changing the order will degrade the speed of the
-   compiler.  ARRAY_TYPE, RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE.
-   Note that this range overlaps the previous range.  */
-
-/* Types of arrays.  Special fields:
-   TREE_TYPE		  Type of an array element.
-   TYPE_DOMAIN		  Type to index by.
-			    Its range of values specifies the array length.
- The field TYPE_POINTER_TO (TREE_TYPE (array_type)) is always nonzero
- and holds the type to coerce a value of that array type to in C.
- TYPE_STRING_FLAG indicates a string (in contrast to an array of chars)
- in languages (such as Chill) that make a distinction.  */
-/* Array types in C or Pascal */
-DEFTREECODE (ARRAY_TYPE, "array_type", tcc_type, 0)
-
-/* Struct in C, or record in Pascal.  */
-/* Special fields:
-   TYPE_FIELDS  chain of FIELD_DECLs for the fields of the struct,
-     and VAR_DECLs, TYPE_DECLs and CONST_DECLs for record-scope variables,
-     types and enumerators.
-   A few may need to be added for Pascal.  */
-/* See the comment above, before ENUMERAL_TYPE, for how
-   forward references to struct tags are handled in C.  */
-DEFTREECODE (RECORD_TYPE, "record_type", tcc_type, 0)
-
-/* Union in C.  Like a struct, except that the offsets of the fields
-   will all be zero.  */
-/* See the comment above, before ENUMERAL_TYPE, for how
-   forward references to union tags are handled in C.  */
-DEFTREECODE (UNION_TYPE, "union_type", tcc_type, 0)	/* C union type */
-
-/* Similar to UNION_TYPE, except that the expressions in DECL_QUALIFIER
-   in each FIELD_DECL determine what the union contains.  The first
-   field whose DECL_QUALIFIER expression is true is deemed to occupy
-   the union.  */
-DEFTREECODE (QUAL_UNION_TYPE, "qual_union_type", tcc_type, 0)
-
-/* The ordering of the following codes is optimized for the checking
-   macros in tree.h.  Changing the order will degrade the speed of the
-   compiler.  VOID_TYPE, FUNCTION_TYPE, METHOD_TYPE.  */
-
-/* The void type in C */
-DEFTREECODE (VOID_TYPE, "void_type", tcc_type, 0)
-
-/* Type of functions.  Special fields:
-   TREE_TYPE		    type of value returned.
-   TYPE_ARG_TYPES      list of types of arguments expected.
-	this list is made of TREE_LIST nodes.
-   Types of "Procedures" in languages where they are different from functions
-   have code FUNCTION_TYPE also, but then TREE_TYPE is zero or void type.  */
-DEFTREECODE (FUNCTION_TYPE, "function_type", tcc_type, 0)
-
-/* METHOD_TYPE is the type of a function which takes an extra first
-   argument for "self", which is not present in the declared argument list.
-   The TREE_TYPE is the return type of the method.  The TYPE_METHOD_BASETYPE
-   is the type of "self".  TYPE_ARG_TYPES is the real argument list, which
-   includes the hidden argument for "self".  */
-DEFTREECODE (METHOD_TYPE, "method_type", tcc_type, 0)
-
-/* This is a language-specific kind of type.
-   Its meaning is defined by the language front end.
-   layout_type does not know how to lay this out,
-   so the front-end must do so manually.  */
-DEFTREECODE (LANG_TYPE, "lang_type", tcc_type, 0)
-
-/* Expressions */
-
-/* First, the constants.  */
-
-/* Contents are in TREE_INT_CST_LOW and TREE_INT_CST_HIGH fields,
-   32 bits each, giving us a 64 bit constant capability.  INTEGER_CST
-   nodes can be shared, and therefore should be considered read only.
-   They should be copied, before setting a flag such as TREE_OVERFLOW.
-   If an INTEGER_CST has TREE_OVERFLOW already set, it is known to be unique.
-   INTEGER_CST nodes are created for the integral types, for pointer
-   types and for vector and float types in some circumstances.  */
-DEFTREECODE (INTEGER_CST, "integer_cst", tcc_constant, 0)
-
-/* Contents are in TREE_REAL_CST field.  */
-DEFTREECODE (REAL_CST, "real_cst", tcc_constant, 0)
-
-/* Contents are in TREE_FIXED_CST field.  */
-DEFTREECODE (FIXED_CST, "fixed_cst", tcc_constant, 0)
-
-/* Contents are in TREE_REALPART and TREE_IMAGPART fields,
-   whose contents are other constant nodes.  */
-DEFTREECODE (COMPLEX_CST, "complex_cst", tcc_constant, 0)
-
-/* Contents are in TREE_VECTOR_CST_ELTS field.  */
-DEFTREECODE (VECTOR_CST, "vector_cst", tcc_constant, 0)
-
-/* Contents are TREE_STRING_LENGTH and the actual contents of the string.  */
-DEFTREECODE (STRING_CST, "string_cst", tcc_constant, 0)
-
-/* Declarations.  All references to names are represented as ..._DECL
-   nodes.  The decls in one binding context are chained through the
-   TREE_CHAIN field.  Each DECL has a DECL_NAME field which contains
-   an IDENTIFIER_NODE.  (Some decls, most often labels, may have zero
-   as the DECL_NAME).  DECL_CONTEXT points to the node representing
-   the context in which this declaration has its scope.  For
-   FIELD_DECLs, this is the RECORD_TYPE, UNION_TYPE, or
-   QUAL_UNION_TYPE node that the field is a member of.  For VAR_DECL,
-   PARM_DECL, FUNCTION_DECL, LABEL_DECL, and CONST_DECL nodes, this
-   points to either the FUNCTION_DECL for the containing function, the
-   RECORD_TYPE or UNION_TYPE for the containing type, or NULL_TREE or
-   a TRANSLATION_UNIT_DECL if the given decl has "file scope".
-   DECL_ABSTRACT_ORIGIN, if non-NULL, points to the original (abstract)
-    ..._DECL node of which this decl is an (inlined or template expanded)
-    instance.
-   The TREE_TYPE field holds the data type of the object, when relevant.
-    LABEL_DECLs have no data type.  For TYPE_DECL, the TREE_TYPE field
-    contents are the type whose name is being declared.
-   The DECL_ALIGN, DECL_SIZE,
-    and DECL_MODE fields exist in decl nodes just as in type nodes.
-    They are unused in LABEL_DECL, TYPE_DECL and CONST_DECL nodes.
-
-   DECL_FIELD_BIT_OFFSET holds an integer number of bits offset for
-   the location.  DECL_VOFFSET holds an expression for a variable
-   offset; it is to be multiplied by DECL_VOFFSET_UNIT (an integer).
-   These fields are relevant only in FIELD_DECLs and PARM_DECLs.
-
-   DECL_INITIAL holds the value to initialize a variable to,
-   or the value of a constant.  For a function, it holds the body
-   (a node of type BLOCK representing the function's binding contour
-   and whose body contains the function's statements.)  For a LABEL_DECL
-   in C, it is a flag, nonzero if the label's definition has been seen.
-
-   PARM_DECLs use a special field:
-   DECL_ARG_TYPE is the type in which the argument is actually
-    passed, which may be different from its type within the function.
-
-   FUNCTION_DECLs use four special fields:
-   DECL_ARGUMENTS holds a chain of PARM_DECL nodes for the arguments.
-   DECL_RESULT holds a RESULT_DECL node for the value of a function.
-    The DECL_RTL field is 0 for a function that returns no value.
-    (C functions returning void have zero here.)
-    The TREE_TYPE field is the type in which the result is actually
-    returned.  This is usually the same as the return type of the
-    FUNCTION_DECL, but it may be a wider integer type because of
-    promotion.
-   DECL_FUNCTION_CODE is a code number that is nonzero for
-    built-in functions.  Its value is an enum built_in_function
-    that says which built-in function it is.
-
-   DECL_SOURCE_FILE holds a filename string and DECL_SOURCE_LINE
-   holds a line number.  In some cases these can be the location of
-   a reference, if no definition has been seen.
-
-   DECL_ABSTRACT is nonzero if the decl represents an abstract instance
-   of a decl (i.e. one which is nested within an abstract instance of a
-   inline function.  */
-
-DEFTREECODE (FUNCTION_DECL, "function_decl", tcc_declaration, 0)
-DEFTREECODE (LABEL_DECL, "label_decl", tcc_declaration, 0)
-/* The ordering of the following codes is optimized for the checking
-   macros in tree.h.  Changing the order will degrade the speed of the
-   compiler.  FIELD_DECL, VAR_DECL, CONST_DECL, PARM_DECL,
-   TYPE_DECL.  */
-DEFTREECODE (FIELD_DECL, "field_decl", tcc_declaration, 0)
-DEFTREECODE (VAR_DECL, "var_decl", tcc_declaration, 0)
-DEFTREECODE (CONST_DECL, "const_decl", tcc_declaration, 0)
-DEFTREECODE (PARM_DECL, "parm_decl", tcc_declaration, 0)
-DEFTREECODE (TYPE_DECL, "type_decl", tcc_declaration, 0)
-DEFTREECODE (RESULT_DECL, "result_decl", tcc_declaration, 0)
-
-/* A "declaration" of a debug temporary.  It should only appear in
-   DEBUG stmts.  */
-DEFTREECODE (DEBUG_EXPR_DECL, "debug_expr_decl", tcc_declaration, 0)
-
-/* A namespace declaration.  Namespaces appear in DECL_CONTEXT of other
-   _DECLs, providing a hierarchy of names.  */
-DEFTREECODE (NAMESPACE_DECL, "namespace_decl", tcc_declaration, 0)
-
-/* A declaration import.
-   The C++ FE uses this to represent a using-directive; eg:
-   "using namespace foo".
-   But it could be used to represent any declaration import construct.
-   Whenever a declaration import appears in a lexical block, the BLOCK node
-   representing that lexical block in GIMPLE will contain an IMPORTED_DECL
-   node, linked via BLOCK_VARS accessor of the said BLOCK.
-   For a given NODE which code is IMPORTED_DECL,
-   IMPORTED_DECL_ASSOCIATED_DECL (NODE) accesses the imported declaration.  */
-DEFTREECODE (IMPORTED_DECL, "imported_decl", tcc_declaration, 0)
-
-/* A namelist declaration.
-   The Fortran FE uses this to represent a namelist statement, e.g.:
-   NAMELIST /namelist-group-name/ namelist-group-object-list.
-   Whenever a declaration import appears in a lexical block, the BLOCK node
-   representing that lexical block in GIMPLE will contain an NAMELIST_DECL
-   node, linked via BLOCK_VARS accessor of the said BLOCK.
-   For a given NODE which code is NAMELIST_DECL,
-   NAMELIST_DECL_ASSOCIATED_DECL (NODE) accesses the imported declaration.  */
-DEFTREECODE (NAMELIST_DECL, "namelist_decl", tcc_declaration, 0)
-
-/* A translation unit.  This is not technically a declaration, since it
-   can't be looked up, but it's close enough.  */
-DEFTREECODE (TRANSLATION_UNIT_DECL, "translation_unit_decl",\
-	     tcc_declaration, 0)
-
-/* References to storage.  */
-
-/* The ordering of the following codes is optimized for the classification
-   in handled_component_p.  Keep them in a consecutive group.  */
-
-/* Value is structure or union component.
-   Operand 0 is the structure or union (an expression).
-   Operand 1 is the field (a node of type FIELD_DECL).
-   Operand 2, if present, is the value of DECL_FIELD_OFFSET, measured
-   in units of DECL_OFFSET_ALIGN / BITS_PER_UNIT.  */
-DEFTREECODE (COMPONENT_REF, "component_ref", tcc_reference, 3)
-
-/* Reference to a group of bits within an object.  Similar to COMPONENT_REF
-   except the position is given explicitly rather than via a FIELD_DECL.
-   Operand 0 is the structure or union expression;
-   operand 1 is a tree giving the constant number of bits being referenced;
-   operand 2 is a tree giving the constant position of the first referenced bit.
-   The result type width has to match the number of bits referenced.
-   If the result type is integral, its signedness specifies how it is extended
-   to its mode width.  */
-DEFTREECODE (BIT_FIELD_REF, "bit_field_ref", tcc_reference, 3)
-
-/* Array indexing.
-   Operand 0 is the array; operand 1 is a (single) array index.
-   Operand 2, if present, is a copy of TYPE_MIN_VALUE of the index.
-   Operand 3, if present, is the element size, measured in units of
-   the alignment of the element type.  */
-DEFTREECODE (ARRAY_REF, "array_ref", tcc_reference, 4)
-
-/* Likewise, except that the result is a range ("slice") of the array.  The
-   starting index of the resulting array is taken from operand 1 and the size
-   of the range is taken from the type of the expression.  */
-DEFTREECODE (ARRAY_RANGE_REF, "array_range_ref", tcc_reference, 4)
-
-/* Used only on an operand of complex type, these return
-   a value of the corresponding component type.  */
-DEFTREECODE (REALPART_EXPR, "realpart_expr", tcc_reference, 1)
-DEFTREECODE (IMAGPART_EXPR, "imagpart_expr", tcc_reference, 1)
-
-/* Represents viewing something of one type as being of a second type.
-   This corresponds to an "Unchecked Conversion" in Ada and roughly to
-   the idiom *(type2 *)&X in C.  The only operand is the value to be
-   viewed as being of another type.  It is undefined if the type of the
-   input and of the expression have different sizes.
-
-   This code may also be used within the LHS of a MODIFY_EXPR, in which
-   case no actual data motion may occur.  TREE_ADDRESSABLE will be set in
-   this case and GCC must abort if it could not do the operation without
-   generating insns.  */
-DEFTREECODE (VIEW_CONVERT_EXPR, "view_convert_expr", tcc_reference, 1)
-
-/* C unary `*' or Pascal `^'.  One operand, an expression for a pointer.  */
-DEFTREECODE (INDIRECT_REF, "indirect_ref", tcc_reference, 1)
-
-/* Used to represent lookup in a virtual method table which is dependent on
-   the runtime type of an object.  Operands are:
-   OBJ_TYPE_REF_EXPR: An expression that evaluates the value to use.
-   OBJ_TYPE_REF_OBJECT: Is the object on whose behalf the lookup is
-   being performed.  Through this the optimizers may be able to statically
-   determine the dynamic type of the object.
-   OBJ_TYPE_REF_TOKEN: An integer index to the virtual method table.  */
-DEFTREECODE (OBJ_TYPE_REF, "obj_type_ref", tcc_expression, 3)
-
-/* Used to represent the brace-enclosed initializers for a structure or an
-   array.  It contains a sequence of component values made out of a VEC of
-   constructor_elt.
-
-   For RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE:
-   The field INDEX of each constructor_elt is a FIELD_DECL.
-
-   For ARRAY_TYPE:
-   The field INDEX of each constructor_elt is the corresponding index.
-   If the index is a RANGE_EXPR, it is a short-hand for many nodes,
-   one for each index in the range.  (If the corresponding field VALUE
-   has side-effects, they are evaluated once for each element.  Wrap the
-   value in a SAVE_EXPR if you want to evaluate side effects only once.)
-
-   Components that aren't present are cleared as per the C semantics,
-   unless the CONSTRUCTOR_NO_CLEARING flag is set, in which case their
-   value becomes undefined.  */
-DEFTREECODE (CONSTRUCTOR, "constructor", tcc_exceptional, 0)
-
-/* The expression types are mostly straightforward, with the fourth argument
-   of DEFTREECODE saying how many operands there are.
-   Unless otherwise specified, the operands are expressions and the
-   types of all the operands and the expression must all be the same.  */
-
-/* Contains two expressions to compute, one followed by the other.
-   the first value is ignored.  The second one's value is used.  The
-   type of the first expression need not agree with the other types.  */
-DEFTREECODE (COMPOUND_EXPR, "compound_expr", tcc_expression, 2)
-
-/* Assignment expression.  Operand 0 is the what to set; 1, the new value.  */
-DEFTREECODE (MODIFY_EXPR, "modify_expr", tcc_expression, 2)
-
-/* Initialization expression.  Operand 0 is the variable to initialize;
-   Operand 1 is the initializer.  This differs from MODIFY_EXPR in that any
-   reference to the referent of operand 0 within operand 1 is undefined.  */
-DEFTREECODE (INIT_EXPR, "init_expr", tcc_expression, 2)
-
-/* For TARGET_EXPR, operand 0 is the target of an initialization,
-   operand 1 is the initializer for the target, which may be void
-     if simply expanding it initializes the target.
-   operand 2 is the cleanup for this node, if any.
-   operand 3 is the saved initializer after this node has been
-   expanded once; this is so we can re-expand the tree later.  */
-DEFTREECODE (TARGET_EXPR, "target_expr", tcc_expression, 4)
-
-/* Conditional expression ( ... ? ... : ...  in C).
-   Operand 0 is the condition.
-   Operand 1 is the then-value.
-   Operand 2 is the else-value.
-   Operand 0 may be of any type.
-   Operand 1 must have the same type as the entire expression, unless
-   it unconditionally throws an exception, in which case it should
-   have VOID_TYPE.  The same constraints apply to operand 2.  The
-   condition in operand 0 must be of integral type.
-
-   In cfg gimple, if you do not have a selection expression, operands
-   1 and 2 are NULL.  The operands are then taken from the cfg edges. */
-DEFTREECODE (COND_EXPR, "cond_expr", tcc_expression, 3)
-
-/* Vector conditional expression. It is like COND_EXPR, but with
-   vector operands.
-
-   A = VEC_COND_EXPR ( X < Y, B, C)
-
-   means
-
-   for (i=0; i<N; i++)
-     A[i] = X[i] < Y[i] ? B[i] : C[i];
-*/
-DEFTREECODE (VEC_COND_EXPR, "vec_cond_expr", tcc_expression, 3)
-
-/* Vector permutation expression.  A = VEC_PERM_EXPR<v0, v1, mask> means
-
-   N = length(mask)
-   foreach i in N:
-     M = mask[i] % (2*N)
-     A = M < N ? v0[M] : v1[M-N]
-
-   V0 and V1 are vectors of the same type.  MASK is an integer-typed
-   vector.  The number of MASK elements must be the same with the
-   number of elements in V0 and V1.  The size of the inner type
-   of the MASK and of the V0 and V1 must be the same.
-*/
-DEFTREECODE (VEC_PERM_EXPR, "vec_perm_expr", tcc_expression, 3)
-
-/* Declare local variables, including making RTL and allocating space.
-   BIND_EXPR_VARS is a chain of VAR_DECL nodes for the variables.
-   BIND_EXPR_BODY is the body, the expression to be computed using
-   the variables.  The value of operand 1 becomes that of the BIND_EXPR.
-   BIND_EXPR_BLOCK is the BLOCK that corresponds to these bindings
-   for debugging purposes.  If this BIND_EXPR is actually expanded,
-   that sets the TREE_USED flag in the BLOCK.
-
-   The BIND_EXPR is not responsible for informing parsers
-   about these variables.  If the body is coming from the input file,
-   then the code that creates the BIND_EXPR is also responsible for
-   informing the parser of the variables.
-
-   If the BIND_EXPR is ever expanded, its TREE_USED flag is set.
-   This tells the code for debugging symbol tables not to ignore the BIND_EXPR.
-   If the BIND_EXPR should be output for debugging but will not be expanded,
-   set the TREE_USED flag by hand.
-
-   In order for the BIND_EXPR to be known at all, the code that creates it
-   must also install it as a subblock in the tree of BLOCK
-   nodes for the function.  */
-DEFTREECODE (BIND_EXPR, "bind_expr", tcc_expression, 3)
-
-/* Function call.  CALL_EXPRs are represented by variably-sized expression
-   nodes.  There are at least three fixed operands.  Operand 0 is an
-   INTEGER_CST node containing the total operand count, the number of
-   arguments plus 3.  Operand 1 is the function, while operand 2 is
-   is static chain argument, or NULL.  The remaining operands are the
-   arguments to the call.  */
-DEFTREECODE (CALL_EXPR, "call_expr", tcc_vl_exp, 3)
-
-/* Specify a value to compute along with its corresponding cleanup.
-   Operand 0 is the cleanup expression.
-   The cleanup is executed by the first enclosing CLEANUP_POINT_EXPR,
-   which must exist.  This differs from TRY_CATCH_EXPR in that operand 1
-   is always evaluated when cleanups are run.  */
-DEFTREECODE (WITH_CLEANUP_EXPR, "with_cleanup_expr", tcc_expression, 1)
-
-/* Specify a cleanup point.
-   Operand 0 is an expression that may have cleanups.  If it does, those
-   cleanups are executed after the expression is expanded.
-
-   Note that if the expression is a reference to storage, it is forced out
-   of memory before the cleanups are run.  This is necessary to handle
-   cases where the cleanups modify the storage referenced; in the
-   expression 't.i', if 't' is a struct with an integer member 'i' and a
-   cleanup which modifies 'i', the value of the expression depends on
-   whether the cleanup is run before or after 't.i' is evaluated.  When
-   expand_expr is run on 't.i', it returns a MEM.  This is not good enough;
-   the value of 't.i' must be forced out of memory.
-
-   As a consequence, the operand of a CLEANUP_POINT_EXPR must not have
-   BLKmode, because it will not be forced out of memory.  */
-DEFTREECODE (CLEANUP_POINT_EXPR, "cleanup_point_expr", tcc_expression, 1)
-
-/* The following code is used in languages that have types where some
-   field in an object of the type contains a value that is used in the
-   computation of another field's offset or size and/or the size of the
-   type.  The positions and/or sizes of fields can vary from object to
-   object of the same type or even for one and the same object within
-   its scope.
-
-   Record types with discriminants in Ada or schema types in Pascal are
-   examples of such types.  This mechanism is also used to create "fat
-   pointers" for unconstrained array types in Ada; the fat pointer is a
-   structure one of whose fields is a pointer to the actual array type
-   and the other field is a pointer to a template, which is a structure
-   containing the bounds of the array.  The bounds in the type pointed
-   to by the first field in the fat pointer refer to the values in the
-   template.
-
-   When you wish to construct such a type you need "self-references"
-   that allow you to reference the object having this type from the
-   TYPE node, i.e. without having a variable instantiating this type.
-
-   Such a "self-references" is done using a PLACEHOLDER_EXPR.  This is
-   a node that will later be replaced with the object being referenced.
-   Its type is that of the object and selects which object to use from
-   a chain of references (see below).  No other slots are used in the
-   PLACEHOLDER_EXPR.
-
-   For example, if your type FOO is a RECORD_TYPE with a field BAR,
-   and you need the value of <variable>.BAR to calculate TYPE_SIZE
-   (FOO), just substitute <variable> above with a PLACEHOLDER_EXPR
-   whose TREE_TYPE is FOO.  Then construct your COMPONENT_REF with
-   the PLACEHOLDER_EXPR as the first operand (which has the correct
-   type).  Later, when the size is needed in the program, the back-end
-   will find this PLACEHOLDER_EXPR and generate code to calculate the
-   actual size at run-time.  In the following, we describe how this
-   calculation is done.
-
-   When we wish to evaluate a size or offset, we check whether it contains a
-   PLACEHOLDER_EXPR.  If it does, we call substitute_placeholder_in_expr
-   passing both that tree and an expression within which the object may be
-   found.  The latter expression is the object itself in the simple case of
-   an Ada record with discriminant, but it can be the array in the case of an
-   unconstrained array.
-
-   In the latter case, we need the fat pointer, because the bounds of
-   the array can only be accessed from it.  However, we rely here on the
-   fact that the expression for the array contains the dereference of
-   the fat pointer that obtained the array pointer.  */
-
-/* Denotes a record to later be substituted before evaluating this expression.
-   The type of this expression is used to find the record to replace it.  */
-DEFTREECODE (PLACEHOLDER_EXPR, "placeholder_expr", tcc_exceptional, 0)
-
-/* Simple arithmetic.  */
-DEFTREECODE (PLUS_EXPR, "plus_expr", tcc_binary, 2)
-DEFTREECODE (MINUS_EXPR, "minus_expr", tcc_binary, 2)
-DEFTREECODE (MULT_EXPR, "mult_expr", tcc_binary, 2)
-
-/* Pointer addition.  The first operand is always a pointer and the
-   second operand is an integer of type sizetype.  */
-DEFTREECODE (POINTER_PLUS_EXPR, "pointer_plus_expr", tcc_binary, 2)
-
-/* Highpart multiplication.  For an integral type with precision B,
-   returns bits [2B-1, B] of the full 2*B product.  */
-DEFTREECODE (MULT_HIGHPART_EXPR, "mult_highpart_expr", tcc_binary, 2)
-
-/* Division for integer result that rounds the quotient toward zero.  */
-DEFTREECODE (TRUNC_DIV_EXPR, "trunc_div_expr", tcc_binary, 2)
-
-/* Division for integer result that rounds the quotient toward infinity.  */
-DEFTREECODE (CEIL_DIV_EXPR, "ceil_div_expr", tcc_binary, 2)
-
-/* Division for integer result that rounds toward minus infinity.  */
-DEFTREECODE (FLOOR_DIV_EXPR, "floor_div_expr", tcc_binary, 2)
-
-/* Division for integer result that rounds toward nearest integer.  */
-DEFTREECODE (ROUND_DIV_EXPR, "round_div_expr", tcc_binary, 2)
-
-/* Four kinds of remainder that go with the four kinds of division.  */
-DEFTREECODE (TRUNC_MOD_EXPR, "trunc_mod_expr", tcc_binary, 2)
-DEFTREECODE (CEIL_MOD_EXPR, "ceil_mod_expr", tcc_binary, 2)
-DEFTREECODE (FLOOR_MOD_EXPR, "floor_mod_expr", tcc_binary, 2)
-DEFTREECODE (ROUND_MOD_EXPR, "round_mod_expr", tcc_binary, 2)
-
-/* Division for real result.  */
-DEFTREECODE (RDIV_EXPR, "rdiv_expr", tcc_binary, 2)
-
-/* Division which is not supposed to need rounding.
-   Used for pointer subtraction in C.  */
-DEFTREECODE (EXACT_DIV_EXPR, "exact_div_expr", tcc_binary, 2)
-
-/* Conversion of real to fixed point by truncation.  */
-DEFTREECODE (FIX_TRUNC_EXPR, "fix_trunc_expr", tcc_unary, 1)
-
-/* Conversion of an integer to a real.  */
-DEFTREECODE (FLOAT_EXPR, "float_expr", tcc_unary, 1)
-
-/* Unary negation.  */
-DEFTREECODE (NEGATE_EXPR, "negate_expr", tcc_unary, 1)
-
-/* Minimum and maximum values.  When used with floating point, if both
-   operands are zeros, or if either operand is NaN, then it is unspecified
-   which of the two operands is returned as the result.  */
-DEFTREECODE (MIN_EXPR, "min_expr", tcc_binary, 2)
-DEFTREECODE (MAX_EXPR, "max_expr", tcc_binary, 2)
-
-/* Represents the absolute value of the operand.
-
-   An ABS_EXPR must have either an INTEGER_TYPE or a REAL_TYPE.  The
-   operand of the ABS_EXPR must have the same type.  */
-DEFTREECODE (ABS_EXPR, "abs_expr", tcc_unary, 1)
-
-/* Shift operations for shift and rotate.
-   Shift means logical shift if done on an
-   unsigned type, arithmetic shift if done on a signed type.
-   The second operand is the number of bits to
-   shift by; it need not be the same type as the first operand and result.
-   Note that the result is undefined if the second operand is larger
-   than or equal to the first operand's type size.
-
-   The first operand of a shift can have either an integer or a
-   (non-integer) fixed-point type.  We follow the ISO/IEC TR 18037:2004
-   semantics for the latter.
-
-   Rotates are defined for integer types only.  */
-DEFTREECODE (LSHIFT_EXPR, "lshift_expr", tcc_binary, 2)
-DEFTREECODE (RSHIFT_EXPR, "rshift_expr", tcc_binary, 2)
-DEFTREECODE (LROTATE_EXPR, "lrotate_expr", tcc_binary, 2)
-DEFTREECODE (RROTATE_EXPR, "rrotate_expr", tcc_binary, 2)
-
-/* Bitwise operations.  Operands have same mode as result.  */
-DEFTREECODE (BIT_IOR_EXPR, "bit_ior_expr", tcc_binary, 2)
-DEFTREECODE (BIT_XOR_EXPR, "bit_xor_expr", tcc_binary, 2)
-DEFTREECODE (BIT_AND_EXPR, "bit_and_expr", tcc_binary, 2)
-DEFTREECODE (BIT_NOT_EXPR, "bit_not_expr", tcc_unary, 1)
-
-/* ANDIF and ORIF allow the second operand not to be computed if the
-   value of the expression is determined from the first operand.  AND,
-   OR, and XOR always compute the second operand whether its value is
-   needed or not (for side effects).  The operand may have
-   BOOLEAN_TYPE or INTEGER_TYPE.  In either case, the argument will be
-   either zero or one.  For example, a TRUTH_NOT_EXPR will never have
-   an INTEGER_TYPE VAR_DECL as its argument; instead, a NE_EXPR will be
-   used to compare the VAR_DECL to zero, thereby obtaining a node with
-   value zero or one.  */
-DEFTREECODE (TRUTH_ANDIF_EXPR, "truth_andif_expr", tcc_expression, 2)
-DEFTREECODE (TRUTH_ORIF_EXPR, "truth_orif_expr", tcc_expression, 2)
-DEFTREECODE (TRUTH_AND_EXPR, "truth_and_expr", tcc_expression, 2)
-DEFTREECODE (TRUTH_OR_EXPR, "truth_or_expr", tcc_expression, 2)
-DEFTREECODE (TRUTH_XOR_EXPR, "truth_xor_expr", tcc_expression, 2)
-DEFTREECODE (TRUTH_NOT_EXPR, "truth_not_expr", tcc_expression, 1)
-
-/* Relational operators.
-   `EQ_EXPR' and `NE_EXPR' are allowed for any types.
-   The others are allowed only for integer (or pointer or enumeral)
-   or real types.
-   In all cases the operands will have the same type,
-   and the value is either the type used by the language for booleans
-   or an integer vector type of the same size and with the same number
-   of elements as the comparison operands.  True for a vector of
-   comparison results has all bits set while false is equal to zero.  */
-DEFTREECODE (LT_EXPR, "lt_expr", tcc_comparison, 2)
-DEFTREECODE (LE_EXPR, "le_expr", tcc_comparison, 2)
-DEFTREECODE (GT_EXPR, "gt_expr", tcc_comparison, 2)
-DEFTREECODE (GE_EXPR, "ge_expr", tcc_comparison, 2)
-DEFTREECODE (EQ_EXPR, "eq_expr", tcc_comparison, 2)
-DEFTREECODE (NE_EXPR, "ne_expr", tcc_comparison, 2)
-
-/* Additional relational operators for floating point unordered.  */
-DEFTREECODE (UNORDERED_EXPR, "unordered_expr", tcc_comparison, 2)
-DEFTREECODE (ORDERED_EXPR, "ordered_expr", tcc_comparison, 2)
-
-/* These are equivalent to unordered or ...  */
-DEFTREECODE (UNLT_EXPR, "unlt_expr", tcc_comparison, 2)
-DEFTREECODE (UNLE_EXPR, "unle_expr", tcc_comparison, 2)
-DEFTREECODE (UNGT_EXPR, "ungt_expr", tcc_comparison, 2)
-DEFTREECODE (UNGE_EXPR, "unge_expr", tcc_comparison, 2)
-DEFTREECODE (UNEQ_EXPR, "uneq_expr", tcc_comparison, 2)
-
-/* This is the reverse of uneq_expr.  */
-DEFTREECODE (LTGT_EXPR, "ltgt_expr", tcc_comparison, 2)
-
-DEFTREECODE (RANGE_EXPR, "range_expr", tcc_binary, 2)
-
-/* Represents a re-association barrier for floating point expressions
-   like explicit parenthesis in fortran.  */
-DEFTREECODE (PAREN_EXPR, "paren_expr", tcc_unary, 1)
-
-/* Represents a conversion of type of a value.
-   All conversions, including implicit ones, must be
-   represented by CONVERT_EXPR or NOP_EXPR nodes.  */
-DEFTREECODE (CONVERT_EXPR, "convert_expr", tcc_unary, 1)
-
-/* Conversion of a pointer value to a pointer to a different
-   address space.  */
-DEFTREECODE (ADDR_SPACE_CONVERT_EXPR, "addr_space_convert_expr", tcc_unary, 1)
-
-/* Conversion of a fixed-point value to an integer, a real, or a fixed-point
-   value.  Or conversion of a fixed-point value from an integer, a real, or
-   a fixed-point value.  */
-DEFTREECODE (FIXED_CONVERT_EXPR, "fixed_convert_expr", tcc_unary, 1)
-
-/* Represents a conversion expected to require no code to be generated.  */
-DEFTREECODE (NOP_EXPR, "nop_expr", tcc_unary, 1)
-
-/* Value is same as argument, but guaranteed not an lvalue.  */
-DEFTREECODE (NON_LVALUE_EXPR, "non_lvalue_expr", tcc_unary, 1)
-
-/* A COMPOUND_LITERAL_EXPR represents a literal that is placed in a DECL.  The
-   COMPOUND_LITERAL_EXPR_DECL_EXPR is the a DECL_EXPR containing the decl
-   for the anonymous object represented by the COMPOUND_LITERAL;
-   the DECL_INITIAL of that decl is the CONSTRUCTOR that initializes
-   the compound literal.  */
-DEFTREECODE (COMPOUND_LITERAL_EXPR, "compound_literal_expr", tcc_expression, 1)
-
-/* Represents something we computed once and will use multiple times.
-   First operand is that expression.  After it is evaluated once, it
-   will be replaced by the temporary variable that holds the value.  */
-DEFTREECODE (SAVE_EXPR, "save_expr", tcc_expression, 1)
-
-/* & in C.  Value is the address at which the operand's value resides.
-   Operand may have any mode.  Result mode is Pmode.  */
-DEFTREECODE (ADDR_EXPR, "addr_expr", tcc_expression, 1)
-
-/* Operand0 is a function constant; result is part N of a function
-   descriptor of type ptr_mode.  */
-DEFTREECODE (FDESC_EXPR, "fdesc_expr", tcc_expression, 2)
-
-/* Given two real or integer operands of the same type,
-   returns a complex value of the corresponding complex type.  */
-DEFTREECODE (COMPLEX_EXPR, "complex_expr", tcc_binary, 2)
-
-/* Complex conjugate of operand.  Used only on complex types.  */
-DEFTREECODE (CONJ_EXPR, "conj_expr", tcc_unary, 1)
-
-/* Nodes for ++ and -- in C.
-   The second arg is how much to increment or decrement by.
-   For a pointer, it would be the size of the object pointed to.  */
-DEFTREECODE (PREDECREMENT_EXPR, "predecrement_expr", tcc_expression, 2)
-DEFTREECODE (PREINCREMENT_EXPR, "preincrement_expr", tcc_expression, 2)
-DEFTREECODE (POSTDECREMENT_EXPR, "postdecrement_expr", tcc_expression, 2)
-DEFTREECODE (POSTINCREMENT_EXPR, "postincrement_expr", tcc_expression, 2)
-
-/* Used to implement `va_arg'.  */
-DEFTREECODE (VA_ARG_EXPR, "va_arg_expr", tcc_expression, 1)
-
-/* Evaluate operand 1.  If and only if an exception is thrown during
-   the evaluation of operand 1, evaluate operand 2.
-
-   This differs from TRY_FINALLY_EXPR in that operand 2 is not evaluated
-   on a normal or jump exit, only on an exception.  */
-DEFTREECODE (TRY_CATCH_EXPR, "try_catch_expr", tcc_statement, 2)
-
-/* Evaluate the first operand.
-   The second operand is a cleanup expression which is evaluated
-   on any exit (normal, exception, or jump out) from this expression.  */
-DEFTREECODE (TRY_FINALLY_EXPR, "try_finally", tcc_statement, 2)
-
-/* These types of expressions have no useful value,
-   and always have side effects.  */
-
-/* Used to represent a local declaration. The operand is DECL_EXPR_DECL.  */
-DEFTREECODE (DECL_EXPR, "decl_expr", tcc_statement, 1)
-
-/* A label definition, encapsulated as a statement.
-   Operand 0 is the LABEL_DECL node for the label that appears here.
-   The type should be void and the value should be ignored.  */
-DEFTREECODE (LABEL_EXPR, "label_expr", tcc_statement, 1)
-
-/* GOTO.  Operand 0 is a LABEL_DECL node or an expression.
-   The type should be void and the value should be ignored.  */
-DEFTREECODE (GOTO_EXPR, "goto_expr", tcc_statement, 1)
-
-/* RETURN.  Evaluates operand 0, then returns from the current function.
-   Presumably that operand is an assignment that stores into the
-   RESULT_DECL that hold the value to be returned.
-   The operand may be null.
-   The type should be void and the value should be ignored.  */
-DEFTREECODE (RETURN_EXPR, "return_expr", tcc_statement, 1)
-
-/* Exit the inner most loop conditionally.  Operand 0 is the condition.
-   The type should be void and the value should be ignored.  */
-DEFTREECODE (EXIT_EXPR, "exit_expr", tcc_statement, 1)
-
-/* A loop.  Operand 0 is the body of the loop.
-   It must contain an EXIT_EXPR or is an infinite loop.
-   The type should be void and the value should be ignored.  */
-DEFTREECODE (LOOP_EXPR, "loop_expr", tcc_statement, 1)
-
-/* Switch expression.
-
-   TREE_TYPE is the original type of the condition, before any
-   language required type conversions.  It may be NULL, in which case
-   the original type and final types are assumed to be the same.
-
-   Operand 0 is the expression used to perform the branch,
-   Operand 1 is the body of the switch, which probably contains
-     CASE_LABEL_EXPRs.  It may also be NULL, in which case operand 2
-     must not be NULL.
-   Operand 2 is either NULL_TREE or a TREE_VEC of the CASE_LABEL_EXPRs
-     of all the cases.  */
-DEFTREECODE (SWITCH_EXPR, "switch_expr", tcc_statement, 3)
-
-/* Used to represent a case label.
-
-   Operand 0 is CASE_LOW.  It may be NULL_TREE, in which case the label
-     is a 'default' label.
-   Operand 1 is CASE_HIGH.  If it is NULL_TREE, the label is a simple
-     (one-value) case label.  If it is non-NULL_TREE, the case is a range.
-   Operand 2 is CASE_LABEL, which is is the corresponding LABEL_DECL.
-   Operand 4 is CASE_CHAIN.  This operand is only used in tree-cfg.c to
-     speed up the lookup of case labels which use a particular edge in
-     the control flow graph.  */
-DEFTREECODE (CASE_LABEL_EXPR, "case_label_expr", tcc_statement, 4)
-
-/* Used to represent an inline assembly statement.  ASM_STRING returns a
-   STRING_CST for the instruction (e.g., "mov x, y"). ASM_OUTPUTS,
-   ASM_INPUTS, and ASM_CLOBBERS represent the outputs, inputs, and clobbers
-   for the statement.  ASM_LABELS, if present, indicates various destinations
-   for the asm; labels cannot be combined with outputs.  */
-DEFTREECODE (ASM_EXPR, "asm_expr", tcc_statement, 5)
-
-/* Variable references for SSA analysis.  New SSA names are created every
-   time a variable is assigned a new value.  The SSA builder uses SSA_NAME
-   nodes to implement SSA versioning.  */
-DEFTREECODE (SSA_NAME, "ssa_name", tcc_exceptional, 0)
-
-/* Used to represent a typed exception handler.  CATCH_TYPES is the type (or
-   list of types) handled, and CATCH_BODY is the code for the handler.  */
-DEFTREECODE (CATCH_EXPR, "catch_expr", tcc_statement, 2)
-
-/* Used to represent an exception specification.  EH_FILTER_TYPES is a list
-   of allowed types, and EH_FILTER_FAILURE is an expression to evaluate on
-   failure.  */
-DEFTREECODE (EH_FILTER_EXPR, "eh_filter_expr", tcc_statement, 2)
-
-/* Node used for describing a property that is known at compile
-   time.  */
-DEFTREECODE (SCEV_KNOWN, "scev_known", tcc_expression, 0)
-
-/* Node used for describing a property that is not known at compile
-   time.  */
-DEFTREECODE (SCEV_NOT_KNOWN, "scev_not_known", tcc_expression, 0)
-
-/* Polynomial chains of recurrences.
-   Under the form: cr = {CHREC_LEFT (cr), +, CHREC_RIGHT (cr)}.  */
-DEFTREECODE (POLYNOMIAL_CHREC, "polynomial_chrec", tcc_expression, 3)
-
-/* Used to chain children of container statements together.
-   Use the interface in tree-iterator.h to access this node.  */
-DEFTREECODE (STATEMENT_LIST, "statement_list", tcc_exceptional, 0)
-
-/* Predicate assertion.  Artificial expression generated by the optimizers
-   to keep track of predicate values.  This expression may only appear on
-   the RHS of assignments.
-
-   Given X = ASSERT_EXPR <Y, EXPR>, the optimizers can infer
-   two things:
-
-   	1- X is a copy of Y.
-	2- EXPR is a conditional expression and is known to be true.
-
-   Valid and to be expected forms of conditional expressions are
-   valid GIMPLE conditional expressions (as defined by is_gimple_condexpr)
-   and conditional expressions with the first operand being a
-   PLUS_EXPR with a variable possibly wrapped in a NOP_EXPR first
-   operand and an integer constant second operand.
-
-   The type of the expression is the same as Y.  */
-DEFTREECODE (ASSERT_EXPR, "assert_expr", tcc_expression, 2)
-
-/* Base class information. Holds information about a class as a
-   baseclass of itself or another class.  */
-DEFTREECODE (TREE_BINFO, "tree_binfo", tcc_exceptional, 0)
-
-/* Records the size for an expression of variable size type.  This is
-   for use in contexts in which we are accessing the entire object,
-   such as for a function call, or block copy.
-   Operand 0 is the real expression.
-   Operand 1 is the size of the type in the expression.  */
-DEFTREECODE (WITH_SIZE_EXPR, "with_size_expr", tcc_expression, 2)
-
-/* Extract elements from two input vectors Operand 0 and Operand 1
-   size VS, according to the offset OFF defined by Operand 2 as
-   follows:
-   If OFF > 0, the last VS - OFF elements of vector OP0 are concatenated to
-   the first OFF elements of the vector OP1.
-   If OFF == 0, then the returned vector is OP1.
-   On different targets OFF may take different forms; It can be an address, in
-   which case its low log2(VS)-1 bits define the offset, or it can be a mask
-   generated by the builtin targetm.vectorize.mask_for_load_builtin_decl.  */
-DEFTREECODE (REALIGN_LOAD_EXPR, "realign_load", tcc_expression, 3)
-
-/* Low-level memory addressing.  Operands are BASE (address of static or
-   global variable or register), OFFSET (integer constant),
-   INDEX (register), STEP (integer constant), INDEX2 (register),
-   The corresponding address is BASE + STEP * INDEX + INDEX2 + OFFSET.
-   Only variations and values valid on the target are allowed.
-
-   The type of STEP, INDEX and INDEX2 is sizetype.
-
-   The type of BASE is a pointer type.  If BASE is not an address of
-   a static or global variable INDEX2 will be NULL.
-
-   The type of OFFSET is a pointer type and determines TBAA the same as
-   the constant offset operand in MEM_REF.  */
-
-DEFTREECODE (TARGET_MEM_REF, "target_mem_ref", tcc_reference, 5)
-
-/* Memory addressing.  Operands are a pointer and a tree constant integer
-   byte offset of the pointer type that when dereferenced yields the
-   type of the base object the pointer points into and which is used for
-   TBAA purposes.
-   The type of the MEM_REF is the type the bytes at the memory location
-   are interpreted as.
-   MEM_REF <p, c> is equivalent to ((typeof(c))p)->x... where x... is a
-   chain of component references offsetting p by c.  */
-DEFTREECODE (MEM_REF, "mem_ref", tcc_reference, 2)
-
-/* The ordering of the codes between OMP_PARALLEL and OMP_CRITICAL is
-   exposed to TREE_RANGE_CHECK.  */
-/* OpenMP - #pragma omp parallel [clause1 ... clauseN]
-   Operand 0: OMP_PARALLEL_BODY: Code to be executed by all threads.
-   Operand 1: OMP_PARALLEL_CLAUSES: List of clauses.  */
-
-DEFTREECODE (OMP_PARALLEL, "omp_parallel", tcc_statement, 2)
-
-/* OpenMP - #pragma omp task [clause1 ... clauseN]
-   Operand 0: OMP_TASK_BODY: Code to be executed by all threads.
-   Operand 1: OMP_TASK_CLAUSES: List of clauses.  */
-
-DEFTREECODE (OMP_TASK, "omp_task", tcc_statement, 2)
-
-/* OpenMP - #pragma omp for [clause1 ... clauseN]
-   Operand 0: OMP_FOR_BODY: Loop body.
-   Operand 1: OMP_FOR_CLAUSES: List of clauses.
-   Operand 2: OMP_FOR_INIT: Initialization code of the form
-                             	VAR = N1.
-   Operand 3: OMP_FOR_COND: Loop conditional expression of the form
-                             	VAR { <, >, <=, >= } N2.
-   Operand 4: OMP_FOR_INCR: Loop index increment of the form
-			     	VAR { +=, -= } INCR.
-   Operand 5: OMP_FOR_PRE_BODY: Filled by the gimplifier with things
-	from INIT, COND, and INCR that are technically part of the
-	OMP_FOR structured block, but are evaluated before the loop
-	body begins.
-
-   VAR must be an integer or pointer variable, which is implicitly thread
-   private.  N1, N2 and INCR are required to be loop invariant integer
-   expressions that are evaluated without any synchronization.
-   The evaluation order, frequency of evaluation and side-effects are
-   unspecified by the standard.  */
-DEFTREECODE (OMP_FOR, "omp_for", tcc_statement, 6)
-
-/* OpenMP - #pragma omp simd [clause1 ... clauseN]
-   Operands like for OMP_FOR.  */
-DEFTREECODE (OMP_SIMD, "omp_simd", tcc_statement, 6)
-
-/* Cilk Plus - #pragma simd [clause1 ... clauseN]
-   Operands like for OMP_FOR.  */
-DEFTREECODE (CILK_SIMD, "cilk_simd", tcc_statement, 6)
-
-/* OpenMP - #pragma omp distribute [clause1 ... clauseN]
-   Operands like for OMP_FOR.  */
-DEFTREECODE (OMP_DISTRIBUTE, "omp_distribute", tcc_statement, 6)
-
-/* OpenMP - #pragma omp teams [clause1 ... clauseN]
-   Operand 0: OMP_TEAMS_BODY: Teams body.
-   Operand 1: OMP_TEAMS_CLAUSES: List of clauses.  */
-DEFTREECODE (OMP_TEAMS, "omp_teams", tcc_statement, 2)
-
-/* OpenMP - #pragma omp target data [clause1 ... clauseN]
-   Operand 0: OMP_TARGET_DATA_BODY: Target data construct body.
-   Operand 1: OMP_TARGET_DATA_CLAUSES: List of clauses.  */
-DEFTREECODE (OMP_TARGET_DATA, "omp_target_data", tcc_statement, 2)
-
-/* OpenMP - #pragma omp target [clause1 ... clauseN]
-   Operand 0: OMP_TARGET_BODY: Target construct body.
-   Operand 1: OMP_TARGET_CLAUSES: List of clauses.  */
-DEFTREECODE (OMP_TARGET, "omp_target", tcc_statement, 2)
-
-/* OpenMP - #pragma omp sections [clause1 ... clauseN]
-   Operand 0: OMP_SECTIONS_BODY: Sections body.
-   Operand 1: OMP_SECTIONS_CLAUSES: List of clauses.  */
-DEFTREECODE (OMP_SECTIONS, "omp_sections", tcc_statement, 2)
-
-/* OpenMP - #pragma omp single
-   Operand 0: OMP_SINGLE_BODY: Single section body.
-   Operand 1: OMP_SINGLE_CLAUSES: List of clauses.  */
-DEFTREECODE (OMP_SINGLE, "omp_single", tcc_statement, 2)
-
-/* OpenMP - #pragma omp section
-   Operand 0: OMP_SECTION_BODY: Section body.  */
-DEFTREECODE (OMP_SECTION, "omp_section", tcc_statement, 1)
-
-/* OpenMP - #pragma omp master
-   Operand 0: OMP_MASTER_BODY: Master section body.  */
-DEFTREECODE (OMP_MASTER, "omp_master", tcc_statement, 1)
-
-/* OpenMP - #pragma omp taskgroup
-   Operand 0: OMP_TASKGROUP_BODY: Taskgroup body.  */
-DEFTREECODE (OMP_TASKGROUP, "omp_taskgroup", tcc_statement, 1)
-
-/* OpenMP - #pragma omp ordered
-   Operand 0: OMP_ORDERED_BODY: Master section body.  */
-DEFTREECODE (OMP_ORDERED, "omp_ordered", tcc_statement, 1)
-
-/* OpenMP - #pragma omp critical [name]
-   Operand 0: OMP_CRITICAL_BODY: Critical section body.
-   Operand 1: OMP_CRITICAL_NAME: Identifier for critical section.  */
-DEFTREECODE (OMP_CRITICAL, "omp_critical", tcc_statement, 2)
-
-/* OpenMP - #pragma omp target update [clause1 ... clauseN]
-   Operand 0: OMP_TARGET_UPDATE_CLAUSES: List of clauses.  */
-DEFTREECODE (OMP_TARGET_UPDATE, "omp_target_update", tcc_statement, 1)
-
-/* OMP_ATOMIC through OMP_ATOMIC_CAPTURE_NEW must be consecutive,
-   or OMP_ATOMIC_SEQ_CST needs adjusting.  */
-
-/* OpenMP - #pragma omp atomic
-   Operand 0: The address at which the atomic operation is to be performed.
-	This address should be stabilized with save_expr.
-   Operand 1: The expression to evaluate.  When the old value of the object
-	at the address is used in the expression, it should appear as if
-	build_fold_indirect_ref of the address.  */
-DEFTREECODE (OMP_ATOMIC, "omp_atomic", tcc_statement, 2)
-
-/* OpenMP - #pragma omp atomic read
-   Operand 0: The address at which the atomic operation is to be performed.
-	This address should be stabilized with save_expr.  */
-DEFTREECODE (OMP_ATOMIC_READ, "omp_atomic_read", tcc_statement, 1)
-
-/* OpenMP - #pragma omp atomic capture
-   Operand 0: The address at which the atomic operation is to be performed.
-	This address should be stabilized with save_expr.
-   Operand 1: The expression to evaluate.  When the old value of the object
-	at the address is used in the expression, it should appear as if
-	build_fold_indirect_ref of the address.
-   OMP_ATOMIC_CAPTURE_OLD returns the old memory content,
-   OMP_ATOMIC_CAPTURE_NEW the new value.  */
-DEFTREECODE (OMP_ATOMIC_CAPTURE_OLD, "omp_atomic_capture_old", tcc_statement, 2)
-DEFTREECODE (OMP_ATOMIC_CAPTURE_NEW, "omp_atomic_capture_new", tcc_statement, 2)
-
-/* OpenMP clauses.  */
-DEFTREECODE (OMP_CLAUSE, "omp_clause", tcc_exceptional, 0)
-
-/* TRANSACTION_EXPR tree code.
-   Operand 0: BODY: contains body of the transaction.  */
-DEFTREECODE (TRANSACTION_EXPR, "transaction_expr", tcc_expression, 1)
-
-/* Reduction operations.
-   Operations that take a vector of elements and "reduce" it to a scalar
-   result (e.g. summing the elements of the vector, finding the minimum over
-   the vector elements, etc).
-   Operand 0 is a vector.
-   The expression returns a vector of the same type, with the first
-   element in the vector holding the result of the reduction of all elements
-   of the operand.  The content of the other elements in the returned vector
-   is undefined.  */
-DEFTREECODE (REDUC_MAX_EXPR, "reduc_max_expr", tcc_unary, 1)
-DEFTREECODE (REDUC_MIN_EXPR, "reduc_min_expr", tcc_unary, 1)
-DEFTREECODE (REDUC_PLUS_EXPR, "reduc_plus_expr", tcc_unary, 1)
-
-/* Widening dot-product.
-   The first two arguments are of type t1.
-   The third argument and the result are of type t2, such that t2 is at least
-   twice the size of t1. DOT_PROD_EXPR(arg1,arg2,arg3) is equivalent to:
-   	tmp = WIDEN_MULT_EXPR(arg1, arg2);
-   	arg3 = PLUS_EXPR (tmp, arg3);
-   or:
-	tmp = WIDEN_MULT_EXPR(arg1, arg2);
-        arg3 = WIDEN_SUM_EXPR (tmp, arg3);		 */
-DEFTREECODE (DOT_PROD_EXPR, "dot_prod_expr", tcc_expression, 3)
-
-/* Widening summation.
-   The first argument is of type t1.
-   The second argument is of type t2, such that t2 is at least twice
-   the size of t1. The type of the entire expression is also t2.
-   WIDEN_SUM_EXPR is equivalent to first widening (promoting)
-   the first argument from type t1 to type t2, and then summing it
-   with the second argument.  */
-DEFTREECODE (WIDEN_SUM_EXPR, "widen_sum_expr", tcc_binary, 2)
-
-/* Widening multiplication.
-   The two arguments are of type t1.
-   The result is of type t2, such that t2 is at least twice
-   the size of t1. WIDEN_MULT_EXPR is equivalent to first widening (promoting)
-   the arguments from type t1 to type t2, and then multiplying them.  */
-DEFTREECODE (WIDEN_MULT_EXPR, "widen_mult_expr", tcc_binary, 2)
-
-/* Widening multiply-accumulate.
-   The first two arguments are of type t1.
-   The third argument and the result are of type t2, such as t2 is at least
-   twice the size of t1.  t1 and t2 must be integral or fixed-point types.
-   The expression is equivalent to a WIDEN_MULT_EXPR operation
-   of the first two operands followed by an add or subtract of the third
-   operand.  */
-DEFTREECODE (WIDEN_MULT_PLUS_EXPR, "widen_mult_plus_expr", tcc_expression, 3)
-/* This is like the above, except in the final expression the multiply result
-   is subtracted from t3.  */
-DEFTREECODE (WIDEN_MULT_MINUS_EXPR, "widen_mult_minus_expr", tcc_expression, 3)
-
-/* Widening shift left.
-   The first operand is of type t1.
-   The second operand is the number of bits to shift by; it need not be the
-   same type as the first operand and result.
-   Note that the result is undefined if the second operand is larger
-   than or equal to the first operand's type size.
-   The type of the entire expression is t2, such that t2 is at least twice
-   the size of t1.
-   WIDEN_LSHIFT_EXPR is equivalent to first widening (promoting)
-   the first argument from type t1 to type t2, and then shifting it
-   by the second argument.  */
-DEFTREECODE (WIDEN_LSHIFT_EXPR, "widen_lshift_expr", tcc_binary, 2)
-
-/* Fused multiply-add.
-   All operands and the result are of the same type.  No intermediate
-   rounding is performed after multiplying operand one with operand two
-   before adding operand three.  */
-DEFTREECODE (FMA_EXPR, "fma_expr", tcc_expression, 3)
-
-/* Whole vector left/right shift in bits.
-   Operand 0 is a vector to be shifted.
-   Operand 1 is an integer shift amount in bits.  */
-DEFTREECODE (VEC_LSHIFT_EXPR, "vec_lshift_expr", tcc_binary, 2)
-DEFTREECODE (VEC_RSHIFT_EXPR, "vec_rshift_expr", tcc_binary, 2)
-
-/* Widening vector multiplication.
-   The two operands are vectors with N elements of size S. Multiplying the
-   elements of the two vectors will result in N products of size 2*S.
-   VEC_WIDEN_MULT_HI_EXPR computes the N/2 high products.
-   VEC_WIDEN_MULT_LO_EXPR computes the N/2 low products.  */
-DEFTREECODE (VEC_WIDEN_MULT_HI_EXPR, "widen_mult_hi_expr", tcc_binary, 2)
-DEFTREECODE (VEC_WIDEN_MULT_LO_EXPR, "widen_mult_lo_expr", tcc_binary, 2)
-
-/* Similarly, but return the even or odd N/2 products.  */
-DEFTREECODE (VEC_WIDEN_MULT_EVEN_EXPR, "widen_mult_even_expr", tcc_binary, 2)
-DEFTREECODE (VEC_WIDEN_MULT_ODD_EXPR, "widen_mult_odd_expr", tcc_binary, 2)
-
-/* Unpack (extract and promote/widen) the high/low elements of the input
-   vector into the output vector.  The input vector has twice as many
-   elements as the output vector, that are half the size of the elements
-   of the output vector.  This is used to support type promotion. */
-DEFTREECODE (VEC_UNPACK_HI_EXPR, "vec_unpack_hi_expr", tcc_unary, 1)
-DEFTREECODE (VEC_UNPACK_LO_EXPR, "vec_unpack_lo_expr", tcc_unary, 1)
-
-/* Unpack (extract) the high/low elements of the input vector, convert
-   fixed point values to floating point and widen elements into the
-   output vector.  The input vector has twice as many elements as the output
-   vector, that are half the size of the elements of the output vector.  */
-DEFTREECODE (VEC_UNPACK_FLOAT_HI_EXPR, "vec_unpack_float_hi_expr", tcc_unary, 1)
-DEFTREECODE (VEC_UNPACK_FLOAT_LO_EXPR, "vec_unpack_float_lo_expr", tcc_unary, 1)
-
-/* Pack (demote/narrow and merge) the elements of the two input vectors
-   into the output vector using truncation/saturation.
-   The elements of the input vectors are twice the size of the elements of the
-   output vector.  This is used to support type demotion.  */
-DEFTREECODE (VEC_PACK_TRUNC_EXPR, "vec_pack_trunc_expr", tcc_binary, 2)
-DEFTREECODE (VEC_PACK_SAT_EXPR, "vec_pack_sat_expr", tcc_binary, 2)
-
-/* Convert floating point values of the two input vectors to integer
-   and pack (narrow and merge) the elements into the output vector. The
-   elements of the input vector are twice the size of the elements of
-   the output vector.  */
-DEFTREECODE (VEC_PACK_FIX_TRUNC_EXPR, "vec_pack_fix_trunc_expr", tcc_binary, 2)
-
-/* Widening vector shift left in bits.
-   Operand 0 is a vector to be shifted with N elements of size S.
-   Operand 1 is an integer shift amount in bits.
-   The result of the operation is N elements of size 2*S.
-   VEC_WIDEN_LSHIFT_HI_EXPR computes the N/2 high results.
-   VEC_WIDEN_LSHIFT_LO_EXPR computes the N/2 low results.
- */
-DEFTREECODE (VEC_WIDEN_LSHIFT_HI_EXPR, "widen_lshift_hi_expr", tcc_binary, 2)
-DEFTREECODE (VEC_WIDEN_LSHIFT_LO_EXPR, "widen_lshift_lo_expr", tcc_binary, 2)
-
-/* PREDICT_EXPR.  Specify hint for branch prediction.  The
-   PREDICT_EXPR_PREDICTOR specify predictor and PREDICT_EXPR_OUTCOME the
-   outcome (0 for not taken and 1 for taken).  Once the profile is guessed
-   all conditional branches leading to execution paths executing the
-   PREDICT_EXPR will get predicted by the specified predictor.  */
-DEFTREECODE (PREDICT_EXPR, "predict_expr", tcc_expression, 1)
-
-/* OPTIMIZATION_NODE.  Node to store the optimization options.  */
-DEFTREECODE (OPTIMIZATION_NODE, "optimization_node", tcc_exceptional, 0)
-
-/* TARGET_OPTION_NODE.  Node to store the target specific options.  */
-DEFTREECODE (TARGET_OPTION_NODE, "target_option_node", tcc_exceptional, 0)
-
-/* ANNOTATE_EXPR.
-   Operand 0 is the expression to be annotated.
-   Operand 1 is the annotation id. */
-DEFTREECODE (ANNOTATE_EXPR, "annotate_expr", tcc_expression, 2)
-
-/* Cilk spawn statement
-   Operand 0 is the CALL_EXPR.  */
-DEFTREECODE (CILK_SPAWN_STMT, "cilk_spawn_stmt", tcc_statement, 1)
-
-/* Cilk Sync statement: Does not have any operands.  */
-DEFTREECODE (CILK_SYNC_STMT, "cilk_sync_stmt", tcc_statement, 0)
-
-/*
-Local variables:
-mode:c
-End:
-*/
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree.h
deleted file mode 100644
index d73bc52..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/tree.h
+++ /dev/null
@@ -1,4593 +0,0 @@
-/* Definitions for the ubiquitous 'tree' type for GNU compilers.
-   Copyright (C) 1989-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_TREE_H
-#define GCC_TREE_H
-
-#include "tree-core.h"
-
-/* These includes are required here because they provide declarations
-   used by inline functions in this file.
-
-   FIXME - Move these users elsewhere? */
-#include "fold-const.h"
-
-/* Macros for initializing `tree_contains_struct'.  */
-#define MARK_TS_BASE(C)					\
-  do {							\
-    tree_contains_struct[C][TS_BASE] = 1;		\
-  } while (0)
-
-#define MARK_TS_TYPED(C)				\
-  do {							\
-    MARK_TS_BASE (C);					\
-    tree_contains_struct[C][TS_TYPED] = 1;		\
-  } while (0)
-
-#define MARK_TS_COMMON(C)				\
-  do {							\
-    MARK_TS_TYPED (C);					\
-    tree_contains_struct[C][TS_COMMON] = 1;		\
-  } while (0)
-
-#define MARK_TS_TYPE_COMMON(C)				\
-  do {							\
-    MARK_TS_COMMON (C);					\
-    tree_contains_struct[C][TS_TYPE_COMMON] = 1;	\
-  } while (0)
-
-#define MARK_TS_TYPE_WITH_LANG_SPECIFIC(C)		\
-  do {							\
-    MARK_TS_TYPE_COMMON (C);				\
-    tree_contains_struct[C][TS_TYPE_WITH_LANG_SPECIFIC] = 1;	\
-  } while (0)
-
-#define MARK_TS_DECL_MINIMAL(C)				\
-  do {							\
-    MARK_TS_COMMON (C);					\
-    tree_contains_struct[C][TS_DECL_MINIMAL] = 1;	\
-  } while (0)
-
-#define MARK_TS_DECL_COMMON(C)				\
-  do {							\
-    MARK_TS_DECL_MINIMAL (C);				\
-    tree_contains_struct[C][TS_DECL_COMMON] = 1;	\
-  } while (0)
-
-#define MARK_TS_DECL_WRTL(C)				\
-  do {							\
-    MARK_TS_DECL_COMMON (C);				\
-    tree_contains_struct[C][TS_DECL_WRTL] = 1;		\
-  } while (0)
-
-#define MARK_TS_DECL_WITH_VIS(C)			\
-  do {							\
-    MARK_TS_DECL_WRTL (C);				\
-    tree_contains_struct[C][TS_DECL_WITH_VIS] = 1;	\
-  } while (0)
-
-#define MARK_TS_DECL_NON_COMMON(C)			\
-  do {							\
-    MARK_TS_DECL_WITH_VIS (C);				\
-    tree_contains_struct[C][TS_DECL_NON_COMMON] = 1;	\
-  } while (0)
-
-
-/* Returns the string representing CLASS.  */
-
-#define TREE_CODE_CLASS_STRING(CLASS)\
-        tree_code_class_strings[(int) (CLASS)]
-
-#define TREE_CODE_CLASS(CODE)	tree_code_type[(int) (CODE)]
-
-/* Nonzero if NODE represents an exceptional code.  */
-
-#define EXCEPTIONAL_CLASS_P(NODE)\
-	(TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_exceptional)
-
-/* Nonzero if NODE represents a constant.  */
-
-#define CONSTANT_CLASS_P(NODE)\
-	(TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_constant)
-
-/* Nonzero if NODE represents a type.  */
-
-#define TYPE_P(NODE)\
-	(TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_type)
-
-/* Nonzero if NODE represents a declaration.  */
-
-#define DECL_P(NODE)\
-        (TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_declaration)
-
-/* True if NODE designates a variable declaration.  */
-#define VAR_P(NODE) \
-  (TREE_CODE (NODE) == VAR_DECL)
-
-/* Nonzero if DECL represents a VAR_DECL or FUNCTION_DECL.  */
-
-#define VAR_OR_FUNCTION_DECL_P(DECL)\
-  (TREE_CODE (DECL) == VAR_DECL || TREE_CODE (DECL) == FUNCTION_DECL)
-
-/* Nonzero if NODE represents a INDIRECT_REF.  Keep these checks in
-   ascending code order.  */
-
-#define INDIRECT_REF_P(NODE)\
-  (TREE_CODE (NODE) == INDIRECT_REF)
-
-/* Nonzero if NODE represents a reference.  */
-
-#define REFERENCE_CLASS_P(NODE)\
-	(TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_reference)
-
-/* Nonzero if NODE represents a comparison.  */
-
-#define COMPARISON_CLASS_P(NODE)\
-	(TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_comparison)
-
-/* Nonzero if NODE represents a unary arithmetic expression.  */
-
-#define UNARY_CLASS_P(NODE)\
-	(TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_unary)
-
-/* Nonzero if NODE represents a binary arithmetic expression.  */
-
-#define BINARY_CLASS_P(NODE)\
-	(TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_binary)
-
-/* Nonzero if NODE represents a statement expression.  */
-
-#define STATEMENT_CLASS_P(NODE)\
-	(TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_statement)
-
-/* Nonzero if NODE represents a function call-like expression with a
-   variable-length operand vector.  */
-
-#define VL_EXP_CLASS_P(NODE)\
-	(TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_vl_exp)
-
-/* Nonzero if NODE represents any other expression.  */
-
-#define EXPRESSION_CLASS_P(NODE)\
-	(TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_expression)
-
-/* Returns nonzero iff NODE represents a type or declaration.  */
-
-#define IS_TYPE_OR_DECL_P(NODE)\
-	(TYPE_P (NODE) || DECL_P (NODE))
-
-/* Returns nonzero iff CLASS is the tree-code class of an
-   expression.  */
-
-#define IS_EXPR_CODE_CLASS(CLASS)\
-	((CLASS) >= tcc_reference && (CLASS) <= tcc_expression)
-
-/* Returns nonzero iff NODE is an expression of some kind.  */
-
-#define EXPR_P(NODE) IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (NODE)))
-
-#define TREE_CODE_LENGTH(CODE)	tree_code_length[(int) (CODE)]
-
-
-/* Helper macros for math builtins.  */
-
-#define BUILTIN_EXP10_P(FN) \
- ((FN) == BUILT_IN_EXP10 || (FN) == BUILT_IN_EXP10F || (FN) == BUILT_IN_EXP10L \
-  || (FN) == BUILT_IN_POW10 || (FN) == BUILT_IN_POW10F || (FN) == BUILT_IN_POW10L)
-
-#define BUILTIN_EXPONENT_P(FN) (BUILTIN_EXP10_P (FN) \
-  || (FN) == BUILT_IN_EXP || (FN) == BUILT_IN_EXPF || (FN) == BUILT_IN_EXPL \
-  || (FN) == BUILT_IN_EXP2 || (FN) == BUILT_IN_EXP2F || (FN) == BUILT_IN_EXP2L)
-
-#define BUILTIN_SQRT_P(FN) \
- ((FN) == BUILT_IN_SQRT || (FN) == BUILT_IN_SQRTF || (FN) == BUILT_IN_SQRTL)
-
-#define BUILTIN_CBRT_P(FN) \
- ((FN) == BUILT_IN_CBRT || (FN) == BUILT_IN_CBRTF || (FN) == BUILT_IN_CBRTL)
-
-#define BUILTIN_ROOT_P(FN) (BUILTIN_SQRT_P (FN) || BUILTIN_CBRT_P (FN))
-
-#define CASE_FLT_FN(FN) case FN: case FN##F: case FN##L
-#define CASE_FLT_FN_REENT(FN) case FN##_R: case FN##F_R: case FN##L_R
-#define CASE_INT_FN(FN) case FN: case FN##L: case FN##LL: case FN##IMAX
-
-/* Define accessors for the fields that all tree nodes have
-   (though some fields are not used for all kinds of nodes).  */
-
-/* The tree-code says what kind of node it is.
-   Codes are defined in tree.def.  */
-#define TREE_CODE(NODE) ((enum tree_code) (NODE)->base.code)
-#define TREE_SET_CODE(NODE, VALUE) ((NODE)->base.code = (VALUE))
-
-/* When checking is enabled, errors will be generated if a tree node
-   is accessed incorrectly. The macros die with a fatal error.  */
-#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
-
-#define TREE_CHECK(T, CODE) \
-(tree_check ((T), __FILE__, __LINE__, __FUNCTION__, (CODE)))
-
-#define TREE_NOT_CHECK(T, CODE) \
-(tree_not_check ((T), __FILE__, __LINE__, __FUNCTION__, (CODE)))
-
-#define TREE_CHECK2(T, CODE1, CODE2) \
-(tree_check2 ((T), __FILE__, __LINE__, __FUNCTION__, (CODE1), (CODE2)))
-
-#define TREE_NOT_CHECK2(T, CODE1, CODE2) \
-(tree_not_check2 ((T), __FILE__, __LINE__, __FUNCTION__, (CODE1), (CODE2)))
-
-#define TREE_CHECK3(T, CODE1, CODE2, CODE3) \
-(tree_check3 ((T), __FILE__, __LINE__, __FUNCTION__, (CODE1), (CODE2), (CODE3)))
-
-#define TREE_NOT_CHECK3(T, CODE1, CODE2, CODE3) \
-(tree_not_check3 ((T), __FILE__, __LINE__, __FUNCTION__, \
-                               (CODE1), (CODE2), (CODE3)))
-
-#define TREE_CHECK4(T, CODE1, CODE2, CODE3, CODE4) \
-(tree_check4 ((T), __FILE__, __LINE__, __FUNCTION__, \
-                           (CODE1), (CODE2), (CODE3), (CODE4)))
-
-#define TREE_NOT_CHECK4(T, CODE1, CODE2, CODE3, CODE4) \
-(tree_not_check4 ((T), __FILE__, __LINE__, __FUNCTION__, \
-                               (CODE1), (CODE2), (CODE3), (CODE4)))
-
-#define TREE_CHECK5(T, CODE1, CODE2, CODE3, CODE4, CODE5) \
-(tree_check5 ((T), __FILE__, __LINE__, __FUNCTION__, \
-                           (CODE1), (CODE2), (CODE3), (CODE4), (CODE5)))
-
-#define TREE_NOT_CHECK5(T, CODE1, CODE2, CODE3, CODE4, CODE5) \
-(tree_not_check5 ((T), __FILE__, __LINE__, __FUNCTION__, \
-                               (CODE1), (CODE2), (CODE3), (CODE4), (CODE5)))
-
-#define CONTAINS_STRUCT_CHECK(T, STRUCT) \
-(contains_struct_check ((T), (STRUCT), __FILE__, __LINE__, __FUNCTION__))
-
-#define TREE_CLASS_CHECK(T, CLASS) \
-(tree_class_check ((T), (CLASS), __FILE__, __LINE__, __FUNCTION__))
-
-#define TREE_RANGE_CHECK(T, CODE1, CODE2) \
-(tree_range_check ((T), (CODE1), (CODE2), __FILE__, __LINE__, __FUNCTION__))
-
-#define OMP_CLAUSE_SUBCODE_CHECK(T, CODE) \
-(omp_clause_subcode_check ((T), (CODE), __FILE__, __LINE__, __FUNCTION__))
-
-#define OMP_CLAUSE_RANGE_CHECK(T, CODE1, CODE2) \
-(omp_clause_range_check ((T), (CODE1), (CODE2), \
-                                      __FILE__, __LINE__, __FUNCTION__))
-
-/* These checks have to be special cased.  */
-#define EXPR_CHECK(T) \
-(expr_check ((T), __FILE__, __LINE__, __FUNCTION__))
-
-/* These checks have to be special cased.  */
-#define NON_TYPE_CHECK(T) \
-(non_type_check ((T), __FILE__, __LINE__, __FUNCTION__))
-
-#define TREE_VEC_ELT_CHECK(T, I) \
-(*(CONST_CAST2 (tree *, typeof (T)*, \
-     tree_vec_elt_check ((T), (I), __FILE__, __LINE__, __FUNCTION__))))
-
-#define OMP_CLAUSE_ELT_CHECK(T, I) \
-(*(omp_clause_elt_check ((T), (I), __FILE__, __LINE__, __FUNCTION__)))
-
-/* Special checks for TREE_OPERANDs.  */
-#define TREE_OPERAND_CHECK(T, I) \
-(*(CONST_CAST2 (tree*, typeof (T)*, \
-     tree_operand_check ((T), (I), __FILE__, __LINE__, __FUNCTION__))))
-
-#define TREE_OPERAND_CHECK_CODE(T, CODE, I) \
-(*(tree_operand_check_code ((T), (CODE), (I), \
-                                         __FILE__, __LINE__, __FUNCTION__)))
-
-/* Nodes are chained together for many purposes.
-   Types are chained together to record them for being output to the debugger
-   (see the function `chain_type').
-   Decls in the same scope are chained together to record the contents
-   of the scope.
-   Statement nodes for successive statements used to be chained together.
-   Often lists of things are represented by TREE_LIST nodes that
-   are chained together.  */
-
-#define TREE_CHAIN(NODE) \
-(CONTAINS_STRUCT_CHECK (NODE, TS_COMMON)->common.chain)
-
-/* In all nodes that are expressions, this is the data type of the expression.
-   In POINTER_TYPE nodes, this is the type that the pointer points to.
-   In ARRAY_TYPE nodes, this is the type of the elements.
-   In VECTOR_TYPE nodes, this is the type of the elements.  */
-#define TREE_TYPE(NODE) \
-(CONTAINS_STRUCT_CHECK (NODE, TS_TYPED)->typed.type)
-
-extern void tree_contains_struct_check_failed (const_tree,
-					       const enum tree_node_structure_enum,
-					       const char *, int, const char *)
-  ATTRIBUTE_NORETURN;
-
-extern void tree_check_failed (const_tree, const char *, int, const char *,
-			       ...) ATTRIBUTE_NORETURN;
-extern void tree_not_check_failed (const_tree, const char *, int, const char *,
-				   ...) ATTRIBUTE_NORETURN;
-extern void tree_class_check_failed (const_tree, const enum tree_code_class,
-				     const char *, int, const char *)
-    ATTRIBUTE_NORETURN;
-extern void tree_range_check_failed (const_tree, const char *, int,
-				     const char *, enum tree_code,
-				     enum tree_code)
-    ATTRIBUTE_NORETURN;
-extern void tree_not_class_check_failed (const_tree,
-					 const enum tree_code_class,
-					 const char *, int, const char *)
-    ATTRIBUTE_NORETURN;
-extern void tree_vec_elt_check_failed (int, int, const char *,
-				       int, const char *)
-    ATTRIBUTE_NORETURN;
-extern void phi_node_elt_check_failed (int, int, const char *,
-				       int, const char *)
-    ATTRIBUTE_NORETURN;
-extern void tree_operand_check_failed (int, const_tree,
-				       const char *, int, const char *)
-    ATTRIBUTE_NORETURN;
-extern void omp_clause_check_failed (const_tree, const char *, int,
-				     const char *, enum omp_clause_code)
-    ATTRIBUTE_NORETURN;
-extern void omp_clause_operand_check_failed (int, const_tree, const char *,
-				             int, const char *)
-    ATTRIBUTE_NORETURN;
-extern void omp_clause_range_check_failed (const_tree, const char *, int,
-			       const char *, enum omp_clause_code,
-			       enum omp_clause_code)
-    ATTRIBUTE_NORETURN;
-
-#else /* not ENABLE_TREE_CHECKING, or not gcc */
-
-#define CONTAINS_STRUCT_CHECK(T, ENUM)          (T)
-#define TREE_CHECK(T, CODE)			(T)
-#define TREE_NOT_CHECK(T, CODE)			(T)
-#define TREE_CHECK2(T, CODE1, CODE2)		(T)
-#define TREE_NOT_CHECK2(T, CODE1, CODE2)	(T)
-#define TREE_CHECK3(T, CODE1, CODE2, CODE3)	(T)
-#define TREE_NOT_CHECK3(T, CODE1, CODE2, CODE3)	(T)
-#define TREE_CHECK4(T, CODE1, CODE2, CODE3, CODE4) (T)
-#define TREE_NOT_CHECK4(T, CODE1, CODE2, CODE3, CODE4) (T)
-#define TREE_CHECK5(T, CODE1, CODE2, CODE3, CODE4, CODE5) (T)
-#define TREE_NOT_CHECK5(T, CODE1, CODE2, CODE3, CODE4, CODE5) (T)
-#define TREE_CLASS_CHECK(T, CODE)		(T)
-#define TREE_RANGE_CHECK(T, CODE1, CODE2)	(T)
-#define EXPR_CHECK(T)				(T)
-#define NON_TYPE_CHECK(T)			(T)
-#define TREE_VEC_ELT_CHECK(T, I)		((T)->vec.a[I])
-#define TREE_OPERAND_CHECK(T, I)		((T)->exp.operands[I])
-#define TREE_OPERAND_CHECK_CODE(T, CODE, I)	((T)->exp.operands[I])
-#define OMP_CLAUSE_ELT_CHECK(T, i)	        ((T)->omp_clause.ops[i])
-#define OMP_CLAUSE_RANGE_CHECK(T, CODE1, CODE2)	(T)
-#define OMP_CLAUSE_SUBCODE_CHECK(T, CODE)	(T)
-
-#define TREE_CHAIN(NODE) ((NODE)->common.chain)
-#define TREE_TYPE(NODE) ((NODE)->typed.type)
-
-#endif
-
-#define TREE_BLOCK(NODE)		(tree_block (NODE))
-#define TREE_SET_BLOCK(T, B)		(tree_set_block ((T), (B)))
-
-#include "tree-check.h"
-
-#define TYPE_CHECK(T)		TREE_CLASS_CHECK (T, tcc_type)
-#define DECL_MINIMAL_CHECK(T)   CONTAINS_STRUCT_CHECK (T, TS_DECL_MINIMAL)
-#define DECL_COMMON_CHECK(T)    CONTAINS_STRUCT_CHECK (T, TS_DECL_COMMON)
-#define DECL_WRTL_CHECK(T)      CONTAINS_STRUCT_CHECK (T, TS_DECL_WRTL)
-#define DECL_WITH_VIS_CHECK(T)  CONTAINS_STRUCT_CHECK (T, TS_DECL_WITH_VIS)
-#define DECL_NON_COMMON_CHECK(T) CONTAINS_STRUCT_CHECK (T, TS_DECL_NON_COMMON)
-#define CST_CHECK(T)		TREE_CLASS_CHECK (T, tcc_constant)
-#define STMT_CHECK(T)		TREE_CLASS_CHECK (T, tcc_statement)
-#define VL_EXP_CHECK(T)		TREE_CLASS_CHECK (T, tcc_vl_exp)
-#define FUNC_OR_METHOD_CHECK(T)	TREE_CHECK2 (T, FUNCTION_TYPE, METHOD_TYPE)
-#define PTR_OR_REF_CHECK(T)	TREE_CHECK2 (T, POINTER_TYPE, REFERENCE_TYPE)
-
-#define RECORD_OR_UNION_CHECK(T)	\
-  TREE_CHECK3 (T, RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE)
-#define NOT_RECORD_OR_UNION_CHECK(T) \
-  TREE_NOT_CHECK3 (T, RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE)
-
-#define NUMERICAL_TYPE_CHECK(T)					\
-  TREE_CHECK5 (T, INTEGER_TYPE, ENUMERAL_TYPE, BOOLEAN_TYPE, REAL_TYPE,	\
-	       FIXED_POINT_TYPE)
-
-/* Here is how primitive or already-canonicalized types' hash codes
-   are made.  */
-#define TYPE_HASH(TYPE) (TYPE_UID (TYPE))
-
-/* A simple hash function for an arbitrary tree node.  This must not be
-   used in hash tables which are saved to a PCH.  */
-#define TREE_HASH(NODE) ((size_t) (NODE) & 0777777)
-
-/* Tests if CODE is a conversion expr (NOP_EXPR or CONVERT_EXPR).  */
-#define CONVERT_EXPR_CODE_P(CODE)				\
-  ((CODE) == NOP_EXPR || (CODE) == CONVERT_EXPR)
-
-/* Similarly, but accept an expressions instead of a tree code.  */
-#define CONVERT_EXPR_P(EXP)	CONVERT_EXPR_CODE_P (TREE_CODE (EXP))
-
-/* Generate case for NOP_EXPR, CONVERT_EXPR.  */
-
-#define CASE_CONVERT						\
-  case NOP_EXPR:						\
-  case CONVERT_EXPR
-
-/* Given an expression as a tree, strip any conversion that generates
-   no instruction.  Accepts both tree and const_tree arguments since
-   we are not modifying the tree itself.  */
-
-#define STRIP_NOPS(EXP) \
-  (EXP) = tree_strip_nop_conversions (CONST_CAST_TREE (EXP))
-
-/* Like STRIP_NOPS, but don't let the signedness change either.  */
-
-#define STRIP_SIGN_NOPS(EXP) \
-  (EXP) = tree_strip_sign_nop_conversions (CONST_CAST_TREE (EXP))
-
-/* Like STRIP_NOPS, but don't alter the TREE_TYPE either.  */
-
-#define STRIP_TYPE_NOPS(EXP) \
-  while ((CONVERT_EXPR_P (EXP)					\
-	  || TREE_CODE (EXP) == NON_LVALUE_EXPR)		\
-	 && TREE_OPERAND (EXP, 0) != error_mark_node		\
-	 && (TREE_TYPE (EXP)					\
-	     == TREE_TYPE (TREE_OPERAND (EXP, 0))))		\
-    (EXP) = TREE_OPERAND (EXP, 0)
-
-/* Remove unnecessary type conversions according to
-   tree_ssa_useless_type_conversion.  */
-
-#define STRIP_USELESS_TYPE_CONVERSION(EXP) \
-  (EXP) = tree_ssa_strip_useless_type_conversions (EXP)
-
-/* Nonzero if TYPE represents a vector type.  */
-
-#define VECTOR_TYPE_P(TYPE) (TREE_CODE (TYPE) == VECTOR_TYPE)
-
-/* Nonzero if TYPE represents an integral type.  Note that we do not
-   include COMPLEX types here.  Keep these checks in ascending code
-   order.  */
-
-#define INTEGRAL_TYPE_P(TYPE)  \
-  (TREE_CODE (TYPE) == ENUMERAL_TYPE  \
-   || TREE_CODE (TYPE) == BOOLEAN_TYPE \
-   || TREE_CODE (TYPE) == INTEGER_TYPE)
-
-/* Nonzero if TYPE represents a non-saturating fixed-point type.  */
-
-#define NON_SAT_FIXED_POINT_TYPE_P(TYPE) \
-  (TREE_CODE (TYPE) == FIXED_POINT_TYPE && !TYPE_SATURATING (TYPE))
-
-/* Nonzero if TYPE represents a saturating fixed-point type.  */
-
-#define SAT_FIXED_POINT_TYPE_P(TYPE) \
-  (TREE_CODE (TYPE) == FIXED_POINT_TYPE && TYPE_SATURATING (TYPE))
-
-/* Nonzero if TYPE represents a fixed-point type.  */
-
-#define FIXED_POINT_TYPE_P(TYPE)	(TREE_CODE (TYPE) == FIXED_POINT_TYPE)
-
-/* Nonzero if TYPE represents a scalar floating-point type.  */
-
-#define SCALAR_FLOAT_TYPE_P(TYPE) (TREE_CODE (TYPE) == REAL_TYPE)
-
-/* Nonzero if TYPE represents a complex floating-point type.  */
-
-#define COMPLEX_FLOAT_TYPE_P(TYPE)	\
-  (TREE_CODE (TYPE) == COMPLEX_TYPE	\
-   && TREE_CODE (TREE_TYPE (TYPE)) == REAL_TYPE)
-
-/* Nonzero if TYPE represents a vector integer type.  */
-                
-#define VECTOR_INTEGER_TYPE_P(TYPE)			\
-  (VECTOR_TYPE_P (TYPE)					\
-   && TREE_CODE (TREE_TYPE (TYPE)) == INTEGER_TYPE)
-
-
-/* Nonzero if TYPE represents a vector floating-point type.  */
-
-#define VECTOR_FLOAT_TYPE_P(TYPE)	\
-  (VECTOR_TYPE_P (TYPE)			\
-   && TREE_CODE (TREE_TYPE (TYPE)) == REAL_TYPE)
-
-/* Nonzero if TYPE represents a floating-point type, including complex
-   and vector floating-point types.  The vector and complex check does
-   not use the previous two macros to enable early folding.  */
-
-#define FLOAT_TYPE_P(TYPE)			\
-  (SCALAR_FLOAT_TYPE_P (TYPE)			\
-   || ((TREE_CODE (TYPE) == COMPLEX_TYPE 	\
-        || VECTOR_TYPE_P (TYPE))		\
-       && SCALAR_FLOAT_TYPE_P (TREE_TYPE (TYPE))))
-
-/* Nonzero if TYPE represents a decimal floating-point type.  */
-#define DECIMAL_FLOAT_TYPE_P(TYPE)		\
-  (SCALAR_FLOAT_TYPE_P (TYPE)			\
-   && DECIMAL_FLOAT_MODE_P (TYPE_MODE (TYPE)))
-
-/* Nonzero if TYPE is a record or union type.  */
-#define RECORD_OR_UNION_TYPE_P(TYPE)		\
-  (TREE_CODE (TYPE) == RECORD_TYPE		\
-   || TREE_CODE (TYPE) == UNION_TYPE		\
-   || TREE_CODE (TYPE) == QUAL_UNION_TYPE)
-
-/* Nonzero if TYPE represents an aggregate (multi-component) type.
-   Keep these checks in ascending code order.  */
-
-#define AGGREGATE_TYPE_P(TYPE) \
-  (TREE_CODE (TYPE) == ARRAY_TYPE || RECORD_OR_UNION_TYPE_P (TYPE))
-
-/* Nonzero if TYPE represents a pointer or reference type.
-   (It should be renamed to INDIRECT_TYPE_P.)  Keep these checks in
-   ascending code order.  */
-
-#define POINTER_TYPE_P(TYPE) \
-  (TREE_CODE (TYPE) == POINTER_TYPE || TREE_CODE (TYPE) == REFERENCE_TYPE)
-
-/* Nonzero if TYPE represents a pointer to function.  */
-#define FUNCTION_POINTER_TYPE_P(TYPE) \
-  (POINTER_TYPE_P (TYPE) && TREE_CODE (TREE_TYPE (TYPE)) == FUNCTION_TYPE)
-
-/* Nonzero if this type is a complete type.  */
-#define COMPLETE_TYPE_P(NODE) (TYPE_SIZE (NODE) != NULL_TREE)
-
-/* Nonzero if this type is the (possibly qualified) void type.  */
-#define VOID_TYPE_P(NODE) (TREE_CODE (NODE) == VOID_TYPE)
-
-/* Nonzero if this type is complete or is cv void.  */
-#define COMPLETE_OR_VOID_TYPE_P(NODE) \
-  (COMPLETE_TYPE_P (NODE) || VOID_TYPE_P (NODE))
-
-/* Nonzero if this type is complete or is an array with unspecified bound.  */
-#define COMPLETE_OR_UNBOUND_ARRAY_TYPE_P(NODE) \
-  (COMPLETE_TYPE_P (TREE_CODE (NODE) == ARRAY_TYPE ? TREE_TYPE (NODE) : (NODE)))
-
-/* Define many boolean fields that all tree nodes have.  */
-
-/* In VAR_DECL, PARM_DECL and RESULT_DECL nodes, nonzero means address
-   of this is needed.  So it cannot be in a register.
-   In a FUNCTION_DECL it has no meaning.
-   In LABEL_DECL nodes, it means a goto for this label has been seen
-   from a place outside all binding contours that restore stack levels.
-   In an artificial SSA_NAME that points to a stack partition with at least
-   two variables, it means that at least one variable has TREE_ADDRESSABLE.
-   In ..._TYPE nodes, it means that objects of this type must be fully
-   addressable.  This means that pieces of this object cannot go into
-   register parameters, for example.  If this a function type, this
-   means that the value must be returned in memory.
-   In CONSTRUCTOR nodes, it means object constructed must be in memory.
-   In IDENTIFIER_NODEs, this means that some extern decl for this name
-   had its address taken.  That matters for inline functions.
-   In a STMT_EXPR, it means we want the result of the enclosed expression.  */
-#define TREE_ADDRESSABLE(NODE) ((NODE)->base.addressable_flag)
-
-/* Set on a CALL_EXPR if the call is in a tail position, ie. just before the
-   exit of a function.  Calls for which this is true are candidates for tail
-   call optimizations.  */
-#define CALL_EXPR_TAILCALL(NODE) \
-  (CALL_EXPR_CHECK (NODE)->base.addressable_flag)
-
-/* Used as a temporary field on a CASE_LABEL_EXPR to indicate that the
-   CASE_LOW operand has been processed.  */
-#define CASE_LOW_SEEN(NODE) \
-  (CASE_LABEL_EXPR_CHECK (NODE)->base.addressable_flag)
-
-#define PREDICT_EXPR_OUTCOME(NODE) \
-  ((enum prediction) (PREDICT_EXPR_CHECK (NODE)->base.addressable_flag))
-#define SET_PREDICT_EXPR_OUTCOME(NODE, OUTCOME) \
-  (PREDICT_EXPR_CHECK (NODE)->base.addressable_flag = (int) OUTCOME)
-#define PREDICT_EXPR_PREDICTOR(NODE) \
-  ((enum br_predictor)tree_to_shwi (TREE_OPERAND (PREDICT_EXPR_CHECK (NODE), 0)))
-
-/* In a VAR_DECL, nonzero means allocate static storage.
-   In a FUNCTION_DECL, nonzero if function has been defined.
-   In a CONSTRUCTOR, nonzero means allocate static storage.  */
-#define TREE_STATIC(NODE) ((NODE)->base.static_flag)
-
-/* In an ADDR_EXPR, nonzero means do not use a trampoline.  */
-#define TREE_NO_TRAMPOLINE(NODE) (ADDR_EXPR_CHECK (NODE)->base.static_flag)
-
-/* In a TARGET_EXPR or WITH_CLEANUP_EXPR, means that the pertinent cleanup
-   should only be executed if an exception is thrown, not on normal exit
-   of its scope.  */
-#define CLEANUP_EH_ONLY(NODE) ((NODE)->base.static_flag)
-
-/* In a TRY_CATCH_EXPR, means that the handler should be considered a
-   separate cleanup in honor_protect_cleanup_actions.  */
-#define TRY_CATCH_IS_CLEANUP(NODE) \
-  (TRY_CATCH_EXPR_CHECK (NODE)->base.static_flag)
-
-/* Used as a temporary field on a CASE_LABEL_EXPR to indicate that the
-   CASE_HIGH operand has been processed.  */
-#define CASE_HIGH_SEEN(NODE) \
-  (CASE_LABEL_EXPR_CHECK (NODE)->base.static_flag)
-
-/* Used to mark scoped enums.  */
-#define ENUM_IS_SCOPED(NODE) (ENUMERAL_TYPE_CHECK (NODE)->base.static_flag)
-
-/* Determines whether an ENUMERAL_TYPE has defined the list of constants. */
-#define ENUM_IS_OPAQUE(NODE) (ENUMERAL_TYPE_CHECK (NODE)->base.private_flag)
-
-/* In an expr node (usually a conversion) this means the node was made
-   implicitly and should not lead to any sort of warning.  In a decl node,
-   warnings concerning the decl should be suppressed.  This is used at
-   least for used-before-set warnings, and it set after one warning is
-   emitted.  */
-#define TREE_NO_WARNING(NODE) ((NODE)->base.nowarning_flag)
-
-/* Used to indicate that this TYPE represents a compiler-generated entity.  */
-#define TYPE_ARTIFICIAL(NODE) (TYPE_CHECK (NODE)->base.nowarning_flag)
-
-/* In an IDENTIFIER_NODE, this means that assemble_name was called with
-   this string as an argument.  */
-#define TREE_SYMBOL_REFERENCED(NODE) \
-  (IDENTIFIER_NODE_CHECK (NODE)->base.static_flag)
-
-/* Nonzero in a pointer or reference type means the data pointed to
-   by this type can alias anything.  */
-#define TYPE_REF_CAN_ALIAS_ALL(NODE) \
-  (PTR_OR_REF_CHECK (NODE)->base.static_flag)
-
-/* In an INTEGER_CST, REAL_CST, COMPLEX_CST, or VECTOR_CST, this means
-   there was an overflow in folding.  */
-
-#define TREE_OVERFLOW(NODE) (CST_CHECK (NODE)->base.public_flag)
-
-/* TREE_OVERFLOW can only be true for EXPR of CONSTANT_CLASS_P.  */
-
-#define TREE_OVERFLOW_P(EXPR) \
- (CONSTANT_CLASS_P (EXPR) && TREE_OVERFLOW (EXPR))
-
-/* In a VAR_DECL, FUNCTION_DECL, NAMESPACE_DECL or TYPE_DECL,
-   nonzero means name is to be accessible from outside this translation unit.
-   In an IDENTIFIER_NODE, nonzero means an external declaration
-   accessible from outside this translation unit was previously seen
-   for this name in an inner scope.  */
-#define TREE_PUBLIC(NODE) ((NODE)->base.public_flag)
-
-/* In a _TYPE, indicates whether TYPE_CACHED_VALUES contains a vector
-   of cached values, or is something else.  */
-#define TYPE_CACHED_VALUES_P(NODE) (TYPE_CHECK (NODE)->base.public_flag)
-
-/* In a SAVE_EXPR, indicates that the original expression has already
-   been substituted with a VAR_DECL that contains the value.  */
-#define SAVE_EXPR_RESOLVED_P(NODE) \
-  (SAVE_EXPR_CHECK (NODE)->base.public_flag)
-
-/* Set on a CALL_EXPR if this stdarg call should be passed the argument
-   pack.  */
-#define CALL_EXPR_VA_ARG_PACK(NODE) \
-  (CALL_EXPR_CHECK (NODE)->base.public_flag)
-
-/* In any expression, decl, or constant, nonzero means it has side effects or
-   reevaluation of the whole expression could produce a different value.
-   This is set if any subexpression is a function call, a side effect or a
-   reference to a volatile variable.  In a ..._DECL, this is set only if the
-   declaration said `volatile'.  This will never be set for a constant.  */
-#define TREE_SIDE_EFFECTS(NODE) \
-  (NON_TYPE_CHECK (NODE)->base.side_effects_flag)
-
-/* In a LABEL_DECL, nonzero means this label had its address taken
-   and therefore can never be deleted and is a jump target for
-   computed gotos.  */
-#define FORCED_LABEL(NODE) (LABEL_DECL_CHECK (NODE)->base.side_effects_flag)
-
-/* Nonzero means this expression is volatile in the C sense:
-   its address should be of type `volatile WHATEVER *'.
-   In other words, the declared item is volatile qualified.
-   This is used in _DECL nodes and _REF nodes.
-   On a FUNCTION_DECL node, this means the function does not
-   return normally.  This is the same effect as setting
-   the attribute noreturn on the function in C.
-
-   In a ..._TYPE node, means this type is volatile-qualified.
-   But use TYPE_VOLATILE instead of this macro when the node is a type,
-   because eventually we may make that a different bit.
-
-   If this bit is set in an expression, so is TREE_SIDE_EFFECTS.  */
-#define TREE_THIS_VOLATILE(NODE) ((NODE)->base.volatile_flag)
-
-/* Nonzero means this node will not trap.  In an INDIRECT_REF, means
-   accessing the memory pointed to won't generate a trap.  However,
-   this only applies to an object when used appropriately: it doesn't
-   mean that writing a READONLY mem won't trap.
-
-   In ARRAY_REF and ARRAY_RANGE_REF means that we know that the index
-   (or slice of the array) always belongs to the range of the array.
-   I.e. that the access will not trap, provided that the access to
-   the base to the array will not trap.  */
-#define TREE_THIS_NOTRAP(NODE) \
-  (TREE_CHECK5 (NODE, INDIRECT_REF, MEM_REF, TARGET_MEM_REF, ARRAY_REF,	\
-		ARRAY_RANGE_REF)->base.nothrow_flag)
-
-/* In a VAR_DECL, PARM_DECL or FIELD_DECL, or any kind of ..._REF node,
-   nonzero means it may not be the lhs of an assignment.
-   Nonzero in a FUNCTION_DECL means this function should be treated
-   as "const" function (can only read its arguments).  */
-#define TREE_READONLY(NODE) (NON_TYPE_CHECK (NODE)->base.readonly_flag)
-
-/* Value of expression is constant.  Always on in all ..._CST nodes.  May
-   also appear in an expression or decl where the value is constant.  */
-#define TREE_CONSTANT(NODE) (NON_TYPE_CHECK (NODE)->base.constant_flag)
-
-/* Nonzero if NODE, a type, has had its sizes gimplified.  */
-#define TYPE_SIZES_GIMPLIFIED(NODE) \
-  (TYPE_CHECK (NODE)->base.constant_flag)
-
-/* In a decl (most significantly a FIELD_DECL), means an unsigned field.  */
-#define DECL_UNSIGNED(NODE) \
-  (DECL_COMMON_CHECK (NODE)->base.u.bits.unsigned_flag)
-
-/* In integral and pointer types, means an unsigned type.  */
-#define TYPE_UNSIGNED(NODE) (TYPE_CHECK (NODE)->base.u.bits.unsigned_flag)
-
-/* True if overflow wraps around for the given integral type.  That
-   is, TYPE_MAX + 1 == TYPE_MIN.  */
-#define TYPE_OVERFLOW_WRAPS(TYPE) \
-  (TYPE_UNSIGNED (TYPE) || flag_wrapv)
-
-/* True if overflow is undefined for the given integral type.  We may
-   optimize on the assumption that values in the type never overflow.
-
-   IMPORTANT NOTE: Any optimization based on TYPE_OVERFLOW_UNDEFINED
-   must issue a warning based on warn_strict_overflow.  In some cases
-   it will be appropriate to issue the warning immediately, and in
-   other cases it will be appropriate to simply set a flag and let the
-   caller decide whether a warning is appropriate or not.  */
-#define TYPE_OVERFLOW_UNDEFINED(TYPE) \
-  (!TYPE_UNSIGNED (TYPE) && !flag_wrapv && !flag_trapv && flag_strict_overflow)
-
-/* True if overflow for the given integral type should issue a
-   trap.  */
-#define TYPE_OVERFLOW_TRAPS(TYPE) \
-  (!TYPE_UNSIGNED (TYPE) && flag_trapv)
-
-/* True if pointer types have undefined overflow.  */
-#define POINTER_TYPE_OVERFLOW_UNDEFINED (flag_strict_overflow)
-
-/* Nonzero in a VAR_DECL or STRING_CST means assembler code has been written.
-   Nonzero in a FUNCTION_DECL means that the function has been compiled.
-   This is interesting in an inline function, since it might not need
-   to be compiled separately.
-   Nonzero in a RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE, ENUMERAL_TYPE
-   or TYPE_DECL if the debugging info for the type has been written.
-   In a BLOCK node, nonzero if reorder_blocks has already seen this block.
-   In an SSA_NAME node, nonzero if the SSA_NAME occurs in an abnormal
-   PHI node.  */
-#define TREE_ASM_WRITTEN(NODE) ((NODE)->base.asm_written_flag)
-
-/* Nonzero in a _DECL if the name is used in its scope.
-   Nonzero in an expr node means inhibit warning if value is unused.
-   In IDENTIFIER_NODEs, this means that some extern decl for this name
-   was used.
-   In a BLOCK, this means that the block contains variables that are used.  */
-#define TREE_USED(NODE) ((NODE)->base.used_flag)
-
-/* In a FUNCTION_DECL, nonzero means a call to the function cannot
-   throw an exception.  In a CALL_EXPR, nonzero means the call cannot
-   throw.  We can't easily check the node type here as the C++
-   frontend also uses this flag (for AGGR_INIT_EXPR).  */
-#define TREE_NOTHROW(NODE) ((NODE)->base.nothrow_flag)
-
-/* In a CALL_EXPR, means that it's safe to use the target of the call
-   expansion as the return slot for a call that returns in memory.  */
-#define CALL_EXPR_RETURN_SLOT_OPT(NODE) \
-  (CALL_EXPR_CHECK (NODE)->base.private_flag)
-
-/* Cilk keywords accessors.  */
-#define CILK_SPAWN_FN(NODE) TREE_OPERAND (CILK_SPAWN_STMT_CHECK (NODE), 0)
-
-/* In a RESULT_DECL, PARM_DECL and VAR_DECL, means that it is
-   passed by invisible reference (and the TREE_TYPE is a pointer to the true
-   type).  */
-#define DECL_BY_REFERENCE(NODE) \
-  (TREE_CHECK3 (NODE, VAR_DECL, PARM_DECL, \
-		RESULT_DECL)->decl_common.decl_by_reference_flag)
-
-/* In VAR_DECL and PARM_DECL, set when the decl has been used except for
-   being set.  */
-#define DECL_READ_P(NODE) \
-  (TREE_CHECK2 (NODE, VAR_DECL, PARM_DECL)->decl_common.decl_read_flag)
-
-/* In VAR_DECL or RESULT_DECL, set when significant code movement precludes
-   attempting to share the stack slot with some other variable.  */
-#define DECL_NONSHAREABLE(NODE) \
-  (TREE_CHECK2 (NODE, VAR_DECL, \
-		RESULT_DECL)->decl_common.decl_nonshareable_flag)
-
-/* In a CALL_EXPR, means that the call is the jump from a thunk to the
-   thunked-to function.  */
-#define CALL_FROM_THUNK_P(NODE) (CALL_EXPR_CHECK (NODE)->base.protected_flag)
-
-/* In a CALL_EXPR, if the function being called is BUILT_IN_ALLOCA, means that
-   it has been built for the declaration of a variable-sized object.  */
-#define CALL_ALLOCA_FOR_VAR_P(NODE) \
-  (CALL_EXPR_CHECK (NODE)->base.protected_flag)
-
-/* In a type, nonzero means that all objects of the type are guaranteed by the
-   language or front-end to be properly aligned, so we can indicate that a MEM
-   of this type is aligned at least to the alignment of the type, even if it
-   doesn't appear that it is.  We see this, for example, in object-oriented
-   languages where a tag field may show this is an object of a more-aligned
-   variant of the more generic type.
-
-   In an SSA_NAME node, nonzero if the SSA_NAME node is on the SSA_NAME
-   freelist.  */
-#define TYPE_ALIGN_OK(NODE) (TYPE_CHECK (NODE)->base.nothrow_flag)
-
-/* Used in classes in C++.  */
-#define TREE_PRIVATE(NODE) ((NODE)->base.private_flag)
-/* Used in classes in C++. */
-#define TREE_PROTECTED(NODE) ((NODE)->base.protected_flag)
-
-/* True if reference type NODE is a C++ rvalue reference.  */
-#define TYPE_REF_IS_RVALUE(NODE) \
-  (REFERENCE_TYPE_CHECK (NODE)->base.private_flag)
-
-/* Nonzero in a _DECL if the use of the name is defined as a
-   deprecated feature by __attribute__((deprecated)).  */
-#define TREE_DEPRECATED(NODE) \
-  ((NODE)->base.deprecated_flag)
-
-/* Nonzero in an IDENTIFIER_NODE if the name is a local alias, whose
-   uses are to be substituted for uses of the TREE_CHAINed identifier.  */
-#define IDENTIFIER_TRANSPARENT_ALIAS(NODE) \
-  (IDENTIFIER_NODE_CHECK (NODE)->base.deprecated_flag)
-
-/* In fixed-point types, means a saturating type.  */
-#define TYPE_SATURATING(NODE) (TYPE_CHECK (NODE)->base.u.bits.saturating_flag)
-
-/* These flags are available for each language front end to use internally.  */
-#define TREE_LANG_FLAG_0(NODE) \
-  (TREE_NOT_CHECK2 (NODE, TREE_VEC, SSA_NAME)->base.u.bits.lang_flag_0)
-#define TREE_LANG_FLAG_1(NODE) \
-  (TREE_NOT_CHECK2 (NODE, TREE_VEC, SSA_NAME)->base.u.bits.lang_flag_1)
-#define TREE_LANG_FLAG_2(NODE) \
-  (TREE_NOT_CHECK2 (NODE, TREE_VEC, SSA_NAME)->base.u.bits.lang_flag_2)
-#define TREE_LANG_FLAG_3(NODE) \
-  (TREE_NOT_CHECK2 (NODE, TREE_VEC, SSA_NAME)->base.u.bits.lang_flag_3)
-#define TREE_LANG_FLAG_4(NODE) \
-  (TREE_NOT_CHECK2 (NODE, TREE_VEC, SSA_NAME)->base.u.bits.lang_flag_4)
-#define TREE_LANG_FLAG_5(NODE) \
-  (TREE_NOT_CHECK2 (NODE, TREE_VEC, SSA_NAME)->base.u.bits.lang_flag_5)
-#define TREE_LANG_FLAG_6(NODE) \
-  (TREE_NOT_CHECK2 (NODE, TREE_VEC, SSA_NAME)->base.u.bits.lang_flag_6)
-
-/* Define additional fields and accessors for nodes representing constants.  */
-
-/* In an INTEGER_CST node.  These two together make a 2-word integer.
-   If the data type is signed, the value is sign-extended to 2 words
-   even though not all of them may really be in use.
-   In an unsigned constant shorter than 2 words, the extra bits are 0.  */
-#define TREE_INT_CST(NODE) (INTEGER_CST_CHECK (NODE)->int_cst.int_cst)
-#define TREE_INT_CST_LOW(NODE) (TREE_INT_CST (NODE).low)
-#define TREE_INT_CST_HIGH(NODE) (TREE_INT_CST (NODE).high)
-
-#define INT_CST_LT(A, B)				\
-  (TREE_INT_CST_HIGH (A) < TREE_INT_CST_HIGH (B)	\
-   || (TREE_INT_CST_HIGH (A) == TREE_INT_CST_HIGH (B)	\
-       && TREE_INT_CST_LOW (A) < TREE_INT_CST_LOW (B)))
-
-#define INT_CST_LT_UNSIGNED(A, B)				\
-  (((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (A)		\
-    < (unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (B))		\
-   || (((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (A)		\
-	== (unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (B))	\
-       && TREE_INT_CST_LOW (A) < TREE_INT_CST_LOW (B)))
-
-#define TREE_REAL_CST_PTR(NODE) (REAL_CST_CHECK (NODE)->real_cst.real_cst_ptr)
-#define TREE_REAL_CST(NODE) (*TREE_REAL_CST_PTR (NODE))
-
-#define TREE_FIXED_CST_PTR(NODE) \
-  (FIXED_CST_CHECK (NODE)->fixed_cst.fixed_cst_ptr)
-#define TREE_FIXED_CST(NODE) (*TREE_FIXED_CST_PTR (NODE))
-
-/* In a STRING_CST */
-/* In C terms, this is sizeof, not strlen.  */
-#define TREE_STRING_LENGTH(NODE) (STRING_CST_CHECK (NODE)->string.length)
-#define TREE_STRING_POINTER(NODE) \
-  ((const char *)(STRING_CST_CHECK (NODE)->string.str))
-
-/* In a COMPLEX_CST node.  */
-#define TREE_REALPART(NODE) (COMPLEX_CST_CHECK (NODE)->complex.real)
-#define TREE_IMAGPART(NODE) (COMPLEX_CST_CHECK (NODE)->complex.imag)
-
-/* In a VECTOR_CST node.  */
-#define VECTOR_CST_NELTS(NODE) (TYPE_VECTOR_SUBPARTS (TREE_TYPE (NODE)))
-#define VECTOR_CST_ELTS(NODE) (VECTOR_CST_CHECK (NODE)->vector.elts)
-#define VECTOR_CST_ELT(NODE,IDX) (VECTOR_CST_CHECK (NODE)->vector.elts[IDX])
-
-/* Define fields and accessors for some special-purpose tree nodes.  */
-
-#define IDENTIFIER_LENGTH(NODE) \
-  (IDENTIFIER_NODE_CHECK (NODE)->identifier.id.len)
-#define IDENTIFIER_POINTER(NODE) \
-  ((const char *) IDENTIFIER_NODE_CHECK (NODE)->identifier.id.str)
-#define IDENTIFIER_HASH_VALUE(NODE) \
-  (IDENTIFIER_NODE_CHECK (NODE)->identifier.id.hash_value)
-
-/* Translate a hash table identifier pointer to a tree_identifier
-   pointer, and vice versa.  */
-
-#define HT_IDENT_TO_GCC_IDENT(NODE) \
-  ((tree) ((char *) (NODE) - sizeof (struct tree_common)))
-#define GCC_IDENT_TO_HT_IDENT(NODE) (&((struct tree_identifier *) (NODE))->id)
-
-/* In a TREE_LIST node.  */
-#define TREE_PURPOSE(NODE) (TREE_LIST_CHECK (NODE)->list.purpose)
-#define TREE_VALUE(NODE) (TREE_LIST_CHECK (NODE)->list.value)
-
-/* In a TREE_VEC node.  */
-#define TREE_VEC_LENGTH(NODE) (TREE_VEC_CHECK (NODE)->base.u.length)
-#define TREE_VEC_END(NODE) \
-  ((void) TREE_VEC_CHECK (NODE), &((NODE)->vec.a[(NODE)->vec.base.u.length]))
-
-#define TREE_VEC_ELT(NODE,I) TREE_VEC_ELT_CHECK (NODE, I)
-
-/* In a CONSTRUCTOR node.  */
-#define CONSTRUCTOR_ELTS(NODE) (CONSTRUCTOR_CHECK (NODE)->constructor.elts)
-#define CONSTRUCTOR_ELT(NODE,IDX) \
-  (&(*CONSTRUCTOR_ELTS (NODE))[IDX])
-#define CONSTRUCTOR_NELTS(NODE) \
-  (vec_safe_length (CONSTRUCTOR_ELTS (NODE)))
-#define CONSTRUCTOR_NO_CLEARING(NODE) \
-  (CONSTRUCTOR_CHECK (NODE)->base.public_flag)
-
-/* Iterate through the vector V of CONSTRUCTOR_ELT elements, yielding the
-   value of each element (stored within VAL). IX must be a scratch variable
-   of unsigned integer type.  */
-#define FOR_EACH_CONSTRUCTOR_VALUE(V, IX, VAL) \
-  for (IX = 0; (IX >= vec_safe_length (V)) \
-	       ? false \
-	       : ((VAL = (*(V))[IX].value), \
-	       true); \
-       (IX)++)
-
-/* Iterate through the vector V of CONSTRUCTOR_ELT elements, yielding both
-   the value of each element (stored within VAL) and its index (stored
-   within INDEX). IX must be a scratch variable of unsigned integer type.  */
-#define FOR_EACH_CONSTRUCTOR_ELT(V, IX, INDEX, VAL) \
-  for (IX = 0; (IX >= vec_safe_length (V)) \
-	       ? false \
-	       : (((void) (VAL = (*V)[IX].value)), \
-		  (INDEX = (*V)[IX].index), \
-		  true); \
-       (IX)++)
-
-/* Append a new constructor element to V, with the specified INDEX and VAL.  */
-#define CONSTRUCTOR_APPEND_ELT(V, INDEX, VALUE) \
-  do { \
-    constructor_elt _ce___ = {INDEX, VALUE}; \
-    vec_safe_push ((V), _ce___); \
-  } while (0)
-
-/* True if NODE, a FIELD_DECL, is to be processed as a bitfield for
-   constructor output purposes.  */
-#define CONSTRUCTOR_BITFIELD_P(NODE) \
-  (DECL_BIT_FIELD (FIELD_DECL_CHECK (NODE)) && DECL_MODE (NODE) != BLKmode)
-
-/* True if NODE is a clobber right hand side, an expression of indeterminate
-   value that clobbers the LHS in a copy instruction.  We use a volatile
-   empty CONSTRUCTOR for this, as it matches most of the necessary semantic.
-   In particular the volatile flag causes us to not prematurely remove
-   such clobber instructions.  */
-#define TREE_CLOBBER_P(NODE) \
-  (TREE_CODE (NODE) == CONSTRUCTOR && TREE_THIS_VOLATILE (NODE))
-
-/* Define fields and accessors for some nodes that represent expressions.  */
-
-/* Nonzero if NODE is an empty statement (NOP_EXPR <0>).  */
-#define IS_EMPTY_STMT(NODE)	(TREE_CODE (NODE) == NOP_EXPR \
-				 && VOID_TYPE_P (TREE_TYPE (NODE)) \
-				 && integer_zerop (TREE_OPERAND (NODE, 0)))
-
-/* In ordinary expression nodes.  */
-#define TREE_OPERAND_LENGTH(NODE) tree_operand_length (NODE)
-#define TREE_OPERAND(NODE, I) TREE_OPERAND_CHECK (NODE, I)
-
-/* In a tcc_vl_exp node, operand 0 is an INT_CST node holding the operand
-   length.  Its value includes the length operand itself; that is,
-   the minimum valid length is 1.
-   Note that we have to bypass the use of TREE_OPERAND to access
-   that field to avoid infinite recursion in expanding the macros.  */
-#define VL_EXP_OPERAND_LENGTH(NODE) \
-  ((int)TREE_INT_CST_LOW (VL_EXP_CHECK (NODE)->exp.operands[0]))
-
-/* Nonzero if is_gimple_debug() may possibly hold.  */
-#define MAY_HAVE_DEBUG_STMTS    (flag_var_tracking_assignments)
-
-/* In a LOOP_EXPR node.  */
-#define LOOP_EXPR_BODY(NODE) TREE_OPERAND_CHECK_CODE (NODE, LOOP_EXPR, 0)
-
-/* The source location of this expression.  Non-tree_exp nodes such as
-   decls and constants can be shared among multiple locations, so
-   return nothing.  */
-#define EXPR_LOCATION(NODE) \
-  (CAN_HAVE_LOCATION_P ((NODE)) ? (NODE)->exp.locus : UNKNOWN_LOCATION)
-#define SET_EXPR_LOCATION(NODE, LOCUS) EXPR_CHECK ((NODE))->exp.locus = (LOCUS)
-#define EXPR_HAS_LOCATION(NODE) (LOCATION_LOCUS (EXPR_LOCATION (NODE))	\
-  != UNKNOWN_LOCATION)
-/* The location to be used in a diagnostic about this expression.  Do not
-   use this macro if the location will be assigned to other expressions.  */
-#define EXPR_LOC_OR_LOC(NODE, LOCUS) (EXPR_HAS_LOCATION (NODE) \
-				      ? (NODE)->exp.locus : (LOCUS))
-#define EXPR_FILENAME(NODE) LOCATION_FILE (EXPR_CHECK ((NODE))->exp.locus)
-#define EXPR_LINENO(NODE) LOCATION_LINE (EXPR_CHECK (NODE)->exp.locus)
-
-/* True if a tree is an expression or statement that can have a
-   location.  */
-#define CAN_HAVE_LOCATION_P(NODE) ((NODE) && EXPR_P (NODE))
-
-extern void protected_set_expr_location (tree, location_t);
-
-/* In a TARGET_EXPR node.  */
-#define TARGET_EXPR_SLOT(NODE) TREE_OPERAND_CHECK_CODE (NODE, TARGET_EXPR, 0)
-#define TARGET_EXPR_INITIAL(NODE) TREE_OPERAND_CHECK_CODE (NODE, TARGET_EXPR, 1)
-#define TARGET_EXPR_CLEANUP(NODE) TREE_OPERAND_CHECK_CODE (NODE, TARGET_EXPR, 2)
-
-/* DECL_EXPR accessor. This gives access to the DECL associated with
-   the given declaration statement.  */
-#define DECL_EXPR_DECL(NODE)    TREE_OPERAND (DECL_EXPR_CHECK (NODE), 0)
-
-#define EXIT_EXPR_COND(NODE)	     TREE_OPERAND (EXIT_EXPR_CHECK (NODE), 0)
-
-/* COMPOUND_LITERAL_EXPR accessors.  */
-#define COMPOUND_LITERAL_EXPR_DECL_EXPR(NODE)		\
-  TREE_OPERAND (COMPOUND_LITERAL_EXPR_CHECK (NODE), 0)
-#define COMPOUND_LITERAL_EXPR_DECL(NODE)			\
-  DECL_EXPR_DECL (COMPOUND_LITERAL_EXPR_DECL_EXPR (NODE))
-
-/* SWITCH_EXPR accessors. These give access to the condition, body and
-   original condition type (before any compiler conversions)
-   of the switch statement, respectively.  */
-#define SWITCH_COND(NODE)       TREE_OPERAND (SWITCH_EXPR_CHECK (NODE), 0)
-#define SWITCH_BODY(NODE)       TREE_OPERAND (SWITCH_EXPR_CHECK (NODE), 1)
-#define SWITCH_LABELS(NODE)     TREE_OPERAND (SWITCH_EXPR_CHECK (NODE), 2)
-
-/* CASE_LABEL_EXPR accessors. These give access to the high and low values
-   of a case label, respectively.  */
-#define CASE_LOW(NODE)          	TREE_OPERAND (CASE_LABEL_EXPR_CHECK (NODE), 0)
-#define CASE_HIGH(NODE)         	TREE_OPERAND (CASE_LABEL_EXPR_CHECK (NODE), 1)
-#define CASE_LABEL(NODE)		TREE_OPERAND (CASE_LABEL_EXPR_CHECK (NODE), 2)
-#define CASE_CHAIN(NODE)		TREE_OPERAND (CASE_LABEL_EXPR_CHECK (NODE), 3)
-
-/* The operands of a TARGET_MEM_REF.  Operands 0 and 1 have to match
-   corresponding MEM_REF operands.  */
-#define TMR_BASE(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 0))
-#define TMR_OFFSET(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 1))
-#define TMR_INDEX(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 2))
-#define TMR_STEP(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 3))
-#define TMR_INDEX2(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 4))
-
-/* The operands of a BIND_EXPR.  */
-#define BIND_EXPR_VARS(NODE) (TREE_OPERAND (BIND_EXPR_CHECK (NODE), 0))
-#define BIND_EXPR_BODY(NODE) (TREE_OPERAND (BIND_EXPR_CHECK (NODE), 1))
-#define BIND_EXPR_BLOCK(NODE) (TREE_OPERAND (BIND_EXPR_CHECK (NODE), 2))
-
-/* GOTO_EXPR accessor. This gives access to the label associated with
-   a goto statement.  */
-#define GOTO_DESTINATION(NODE)  TREE_OPERAND ((NODE), 0)
-
-/* ASM_EXPR accessors. ASM_STRING returns a STRING_CST for the
-   instruction (e.g., "mov x, y"). ASM_OUTPUTS, ASM_INPUTS, and
-   ASM_CLOBBERS represent the outputs, inputs, and clobbers for the
-   statement.  */
-#define ASM_STRING(NODE)        TREE_OPERAND (ASM_EXPR_CHECK (NODE), 0)
-#define ASM_OUTPUTS(NODE)       TREE_OPERAND (ASM_EXPR_CHECK (NODE), 1)
-#define ASM_INPUTS(NODE)        TREE_OPERAND (ASM_EXPR_CHECK (NODE), 2)
-#define ASM_CLOBBERS(NODE)      TREE_OPERAND (ASM_EXPR_CHECK (NODE), 3)
-#define ASM_LABELS(NODE)	TREE_OPERAND (ASM_EXPR_CHECK (NODE), 4)
-/* Nonzero if we want to create an ASM_INPUT instead of an
-   ASM_OPERAND with no operands.  */
-#define ASM_INPUT_P(NODE) (ASM_EXPR_CHECK (NODE)->base.static_flag)
-#define ASM_VOLATILE_P(NODE) (ASM_EXPR_CHECK (NODE)->base.public_flag)
-
-/* COND_EXPR accessors.  */
-#define COND_EXPR_COND(NODE)	(TREE_OPERAND (COND_EXPR_CHECK (NODE), 0))
-#define COND_EXPR_THEN(NODE)	(TREE_OPERAND (COND_EXPR_CHECK (NODE), 1))
-#define COND_EXPR_ELSE(NODE)	(TREE_OPERAND (COND_EXPR_CHECK (NODE), 2))
-
-/* Accessors for the chains of recurrences.  */
-#define CHREC_VAR(NODE)           TREE_OPERAND (POLYNOMIAL_CHREC_CHECK (NODE), 0)
-#define CHREC_LEFT(NODE)          TREE_OPERAND (POLYNOMIAL_CHREC_CHECK (NODE), 1)
-#define CHREC_RIGHT(NODE)         TREE_OPERAND (POLYNOMIAL_CHREC_CHECK (NODE), 2)
-#define CHREC_VARIABLE(NODE)      TREE_INT_CST_LOW (CHREC_VAR (NODE))
-
-/* LABEL_EXPR accessor. This gives access to the label associated with
-   the given label expression.  */
-#define LABEL_EXPR_LABEL(NODE)  TREE_OPERAND (LABEL_EXPR_CHECK (NODE), 0)
-
-/* CATCH_EXPR accessors.  */
-#define CATCH_TYPES(NODE)	TREE_OPERAND (CATCH_EXPR_CHECK (NODE), 0)
-#define CATCH_BODY(NODE)	TREE_OPERAND (CATCH_EXPR_CHECK (NODE), 1)
-
-/* EH_FILTER_EXPR accessors.  */
-#define EH_FILTER_TYPES(NODE)	TREE_OPERAND (EH_FILTER_EXPR_CHECK (NODE), 0)
-#define EH_FILTER_FAILURE(NODE)	TREE_OPERAND (EH_FILTER_EXPR_CHECK (NODE), 1)
-
-/* OBJ_TYPE_REF accessors.  */
-#define OBJ_TYPE_REF_EXPR(NODE)	  TREE_OPERAND (OBJ_TYPE_REF_CHECK (NODE), 0)
-#define OBJ_TYPE_REF_OBJECT(NODE) TREE_OPERAND (OBJ_TYPE_REF_CHECK (NODE), 1)
-#define OBJ_TYPE_REF_TOKEN(NODE)  TREE_OPERAND (OBJ_TYPE_REF_CHECK (NODE), 2)
-
-/* ASSERT_EXPR accessors.  */
-#define ASSERT_EXPR_VAR(NODE)	TREE_OPERAND (ASSERT_EXPR_CHECK (NODE), 0)
-#define ASSERT_EXPR_COND(NODE)	TREE_OPERAND (ASSERT_EXPR_CHECK (NODE), 1)
-
-/* CALL_EXPR accessors.
- */
-#define CALL_EXPR_FN(NODE) TREE_OPERAND (CALL_EXPR_CHECK (NODE), 1)
-#define CALL_EXPR_STATIC_CHAIN(NODE) TREE_OPERAND (CALL_EXPR_CHECK (NODE), 2)
-#define CALL_EXPR_ARG(NODE, I) TREE_OPERAND (CALL_EXPR_CHECK (NODE), (I) + 3)
-#define call_expr_nargs(NODE) (VL_EXP_OPERAND_LENGTH (NODE) - 3)
-
-/* CALL_EXPR_ARGP returns a pointer to the argument vector for NODE.
-   We can't use &CALL_EXPR_ARG (NODE, 0) because that will complain if
-   the argument count is zero when checking is enabled.  Instead, do
-   the pointer arithmetic to advance past the 3 fixed operands in a
-   CALL_EXPR.  That produces a valid pointer to just past the end of the
-   operand array, even if it's not valid to dereference it.  */
-#define CALL_EXPR_ARGP(NODE) \
-  (&(TREE_OPERAND (CALL_EXPR_CHECK (NODE), 0)) + 3)
-
-/* TM directives and accessors.  */
-#define TRANSACTION_EXPR_BODY(NODE) \
-  TREE_OPERAND (TRANSACTION_EXPR_CHECK (NODE), 0)
-#define TRANSACTION_EXPR_OUTER(NODE) \
-  (TRANSACTION_EXPR_CHECK (NODE)->base.static_flag)
-#define TRANSACTION_EXPR_RELAXED(NODE) \
-  (TRANSACTION_EXPR_CHECK (NODE)->base.public_flag)
-
-/* OpenMP directive and clause accessors.  */
-
-#define OMP_BODY(NODE) \
-  TREE_OPERAND (TREE_RANGE_CHECK (NODE, OMP_PARALLEL, OMP_CRITICAL), 0)
-#define OMP_CLAUSES(NODE) \
-  TREE_OPERAND (TREE_RANGE_CHECK (NODE, OMP_PARALLEL, OMP_SINGLE), 1)
-
-#define OMP_PARALLEL_BODY(NODE)    TREE_OPERAND (OMP_PARALLEL_CHECK (NODE), 0)
-#define OMP_PARALLEL_CLAUSES(NODE) TREE_OPERAND (OMP_PARALLEL_CHECK (NODE), 1)
-
-#define OMP_TASK_BODY(NODE)	   TREE_OPERAND (OMP_TASK_CHECK (NODE), 0)
-#define OMP_TASK_CLAUSES(NODE)	   TREE_OPERAND (OMP_TASK_CHECK (NODE), 1)
-
-#define OMP_TASKREG_CHECK(NODE)	  TREE_RANGE_CHECK (NODE, OMP_PARALLEL, OMP_TASK)
-#define OMP_TASKREG_BODY(NODE)    TREE_OPERAND (OMP_TASKREG_CHECK (NODE), 0)
-#define OMP_TASKREG_CLAUSES(NODE) TREE_OPERAND (OMP_TASKREG_CHECK (NODE), 1)
-
-#define OMP_LOOP_CHECK(NODE) TREE_RANGE_CHECK (NODE, OMP_FOR, OMP_DISTRIBUTE)
-#define OMP_FOR_BODY(NODE)	   TREE_OPERAND (OMP_LOOP_CHECK (NODE), 0)
-#define OMP_FOR_CLAUSES(NODE)	   TREE_OPERAND (OMP_LOOP_CHECK (NODE), 1)
-#define OMP_FOR_INIT(NODE)	   TREE_OPERAND (OMP_LOOP_CHECK (NODE), 2)
-#define OMP_FOR_COND(NODE)	   TREE_OPERAND (OMP_LOOP_CHECK (NODE), 3)
-#define OMP_FOR_INCR(NODE)	   TREE_OPERAND (OMP_LOOP_CHECK (NODE), 4)
-#define OMP_FOR_PRE_BODY(NODE)	   TREE_OPERAND (OMP_LOOP_CHECK (NODE), 5)
-
-#define OMP_SECTIONS_BODY(NODE)    TREE_OPERAND (OMP_SECTIONS_CHECK (NODE), 0)
-#define OMP_SECTIONS_CLAUSES(NODE) TREE_OPERAND (OMP_SECTIONS_CHECK (NODE), 1)
-
-#define OMP_SECTION_BODY(NODE)	   TREE_OPERAND (OMP_SECTION_CHECK (NODE), 0)
-
-#define OMP_SINGLE_BODY(NODE)	   TREE_OPERAND (OMP_SINGLE_CHECK (NODE), 0)
-#define OMP_SINGLE_CLAUSES(NODE)   TREE_OPERAND (OMP_SINGLE_CHECK (NODE), 1)
-
-#define OMP_MASTER_BODY(NODE)	   TREE_OPERAND (OMP_MASTER_CHECK (NODE), 0)
-
-#define OMP_TASKGROUP_BODY(NODE)   TREE_OPERAND (OMP_TASKGROUP_CHECK (NODE), 0)
-
-#define OMP_ORDERED_BODY(NODE)	   TREE_OPERAND (OMP_ORDERED_CHECK (NODE), 0)
-
-#define OMP_CRITICAL_BODY(NODE)    TREE_OPERAND (OMP_CRITICAL_CHECK (NODE), 0)
-#define OMP_CRITICAL_NAME(NODE)    TREE_OPERAND (OMP_CRITICAL_CHECK (NODE), 1)
-
-#define OMP_TEAMS_BODY(NODE)	   TREE_OPERAND (OMP_TEAMS_CHECK (NODE), 0)
-#define OMP_TEAMS_CLAUSES(NODE)	   TREE_OPERAND (OMP_TEAMS_CHECK (NODE), 1)
-
-#define OMP_TARGET_DATA_BODY(NODE) \
-  TREE_OPERAND (OMP_TARGET_DATA_CHECK (NODE), 0)
-#define OMP_TARGET_DATA_CLAUSES(NODE)\
-  TREE_OPERAND (OMP_TARGET_DATA_CHECK (NODE), 1)
-
-#define OMP_TARGET_BODY(NODE)	   TREE_OPERAND (OMP_TARGET_CHECK (NODE), 0)
-#define OMP_TARGET_CLAUSES(NODE)   TREE_OPERAND (OMP_TARGET_CHECK (NODE), 1)
-
-#define OMP_TARGET_UPDATE_CLAUSES(NODE)\
-  TREE_OPERAND (OMP_TARGET_UPDATE_CHECK (NODE), 0)
-
-#define OMP_CLAUSE_SIZE(NODE)						\
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_RANGE_CHECK (OMP_CLAUSE_CHECK (NODE),	\
-					      OMP_CLAUSE_FROM,		\
-					      OMP_CLAUSE_MAP), 1)
-
-#define OMP_CLAUSE_CHAIN(NODE)     TREE_CHAIN (OMP_CLAUSE_CHECK (NODE))
-#define OMP_CLAUSE_DECL(NODE)      					\
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_RANGE_CHECK (OMP_CLAUSE_CHECK (NODE),	\
-					      OMP_CLAUSE_PRIVATE,	\
-					      OMP_CLAUSE__LOOPTEMP_), 0)
-#define OMP_CLAUSE_HAS_LOCATION(NODE) \
-  (LOCATION_LOCUS ((OMP_CLAUSE_CHECK (NODE))->omp_clause.locus)		\
-  != UNKNOWN_LOCATION)
-#define OMP_CLAUSE_LOCATION(NODE)  (OMP_CLAUSE_CHECK (NODE))->omp_clause.locus
-
-/* True on an OMP_SECTION statement that was the last lexical member.
-   This status is meaningful in the implementation of lastprivate.  */
-#define OMP_SECTION_LAST(NODE) \
-  (OMP_SECTION_CHECK (NODE)->base.private_flag)
-
-/* True on an OMP_PARALLEL statement if it represents an explicit
-   combined parallel work-sharing constructs.  */
-#define OMP_PARALLEL_COMBINED(NODE) \
-  (OMP_PARALLEL_CHECK (NODE)->base.private_flag)
-
-/* True if OMP_ATOMIC* is supposed to be sequentially consistent
-   as opposed to relaxed.  */
-#define OMP_ATOMIC_SEQ_CST(NODE) \
-  (TREE_RANGE_CHECK (NODE, OMP_ATOMIC, \
-		     OMP_ATOMIC_CAPTURE_NEW)->base.private_flag)
-
-/* True on a PRIVATE clause if its decl is kept around for debugging
-   information only and its DECL_VALUE_EXPR is supposed to point
-   to what it has been remapped to.  */
-#define OMP_CLAUSE_PRIVATE_DEBUG(NODE) \
-  (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_PRIVATE)->base.public_flag)
-
-/* True on a PRIVATE clause if ctor needs access to outer region's
-   variable.  */
-#define OMP_CLAUSE_PRIVATE_OUTER_REF(NODE) \
-  TREE_PRIVATE (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_PRIVATE))
-
-/* True on a LASTPRIVATE clause if a FIRSTPRIVATE clause for the same
-   decl is present in the chain.  */
-#define OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE(NODE) \
-  (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LASTPRIVATE)->base.public_flag)
-#define OMP_CLAUSE_LASTPRIVATE_STMT(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE,			\
-						OMP_CLAUSE_LASTPRIVATE),\
-		      1)
-#define OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ(NODE) \
-  (OMP_CLAUSE_CHECK (NODE))->omp_clause.gimple_reduction_init
-
-#define OMP_CLAUSE_FINAL_EXPR(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_FINAL), 0)
-#define OMP_CLAUSE_IF_EXPR(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_IF), 0)
-#define OMP_CLAUSE_NUM_THREADS_EXPR(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_NUM_THREADS),0)
-#define OMP_CLAUSE_SCHEDULE_CHUNK_EXPR(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_SCHEDULE), 0)
-
-#define OMP_CLAUSE_DEPEND_KIND(NODE) \
-  (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_DEPEND)->omp_clause.subcode.depend_kind)
-
-#define OMP_CLAUSE_MAP_KIND(NODE) \
-  (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_MAP)->omp_clause.subcode.map_kind)
-
-/* Nonzero if this map clause is for array (rather than pointer) based array
-   section with zero bias.  Both the non-decl OMP_CLAUSE_MAP and
-   correspoidng OMP_CLAUSE_MAP_POINTER clause are marked with this flag.  */
-#define OMP_CLAUSE_MAP_ZERO_BIAS_ARRAY_SECTION(NODE) \
-  (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_MAP)->base.public_flag)
-
-#define OMP_CLAUSE_PROC_BIND_KIND(NODE) \
-  (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_PROC_BIND)->omp_clause.subcode.proc_bind_kind)
-
-#define OMP_CLAUSE_COLLAPSE_EXPR(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_COLLAPSE), 0)
-#define OMP_CLAUSE_COLLAPSE_ITERVAR(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_COLLAPSE), 1)
-#define OMP_CLAUSE_COLLAPSE_COUNT(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_COLLAPSE), 2)
-
-#define OMP_CLAUSE_REDUCTION_CODE(NODE)	\
-  (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_REDUCTION)->omp_clause.subcode.reduction_code)
-#define OMP_CLAUSE_REDUCTION_INIT(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_REDUCTION), 1)
-#define OMP_CLAUSE_REDUCTION_MERGE(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_REDUCTION), 2)
-#define OMP_CLAUSE_REDUCTION_GIMPLE_INIT(NODE) \
-  (OMP_CLAUSE_CHECK (NODE))->omp_clause.gimple_reduction_init
-#define OMP_CLAUSE_REDUCTION_GIMPLE_MERGE(NODE) \
-  (OMP_CLAUSE_CHECK (NODE))->omp_clause.gimple_reduction_merge
-#define OMP_CLAUSE_REDUCTION_PLACEHOLDER(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_REDUCTION), 3)
-
-/* True if a REDUCTION clause may reference the original list item (omp_orig)
-   in its OMP_CLAUSE_REDUCTION_{,GIMPLE_}INIT.  */
-#define OMP_CLAUSE_REDUCTION_OMP_ORIG_REF(NODE) \
-  (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_REDUCTION)->base.public_flag)
-
-/* True if a LINEAR clause doesn't need copy in.  True for iterator vars which
-   are always initialized inside of the loop construct, false otherwise.  */
-#define OMP_CLAUSE_LINEAR_NO_COPYIN(NODE) \
-  (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LINEAR)->base.public_flag)
-
-/* True if a LINEAR clause doesn't need copy out.  True for iterator vars which
-   are declared inside of the simd construct.  */
-#define OMP_CLAUSE_LINEAR_NO_COPYOUT(NODE) \
-  TREE_PRIVATE (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LINEAR))
-
-/* True if a LINEAR clause has a stride that is variable.  */
-#define OMP_CLAUSE_LINEAR_VARIABLE_STRIDE(NODE) \
-  TREE_PROTECTED (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LINEAR))
-
-/* True if a LINEAR clause is for an array or allocatable variable that
-   needs special handling by the frontend.  */
-#define OMP_CLAUSE_LINEAR_ARRAY(NODE) \
-  (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LINEAR)->base.deprecated_flag)
-
-#define OMP_CLAUSE_LINEAR_STEP(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LINEAR), 1)
-
-#define OMP_CLAUSE_LINEAR_STMT(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LINEAR), 2)
-
-#define OMP_CLAUSE_LINEAR_GIMPLE_SEQ(NODE) \
-  (OMP_CLAUSE_CHECK (NODE))->omp_clause.gimple_reduction_init
-
-#define OMP_CLAUSE_ALIGNED_ALIGNMENT(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_ALIGNED), 1)
-
-#define OMP_CLAUSE_NUM_TEAMS_EXPR(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_NUM_TEAMS), 0)
-
-#define OMP_CLAUSE_THREAD_LIMIT_EXPR(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, \
-						OMP_CLAUSE_THREAD_LIMIT), 0)
-
-#define OMP_CLAUSE_DEVICE_ID(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_DEVICE), 0)
-
-#define OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, \
-						OMP_CLAUSE_DIST_SCHEDULE), 0)
-
-#define OMP_CLAUSE_SAFELEN_EXPR(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_SAFELEN), 0)
-
-#define OMP_CLAUSE_SIMDLEN_EXPR(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_SIMDLEN), 0)
-
-#define OMP_CLAUSE__SIMDUID__DECL(NODE) \
-  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE__SIMDUID_), 0)
-
-#define OMP_CLAUSE_SCHEDULE_KIND(NODE) \
-  (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_SCHEDULE)->omp_clause.subcode.schedule_kind)
-
-#define OMP_CLAUSE_DEFAULT_KIND(NODE) \
-  (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_DEFAULT)->omp_clause.subcode.default_kind)
-
-/* SSA_NAME accessors.  */
-
-/* Returns the IDENTIFIER_NODE giving the SSA name a name or NULL_TREE
-   if there is no name associated with it.  */
-#define SSA_NAME_IDENTIFIER(NODE)				\
-  (SSA_NAME_CHECK (NODE)->ssa_name.var != NULL_TREE		\
-   ? (TREE_CODE ((NODE)->ssa_name.var) == IDENTIFIER_NODE	\
-      ? (NODE)->ssa_name.var					\
-      : DECL_NAME ((NODE)->ssa_name.var))			\
-   : NULL_TREE)
-
-/* Returns the variable being referenced.  This can be NULL_TREE for
-   temporaries not associated with any user variable.
-   Once released, this is the only field that can be relied upon.  */
-#define SSA_NAME_VAR(NODE)					\
-  (SSA_NAME_CHECK (NODE)->ssa_name.var == NULL_TREE		\
-   || TREE_CODE ((NODE)->ssa_name.var) == IDENTIFIER_NODE	\
-   ? NULL_TREE : (NODE)->ssa_name.var)
-
-#define SET_SSA_NAME_VAR_OR_IDENTIFIER(NODE,VAR) \
-  do { SSA_NAME_CHECK (NODE)->ssa_name.var = (VAR); } while (0)
-
-/* Returns the statement which defines this SSA name.  */
-#define SSA_NAME_DEF_STMT(NODE)	SSA_NAME_CHECK (NODE)->ssa_name.def_stmt
-
-/* Returns the SSA version number of this SSA name.  Note that in
-   tree SSA, version numbers are not per variable and may be recycled.  */
-#define SSA_NAME_VERSION(NODE)	SSA_NAME_CHECK (NODE)->base.u.version
-
-/* Nonzero if this SSA name occurs in an abnormal PHI.  SSA_NAMES are
-   never output, so we can safely use the ASM_WRITTEN_FLAG for this
-   status bit.  */
-#define SSA_NAME_OCCURS_IN_ABNORMAL_PHI(NODE) \
-    SSA_NAME_CHECK (NODE)->base.asm_written_flag
-
-/* Nonzero if this SSA_NAME expression is currently on the free list of
-   SSA_NAMES.  Using NOTHROW_FLAG seems reasonably safe since throwing
-   has no meaning for an SSA_NAME.  */
-#define SSA_NAME_IN_FREE_LIST(NODE) \
-    SSA_NAME_CHECK (NODE)->base.nothrow_flag
-
-/* Nonzero if this SSA_NAME is the default definition for the
-   underlying symbol.  A default SSA name is created for symbol S if
-   the very first reference to S in the function is a read operation.
-   Default definitions are always created by an empty statement and
-   belong to no basic block.  */
-#define SSA_NAME_IS_DEFAULT_DEF(NODE) \
-    SSA_NAME_CHECK (NODE)->base.default_def_flag
-
-/* Attributes for SSA_NAMEs for pointer-type variables.  */
-#define SSA_NAME_PTR_INFO(N) \
-   SSA_NAME_CHECK (N)->ssa_name.info.ptr_info
-
-/* True if SSA_NAME_RANGE_INFO describes an anti-range.  */
-#define SSA_NAME_ANTI_RANGE_P(N) \
-    SSA_NAME_CHECK (N)->base.static_flag
-
-/* The type of range described by SSA_NAME_RANGE_INFO.  */
-#define SSA_NAME_RANGE_TYPE(N) \
-    (SSA_NAME_ANTI_RANGE_P (N) ? VR_ANTI_RANGE : VR_RANGE)
-
-/* Value range info attributes for SSA_NAMEs of non pointer-type variables.  */
-#define SSA_NAME_RANGE_INFO(N) \
-    SSA_NAME_CHECK (N)->ssa_name.info.range_info
-
-/* Return the immediate_use information for an SSA_NAME. */
-#define SSA_NAME_IMM_USE_NODE(NODE) SSA_NAME_CHECK (NODE)->ssa_name.imm_uses
-
-#define OMP_CLAUSE_CODE(NODE)					\
-	(OMP_CLAUSE_CHECK (NODE))->omp_clause.code
-
-#define OMP_CLAUSE_SET_CODE(NODE, CODE)				\
-	((OMP_CLAUSE_CHECK (NODE))->omp_clause.code = (CODE))
-
-#define OMP_CLAUSE_OPERAND(NODE, I)				\
-	OMP_CLAUSE_ELT_CHECK (NODE, I)
-
-/* In a BLOCK node.  */
-#define BLOCK_VARS(NODE) (BLOCK_CHECK (NODE)->block.vars)
-#define BLOCK_NONLOCALIZED_VARS(NODE) \
-  (BLOCK_CHECK (NODE)->block.nonlocalized_vars)
-#define BLOCK_NUM_NONLOCALIZED_VARS(NODE) \
-  vec_safe_length (BLOCK_NONLOCALIZED_VARS (NODE))
-#define BLOCK_NONLOCALIZED_VAR(NODE,N) (*BLOCK_NONLOCALIZED_VARS (NODE))[N]
-#define BLOCK_SUBBLOCKS(NODE) (BLOCK_CHECK (NODE)->block.subblocks)
-#define BLOCK_SUPERCONTEXT(NODE) (BLOCK_CHECK (NODE)->block.supercontext)
-#define BLOCK_CHAIN(NODE) (BLOCK_CHECK (NODE)->block.chain)
-#define BLOCK_ABSTRACT_ORIGIN(NODE) (BLOCK_CHECK (NODE)->block.abstract_origin)
-#define BLOCK_ABSTRACT(NODE) (BLOCK_CHECK (NODE)->block.abstract_flag)
-
-/* True if BLOCK has the same ranges as its BLOCK_SUPERCONTEXT.  */
-#define BLOCK_SAME_RANGE(NODE) (BLOCK_CHECK (NODE)->base.u.bits.nameless_flag)
-
-/* An index number for this block.  These values are not guaranteed to
-   be unique across functions -- whether or not they are depends on
-   the debugging output format in use.  */
-#define BLOCK_NUMBER(NODE) (BLOCK_CHECK (NODE)->block.block_num)
-
-/* If block reordering splits a lexical block into discontiguous
-   address ranges, we'll make a copy of the original block.
-
-   Note that this is logically distinct from BLOCK_ABSTRACT_ORIGIN.
-   In that case, we have one source block that has been replicated
-   (through inlining or unrolling) into many logical blocks, and that
-   these logical blocks have different physical variables in them.
-
-   In this case, we have one logical block split into several
-   non-contiguous address ranges.  Most debug formats can't actually
-   represent this idea directly, so we fake it by creating multiple
-   logical blocks with the same variables in them.  However, for those
-   that do support non-contiguous regions, these allow the original
-   logical block to be reconstructed, along with the set of address
-   ranges.
-
-   One of the logical block fragments is arbitrarily chosen to be
-   the ORIGIN.  The other fragments will point to the origin via
-   BLOCK_FRAGMENT_ORIGIN; the origin itself will have this pointer
-   be null.  The list of fragments will be chained through
-   BLOCK_FRAGMENT_CHAIN from the origin.  */
-
-#define BLOCK_FRAGMENT_ORIGIN(NODE) (BLOCK_CHECK (NODE)->block.fragment_origin)
-#define BLOCK_FRAGMENT_CHAIN(NODE) (BLOCK_CHECK (NODE)->block.fragment_chain)
-
-/* For an inlined function, this gives the location where it was called
-   from.  This is only set in the top level block, which corresponds to the
-   inlined function scope.  This is used in the debug output routines.  */
-
-#define BLOCK_SOURCE_LOCATION(NODE) (BLOCK_CHECK (NODE)->block.locus)
-
-/* Define fields and accessors for nodes representing data types.  */
-
-/* See tree.def for documentation of the use of these fields.
-   Look at the documentation of the various ..._TYPE tree codes.
-
-   Note that the type.values, type.minval, and type.maxval fields are
-   overloaded and used for different macros in different kinds of types.
-   Each macro must check to ensure the tree node is of the proper kind of
-   type.  Note also that some of the front-ends also overload these fields,
-   so they must be checked as well.  */
-
-#define TYPE_UID(NODE) (TYPE_CHECK (NODE)->type_common.uid)
-#define TYPE_SIZE(NODE) (TYPE_CHECK (NODE)->type_common.size)
-#define TYPE_SIZE_UNIT(NODE) (TYPE_CHECK (NODE)->type_common.size_unit)
-#define TYPE_POINTER_TO(NODE) (TYPE_CHECK (NODE)->type_common.pointer_to)
-#define TYPE_REFERENCE_TO(NODE) (TYPE_CHECK (NODE)->type_common.reference_to)
-#define TYPE_PRECISION(NODE) (TYPE_CHECK (NODE)->type_common.precision)
-#define TYPE_NAME(NODE) (TYPE_CHECK (NODE)->type_common.name)
-#define TYPE_NEXT_VARIANT(NODE) (TYPE_CHECK (NODE)->type_common.next_variant)
-#define TYPE_MAIN_VARIANT(NODE) (TYPE_CHECK (NODE)->type_common.main_variant)
-#define TYPE_CONTEXT(NODE) (TYPE_CHECK (NODE)->type_common.context)
-
-#define TYPE_MODE(NODE) \
-  (VECTOR_TYPE_P (TYPE_CHECK (NODE)) \
-   ? vector_type_mode (NODE) : (NODE)->type_common.mode)
-#define SET_TYPE_MODE(NODE, MODE) \
-  (TYPE_CHECK (NODE)->type_common.mode = (MODE))
-
-/* The "canonical" type for this type node, which is used by frontends to
-   compare the type for equality with another type.  If two types are
-   equal (based on the semantics of the language), then they will have
-   equivalent TYPE_CANONICAL entries.
-
-   As a special case, if TYPE_CANONICAL is NULL_TREE, and thus
-   TYPE_STRUCTURAL_EQUALITY_P is true, then it cannot
-   be used for comparison against other types.  Instead, the type is
-   said to require structural equality checks, described in
-   TYPE_STRUCTURAL_EQUALITY_P.
-
-   For unqualified aggregate and function types the middle-end relies on
-   TYPE_CANONICAL to tell whether two variables can be assigned
-   to each other without a conversion.  The middle-end also makes sure
-   to assign the same alias-sets to the type partition with equal
-   TYPE_CANONICAL of their unqualified variants.  */
-#define TYPE_CANONICAL(NODE) (TYPE_CHECK (NODE)->type_common.canonical)
-/* Indicates that the type node requires structural equality
-   checks.  The compiler will need to look at the composition of the
-   type to determine whether it is equal to another type, rather than
-   just comparing canonical type pointers.  For instance, we would need
-   to look at the return and parameter types of a FUNCTION_TYPE
-   node.  */
-#define TYPE_STRUCTURAL_EQUALITY_P(NODE) (TYPE_CANONICAL (NODE) == NULL_TREE)
-/* Sets the TYPE_CANONICAL field to NULL_TREE, indicating that the
-   type node requires structural equality.  */
-#define SET_TYPE_STRUCTURAL_EQUALITY(NODE) (TYPE_CANONICAL (NODE) = NULL_TREE)
-
-#define TYPE_IBIT(NODE) (GET_MODE_IBIT (TYPE_MODE (NODE)))
-#define TYPE_FBIT(NODE) (GET_MODE_FBIT (TYPE_MODE (NODE)))
-
-/* The (language-specific) typed-based alias set for this type.
-   Objects whose TYPE_ALIAS_SETs are different cannot alias each
-   other.  If the TYPE_ALIAS_SET is -1, no alias set has yet been
-   assigned to this type.  If the TYPE_ALIAS_SET is 0, objects of this
-   type can alias objects of any type.  */
-#define TYPE_ALIAS_SET(NODE) (TYPE_CHECK (NODE)->type_common.alias_set)
-
-/* Nonzero iff the typed-based alias set for this type has been
-   calculated.  */
-#define TYPE_ALIAS_SET_KNOWN_P(NODE) \
-  (TYPE_CHECK (NODE)->type_common.alias_set != -1)
-
-/* A TREE_LIST of IDENTIFIER nodes of the attributes that apply
-   to this type.  */
-#define TYPE_ATTRIBUTES(NODE) (TYPE_CHECK (NODE)->type_common.attributes)
-
-/* The alignment necessary for objects of this type.
-   The value is an int, measured in bits.  */
-#define TYPE_ALIGN(NODE) (TYPE_CHECK (NODE)->type_common.align)
-
-/* 1 if the alignment for this type was requested by "aligned" attribute,
-   0 if it is the default for this type.  */
-#define TYPE_USER_ALIGN(NODE) (TYPE_CHECK (NODE)->base.u.bits.user_align)
-
-/* The alignment for NODE, in bytes.  */
-#define TYPE_ALIGN_UNIT(NODE) (TYPE_ALIGN (NODE) / BITS_PER_UNIT)
-
-/* If your language allows you to declare types, and you want debug info
-   for them, then you need to generate corresponding TYPE_DECL nodes.
-   These "stub" TYPE_DECL nodes have no name, and simply point at the
-   type node.  You then set the TYPE_STUB_DECL field of the type node
-   to point back at the TYPE_DECL node.  This allows the debug routines
-   to know that the two nodes represent the same type, so that we only
-   get one debug info record for them.  */
-#define TYPE_STUB_DECL(NODE) (TREE_CHAIN (TYPE_CHECK (NODE)))
-
-/* In a RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE or ARRAY_TYPE, it means
-   the type has BLKmode only because it lacks the alignment required for
-   its size.  */
-#define TYPE_NO_FORCE_BLK(NODE) \
-  (TYPE_CHECK (NODE)->type_common.no_force_blk_flag)
-
-/* Nonzero in a type considered volatile as a whole.  */
-#define TYPE_VOLATILE(NODE) (TYPE_CHECK (NODE)->base.volatile_flag)
-
-/* Nonzero in a type considered atomic as a whole.  */
-#define TYPE_ATOMIC(NODE) (TYPE_CHECK (NODE)->base.u.bits.atomic_flag)
-
-/* Means this type is const-qualified.  */
-#define TYPE_READONLY(NODE) (TYPE_CHECK (NODE)->base.readonly_flag)
-
-/* If nonzero, this type is `restrict'-qualified, in the C sense of
-   the term.  */
-#define TYPE_RESTRICT(NODE) (TYPE_CHECK (NODE)->type_common.restrict_flag)
-
-/* If nonzero, type's name shouldn't be emitted into debug info.  */
-#define TYPE_NAMELESS(NODE) (TYPE_CHECK (NODE)->base.u.bits.nameless_flag)
-
-/* The address space the type is in.  */
-#define TYPE_ADDR_SPACE(NODE) (TYPE_CHECK (NODE)->base.u.bits.address_space)
-
-/* Encode/decode the named memory support as part of the qualifier.  If more
-   than 8 qualifiers are added, these macros need to be adjusted.  */
-#define ENCODE_QUAL_ADDR_SPACE(NUM) ((NUM & 0xFF) << 8)
-#define DECODE_QUAL_ADDR_SPACE(X) (((X) >> 8) & 0xFF)
-
-/* Return all qualifiers except for the address space qualifiers.  */
-#define CLEAR_QUAL_ADDR_SPACE(X) ((X) & ~0xFF00)
-
-/* Only keep the address space out of the qualifiers and discard the other
-   qualifiers.  */
-#define KEEP_QUAL_ADDR_SPACE(X) ((X) & 0xFF00)
-
-/* The set of type qualifiers for this type.  */
-#define TYPE_QUALS(NODE)					\
-  ((int) ((TYPE_READONLY (NODE) * TYPE_QUAL_CONST)		\
-	  | (TYPE_VOLATILE (NODE) * TYPE_QUAL_VOLATILE)		\
-	  | (TYPE_ATOMIC (NODE) * TYPE_QUAL_ATOMIC)		\
-	  | (TYPE_RESTRICT (NODE) * TYPE_QUAL_RESTRICT)		\
-	  | (ENCODE_QUAL_ADDR_SPACE (TYPE_ADDR_SPACE (NODE)))))
-
-/* The same as TYPE_QUALS without the address space qualifications.  */
-#define TYPE_QUALS_NO_ADDR_SPACE(NODE)				\
-  ((int) ((TYPE_READONLY (NODE) * TYPE_QUAL_CONST)		\
-	  | (TYPE_VOLATILE (NODE) * TYPE_QUAL_VOLATILE)		\
-	  | (TYPE_ATOMIC (NODE) * TYPE_QUAL_ATOMIC)		\
-	  | (TYPE_RESTRICT (NODE) * TYPE_QUAL_RESTRICT)))
-
-/* The same as TYPE_QUALS without the address space and atomic 
-   qualifications.  */
-#define TYPE_QUALS_NO_ADDR_SPACE_NO_ATOMIC(NODE)		\
-  ((int) ((TYPE_READONLY (NODE) * TYPE_QUAL_CONST)		\
-	  | (TYPE_VOLATILE (NODE) * TYPE_QUAL_VOLATILE)		\
-	  | (TYPE_RESTRICT (NODE) * TYPE_QUAL_RESTRICT)))
-
-/* These flags are available for each language front end to use internally.  */
-#define TYPE_LANG_FLAG_0(NODE) (TYPE_CHECK (NODE)->type_common.lang_flag_0)
-#define TYPE_LANG_FLAG_1(NODE) (TYPE_CHECK (NODE)->type_common.lang_flag_1)
-#define TYPE_LANG_FLAG_2(NODE) (TYPE_CHECK (NODE)->type_common.lang_flag_2)
-#define TYPE_LANG_FLAG_3(NODE) (TYPE_CHECK (NODE)->type_common.lang_flag_3)
-#define TYPE_LANG_FLAG_4(NODE) (TYPE_CHECK (NODE)->type_common.lang_flag_4)
-#define TYPE_LANG_FLAG_5(NODE) (TYPE_CHECK (NODE)->type_common.lang_flag_5)
-#define TYPE_LANG_FLAG_6(NODE) (TYPE_CHECK (NODE)->type_common.lang_flag_6)
-
-/* Used to keep track of visited nodes in tree traversals.  This is set to
-   0 by copy_node and make_node.  */
-#define TREE_VISITED(NODE) ((NODE)->base.visited)
-
-/* If set in an ARRAY_TYPE, indicates a string type (for languages
-   that distinguish string from array of char).
-   If set in a INTEGER_TYPE, indicates a character type.  */
-#define TYPE_STRING_FLAG(NODE) (TYPE_CHECK (NODE)->type_common.string_flag)
-
-/* For a VECTOR_TYPE, this is the number of sub-parts of the vector.  */
-#define TYPE_VECTOR_SUBPARTS(VECTOR_TYPE) \
-  (((unsigned HOST_WIDE_INT) 1) \
-   << VECTOR_TYPE_CHECK (VECTOR_TYPE)->type_common.precision)
-
-/* Set precision to n when we have 2^n sub-parts of the vector.  */
-#define SET_TYPE_VECTOR_SUBPARTS(VECTOR_TYPE, X) \
-  (VECTOR_TYPE_CHECK (VECTOR_TYPE)->type_common.precision = exact_log2 (X))
-
-/* Nonzero in a VECTOR_TYPE if the frontends should not emit warnings
-   about missing conversions to other vector types of the same size.  */
-#define TYPE_VECTOR_OPAQUE(NODE) \
-  (VECTOR_TYPE_CHECK (NODE)->base.default_def_flag)
-
-/* Indicates that objects of this type must be initialized by calling a
-   function when they are created.  */
-#define TYPE_NEEDS_CONSTRUCTING(NODE) \
-  (TYPE_CHECK (NODE)->type_common.needs_constructing_flag)
-
-/* Indicates that a UNION_TYPE object should be passed the same way that
-   the first union alternative would be passed, or that a RECORD_TYPE
-   object should be passed the same way that the first (and only) member
-   would be passed.  */
-#define TYPE_TRANSPARENT_AGGR(NODE) \
-  (RECORD_OR_UNION_CHECK (NODE)->type_common.transparent_aggr_flag)
-
-/* For an ARRAY_TYPE, indicates that it is not permitted to take the
-   address of a component of the type.  This is the counterpart of
-   DECL_NONADDRESSABLE_P for arrays, see the definition of this flag.  */
-#define TYPE_NONALIASED_COMPONENT(NODE) \
-  (ARRAY_TYPE_CHECK (NODE)->type_common.transparent_aggr_flag)
-
-/* Indicated that objects of this type should be laid out in as
-   compact a way as possible.  */
-#define TYPE_PACKED(NODE) (TYPE_CHECK (NODE)->base.u.bits.packed_flag)
-
-/* Used by type_contains_placeholder_p to avoid recomputation.
-   Values are: 0 (unknown), 1 (false), 2 (true).  Never access
-   this field directly.  */
-#define TYPE_CONTAINS_PLACEHOLDER_INTERNAL(NODE) \
-  (TYPE_CHECK (NODE)->type_common.contains_placeholder_bits)
-
-/* Nonzero if RECORD_TYPE represents a final derivation of class.  */
-#define TYPE_FINAL_P(NODE) \
-  (RECORD_OR_UNION_CHECK (NODE)->base.default_def_flag)
-
-/* The debug output functions use the symtab union field to store
-   information specific to the debugging format.  The different debug
-   output hooks store different types in the union field.  These three
-   macros are used to access different fields in the union.  The debug
-   hooks are responsible for consistently using only a specific
-   macro.  */
-
-/* Symtab field as an integer.  Used by stabs generator in dbxout.c to
-   hold the type's number in the generated stabs.  */
-#define TYPE_SYMTAB_ADDRESS(NODE) \
-  (TYPE_CHECK (NODE)->type_common.symtab.address)
-
-/* Symtab field as a string.  Used by COFF generator in sdbout.c to
-   hold struct/union type tag names.  */
-#define TYPE_SYMTAB_POINTER(NODE) \
-  (TYPE_CHECK (NODE)->type_common.symtab.pointer)
-
-/* Symtab field as a pointer to a DWARF DIE.  Used by DWARF generator
-   in dwarf2out.c to point to the DIE generated for the type.  */
-#define TYPE_SYMTAB_DIE(NODE) \
-  (TYPE_CHECK (NODE)->type_common.symtab.die)
-
-/* The garbage collector needs to know the interpretation of the
-   symtab field.  These constants represent the different types in the
-   union.  */
-
-#define TYPE_SYMTAB_IS_ADDRESS (0)
-#define TYPE_SYMTAB_IS_POINTER (1)
-#define TYPE_SYMTAB_IS_DIE (2)
-
-#define TYPE_LANG_SPECIFIC(NODE) \
-  (TYPE_CHECK (NODE)->type_with_lang_specific.lang_specific)
-
-#define TYPE_VALUES(NODE) (ENUMERAL_TYPE_CHECK (NODE)->type_non_common.values)
-#define TYPE_DOMAIN(NODE) (ARRAY_TYPE_CHECK (NODE)->type_non_common.values)
-#define TYPE_FIELDS(NODE) \
-  (RECORD_OR_UNION_CHECK (NODE)->type_non_common.values)
-#define TYPE_CACHED_VALUES(NODE) (TYPE_CHECK (NODE)->type_non_common.values)
-#define TYPE_ARG_TYPES(NODE) \
-  (FUNC_OR_METHOD_CHECK (NODE)->type_non_common.values)
-#define TYPE_VALUES_RAW(NODE) (TYPE_CHECK (NODE)->type_non_common.values)
-
-#define TYPE_METHODS(NODE) \
-  (RECORD_OR_UNION_CHECK (NODE)->type_non_common.maxval)
-#define TYPE_VFIELD(NODE) \
-  (RECORD_OR_UNION_CHECK (NODE)->type_non_common.minval)
-#define TYPE_METHOD_BASETYPE(NODE) \
-  (FUNC_OR_METHOD_CHECK (NODE)->type_non_common.maxval)
-#define TYPE_OFFSET_BASETYPE(NODE) \
-  (OFFSET_TYPE_CHECK (NODE)->type_non_common.maxval)
-#define TYPE_MAXVAL(NODE) (TYPE_CHECK (NODE)->type_non_common.maxval)
-#define TYPE_MINVAL(NODE) (TYPE_CHECK (NODE)->type_non_common.minval)
-#define TYPE_NEXT_PTR_TO(NODE) \
-  (POINTER_TYPE_CHECK (NODE)->type_non_common.minval)
-#define TYPE_NEXT_REF_TO(NODE) \
-  (REFERENCE_TYPE_CHECK (NODE)->type_non_common.minval)
-#define TYPE_MIN_VALUE(NODE) \
-  (NUMERICAL_TYPE_CHECK (NODE)->type_non_common.minval)
-#define TYPE_MAX_VALUE(NODE) \
-  (NUMERICAL_TYPE_CHECK (NODE)->type_non_common.maxval)
-
-/* If non-NULL, this is an upper bound of the size (in bytes) of an
-   object of the given ARRAY_TYPE_NON_COMMON.  This allows temporaries to be
-   allocated.  */
-#define TYPE_ARRAY_MAX_SIZE(ARRAY_TYPE) \
-  (ARRAY_TYPE_CHECK (ARRAY_TYPE)->type_non_common.maxval)
-
-/* For record and union types, information about this type, as a base type
-   for itself.  */
-#define TYPE_BINFO(NODE) (RECORD_OR_UNION_CHECK (NODE)->type_non_common.binfo)
-
-/* For non record and union types, used in a language-dependent way.  */
-#define TYPE_LANG_SLOT_1(NODE) \
-  (NOT_RECORD_OR_UNION_CHECK (NODE)->type_non_common.binfo)
-
-/* Define accessor macros for information about type inheritance
-   and basetypes.
-
-   A "basetype" means a particular usage of a data type for inheritance
-   in another type.  Each such basetype usage has its own "binfo"
-   object to describe it.  The binfo object is a TREE_VEC node.
-
-   Inheritance is represented by the binfo nodes allocated for a
-   given type.  For example, given types C and D, such that D is
-   inherited by C, 3 binfo nodes will be allocated: one for describing
-   the binfo properties of C, similarly one for D, and one for
-   describing the binfo properties of D as a base type for C.
-   Thus, given a pointer to class C, one can get a pointer to the binfo
-   of D acting as a basetype for C by looking at C's binfo's basetypes.  */
-
-/* BINFO specific flags.  */
-
-/* Nonzero means that the derivation chain is via a `virtual' declaration.  */
-#define BINFO_VIRTUAL_P(NODE) (TREE_BINFO_CHECK (NODE)->base.static_flag)
-
-/* Flags for language dependent use.  */
-#define BINFO_MARKED(NODE) TREE_LANG_FLAG_0 (TREE_BINFO_CHECK (NODE))
-#define BINFO_FLAG_1(NODE) TREE_LANG_FLAG_1 (TREE_BINFO_CHECK (NODE))
-#define BINFO_FLAG_2(NODE) TREE_LANG_FLAG_2 (TREE_BINFO_CHECK (NODE))
-#define BINFO_FLAG_3(NODE) TREE_LANG_FLAG_3 (TREE_BINFO_CHECK (NODE))
-#define BINFO_FLAG_4(NODE) TREE_LANG_FLAG_4 (TREE_BINFO_CHECK (NODE))
-#define BINFO_FLAG_5(NODE) TREE_LANG_FLAG_5 (TREE_BINFO_CHECK (NODE))
-#define BINFO_FLAG_6(NODE) TREE_LANG_FLAG_6 (TREE_BINFO_CHECK (NODE))
-
-/* The actual data type node being inherited in this basetype.  */
-#define BINFO_TYPE(NODE) TREE_TYPE (TREE_BINFO_CHECK (NODE))
-
-/* The offset where this basetype appears in its containing type.
-   BINFO_OFFSET slot holds the offset (in bytes)
-   from the base of the complete object to the base of the part of the
-   object that is allocated on behalf of this `type'.
-   This is always 0 except when there is multiple inheritance.  */
-
-#define BINFO_OFFSET(NODE) (TREE_BINFO_CHECK (NODE)->binfo.offset)
-#define BINFO_OFFSET_ZEROP(NODE) (integer_zerop (BINFO_OFFSET (NODE)))
-
-/* The virtual function table belonging to this basetype.  Virtual
-   function tables provide a mechanism for run-time method dispatching.
-   The entries of a virtual function table are language-dependent.  */
-
-#define BINFO_VTABLE(NODE) (TREE_BINFO_CHECK (NODE)->binfo.vtable)
-
-/* The virtual functions in the virtual function table.  This is
-   a TREE_LIST that is used as an initial approximation for building
-   a virtual function table for this basetype.  */
-#define BINFO_VIRTUALS(NODE) (TREE_BINFO_CHECK (NODE)->binfo.virtuals)
-
-/* A vector of binfos for the direct basetypes inherited by this
-   basetype.
-
-   If this basetype describes type D as inherited in C, and if the
-   basetypes of D are E and F, then this vector contains binfos for
-   inheritance of E and F by C.  */
-#define BINFO_BASE_BINFOS(NODE) (&TREE_BINFO_CHECK (NODE)->binfo.base_binfos)
-
-/* The number of basetypes for NODE.  */
-#define BINFO_N_BASE_BINFOS(NODE) (BINFO_BASE_BINFOS (NODE)->length ())
-
-/* Accessor macro to get to the Nth base binfo of this binfo.  */
-#define BINFO_BASE_BINFO(NODE,N) \
- ((*BINFO_BASE_BINFOS (NODE))[(N)])
-#define BINFO_BASE_ITERATE(NODE,N,B) \
- (BINFO_BASE_BINFOS (NODE)->iterate ((N), &(B)))
-#define BINFO_BASE_APPEND(NODE,T) \
- (BINFO_BASE_BINFOS (NODE)->quick_push ((T)))
-
-/* For a BINFO record describing a virtual base class, i.e., one where
-   TREE_VIA_VIRTUAL is set, this field assists in locating the virtual
-   base.  The actual contents are language-dependent.  In the C++
-   front-end this field is an INTEGER_CST giving an offset into the
-   vtable where the offset to the virtual base can be found.  */
-#define BINFO_VPTR_FIELD(NODE) (TREE_BINFO_CHECK (NODE)->binfo.vptr_field)
-
-/* Indicates the accesses this binfo has to its bases. The values are
-   access_public_node, access_protected_node or access_private_node.
-   If this array is not present, public access is implied.  */
-#define BINFO_BASE_ACCESSES(NODE) \
-  (TREE_BINFO_CHECK (NODE)->binfo.base_accesses)
-
-#define BINFO_BASE_ACCESS(NODE,N) \
-  (*BINFO_BASE_ACCESSES (NODE))[(N)]
-#define BINFO_BASE_ACCESS_APPEND(NODE,T) \
-  BINFO_BASE_ACCESSES (NODE)->quick_push ((T))
-
-/* The index in the VTT where this subobject's sub-VTT can be found.
-   NULL_TREE if there is no sub-VTT.  */
-#define BINFO_SUBVTT_INDEX(NODE) (TREE_BINFO_CHECK (NODE)->binfo.vtt_subvtt)
-
-/* The index in the VTT where the vptr for this subobject can be
-   found.  NULL_TREE if there is no secondary vptr in the VTT.  */
-#define BINFO_VPTR_INDEX(NODE) (TREE_BINFO_CHECK (NODE)->binfo.vtt_vptr)
-
-/* The BINFO_INHERITANCE_CHAIN points at the binfo for the base
-   inheriting this base for non-virtual bases. For virtual bases it
-   points either to the binfo for which this is a primary binfo, or to
-   the binfo of the most derived type.  */
-#define BINFO_INHERITANCE_CHAIN(NODE) \
-	(TREE_BINFO_CHECK (NODE)->binfo.inheritance)
-
-
-/* Define fields and accessors for nodes representing declared names.  */
-
-/* Nonzero if DECL represents an SSA name or a variable that can possibly
-   have an associated SSA name.  */
-#define SSA_VAR_P(DECL)							\
-	(TREE_CODE (DECL) == VAR_DECL					\
-	 || TREE_CODE (DECL) == PARM_DECL				\
-	 || TREE_CODE (DECL) == RESULT_DECL				\
-	 || TREE_CODE (DECL) == SSA_NAME)
-
-
-#define DECL_CHAIN(NODE) (TREE_CHAIN (DECL_MINIMAL_CHECK (NODE)))
-
-/* This is the name of the object as written by the user.
-   It is an IDENTIFIER_NODE.  */
-#define DECL_NAME(NODE) (DECL_MINIMAL_CHECK (NODE)->decl_minimal.name)
-
-/* Every ..._DECL node gets a unique number.  */
-#define DECL_UID(NODE) (DECL_MINIMAL_CHECK (NODE)->decl_minimal.uid)
-
-/* DEBUG_EXPR_DECLs get negative UID numbers, to catch erroneous
-   uses.  */
-#define DEBUG_TEMP_UID(NODE) (-DECL_UID (TREE_CHECK ((NODE), DEBUG_EXPR_DECL)))
-
-/* Every ..._DECL node gets a unique number that stays the same even
-   when the decl is copied by the inliner once it is set.  */
-#define DECL_PT_UID(NODE) \
-  (DECL_COMMON_CHECK (NODE)->decl_common.pt_uid == -1u \
-   ? (NODE)->decl_minimal.uid : (NODE)->decl_common.pt_uid)
-/* Initialize the ..._DECL node pt-uid to the decls uid.  */
-#define SET_DECL_PT_UID(NODE, UID) \
-  (DECL_COMMON_CHECK (NODE)->decl_common.pt_uid = (UID))
-/* Whether the ..._DECL node pt-uid has been initialized and thus needs to
-   be preserved when copyin the decl.  */
-#define DECL_PT_UID_SET_P(NODE) \
-  (DECL_COMMON_CHECK (NODE)->decl_common.pt_uid != -1u)
-
-/* These two fields describe where in the source code the declaration
-   was.  If the declaration appears in several places (as for a C
-   function that is declared first and then defined later), this
-   information should refer to the definition.  */
-#define DECL_SOURCE_LOCATION(NODE) \
-  (DECL_MINIMAL_CHECK (NODE)->decl_minimal.locus)
-#define DECL_SOURCE_FILE(NODE) LOCATION_FILE (DECL_SOURCE_LOCATION (NODE))
-#define DECL_SOURCE_LINE(NODE) LOCATION_LINE (DECL_SOURCE_LOCATION (NODE))
-#define DECL_SOURCE_COLUMN(NODE) LOCATION_COLUMN (DECL_SOURCE_LOCATION (NODE))
-/* This accessor returns TRUE if the decl it operates on was created
-   by a front-end or back-end rather than by user code.  In this case
-   builtin-ness is indicated by source location.  */
-#define DECL_IS_BUILTIN(DECL) \
-  (LOCATION_LOCUS (DECL_SOURCE_LOCATION (DECL)) <= BUILTINS_LOCATION)
-
-/*  For FIELD_DECLs, this is the RECORD_TYPE, UNION_TYPE, or
-    QUAL_UNION_TYPE node that the field is a member of.  For VAR_DECL,
-    PARM_DECL, FUNCTION_DECL, LABEL_DECL, RESULT_DECL, and CONST_DECL
-    nodes, this points to either the FUNCTION_DECL for the containing
-    function, the RECORD_TYPE or UNION_TYPE for the containing type, or
-    NULL_TREE or a TRANSLATION_UNIT_DECL if the given decl has "file
-    scope".  In particular, for VAR_DECLs which are virtual table pointers
-    (they have DECL_VIRTUAL set), we use DECL_CONTEXT to determine the type
-    they belong to.  */
-#define DECL_CONTEXT(NODE) (DECL_MINIMAL_CHECK (NODE)->decl_minimal.context)
-#define DECL_FIELD_CONTEXT(NODE) \
-  (FIELD_DECL_CHECK (NODE)->decl_minimal.context)
-
-/* If nonzero, decl's name shouldn't be emitted into debug info.  */
-#define DECL_NAMELESS(NODE) (DECL_MINIMAL_CHECK (NODE)->base.u.bits.nameless_flag)
-
-/* For any sort of a ..._DECL node, this points to the original (abstract)
-   decl node which this decl is an inlined/cloned instance of, or else it
-   is NULL indicating that this decl is not an instance of some other decl.
-
-   The C front-end also uses this in a nested declaration of an inline
-   function, to point back to the definition.  */
-#define DECL_ABSTRACT_ORIGIN(NODE) \
-  (DECL_COMMON_CHECK (NODE)->decl_common.abstract_origin)
-
-/* Like DECL_ABSTRACT_ORIGIN, but returns NODE if there's no abstract
-   origin.  This is useful when setting the DECL_ABSTRACT_ORIGIN.  */
-#define DECL_ORIGIN(NODE) \
-  (DECL_ABSTRACT_ORIGIN (NODE) ? DECL_ABSTRACT_ORIGIN (NODE) : (NODE))
-
-/* Nonzero for any sort of ..._DECL node means this decl node represents an
-   inline instance of some original (abstract) decl from an inline function;
-   suppress any warnings about shadowing some other variable.  FUNCTION_DECL
-   nodes can also have their abstract origin set to themselves.  */
-#define DECL_FROM_INLINE(NODE) \
-  (DECL_ABSTRACT_ORIGIN (NODE) != NULL_TREE \
-   && DECL_ABSTRACT_ORIGIN (NODE) != (NODE))
-
-/* In a DECL this is the field where attributes are stored.  */
-#define DECL_ATTRIBUTES(NODE) \
-  (DECL_COMMON_CHECK (NODE)->decl_common.attributes)
-
-/* For a FUNCTION_DECL, holds the tree of BINDINGs.
-   For a TRANSLATION_UNIT_DECL, holds the namespace's BLOCK.
-   For a VAR_DECL, holds the initial value.
-   For a PARM_DECL, used for DECL_ARG_TYPE--default
-   values for parameters are encoded in the type of the function,
-   not in the PARM_DECL slot.
-   For a FIELD_DECL, this is used for enumeration values and the C
-   frontend uses it for temporarily storing bitwidth of bitfields.
-
-   ??? Need to figure out some way to check this isn't a PARM_DECL.  */
-#define DECL_INITIAL(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.initial)
-
-/* Holds the size of the datum, in bits, as a tree expression.
-   Need not be constant.  */
-#define DECL_SIZE(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.size)
-/* Likewise for the size in bytes.  */
-#define DECL_SIZE_UNIT(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.size_unit)
-/* Holds the alignment required for the datum, in bits.  */
-#define DECL_ALIGN(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.align)
-/* The alignment of NODE, in bytes.  */
-#define DECL_ALIGN_UNIT(NODE) (DECL_ALIGN (NODE) / BITS_PER_UNIT)
-/* Set if the alignment of this DECL has been set by the user, for
-   example with an 'aligned' attribute.  */
-#define DECL_USER_ALIGN(NODE) \
-  (DECL_COMMON_CHECK (NODE)->base.u.bits.user_align)
-/* Holds the machine mode corresponding to the declaration of a variable or
-   field.  Always equal to TYPE_MODE (TREE_TYPE (decl)) except for a
-   FIELD_DECL.  */
-#define DECL_MODE(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.mode)
-
-/* For FUNCTION_DECL, if it is built-in, this identifies which built-in
-   operation it is.  Note, however, that this field is overloaded, with
-   DECL_BUILT_IN_CLASS as the discriminant, so the latter must always be
-   checked before any access to the former.  */
-#define DECL_FUNCTION_CODE(NODE) \
-  (FUNCTION_DECL_CHECK (NODE)->function_decl.function_code)
-
-#define DECL_FUNCTION_PERSONALITY(NODE) \
-  (FUNCTION_DECL_CHECK (NODE)->function_decl.personality)
-
-/* Nonzero for a given ..._DECL node means that the name of this node should
-   be ignored for symbolic debug purposes.  For a TYPE_DECL, this means that
-   the associated type should be ignored.  For a FUNCTION_DECL, the body of
-   the function should also be ignored.  */
-#define DECL_IGNORED_P(NODE) \
-  (DECL_COMMON_CHECK (NODE)->decl_common.ignored_flag)
-
-/* Nonzero for a given ..._DECL node means that this node represents an
-   "abstract instance" of the given declaration (e.g. in the original
-   declaration of an inline function).  When generating symbolic debugging
-   information, we mustn't try to generate any address information for nodes
-   marked as "abstract instances" because we don't actually generate
-   any code or allocate any data space for such instances.  */
-#define DECL_ABSTRACT(NODE) \
-  (DECL_COMMON_CHECK (NODE)->decl_common.abstract_flag)
-
-/* Language-specific decl information.  */
-#define DECL_LANG_SPECIFIC(NODE) \
-  (DECL_COMMON_CHECK (NODE)->decl_common.lang_specific)
-
-/* In a VAR_DECL or FUNCTION_DECL, nonzero means external reference:
-   do not allocate storage, and refer to a definition elsewhere.  Note that
-   this does not necessarily imply the entity represented by NODE
-   has no program source-level definition in this translation unit.  For
-   example, for a FUNCTION_DECL, DECL_SAVED_TREE may be non-NULL and
-   DECL_EXTERNAL may be true simultaneously; that can be the case for
-   a C99 "extern inline" function.  */
-#define DECL_EXTERNAL(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.decl_flag_1)
-
-/* Nonzero in a ..._DECL means this variable is ref'd from a nested function.
-   For VAR_DECL nodes, PARM_DECL nodes, and FUNCTION_DECL nodes.
-
-   For LABEL_DECL nodes, nonzero if nonlocal gotos to the label are permitted.
-
-   Also set in some languages for variables, etc., outside the normal
-   lexical scope, such as class instance variables.  */
-#define DECL_NONLOCAL(NODE) \
-  (DECL_COMMON_CHECK (NODE)->decl_common.nonlocal_flag)
-
-/* Used in VAR_DECLs to indicate that the variable is a vtable.
-   Used in FIELD_DECLs for vtable pointers.
-   Used in FUNCTION_DECLs to indicate that the function is virtual.  */
-#define DECL_VIRTUAL_P(NODE) \
-  (DECL_COMMON_CHECK (NODE)->decl_common.virtual_flag)
-
-/* Used to indicate that this DECL represents a compiler-generated entity.  */
-#define DECL_ARTIFICIAL(NODE) \
-  (DECL_COMMON_CHECK (NODE)->decl_common.artificial_flag)
-
-/* Additional flags for language-specific uses.  */
-#define DECL_LANG_FLAG_0(NODE) \
-  (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_0)
-#define DECL_LANG_FLAG_1(NODE) \
-  (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_1)
-#define DECL_LANG_FLAG_2(NODE) \
-  (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_2)
-#define DECL_LANG_FLAG_3(NODE) \
-  (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_3)
-#define DECL_LANG_FLAG_4(NODE) \
-  (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_4)
-#define DECL_LANG_FLAG_5(NODE) \
-  (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_5)
-#define DECL_LANG_FLAG_6(NODE) \
-  (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_6)
-#define DECL_LANG_FLAG_7(NODE) \
-  (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_7)
-#define DECL_LANG_FLAG_8(NODE) \
-  (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_8)
-
-/* Nonzero for a scope which is equal to file scope.  */
-#define SCOPE_FILE_SCOPE_P(EXP)	\
-  (! (EXP) || TREE_CODE (EXP) == TRANSLATION_UNIT_DECL)
-/* Nonzero for a decl which is at file scope.  */
-#define DECL_FILE_SCOPE_P(EXP) SCOPE_FILE_SCOPE_P (DECL_CONTEXT (EXP))
-/* Nonzero for a type which is at file scope.  */
-#define TYPE_FILE_SCOPE_P(EXP) SCOPE_FILE_SCOPE_P (TYPE_CONTEXT (EXP))
-
-/* Nonzero for a decl that is decorated using attribute used.
-   This indicates to compiler tools that this decl needs to be preserved.  */
-#define DECL_PRESERVE_P(DECL) \
-  DECL_COMMON_CHECK (DECL)->decl_common.preserve_flag
-
-/* For function local variables of COMPLEX and VECTOR types,
-   indicates that the variable is not aliased, and that all
-   modifications to the variable have been adjusted so that
-   they are killing assignments.  Thus the variable may now
-   be treated as a GIMPLE register, and use real instead of
-   virtual ops in SSA form.  */
-#define DECL_GIMPLE_REG_P(DECL) \
-  DECL_COMMON_CHECK (DECL)->decl_common.gimple_reg_flag
-
-extern tree decl_value_expr_lookup (tree);
-extern void decl_value_expr_insert (tree, tree);
-
-/* In a VAR_DECL or PARM_DECL, the location at which the value may be found,
-   if transformations have made this more complicated than evaluating the
-   decl itself.  This should only be used for debugging; once this field has
-   been set, the decl itself may not legitimately appear in the function.  */
-#define DECL_HAS_VALUE_EXPR_P(NODE) \
-  (TREE_CHECK3 (NODE, VAR_DECL, PARM_DECL, RESULT_DECL) \
-   ->decl_common.decl_flag_2)
-#define DECL_VALUE_EXPR(NODE) \
-  (decl_value_expr_lookup (DECL_WRTL_CHECK (NODE)))
-#define SET_DECL_VALUE_EXPR(NODE, VAL) \
-  (decl_value_expr_insert (DECL_WRTL_CHECK (NODE), VAL))
-
-/* Holds the RTL expression for the value of a variable or function.
-   This value can be evaluated lazily for functions, variables with
-   static storage duration, and labels.  */
-#define DECL_RTL(NODE)					\
-  (DECL_WRTL_CHECK (NODE)->decl_with_rtl.rtl		\
-   ? (NODE)->decl_with_rtl.rtl					\
-   : (make_decl_rtl (NODE), (NODE)->decl_with_rtl.rtl))
-
-/* Set the DECL_RTL for NODE to RTL.  */
-#define SET_DECL_RTL(NODE, RTL) set_decl_rtl (NODE, RTL)
-
-/* Returns nonzero if NODE is a tree node that can contain RTL.  */
-#define HAS_RTL_P(NODE) (CODE_CONTAINS_STRUCT (TREE_CODE (NODE), TS_DECL_WRTL))
-
-/* Returns nonzero if the DECL_RTL for NODE has already been set.  */
-#define DECL_RTL_SET_P(NODE) \
-  (HAS_RTL_P (NODE) && DECL_WRTL_CHECK (NODE)->decl_with_rtl.rtl != NULL)
-
-/* Copy the RTL from NODE1 to NODE2.  If the RTL was not set for
-   NODE1, it will not be set for NODE2; this is a lazy copy.  */
-#define COPY_DECL_RTL(NODE1, NODE2) \
-  (DECL_WRTL_CHECK (NODE2)->decl_with_rtl.rtl \
-   = DECL_WRTL_CHECK (NODE1)->decl_with_rtl.rtl)
-
-/* The DECL_RTL for NODE, if it is set, or NULL, if it is not set.  */
-#define DECL_RTL_IF_SET(NODE) (DECL_RTL_SET_P (NODE) ? DECL_RTL (NODE) : NULL)
-
-#if (GCC_VERSION >= 2007)
-#define DECL_RTL_KNOWN_SET(decl) __extension__				\
-({  tree const __d = (decl);						\
-    gcc_checking_assert (DECL_RTL_SET_P (__d));				\
-    /* Dereference it so the compiler knows it can't be NULL even	\
-       without assertion checking.  */					\
-    &*DECL_RTL_IF_SET (__d); })
-#else
-#define DECL_RTL_KNOWN_SET(decl) (&*DECL_RTL_IF_SET (decl))
-#endif
-
-/* In VAR_DECL and PARM_DECL nodes, nonzero means declared `register'.  */
-#define DECL_REGISTER(NODE) (DECL_WRTL_CHECK (NODE)->decl_common.decl_flag_0)
-
-/* In a FIELD_DECL, this is the field position, counting in bytes, of the
-   DECL_OFFSET_ALIGN-bit-sized word containing the bit closest to the beginning
-   of the structure.  */
-#define DECL_FIELD_OFFSET(NODE) (FIELD_DECL_CHECK (NODE)->field_decl.offset)
-
-/* In a FIELD_DECL, this is the offset, in bits, of the first bit of the
-   field from DECL_FIELD_OFFSET.  This field may be nonzero even for fields
-   that are not bit fields (since DECL_OFFSET_ALIGN may be larger than the
-   natural alignment of the field's type).  */
-#define DECL_FIELD_BIT_OFFSET(NODE) \
-  (FIELD_DECL_CHECK (NODE)->field_decl.bit_offset)
-
-/* In a FIELD_DECL, this indicates whether the field was a bit-field and
-   if so, the type that was originally specified for it.
-   TREE_TYPE may have been modified (in finish_struct).  */
-#define DECL_BIT_FIELD_TYPE(NODE) \
-  (FIELD_DECL_CHECK (NODE)->field_decl.bit_field_type)
-
-/* In a FIELD_DECL of a RECORD_TYPE, this is a pointer to the storage
-   representative FIELD_DECL.  */
-#define DECL_BIT_FIELD_REPRESENTATIVE(NODE) \
-  (FIELD_DECL_CHECK (NODE)->field_decl.qualifier)
-
-/* For a FIELD_DECL in a QUAL_UNION_TYPE, records the expression, which
-   if nonzero, indicates that the field occupies the type.  */
-#define DECL_QUALIFIER(NODE) (FIELD_DECL_CHECK (NODE)->field_decl.qualifier)
-
-/* For FIELD_DECLs, off_align holds the number of low-order bits of
-   DECL_FIELD_OFFSET which are known to be always zero.
-   DECL_OFFSET_ALIGN thus returns the alignment that DECL_FIELD_OFFSET
-   has.  */
-#define DECL_OFFSET_ALIGN(NODE) \
-  (((unsigned HOST_WIDE_INT)1) << FIELD_DECL_CHECK (NODE)->decl_common.off_align)
-
-/* Specify that DECL_ALIGN(NODE) is a multiple of X.  */
-#define SET_DECL_OFFSET_ALIGN(NODE, X) \
-  (FIELD_DECL_CHECK (NODE)->decl_common.off_align = ffs_hwi (X) - 1)
-
-/* For FIELD_DECLS, DECL_FCONTEXT is the *first* baseclass in
-   which this FIELD_DECL is defined.  This information is needed when
-   writing debugging information about vfield and vbase decls for C++.  */
-#define DECL_FCONTEXT(NODE) (FIELD_DECL_CHECK (NODE)->field_decl.fcontext)
-
-/* In a FIELD_DECL, indicates this field should be bit-packed.  */
-#define DECL_PACKED(NODE) (FIELD_DECL_CHECK (NODE)->base.u.bits.packed_flag)
-
-/* Nonzero in a FIELD_DECL means it is a bit field, and must be accessed
-   specially.  */
-#define DECL_BIT_FIELD(NODE) (FIELD_DECL_CHECK (NODE)->decl_common.decl_flag_1)
-
-/* Used in a FIELD_DECL to indicate that we cannot form the address of
-   this component.  This makes it possible for Type-Based Alias Analysis
-   to disambiguate accesses to this field with indirect accesses using
-   the field's type:
-
-     struct S { int i; } s;
-     int *p;
-
-   If the flag is set on 'i', TBAA computes that s.i and *p never conflict.
-
-   From the implementation's viewpoint, the alias set of the type of the
-   field 'i' (int) will not be recorded as a subset of that of the type of
-   's' (struct S) in record_component_aliases.  The counterpart is that
-   accesses to s.i must not be given the alias set of the type of 'i'
-   (int) but instead directly that of the type of 's' (struct S).  */
-#define DECL_NONADDRESSABLE_P(NODE) \
-  (FIELD_DECL_CHECK (NODE)->decl_common.decl_flag_2)
-
-/* A numeric unique identifier for a LABEL_DECL.  The UID allocation is
-   dense, unique within any one function, and may be used to index arrays.
-   If the value is -1, then no UID has been assigned.  */
-#define LABEL_DECL_UID(NODE) \
-  (LABEL_DECL_CHECK (NODE)->label_decl.label_decl_uid)
-
-/* In a LABEL_DECL, the EH region number for which the label is the
-   post_landing_pad.  */
-#define EH_LANDING_PAD_NR(NODE) \
-  (LABEL_DECL_CHECK (NODE)->label_decl.eh_landing_pad_nr)
-
-/* For a PARM_DECL, records the data type used to pass the argument,
-   which may be different from the type seen in the program.  */
-#define DECL_ARG_TYPE(NODE) (PARM_DECL_CHECK (NODE)->decl_common.initial)
-
-/* For PARM_DECL, holds an RTL for the stack slot or register
-   where the data was actually passed.  */
-#define DECL_INCOMING_RTL(NODE) \
-  (PARM_DECL_CHECK (NODE)->parm_decl.incoming_rtl)
-
-/* Nonzero for a given ..._DECL node means that no warnings should be
-   generated just because this node is unused.  */
-#define DECL_IN_SYSTEM_HEADER(NODE) \
-  (in_system_header_at (DECL_SOURCE_LOCATION (NODE)))
-
-/* Used to indicate that the linkage status of this DECL is not yet known,
-   so it should not be output now.  */
-#define DECL_DEFER_OUTPUT(NODE) \
-  (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.defer_output)
-
-/* In a VAR_DECL that's static,
-   nonzero if the space is in the text section.  */
-#define DECL_IN_TEXT_SECTION(NODE) \
-  (VAR_DECL_CHECK (NODE)->decl_with_vis.in_text_section)
-
-/* In a VAR_DECL that's static,
-   nonzero if it belongs to the global constant pool.  */
-#define DECL_IN_CONSTANT_POOL(NODE) \
-  (VAR_DECL_CHECK (NODE)->decl_with_vis.in_constant_pool)
-
-/* Nonzero for a given ..._DECL node means that this node should be
-   put in .common, if possible.  If a DECL_INITIAL is given, and it
-   is not error_mark_node, then the decl cannot be put in .common.  */
-#define DECL_COMMON(NODE) \
-  (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.common_flag)
-
-/* In a VAR_DECL, nonzero if the decl is a register variable with
-   an explicit asm specification.  */
-#define DECL_HARD_REGISTER(NODE)  \
-  (VAR_DECL_CHECK (NODE)->decl_with_vis.hard_register)
-
-  /* Used to indicate that this DECL has weak linkage.  */
-#define DECL_WEAK(NODE) (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.weak_flag)
-
-/* Used to indicate that the DECL is a dllimport.  */
-#define DECL_DLLIMPORT_P(NODE) \
-  (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.dllimport_flag)
-
-/* Used in a DECL to indicate that, even if it TREE_PUBLIC, it need
-   not be put out unless it is needed in this translation unit.
-   Entities like this are shared across translation units (like weak
-   entities), but are guaranteed to be generated by any translation
-   unit that needs them, and therefore need not be put out anywhere
-   where they are not needed.  DECL_COMDAT is just a hint to the
-   back-end; it is up to front-ends which set this flag to ensure
-   that there will never be any harm, other than bloat, in putting out
-   something which is DECL_COMDAT.  */
-#define DECL_COMDAT(NODE) \
-  (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.comdat_flag)
-
-#define DECL_COMDAT_GROUP(NODE) \
-  (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.comdat_group)
-
-/* Used in TREE_PUBLIC decls to indicate that copies of this DECL in
-   multiple translation units should be merged.  */
-#define DECL_ONE_ONLY(NODE) (DECL_COMDAT_GROUP (NODE) != NULL_TREE)
-
-/* The name of the object as the assembler will see it (but before any
-   translations made by ASM_OUTPUT_LABELREF).  Often this is the same
-   as DECL_NAME.  It is an IDENTIFIER_NODE.  */
-#define DECL_ASSEMBLER_NAME(NODE) decl_assembler_name (NODE)
-
-/* Return true if NODE is a NODE that can contain a DECL_ASSEMBLER_NAME.
-   This is true of all DECL nodes except FIELD_DECL.  */
-#define HAS_DECL_ASSEMBLER_NAME_P(NODE) \
-  (CODE_CONTAINS_STRUCT (TREE_CODE (NODE), TS_DECL_WITH_VIS))
-
-/* Returns nonzero if the DECL_ASSEMBLER_NAME for NODE has been set.  If zero,
-   the NODE might still have a DECL_ASSEMBLER_NAME -- it just hasn't been set
-   yet.  */
-#define DECL_ASSEMBLER_NAME_SET_P(NODE) \
-  (HAS_DECL_ASSEMBLER_NAME_P (NODE) \
-   && DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.assembler_name != NULL_TREE)
-
-/* Set the DECL_ASSEMBLER_NAME for NODE to NAME.  */
-#define SET_DECL_ASSEMBLER_NAME(NODE, NAME) \
-  (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.assembler_name = (NAME))
-
-/* Copy the DECL_ASSEMBLER_NAME from DECL1 to DECL2.  Note that if DECL1's
-   DECL_ASSEMBLER_NAME has not yet been set, using this macro will not cause
-   the DECL_ASSEMBLER_NAME of either DECL to be set.  In other words, the
-   semantics of using this macro, are different than saying:
-
-     SET_DECL_ASSEMBLER_NAME(DECL2, DECL_ASSEMBLER_NAME (DECL1))
-
-   which will try to set the DECL_ASSEMBLER_NAME for DECL1.  */
-
-#define COPY_DECL_ASSEMBLER_NAME(DECL1, DECL2)				\
-  (DECL_ASSEMBLER_NAME_SET_P (DECL1)					\
-   ? (void) SET_DECL_ASSEMBLER_NAME (DECL2,				\
-				     DECL_ASSEMBLER_NAME (DECL1))	\
-   : (void) 0)
-
-/* Records the section name in a section attribute.  Used to pass
-   the name from decl_attributes to make_function_rtl and make_decl_rtl.  */
-#define DECL_SECTION_NAME(NODE) \
-  (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.section_name)
-
-/* Nonzero in a decl means that the gimplifier has seen (or placed)
-   this variable in a BIND_EXPR.  */
-#define DECL_SEEN_IN_BIND_EXPR_P(NODE) \
-  (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.seen_in_bind_expr)
-
-/* Value of the decls's visibility attribute */
-#define DECL_VISIBILITY(NODE) \
-  (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.visibility)
-
-/* Nonzero means that the decl had its visibility specified rather than
-   being inferred.  */
-#define DECL_VISIBILITY_SPECIFIED(NODE) \
-  (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.visibility_specified)
-
-/* In a VAR_DECL, the model to use if the data should be allocated from
-   thread-local storage.  */
-#define DECL_TLS_MODEL(NODE) (VAR_DECL_CHECK (NODE)->decl_with_vis.tls_model)
-
-/* In a VAR_DECL, nonzero if the data should be allocated from
-   thread-local storage.  */
-#define DECL_THREAD_LOCAL_P(NODE) \
-  (VAR_DECL_CHECK (NODE)->decl_with_vis.tls_model >= TLS_MODEL_REAL)
-
-/* In a non-local VAR_DECL with static storage duration, true if the
-   variable has an initialization priority.  If false, the variable
-   will be initialized at the DEFAULT_INIT_PRIORITY.  */
-#define DECL_HAS_INIT_PRIORITY_P(NODE) \
-  (VAR_DECL_CHECK (NODE)->decl_with_vis.init_priority_p)
-
-/* Specify whether the section name was set by user or by
-   compiler via -ffunction-sections.  */
-#define DECL_HAS_IMPLICIT_SECTION_NAME_P(NODE) \
-  (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.implicit_section_name_p)
-
-extern tree decl_debug_expr_lookup (tree);
-extern void decl_debug_expr_insert (tree, tree);
-
-/* For VAR_DECL, this is set to an expression that it was split from.  */
-#define DECL_HAS_DEBUG_EXPR_P(NODE) \
-  (VAR_DECL_CHECK (NODE)->decl_common.debug_expr_is_from)
-#define DECL_DEBUG_EXPR(NODE) \
-  (decl_debug_expr_lookup (VAR_DECL_CHECK (NODE)))
-
-#define SET_DECL_DEBUG_EXPR(NODE, VAL) \
-  (decl_debug_expr_insert (VAR_DECL_CHECK (NODE), VAL))
-
-extern priority_type decl_init_priority_lookup (tree);
-extern priority_type decl_fini_priority_lookup (tree);
-extern void decl_init_priority_insert (tree, priority_type);
-extern void decl_fini_priority_insert (tree, priority_type);
-
-/* For a VAR_DECL or FUNCTION_DECL the initialization priority of
-   NODE.  */
-#define DECL_INIT_PRIORITY(NODE) \
-  (decl_init_priority_lookup (NODE))
-/* Set the initialization priority for NODE to VAL.  */
-#define SET_DECL_INIT_PRIORITY(NODE, VAL) \
-  (decl_init_priority_insert (NODE, VAL))
-
-/* For a FUNCTION_DECL the finalization priority of NODE.  */
-#define DECL_FINI_PRIORITY(NODE) \
-  (decl_fini_priority_lookup (NODE))
-/* Set the finalization priority for NODE to VAL.  */
-#define SET_DECL_FINI_PRIORITY(NODE, VAL) \
-  (decl_fini_priority_insert (NODE, VAL))
-
-/* The initialization priority for entities for which no explicit
-   initialization priority has been specified.  */
-#define DEFAULT_INIT_PRIORITY 65535
-
-/* The maximum allowed initialization priority.  */
-#define MAX_INIT_PRIORITY 65535
-
-/* The largest priority value reserved for use by system runtime
-   libraries.  */
-#define MAX_RESERVED_INIT_PRIORITY 100
-
-/* In a VAR_DECL, nonzero if this is a global variable for VOPs.  */
-#define VAR_DECL_IS_VIRTUAL_OPERAND(NODE) \
-  (VAR_DECL_CHECK (NODE)->base.u.bits.saturating_flag)
-
-/* In a VAR_DECL, nonzero if this is a non-local frame structure.  */
-#define DECL_NONLOCAL_FRAME(NODE)  \
-  (VAR_DECL_CHECK (NODE)->base.default_def_flag)
-
-/* In a VAR_DECL, nonzero if this variable is not aliased by any pointer.  */
-#define DECL_NONALIASED(NODE) \
-  (VAR_DECL_CHECK (NODE)->base.nothrow_flag)
-
-/* This field is used to reference anything in decl.result and is meant only
-   for use by the garbage collector.  */
-#define DECL_RESULT_FLD(NODE) \
-  (DECL_NON_COMMON_CHECK (NODE)->decl_non_common.result)
-
-/* The DECL_VINDEX is used for FUNCTION_DECLS in two different ways.
-   Before the struct containing the FUNCTION_DECL is laid out,
-   DECL_VINDEX may point to a FUNCTION_DECL in a base class which
-   is the FUNCTION_DECL which this FUNCTION_DECL will replace as a virtual
-   function.  When the class is laid out, this pointer is changed
-   to an INTEGER_CST node which is suitable for use as an index
-   into the virtual function table.
-   C++ also uses this field in namespaces, hence the DECL_NON_COMMON_CHECK.  */
-#define DECL_VINDEX(NODE) \
-  (DECL_NON_COMMON_CHECK (NODE)->decl_non_common.vindex)
-
-/* In FUNCTION_DECL, holds the decl for the return value.  */
-#define DECL_RESULT(NODE) (FUNCTION_DECL_CHECK (NODE)->decl_non_common.result)
-
-/* In a FUNCTION_DECL, nonzero if the function cannot be inlined.  */
-#define DECL_UNINLINABLE(NODE) \
-  (FUNCTION_DECL_CHECK (NODE)->function_decl.uninlinable)
-
-/* In a FUNCTION_DECL, the saved representation of the body of the
-   entire function.  */
-#define DECL_SAVED_TREE(NODE) \
-  (FUNCTION_DECL_CHECK (NODE)->decl_non_common.saved_tree)
-
-/* Nonzero in a FUNCTION_DECL means this function should be treated
-   as if it were a malloc, meaning it returns a pointer that is
-   not an alias.  */
-#define DECL_IS_MALLOC(NODE) \
-  (FUNCTION_DECL_CHECK (NODE)->function_decl.malloc_flag)
-
-/* Nonzero in a FUNCTION_DECL means this function should be treated as
-   C++ operator new, meaning that it returns a pointer for which we
-   should not use type based aliasing.  */
-#define DECL_IS_OPERATOR_NEW(NODE) \
-  (FUNCTION_DECL_CHECK (NODE)->function_decl.operator_new_flag)
-
-/* Nonzero in a FUNCTION_DECL means this function may return more
-   than once.  */
-#define DECL_IS_RETURNS_TWICE(NODE) \
-  (FUNCTION_DECL_CHECK (NODE)->function_decl.returns_twice_flag)
-
-/* Nonzero in a FUNCTION_DECL means this function should be treated
-   as "pure" function (like const function, but may read global memory).  */
-#define DECL_PURE_P(NODE) (FUNCTION_DECL_CHECK (NODE)->function_decl.pure_flag)
-
-/* Nonzero only if one of TREE_READONLY or DECL_PURE_P is nonzero AND
-   the const or pure function may not terminate.  When this is nonzero
-   for a const or pure function, it can be dealt with by cse passes
-   but cannot be removed by dce passes since you are not allowed to
-   change an infinite looping program into one that terminates without
-   error.  */
-#define DECL_LOOPING_CONST_OR_PURE_P(NODE) \
-  (FUNCTION_DECL_CHECK (NODE)->function_decl.looping_const_or_pure_flag)
-
-/* Nonzero in a FUNCTION_DECL means this function should be treated
-   as "novops" function (function that does not read global memory,
-   but may have arbitrary side effects).  */
-#define DECL_IS_NOVOPS(NODE) \
-  (FUNCTION_DECL_CHECK (NODE)->function_decl.novops_flag)
-
-/* Used in FUNCTION_DECLs to indicate that they should be run automatically
-   at the beginning or end of execution.  */
-#define DECL_STATIC_CONSTRUCTOR(NODE) \
-  (FUNCTION_DECL_CHECK (NODE)->function_decl.static_ctor_flag)
-
-#define DECL_STATIC_DESTRUCTOR(NODE) \
-(FUNCTION_DECL_CHECK (NODE)->function_decl.static_dtor_flag)
-
-/* Used in FUNCTION_DECLs to indicate that function entry and exit should
-   be instrumented with calls to support routines.  */
-#define DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT(NODE) \
-  (FUNCTION_DECL_CHECK (NODE)->function_decl.no_instrument_function_entry_exit)
-
-/* Used in FUNCTION_DECLs to indicate that limit-stack-* should be
-   disabled in this function.  */
-#define DECL_NO_LIMIT_STACK(NODE) \
-  (FUNCTION_DECL_CHECK (NODE)->function_decl.no_limit_stack)
-
-/* In a FUNCTION_DECL indicates that a static chain is needed.  */
-#define DECL_STATIC_CHAIN(NODE) \
-  (FUNCTION_DECL_CHECK (NODE)->function_decl.regdecl_flag)
-
-/* Nonzero for a decl that cgraph has decided should be inlined into
-   at least one call site.  It is not meaningful to look at this
-   directly; always use cgraph_function_possibly_inlined_p.  */
-#define DECL_POSSIBLY_INLINED(DECL) \
-  FUNCTION_DECL_CHECK (DECL)->function_decl.possibly_inlined
-
-/* Nonzero in a FUNCTION_DECL means that this function was declared inline,
-   such as via the `inline' keyword in C/C++.  This flag controls the linkage
-   semantics of 'inline'  */
-#define DECL_DECLARED_INLINE_P(NODE) \
-  (FUNCTION_DECL_CHECK (NODE)->function_decl.declared_inline_flag)
-
-/* Nonzero in a FUNCTION_DECL means this function should not get
-   -Winline warnings.  */
-#define DECL_NO_INLINE_WARNING_P(NODE) \
-  (FUNCTION_DECL_CHECK (NODE)->function_decl.no_inline_warning_flag)
-
-/* Nonzero if a FUNCTION_CODE is a TM load/store.  */
-#define BUILTIN_TM_LOAD_STORE_P(FN) \
-  ((FN) >= BUILT_IN_TM_STORE_1 && (FN) <= BUILT_IN_TM_LOAD_RFW_LDOUBLE)
-
-/* Nonzero if a FUNCTION_CODE is a TM load.  */
-#define BUILTIN_TM_LOAD_P(FN) \
-  ((FN) >= BUILT_IN_TM_LOAD_1 && (FN) <= BUILT_IN_TM_LOAD_RFW_LDOUBLE)
-
-/* Nonzero if a FUNCTION_CODE is a TM store.  */
-#define BUILTIN_TM_STORE_P(FN) \
-  ((FN) >= BUILT_IN_TM_STORE_1 && (FN) <= BUILT_IN_TM_STORE_WAW_LDOUBLE)
-
-#define CASE_BUILT_IN_TM_LOAD(FN)	\
-  case BUILT_IN_TM_LOAD_##FN:		\
-  case BUILT_IN_TM_LOAD_RAR_##FN:	\
-  case BUILT_IN_TM_LOAD_RAW_##FN:	\
-  case BUILT_IN_TM_LOAD_RFW_##FN
-
-#define CASE_BUILT_IN_TM_STORE(FN)	\
-  case BUILT_IN_TM_STORE_##FN:		\
-  case BUILT_IN_TM_STORE_WAR_##FN:	\
-  case BUILT_IN_TM_STORE_WAW_##FN
-
-/* Nonzero in a FUNCTION_DECL that should be always inlined by the inliner
-   disregarding size and cost heuristics.  This is equivalent to using
-   the always_inline attribute without the required diagnostics if the
-   function cannot be inlined.  */
-#define DECL_DISREGARD_INLINE_LIMITS(NODE) \
-  (FUNCTION_DECL_CHECK (NODE)->function_decl.disregard_inline_limits)
-
-extern vec<tree, va_gc> **decl_debug_args_lookup (tree);
-extern vec<tree, va_gc> **decl_debug_args_insert (tree);
-
-/* Nonzero if a FUNCTION_DECL has DEBUG arguments attached to it.  */
-#define DECL_HAS_DEBUG_ARGS_P(NODE) \
-  (FUNCTION_DECL_CHECK (NODE)->function_decl.has_debug_args_flag)
-
-/* For FUNCTION_DECL, this holds a pointer to a structure ("struct function")
-   that describes the status of this function.  */
-#define DECL_STRUCT_FUNCTION(NODE) \
-  (FUNCTION_DECL_CHECK (NODE)->function_decl.f)
-
-/* In a FUNCTION_DECL, nonzero means a built in function of a
-   standard library or more generally a built in function that is
-   recognized by optimizers and expanders.
-
-   Note that it is different from the DECL_IS_BUILTIN accessor.  For
-   instance, user declared prototypes of C library functions are not
-   DECL_IS_BUILTIN but may be DECL_BUILT_IN.  */
-#define DECL_BUILT_IN(NODE) (DECL_BUILT_IN_CLASS (NODE) != NOT_BUILT_IN)
-
-/* For a builtin function, identify which part of the compiler defined it.  */
-#define DECL_BUILT_IN_CLASS(NODE) \
-   (FUNCTION_DECL_CHECK (NODE)->function_decl.built_in_class)
-
-/* In FUNCTION_DECL, a chain of ..._DECL nodes.
-   VAR_DECL and PARM_DECL reserve the arguments slot for language-specific
-   uses.  */
-#define DECL_ARGUMENTS(NODE) \
-  (FUNCTION_DECL_CHECK (NODE)->decl_non_common.arguments)
-#define DECL_ARGUMENT_FLD(NODE) \
-  (DECL_NON_COMMON_CHECK (NODE)->decl_non_common.arguments)
-
-/* In FUNCTION_DECL, the function specific target options to use when compiling
-   this function.  */
-#define DECL_FUNCTION_SPECIFIC_TARGET(NODE) \
-   (FUNCTION_DECL_CHECK (NODE)->function_decl.function_specific_target)
-
-/* In FUNCTION_DECL, the function specific optimization options to use when
-   compiling this function.  */
-#define DECL_FUNCTION_SPECIFIC_OPTIMIZATION(NODE) \
-   (FUNCTION_DECL_CHECK (NODE)->function_decl.function_specific_optimization)
-
-/* In FUNCTION_DECL, this is set if this function has other versions generated
-   using "target" attributes.  The default version is the one which does not
-   have any "target" attribute set. */
-#define DECL_FUNCTION_VERSIONED(NODE)\
-   (FUNCTION_DECL_CHECK (NODE)->function_decl.versioned_function)
-
-/* In FUNCTION_DECL, this is set if this function is a C++ constructor.
-   Devirtualization machinery uses this knowledge for determing type of the
-   object constructed.  Also we assume that constructor address is not
-   important.  */
-#define DECL_CXX_CONSTRUCTOR_P(NODE)\
-   (FUNCTION_DECL_CHECK (NODE)->decl_with_vis.cxx_constructor)
-
-/* In FUNCTION_DECL, this is set if this function is a C++ destructor.
-   Devirtualization machinery uses this to track types in destruction.  */
-#define DECL_CXX_DESTRUCTOR_P(NODE)\
-   (FUNCTION_DECL_CHECK (NODE)->decl_with_vis.cxx_destructor)
-
-/* In FUNCTION_DECL that represent an virtual method this is set when
-   the method is final.  */
-#define DECL_FINAL_P(NODE)\
-   (FUNCTION_DECL_CHECK (NODE)->decl_with_vis.final)
-
-/* The source language of the translation-unit.  */
-#define TRANSLATION_UNIT_LANGUAGE(NODE) \
-  (TRANSLATION_UNIT_DECL_CHECK (NODE)->translation_unit_decl.language)
-
-/* TRANSLATION_UNIT_DECL inherits from DECL_MINIMAL.  */
-
-/* For a TYPE_DECL, holds the "original" type.  (TREE_TYPE has the copy.) */
-#define DECL_ORIGINAL_TYPE(NODE) \
-  (TYPE_DECL_CHECK (NODE)->decl_non_common.result)
-
-/* In a TYPE_DECL nonzero means the detail info about this type is not dumped
-   into stabs.  Instead it will generate cross reference ('x') of names.
-   This uses the same flag as DECL_EXTERNAL.  */
-#define TYPE_DECL_SUPPRESS_DEBUG(NODE) \
-  (TYPE_DECL_CHECK (NODE)->decl_common.decl_flag_1)
-
-/* Getter of the imported declaration associated to the
-   IMPORTED_DECL node.  */
-#define IMPORTED_DECL_ASSOCIATED_DECL(NODE) \
-(DECL_INITIAL (IMPORTED_DECL_CHECK (NODE)))
-
-/* Getter of the symbol declaration associated with the
-   NAMELIST_DECL node.  */
-#define NAMELIST_DECL_ASSOCIATED_DECL(NODE) \
-  (DECL_INITIAL (NODE))
-
-/* A STATEMENT_LIST chains statements together in GENERIC and GIMPLE.
-   To reduce overhead, the nodes containing the statements are not trees.
-   This avoids the overhead of tree_common on all linked list elements.
-
-   Use the interface in tree-iterator.h to access this node.  */
-
-#define STATEMENT_LIST_HEAD(NODE) \
-  (STATEMENT_LIST_CHECK (NODE)->stmt_list.head)
-#define STATEMENT_LIST_TAIL(NODE) \
-  (STATEMENT_LIST_CHECK (NODE)->stmt_list.tail)
-
-#define TREE_OPTIMIZATION(NODE) \
-  (&OPTIMIZATION_NODE_CHECK (NODE)->optimization.opts)
-
-#define TREE_OPTIMIZATION_OPTABS(NODE) \
-  (OPTIMIZATION_NODE_CHECK (NODE)->optimization.optabs)
-
-#define TREE_OPTIMIZATION_BASE_OPTABS(NODE) \
-  (OPTIMIZATION_NODE_CHECK (NODE)->optimization.base_optabs)
-
-/* Return a tree node that encapsulates the optimization options in OPTS.  */
-extern tree build_optimization_node (struct gcc_options *opts);
-
-#define TREE_TARGET_OPTION(NODE) \
-  (&TARGET_OPTION_NODE_CHECK (NODE)->target_option.opts)
-
-#define TREE_TARGET_GLOBALS(NODE) \
-  (TARGET_OPTION_NODE_CHECK (NODE)->target_option.globals)
-
-/* Return a tree node that encapsulates the target options in OPTS.  */
-extern tree build_target_option_node (struct gcc_options *opts);
-
-extern void prepare_target_option_nodes_for_pch (void);
-
-#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
-
-inline tree
-tree_check (tree __t, const char *__f, int __l, const char *__g, tree_code __c)
-{
-  if (TREE_CODE (__t) != __c)
-    tree_check_failed (__t, __f, __l, __g, __c, 0);
-  return __t;
-}
-
-inline tree
-tree_not_check (tree __t, const char *__f, int __l, const char *__g,
-                enum tree_code __c)
-{
-  if (TREE_CODE (__t) == __c)
-    tree_not_check_failed (__t, __f, __l, __g, __c, 0);
-  return __t;
-}
-
-inline tree
-tree_check2 (tree __t, const char *__f, int __l, const char *__g,
-             enum tree_code __c1, enum tree_code __c2)
-{
-  if (TREE_CODE (__t) != __c1
-      && TREE_CODE (__t) != __c2)
-    tree_check_failed (__t, __f, __l, __g, __c1, __c2, 0);
-  return __t;
-}
-
-inline tree
-tree_not_check2 (tree __t, const char *__f, int __l, const char *__g,
-                 enum tree_code __c1, enum tree_code __c2)
-{
-  if (TREE_CODE (__t) == __c1
-      || TREE_CODE (__t) == __c2)
-    tree_not_check_failed (__t, __f, __l, __g, __c1, __c2, 0);
-  return __t;
-}
-
-inline tree
-tree_check3 (tree __t, const char *__f, int __l, const char *__g,
-             enum tree_code __c1, enum tree_code __c2, enum tree_code __c3)
-{
-  if (TREE_CODE (__t) != __c1
-      && TREE_CODE (__t) != __c2
-      && TREE_CODE (__t) != __c3)
-    tree_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, 0);
-  return __t;
-}
-
-inline tree
-tree_not_check3 (tree __t, const char *__f, int __l, const char *__g,
-                 enum tree_code __c1, enum tree_code __c2, enum tree_code __c3)
-{
-  if (TREE_CODE (__t) == __c1
-      || TREE_CODE (__t) == __c2
-      || TREE_CODE (__t) == __c3)
-    tree_not_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, 0);
-  return __t;
-}
-
-inline tree
-tree_check4 (tree __t, const char *__f, int __l, const char *__g,
-             enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
-             enum tree_code __c4)
-{
-  if (TREE_CODE (__t) != __c1
-      && TREE_CODE (__t) != __c2
-      && TREE_CODE (__t) != __c3
-      && TREE_CODE (__t) != __c4)
-    tree_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, __c4, 0);
-  return __t;
-}
-
-inline tree
-tree_not_check4 (tree __t, const char *__f, int __l, const char *__g,
-                 enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
-                 enum tree_code __c4)
-{
-  if (TREE_CODE (__t) == __c1
-      || TREE_CODE (__t) == __c2
-      || TREE_CODE (__t) == __c3
-      || TREE_CODE (__t) == __c4)
-    tree_not_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, __c4, 0);
-  return __t;
-}
-
-inline tree
-tree_check5 (tree __t, const char *__f, int __l, const char *__g,
-             enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
-             enum tree_code __c4, enum tree_code __c5)
-{
-  if (TREE_CODE (__t) != __c1
-      && TREE_CODE (__t) != __c2
-      && TREE_CODE (__t) != __c3
-      && TREE_CODE (__t) != __c4
-      && TREE_CODE (__t) != __c5)
-    tree_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, __c4, __c5, 0);
-  return __t;
-}
-
-inline tree
-tree_not_check5 (tree __t, const char *__f, int __l, const char *__g,
-                 enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
-                 enum tree_code __c4, enum tree_code __c5)
-{
-  if (TREE_CODE (__t) == __c1
-      || TREE_CODE (__t) == __c2
-      || TREE_CODE (__t) == __c3
-      || TREE_CODE (__t) == __c4
-      || TREE_CODE (__t) == __c5)
-    tree_not_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, __c4, __c5, 0);
-  return __t;
-}
-
-inline tree
-contains_struct_check (tree __t, const enum tree_node_structure_enum __s,
-                       const char *__f, int __l, const char *__g)
-{
-  if (tree_contains_struct[TREE_CODE (__t)][__s] != 1)
-      tree_contains_struct_check_failed (__t, __s, __f, __l, __g);
-  return __t;
-}
-
-inline tree
-tree_class_check (tree __t, const enum tree_code_class __class,
-                  const char *__f, int __l, const char *__g)
-{
-  if (TREE_CODE_CLASS (TREE_CODE (__t)) != __class)
-    tree_class_check_failed (__t, __class, __f, __l, __g);
-  return __t;
-}
-
-inline tree
-tree_range_check (tree __t,
-                  enum tree_code __code1, enum tree_code __code2,
-                  const char *__f, int __l, const char *__g)
-{
-  if (TREE_CODE (__t) < __code1 || TREE_CODE (__t) > __code2)
-    tree_range_check_failed (__t, __f, __l, __g, __code1, __code2);
-  return __t;
-}
-
-inline tree
-omp_clause_subcode_check (tree __t, enum omp_clause_code __code,
-                          const char *__f, int __l, const char *__g)
-{
-  if (TREE_CODE (__t) != OMP_CLAUSE)
-    tree_check_failed (__t, __f, __l, __g, OMP_CLAUSE, 0);
-  if (__t->omp_clause.code != __code)
-    omp_clause_check_failed (__t, __f, __l, __g, __code);
-  return __t;
-}
-
-inline tree
-omp_clause_range_check (tree __t,
-                        enum omp_clause_code __code1,
-                        enum omp_clause_code __code2,
-                        const char *__f, int __l, const char *__g)
-{
-  if (TREE_CODE (__t) != OMP_CLAUSE)
-    tree_check_failed (__t, __f, __l, __g, OMP_CLAUSE, 0);
-  if ((int) __t->omp_clause.code < (int) __code1
-      || (int) __t->omp_clause.code > (int) __code2)
-    omp_clause_range_check_failed (__t, __f, __l, __g, __code1, __code2);
-  return __t;
-}
-
-/* These checks have to be special cased.  */
-
-inline tree
-expr_check (tree __t, const char *__f, int __l, const char *__g)
-{
-  char const __c = TREE_CODE_CLASS (TREE_CODE (__t));
-  if (!IS_EXPR_CODE_CLASS (__c))
-    tree_class_check_failed (__t, tcc_expression, __f, __l, __g);
-  return __t;
-}
-
-/* These checks have to be special cased.  */
-
-inline tree
-non_type_check (tree __t, const char *__f, int __l, const char *__g)
-{
-  if (TYPE_P (__t))
-    tree_not_class_check_failed (__t, tcc_type, __f, __l, __g);
-  return __t;
-}
-
-inline tree *
-tree_vec_elt_check (tree __t, int __i,
-                    const char *__f, int __l, const char *__g)
-{
-  if (TREE_CODE (__t) != TREE_VEC)
-    tree_check_failed (__t, __f, __l, __g, TREE_VEC, 0);
-  if (__i < 0 || __i >= __t->base.u.length)
-    tree_vec_elt_check_failed (__i, __t->base.u.length, __f, __l, __g);
-  return &CONST_CAST_TREE (__t)->vec.a[__i];
-}
-
-inline tree *
-omp_clause_elt_check (tree __t, int __i,
-                      const char *__f, int __l, const char *__g)
-{
-  if (TREE_CODE (__t) != OMP_CLAUSE)
-    tree_check_failed (__t, __f, __l, __g, OMP_CLAUSE, 0);
-  if (__i < 0 || __i >= omp_clause_num_ops [__t->omp_clause.code])
-    omp_clause_operand_check_failed (__i, __t, __f, __l, __g);
-  return &__t->omp_clause.ops[__i];
-}
-
-inline const_tree
-tree_check (const_tree __t, const char *__f, int __l, const char *__g,
-	    tree_code __c)
-{
-  if (TREE_CODE (__t) != __c)
-    tree_check_failed (__t, __f, __l, __g, __c, 0);
-  return __t;
-}
-
-inline const_tree
-tree_not_check (const_tree __t, const char *__f, int __l, const char *__g,
-                enum tree_code __c)
-{
-  if (TREE_CODE (__t) == __c)
-    tree_not_check_failed (__t, __f, __l, __g, __c, 0);
-  return __t;
-}
-
-inline const_tree
-tree_check2 (const_tree __t, const char *__f, int __l, const char *__g,
-             enum tree_code __c1, enum tree_code __c2)
-{
-  if (TREE_CODE (__t) != __c1
-      && TREE_CODE (__t) != __c2)
-    tree_check_failed (__t, __f, __l, __g, __c1, __c2, 0);
-  return __t;
-}
-
-inline const_tree
-tree_not_check2 (const_tree __t, const char *__f, int __l, const char *__g,
-                 enum tree_code __c1, enum tree_code __c2)
-{
-  if (TREE_CODE (__t) == __c1
-      || TREE_CODE (__t) == __c2)
-    tree_not_check_failed (__t, __f, __l, __g, __c1, __c2, 0);
-  return __t;
-}
-
-inline const_tree
-tree_check3 (const_tree __t, const char *__f, int __l, const char *__g,
-             enum tree_code __c1, enum tree_code __c2, enum tree_code __c3)
-{
-  if (TREE_CODE (__t) != __c1
-      && TREE_CODE (__t) != __c2
-      && TREE_CODE (__t) != __c3)
-    tree_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, 0);
-  return __t;
-}
-
-inline const_tree
-tree_not_check3 (const_tree __t, const char *__f, int __l, const char *__g,
-                 enum tree_code __c1, enum tree_code __c2, enum tree_code __c3)
-{
-  if (TREE_CODE (__t) == __c1
-      || TREE_CODE (__t) == __c2
-      || TREE_CODE (__t) == __c3)
-    tree_not_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, 0);
-  return __t;
-}
-
-inline const_tree
-tree_check4 (const_tree __t, const char *__f, int __l, const char *__g,
-             enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
-             enum tree_code __c4)
-{
-  if (TREE_CODE (__t) != __c1
-      && TREE_CODE (__t) != __c2
-      && TREE_CODE (__t) != __c3
-      && TREE_CODE (__t) != __c4)
-    tree_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, __c4, 0);
-  return __t;
-}
-
-inline const_tree
-tree_not_check4 (const_tree __t, const char *__f, int __l, const char *__g,
-                 enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
-                 enum tree_code __c4)
-{
-  if (TREE_CODE (__t) == __c1
-      || TREE_CODE (__t) == __c2
-      || TREE_CODE (__t) == __c3
-      || TREE_CODE (__t) == __c4)
-    tree_not_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, __c4, 0);
-  return __t;
-}
-
-inline const_tree
-tree_check5 (const_tree __t, const char *__f, int __l, const char *__g,
-             enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
-             enum tree_code __c4, enum tree_code __c5)
-{
-  if (TREE_CODE (__t) != __c1
-      && TREE_CODE (__t) != __c2
-      && TREE_CODE (__t) != __c3
-      && TREE_CODE (__t) != __c4
-      && TREE_CODE (__t) != __c5)
-    tree_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, __c4, __c5, 0);
-  return __t;
-}
-
-inline const_tree
-tree_not_check5 (const_tree __t, const char *__f, int __l, const char *__g,
-                 enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
-                 enum tree_code __c4, enum tree_code __c5)
-{
-  if (TREE_CODE (__t) == __c1
-      || TREE_CODE (__t) == __c2
-      || TREE_CODE (__t) == __c3
-      || TREE_CODE (__t) == __c4
-      || TREE_CODE (__t) == __c5)
-    tree_not_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, __c4, __c5, 0);
-  return __t;
-}
-
-inline const_tree
-contains_struct_check (const_tree __t, const enum tree_node_structure_enum __s,
-                       const char *__f, int __l, const char *__g)
-{
-  if (tree_contains_struct[TREE_CODE (__t)][__s] != 1)
-      tree_contains_struct_check_failed (__t, __s, __f, __l, __g);
-  return __t;
-}
-
-inline const_tree
-tree_class_check (const_tree __t, const enum tree_code_class __class,
-                  const char *__f, int __l, const char *__g)
-{
-  if (TREE_CODE_CLASS (TREE_CODE (__t)) != __class)
-    tree_class_check_failed (__t, __class, __f, __l, __g);
-  return __t;
-}
-
-inline const_tree
-tree_range_check (const_tree __t,
-                  enum tree_code __code1, enum tree_code __code2,
-                  const char *__f, int __l, const char *__g)
-{
-  if (TREE_CODE (__t) < __code1 || TREE_CODE (__t) > __code2)
-    tree_range_check_failed (__t, __f, __l, __g, __code1, __code2);
-  return __t;
-}
-
-inline const_tree
-omp_clause_subcode_check (const_tree __t, enum omp_clause_code __code,
-                          const char *__f, int __l, const char *__g)
-{
-  if (TREE_CODE (__t) != OMP_CLAUSE)
-    tree_check_failed (__t, __f, __l, __g, OMP_CLAUSE, 0);
-  if (__t->omp_clause.code != __code)
-    omp_clause_check_failed (__t, __f, __l, __g, __code);
-  return __t;
-}
-
-inline const_tree
-omp_clause_range_check (const_tree __t,
-                        enum omp_clause_code __code1,
-                        enum omp_clause_code __code2,
-                        const char *__f, int __l, const char *__g)
-{
-  if (TREE_CODE (__t) != OMP_CLAUSE)
-    tree_check_failed (__t, __f, __l, __g, OMP_CLAUSE, 0);
-  if ((int) __t->omp_clause.code < (int) __code1
-      || (int) __t->omp_clause.code > (int) __code2)
-    omp_clause_range_check_failed (__t, __f, __l, __g, __code1, __code2);
-  return __t;
-}
-
-inline const_tree
-expr_check (const_tree __t, const char *__f, int __l, const char *__g)
-{
-  char const __c = TREE_CODE_CLASS (TREE_CODE (__t));
-  if (!IS_EXPR_CODE_CLASS (__c))
-    tree_class_check_failed (__t, tcc_expression, __f, __l, __g);
-  return __t;
-}
-
-inline const_tree
-non_type_check (const_tree __t, const char *__f, int __l, const char *__g)
-{
-  if (TYPE_P (__t))
-    tree_not_class_check_failed (__t, tcc_type, __f, __l, __g);
-  return __t;
-}
-
-inline const_tree *
-tree_vec_elt_check (const_tree __t, int __i,
-                    const char *__f, int __l, const char *__g)
-{
-  if (TREE_CODE (__t) != TREE_VEC)
-    tree_check_failed (__t, __f, __l, __g, TREE_VEC, 0);
-  if (__i < 0 || __i >= __t->base.u.length)
-    tree_vec_elt_check_failed (__i, __t->base.u.length, __f, __l, __g);
-  return CONST_CAST (const_tree *, &__t->vec.a[__i]);
-  //return &__t->vec.a[__i];
-}
-
-inline const_tree *
-omp_clause_elt_check (const_tree __t, int __i,
-                      const char *__f, int __l, const char *__g)
-{
-  if (TREE_CODE (__t) != OMP_CLAUSE)
-    tree_check_failed (__t, __f, __l, __g, OMP_CLAUSE, 0);
-  if (__i < 0 || __i >= omp_clause_num_ops [__t->omp_clause.code])
-    omp_clause_operand_check_failed (__i, __t, __f, __l, __g);
-  return CONST_CAST (const_tree *, &__t->omp_clause.ops[__i]);
-}
-
-#endif
-
-/* Compute the number of operands in an expression node NODE.  For
-   tcc_vl_exp nodes like CALL_EXPRs, this is stored in the node itself,
-   otherwise it is looked up from the node's code.  */
-static inline int
-tree_operand_length (const_tree node)
-{
-  if (VL_EXP_CLASS_P (node))
-    return VL_EXP_OPERAND_LENGTH (node);
-  else
-    return TREE_CODE_LENGTH (TREE_CODE (node));
-}
-
-#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
-
-/* Special checks for TREE_OPERANDs.  */
-inline tree *
-tree_operand_check (tree __t, int __i,
-                    const char *__f, int __l, const char *__g)
-{
-  const_tree __u = EXPR_CHECK (__t);
-  if (__i < 0 || __i >= TREE_OPERAND_LENGTH (__u))
-    tree_operand_check_failed (__i, __u, __f, __l, __g);
-  return &CONST_CAST_TREE (__u)->exp.operands[__i];
-}
-
-inline tree *
-tree_operand_check_code (tree __t, enum tree_code __code, int __i,
-                         const char *__f, int __l, const char *__g)
-{
-  if (TREE_CODE (__t) != __code)
-    tree_check_failed (__t, __f, __l, __g, __code, 0);
-  if (__i < 0 || __i >= TREE_OPERAND_LENGTH (__t))
-    tree_operand_check_failed (__i, __t, __f, __l, __g);
-  return &__t->exp.operands[__i];
-}
-
-inline const_tree *
-tree_operand_check (const_tree __t, int __i,
-                    const char *__f, int __l, const char *__g)
-{
-  const_tree __u = EXPR_CHECK (__t);
-  if (__i < 0 || __i >= TREE_OPERAND_LENGTH (__u))
-    tree_operand_check_failed (__i, __u, __f, __l, __g);
-  return CONST_CAST (const_tree *, &__u->exp.operands[__i]);
-}
-
-inline const_tree *
-tree_operand_check_code (const_tree __t, enum tree_code __code, int __i,
-                         const char *__f, int __l, const char *__g)
-{
-  if (TREE_CODE (__t) != __code)
-    tree_check_failed (__t, __f, __l, __g, __code, 0);
-  if (__i < 0 || __i >= TREE_OPERAND_LENGTH (__t))
-    tree_operand_check_failed (__i, __t, __f, __l, __g);
-  return CONST_CAST (const_tree *, &__t->exp.operands[__i]);
-}
-
-#endif
-
-#define error_mark_node			global_trees[TI_ERROR_MARK]
-
-#define intQI_type_node			global_trees[TI_INTQI_TYPE]
-#define intHI_type_node			global_trees[TI_INTHI_TYPE]
-#define intSI_type_node			global_trees[TI_INTSI_TYPE]
-#define intDI_type_node			global_trees[TI_INTDI_TYPE]
-#define intTI_type_node			global_trees[TI_INTTI_TYPE]
-
-#define unsigned_intQI_type_node	global_trees[TI_UINTQI_TYPE]
-#define unsigned_intHI_type_node	global_trees[TI_UINTHI_TYPE]
-#define unsigned_intSI_type_node	global_trees[TI_UINTSI_TYPE]
-#define unsigned_intDI_type_node	global_trees[TI_UINTDI_TYPE]
-#define unsigned_intTI_type_node	global_trees[TI_UINTTI_TYPE]
-
-#define atomicQI_type_node	global_trees[TI_ATOMICQI_TYPE]
-#define atomicHI_type_node	global_trees[TI_ATOMICHI_TYPE]
-#define atomicSI_type_node	global_trees[TI_ATOMICSI_TYPE]
-#define atomicDI_type_node	global_trees[TI_ATOMICDI_TYPE]
-#define atomicTI_type_node	global_trees[TI_ATOMICTI_TYPE]
-
-#define uint16_type_node		global_trees[TI_UINT16_TYPE]
-#define uint32_type_node		global_trees[TI_UINT32_TYPE]
-#define uint64_type_node		global_trees[TI_UINT64_TYPE]
-
-#define integer_zero_node		global_trees[TI_INTEGER_ZERO]
-#define integer_one_node		global_trees[TI_INTEGER_ONE]
-#define integer_three_node              global_trees[TI_INTEGER_THREE]
-#define integer_minus_one_node		global_trees[TI_INTEGER_MINUS_ONE]
-#define size_zero_node			global_trees[TI_SIZE_ZERO]
-#define size_one_node			global_trees[TI_SIZE_ONE]
-#define bitsize_zero_node		global_trees[TI_BITSIZE_ZERO]
-#define bitsize_one_node		global_trees[TI_BITSIZE_ONE]
-#define bitsize_unit_node		global_trees[TI_BITSIZE_UNIT]
-
-/* Base access nodes.  */
-#define access_public_node		global_trees[TI_PUBLIC]
-#define access_protected_node	        global_trees[TI_PROTECTED]
-#define access_private_node		global_trees[TI_PRIVATE]
-
-#define null_pointer_node		global_trees[TI_NULL_POINTER]
-
-#define float_type_node			global_trees[TI_FLOAT_TYPE]
-#define double_type_node		global_trees[TI_DOUBLE_TYPE]
-#define long_double_type_node		global_trees[TI_LONG_DOUBLE_TYPE]
-
-#define float_ptr_type_node		global_trees[TI_FLOAT_PTR_TYPE]
-#define double_ptr_type_node		global_trees[TI_DOUBLE_PTR_TYPE]
-#define long_double_ptr_type_node	global_trees[TI_LONG_DOUBLE_PTR_TYPE]
-#define integer_ptr_type_node		global_trees[TI_INTEGER_PTR_TYPE]
-
-#define complex_integer_type_node	global_trees[TI_COMPLEX_INTEGER_TYPE]
-#define complex_float_type_node		global_trees[TI_COMPLEX_FLOAT_TYPE]
-#define complex_double_type_node	global_trees[TI_COMPLEX_DOUBLE_TYPE]
-#define complex_long_double_type_node	global_trees[TI_COMPLEX_LONG_DOUBLE_TYPE]
-
-#define void_type_node			global_trees[TI_VOID_TYPE]
-/* The C type `void *'.  */
-#define ptr_type_node			global_trees[TI_PTR_TYPE]
-/* The C type `const void *'.  */
-#define const_ptr_type_node		global_trees[TI_CONST_PTR_TYPE]
-/* The C type `size_t'.  */
-#define size_type_node                  global_trees[TI_SIZE_TYPE]
-#define pid_type_node                   global_trees[TI_PID_TYPE]
-#define ptrdiff_type_node		global_trees[TI_PTRDIFF_TYPE]
-#define va_list_type_node		global_trees[TI_VA_LIST_TYPE]
-#define va_list_gpr_counter_field	global_trees[TI_VA_LIST_GPR_COUNTER_FIELD]
-#define va_list_fpr_counter_field	global_trees[TI_VA_LIST_FPR_COUNTER_FIELD]
-/* The C type `FILE *'.  */
-#define fileptr_type_node		global_trees[TI_FILEPTR_TYPE]
-#define pointer_sized_int_node		global_trees[TI_POINTER_SIZED_TYPE]
-
-#define boolean_type_node		global_trees[TI_BOOLEAN_TYPE]
-#define boolean_false_node		global_trees[TI_BOOLEAN_FALSE]
-#define boolean_true_node		global_trees[TI_BOOLEAN_TRUE]
-
-/* The decimal floating point types. */
-#define dfloat32_type_node              global_trees[TI_DFLOAT32_TYPE]
-#define dfloat64_type_node              global_trees[TI_DFLOAT64_TYPE]
-#define dfloat128_type_node             global_trees[TI_DFLOAT128_TYPE]
-#define dfloat32_ptr_type_node          global_trees[TI_DFLOAT32_PTR_TYPE]
-#define dfloat64_ptr_type_node          global_trees[TI_DFLOAT64_PTR_TYPE]
-#define dfloat128_ptr_type_node         global_trees[TI_DFLOAT128_PTR_TYPE]
-
-/* The fixed-point types.  */
-#define sat_short_fract_type_node       global_trees[TI_SAT_SFRACT_TYPE]
-#define sat_fract_type_node             global_trees[TI_SAT_FRACT_TYPE]
-#define sat_long_fract_type_node        global_trees[TI_SAT_LFRACT_TYPE]
-#define sat_long_long_fract_type_node   global_trees[TI_SAT_LLFRACT_TYPE]
-#define sat_unsigned_short_fract_type_node \
-					global_trees[TI_SAT_USFRACT_TYPE]
-#define sat_unsigned_fract_type_node    global_trees[TI_SAT_UFRACT_TYPE]
-#define sat_unsigned_long_fract_type_node \
-					global_trees[TI_SAT_ULFRACT_TYPE]
-#define sat_unsigned_long_long_fract_type_node \
-					global_trees[TI_SAT_ULLFRACT_TYPE]
-#define short_fract_type_node           global_trees[TI_SFRACT_TYPE]
-#define fract_type_node                 global_trees[TI_FRACT_TYPE]
-#define long_fract_type_node            global_trees[TI_LFRACT_TYPE]
-#define long_long_fract_type_node       global_trees[TI_LLFRACT_TYPE]
-#define unsigned_short_fract_type_node  global_trees[TI_USFRACT_TYPE]
-#define unsigned_fract_type_node        global_trees[TI_UFRACT_TYPE]
-#define unsigned_long_fract_type_node   global_trees[TI_ULFRACT_TYPE]
-#define unsigned_long_long_fract_type_node \
-					global_trees[TI_ULLFRACT_TYPE]
-#define sat_short_accum_type_node       global_trees[TI_SAT_SACCUM_TYPE]
-#define sat_accum_type_node             global_trees[TI_SAT_ACCUM_TYPE]
-#define sat_long_accum_type_node        global_trees[TI_SAT_LACCUM_TYPE]
-#define sat_long_long_accum_type_node   global_trees[TI_SAT_LLACCUM_TYPE]
-#define sat_unsigned_short_accum_type_node \
-					global_trees[TI_SAT_USACCUM_TYPE]
-#define sat_unsigned_accum_type_node    global_trees[TI_SAT_UACCUM_TYPE]
-#define sat_unsigned_long_accum_type_node \
-					global_trees[TI_SAT_ULACCUM_TYPE]
-#define sat_unsigned_long_long_accum_type_node \
-					global_trees[TI_SAT_ULLACCUM_TYPE]
-#define short_accum_type_node           global_trees[TI_SACCUM_TYPE]
-#define accum_type_node                 global_trees[TI_ACCUM_TYPE]
-#define long_accum_type_node            global_trees[TI_LACCUM_TYPE]
-#define long_long_accum_type_node       global_trees[TI_LLACCUM_TYPE]
-#define unsigned_short_accum_type_node  global_trees[TI_USACCUM_TYPE]
-#define unsigned_accum_type_node        global_trees[TI_UACCUM_TYPE]
-#define unsigned_long_accum_type_node   global_trees[TI_ULACCUM_TYPE]
-#define unsigned_long_long_accum_type_node \
-					global_trees[TI_ULLACCUM_TYPE]
-#define qq_type_node                    global_trees[TI_QQ_TYPE]
-#define hq_type_node                    global_trees[TI_HQ_TYPE]
-#define sq_type_node                    global_trees[TI_SQ_TYPE]
-#define dq_type_node                    global_trees[TI_DQ_TYPE]
-#define tq_type_node                    global_trees[TI_TQ_TYPE]
-#define uqq_type_node                   global_trees[TI_UQQ_TYPE]
-#define uhq_type_node                   global_trees[TI_UHQ_TYPE]
-#define usq_type_node                   global_trees[TI_USQ_TYPE]
-#define udq_type_node                   global_trees[TI_UDQ_TYPE]
-#define utq_type_node                   global_trees[TI_UTQ_TYPE]
-#define sat_qq_type_node                global_trees[TI_SAT_QQ_TYPE]
-#define sat_hq_type_node                global_trees[TI_SAT_HQ_TYPE]
-#define sat_sq_type_node                global_trees[TI_SAT_SQ_TYPE]
-#define sat_dq_type_node                global_trees[TI_SAT_DQ_TYPE]
-#define sat_tq_type_node                global_trees[TI_SAT_TQ_TYPE]
-#define sat_uqq_type_node               global_trees[TI_SAT_UQQ_TYPE]
-#define sat_uhq_type_node               global_trees[TI_SAT_UHQ_TYPE]
-#define sat_usq_type_node               global_trees[TI_SAT_USQ_TYPE]
-#define sat_udq_type_node               global_trees[TI_SAT_UDQ_TYPE]
-#define sat_utq_type_node               global_trees[TI_SAT_UTQ_TYPE]
-#define ha_type_node                    global_trees[TI_HA_TYPE]
-#define sa_type_node                    global_trees[TI_SA_TYPE]
-#define da_type_node                    global_trees[TI_DA_TYPE]
-#define ta_type_node                    global_trees[TI_TA_TYPE]
-#define uha_type_node                   global_trees[TI_UHA_TYPE]
-#define usa_type_node                   global_trees[TI_USA_TYPE]
-#define uda_type_node                   global_trees[TI_UDA_TYPE]
-#define uta_type_node                   global_trees[TI_UTA_TYPE]
-#define sat_ha_type_node                global_trees[TI_SAT_HA_TYPE]
-#define sat_sa_type_node                global_trees[TI_SAT_SA_TYPE]
-#define sat_da_type_node                global_trees[TI_SAT_DA_TYPE]
-#define sat_ta_type_node                global_trees[TI_SAT_TA_TYPE]
-#define sat_uha_type_node               global_trees[TI_SAT_UHA_TYPE]
-#define sat_usa_type_node               global_trees[TI_SAT_USA_TYPE]
-#define sat_uda_type_node               global_trees[TI_SAT_UDA_TYPE]
-#define sat_uta_type_node               global_trees[TI_SAT_UTA_TYPE]
-
-/* The node that should be placed at the end of a parameter list to
-   indicate that the function does not take a variable number of
-   arguments.  The TREE_VALUE will be void_type_node and there will be
-   no TREE_CHAIN.  Language-independent code should not assume
-   anything else about this node.  */
-#define void_list_node                  global_trees[TI_VOID_LIST_NODE]
-
-#define main_identifier_node		global_trees[TI_MAIN_IDENTIFIER]
-#define MAIN_NAME_P(NODE) \
-  (IDENTIFIER_NODE_CHECK (NODE) == main_identifier_node)
-
-/* Optimization options (OPTIMIZATION_NODE) to use for default and current
-   functions.  */
-#define optimization_default_node	global_trees[TI_OPTIMIZATION_DEFAULT]
-#define optimization_current_node	global_trees[TI_OPTIMIZATION_CURRENT]
-
-/* Default/current target options (TARGET_OPTION_NODE).  */
-#define target_option_default_node	global_trees[TI_TARGET_OPTION_DEFAULT]
-#define target_option_current_node	global_trees[TI_TARGET_OPTION_CURRENT]
-
-/* Default tree list option(), optimize() pragmas to be linked into the
-   attribute list.  */
-#define current_target_pragma		global_trees[TI_CURRENT_TARGET_PRAGMA]
-#define current_optimize_pragma		global_trees[TI_CURRENT_OPTIMIZE_PRAGMA]
-
-#define char_type_node			integer_types[itk_char]
-#define signed_char_type_node		integer_types[itk_signed_char]
-#define unsigned_char_type_node		integer_types[itk_unsigned_char]
-#define short_integer_type_node		integer_types[itk_short]
-#define short_unsigned_type_node	integer_types[itk_unsigned_short]
-#define integer_type_node		integer_types[itk_int]
-#define unsigned_type_node		integer_types[itk_unsigned_int]
-#define long_integer_type_node		integer_types[itk_long]
-#define long_unsigned_type_node		integer_types[itk_unsigned_long]
-#define long_long_integer_type_node	integer_types[itk_long_long]
-#define long_long_unsigned_type_node	integer_types[itk_unsigned_long_long]
-#define int128_integer_type_node	integer_types[itk_int128]
-#define int128_unsigned_type_node	integer_types[itk_unsigned_int128]
-
-#define NULL_TREE (tree) NULL
-
-/* True if NODE is an erroneous expression.  */
-
-#define error_operand_p(NODE)					\
-  ((NODE) == error_mark_node					\
-   || ((NODE) && TREE_TYPE ((NODE)) == error_mark_node))
-
-extern tree decl_assembler_name (tree);
-
-/* Compute the number of bytes occupied by 'node'.  This routine only
-   looks at TREE_CODE and, if the code is TREE_VEC, TREE_VEC_LENGTH.  */
-
-extern size_t tree_size (const_tree);
-
-/* Compute the number of bytes occupied by a tree with code CODE.  This
-   function cannot be used for TREE_VEC codes, which are of variable
-   length.  */
-extern size_t tree_code_size (enum tree_code);
-
-/* Allocate and return a new UID from the DECL_UID namespace.  */
-extern int allocate_decl_uid (void);
-
-/* Lowest level primitive for allocating a node.
-   The TREE_CODE is the only argument.  Contents are initialized
-   to zero except for a few of the common fields.  */
-
-extern tree make_node_stat (enum tree_code MEM_STAT_DECL);
-#define make_node(t) make_node_stat (t MEM_STAT_INFO)
-
-/* Make a copy of a node, with all the same contents.  */
-
-extern tree copy_node_stat (tree MEM_STAT_DECL);
-#define copy_node(t) copy_node_stat (t MEM_STAT_INFO)
-
-/* Make a copy of a chain of TREE_LIST nodes.  */
-
-extern tree copy_list (tree);
-
-/* Make a CASE_LABEL_EXPR.  */
-
-extern tree build_case_label (tree, tree, tree);
-
-/* Make a BINFO.  */
-extern tree make_tree_binfo_stat (unsigned MEM_STAT_DECL);
-#define make_tree_binfo(t) make_tree_binfo_stat (t MEM_STAT_INFO)
-
-/* Make a TREE_VEC.  */
-
-extern tree make_tree_vec_stat (int MEM_STAT_DECL);
-#define make_tree_vec(t) make_tree_vec_stat (t MEM_STAT_INFO)
-
-/* Grow a TREE_VEC.  */
-
-extern tree grow_tree_vec_stat (tree v, int MEM_STAT_DECL);
-#define grow_tree_vec(v, t) grow_tree_vec_stat (v, t MEM_STAT_INFO)
-
-/* Construct various types of nodes.  */
-
-extern tree build_nt (enum tree_code, ...);
-extern tree build_nt_call_vec (tree, vec<tree, va_gc> *);
-
-extern tree build0_stat (enum tree_code, tree MEM_STAT_DECL);
-#define build0(c,t) build0_stat (c,t MEM_STAT_INFO)
-extern tree build1_stat (enum tree_code, tree, tree MEM_STAT_DECL);
-#define build1(c,t1,t2) build1_stat (c,t1,t2 MEM_STAT_INFO)
-extern tree build2_stat (enum tree_code, tree, tree, tree MEM_STAT_DECL);
-#define build2(c,t1,t2,t3) build2_stat (c,t1,t2,t3 MEM_STAT_INFO)
-extern tree build3_stat (enum tree_code, tree, tree, tree, tree MEM_STAT_DECL);
-#define build3(c,t1,t2,t3,t4) build3_stat (c,t1,t2,t3,t4 MEM_STAT_INFO)
-extern tree build4_stat (enum tree_code, tree, tree, tree, tree,
-			 tree MEM_STAT_DECL);
-#define build4(c,t1,t2,t3,t4,t5) build4_stat (c,t1,t2,t3,t4,t5 MEM_STAT_INFO)
-extern tree build5_stat (enum tree_code, tree, tree, tree, tree, tree,
-			 tree MEM_STAT_DECL);
-#define build5(c,t1,t2,t3,t4,t5,t6) build5_stat (c,t1,t2,t3,t4,t5,t6 MEM_STAT_INFO)
-
-/* _loc versions of build[1-5].  */
-
-static inline tree
-build1_stat_loc (location_t loc, enum tree_code code, tree type,
-		 tree arg1 MEM_STAT_DECL)
-{
-  tree t = build1_stat (code, type, arg1 PASS_MEM_STAT);
-  if (CAN_HAVE_LOCATION_P (t))
-    SET_EXPR_LOCATION (t, loc);
-  return t;
-}
-#define build1_loc(l,c,t1,t2) build1_stat_loc (l,c,t1,t2 MEM_STAT_INFO)
-
-static inline tree
-build2_stat_loc (location_t loc, enum tree_code code, tree type, tree arg0,
-		 tree arg1 MEM_STAT_DECL)
-{
-  tree t = build2_stat (code, type, arg0, arg1 PASS_MEM_STAT);
-  if (CAN_HAVE_LOCATION_P (t))
-    SET_EXPR_LOCATION (t, loc);
-  return t;
-}
-#define build2_loc(l,c,t1,t2,t3) build2_stat_loc (l,c,t1,t2,t3 MEM_STAT_INFO)
-
-static inline tree
-build3_stat_loc (location_t loc, enum tree_code code, tree type, tree arg0,
-		 tree arg1, tree arg2 MEM_STAT_DECL)
-{
-  tree t = build3_stat (code, type, arg0, arg1, arg2 PASS_MEM_STAT);
-  if (CAN_HAVE_LOCATION_P (t))
-    SET_EXPR_LOCATION (t, loc);
-  return t;
-}
-#define build3_loc(l,c,t1,t2,t3,t4) \
-  build3_stat_loc (l,c,t1,t2,t3,t4 MEM_STAT_INFO)
-
-static inline tree
-build4_stat_loc (location_t loc, enum tree_code code, tree type, tree arg0,
-		 tree arg1, tree arg2, tree arg3 MEM_STAT_DECL)
-{
-  tree t = build4_stat (code, type, arg0, arg1, arg2, arg3 PASS_MEM_STAT);
-  if (CAN_HAVE_LOCATION_P (t))
-    SET_EXPR_LOCATION (t, loc);
-  return t;
-}
-#define build4_loc(l,c,t1,t2,t3,t4,t5) \
-  build4_stat_loc (l,c,t1,t2,t3,t4,t5 MEM_STAT_INFO)
-
-static inline tree
-build5_stat_loc (location_t loc, enum tree_code code, tree type, tree arg0,
-		 tree arg1, tree arg2, tree arg3, tree arg4 MEM_STAT_DECL)
-{
-  tree t = build5_stat (code, type, arg0, arg1, arg2, arg3,
-			arg4 PASS_MEM_STAT);
-  if (CAN_HAVE_LOCATION_P (t))
-    SET_EXPR_LOCATION (t, loc);
-  return t;
-}
-#define build5_loc(l,c,t1,t2,t3,t4,t5,t6) \
-  build5_stat_loc (l,c,t1,t2,t3,t4,t5,t6 MEM_STAT_INFO)
-
-extern tree build_var_debug_value_stat (tree, tree MEM_STAT_DECL);
-#define build_var_debug_value(t1,t2) \
-  build_var_debug_value_stat (t1,t2 MEM_STAT_INFO)
-
-/* Constructs double_int from tree CST.  */
-
-static inline double_int
-tree_to_double_int (const_tree cst)
-{
-  return TREE_INT_CST (cst);
-}
-
-extern tree double_int_to_tree (tree, double_int);
-extern bool double_int_fits_to_tree_p (const_tree, double_int);
-extern tree force_fit_type_double (tree, double_int, int, bool);
-
-/* Create an INT_CST node with a CST value zero extended.  */
-
-static inline tree
-build_int_cstu (tree type, unsigned HOST_WIDE_INT cst)
-{
-  return double_int_to_tree (type, double_int::from_uhwi (cst));
-}
-
-extern tree build_int_cst (tree, HOST_WIDE_INT);
-extern tree build_int_cst_type (tree, HOST_WIDE_INT);
-extern tree build_int_cst_wide (tree, unsigned HOST_WIDE_INT, HOST_WIDE_INT);
-extern tree make_vector_stat (unsigned MEM_STAT_DECL);
-#define make_vector(n) make_vector_stat (n MEM_STAT_INFO)
-extern tree build_vector_stat (tree, tree * MEM_STAT_DECL);
-#define build_vector(t,v) build_vector_stat (t, v MEM_STAT_INFO)
-extern tree build_vector_from_ctor (tree, vec<constructor_elt, va_gc> *);
-extern tree build_vector_from_val (tree, tree);
-extern tree build_constructor (tree, vec<constructor_elt, va_gc> *);
-extern tree build_constructor_single (tree, tree, tree);
-extern tree build_constructor_from_list (tree, tree);
-extern tree build_constructor_va (tree, int, ...);
-extern tree build_real_from_int_cst (tree, const_tree);
-extern tree build_complex (tree, tree, tree);
-extern tree build_one_cst (tree);
-extern tree build_minus_one_cst (tree);
-extern tree build_all_ones_cst (tree);
-extern tree build_zero_cst (tree);
-extern tree build_string (int, const char *);
-extern tree build_tree_list_stat (tree, tree MEM_STAT_DECL);
-#define build_tree_list(t, q) build_tree_list_stat (t, q MEM_STAT_INFO)
-extern tree build_tree_list_vec_stat (const vec<tree, va_gc> *MEM_STAT_DECL);
-#define build_tree_list_vec(v) build_tree_list_vec_stat (v MEM_STAT_INFO)
-extern tree build_decl_stat (location_t, enum tree_code,
-			     tree, tree MEM_STAT_DECL);
-extern tree build_fn_decl (const char *, tree);
-#define build_decl(l,c,t,q) build_decl_stat (l, c, t, q MEM_STAT_INFO)
-extern tree build_translation_unit_decl (tree);
-extern tree build_block (tree, tree, tree, tree);
-extern tree build_empty_stmt (location_t);
-extern tree build_omp_clause (location_t, enum omp_clause_code);
-
-extern tree build_vl_exp_stat (enum tree_code, int MEM_STAT_DECL);
-#define build_vl_exp(c, n) build_vl_exp_stat (c, n MEM_STAT_INFO)
-
-extern tree build_call_nary (tree, tree, int, ...);
-extern tree build_call_valist (tree, tree, int, va_list);
-#define build_call_array(T1,T2,N,T3)\
-   build_call_array_loc (UNKNOWN_LOCATION, T1, T2, N, T3)
-extern tree build_call_array_loc (location_t, tree, tree, int, const tree *);
-extern tree build_call_vec (tree, tree, vec<tree, va_gc> *);
-
-/* Construct various nodes representing data types.  */
-
-extern tree signed_or_unsigned_type_for (int, tree);
-extern tree signed_type_for (tree);
-extern tree unsigned_type_for (tree);
-extern tree truth_type_for (tree);
-extern tree build_pointer_type_for_mode (tree, enum machine_mode, bool);
-extern tree build_pointer_type (tree);
-extern tree build_reference_type_for_mode (tree, enum machine_mode, bool);
-extern tree build_reference_type (tree);
-extern tree build_vector_type_for_mode (tree, enum machine_mode);
-extern tree build_vector_type (tree innertype, int nunits);
-extern tree build_opaque_vector_type (tree innertype, int nunits);
-extern tree build_index_type (tree);
-extern tree build_array_type (tree, tree);
-extern tree build_nonshared_array_type (tree, tree);
-extern tree build_array_type_nelts (tree, unsigned HOST_WIDE_INT);
-extern tree build_function_type (tree, tree);
-extern tree build_function_type_list (tree, ...);
-extern tree build_varargs_function_type_list (tree, ...);
-extern tree build_function_type_array (tree, int, tree *);
-extern tree build_varargs_function_type_array (tree, int, tree *);
-#define build_function_type_vec(RET, V) \
-  build_function_type_array (RET, vec_safe_length (V), vec_safe_address (V))
-#define build_varargs_function_type_vec(RET, V) \
-  build_varargs_function_type_array (RET, vec_safe_length (V), \
-				     vec_safe_address (V))
-extern tree build_method_type_directly (tree, tree, tree);
-extern tree build_method_type (tree, tree);
-extern tree build_offset_type (tree, tree);
-extern tree build_complex_type (tree);
-extern tree array_type_nelts (const_tree);
-
-extern tree value_member (tree, tree);
-extern tree purpose_member (const_tree, tree);
-extern bool vec_member (const_tree, vec<tree, va_gc> *);
-extern tree chain_index (int, tree);
-
-extern int attribute_list_equal (const_tree, const_tree);
-extern int attribute_list_contained (const_tree, const_tree);
-extern int tree_int_cst_equal (const_tree, const_tree);
-extern int tree_int_cst_lt (const_tree, const_tree);
-extern int tree_int_cst_compare (const_tree, const_tree);
-extern bool tree_fits_shwi_p (const_tree)
-#ifndef ENABLE_TREE_CHECKING
-  ATTRIBUTE_PURE /* tree_fits_shwi_p is pure only when checking is disabled.  */
-#endif
-  ;
-extern bool tree_fits_uhwi_p (const_tree)
-#ifndef ENABLE_TREE_CHECKING
-  ATTRIBUTE_PURE /* tree_fits_uhwi_p is pure only when checking is disabled.  */
-#endif
-  ;
-extern HOST_WIDE_INT tree_to_shwi (const_tree);
-extern unsigned HOST_WIDE_INT tree_to_uhwi (const_tree);
-#if !defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 4003)
-extern inline __attribute__ ((__gnu_inline__)) HOST_WIDE_INT
-tree_to_shwi (const_tree t)
-{
-  gcc_assert (tree_fits_shwi_p (t));
-  return TREE_INT_CST_LOW (t);
-}
-
-extern inline __attribute__ ((__gnu_inline__)) unsigned HOST_WIDE_INT
-tree_to_uhwi (const_tree t)
-{
-  gcc_assert (tree_fits_uhwi_p (t));
-  return TREE_INT_CST_LOW (t);
-}
-#endif
-extern int tree_int_cst_sgn (const_tree);
-extern int tree_int_cst_sign_bit (const_tree);
-extern unsigned int tree_int_cst_min_precision (tree, bool);
-extern tree strip_array_types (tree);
-extern tree excess_precision_type (tree);
-extern bool valid_constant_size_p (const_tree);
-
-
-/* From expmed.c.  Since rtl.h is included after tree.h, we can't
-   put the prototype here.  Rtl.h does declare the prototype if
-   tree.h had been included.  */
-
-extern tree make_tree (tree, rtx);
-
-/* Return a type like TTYPE except that its TYPE_ATTRIBUTES
-   is ATTRIBUTE.
-
-   Such modified types already made are recorded so that duplicates
-   are not made.  */
-
-extern tree build_type_attribute_variant (tree, tree);
-extern tree build_decl_attribute_variant (tree, tree);
-extern tree build_type_attribute_qual_variant (tree, tree, int);
-
-/* Return 0 if the attributes for two types are incompatible, 1 if they
-   are compatible, and 2 if they are nearly compatible (which causes a
-   warning to be generated).  */
-extern int comp_type_attributes (const_tree, const_tree);
-
-/* Default versions of target-overridable functions.  */
-extern tree merge_decl_attributes (tree, tree);
-extern tree merge_type_attributes (tree, tree);
-
-/* This function is a private implementation detail of lookup_attribute()
-   and you should never call it directly.  */
-extern tree private_lookup_attribute (const char *, size_t, tree);
-
-/* Given an attribute name ATTR_NAME and a list of attributes LIST,
-   return a pointer to the attribute's list element if the attribute
-   is part of the list, or NULL_TREE if not found.  If the attribute
-   appears more than once, this only returns the first occurrence; the
-   TREE_CHAIN of the return value should be passed back in if further
-   occurrences are wanted.  ATTR_NAME must be in the form 'text' (not
-   '__text__').  */
-
-static inline tree
-lookup_attribute (const char *attr_name, tree list)
-{
-  gcc_checking_assert (attr_name[0] != '_');  
-  /* In most cases, list is NULL_TREE.  */
-  if (list == NULL_TREE)
-    return NULL_TREE;
-  else
-    /* Do the strlen() before calling the out-of-line implementation.
-       In most cases attr_name is a string constant, and the compiler
-       will optimize the strlen() away.  */
-    return private_lookup_attribute (attr_name, strlen (attr_name), list);
-}
-
-/* This function is a private implementation detail of
-   is_attribute_p() and you should never call it directly.  */
-extern bool private_is_attribute_p (const char *, size_t, const_tree);
-
-/* Given an identifier node IDENT and a string ATTR_NAME, return true
-   if the identifier node is a valid attribute name for the string.
-   ATTR_NAME must be in the form 'text' (not '__text__').  IDENT could
-   be the identifier for 'text' or for '__text__'.  */
-
-static inline bool
-is_attribute_p (const char *attr_name, const_tree ident)
-{
-  gcc_checking_assert (attr_name[0] != '_');
-  /* Do the strlen() before calling the out-of-line implementation.
-     In most cases attr_name is a string constant, and the compiler
-     will optimize the strlen() away.  */
-  return private_is_attribute_p (attr_name, strlen (attr_name), ident);
-}
-
-/* Remove any instances of attribute ATTR_NAME in LIST and return the
-   modified list.  ATTR_NAME must be in the form 'text' (not
-   '__text__').  */
-
-extern tree remove_attribute (const char *, tree);
-
-/* Given two attributes lists, return a list of their union.  */
-
-extern tree merge_attributes (tree, tree);
-
-#if TARGET_DLLIMPORT_DECL_ATTRIBUTES
-/* Given two Windows decl attributes lists, possibly including
-   dllimport, return a list of their union .  */
-extern tree merge_dllimport_decl_attributes (tree, tree);
-
-/* Handle a "dllimport" or "dllexport" attribute.  */
-extern tree handle_dll_attribute (tree *, tree, tree, int, bool *);
-#endif
-
-/* Check whether CAND is suitable to be returned from get_qualified_type
-   (BASE, TYPE_QUALS).  */
-
-extern bool check_qualified_type (const_tree, const_tree, int);
-
-/* Return a version of the TYPE, qualified as indicated by the
-   TYPE_QUALS, if one exists.  If no qualified version exists yet,
-   return NULL_TREE.  */
-
-extern tree get_qualified_type (tree, int);
-
-/* Like get_qualified_type, but creates the type if it does not
-   exist.  This function never returns NULL_TREE.  */
-
-extern tree build_qualified_type (tree, int);
-
-/* Create a variant of type T with alignment ALIGN.  */
-
-extern tree build_aligned_type (tree, unsigned int);
-
-/* Like build_qualified_type, but only deals with the `const' and
-   `volatile' qualifiers.  This interface is retained for backwards
-   compatibility with the various front-ends; new code should use
-   build_qualified_type instead.  */
-
-#define build_type_variant(TYPE, CONST_P, VOLATILE_P)			\
-  build_qualified_type ((TYPE),						\
-			((CONST_P) ? TYPE_QUAL_CONST : 0)		\
-			| ((VOLATILE_P) ? TYPE_QUAL_VOLATILE : 0))
-
-/* Make a copy of a type node.  */
-
-extern tree build_distinct_type_copy (tree);
-extern tree build_variant_type_copy (tree);
-
-/* Given a hashcode and a ..._TYPE node (for which the hashcode was made),
-   return a canonicalized ..._TYPE node, so that duplicates are not made.
-   How the hash code is computed is up to the caller, as long as any two
-   callers that could hash identical-looking type nodes agree.  */
-
-extern tree type_hash_canon (unsigned int, tree);
-
-extern tree convert (tree, tree);
-extern unsigned int expr_align (const_tree);
-extern tree size_in_bytes (const_tree);
-extern HOST_WIDE_INT int_size_in_bytes (const_tree);
-extern HOST_WIDE_INT max_int_size_in_bytes (const_tree);
-extern tree bit_position (const_tree);
-extern HOST_WIDE_INT int_bit_position (const_tree);
-extern tree byte_position (const_tree);
-extern HOST_WIDE_INT int_byte_position (const_tree);
-
-#define sizetype sizetype_tab[(int) stk_sizetype]
-#define bitsizetype sizetype_tab[(int) stk_bitsizetype]
-#define ssizetype sizetype_tab[(int) stk_ssizetype]
-#define sbitsizetype sizetype_tab[(int) stk_sbitsizetype]
-#define size_int(L) size_int_kind (L, stk_sizetype)
-#define ssize_int(L) size_int_kind (L, stk_ssizetype)
-#define bitsize_int(L) size_int_kind (L, stk_bitsizetype)
-#define sbitsize_int(L) size_int_kind (L, stk_sbitsizetype)
-
-/* Type for sizes of data-type.  */
-
-#define BITS_PER_UNIT_LOG \
-  ((BITS_PER_UNIT > 1) + (BITS_PER_UNIT > 2) + (BITS_PER_UNIT > 4) \
-   + (BITS_PER_UNIT > 8) + (BITS_PER_UNIT > 16) + (BITS_PER_UNIT > 32) \
-   + (BITS_PER_UNIT > 64) + (BITS_PER_UNIT > 128) + (BITS_PER_UNIT > 256))
-
-/* Concatenate two lists (chains of TREE_LIST nodes) X and Y
-   by making the last node in X point to Y.
-   Returns X, except if X is 0 returns Y.  */
-
-extern tree chainon (tree, tree);
-
-/* Make a new TREE_LIST node from specified PURPOSE, VALUE and CHAIN.  */
-
-extern tree tree_cons_stat (tree, tree, tree MEM_STAT_DECL);
-#define tree_cons(t,q,w) tree_cons_stat (t,q,w MEM_STAT_INFO)
-
-/* Return the last tree node in a chain.  */
-
-extern tree tree_last (tree);
-
-/* Reverse the order of elements in a chain, and return the new head.  */
-
-extern tree nreverse (tree);
-
-/* Returns the length of a chain of nodes
-   (number of chain pointers to follow before reaching a null pointer).  */
-
-extern int list_length (const_tree);
-
-/* Returns the first FIELD_DECL in a type.  */
-
-extern tree first_field (const_tree);
-
-/* Given an initializer INIT, return TRUE if INIT is zero or some
-   aggregate of zeros.  Otherwise return FALSE.  */
-
-extern bool initializer_zerop (const_tree);
-
-/* Given a vector VEC, return its first element if all elements are
-   the same.  Otherwise return NULL_TREE.  */
-
-extern tree uniform_vector_p (const_tree);
-
-/* Given a CONSTRUCTOR CTOR, return the element values as a vector.  */
-
-extern vec<tree, va_gc> *ctor_to_vec (tree);
-
-/* integer_zerop (tree x) is nonzero if X is an integer constant of value 0.  */
-
-extern int integer_zerop (const_tree);
-
-/* integer_onep (tree x) is nonzero if X is an integer constant of value 1.  */
-
-extern int integer_onep (const_tree);
-
-/* integer_all_onesp (tree x) is nonzero if X is an integer constant
-   all of whose significant bits are 1.  */
-
-extern int integer_all_onesp (const_tree);
-
-/* integer_minus_onep (tree x) is nonzero if X is an integer constant of
-   value -1.  */
-
-extern int integer_minus_onep (const_tree);
-
-/* integer_pow2p (tree x) is nonzero is X is an integer constant with
-   exactly one bit 1.  */
-
-extern int integer_pow2p (const_tree);
-
-/* integer_nonzerop (tree x) is nonzero if X is an integer constant
-   with a nonzero value.  */
-
-extern int integer_nonzerop (const_tree);
-
-extern bool cst_and_fits_in_hwi (const_tree);
-extern tree num_ending_zeros (const_tree);
-
-/* fixed_zerop (tree x) is nonzero if X is a fixed-point constant of
-   value 0.  */
-
-extern int fixed_zerop (const_tree);
-
-/* staticp (tree x) is nonzero if X is a reference to data allocated
-   at a fixed address in memory.  Returns the outermost data.  */
-
-extern tree staticp (tree);
-
-/* save_expr (EXP) returns an expression equivalent to EXP
-   but it can be used multiple times within context CTX
-   and only evaluate EXP once.  */
-
-extern tree save_expr (tree);
-
-/* Look inside EXPR into any simple arithmetic operations.  Return the
-   outermost non-arithmetic or non-invariant node.  */
-
-extern tree skip_simple_arithmetic (tree);
-
-/* Look inside EXPR into simple arithmetic operations involving constants.
-   Return the outermost non-arithmetic or non-constant node.  */
-
-extern tree skip_simple_constant_arithmetic (tree);
-
-/* Return which tree structure is used by T.  */
-
-enum tree_node_structure_enum tree_node_structure (const_tree);
-
-/* Return true if EXP contains a PLACEHOLDER_EXPR, i.e. if it represents a
-   size or offset that depends on a field within a record.  */
-
-extern bool contains_placeholder_p (const_tree);
-
-/* This macro calls the above function but short-circuits the common
-   case of a constant to save time.  Also check for null.  */
-
-#define CONTAINS_PLACEHOLDER_P(EXP) \
-  ((EXP) != 0 && ! TREE_CONSTANT (EXP) && contains_placeholder_p (EXP))
-
-/* Return true if any part of the structure of TYPE involves a PLACEHOLDER_EXPR
-   directly.  This includes size, bounds, qualifiers (for QUAL_UNION_TYPE) and
-   field positions.  */
-
-extern bool type_contains_placeholder_p (tree);
-
-/* Given a tree EXP, find all occurrences of references to fields
-   in a PLACEHOLDER_EXPR and place them in vector REFS without
-   duplicates.  Also record VAR_DECLs and CONST_DECLs.  Note that
-   we assume here that EXP contains only arithmetic expressions
-   or CALL_EXPRs with PLACEHOLDER_EXPRs occurring only in their
-   argument list.  */
-
-extern void find_placeholder_in_expr (tree, vec<tree> *);
-
-/* This macro calls the above function but short-circuits the common
-   case of a constant to save time and also checks for NULL.  */
-
-#define FIND_PLACEHOLDER_IN_EXPR(EXP, V) \
-do {					 \
-  if((EXP) && !TREE_CONSTANT (EXP))	 \
-    find_placeholder_in_expr (EXP, V);	 \
-} while (0)
-
-/* Given a tree EXP, a FIELD_DECL F, and a replacement value R,
-   return a tree with all occurrences of references to F in a
-   PLACEHOLDER_EXPR replaced by R.  Also handle VAR_DECLs and
-   CONST_DECLs.  Note that we assume here that EXP contains only
-   arithmetic expressions or CALL_EXPRs with PLACEHOLDER_EXPRs
-   occurring only in their argument list.  */
-
-extern tree substitute_in_expr (tree, tree, tree);
-
-/* This macro calls the above function but short-circuits the common
-   case of a constant to save time and also checks for NULL.  */
-
-#define SUBSTITUTE_IN_EXPR(EXP, F, R) \
-  ((EXP) == 0 || TREE_CONSTANT (EXP) ? (EXP) : substitute_in_expr (EXP, F, R))
-
-/* Similar, but look for a PLACEHOLDER_EXPR in EXP and find a replacement
-   for it within OBJ, a tree that is an object or a chain of references.  */
-
-extern tree substitute_placeholder_in_expr (tree, tree);
-
-/* This macro calls the above function but short-circuits the common
-   case of a constant to save time and also checks for NULL.  */
-
-#define SUBSTITUTE_PLACEHOLDER_IN_EXPR(EXP, OBJ) \
-  ((EXP) == 0 || TREE_CONSTANT (EXP) ? (EXP)	\
-   : substitute_placeholder_in_expr (EXP, OBJ))
-
-
-/* stabilize_reference (EXP) returns a reference equivalent to EXP
-   but it can be used multiple times
-   and only evaluate the subexpressions once.  */
-
-extern tree stabilize_reference (tree);
-
-/* Return EXP, stripped of any conversions to wider types
-   in such a way that the result of converting to type FOR_TYPE
-   is the same as if EXP were converted to FOR_TYPE.
-   If FOR_TYPE is 0, it signifies EXP's type.  */
-
-extern tree get_unwidened (tree, tree);
-
-/* Return OP or a simpler expression for a narrower value
-   which can be sign-extended or zero-extended to give back OP.
-   Store in *UNSIGNEDP_PTR either 1 if the value should be zero-extended
-   or 0 if the value should be sign-extended.  */
-
-extern tree get_narrower (tree, int *);
-
-/* Return true if T is an expression that get_inner_reference handles.  */
-
-static inline bool
-handled_component_p (const_tree t)
-{
-  switch (TREE_CODE (t))
-    {
-    case COMPONENT_REF:
-    case BIT_FIELD_REF:
-    case ARRAY_REF:
-    case ARRAY_RANGE_REF:
-    case REALPART_EXPR:
-    case IMAGPART_EXPR:
-    case VIEW_CONVERT_EXPR:
-      return true;
-
-    default:
-      return false;
-    }
-}
-
-/* Given a DECL or TYPE, return the scope in which it was declared, or
-   NUL_TREE if there is no containing scope.  */
-
-extern tree get_containing_scope (const_tree);
-
-/* Return the FUNCTION_DECL which provides this _DECL with its context,
-   or zero if none.  */
-extern tree decl_function_context (const_tree);
-
-/* Return the RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE which provides
-   this _DECL with its context, or zero if none.  */
-extern tree decl_type_context (const_tree);
-
-/* Return 1 if EXPR is the real constant zero.  */
-extern int real_zerop (const_tree);
-
-/* Initialize the iterator I with arguments from function FNDECL  */
-
-static inline void
-function_args_iter_init (function_args_iterator *i, const_tree fntype)
-{
-  i->next = TYPE_ARG_TYPES (fntype);
-}
-
-/* Return a pointer that holds the next argument if there are more arguments to
-   handle, otherwise return NULL.  */
-
-static inline tree *
-function_args_iter_cond_ptr (function_args_iterator *i)
-{
-  return (i->next) ? &TREE_VALUE (i->next) : NULL;
-}
-
-/* Return the next argument if there are more arguments to handle, otherwise
-   return NULL.  */
-
-static inline tree
-function_args_iter_cond (function_args_iterator *i)
-{
-  return (i->next) ? TREE_VALUE (i->next) : NULL_TREE;
-}
-
-/* Advance to the next argument.  */
-static inline void
-function_args_iter_next (function_args_iterator *i)
-{
-  gcc_assert (i->next != NULL_TREE);
-  i->next = TREE_CHAIN (i->next);
-}
-
-/* We set BLOCK_SOURCE_LOCATION only to inlined function entry points.  */
-
-static inline bool
-inlined_function_outer_scope_p (const_tree block)
-{
- return LOCATION_LOCUS (BLOCK_SOURCE_LOCATION (block)) != UNKNOWN_LOCATION;
-}
-
-/* Loop over all function arguments of FNTYPE.  In each iteration, PTR is set
-   to point to the next tree element.  ITER is an instance of
-   function_args_iterator used to iterate the arguments.  */
-#define FOREACH_FUNCTION_ARGS_PTR(FNTYPE, PTR, ITER)			\
-  for (function_args_iter_init (&(ITER), (FNTYPE));			\
-       (PTR = function_args_iter_cond_ptr (&(ITER))) != NULL;		\
-       function_args_iter_next (&(ITER)))
-
-/* Loop over all function arguments of FNTYPE.  In each iteration, TREE is set
-   to the next tree element.  ITER is an instance of function_args_iterator
-   used to iterate the arguments.  */
-#define FOREACH_FUNCTION_ARGS(FNTYPE, TREE, ITER)			\
-  for (function_args_iter_init (&(ITER), (FNTYPE));			\
-       (TREE = function_args_iter_cond (&(ITER))) != NULL_TREE;		\
-       function_args_iter_next (&(ITER)))
-
-/* In tree.c */
-extern unsigned crc32_string (unsigned, const char *);
-extern unsigned crc32_byte (unsigned, char);
-extern unsigned crc32_unsigned (unsigned, unsigned);
-extern void clean_symbol_name (char *);
-extern tree get_file_function_name (const char *);
-extern tree get_callee_fndecl (const_tree);
-extern int type_num_arguments (const_tree);
-extern bool associative_tree_code (enum tree_code);
-extern bool commutative_tree_code (enum tree_code);
-extern bool commutative_ternary_tree_code (enum tree_code);
-extern tree upper_bound_in_type (tree, tree);
-extern tree lower_bound_in_type (tree, tree);
-extern int operand_equal_for_phi_arg_p (const_tree, const_tree);
-extern tree create_artificial_label (location_t);
-extern const char *get_name (tree);
-extern bool stdarg_p (const_tree);
-extern bool prototype_p (tree);
-extern bool is_typedef_decl (tree x);
-extern bool typedef_variant_p (tree);
-extern bool auto_var_in_fn_p (const_tree, const_tree);
-extern tree build_low_bits_mask (tree, unsigned);
-extern tree tree_strip_nop_conversions (tree);
-extern tree tree_strip_sign_nop_conversions (tree);
-extern const_tree strip_invariant_refs (const_tree);
-extern tree lhd_gcc_personality (void);
-extern void assign_assembler_name_if_neeeded (tree);
-extern void warn_deprecated_use (tree, tree);
-extern void cache_integer_cst (tree);
-
-/* Compare and hash for any structure which begins with a canonical
-   pointer.  Assumes all pointers are interchangeable, which is sort
-   of already assumed by gcc elsewhere IIRC.  */
-
-static inline int
-struct_ptr_eq (const void *a, const void *b)
-{
-  const void * const * x = (const void * const *) a;
-  const void * const * y = (const void * const *) b;
-  return *x == *y;
-}
-
-static inline hashval_t
-struct_ptr_hash (const void *a)
-{
-  const void * const * x = (const void * const *) a;
-  return (intptr_t)*x >> 4;
-}
-
-/* Return nonzero if CODE is a tree code that represents a truth value.  */
-static inline bool
-truth_value_p (enum tree_code code)
-{
-  return (TREE_CODE_CLASS (code) == tcc_comparison
-	  || code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
-	  || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
-	  || code == TRUTH_XOR_EXPR || code == TRUTH_NOT_EXPR);
-}
-
-/* Return whether TYPE is a type suitable for an offset for
-   a POINTER_PLUS_EXPR.  */
-static inline bool
-ptrofftype_p (tree type)
-{
-  return (INTEGRAL_TYPE_P (type)
-	  && TYPE_PRECISION (type) == TYPE_PRECISION (sizetype)
-	  && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (sizetype));
-}
-
-/* Return OFF converted to a pointer offset type suitable as offset for
-   POINTER_PLUS_EXPR.  Use location LOC for this conversion.  */
-static inline tree
-convert_to_ptrofftype_loc (location_t loc, tree off)
-{
-  return fold_convert_loc (loc, sizetype, off);
-}
-#define convert_to_ptrofftype(t) convert_to_ptrofftype_loc (UNKNOWN_LOCATION, t)
-
-/* Build and fold a POINTER_PLUS_EXPR at LOC offsetting PTR by OFF.  */
-static inline tree
-fold_build_pointer_plus_loc (location_t loc, tree ptr, tree off)
-{
-  return fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (ptr),
-			  ptr, fold_convert_loc (loc, sizetype, off));
-}
-#define fold_build_pointer_plus(p,o) \
-	fold_build_pointer_plus_loc (UNKNOWN_LOCATION, p, o)
-
-/* Build and fold a POINTER_PLUS_EXPR at LOC offsetting PTR by OFF.  */
-static inline tree
-fold_build_pointer_plus_hwi_loc (location_t loc, tree ptr, HOST_WIDE_INT off)
-{
-  return fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (ptr),
-			  ptr, size_int (off));
-}
-#define fold_build_pointer_plus_hwi(p,o) \
-	fold_build_pointer_plus_hwi_loc (UNKNOWN_LOCATION, p, o)
-
-extern tree strip_float_extensions (tree);
-extern int really_constant_p (const_tree);
-extern bool decl_address_invariant_p (const_tree);
-extern bool decl_address_ip_invariant_p (const_tree);
-extern bool int_fits_type_p (const_tree, const_tree);
-#ifndef GENERATOR_FILE
-extern void get_type_static_bounds (const_tree, mpz_t, mpz_t);
-#endif
-extern bool variably_modified_type_p (tree, tree);
-extern int tree_log2 (const_tree);
-extern int tree_floor_log2 (const_tree);
-extern unsigned int tree_ctz (const_tree);
-extern int simple_cst_equal (const_tree, const_tree);
-extern hashval_t iterative_hash_expr (const_tree, hashval_t);
-extern hashval_t iterative_hash_host_wide_int (HOST_WIDE_INT, hashval_t);
-extern hashval_t iterative_hash_hashval_t (hashval_t, hashval_t);
-extern hashval_t iterative_hash_host_wide_int (HOST_WIDE_INT, hashval_t);
-extern int compare_tree_int (const_tree, unsigned HOST_WIDE_INT);
-extern int type_list_equal (const_tree, const_tree);
-extern int chain_member (const_tree, const_tree);
-extern void dump_tree_statistics (void);
-extern void recompute_tree_invariant_for_addr_expr (tree);
-extern bool needs_to_live_in_memory (const_tree);
-extern tree reconstruct_complex_type (tree, tree);
-extern int real_onep (const_tree);
-extern int real_minus_onep (const_tree);
-extern void init_ttree (void);
-extern void build_common_tree_nodes (bool, bool);
-extern void build_common_builtin_nodes (void);
-extern tree build_nonstandard_integer_type (unsigned HOST_WIDE_INT, int);
-extern tree build_range_type (tree, tree, tree);
-extern tree build_nonshared_range_type (tree, tree, tree);
-extern bool subrange_type_for_debug_p (const_tree, tree *, tree *);
-extern HOST_WIDE_INT int_cst_value (const_tree);
-extern HOST_WIDEST_INT widest_int_cst_value (const_tree);
-extern tree tree_block (tree);
-extern void tree_set_block (tree, tree);
-extern location_t *block_nonartificial_location (tree);
-extern location_t tree_nonartificial_location (tree);
-extern tree block_ultimate_origin (const_tree);
-extern tree get_binfo_at_offset (tree, HOST_WIDE_INT, tree);
-extern bool virtual_method_call_p (tree);
-extern tree obj_type_ref_class (tree ref);
-extern bool types_same_for_odr (tree type1, tree type2);
-extern bool contains_bitfld_component_ref_p (const_tree);
-extern bool type_in_anonymous_namespace_p (tree);
-extern bool block_may_fallthru (const_tree);
-extern void using_eh_for_cleanups (void);
-extern bool using_eh_for_cleanups_p (void);
-extern const char *get_tree_code_name (enum tree_code);
-extern void set_call_expr_flags (tree, int);
-extern tree walk_tree_1 (tree*, walk_tree_fn, void*, struct pointer_set_t*,
-			 walk_tree_lh);
-extern tree walk_tree_without_duplicates_1 (tree*, walk_tree_fn, void*,
-					    walk_tree_lh);
-#define walk_tree(a,b,c,d) \
-	walk_tree_1 (a, b, c, d, NULL)
-#define walk_tree_without_duplicates(a,b,c) \
-	walk_tree_without_duplicates_1 (a, b, c, NULL)
-
-extern tree get_base_address (tree t);
-extern tree drop_tree_overflow (tree);
-extern int tree_map_base_eq (const void *, const void *);
-extern unsigned int tree_map_base_hash (const void *);
-extern int tree_map_base_marked_p (const void *);
-
-#define tree_map_eq tree_map_base_eq
-extern unsigned int tree_map_hash (const void *);
-#define tree_map_marked_p tree_map_base_marked_p
-
-#define tree_decl_map_eq tree_map_base_eq
-extern unsigned int tree_decl_map_hash (const void *);
-#define tree_decl_map_marked_p tree_map_base_marked_p
-
-#define tree_int_map_eq tree_map_base_eq
-#define tree_int_map_hash tree_map_base_hash
-#define tree_int_map_marked_p tree_map_base_marked_p
-
-#define tree_priority_map_eq tree_map_base_eq
-#define tree_priority_map_hash tree_map_base_hash
-#define tree_priority_map_marked_p tree_map_base_marked_p
-
-#define tree_vec_map_eq tree_map_base_eq
-#define tree_vec_map_hash tree_decl_map_hash
-#define tree_vec_map_marked_p tree_map_base_marked_p
-
-/* Initialize the abstract argument list iterator object ITER with the
-   arguments from CALL_EXPR node EXP.  */
-static inline void
-init_call_expr_arg_iterator (tree exp, call_expr_arg_iterator *iter)
-{
-  iter->t = exp;
-  iter->n = call_expr_nargs (exp);
-  iter->i = 0;
-}
-
-static inline void
-init_const_call_expr_arg_iterator (const_tree exp, const_call_expr_arg_iterator *iter)
-{
-  iter->t = exp;
-  iter->n = call_expr_nargs (exp);
-  iter->i = 0;
-}
-
-/* Return the next argument from abstract argument list iterator object ITER,
-   and advance its state.  Return NULL_TREE if there are no more arguments.  */
-static inline tree
-next_call_expr_arg (call_expr_arg_iterator *iter)
-{
-  tree result;
-  if (iter->i >= iter->n)
-    return NULL_TREE;
-  result = CALL_EXPR_ARG (iter->t, iter->i);
-  iter->i++;
-  return result;
-}
-
-static inline const_tree
-next_const_call_expr_arg (const_call_expr_arg_iterator *iter)
-{
-  const_tree result;
-  if (iter->i >= iter->n)
-    return NULL_TREE;
-  result = CALL_EXPR_ARG (iter->t, iter->i);
-  iter->i++;
-  return result;
-}
-
-/* Initialize the abstract argument list iterator object ITER, then advance
-   past and return the first argument.  Useful in for expressions, e.g.
-     for (arg = first_call_expr_arg (exp, &iter); arg;
-          arg = next_call_expr_arg (&iter))   */
-static inline tree
-first_call_expr_arg (tree exp, call_expr_arg_iterator *iter)
-{
-  init_call_expr_arg_iterator (exp, iter);
-  return next_call_expr_arg (iter);
-}
-
-static inline const_tree
-first_const_call_expr_arg (const_tree exp, const_call_expr_arg_iterator *iter)
-{
-  init_const_call_expr_arg_iterator (exp, iter);
-  return next_const_call_expr_arg (iter);
-}
-
-/* Test whether there are more arguments in abstract argument list iterator
-   ITER, without changing its state.  */
-static inline bool
-more_call_expr_args_p (const call_expr_arg_iterator *iter)
-{
-  return (iter->i < iter->n);
-}
-
-/* Iterate through each argument ARG of CALL_EXPR CALL, using variable ITER
-   (of type call_expr_arg_iterator) to hold the iteration state.  */
-#define FOR_EACH_CALL_EXPR_ARG(arg, iter, call)			\
-  for ((arg) = first_call_expr_arg ((call), &(iter)); (arg);	\
-       (arg) = next_call_expr_arg (&(iter)))
-
-#define FOR_EACH_CONST_CALL_EXPR_ARG(arg, iter, call)			\
-  for ((arg) = first_const_call_expr_arg ((call), &(iter)); (arg);	\
-       (arg) = next_const_call_expr_arg (&(iter)))
-
-/* Return true if tree node T is a language-specific node.  */
-static inline bool
-is_lang_specific (tree t)
-{
-  return TREE_CODE (t) == LANG_TYPE || TREE_CODE (t) >= NUM_TREE_CODES;
-}
-
-/* Valid builtin number.  */
-#define BUILTIN_VALID_P(FNCODE) \
-  (IN_RANGE ((int)FNCODE, ((int)BUILT_IN_NONE) + 1, ((int) END_BUILTINS) - 1))
-
-/* Return the tree node for an explicit standard builtin function or NULL.  */
-static inline tree
-builtin_decl_explicit (enum built_in_function fncode)
-{
-  gcc_checking_assert (BUILTIN_VALID_P (fncode));
-
-  return builtin_info.decl[(size_t)fncode];
-}
-
-/* Return the tree node for an implicit builtin function or NULL.  */
-static inline tree
-builtin_decl_implicit (enum built_in_function fncode)
-{
-  size_t uns_fncode = (size_t)fncode;
-  gcc_checking_assert (BUILTIN_VALID_P (fncode));
-
-  if (!builtin_info.implicit_p[uns_fncode])
-    return NULL_TREE;
-
-  return builtin_info.decl[uns_fncode];
-}
-
-/* Set explicit builtin function nodes and whether it is an implicit
-   function.  */
-
-static inline void
-set_builtin_decl (enum built_in_function fncode, tree decl, bool implicit_p)
-{
-  size_t ufncode = (size_t)fncode;
-
-  gcc_checking_assert (BUILTIN_VALID_P (fncode)
-		       && (decl != NULL_TREE || !implicit_p));
-
-  builtin_info.decl[ufncode] = decl;
-  builtin_info.implicit_p[ufncode] = implicit_p;
-}
-
-/* Set the implicit flag for a builtin function.  */
-
-static inline void
-set_builtin_decl_implicit_p (enum built_in_function fncode, bool implicit_p)
-{
-  size_t uns_fncode = (size_t)fncode;
-
-  gcc_checking_assert (BUILTIN_VALID_P (fncode)
-		       && builtin_info.decl[uns_fncode] != NULL_TREE);
-
-  builtin_info.implicit_p[uns_fncode] = implicit_p;
-}
-
-/* Return whether the standard builtin function can be used as an explicit
-   function.  */
-
-static inline bool
-builtin_decl_explicit_p (enum built_in_function fncode)
-{
-  gcc_checking_assert (BUILTIN_VALID_P (fncode));
-  return (builtin_info.decl[(size_t)fncode] != NULL_TREE);
-}
-
-/* Return whether the standard builtin function can be used implicitly.  */
-
-static inline bool
-builtin_decl_implicit_p (enum built_in_function fncode)
-{
-  size_t uns_fncode = (size_t)fncode;
-
-  gcc_checking_assert (BUILTIN_VALID_P (fncode));
-  return (builtin_info.decl[uns_fncode] != NULL_TREE
-	  && builtin_info.implicit_p[uns_fncode]);
-}
-
-/* Return true if T (assumed to be a DECL) is a global variable.
-   A variable is considered global if its storage is not automatic.  */
-
-static inline bool
-is_global_var (const_tree t)
-{
-  return (TREE_STATIC (t) || DECL_EXTERNAL (t));
-}
-
-/* Return true if VAR may be aliased.  A variable is considered as
-   maybe aliased if it has its address taken by the local TU
-   or possibly by another TU and might be modified through a pointer.  */
-
-static inline bool
-may_be_aliased (const_tree var)
-{
-  return (TREE_CODE (var) != CONST_DECL
-	  && (TREE_PUBLIC (var)
-	      || DECL_EXTERNAL (var)
-	      || TREE_ADDRESSABLE (var))
-	  && !((TREE_STATIC (var) || TREE_PUBLIC (var) || DECL_EXTERNAL (var))
-	       && ((TREE_READONLY (var)
-		    && !TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (var)))
-		   || (TREE_CODE (var) == VAR_DECL
-		       && DECL_NONALIASED (var)))));
-}
-
-/* Return pointer to optimization flags of FNDECL.  */
-static inline struct cl_optimization *
-opts_for_fn (const_tree fndecl)
-{
-  tree fn_opts = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
-  if (fn_opts == NULL_TREE)
-    fn_opts = optimization_default_node;
-  return TREE_OPTIMIZATION (fn_opts);
-}
-
-/* opt flag for function FNDECL, e.g. opts_for_fn (fndecl, optimize) is
-   the optimization level of function fndecl.  */
-#define opt_for_fn(fndecl, opt) (opts_for_fn (fndecl)->x_##opt)
-
-/* For anonymous aggregate types, we need some sort of name to
-   hold on to.  In practice, this should not appear, but it should
-   not be harmful if it does.  */
-#ifndef NO_DOT_IN_LABEL
-#define ANON_AGGRNAME_FORMAT "._%d"
-#define ANON_AGGRNAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[0] == '.' \
-				  && IDENTIFIER_POINTER (ID_NODE)[1] == '_')
-#else /* NO_DOT_IN_LABEL */
-#ifndef NO_DOLLAR_IN_LABEL
-#define ANON_AGGRNAME_FORMAT "$_%d"
-#define ANON_AGGRNAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[0] == '$' \
-				  && IDENTIFIER_POINTER (ID_NODE)[1] == '_')
-#else /* NO_DOLLAR_IN_LABEL */
-#define ANON_AGGRNAME_PREFIX "__anon_"
-#define ANON_AGGRNAME_P(ID_NODE) \
-  (!strncmp (IDENTIFIER_POINTER (ID_NODE), ANON_AGGRNAME_PREFIX, \
-	     sizeof (ANON_AGGRNAME_PREFIX) - 1))
-#define ANON_AGGRNAME_FORMAT "__anon_%d"
-#endif	/* NO_DOLLAR_IN_LABEL */
-#endif	/* NO_DOT_IN_LABEL */
-
-/* FIXME - These declarations belong in builtins.h, expr.h and emit-rtl.h,
-   but none of these files are allowed to be included from front ends.
-   They should be split in two. One suitable for the FEs, the other suitable
-   for the BE.  */
-
-/* Assign the RTX to declaration.  */
-extern void set_decl_rtl (tree, rtx);
-extern bool complete_ctor_at_level_p (const_tree, HOST_WIDE_INT, const_tree);
-
-/* Return a tree representing the upper bound of the array mentioned in
-   EXP, an ARRAY_REF or an ARRAY_RANGE_REF.  */
-extern tree array_ref_up_bound (tree);
-
-extern tree build_personality_function (const char *);
-
-/* Given an expression EXP that is a handled_component_p,
-   look for the ultimate containing object, which is returned and specify
-   the access position and size.  */
-extern tree get_inner_reference (tree, HOST_WIDE_INT *, HOST_WIDE_INT *,
-				 tree *, enum machine_mode *, int *, int *,
-				 bool);
-
-/* Return a tree representing the lower bound of the array mentioned in
-   EXP, an ARRAY_REF or an ARRAY_RANGE_REF.  */
-extern tree array_ref_low_bound (tree);
-
-/* In builtins.c.  */
-
-/* Non-zero if __builtin_constant_p should be folded right away.  */
-extern bool force_folding_builtin_constant_p;
-
-extern bool avoid_folding_inline_builtin (tree);
-extern tree fold_call_expr (location_t, tree, bool);
-extern tree fold_builtin_fputs (location_t, tree, tree, bool, bool, tree);
-extern tree fold_builtin_strcpy (location_t, tree, tree, tree, tree);
-extern tree fold_builtin_strncpy (location_t, tree, tree, tree, tree, tree);
-extern tree fold_builtin_strcat (location_t, tree, tree, tree);
-extern tree fold_builtin_memory_chk (location_t, tree, tree, tree, tree, tree, tree, bool,
-				     enum built_in_function);
-extern tree fold_builtin_stxcpy_chk (location_t, tree, tree, tree, tree, tree, bool,
-				     enum built_in_function);
-extern tree fold_builtin_stxncpy_chk (location_t, tree, tree, tree, tree, tree, bool,
-				      enum built_in_function);
-extern tree fold_builtin_expect (location_t, tree, tree, tree);
-extern bool fold_builtin_next_arg (tree, bool);
-extern enum built_in_function builtin_mathfn_code (const_tree);
-extern tree fold_builtin_call_array (location_t, tree, tree, int, tree *);
-extern tree build_call_expr_loc_array (location_t, tree, int, tree *);
-extern tree build_call_expr_loc_vec (location_t, tree, vec<tree, va_gc> *);
-extern tree build_call_expr_loc (location_t, tree, int, ...);
-extern tree build_call_expr (tree, int, ...);
-extern tree mathfn_built_in (tree, enum built_in_function fn);
-extern tree c_strlen (tree, int);
-extern tree build_string_literal (int, const char *);
-extern rtx builtin_memset_read_str (void *, HOST_WIDE_INT, enum machine_mode);
-extern bool is_builtin_fn (tree);
-extern bool get_object_alignment_1 (tree, unsigned int *,
-				    unsigned HOST_WIDE_INT *);
-extern unsigned int get_object_alignment (tree);
-extern bool get_pointer_alignment_1 (tree, unsigned int *,
-				     unsigned HOST_WIDE_INT *);
-extern unsigned int get_pointer_alignment (tree);
-extern tree fold_call_stmt (gimple, bool);
-extern tree gimple_fold_builtin_snprintf_chk (gimple, tree, enum built_in_function);
-extern void set_builtin_user_assembler_name (tree decl, const char *asmspec);
-extern bool is_simple_builtin (tree);
-extern bool is_inexpensive_builtin (tree);
-
-#endif  /* GCC_TREE_H  */
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/treestruct.def b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/treestruct.def
deleted file mode 100644
index 7d620fb..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/treestruct.def
+++ /dev/null
@@ -1,70 +0,0 @@
-/* This file contains the definitions for the tree structure
-   enumeration used in GCC.
-
-Copyright (C) 2005-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-/* The format of this file is
-
-   DEFTREESTRUCT(enumeration value, printable name).
-
-   Each enumeration value should correspond with a single member of
-   union tree_node.
-
-   These enumerator values are used in order to distinguish members of
-   union tree_node for garbage collection purposes, as well as
-   specifying what structures contain what other structures in the
-   tree_contains_struct array.  */
-DEFTREESTRUCT(TS_BASE, "base")
-DEFTREESTRUCT(TS_TYPED, "typed")
-DEFTREESTRUCT(TS_COMMON, "common")
-DEFTREESTRUCT(TS_INT_CST, "integer cst")
-DEFTREESTRUCT(TS_REAL_CST, "real cst")
-DEFTREESTRUCT(TS_FIXED_CST, "fixed cst")
-DEFTREESTRUCT(TS_VECTOR, "vector")
-DEFTREESTRUCT(TS_STRING, "string")
-DEFTREESTRUCT(TS_COMPLEX, "complex")
-DEFTREESTRUCT(TS_IDENTIFIER, "identifier")
-DEFTREESTRUCT(TS_DECL_MINIMAL, "decl minimal")
-DEFTREESTRUCT(TS_DECL_COMMON, "decl common")
-DEFTREESTRUCT(TS_DECL_WRTL, "decl with RTL")
-DEFTREESTRUCT(TS_DECL_NON_COMMON, "decl non-common")
-DEFTREESTRUCT(TS_DECL_WITH_VIS, "decl with visibility")
-DEFTREESTRUCT(TS_FIELD_DECL, "field decl")
-DEFTREESTRUCT(TS_VAR_DECL, "var decl")
-DEFTREESTRUCT(TS_PARM_DECL, "parm decl")
-DEFTREESTRUCT(TS_LABEL_DECL, "label decl")
-DEFTREESTRUCT(TS_RESULT_DECL, "result decl")
-DEFTREESTRUCT(TS_CONST_DECL, "const decl")
-DEFTREESTRUCT(TS_TYPE_DECL, "type decl")
-DEFTREESTRUCT(TS_FUNCTION_DECL, "function decl")
-DEFTREESTRUCT(TS_TRANSLATION_UNIT_DECL, "translation-unit decl")
-DEFTREESTRUCT(TS_TYPE_COMMON, "type common")
-DEFTREESTRUCT(TS_TYPE_WITH_LANG_SPECIFIC, "type with lang-specific")
-DEFTREESTRUCT(TS_TYPE_NON_COMMON, "type non-common")
-DEFTREESTRUCT(TS_LIST, "list")
-DEFTREESTRUCT(TS_VEC, "vec")
-DEFTREESTRUCT(TS_EXP, "exp")
-DEFTREESTRUCT(TS_SSA_NAME, "ssa name")
-DEFTREESTRUCT(TS_BLOCK, "block")
-DEFTREESTRUCT(TS_BINFO, "binfo")
-DEFTREESTRUCT(TS_STATEMENT_LIST, "statement list")
-DEFTREESTRUCT(TS_CONSTRUCTOR, "constructor")
-DEFTREESTRUCT(TS_OMP_CLAUSE, "omp clause")
-DEFTREESTRUCT(TS_OPTIMIZATION, "optimization options")
-DEFTREESTRUCT(TS_TARGET_OPTION, "target options")
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/varasm.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/varasm.h
deleted file mode 100644
index 01b0850..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/varasm.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* Declarations for varasm.h.
-   Copyright (C) 2013-2014 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_VARASM_H
-#define GCC_VARASM_H
-
-extern tree tree_output_constant_def (tree);
-extern void make_decl_rtl (tree);
-extern rtx make_decl_rtl_for_debug (tree);
-extern void make_decl_one_only (tree, tree);
-extern int supports_one_only (void);
-extern void resolve_unique_section (tree, int, int);
-extern void mark_referenced (tree);
-extern void mark_decl_referenced (tree);
-extern void notice_global_symbol (tree);
-extern void set_user_assembler_name (tree, const char *);
-extern void process_pending_assemble_externals (void);
-extern bool decl_replaceable_p (tree);
-extern bool decl_binds_to_current_def_p (tree);
-extern enum tls_model decl_default_tls_model (const_tree);
-
-/* Declare DECL to be a weak symbol.  */
-extern void declare_weak (tree);
-
-/* Merge weak status.  */
-extern void merge_weak (tree, tree);
-
-/* Make one symbol an alias for another.  */
-extern void assemble_alias (tree, tree);
-
-/* Return nonzero if VALUE is a valid constant-valued expression
-   for use in initializing a static variable; one that can be an
-   element of a "constant" initializer.
-
-   Return null_pointer_node if the value is absolute;
-   if it is relocatable, return the variable that determines the relocation.
-   We assume that VALUE has been folded as much as possible;
-   therefore, we do not need to check for such things as
-   arithmetic-combinations of integers.  */
-extern tree initializer_constant_valid_p (tree, tree);
-
-/* Return true if VALUE is a valid constant-valued expression
-   for use in initializing a static bit-field; one that can be
-   an element of a "constant" initializer.  */
-extern bool initializer_constant_valid_for_bitfield_p (tree);
-
-/* Whether a constructor CTOR is a valid static constant initializer if all
-   its elements are.  This used to be internal to initializer_constant_valid_p
-   and has been exposed to let other functions like categorize_ctor_elements
-   evaluate the property while walking a constructor for other purposes.  */
-extern bool constructor_static_from_elts_p (const_tree);
-
-#endif  // GCC_VARASM_H
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/vec.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/vec.h
deleted file mode 100644
index 5873023..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/vec.h
+++ /dev/null
@@ -1,1727 +0,0 @@
-/* Vector API for GNU compiler.
-   Copyright (C) 2004-2014 Free Software Foundation, Inc.
-   Contributed by Nathan Sidwell <nathan@codesourcery.com>
-   Re-implemented in C++ by Diego Novillo <dnovillo@google.com>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC 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 General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3.  If not see
-<http://www.gnu.org/licenses/>.  */
-
-#ifndef GCC_VEC_H
-#define GCC_VEC_H
-
-/* FIXME - When compiling some of the gen* binaries, we cannot enable GC
-   support because the headers generated by gengtype are still not
-   present.  In particular, the header file gtype-desc.h is missing,
-   so compilation may fail if we try to include ggc.h.
-
-   Since we use some of those declarations, we need to provide them
-   (even if the GC-based templates are not used).  This is not a
-   problem because the code that runs before gengtype is built will
-   never need to use GC vectors.  But it does force us to declare
-   these functions more than once.  */
-#ifdef GENERATOR_FILE
-#define VEC_GC_ENABLED	0
-#else
-#define VEC_GC_ENABLED	1
-#endif	// GENERATOR_FILE
-
-#include "statistics.h"		// For CXX_MEM_STAT_INFO.
-
-#if VEC_GC_ENABLED
-#include "ggc.h"
-#else
-# ifndef GCC_GGC_H
-  /* Even if we think that GC is not enabled, the test that sets it is
-     weak.  There are files compiled with -DGENERATOR_FILE that already
-     include ggc.h.  We only need to provide these definitions if ggc.h
-     has not been included.  Sigh.  */
-  extern void ggc_free (void *);
-  extern size_t ggc_round_alloc_size (size_t requested_size);
-  extern void *ggc_realloc_stat (void *, size_t MEM_STAT_DECL);
-#  endif  // GCC_GGC_H
-#endif	// VEC_GC_ENABLED
-
-/* Templated vector type and associated interfaces.
-
-   The interface functions are typesafe and use inline functions,
-   sometimes backed by out-of-line generic functions.  The vectors are
-   designed to interoperate with the GTY machinery.
-
-   There are both 'index' and 'iterate' accessors.  The index accessor
-   is implemented by operator[].  The iterator returns a boolean
-   iteration condition and updates the iteration variable passed by
-   reference.  Because the iterator will be inlined, the address-of
-   can be optimized away.
-
-   Each operation that increases the number of active elements is
-   available in 'quick' and 'safe' variants.  The former presumes that
-   there is sufficient allocated space for the operation to succeed
-   (it dies if there is not).  The latter will reallocate the
-   vector, if needed.  Reallocation causes an exponential increase in
-   vector size.  If you know you will be adding N elements, it would
-   be more efficient to use the reserve operation before adding the
-   elements with the 'quick' operation.  This will ensure there are at
-   least as many elements as you ask for, it will exponentially
-   increase if there are too few spare slots.  If you want reserve a
-   specific number of slots, but do not want the exponential increase
-   (for instance, you know this is the last allocation), use the
-   reserve_exact operation.  You can also create a vector of a
-   specific size from the get go.
-
-   You should prefer the push and pop operations, as they append and
-   remove from the end of the vector. If you need to remove several
-   items in one go, use the truncate operation.  The insert and remove
-   operations allow you to change elements in the middle of the
-   vector.  There are two remove operations, one which preserves the
-   element ordering 'ordered_remove', and one which does not
-   'unordered_remove'.  The latter function copies the end element
-   into the removed slot, rather than invoke a memmove operation.  The
-   'lower_bound' function will determine where to place an item in the
-   array using insert that will maintain sorted order.
-
-   Vectors are template types with three arguments: the type of the
-   elements in the vector, the allocation strategy, and the physical
-   layout to use
-
-   Four allocation strategies are supported:
-
-	- Heap: allocation is done using malloc/free.  This is the
-	  default allocation strategy.
-
-  	- GC: allocation is done using ggc_alloc/ggc_free.
-
-  	- GC atomic: same as GC with the exception that the elements
-	  themselves are assumed to be of an atomic type that does
-	  not need to be garbage collected.  This means that marking
-	  routines do not need to traverse the array marking the
-	  individual elements.  This increases the performance of
-	  GC activities.
-
-   Two physical layouts are supported:
-
-	- Embedded: The vector is structured using the trailing array
-	  idiom.  The last member of the structure is an array of size
-	  1.  When the vector is initially allocated, a single memory
-	  block is created to hold the vector's control data and the
-	  array of elements.  These vectors cannot grow without
-	  reallocation (see discussion on embeddable vectors below).
-
-	- Space efficient: The vector is structured as a pointer to an
-	  embedded vector.  This is the default layout.  It means that
-	  vectors occupy a single word of storage before initial
-	  allocation.  Vectors are allowed to grow (the internal
-	  pointer is reallocated but the main vector instance does not
-	  need to relocate).
-
-   The type, allocation and layout are specified when the vector is
-   declared.
-
-   If you need to directly manipulate a vector, then the 'address'
-   accessor will return the address of the start of the vector.  Also
-   the 'space' predicate will tell you whether there is spare capacity
-   in the vector.  You will not normally need to use these two functions.
-
-   Notes on the different layout strategies
-
-   * Embeddable vectors (vec<T, A, vl_embed>)
-   
-     These vectors are suitable to be embedded in other data
-     structures so that they can be pre-allocated in a contiguous
-     memory block.
-
-     Embeddable vectors are implemented using the trailing array
-     idiom, thus they are not resizeable without changing the address
-     of the vector object itself.  This means you cannot have
-     variables or fields of embeddable vector type -- always use a
-     pointer to a vector.  The one exception is the final field of a
-     structure, which could be a vector type.
-
-     You will have to use the embedded_size & embedded_init calls to
-     create such objects, and they will not be resizeable (so the
-     'safe' allocation variants are not available).
-
-     Properties of embeddable vectors:
-
-	  - The whole vector and control data are allocated in a single
-	    contiguous block.  It uses the trailing-vector idiom, so
-	    allocation must reserve enough space for all the elements
-	    in the vector plus its control data.
-	  - The vector cannot be re-allocated.
-	  - The vector cannot grow nor shrink.
-	  - No indirections needed for access/manipulation.
-	  - It requires 2 words of storage (prior to vector allocation).
-
-
-   * Space efficient vector (vec<T, A, vl_ptr>)
-
-     These vectors can grow dynamically and are allocated together
-     with their control data.  They are suited to be included in data
-     structures.  Prior to initial allocation, they only take a single
-     word of storage.
-
-     These vectors are implemented as a pointer to embeddable vectors.
-     The semantics allow for this pointer to be NULL to represent
-     empty vectors.  This way, empty vectors occupy minimal space in
-     the structure containing them.
-
-     Properties:
-
-	- The whole vector and control data are allocated in a single
-	  contiguous block.
-  	- The whole vector may be re-allocated.
-  	- Vector data may grow and shrink.
-  	- Access and manipulation requires a pointer test and
-	  indirection.
-  	- It requires 1 word of storage (prior to vector allocation).
-
-   An example of their use would be,
-
-   struct my_struct {
-     // A space-efficient vector of tree pointers in GC memory.
-     vec<tree, va_gc, vl_ptr> v;
-   };
-
-   struct my_struct *s;
-
-   if (s->v.length ()) { we have some contents }
-   s->v.safe_push (decl); // append some decl onto the end
-   for (ix = 0; s->v.iterate (ix, &elt); ix++)
-     { do something with elt }
-*/
-
-/* Support function for statistics.  */
-extern void dump_vec_loc_statistics (void);
-
-
-/* Control data for vectors.  This contains the number of allocated
-   and used slots inside a vector.  */
-
-struct vec_prefix
-{
-  /* FIXME - These fields should be private, but we need to cater to
-	     compilers that have stricter notions of PODness for types.  */
-
-  /* Memory allocation support routines in vec.c.  */
-  void register_overhead (size_t, const char *, int, const char *);
-  void release_overhead (void);
-  static unsigned calculate_allocation (vec_prefix *, unsigned, bool);
-  static unsigned calculate_allocation_1 (unsigned, unsigned);
-
-  /* Note that vec_prefix should be a base class for vec, but we use
-     offsetof() on vector fields of tree structures (e.g.,
-     tree_binfo::base_binfos), and offsetof only supports base types.
-
-     To compensate, we make vec_prefix a field inside vec and make
-     vec a friend class of vec_prefix so it can access its fields.  */
-  template <typename, typename, typename> friend struct vec;
-
-  /* The allocator types also need access to our internals.  */
-  friend struct va_gc;
-  friend struct va_gc_atomic;
-  friend struct va_heap;
-
-  unsigned m_alloc : 31;
-  unsigned m_using_auto_storage : 1;
-  unsigned m_num;
-};
-
-/* Calculate the number of slots to reserve a vector, making sure that
-   RESERVE slots are free.  If EXACT grow exactly, otherwise grow
-   exponentially.  PFX is the control data for the vector.  */
-
-inline unsigned
-vec_prefix::calculate_allocation (vec_prefix *pfx, unsigned reserve,
-				  bool exact)
-{
-  if (exact)
-    return (pfx ? pfx->m_num : 0) + reserve;
-  else if (!pfx)
-    return MAX (4, reserve);
-  return calculate_allocation_1 (pfx->m_alloc, pfx->m_num + reserve);
-}
-
-template<typename, typename, typename> struct vec;
-
-/* Valid vector layouts
-
-   vl_embed	- Embeddable vector that uses the trailing array idiom.
-   vl_ptr	- Space efficient vector that uses a pointer to an
-		  embeddable vector.  */
-struct vl_embed { };
-struct vl_ptr { };
-
-
-/* Types of supported allocations
-
-   va_heap	- Allocation uses malloc/free.
-   va_gc	- Allocation uses ggc_alloc.
-   va_gc_atomic	- Same as GC, but individual elements of the array
-		  do not need to be marked during collection.  */
-
-/* Allocator type for heap vectors.  */
-struct va_heap
-{
-  /* Heap vectors are frequently regular instances, so use the vl_ptr
-     layout for them.  */
-  typedef vl_ptr default_layout;
-
-  template<typename T>
-  static void reserve (vec<T, va_heap, vl_embed> *&, unsigned, bool
-		       CXX_MEM_STAT_INFO);
-
-  template<typename T>
-  static void release (vec<T, va_heap, vl_embed> *&);
-};
-
-
-/* Allocator for heap memory.  Ensure there are at least RESERVE free
-   slots in V.  If EXACT is true, grow exactly, else grow
-   exponentially.  As a special case, if the vector had not been
-   allocated and and RESERVE is 0, no vector will be created.  */
-
-template<typename T>
-inline void
-va_heap::reserve (vec<T, va_heap, vl_embed> *&v, unsigned reserve, bool exact
-		  MEM_STAT_DECL)
-{
-  unsigned alloc
-    = vec_prefix::calculate_allocation (v ? &v->m_vecpfx : 0, reserve, exact);
-  gcc_checking_assert (alloc);
-
-  if (GATHER_STATISTICS && v)
-    v->m_vecpfx.release_overhead ();
-
-  size_t size = vec<T, va_heap, vl_embed>::embedded_size (alloc);
-  unsigned nelem = v ? v->length () : 0;
-  v = static_cast <vec<T, va_heap, vl_embed> *> (xrealloc (v, size));
-  v->embedded_init (alloc, nelem);
-
-  if (GATHER_STATISTICS)
-    v->m_vecpfx.register_overhead (size FINAL_PASS_MEM_STAT);
-}
-
-
-/* Free the heap space allocated for vector V.  */
-
-template<typename T>
-void
-va_heap::release (vec<T, va_heap, vl_embed> *&v)
-{
-  if (v == NULL)
-    return;
-
-  if (GATHER_STATISTICS)
-    v->m_vecpfx.release_overhead ();
-  ::free (v);
-  v = NULL;
-}
-
-
-/* Allocator type for GC vectors.  Notice that we need the structure
-   declaration even if GC is not enabled.  */
-
-struct va_gc
-{
-  /* Use vl_embed as the default layout for GC vectors.  Due to GTY
-     limitations, GC vectors must always be pointers, so it is more
-     efficient to use a pointer to the vl_embed layout, rather than
-     using a pointer to a pointer as would be the case with vl_ptr.  */
-  typedef vl_embed default_layout;
-
-  template<typename T, typename A>
-  static void reserve (vec<T, A, vl_embed> *&, unsigned, bool
-		       CXX_MEM_STAT_INFO);
-
-  template<typename T, typename A>
-  static void release (vec<T, A, vl_embed> *&v);
-};
-
-
-/* Free GC memory used by V and reset V to NULL.  */
-
-template<typename T, typename A>
-inline void
-va_gc::release (vec<T, A, vl_embed> *&v)
-{
-  if (v)
-    ::ggc_free (v);
-  v = NULL;
-}
-
-
-/* Allocator for GC memory.  Ensure there are at least RESERVE free
-   slots in V.  If EXACT is true, grow exactly, else grow
-   exponentially.  As a special case, if the vector had not been
-   allocated and and RESERVE is 0, no vector will be created.  */
-
-template<typename T, typename A>
-void
-va_gc::reserve (vec<T, A, vl_embed> *&v, unsigned reserve, bool exact
-		MEM_STAT_DECL)
-{
-  unsigned alloc
-    = vec_prefix::calculate_allocation (v ? &v->m_vecpfx : 0, reserve, exact);
-  if (!alloc)
-    {
-      ::ggc_free (v);
-      v = NULL;
-      return;
-    }
-
-  /* Calculate the amount of space we want.  */
-  size_t size = vec<T, A, vl_embed>::embedded_size (alloc);
-
-  /* Ask the allocator how much space it will really give us.  */
-  size = ::ggc_round_alloc_size (size);
-
-  /* Adjust the number of slots accordingly.  */
-  size_t vec_offset = sizeof (vec_prefix);
-  size_t elt_size = sizeof (T);
-  alloc = (size - vec_offset) / elt_size;
-
-  /* And finally, recalculate the amount of space we ask for.  */
-  size = vec_offset + alloc * elt_size;
-
-  unsigned nelem = v ? v->length () : 0;
-  v = static_cast <vec<T, A, vl_embed> *> (::ggc_realloc_stat (v, size
-							       PASS_MEM_STAT));
-  v->embedded_init (alloc, nelem);
-}
-
-
-/* Allocator type for GC vectors.  This is for vectors of types
-   atomics w.r.t. collection, so allocation and deallocation is
-   completely inherited from va_gc.  */
-struct va_gc_atomic : va_gc
-{
-};
-
-
-/* Generic vector template.  Default values for A and L indicate the
-   most commonly used strategies.
-
-   FIXME - Ideally, they would all be vl_ptr to encourage using regular
-           instances for vectors, but the existing GTY machinery is limited
-	   in that it can only deal with GC objects that are pointers
-	   themselves.
-
-	   This means that vector operations that need to deal with
-	   potentially NULL pointers, must be provided as free
-	   functions (see the vec_safe_* functions above).  */
-template<typename T,
-         typename A = va_heap,
-         typename L = typename A::default_layout>
-struct GTY((user)) vec
-{
-};
-
-/* Type to provide NULL values for vec<T, A, L>.  This is used to
-   provide nil initializers for vec instances.  Since vec must be
-   a POD, we cannot have proper ctor/dtor for it.  To initialize
-   a vec instance, you can assign it the value vNULL.  */
-struct vnull
-{
-  template <typename T, typename A, typename L>
-  operator vec<T, A, L> () { return vec<T, A, L>(); }
-};
-extern vnull vNULL;
-
-
-/* Embeddable vector.  These vectors are suitable to be embedded
-   in other data structures so that they can be pre-allocated in a
-   contiguous memory block.
-
-   Embeddable vectors are implemented using the trailing array idiom,
-   thus they are not resizeable without changing the address of the
-   vector object itself.  This means you cannot have variables or
-   fields of embeddable vector type -- always use a pointer to a
-   vector.  The one exception is the final field of a structure, which
-   could be a vector type.
-
-   You will have to use the embedded_size & embedded_init calls to
-   create such objects, and they will not be resizeable (so the 'safe'
-   allocation variants are not available).
-
-   Properties:
-
-	- The whole vector and control data are allocated in a single
-	  contiguous block.  It uses the trailing-vector idiom, so
-	  allocation must reserve enough space for all the elements
-  	  in the vector plus its control data.
-  	- The vector cannot be re-allocated.
-  	- The vector cannot grow nor shrink.
-  	- No indirections needed for access/manipulation.
-  	- It requires 2 words of storage (prior to vector allocation).  */
-
-template<typename T, typename A>
-struct GTY((user)) vec<T, A, vl_embed>
-{
-public:
-  unsigned allocated (void) const { return m_vecpfx.m_alloc; }
-  unsigned length (void) const { return m_vecpfx.m_num; }
-  bool is_empty (void) const { return m_vecpfx.m_num == 0; }
-  T *address (void) { return m_vecdata; }
-  const T *address (void) const { return m_vecdata; }
-  const T &operator[] (unsigned) const;
-  T &operator[] (unsigned);
-  T &last (void);
-  bool space (unsigned) const;
-  bool iterate (unsigned, T *) const;
-  bool iterate (unsigned, T **) const;
-  vec *copy (ALONE_CXX_MEM_STAT_INFO) const;
-  void splice (vec &);
-  void splice (vec *src);
-  T *quick_push (const T &);
-  T &pop (void);
-  void truncate (unsigned);
-  void quick_insert (unsigned, const T &);
-  void ordered_remove (unsigned);
-  void unordered_remove (unsigned);
-  void block_remove (unsigned, unsigned);
-  void qsort (int (*) (const void *, const void *));
-  T *bsearch (const void *key, int (*compar)(const void *, const void *));
-  unsigned lower_bound (T, bool (*)(const T &, const T &)) const;
-  static size_t embedded_size (unsigned);
-  void embedded_init (unsigned, unsigned = 0, unsigned = 0);
-  void quick_grow (unsigned len);
-  void quick_grow_cleared (unsigned len);
-
-  /* vec class can access our internal data and functions.  */
-  template <typename, typename, typename> friend struct vec;
-
-  /* The allocator types also need access to our internals.  */
-  friend struct va_gc;
-  friend struct va_gc_atomic;
-  friend struct va_heap;
-
-  /* FIXME - These fields should be private, but we need to cater to
-	     compilers that have stricter notions of PODness for types.  */
-  vec_prefix m_vecpfx;
-  T m_vecdata[1];
-};
-
-
-/* Convenience wrapper functions to use when dealing with pointers to
-   embedded vectors.  Some functionality for these vectors must be
-   provided via free functions for these reasons:
-
-	1- The pointer may be NULL (e.g., before initial allocation).
-
-  	2- When the vector needs to grow, it must be reallocated, so
-  	   the pointer will change its value.
-
-   Because of limitations with the current GC machinery, all vectors
-   in GC memory *must* be pointers.  */
-
-
-/* If V contains no room for NELEMS elements, return false. Otherwise,
-   return true.  */
-template<typename T, typename A>
-inline bool
-vec_safe_space (const vec<T, A, vl_embed> *v, unsigned nelems)
-{
-  return v ? v->space (nelems) : nelems == 0;
-}
-
-
-/* If V is NULL, return 0.  Otherwise, return V->length().  */
-template<typename T, typename A>
-inline unsigned
-vec_safe_length (const vec<T, A, vl_embed> *v)
-{
-  return v ? v->length () : 0;
-}
-
-
-/* If V is NULL, return NULL.  Otherwise, return V->address().  */
-template<typename T, typename A>
-inline T *
-vec_safe_address (vec<T, A, vl_embed> *v)
-{
-  return v ? v->address () : NULL;
-}
-
-
-/* If V is NULL, return true.  Otherwise, return V->is_empty().  */
-template<typename T, typename A>
-inline bool
-vec_safe_is_empty (vec<T, A, vl_embed> *v)
-{
-  return v ? v->is_empty () : true;
-}
-
-
-/* If V does not have space for NELEMS elements, call
-   V->reserve(NELEMS, EXACT).  */
-template<typename T, typename A>
-inline bool
-vec_safe_reserve (vec<T, A, vl_embed> *&v, unsigned nelems, bool exact = false
-		  CXX_MEM_STAT_INFO)
-{
-  bool extend = nelems ? !vec_safe_space (v, nelems) : false;
-  if (extend)
-    A::reserve (v, nelems, exact PASS_MEM_STAT);
-  return extend;
-}
-
-template<typename T, typename A>
-inline bool
-vec_safe_reserve_exact (vec<T, A, vl_embed> *&v, unsigned nelems
-			CXX_MEM_STAT_INFO)
-{
-  return vec_safe_reserve (v, nelems, true PASS_MEM_STAT);
-}
-
-
-/* Allocate GC memory for V with space for NELEMS slots.  If NELEMS
-   is 0, V is initialized to NULL.  */
-
-template<typename T, typename A>
-inline void
-vec_alloc (vec<T, A, vl_embed> *&v, unsigned nelems CXX_MEM_STAT_INFO)
-{
-  v = NULL;
-  vec_safe_reserve (v, nelems, false PASS_MEM_STAT);
-}
-
-
-/* Free the GC memory allocated by vector V and set it to NULL.  */
-
-template<typename T, typename A>
-inline void
-vec_free (vec<T, A, vl_embed> *&v)
-{
-  A::release (v);
-}
-
-
-/* Grow V to length LEN.  Allocate it, if necessary.  */
-template<typename T, typename A>
-inline void
-vec_safe_grow (vec<T, A, vl_embed> *&v, unsigned len CXX_MEM_STAT_INFO)
-{
-  unsigned oldlen = vec_safe_length (v);
-  gcc_checking_assert (len >= oldlen);
-  vec_safe_reserve_exact (v, len - oldlen PASS_MEM_STAT);
-  v->quick_grow (len);
-}
-
-
-/* If V is NULL, allocate it.  Call V->safe_grow_cleared(LEN).  */
-template<typename T, typename A>
-inline void
-vec_safe_grow_cleared (vec<T, A, vl_embed> *&v, unsigned len CXX_MEM_STAT_INFO)
-{
-  unsigned oldlen = vec_safe_length (v);
-  vec_safe_grow (v, len PASS_MEM_STAT);
-  memset (&(v->address ()[oldlen]), 0, sizeof (T) * (len - oldlen));
-}
-
-
-/* If V is NULL return false, otherwise return V->iterate(IX, PTR).  */
-template<typename T, typename A>
-inline bool
-vec_safe_iterate (const vec<T, A, vl_embed> *v, unsigned ix, T **ptr)
-{
-  if (v)
-    return v->iterate (ix, ptr);
-  else
-    {
-      *ptr = 0;
-      return false;
-    }
-}
-
-template<typename T, typename A>
-inline bool
-vec_safe_iterate (const vec<T, A, vl_embed> *v, unsigned ix, T *ptr)
-{
-  if (v)
-    return v->iterate (ix, ptr);
-  else
-    {
-      *ptr = 0;
-      return false;
-    }
-}
-
-
-/* If V has no room for one more element, reallocate it.  Then call
-   V->quick_push(OBJ).  */
-template<typename T, typename A>
-inline T *
-vec_safe_push (vec<T, A, vl_embed> *&v, const T &obj CXX_MEM_STAT_INFO)
-{
-  vec_safe_reserve (v, 1, false PASS_MEM_STAT);
-  return v->quick_push (obj);
-}
-
-
-/* if V has no room for one more element, reallocate it.  Then call
-   V->quick_insert(IX, OBJ).  */
-template<typename T, typename A>
-inline void
-vec_safe_insert (vec<T, A, vl_embed> *&v, unsigned ix, const T &obj
-		 CXX_MEM_STAT_INFO)
-{
-  vec_safe_reserve (v, 1, false PASS_MEM_STAT);
-  v->quick_insert (ix, obj);
-}
-
-
-/* If V is NULL, do nothing.  Otherwise, call V->truncate(SIZE).  */
-template<typename T, typename A>
-inline void
-vec_safe_truncate (vec<T, A, vl_embed> *v, unsigned size)
-{
-  if (v)
-    v->truncate (size);
-}
-
-
-/* If SRC is not NULL, return a pointer to a copy of it.  */
-template<typename T, typename A>
-inline vec<T, A, vl_embed> *
-vec_safe_copy (vec<T, A, vl_embed> *src CXX_MEM_STAT_INFO)
-{
-  return src ? src->copy (ALONE_PASS_MEM_STAT) : NULL;
-}
-
-/* Copy the elements from SRC to the end of DST as if by memcpy.
-   Reallocate DST, if necessary.  */
-template<typename T, typename A>
-inline void
-vec_safe_splice (vec<T, A, vl_embed> *&dst, vec<T, A, vl_embed> *src
-		 CXX_MEM_STAT_INFO)
-{
-  unsigned src_len = vec_safe_length (src);
-  if (src_len)
-    {
-      vec_safe_reserve_exact (dst, vec_safe_length (dst) + src_len
-			      PASS_MEM_STAT);
-      dst->splice (*src);
-    }
-}
-
-
-/* Index into vector.  Return the IX'th element.  IX must be in the
-   domain of the vector.  */
-
-template<typename T, typename A>
-inline const T &
-vec<T, A, vl_embed>::operator[] (unsigned ix) const
-{
-  gcc_checking_assert (ix < m_vecpfx.m_num);
-  return m_vecdata[ix];
-}
-
-template<typename T, typename A>
-inline T &
-vec<T, A, vl_embed>::operator[] (unsigned ix)
-{
-  gcc_checking_assert (ix < m_vecpfx.m_num);
-  return m_vecdata[ix];
-}
-
-
-/* Get the final element of the vector, which must not be empty.  */
-
-template<typename T, typename A>
-inline T &
-vec<T, A, vl_embed>::last (void)
-{
-  gcc_checking_assert (m_vecpfx.m_num > 0);
-  return (*this)[m_vecpfx.m_num - 1];
-}
-
-
-/* If this vector has space for NELEMS additional entries, return
-   true.  You usually only need to use this if you are doing your
-   own vector reallocation, for instance on an embedded vector.  This
-   returns true in exactly the same circumstances that vec::reserve
-   will.  */
-
-template<typename T, typename A>
-inline bool
-vec<T, A, vl_embed>::space (unsigned nelems) const
-{
-  return m_vecpfx.m_alloc - m_vecpfx.m_num >= nelems;
-}
-
-
-/* Return iteration condition and update PTR to point to the IX'th
-   element of this vector.  Use this to iterate over the elements of a
-   vector as follows,
-
-     for (ix = 0; vec<T, A>::iterate (v, ix, &ptr); ix++)
-       continue;  */
-
-template<typename T, typename A>
-inline bool
-vec<T, A, vl_embed>::iterate (unsigned ix, T *ptr) const
-{
-  if (ix < m_vecpfx.m_num)
-    {
-      *ptr = m_vecdata[ix];
-      return true;
-    }
-  else
-    {
-      *ptr = 0;
-      return false;
-    }
-}
-
-
-/* Return iteration condition and update *PTR to point to the
-   IX'th element of this vector.  Use this to iterate over the
-   elements of a vector as follows,
-
-     for (ix = 0; v->iterate (ix, &ptr); ix++)
-       continue;
-
-   This variant is for vectors of objects.  */
-
-template<typename T, typename A>
-inline bool
-vec<T, A, vl_embed>::iterate (unsigned ix, T **ptr) const
-{
-  if (ix < m_vecpfx.m_num)
-    {
-      *ptr = CONST_CAST (T *, &m_vecdata[ix]);
-      return true;
-    }
-  else
-    {
-      *ptr = 0;
-      return false;
-    }
-}
-
-
-/* Return a pointer to a copy of this vector.  */
-
-template<typename T, typename A>
-inline vec<T, A, vl_embed> *
-vec<T, A, vl_embed>::copy (ALONE_MEM_STAT_DECL) const
-{
-  vec<T, A, vl_embed> *new_vec = NULL;
-  unsigned len = length ();
-  if (len)
-    {
-      vec_alloc (new_vec, len PASS_MEM_STAT);
-      new_vec->embedded_init (len, len);
-      memcpy (new_vec->address (), m_vecdata, sizeof (T) * len);
-    }
-  return new_vec;
-}
-
-
-/* Copy the elements from SRC to the end of this vector as if by memcpy.
-   The vector must have sufficient headroom available.  */
-
-template<typename T, typename A>
-inline void
-vec<T, A, vl_embed>::splice (vec<T, A, vl_embed> &src)
-{
-  unsigned len = src.length ();
-  if (len)
-    {
-      gcc_checking_assert (space (len));
-      memcpy (address () + length (), src.address (), len * sizeof (T));
-      m_vecpfx.m_num += len;
-    }
-}
-
-template<typename T, typename A>
-inline void
-vec<T, A, vl_embed>::splice (vec<T, A, vl_embed> *src)
-{
-  if (src)
-    splice (*src);
-}
-
-
-/* Push OBJ (a new element) onto the end of the vector.  There must be
-   sufficient space in the vector.  Return a pointer to the slot
-   where OBJ was inserted.  */
-
-template<typename T, typename A>
-inline T *
-vec<T, A, vl_embed>::quick_push (const T &obj)
-{
-  gcc_checking_assert (space (1));
-  T *slot = &m_vecdata[m_vecpfx.m_num++];
-  *slot = obj;
-  return slot;
-}
-
-
-/* Pop and return the last element off the end of the vector.  */
-
-template<typename T, typename A>
-inline T &
-vec<T, A, vl_embed>::pop (void)
-{
-  gcc_checking_assert (length () > 0);
-  return m_vecdata[--m_vecpfx.m_num];
-}
-
-
-/* Set the length of the vector to SIZE.  The new length must be less
-   than or equal to the current length.  This is an O(1) operation.  */
-
-template<typename T, typename A>
-inline void
-vec<T, A, vl_embed>::truncate (unsigned size)
-{
-  gcc_checking_assert (length () >= size);
-  m_vecpfx.m_num = size;
-}
-
-
-/* Insert an element, OBJ, at the IXth position of this vector.  There
-   must be sufficient space.  */
-
-template<typename T, typename A>
-inline void
-vec<T, A, vl_embed>::quick_insert (unsigned ix, const T &obj)
-{
-  gcc_checking_assert (length () < allocated ());
-  gcc_checking_assert (ix <= length ());
-  T *slot = &m_vecdata[ix];
-  memmove (slot + 1, slot, (m_vecpfx.m_num++ - ix) * sizeof (T));
-  *slot = obj;
-}
-
-
-/* Remove an element from the IXth position of this vector.  Ordering of
-   remaining elements is preserved.  This is an O(N) operation due to
-   memmove.  */
-
-template<typename T, typename A>
-inline void
-vec<T, A, vl_embed>::ordered_remove (unsigned ix)
-{
-  gcc_checking_assert (ix < length ());
-  T *slot = &m_vecdata[ix];
-  memmove (slot, slot + 1, (--m_vecpfx.m_num - ix) * sizeof (T));
-}
-
-
-/* Remove an element from the IXth position of this vector.  Ordering of
-   remaining elements is destroyed.  This is an O(1) operation.  */
-
-template<typename T, typename A>
-inline void
-vec<T, A, vl_embed>::unordered_remove (unsigned ix)
-{
-  gcc_checking_assert (ix < length ());
-  m_vecdata[ix] = m_vecdata[--m_vecpfx.m_num];
-}
-
-
-/* Remove LEN elements starting at the IXth.  Ordering is retained.
-   This is an O(N) operation due to memmove.  */
-
-template<typename T, typename A>
-inline void
-vec<T, A, vl_embed>::block_remove (unsigned ix, unsigned len)
-{
-  gcc_checking_assert (ix + len <= length ());
-  T *slot = &m_vecdata[ix];
-  m_vecpfx.m_num -= len;
-  memmove (slot, slot + len, (m_vecpfx.m_num - ix) * sizeof (T));
-}
-
-
-/* Sort the contents of this vector with qsort.  CMP is the comparison
-   function to pass to qsort.  */
-
-template<typename T, typename A>
-inline void
-vec<T, A, vl_embed>::qsort (int (*cmp) (const void *, const void *))
-{
-  if (length () > 1)
-    ::qsort (address (), length (), sizeof (T), cmp);
-}
-
-
-/* Search the contents of the sorted vector with a binary search.
-   CMP is the comparison function to pass to bsearch.  */
-
-template<typename T, typename A>
-inline T *
-vec<T, A, vl_embed>::bsearch (const void *key,
-			      int (*compar) (const void *, const void *))
-{
-  const void *base = this->address ();
-  size_t nmemb = this->length ();
-  size_t size = sizeof (T);
-  /* The following is a copy of glibc stdlib-bsearch.h.  */
-  size_t l, u, idx;
-  const void *p;
-  int comparison;
-
-  l = 0;
-  u = nmemb;
-  while (l < u)
-    {
-      idx = (l + u) / 2;
-      p = (const void *) (((const char *) base) + (idx * size));
-      comparison = (*compar) (key, p);
-      if (comparison < 0)
-	u = idx;
-      else if (comparison > 0)
-	l = idx + 1;
-      else
-	return (T *)const_cast<void *>(p);
-    }
-
-  return NULL;
-}
-
-
-/* Find and return the first position in which OBJ could be inserted
-   without changing the ordering of this vector.  LESSTHAN is a
-   function that returns true if the first argument is strictly less
-   than the second.  */
-
-template<typename T, typename A>
-unsigned
-vec<T, A, vl_embed>::lower_bound (T obj, bool (*lessthan)(const T &, const T &))
-  const
-{
-  unsigned int len = length ();
-  unsigned int half, middle;
-  unsigned int first = 0;
-  while (len > 0)
-    {
-      half = len / 2;
-      middle = first;
-      middle += half;
-      T middle_elem = (*this)[middle];
-      if (lessthan (middle_elem, obj))
-	{
-	  first = middle;
-	  ++first;
-	  len = len - half - 1;
-	}
-      else
-	len = half;
-    }
-  return first;
-}
-
-
-/* Return the number of bytes needed to embed an instance of an
-   embeddable vec inside another data structure.
-
-   Use these methods to determine the required size and initialization
-   of a vector V of type T embedded within another structure (as the
-   final member):
-
-   size_t vec<T, A, vl_embed>::embedded_size (unsigned alloc);
-   void v->embedded_init (unsigned alloc, unsigned num);
-
-   These allow the caller to perform the memory allocation.  */
-
-template<typename T, typename A>
-inline size_t
-vec<T, A, vl_embed>::embedded_size (unsigned alloc)
-{
-  typedef vec<T, A, vl_embed> vec_embedded;
-  return offsetof (vec_embedded, m_vecdata) + alloc * sizeof (T);
-}
-
-
-/* Initialize the vector to contain room for ALLOC elements and
-   NUM active elements.  */
-
-template<typename T, typename A>
-inline void
-vec<T, A, vl_embed>::embedded_init (unsigned alloc, unsigned num, unsigned aut)
-{
-  m_vecpfx.m_alloc = alloc;
-  m_vecpfx.m_using_auto_storage = aut;
-  m_vecpfx.m_num = num;
-}
-
-
-/* Grow the vector to a specific length.  LEN must be as long or longer than
-   the current length.  The new elements are uninitialized.  */
-
-template<typename T, typename A>
-inline void
-vec<T, A, vl_embed>::quick_grow (unsigned len)
-{
-  gcc_checking_assert (length () <= len && len <= m_vecpfx.m_alloc);
-  m_vecpfx.m_num = len;
-}
-
-
-/* Grow the vector to a specific length.  LEN must be as long or longer than
-   the current length.  The new elements are initialized to zero.  */
-
-template<typename T, typename A>
-inline void
-vec<T, A, vl_embed>::quick_grow_cleared (unsigned len)
-{
-  unsigned oldlen = length ();
-  quick_grow (len);
-  memset (&(address ()[oldlen]), 0, sizeof (T) * (len - oldlen));
-}
-
-
-/* Garbage collection support for vec<T, A, vl_embed>.  */
-
-template<typename T>
-void
-gt_ggc_mx (vec<T, va_gc> *v)
-{
-  extern void gt_ggc_mx (T &);
-  for (unsigned i = 0; i < v->length (); i++)
-    gt_ggc_mx ((*v)[i]);
-}
-
-template<typename T>
-void
-gt_ggc_mx (vec<T, va_gc_atomic, vl_embed> *v ATTRIBUTE_UNUSED)
-{
-  /* Nothing to do.  Vectors of atomic types wrt GC do not need to
-     be traversed.  */
-}
-
-
-/* PCH support for vec<T, A, vl_embed>.  */
-
-template<typename T, typename A>
-void
-gt_pch_nx (vec<T, A, vl_embed> *v)
-{
-  extern void gt_pch_nx (T &);
-  for (unsigned i = 0; i < v->length (); i++)
-    gt_pch_nx ((*v)[i]);
-}
-
-template<typename T, typename A>
-void
-gt_pch_nx (vec<T *, A, vl_embed> *v, gt_pointer_operator op, void *cookie)
-{
-  for (unsigned i = 0; i < v->length (); i++)
-    op (&((*v)[i]), cookie);
-}
-
-template<typename T, typename A>
-void
-gt_pch_nx (vec<T, A, vl_embed> *v, gt_pointer_operator op, void *cookie)
-{
-  extern void gt_pch_nx (T *, gt_pointer_operator, void *);
-  for (unsigned i = 0; i < v->length (); i++)
-    gt_pch_nx (&((*v)[i]), op, cookie);
-}
-
-
-/* Space efficient vector.  These vectors can grow dynamically and are
-   allocated together with their control data.  They are suited to be
-   included in data structures.  Prior to initial allocation, they
-   only take a single word of storage.
-
-   These vectors are implemented as a pointer to an embeddable vector.
-   The semantics allow for this pointer to be NULL to represent empty
-   vectors.  This way, empty vectors occupy minimal space in the
-   structure containing them.
-
-   Properties:
-
-	- The whole vector and control data are allocated in a single
-	  contiguous block.
-  	- The whole vector may be re-allocated.
-  	- Vector data may grow and shrink.
-  	- Access and manipulation requires a pointer test and
-	  indirection.
-	- It requires 1 word of storage (prior to vector allocation).
-
-
-   Limitations:
-
-   These vectors must be PODs because they are stored in unions.
-   (http://en.wikipedia.org/wiki/Plain_old_data_structures).
-   As long as we use C++03, we cannot have constructors nor
-   destructors in classes that are stored in unions.  */
-
-template<typename T>
-struct vec<T, va_heap, vl_ptr>
-{
-public:
-  /* Memory allocation and deallocation for the embedded vector.
-     Needed because we cannot have proper ctors/dtors defined.  */
-  void create (unsigned nelems CXX_MEM_STAT_INFO);
-  void release (void);
-
-  /* Vector operations.  */
-  bool exists (void) const
-  { return m_vec != NULL; }
-
-  bool is_empty (void) const
-  { return m_vec ? m_vec->is_empty () : true; }
-
-  unsigned length (void) const
-  { return m_vec ? m_vec->length () : 0; }
-
-  T *address (void)
-  { return m_vec ? m_vec->m_vecdata : NULL; }
-
-  const T *address (void) const
-  { return m_vec ? m_vec->m_vecdata : NULL; }
-
-  const T &operator[] (unsigned ix) const
-  { return (*m_vec)[ix]; }
-
-  bool operator!=(const vec &other) const
-  { return !(*this == other); }
-
-  bool operator==(const vec &other) const
-  { return address () == other.address (); }
-
-  T &operator[] (unsigned ix)
-  { return (*m_vec)[ix]; }
-
-  T &last (void)
-  { return m_vec->last (); }
-
-  bool space (int nelems) const
-  { return m_vec ? m_vec->space (nelems) : nelems == 0; }
-
-  bool iterate (unsigned ix, T *p) const;
-  bool iterate (unsigned ix, T **p) const;
-  vec copy (ALONE_CXX_MEM_STAT_INFO) const;
-  bool reserve (unsigned, bool = false CXX_MEM_STAT_INFO);
-  bool reserve_exact (unsigned CXX_MEM_STAT_INFO);
-  void splice (vec &);
-  void safe_splice (vec & CXX_MEM_STAT_INFO);
-  T *quick_push (const T &);
-  T *safe_push (const T &CXX_MEM_STAT_INFO);
-  T &pop (void);
-  void truncate (unsigned);
-  void safe_grow (unsigned CXX_MEM_STAT_INFO);
-  void safe_grow_cleared (unsigned CXX_MEM_STAT_INFO);
-  void quick_grow (unsigned);
-  void quick_grow_cleared (unsigned);
-  void quick_insert (unsigned, const T &);
-  void safe_insert (unsigned, const T & CXX_MEM_STAT_INFO);
-  void ordered_remove (unsigned);
-  void unordered_remove (unsigned);
-  void block_remove (unsigned, unsigned);
-  void qsort (int (*) (const void *, const void *));
-  T *bsearch (const void *key, int (*compar)(const void *, const void *));
-  unsigned lower_bound (T, bool (*)(const T &, const T &)) const;
-
-  bool using_auto_storage () const;
-
-  /* FIXME - This field should be private, but we need to cater to
-	     compilers that have stricter notions of PODness for types.  */
-  vec<T, va_heap, vl_embed> *m_vec;
-};
-
-
-/* auto_vec is a subclass of vec that automatically manages creating and
-   releasing the internal vector. If N is non zero then it has N elements of
-   internal storage.  The default is no internal storage, and you probably only
-   want to ask for internal storage for vectors on the stack because if the
-   size of the vector is larger than the internal storage that space is wasted.
-   */
-template<typename T, size_t N = 0>
-class auto_vec : public vec<T, va_heap>
-{
-public:
-  auto_vec ()
-  {
-    m_auto.embedded_init (MAX (N, 2), 0, 1);
-    this->m_vec = &m_auto;
-  }
-
-  ~auto_vec ()
-  {
-    this->release ();
-  }
-
-private:
-  vec<T, va_heap, vl_embed> m_auto;
-  T m_data[MAX (N - 1, 1)];
-};
-
-/* auto_vec is a sub class of vec whose storage is released when it is
-  destroyed. */
-template<typename T>
-class auto_vec<T, 0> : public vec<T, va_heap>
-{
-public:
-  auto_vec () { this->m_vec = NULL; }
-  auto_vec (size_t n) { this->create (n); }
-  ~auto_vec () { this->release (); }
-};
-
-
-/* Allocate heap memory for pointer V and create the internal vector
-   with space for NELEMS elements.  If NELEMS is 0, the internal
-   vector is initialized to empty.  */
-
-template<typename T>
-inline void
-vec_alloc (vec<T> *&v, unsigned nelems CXX_MEM_STAT_INFO)
-{
-  v = new vec<T>;
-  v->create (nelems PASS_MEM_STAT);
-}
-
-
-/* Conditionally allocate heap memory for VEC and its internal vector.  */
-
-template<typename T>
-inline void
-vec_check_alloc (vec<T, va_heap> *&vec, unsigned nelems CXX_MEM_STAT_INFO)
-{
-  if (!vec)
-    vec_alloc (vec, nelems PASS_MEM_STAT);
-}
-
-
-/* Free the heap memory allocated by vector V and set it to NULL.  */
-
-template<typename T>
-inline void
-vec_free (vec<T> *&v)
-{
-  if (v == NULL)
-    return;
-
-  v->release ();
-  delete v;
-  v = NULL;
-}
-
-
-/* Return iteration condition and update PTR to point to the IX'th
-   element of this vector.  Use this to iterate over the elements of a
-   vector as follows,
-
-     for (ix = 0; v.iterate (ix, &ptr); ix++)
-       continue;  */
-
-template<typename T>
-inline bool
-vec<T, va_heap, vl_ptr>::iterate (unsigned ix, T *ptr) const
-{
-  if (m_vec)
-    return m_vec->iterate (ix, ptr);
-  else
-    {
-      *ptr = 0;
-      return false;
-    }
-}
-
-
-/* Return iteration condition and update *PTR to point to the
-   IX'th element of this vector.  Use this to iterate over the
-   elements of a vector as follows,
-
-     for (ix = 0; v->iterate (ix, &ptr); ix++)
-       continue;
-
-   This variant is for vectors of objects.  */
-
-template<typename T>
-inline bool
-vec<T, va_heap, vl_ptr>::iterate (unsigned ix, T **ptr) const
-{
-  if (m_vec)
-    return m_vec->iterate (ix, ptr);
-  else
-    {
-      *ptr = 0;
-      return false;
-    }
-}
-
-
-/* Convenience macro for forward iteration.  */
-#define FOR_EACH_VEC_ELT(V, I, P)			\
-  for (I = 0; (V).iterate ((I), &(P)); ++(I))
-
-#define FOR_EACH_VEC_SAFE_ELT(V, I, P)			\
-  for (I = 0; vec_safe_iterate ((V), (I), &(P)); ++(I))
-
-/* Likewise, but start from FROM rather than 0.  */
-#define FOR_EACH_VEC_ELT_FROM(V, I, P, FROM)		\
-  for (I = (FROM); (V).iterate ((I), &(P)); ++(I))
-
-/* Convenience macro for reverse iteration.  */
-#define FOR_EACH_VEC_ELT_REVERSE(V, I, P)		\
-  for (I = (V).length () - 1;				\
-       (V).iterate ((I), &(P));				\
-       (I)--)
-
-#define FOR_EACH_VEC_SAFE_ELT_REVERSE(V, I, P)		\
-  for (I = vec_safe_length (V) - 1;			\
-       vec_safe_iterate ((V), (I), &(P));	\
-       (I)--)
-
-
-/* Return a copy of this vector.  */
-
-template<typename T>
-inline vec<T, va_heap, vl_ptr>
-vec<T, va_heap, vl_ptr>::copy (ALONE_MEM_STAT_DECL) const
-{
-  vec<T, va_heap, vl_ptr> new_vec = vNULL;
-  if (length ())
-    new_vec.m_vec = m_vec->copy ();
-  return new_vec;
-}
-
-
-/* Ensure that the vector has at least RESERVE slots available (if
-   EXACT is false), or exactly RESERVE slots available (if EXACT is
-   true).
-
-   This may create additional headroom if EXACT is false.
-
-   Note that this can cause the embedded vector to be reallocated.
-   Returns true iff reallocation actually occurred.  */
-
-template<typename T>
-inline bool
-vec<T, va_heap, vl_ptr>::reserve (unsigned nelems, bool exact MEM_STAT_DECL)
-{
-  if (space (nelems))
-    return false;
-
-  /* For now play a game with va_heap::reserve to hide our auto storage if any,
-     this is necessary because it doesn't have enough information to know the
-     embedded vector is in auto storage, and so should not be freed.  */
-  vec<T, va_heap, vl_embed> *oldvec = m_vec;
-  unsigned int oldsize = 0;
-  bool handle_auto_vec = m_vec && using_auto_storage ();
-  if (handle_auto_vec)
-    {
-      m_vec = NULL;
-      oldsize = oldvec->length ();
-      nelems += oldsize;
-    }
-
-  va_heap::reserve (m_vec, nelems, exact PASS_MEM_STAT);
-  if (handle_auto_vec)
-    {
-      memcpy (m_vec->address (), oldvec->address (), sizeof (T) * oldsize);
-      m_vec->m_vecpfx.m_num = oldsize;
-    }
-
-  return true;
-}
-
-
-/* Ensure that this vector has exactly NELEMS slots available.  This
-   will not create additional headroom.  Note this can cause the
-   embedded vector to be reallocated.  Returns true iff reallocation
-   actually occurred.  */
-
-template<typename T>
-inline bool
-vec<T, va_heap, vl_ptr>::reserve_exact (unsigned nelems MEM_STAT_DECL)
-{
-  return reserve (nelems, true PASS_MEM_STAT);
-}
-
-
-/* Create the internal vector and reserve NELEMS for it.  This is
-   exactly like vec::reserve, but the internal vector is
-   unconditionally allocated from scratch.  The old one, if it
-   existed, is lost.  */
-
-template<typename T>
-inline void
-vec<T, va_heap, vl_ptr>::create (unsigned nelems MEM_STAT_DECL)
-{
-  m_vec = NULL;
-  if (nelems > 0)
-    reserve_exact (nelems PASS_MEM_STAT);
-}
-
-
-/* Free the memory occupied by the embedded vector.  */
-
-template<typename T>
-inline void
-vec<T, va_heap, vl_ptr>::release (void)
-{
-  if (!m_vec)
-    return;
-
-  if (using_auto_storage ())
-    {
-      m_vec->m_vecpfx.m_num = 0;
-      return;
-    }
-
-  va_heap::release (m_vec);
-}
-
-/* Copy the elements from SRC to the end of this vector as if by memcpy.
-   SRC and this vector must be allocated with the same memory
-   allocation mechanism. This vector is assumed to have sufficient
-   headroom available.  */
-
-template<typename T>
-inline void
-vec<T, va_heap, vl_ptr>::splice (vec<T, va_heap, vl_ptr> &src)
-{
-  if (src.m_vec)
-    m_vec->splice (*(src.m_vec));
-}
-
-
-/* Copy the elements in SRC to the end of this vector as if by memcpy.
-   SRC and this vector must be allocated with the same mechanism.
-   If there is not enough headroom in this vector, it will be reallocated
-   as needed.  */
-
-template<typename T>
-inline void
-vec<T, va_heap, vl_ptr>::safe_splice (vec<T, va_heap, vl_ptr> &src
-				      MEM_STAT_DECL)
-{
-  if (src.length ())
-    {
-      reserve_exact (src.length ());
-      splice (src);
-    }
-}
-
-
-/* Push OBJ (a new element) onto the end of the vector.  There must be
-   sufficient space in the vector.  Return a pointer to the slot
-   where OBJ was inserted.  */
-
-template<typename T>
-inline T *
-vec<T, va_heap, vl_ptr>::quick_push (const T &obj)
-{
-  return m_vec->quick_push (obj);
-}
-
-
-/* Push a new element OBJ onto the end of this vector.  Reallocates
-   the embedded vector, if needed.  Return a pointer to the slot where
-   OBJ was inserted.  */
-
-template<typename T>
-inline T *
-vec<T, va_heap, vl_ptr>::safe_push (const T &obj MEM_STAT_DECL)
-{
-  reserve (1, false PASS_MEM_STAT);
-  return quick_push (obj);
-}
-
-
-/* Pop and return the last element off the end of the vector.  */
-
-template<typename T>
-inline T &
-vec<T, va_heap, vl_ptr>::pop (void)
-{
-  return m_vec->pop ();
-}
-
-
-/* Set the length of the vector to LEN.  The new length must be less
-   than or equal to the current length.  This is an O(1) operation.  */
-
-template<typename T>
-inline void
-vec<T, va_heap, vl_ptr>::truncate (unsigned size)
-{
-  if (m_vec)
-    m_vec->truncate (size);
-  else
-    gcc_checking_assert (size == 0);
-}
-
-
-/* Grow the vector to a specific length.  LEN must be as long or
-   longer than the current length.  The new elements are
-   uninitialized.  Reallocate the internal vector, if needed.  */
-
-template<typename T>
-inline void
-vec<T, va_heap, vl_ptr>::safe_grow (unsigned len MEM_STAT_DECL)
-{
-  unsigned oldlen = length ();
-  gcc_checking_assert (oldlen <= len);
-  reserve_exact (len - oldlen PASS_MEM_STAT);
-  m_vec->quick_grow (len);
-}
-
-
-/* Grow the embedded vector to a specific length.  LEN must be as
-   long or longer than the current length.  The new elements are
-   initialized to zero.  Reallocate the internal vector, if needed.  */
-
-template<typename T>
-inline void
-vec<T, va_heap, vl_ptr>::safe_grow_cleared (unsigned len MEM_STAT_DECL)
-{
-  unsigned oldlen = length ();
-  safe_grow (len PASS_MEM_STAT);
-  memset (&(address ()[oldlen]), 0, sizeof (T) * (len - oldlen));
-}
-
-
-/* Same as vec::safe_grow but without reallocation of the internal vector.
-   If the vector cannot be extended, a runtime assertion will be triggered.  */
-
-template<typename T>
-inline void
-vec<T, va_heap, vl_ptr>::quick_grow (unsigned len)
-{
-  gcc_checking_assert (m_vec);
-  m_vec->quick_grow (len);
-}
-
-
-/* Same as vec::quick_grow_cleared but without reallocation of the
-   internal vector. If the vector cannot be extended, a runtime
-   assertion will be triggered.  */
-
-template<typename T>
-inline void
-vec<T, va_heap, vl_ptr>::quick_grow_cleared (unsigned len)
-{
-  gcc_checking_assert (m_vec);
-  m_vec->quick_grow_cleared (len);
-}
-
-
-/* Insert an element, OBJ, at the IXth position of this vector.  There
-   must be sufficient space.  */
-
-template<typename T>
-inline void
-vec<T, va_heap, vl_ptr>::quick_insert (unsigned ix, const T &obj)
-{
-  m_vec->quick_insert (ix, obj);
-}
-
-
-/* Insert an element, OBJ, at the IXth position of the vector.
-   Reallocate the embedded vector, if necessary.  */
-
-template<typename T>
-inline void
-vec<T, va_heap, vl_ptr>::safe_insert (unsigned ix, const T &obj MEM_STAT_DECL)
-{
-  reserve (1, false PASS_MEM_STAT);
-  quick_insert (ix, obj);
-}
-
-
-/* Remove an element from the IXth position of this vector.  Ordering of
-   remaining elements is preserved.  This is an O(N) operation due to
-   a memmove.  */
-
-template<typename T>
-inline void
-vec<T, va_heap, vl_ptr>::ordered_remove (unsigned ix)
-{
-  m_vec->ordered_remove (ix);
-}
-
-
-/* Remove an element from the IXth position of this vector.  Ordering
-   of remaining elements is destroyed.  This is an O(1) operation.  */
-
-template<typename T>
-inline void
-vec<T, va_heap, vl_ptr>::unordered_remove (unsigned ix)
-{
-  m_vec->unordered_remove (ix);
-}
-
-
-/* Remove LEN elements starting at the IXth.  Ordering is retained.
-   This is an O(N) operation due to memmove.  */
-
-template<typename T>
-inline void
-vec<T, va_heap, vl_ptr>::block_remove (unsigned ix, unsigned len)
-{
-  m_vec->block_remove (ix, len);
-}
-
-
-/* Sort the contents of this vector with qsort.  CMP is the comparison
-   function to pass to qsort.  */
-
-template<typename T>
-inline void
-vec<T, va_heap, vl_ptr>::qsort (int (*cmp) (const void *, const void *))
-{
-  if (m_vec)
-    m_vec->qsort (cmp);
-}
-
-
-/* Search the contents of the sorted vector with a binary search.
-   CMP is the comparison function to pass to bsearch.  */
-
-template<typename T>
-inline T *
-vec<T, va_heap, vl_ptr>::bsearch (const void *key,
-				  int (*cmp) (const void *, const void *))
-{
-  if (m_vec)
-    return m_vec->bsearch (key, cmp);
-  return NULL;
-}
-
-
-/* Find and return the first position in which OBJ could be inserted
-   without changing the ordering of this vector.  LESSTHAN is a
-   function that returns true if the first argument is strictly less
-   than the second.  */
-
-template<typename T>
-inline unsigned
-vec<T, va_heap, vl_ptr>::lower_bound (T obj,
-				      bool (*lessthan)(const T &, const T &))
-    const
-{
-  return m_vec ? m_vec->lower_bound (obj, lessthan) : 0;
-}
-
-template<typename T>
-inline bool
-vec<T, va_heap, vl_ptr>::using_auto_storage () const
-{
-  return m_vec->m_vecpfx.m_using_auto_storage;
-}
-
-#if (GCC_VERSION >= 3000)
-# pragma GCC poison m_vec m_vecpfx m_vecdata
-#endif
-
-#endif // GCC_VEC_H
diff --git a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/version.h b/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/version.h
deleted file mode 100644
index 8891903..0000000
--- a/lib/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/include/version.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef GCC_VERSION_H
-#define GCC_VERSION_H
-extern const char version_string[];
-extern const char pkgversion_string[];
-extern const char bug_report_url[];
-#endif /* ! GCC_VERSION_H */
diff --git a/lib/libgmp.a b/lib/libgmp.a
new file mode 100644
index 0000000..2044bc5
--- /dev/null
+++ b/lib/libgmp.a
Binary files differ
diff --git a/lib/libgmp.la b/lib/libgmp.la
index 28a99de..6c5503e 100755
--- a/lib/libgmp.la
+++ b/lib/libgmp.la
@@ -5,13 +5,13 @@
 # It is necessary for linking the library.
 
 # The name that we can dlopen(3).
-dlname='libgmp.so.10'
+dlname=''
 
 # Names of this library.
-library_names='libgmp.so.10.2.0 libgmp.so.10 libgmp.so'
+library_names=''
 
 # The name of the static archive.
-old_library=''
+old_library='libgmp.a'
 
 # Linker flags that can not go in dependency_libs.
 inherited_linker_flags=''
diff --git a/lib/libgmp.so b/lib/libgmp.so
deleted file mode 120000
index 225cdbd..0000000
--- a/lib/libgmp.so
+++ /dev/null
@@ -1 +0,0 @@
-libgmp.so.10.2.0
\ No newline at end of file
diff --git a/lib/libgmp.so.10 b/lib/libgmp.so.10
deleted file mode 120000
index 225cdbd..0000000
--- a/lib/libgmp.so.10
+++ /dev/null
@@ -1 +0,0 @@
-libgmp.so.10.2.0
\ No newline at end of file
diff --git a/lib/libgmp.so.10.2.0 b/lib/libgmp.so.10.2.0
deleted file mode 100755
index 82b2e13..0000000
--- a/lib/libgmp.so.10.2.0
+++ /dev/null
Binary files differ
diff --git a/lib/libiberty.a b/lib/libiberty.a
index 4df85b0..e1de441 100644
--- a/lib/libiberty.a
+++ b/lib/libiberty.a
Binary files differ
diff --git a/lib/libmpc.a b/lib/libmpc.a
new file mode 100644
index 0000000..c81effb
--- /dev/null
+++ b/lib/libmpc.a
Binary files differ
diff --git a/lib/libmpc.la b/lib/libmpc.la
index 989dbae..00dbcdb 100755
--- a/lib/libmpc.la
+++ b/lib/libmpc.la
@@ -5,13 +5,13 @@
 # It is necessary for linking the library.
 
 # The name that we can dlopen(3).
-dlname='libmpc.so.3'
+dlname=''
 
 # Names of this library.
-library_names='libmpc.so.3.0.0 libmpc.so.3 libmpc.so'
+library_names=''
 
 # The name of the static archive.
-old_library=''
+old_library='libmpc.a'
 
 # Linker flags that can not go in dependency_libs.
 inherited_linker_flags=''
diff --git a/lib/libmpc.so b/lib/libmpc.so
deleted file mode 120000
index 8e1a884..0000000
--- a/lib/libmpc.so
+++ /dev/null
@@ -1 +0,0 @@
-libmpc.so.3.0.0
\ No newline at end of file
diff --git a/lib/libmpc.so.3 b/lib/libmpc.so.3
deleted file mode 120000
index 8e1a884..0000000
--- a/lib/libmpc.so.3
+++ /dev/null
@@ -1 +0,0 @@
-libmpc.so.3.0.0
\ No newline at end of file
diff --git a/lib/libmpc.so.3.0.0 b/lib/libmpc.so.3.0.0
deleted file mode 100755
index 0529864..0000000
--- a/lib/libmpc.so.3.0.0
+++ /dev/null
Binary files differ
diff --git a/lib/libmpfr.a b/lib/libmpfr.a
new file mode 100644
index 0000000..b92980f
--- /dev/null
+++ b/lib/libmpfr.a
Binary files differ
diff --git a/lib/libmpfr.la b/lib/libmpfr.la
index f99f9cb..06f5e2d 100755
--- a/lib/libmpfr.la
+++ b/lib/libmpfr.la
@@ -5,13 +5,13 @@
 # It is necessary for linking the library.
 
 # The name that we can dlopen(3).
-dlname='libmpfr.so.4'
+dlname=''
 
 # Names of this library.
-library_names='libmpfr.so.4.1.2 libmpfr.so.4 libmpfr.so'
+library_names=''
 
 # The name of the static archive.
-old_library=''
+old_library='libmpfr.a'
 
 # Linker flags that can not go in dependency_libs.
 inherited_linker_flags=''
diff --git a/lib/libmpfr.so b/lib/libmpfr.so
deleted file mode 120000
index edb9abd..0000000
--- a/lib/libmpfr.so
+++ /dev/null
@@ -1 +0,0 @@
-libmpfr.so.4.1.2
\ No newline at end of file
diff --git a/lib/libmpfr.so.4 b/lib/libmpfr.so.4
deleted file mode 120000
index edb9abd..0000000
--- a/lib/libmpfr.so.4
+++ /dev/null
@@ -1 +0,0 @@
-libmpfr.so.4.1.2
\ No newline at end of file
diff --git a/lib/libmpfr.so.4.1.2 b/lib/libmpfr.so.4.1.2
deleted file mode 100755
index a3183b6..0000000
--- a/lib/libmpfr.so.4.1.2
+++ /dev/null
Binary files differ
diff --git a/libexec/awk/grcat b/libexec/awk/grcat
index c3e270b..7d5367a 100755
--- a/libexec/awk/grcat
+++ b/libexec/awk/grcat
Binary files differ
diff --git a/libexec/awk/pwcat b/libexec/awk/pwcat
index f68b023..9fe2488 100755
--- a/libexec/awk/pwcat
+++ b/libexec/awk/pwcat
Binary files differ
diff --git a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/cc1 b/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/cc1
index 4372173..82fd24e 100755
--- a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/cc1
+++ b/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/cc1
Binary files differ
diff --git a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/cc1plus b/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/cc1plus
index 463e7cb..a7260d6 100755
--- a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/cc1plus
+++ b/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/cc1plus
Binary files differ
diff --git a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/collect2 b/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/collect2
index c4e1558..cae73ed 100755
--- a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/collect2
+++ b/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/collect2
Binary files differ
diff --git a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/install-tools/fixincl b/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/install-tools/fixincl
index adcaa2f..414cf76 100755
--- a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/install-tools/fixincl
+++ b/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/install-tools/fixincl
Binary files differ
diff --git a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/liblto_plugin.a b/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/liblto_plugin.a
new file mode 100644
index 0000000..54545a2
--- /dev/null
+++ b/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/liblto_plugin.a
Binary files differ
diff --git a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/liblto_plugin.la b/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/liblto_plugin.la
index 838c8dc..52d9cd0 100755
--- a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/liblto_plugin.la
+++ b/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/liblto_plugin.la
@@ -5,19 +5,19 @@
 # It is necessary for linking the library.
 
 # The name that we can dlopen(3).
-dlname='liblto_plugin.so.0'
+dlname=''
 
 # Names of this library.
-library_names='liblto_plugin.so.0.0.0 liblto_plugin.so.0 liblto_plugin.so'
+library_names=''
 
 # The name of the static archive.
-old_library=''
+old_library='liblto_plugin.a'
 
 # Linker flags that can not go in dependency_libs.
 inherited_linker_flags=''
 
 # Libraries that this one depends upon.
-dependency_libs=' -L/usr/local/google/home/jnewlin/src/uclibc/buildroot/output/host/lib -L/usr/local/google/home/jnewlin/src/uclibc/buildroot/output/host/usr/lib'
+dependency_libs=''
 
 # Names of additional weak libraries provided by this library
 weak_library_names=''
diff --git a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/liblto_plugin.so b/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/liblto_plugin.so
deleted file mode 120000
index f25ba88..0000000
--- a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/liblto_plugin.so
+++ /dev/null
@@ -1 +0,0 @@
-liblto_plugin.so.0.0.0
\ No newline at end of file
diff --git a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/liblto_plugin.so.0 b/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/liblto_plugin.so.0
deleted file mode 120000
index f25ba88..0000000
--- a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/liblto_plugin.so.0
+++ /dev/null
@@ -1 +0,0 @@
-liblto_plugin.so.0.0.0
\ No newline at end of file
diff --git a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/liblto_plugin.so.0.0.0 b/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/liblto_plugin.so.0.0.0
deleted file mode 100755
index 7310d39..0000000
--- a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/liblto_plugin.so.0.0.0
+++ /dev/null
Binary files differ
diff --git a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/lto-wrapper b/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/lto-wrapper
index ea800c5..fb2477b 100755
--- a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/lto-wrapper
+++ b/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/lto-wrapper
Binary files differ
diff --git a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/lto1 b/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/lto1
index e565447..6a71197 100755
--- a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/lto1
+++ b/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/lto1
Binary files differ
diff --git a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/gengtype b/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/gengtype
deleted file mode 100755
index a663446..0000000
--- a/libexec/gcc/arm-buildroot-linux-gnueabi/4.9.1/plugin/gengtype
+++ /dev/null
Binary files differ
diff --git a/share/info/dir b/share/info/dir
index dd385af..fe4fcce 100644
--- a/share/info/dir
+++ b/share/info/dir
@@ -61,6 +61,7 @@
 
 Software development
 * As: (as).                     The GNU assembler.
+* Bfd: (bfd).                   The Binary File Descriptor library.
 * Binutils: (binutils).         The GNU binary utilities.
 * Gas: (as).                    The GNU assembler.
 * Ld: (ld).                     The GNU linker.
diff --git a/share/man/man1/arm-buildroot-linux-gnueabi-g++.1 b/share/man/man1/arm-buildroot-linux-gnueabi-g++.1
index f014059..641ffd5 100644
--- a/share/man/man1/arm-buildroot-linux-gnueabi-g++.1
+++ b/share/man/man1/arm-buildroot-linux-gnueabi-g++.1
@@ -1,4 +1,4 @@
-.\" Automatically generated by Pod::Man 2.25 (Pod::Simple 3.16)
+.\" Automatically generated by Pod::Man 2.27 (Pod::Simple 3.28)
 .\"
 .\" Standard preamble:
 .\" ========================================================================
@@ -38,6 +38,8 @@
 .    ds PI \(*p
 .    ds L" ``
 .    ds R" ''
+.    ds C`
+.    ds C'
 'br\}
 .\"
 .\" Escape single quotes in literal strings from groff's Unicode transform.
@@ -48,17 +50,24 @@
 .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
 .\" entries marked with X<> in POD.  Of course, you'll have to process the
 .\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
 ..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{
+.    if \nF \{
+.        de IX
+.        tm Index:\\$1\t\\n%\t"\\$2"
 ..
+.        if !\nF==2 \{
+.            nr % 0
+.            nr F 2
+.        \}
+.    \}
 .\}
+.rr rF
 .\"
 .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
 .\" Fear.  Run.  Save yourself.  No user-serviceable parts.
@@ -145,7 +154,7 @@
 remainder.  \fBg++\fR accepts mostly the same options as \fBgcc\fR.
 .SH "DESCRIPTION"
 .IX Header "DESCRIPTION"
-When you invoke \s-1GCC\s0, it normally does preprocessing, compilation,
+When you invoke \s-1GCC,\s0 it normally does preprocessing, compilation,
 assembly and linking.  The \*(L"overall options\*(R" allow you to stop this
 process at an intermediate stage.  For example, the \fB\-c\fR option
 says not to run the linker.  Then the output consists of object files
@@ -1404,7 +1413,7 @@
 .IX Item "language"
 Display the options supported for \fIlanguage\fR, where
 \&\fIlanguage\fR is the name of one of the languages supported in this
-version of \s-1GCC\s0.
+version of \s-1GCC.\s0
 .IP "\fBcommon\fR" 4
 .IX Item "common"
 Display the options that are common to all languages.
@@ -1501,7 +1510,7 @@
 prefix.
 .IP "\fB\-\-version\fR" 4
 .IX Item "--version"
-Display the version number and copyrights of the invoked \s-1GCC\s0.
+Display the version number and copyrights of the invoked \s-1GCC.\s0
 .IP "\fB\-wrapper\fR" 4
 .IX Item "-wrapper"
 Invoke all subcommands under a wrapper program.  The name of the
@@ -1523,7 +1532,7 @@
 purposes of argument parsing (See
 \&\fB\-fplugin\-arg\-\fR\fIname\fR\fB\-\fR\fIkey\fR\fB=\fR\fIvalue\fR below).
 Each plugin should define the callback functions specified in the
-Plugins \s-1API\s0.
+Plugins \s-1API.\s0
 .IP "\fB\-fplugin\-arg\-\fR\fIname\fR\fB\-\fR\fIkey\fR\fB=\fR\fIvalue\fR" 4
 .IX Item "-fplugin-arg-name-key=value"
 Define an argument called \fIkey\fR with a value of \fIvalue\fR
@@ -1556,7 +1565,7 @@
 with a backslash.  The \fIfile\fR may itself contain additional
 @\fIfile\fR options; any such options will be processed recursively.
 .SS "Compiling \*(C+ Programs"
-.IX Subsection "Compiling  Programs"
+.IX Subsection "Compiling Programs"
 \&\*(C+ source files conventionally use one of the suffixes \fB.C\fR,
 \&\fB.cc\fR, \fB.cpp\fR, \fB.CPP\fR, \fB.c++\fR, \fB.cp\fR, or
 \&\fB.cxx\fR; \*(C+ header files often use \fB.hh\fR, \fB.hpp\fR,
@@ -1589,8 +1598,8 @@
 In C mode, this is equivalent to \fB\-std=c90\fR. In \*(C+ mode, it is
 equivalent to \fB\-std=c++98\fR.
 .Sp
-This turns off certain features of \s-1GCC\s0 that are incompatible with \s-1ISO\s0
-C90 (when compiling C code), or of standard \*(C+ (when compiling \*(C+ code),
+This turns off certain features of \s-1GCC\s0 that are incompatible with \s-1ISO
+C90 \s0(when compiling C code), or of standard \*(C+ (when compiling \*(C+ code),
 such as the \f(CW\*(C`asm\*(C'\fR and \f(CW\*(C`typeof\*(C'\fR keywords, and
 predefined macros such as \f(CW\*(C`unix\*(C'\fR and \f(CW\*(C`vax\*(C'\fR that identify the
 type of system you are using.  It also enables the undesirable and
@@ -1600,7 +1609,7 @@
 .Sp
 The alternate keywords \f(CW\*(C`_\|_asm_\|_\*(C'\fR, \f(CW\*(C`_\|_extension_\|_\*(C'\fR,
 \&\f(CW\*(C`_\|_inline_\|_\*(C'\fR and \f(CW\*(C`_\|_typeof_\|_\*(C'\fR continue to work despite
-\&\fB\-ansi\fR.  You would not want to use them in an \s-1ISO\s0 C program, of
+\&\fB\-ansi\fR.  You would not want to use them in an \s-1ISO C\s0 program, of
 course, but it is useful to put them in header files that might be included
 in compilations done with \fB\-ansi\fR.  Alternate predefined macros
 such as \f(CW\*(C`_\|_unix_\|_\*(C'\fR and \f(CW\*(C`_\|_vax_\|_\*(C'\fR are also available, with or
@@ -1617,7 +1626,7 @@
 programs that might use these names for other things.
 .Sp
 Functions that are normally built in but do not have semantics
-defined by \s-1ISO\s0 C (such as \f(CW\*(C`alloca\*(C'\fR and \f(CW\*(C`ffs\*(C'\fR) are not built-in
+defined by \s-1ISO C \s0(such as \f(CW\*(C`alloca\*(C'\fR and \f(CW\*(C`ffs\*(C'\fR) are not built-in
 functions when \fB\-ansi\fR is used.
 .IP "\fB\-std=\fR" 4
 .IX Item "-std="
@@ -1630,9 +1639,9 @@
 compiler accepts all programs following that standard plus those
 using \s-1GNU\s0 extensions that do not contradict it.  For example,
 \&\fB\-std=c90\fR turns off certain features of \s-1GCC\s0 that are
-incompatible with \s-1ISO\s0 C90, such as the \f(CW\*(C`asm\*(C'\fR and \f(CW\*(C`typeof\*(C'\fR
+incompatible with \s-1ISO C90,\s0 such as the \f(CW\*(C`asm\*(C'\fR and \f(CW\*(C`typeof\*(C'\fR
 keywords, but not other \s-1GNU\s0 extensions that do not have a meaning in
-\&\s-1ISO\s0 C90, such as omitting the middle term of a \f(CW\*(C`?:\*(C'\fR
+\&\s-1ISO C90,\s0 such as omitting the middle term of a \f(CW\*(C`?:\*(C'\fR
 expression. On the other hand, when a \s-1GNU\s0 dialect of a standard is
 specified, all features supported by the compiler are enabled, even when
 those features change the meaning of the base standard.  As a result, some
@@ -1652,11 +1661,11 @@
 .IP "\fBiso9899:1990\fR" 4
 .IX Item "iso9899:1990"
 .PD
-Support all \s-1ISO\s0 C90 programs (certain \s-1GNU\s0 extensions that conflict
-with \s-1ISO\s0 C90 are disabled). Same as \fB\-ansi\fR for C code.
+Support all \s-1ISO C90\s0 programs (certain \s-1GNU\s0 extensions that conflict
+with \s-1ISO C90\s0 are disabled). Same as \fB\-ansi\fR for C code.
 .IP "\fBiso9899:199409\fR" 4
 .IX Item "iso9899:199409"
-\&\s-1ISO\s0 C90 as modified in amendment 1.
+\&\s-1ISO C90\s0 as modified in amendment 1.
 .IP "\fBc99\fR" 4
 .IX Item "c99"
 .PD 0
@@ -1667,7 +1676,7 @@
 .IP "\fBiso9899:199x\fR" 4
 .IX Item "iso9899:199x"
 .PD
-\&\s-1ISO\s0 C99.  This standard is substantially completely supported, modulo
+\&\s-1ISO C99. \s0 This standard is substantially completely supported, modulo
 bugs, extended identifiers (supported except for corner cases when
 \&\fB\-fextended\-identifiers\fR is used) and floating-point issues
 (mainly but not entirely relating to optional C99 features from
@@ -1682,7 +1691,7 @@
 .IP "\fBiso9899:2011\fR" 4
 .IX Item "iso9899:2011"
 .PD
-\&\s-1ISO\s0 C11, the 2011 revision of the \s-1ISO\s0 C standard.  This standard is
+\&\s-1ISO C11,\s0 the 2011 revision of the \s-1ISO C\s0 standard.  This standard is
 substantially completely supported, modulo bugs, extended identifiers
 (supported except for corner cases when
 \&\fB\-fextended\-identifiers\fR is used), floating-point issues
@@ -1695,7 +1704,7 @@
 .IP "\fBgnu89\fR" 4
 .IX Item "gnu89"
 .PD
-\&\s-1GNU\s0 dialect of \s-1ISO\s0 C90 (including some C99 features). This
+\&\s-1GNU\s0 dialect of \s-1ISO C90 \s0(including some C99 features). This
 is the default for C code.
 .IP "\fBgnu99\fR" 4
 .IX Item "gnu99"
@@ -1703,22 +1712,22 @@
 .IP "\fBgnu9x\fR" 4
 .IX Item "gnu9x"
 .PD
-\&\s-1GNU\s0 dialect of \s-1ISO\s0 C99.  The name \fBgnu9x\fR is deprecated.
+\&\s-1GNU\s0 dialect of \s-1ISO C99. \s0 The name \fBgnu9x\fR is deprecated.
 .IP "\fBgnu11\fR" 4
 .IX Item "gnu11"
 .PD 0
 .IP "\fBgnu1x\fR" 4
 .IX Item "gnu1x"
 .PD
-\&\s-1GNU\s0 dialect of \s-1ISO\s0 C11.  This is intended to become the default in a
-future release of \s-1GCC\s0.  The name \fBgnu1x\fR is deprecated.
+\&\s-1GNU\s0 dialect of \s-1ISO C11. \s0 This is intended to become the default in a
+future release of \s-1GCC. \s0 The name \fBgnu1x\fR is deprecated.
 .IP "\fBc++98\fR" 4
 .IX Item "c++98"
 .PD 0
 .IP "\fBc++03\fR" 4
 .IX Item "c++03"
 .PD
-The 1998 \s-1ISO\s0 \*(C+ standard plus the 2003 technical corrigendum and some
+The 1998 \s-1ISO \*(C+\s0 standard plus the 2003 technical corrigendum and some
 additional defect reports. Same as \fB\-ansi\fR for \*(C+ code.
 .IP "\fBgnu++98\fR" 4
 .IX Item "gnu++98"
@@ -1734,7 +1743,7 @@
 .IP "\fBc++0x\fR" 4
 .IX Item "c++0x"
 .PD
-The 2011 \s-1ISO\s0 \*(C+ standard plus amendments.
+The 2011 \s-1ISO \*(C+\s0 standard plus amendments.
 The name \fBc++0x\fR is deprecated.
 .IP "\fBgnu++11\fR" 4
 .IX Item "gnu++11"
@@ -1746,7 +1755,7 @@
 The name \fBgnu++0x\fR is deprecated.
 .IP "\fBc++1y\fR" 4
 .IX Item "c++1y"
-The next revision of the \s-1ISO\s0 \*(C+ standard, tentatively planned for
+The next revision of the \s-1ISO \*(C+\s0 standard, tentatively planned for
 2014.  Support is highly experimental, and will almost certainly
 change in incompatible ways in future releases.
 .IP "\fBgnu++1y\fR" 4
@@ -1770,7 +1779,7 @@
 The option \fB\-fno\-gnu89\-inline\fR explicitly tells \s-1GCC\s0 to use the
 C99 semantics for \f(CW\*(C`inline\*(C'\fR when in C99 or gnu99 mode (i.e., it
 specifies the default behavior).  This option was first supported in
-\&\s-1GCC\s0 4.3.  This option is not supported in \fB\-std=c90\fR or
+\&\s-1GCC 4.3. \s0 This option is not supported in \fB\-std=c90\fR or
 \&\fB\-std=gnu90\fR mode.
 .Sp
 The preprocessor macros \f(CW\*(C`_\|_GNUC_GNU_INLINE_\|_\*(C'\fR and
@@ -1810,7 +1819,7 @@
 use the \fB\-fno\-gnu\-keywords\fR flag instead, which has the same
 effect.  In C99 mode (\fB\-std=c99\fR or \fB\-std=gnu99\fR), this
 switch only affects the \f(CW\*(C`asm\*(C'\fR and \f(CW\*(C`typeof\*(C'\fR keywords, since
-\&\f(CW\*(C`inline\*(C'\fR is a standard keyword in \s-1ISO\s0 C99.
+\&\f(CW\*(C`inline\*(C'\fR is a standard keyword in \s-1ISO C99.\s0
 .IP "\fB\-fno\-builtin\fR" 4
 .IX Item "-fno-builtin"
 .PD 0
@@ -1838,7 +1847,7 @@
 With the \fB\-fno\-builtin\-\fR\fIfunction\fR option
 only the built-in function \fIfunction\fR is
 disabled.  \fIfunction\fR must not begin with \fB_\|_builtin_\fR.  If a
-function is named that is not built-in in this version of \s-1GCC\s0, this
+function is named that is not built-in in this version of \s-1GCC,\s0 this
 option is ignored.  There is no corresponding
 \&\fB\-fbuiltin\-\fR\fIfunction\fR option; if you wish to enable
 built-in functions selectively when using \fB\-fno\-builtin\fR or
@@ -1892,7 +1901,7 @@
 generates code for the Linux variant of Intel's current Transactional
 Memory \s-1ABI\s0 specification document (Revision 1.1, May 6 2009).  This is
 an experimental feature whose interface may change in future versions
-of \s-1GCC\s0, as the official specification changes.  Please note that not
+of \s-1GCC,\s0 as the official specification changes.  Please note that not
 all architectures are supported for this feature.
 .Sp
 For more information on \s-1GCC\s0's support for transactional memory,
@@ -1929,8 +1938,8 @@
 supported for C, not \*(C+.
 .IP "\fB\-trigraphs\fR" 4
 .IX Item "-trigraphs"
-Support \s-1ISO\s0 C trigraphs.  The \fB\-ansi\fR option (and \fB\-std\fR
-options for strict \s-1ISO\s0 C conformance) implies \fB\-trigraphs\fR.
+Support \s-1ISO C\s0 trigraphs.  The \fB\-ansi\fR option (and \fB\-std\fR
+options for strict \s-1ISO C\s0 conformance) implies \fB\-trigraphs\fR.
 .IP "\fB\-traditional\fR" 4
 .IX Item "-traditional"
 .PD 0
@@ -1939,8 +1948,8 @@
 .PD
 Formerly, these options caused \s-1GCC\s0 to attempt to emulate a pre-standard
 C compiler.  They are now only supported with the \fB\-E\fR switch.
-The preprocessor continues to support a pre-standard mode.  See the \s-1GNU\s0
-\&\s-1CPP\s0 manual for details.
+The preprocessor continues to support a pre-standard mode.  See the \s-1GNU
+CPP\s0 manual for details.
 .IP "\fB\-fcond\-mismatch\fR" 4
 .IX Item "-fcond-mismatch"
 Allow conditional expressions with mismatched types in the second and
@@ -1991,7 +2000,7 @@
 default, such a bit-field is signed, because this is consistent: the
 basic integer types such as \f(CW\*(C`int\*(C'\fR are signed types.
 .SS "Options Controlling \*(C+ Dialect"
-.IX Subsection "Options Controlling  Dialect"
+.IX Subsection "Options Controlling Dialect"
 This section describes the command-line options that are only meaningful
 for \*(C+ programs.  You can also use most of the \s-1GNU\s0 compiler options
 regardless of what language your program is in.  For example, you
@@ -2003,12 +2012,12 @@
 .PP
 In this example, only \fB\-frepo\fR is an option meant
 only for \*(C+ programs; you can use the other options with any
-language supported by \s-1GCC\s0.
+language supported by \s-1GCC.\s0
 .PP
 Here is a list of options that are \fIonly\fR for compiling \*(C+ programs:
 .IP "\fB\-fabi\-version=\fR\fIn\fR" 4
 .IX Item "-fabi-version=n"
-Use version \fIn\fR of the \*(C+ \s-1ABI\s0.  The default is version 2.
+Use version \fIn\fR of the \*(C+ \s-1ABI. \s0 The default is version 2.
 .Sp
 Version 0 refers to the version conforming most closely to
 the \*(C+ \s-1ABI\s0 specification.  Therefore, the \s-1ABI\s0 obtained using version 0
@@ -2083,7 +2092,7 @@
 visible outside the scope of the class in which they are declared.
 Friend functions were documented to work this way in the old Annotated
 \&\*(C+ Reference Manual, and versions of G++ before 4.1 always worked
-that way.  However, in \s-1ISO\s0 \*(C+ a friend function that is not declared
+that way.  However, in \s-1ISO \*(C+\s0 a friend function that is not declared
 in an enclosing scope can only be found using argument dependent
 lookup.  This option causes friends to be injected as they were in
 earlier releases.
@@ -2167,12 +2176,12 @@
 errors if these functions are not inlined everywhere they are called.
 .IP "\fB\-fms\-extensions\fR" 4
 .IX Item "-fms-extensions"
-Disable Wpedantic warnings about constructs used in \s-1MFC\s0, such as implicit
+Disable Wpedantic warnings about constructs used in \s-1MFC,\s0 such as implicit
 int and getting a pointer to member function via non-standard syntax.
 .IP "\fB\-fno\-nonansi\-builtins\fR" 4
 .IX Item "-fno-nonansi-builtins"
 Disable built-in declarations of functions that are not mandated by
-\&\s-1ANSI/ISO\s0 C.  These include \f(CW\*(C`ffs\*(C'\fR, \f(CW\*(C`alloca\*(C'\fR, \f(CW\*(C`_exit\*(C'\fR,
+\&\s-1ANSI/ISO C. \s0 These include \f(CW\*(C`ffs\*(C'\fR, \f(CW\*(C`alloca\*(C'\fR, \f(CW\*(C`_exit\*(C'\fR,
 \&\f(CW\*(C`index\*(C'\fR, \f(CW\*(C`bzero\*(C'\fR, \f(CW\*(C`conjf\*(C'\fR, and other related functions.
 .IP "\fB\-fnothrow\-opt\fR" 4
 .IX Item "-fnothrow-opt"
@@ -2246,7 +2255,7 @@
 .IX Item "-ftemplate-depth=n"
 Set the maximum instantiation depth for template classes to \fIn\fR.
 A limit on the template instantiation depth is needed to detect
-endless recursions during template class instantiation.  \s-1ANSI/ISO\s0 \*(C+
+endless recursions during template class instantiation.  \s-1ANSI/ISO \*(C+\s0
 conforming programs must not rely on a maximum depth greater than 17
 (changed to 1024 in \*(C+11).  The default value is 900, as the compiler
 can run out of stack space before hitting 1024 in some situations.
@@ -2277,7 +2286,7 @@
 The effect of this is that \s-1GCC\s0 may, effectively, mark inline methods with
 \&\f(CW\*(C`_\|_attribute_\|_ ((visibility ("hidden")))\*(C'\fR so that they do not
 appear in the export table of a \s-1DSO\s0 and do not require a \s-1PLT\s0 indirection
-when used within the \s-1DSO\s0.  Enabling this option can have a dramatic effect
+when used within the \s-1DSO. \s0 Enabling this option can have a dramatic effect
 on load and link times of a \s-1DSO\s0 as it massively reduces the size of the
 dynamic export table when the library makes heavy use of templates.
 .Sp
@@ -2389,9 +2398,9 @@
 In addition, these optimization, warning, and code generation options
 have meanings only for \*(C+ programs:
 .IP "\fB\-Wabi\fR (C, Objective-C, \*(C+ and Objective\-\*(C+ only)" 4
-.IX Item "-Wabi (C, Objective-C,  and Objective- only)"
+.IX Item "-Wabi (C, Objective-C, and Objective- only)"
 Warn when G++ generates code that is probably not compatible with the
-vendor-neutral \*(C+ \s-1ABI\s0.  Although an effort has been made to warn about
+vendor-neutral \*(C+ \s-1ABI. \s0 Although an effort has been made to warn about
 all such cases, there are probably some cases that are not warned about,
 even though G++ is generating incompatible code.  There may also be
 cases where warnings are emitted even though the code that is generated
@@ -2604,7 +2613,7 @@
 \&\fB\-std=c++98\fR, \fB\-std=gnu++98\fR, \fB\-std=gnu++11\fR,
 \&\fB\-std=gnu++1y\fR.
 This option is off by default
-for \s-1ISO\s0 \*(C+11 onwards (\fB\-std=c++11\fR, ...).
+for \s-1ISO \*(C+11\s0 onwards (\fB\-std=c++11\fR, ...).
 .PP
 The following \fB\-W...\fR options are not affected by \fB\-Wall\fR.
 .IP "\fB\-Weffc++\fR (\*(C+ and Objective\-\*(C+ only)" 4
@@ -2716,7 +2725,7 @@
 .PP
 In this example, \fB\-fgnu\-runtime\fR is an option meant only for
 Objective-C and Objective\-\*(C+ programs; you can use the other options with
-any language supported by \s-1GCC\s0.
+any language supported by \s-1GCC.\s0
 .PP
 Note that since Objective-C is an extension of the C language, Objective-C
 compilations may also use options specific to the C front-end (e.g.,
@@ -2741,7 +2750,7 @@
 .IP "\fB\-fnext\-runtime\fR" 4
 .IX Item "-fnext-runtime"
 Generate output compatible with the NeXT runtime.  This is the default
-for NeXT-based systems, including Darwin and Mac \s-1OS\s0 X.  The macro
+for NeXT-based systems, including Darwin and Mac \s-1OS X. \s0 The macro
 \&\f(CW\*(C`_\|_NEXT_RUNTIME_\|_\*(C'\fR is predefined if (and only if) this option is
 used.
 .IP "\fB\-fno\-nil\-receivers\fR" 4
@@ -2758,7 +2767,7 @@
 case, Version 0 is the traditional (32\-bit) \s-1ABI\s0 without support for
 properties and other Objective-C 2.0 additions.  Version 1 is the
 traditional (32\-bit) \s-1ABI\s0 with support for properties and other
-Objective-C 2.0 additions.  Version 2 is the modern (64\-bit) \s-1ABI\s0.  If
+Objective-C 2.0 additions.  Version 2 is the modern (64\-bit) \s-1ABI. \s0 If
 nothing is specified, the default is Version 0 on 32\-bit target
 machines, and Version 2 on 64\-bit target machines.
 .IP "\fB\-fobjc\-call\-cxx\-cdtors\fR" 4
@@ -2782,7 +2791,7 @@
 the \f(CW\*(C`\- (void) .cxx_destruct\*(C'\fR methods are invoked immediately
 before the runtime deallocates an object instance.
 .Sp
-As of this writing, only the NeXT runtime on Mac \s-1OS\s0 X 10.4 and later has
+As of this writing, only the NeXT runtime on Mac \s-1OS X 10.4\s0 and later has
 support for invoking the \f(CW\*(C`\- (id) .cxx_construct\*(C'\fR and
 \&\f(CW\*(C`\- (void) .cxx_destruct\*(C'\fR methods.
 .IP "\fB\-fobjc\-direct\-dispatch\fR" 4
@@ -2797,7 +2806,7 @@
 \&\f(CW@throw\fR, \f(CW@catch\fR, \f(CW@finally\fR and
 \&\f(CW@synchronized\fR.  This option is available with both the \s-1GNU\s0
 runtime and the NeXT runtime (but not available in conjunction with
-the NeXT runtime on Mac \s-1OS\s0 X 10.2 and earlier).
+the NeXT runtime on Mac \s-1OS X 10.2\s0 and earlier).
 .IP "\fB\-fobjc\-gc\fR" 4
 .IX Item "-fobjc-gc"
 Enable garbage collection (\s-1GC\s0) in Objective-C and Objective\-\*(C+
@@ -2806,23 +2815,23 @@
 does not require special compiler flags.
 .IP "\fB\-fobjc\-nilcheck\fR" 4
 .IX Item "-fobjc-nilcheck"
-For the NeXT runtime with version 2 of the \s-1ABI\s0, check for a nil
+For the NeXT runtime with version 2 of the \s-1ABI,\s0 check for a nil
 receiver in method invocations before doing the actual method call.
 This is the default and can be disabled using
 \&\fB\-fno\-objc\-nilcheck\fR.  Class methods and super calls are never
 checked for nil in this way no matter what this flag is set to.
 Currently this flag does nothing when the \s-1GNU\s0 runtime, or an older
-version of the NeXT runtime \s-1ABI\s0, is used.
+version of the NeXT runtime \s-1ABI,\s0 is used.
 .IP "\fB\-fobjc\-std=objc1\fR" 4
 .IX Item "-fobjc-std=objc1"
 Conform to the language syntax of Objective-C 1.0, the language
-recognized by \s-1GCC\s0 4.0.  This only affects the Objective-C additions to
+recognized by \s-1GCC 4.0. \s0 This only affects the Objective-C additions to
 the C/\*(C+ language; it does not affect conformance to C/\*(C+ standards,
 which is controlled by the separate C/\*(C+ dialect option flags.  When
 this option is used with the Objective-C or Objective\-\*(C+ compiler,
-any Objective-C syntax that is not recognized by \s-1GCC\s0 4.0 is rejected.
+any Objective-C syntax that is not recognized by \s-1GCC 4.0\s0 is rejected.
 This is useful if you need to make sure that your Objective-C code can
-be compiled with older versions of \s-1GCC\s0.
+be compiled with older versions of \s-1GCC.\s0
 .IP "\fB\-freplace\-objc\-classes\fR" 4
 .IX Item "-freplace-objc-classes"
 Emit a special marker instructing \fB\f(BIld\fB\|(1)\fR not to statically link in
@@ -2831,7 +2840,7 @@
 debugging mode, where the object file in question may be recompiled and
 dynamically reloaded in the course of program execution, without the need
 to restart the program itself.  Currently, Fix-and-Continue functionality
-is only available in conjunction with the NeXT runtime on Mac \s-1OS\s0 X 10.3
+is only available in conjunction with the NeXT runtime on Mac \s-1OS X 10.3\s0
 and later.
 .IP "\fB\-fzero\-link\fR" 4
 .IX Item "-fzero-link"
@@ -2910,7 +2919,7 @@
 .IX Item "-fmessage-length=n"
 Try to format error messages so that they fit on lines of about \fIn\fR
 characters.  The default is 72 characters for \fBg++\fR and 0 for the rest of
-the front ends supported by \s-1GCC\s0.  If \fIn\fR is zero, then no
+the front ends supported by \s-1GCC. \s0 If \fIn\fR is zero, then no
 line-wrapping is done; each error message appears on a single
 line.
 .IP "\fB\-fdiagnostics\-show\-location=once\fR" 4
@@ -3018,7 +3027,7 @@
 may have been an error.
 .PP
 The following language-independent options do not enable specific
-warnings but control the kinds of diagnostics produced by \s-1GCC\s0.
+warnings but control the kinds of diagnostics produced by \s-1GCC.\s0
 .IP "\fB\-fsyntax\-only\fR" 4
 .IX Item "-fsyntax-only"
 Check the code for syntax errors, but don't do anything beyond that.
@@ -3084,14 +3093,14 @@
 .IP "\fB\-pedantic\fR" 4
 .IX Item "-pedantic"
 .PD
-Issue all the warnings demanded by strict \s-1ISO\s0 C and \s-1ISO\s0 \*(C+;
+Issue all the warnings demanded by strict \s-1ISO C\s0 and \s-1ISO \*(C+\s0;
 reject all programs that use forbidden extensions, and some other
-programs that do not follow \s-1ISO\s0 C and \s-1ISO\s0 \*(C+.  For \s-1ISO\s0 C, follows the
-version of the \s-1ISO\s0 C standard specified by any \fB\-std\fR option used.
+programs that do not follow \s-1ISO C\s0 and \s-1ISO \*(C+. \s0 For \s-1ISO C,\s0 follows the
+version of the \s-1ISO C\s0 standard specified by any \fB\-std\fR option used.
 .Sp
-Valid \s-1ISO\s0 C and \s-1ISO\s0 \*(C+ programs should compile properly with or without
+Valid \s-1ISO C\s0 and \s-1ISO \*(C+\s0 programs should compile properly with or without
 this option (though a rare few require \fB\-ansi\fR or a
-\&\fB\-std\fR option specifying the required version of \s-1ISO\s0 C).  However,
+\&\fB\-std\fR option specifying the required version of \s-1ISO C\s0).  However,
 without this option, certain \s-1GNU\s0 extensions and traditional C and \*(C+
 features are supported as well.  With this option, they are rejected.
 .Sp
@@ -3101,24 +3110,24 @@
 \&\f(CW\*(C`_\|_extension_\|_\*(C'\fR.  However, only system header files should use
 these escape routes; application programs should avoid them.
 .Sp
-Some users try to use \fB\-Wpedantic\fR to check programs for strict \s-1ISO\s0
-C conformance.  They soon find that it does not do quite what they want:
+Some users try to use \fB\-Wpedantic\fR to check programs for strict \s-1ISO
+C\s0 conformance.  They soon find that it does not do quite what they want:
 it finds some non-ISO practices, but not all\-\-\-only those for which
-\&\s-1ISO\s0 C \fIrequires\fR a diagnostic, and some others for which
+\&\s-1ISO C \s0\fIrequires\fR a diagnostic, and some others for which
 diagnostics have been added.
 .Sp
-A feature to report any failure to conform to \s-1ISO\s0 C might be useful in
+A feature to report any failure to conform to \s-1ISO C\s0 might be useful in
 some instances, but would require considerable additional work and would
 be quite different from \fB\-Wpedantic\fR.  We don't have plans to
 support such a feature in the near future.
 .Sp
 Where the standard specified with \fB\-std\fR represents a \s-1GNU\s0
 extended dialect of C, such as \fBgnu90\fR or \fBgnu99\fR, there is a
-corresponding \fIbase standard\fR, the version of \s-1ISO\s0 C on which the \s-1GNU\s0
+corresponding \fIbase standard\fR, the version of \s-1ISO C\s0 on which the \s-1GNU\s0
 extended dialect is based.  Warnings from \fB\-Wpedantic\fR are given
 where they are required by the base standard.  (It does not make sense
-for such warnings to be given only for features not in the specified \s-1GNU\s0
-C dialect, since by definition the \s-1GNU\s0 dialects of C include all
+for such warnings to be given only for features not in the specified \s-1GNU
+C\s0 dialect, since by definition the \s-1GNU\s0 dialects of C include all
 features the compiler supports with the given option, and there would be
 nothing to warn about.)
 .IP "\fB\-pedantic\-errors\fR" 4
@@ -3286,7 +3295,7 @@
 \&\fB\-ffreestanding\fR or \fB\-fno\-builtin\fR.
 .Sp
 The formats are checked against the format features supported by \s-1GNU\s0
-libc version 2.2.  These include all \s-1ISO\s0 C90 and C99 features, as well
+libc version 2.2.  These include all \s-1ISO C90\s0 and C99 features, as well
 as features from the Single Unix Specification and some \s-1BSD\s0 and \s-1GNU\s0
 extensions.  Other library implementations may not support all these
 features; \s-1GCC\s0 does not support warning about features that go beyond a
@@ -3398,12 +3407,12 @@
 Same as \fB\-Wimplicit\-int\fR and \fB\-Wimplicit\-function\-declaration\fR.
 This warning is enabled by \fB\-Wall\fR.
 .IP "\fB\-Wignored\-qualifiers\fR (C and \*(C+ only)" 4
-.IX Item "-Wignored-qualifiers (C and  only)"
+.IX Item "-Wignored-qualifiers (C and only)"
 Warn if the return type of a function has a type qualifier
-such as \f(CW\*(C`const\*(C'\fR.  For \s-1ISO\s0 C such a type qualifier has no effect,
+such as \f(CW\*(C`const\*(C'\fR.  For \s-1ISO C\s0 such a type qualifier has no effect,
 since the value returned by a function is not an lvalue.
 For \*(C+, the warning is only emitted for scalar types or \f(CW\*(C`void\*(C'\fR.
-\&\s-1ISO\s0 C prohibits qualified \f(CW\*(C`void\*(C'\fR return types on function
+\&\s-1ISO C\s0 prohibits qualified \f(CW\*(C`void\*(C'\fR return types on function
 definitions, so such return types always receive a warning
 even without this option.
 .Sp
@@ -3570,9 +3579,9 @@
 warning about an omitted enumeration code even if there is a
 \&\f(CW\*(C`default\*(C'\fR label.
 .IP "\fB\-Wsync\-nand\fR (C and \*(C+ only)" 4
-.IX Item "-Wsync-nand (C and  only)"
+.IX Item "-Wsync-nand (C and only)"
 Warn when \f(CW\*(C`_\|_sync_fetch_and_nand\*(C'\fR and \f(CW\*(C`_\|_sync_nand_and_fetch\*(C'\fR
-built-in functions are used.  These functions changed semantics in \s-1GCC\s0 4.4.
+built-in functions are used.  These functions changed semantics in \s-1GCC 4.4.\s0
 .IP "\fB\-Wtrigraphs\fR" 4
 .IX Item "-Wtrigraphs"
 Warn if any trigraphs are encountered that might change the meaning of
@@ -3609,7 +3618,7 @@
 .Sp
 To suppress this warning use the \fBunused\fR attribute.
 .IP "\fB\-Wunused\-local\-typedefs\fR (C, Objective-C, \*(C+ and Objective\-\*(C+ only)" 4
-.IX Item "-Wunused-local-typedefs (C, Objective-C,  and Objective- only)"
+.IX Item "-Wunused-local-typedefs (C, Objective-C, and Objective- only)"
 Warn when a typedef locally defined in a function is not used.
 This warning is enabled by \fB\-Wall\fR.
 .IP "\fB\-Wunused\-parameter\fR" 4
@@ -3716,7 +3725,7 @@
 .IP "\fB\-Wunknown\-pragmas\fR" 4
 .IX Item "-Wunknown-pragmas"
 Warn when a \f(CW\*(C`#pragma\*(C'\fR directive is encountered that is not understood by 
-\&\s-1GCC\s0.  If this command-line option is used, warnings are even issued
+\&\s-1GCC. \s0 If this command-line option is used, warnings are even issued
 for unknown pragmas in system header files.  This is not the case if
 the warnings are only enabled by the \fB\-Wall\fR command-line option.
 .IP "\fB\-Wno\-pragmas\fR" 4
@@ -3917,13 +3926,13 @@
 .IP "\fB\-Wtraditional\fR (C and Objective-C only)" 4
 .IX Item "-Wtraditional (C and Objective-C only)"
 Warn about certain constructs that behave differently in traditional and
-\&\s-1ISO\s0 C.  Also warn about \s-1ISO\s0 C constructs that have no traditional C
+\&\s-1ISO C. \s0 Also warn about \s-1ISO C\s0 constructs that have no traditional C
 equivalent, and/or problematic constructs that should be avoided.
 .RS 4
 .IP "\(bu" 4
 Macro parameters that appear within string literals in the macro body.
 In traditional C macro replacement takes place within string literals,
-but in \s-1ISO\s0 C it does not.
+but in \s-1ISO C\s0 it does not.
 .IP "\(bu" 4
 In traditional C, some preprocessor directives did not exist.
 Traditional preprocessors only considered a line to be a directive
@@ -3978,9 +3987,9 @@
 C causes serious problems.  This is a subset of the possible
 conversion warnings; for the full set use \fB\-Wtraditional\-conversion\fR.
 .IP "\(bu" 4
-Use of \s-1ISO\s0 C style function definitions.  This warning intentionally is
+Use of \s-1ISO C\s0 style function definitions.  This warning intentionally is
 \&\fInot\fR issued for prototype declarations or variadic functions
-because these \s-1ISO\s0 C features appear in your code when using
+because these \s-1ISO C\s0 features appear in your code when using
 libiberty's traditional C compatibility macros, \f(CW\*(C`PARAMS\*(C'\fR and
 \&\f(CW\*(C`VPARAMS\*(C'\fR.  This warning is also bypassed for nested functions
 because that feature is already a \s-1GCC\s0 extension and thus not relevant to
@@ -3998,9 +4007,9 @@
 .IP "\fB\-Wdeclaration\-after\-statement\fR (C and Objective-C only)" 4
 .IX Item "-Wdeclaration-after-statement (C and Objective-C only)"
 Warn when a declaration is found after a statement in a block.  This
-construct, known from \*(C+, was introduced with \s-1ISO\s0 C99 and is by default
-allowed in \s-1GCC\s0.  It is not supported by \s-1ISO\s0 C90 and was not supported by
-\&\s-1GCC\s0 versions before \s-1GCC\s0 3.0.
+construct, known from \*(C+, was introduced with \s-1ISO C99\s0 and is by default
+allowed in \s-1GCC. \s0 It is not supported by \s-1ISO C90\s0 and was not supported by
+\&\s-1GCC\s0 versions before \s-1GCC 3.0.  \s0
 .IP "\fB\-Wundef\fR" 4
 .IX Item "-Wundef"
 Warn if an undefined identifier is evaluated in an \fB#if\fR directive.
@@ -4077,7 +4086,7 @@
 .IP "\fB\-Wpointer\-arith\fR" 4
 .IX Item "-Wpointer-arith"
 Warn about anything that depends on the \*(L"size of\*(R" a function type or
-of \f(CW\*(C`void\*(C'\fR.  \s-1GNU\s0 C assigns these types a size of 1, for
+of \f(CW\*(C`void\*(C'\fR.  \s-1GNU C\s0 assigns these types a size of 1, for
 convenience in calculations with \f(CW\*(C`void *\*(C'\fR pointers and pointers
 to functions.  In \*(C+, warn also when an arithmetic operation involves
 \&\f(CW\*(C`NULL\*(C'\fR.  This warning is also enabled by \fB\-Wpedantic\fR.
@@ -4094,14 +4103,14 @@
 For example, warn if \f(CW\*(C`int malloc()\*(C'\fR is cast to \f(CW\*(C`anything *\*(C'\fR.
 .IP "\fB\-Wc++\-compat\fR (C and Objective-C only)" 4
 .IX Item "-Wc++-compat (C and Objective-C only)"
-Warn about \s-1ISO\s0 C constructs that are outside of the common subset of
-\&\s-1ISO\s0 C and \s-1ISO\s0 \*(C+, e.g. request for implicit conversion from
+Warn about \s-1ISO C\s0 constructs that are outside of the common subset of
+\&\s-1ISO C\s0 and \s-1ISO \*(C+,\s0 e.g. request for implicit conversion from
 \&\f(CW\*(C`void *\*(C'\fR to a pointer to non\-\f(CW\*(C`void\*(C'\fR type.
 .IP "\fB\-Wc++11\-compat\fR (\*(C+ and Objective\-\*(C+ only)" 4
 .IX Item "-Wc++11-compat ( and Objective- only)"
-Warn about \*(C+ constructs whose meaning differs between \s-1ISO\s0 \*(C+ 1998
-and \s-1ISO\s0 \*(C+ 2011, e.g., identifiers in \s-1ISO\s0 \*(C+ 1998 that are keywords
-in \s-1ISO\s0 \*(C+ 2011.  This warning turns on \fB\-Wnarrowing\fR and is
+Warn about \*(C+ constructs whose meaning differs between \s-1ISO \*(C+ 1998\s0
+and \s-1ISO \*(C+ 2011,\s0 e.g., identifiers in \s-1ISO \*(C+ 1998\s0 that are keywords
+in \s-1ISO \*(C+ 2011. \s0 This warning turns on \fB\-Wnarrowing\fR and is
 enabled by \fB\-Wall\fR.
 .IP "\fB\-Wcast\-qual\fR" 4
 .IX Item "-Wcast-qual"
@@ -4344,25 +4353,25 @@
 implementation-defined values, and should not be used in portable code.
 .IP "\fB\-Wnormalized=<none|id|nfc|nfkc>\fR" 4
 .IX Item "-Wnormalized=<none|id|nfc|nfkc>"
-In \s-1ISO\s0 C and \s-1ISO\s0 \*(C+, two identifiers are different if they are
+In \s-1ISO C\s0 and \s-1ISO \*(C+,\s0 two identifiers are different if they are
 different sequences of characters.  However, sometimes when characters
 outside the basic \s-1ASCII\s0 character set are used, you can have two
 different character sequences that look the same.  To avoid confusion,
-the \s-1ISO\s0 10646 standard sets out some \fInormalization rules\fR which
+the \s-1ISO 10646\s0 standard sets out some \fInormalization rules\fR which
 when applied ensure that two sequences that look the same are turned into
 the same sequence.  \s-1GCC\s0 can warn you if you are using identifiers that
 have not been normalized; this option controls that warning.
 .Sp
-There are four levels of warning supported by \s-1GCC\s0.  The default is
+There are four levels of warning supported by \s-1GCC. \s0 The default is
 \&\fB\-Wnormalized=nfc\fR, which warns about any identifier that is
-not in the \s-1ISO\s0 10646 \*(L"C\*(R" normalized form, \fI\s-1NFC\s0\fR.  \s-1NFC\s0 is the
+not in the \s-1ISO 10646 \*(L"C\*(R"\s0 normalized form, \fI\s-1NFC\s0\fR.  \s-1NFC\s0 is the
 recommended form for most uses.
 .Sp
 Unfortunately, there are some characters allowed in identifiers by
-\&\s-1ISO\s0 C and \s-1ISO\s0 \*(C+ that, when turned into \s-1NFC\s0, are not allowed in 
+\&\s-1ISO C\s0 and \s-1ISO \*(C+\s0 that, when turned into \s-1NFC,\s0 are not allowed in 
 identifiers.  That is, there's no way to use these symbols in portable
-\&\s-1ISO\s0 C or \*(C+ and have all your identifiers in \s-1NFC\s0.
-\&\fB\-Wnormalized=id\fR suppresses the warning for these characters.
+\&\s-1ISO C\s0 or \*(C+ and have all your identifiers in \s-1NFC.
+\&\s0\fB\-Wnormalized=id\fR suppresses the warning for these characters.
 It is hoped that future versions of the standards involved will correct
 this, which is why this option is not the default.
 .Sp
@@ -4371,11 +4380,11 @@
 are using some other normalization scheme (like \*(L"D\*(R"), because
 otherwise you can easily create bugs that are literally impossible to see.
 .Sp
-Some characters in \s-1ISO\s0 10646 have distinct meanings but look identical
+Some characters in \s-1ISO 10646\s0 have distinct meanings but look identical
 in some fonts or display methodologies, especially once formatting has
-been applied.  For instance \f(CW\*(C`\eu207F\*(C'\fR, \*(L"\s-1SUPERSCRIPT\s0 \s-1LATIN\s0 \s-1SMALL\s0
-\&\s-1LETTER\s0 N\*(R", displays just like a regular \f(CW\*(C`n\*(C'\fR that has been
-placed in a superscript.  \s-1ISO\s0 10646 defines the \fI\s-1NFKC\s0\fR
+been applied.  For instance \f(CW\*(C`\eu207F\*(C'\fR, \*(L"\s-1SUPERSCRIPT LATIN SMALL
+LETTER N\*(R",\s0 displays just like a regular \f(CW\*(C`n\*(C'\fR that has been
+placed in a superscript.  \s-1ISO 10646\s0 defines the \fI\s-1NFKC\s0\fR
 normalization scheme to convert all these into a standard form as
 well, and \s-1GCC\s0 warns if your code is not in \s-1NFKC\s0 if you use
 \&\fB\-Wnormalized=nfkc\fR.  This warning is comparable to warning
@@ -4429,9 +4438,9 @@
 .IP "\fB\-Wpacked\-bitfield\-compat\fR" 4
 .IX Item "-Wpacked-bitfield-compat"
 The 4.1, 4.2 and 4.3 series of \s-1GCC\s0 ignore the \f(CW\*(C`packed\*(C'\fR attribute
-on bit-fields of type \f(CW\*(C`char\*(C'\fR.  This has been fixed in \s-1GCC\s0 4.4 but
+on bit-fields of type \f(CW\*(C`char\*(C'\fR.  This has been fixed in \s-1GCC 4.4\s0 but
 the change can lead to differences in the structure layout.  \s-1GCC\s0
-informs you when the offset of such a field has changed in \s-1GCC\s0 4.4.
+informs you when the offset of such a field has changed in \s-1GCC 4.4.\s0
 For example there is no longer a 4\-bit padding between field \f(CW\*(C`a\*(C'\fR
 and \f(CW\*(C`b\*(C'\fR in this structure:
 .Sp
@@ -4478,7 +4487,7 @@
 .IP "\fB\-Wno\-invalid\-offsetof\fR (\*(C+ and Objective\-\*(C+ only)" 4
 .IX Item "-Wno-invalid-offsetof ( and Objective- only)"
 Suppress warnings from applying the \fBoffsetof\fR macro to a non-POD
-type.  According to the 1998 \s-1ISO\s0 \*(C+ standard, applying \fBoffsetof\fR
+type.  According to the 1998 \s-1ISO \*(C+\s0 standard, applying \fBoffsetof\fR
 to a non-POD type is undefined.  In existing \*(C+ implementations,
 however, \fBoffsetof\fR typically gives meaningful results even when
 applied to certain kinds of non-POD types (such as a simple
@@ -4505,12 +4514,12 @@
 .IP "\fB\-Wlong\-long\fR" 4
 .IX Item "-Wlong-long"
 Warn if \fBlong long\fR type is used.  This is enabled by either
-\&\fB\-Wpedantic\fR or \fB\-Wtraditional\fR in \s-1ISO\s0 C90 and \*(C+98
+\&\fB\-Wpedantic\fR or \fB\-Wtraditional\fR in \s-1ISO C90\s0 and \*(C+98
 modes.  To inhibit the warning messages, use \fB\-Wno\-long\-long\fR.
 .IP "\fB\-Wvariadic\-macros\fR" 4
 .IX Item "-Wvariadic-macros"
-Warn if variadic macros are used in pedantic \s-1ISO\s0 C90 mode, or the \s-1GNU\s0
-alternate syntax when in pedantic \s-1ISO\s0 C99 mode.  This is default.
+Warn if variadic macros are used in pedantic \s-1ISO C90\s0 mode, or the \s-1GNU\s0
+alternate syntax when in pedantic \s-1ISO C99\s0 mode.  This is default.
 To inhibit the warning messages, use \fB\-Wno\-variadic\-macros\fR.
 .IP "\fB\-Wvarargs\fR" 4
 .IX Item "-Wvarargs"
@@ -4573,7 +4582,7 @@
 using longer strings.
 .Sp
 The limit applies \fIafter\fR string constant concatenation, and does
-not count the trailing \s-1NUL\s0.  In C90, the limit was 509 characters; in
+not count the trailing \s-1NUL. \s0 In C90, the limit was 509 characters; in
 C99, it was raised to 4095.  \*(C+98 does not specify a normative
 minimum maximum, so we do not diagnose overlength strings in \*(C+.
 .Sp
@@ -4593,7 +4602,7 @@
 .IP "\fB\-g\fR" 4
 .IX Item "-g"
 Produce debugging information in the operating system's native format
-(stabs, \s-1COFF\s0, \s-1XCOFF\s0, or \s-1DWARF\s0 2).  \s-1GDB\s0 can work with this debugging
+(stabs, \s-1COFF, XCOFF,\s0 or \s-1DWARF 2\s0).  \s-1GDB\s0 can work with this debugging
 information.
 .Sp
 On most systems that use stabs format, \fB\-g\fR enables use of extra
@@ -4626,8 +4635,8 @@
 files.
 .IP "\fB\-ggdb\fR" 4
 .IX Item "-ggdb"
-Produce debugging information for use by \s-1GDB\s0.  This means to use the
-most expressive format available (\s-1DWARF\s0 2, stabs, or the native format
+Produce debugging information for use by \s-1GDB. \s0 This means to use the
+most expressive format available (\s-1DWARF 2,\s0 stabs, or the native format
 if neither of those are supported), including \s-1GDB\s0 extensions if at all
 possible.
 .IP "\fB\-gpubnames\fR" 4
@@ -4642,8 +4651,8 @@
 .IX Item "-gstabs"
 Produce debugging information in stabs format (if that is supported),
 without \s-1GDB\s0 extensions.  This is the format used by \s-1DBX\s0 on most \s-1BSD\s0
-systems.  On \s-1MIPS\s0, Alpha and System V Release 4 systems this option
-produces stabs debugging output that is not understood by \s-1DBX\s0 or \s-1SDB\s0.
+systems.  On \s-1MIPS,\s0 Alpha and System V Release 4 systems this option
+produces stabs debugging output that is not understood by \s-1DBX\s0 or \s-1SDB.\s0
 On System V Release 4 systems this option requires the \s-1GNU\s0 assembler.
 .IP "\fB\-feliminate\-unused\-debug\-symbols\fR" 4
 .IX Item "-feliminate-unused-debug-symbols"
@@ -4680,7 +4689,7 @@
 .IP "\fB\-gxcoff\fR" 4
 .IX Item "-gxcoff"
 Produce debugging information in \s-1XCOFF\s0 format (if that is supported).
-This is the format used by the \s-1DBX\s0 debugger on \s-1IBM\s0 \s-1RS/6000\s0 systems.
+This is the format used by the \s-1DBX\s0 debugger on \s-1IBM RS/6000\s0 systems.
 .IP "\fB\-gxcoff+\fR" 4
 .IX Item "-gxcoff+"
 Produce debugging information in \s-1XCOFF\s0 format (if that is supported),
@@ -4695,9 +4704,9 @@
 for most targets is 4.
 .Sp
 Note that with \s-1DWARF\s0 Version 2, some ports require and always
-use some non-conflicting \s-1DWARF\s0 3 extensions in the unwind tables.
+use some non-conflicting \s-1DWARF 3\s0 extensions in the unwind tables.
 .Sp
-Version 4 may require \s-1GDB\s0 7.0 and \fB\-fvar\-tracking\-assignments\fR
+Version 4 may require \s-1GDB 7.0\s0 and \fB\-fvar\-tracking\-assignments\fR
 for maximum benefit.
 .IP "\fB\-grecord\-gcc\-switches\fR" 4
 .IX Item "-grecord-gcc-switches"
@@ -4759,7 +4768,7 @@
 different from version 2), and it would have been too confusing.  That
 debug format is long obsolete, but the option cannot be changed now.
 Instead use an additional \fB\-g\fR\fIlevel\fR option to change the
-debug level for \s-1DWARF\s0.
+debug level for \s-1DWARF.\s0
 .IP "\fB\-gtoggle\fR" 4
 .IX Item "-gtoggle"
 Turn off generation of debug info, if leaving out this option
@@ -4807,7 +4816,7 @@
 .IX Item "-fsanitize=shift"
 This option enables checking that the result of a shift operation is
 not undefined.  Note that what exactly is considered undefined differs
-slightly between C and \*(C+, as well as between \s-1ISO\s0 C90 and C99, etc.
+slightly between C and \*(C+, as well as between \s-1ISO C90\s0 and C99, etc.
 .IP "\fB\-fsanitize=integer\-divide\-by\-zero\fR" 4
 .IX Item "-fsanitize=integer-divide-by-zero"
 Detect integer division by zero as well as \f(CW\*(C`INT_MIN / \-1\*(C'\fR division.
@@ -4900,9 +4909,9 @@
 other than debugging the compiler proper.
 .IP "\fB\-feliminate\-dwarf2\-dups\fR" 4
 .IX Item "-feliminate-dwarf2-dups"
-Compress \s-1DWARF\s0 2 debugging information by eliminating duplicated
+Compress \s-1DWARF 2\s0 debugging information by eliminating duplicated
 information about each symbol.  This option only makes sense when
-generating \s-1DWARF\s0 2 debugging information with \fB\-gdwarf\-2\fR.
+generating \s-1DWARF 2\s0 debugging information with \fB\-gdwarf\-2\fR.
 .IP "\fB\-femit\-struct\-debug\-baseonly\fR" 4
 .IX Item "-femit-struct-debug-baseonly"
 Emit debug information for struct-like types
@@ -4914,7 +4923,7 @@
 See \fB\-femit\-struct\-debug\-reduced\fR for a less aggressive option.
 See \fB\-femit\-struct\-debug\-detailed\fR for more detailed control.
 .Sp
-This option works only with \s-1DWARF\s0 2.
+This option works only with \s-1DWARF 2.\s0
 .IP "\fB\-femit\-struct\-debug\-reduced\fR" 4
 .IX Item "-femit-struct-debug-reduced"
 Emit debug information for struct-like types
@@ -4927,7 +4936,7 @@
 See \fB\-femit\-struct\-debug\-baseonly\fR for a more aggressive option.
 See \fB\-femit\-struct\-debug\-detailed\fR for more detailed control.
 .Sp
-This option works only with \s-1DWARF\s0 2.
+This option works only with \s-1DWARF 2.\s0
 .IP "\fB\-femit\-struct\-debug\-detailed\fR[\fB=\fR\fIspec-list\fR]" 4
 .IX Item "-femit-struct-debug-detailed[=spec-list]"
 Specify the struct-like types
@@ -4973,7 +4982,7 @@
 .Sp
 The default is \fB\-femit\-struct\-debug\-detailed=all\fR.
 .Sp
-This option works only with \s-1DWARF\s0 2.
+This option works only with \s-1DWARF 2.\s0
 .IP "\fB\-fno\-merge\-debug\-strings\fR" 4
 .IX Item "-fno-merge-debug-strings"
 Direct the linker to not merge together strings in the debugging
@@ -4987,8 +4996,8 @@
 information describing them as in \fI\fInew\fI\fR instead.
 .IP "\fB\-fno\-dwarf2\-cfi\-asm\fR" 4
 .IX Item "-fno-dwarf2-cfi-asm"
-Emit \s-1DWARF\s0 2 unwind info as compiler generated \f(CW\*(C`.eh_frame\*(C'\fR section
-instead of using \s-1GAS\s0 \f(CW\*(C`.cfi_*\*(C'\fR directives.
+Emit \s-1DWARF 2\s0 unwind info as compiler generated \f(CW\*(C`.eh_frame\*(C'\fR section
+instead of using \s-1GAS \s0\f(CW\*(C`.cfi_*\*(C'\fR directives.
 .IP "\fB\-p\fR" 4
 .IX Item "-p"
 Generate extra code to write profile information suitable for the
@@ -5145,7 +5154,7 @@
 .IX Item "-fdisable-kind-pass=range-list"
 .PD
 This is a set of options that are used to explicitly disable/enable
-optimization passes.  These options are intended for use for debugging \s-1GCC\s0.
+optimization passes.  These options are intended for use for debugging \s-1GCC.\s0
 Compiler users should use regular options for enabling/disabling
 passes instead.
 .RS 4
@@ -5616,7 +5625,7 @@
 When dumping pretty-printed trees, this option inhibits dumping the
 bodies of control structures.
 .Sp
-When dumping \s-1RTL\s0, print the \s-1RTL\s0 in slim (condensed) form instead of
+When dumping \s-1RTL,\s0 print the \s-1RTL\s0 in slim (condensed) form instead of
 the default LISP-like representation.
 .IP "\fBraw\fR" 4
 .IX Item "raw"
@@ -5651,7 +5660,7 @@
 Enable showing line numbers for statements.
 .IP "\fBuid\fR" 4
 .IX Item "uid"
-Enable showing the unique \s-1ID\s0 (\f(CW\*(C`DECL_UID\*(C'\fR) for each variable.
+Enable showing the unique \s-1ID \s0(\f(CW\*(C`DECL_UID\*(C'\fR) for each variable.
 .IP "\fBverbose\fR" 4
 .IX Item "verbose"
 Enable showing the tree dump for each statement.
@@ -5729,7 +5738,7 @@
 appending \fI.alias\fR to the source file name.
 .IP "\fBccp\fR" 4
 .IX Item "ccp"
-Dump each function after \s-1CCP\s0.  The file name is made by appending
+Dump each function after \s-1CCP. \s0 The file name is made by appending
 \&\fI.ccp\fR to the source file name.
 .IP "\fBstoreccp\fR" 4
 .IX Item "storeccp"
@@ -6139,7 +6148,7 @@
 is used when \s-1GCC\s0 itself is being built.)
 .IP "\fB\-fno\-eliminate\-unused\-debug\-types\fR" 4
 .IX Item "-fno-eliminate-unused-debug-types"
-Normally, when producing \s-1DWARF\s0 2 output, \s-1GCC\s0 avoids producing debug symbol 
+Normally, when producing \s-1DWARF 2\s0 output, \s-1GCC\s0 avoids producing debug symbol 
 output for types that are nowhere used in the source file being compiled.
 Sometimes it is useful to have \s-1GCC\s0 emit debugging
 information for all types declared in a compilation
@@ -6328,7 +6337,7 @@
 Disabled at levels \fB\-O\fR, \fB\-O2\fR, \fB\-O3\fR, \fB\-Os\fR.
 .IP "\fB\-fforward\-propagate\fR" 4
 .IX Item "-fforward-propagate"
-Perform a forward propagation pass on \s-1RTL\s0.  The pass tries to combine two
+Perform a forward propagation pass on \s-1RTL. \s0 The pass tries to combine two
 instructions and checks if the result can be simplified.  If loop unrolling
 is active, two passes are performed and the second is scheduled after
 loop unrolling.
@@ -6354,7 +6363,7 @@
 in many functions.  \fBIt also makes debugging impossible on
 some machines.\fR
 .Sp
-On some machines, such as the \s-1VAX\s0, this flag has no effect, because
+On some machines, such as the \s-1VAX,\s0 this flag has no effect, because
 the standard calling sequence automatically handles the frame pointer
 and nothing is saved by pretending it doesn't exist.  The
 machine-description macro \f(CW\*(C`FRAME_POINTER_REQUIRED\*(C'\fR controls
@@ -6473,7 +6482,7 @@
 In C, emit \f(CW\*(C`static\*(C'\fR functions that are declared \f(CW\*(C`inline\*(C'\fR
 into the object file, even if the function has been inlined into all
 of its callers.  This switch does not affect functions using the
-\&\f(CW\*(C`extern inline\*(C'\fR extension in \s-1GNU\s0 C90.  In \*(C+, emit any and all
+\&\f(CW\*(C`extern inline\*(C'\fR extension in \s-1GNU C90. \s0 In \*(C+, emit any and all
 inline functions into the object file.
 .IP "\fB\-fkeep\-static\-consts\fR" 4
 .IX Item "-fkeep-static-consts"
@@ -6538,7 +6547,7 @@
 .IP "\fB\-fno\-zero\-initialized\-in\-bss\fR" 4
 .IX Item "-fno-zero-initialized-in-bss"
 If the target supports a \s-1BSS\s0 section, \s-1GCC\s0 by default puts variables that
-are initialized to zero into \s-1BSS\s0.  This can save space in the resulting
+are initialized to zero into \s-1BSS. \s0 This can save space in the resulting
 code.
 .Sp
 This option turns off this behavior because some programs explicitly
@@ -6661,11 +6670,11 @@
 higher on architectures that support this.
 .IP "\fB\-fdce\fR" 4
 .IX Item "-fdce"
-Perform dead code elimination (\s-1DCE\s0) on \s-1RTL\s0.
+Perform dead code elimination (\s-1DCE\s0) on \s-1RTL.\s0
 Enabled by default at \fB\-O\fR and higher.
 .IP "\fB\-fdse\fR" 4
 .IX Item "-fdse"
-Perform dead store elimination (\s-1DSE\s0) on \s-1RTL\s0.
+Perform dead store elimination (\s-1DSE\s0) on \s-1RTL.\s0
 Enabled by default at \fB\-O\fR and higher.
 .IP "\fB\-fif\-conversion\fR" 4
 .IX Item "-fif-conversion"
@@ -7008,7 +7017,7 @@
 Perform full redundancy elimination (\s-1FRE\s0) on trees.  The difference
 between \s-1FRE\s0 and \s-1PRE\s0 is that \s-1FRE\s0 only considers expressions
 that are computed on all paths leading to the redundant computation.
-This analysis is faster than \s-1PRE\s0, though it exposes fewer redundancies.
+This analysis is faster than \s-1PRE,\s0 though it exposes fewer redundancies.
 This flag is enabled by default at \fB\-O\fR and higher.
 .IP "\fB\-ftree\-phiprop\fR" 4
 .IX Item "-ftree-phiprop"
@@ -7247,7 +7256,7 @@
 Enable the identity transformation for graphite.  For every SCoP we generate
 the polyhedral representation and transform it back to gimple.  Using
 \&\fB\-fgraphite\-identity\fR we can check the costs or benefits of the
-\&\s-1GIMPLE\s0 \-> \s-1GRAPHITE\s0 \-> \s-1GIMPLE\s0 transformation.  Some minimal optimizations
+\&\s-1GIMPLE \-\s0> \s-1GRAPHITE \-\s0> \s-1GIMPLE\s0 transformation.  Some minimal optimizations
 are also performed by the code generator CLooG, like index splitting and
 dead code elimination in loops.
 .IP "\fB\-floop\-nest\-optimize\fR" 4
@@ -7765,7 +7774,7 @@
 Constructs webs as commonly used for register allocation purposes and assign
 each web individual pseudo register.  This allows the register allocation pass
 to operate on pseudos directly, but also strengthens several other optimization
-passes, such as \s-1CSE\s0, loop optimizer and trivial dead code remover.  It can,
+passes, such as \s-1CSE,\s0 loop optimizer and trivial dead code remover.  It can,
 however, make debugging impossible, since variables no longer stay in a
 \&\*(L"home register\*(R".
 .Sp
@@ -7783,7 +7792,7 @@
 .IP "\fB\-flto[=\fR\fIn\fR\fB]\fR" 4
 .IX Item "-flto[=n]"
 This option runs the standard link-time optimizer.  When invoked
-with source code, it generates \s-1GIMPLE\s0 (one of \s-1GCC\s0's internal
+with source code, it generates \s-1GIMPLE \s0(one of \s-1GCC\s0's internal
 representations) and writes it to special \s-1ELF\s0 sections in the object
 file.  When the object files are linked together, all the function
 bodies are read from these \s-1ELF\s0 sections and instantiated as if they
@@ -7907,7 +7916,7 @@
 .Sp
 If \s-1LTO\s0 encounters objects with C linkage declared with incompatible
 types in separate translation units to be linked together (undefined
-behavior according to \s-1ISO\s0 C99 6.2.7), a non-fatal diagnostic may be
+behavior according to \s-1ISO C99 6.2.7\s0), a non-fatal diagnostic may be
 issued.  The behavior is still undefined at run time.  Similar
 diagnostics may be raised for other languages.
 .Sp
@@ -7930,7 +7939,7 @@
 If object files containing \s-1GIMPLE\s0 bytecode are stored in a library archive, say
 \&\fIlibfoo.a\fR, it is possible to extract and use them in an \s-1LTO\s0 link if you
 are using a linker with plugin support.  To create static libraries suitable
-for \s-1LTO\s0, use \fBgcc-ar\fR and \fBgcc-ranlib\fR instead of \fBar\fR
+for \s-1LTO,\s0 use \fBgcc-ar\fR and \fBgcc-ranlib\fR instead of \fBar\fR
 and \f(CW\*(C`ranlib\*(C'\fR; to show the symbols of object files with \s-1GIMPLE\s0 bytecode, use
 \&\fBgcc-nm\fR.  Those commands require that \fBar\fR, \fBranlib\fR
 and \fBnm\fR have been compiled with plugin support.  At link time, use the the
@@ -7964,7 +7973,7 @@
 attempt to generate bytecode that is portable between different
 types of hosts.  The bytecode files are versioned and there is a
 strict version check, so bytecode files generated in one version of
-\&\s-1GCC\s0 will not work with an older or newer version of \s-1GCC\s0.
+\&\s-1GCC\s0 will not work with an older or newer version of \s-1GCC.\s0
 .Sp
 Link-time optimization does not work well with generation of debugging
 information.  Combining \fB\-flto\fR with
@@ -8039,8 +8048,8 @@
 linking. This option is effective only when compiling with \fB\-flto\fR
 and is ignored at link time.
 .Sp
-\&\fB\-fno\-fat\-lto\-objects\fR improves compilation time over plain \s-1LTO\s0, but
-requires the complete toolchain to be aware of \s-1LTO\s0. It requires a linker with
+\&\fB\-fno\-fat\-lto\-objects\fR improves compilation time over plain \s-1LTO,\s0 but
+requires the complete toolchain to be aware of \s-1LTO.\s0 It requires a linker with
 linker plugin support for basic functionality.  Additionally,
 \&\fBnm\fR, \fBar\fR and \fBranlib\fR
 need to support linker plugins to allow a full-featured build environment
@@ -8144,15 +8153,15 @@
 .IP "\fB\-fexcess\-precision=\fR\fIstyle\fR" 4
 .IX Item "-fexcess-precision=style"
 This option allows further control over excess precision on machines
-where floating-point registers have more precision than the \s-1IEEE\s0
-\&\f(CW\*(C`float\*(C'\fR and \f(CW\*(C`double\*(C'\fR types and the processor does not
+where floating-point registers have more precision than the \s-1IEEE
+\&\s0\f(CW\*(C`float\*(C'\fR and \f(CW\*(C`double\*(C'\fR types and the processor does not
 support operations rounding to those types.  By default,
 \&\fB\-fexcess\-precision=fast\fR is in effect; this means that
 operations are carried out in the precision of the registers and that
 it is unpredictable when rounding to the types specified in the source
 code takes place.  When compiling C, if
 \&\fB\-fexcess\-precision=standard\fR is specified then excess
-precision follows the rules specified in \s-1ISO\s0 C99; in particular,
+precision follows the rules specified in \s-1ISO C99\s0; in particular,
 both casts and assignments cause values to be rounded to their
 semantic types (whereas \fB\-ffloat\-store\fR only affects
 assignments).  This option is enabled by default for C if a strict
@@ -8216,7 +8225,7 @@
 .IP "\fB\-fassociative\-math\fR" 4
 .IX Item "-fassociative-math"
 Allow re-association of operands in series of floating-point operations.
-This violates the \s-1ISO\s0 C and \*(C+ language standard by possibly changing
+This violates the \s-1ISO C\s0 and \*(C+ language standard by possibly changing
 computation result.  \s-1NOTE:\s0 re-ordering may change the sign of zero as
 well as ignore NaNs and inhibit or create underflow or overflow (and
 thus cannot be used on code that relies on rounding behavior like
@@ -8319,8 +8328,8 @@
 default is \fB\-fno\-cx\-limited\-range\fR, but is enabled by
 \&\fB\-ffast\-math\fR.
 .Sp
-This option controls the default setting of the \s-1ISO\s0 C99
-\&\f(CW\*(C`CX_LIMITED_RANGE\*(C'\fR pragma.  Nevertheless, the option applies to
+This option controls the default setting of the \s-1ISO C99
+\&\s0\f(CW\*(C`CX_LIMITED_RANGE\*(C'\fR pragma.  Nevertheless, the option applies to
 all languages.
 .IP "\fB\-fcx\-fortran\-rules\fR" 4
 .IX Item "-fcx-fortran-rules"
@@ -8576,7 +8585,7 @@
 .IP "\fBmax-gcse-insertion-ratio\fR" 4
 .IX Item "max-gcse-insertion-ratio"
 If the ratio of expression insertions to deletions is larger than this value
-for any expression, then \s-1RTL\s0 \s-1PRE\s0 inserts or removes the expression and thus
+for any expression, then \s-1RTL PRE\s0 inserts or removes the expression and thus
 leaves partially redundant computations in the instruction stream.  The default value is 20.
 .IP "\fBmax-pending-list-length\fR" 4
 .IX Item "max-pending-list-length"
@@ -8591,7 +8600,7 @@
 compilation time.
 .IP "\fBmax-inline-insns-single\fR" 4
 .IX Item "max-inline-insns-single"
-Several parameters control the tree inliner used in \s-1GCC\s0.
+Several parameters control the tree inliner used in \s-1GCC.\s0
 This number sets the maximum number of instructions (counted in \s-1GCC\s0's
 internal representation) in a single function that the tree inliner
 considers for inlining.  This only affects functions declared
@@ -8945,7 +8954,7 @@
 generation.
 .Sp
 The default is 30% + 70% * (\s-1RAM/1GB\s0) with an upper bound of 100% when
-\&\s-1RAM\s0 >= 1GB.  If \f(CW\*(C`getrlimit\*(C'\fR is available, the notion of \*(L"\s-1RAM\s0\*(R" is
+\&\s-1RAM \s0>= 1GB.  If \f(CW\*(C`getrlimit\*(C'\fR is available, the notion of \*(L"\s-1RAM\*(R"\s0 is
 the smallest of actual \s-1RAM\s0 and \f(CW\*(C`RLIMIT_DATA\*(C'\fR or \f(CW\*(C`RLIMIT_AS\*(C'\fR.  If
 \&\s-1GCC\s0 is not able to calculate \s-1RAM\s0 on a particular platform, the lower
 bound of 30% is used.  Setting this parameter and
@@ -8960,7 +8969,7 @@
 tuning this may improve compilation speed, and has no effect on code
 generation.
 .Sp
-The default is the smaller of \s-1RAM/8\s0, \s-1RLIMIT_RSS\s0, or a limit that
+The default is the smaller of \s-1RAM/8, RLIMIT_RSS,\s0 or a limit that
 tries to ensure that \s-1RLIMIT_DATA\s0 or \s-1RLIMIT_AS\s0 are not exceeded, but
 with a lower bound of 4096 (four megabytes) and an upper bound of
 131072 (128 megabytes).  If \s-1GCC\s0 is not able to calculate \s-1RAM\s0 on a
@@ -9278,7 +9287,7 @@
 The default value is 32.
 .IP "\fBlto-minpartition\fR" 4
 .IX Item "lto-minpartition"
-Size of minimal partition for \s-1WHOPR\s0 (in estimated instructions).
+Size of minimal partition for \s-1WHOPR \s0(in estimated instructions).
 This prevents expenses of splitting very small programs into too many
 partitions.
 .IP "\fBcxx-max-namespaces-for-diagnostic-help\fR" 4
@@ -9505,7 +9514,7 @@
 .IP "\fB\-Wtraditional\fR" 4
 .IX Item "-Wtraditional"
 Warn about certain constructs that behave differently in traditional and
-\&\s-1ISO\s0 C.  Also warn about \s-1ISO\s0 C constructs that have no traditional C
+\&\s-1ISO C. \s0 Also warn about \s-1ISO C\s0 constructs that have no traditional C
 equivalent, and problematic constructs which should be avoided.
 .IP "\fB\-Wundef\fR" 4
 .IX Item "-Wundef"
@@ -9558,7 +9567,7 @@
 responsible for the system library, you may want to see them.
 .IP "\fB\-w\fR" 4
 .IX Item "-w"
-Suppress all warnings, including those which \s-1GNU\s0 \s-1CPP\s0 issues by default.
+Suppress all warnings, including those which \s-1GNU CPP\s0 issues by default.
 .IP "\fB\-pedantic\fR" 4
 .IX Item "-pedantic"
 Issue all the mandatory diagnostics listed in the C standard.  Some of
@@ -9698,10 +9707,10 @@
 \&\f(CW\*(C`#pragma GCC pch_preprocess "\f(CIfilename\f(CW"\*(C'\fR in the output to mark
 the place where the precompiled header was found, and its \fIfilename\fR.
 When \fB\-fpreprocessed\fR is in use, \s-1GCC\s0 recognizes this \f(CW\*(C`#pragma\*(C'\fR
-and loads the \s-1PCH\s0.
+and loads the \s-1PCH.\s0
 .Sp
 This option is off by default, because the resulting preprocessed output
-is only really suitable as input to \s-1GCC\s0.  It is switched on by
+is only really suitable as input to \s-1GCC. \s0 It is switched on by
 \&\fB\-save\-temps\fR.
 .Sp
 You should not write this \f(CW\*(C`#pragma\*(C'\fR in your own code, but it is
@@ -9754,7 +9763,7 @@
 .el .IP "\f(CWiso9899:1990\fR" 4
 .IX Item "iso9899:1990"
 .PD
-The \s-1ISO\s0 C standard from 1990.  \fBc90\fR is the customary shorthand for
+The \s-1ISO C\s0 standard from 1990.  \fBc90\fR is the customary shorthand for
 this version of the standard.
 .Sp
 The \fB\-ansi\fR option is equivalent to \fB\-std=c90\fR.
@@ -9776,7 +9785,7 @@
 .el .IP "\f(CWc9x\fR" 4
 .IX Item "c9x"
 .PD
-The revised \s-1ISO\s0 C standard, published in December 1999.  Before
+The revised \s-1ISO C\s0 standard, published in December 1999.  Before
 publication, this was known as C9X.
 .ie n .IP """iso9899:2011""" 4
 .el .IP "\f(CWiso9899:2011\fR" 4
@@ -9789,7 +9798,7 @@
 .el .IP "\f(CWc1x\fR" 4
 .IX Item "c1x"
 .PD
-The revised \s-1ISO\s0 C standard, published in December 2011.  Before
+The revised \s-1ISO C\s0 standard, published in December 2011.  Before
 publication, this was known as C1X.
 .ie n .IP """gnu90""" 4
 .el .IP "\f(CWgnu90\fR" 4
@@ -9821,7 +9830,7 @@
 .ie n .IP """c++98""" 4
 .el .IP "\f(CWc++98\fR" 4
 .IX Item "c++98"
-The 1998 \s-1ISO\s0 \*(C+ standard plus amendments.
+The 1998 \s-1ISO \*(C+\s0 standard plus amendments.
 .ie n .IP """gnu++98""" 4
 .el .IP "\f(CWgnu++98\fR" 4
 .IX Item "gnu++98"
@@ -9947,7 +9956,7 @@
 .IP "\fB\-fextended\-identifiers\fR" 4
 .IX Item "-fextended-identifiers"
 Accept universal character names in identifiers.  This option is
-experimental; in a future version of \s-1GCC\s0, it will be enabled by
+experimental; in a future version of \s-1GCC,\s0 it will be enabled by
 default for C99 and \*(C+.
 .IP "\fB\-fno\-canonical\-system\-headers\fR" 4
 .IX Item "-fno-canonical-system-headers"
@@ -9974,7 +9983,7 @@
 ignored.  The default is 8.
 .IP "\fB\-fdebug\-cpp\fR" 4
 .IX Item "-fdebug-cpp"
-This option is only useful for debugging \s-1GCC\s0.  When used with
+This option is only useful for debugging \s-1GCC. \s0 When used with
 \&\fB\-E\fR, dumps debugging information about location maps.  Every
 token in the output is preceded by the dump of the map its location
 belongs to.  The dump of the map holding the location of a token would
@@ -10007,12 +10016,12 @@
 .IP "\fB\-fexec\-charset=\fR\fIcharset\fR" 4
 .IX Item "-fexec-charset=charset"
 Set the execution character set, used for string and character
-constants.  The default is \s-1UTF\-8\s0.  \fIcharset\fR can be any encoding
+constants.  The default is \s-1UTF\-8.  \s0\fIcharset\fR can be any encoding
 supported by the system's \f(CW\*(C`iconv\*(C'\fR library routine.
 .IP "\fB\-fwide\-exec\-charset=\fR\fIcharset\fR" 4
 .IX Item "-fwide-exec-charset=charset"
 Set the wide execution character set, used for wide string and
-character constants.  The default is \s-1UTF\-32\s0 or \s-1UTF\-16\s0, whichever
+character constants.  The default is \s-1UTF\-32\s0 or \s-1UTF\-16,\s0 whichever
 corresponds to the width of \f(CW\*(C`wchar_t\*(C'\fR.  As with
 \&\fB\-fexec\-charset\fR, \fIcharset\fR can be any encoding supported
 by the system's \f(CW\*(C`iconv\*(C'\fR library routine; however, you will have
@@ -10020,9 +10029,9 @@
 .IP "\fB\-finput\-charset=\fR\fIcharset\fR" 4
 .IX Item "-finput-charset=charset"
 Set the input character set, used for translation from the character
-set of the input file to the source character set used by \s-1GCC\s0.  If the
+set of the input file to the source character set used by \s-1GCC. \s0 If the
 locale does not specify, or \s-1GCC\s0 cannot get this information from the
-locale, the default is \s-1UTF\-8\s0.  This can be overridden by either the locale
+locale, the default is \s-1UTF\-8. \s0 This can be overridden by either the locale
 or this command line option.  Currently the command line option takes
 precedence if there's a conflict.  \fIcharset\fR can be any encoding
 supported by the system's \f(CW\*(C`iconv\*(C'\fR library routine.
@@ -10059,7 +10068,7 @@
 .IX Item "-dCHARS"
 \&\fI\s-1CHARS\s0\fR is a sequence of one or more of the following characters,
 and must not be preceded by a space.  Other characters are interpreted
-by the compiler proper, or reserved for future versions of \s-1GCC\s0, and so
+by the compiler proper, or reserved for future versions of \s-1GCC,\s0 and so
 are silently ignored.  If you specify characters whose behavior
 conflicts, the result is undefined.
 .RS 4
@@ -10135,12 +10144,12 @@
 .IP "\fB\-traditional\-cpp\fR" 4
 .IX Item "-traditional-cpp"
 Try to imitate the behavior of old-fashioned C preprocessors, as
-opposed to \s-1ISO\s0 C preprocessors.
+opposed to \s-1ISO C\s0 preprocessors.
 .IP "\fB\-trigraphs\fR" 4
 .IX Item "-trigraphs"
 Process trigraph sequences.
 These are three-character sequences, all starting with \fB??\fR, that
-are defined by \s-1ISO\s0 C to stand for single characters.  For example,
+are defined by \s-1ISO C\s0 to stand for single characters.  For example,
 \&\fB??/\fR stands for \fB\e\fR, so \fB'??/n'\fR is a character
 constant for a newline.  By default, \s-1GCC\s0 ignores trigraphs, but in
 standard-conforming modes it converts them.  See the \fB\-std\fR and
@@ -10166,7 +10175,7 @@
 preprocessing anything.
 .IP "\fB\-v\fR" 4
 .IX Item "-v"
-Verbose mode.  Print out \s-1GNU\s0 \s-1CPP\s0's version number at the beginning of
+Verbose mode.  Print out \s-1GNU CPP\s0's version number at the beginning of
 execution, and report the final form of the include path.
 .IP "\fB\-H\fR" 4
 .IX Item "-H"
@@ -10181,7 +10190,7 @@
 .IP "\fB\-\-version\fR" 4
 .IX Item "--version"
 .PD
-Print out \s-1GNU\s0 \s-1CPP\s0's version number.  With one dash, proceed to
+Print out \s-1GNU CPP\s0's version number.  With one dash, proceed to
 preprocess as normal.  With two dashes, exit immediately.
 .SS "Passing Options to the Assembler"
 .IX Subsection "Passing Options to the Assembler"
@@ -10622,7 +10631,7 @@
 .Sp
 The default depends on the specific target configuration.  Note that
 the \s-1LP64\s0 and \s-1ILP32\s0 ABIs are not link-compatible; you must compile your
-entire program with the same \s-1ABI\s0, and link with a compatible set of libraries.
+entire program with the same \s-1ABI,\s0 and link with a compatible set of libraries.
 .IP "\fB\-mbig\-endian\fR" 4
 .IX Item "-mbig-endian"
 Generate big-endian code.  This is the default when \s-1GCC\s0 is configured for an
@@ -10839,7 +10848,7 @@
 round-to-nearest-or-even rounding mode.
 .IP "\fBint\fR" 4
 .IX Item "int"
-This is the mode used to perform integer calculations in the \s-1FPU\s0, e.g.
+This is the mode used to perform integer calculations in the \s-1FPU,\s0 e.g.
 integer multiply, or integer multiply-and-accumulate.
 .RE
 .RS 4
@@ -10901,13 +10910,13 @@
 .RS 4
 .IP "\fB\s-1ARC600\s0\fR" 4
 .IX Item "ARC600"
-Compile for \s-1ARC600\s0.  Aliases: \fB\-mA6\fR, \fB\-mARC600\fR.
+Compile for \s-1ARC600. \s0 Aliases: \fB\-mA6\fR, \fB\-mARC600\fR.
 .IP "\fB\s-1ARC601\s0\fR" 4
 .IX Item "ARC601"
-Compile for \s-1ARC601\s0.  Alias: \fB\-mARC601\fR.
+Compile for \s-1ARC601. \s0 Alias: \fB\-mARC601\fR.
 .IP "\fB\s-1ARC700\s0\fR" 4
 .IX Item "ARC700"
-Compile for \s-1ARC700\s0.  Aliases: \fB\-mA7\fR, \fB\-mARC700\fR.
+Compile for \s-1ARC700. \s0 Aliases: \fB\-mA7\fR, \fB\-mARC700\fR.
 This is the default when configured with \fB\-\-with\-cpu=arc700\fR.
 .RE
 .RS 4
@@ -10934,7 +10943,7 @@
 supported.  This is always enabled for \fB\-mcpu=ARC700\fR.
 .IP "\fB\-mno\-mpy\fR" 4
 .IX Item "-mno-mpy"
-Do not generate mpy instructions for \s-1ARC700\s0.
+Do not generate mpy instructions for \s-1ARC700.\s0
 .IP "\fB\-mmul32x16\fR" 4
 .IX Item "-mmul32x16"
 Generate 32x16 bit multiply and mac instructions.
@@ -10959,7 +10968,7 @@
 implementation.
 .IP "\fB\-msimd\fR" 4
 .IX Item "-msimd"
-Enable generation of \s-1ARC\s0 \s-1SIMD\s0 instructions via target-specific
+Enable generation of \s-1ARC SIMD\s0 instructions via target-specific
 builtins.  Only valid for \fB\-mcpu=ARC700\fR.
 .IP "\fB\-msoft\-float\fR" 4
 .IX Item "-msoft-float"
@@ -11126,7 +11135,7 @@
 the case.
 .IP "\fB\-mlra\fR" 4
 .IX Item "-mlra"
-Enable Local Register Allocation.  This is still experimental for \s-1ARC\s0,
+Enable Local Register Allocation.  This is still experimental for \s-1ARC,\s0
 so by default the compiler uses standard reload
 (i.e. \fB\-mno\-lra\fR).
 .IP "\fB\-mlra\-priority\-none\fR" 4
@@ -11232,7 +11241,7 @@
 are now deprecated and will be removed in a future release:
 .IP "\fB\-margonaut\fR" 4
 .IX Item "-margonaut"
-Obsolete \s-1FPX\s0.
+Obsolete \s-1FPX.\s0
 .IP "\fB\-mbig\-endian\fR" 4
 .IX Item "-mbig-endian"
 .PD 0
@@ -11296,7 +11305,7 @@
 architectures:
 .IP "\fB\-mabi=\fR\fIname\fR" 4
 .IX Item "-mabi=name"
-Generate code for the specified \s-1ABI\s0.  Permissible values are: \fBapcs-gnu\fR,
+Generate code for the specified \s-1ABI. \s0 Permissible values are: \fBapcs-gnu\fR,
 \&\fBatpcs\fR, \fBaapcs\fR, \fBaapcs-linux\fR and \fBiwmmxt\fR.
 .IP "\fB\-mapcs\-frame\fR" 4
 .IX Item "-mapcs-frame"
@@ -11339,7 +11348,7 @@
 .Sp
 The default depends on the specific target configuration.  Note that
 the hard-float and soft-float ABIs are not link-compatible; you must
-compile your entire program with the same \s-1ABI\s0, and link with a
+compile your entire program with the same \s-1ABI,\s0 and link with a
 compatible set of libraries.
 .IP "\fB\-mlittle\-endian\fR" 4
 .IX Item "-mlittle-endian"
@@ -11468,7 +11477,7 @@
 (e.g. \fB\-mfpu\fR=\fBneon\fR), note that floating-point
 operations are not generated by \s-1GCC\s0's auto-vectorization pass unless
 \&\fB\-funsafe\-math\-optimizations\fR is also specified.  This is
-because \s-1NEON\s0 hardware does not fully implement the \s-1IEEE\s0 754 standard for
+because \s-1NEON\s0 hardware does not fully implement the \s-1IEEE 754\s0 standard for
 floating-point arithmetic (in particular denormal values are treated as
 zero), so the use of \s-1NEON\s0 instructions may lead to a loss of precision.
 .IP "\fB\-mfp16\-format=\fR\fIname\fR" 4
@@ -11541,7 +11550,7 @@
 .IX Item "-mpic-data-is-text-relative"
 Assume that each data segments are relative to text segment at load time.
 Therefore, it permits addressing data using PC-relative operations.
-This option is on by default for targets other than VxWorks \s-1RTP\s0.
+This option is on by default for targets other than VxWorks \s-1RTP.\s0
 .IP "\fB\-mpoke\-function\-name\fR" 4
 .IX Item "-mpoke-function-name"
 Write the name of each function into the text section, directly
@@ -11721,33 +11730,33 @@
 .ie n .IP """avr6""" 4
 .el .IP "\f(CWavr6\fR" 4
 .IX Item "avr6"
-\&\*(L"Enhanced\*(R" devices with 3\-byte \s-1PC\s0, i.e. with more than 128@tie{}KiB of program memory.
+\&\*(L"Enhanced\*(R" devices with 3\-byte \s-1PC,\s0 i.e. with more than 128@tie{}KiB of program memory.
 \&\fImcu\fR\f(CW@tie\fR{}= \f(CW\*(C`atmega2560\*(C'\fR, \f(CW\*(C`atmega2561\*(C'\fR.
 .ie n .IP """avrxmega2""" 4
 .el .IP "\f(CWavrxmega2\fR" 4
 .IX Item "avrxmega2"
-\&\*(L"\s-1XMEGA\s0\*(R" devices with more than 8@tie{}KiB and up to 64@tie{}KiB of program memory.
+\&\*(L"\s-1XMEGA\*(R"\s0 devices with more than 8@tie{}KiB and up to 64@tie{}KiB of program memory.
 \&\fImcu\fR\f(CW@tie\fR{}= \f(CW\*(C`atmxt112sl\*(C'\fR, \f(CW\*(C`atmxt224\*(C'\fR, \f(CW\*(C`atmxt224e\*(C'\fR, \f(CW\*(C`atmxt336s\*(C'\fR, \f(CW\*(C`atxmega16a4\*(C'\fR, \f(CW\*(C`atxmega16a4u\*(C'\fR, \f(CW\*(C`atxmega16c4\*(C'\fR, \f(CW\*(C`atxmega16d4\*(C'\fR, \f(CW\*(C`atxmega32a4\*(C'\fR, \f(CW\*(C`atxmega32a4u\*(C'\fR, \f(CW\*(C`atxmega32c4\*(C'\fR, \f(CW\*(C`atxmega32d4\*(C'\fR, \f(CW\*(C`atxmega32e5\*(C'\fR, \f(CW\*(C`atxmega32x1\*(C'\fR.
 .ie n .IP """avrxmega4""" 4
 .el .IP "\f(CWavrxmega4\fR" 4
 .IX Item "avrxmega4"
-\&\*(L"\s-1XMEGA\s0\*(R" devices with more than 64@tie{}KiB and up to 128@tie{}KiB of program memory.
+\&\*(L"\s-1XMEGA\*(R"\s0 devices with more than 64@tie{}KiB and up to 128@tie{}KiB of program memory.
 \&\fImcu\fR\f(CW@tie\fR{}= \f(CW\*(C`atxmega64a3\*(C'\fR, \f(CW\*(C`atxmega64a3u\*(C'\fR, \f(CW\*(C`atxmega64a4u\*(C'\fR, \f(CW\*(C`atxmega64b1\*(C'\fR, \f(CW\*(C`atxmega64b3\*(C'\fR, \f(CW\*(C`atxmega64c3\*(C'\fR, \f(CW\*(C`atxmega64d3\*(C'\fR, \f(CW\*(C`atxmega64d4\*(C'\fR.
 .ie n .IP """avrxmega5""" 4
 .el .IP "\f(CWavrxmega5\fR" 4
 .IX Item "avrxmega5"
-\&\*(L"\s-1XMEGA\s0\*(R" devices with more than 64@tie{}KiB and up to 128@tie{}KiB of program memory and more than 64@tie{}KiB of \s-1RAM\s0.
-\&\fImcu\fR\f(CW@tie\fR{}= \f(CW\*(C`atxmega64a1\*(C'\fR, \f(CW\*(C`atxmega64a1u\*(C'\fR.
+\&\*(L"\s-1XMEGA\*(R"\s0 devices with more than 64@tie{}KiB and up to 128@tie{}KiB of program memory and more than 64@tie{}KiB of \s-1RAM.
+\&\s0\fImcu\fR\f(CW@tie\fR{}= \f(CW\*(C`atxmega64a1\*(C'\fR, \f(CW\*(C`atxmega64a1u\*(C'\fR.
 .ie n .IP """avrxmega6""" 4
 .el .IP "\f(CWavrxmega6\fR" 4
 .IX Item "avrxmega6"
-\&\*(L"\s-1XMEGA\s0\*(R" devices with more than 128@tie{}KiB of program memory.
+\&\*(L"\s-1XMEGA\*(R"\s0 devices with more than 128@tie{}KiB of program memory.
 \&\fImcu\fR\f(CW@tie\fR{}= \f(CW\*(C`atmxt540s\*(C'\fR, \f(CW\*(C`atmxt540sreva\*(C'\fR, \f(CW\*(C`atxmega128a3\*(C'\fR, \f(CW\*(C`atxmega128a3u\*(C'\fR, \f(CW\*(C`atxmega128b1\*(C'\fR, \f(CW\*(C`atxmega128b3\*(C'\fR, \f(CW\*(C`atxmega128c3\*(C'\fR, \f(CW\*(C`atxmega128d3\*(C'\fR, \f(CW\*(C`atxmega128d4\*(C'\fR, \f(CW\*(C`atxmega192a3\*(C'\fR, \f(CW\*(C`atxmega192a3u\*(C'\fR, \f(CW\*(C`atxmega192c3\*(C'\fR, \f(CW\*(C`atxmega192d3\*(C'\fR, \f(CW\*(C`atxmega256a3\*(C'\fR, \f(CW\*(C`atxmega256a3b\*(C'\fR, \f(CW\*(C`atxmega256a3bu\*(C'\fR, \f(CW\*(C`atxmega256a3u\*(C'\fR, \f(CW\*(C`atxmega256c3\*(C'\fR, \f(CW\*(C`atxmega256d3\*(C'\fR, \f(CW\*(C`atxmega384c3\*(C'\fR, \f(CW\*(C`atxmega384d3\*(C'\fR.
 .ie n .IP """avrxmega7""" 4
 .el .IP "\f(CWavrxmega7\fR" 4
 .IX Item "avrxmega7"
-\&\*(L"\s-1XMEGA\s0\*(R" devices with more than 128@tie{}KiB of program memory and more than 64@tie{}KiB of \s-1RAM\s0.
-\&\fImcu\fR\f(CW@tie\fR{}= \f(CW\*(C`atxmega128a1\*(C'\fR, \f(CW\*(C`atxmega128a1u\*(C'\fR, \f(CW\*(C`atxmega128a4u\*(C'\fR.
+\&\*(L"\s-1XMEGA\*(R"\s0 devices with more than 128@tie{}KiB of program memory and more than 64@tie{}KiB of \s-1RAM.
+\&\s0\fImcu\fR\f(CW@tie\fR{}= \f(CW\*(C`atxmega128a1\*(C'\fR, \f(CW\*(C`atxmega128a1u\*(C'\fR, \f(CW\*(C`atxmega128a4u\*(C'\fR.
 .ie n .IP """avr1""" 4
 .el .IP "\f(CWavr1\fR" 4
 .IX Item "avr1"
@@ -11950,7 +11959,7 @@
 .IX Item "-<Switch/case dispatch tables. If you do not want such dispatch>"
 tables you can specify the \fB\-fno\-jump\-tables\fR command-line option.
 .IP "\-<C and \*(C+ constructors/destructors called during startup/shutdown.>" 4
-.IX Item "-<C and  constructors/destructors called during startup/shutdown.>"
+.IX Item "-<C and constructors/destructors called during startup/shutdown.>"
 .PD 0
 .ie n .IP "\-<If the tools hit a ""gs()"" modifier explained above.>" 4
 .el .IP "\-<If the tools hit a \f(CWgs()\fR modifier explained above.>" 4
@@ -12131,7 +12140,7 @@
 .el .IP "\f(CW_\|_AVR_SP8_\|_\fR" 4
 .IX Item "__AVR_SP8__"
 .PD
-The device has the \s-1SPH\s0 (high part of stack pointer) special function
+The device has the \s-1SPH \s0(high part of stack pointer) special function
 register or has an 8\-bit stack pointer, respectively.
 The definition of these macros is affected by \f(CW\*(C`\-mmcu=\*(C'\fR and
 in the cases of \f(CW\*(C`\-mmcu=avr2\*(C'\fR and \f(CW\*(C`\-mmcu=avr25\*(C'\fR also
@@ -12164,7 +12173,7 @@
 .el .IP "\f(CW_\|_AVR_ERRATA_SKIP_JMP_CALL_\|_\fR" 4
 .IX Item "__AVR_ERRATA_SKIP_JMP_CALL__"
 .PD
-Some \s-1AVR\s0 devices (\s-1AT90S8515\s0, ATmega103) must not skip 32\-bit
+Some \s-1AVR\s0 devices (\s-1AT90S8515,\s0 ATmega103) must not skip 32\-bit
 instructions because of a hardware erratum.  Skip instructions are
 \&\f(CW\*(C`SBRS\*(C'\fR, \f(CW\*(C`SBRC\*(C'\fR, \f(CW\*(C`SBIS\*(C'\fR, \f(CW\*(C`SBIC\*(C'\fR and \f(CW\*(C`CPSE\*(C'\fR.
 The second macro is only defined if \f(CW\*(C`_\|_AVR_HAVE_JMP_CALL_\|_\*(C'\fR is also
@@ -12172,7 +12181,7 @@
 .ie n .IP """_\|_AVR_ISA_RMW_\|_""" 4
 .el .IP "\f(CW_\|_AVR_ISA_RMW_\|_\fR" 4
 .IX Item "__AVR_ISA_RMW__"
-The device has Read-Modify-Write instructions (\s-1XCH\s0, \s-1LAC\s0, \s-1LAS\s0 and \s-1LAT\s0).
+The device has Read-Modify-Write instructions (\s-1XCH, LAC, LAS\s0 and \s-1LAT\s0).
 .ie n .IP """_\|_AVR_SFR_OFFSET_\|_=\f(CIoffset\f(CW""" 4
 .el .IP "\f(CW_\|_AVR_SFR_OFFSET_\|_=\f(CIoffset\f(CW\fR" 4
 .IX Item "__AVR_SFR_OFFSET__=offset"
@@ -12356,8 +12365,8 @@
 This option can only be used in conjunction with \fB\-mmulticore\fR.
 .IP "\fB\-msdram\fR" 4
 .IX Item "-msdram"
-Build a standalone application for \s-1SDRAM\s0. Proper start files and
-link scripts are used to put the application into \s-1SDRAM\s0, and the macro
+Build a standalone application for \s-1SDRAM.\s0 Proper start files and
+link scripts are used to put the application into \s-1SDRAM,\s0 and the macro
 \&\f(CW\*(C`_\|_BFIN_SDRAM\*(C'\fR is defined.
 The loader should initialize \s-1SDRAM\s0 before loading the application.
 .IP "\fB\-micplb\fR" 4
@@ -12416,7 +12425,7 @@
 .PD
 Generate code for the specified architecture.  The choices for
 \&\fIarchitecture-type\fR are \fBv3\fR, \fBv8\fR and \fBv10\fR for
-respectively \s-1ETRAX\s0\ 4, \s-1ETRAX\s0\ 100, and \s-1ETRAX\s0\ 100\ \s-1LX\s0.
+respectively \s-1ETRAX\s0\ 4, \s-1ETRAX\s0\ 100, and \s-1ETRAX\s0\ 100\ \s-1LX.\s0
 Default is \fBv0\fR except for cris-axis-linux-gnu, where the default is
 \&\fBv10\fR.
 .IP "\fB\-mtune=\fR\fIarchitecture-type\fR" 4
@@ -12509,7 +12518,7 @@
 With \fB\-fpic\fR and \fB\-fPIC\fR, don't generate (do generate)
 instruction sequences that load addresses for functions from the \s-1PLT\s0 part
 of the \s-1GOT\s0 rather than (traditional on other architectures) calls to the
-\&\s-1PLT\s0.  The default is \fB\-mgotplt\fR.
+\&\s-1PLT. \s0 The default is \fB\-mgotplt\fR.
 .IP "\fB\-melf\fR" 4
 .IX Item "-melf"
 Legacy no-op option only recognized with the cris-axis-elf and
@@ -12565,7 +12574,7 @@
 These options are defined for all architectures running the Darwin operating
 system.
 .PP
-\&\s-1FSF\s0 \s-1GCC\s0 on Darwin does not create \*(L"fat\*(R" object files; it creates
+\&\s-1FSF GCC\s0 on Darwin does not create \*(L"fat\*(R" object files; it creates
 an object file for the single architecture that \s-1GCC\s0 was built to
 target.  Apple's \s-1GCC\s0 on Darwin does create \*(L"fat\*(R" files if multiple
 \&\fB\-arch\fR options are used; it does so by running the compiler or
@@ -12625,7 +12634,7 @@
 .IX Item "-gused"
 Emit debugging information for symbols that are used.  For stabs
 debugging format, this enables \fB\-feliminate\-unused\-debug\-symbols\fR.
-This is by default \s-1ON\s0.
+This is by default \s-1ON.\s0
 .IP "\fB\-gfull\fR" 4
 .IX Item "-gfull"
 Emit debugging information for all symbols and types.
@@ -12701,7 +12710,7 @@
 This causes \s-1GCC\s0's output file to have the \fI\s-1ALL\s0\fR subtype, instead of
 one controlled by the \fB\-mcpu\fR or \fB\-march\fR option.
 .IP "\fB\-allowable_client\fR  \fIclient_name\fR" 4
-.IX Item "-allowable_client  client_name"
+.IX Item "-allowable_client client_name"
 .PD 0
 .IP "\fB\-client_name\fR" 4
 .IX Item "-client_name"
@@ -12875,7 +12884,7 @@
 .IP "\fB\-mieee\-with\-inexact\fR" 4
 .IX Item "-mieee-with-inexact"
 This is like \fB\-mieee\fR except the generated code also maintains
-the \s-1IEEE\s0 \fIinexact-flag\fR.  Turning on this option causes the
+the \s-1IEEE \s0\fIinexact-flag\fR.  Turning on this option causes the
 generated code to implement fully-compliant \s-1IEEE\s0 math.  In addition to
 \&\f(CW\*(C`_IEEE_FP\*(C'\fR, \f(CW\*(C`_IEEE_FP_EXACT\*(C'\fR is defined as a preprocessor
 macro.  On some Alpha implementations the resulting code may execute
@@ -13001,8 +13010,8 @@
 .IP "\fB\-mno\-max\fR" 4
 .IX Item "-mno-max"
 .PD
-Indicate whether \s-1GCC\s0 should generate code to use the optional \s-1BWX\s0,
-\&\s-1CIX\s0, \s-1FIX\s0 and \s-1MAX\s0 instruction sets.  The default is to use the instruction
+Indicate whether \s-1GCC\s0 should generate code to use the optional \s-1BWX,
+CIX, FIX\s0 and \s-1MAX\s0 instruction sets.  The default is to use the instruction
 sets supported by the \s-1CPU\s0 type specified via \fB\-mcpu=\fR option or that
 of the \s-1CPU\s0 on which \s-1GCC\s0 was built if none is specified.
 .IP "\fB\-mfloat\-vax\fR" 4
@@ -13011,7 +13020,7 @@
 .IP "\fB\-mfloat\-ieee\fR" 4
 .IX Item "-mfloat-ieee"
 .PD
-Generate code that uses (does not use) \s-1VAX\s0 F and G floating-point
+Generate code that uses (does not use) \s-1VAX F\s0 and G floating-point
 arithmetic instead of \s-1IEEE\s0 single and double precision.
 .IP "\fB\-mexplicit\-relocs\fR" 4
 .IX Item "-mexplicit-relocs"
@@ -13066,7 +13075,7 @@
 Set the instruction set and instruction scheduling parameters for
 machine type \fIcpu_type\fR.  You can specify either the \fB\s-1EV\s0\fR
 style name or the corresponding chip number.  \s-1GCC\s0 supports scheduling
-parameters for the \s-1EV4\s0, \s-1EV5\s0 and \s-1EV6\s0 family of processors and
+parameters for the \s-1EV4, EV5\s0 and \s-1EV6\s0 family of processors and
 chooses the default values for the instruction set from the processor
 you specify.  If you do not specify a processor type, \s-1GCC\s0 defaults
 to the processor on which the compiler was built.
@@ -13111,14 +13120,14 @@
 .IP "\fB21264\fR" 4
 .IX Item "21264"
 .PD
-Schedules as an \s-1EV6\s0 and supports the \s-1BWX\s0, \s-1FIX\s0, and \s-1MAX\s0 extensions.
+Schedules as an \s-1EV6\s0 and supports the \s-1BWX, FIX,\s0 and \s-1MAX\s0 extensions.
 .IP "\fBev67\fR" 4
 .IX Item "ev67"
 .PD 0
 .IP "\fB21264a\fR" 4
 .IX Item "21264a"
 .PD
-Schedules as an \s-1EV6\s0 and supports the \s-1BWX\s0, \s-1CIX\s0, \s-1FIX\s0, and \s-1MAX\s0 extensions.
+Schedules as an \s-1EV6\s0 and supports the \s-1BWX, CIX, FIX,\s0 and \s-1MAX\s0 extensions.
 .RE
 .RS 4
 .Sp
@@ -13159,9 +13168,9 @@
 .IX Item "main"
 .PD
 The compiler contains estimates of the number of clock cycles for
-\&\*(L"typical\*(R" \s-1EV4\s0 & \s-1EV5\s0 hardware for the Level 1, 2 & 3 caches
+\&\*(L"typical\*(R" \s-1EV4 & EV5\s0 hardware for the Level 1, 2 & 3 caches
 (also called Dcache, Scache, and Bcache), as well as to main memory.
-Note that L3 is only valid for \s-1EV5\s0.
+Note that L3 is only valid for \s-1EV5.\s0
 .RE
 .RS 4
 .RE
@@ -13234,7 +13243,7 @@
 Do not use multiply and add/subtract instructions.
 .IP "\fB\-mfdpic\fR" 4
 .IX Item "-mfdpic"
-Select the \s-1FDPIC\s0 \s-1ABI\s0, which uses function descriptors to represent
+Select the \s-1FDPIC ABI,\s0 which uses function descriptors to represent
 pointers to functions.  Without any PIC/PIE\-related options, it
 implies \fB\-fPIE\fR.  With \fB\-fpic\fR or \fB\-fpie\fR, it
 assumes \s-1GOT\s0 entries and small data are within a 12\-bit range from the
@@ -13257,7 +13266,7 @@
 Do not assume a large \s-1TLS\s0 segment when generating thread-local code.
 .IP "\fB\-mgprel\-ro\fR" 4
 .IX Item "-mgprel-ro"
-Enable the use of \f(CW\*(C`GPREL\*(C'\fR relocations in the \s-1FDPIC\s0 \s-1ABI\s0 for data
+Enable the use of \f(CW\*(C`GPREL\*(C'\fR relocations in the \s-1FDPIC ABI\s0 for data
 that is known to be in read-only sections.  It's enabled by default,
 except for \fB\-fpic\fR or \fB\-fpie\fR: even though it may help
 make the global offset table smaller, it trades 1 instruction for 4.
@@ -13401,7 +13410,7 @@
 These \fB\-m\fR options are defined for GNU/Linux targets:
 .IP "\fB\-mglibc\fR" 4
 .IX Item "-mglibc"
-Use the \s-1GNU\s0 C library.  This is the default except
+Use the \s-1GNU C\s0 library.  This is the default except
 on \fB*\-*\-linux\-*uclibc*\fR and \fB*\-*\-linux\-*android*\fR targets.
 .IP "\fB\-muclibc\fR" 4
 .IX Item "-muclibc"
@@ -13480,8 +13489,8 @@
 .IP "\fB\-march=\fR\fIarchitecture-type\fR" 4
 .IX Item "-march=architecture-type"
 Generate code for the specified architecture.  The choices for
-\&\fIarchitecture-type\fR are \fB1.0\fR for \s-1PA\s0 1.0, \fB1.1\fR for \s-1PA\s0
-1.1, and \fB2.0\fR for \s-1PA\s0 2.0 processors.  Refer to
+\&\fIarchitecture-type\fR are \fB1.0\fR for \s-1PA 1.0, \s0\fB1.1\fR for \s-1PA
+1.1,\s0 and \fB2.0\fR for \s-1PA 2.0\s0 processors.  Refer to
 \&\fI/usr/lib/sched.models\fR on an HP-UX system to determine the proper
 architecture option for your machine.  Code compiled for lower numbered
 architectures runs on higher numbered architectures, but not the
@@ -13509,7 +13518,7 @@
 .IP "\fB\-mdisable\-indexing\fR" 4
 .IX Item "-mdisable-indexing"
 Prevent the compiler from using indexing address modes.  This avoids some
-rather obscure problems when compiling \s-1MIG\s0 generated code under \s-1MACH\s0.
+rather obscure problems when compiling \s-1MIG\s0 generated code under \s-1MACH.\s0
 .IP "\fB\-mno\-space\-regs\fR" 4
 .IX Item "-mno-space-regs"
 Generate code that assumes the target has no space registers.  This allows
@@ -13566,17 +13575,17 @@
 \&\fB\-msoft\-float\fR changes the calling convention in the output file;
 therefore, it is only useful if you compile \fIall\fR of a program with
 this option.  In particular, you need to compile \fIlibgcc.a\fR, the
-library that comes with \s-1GCC\s0, with \fB\-msoft\-float\fR in order for
+library that comes with \s-1GCC,\s0 with \fB\-msoft\-float\fR in order for
 this to work.
 .IP "\fB\-msio\fR" 4
 .IX Item "-msio"
-Generate the predefine, \f(CW\*(C`_SIO\*(C'\fR, for server \s-1IO\s0.  The default is
+Generate the predefine, \f(CW\*(C`_SIO\*(C'\fR, for server \s-1IO. \s0 The default is
 \&\fB\-mwsio\fR.  This generates the predefines, \f(CW\*(C`_\|_hp9000s700\*(C'\fR,
-\&\f(CW\*(C`_\|_hp9000s700_\|_\*(C'\fR and \f(CW\*(C`_WSIO\*(C'\fR, for workstation \s-1IO\s0.  These
+\&\f(CW\*(C`_\|_hp9000s700_\|_\*(C'\fR and \f(CW\*(C`_WSIO\*(C'\fR, for workstation \s-1IO. \s0 These
 options are available under HP-UX and HI-UX.
 .IP "\fB\-mgnu\-ld\fR" 4
 .IX Item "-mgnu-ld"
-Use options specific to \s-1GNU\s0 \fBld\fR.
+Use options specific to \s-1GNU \s0\fBld\fR.
 This passes \fB\-shared\fR to \fBld\fR when
 building a shared library.  It is the default when \s-1GCC\s0 is configured,
 explicitly or implicitly, with the \s-1GNU\s0 linker.  This option does not
@@ -13586,10 +13595,10 @@
 \&\fB\-\-with\-ld\fR configure option, \s-1GCC\s0's program search path, and
 finally by the user's \fB\s-1PATH\s0\fR.  The linker used by \s-1GCC\s0 can be printed
 using \fBwhich `gcc \-print\-prog\-name=ld`\fR.  This option is only available
-on the 64\-bit HP-UX \s-1GCC\s0, i.e. configured with \fBhppa*64*\-*\-hpux*\fR.
+on the 64\-bit HP-UX \s-1GCC,\s0 i.e. configured with \fBhppa*64*\-*\-hpux*\fR.
 .IP "\fB\-mhp\-ld\fR" 4
 .IX Item "-mhp-ld"
-Use options specific to \s-1HP\s0 \fBld\fR.
+Use options specific to \s-1HP \s0\fBld\fR.
 This passes \fB\-b\fR to \fBld\fR when building
 a shared library and passes \fB+Accept TypeMismatch\fR to \fBld\fR on all
 links.  It is the default when \s-1GCC\s0 is configured, explicitly or
@@ -13600,7 +13609,7 @@
 configure option, \s-1GCC\s0's program search path, and finally by the user's
 \&\fB\s-1PATH\s0\fR.  The linker used by \s-1GCC\s0 can be printed using \fBwhich
 `gcc \-print\-prog\-name=ld`\fR.  This option is only available on the 64\-bit
-HP-UX \s-1GCC\s0, i.e. configured with \fBhppa*64*\-*\-hpux*\fR.
+HP-UX \s-1GCC,\s0 i.e. configured with \fBhppa*64*\-*\-hpux*\fR.
 .IP "\fB\-mlong\-calls\fR" 4
 .IX Item "-mlong-calls"
 Generate code that uses long call sequences.  This ensures that a call
@@ -13609,7 +13618,7 @@
 of the function or translation unit, as the case may be, exceeds a
 predefined limit set by the branch type being used.  The limits for
 normal calls are 7,600,000 and 240,000 bytes, respectively for the
-\&\s-1PA\s0 2.0 and \s-1PA\s0 1.X architectures.  Sibcalls are always limited at
+\&\s-1PA 2.0\s0 and \s-1PA 1.X\s0 architectures.  Sibcalls are always limited at
 240,000 bytes.
 .Sp
 Distances are measured from the beginning of functions when using the
@@ -13637,7 +13646,7 @@
 \&\fB95\fR for HP-UX 10.10 though to 11.00, and \fB98\fR for HP-UX 11.11
 and later.
 .Sp
-\&\fB\-munix=93\fR provides the same predefines as \s-1GCC\s0 3.3 and 3.4.
+\&\fB\-munix=93\fR provides the same predefines as \s-1GCC 3.3\s0 and 3.4.
 \&\fB\-munix=95\fR provides additional predefines for \f(CW\*(C`XOPEN_UNIX\*(C'\fR
 and \f(CW\*(C`_XOPEN_SOURCE_EXTENDED\*(C'\fR, and the startfile \fIunix95.o\fR.
 \&\fB\-munix=98\fR provides additional predefines for \f(CW\*(C`_XOPEN_UNIX\*(C'\fR,
@@ -13701,10 +13710,10 @@
 of the selected instruction set.
 .IP "\fBi386\fR" 4
 .IX Item "i386"
-Original Intel i386 \s-1CPU\s0.
+Original Intel i386 \s-1CPU.\s0
 .IP "\fBi486\fR" 4
 .IX Item "i486"
-Intel i486 \s-1CPU\s0.  (No scheduling is implemented for this chip.)
+Intel i486 \s-1CPU.  \s0(No scheduling is implemented for this chip.)
 .IP "\fBi586\fR" 4
 .IX Item "i586"
 .PD 0
@@ -13714,10 +13723,10 @@
 Intel Pentium \s-1CPU\s0 with no \s-1MMX\s0 support.
 .IP "\fBpentium-mmx\fR" 4
 .IX Item "pentium-mmx"
-Intel Pentium \s-1MMX\s0 \s-1CPU\s0, based on Pentium core with \s-1MMX\s0 instruction set support.
+Intel Pentium \s-1MMX CPU,\s0 based on Pentium core with \s-1MMX\s0 instruction set support.
 .IP "\fBpentiumpro\fR" 4
 .IX Item "pentiumpro"
-Intel Pentium Pro \s-1CPU\s0.
+Intel Pentium Pro \s-1CPU.\s0
 .IP "\fBi686\fR" 4
 .IX Item "i686"
 When used with \fB\-march\fR, the Pentium Pro
@@ -13725,7 +13734,7 @@
 When used with \fB\-mtune\fR, it has the same meaning as \fBgeneric\fR.
 .IP "\fBpentium2\fR" 4
 .IX Item "pentium2"
-Intel Pentium \s-1II\s0 \s-1CPU\s0, based on Pentium Pro core with \s-1MMX\s0 instruction set
+Intel Pentium \s-1II CPU,\s0 based on Pentium Pro core with \s-1MMX\s0 instruction set
 support.
 .IP "\fBpentium3\fR" 4
 .IX Item "pentium3"
@@ -13733,83 +13742,83 @@
 .IP "\fBpentium3m\fR" 4
 .IX Item "pentium3m"
 .PD
-Intel Pentium \s-1III\s0 \s-1CPU\s0, based on Pentium Pro core with \s-1MMX\s0 and \s-1SSE\s0 instruction
+Intel Pentium \s-1III CPU,\s0 based on Pentium Pro core with \s-1MMX\s0 and \s-1SSE\s0 instruction
 set support.
 .IP "\fBpentium-m\fR" 4
 .IX Item "pentium-m"
-Intel Pentium M; low-power version of Intel Pentium \s-1III\s0 \s-1CPU\s0
-with \s-1MMX\s0, \s-1SSE\s0 and \s-1SSE2\s0 instruction set support.  Used by Centrino notebooks.
+Intel Pentium M; low-power version of Intel Pentium \s-1III CPU\s0
+with \s-1MMX, SSE\s0 and \s-1SSE2\s0 instruction set support.  Used by Centrino notebooks.
 .IP "\fBpentium4\fR" 4
 .IX Item "pentium4"
 .PD 0
 .IP "\fBpentium4m\fR" 4
 .IX Item "pentium4m"
 .PD
-Intel Pentium 4 \s-1CPU\s0 with \s-1MMX\s0, \s-1SSE\s0 and \s-1SSE2\s0 instruction set support.
+Intel Pentium 4 \s-1CPU\s0 with \s-1MMX, SSE\s0 and \s-1SSE2\s0 instruction set support.
 .IP "\fBprescott\fR" 4
 .IX Item "prescott"
-Improved version of Intel Pentium 4 \s-1CPU\s0 with \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0 and \s-1SSE3\s0 instruction
+Improved version of Intel Pentium 4 \s-1CPU\s0 with \s-1MMX, SSE, SSE2\s0 and \s-1SSE3\s0 instruction
 set support.
 .IP "\fBnocona\fR" 4
 .IX Item "nocona"
-Improved version of Intel Pentium 4 \s-1CPU\s0 with 64\-bit extensions, \s-1MMX\s0, \s-1SSE\s0,
-\&\s-1SSE2\s0 and \s-1SSE3\s0 instruction set support.
+Improved version of Intel Pentium 4 \s-1CPU\s0 with 64\-bit extensions, \s-1MMX, SSE,
+SSE2\s0 and \s-1SSE3\s0 instruction set support.
 .IP "\fBcore2\fR" 4
 .IX Item "core2"
-Intel Core 2 \s-1CPU\s0 with 64\-bit extensions, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0 and \s-1SSSE3\s0
+Intel Core 2 \s-1CPU\s0 with 64\-bit extensions, \s-1MMX, SSE, SSE2, SSE3\s0 and \s-1SSSE3\s0
 instruction set support.
 .IP "\fBnehalem\fR" 4
 .IX Item "nehalem"
-Intel Nehalem \s-1CPU\s0 with 64\-bit extensions, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSSE3\s0,
-\&\s-1SSE4\s0.1, \s-1SSE4\s0.2 and \s-1POPCNT\s0 instruction set support.
+Intel Nehalem \s-1CPU\s0 with 64\-bit extensions, \s-1MMX, SSE, SSE2, SSE3, SSSE3,
+SSE4.1, SSE4.2\s0 and \s-1POPCNT\s0 instruction set support.
 .IP "\fBwestmere\fR" 4
 .IX Item "westmere"
-Intel Westmere \s-1CPU\s0 with 64\-bit extensions, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSSE3\s0,
-\&\s-1SSE4\s0.1, \s-1SSE4\s0.2, \s-1POPCNT\s0, \s-1AES\s0 and \s-1PCLMUL\s0 instruction set support.
+Intel Westmere \s-1CPU\s0 with 64\-bit extensions, \s-1MMX, SSE, SSE2, SSE3, SSSE3,
+SSE4.1, SSE4.2, POPCNT, AES\s0 and \s-1PCLMUL\s0 instruction set support.
 .IP "\fBsandybridge\fR" 4
 .IX Item "sandybridge"
-Intel Sandy Bridge \s-1CPU\s0 with 64\-bit extensions, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSSE3\s0,
-\&\s-1SSE4\s0.1, \s-1SSE4\s0.2, \s-1POPCNT\s0, \s-1AVX\s0, \s-1AES\s0 and \s-1PCLMUL\s0 instruction set support.
+Intel Sandy Bridge \s-1CPU\s0 with 64\-bit extensions, \s-1MMX, SSE, SSE2, SSE3, SSSE3,
+SSE4.1, SSE4.2, POPCNT, AVX, AES\s0 and \s-1PCLMUL\s0 instruction set support.
 .IP "\fBivybridge\fR" 4
 .IX Item "ivybridge"
-Intel Ivy Bridge \s-1CPU\s0 with 64\-bit extensions, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSSE3\s0,
-\&\s-1SSE4\s0.1, \s-1SSE4\s0.2, \s-1POPCNT\s0, \s-1AVX\s0, \s-1AES\s0, \s-1PCLMUL\s0, \s-1FSGSBASE\s0, \s-1RDRND\s0 and F16C
+Intel Ivy Bridge \s-1CPU\s0 with 64\-bit extensions, \s-1MMX, SSE, SSE2, SSE3, SSSE3,
+SSE4.1, SSE4.2, POPCNT, AVX, AES, PCLMUL, FSGSBASE, RDRND\s0 and F16C
 instruction set support.
 .IP "\fBhaswell\fR" 4
 .IX Item "haswell"
-Intel Haswell \s-1CPU\s0 with 64\-bit extensions, \s-1MOVBE\s0, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSSE3\s0,
-\&\s-1SSE4\s0.1, \s-1SSE4\s0.2, \s-1POPCNT\s0, \s-1AVX\s0, \s-1AVX2\s0, \s-1AES\s0, \s-1PCLMUL\s0, \s-1FSGSBASE\s0, \s-1RDRND\s0, \s-1FMA\s0,
-\&\s-1BMI\s0, \s-1BMI2\s0 and F16C instruction set support.
+Intel Haswell \s-1CPU\s0 with 64\-bit extensions, \s-1MOVBE, MMX, SSE, SSE2, SSE3, SSSE3,
+SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA,
+BMI, BMI2\s0 and F16C instruction set support.
 .IP "\fBbroadwell\fR" 4
 .IX Item "broadwell"
-Intel Broadwell \s-1CPU\s0 with 64\-bit extensions, \s-1MOVBE\s0, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSSE3\s0,
-\&\s-1SSE4\s0.1, \s-1SSE4\s0.2, \s-1POPCNT\s0, \s-1AVX\s0, \s-1AVX2\s0, \s-1AES\s0, \s-1PCLMUL\s0, \s-1FSGSBASE\s0, \s-1RDRND\s0, \s-1FMA\s0,
-\&\s-1BMI\s0, \s-1BMI2\s0, F16C, \s-1RDSEED\s0, \s-1ADCX\s0 and \s-1PREFETCHW\s0 instruction set support.
+Intel Broadwell \s-1CPU\s0 with 64\-bit extensions, \s-1MOVBE, MMX, SSE, SSE2, SSE3, SSSE3,
+SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA,
+BMI, BMI2, F16C, RDSEED, ADCX\s0 and \s-1PREFETCHW\s0 instruction set support.
 .IP "\fBbonnell\fR" 4
 .IX Item "bonnell"
-Intel Bonnell \s-1CPU\s0 with 64\-bit extensions, \s-1MOVBE\s0, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0 and \s-1SSSE3\s0
+Intel Bonnell \s-1CPU\s0 with 64\-bit extensions, \s-1MOVBE, MMX, SSE, SSE2, SSE3\s0 and \s-1SSSE3\s0
 instruction set support.
 .IP "\fBsilvermont\fR" 4
 .IX Item "silvermont"
-Intel Silvermont \s-1CPU\s0 with 64\-bit extensions, \s-1MOVBE\s0, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSSE3\s0,
-\&\s-1SSE4\s0.1, \s-1SSE4\s0.2, \s-1POPCNT\s0, \s-1AES\s0, \s-1PCLMUL\s0 and \s-1RDRND\s0 instruction set support.
+Intel Silvermont \s-1CPU\s0 with 64\-bit extensions, \s-1MOVBE, MMX, SSE, SSE2, SSE3, SSSE3,
+SSE4.1, SSE4.2, POPCNT, AES, PCLMUL\s0 and \s-1RDRND\s0 instruction set support.
 .IP "\fBk6\fR" 4
 .IX Item "k6"
-\&\s-1AMD\s0 K6 \s-1CPU\s0 with \s-1MMX\s0 instruction set support.
+\&\s-1AMD K6 CPU\s0 with \s-1MMX\s0 instruction set support.
 .IP "\fBk6\-2\fR" 4
 .IX Item "k6-2"
 .PD 0
 .IP "\fBk6\-3\fR" 4
 .IX Item "k6-3"
 .PD
-Improved versions of \s-1AMD\s0 K6 \s-1CPU\s0 with \s-1MMX\s0 and 3DNow! instruction set support.
+Improved versions of \s-1AMD K6 CPU\s0 with \s-1MMX\s0 and 3DNow! instruction set support.
 .IP "\fBathlon\fR" 4
 .IX Item "athlon"
 .PD 0
 .IP "\fBathlon-tbird\fR" 4
 .IX Item "athlon-tbird"
 .PD
-\&\s-1AMD\s0 Athlon \s-1CPU\s0 with \s-1MMX\s0, 3dNOW!, enhanced 3DNow! and \s-1SSE\s0 prefetch instructions
+\&\s-1AMD\s0 Athlon \s-1CPU\s0 with \s-1MMX,\s0 3dNOW!, enhanced 3DNow! and \s-1SSE\s0 prefetch instructions
 support.
 .IP "\fBathlon\-4\fR" 4
 .IX Item "athlon-4"
@@ -13819,7 +13828,7 @@
 .IP "\fBathlon-mp\fR" 4
 .IX Item "athlon-mp"
 .PD
-Improved \s-1AMD\s0 Athlon \s-1CPU\s0 with \s-1MMX\s0, 3DNow!, enhanced 3DNow! and full \s-1SSE\s0
+Improved \s-1AMD\s0 Athlon \s-1CPU\s0 with \s-1MMX,\s0 3DNow!, enhanced 3DNow! and full \s-1SSE\s0
 instruction set support.
 .IP "\fBk8\fR" 4
 .IX Item "k8"
@@ -13831,9 +13840,9 @@
 .IP "\fBathlon-fx\fR" 4
 .IX Item "athlon-fx"
 .PD
-Processors based on the \s-1AMD\s0 K8 core with x86\-64 instruction set support,
+Processors based on the \s-1AMD K8\s0 core with x86\-64 instruction set support,
 including the \s-1AMD\s0 Opteron, Athlon 64, and Athlon 64 \s-1FX\s0 processors.
-(This supersets \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, 3DNow!, enhanced 3DNow! and 64\-bit
+(This supersets \s-1MMX, SSE, SSE2,\s0 3DNow!, enhanced 3DNow! and 64\-bit
 instruction set extensions.)
 .IP "\fBk8\-sse3\fR" 4
 .IX Item "k8-sse3"
@@ -13843,7 +13852,7 @@
 .IP "\fBathlon64\-sse3\fR" 4
 .IX Item "athlon64-sse3"
 .PD
-Improved versions of \s-1AMD\s0 K8 cores with \s-1SSE3\s0 instruction set support.
+Improved versions of \s-1AMD K8\s0 cores with \s-1SSE3\s0 instruction set support.
 .IP "\fBamdfam10\fR" 4
 .IX Item "amdfam10"
 .PD 0
@@ -13851,56 +13860,56 @@
 .IX Item "barcelona"
 .PD
 CPUs based on \s-1AMD\s0 Family 10h cores with x86\-64 instruction set support.  (This
-supersets \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSE4A\s0, 3DNow!, enhanced 3DNow!, \s-1ABM\s0 and 64\-bit
+supersets \s-1MMX, SSE, SSE2, SSE3, SSE4A,\s0 3DNow!, enhanced 3DNow!, \s-1ABM\s0 and 64\-bit
 instruction set extensions.)
 .IP "\fBbdver1\fR" 4
 .IX Item "bdver1"
 CPUs based on \s-1AMD\s0 Family 15h cores with x86\-64 instruction set support.  (This
-supersets \s-1FMA4\s0, \s-1AVX\s0, \s-1XOP\s0, \s-1LWP\s0, \s-1AES\s0, \s-1PCL_MUL\s0, \s-1CX16\s0, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSE4A\s0,
-\&\s-1SSSE3\s0, \s-1SSE4\s0.1, \s-1SSE4\s0.2, \s-1ABM\s0 and 64\-bit instruction set extensions.)
+supersets \s-1FMA4, AVX, XOP, LWP, AES, PCL_MUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A,
+SSSE3, SSE4.1, SSE4.2, ABM\s0 and 64\-bit instruction set extensions.)
 .IP "\fBbdver2\fR" 4
 .IX Item "bdver2"
 \&\s-1AMD\s0 Family 15h core based CPUs with x86\-64 instruction set support.  (This
-supersets \s-1BMI\s0, \s-1TBM\s0, F16C, \s-1FMA\s0, \s-1FMA4\s0, \s-1AVX\s0, \s-1XOP\s0, \s-1LWP\s0, \s-1AES\s0, \s-1PCL_MUL\s0, \s-1CX16\s0, \s-1MMX\s0,
-\&\s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSE4A\s0, \s-1SSSE3\s0, \s-1SSE4\s0.1, \s-1SSE4\s0.2, \s-1ABM\s0 and 64\-bit instruction set 
+supersets \s-1BMI, TBM, F16C, FMA, FMA4, AVX, XOP, LWP, AES, PCL_MUL, CX16, MMX,
+SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM\s0 and 64\-bit instruction set 
 extensions.)
 .IP "\fBbdver3\fR" 4
 .IX Item "bdver3"
 \&\s-1AMD\s0 Family 15h core based CPUs with x86\-64 instruction set support.  (This
-supersets \s-1BMI\s0, \s-1TBM\s0, F16C, \s-1FMA\s0, \s-1FMA4\s0, \s-1FSGSBASE\s0, \s-1AVX\s0, \s-1XOP\s0, \s-1LWP\s0, \s-1AES\s0, 
-\&\s-1PCL_MUL\s0, \s-1CX16\s0, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSE4A\s0, \s-1SSSE3\s0, \s-1SSE4\s0.1, \s-1SSE4\s0.2, \s-1ABM\s0 and 
+supersets \s-1BMI, TBM, F16C, FMA, FMA4, FSGSBASE, AVX, XOP, LWP, AES, 
+PCL_MUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM\s0 and 
 64\-bit instruction set extensions.
 .IP "\fBbdver4\fR" 4
 .IX Item "bdver4"
 \&\s-1AMD\s0 Family 15h core based CPUs with x86\-64 instruction set support.  (This
-supersets \s-1BMI\s0, \s-1BMI2\s0, \s-1TBM\s0, F16C, \s-1FMA\s0, \s-1FMA4\s0, \s-1FSGSBASE\s0, \s-1AVX\s0, \s-1AVX2\s0, \s-1XOP\s0, \s-1LWP\s0, 
-\&\s-1AES\s0, \s-1PCL_MUL\s0, \s-1CX16\s0, \s-1MOVBE\s0, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSE4A\s0, \s-1SSSE3\s0, \s-1SSE4\s0.1, 
-\&\s-1SSE4\s0.2, \s-1ABM\s0 and 64\-bit instruction set extensions.
+supersets \s-1BMI, BMI2, TBM, F16C, FMA, FMA4, FSGSBASE, AVX, AVX2, XOP, LWP, 
+AES, PCL_MUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, 
+SSE4.2, ABM\s0 and 64\-bit instruction set extensions.
 .IP "\fBbtver1\fR" 4
 .IX Item "btver1"
 CPUs based on \s-1AMD\s0 Family 14h cores with x86\-64 instruction set support.  (This
-supersets \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSSE3\s0, \s-1SSE4A\s0, \s-1CX16\s0, \s-1ABM\s0 and 64\-bit
+supersets \s-1MMX, SSE, SSE2, SSE3, SSSE3, SSE4A, CX16, ABM\s0 and 64\-bit
 instruction set extensions.)
 .IP "\fBbtver2\fR" 4
 .IX Item "btver2"
 CPUs based on \s-1AMD\s0 Family 16h cores with x86\-64 instruction set support. This
-includes \s-1MOVBE\s0, F16C, \s-1BMI\s0, \s-1AVX\s0, \s-1PCL_MUL\s0, \s-1AES\s0, \s-1SSE4\s0.2, \s-1SSE4\s0.1, \s-1CX16\s0, \s-1ABM\s0,
-\&\s-1SSE4A\s0, \s-1SSSE3\s0, \s-1SSE3\s0, \s-1SSE2\s0, \s-1SSE\s0, \s-1MMX\s0 and 64\-bit instruction set extensions.
+includes \s-1MOVBE, F16C, BMI, AVX, PCL_MUL, AES, SSE4.2, SSE4.1, CX16, ABM,
+SSE4A, SSSE3, SSE3, SSE2, SSE, MMX\s0 and 64\-bit instruction set extensions.
 .IP "\fBwinchip\-c6\fR" 4
 .IX Item "winchip-c6"
-\&\s-1IDT\s0 WinChip C6 \s-1CPU\s0, dealt in same way as i486 with additional \s-1MMX\s0 instruction
+\&\s-1IDT\s0 WinChip C6 \s-1CPU,\s0 dealt in same way as i486 with additional \s-1MMX\s0 instruction
 set support.
 .IP "\fBwinchip2\fR" 4
 .IX Item "winchip2"
-\&\s-1IDT\s0 WinChip 2 \s-1CPU\s0, dealt in same way as i486 with additional \s-1MMX\s0 and 3DNow!
+\&\s-1IDT\s0 WinChip 2 \s-1CPU,\s0 dealt in same way as i486 with additional \s-1MMX\s0 and 3DNow!
 instruction set support.
 .IP "\fBc3\fR" 4
 .IX Item "c3"
-\&\s-1VIA\s0 C3 \s-1CPU\s0 with \s-1MMX\s0 and 3DNow! instruction set support.  (No scheduling is
+\&\s-1VIA C3 CPU\s0 with \s-1MMX\s0 and 3DNow! instruction set support.  (No scheduling is
 implemented for this chip.)
 .IP "\fBc3\-2\fR" 4
 .IX Item "c3-2"
-\&\s-1VIA\s0 C3\-2 (Nehemiah/C5XL) \s-1CPU\s0 with \s-1MMX\s0 and \s-1SSE\s0 instruction set support.
+\&\s-1VIA C3\-2 \s0(Nehemiah/C5XL) \s-1CPU\s0 with \s-1MMX\s0 and \s-1SSE\s0 instruction set support.
 (No scheduling is
 implemented for this chip.)
 .IP "\fBgeode\fR" 4
@@ -13934,7 +13943,7 @@
 .Sp
 As new processors are deployed in the marketplace, the behavior of this
 option will change.  Therefore, if you upgrade to a newer version of
-\&\s-1GCC\s0, code generation controlled by this option will change to reflect
+\&\s-1GCC,\s0 code generation controlled by this option will change to reflect
 the processors
 that are most common at the time that version of \s-1GCC\s0 is released.
 .Sp
@@ -13946,7 +13955,7 @@
 .IP "\fBintel\fR" 4
 .IX Item "intel"
 Produce code optimized for the most current Intel processors, which are
-Haswell and Silvermont for this version of \s-1GCC\s0.  If you know the \s-1CPU\s0
+Haswell and Silvermont for this version of \s-1GCC. \s0 If you know the \s-1CPU\s0
 on which your code will run, then you should use the corresponding
 \&\fB\-mtune\fR or \fB\-march\fR option instead of \fB\-mtune=intel\fR.
 But, if you want your application performs better on both Haswell and
@@ -13954,7 +13963,7 @@
 .Sp
 As new Intel processors are deployed in the marketplace, the behavior of
 this option will change.  Therefore, if you upgrade to a newer version of
-\&\s-1GCC\s0, code generation controlled by this option will change to reflect
+\&\s-1GCC,\s0 code generation controlled by this option will change to reflect
 the most current Intel processors at the time that version of \s-1GCC\s0 is
 released.
 .Sp
@@ -14037,7 +14046,7 @@
 .IX Item "-msoft-float"
 Generate output containing library calls for floating point.
 .Sp
-\&\fBWarning:\fR the requisite libraries are not part of \s-1GCC\s0.
+\&\fBWarning:\fR the requisite libraries are not part of \s-1GCC.\s0
 Normally the facilities of the machine's usual C compiler are used, but
 this can't be done directly in cross-compilation.  You must make your
 own arrangements to provide suitable library functions for
@@ -14052,8 +14061,8 @@
 .Sp
 The usual calling convention has functions return values of types
 \&\f(CW\*(C`float\*(C'\fR and \f(CW\*(C`double\*(C'\fR in an \s-1FPU\s0 register, even if there
-is no \s-1FPU\s0.  The idea is that the operating system should emulate
-an \s-1FPU\s0.
+is no \s-1FPU. \s0 The idea is that the operating system should emulate
+an \s-1FPU.\s0
 .Sp
 The option \fB\-mno\-fp\-ret\-in\-387\fR causes such values to be returned
 in ordinary \s-1CPU\s0 registers instead.
@@ -14098,7 +14107,7 @@
 .Sp
 Modern architectures (Pentium and newer) prefer \f(CW\*(C`long double\*(C'\fR
 to be aligned to an 8\- or 16\-byte boundary.  In arrays or structures
-conforming to the \s-1ABI\s0, this is not possible.  So specifying
+conforming to the \s-1ABI,\s0 this is not possible.  So specifying
 \&\fB\-m128bit\-long\-double\fR aligns \f(CW\*(C`long double\*(C'\fR
 to a 16\-byte boundary by padding the \f(CW\*(C`long double\*(C'\fR with an additional
 32\-bit zero.
@@ -14109,7 +14118,7 @@
 Notice that neither of these options enable any extra precision over the x87
 standard of 80 bits for a \f(CW\*(C`long double\*(C'\fR.
 .Sp
-\&\fBWarning:\fR if you override the default value for your target \s-1ABI\s0, this
+\&\fBWarning:\fR if you override the default value for your target \s-1ABI,\s0 this
 changes the size of 
 structures and arrays containing \f(CW\*(C`long double\*(C'\fR variables,
 as well as modifying the function calling convention for functions taking
@@ -14129,7 +14138,7 @@
 of 128 bits makes the \f(CW\*(C`long double\*(C'\fR type equivalent to the
 \&\f(CW\*(C`_\|_float128\*(C'\fR type. This is the default for 64\-bit Bionic C library.
 .Sp
-\&\fBWarning:\fR if you override the default value for your target \s-1ABI\s0, this
+\&\fBWarning:\fR if you override the default value for your target \s-1ABI,\s0 this
 changes the size of
 structures and arrays containing \f(CW\*(C`long double\*(C'\fR variables,
 as well as modifying the function calling convention for functions taking
@@ -14193,7 +14202,7 @@
 with Studio 12 Update@tie{}1) follow the \s-1ABI\s0 used by other x86 targets, which
 is the default on Solaris@tie{}10 and later.  \fIOnly\fR use this option if
 you need to remain compatible with existing code produced by those
-previous compiler versions or older versions of \s-1GCC\s0.
+previous compiler versions or older versions of \s-1GCC.\s0
 .IP "\fB\-mpc32\fR" 4
 .IX Item "-mpc32"
 .PD 0
@@ -14254,7 +14263,7 @@
 .Sp
 On Pentium and Pentium Pro, \f(CW\*(C`double\*(C'\fR and \f(CW\*(C`long double\*(C'\fR values
 should be aligned to an 8\-byte boundary (see \fB\-malign\-double\fR) or
-suffer significant run time performance penalties.  On Pentium \s-1III\s0, the
+suffer significant run time performance penalties.  On Pentium \s-1III,\s0 the
 Streaming \s-1SIMD\s0 Extension (\s-1SSE\s0) data type \f(CW\*(C`_\|_m128\*(C'\fR may not work
 properly if it is not 16\-byte aligned.
 .Sp
@@ -14412,10 +14421,10 @@
 .IP "\fB\-mno\-tbm\fR" 4
 .IX Item "-mno-tbm"
 .PD
-These switches enable or disable the use of instructions in the \s-1MMX\s0, \s-1SSE\s0,
-\&\s-1SSE2\s0, \s-1SSE3\s0, \s-1SSSE3\s0, \s-1SSE4\s0.1, \s-1AVX\s0, \s-1AVX2\s0, \s-1AVX512F\s0, \s-1AVX512PF\s0, \s-1AVX512ER\s0, \s-1AVX512CD\s0,
-\&\s-1SHA\s0, \s-1AES\s0, \s-1PCLMUL\s0, \s-1FSGSBASE\s0, \s-1RDRND\s0, F16C, \s-1FMA\s0, \s-1SSE4A\s0, \s-1FMA4\s0, \s-1XOP\s0, \s-1LWP\s0, \s-1ABM\s0,
-\&\s-1BMI\s0, \s-1BMI2\s0, \s-1FXSR\s0, \s-1XSAVE\s0, \s-1XSAVEOPT\s0, \s-1LZCNT\s0, \s-1RTM\s0, or 3DNow!
+These switches enable or disable the use of instructions in the \s-1MMX, SSE,
+SSE2, SSE3, SSSE3, SSE4.1, AVX, AVX2, AVX512F, AVX512PF, AVX512ER, AVX512CD,
+SHA, AES, PCLMUL, FSGSBASE, RDRND, F16C, FMA, SSE4A, FMA4, XOP, LWP, ABM,
+BMI, BMI2, FXSR, XSAVE, XSAVEOPT, LZCNT, RTM,\s0 or 3DNow!
 extended instruction sets.
 These extensions are also available as built-in functions: see
 \&\fBX86 Built-in Functions\fR, for details of the functions enabled and
@@ -14490,7 +14499,7 @@
 Early Intel Pentium 4 CPUs with Intel 64 support,
 prior to the introduction of Pentium 4 G1 step in December 2005,
 lacked the \f(CW\*(C`LAHF\*(C'\fR and \f(CW\*(C`SAHF\*(C'\fR instructions
-which were supported by \s-1AMD64\s0.
+which were supported by \s-1AMD64.\s0
 These are load and store instructions, respectively, for certain status flags.
 In 64\-bit mode, the \f(CW\*(C`SAHF\*(C'\fR instruction is used to optimize \f(CW\*(C`fmod\*(C'\fR,
 \&\f(CW\*(C`drem\*(C'\fR, and \f(CW\*(C`remainder\*(C'\fR built-in functions;
@@ -14566,7 +14575,7 @@
 for the Intel short
 vector math library and \fBacml\fR for the \s-1AMD\s0 math core library.
 To use this option, both \fB\-ftree\-vectorize\fR and
-\&\fB\-funsafe\-math\-optimizations\fR have to be enabled, and an \s-1SVML\s0 or \s-1ACML\s0 
+\&\fB\-funsafe\-math\-optimizations\fR have to be enabled, and an \s-1SVML\s0 or \s-1ACML \s0
 ABI-compatible library must be specified at link time.
 .Sp
 \&\s-1GCC\s0 currently emits calls to \f(CW\*(C`vmldExp2\*(C'\fR,
@@ -14589,7 +14598,7 @@
 .IX Item "-mabi=name"
 Generate code for the specified calling convention.  Permissible values
 are \fBsysv\fR for the \s-1ABI\s0 used on GNU/Linux and other systems, and
-\&\fBms\fR for the Microsoft \s-1ABI\s0.  The default is to use the Microsoft
+\&\fBms\fR for the Microsoft \s-1ABI. \s0 The default is to use the Microsoft
 \&\s-1ABI\s0 when targeting Microsoft Windows and the SysV \s-1ABI\s0 on all other systems.
 You can control this behavior for a specific function by
 using the function attribute \fBms_abi\fR/\fBsysv_abi\fR.
@@ -14704,7 +14713,7 @@
 is valid depends on the operating system, and whether it maps the
 segment to cover the entire \s-1TLS\s0 area.
 .Sp
-For systems that use the \s-1GNU\s0 C Library, the default is on.
+For systems that use the \s-1GNU C\s0 Library, the default is on.
 .IP "\fB\-msse2avx\fR" 4
 .IX Item "-msse2avx"
 .PD 0
@@ -14865,7 +14874,7 @@
 This option is available for MinGW targets. It specifies that
 the executable flag for the stack used by nested functions isn't
 set. This is necessary for binaries running in kernel mode of
-Microsoft Windows, as there the User32 \s-1API\s0, which is used to set executable
+Microsoft Windows, as there the User32 \s-1API,\s0 which is used to set executable
 privileges, isn't available.
 .IP "\fB\-fwritable\-relocated\-rdata\fR" 4
 .IX Item "-fwritable-relocated-rdata"
@@ -14912,7 +14921,7 @@
 .IP "\fB\-mno\-pic\fR" 4
 .IX Item "-mno-pic"
 Generate code that does not use a global pointer register.  The result
-is not position independent code, and violates the \s-1IA\-64\s0 \s-1ABI\s0.
+is not position independent code, and violates the \s-1IA\-64 ABI.\s0
 .IP "\fB\-mvolatile\-asm\-stop\fR" 4
 .IX Item "-mvolatile-asm-stop"
 .PD 0
@@ -14992,7 +15001,7 @@
 .IP "\fB\-mdwarf2\-asm\fR" 4
 .IX Item "-mdwarf2-asm"
 .PD
-Don't (or do) generate assembler code for the \s-1DWARF\s0 2 line number debugging
+Don't (or do) generate assembler code for the \s-1DWARF 2\s0 line number debugging
 info.  This may be useful when not using the \s-1GNU\s0 assembler.
 .IP "\fB\-mearly\-stop\-bits\fR" 4
 .IX Item "-mearly-stop-bits"
@@ -15016,7 +15025,7 @@
 64.
 .IP "\fB\-mtune=\fR\fIcpu-type\fR" 4
 .IX Item "-mtune=cpu-type"
-Tune the instruction scheduling for a particular \s-1CPU\s0, Valid values are
+Tune the instruction scheduling for a particular \s-1CPU,\s0 Valid values are
 \&\fBitanium\fR, \fBitanium1\fR, \fBmerced\fR, \fBitanium2\fR,
 and \fBmckinley\fR.
 .IP "\fB\-milp32\fR" 4
@@ -15465,7 +15474,7 @@
 does not have code to emulate those instructions.
 .IP "\fB\-mcpu32\fR" 4
 .IX Item "-mcpu32"
-Generate output for a \s-1CPU32\s0.  This is the default
+Generate output for a \s-1CPU32. \s0 This is the default
 when the compiler is configured for CPU32\-based systems.
 It is equivalent to \fB\-march=cpu32\fR.
 .Sp
@@ -15474,16 +15483,16 @@
 68336, 68340, 68341, 68349 and 68360.
 .IP "\fB\-m5200\fR" 4
 .IX Item "-m5200"
-Generate output for a 520X ColdFire \s-1CPU\s0.  This is the default
+Generate output for a 520X ColdFire \s-1CPU. \s0 This is the default
 when the compiler is configured for 520X\-based systems.
 It is equivalent to \fB\-mcpu=5206\fR, and is now deprecated
 in favor of that option.
 .Sp
 Use this option for microcontroller with a 5200 core, including
-the \s-1MCF5202\s0, \s-1MCF5203\s0, \s-1MCF5204\s0 and \s-1MCF5206\s0.
+the \s-1MCF5202, MCF5203, MCF5204\s0 and \s-1MCF5206.\s0
 .IP "\fB\-m5206e\fR" 4
 .IX Item "-m5206e"
-Generate output for a 5206e ColdFire \s-1CPU\s0.  The option is now
+Generate output for a 5206e ColdFire \s-1CPU. \s0 The option is now
 deprecated in favor of the equivalent \fB\-mcpu=5206e\fR.
 .IP "\fB\-m528x\fR" 4
 .IX Item "-m528x"
@@ -15492,15 +15501,15 @@
 \&\fB\-mcpu=528x\fR.
 .IP "\fB\-m5307\fR" 4
 .IX Item "-m5307"
-Generate output for a ColdFire 5307 \s-1CPU\s0.  The option is now deprecated
+Generate output for a ColdFire 5307 \s-1CPU. \s0 The option is now deprecated
 in favor of the equivalent \fB\-mcpu=5307\fR.
 .IP "\fB\-m5407\fR" 4
 .IX Item "-m5407"
-Generate output for a ColdFire 5407 \s-1CPU\s0.  The option is now deprecated
+Generate output for a ColdFire 5407 \s-1CPU. \s0 The option is now deprecated
 in favor of the equivalent \fB\-mcpu=5407\fR.
 .IP "\fB\-mcfv4e\fR" 4
 .IX Item "-mcfv4e"
-Generate output for a ColdFire V4e family \s-1CPU\s0 (e.g. 547x/548x).
+Generate output for a ColdFire V4e family \s-1CPU \s0(e.g. 547x/548x).
 This includes use of hardware floating-point instructions.
 The option is equivalent to \fB\-mcpu=547x\fR, and is now
 deprecated in favor of that option.
@@ -15527,14 +15536,14 @@
 .IX Item "-m68881"
 .PD
 Generate floating-point instructions.  This is the default for 68020
-and above, and for ColdFire devices that have an \s-1FPU\s0.  It defines the
+and above, and for ColdFire devices that have an \s-1FPU. \s0 It defines the
 macro \fB_\|_HAVE_68881_\|_\fR on M680x0 targets and \fB_\|_mcffpu_\|_\fR
 on ColdFire targets.
 .IP "\fB\-msoft\-float\fR" 4
 .IX Item "-msoft-float"
 Do not generate floating-point instructions; use library calls instead.
 This is the default for 68000, 68010, and 68832 targets.  It is also
-the default for ColdFire devices that have no \s-1FPU\s0.
+the default for ColdFire devices that have no \s-1FPU.\s0
 .IP "\fB\-mdiv\fR" 4
 .IX Item "-mdiv"
 .PD 0
@@ -15544,8 +15553,8 @@
 Generate (do not generate) ColdFire hardware divide and remainder
 instructions.  If \fB\-march\fR is used without \fB\-mcpu\fR,
 the default is \*(L"on\*(R" for ColdFire architectures and \*(L"off\*(R" for M680x0
-architectures.  Otherwise, the default is taken from the target \s-1CPU\s0
-(either the default \s-1CPU\s0, or the one specified by \fB\-mcpu\fR).  For
+architectures.  Otherwise, the default is taken from the target \s-1CPU
+\&\s0(either the default \s-1CPU,\s0 or the one specified by \fB\-mcpu\fR).  For
 example, the default is \*(L"off\*(R" for \fB\-mcpu=5206\fR and \*(L"on\*(R" for
 \&\fB\-mcpu=5206e\fR.
 .Sp
@@ -15664,7 +15673,7 @@
 larger and slower than code generated without this option.  On M680x0
 processors, this option is not needed; \fB\-fPIC\fR suffices.
 .Sp
-\&\s-1GCC\s0 normally uses a single instruction to load values from the \s-1GOT\s0.
+\&\s-1GCC\s0 normally uses a single instruction to load values from the \s-1GOT.\s0
 While this is relatively efficient, it only works if the \s-1GOT\s0
 is smaller than about 64k.  Anything larger causes the linker
 to report an error such as:
@@ -15806,7 +15815,7 @@
 Selects one of the built-in core configurations.  Each MeP chip has
 one or more modules in it; each module has a core \s-1CPU\s0 and a variety of
 coprocessors, optional instructions, and peripherals.  The
-\&\f(CW\*(C`MeP\-Integrator\*(C'\fR tool, not part of \s-1GCC\s0, provides these
+\&\f(CW\*(C`MeP\-Integrator\*(C'\fR tool, not part of \s-1GCC,\s0 provides these
 configurations through this option; using this option is the same as
 using all the corresponding command-line options.  The default
 configuration is \f(CW\*(C`default\*(C'\fR.
@@ -15909,7 +15918,7 @@
 This option is deprecated.  Use \fB\-fno\-zero\-initialized\-in\-bss\fR instead.
 .IP "\fB\-mcpu=\fR\fIcpu-type\fR" 4
 .IX Item "-mcpu=cpu-type"
-Use features of, and schedule code for, the given \s-1CPU\s0.
+Use features of, and schedule code for, the given \s-1CPU.\s0
 Supported values are in the format \fBv\fR\fIX\fR\fB.\fR\fI\s-1YY\s0\fR\fB.\fR\fIZ\fR,
 where \fIX\fR is a major version, \fI\s-1YY\s0\fR is the minor version, and
 \&\fIZ\fR is compatibility code.  Example values are \fBv3.00.a\fR,
@@ -15995,7 +16004,7 @@
 .IP "\fB\-march=\fR\fIarch\fR" 4
 .IX Item "-march=arch"
 Generate code that runs on \fIarch\fR, which can be the name of a
-generic \s-1MIPS\s0 \s-1ISA\s0, or the name of a particular processor.
+generic \s-1MIPS ISA,\s0 or the name of a particular processor.
 The \s-1ISA\s0 names are:
 \&\fBmips1\fR, \fBmips2\fR, \fBmips3\fR, \fBmips4\fR,
 \&\fBmips32\fR, \fBmips32r2\fR, \fBmips64\fR and \fBmips64r2\fR.
@@ -16024,7 +16033,7 @@
 \&\fBvr5000\fR, \fBvr5400\fR, \fBvr5500\fR,
 \&\fBxlr\fR and \fBxlp\fR.
 The special value \fBfrom-abi\fR selects the
-most compatible architecture for the selected \s-1ABI\s0 (that is,
+most compatible architecture for the selected \s-1ABI \s0(that is,
 \&\fBmips1\fR for 32\-bit ABIs and \fBmips3\fR for 64\-bit ABIs).
 .Sp
 The native Linux/GNU toolchain also supports the value \fBnative\fR,
@@ -16105,7 +16114,7 @@
 .IX Item "-mno-mips16"
 .PD
 Generate (do not generate) \s-1MIPS16\s0 code.  If \s-1GCC\s0 is targeting a
-\&\s-1MIPS32\s0 or \s-1MIPS64\s0 architecture, it makes use of the MIPS16e \s-1ASE\s0.
+\&\s-1MIPS32\s0 or \s-1MIPS64\s0 architecture, it makes use of the MIPS16e \s-1ASE.\s0
 .Sp
 \&\s-1MIPS16\s0 code generation can also be controlled on a per-function basis
 by means of \f(CW\*(C`mips16\*(C'\fR and \f(CW\*(C`nomips16\*(C'\fR attributes.
@@ -16120,7 +16129,7 @@
 .IP "\fB\-mno\-interlink\-compressed\fR" 4
 .IX Item "-mno-interlink-compressed"
 .PD
-Require (do not require) that code using the standard (uncompressed) \s-1MIPS\s0 \s-1ISA\s0
+Require (do not require) that code using the standard (uncompressed) \s-1MIPS ISA\s0
 be link-compatible with \s-1MIPS16\s0 and microMIPS code, and vice versa.
 .Sp
 For example, code using the standard \s-1ISA\s0 encoding cannot jump directly
@@ -16148,13 +16157,13 @@
 .IP "\fB\-mabi=eabi\fR" 4
 .IX Item "-mabi=eabi"
 .PD
-Generate code for the given \s-1ABI\s0.
+Generate code for the given \s-1ABI.\s0
 .Sp
 Note that the \s-1EABI\s0 has a 32\-bit and a 64\-bit variant.  \s-1GCC\s0 normally
 generates 64\-bit code when you select a 64\-bit architecture, but you
 can use \fB\-mgp32\fR to get 32\-bit code instead.
 .Sp
-For information about the O64 \s-1ABI\s0, see
+For information about the O64 \s-1ABI,\s0 see
 <\fBhttp://gcc.gnu.org/projects/mipso64\-abi.html\fR>.
 .Sp
 \&\s-1GCC\s0 supports a variant of the o32 \s-1ABI\s0 in which floating-point registers
@@ -16210,7 +16219,7 @@
 .PD
 Assume (do not assume) that the static and dynamic linkers
 support PLTs and copy relocations.  This option only affects
-\&\fB\-mno\-shared \-mabicalls\fR.  For the n64 \s-1ABI\s0, this option
+\&\fB\-mno\-shared \-mabicalls\fR.  For the n64 \s-1ABI,\s0 this option
 has no effect without \fB\-msym32\fR.
 .Sp
 You can make \fB\-mplt\fR the default by configuring
@@ -16225,7 +16234,7 @@
 Lift (do not lift) the usual restrictions on the size of the global
 offset table.
 .Sp
-\&\s-1GCC\s0 normally uses a single instruction to load values from the \s-1GOT\s0.
+\&\s-1GCC\s0 normally uses a single instruction to load values from the \s-1GOT.\s0
 While this is relatively efficient, it only works if the \s-1GOT\s0
 is smaller than about 64k.  Anything larger causes the linker
 to report an error such as:
@@ -16290,7 +16299,7 @@
 .IX Item "-mabs=legacy"
 .PD
 These options control the treatment of the special not-a-number (NaN)
-\&\s-1IEEE\s0 754 floating-point data with the \f(CW\*(C`abs.\f(CIfmt\f(CW\*(C'\fR and
+\&\s-1IEEE 754\s0 floating-point data with the \f(CW\*(C`abs.\f(CIfmt\f(CW\*(C'\fR and
 \&\f(CW\*(C`neg.\f(CIfmt\f(CW\*(C'\fR machine instructions.
 .Sp
 By default or when the \fB\-mabs=legacy\fR is used the legacy
@@ -16301,7 +16310,7 @@
 instead unless the \fB\-ffinite\-math\-only\fR option has also been
 specified.
 .Sp
-The \fB\-mabs=2008\fR option selects the \s-1IEEE\s0 754\-2008 treatment.  In
+The \fB\-mabs=2008\fR option selects the \s-1IEEE 754\-2008\s0 treatment.  In
 this case these instructions are considered non-arithmetic and therefore
 operating correctly in all cases, including in particular where the
 input operand is a NaN.  These instructions are therefore always used
@@ -16313,14 +16322,14 @@
 .IX Item "-mnan=legacy"
 .PD
 These options control the encoding of the special not-a-number (NaN)
-\&\s-1IEEE\s0 754 floating-point data.
+\&\s-1IEEE 754\s0 floating-point data.
 .Sp
 The \fB\-mnan=legacy\fR option selects the legacy encoding.  In this
 case quiet NaNs (qNaNs) are denoted by the first bit of their trailing
 significand field being 0, whereas signalling NaNs (sNaNs) are denoted
 by the first bit of their trailing significand field being 1.
 .Sp
-The \fB\-mnan=2008\fR option selects the \s-1IEEE\s0 754\-2008 encoding.  In
+The \fB\-mnan=2008\fR option selects the \s-1IEEE 754\-2008\s0 encoding.  In
 this case qNaNs are denoted by the first bit of their trailing
 significand field being 1, whereas sNaNs are denoted by the first bit of
 their trailing significand field being 0.
@@ -16350,8 +16359,8 @@
 .IP "\fB\-mno\-dsp\fR" 4
 .IX Item "-mno-dsp"
 .PD
-Use (do not use) revision 1 of the \s-1MIPS\s0 \s-1DSP\s0 \s-1ASE\s0.
-  This option defines the
+Use (do not use) revision 1 of the \s-1MIPS DSP ASE.
+ \s0 This option defines the
 preprocessor macro \fB_\|_mips_dsp\fR.  It also defines
 \&\fB_\|_mips_dsp_rev\fR to 1.
 .IP "\fB\-mdspr2\fR" 4
@@ -16360,8 +16369,8 @@
 .IP "\fB\-mno\-dspr2\fR" 4
 .IX Item "-mno-dspr2"
 .PD
-Use (do not use) revision 2 of the \s-1MIPS\s0 \s-1DSP\s0 \s-1ASE\s0.
-  This option defines the
+Use (do not use) revision 2 of the \s-1MIPS DSP ASE.
+ \s0 This option defines the
 preprocessor macros \fB_\|_mips_dsp\fR and \fB_\|_mips_dspr2\fR.
 It also defines \fB_\|_mips_dsp_rev\fR to 2.
 .IP "\fB\-msmartmips\fR" 4
@@ -16370,7 +16379,7 @@
 .IP "\fB\-mno\-smartmips\fR" 4
 .IX Item "-mno-smartmips"
 .PD
-Use (do not use) the \s-1MIPS\s0 SmartMIPS \s-1ASE\s0.
+Use (do not use) the \s-1MIPS\s0 SmartMIPS \s-1ASE.\s0
 .IP "\fB\-mpaired\-single\fR" 4
 .IX Item "-mpaired-single"
 .PD 0
@@ -16395,7 +16404,7 @@
 .IP "\fB\-mno\-mips3d\fR" 4
 .IX Item "-mno-mips3d"
 .PD
-Use (do not use) the \s-1MIPS\-3D\s0 \s-1ASE\s0.  
+Use (do not use) the \s-1MIPS\-3D ASE.  \s0
 The option \fB\-mips3d\fR implies \fB\-mpaired\-single\fR.
 .IP "\fB\-mmicromips\fR" 4
 .IX Item "-mmicromips"
@@ -16420,7 +16429,7 @@
 .IP "\fB\-mno\-mcu\fR" 4
 .IX Item "-mno-mcu"
 .PD
-Use (do not use) the \s-1MIPS\s0 \s-1MCU\s0 \s-1ASE\s0 instructions.
+Use (do not use) the \s-1MIPS MCU ASE\s0 instructions.
 .IP "\fB\-meva\fR" 4
 .IX Item "-meva"
 .PD 0
@@ -16445,7 +16454,7 @@
 Force \f(CW\*(C`long\*(C'\fR, \f(CW\*(C`int\*(C'\fR, and pointer types to be 32 bits wide.
 .Sp
 The default size of \f(CW\*(C`int\*(C'\fRs, \f(CW\*(C`long\*(C'\fRs and pointers depends on
-the \s-1ABI\s0.  All the supported ABIs use 32\-bit \f(CW\*(C`int\*(C'\fRs.  The n64 \s-1ABI\s0
+the \s-1ABI. \s0 All the supported ABIs use 32\-bit \f(CW\*(C`int\*(C'\fRs.  The n64 \s-1ABI\s0
 uses 64\-bit \f(CW\*(C`long\*(C'\fRs, as does the 64\-bit \s-1EABI\s0; the others use
 32\-bit \f(CW\*(C`long\*(C'\fRs.  Pointers are the same size as \f(CW\*(C`long\*(C'\fRs,
 or the same size as integer registers, whichever is smaller.
@@ -16456,7 +16465,7 @@
 .IX Item "-mno-sym32"
 .PD
 Assume (do not assume) that all symbols have 32\-bit values, regardless
-of the selected \s-1ABI\s0.  This option is useful in combination with
+of the selected \s-1ABI. \s0 This option is useful in combination with
 \&\fB\-mabi=64\fR and \fB\-mno\-abicalls\fR because it allows \s-1GCC\s0
 to generate shorter and faster references to symbolic addresses.
 .IP "\fB\-G\fR \fInum\fR" 4
@@ -16561,13 +16570,13 @@
 and 4KSd processors when the code TLBs have the Read Inhibit bit set.
 It is also useful on processors that can be configured to have a dual
 instruction/data \s-1SRAM\s0 interface and that, like the M4K, automatically
-redirect PC-relative loads to the instruction \s-1RAM\s0.
+redirect PC-relative loads to the instruction \s-1RAM.\s0
 .IP "\fB\-mcode\-readable=no\fR" 4
 .IX Item "-mcode-readable=no"
 Instructions must not access executable sections.  This option can be
 useful on targets that are configured to have a dual instruction/data
 \&\s-1SRAM\s0 interface but that (unlike the M4K) do not automatically redirect
-PC-relative loads to the instruction \s-1RAM\s0.
+PC-relative loads to the instruction \s-1RAM.\s0
 .RE
 .RS 4
 .RE
@@ -16609,7 +16618,7 @@
 .PD
 \&\s-1MIPS\s0 systems check for division by zero by generating either a
 conditional trap or a break instruction.  Using traps results in
-smaller code, but is only supported on \s-1MIPS\s0 \s-1II\s0 and later.  Also, some
+smaller code, but is only supported on \s-1MIPS II\s0 and later.  Also, some
 versions of the Linux kernel have a bug that prevents trap from
 generating the proper signal (\f(CW\*(C`SIGFPE\*(C'\fR).  Use \fB\-mdivide\-traps\fR to
 allow conditional traps on architectures that support them and
@@ -16647,7 +16656,7 @@
 .IX Item "-mno-mad"
 .PD
 Enable (disable) use of the \f(CW\*(C`mad\*(C'\fR, \f(CW\*(C`madu\*(C'\fR and \f(CW\*(C`mul\*(C'\fR
-instructions, as provided by the R4650 \s-1ISA\s0.
+instructions, as provided by the R4650 \s-1ISA.\s0
 .IP "\fB\-mimadd\fR" 4
 .IX Item "-mimadd"
 .PD 0
@@ -16685,7 +16694,7 @@
 .IX Item "-mno-fix-24k"
 .PD
 Work around the 24K E48 (lost data on stores during refill) errata.
-The workarounds are implemented by the assembler rather than by \s-1GCC\s0.
+The workarounds are implemented by the assembler rather than by \s-1GCC.\s0
 .IP "\fB\-mfix\-r4000\fR" 4
 .IX Item "-mfix-r4000"
 .PD 0
@@ -16745,8 +16754,8 @@
 .IP "\fB\-mno\-fix\-rm7000\fR" 4
 .IX Item "-mno-fix-rm7000"
 .PD
-Work around the \s-1RM7000\s0 \f(CW\*(C`dmult\*(C'\fR/\f(CW\*(C`dmultu\*(C'\fR errata.  The
-workarounds are implemented by the assembler rather than by \s-1GCC\s0.
+Work around the \s-1RM7000 \s0\f(CW\*(C`dmult\*(C'\fR/\f(CW\*(C`dmultu\*(C'\fR errata.  The
+workarounds are implemented by the assembler rather than by \s-1GCC.\s0
 .IP "\fB\-mfix\-vr4120\fR" 4
 .IX Item "-mfix-vr4120"
 .PD 0
@@ -16772,10 +16781,10 @@
 .RE
 .IP "\fB\-mfix\-vr4130\fR" 4
 .IX Item "-mfix-vr4130"
-Work around the \s-1VR4130\s0 \f(CW\*(C`mflo\*(C'\fR/\f(CW\*(C`mfhi\*(C'\fR errata.  The
-workarounds are implemented by the assembler rather than by \s-1GCC\s0,
+Work around the \s-1VR4130 \s0\f(CW\*(C`mflo\*(C'\fR/\f(CW\*(C`mfhi\*(C'\fR errata.  The
+workarounds are implemented by the assembler rather than by \s-1GCC,\s0
 although \s-1GCC\s0 avoids using \f(CW\*(C`mflo\*(C'\fR and \f(CW\*(C`mfhi\*(C'\fR if the
-\&\s-1VR4130\s0 \f(CW\*(C`macc\*(C'\fR, \f(CW\*(C`macchi\*(C'\fR, \f(CW\*(C`dmacc\*(C'\fR and \f(CW\*(C`dmacchi\*(C'\fR
+\&\s-1VR4130 \s0\f(CW\*(C`macc\*(C'\fR, \f(CW\*(C`macchi\*(C'\fR, \f(CW\*(C`dmacc\*(C'\fR and \f(CW\*(C`dmacchi\*(C'\fR
 instructions are available instead.
 .IP "\fB\-mfix\-sb1\fR" 4
 .IX Item "-mfix-sb1"
@@ -16783,7 +16792,7 @@
 .IP "\fB\-mno\-fix\-sb1\fR" 4
 .IX Item "-mno-fix-sb1"
 .PD
-Work around certain \s-1SB\-1\s0 \s-1CPU\s0 core errata.
+Work around certain \s-1SB\-1 CPU\s0 core errata.
 (This flag currently works around the \s-1SB\-1\s0 revision 2
 \&\*(L"F1\*(R" and \*(L"F2\*(R" floating-point errata.)
 .IP "\fB\-mr10k\-cache\-barrier=\fR\fIsetting\fR" 4
@@ -16894,7 +16903,7 @@
 The default is that \s-1FP\s0 exceptions are
 enabled.
 .Sp
-For instance, on the \s-1SB\-1\s0, if \s-1FP\s0 exceptions are disabled, and we are emitting
+For instance, on the \s-1SB\-1,\s0 if \s-1FP\s0 exceptions are disabled, and we are emitting
 64\-bit code, then we can use both \s-1FP\s0 pipes.  Otherwise, we can only use one
 \&\s-1FP\s0 pipe.
 .IP "\fB\-mvr4130\-align\fR" 4
@@ -16908,7 +16917,7 @@
 option is enabled, \s-1GCC\s0 aligns pairs of instructions that it
 thinks should execute in parallel.
 .Sp
-This option only has an effect when optimizing for the \s-1VR4130\s0.
+This option only has an effect when optimizing for the \s-1VR4130.\s0
 It normally makes code faster, but at the expense of making it bigger.
 It is enabled by default at optimization level \fB\-O3\fR.
 .IP "\fB\-msynci\fR" 4
@@ -16997,7 +17006,7 @@
 .PD
 Generate code that passes function parameters and return values that (in
 the called function) are seen as registers \f(CW$0\fR and up, as opposed to
-the \s-1GNU\s0 \s-1ABI\s0 which uses global registers \f(CW$231\fR and up.
+the \s-1GNU ABI\s0 which uses global registers \f(CW$231\fR and up.
 .IP "\fB\-mzero\-extend\fR" 4
 .IX Item "-mzero-extend"
 .PD 0
@@ -17081,7 +17090,7 @@
 is the default.
 .IP "\fB\-mam33\-2\fR" 4
 .IX Item "-mam33-2"
-Generate code using features specific to the \s-1AM33/2\s0.0 processor.
+Generate code using features specific to the \s-1AM33/2.0\s0 processor.
 .IP "\fB\-mam34\fR" 4
 .IX Item "-mam34"
 Generate code using features specific to the \s-1AM34\s0 processor.
@@ -17162,8 +17171,8 @@
 The option also sets the \s-1ISA\s0 to use.  If the \s-1MCU\s0 name is one that is
 known to only support the 430 \s-1ISA\s0 then that is selected, otherwise the
 430X \s-1ISA\s0 is selected.  A generic \s-1MCU\s0 name of \f(CW\*(C`msp430\*(C'\fR can also be
-used to select the 430 \s-1ISA\s0.  Similarly the generic \f(CW\*(C`msp430x\*(C'\fR \s-1MCU\s0
-name will select the 430X \s-1ISA\s0.
+used to select the 430 \s-1ISA. \s0 Similarly the generic \f(CW\*(C`msp430x\*(C'\fR \s-1MCU\s0
+name will select the 430X \s-1ISA.\s0
 .Sp
 In addition an \s-1MCU\s0 specific linker script will be added to the linker
 command line.  The script's name is the name of the \s-1MCU\s0 with
@@ -17176,7 +17185,7 @@
 .IX Item "-mcpu="
 Specifies the \s-1ISA\s0 to use.  Accepted values are \f(CW\*(C`msp430\*(C'\fR,
 \&\f(CW\*(C`msp430x\*(C'\fR and \f(CW\*(C`msp430xv2\*(C'\fR.  This option is deprecated.  The
-\&\fB\-mmcu=\fR option should be used to select the \s-1ISA\s0.
+\&\fB\-mmcu=\fR option should be used to select the \s-1ISA.\s0
 .IP "\fB\-msim\fR" 4
 .IX Item "-msim"
 Link to the simulator runtime libraries and linker script.  Overrides
@@ -17307,7 +17316,7 @@
 Generate (do not generate) GP-relative accesses for objects in the
 small data or \s-1BSS\s0 sections.  The default is \fB\-mgpopt\fR except
 when \fB\-fpic\fR or \fB\-fPIC\fR is specified to generate
-position-independent code.  Note that the Nios \s-1II\s0 \s-1ABI\s0 does not permit
+position-independent code.  Note that the Nios \s-1II ABI\s0 does not permit
 GP-relative accesses from shared libraries.
 .Sp
 You may need to specify \fB\-mno\-gpopt\fR explicitly when building
@@ -17379,7 +17388,7 @@
 .Sp
 The following values of \fIinsn\fR are supported.  Except as otherwise
 noted, floating-point operations are expected to be implemented with
-normal \s-1IEEE\s0 754 semantics and correspond directly to the C operators or the
+normal \s-1IEEE 754\s0 semantics and correspond directly to the C operators or the
 equivalent \s-1GCC\s0 built-in functions.
 .Sp
 Single-precision floating point:
@@ -17532,14 +17541,14 @@
 function attribute
 or pragma.
 .PP
-These additional \fB\-m\fR options are available for the Altera Nios \s-1II\s0
-\&\s-1ELF\s0 (bare-metal) target:
+These additional \fB\-m\fR options are available for the Altera Nios \s-1II
+ELF \s0(bare-metal) target:
 .IP "\fB\-mhal\fR" 4
 .IX Item "-mhal"
-Link with \s-1HAL\s0 \s-1BSP\s0.  This suppresses linking with the GCC-provided C runtime
+Link with \s-1HAL BSP. \s0 This suppresses linking with the GCC-provided C runtime
 startup and termination code, and is typically used in conjunction with
 \&\fB\-msys\-crt0=\fR to specify the location of the alternate startup code
-provided by the \s-1HAL\s0 \s-1BSP\s0.
+provided by the \s-1HAL BSP.\s0
 .IP "\fB\-msmallc\fR" 4
 .IX Item "-msmallc"
 Link with a limited version of the C library, \fB\-lsmallc\fR, rather than
@@ -17553,7 +17562,7 @@
 \&\fIsystemlib\fR is the library name of the library that provides
 low-level system calls required by the C library,
 e.g. \f(CW\*(C`read\*(C'\fR and \f(CW\*(C`write\*(C'\fR.
-This option is typically used to link with a library provided by a \s-1HAL\s0 \s-1BSP\s0.
+This option is typically used to link with a library provided by a \s-1HAL BSP.\s0
 .PP
 \fI\s-1PDP\-11\s0 Options\fR
 .IX Subsection "PDP-11 Options"
@@ -17574,13 +17583,13 @@
 Return floating-point results in memory.  This is the default.
 .IP "\fB\-m40\fR" 4
 .IX Item "-m40"
-Generate code for a \s-1PDP\-11/40\s0.
+Generate code for a \s-1PDP\-11/40.\s0
 .IP "\fB\-m45\fR" 4
 .IX Item "-m45"
-Generate code for a \s-1PDP\-11/45\s0.  This is the default.
+Generate code for a \s-1PDP\-11/45. \s0 This is the default.
 .IP "\fB\-m10\fR" 4
 .IX Item "-m10"
-Generate code for a \s-1PDP\-11/10\s0.
+Generate code for a \s-1PDP\-11/10.\s0
 .IP "\fB\-mbcopy\-builtin\fR" 4
 .IX Item "-mbcopy-builtin"
 Use inline \f(CW\*(C`movmemhi\*(C'\fR patterns for copying memory.  This is the
@@ -17652,14 +17661,14 @@
 generated with this option runs on any of the other \s-1AE\s0 types.  The
 code is not as efficient as it would be if compiled for a specific
 \&\s-1AE\s0 type, and some types of operation (e.g., multiplication) do not
-work properly on all types of \s-1AE\s0.
+work properly on all types of \s-1AE.\s0
 .Sp
-\&\fB\-mae=MUL\fR selects a \s-1MUL\s0 \s-1AE\s0 type.  This is the most useful \s-1AE\s0 type
+\&\fB\-mae=MUL\fR selects a \s-1MUL AE\s0 type.  This is the most useful \s-1AE\s0 type
 for compiled code, and is the default.
 .Sp
-\&\fB\-mae=MAC\fR selects a DSP-style \s-1MAC\s0 \s-1AE\s0.  Code compiled with this
+\&\fB\-mae=MAC\fR selects a DSP-style \s-1MAC AE. \s0 Code compiled with this
 option may suffer from poor performance of byte (char) manipulation,
-since the \s-1DSP\s0 \s-1AE\s0 does not provide hardware support for byte load/stores.
+since the \s-1DSP AE\s0 does not provide hardware support for byte load/stores.
 .IP "\fB\-msymbol\-as\-address\fR" 4
 .IX Item "-msymbol-as-address"
 Enable the compiler to directly use a symbol name as an address in a
@@ -17672,7 +17681,7 @@
 .IX Item "-mno-inefficient-warnings"
 Disables warnings about the generation of inefficient code.  These
 warnings can be generated, for example, when compiling code that
-performs byte-level memory operations on the \s-1MAC\s0 \s-1AE\s0 type.  The \s-1MAC\s0 \s-1AE\s0 has
+performs byte-level memory operations on the \s-1MAC AE\s0 type.  The \s-1MAC AE\s0 has
 no hardware support for byte-level memory operations, so all byte
 load/stores must be synthesized from word load/store operations.  This is
 inefficient and a warning is generated to indicate
@@ -17705,10 +17714,10 @@
 only on the \s-1RL78/G13\s0 targets.  The \f(CW\*(C`rl78\*(C'\fR option is for the
 standard hardware multiplication defined in the \s-1RL78\s0 software manual.
 .PP
-\fI\s-1IBM\s0 \s-1RS/6000\s0 and PowerPC Options\fR
+\fI\s-1IBM RS/6000\s0 and PowerPC Options\fR
 .IX Subsection "IBM RS/6000 and PowerPC Options"
 .PP
-These \fB\-m\fR options are defined for the \s-1IBM\s0 \s-1RS/6000\s0 and PowerPC:
+These \fB\-m\fR options are defined for the \s-1IBM RS/6000\s0 and PowerPC:
 .IP "\fB\-mpowerpc\-gpopt\fR" 4
 .IX Item "-mpowerpc-gpopt"
 .PD 0
@@ -17753,7 +17762,7 @@
 .PD
 You use these options to specify which instructions are available on the
 processor you are using.  The default value of these options is
-determined when configuring \s-1GCC\s0.  Specifying the
+determined when configuring \s-1GCC. \s0 Specifying the
 \&\fB\-mcpu=\fR\fIcpu_type\fR overrides the specification of these
 options.  We recommend you use the \fB\-mcpu=\fR\fIcpu_type\fR option
 rather than the options listed above.
@@ -17835,7 +17844,7 @@
 value, you may specify it after the \fB\-mcpu\fR option, like
 \&\fB\-mcpu=970 \-mno\-altivec\fR.
 .Sp
-On \s-1AIX\s0, the \fB\-maltivec\fR and \fB\-mpowerpc64\fR options are
+On \s-1AIX,\s0 the \fB\-maltivec\fR and \fB\-mpowerpc64\fR options are
 not enabled or disabled by the \fB\-mcpu\fR option at present because
 \&\s-1AIX\s0 does not have full support for these options.  You may still
 enable or disable them individually if you're sure it'll work in your
@@ -17923,14 +17932,14 @@
 to build executables and shared
 libraries with non-executable \f(CW\*(C`.plt\*(C'\fR and \f(CW\*(C`.got\*(C'\fR sections.
 This is a PowerPC
-32\-bit \s-1SYSV\s0 \s-1ABI\s0 option.
+32\-bit \s-1SYSV ABI\s0 option.
 .IP "\fB\-mbss\-plt\fR" 4
 .IX Item "-mbss-plt"
-Generate code that uses a \s-1BSS\s0 \f(CW\*(C`.plt\*(C'\fR section that \fBld.so\fR
+Generate code that uses a \s-1BSS \s0\f(CW\*(C`.plt\*(C'\fR section that \fBld.so\fR
 fills in, and
 requires \f(CW\*(C`.plt\*(C'\fR and \f(CW\*(C`.got\*(C'\fR
 sections that are both writable and executable.
-This is a PowerPC 32\-bit \s-1SYSV\s0 \s-1ABI\s0 option.
+This is a PowerPC 32\-bit \s-1SYSV ABI\s0 option.
 .IP "\fB\-misel\fR" 4
 .IX Item "-misel"
 .PD 0
@@ -17979,7 +17988,7 @@
 .PD
 Enable the use (disable) of the built-in functions that allow direct
 access to the cryptographic instructions that were added in version
-2.07 of the PowerPC \s-1ISA\s0.
+2.07 of the PowerPC \s-1ISA.\s0
 .IP "\fB\-mdirect\-move\fR" 4
 .IX Item "-mdirect-move"
 .PD 0
@@ -17988,7 +17997,7 @@
 .PD
 Generate code that uses (does not use) the instructions to move data
 between the general purpose registers and the vector/scalar (\s-1VSX\s0)
-registers that were added in version 2.07 of the PowerPC \s-1ISA\s0.
+registers that were added in version 2.07 of the PowerPC \s-1ISA.\s0
 .IP "\fB\-mpower8\-fusion\fR" 4
 .IX Item "-mpower8-fusion"
 .PD 0
@@ -18005,7 +18014,7 @@
 .IX Item "-mno-power8-vector"
 .PD
 Generate code that uses (does not use) the vector and scalar
-instructions that were added in version 2.07 of the PowerPC \s-1ISA\s0.  Also
+instructions that were added in version 2.07 of the PowerPC \s-1ISA. \s0 Also
 enable the use of built-in functions that allow more direct access to
 the vector instructions.
 .IP "\fB\-mquad\-memory\fR" 4
@@ -18068,12 +18077,12 @@
 .IP "\fB\-mminimal\-toc\fR" 4
 .IX Item "-mminimal-toc"
 .PD
-Modify generation of the \s-1TOC\s0 (Table Of Contents), which is created for
+Modify generation of the \s-1TOC \s0(Table Of Contents), which is created for
 every executable file.  The \fB\-mfull\-toc\fR option is selected by
 default.  In that case, \s-1GCC\s0 allocates at least one \s-1TOC\s0 entry for
 each unique non-automatic variable reference in your program.  \s-1GCC\s0
-also places floating-point constants in the \s-1TOC\s0.  However, only
-16,384 entries are available in the \s-1TOC\s0.
+also places floating-point constants in the \s-1TOC. \s0 However, only
+16,384 entries are available in the \s-1TOC.\s0
 .Sp
 If you receive a linker error message that saying you have overflowed
 the available \s-1TOC\s0 space, you can reduce the amount of \s-1TOC\s0 space used
@@ -18081,7 +18090,7 @@
 \&\fB\-mno\-fp\-in\-toc\fR prevents \s-1GCC\s0 from putting floating-point
 constants in the \s-1TOC\s0 and \fB\-mno\-sum\-in\-toc\fR forces \s-1GCC\s0 to
 generate code to calculate the sum of an address and a constant at
-run time instead of putting that sum into the \s-1TOC\s0.  You may specify one
+run time instead of putting that sum into the \s-1TOC. \s0 You may specify one
 or both of these options.  Each causes \s-1GCC\s0 to produce very slightly
 slower and larger code at the expense of conserving \s-1TOC\s0 space.
 .Sp
@@ -18097,7 +18106,7 @@
 .IP "\fB\-maix32\fR" 4
 .IX Item "-maix32"
 .PD
-Enable 64\-bit \s-1AIX\s0 \s-1ABI\s0 and calling convention: 64\-bit pointers, 64\-bit
+Enable 64\-bit \s-1AIX ABI\s0 and calling convention: 64\-bit pointers, 64\-bit
 \&\f(CW\*(C`long\*(C'\fR type, and the infrastructure needed to support them.
 Specifying \fB\-maix64\fR implies \fB\-mpowerpc64\fR,
 while \fB\-maix32\fR disables the 64\-bit \s-1ABI\s0 and
@@ -18108,8 +18117,8 @@
 .IP "\fB\-mno\-xl\-compat\fR" 4
 .IX Item "-mno-xl-compat"
 .PD
-Produce code that conforms more closely to \s-1IBM\s0 \s-1XL\s0 compiler semantics
-when using AIX-compatible \s-1ABI\s0.  Pass floating-point arguments to
+Produce code that conforms more closely to \s-1IBM XL\s0 compiler semantics
+when using AIX-compatible \s-1ABI. \s0 Pass floating-point arguments to
 prototyped functions beyond the register save area (\s-1RSA\s0) on the stack
 in addition to argument FPRs.  Do not assume that most significant
 double in 128\-bit long double value is properly rounded when comparing
@@ -18118,16 +18127,16 @@
 .Sp
 The \s-1AIX\s0 calling convention was extended but not initially documented to
 handle an obscure K&R C case of calling a function that takes the
-address of its arguments with fewer arguments than declared.  \s-1IBM\s0 \s-1XL\s0
+address of its arguments with fewer arguments than declared.  \s-1IBM XL\s0
 compilers access floating-point arguments that do not fit in the
 \&\s-1RSA\s0 from the stack when a subroutine is compiled without
 optimization.  Because always storing floating-point arguments on the
 stack is inefficient and rarely needed, this option is not enabled by
-default and only is necessary when calling subroutines compiled by \s-1IBM\s0
-\&\s-1XL\s0 compilers without optimization.
+default and only is necessary when calling subroutines compiled by \s-1IBM
+XL\s0 compilers without optimization.
 .IP "\fB\-mpe\fR" 4
 .IX Item "-mpe"
-Support \fI\s-1IBM\s0 \s-1RS/6000\s0 \s-1SP\s0\fR \fIParallel Environment\fR (\s-1PE\s0).  Link an
+Support \fI\s-1IBM RS/6000 SP\s0\fR \fIParallel Environment\fR (\s-1PE\s0).  Link an
 application written to use message passing with special startup code to
 enable the application to run.  The system must have \s-1PE\s0 installed in the
 standard location (\fI/usr/lpp/ppe.poe/\fR), or the \fIspecs\fR file
@@ -18141,11 +18150,11 @@
 .IP "\fB\-malign\-power\fR" 4
 .IX Item "-malign-power"
 .PD
-On \s-1AIX\s0, 32\-bit Darwin, and 64\-bit PowerPC GNU/Linux, the option
+On \s-1AIX,\s0 32\-bit Darwin, and 64\-bit PowerPC GNU/Linux, the option
 \&\fB\-malign\-natural\fR overrides the ABI-defined alignment of larger
 types, such as floating-point doubles, on their natural size-based boundary.
 The option \fB\-malign\-power\fR instructs \s-1GCC\s0 to follow the ABI-specified
-alignment rules.  \s-1GCC\s0 defaults to the standard alignment defined in the \s-1ABI\s0.
+alignment rules.  \s-1GCC\s0 defaults to the standard alignment defined in the \s-1ABI.\s0
 .Sp
 On 64\-bit Darwin, natural alignment is the default, and \fB\-malign\-power\fR
 is not supported.
@@ -18179,7 +18188,7 @@
 and \fBdp_full\fR (equivalent to \fB\-mdouble\-float\fR).
 .IP "\fB\-mxilinx\-fpu\fR" 4
 .IX Item "-mxilinx-fpu"
-Perform optimizations for the floating-point unit on Xilinx \s-1PPC\s0 405/440.
+Perform optimizations for the floating-point unit on Xilinx \s-1PPC 405/440.\s0
 .IP "\fB\-mmultiple\fR" 4
 .IX Item "-mmultiple"
 .PD 0
@@ -18250,7 +18259,7 @@
 .IX Item "-mno-mulhw"
 .PD
 Generate code that uses (does not use) the half-word multiply and
-multiply-accumulate instructions on the \s-1IBM\s0 405, 440, 464 and 476 processors.
+multiply-accumulate instructions on the \s-1IBM 405, 440, 464\s0 and 476 processors.
 These instructions are generated by default when targeting those
 processors.
 .IP "\fB\-mdlmzb\fR" 4
@@ -18260,7 +18269,7 @@
 .IX Item "-mno-dlmzb"
 .PD
 Generate code that uses (does not use) the string-search \fBdlmzb\fR
-instruction on the \s-1IBM\s0 405, 440, 464 and 476 processors.  This instruction is
+instruction on the \s-1IBM 405, 440, 464\s0 and 476 processors.  This instruction is
 generated by default when targeting those processors.
 .IP "\fB\-mno\-bit\-align\fR" 4
 .IX Item "-mno-bit-align"
@@ -18340,7 +18349,7 @@
 the same as \fB\-mbig\fR.
 .IP "\fB\-mdynamic\-no\-pic\fR" 4
 .IX Item "-mdynamic-no-pic"
-On Darwin and Mac \s-1OS\s0 X systems, compile code so that it is not
+On Darwin and Mac \s-1OS X\s0 systems, compile code so that it is not
 relocatable, but that its external references are relocatable.  The
 resulting code is suitable for applications, but not shared
 libraries.
@@ -18446,11 +18455,11 @@
 OpenBSD operating system.
 .IP "\fB\-maix\-struct\-return\fR" 4
 .IX Item "-maix-struct-return"
-Return all structures in memory (as specified by the \s-1AIX\s0 \s-1ABI\s0).
+Return all structures in memory (as specified by the \s-1AIX ABI\s0).
 .IP "\fB\-msvr4\-struct\-return\fR" 4
 .IX Item "-msvr4-struct-return"
 Return structures smaller than 8 bytes in registers (as specified by the
-\&\s-1SVR4\s0 \s-1ABI\s0).
+\&\s-1SVR4 ABI\s0).
 .IP "\fB\-mabi=\fR\fIabi-type\fR" 4
 .IX Item "-mabi=abi-type"
 Extend the current \s-1ABI\s0 with a particular extension, or remove such extension.
@@ -18459,29 +18468,29 @@
 \&\fIelfv1\fR, \fIelfv2\fR.
 .IP "\fB\-mabi=spe\fR" 4
 .IX Item "-mabi=spe"
-Extend the current \s-1ABI\s0 with \s-1SPE\s0 \s-1ABI\s0 extensions.  This does not change
-the default \s-1ABI\s0, instead it adds the \s-1SPE\s0 \s-1ABI\s0 extensions to the current
-\&\s-1ABI\s0.
+Extend the current \s-1ABI\s0 with \s-1SPE ABI\s0 extensions.  This does not change
+the default \s-1ABI,\s0 instead it adds the \s-1SPE ABI\s0 extensions to the current
+\&\s-1ABI.\s0
 .IP "\fB\-mabi=no\-spe\fR" 4
 .IX Item "-mabi=no-spe"
-Disable Book-E \s-1SPE\s0 \s-1ABI\s0 extensions for the current \s-1ABI\s0.
+Disable Book-E \s-1SPE ABI\s0 extensions for the current \s-1ABI.\s0
 .IP "\fB\-mabi=ibmlongdouble\fR" 4
 .IX Item "-mabi=ibmlongdouble"
 Change the current \s-1ABI\s0 to use \s-1IBM\s0 extended-precision long double.
-This is a PowerPC 32\-bit \s-1SYSV\s0 \s-1ABI\s0 option.
+This is a PowerPC 32\-bit \s-1SYSV ABI\s0 option.
 .IP "\fB\-mabi=ieeelongdouble\fR" 4
 .IX Item "-mabi=ieeelongdouble"
 Change the current \s-1ABI\s0 to use \s-1IEEE\s0 extended-precision long double.
 This is a PowerPC 32\-bit Linux \s-1ABI\s0 option.
 .IP "\fB\-mabi=elfv1\fR" 4
 .IX Item "-mabi=elfv1"
-Change the current \s-1ABI\s0 to use the ELFv1 \s-1ABI\s0.
+Change the current \s-1ABI\s0 to use the ELFv1 \s-1ABI.\s0
 This is the default \s-1ABI\s0 for big-endian PowerPC 64\-bit Linux.
 Overriding the default \s-1ABI\s0 requires special system support and is
 likely to fail in spectacular ways.
 .IP "\fB\-mabi=elfv2\fR" 4
 .IX Item "-mabi=elfv2"
-Change the current \s-1ABI\s0 to use the ELFv2 \s-1ABI\s0.
+Change the current \s-1ABI\s0 to use the ELFv2 \s-1ABI.\s0
 This is the default \s-1ABI\s0 for little-endian PowerPC 64\-bit Linux.
 Overriding the default \s-1ABI\s0 requires special system support and is
 likely to fail in spectacular ways.
@@ -18635,7 +18644,7 @@
 callee, L42\*(C'\fR, plus a \fIbranch island\fR (glue code).  The two target
 addresses represent the callee and the branch island.  The
 Darwin/PPC linker prefers the first address and generates a \f(CW\*(C`bl
-callee\*(C'\fR if the \s-1PPC\s0 \f(CW\*(C`bl\*(C'\fR instruction reaches the callee directly;
+callee\*(C'\fR if the \s-1PPC \s0\f(CW\*(C`bl\*(C'\fR instruction reaches the callee directly;
 otherwise, the linker generates \f(CW\*(C`bl L42\*(C'\fR to call the branch
 island.  The branch island is appended to the body of the
 calling function; it computes the full 32\-bit address of the callee
@@ -18707,7 +18716,7 @@
 .PD
 Assume (do not assume) that the reciprocal estimate instructions
 provide higher-precision estimates than is mandated by the PowerPC
-\&\s-1ABI\s0.  Selecting \fB\-mcpu=power6\fR, \fB\-mcpu=power7\fR or
+\&\s-1ABI. \s0 Selecting \fB\-mcpu=power6\fR, \fB\-mcpu=power7\fR or
 \&\fB\-mcpu=power8\fR automatically selects \fB\-mrecip\-precision\fR.
 The double-precision square root estimate instructions are not generated by
 default on low-precision machines, since they do not provide an
@@ -18780,14 +18789,14 @@
 .PD
 Generate (do not generate) code to pass structure parameters with a
 maximum alignment of 64 bits, for compatibility with older versions
-of \s-1GCC\s0.
+of \s-1GCC.\s0
 .Sp
-Older versions of \s-1GCC\s0 (prior to 4.9.0) incorrectly did not align a
+Older versions of \s-1GCC \s0(prior to 4.9.0) incorrectly did not align a
 structure parameter on a 128\-bit boundary when that structure contained
 a member requiring 128\-bit alignment.  This is corrected in more
-recent versions of \s-1GCC\s0.  This option may be used to generate code
+recent versions of \s-1GCC. \s0 This option may be used to generate code
 that is compatible with functions compiled with older versions of
-\&\s-1GCC\s0.
+\&\s-1GCC.\s0
 .Sp
 The \fB\-mno\-compat\-align\-parm\fR option is the default.
 .PP
@@ -18822,12 +18831,12 @@
 .Sp
 \&\fINote\fR If the \fB\-fpu\fR option is enabled then
 \&\fB\-funsafe\-math\-optimizations\fR is also enabled automatically.
-This is because the \s-1RX\s0 \s-1FPU\s0 instructions are themselves unsafe.
+This is because the \s-1RX FPU\s0 instructions are themselves unsafe.
 .IP "\fB\-mcpu=\fR\fIname\fR" 4
 .IX Item "-mcpu=name"
-Selects the type of \s-1RX\s0 \s-1CPU\s0 to be targeted.  Currently three types are
+Selects the type of \s-1RX CPU\s0 to be targeted.  Currently three types are
 supported, the generic \fI\s-1RX600\s0\fR and \fI\s-1RX200\s0\fR series hardware and
-the specific \fI\s-1RX610\s0\fR \s-1CPU\s0.  The default is \fI\s-1RX600\s0\fR.
+the specific \fI\s-1RX610\s0\fR \s-1CPU. \s0 The default is \fI\s-1RX600\s0\fR.
 .Sp
 The only difference between \fI\s-1RX600\s0\fR and \fI\s-1RX610\s0\fR is that the
 \&\fI\s-1RX610\s0\fR does not support the \f(CW\*(C`MVTIPL\*(C'\fR instruction.
@@ -19013,7 +19022,7 @@
 Store (do not store) the address of the caller's frame as backchain pointer
 into the callee's stack frame.
 A backchain may be needed to allow debugging using tools that do not understand
-\&\s-1DWARF\s0 2 call frame information.
+\&\s-1DWARF 2\s0 call frame information.
 When \fB\-mno\-packed\-stack\fR is in effect, the backchain pointer is stored
 at the bottom of the stack frame; when \fB\-mpacked\-stack\fR is in effect,
 the backchain is placed into the topmost word of the 96/160 byte register
@@ -19045,7 +19054,7 @@
 .Sp
 As long as the stack frame backchain is not used, code generated with
 \&\fB\-mpacked\-stack\fR is call-compatible with code generated with
-\&\fB\-mno\-packed\-stack\fR.  Note that some non-FSF releases of \s-1GCC\s0 2.95 for
+\&\fB\-mno\-packed\-stack\fR.  Note that some non-FSF releases of \s-1GCC 2.95\s0 for
 S/390 or zSeries generated code that uses the stack frame backchain at run
 time, not just for debugging purposes.  Such code is not call-compatible
 with code compiled with \fB\-mpacked\-stack\fR.  Also, note that the
@@ -19072,8 +19081,8 @@
 .IX Item "-m31"
 .PD
 When \fB\-m31\fR is specified, generate code compliant to the
-GNU/Linux for S/390 \s-1ABI\s0.  When \fB\-m64\fR is specified, generate
-code compliant to the GNU/Linux for zSeries \s-1ABI\s0.  This allows \s-1GCC\s0 in
+GNU/Linux for S/390 \s-1ABI. \s0 When \fB\-m64\fR is specified, generate
+code compliant to the GNU/Linux for zSeries \s-1ABI. \s0 This allows \s-1GCC\s0 in
 particular to generate 64\-bit instructions.  For the \fBs390\fR
 targets, the default is \fB\-m31\fR, while the \fBs390x\fR
 targets default to \fB\-m64\fR.
@@ -19086,11 +19095,11 @@
 When \fB\-mzarch\fR is specified, generate code using the
 instructions available on z/Architecture.
 When \fB\-mesa\fR is specified, generate code using the
-instructions available on \s-1ESA/390\s0.  Note that \fB\-mesa\fR is
+instructions available on \s-1ESA/390. \s0 Note that \fB\-mesa\fR is
 not possible with \fB\-m64\fR.
-When generating code compliant to the GNU/Linux for S/390 \s-1ABI\s0,
+When generating code compliant to the GNU/Linux for S/390 \s-1ABI,\s0
 the default is \fB\-mesa\fR.  When generating code compliant
-to the GNU/Linux for zSeries \s-1ABI\s0, the default is \fB\-mzarch\fR.
+to the GNU/Linux for zSeries \s-1ABI,\s0 the default is \fB\-mzarch\fR.
 .IP "\fB\-mmvcle\fR" 4
 .IX Item "-mmvcle"
 .PD 0
@@ -19130,9 +19139,9 @@
 .IP "\fB\-mno\-tpf\-trace\fR" 4
 .IX Item "-mno-tpf-trace"
 .PD
-Generate code that adds (does not add) in \s-1TPF\s0 \s-1OS\s0 specific branches to trace
+Generate code that adds (does not add) in \s-1TPF OS\s0 specific branches to trace
 routines in the operating system.  This option is off by default, even
-when compiling for the \s-1TPF\s0 \s-1OS\s0.
+when compiling for the \s-1TPF OS.\s0
 .IP "\fB\-mfused\-madd\fR" 4
 .IX Item "-mfused-madd"
 .PD 0
@@ -19228,16 +19237,16 @@
 These \fB\-m\fR options are defined for the \s-1SH\s0 implementations:
 .IP "\fB\-m1\fR" 4
 .IX Item "-m1"
-Generate code for the \s-1SH1\s0.
+Generate code for the \s-1SH1.\s0
 .IP "\fB\-m2\fR" 4
 .IX Item "-m2"
-Generate code for the \s-1SH2\s0.
+Generate code for the \s-1SH2.\s0
 .IP "\fB\-m2e\fR" 4
 .IX Item "-m2e"
 Generate code for the SH2e.
 .IP "\fB\-m2a\-nofpu\fR" 4
 .IX Item "-m2a-nofpu"
-Generate code for the SH2a without \s-1FPU\s0, or for a SH2a\-FPU in such a way
+Generate code for the SH2a without \s-1FPU,\s0 or for a SH2a\-FPU in such a way
 that the floating-point unit is not used.
 .IP "\fB\-m2a\-single\-only\fR" 4
 .IX Item "-m2a-single-only"
@@ -19253,7 +19262,7 @@
 double-precision mode by default.
 .IP "\fB\-m3\fR" 4
 .IX Item "-m3"
-Generate code for the \s-1SH3\s0.
+Generate code for the \s-1SH3.\s0
 .IP "\fB\-m3e\fR" 4
 .IX Item "-m3e"
 Generate code for the SH3e.
@@ -19270,7 +19279,7 @@
 single-precision mode by default.
 .IP "\fB\-m4\fR" 4
 .IX Item "-m4"
-Generate code for the \s-1SH4\s0.
+Generate code for the \s-1SH4.\s0
 .IP "\fB\-m4a\-nofpu\fR" 4
 .IX Item "-m4a-nofpu"
 Generate code for the SH4al\-dsp, or for a SH4a in such a way that the
@@ -19312,7 +19321,7 @@
 16\-bit offsets.
 .IP "\fB\-mbitops\fR" 4
 .IX Item "-mbitops"
-Enable the use of bit manipulation instructions on \s-1SH2A\s0.
+Enable the use of bit manipulation instructions on \s-1SH2A.\s0
 .IP "\fB\-mfmovd\fR" 4
 .IX Item "-mfmovd"
 Enable the use of the instruction \f(CW\*(C`fmovd\*(C'\fR.  Check \fB\-mdalign\fR for
@@ -19362,7 +19371,7 @@
 .IP "\fB\-mpadstruct\fR" 4
 .IX Item "-mpadstruct"
 This option is deprecated.  It pads structures to multiple of 4 bytes,
-which is incompatible with the \s-1SH\s0 \s-1ABI\s0.
+which is incompatible with the \s-1SH ABI.\s0
 .IP "\fB\-matomic\-model=\fR\fImodel\fR" 4
 .IX Item "-matomic-model=model"
 Sets the model of atomic operations and additional parameters as a comma
@@ -19379,7 +19388,7 @@
 built-in functions.  The generated atomic sequences require additional support
 from the interrupt/exception handling code of the system and are only suitable
 for SH3* and SH4* single-core systems.  This option is enabled by default when
-the target is \f(CW\*(C`sh\-*\-linux*\*(C'\fR and SH3* or SH4*.  When the target is \s-1SH4A\s0,
+the target is \f(CW\*(C`sh\-*\-linux*\*(C'\fR and SH3* or SH4*.  When the target is \s-1SH4A,\s0
 this option will also partially utilize the hardware atomic instructions
 \&\f(CW\*(C`movli.l\*(C'\fR and \f(CW\*(C`movco.l\*(C'\fR to create more efficient code, unless
 \&\fBstrict\fR is specified.
@@ -19520,20 +19529,20 @@
 .IX Item "call-div1"
 Calls a library function that uses the single-step division instruction
 \&\f(CW\*(C`div1\*(C'\fR to perform the operation.  Division by zero calculates an
-unspecified result and does not trap.  This is the default except for \s-1SH4\s0,
-\&\s-1SH2A\s0 and SHcompact.
+unspecified result and does not trap.  This is the default except for \s-1SH4,
+SH2A\s0 and SHcompact.
 .IP "\fBcall-fp\fR" 4
 .IX Item "call-fp"
 Calls a library function that performs the operation in double precision
 floating point.  Division by zero causes a floating-point exception.  This is
-the default for SHcompact with \s-1FPU\s0.  Specifying this for targets that do not
+the default for SHcompact with \s-1FPU. \s0 Specifying this for targets that do not
 have a double precision \s-1FPU\s0 will default to \f(CW\*(C`call\-div1\*(C'\fR.
 .IP "\fBcall-table\fR" 4
 .IX Item "call-table"
 Calls a library function that uses a lookup table for small divisors and
 the \f(CW\*(C`div1\*(C'\fR instruction with case distinction for larger divisors.  Division
 by zero calculates an unspecified result and does not trap.  This is the default
-for \s-1SH4\s0.  Specifying this for targets that do not have dynamic shift
+for \s-1SH4. \s0 Specifying this for targets that do not have dynamic shift
 instructions will default to \f(CW\*(C`call\-div1\*(C'\fR.
 .RE
 .RS 4
@@ -19567,10 +19576,10 @@
 Enable the use of the indexed addressing mode for SHmedia32/SHcompact.
 This is only safe if the hardware and/or \s-1OS\s0 implement 32\-bit wrap-around
 semantics for the indexed addressing mode.  The architecture allows the
-implementation of processors with 64\-bit \s-1MMU\s0, which the \s-1OS\s0 could use to
+implementation of processors with 64\-bit \s-1MMU,\s0 which the \s-1OS\s0 could use to
 get 32\-bit addressing, but since no current hardware implementation supports
 this or any other way to make the indexed addressing mode safe to use in
-the 32\-bit \s-1ABI\s0, the default is \fB\-mno\-indexed\-addressing\fR.
+the 32\-bit \s-1ABI,\s0 the default is \fB\-mno\-indexed\-addressing\fR.
 .IP "\fB\-mgettrcost=\fR\fInumber\fR" 4
 .IX Item "-mgettrcost=number"
 Set the cost assumed for the \f(CW\*(C`gettr\*(C'\fR instruction to \fInumber\fR.
@@ -19607,7 +19616,7 @@
 but with assembler and/or linker tricks it is possible
 to generate symbols that cause \f(CW\*(C`ptabs\*(C'\fR or \f(CW\*(C`ptrel\*(C'\fR to trap.
 This option is only meaningful when \fB\-mno\-pt\-fixed\fR is in effect.
-It prevents cross-basic-block \s-1CSE\s0, hoisting and most scheduling
+It prevents cross-basic-block \s-1CSE,\s0 hoisting and most scheduling
 of symbol loads.  The default is \fB\-mno\-invalid\-symbols\fR.
 .IP "\fB\-mbranch\-cost=\fR\fInum\fR" 4
 .IX Item "-mbranch-cost=num"
@@ -19624,7 +19633,7 @@
 Assume (do not assume) that zero displacement conditional branch instructions
 \&\f(CW\*(C`bt\*(C'\fR and \f(CW\*(C`bf\*(C'\fR are fast.  If \fB\-mzdcbranch\fR is specified, the
 compiler will try to prefer zero displacement branch code sequences.  This is
-enabled by default when generating code for \s-1SH4\s0 and \s-1SH4A\s0.  It can be explicitly
+enabled by default when generating code for \s-1SH4\s0 and \s-1SH4A. \s0 It can be explicitly
 disabled by specifying \fB\-mno\-zdcbranch\fR.
 .IP "\fB\-mfused\-madd\fR" 4
 .IX Item "-mfused-madd"
@@ -19647,7 +19656,7 @@
 Allow or disallow the compiler to emit the \f(CW\*(C`fsca\*(C'\fR instruction for sine
 and cosine approximations.  The option \f(CW\*(C`\-mfsca\*(C'\fR must be used in
 combination with \f(CW\*(C`\-funsafe\-math\-optimizations\*(C'\fR.  It is enabled by default
-when generating code for \s-1SH4A\s0.  Using \f(CW\*(C`\-mno\-fsca\*(C'\fR disables sine and cosine
+when generating code for \s-1SH4A. \s0 Using \f(CW\*(C`\-mno\-fsca\*(C'\fR disables sine and cosine
 approximations even if \f(CW\*(C`\-funsafe\-math\-optimizations\*(C'\fR is in effect.
 .IP "\fB\-mfsrra\fR" 4
 .IX Item "-mfsrra"
@@ -19659,7 +19668,7 @@
 reciprocal square root approximations.  The option \f(CW\*(C`\-mfsrra\*(C'\fR must be used
 in combination with \f(CW\*(C`\-funsafe\-math\-optimizations\*(C'\fR and
 \&\f(CW\*(C`\-ffinite\-math\-only\*(C'\fR.  It is enabled by default when generating code for
-\&\s-1SH4A\s0.  Using \f(CW\*(C`\-mno\-fsrra\*(C'\fR disables reciprocal square root approximations
+\&\s-1SH4A. \s0 Using \f(CW\*(C`\-mno\-fsrra\*(C'\fR disables reciprocal square root approximations
 even if \f(CW\*(C`\-funsafe\-math\-optimizations\*(C'\fR and \f(CW\*(C`\-ffinite\-math\-only\*(C'\fR are
 in effect.
 .IP "\fB\-mpretend\-cmove\fR" 4
@@ -19713,7 +19722,7 @@
 .IX Item "-mapp-regs"
 .PD
 Specify \fB\-mapp\-regs\fR to generate output using the global registers
-2 through 4, which the \s-1SPARC\s0 \s-1SVR4\s0 \s-1ABI\s0 reserves for applications.  Like the
+2 through 4, which the \s-1SPARC SVR4 ABI\s0 reserves for applications.  Like the
 global register 1, each global register 2 through 4 is then treated as an
 allocable register that is clobbered by function calls.  This is the default.
 .Sp
@@ -19759,7 +19768,7 @@
 \&\fB\-msoft\-float\fR changes the calling convention in the output file;
 therefore, it is only useful if you compile \fIall\fR of a program with
 this option.  In particular, you need to compile \fIlibgcc.a\fR, the
-library that comes with \s-1GCC\s0, with \fB\-msoft\-float\fR in order for
+library that comes with \s-1GCC,\s0 with \fB\-msoft\-float\fR in order for
 this to work.
 .IP "\fB\-mhard\-quad\-float\fR" 4
 .IX Item "-mhard-quad-float"
@@ -19769,7 +19778,7 @@
 .IX Item "-msoft-quad-float"
 Generate output containing library calls for quad-word (long double)
 floating-point instructions.  The functions called are those specified
-in the \s-1SPARC\s0 \s-1ABI\s0.  This is the default.
+in the \s-1SPARC ABI. \s0 This is the default.
 .Sp
 As of this writing, there are no \s-1SPARC\s0 implementations that have hardware
 support for the quad-word floating-point instructions.  They all invoke
@@ -19810,10 +19819,10 @@
 should have 8\-byte alignment.  This enables the use of pairs of
 \&\f(CW\*(C`ldd\*(C'\fR and \f(CW\*(C`std\*(C'\fR instructions for copies in structure
 assignment, in place of twice as many \f(CW\*(C`ld\*(C'\fR and \f(CW\*(C`st\*(C'\fR pairs.
-However, the use of this changed alignment directly violates the \s-1SPARC\s0
-\&\s-1ABI\s0.  Thus, it's intended only for use on targets where the developer
+However, the use of this changed alignment directly violates the \s-1SPARC
+ABI. \s0 Thus, it's intended only for use on targets where the developer
 acknowledges that their resulting code is not directly in line with
-the rules of the \s-1ABI\s0.
+the rules of the \s-1ABI.\s0
 .IP "\fB\-mcpu=\fR\fIcpu_type\fR" 4
 .IX Item "-mcpu=cpu_type"
 Set the instruction set, register set, and instruction scheduling parameters
@@ -19863,22 +19872,22 @@
 With \fB\-mcpu=v8\fR, \s-1GCC\s0 generates code for the V8 variant of the \s-1SPARC\s0
 architecture.  The only difference from V7 code is that the compiler emits
 the integer multiply and integer divide instructions which exist in \s-1SPARC\-V8\s0
-but not in \s-1SPARC\-V7\s0.  With \fB\-mcpu=supersparc\fR, the compiler additionally
+but not in \s-1SPARC\-V7. \s0 With \fB\-mcpu=supersparc\fR, the compiler additionally
 optimizes it for the SuperSPARC chip, as used in the SPARCStation 10, 1000 and
 2000 series.
 .Sp
 With \fB\-mcpu=sparclite\fR, \s-1GCC\s0 generates code for the SPARClite variant of
 the \s-1SPARC\s0 architecture.  This adds the integer multiply, integer divide step
-and scan (\f(CW\*(C`ffs\*(C'\fR) instructions which exist in SPARClite but not in \s-1SPARC\-V7\s0.
+and scan (\f(CW\*(C`ffs\*(C'\fR) instructions which exist in SPARClite but not in \s-1SPARC\-V7.\s0
 With \fB\-mcpu=f930\fR, the compiler additionally optimizes it for the
-Fujitsu \s-1MB86930\s0 chip, which is the original SPARClite, with no \s-1FPU\s0.  With
+Fujitsu \s-1MB86930\s0 chip, which is the original SPARClite, with no \s-1FPU. \s0 With
 \&\fB\-mcpu=f934\fR, the compiler additionally optimizes it for the Fujitsu
-\&\s-1MB86934\s0 chip, which is the more recent SPARClite with \s-1FPU\s0.
+\&\s-1MB86934\s0 chip, which is the more recent SPARClite with \s-1FPU.\s0
 .Sp
 With \fB\-mcpu=sparclet\fR, \s-1GCC\s0 generates code for the SPARClet variant of
 the \s-1SPARC\s0 architecture.  This adds the integer multiply, multiply/accumulate,
 integer divide step and scan (\f(CW\*(C`ffs\*(C'\fR) instructions which exist in SPARClet
-but not in \s-1SPARC\-V7\s0.  With \fB\-mcpu=tsc701\fR, the compiler additionally
+but not in \s-1SPARC\-V7. \s0 With \fB\-mcpu=tsc701\fR, the compiler additionally
 optimizes it for the \s-1TEMIC\s0 SPARClet chip.
 .Sp
 With \fB\-mcpu=v9\fR, \s-1GCC\s0 generates code for the V9 variant of the \s-1SPARC\s0
@@ -19915,7 +19924,7 @@
 .IP "\fB\-mno\-v8plus\fR" 4
 .IX Item "-mno-v8plus"
 .PD
-With \fB\-mv8plus\fR, \s-1GCC\s0 generates code for the \s-1SPARC\-V8+\s0 \s-1ABI\s0.  The
+With \fB\-mv8plus\fR, \s-1GCC\s0 generates code for the \s-1SPARC\-V8+ ABI. \s0 The
 difference from the V8 \s-1ABI\s0 is that the global and out registers are
 considered 64 bits wide.  This is enabled by default on Solaris in 32\-bit
 mode for all \s-1SPARC\-V9\s0 processors.
@@ -20370,9 +20379,9 @@
 v850e, v850e1, v850e2, v850e2v3 and v850e3v5 flavors of the v850
 architecture.
 .Sp
-This option is enabled by default when the \s-1RH850\s0 \s-1ABI\s0 is
+This option is enabled by default when the \s-1RH850 ABI\s0 is
 in use (see \fB\-mrh850\-abi\fR), and disabled by default when the
-\&\s-1GCC\s0 \s-1ABI\s0 is in use.  If \f(CW\*(C`CALLT\*(C'\fR instructions are being generated
+\&\s-1GCC ABI\s0 is in use.  If \f(CW\*(C`CALLT\*(C'\fR instructions are being generated
 then the C preprocessor symbol \f(CW\*(C`_\|_V850_CALLT_\|_\*(C'\fR will be defined.
 .IP "\fB\-mrelax\fR" 4
 .IX Item "-mrelax"
@@ -20412,7 +20421,7 @@
 .IP "\fB\-mghs\fR" 4
 .IX Item "-mghs"
 .PD
-Enables support for the \s-1RH850\s0 version of the V850 \s-1ABI\s0.  This is the
+Enables support for the \s-1RH850\s0 version of the V850 \s-1ABI. \s0 This is the
 default.  With this version of the \s-1ABI\s0 the following rules apply:
 .RS 4
 .IP "\(bu" 4
@@ -20437,7 +20446,7 @@
 .RE
 .IP "\fB\-mgcc\-abi\fR" 4
 .IX Item "-mgcc-abi"
-Enables support for the old \s-1GCC\s0 version of the V850 \s-1ABI\s0.  With this
+Enables support for the old \s-1GCC\s0 version of the V850 \s-1ABI. \s0 With this
 version of the \s-1ABI\s0 the following rules apply:
 .RS 4
 .IP "\(bu" 4
@@ -20627,7 +20636,7 @@
 Control the treatment of literal pools.  The default is
 \&\fB\-mno\-text\-section\-literals\fR, which places literals in a separate
 section in the output file.  This allows the literal pool to be placed
-in a data \s-1RAM/ROM\s0, and it also allows the linker to combine literal
+in a data \s-1RAM/ROM,\s0 and it also allows the linker to combine literal
 pools from separate object files to remove redundant literals and
 improve code size.  With \fB\-mtext\-section\-literals\fR, the literals
 are interspersed in the text section in order to keep them as close as
@@ -20812,7 +20821,7 @@
 that needs this handling enables it on your behalf.
 .IP "\fB\-fasynchronous\-unwind\-tables\fR" 4
 .IX Item "-fasynchronous-unwind-tables"
-Generate unwind table in \s-1DWARF\s0 2 format, if supported by target machine.  The
+Generate unwind table in \s-1DWARF 2\s0 format, if supported by target machine.  The
 table is exact at each instruction boundary, so it can be used for stack
 unwinding from asynchronous events (such as debugger or garbage collector).
 .IP "\fB\-fno\-gnu\-unique\fR" 4
@@ -20883,7 +20892,7 @@
 .IX Item "-fshort-wchar"
 Override the underlying type for \fBwchar_t\fR to be \fBshort
 unsigned int\fR instead of the default for the target.  This option is
-useful for building programs to run under \s-1WINE\s0.
+useful for building programs to run under \s-1WINE.\s0
 .Sp
 \&\fBWarning:\fR the \fB\-fshort\-wchar\fR switch causes \s-1GCC\s0 to generate
 code that is not binary compatible with code generated without that switch.
@@ -20896,7 +20905,7 @@
 in a common block.
 This is the behavior specified by \fB\-fcommon\fR, and is the default
 for \s-1GCC\s0 on most targets.
-On the other hand, this behavior is not required by \s-1ISO\s0 C, and on some
+On the other hand, this behavior is not required by \s-1ISO C,\s0 and on some
 targets may carry a speed or code size penalty on variable references.
 The \fB\-fno\-common\fR option specifies that the compiler should place
 uninitialized global variables in the data section of the object file,
@@ -20952,11 +20961,11 @@
 maximum size, you get an error message from the linker indicating that
 \&\fB\-fpic\fR does not work; in that case, recompile with \fB\-fPIC\fR
 instead.  (These maximums are 8k on the \s-1SPARC\s0 and 32k
-on the m68k and \s-1RS/6000\s0.  The 386 has no such limit.)
+on the m68k and \s-1RS/6000. \s0 The 386 has no such limit.)
 .Sp
 Position-independent code requires special support, and therefore works
 only on certain machines.  For the 386, \s-1GCC\s0 supports \s-1PIC\s0 for System V
-but not for the Sun 386i.  Code generated for the \s-1IBM\s0 \s-1RS/6000\s0 is always
+but not for the Sun 386i.  Code generated for the \s-1IBM RS/6000\s0 is always
 position-independent.
 .Sp
 When this flag is set, the macros \f(CW\*(C`_\|_pic_\|_\*(C'\fR and \f(CW\*(C`_\|_PIC_\|_\*(C'\fR
@@ -20966,7 +20975,7 @@
 If supported for the target machine, emit position-independent code,
 suitable for dynamic linking and avoiding any limit on the size of the
 global offset table.  This option makes a difference on the m68k,
-PowerPC and \s-1SPARC\s0.
+PowerPC and \s-1SPARC.\s0
 .Sp
 Position-independent code requires special support, and therefore works
 only on certain machines.
@@ -21116,7 +21125,7 @@
 internal mangled name (e.g., \f(CW\*(C`_Z4blahRSt6vectorIiSaIiEE\*(C'\fR).  The
 match is done on substrings: if the \fIsym\fR parameter is a substring
 of the function name, it is considered to be a match.  For C99 and \*(C+
-extended identifiers, the function name must be given in \s-1UTF\-8\s0, not
+extended identifiers, the function name must be given in \s-1UTF\-8,\s0 not
 using universal character names.
 .IP "\fB\-fstack\-check\fR" 4
 .IX Item "-fstack-check"
@@ -21229,7 +21238,7 @@
 The default if \fB\-fvisibility\fR isn't specified is
 \&\f(CW\*(C`default\*(C'\fR, i.e., make every
 symbol public\-\-\-this causes the same behavior as previous versions of
-\&\s-1GCC\s0.
+\&\s-1GCC.\s0
 .Sp
 A good explanation of the benefits offered by ensuring \s-1ELF\s0
 symbols have the correct visibility is given by \*(L"How To Write
@@ -21254,7 +21263,7 @@
 only for use within the local \s-1DSO\s0 should \fBalways\fR be marked explicitly
 as hidden as so to avoid \s-1PLT\s0 indirection overheads\-\-\-making this
 abundantly clear also aids readability and self-documentation of the code.
-Note that due to \s-1ISO\s0 \*(C+ specification requirements, \f(CW\*(C`operator new\*(C'\fR and
+Note that due to \s-1ISO \*(C+\s0 specification requirements, \f(CW\*(C`operator new\*(C'\fR and
 \&\f(CW\*(C`operator delete\*(C'\fR must always be of default visibility.
 .Sp
 Be aware that headers from outside your project, in particular system
@@ -21266,7 +21275,7 @@
 \&\fBextern\fR declarations are not affected by \fB\-fvisibility\fR, so
 a lot of code can be recompiled with \fB\-fvisibility=hidden\fR with
 no modifications.  However, this means that calls to \f(CW\*(C`extern\*(C'\fR
-functions with no explicit visibility use the \s-1PLT\s0, so it is more
+functions with no explicit visibility use the \s-1PLT,\s0 so it is more
 effective to use \f(CW\*(C`_\|_attribute ((visibility))\*(C'\fR and/or
 \&\f(CW\*(C`#pragma GCC visibility\*(C'\fR to tell the compiler which \f(CW\*(C`extern\*(C'\fR
 declarations should be treated as hidden.
@@ -21328,7 +21337,7 @@
 Note that you can also specify places to search using options such as
 \&\fB\-B\fR, \fB\-I\fR and \fB\-L\fR.  These
 take precedence over places specified using environment variables, which
-in turn take precedence over those specified by the configuration of \s-1GCC\s0.
+in turn take precedence over those specified by the configuration of \s-1GCC.\s0
 .IP "\fB\s-1LANG\s0\fR" 4
 .IX Item "LANG"
 .PD 0
@@ -21345,7 +21354,7 @@
 \&\fB\s-1LC_CTYPE\s0\fR and \fB\s-1LC_MESSAGES\s0\fR if it has been configured to do
 so.  These locale categories can be set to any value supported by your
 installation.  A typical value is \fBen_GB.UTF\-8\fR for English in the United
-Kingdom encoded in \s-1UTF\-8\s0.
+Kingdom encoded in \s-1UTF\-8.\s0
 .Sp
 The \fB\s-1LC_CTYPE\s0\fR environment variable specifies character
 classification.  \s-1GCC\s0 uses it to determine the character boundaries in
@@ -21525,7 +21534,7 @@
 .IX Header "AUTHOR"
 See the Info entry for \fBgcc\fR, or
 <\fBhttp://gcc.gnu.org/onlinedocs/gcc/Contributors.html\fR>,
-for contributors to \s-1GCC\s0.
+for contributors to \s-1GCC.\s0
 .SH "COPYRIGHT"
 .IX Header "COPYRIGHT"
 Copyright (c) 1988\-2014 Free Software Foundation, Inc.
diff --git a/share/man/man1/arm-buildroot-linux-gnueabi-gcc.1 b/share/man/man1/arm-buildroot-linux-gnueabi-gcc.1
index f014059..641ffd5 100644
--- a/share/man/man1/arm-buildroot-linux-gnueabi-gcc.1
+++ b/share/man/man1/arm-buildroot-linux-gnueabi-gcc.1
@@ -1,4 +1,4 @@
-.\" Automatically generated by Pod::Man 2.25 (Pod::Simple 3.16)
+.\" Automatically generated by Pod::Man 2.27 (Pod::Simple 3.28)
 .\"
 .\" Standard preamble:
 .\" ========================================================================
@@ -38,6 +38,8 @@
 .    ds PI \(*p
 .    ds L" ``
 .    ds R" ''
+.    ds C`
+.    ds C'
 'br\}
 .\"
 .\" Escape single quotes in literal strings from groff's Unicode transform.
@@ -48,17 +50,24 @@
 .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
 .\" entries marked with X<> in POD.  Of course, you'll have to process the
 .\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
 ..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{
+.    if \nF \{
+.        de IX
+.        tm Index:\\$1\t\\n%\t"\\$2"
 ..
+.        if !\nF==2 \{
+.            nr % 0
+.            nr F 2
+.        \}
+.    \}
 .\}
+.rr rF
 .\"
 .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
 .\" Fear.  Run.  Save yourself.  No user-serviceable parts.
@@ -145,7 +154,7 @@
 remainder.  \fBg++\fR accepts mostly the same options as \fBgcc\fR.
 .SH "DESCRIPTION"
 .IX Header "DESCRIPTION"
-When you invoke \s-1GCC\s0, it normally does preprocessing, compilation,
+When you invoke \s-1GCC,\s0 it normally does preprocessing, compilation,
 assembly and linking.  The \*(L"overall options\*(R" allow you to stop this
 process at an intermediate stage.  For example, the \fB\-c\fR option
 says not to run the linker.  Then the output consists of object files
@@ -1404,7 +1413,7 @@
 .IX Item "language"
 Display the options supported for \fIlanguage\fR, where
 \&\fIlanguage\fR is the name of one of the languages supported in this
-version of \s-1GCC\s0.
+version of \s-1GCC.\s0
 .IP "\fBcommon\fR" 4
 .IX Item "common"
 Display the options that are common to all languages.
@@ -1501,7 +1510,7 @@
 prefix.
 .IP "\fB\-\-version\fR" 4
 .IX Item "--version"
-Display the version number and copyrights of the invoked \s-1GCC\s0.
+Display the version number and copyrights of the invoked \s-1GCC.\s0
 .IP "\fB\-wrapper\fR" 4
 .IX Item "-wrapper"
 Invoke all subcommands under a wrapper program.  The name of the
@@ -1523,7 +1532,7 @@
 purposes of argument parsing (See
 \&\fB\-fplugin\-arg\-\fR\fIname\fR\fB\-\fR\fIkey\fR\fB=\fR\fIvalue\fR below).
 Each plugin should define the callback functions specified in the
-Plugins \s-1API\s0.
+Plugins \s-1API.\s0
 .IP "\fB\-fplugin\-arg\-\fR\fIname\fR\fB\-\fR\fIkey\fR\fB=\fR\fIvalue\fR" 4
 .IX Item "-fplugin-arg-name-key=value"
 Define an argument called \fIkey\fR with a value of \fIvalue\fR
@@ -1556,7 +1565,7 @@
 with a backslash.  The \fIfile\fR may itself contain additional
 @\fIfile\fR options; any such options will be processed recursively.
 .SS "Compiling \*(C+ Programs"
-.IX Subsection "Compiling  Programs"
+.IX Subsection "Compiling Programs"
 \&\*(C+ source files conventionally use one of the suffixes \fB.C\fR,
 \&\fB.cc\fR, \fB.cpp\fR, \fB.CPP\fR, \fB.c++\fR, \fB.cp\fR, or
 \&\fB.cxx\fR; \*(C+ header files often use \fB.hh\fR, \fB.hpp\fR,
@@ -1589,8 +1598,8 @@
 In C mode, this is equivalent to \fB\-std=c90\fR. In \*(C+ mode, it is
 equivalent to \fB\-std=c++98\fR.
 .Sp
-This turns off certain features of \s-1GCC\s0 that are incompatible with \s-1ISO\s0
-C90 (when compiling C code), or of standard \*(C+ (when compiling \*(C+ code),
+This turns off certain features of \s-1GCC\s0 that are incompatible with \s-1ISO
+C90 \s0(when compiling C code), or of standard \*(C+ (when compiling \*(C+ code),
 such as the \f(CW\*(C`asm\*(C'\fR and \f(CW\*(C`typeof\*(C'\fR keywords, and
 predefined macros such as \f(CW\*(C`unix\*(C'\fR and \f(CW\*(C`vax\*(C'\fR that identify the
 type of system you are using.  It also enables the undesirable and
@@ -1600,7 +1609,7 @@
 .Sp
 The alternate keywords \f(CW\*(C`_\|_asm_\|_\*(C'\fR, \f(CW\*(C`_\|_extension_\|_\*(C'\fR,
 \&\f(CW\*(C`_\|_inline_\|_\*(C'\fR and \f(CW\*(C`_\|_typeof_\|_\*(C'\fR continue to work despite
-\&\fB\-ansi\fR.  You would not want to use them in an \s-1ISO\s0 C program, of
+\&\fB\-ansi\fR.  You would not want to use them in an \s-1ISO C\s0 program, of
 course, but it is useful to put them in header files that might be included
 in compilations done with \fB\-ansi\fR.  Alternate predefined macros
 such as \f(CW\*(C`_\|_unix_\|_\*(C'\fR and \f(CW\*(C`_\|_vax_\|_\*(C'\fR are also available, with or
@@ -1617,7 +1626,7 @@
 programs that might use these names for other things.
 .Sp
 Functions that are normally built in but do not have semantics
-defined by \s-1ISO\s0 C (such as \f(CW\*(C`alloca\*(C'\fR and \f(CW\*(C`ffs\*(C'\fR) are not built-in
+defined by \s-1ISO C \s0(such as \f(CW\*(C`alloca\*(C'\fR and \f(CW\*(C`ffs\*(C'\fR) are not built-in
 functions when \fB\-ansi\fR is used.
 .IP "\fB\-std=\fR" 4
 .IX Item "-std="
@@ -1630,9 +1639,9 @@
 compiler accepts all programs following that standard plus those
 using \s-1GNU\s0 extensions that do not contradict it.  For example,
 \&\fB\-std=c90\fR turns off certain features of \s-1GCC\s0 that are
-incompatible with \s-1ISO\s0 C90, such as the \f(CW\*(C`asm\*(C'\fR and \f(CW\*(C`typeof\*(C'\fR
+incompatible with \s-1ISO C90,\s0 such as the \f(CW\*(C`asm\*(C'\fR and \f(CW\*(C`typeof\*(C'\fR
 keywords, but not other \s-1GNU\s0 extensions that do not have a meaning in
-\&\s-1ISO\s0 C90, such as omitting the middle term of a \f(CW\*(C`?:\*(C'\fR
+\&\s-1ISO C90,\s0 such as omitting the middle term of a \f(CW\*(C`?:\*(C'\fR
 expression. On the other hand, when a \s-1GNU\s0 dialect of a standard is
 specified, all features supported by the compiler are enabled, even when
 those features change the meaning of the base standard.  As a result, some
@@ -1652,11 +1661,11 @@
 .IP "\fBiso9899:1990\fR" 4
 .IX Item "iso9899:1990"
 .PD
-Support all \s-1ISO\s0 C90 programs (certain \s-1GNU\s0 extensions that conflict
-with \s-1ISO\s0 C90 are disabled). Same as \fB\-ansi\fR for C code.
+Support all \s-1ISO C90\s0 programs (certain \s-1GNU\s0 extensions that conflict
+with \s-1ISO C90\s0 are disabled). Same as \fB\-ansi\fR for C code.
 .IP "\fBiso9899:199409\fR" 4
 .IX Item "iso9899:199409"
-\&\s-1ISO\s0 C90 as modified in amendment 1.
+\&\s-1ISO C90\s0 as modified in amendment 1.
 .IP "\fBc99\fR" 4
 .IX Item "c99"
 .PD 0
@@ -1667,7 +1676,7 @@
 .IP "\fBiso9899:199x\fR" 4
 .IX Item "iso9899:199x"
 .PD
-\&\s-1ISO\s0 C99.  This standard is substantially completely supported, modulo
+\&\s-1ISO C99. \s0 This standard is substantially completely supported, modulo
 bugs, extended identifiers (supported except for corner cases when
 \&\fB\-fextended\-identifiers\fR is used) and floating-point issues
 (mainly but not entirely relating to optional C99 features from
@@ -1682,7 +1691,7 @@
 .IP "\fBiso9899:2011\fR" 4
 .IX Item "iso9899:2011"
 .PD
-\&\s-1ISO\s0 C11, the 2011 revision of the \s-1ISO\s0 C standard.  This standard is
+\&\s-1ISO C11,\s0 the 2011 revision of the \s-1ISO C\s0 standard.  This standard is
 substantially completely supported, modulo bugs, extended identifiers
 (supported except for corner cases when
 \&\fB\-fextended\-identifiers\fR is used), floating-point issues
@@ -1695,7 +1704,7 @@
 .IP "\fBgnu89\fR" 4
 .IX Item "gnu89"
 .PD
-\&\s-1GNU\s0 dialect of \s-1ISO\s0 C90 (including some C99 features). This
+\&\s-1GNU\s0 dialect of \s-1ISO C90 \s0(including some C99 features). This
 is the default for C code.
 .IP "\fBgnu99\fR" 4
 .IX Item "gnu99"
@@ -1703,22 +1712,22 @@
 .IP "\fBgnu9x\fR" 4
 .IX Item "gnu9x"
 .PD
-\&\s-1GNU\s0 dialect of \s-1ISO\s0 C99.  The name \fBgnu9x\fR is deprecated.
+\&\s-1GNU\s0 dialect of \s-1ISO C99. \s0 The name \fBgnu9x\fR is deprecated.
 .IP "\fBgnu11\fR" 4
 .IX Item "gnu11"
 .PD 0
 .IP "\fBgnu1x\fR" 4
 .IX Item "gnu1x"
 .PD
-\&\s-1GNU\s0 dialect of \s-1ISO\s0 C11.  This is intended to become the default in a
-future release of \s-1GCC\s0.  The name \fBgnu1x\fR is deprecated.
+\&\s-1GNU\s0 dialect of \s-1ISO C11. \s0 This is intended to become the default in a
+future release of \s-1GCC. \s0 The name \fBgnu1x\fR is deprecated.
 .IP "\fBc++98\fR" 4
 .IX Item "c++98"
 .PD 0
 .IP "\fBc++03\fR" 4
 .IX Item "c++03"
 .PD
-The 1998 \s-1ISO\s0 \*(C+ standard plus the 2003 technical corrigendum and some
+The 1998 \s-1ISO \*(C+\s0 standard plus the 2003 technical corrigendum and some
 additional defect reports. Same as \fB\-ansi\fR for \*(C+ code.
 .IP "\fBgnu++98\fR" 4
 .IX Item "gnu++98"
@@ -1734,7 +1743,7 @@
 .IP "\fBc++0x\fR" 4
 .IX Item "c++0x"
 .PD
-The 2011 \s-1ISO\s0 \*(C+ standard plus amendments.
+The 2011 \s-1ISO \*(C+\s0 standard plus amendments.
 The name \fBc++0x\fR is deprecated.
 .IP "\fBgnu++11\fR" 4
 .IX Item "gnu++11"
@@ -1746,7 +1755,7 @@
 The name \fBgnu++0x\fR is deprecated.
 .IP "\fBc++1y\fR" 4
 .IX Item "c++1y"
-The next revision of the \s-1ISO\s0 \*(C+ standard, tentatively planned for
+The next revision of the \s-1ISO \*(C+\s0 standard, tentatively planned for
 2014.  Support is highly experimental, and will almost certainly
 change in incompatible ways in future releases.
 .IP "\fBgnu++1y\fR" 4
@@ -1770,7 +1779,7 @@
 The option \fB\-fno\-gnu89\-inline\fR explicitly tells \s-1GCC\s0 to use the
 C99 semantics for \f(CW\*(C`inline\*(C'\fR when in C99 or gnu99 mode (i.e., it
 specifies the default behavior).  This option was first supported in
-\&\s-1GCC\s0 4.3.  This option is not supported in \fB\-std=c90\fR or
+\&\s-1GCC 4.3. \s0 This option is not supported in \fB\-std=c90\fR or
 \&\fB\-std=gnu90\fR mode.
 .Sp
 The preprocessor macros \f(CW\*(C`_\|_GNUC_GNU_INLINE_\|_\*(C'\fR and
@@ -1810,7 +1819,7 @@
 use the \fB\-fno\-gnu\-keywords\fR flag instead, which has the same
 effect.  In C99 mode (\fB\-std=c99\fR or \fB\-std=gnu99\fR), this
 switch only affects the \f(CW\*(C`asm\*(C'\fR and \f(CW\*(C`typeof\*(C'\fR keywords, since
-\&\f(CW\*(C`inline\*(C'\fR is a standard keyword in \s-1ISO\s0 C99.
+\&\f(CW\*(C`inline\*(C'\fR is a standard keyword in \s-1ISO C99.\s0
 .IP "\fB\-fno\-builtin\fR" 4
 .IX Item "-fno-builtin"
 .PD 0
@@ -1838,7 +1847,7 @@
 With the \fB\-fno\-builtin\-\fR\fIfunction\fR option
 only the built-in function \fIfunction\fR is
 disabled.  \fIfunction\fR must not begin with \fB_\|_builtin_\fR.  If a
-function is named that is not built-in in this version of \s-1GCC\s0, this
+function is named that is not built-in in this version of \s-1GCC,\s0 this
 option is ignored.  There is no corresponding
 \&\fB\-fbuiltin\-\fR\fIfunction\fR option; if you wish to enable
 built-in functions selectively when using \fB\-fno\-builtin\fR or
@@ -1892,7 +1901,7 @@
 generates code for the Linux variant of Intel's current Transactional
 Memory \s-1ABI\s0 specification document (Revision 1.1, May 6 2009).  This is
 an experimental feature whose interface may change in future versions
-of \s-1GCC\s0, as the official specification changes.  Please note that not
+of \s-1GCC,\s0 as the official specification changes.  Please note that not
 all architectures are supported for this feature.
 .Sp
 For more information on \s-1GCC\s0's support for transactional memory,
@@ -1929,8 +1938,8 @@
 supported for C, not \*(C+.
 .IP "\fB\-trigraphs\fR" 4
 .IX Item "-trigraphs"
-Support \s-1ISO\s0 C trigraphs.  The \fB\-ansi\fR option (and \fB\-std\fR
-options for strict \s-1ISO\s0 C conformance) implies \fB\-trigraphs\fR.
+Support \s-1ISO C\s0 trigraphs.  The \fB\-ansi\fR option (and \fB\-std\fR
+options for strict \s-1ISO C\s0 conformance) implies \fB\-trigraphs\fR.
 .IP "\fB\-traditional\fR" 4
 .IX Item "-traditional"
 .PD 0
@@ -1939,8 +1948,8 @@
 .PD
 Formerly, these options caused \s-1GCC\s0 to attempt to emulate a pre-standard
 C compiler.  They are now only supported with the \fB\-E\fR switch.
-The preprocessor continues to support a pre-standard mode.  See the \s-1GNU\s0
-\&\s-1CPP\s0 manual for details.
+The preprocessor continues to support a pre-standard mode.  See the \s-1GNU
+CPP\s0 manual for details.
 .IP "\fB\-fcond\-mismatch\fR" 4
 .IX Item "-fcond-mismatch"
 Allow conditional expressions with mismatched types in the second and
@@ -1991,7 +2000,7 @@
 default, such a bit-field is signed, because this is consistent: the
 basic integer types such as \f(CW\*(C`int\*(C'\fR are signed types.
 .SS "Options Controlling \*(C+ Dialect"
-.IX Subsection "Options Controlling  Dialect"
+.IX Subsection "Options Controlling Dialect"
 This section describes the command-line options that are only meaningful
 for \*(C+ programs.  You can also use most of the \s-1GNU\s0 compiler options
 regardless of what language your program is in.  For example, you
@@ -2003,12 +2012,12 @@
 .PP
 In this example, only \fB\-frepo\fR is an option meant
 only for \*(C+ programs; you can use the other options with any
-language supported by \s-1GCC\s0.
+language supported by \s-1GCC.\s0
 .PP
 Here is a list of options that are \fIonly\fR for compiling \*(C+ programs:
 .IP "\fB\-fabi\-version=\fR\fIn\fR" 4
 .IX Item "-fabi-version=n"
-Use version \fIn\fR of the \*(C+ \s-1ABI\s0.  The default is version 2.
+Use version \fIn\fR of the \*(C+ \s-1ABI. \s0 The default is version 2.
 .Sp
 Version 0 refers to the version conforming most closely to
 the \*(C+ \s-1ABI\s0 specification.  Therefore, the \s-1ABI\s0 obtained using version 0
@@ -2083,7 +2092,7 @@
 visible outside the scope of the class in which they are declared.
 Friend functions were documented to work this way in the old Annotated
 \&\*(C+ Reference Manual, and versions of G++ before 4.1 always worked
-that way.  However, in \s-1ISO\s0 \*(C+ a friend function that is not declared
+that way.  However, in \s-1ISO \*(C+\s0 a friend function that is not declared
 in an enclosing scope can only be found using argument dependent
 lookup.  This option causes friends to be injected as they were in
 earlier releases.
@@ -2167,12 +2176,12 @@
 errors if these functions are not inlined everywhere they are called.
 .IP "\fB\-fms\-extensions\fR" 4
 .IX Item "-fms-extensions"
-Disable Wpedantic warnings about constructs used in \s-1MFC\s0, such as implicit
+Disable Wpedantic warnings about constructs used in \s-1MFC,\s0 such as implicit
 int and getting a pointer to member function via non-standard syntax.
 .IP "\fB\-fno\-nonansi\-builtins\fR" 4
 .IX Item "-fno-nonansi-builtins"
 Disable built-in declarations of functions that are not mandated by
-\&\s-1ANSI/ISO\s0 C.  These include \f(CW\*(C`ffs\*(C'\fR, \f(CW\*(C`alloca\*(C'\fR, \f(CW\*(C`_exit\*(C'\fR,
+\&\s-1ANSI/ISO C. \s0 These include \f(CW\*(C`ffs\*(C'\fR, \f(CW\*(C`alloca\*(C'\fR, \f(CW\*(C`_exit\*(C'\fR,
 \&\f(CW\*(C`index\*(C'\fR, \f(CW\*(C`bzero\*(C'\fR, \f(CW\*(C`conjf\*(C'\fR, and other related functions.
 .IP "\fB\-fnothrow\-opt\fR" 4
 .IX Item "-fnothrow-opt"
@@ -2246,7 +2255,7 @@
 .IX Item "-ftemplate-depth=n"
 Set the maximum instantiation depth for template classes to \fIn\fR.
 A limit on the template instantiation depth is needed to detect
-endless recursions during template class instantiation.  \s-1ANSI/ISO\s0 \*(C+
+endless recursions during template class instantiation.  \s-1ANSI/ISO \*(C+\s0
 conforming programs must not rely on a maximum depth greater than 17
 (changed to 1024 in \*(C+11).  The default value is 900, as the compiler
 can run out of stack space before hitting 1024 in some situations.
@@ -2277,7 +2286,7 @@
 The effect of this is that \s-1GCC\s0 may, effectively, mark inline methods with
 \&\f(CW\*(C`_\|_attribute_\|_ ((visibility ("hidden")))\*(C'\fR so that they do not
 appear in the export table of a \s-1DSO\s0 and do not require a \s-1PLT\s0 indirection
-when used within the \s-1DSO\s0.  Enabling this option can have a dramatic effect
+when used within the \s-1DSO. \s0 Enabling this option can have a dramatic effect
 on load and link times of a \s-1DSO\s0 as it massively reduces the size of the
 dynamic export table when the library makes heavy use of templates.
 .Sp
@@ -2389,9 +2398,9 @@
 In addition, these optimization, warning, and code generation options
 have meanings only for \*(C+ programs:
 .IP "\fB\-Wabi\fR (C, Objective-C, \*(C+ and Objective\-\*(C+ only)" 4
-.IX Item "-Wabi (C, Objective-C,  and Objective- only)"
+.IX Item "-Wabi (C, Objective-C, and Objective- only)"
 Warn when G++ generates code that is probably not compatible with the
-vendor-neutral \*(C+ \s-1ABI\s0.  Although an effort has been made to warn about
+vendor-neutral \*(C+ \s-1ABI. \s0 Although an effort has been made to warn about
 all such cases, there are probably some cases that are not warned about,
 even though G++ is generating incompatible code.  There may also be
 cases where warnings are emitted even though the code that is generated
@@ -2604,7 +2613,7 @@
 \&\fB\-std=c++98\fR, \fB\-std=gnu++98\fR, \fB\-std=gnu++11\fR,
 \&\fB\-std=gnu++1y\fR.
 This option is off by default
-for \s-1ISO\s0 \*(C+11 onwards (\fB\-std=c++11\fR, ...).
+for \s-1ISO \*(C+11\s0 onwards (\fB\-std=c++11\fR, ...).
 .PP
 The following \fB\-W...\fR options are not affected by \fB\-Wall\fR.
 .IP "\fB\-Weffc++\fR (\*(C+ and Objective\-\*(C+ only)" 4
@@ -2716,7 +2725,7 @@
 .PP
 In this example, \fB\-fgnu\-runtime\fR is an option meant only for
 Objective-C and Objective\-\*(C+ programs; you can use the other options with
-any language supported by \s-1GCC\s0.
+any language supported by \s-1GCC.\s0
 .PP
 Note that since Objective-C is an extension of the C language, Objective-C
 compilations may also use options specific to the C front-end (e.g.,
@@ -2741,7 +2750,7 @@
 .IP "\fB\-fnext\-runtime\fR" 4
 .IX Item "-fnext-runtime"
 Generate output compatible with the NeXT runtime.  This is the default
-for NeXT-based systems, including Darwin and Mac \s-1OS\s0 X.  The macro
+for NeXT-based systems, including Darwin and Mac \s-1OS X. \s0 The macro
 \&\f(CW\*(C`_\|_NEXT_RUNTIME_\|_\*(C'\fR is predefined if (and only if) this option is
 used.
 .IP "\fB\-fno\-nil\-receivers\fR" 4
@@ -2758,7 +2767,7 @@
 case, Version 0 is the traditional (32\-bit) \s-1ABI\s0 without support for
 properties and other Objective-C 2.0 additions.  Version 1 is the
 traditional (32\-bit) \s-1ABI\s0 with support for properties and other
-Objective-C 2.0 additions.  Version 2 is the modern (64\-bit) \s-1ABI\s0.  If
+Objective-C 2.0 additions.  Version 2 is the modern (64\-bit) \s-1ABI. \s0 If
 nothing is specified, the default is Version 0 on 32\-bit target
 machines, and Version 2 on 64\-bit target machines.
 .IP "\fB\-fobjc\-call\-cxx\-cdtors\fR" 4
@@ -2782,7 +2791,7 @@
 the \f(CW\*(C`\- (void) .cxx_destruct\*(C'\fR methods are invoked immediately
 before the runtime deallocates an object instance.
 .Sp
-As of this writing, only the NeXT runtime on Mac \s-1OS\s0 X 10.4 and later has
+As of this writing, only the NeXT runtime on Mac \s-1OS X 10.4\s0 and later has
 support for invoking the \f(CW\*(C`\- (id) .cxx_construct\*(C'\fR and
 \&\f(CW\*(C`\- (void) .cxx_destruct\*(C'\fR methods.
 .IP "\fB\-fobjc\-direct\-dispatch\fR" 4
@@ -2797,7 +2806,7 @@
 \&\f(CW@throw\fR, \f(CW@catch\fR, \f(CW@finally\fR and
 \&\f(CW@synchronized\fR.  This option is available with both the \s-1GNU\s0
 runtime and the NeXT runtime (but not available in conjunction with
-the NeXT runtime on Mac \s-1OS\s0 X 10.2 and earlier).
+the NeXT runtime on Mac \s-1OS X 10.2\s0 and earlier).
 .IP "\fB\-fobjc\-gc\fR" 4
 .IX Item "-fobjc-gc"
 Enable garbage collection (\s-1GC\s0) in Objective-C and Objective\-\*(C+
@@ -2806,23 +2815,23 @@
 does not require special compiler flags.
 .IP "\fB\-fobjc\-nilcheck\fR" 4
 .IX Item "-fobjc-nilcheck"
-For the NeXT runtime with version 2 of the \s-1ABI\s0, check for a nil
+For the NeXT runtime with version 2 of the \s-1ABI,\s0 check for a nil
 receiver in method invocations before doing the actual method call.
 This is the default and can be disabled using
 \&\fB\-fno\-objc\-nilcheck\fR.  Class methods and super calls are never
 checked for nil in this way no matter what this flag is set to.
 Currently this flag does nothing when the \s-1GNU\s0 runtime, or an older
-version of the NeXT runtime \s-1ABI\s0, is used.
+version of the NeXT runtime \s-1ABI,\s0 is used.
 .IP "\fB\-fobjc\-std=objc1\fR" 4
 .IX Item "-fobjc-std=objc1"
 Conform to the language syntax of Objective-C 1.0, the language
-recognized by \s-1GCC\s0 4.0.  This only affects the Objective-C additions to
+recognized by \s-1GCC 4.0. \s0 This only affects the Objective-C additions to
 the C/\*(C+ language; it does not affect conformance to C/\*(C+ standards,
 which is controlled by the separate C/\*(C+ dialect option flags.  When
 this option is used with the Objective-C or Objective\-\*(C+ compiler,
-any Objective-C syntax that is not recognized by \s-1GCC\s0 4.0 is rejected.
+any Objective-C syntax that is not recognized by \s-1GCC 4.0\s0 is rejected.
 This is useful if you need to make sure that your Objective-C code can
-be compiled with older versions of \s-1GCC\s0.
+be compiled with older versions of \s-1GCC.\s0
 .IP "\fB\-freplace\-objc\-classes\fR" 4
 .IX Item "-freplace-objc-classes"
 Emit a special marker instructing \fB\f(BIld\fB\|(1)\fR not to statically link in
@@ -2831,7 +2840,7 @@
 debugging mode, where the object file in question may be recompiled and
 dynamically reloaded in the course of program execution, without the need
 to restart the program itself.  Currently, Fix-and-Continue functionality
-is only available in conjunction with the NeXT runtime on Mac \s-1OS\s0 X 10.3
+is only available in conjunction with the NeXT runtime on Mac \s-1OS X 10.3\s0
 and later.
 .IP "\fB\-fzero\-link\fR" 4
 .IX Item "-fzero-link"
@@ -2910,7 +2919,7 @@
 .IX Item "-fmessage-length=n"
 Try to format error messages so that they fit on lines of about \fIn\fR
 characters.  The default is 72 characters for \fBg++\fR and 0 for the rest of
-the front ends supported by \s-1GCC\s0.  If \fIn\fR is zero, then no
+the front ends supported by \s-1GCC. \s0 If \fIn\fR is zero, then no
 line-wrapping is done; each error message appears on a single
 line.
 .IP "\fB\-fdiagnostics\-show\-location=once\fR" 4
@@ -3018,7 +3027,7 @@
 may have been an error.
 .PP
 The following language-independent options do not enable specific
-warnings but control the kinds of diagnostics produced by \s-1GCC\s0.
+warnings but control the kinds of diagnostics produced by \s-1GCC.\s0
 .IP "\fB\-fsyntax\-only\fR" 4
 .IX Item "-fsyntax-only"
 Check the code for syntax errors, but don't do anything beyond that.
@@ -3084,14 +3093,14 @@
 .IP "\fB\-pedantic\fR" 4
 .IX Item "-pedantic"
 .PD
-Issue all the warnings demanded by strict \s-1ISO\s0 C and \s-1ISO\s0 \*(C+;
+Issue all the warnings demanded by strict \s-1ISO C\s0 and \s-1ISO \*(C+\s0;
 reject all programs that use forbidden extensions, and some other
-programs that do not follow \s-1ISO\s0 C and \s-1ISO\s0 \*(C+.  For \s-1ISO\s0 C, follows the
-version of the \s-1ISO\s0 C standard specified by any \fB\-std\fR option used.
+programs that do not follow \s-1ISO C\s0 and \s-1ISO \*(C+. \s0 For \s-1ISO C,\s0 follows the
+version of the \s-1ISO C\s0 standard specified by any \fB\-std\fR option used.
 .Sp
-Valid \s-1ISO\s0 C and \s-1ISO\s0 \*(C+ programs should compile properly with or without
+Valid \s-1ISO C\s0 and \s-1ISO \*(C+\s0 programs should compile properly with or without
 this option (though a rare few require \fB\-ansi\fR or a
-\&\fB\-std\fR option specifying the required version of \s-1ISO\s0 C).  However,
+\&\fB\-std\fR option specifying the required version of \s-1ISO C\s0).  However,
 without this option, certain \s-1GNU\s0 extensions and traditional C and \*(C+
 features are supported as well.  With this option, they are rejected.
 .Sp
@@ -3101,24 +3110,24 @@
 \&\f(CW\*(C`_\|_extension_\|_\*(C'\fR.  However, only system header files should use
 these escape routes; application programs should avoid them.
 .Sp
-Some users try to use \fB\-Wpedantic\fR to check programs for strict \s-1ISO\s0
-C conformance.  They soon find that it does not do quite what they want:
+Some users try to use \fB\-Wpedantic\fR to check programs for strict \s-1ISO
+C\s0 conformance.  They soon find that it does not do quite what they want:
 it finds some non-ISO practices, but not all\-\-\-only those for which
-\&\s-1ISO\s0 C \fIrequires\fR a diagnostic, and some others for which
+\&\s-1ISO C \s0\fIrequires\fR a diagnostic, and some others for which
 diagnostics have been added.
 .Sp
-A feature to report any failure to conform to \s-1ISO\s0 C might be useful in
+A feature to report any failure to conform to \s-1ISO C\s0 might be useful in
 some instances, but would require considerable additional work and would
 be quite different from \fB\-Wpedantic\fR.  We don't have plans to
 support such a feature in the near future.
 .Sp
 Where the standard specified with \fB\-std\fR represents a \s-1GNU\s0
 extended dialect of C, such as \fBgnu90\fR or \fBgnu99\fR, there is a
-corresponding \fIbase standard\fR, the version of \s-1ISO\s0 C on which the \s-1GNU\s0
+corresponding \fIbase standard\fR, the version of \s-1ISO C\s0 on which the \s-1GNU\s0
 extended dialect is based.  Warnings from \fB\-Wpedantic\fR are given
 where they are required by the base standard.  (It does not make sense
-for such warnings to be given only for features not in the specified \s-1GNU\s0
-C dialect, since by definition the \s-1GNU\s0 dialects of C include all
+for such warnings to be given only for features not in the specified \s-1GNU
+C\s0 dialect, since by definition the \s-1GNU\s0 dialects of C include all
 features the compiler supports with the given option, and there would be
 nothing to warn about.)
 .IP "\fB\-pedantic\-errors\fR" 4
@@ -3286,7 +3295,7 @@
 \&\fB\-ffreestanding\fR or \fB\-fno\-builtin\fR.
 .Sp
 The formats are checked against the format features supported by \s-1GNU\s0
-libc version 2.2.  These include all \s-1ISO\s0 C90 and C99 features, as well
+libc version 2.2.  These include all \s-1ISO C90\s0 and C99 features, as well
 as features from the Single Unix Specification and some \s-1BSD\s0 and \s-1GNU\s0
 extensions.  Other library implementations may not support all these
 features; \s-1GCC\s0 does not support warning about features that go beyond a
@@ -3398,12 +3407,12 @@
 Same as \fB\-Wimplicit\-int\fR and \fB\-Wimplicit\-function\-declaration\fR.
 This warning is enabled by \fB\-Wall\fR.
 .IP "\fB\-Wignored\-qualifiers\fR (C and \*(C+ only)" 4
-.IX Item "-Wignored-qualifiers (C and  only)"
+.IX Item "-Wignored-qualifiers (C and only)"
 Warn if the return type of a function has a type qualifier
-such as \f(CW\*(C`const\*(C'\fR.  For \s-1ISO\s0 C such a type qualifier has no effect,
+such as \f(CW\*(C`const\*(C'\fR.  For \s-1ISO C\s0 such a type qualifier has no effect,
 since the value returned by a function is not an lvalue.
 For \*(C+, the warning is only emitted for scalar types or \f(CW\*(C`void\*(C'\fR.
-\&\s-1ISO\s0 C prohibits qualified \f(CW\*(C`void\*(C'\fR return types on function
+\&\s-1ISO C\s0 prohibits qualified \f(CW\*(C`void\*(C'\fR return types on function
 definitions, so such return types always receive a warning
 even without this option.
 .Sp
@@ -3570,9 +3579,9 @@
 warning about an omitted enumeration code even if there is a
 \&\f(CW\*(C`default\*(C'\fR label.
 .IP "\fB\-Wsync\-nand\fR (C and \*(C+ only)" 4
-.IX Item "-Wsync-nand (C and  only)"
+.IX Item "-Wsync-nand (C and only)"
 Warn when \f(CW\*(C`_\|_sync_fetch_and_nand\*(C'\fR and \f(CW\*(C`_\|_sync_nand_and_fetch\*(C'\fR
-built-in functions are used.  These functions changed semantics in \s-1GCC\s0 4.4.
+built-in functions are used.  These functions changed semantics in \s-1GCC 4.4.\s0
 .IP "\fB\-Wtrigraphs\fR" 4
 .IX Item "-Wtrigraphs"
 Warn if any trigraphs are encountered that might change the meaning of
@@ -3609,7 +3618,7 @@
 .Sp
 To suppress this warning use the \fBunused\fR attribute.
 .IP "\fB\-Wunused\-local\-typedefs\fR (C, Objective-C, \*(C+ and Objective\-\*(C+ only)" 4
-.IX Item "-Wunused-local-typedefs (C, Objective-C,  and Objective- only)"
+.IX Item "-Wunused-local-typedefs (C, Objective-C, and Objective- only)"
 Warn when a typedef locally defined in a function is not used.
 This warning is enabled by \fB\-Wall\fR.
 .IP "\fB\-Wunused\-parameter\fR" 4
@@ -3716,7 +3725,7 @@
 .IP "\fB\-Wunknown\-pragmas\fR" 4
 .IX Item "-Wunknown-pragmas"
 Warn when a \f(CW\*(C`#pragma\*(C'\fR directive is encountered that is not understood by 
-\&\s-1GCC\s0.  If this command-line option is used, warnings are even issued
+\&\s-1GCC. \s0 If this command-line option is used, warnings are even issued
 for unknown pragmas in system header files.  This is not the case if
 the warnings are only enabled by the \fB\-Wall\fR command-line option.
 .IP "\fB\-Wno\-pragmas\fR" 4
@@ -3917,13 +3926,13 @@
 .IP "\fB\-Wtraditional\fR (C and Objective-C only)" 4
 .IX Item "-Wtraditional (C and Objective-C only)"
 Warn about certain constructs that behave differently in traditional and
-\&\s-1ISO\s0 C.  Also warn about \s-1ISO\s0 C constructs that have no traditional C
+\&\s-1ISO C. \s0 Also warn about \s-1ISO C\s0 constructs that have no traditional C
 equivalent, and/or problematic constructs that should be avoided.
 .RS 4
 .IP "\(bu" 4
 Macro parameters that appear within string literals in the macro body.
 In traditional C macro replacement takes place within string literals,
-but in \s-1ISO\s0 C it does not.
+but in \s-1ISO C\s0 it does not.
 .IP "\(bu" 4
 In traditional C, some preprocessor directives did not exist.
 Traditional preprocessors only considered a line to be a directive
@@ -3978,9 +3987,9 @@
 C causes serious problems.  This is a subset of the possible
 conversion warnings; for the full set use \fB\-Wtraditional\-conversion\fR.
 .IP "\(bu" 4
-Use of \s-1ISO\s0 C style function definitions.  This warning intentionally is
+Use of \s-1ISO C\s0 style function definitions.  This warning intentionally is
 \&\fInot\fR issued for prototype declarations or variadic functions
-because these \s-1ISO\s0 C features appear in your code when using
+because these \s-1ISO C\s0 features appear in your code when using
 libiberty's traditional C compatibility macros, \f(CW\*(C`PARAMS\*(C'\fR and
 \&\f(CW\*(C`VPARAMS\*(C'\fR.  This warning is also bypassed for nested functions
 because that feature is already a \s-1GCC\s0 extension and thus not relevant to
@@ -3998,9 +4007,9 @@
 .IP "\fB\-Wdeclaration\-after\-statement\fR (C and Objective-C only)" 4
 .IX Item "-Wdeclaration-after-statement (C and Objective-C only)"
 Warn when a declaration is found after a statement in a block.  This
-construct, known from \*(C+, was introduced with \s-1ISO\s0 C99 and is by default
-allowed in \s-1GCC\s0.  It is not supported by \s-1ISO\s0 C90 and was not supported by
-\&\s-1GCC\s0 versions before \s-1GCC\s0 3.0.
+construct, known from \*(C+, was introduced with \s-1ISO C99\s0 and is by default
+allowed in \s-1GCC. \s0 It is not supported by \s-1ISO C90\s0 and was not supported by
+\&\s-1GCC\s0 versions before \s-1GCC 3.0.  \s0
 .IP "\fB\-Wundef\fR" 4
 .IX Item "-Wundef"
 Warn if an undefined identifier is evaluated in an \fB#if\fR directive.
@@ -4077,7 +4086,7 @@
 .IP "\fB\-Wpointer\-arith\fR" 4
 .IX Item "-Wpointer-arith"
 Warn about anything that depends on the \*(L"size of\*(R" a function type or
-of \f(CW\*(C`void\*(C'\fR.  \s-1GNU\s0 C assigns these types a size of 1, for
+of \f(CW\*(C`void\*(C'\fR.  \s-1GNU C\s0 assigns these types a size of 1, for
 convenience in calculations with \f(CW\*(C`void *\*(C'\fR pointers and pointers
 to functions.  In \*(C+, warn also when an arithmetic operation involves
 \&\f(CW\*(C`NULL\*(C'\fR.  This warning is also enabled by \fB\-Wpedantic\fR.
@@ -4094,14 +4103,14 @@
 For example, warn if \f(CW\*(C`int malloc()\*(C'\fR is cast to \f(CW\*(C`anything *\*(C'\fR.
 .IP "\fB\-Wc++\-compat\fR (C and Objective-C only)" 4
 .IX Item "-Wc++-compat (C and Objective-C only)"
-Warn about \s-1ISO\s0 C constructs that are outside of the common subset of
-\&\s-1ISO\s0 C and \s-1ISO\s0 \*(C+, e.g. request for implicit conversion from
+Warn about \s-1ISO C\s0 constructs that are outside of the common subset of
+\&\s-1ISO C\s0 and \s-1ISO \*(C+,\s0 e.g. request for implicit conversion from
 \&\f(CW\*(C`void *\*(C'\fR to a pointer to non\-\f(CW\*(C`void\*(C'\fR type.
 .IP "\fB\-Wc++11\-compat\fR (\*(C+ and Objective\-\*(C+ only)" 4
 .IX Item "-Wc++11-compat ( and Objective- only)"
-Warn about \*(C+ constructs whose meaning differs between \s-1ISO\s0 \*(C+ 1998
-and \s-1ISO\s0 \*(C+ 2011, e.g., identifiers in \s-1ISO\s0 \*(C+ 1998 that are keywords
-in \s-1ISO\s0 \*(C+ 2011.  This warning turns on \fB\-Wnarrowing\fR and is
+Warn about \*(C+ constructs whose meaning differs between \s-1ISO \*(C+ 1998\s0
+and \s-1ISO \*(C+ 2011,\s0 e.g., identifiers in \s-1ISO \*(C+ 1998\s0 that are keywords
+in \s-1ISO \*(C+ 2011. \s0 This warning turns on \fB\-Wnarrowing\fR and is
 enabled by \fB\-Wall\fR.
 .IP "\fB\-Wcast\-qual\fR" 4
 .IX Item "-Wcast-qual"
@@ -4344,25 +4353,25 @@
 implementation-defined values, and should not be used in portable code.
 .IP "\fB\-Wnormalized=<none|id|nfc|nfkc>\fR" 4
 .IX Item "-Wnormalized=<none|id|nfc|nfkc>"
-In \s-1ISO\s0 C and \s-1ISO\s0 \*(C+, two identifiers are different if they are
+In \s-1ISO C\s0 and \s-1ISO \*(C+,\s0 two identifiers are different if they are
 different sequences of characters.  However, sometimes when characters
 outside the basic \s-1ASCII\s0 character set are used, you can have two
 different character sequences that look the same.  To avoid confusion,
-the \s-1ISO\s0 10646 standard sets out some \fInormalization rules\fR which
+the \s-1ISO 10646\s0 standard sets out some \fInormalization rules\fR which
 when applied ensure that two sequences that look the same are turned into
 the same sequence.  \s-1GCC\s0 can warn you if you are using identifiers that
 have not been normalized; this option controls that warning.
 .Sp
-There are four levels of warning supported by \s-1GCC\s0.  The default is
+There are four levels of warning supported by \s-1GCC. \s0 The default is
 \&\fB\-Wnormalized=nfc\fR, which warns about any identifier that is
-not in the \s-1ISO\s0 10646 \*(L"C\*(R" normalized form, \fI\s-1NFC\s0\fR.  \s-1NFC\s0 is the
+not in the \s-1ISO 10646 \*(L"C\*(R"\s0 normalized form, \fI\s-1NFC\s0\fR.  \s-1NFC\s0 is the
 recommended form for most uses.
 .Sp
 Unfortunately, there are some characters allowed in identifiers by
-\&\s-1ISO\s0 C and \s-1ISO\s0 \*(C+ that, when turned into \s-1NFC\s0, are not allowed in 
+\&\s-1ISO C\s0 and \s-1ISO \*(C+\s0 that, when turned into \s-1NFC,\s0 are not allowed in 
 identifiers.  That is, there's no way to use these symbols in portable
-\&\s-1ISO\s0 C or \*(C+ and have all your identifiers in \s-1NFC\s0.
-\&\fB\-Wnormalized=id\fR suppresses the warning for these characters.
+\&\s-1ISO C\s0 or \*(C+ and have all your identifiers in \s-1NFC.
+\&\s0\fB\-Wnormalized=id\fR suppresses the warning for these characters.
 It is hoped that future versions of the standards involved will correct
 this, which is why this option is not the default.
 .Sp
@@ -4371,11 +4380,11 @@
 are using some other normalization scheme (like \*(L"D\*(R"), because
 otherwise you can easily create bugs that are literally impossible to see.
 .Sp
-Some characters in \s-1ISO\s0 10646 have distinct meanings but look identical
+Some characters in \s-1ISO 10646\s0 have distinct meanings but look identical
 in some fonts or display methodologies, especially once formatting has
-been applied.  For instance \f(CW\*(C`\eu207F\*(C'\fR, \*(L"\s-1SUPERSCRIPT\s0 \s-1LATIN\s0 \s-1SMALL\s0
-\&\s-1LETTER\s0 N\*(R", displays just like a regular \f(CW\*(C`n\*(C'\fR that has been
-placed in a superscript.  \s-1ISO\s0 10646 defines the \fI\s-1NFKC\s0\fR
+been applied.  For instance \f(CW\*(C`\eu207F\*(C'\fR, \*(L"\s-1SUPERSCRIPT LATIN SMALL
+LETTER N\*(R",\s0 displays just like a regular \f(CW\*(C`n\*(C'\fR that has been
+placed in a superscript.  \s-1ISO 10646\s0 defines the \fI\s-1NFKC\s0\fR
 normalization scheme to convert all these into a standard form as
 well, and \s-1GCC\s0 warns if your code is not in \s-1NFKC\s0 if you use
 \&\fB\-Wnormalized=nfkc\fR.  This warning is comparable to warning
@@ -4429,9 +4438,9 @@
 .IP "\fB\-Wpacked\-bitfield\-compat\fR" 4
 .IX Item "-Wpacked-bitfield-compat"
 The 4.1, 4.2 and 4.3 series of \s-1GCC\s0 ignore the \f(CW\*(C`packed\*(C'\fR attribute
-on bit-fields of type \f(CW\*(C`char\*(C'\fR.  This has been fixed in \s-1GCC\s0 4.4 but
+on bit-fields of type \f(CW\*(C`char\*(C'\fR.  This has been fixed in \s-1GCC 4.4\s0 but
 the change can lead to differences in the structure layout.  \s-1GCC\s0
-informs you when the offset of such a field has changed in \s-1GCC\s0 4.4.
+informs you when the offset of such a field has changed in \s-1GCC 4.4.\s0
 For example there is no longer a 4\-bit padding between field \f(CW\*(C`a\*(C'\fR
 and \f(CW\*(C`b\*(C'\fR in this structure:
 .Sp
@@ -4478,7 +4487,7 @@
 .IP "\fB\-Wno\-invalid\-offsetof\fR (\*(C+ and Objective\-\*(C+ only)" 4
 .IX Item "-Wno-invalid-offsetof ( and Objective- only)"
 Suppress warnings from applying the \fBoffsetof\fR macro to a non-POD
-type.  According to the 1998 \s-1ISO\s0 \*(C+ standard, applying \fBoffsetof\fR
+type.  According to the 1998 \s-1ISO \*(C+\s0 standard, applying \fBoffsetof\fR
 to a non-POD type is undefined.  In existing \*(C+ implementations,
 however, \fBoffsetof\fR typically gives meaningful results even when
 applied to certain kinds of non-POD types (such as a simple
@@ -4505,12 +4514,12 @@
 .IP "\fB\-Wlong\-long\fR" 4
 .IX Item "-Wlong-long"
 Warn if \fBlong long\fR type is used.  This is enabled by either
-\&\fB\-Wpedantic\fR or \fB\-Wtraditional\fR in \s-1ISO\s0 C90 and \*(C+98
+\&\fB\-Wpedantic\fR or \fB\-Wtraditional\fR in \s-1ISO C90\s0 and \*(C+98
 modes.  To inhibit the warning messages, use \fB\-Wno\-long\-long\fR.
 .IP "\fB\-Wvariadic\-macros\fR" 4
 .IX Item "-Wvariadic-macros"
-Warn if variadic macros are used in pedantic \s-1ISO\s0 C90 mode, or the \s-1GNU\s0
-alternate syntax when in pedantic \s-1ISO\s0 C99 mode.  This is default.
+Warn if variadic macros are used in pedantic \s-1ISO C90\s0 mode, or the \s-1GNU\s0
+alternate syntax when in pedantic \s-1ISO C99\s0 mode.  This is default.
 To inhibit the warning messages, use \fB\-Wno\-variadic\-macros\fR.
 .IP "\fB\-Wvarargs\fR" 4
 .IX Item "-Wvarargs"
@@ -4573,7 +4582,7 @@
 using longer strings.
 .Sp
 The limit applies \fIafter\fR string constant concatenation, and does
-not count the trailing \s-1NUL\s0.  In C90, the limit was 509 characters; in
+not count the trailing \s-1NUL. \s0 In C90, the limit was 509 characters; in
 C99, it was raised to 4095.  \*(C+98 does not specify a normative
 minimum maximum, so we do not diagnose overlength strings in \*(C+.
 .Sp
@@ -4593,7 +4602,7 @@
 .IP "\fB\-g\fR" 4
 .IX Item "-g"
 Produce debugging information in the operating system's native format
-(stabs, \s-1COFF\s0, \s-1XCOFF\s0, or \s-1DWARF\s0 2).  \s-1GDB\s0 can work with this debugging
+(stabs, \s-1COFF, XCOFF,\s0 or \s-1DWARF 2\s0).  \s-1GDB\s0 can work with this debugging
 information.
 .Sp
 On most systems that use stabs format, \fB\-g\fR enables use of extra
@@ -4626,8 +4635,8 @@
 files.
 .IP "\fB\-ggdb\fR" 4
 .IX Item "-ggdb"
-Produce debugging information for use by \s-1GDB\s0.  This means to use the
-most expressive format available (\s-1DWARF\s0 2, stabs, or the native format
+Produce debugging information for use by \s-1GDB. \s0 This means to use the
+most expressive format available (\s-1DWARF 2,\s0 stabs, or the native format
 if neither of those are supported), including \s-1GDB\s0 extensions if at all
 possible.
 .IP "\fB\-gpubnames\fR" 4
@@ -4642,8 +4651,8 @@
 .IX Item "-gstabs"
 Produce debugging information in stabs format (if that is supported),
 without \s-1GDB\s0 extensions.  This is the format used by \s-1DBX\s0 on most \s-1BSD\s0
-systems.  On \s-1MIPS\s0, Alpha and System V Release 4 systems this option
-produces stabs debugging output that is not understood by \s-1DBX\s0 or \s-1SDB\s0.
+systems.  On \s-1MIPS,\s0 Alpha and System V Release 4 systems this option
+produces stabs debugging output that is not understood by \s-1DBX\s0 or \s-1SDB.\s0
 On System V Release 4 systems this option requires the \s-1GNU\s0 assembler.
 .IP "\fB\-feliminate\-unused\-debug\-symbols\fR" 4
 .IX Item "-feliminate-unused-debug-symbols"
@@ -4680,7 +4689,7 @@
 .IP "\fB\-gxcoff\fR" 4
 .IX Item "-gxcoff"
 Produce debugging information in \s-1XCOFF\s0 format (if that is supported).
-This is the format used by the \s-1DBX\s0 debugger on \s-1IBM\s0 \s-1RS/6000\s0 systems.
+This is the format used by the \s-1DBX\s0 debugger on \s-1IBM RS/6000\s0 systems.
 .IP "\fB\-gxcoff+\fR" 4
 .IX Item "-gxcoff+"
 Produce debugging information in \s-1XCOFF\s0 format (if that is supported),
@@ -4695,9 +4704,9 @@
 for most targets is 4.
 .Sp
 Note that with \s-1DWARF\s0 Version 2, some ports require and always
-use some non-conflicting \s-1DWARF\s0 3 extensions in the unwind tables.
+use some non-conflicting \s-1DWARF 3\s0 extensions in the unwind tables.
 .Sp
-Version 4 may require \s-1GDB\s0 7.0 and \fB\-fvar\-tracking\-assignments\fR
+Version 4 may require \s-1GDB 7.0\s0 and \fB\-fvar\-tracking\-assignments\fR
 for maximum benefit.
 .IP "\fB\-grecord\-gcc\-switches\fR" 4
 .IX Item "-grecord-gcc-switches"
@@ -4759,7 +4768,7 @@
 different from version 2), and it would have been too confusing.  That
 debug format is long obsolete, but the option cannot be changed now.
 Instead use an additional \fB\-g\fR\fIlevel\fR option to change the
-debug level for \s-1DWARF\s0.
+debug level for \s-1DWARF.\s0
 .IP "\fB\-gtoggle\fR" 4
 .IX Item "-gtoggle"
 Turn off generation of debug info, if leaving out this option
@@ -4807,7 +4816,7 @@
 .IX Item "-fsanitize=shift"
 This option enables checking that the result of a shift operation is
 not undefined.  Note that what exactly is considered undefined differs
-slightly between C and \*(C+, as well as between \s-1ISO\s0 C90 and C99, etc.
+slightly between C and \*(C+, as well as between \s-1ISO C90\s0 and C99, etc.
 .IP "\fB\-fsanitize=integer\-divide\-by\-zero\fR" 4
 .IX Item "-fsanitize=integer-divide-by-zero"
 Detect integer division by zero as well as \f(CW\*(C`INT_MIN / \-1\*(C'\fR division.
@@ -4900,9 +4909,9 @@
 other than debugging the compiler proper.
 .IP "\fB\-feliminate\-dwarf2\-dups\fR" 4
 .IX Item "-feliminate-dwarf2-dups"
-Compress \s-1DWARF\s0 2 debugging information by eliminating duplicated
+Compress \s-1DWARF 2\s0 debugging information by eliminating duplicated
 information about each symbol.  This option only makes sense when
-generating \s-1DWARF\s0 2 debugging information with \fB\-gdwarf\-2\fR.
+generating \s-1DWARF 2\s0 debugging information with \fB\-gdwarf\-2\fR.
 .IP "\fB\-femit\-struct\-debug\-baseonly\fR" 4
 .IX Item "-femit-struct-debug-baseonly"
 Emit debug information for struct-like types
@@ -4914,7 +4923,7 @@
 See \fB\-femit\-struct\-debug\-reduced\fR for a less aggressive option.
 See \fB\-femit\-struct\-debug\-detailed\fR for more detailed control.
 .Sp
-This option works only with \s-1DWARF\s0 2.
+This option works only with \s-1DWARF 2.\s0
 .IP "\fB\-femit\-struct\-debug\-reduced\fR" 4
 .IX Item "-femit-struct-debug-reduced"
 Emit debug information for struct-like types
@@ -4927,7 +4936,7 @@
 See \fB\-femit\-struct\-debug\-baseonly\fR for a more aggressive option.
 See \fB\-femit\-struct\-debug\-detailed\fR for more detailed control.
 .Sp
-This option works only with \s-1DWARF\s0 2.
+This option works only with \s-1DWARF 2.\s0
 .IP "\fB\-femit\-struct\-debug\-detailed\fR[\fB=\fR\fIspec-list\fR]" 4
 .IX Item "-femit-struct-debug-detailed[=spec-list]"
 Specify the struct-like types
@@ -4973,7 +4982,7 @@
 .Sp
 The default is \fB\-femit\-struct\-debug\-detailed=all\fR.
 .Sp
-This option works only with \s-1DWARF\s0 2.
+This option works only with \s-1DWARF 2.\s0
 .IP "\fB\-fno\-merge\-debug\-strings\fR" 4
 .IX Item "-fno-merge-debug-strings"
 Direct the linker to not merge together strings in the debugging
@@ -4987,8 +4996,8 @@
 information describing them as in \fI\fInew\fI\fR instead.
 .IP "\fB\-fno\-dwarf2\-cfi\-asm\fR" 4
 .IX Item "-fno-dwarf2-cfi-asm"
-Emit \s-1DWARF\s0 2 unwind info as compiler generated \f(CW\*(C`.eh_frame\*(C'\fR section
-instead of using \s-1GAS\s0 \f(CW\*(C`.cfi_*\*(C'\fR directives.
+Emit \s-1DWARF 2\s0 unwind info as compiler generated \f(CW\*(C`.eh_frame\*(C'\fR section
+instead of using \s-1GAS \s0\f(CW\*(C`.cfi_*\*(C'\fR directives.
 .IP "\fB\-p\fR" 4
 .IX Item "-p"
 Generate extra code to write profile information suitable for the
@@ -5145,7 +5154,7 @@
 .IX Item "-fdisable-kind-pass=range-list"
 .PD
 This is a set of options that are used to explicitly disable/enable
-optimization passes.  These options are intended for use for debugging \s-1GCC\s0.
+optimization passes.  These options are intended for use for debugging \s-1GCC.\s0
 Compiler users should use regular options for enabling/disabling
 passes instead.
 .RS 4
@@ -5616,7 +5625,7 @@
 When dumping pretty-printed trees, this option inhibits dumping the
 bodies of control structures.
 .Sp
-When dumping \s-1RTL\s0, print the \s-1RTL\s0 in slim (condensed) form instead of
+When dumping \s-1RTL,\s0 print the \s-1RTL\s0 in slim (condensed) form instead of
 the default LISP-like representation.
 .IP "\fBraw\fR" 4
 .IX Item "raw"
@@ -5651,7 +5660,7 @@
 Enable showing line numbers for statements.
 .IP "\fBuid\fR" 4
 .IX Item "uid"
-Enable showing the unique \s-1ID\s0 (\f(CW\*(C`DECL_UID\*(C'\fR) for each variable.
+Enable showing the unique \s-1ID \s0(\f(CW\*(C`DECL_UID\*(C'\fR) for each variable.
 .IP "\fBverbose\fR" 4
 .IX Item "verbose"
 Enable showing the tree dump for each statement.
@@ -5729,7 +5738,7 @@
 appending \fI.alias\fR to the source file name.
 .IP "\fBccp\fR" 4
 .IX Item "ccp"
-Dump each function after \s-1CCP\s0.  The file name is made by appending
+Dump each function after \s-1CCP. \s0 The file name is made by appending
 \&\fI.ccp\fR to the source file name.
 .IP "\fBstoreccp\fR" 4
 .IX Item "storeccp"
@@ -6139,7 +6148,7 @@
 is used when \s-1GCC\s0 itself is being built.)
 .IP "\fB\-fno\-eliminate\-unused\-debug\-types\fR" 4
 .IX Item "-fno-eliminate-unused-debug-types"
-Normally, when producing \s-1DWARF\s0 2 output, \s-1GCC\s0 avoids producing debug symbol 
+Normally, when producing \s-1DWARF 2\s0 output, \s-1GCC\s0 avoids producing debug symbol 
 output for types that are nowhere used in the source file being compiled.
 Sometimes it is useful to have \s-1GCC\s0 emit debugging
 information for all types declared in a compilation
@@ -6328,7 +6337,7 @@
 Disabled at levels \fB\-O\fR, \fB\-O2\fR, \fB\-O3\fR, \fB\-Os\fR.
 .IP "\fB\-fforward\-propagate\fR" 4
 .IX Item "-fforward-propagate"
-Perform a forward propagation pass on \s-1RTL\s0.  The pass tries to combine two
+Perform a forward propagation pass on \s-1RTL. \s0 The pass tries to combine two
 instructions and checks if the result can be simplified.  If loop unrolling
 is active, two passes are performed and the second is scheduled after
 loop unrolling.
@@ -6354,7 +6363,7 @@
 in many functions.  \fBIt also makes debugging impossible on
 some machines.\fR
 .Sp
-On some machines, such as the \s-1VAX\s0, this flag has no effect, because
+On some machines, such as the \s-1VAX,\s0 this flag has no effect, because
 the standard calling sequence automatically handles the frame pointer
 and nothing is saved by pretending it doesn't exist.  The
 machine-description macro \f(CW\*(C`FRAME_POINTER_REQUIRED\*(C'\fR controls
@@ -6473,7 +6482,7 @@
 In C, emit \f(CW\*(C`static\*(C'\fR functions that are declared \f(CW\*(C`inline\*(C'\fR
 into the object file, even if the function has been inlined into all
 of its callers.  This switch does not affect functions using the
-\&\f(CW\*(C`extern inline\*(C'\fR extension in \s-1GNU\s0 C90.  In \*(C+, emit any and all
+\&\f(CW\*(C`extern inline\*(C'\fR extension in \s-1GNU C90. \s0 In \*(C+, emit any and all
 inline functions into the object file.
 .IP "\fB\-fkeep\-static\-consts\fR" 4
 .IX Item "-fkeep-static-consts"
@@ -6538,7 +6547,7 @@
 .IP "\fB\-fno\-zero\-initialized\-in\-bss\fR" 4
 .IX Item "-fno-zero-initialized-in-bss"
 If the target supports a \s-1BSS\s0 section, \s-1GCC\s0 by default puts variables that
-are initialized to zero into \s-1BSS\s0.  This can save space in the resulting
+are initialized to zero into \s-1BSS. \s0 This can save space in the resulting
 code.
 .Sp
 This option turns off this behavior because some programs explicitly
@@ -6661,11 +6670,11 @@
 higher on architectures that support this.
 .IP "\fB\-fdce\fR" 4
 .IX Item "-fdce"
-Perform dead code elimination (\s-1DCE\s0) on \s-1RTL\s0.
+Perform dead code elimination (\s-1DCE\s0) on \s-1RTL.\s0
 Enabled by default at \fB\-O\fR and higher.
 .IP "\fB\-fdse\fR" 4
 .IX Item "-fdse"
-Perform dead store elimination (\s-1DSE\s0) on \s-1RTL\s0.
+Perform dead store elimination (\s-1DSE\s0) on \s-1RTL.\s0
 Enabled by default at \fB\-O\fR and higher.
 .IP "\fB\-fif\-conversion\fR" 4
 .IX Item "-fif-conversion"
@@ -7008,7 +7017,7 @@
 Perform full redundancy elimination (\s-1FRE\s0) on trees.  The difference
 between \s-1FRE\s0 and \s-1PRE\s0 is that \s-1FRE\s0 only considers expressions
 that are computed on all paths leading to the redundant computation.
-This analysis is faster than \s-1PRE\s0, though it exposes fewer redundancies.
+This analysis is faster than \s-1PRE,\s0 though it exposes fewer redundancies.
 This flag is enabled by default at \fB\-O\fR and higher.
 .IP "\fB\-ftree\-phiprop\fR" 4
 .IX Item "-ftree-phiprop"
@@ -7247,7 +7256,7 @@
 Enable the identity transformation for graphite.  For every SCoP we generate
 the polyhedral representation and transform it back to gimple.  Using
 \&\fB\-fgraphite\-identity\fR we can check the costs or benefits of the
-\&\s-1GIMPLE\s0 \-> \s-1GRAPHITE\s0 \-> \s-1GIMPLE\s0 transformation.  Some minimal optimizations
+\&\s-1GIMPLE \-\s0> \s-1GRAPHITE \-\s0> \s-1GIMPLE\s0 transformation.  Some minimal optimizations
 are also performed by the code generator CLooG, like index splitting and
 dead code elimination in loops.
 .IP "\fB\-floop\-nest\-optimize\fR" 4
@@ -7765,7 +7774,7 @@
 Constructs webs as commonly used for register allocation purposes and assign
 each web individual pseudo register.  This allows the register allocation pass
 to operate on pseudos directly, but also strengthens several other optimization
-passes, such as \s-1CSE\s0, loop optimizer and trivial dead code remover.  It can,
+passes, such as \s-1CSE,\s0 loop optimizer and trivial dead code remover.  It can,
 however, make debugging impossible, since variables no longer stay in a
 \&\*(L"home register\*(R".
 .Sp
@@ -7783,7 +7792,7 @@
 .IP "\fB\-flto[=\fR\fIn\fR\fB]\fR" 4
 .IX Item "-flto[=n]"
 This option runs the standard link-time optimizer.  When invoked
-with source code, it generates \s-1GIMPLE\s0 (one of \s-1GCC\s0's internal
+with source code, it generates \s-1GIMPLE \s0(one of \s-1GCC\s0's internal
 representations) and writes it to special \s-1ELF\s0 sections in the object
 file.  When the object files are linked together, all the function
 bodies are read from these \s-1ELF\s0 sections and instantiated as if they
@@ -7907,7 +7916,7 @@
 .Sp
 If \s-1LTO\s0 encounters objects with C linkage declared with incompatible
 types in separate translation units to be linked together (undefined
-behavior according to \s-1ISO\s0 C99 6.2.7), a non-fatal diagnostic may be
+behavior according to \s-1ISO C99 6.2.7\s0), a non-fatal diagnostic may be
 issued.  The behavior is still undefined at run time.  Similar
 diagnostics may be raised for other languages.
 .Sp
@@ -7930,7 +7939,7 @@
 If object files containing \s-1GIMPLE\s0 bytecode are stored in a library archive, say
 \&\fIlibfoo.a\fR, it is possible to extract and use them in an \s-1LTO\s0 link if you
 are using a linker with plugin support.  To create static libraries suitable
-for \s-1LTO\s0, use \fBgcc-ar\fR and \fBgcc-ranlib\fR instead of \fBar\fR
+for \s-1LTO,\s0 use \fBgcc-ar\fR and \fBgcc-ranlib\fR instead of \fBar\fR
 and \f(CW\*(C`ranlib\*(C'\fR; to show the symbols of object files with \s-1GIMPLE\s0 bytecode, use
 \&\fBgcc-nm\fR.  Those commands require that \fBar\fR, \fBranlib\fR
 and \fBnm\fR have been compiled with plugin support.  At link time, use the the
@@ -7964,7 +7973,7 @@
 attempt to generate bytecode that is portable between different
 types of hosts.  The bytecode files are versioned and there is a
 strict version check, so bytecode files generated in one version of
-\&\s-1GCC\s0 will not work with an older or newer version of \s-1GCC\s0.
+\&\s-1GCC\s0 will not work with an older or newer version of \s-1GCC.\s0
 .Sp
 Link-time optimization does not work well with generation of debugging
 information.  Combining \fB\-flto\fR with
@@ -8039,8 +8048,8 @@
 linking. This option is effective only when compiling with \fB\-flto\fR
 and is ignored at link time.
 .Sp
-\&\fB\-fno\-fat\-lto\-objects\fR improves compilation time over plain \s-1LTO\s0, but
-requires the complete toolchain to be aware of \s-1LTO\s0. It requires a linker with
+\&\fB\-fno\-fat\-lto\-objects\fR improves compilation time over plain \s-1LTO,\s0 but
+requires the complete toolchain to be aware of \s-1LTO.\s0 It requires a linker with
 linker plugin support for basic functionality.  Additionally,
 \&\fBnm\fR, \fBar\fR and \fBranlib\fR
 need to support linker plugins to allow a full-featured build environment
@@ -8144,15 +8153,15 @@
 .IP "\fB\-fexcess\-precision=\fR\fIstyle\fR" 4
 .IX Item "-fexcess-precision=style"
 This option allows further control over excess precision on machines
-where floating-point registers have more precision than the \s-1IEEE\s0
-\&\f(CW\*(C`float\*(C'\fR and \f(CW\*(C`double\*(C'\fR types and the processor does not
+where floating-point registers have more precision than the \s-1IEEE
+\&\s0\f(CW\*(C`float\*(C'\fR and \f(CW\*(C`double\*(C'\fR types and the processor does not
 support operations rounding to those types.  By default,
 \&\fB\-fexcess\-precision=fast\fR is in effect; this means that
 operations are carried out in the precision of the registers and that
 it is unpredictable when rounding to the types specified in the source
 code takes place.  When compiling C, if
 \&\fB\-fexcess\-precision=standard\fR is specified then excess
-precision follows the rules specified in \s-1ISO\s0 C99; in particular,
+precision follows the rules specified in \s-1ISO C99\s0; in particular,
 both casts and assignments cause values to be rounded to their
 semantic types (whereas \fB\-ffloat\-store\fR only affects
 assignments).  This option is enabled by default for C if a strict
@@ -8216,7 +8225,7 @@
 .IP "\fB\-fassociative\-math\fR" 4
 .IX Item "-fassociative-math"
 Allow re-association of operands in series of floating-point operations.
-This violates the \s-1ISO\s0 C and \*(C+ language standard by possibly changing
+This violates the \s-1ISO C\s0 and \*(C+ language standard by possibly changing
 computation result.  \s-1NOTE:\s0 re-ordering may change the sign of zero as
 well as ignore NaNs and inhibit or create underflow or overflow (and
 thus cannot be used on code that relies on rounding behavior like
@@ -8319,8 +8328,8 @@
 default is \fB\-fno\-cx\-limited\-range\fR, but is enabled by
 \&\fB\-ffast\-math\fR.
 .Sp
-This option controls the default setting of the \s-1ISO\s0 C99
-\&\f(CW\*(C`CX_LIMITED_RANGE\*(C'\fR pragma.  Nevertheless, the option applies to
+This option controls the default setting of the \s-1ISO C99
+\&\s0\f(CW\*(C`CX_LIMITED_RANGE\*(C'\fR pragma.  Nevertheless, the option applies to
 all languages.
 .IP "\fB\-fcx\-fortran\-rules\fR" 4
 .IX Item "-fcx-fortran-rules"
@@ -8576,7 +8585,7 @@
 .IP "\fBmax-gcse-insertion-ratio\fR" 4
 .IX Item "max-gcse-insertion-ratio"
 If the ratio of expression insertions to deletions is larger than this value
-for any expression, then \s-1RTL\s0 \s-1PRE\s0 inserts or removes the expression and thus
+for any expression, then \s-1RTL PRE\s0 inserts or removes the expression and thus
 leaves partially redundant computations in the instruction stream.  The default value is 20.
 .IP "\fBmax-pending-list-length\fR" 4
 .IX Item "max-pending-list-length"
@@ -8591,7 +8600,7 @@
 compilation time.
 .IP "\fBmax-inline-insns-single\fR" 4
 .IX Item "max-inline-insns-single"
-Several parameters control the tree inliner used in \s-1GCC\s0.
+Several parameters control the tree inliner used in \s-1GCC.\s0
 This number sets the maximum number of instructions (counted in \s-1GCC\s0's
 internal representation) in a single function that the tree inliner
 considers for inlining.  This only affects functions declared
@@ -8945,7 +8954,7 @@
 generation.
 .Sp
 The default is 30% + 70% * (\s-1RAM/1GB\s0) with an upper bound of 100% when
-\&\s-1RAM\s0 >= 1GB.  If \f(CW\*(C`getrlimit\*(C'\fR is available, the notion of \*(L"\s-1RAM\s0\*(R" is
+\&\s-1RAM \s0>= 1GB.  If \f(CW\*(C`getrlimit\*(C'\fR is available, the notion of \*(L"\s-1RAM\*(R"\s0 is
 the smallest of actual \s-1RAM\s0 and \f(CW\*(C`RLIMIT_DATA\*(C'\fR or \f(CW\*(C`RLIMIT_AS\*(C'\fR.  If
 \&\s-1GCC\s0 is not able to calculate \s-1RAM\s0 on a particular platform, the lower
 bound of 30% is used.  Setting this parameter and
@@ -8960,7 +8969,7 @@
 tuning this may improve compilation speed, and has no effect on code
 generation.
 .Sp
-The default is the smaller of \s-1RAM/8\s0, \s-1RLIMIT_RSS\s0, or a limit that
+The default is the smaller of \s-1RAM/8, RLIMIT_RSS,\s0 or a limit that
 tries to ensure that \s-1RLIMIT_DATA\s0 or \s-1RLIMIT_AS\s0 are not exceeded, but
 with a lower bound of 4096 (four megabytes) and an upper bound of
 131072 (128 megabytes).  If \s-1GCC\s0 is not able to calculate \s-1RAM\s0 on a
@@ -9278,7 +9287,7 @@
 The default value is 32.
 .IP "\fBlto-minpartition\fR" 4
 .IX Item "lto-minpartition"
-Size of minimal partition for \s-1WHOPR\s0 (in estimated instructions).
+Size of minimal partition for \s-1WHOPR \s0(in estimated instructions).
 This prevents expenses of splitting very small programs into too many
 partitions.
 .IP "\fBcxx-max-namespaces-for-diagnostic-help\fR" 4
@@ -9505,7 +9514,7 @@
 .IP "\fB\-Wtraditional\fR" 4
 .IX Item "-Wtraditional"
 Warn about certain constructs that behave differently in traditional and
-\&\s-1ISO\s0 C.  Also warn about \s-1ISO\s0 C constructs that have no traditional C
+\&\s-1ISO C. \s0 Also warn about \s-1ISO C\s0 constructs that have no traditional C
 equivalent, and problematic constructs which should be avoided.
 .IP "\fB\-Wundef\fR" 4
 .IX Item "-Wundef"
@@ -9558,7 +9567,7 @@
 responsible for the system library, you may want to see them.
 .IP "\fB\-w\fR" 4
 .IX Item "-w"
-Suppress all warnings, including those which \s-1GNU\s0 \s-1CPP\s0 issues by default.
+Suppress all warnings, including those which \s-1GNU CPP\s0 issues by default.
 .IP "\fB\-pedantic\fR" 4
 .IX Item "-pedantic"
 Issue all the mandatory diagnostics listed in the C standard.  Some of
@@ -9698,10 +9707,10 @@
 \&\f(CW\*(C`#pragma GCC pch_preprocess "\f(CIfilename\f(CW"\*(C'\fR in the output to mark
 the place where the precompiled header was found, and its \fIfilename\fR.
 When \fB\-fpreprocessed\fR is in use, \s-1GCC\s0 recognizes this \f(CW\*(C`#pragma\*(C'\fR
-and loads the \s-1PCH\s0.
+and loads the \s-1PCH.\s0
 .Sp
 This option is off by default, because the resulting preprocessed output
-is only really suitable as input to \s-1GCC\s0.  It is switched on by
+is only really suitable as input to \s-1GCC. \s0 It is switched on by
 \&\fB\-save\-temps\fR.
 .Sp
 You should not write this \f(CW\*(C`#pragma\*(C'\fR in your own code, but it is
@@ -9754,7 +9763,7 @@
 .el .IP "\f(CWiso9899:1990\fR" 4
 .IX Item "iso9899:1990"
 .PD
-The \s-1ISO\s0 C standard from 1990.  \fBc90\fR is the customary shorthand for
+The \s-1ISO C\s0 standard from 1990.  \fBc90\fR is the customary shorthand for
 this version of the standard.
 .Sp
 The \fB\-ansi\fR option is equivalent to \fB\-std=c90\fR.
@@ -9776,7 +9785,7 @@
 .el .IP "\f(CWc9x\fR" 4
 .IX Item "c9x"
 .PD
-The revised \s-1ISO\s0 C standard, published in December 1999.  Before
+The revised \s-1ISO C\s0 standard, published in December 1999.  Before
 publication, this was known as C9X.
 .ie n .IP """iso9899:2011""" 4
 .el .IP "\f(CWiso9899:2011\fR" 4
@@ -9789,7 +9798,7 @@
 .el .IP "\f(CWc1x\fR" 4
 .IX Item "c1x"
 .PD
-The revised \s-1ISO\s0 C standard, published in December 2011.  Before
+The revised \s-1ISO C\s0 standard, published in December 2011.  Before
 publication, this was known as C1X.
 .ie n .IP """gnu90""" 4
 .el .IP "\f(CWgnu90\fR" 4
@@ -9821,7 +9830,7 @@
 .ie n .IP """c++98""" 4
 .el .IP "\f(CWc++98\fR" 4
 .IX Item "c++98"
-The 1998 \s-1ISO\s0 \*(C+ standard plus amendments.
+The 1998 \s-1ISO \*(C+\s0 standard plus amendments.
 .ie n .IP """gnu++98""" 4
 .el .IP "\f(CWgnu++98\fR" 4
 .IX Item "gnu++98"
@@ -9947,7 +9956,7 @@
 .IP "\fB\-fextended\-identifiers\fR" 4
 .IX Item "-fextended-identifiers"
 Accept universal character names in identifiers.  This option is
-experimental; in a future version of \s-1GCC\s0, it will be enabled by
+experimental; in a future version of \s-1GCC,\s0 it will be enabled by
 default for C99 and \*(C+.
 .IP "\fB\-fno\-canonical\-system\-headers\fR" 4
 .IX Item "-fno-canonical-system-headers"
@@ -9974,7 +9983,7 @@
 ignored.  The default is 8.
 .IP "\fB\-fdebug\-cpp\fR" 4
 .IX Item "-fdebug-cpp"
-This option is only useful for debugging \s-1GCC\s0.  When used with
+This option is only useful for debugging \s-1GCC. \s0 When used with
 \&\fB\-E\fR, dumps debugging information about location maps.  Every
 token in the output is preceded by the dump of the map its location
 belongs to.  The dump of the map holding the location of a token would
@@ -10007,12 +10016,12 @@
 .IP "\fB\-fexec\-charset=\fR\fIcharset\fR" 4
 .IX Item "-fexec-charset=charset"
 Set the execution character set, used for string and character
-constants.  The default is \s-1UTF\-8\s0.  \fIcharset\fR can be any encoding
+constants.  The default is \s-1UTF\-8.  \s0\fIcharset\fR can be any encoding
 supported by the system's \f(CW\*(C`iconv\*(C'\fR library routine.
 .IP "\fB\-fwide\-exec\-charset=\fR\fIcharset\fR" 4
 .IX Item "-fwide-exec-charset=charset"
 Set the wide execution character set, used for wide string and
-character constants.  The default is \s-1UTF\-32\s0 or \s-1UTF\-16\s0, whichever
+character constants.  The default is \s-1UTF\-32\s0 or \s-1UTF\-16,\s0 whichever
 corresponds to the width of \f(CW\*(C`wchar_t\*(C'\fR.  As with
 \&\fB\-fexec\-charset\fR, \fIcharset\fR can be any encoding supported
 by the system's \f(CW\*(C`iconv\*(C'\fR library routine; however, you will have
@@ -10020,9 +10029,9 @@
 .IP "\fB\-finput\-charset=\fR\fIcharset\fR" 4
 .IX Item "-finput-charset=charset"
 Set the input character set, used for translation from the character
-set of the input file to the source character set used by \s-1GCC\s0.  If the
+set of the input file to the source character set used by \s-1GCC. \s0 If the
 locale does not specify, or \s-1GCC\s0 cannot get this information from the
-locale, the default is \s-1UTF\-8\s0.  This can be overridden by either the locale
+locale, the default is \s-1UTF\-8. \s0 This can be overridden by either the locale
 or this command line option.  Currently the command line option takes
 precedence if there's a conflict.  \fIcharset\fR can be any encoding
 supported by the system's \f(CW\*(C`iconv\*(C'\fR library routine.
@@ -10059,7 +10068,7 @@
 .IX Item "-dCHARS"
 \&\fI\s-1CHARS\s0\fR is a sequence of one or more of the following characters,
 and must not be preceded by a space.  Other characters are interpreted
-by the compiler proper, or reserved for future versions of \s-1GCC\s0, and so
+by the compiler proper, or reserved for future versions of \s-1GCC,\s0 and so
 are silently ignored.  If you specify characters whose behavior
 conflicts, the result is undefined.
 .RS 4
@@ -10135,12 +10144,12 @@
 .IP "\fB\-traditional\-cpp\fR" 4
 .IX Item "-traditional-cpp"
 Try to imitate the behavior of old-fashioned C preprocessors, as
-opposed to \s-1ISO\s0 C preprocessors.
+opposed to \s-1ISO C\s0 preprocessors.
 .IP "\fB\-trigraphs\fR" 4
 .IX Item "-trigraphs"
 Process trigraph sequences.
 These are three-character sequences, all starting with \fB??\fR, that
-are defined by \s-1ISO\s0 C to stand for single characters.  For example,
+are defined by \s-1ISO C\s0 to stand for single characters.  For example,
 \&\fB??/\fR stands for \fB\e\fR, so \fB'??/n'\fR is a character
 constant for a newline.  By default, \s-1GCC\s0 ignores trigraphs, but in
 standard-conforming modes it converts them.  See the \fB\-std\fR and
@@ -10166,7 +10175,7 @@
 preprocessing anything.
 .IP "\fB\-v\fR" 4
 .IX Item "-v"
-Verbose mode.  Print out \s-1GNU\s0 \s-1CPP\s0's version number at the beginning of
+Verbose mode.  Print out \s-1GNU CPP\s0's version number at the beginning of
 execution, and report the final form of the include path.
 .IP "\fB\-H\fR" 4
 .IX Item "-H"
@@ -10181,7 +10190,7 @@
 .IP "\fB\-\-version\fR" 4
 .IX Item "--version"
 .PD
-Print out \s-1GNU\s0 \s-1CPP\s0's version number.  With one dash, proceed to
+Print out \s-1GNU CPP\s0's version number.  With one dash, proceed to
 preprocess as normal.  With two dashes, exit immediately.
 .SS "Passing Options to the Assembler"
 .IX Subsection "Passing Options to the Assembler"
@@ -10622,7 +10631,7 @@
 .Sp
 The default depends on the specific target configuration.  Note that
 the \s-1LP64\s0 and \s-1ILP32\s0 ABIs are not link-compatible; you must compile your
-entire program with the same \s-1ABI\s0, and link with a compatible set of libraries.
+entire program with the same \s-1ABI,\s0 and link with a compatible set of libraries.
 .IP "\fB\-mbig\-endian\fR" 4
 .IX Item "-mbig-endian"
 Generate big-endian code.  This is the default when \s-1GCC\s0 is configured for an
@@ -10839,7 +10848,7 @@
 round-to-nearest-or-even rounding mode.
 .IP "\fBint\fR" 4
 .IX Item "int"
-This is the mode used to perform integer calculations in the \s-1FPU\s0, e.g.
+This is the mode used to perform integer calculations in the \s-1FPU,\s0 e.g.
 integer multiply, or integer multiply-and-accumulate.
 .RE
 .RS 4
@@ -10901,13 +10910,13 @@
 .RS 4
 .IP "\fB\s-1ARC600\s0\fR" 4
 .IX Item "ARC600"
-Compile for \s-1ARC600\s0.  Aliases: \fB\-mA6\fR, \fB\-mARC600\fR.
+Compile for \s-1ARC600. \s0 Aliases: \fB\-mA6\fR, \fB\-mARC600\fR.
 .IP "\fB\s-1ARC601\s0\fR" 4
 .IX Item "ARC601"
-Compile for \s-1ARC601\s0.  Alias: \fB\-mARC601\fR.
+Compile for \s-1ARC601. \s0 Alias: \fB\-mARC601\fR.
 .IP "\fB\s-1ARC700\s0\fR" 4
 .IX Item "ARC700"
-Compile for \s-1ARC700\s0.  Aliases: \fB\-mA7\fR, \fB\-mARC700\fR.
+Compile for \s-1ARC700. \s0 Aliases: \fB\-mA7\fR, \fB\-mARC700\fR.
 This is the default when configured with \fB\-\-with\-cpu=arc700\fR.
 .RE
 .RS 4
@@ -10934,7 +10943,7 @@
 supported.  This is always enabled for \fB\-mcpu=ARC700\fR.
 .IP "\fB\-mno\-mpy\fR" 4
 .IX Item "-mno-mpy"
-Do not generate mpy instructions for \s-1ARC700\s0.
+Do not generate mpy instructions for \s-1ARC700.\s0
 .IP "\fB\-mmul32x16\fR" 4
 .IX Item "-mmul32x16"
 Generate 32x16 bit multiply and mac instructions.
@@ -10959,7 +10968,7 @@
 implementation.
 .IP "\fB\-msimd\fR" 4
 .IX Item "-msimd"
-Enable generation of \s-1ARC\s0 \s-1SIMD\s0 instructions via target-specific
+Enable generation of \s-1ARC SIMD\s0 instructions via target-specific
 builtins.  Only valid for \fB\-mcpu=ARC700\fR.
 .IP "\fB\-msoft\-float\fR" 4
 .IX Item "-msoft-float"
@@ -11126,7 +11135,7 @@
 the case.
 .IP "\fB\-mlra\fR" 4
 .IX Item "-mlra"
-Enable Local Register Allocation.  This is still experimental for \s-1ARC\s0,
+Enable Local Register Allocation.  This is still experimental for \s-1ARC,\s0
 so by default the compiler uses standard reload
 (i.e. \fB\-mno\-lra\fR).
 .IP "\fB\-mlra\-priority\-none\fR" 4
@@ -11232,7 +11241,7 @@
 are now deprecated and will be removed in a future release:
 .IP "\fB\-margonaut\fR" 4
 .IX Item "-margonaut"
-Obsolete \s-1FPX\s0.
+Obsolete \s-1FPX.\s0
 .IP "\fB\-mbig\-endian\fR" 4
 .IX Item "-mbig-endian"
 .PD 0
@@ -11296,7 +11305,7 @@
 architectures:
 .IP "\fB\-mabi=\fR\fIname\fR" 4
 .IX Item "-mabi=name"
-Generate code for the specified \s-1ABI\s0.  Permissible values are: \fBapcs-gnu\fR,
+Generate code for the specified \s-1ABI. \s0 Permissible values are: \fBapcs-gnu\fR,
 \&\fBatpcs\fR, \fBaapcs\fR, \fBaapcs-linux\fR and \fBiwmmxt\fR.
 .IP "\fB\-mapcs\-frame\fR" 4
 .IX Item "-mapcs-frame"
@@ -11339,7 +11348,7 @@
 .Sp
 The default depends on the specific target configuration.  Note that
 the hard-float and soft-float ABIs are not link-compatible; you must
-compile your entire program with the same \s-1ABI\s0, and link with a
+compile your entire program with the same \s-1ABI,\s0 and link with a
 compatible set of libraries.
 .IP "\fB\-mlittle\-endian\fR" 4
 .IX Item "-mlittle-endian"
@@ -11468,7 +11477,7 @@
 (e.g. \fB\-mfpu\fR=\fBneon\fR), note that floating-point
 operations are not generated by \s-1GCC\s0's auto-vectorization pass unless
 \&\fB\-funsafe\-math\-optimizations\fR is also specified.  This is
-because \s-1NEON\s0 hardware does not fully implement the \s-1IEEE\s0 754 standard for
+because \s-1NEON\s0 hardware does not fully implement the \s-1IEEE 754\s0 standard for
 floating-point arithmetic (in particular denormal values are treated as
 zero), so the use of \s-1NEON\s0 instructions may lead to a loss of precision.
 .IP "\fB\-mfp16\-format=\fR\fIname\fR" 4
@@ -11541,7 +11550,7 @@
 .IX Item "-mpic-data-is-text-relative"
 Assume that each data segments are relative to text segment at load time.
 Therefore, it permits addressing data using PC-relative operations.
-This option is on by default for targets other than VxWorks \s-1RTP\s0.
+This option is on by default for targets other than VxWorks \s-1RTP.\s0
 .IP "\fB\-mpoke\-function\-name\fR" 4
 .IX Item "-mpoke-function-name"
 Write the name of each function into the text section, directly
@@ -11721,33 +11730,33 @@
 .ie n .IP """avr6""" 4
 .el .IP "\f(CWavr6\fR" 4
 .IX Item "avr6"
-\&\*(L"Enhanced\*(R" devices with 3\-byte \s-1PC\s0, i.e. with more than 128@tie{}KiB of program memory.
+\&\*(L"Enhanced\*(R" devices with 3\-byte \s-1PC,\s0 i.e. with more than 128@tie{}KiB of program memory.
 \&\fImcu\fR\f(CW@tie\fR{}= \f(CW\*(C`atmega2560\*(C'\fR, \f(CW\*(C`atmega2561\*(C'\fR.
 .ie n .IP """avrxmega2""" 4
 .el .IP "\f(CWavrxmega2\fR" 4
 .IX Item "avrxmega2"
-\&\*(L"\s-1XMEGA\s0\*(R" devices with more than 8@tie{}KiB and up to 64@tie{}KiB of program memory.
+\&\*(L"\s-1XMEGA\*(R"\s0 devices with more than 8@tie{}KiB and up to 64@tie{}KiB of program memory.
 \&\fImcu\fR\f(CW@tie\fR{}= \f(CW\*(C`atmxt112sl\*(C'\fR, \f(CW\*(C`atmxt224\*(C'\fR, \f(CW\*(C`atmxt224e\*(C'\fR, \f(CW\*(C`atmxt336s\*(C'\fR, \f(CW\*(C`atxmega16a4\*(C'\fR, \f(CW\*(C`atxmega16a4u\*(C'\fR, \f(CW\*(C`atxmega16c4\*(C'\fR, \f(CW\*(C`atxmega16d4\*(C'\fR, \f(CW\*(C`atxmega32a4\*(C'\fR, \f(CW\*(C`atxmega32a4u\*(C'\fR, \f(CW\*(C`atxmega32c4\*(C'\fR, \f(CW\*(C`atxmega32d4\*(C'\fR, \f(CW\*(C`atxmega32e5\*(C'\fR, \f(CW\*(C`atxmega32x1\*(C'\fR.
 .ie n .IP """avrxmega4""" 4
 .el .IP "\f(CWavrxmega4\fR" 4
 .IX Item "avrxmega4"
-\&\*(L"\s-1XMEGA\s0\*(R" devices with more than 64@tie{}KiB and up to 128@tie{}KiB of program memory.
+\&\*(L"\s-1XMEGA\*(R"\s0 devices with more than 64@tie{}KiB and up to 128@tie{}KiB of program memory.
 \&\fImcu\fR\f(CW@tie\fR{}= \f(CW\*(C`atxmega64a3\*(C'\fR, \f(CW\*(C`atxmega64a3u\*(C'\fR, \f(CW\*(C`atxmega64a4u\*(C'\fR, \f(CW\*(C`atxmega64b1\*(C'\fR, \f(CW\*(C`atxmega64b3\*(C'\fR, \f(CW\*(C`atxmega64c3\*(C'\fR, \f(CW\*(C`atxmega64d3\*(C'\fR, \f(CW\*(C`atxmega64d4\*(C'\fR.
 .ie n .IP """avrxmega5""" 4
 .el .IP "\f(CWavrxmega5\fR" 4
 .IX Item "avrxmega5"
-\&\*(L"\s-1XMEGA\s0\*(R" devices with more than 64@tie{}KiB and up to 128@tie{}KiB of program memory and more than 64@tie{}KiB of \s-1RAM\s0.
-\&\fImcu\fR\f(CW@tie\fR{}= \f(CW\*(C`atxmega64a1\*(C'\fR, \f(CW\*(C`atxmega64a1u\*(C'\fR.
+\&\*(L"\s-1XMEGA\*(R"\s0 devices with more than 64@tie{}KiB and up to 128@tie{}KiB of program memory and more than 64@tie{}KiB of \s-1RAM.
+\&\s0\fImcu\fR\f(CW@tie\fR{}= \f(CW\*(C`atxmega64a1\*(C'\fR, \f(CW\*(C`atxmega64a1u\*(C'\fR.
 .ie n .IP """avrxmega6""" 4
 .el .IP "\f(CWavrxmega6\fR" 4
 .IX Item "avrxmega6"
-\&\*(L"\s-1XMEGA\s0\*(R" devices with more than 128@tie{}KiB of program memory.
+\&\*(L"\s-1XMEGA\*(R"\s0 devices with more than 128@tie{}KiB of program memory.
 \&\fImcu\fR\f(CW@tie\fR{}= \f(CW\*(C`atmxt540s\*(C'\fR, \f(CW\*(C`atmxt540sreva\*(C'\fR, \f(CW\*(C`atxmega128a3\*(C'\fR, \f(CW\*(C`atxmega128a3u\*(C'\fR, \f(CW\*(C`atxmega128b1\*(C'\fR, \f(CW\*(C`atxmega128b3\*(C'\fR, \f(CW\*(C`atxmega128c3\*(C'\fR, \f(CW\*(C`atxmega128d3\*(C'\fR, \f(CW\*(C`atxmega128d4\*(C'\fR, \f(CW\*(C`atxmega192a3\*(C'\fR, \f(CW\*(C`atxmega192a3u\*(C'\fR, \f(CW\*(C`atxmega192c3\*(C'\fR, \f(CW\*(C`atxmega192d3\*(C'\fR, \f(CW\*(C`atxmega256a3\*(C'\fR, \f(CW\*(C`atxmega256a3b\*(C'\fR, \f(CW\*(C`atxmega256a3bu\*(C'\fR, \f(CW\*(C`atxmega256a3u\*(C'\fR, \f(CW\*(C`atxmega256c3\*(C'\fR, \f(CW\*(C`atxmega256d3\*(C'\fR, \f(CW\*(C`atxmega384c3\*(C'\fR, \f(CW\*(C`atxmega384d3\*(C'\fR.
 .ie n .IP """avrxmega7""" 4
 .el .IP "\f(CWavrxmega7\fR" 4
 .IX Item "avrxmega7"
-\&\*(L"\s-1XMEGA\s0\*(R" devices with more than 128@tie{}KiB of program memory and more than 64@tie{}KiB of \s-1RAM\s0.
-\&\fImcu\fR\f(CW@tie\fR{}= \f(CW\*(C`atxmega128a1\*(C'\fR, \f(CW\*(C`atxmega128a1u\*(C'\fR, \f(CW\*(C`atxmega128a4u\*(C'\fR.
+\&\*(L"\s-1XMEGA\*(R"\s0 devices with more than 128@tie{}KiB of program memory and more than 64@tie{}KiB of \s-1RAM.
+\&\s0\fImcu\fR\f(CW@tie\fR{}= \f(CW\*(C`atxmega128a1\*(C'\fR, \f(CW\*(C`atxmega128a1u\*(C'\fR, \f(CW\*(C`atxmega128a4u\*(C'\fR.
 .ie n .IP """avr1""" 4
 .el .IP "\f(CWavr1\fR" 4
 .IX Item "avr1"
@@ -11950,7 +11959,7 @@
 .IX Item "-<Switch/case dispatch tables. If you do not want such dispatch>"
 tables you can specify the \fB\-fno\-jump\-tables\fR command-line option.
 .IP "\-<C and \*(C+ constructors/destructors called during startup/shutdown.>" 4
-.IX Item "-<C and  constructors/destructors called during startup/shutdown.>"
+.IX Item "-<C and constructors/destructors called during startup/shutdown.>"
 .PD 0
 .ie n .IP "\-<If the tools hit a ""gs()"" modifier explained above.>" 4
 .el .IP "\-<If the tools hit a \f(CWgs()\fR modifier explained above.>" 4
@@ -12131,7 +12140,7 @@
 .el .IP "\f(CW_\|_AVR_SP8_\|_\fR" 4
 .IX Item "__AVR_SP8__"
 .PD
-The device has the \s-1SPH\s0 (high part of stack pointer) special function
+The device has the \s-1SPH \s0(high part of stack pointer) special function
 register or has an 8\-bit stack pointer, respectively.
 The definition of these macros is affected by \f(CW\*(C`\-mmcu=\*(C'\fR and
 in the cases of \f(CW\*(C`\-mmcu=avr2\*(C'\fR and \f(CW\*(C`\-mmcu=avr25\*(C'\fR also
@@ -12164,7 +12173,7 @@
 .el .IP "\f(CW_\|_AVR_ERRATA_SKIP_JMP_CALL_\|_\fR" 4
 .IX Item "__AVR_ERRATA_SKIP_JMP_CALL__"
 .PD
-Some \s-1AVR\s0 devices (\s-1AT90S8515\s0, ATmega103) must not skip 32\-bit
+Some \s-1AVR\s0 devices (\s-1AT90S8515,\s0 ATmega103) must not skip 32\-bit
 instructions because of a hardware erratum.  Skip instructions are
 \&\f(CW\*(C`SBRS\*(C'\fR, \f(CW\*(C`SBRC\*(C'\fR, \f(CW\*(C`SBIS\*(C'\fR, \f(CW\*(C`SBIC\*(C'\fR and \f(CW\*(C`CPSE\*(C'\fR.
 The second macro is only defined if \f(CW\*(C`_\|_AVR_HAVE_JMP_CALL_\|_\*(C'\fR is also
@@ -12172,7 +12181,7 @@
 .ie n .IP """_\|_AVR_ISA_RMW_\|_""" 4
 .el .IP "\f(CW_\|_AVR_ISA_RMW_\|_\fR" 4
 .IX Item "__AVR_ISA_RMW__"
-The device has Read-Modify-Write instructions (\s-1XCH\s0, \s-1LAC\s0, \s-1LAS\s0 and \s-1LAT\s0).
+The device has Read-Modify-Write instructions (\s-1XCH, LAC, LAS\s0 and \s-1LAT\s0).
 .ie n .IP """_\|_AVR_SFR_OFFSET_\|_=\f(CIoffset\f(CW""" 4
 .el .IP "\f(CW_\|_AVR_SFR_OFFSET_\|_=\f(CIoffset\f(CW\fR" 4
 .IX Item "__AVR_SFR_OFFSET__=offset"
@@ -12356,8 +12365,8 @@
 This option can only be used in conjunction with \fB\-mmulticore\fR.
 .IP "\fB\-msdram\fR" 4
 .IX Item "-msdram"
-Build a standalone application for \s-1SDRAM\s0. Proper start files and
-link scripts are used to put the application into \s-1SDRAM\s0, and the macro
+Build a standalone application for \s-1SDRAM.\s0 Proper start files and
+link scripts are used to put the application into \s-1SDRAM,\s0 and the macro
 \&\f(CW\*(C`_\|_BFIN_SDRAM\*(C'\fR is defined.
 The loader should initialize \s-1SDRAM\s0 before loading the application.
 .IP "\fB\-micplb\fR" 4
@@ -12416,7 +12425,7 @@
 .PD
 Generate code for the specified architecture.  The choices for
 \&\fIarchitecture-type\fR are \fBv3\fR, \fBv8\fR and \fBv10\fR for
-respectively \s-1ETRAX\s0\ 4, \s-1ETRAX\s0\ 100, and \s-1ETRAX\s0\ 100\ \s-1LX\s0.
+respectively \s-1ETRAX\s0\ 4, \s-1ETRAX\s0\ 100, and \s-1ETRAX\s0\ 100\ \s-1LX.\s0
 Default is \fBv0\fR except for cris-axis-linux-gnu, where the default is
 \&\fBv10\fR.
 .IP "\fB\-mtune=\fR\fIarchitecture-type\fR" 4
@@ -12509,7 +12518,7 @@
 With \fB\-fpic\fR and \fB\-fPIC\fR, don't generate (do generate)
 instruction sequences that load addresses for functions from the \s-1PLT\s0 part
 of the \s-1GOT\s0 rather than (traditional on other architectures) calls to the
-\&\s-1PLT\s0.  The default is \fB\-mgotplt\fR.
+\&\s-1PLT. \s0 The default is \fB\-mgotplt\fR.
 .IP "\fB\-melf\fR" 4
 .IX Item "-melf"
 Legacy no-op option only recognized with the cris-axis-elf and
@@ -12565,7 +12574,7 @@
 These options are defined for all architectures running the Darwin operating
 system.
 .PP
-\&\s-1FSF\s0 \s-1GCC\s0 on Darwin does not create \*(L"fat\*(R" object files; it creates
+\&\s-1FSF GCC\s0 on Darwin does not create \*(L"fat\*(R" object files; it creates
 an object file for the single architecture that \s-1GCC\s0 was built to
 target.  Apple's \s-1GCC\s0 on Darwin does create \*(L"fat\*(R" files if multiple
 \&\fB\-arch\fR options are used; it does so by running the compiler or
@@ -12625,7 +12634,7 @@
 .IX Item "-gused"
 Emit debugging information for symbols that are used.  For stabs
 debugging format, this enables \fB\-feliminate\-unused\-debug\-symbols\fR.
-This is by default \s-1ON\s0.
+This is by default \s-1ON.\s0
 .IP "\fB\-gfull\fR" 4
 .IX Item "-gfull"
 Emit debugging information for all symbols and types.
@@ -12701,7 +12710,7 @@
 This causes \s-1GCC\s0's output file to have the \fI\s-1ALL\s0\fR subtype, instead of
 one controlled by the \fB\-mcpu\fR or \fB\-march\fR option.
 .IP "\fB\-allowable_client\fR  \fIclient_name\fR" 4
-.IX Item "-allowable_client  client_name"
+.IX Item "-allowable_client client_name"
 .PD 0
 .IP "\fB\-client_name\fR" 4
 .IX Item "-client_name"
@@ -12875,7 +12884,7 @@
 .IP "\fB\-mieee\-with\-inexact\fR" 4
 .IX Item "-mieee-with-inexact"
 This is like \fB\-mieee\fR except the generated code also maintains
-the \s-1IEEE\s0 \fIinexact-flag\fR.  Turning on this option causes the
+the \s-1IEEE \s0\fIinexact-flag\fR.  Turning on this option causes the
 generated code to implement fully-compliant \s-1IEEE\s0 math.  In addition to
 \&\f(CW\*(C`_IEEE_FP\*(C'\fR, \f(CW\*(C`_IEEE_FP_EXACT\*(C'\fR is defined as a preprocessor
 macro.  On some Alpha implementations the resulting code may execute
@@ -13001,8 +13010,8 @@
 .IP "\fB\-mno\-max\fR" 4
 .IX Item "-mno-max"
 .PD
-Indicate whether \s-1GCC\s0 should generate code to use the optional \s-1BWX\s0,
-\&\s-1CIX\s0, \s-1FIX\s0 and \s-1MAX\s0 instruction sets.  The default is to use the instruction
+Indicate whether \s-1GCC\s0 should generate code to use the optional \s-1BWX,
+CIX, FIX\s0 and \s-1MAX\s0 instruction sets.  The default is to use the instruction
 sets supported by the \s-1CPU\s0 type specified via \fB\-mcpu=\fR option or that
 of the \s-1CPU\s0 on which \s-1GCC\s0 was built if none is specified.
 .IP "\fB\-mfloat\-vax\fR" 4
@@ -13011,7 +13020,7 @@
 .IP "\fB\-mfloat\-ieee\fR" 4
 .IX Item "-mfloat-ieee"
 .PD
-Generate code that uses (does not use) \s-1VAX\s0 F and G floating-point
+Generate code that uses (does not use) \s-1VAX F\s0 and G floating-point
 arithmetic instead of \s-1IEEE\s0 single and double precision.
 .IP "\fB\-mexplicit\-relocs\fR" 4
 .IX Item "-mexplicit-relocs"
@@ -13066,7 +13075,7 @@
 Set the instruction set and instruction scheduling parameters for
 machine type \fIcpu_type\fR.  You can specify either the \fB\s-1EV\s0\fR
 style name or the corresponding chip number.  \s-1GCC\s0 supports scheduling
-parameters for the \s-1EV4\s0, \s-1EV5\s0 and \s-1EV6\s0 family of processors and
+parameters for the \s-1EV4, EV5\s0 and \s-1EV6\s0 family of processors and
 chooses the default values for the instruction set from the processor
 you specify.  If you do not specify a processor type, \s-1GCC\s0 defaults
 to the processor on which the compiler was built.
@@ -13111,14 +13120,14 @@
 .IP "\fB21264\fR" 4
 .IX Item "21264"
 .PD
-Schedules as an \s-1EV6\s0 and supports the \s-1BWX\s0, \s-1FIX\s0, and \s-1MAX\s0 extensions.
+Schedules as an \s-1EV6\s0 and supports the \s-1BWX, FIX,\s0 and \s-1MAX\s0 extensions.
 .IP "\fBev67\fR" 4
 .IX Item "ev67"
 .PD 0
 .IP "\fB21264a\fR" 4
 .IX Item "21264a"
 .PD
-Schedules as an \s-1EV6\s0 and supports the \s-1BWX\s0, \s-1CIX\s0, \s-1FIX\s0, and \s-1MAX\s0 extensions.
+Schedules as an \s-1EV6\s0 and supports the \s-1BWX, CIX, FIX,\s0 and \s-1MAX\s0 extensions.
 .RE
 .RS 4
 .Sp
@@ -13159,9 +13168,9 @@
 .IX Item "main"
 .PD
 The compiler contains estimates of the number of clock cycles for
-\&\*(L"typical\*(R" \s-1EV4\s0 & \s-1EV5\s0 hardware for the Level 1, 2 & 3 caches
+\&\*(L"typical\*(R" \s-1EV4 & EV5\s0 hardware for the Level 1, 2 & 3 caches
 (also called Dcache, Scache, and Bcache), as well as to main memory.
-Note that L3 is only valid for \s-1EV5\s0.
+Note that L3 is only valid for \s-1EV5.\s0
 .RE
 .RS 4
 .RE
@@ -13234,7 +13243,7 @@
 Do not use multiply and add/subtract instructions.
 .IP "\fB\-mfdpic\fR" 4
 .IX Item "-mfdpic"
-Select the \s-1FDPIC\s0 \s-1ABI\s0, which uses function descriptors to represent
+Select the \s-1FDPIC ABI,\s0 which uses function descriptors to represent
 pointers to functions.  Without any PIC/PIE\-related options, it
 implies \fB\-fPIE\fR.  With \fB\-fpic\fR or \fB\-fpie\fR, it
 assumes \s-1GOT\s0 entries and small data are within a 12\-bit range from the
@@ -13257,7 +13266,7 @@
 Do not assume a large \s-1TLS\s0 segment when generating thread-local code.
 .IP "\fB\-mgprel\-ro\fR" 4
 .IX Item "-mgprel-ro"
-Enable the use of \f(CW\*(C`GPREL\*(C'\fR relocations in the \s-1FDPIC\s0 \s-1ABI\s0 for data
+Enable the use of \f(CW\*(C`GPREL\*(C'\fR relocations in the \s-1FDPIC ABI\s0 for data
 that is known to be in read-only sections.  It's enabled by default,
 except for \fB\-fpic\fR or \fB\-fpie\fR: even though it may help
 make the global offset table smaller, it trades 1 instruction for 4.
@@ -13401,7 +13410,7 @@
 These \fB\-m\fR options are defined for GNU/Linux targets:
 .IP "\fB\-mglibc\fR" 4
 .IX Item "-mglibc"
-Use the \s-1GNU\s0 C library.  This is the default except
+Use the \s-1GNU C\s0 library.  This is the default except
 on \fB*\-*\-linux\-*uclibc*\fR and \fB*\-*\-linux\-*android*\fR targets.
 .IP "\fB\-muclibc\fR" 4
 .IX Item "-muclibc"
@@ -13480,8 +13489,8 @@
 .IP "\fB\-march=\fR\fIarchitecture-type\fR" 4
 .IX Item "-march=architecture-type"
 Generate code for the specified architecture.  The choices for
-\&\fIarchitecture-type\fR are \fB1.0\fR for \s-1PA\s0 1.0, \fB1.1\fR for \s-1PA\s0
-1.1, and \fB2.0\fR for \s-1PA\s0 2.0 processors.  Refer to
+\&\fIarchitecture-type\fR are \fB1.0\fR for \s-1PA 1.0, \s0\fB1.1\fR for \s-1PA
+1.1,\s0 and \fB2.0\fR for \s-1PA 2.0\s0 processors.  Refer to
 \&\fI/usr/lib/sched.models\fR on an HP-UX system to determine the proper
 architecture option for your machine.  Code compiled for lower numbered
 architectures runs on higher numbered architectures, but not the
@@ -13509,7 +13518,7 @@
 .IP "\fB\-mdisable\-indexing\fR" 4
 .IX Item "-mdisable-indexing"
 Prevent the compiler from using indexing address modes.  This avoids some
-rather obscure problems when compiling \s-1MIG\s0 generated code under \s-1MACH\s0.
+rather obscure problems when compiling \s-1MIG\s0 generated code under \s-1MACH.\s0
 .IP "\fB\-mno\-space\-regs\fR" 4
 .IX Item "-mno-space-regs"
 Generate code that assumes the target has no space registers.  This allows
@@ -13566,17 +13575,17 @@
 \&\fB\-msoft\-float\fR changes the calling convention in the output file;
 therefore, it is only useful if you compile \fIall\fR of a program with
 this option.  In particular, you need to compile \fIlibgcc.a\fR, the
-library that comes with \s-1GCC\s0, with \fB\-msoft\-float\fR in order for
+library that comes with \s-1GCC,\s0 with \fB\-msoft\-float\fR in order for
 this to work.
 .IP "\fB\-msio\fR" 4
 .IX Item "-msio"
-Generate the predefine, \f(CW\*(C`_SIO\*(C'\fR, for server \s-1IO\s0.  The default is
+Generate the predefine, \f(CW\*(C`_SIO\*(C'\fR, for server \s-1IO. \s0 The default is
 \&\fB\-mwsio\fR.  This generates the predefines, \f(CW\*(C`_\|_hp9000s700\*(C'\fR,
-\&\f(CW\*(C`_\|_hp9000s700_\|_\*(C'\fR and \f(CW\*(C`_WSIO\*(C'\fR, for workstation \s-1IO\s0.  These
+\&\f(CW\*(C`_\|_hp9000s700_\|_\*(C'\fR and \f(CW\*(C`_WSIO\*(C'\fR, for workstation \s-1IO. \s0 These
 options are available under HP-UX and HI-UX.
 .IP "\fB\-mgnu\-ld\fR" 4
 .IX Item "-mgnu-ld"
-Use options specific to \s-1GNU\s0 \fBld\fR.
+Use options specific to \s-1GNU \s0\fBld\fR.
 This passes \fB\-shared\fR to \fBld\fR when
 building a shared library.  It is the default when \s-1GCC\s0 is configured,
 explicitly or implicitly, with the \s-1GNU\s0 linker.  This option does not
@@ -13586,10 +13595,10 @@
 \&\fB\-\-with\-ld\fR configure option, \s-1GCC\s0's program search path, and
 finally by the user's \fB\s-1PATH\s0\fR.  The linker used by \s-1GCC\s0 can be printed
 using \fBwhich `gcc \-print\-prog\-name=ld`\fR.  This option is only available
-on the 64\-bit HP-UX \s-1GCC\s0, i.e. configured with \fBhppa*64*\-*\-hpux*\fR.
+on the 64\-bit HP-UX \s-1GCC,\s0 i.e. configured with \fBhppa*64*\-*\-hpux*\fR.
 .IP "\fB\-mhp\-ld\fR" 4
 .IX Item "-mhp-ld"
-Use options specific to \s-1HP\s0 \fBld\fR.
+Use options specific to \s-1HP \s0\fBld\fR.
 This passes \fB\-b\fR to \fBld\fR when building
 a shared library and passes \fB+Accept TypeMismatch\fR to \fBld\fR on all
 links.  It is the default when \s-1GCC\s0 is configured, explicitly or
@@ -13600,7 +13609,7 @@
 configure option, \s-1GCC\s0's program search path, and finally by the user's
 \&\fB\s-1PATH\s0\fR.  The linker used by \s-1GCC\s0 can be printed using \fBwhich
 `gcc \-print\-prog\-name=ld`\fR.  This option is only available on the 64\-bit
-HP-UX \s-1GCC\s0, i.e. configured with \fBhppa*64*\-*\-hpux*\fR.
+HP-UX \s-1GCC,\s0 i.e. configured with \fBhppa*64*\-*\-hpux*\fR.
 .IP "\fB\-mlong\-calls\fR" 4
 .IX Item "-mlong-calls"
 Generate code that uses long call sequences.  This ensures that a call
@@ -13609,7 +13618,7 @@
 of the function or translation unit, as the case may be, exceeds a
 predefined limit set by the branch type being used.  The limits for
 normal calls are 7,600,000 and 240,000 bytes, respectively for the
-\&\s-1PA\s0 2.0 and \s-1PA\s0 1.X architectures.  Sibcalls are always limited at
+\&\s-1PA 2.0\s0 and \s-1PA 1.X\s0 architectures.  Sibcalls are always limited at
 240,000 bytes.
 .Sp
 Distances are measured from the beginning of functions when using the
@@ -13637,7 +13646,7 @@
 \&\fB95\fR for HP-UX 10.10 though to 11.00, and \fB98\fR for HP-UX 11.11
 and later.
 .Sp
-\&\fB\-munix=93\fR provides the same predefines as \s-1GCC\s0 3.3 and 3.4.
+\&\fB\-munix=93\fR provides the same predefines as \s-1GCC 3.3\s0 and 3.4.
 \&\fB\-munix=95\fR provides additional predefines for \f(CW\*(C`XOPEN_UNIX\*(C'\fR
 and \f(CW\*(C`_XOPEN_SOURCE_EXTENDED\*(C'\fR, and the startfile \fIunix95.o\fR.
 \&\fB\-munix=98\fR provides additional predefines for \f(CW\*(C`_XOPEN_UNIX\*(C'\fR,
@@ -13701,10 +13710,10 @@
 of the selected instruction set.
 .IP "\fBi386\fR" 4
 .IX Item "i386"
-Original Intel i386 \s-1CPU\s0.
+Original Intel i386 \s-1CPU.\s0
 .IP "\fBi486\fR" 4
 .IX Item "i486"
-Intel i486 \s-1CPU\s0.  (No scheduling is implemented for this chip.)
+Intel i486 \s-1CPU.  \s0(No scheduling is implemented for this chip.)
 .IP "\fBi586\fR" 4
 .IX Item "i586"
 .PD 0
@@ -13714,10 +13723,10 @@
 Intel Pentium \s-1CPU\s0 with no \s-1MMX\s0 support.
 .IP "\fBpentium-mmx\fR" 4
 .IX Item "pentium-mmx"
-Intel Pentium \s-1MMX\s0 \s-1CPU\s0, based on Pentium core with \s-1MMX\s0 instruction set support.
+Intel Pentium \s-1MMX CPU,\s0 based on Pentium core with \s-1MMX\s0 instruction set support.
 .IP "\fBpentiumpro\fR" 4
 .IX Item "pentiumpro"
-Intel Pentium Pro \s-1CPU\s0.
+Intel Pentium Pro \s-1CPU.\s0
 .IP "\fBi686\fR" 4
 .IX Item "i686"
 When used with \fB\-march\fR, the Pentium Pro
@@ -13725,7 +13734,7 @@
 When used with \fB\-mtune\fR, it has the same meaning as \fBgeneric\fR.
 .IP "\fBpentium2\fR" 4
 .IX Item "pentium2"
-Intel Pentium \s-1II\s0 \s-1CPU\s0, based on Pentium Pro core with \s-1MMX\s0 instruction set
+Intel Pentium \s-1II CPU,\s0 based on Pentium Pro core with \s-1MMX\s0 instruction set
 support.
 .IP "\fBpentium3\fR" 4
 .IX Item "pentium3"
@@ -13733,83 +13742,83 @@
 .IP "\fBpentium3m\fR" 4
 .IX Item "pentium3m"
 .PD
-Intel Pentium \s-1III\s0 \s-1CPU\s0, based on Pentium Pro core with \s-1MMX\s0 and \s-1SSE\s0 instruction
+Intel Pentium \s-1III CPU,\s0 based on Pentium Pro core with \s-1MMX\s0 and \s-1SSE\s0 instruction
 set support.
 .IP "\fBpentium-m\fR" 4
 .IX Item "pentium-m"
-Intel Pentium M; low-power version of Intel Pentium \s-1III\s0 \s-1CPU\s0
-with \s-1MMX\s0, \s-1SSE\s0 and \s-1SSE2\s0 instruction set support.  Used by Centrino notebooks.
+Intel Pentium M; low-power version of Intel Pentium \s-1III CPU\s0
+with \s-1MMX, SSE\s0 and \s-1SSE2\s0 instruction set support.  Used by Centrino notebooks.
 .IP "\fBpentium4\fR" 4
 .IX Item "pentium4"
 .PD 0
 .IP "\fBpentium4m\fR" 4
 .IX Item "pentium4m"
 .PD
-Intel Pentium 4 \s-1CPU\s0 with \s-1MMX\s0, \s-1SSE\s0 and \s-1SSE2\s0 instruction set support.
+Intel Pentium 4 \s-1CPU\s0 with \s-1MMX, SSE\s0 and \s-1SSE2\s0 instruction set support.
 .IP "\fBprescott\fR" 4
 .IX Item "prescott"
-Improved version of Intel Pentium 4 \s-1CPU\s0 with \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0 and \s-1SSE3\s0 instruction
+Improved version of Intel Pentium 4 \s-1CPU\s0 with \s-1MMX, SSE, SSE2\s0 and \s-1SSE3\s0 instruction
 set support.
 .IP "\fBnocona\fR" 4
 .IX Item "nocona"
-Improved version of Intel Pentium 4 \s-1CPU\s0 with 64\-bit extensions, \s-1MMX\s0, \s-1SSE\s0,
-\&\s-1SSE2\s0 and \s-1SSE3\s0 instruction set support.
+Improved version of Intel Pentium 4 \s-1CPU\s0 with 64\-bit extensions, \s-1MMX, SSE,
+SSE2\s0 and \s-1SSE3\s0 instruction set support.
 .IP "\fBcore2\fR" 4
 .IX Item "core2"
-Intel Core 2 \s-1CPU\s0 with 64\-bit extensions, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0 and \s-1SSSE3\s0
+Intel Core 2 \s-1CPU\s0 with 64\-bit extensions, \s-1MMX, SSE, SSE2, SSE3\s0 and \s-1SSSE3\s0
 instruction set support.
 .IP "\fBnehalem\fR" 4
 .IX Item "nehalem"
-Intel Nehalem \s-1CPU\s0 with 64\-bit extensions, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSSE3\s0,
-\&\s-1SSE4\s0.1, \s-1SSE4\s0.2 and \s-1POPCNT\s0 instruction set support.
+Intel Nehalem \s-1CPU\s0 with 64\-bit extensions, \s-1MMX, SSE, SSE2, SSE3, SSSE3,
+SSE4.1, SSE4.2\s0 and \s-1POPCNT\s0 instruction set support.
 .IP "\fBwestmere\fR" 4
 .IX Item "westmere"
-Intel Westmere \s-1CPU\s0 with 64\-bit extensions, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSSE3\s0,
-\&\s-1SSE4\s0.1, \s-1SSE4\s0.2, \s-1POPCNT\s0, \s-1AES\s0 and \s-1PCLMUL\s0 instruction set support.
+Intel Westmere \s-1CPU\s0 with 64\-bit extensions, \s-1MMX, SSE, SSE2, SSE3, SSSE3,
+SSE4.1, SSE4.2, POPCNT, AES\s0 and \s-1PCLMUL\s0 instruction set support.
 .IP "\fBsandybridge\fR" 4
 .IX Item "sandybridge"
-Intel Sandy Bridge \s-1CPU\s0 with 64\-bit extensions, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSSE3\s0,
-\&\s-1SSE4\s0.1, \s-1SSE4\s0.2, \s-1POPCNT\s0, \s-1AVX\s0, \s-1AES\s0 and \s-1PCLMUL\s0 instruction set support.
+Intel Sandy Bridge \s-1CPU\s0 with 64\-bit extensions, \s-1MMX, SSE, SSE2, SSE3, SSSE3,
+SSE4.1, SSE4.2, POPCNT, AVX, AES\s0 and \s-1PCLMUL\s0 instruction set support.
 .IP "\fBivybridge\fR" 4
 .IX Item "ivybridge"
-Intel Ivy Bridge \s-1CPU\s0 with 64\-bit extensions, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSSE3\s0,
-\&\s-1SSE4\s0.1, \s-1SSE4\s0.2, \s-1POPCNT\s0, \s-1AVX\s0, \s-1AES\s0, \s-1PCLMUL\s0, \s-1FSGSBASE\s0, \s-1RDRND\s0 and F16C
+Intel Ivy Bridge \s-1CPU\s0 with 64\-bit extensions, \s-1MMX, SSE, SSE2, SSE3, SSSE3,
+SSE4.1, SSE4.2, POPCNT, AVX, AES, PCLMUL, FSGSBASE, RDRND\s0 and F16C
 instruction set support.
 .IP "\fBhaswell\fR" 4
 .IX Item "haswell"
-Intel Haswell \s-1CPU\s0 with 64\-bit extensions, \s-1MOVBE\s0, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSSE3\s0,
-\&\s-1SSE4\s0.1, \s-1SSE4\s0.2, \s-1POPCNT\s0, \s-1AVX\s0, \s-1AVX2\s0, \s-1AES\s0, \s-1PCLMUL\s0, \s-1FSGSBASE\s0, \s-1RDRND\s0, \s-1FMA\s0,
-\&\s-1BMI\s0, \s-1BMI2\s0 and F16C instruction set support.
+Intel Haswell \s-1CPU\s0 with 64\-bit extensions, \s-1MOVBE, MMX, SSE, SSE2, SSE3, SSSE3,
+SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA,
+BMI, BMI2\s0 and F16C instruction set support.
 .IP "\fBbroadwell\fR" 4
 .IX Item "broadwell"
-Intel Broadwell \s-1CPU\s0 with 64\-bit extensions, \s-1MOVBE\s0, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSSE3\s0,
-\&\s-1SSE4\s0.1, \s-1SSE4\s0.2, \s-1POPCNT\s0, \s-1AVX\s0, \s-1AVX2\s0, \s-1AES\s0, \s-1PCLMUL\s0, \s-1FSGSBASE\s0, \s-1RDRND\s0, \s-1FMA\s0,
-\&\s-1BMI\s0, \s-1BMI2\s0, F16C, \s-1RDSEED\s0, \s-1ADCX\s0 and \s-1PREFETCHW\s0 instruction set support.
+Intel Broadwell \s-1CPU\s0 with 64\-bit extensions, \s-1MOVBE, MMX, SSE, SSE2, SSE3, SSSE3,
+SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA,
+BMI, BMI2, F16C, RDSEED, ADCX\s0 and \s-1PREFETCHW\s0 instruction set support.
 .IP "\fBbonnell\fR" 4
 .IX Item "bonnell"
-Intel Bonnell \s-1CPU\s0 with 64\-bit extensions, \s-1MOVBE\s0, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0 and \s-1SSSE3\s0
+Intel Bonnell \s-1CPU\s0 with 64\-bit extensions, \s-1MOVBE, MMX, SSE, SSE2, SSE3\s0 and \s-1SSSE3\s0
 instruction set support.
 .IP "\fBsilvermont\fR" 4
 .IX Item "silvermont"
-Intel Silvermont \s-1CPU\s0 with 64\-bit extensions, \s-1MOVBE\s0, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSSE3\s0,
-\&\s-1SSE4\s0.1, \s-1SSE4\s0.2, \s-1POPCNT\s0, \s-1AES\s0, \s-1PCLMUL\s0 and \s-1RDRND\s0 instruction set support.
+Intel Silvermont \s-1CPU\s0 with 64\-bit extensions, \s-1MOVBE, MMX, SSE, SSE2, SSE3, SSSE3,
+SSE4.1, SSE4.2, POPCNT, AES, PCLMUL\s0 and \s-1RDRND\s0 instruction set support.
 .IP "\fBk6\fR" 4
 .IX Item "k6"
-\&\s-1AMD\s0 K6 \s-1CPU\s0 with \s-1MMX\s0 instruction set support.
+\&\s-1AMD K6 CPU\s0 with \s-1MMX\s0 instruction set support.
 .IP "\fBk6\-2\fR" 4
 .IX Item "k6-2"
 .PD 0
 .IP "\fBk6\-3\fR" 4
 .IX Item "k6-3"
 .PD
-Improved versions of \s-1AMD\s0 K6 \s-1CPU\s0 with \s-1MMX\s0 and 3DNow! instruction set support.
+Improved versions of \s-1AMD K6 CPU\s0 with \s-1MMX\s0 and 3DNow! instruction set support.
 .IP "\fBathlon\fR" 4
 .IX Item "athlon"
 .PD 0
 .IP "\fBathlon-tbird\fR" 4
 .IX Item "athlon-tbird"
 .PD
-\&\s-1AMD\s0 Athlon \s-1CPU\s0 with \s-1MMX\s0, 3dNOW!, enhanced 3DNow! and \s-1SSE\s0 prefetch instructions
+\&\s-1AMD\s0 Athlon \s-1CPU\s0 with \s-1MMX,\s0 3dNOW!, enhanced 3DNow! and \s-1SSE\s0 prefetch instructions
 support.
 .IP "\fBathlon\-4\fR" 4
 .IX Item "athlon-4"
@@ -13819,7 +13828,7 @@
 .IP "\fBathlon-mp\fR" 4
 .IX Item "athlon-mp"
 .PD
-Improved \s-1AMD\s0 Athlon \s-1CPU\s0 with \s-1MMX\s0, 3DNow!, enhanced 3DNow! and full \s-1SSE\s0
+Improved \s-1AMD\s0 Athlon \s-1CPU\s0 with \s-1MMX,\s0 3DNow!, enhanced 3DNow! and full \s-1SSE\s0
 instruction set support.
 .IP "\fBk8\fR" 4
 .IX Item "k8"
@@ -13831,9 +13840,9 @@
 .IP "\fBathlon-fx\fR" 4
 .IX Item "athlon-fx"
 .PD
-Processors based on the \s-1AMD\s0 K8 core with x86\-64 instruction set support,
+Processors based on the \s-1AMD K8\s0 core with x86\-64 instruction set support,
 including the \s-1AMD\s0 Opteron, Athlon 64, and Athlon 64 \s-1FX\s0 processors.
-(This supersets \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, 3DNow!, enhanced 3DNow! and 64\-bit
+(This supersets \s-1MMX, SSE, SSE2,\s0 3DNow!, enhanced 3DNow! and 64\-bit
 instruction set extensions.)
 .IP "\fBk8\-sse3\fR" 4
 .IX Item "k8-sse3"
@@ -13843,7 +13852,7 @@
 .IP "\fBathlon64\-sse3\fR" 4
 .IX Item "athlon64-sse3"
 .PD
-Improved versions of \s-1AMD\s0 K8 cores with \s-1SSE3\s0 instruction set support.
+Improved versions of \s-1AMD K8\s0 cores with \s-1SSE3\s0 instruction set support.
 .IP "\fBamdfam10\fR" 4
 .IX Item "amdfam10"
 .PD 0
@@ -13851,56 +13860,56 @@
 .IX Item "barcelona"
 .PD
 CPUs based on \s-1AMD\s0 Family 10h cores with x86\-64 instruction set support.  (This
-supersets \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSE4A\s0, 3DNow!, enhanced 3DNow!, \s-1ABM\s0 and 64\-bit
+supersets \s-1MMX, SSE, SSE2, SSE3, SSE4A,\s0 3DNow!, enhanced 3DNow!, \s-1ABM\s0 and 64\-bit
 instruction set extensions.)
 .IP "\fBbdver1\fR" 4
 .IX Item "bdver1"
 CPUs based on \s-1AMD\s0 Family 15h cores with x86\-64 instruction set support.  (This
-supersets \s-1FMA4\s0, \s-1AVX\s0, \s-1XOP\s0, \s-1LWP\s0, \s-1AES\s0, \s-1PCL_MUL\s0, \s-1CX16\s0, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSE4A\s0,
-\&\s-1SSSE3\s0, \s-1SSE4\s0.1, \s-1SSE4\s0.2, \s-1ABM\s0 and 64\-bit instruction set extensions.)
+supersets \s-1FMA4, AVX, XOP, LWP, AES, PCL_MUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A,
+SSSE3, SSE4.1, SSE4.2, ABM\s0 and 64\-bit instruction set extensions.)
 .IP "\fBbdver2\fR" 4
 .IX Item "bdver2"
 \&\s-1AMD\s0 Family 15h core based CPUs with x86\-64 instruction set support.  (This
-supersets \s-1BMI\s0, \s-1TBM\s0, F16C, \s-1FMA\s0, \s-1FMA4\s0, \s-1AVX\s0, \s-1XOP\s0, \s-1LWP\s0, \s-1AES\s0, \s-1PCL_MUL\s0, \s-1CX16\s0, \s-1MMX\s0,
-\&\s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSE4A\s0, \s-1SSSE3\s0, \s-1SSE4\s0.1, \s-1SSE4\s0.2, \s-1ABM\s0 and 64\-bit instruction set 
+supersets \s-1BMI, TBM, F16C, FMA, FMA4, AVX, XOP, LWP, AES, PCL_MUL, CX16, MMX,
+SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM\s0 and 64\-bit instruction set 
 extensions.)
 .IP "\fBbdver3\fR" 4
 .IX Item "bdver3"
 \&\s-1AMD\s0 Family 15h core based CPUs with x86\-64 instruction set support.  (This
-supersets \s-1BMI\s0, \s-1TBM\s0, F16C, \s-1FMA\s0, \s-1FMA4\s0, \s-1FSGSBASE\s0, \s-1AVX\s0, \s-1XOP\s0, \s-1LWP\s0, \s-1AES\s0, 
-\&\s-1PCL_MUL\s0, \s-1CX16\s0, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSE4A\s0, \s-1SSSE3\s0, \s-1SSE4\s0.1, \s-1SSE4\s0.2, \s-1ABM\s0 and 
+supersets \s-1BMI, TBM, F16C, FMA, FMA4, FSGSBASE, AVX, XOP, LWP, AES, 
+PCL_MUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM\s0 and 
 64\-bit instruction set extensions.
 .IP "\fBbdver4\fR" 4
 .IX Item "bdver4"
 \&\s-1AMD\s0 Family 15h core based CPUs with x86\-64 instruction set support.  (This
-supersets \s-1BMI\s0, \s-1BMI2\s0, \s-1TBM\s0, F16C, \s-1FMA\s0, \s-1FMA4\s0, \s-1FSGSBASE\s0, \s-1AVX\s0, \s-1AVX2\s0, \s-1XOP\s0, \s-1LWP\s0, 
-\&\s-1AES\s0, \s-1PCL_MUL\s0, \s-1CX16\s0, \s-1MOVBE\s0, \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSE4A\s0, \s-1SSSE3\s0, \s-1SSE4\s0.1, 
-\&\s-1SSE4\s0.2, \s-1ABM\s0 and 64\-bit instruction set extensions.
+supersets \s-1BMI, BMI2, TBM, F16C, FMA, FMA4, FSGSBASE, AVX, AVX2, XOP, LWP, 
+AES, PCL_MUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, 
+SSE4.2, ABM\s0 and 64\-bit instruction set extensions.
 .IP "\fBbtver1\fR" 4
 .IX Item "btver1"
 CPUs based on \s-1AMD\s0 Family 14h cores with x86\-64 instruction set support.  (This
-supersets \s-1MMX\s0, \s-1SSE\s0, \s-1SSE2\s0, \s-1SSE3\s0, \s-1SSSE3\s0, \s-1SSE4A\s0, \s-1CX16\s0, \s-1ABM\s0 and 64\-bit
+supersets \s-1MMX, SSE, SSE2, SSE3, SSSE3, SSE4A, CX16, ABM\s0 and 64\-bit
 instruction set extensions.)
 .IP "\fBbtver2\fR" 4
 .IX Item "btver2"
 CPUs based on \s-1AMD\s0 Family 16h cores with x86\-64 instruction set support. This
-includes \s-1MOVBE\s0, F16C, \s-1BMI\s0, \s-1AVX\s0, \s-1PCL_MUL\s0, \s-1AES\s0, \s-1SSE4\s0.2, \s-1SSE4\s0.1, \s-1CX16\s0, \s-1ABM\s0,
-\&\s-1SSE4A\s0, \s-1SSSE3\s0, \s-1SSE3\s0, \s-1SSE2\s0, \s-1SSE\s0, \s-1MMX\s0 and 64\-bit instruction set extensions.
+includes \s-1MOVBE, F16C, BMI, AVX, PCL_MUL, AES, SSE4.2, SSE4.1, CX16, ABM,
+SSE4A, SSSE3, SSE3, SSE2, SSE, MMX\s0 and 64\-bit instruction set extensions.
 .IP "\fBwinchip\-c6\fR" 4
 .IX Item "winchip-c6"
-\&\s-1IDT\s0 WinChip C6 \s-1CPU\s0, dealt in same way as i486 with additional \s-1MMX\s0 instruction
+\&\s-1IDT\s0 WinChip C6 \s-1CPU,\s0 dealt in same way as i486 with additional \s-1MMX\s0 instruction
 set support.
 .IP "\fBwinchip2\fR" 4
 .IX Item "winchip2"
-\&\s-1IDT\s0 WinChip 2 \s-1CPU\s0, dealt in same way as i486 with additional \s-1MMX\s0 and 3DNow!
+\&\s-1IDT\s0 WinChip 2 \s-1CPU,\s0 dealt in same way as i486 with additional \s-1MMX\s0 and 3DNow!
 instruction set support.
 .IP "\fBc3\fR" 4
 .IX Item "c3"
-\&\s-1VIA\s0 C3 \s-1CPU\s0 with \s-1MMX\s0 and 3DNow! instruction set support.  (No scheduling is
+\&\s-1VIA C3 CPU\s0 with \s-1MMX\s0 and 3DNow! instruction set support.  (No scheduling is
 implemented for this chip.)
 .IP "\fBc3\-2\fR" 4
 .IX Item "c3-2"
-\&\s-1VIA\s0 C3\-2 (Nehemiah/C5XL) \s-1CPU\s0 with \s-1MMX\s0 and \s-1SSE\s0 instruction set support.
+\&\s-1VIA C3\-2 \s0(Nehemiah/C5XL) \s-1CPU\s0 with \s-1MMX\s0 and \s-1SSE\s0 instruction set support.
 (No scheduling is
 implemented for this chip.)
 .IP "\fBgeode\fR" 4
@@ -13934,7 +13943,7 @@
 .Sp
 As new processors are deployed in the marketplace, the behavior of this
 option will change.  Therefore, if you upgrade to a newer version of
-\&\s-1GCC\s0, code generation controlled by this option will change to reflect
+\&\s-1GCC,\s0 code generation controlled by this option will change to reflect
 the processors
 that are most common at the time that version of \s-1GCC\s0 is released.
 .Sp
@@ -13946,7 +13955,7 @@
 .IP "\fBintel\fR" 4
 .IX Item "intel"
 Produce code optimized for the most current Intel processors, which are
-Haswell and Silvermont for this version of \s-1GCC\s0.  If you know the \s-1CPU\s0
+Haswell and Silvermont for this version of \s-1GCC. \s0 If you know the \s-1CPU\s0
 on which your code will run, then you should use the corresponding
 \&\fB\-mtune\fR or \fB\-march\fR option instead of \fB\-mtune=intel\fR.
 But, if you want your application performs better on both Haswell and
@@ -13954,7 +13963,7 @@
 .Sp
 As new Intel processors are deployed in the marketplace, the behavior of
 this option will change.  Therefore, if you upgrade to a newer version of
-\&\s-1GCC\s0, code generation controlled by this option will change to reflect
+\&\s-1GCC,\s0 code generation controlled by this option will change to reflect
 the most current Intel processors at the time that version of \s-1GCC\s0 is
 released.
 .Sp
@@ -14037,7 +14046,7 @@
 .IX Item "-msoft-float"
 Generate output containing library calls for floating point.
 .Sp
-\&\fBWarning:\fR the requisite libraries are not part of \s-1GCC\s0.
+\&\fBWarning:\fR the requisite libraries are not part of \s-1GCC.\s0
 Normally the facilities of the machine's usual C compiler are used, but
 this can't be done directly in cross-compilation.  You must make your
 own arrangements to provide suitable library functions for
@@ -14052,8 +14061,8 @@
 .Sp
 The usual calling convention has functions return values of types
 \&\f(CW\*(C`float\*(C'\fR and \f(CW\*(C`double\*(C'\fR in an \s-1FPU\s0 register, even if there
-is no \s-1FPU\s0.  The idea is that the operating system should emulate
-an \s-1FPU\s0.
+is no \s-1FPU. \s0 The idea is that the operating system should emulate
+an \s-1FPU.\s0
 .Sp
 The option \fB\-mno\-fp\-ret\-in\-387\fR causes such values to be returned
 in ordinary \s-1CPU\s0 registers instead.
@@ -14098,7 +14107,7 @@
 .Sp
 Modern architectures (Pentium and newer) prefer \f(CW\*(C`long double\*(C'\fR
 to be aligned to an 8\- or 16\-byte boundary.  In arrays or structures
-conforming to the \s-1ABI\s0, this is not possible.  So specifying
+conforming to the \s-1ABI,\s0 this is not possible.  So specifying
 \&\fB\-m128bit\-long\-double\fR aligns \f(CW\*(C`long double\*(C'\fR
 to a 16\-byte boundary by padding the \f(CW\*(C`long double\*(C'\fR with an additional
 32\-bit zero.
@@ -14109,7 +14118,7 @@
 Notice that neither of these options enable any extra precision over the x87
 standard of 80 bits for a \f(CW\*(C`long double\*(C'\fR.
 .Sp
-\&\fBWarning:\fR if you override the default value for your target \s-1ABI\s0, this
+\&\fBWarning:\fR if you override the default value for your target \s-1ABI,\s0 this
 changes the size of 
 structures and arrays containing \f(CW\*(C`long double\*(C'\fR variables,
 as well as modifying the function calling convention for functions taking
@@ -14129,7 +14138,7 @@
 of 128 bits makes the \f(CW\*(C`long double\*(C'\fR type equivalent to the
 \&\f(CW\*(C`_\|_float128\*(C'\fR type. This is the default for 64\-bit Bionic C library.
 .Sp
-\&\fBWarning:\fR if you override the default value for your target \s-1ABI\s0, this
+\&\fBWarning:\fR if you override the default value for your target \s-1ABI,\s0 this
 changes the size of
 structures and arrays containing \f(CW\*(C`long double\*(C'\fR variables,
 as well as modifying the function calling convention for functions taking
@@ -14193,7 +14202,7 @@
 with Studio 12 Update@tie{}1) follow the \s-1ABI\s0 used by other x86 targets, which
 is the default on Solaris@tie{}10 and later.  \fIOnly\fR use this option if
 you need to remain compatible with existing code produced by those
-previous compiler versions or older versions of \s-1GCC\s0.
+previous compiler versions or older versions of \s-1GCC.\s0
 .IP "\fB\-mpc32\fR" 4
 .IX Item "-mpc32"
 .PD 0
@@ -14254,7 +14263,7 @@
 .Sp
 On Pentium and Pentium Pro, \f(CW\*(C`double\*(C'\fR and \f(CW\*(C`long double\*(C'\fR values
 should be aligned to an 8\-byte boundary (see \fB\-malign\-double\fR) or
-suffer significant run time performance penalties.  On Pentium \s-1III\s0, the
+suffer significant run time performance penalties.  On Pentium \s-1III,\s0 the
 Streaming \s-1SIMD\s0 Extension (\s-1SSE\s0) data type \f(CW\*(C`_\|_m128\*(C'\fR may not work
 properly if it is not 16\-byte aligned.
 .Sp
@@ -14412,10 +14421,10 @@
 .IP "\fB\-mno\-tbm\fR" 4
 .IX Item "-mno-tbm"
 .PD
-These switches enable or disable the use of instructions in the \s-1MMX\s0, \s-1SSE\s0,
-\&\s-1SSE2\s0, \s-1SSE3\s0, \s-1SSSE3\s0, \s-1SSE4\s0.1, \s-1AVX\s0, \s-1AVX2\s0, \s-1AVX512F\s0, \s-1AVX512PF\s0, \s-1AVX512ER\s0, \s-1AVX512CD\s0,
-\&\s-1SHA\s0, \s-1AES\s0, \s-1PCLMUL\s0, \s-1FSGSBASE\s0, \s-1RDRND\s0, F16C, \s-1FMA\s0, \s-1SSE4A\s0, \s-1FMA4\s0, \s-1XOP\s0, \s-1LWP\s0, \s-1ABM\s0,
-\&\s-1BMI\s0, \s-1BMI2\s0, \s-1FXSR\s0, \s-1XSAVE\s0, \s-1XSAVEOPT\s0, \s-1LZCNT\s0, \s-1RTM\s0, or 3DNow!
+These switches enable or disable the use of instructions in the \s-1MMX, SSE,
+SSE2, SSE3, SSSE3, SSE4.1, AVX, AVX2, AVX512F, AVX512PF, AVX512ER, AVX512CD,
+SHA, AES, PCLMUL, FSGSBASE, RDRND, F16C, FMA, SSE4A, FMA4, XOP, LWP, ABM,
+BMI, BMI2, FXSR, XSAVE, XSAVEOPT, LZCNT, RTM,\s0 or 3DNow!
 extended instruction sets.
 These extensions are also available as built-in functions: see
 \&\fBX86 Built-in Functions\fR, for details of the functions enabled and
@@ -14490,7 +14499,7 @@
 Early Intel Pentium 4 CPUs with Intel 64 support,
 prior to the introduction of Pentium 4 G1 step in December 2005,
 lacked the \f(CW\*(C`LAHF\*(C'\fR and \f(CW\*(C`SAHF\*(C'\fR instructions
-which were supported by \s-1AMD64\s0.
+which were supported by \s-1AMD64.\s0
 These are load and store instructions, respectively, for certain status flags.
 In 64\-bit mode, the \f(CW\*(C`SAHF\*(C'\fR instruction is used to optimize \f(CW\*(C`fmod\*(C'\fR,
 \&\f(CW\*(C`drem\*(C'\fR, and \f(CW\*(C`remainder\*(C'\fR built-in functions;
@@ -14566,7 +14575,7 @@
 for the Intel short
 vector math library and \fBacml\fR for the \s-1AMD\s0 math core library.
 To use this option, both \fB\-ftree\-vectorize\fR and
-\&\fB\-funsafe\-math\-optimizations\fR have to be enabled, and an \s-1SVML\s0 or \s-1ACML\s0 
+\&\fB\-funsafe\-math\-optimizations\fR have to be enabled, and an \s-1SVML\s0 or \s-1ACML \s0
 ABI-compatible library must be specified at link time.
 .Sp
 \&\s-1GCC\s0 currently emits calls to \f(CW\*(C`vmldExp2\*(C'\fR,
@@ -14589,7 +14598,7 @@
 .IX Item "-mabi=name"
 Generate code for the specified calling convention.  Permissible values
 are \fBsysv\fR for the \s-1ABI\s0 used on GNU/Linux and other systems, and
-\&\fBms\fR for the Microsoft \s-1ABI\s0.  The default is to use the Microsoft
+\&\fBms\fR for the Microsoft \s-1ABI. \s0 The default is to use the Microsoft
 \&\s-1ABI\s0 when targeting Microsoft Windows and the SysV \s-1ABI\s0 on all other systems.
 You can control this behavior for a specific function by
 using the function attribute \fBms_abi\fR/\fBsysv_abi\fR.
@@ -14704,7 +14713,7 @@
 is valid depends on the operating system, and whether it maps the
 segment to cover the entire \s-1TLS\s0 area.
 .Sp
-For systems that use the \s-1GNU\s0 C Library, the default is on.
+For systems that use the \s-1GNU C\s0 Library, the default is on.
 .IP "\fB\-msse2avx\fR" 4
 .IX Item "-msse2avx"
 .PD 0
@@ -14865,7 +14874,7 @@
 This option is available for MinGW targets. It specifies that
 the executable flag for the stack used by nested functions isn't
 set. This is necessary for binaries running in kernel mode of
-Microsoft Windows, as there the User32 \s-1API\s0, which is used to set executable
+Microsoft Windows, as there the User32 \s-1API,\s0 which is used to set executable
 privileges, isn't available.
 .IP "\fB\-fwritable\-relocated\-rdata\fR" 4
 .IX Item "-fwritable-relocated-rdata"
@@ -14912,7 +14921,7 @@
 .IP "\fB\-mno\-pic\fR" 4
 .IX Item "-mno-pic"
 Generate code that does not use a global pointer register.  The result
-is not position independent code, and violates the \s-1IA\-64\s0 \s-1ABI\s0.
+is not position independent code, and violates the \s-1IA\-64 ABI.\s0
 .IP "\fB\-mvolatile\-asm\-stop\fR" 4
 .IX Item "-mvolatile-asm-stop"
 .PD 0
@@ -14992,7 +15001,7 @@
 .IP "\fB\-mdwarf2\-asm\fR" 4
 .IX Item "-mdwarf2-asm"
 .PD
-Don't (or do) generate assembler code for the \s-1DWARF\s0 2 line number debugging
+Don't (or do) generate assembler code for the \s-1DWARF 2\s0 line number debugging
 info.  This may be useful when not using the \s-1GNU\s0 assembler.
 .IP "\fB\-mearly\-stop\-bits\fR" 4
 .IX Item "-mearly-stop-bits"
@@ -15016,7 +15025,7 @@
 64.
 .IP "\fB\-mtune=\fR\fIcpu-type\fR" 4
 .IX Item "-mtune=cpu-type"
-Tune the instruction scheduling for a particular \s-1CPU\s0, Valid values are
+Tune the instruction scheduling for a particular \s-1CPU,\s0 Valid values are
 \&\fBitanium\fR, \fBitanium1\fR, \fBmerced\fR, \fBitanium2\fR,
 and \fBmckinley\fR.
 .IP "\fB\-milp32\fR" 4
@@ -15465,7 +15474,7 @@
 does not have code to emulate those instructions.
 .IP "\fB\-mcpu32\fR" 4
 .IX Item "-mcpu32"
-Generate output for a \s-1CPU32\s0.  This is the default
+Generate output for a \s-1CPU32. \s0 This is the default
 when the compiler is configured for CPU32\-based systems.
 It is equivalent to \fB\-march=cpu32\fR.
 .Sp
@@ -15474,16 +15483,16 @@
 68336, 68340, 68341, 68349 and 68360.
 .IP "\fB\-m5200\fR" 4
 .IX Item "-m5200"
-Generate output for a 520X ColdFire \s-1CPU\s0.  This is the default
+Generate output for a 520X ColdFire \s-1CPU. \s0 This is the default
 when the compiler is configured for 520X\-based systems.
 It is equivalent to \fB\-mcpu=5206\fR, and is now deprecated
 in favor of that option.
 .Sp
 Use this option for microcontroller with a 5200 core, including
-the \s-1MCF5202\s0, \s-1MCF5203\s0, \s-1MCF5204\s0 and \s-1MCF5206\s0.
+the \s-1MCF5202, MCF5203, MCF5204\s0 and \s-1MCF5206.\s0
 .IP "\fB\-m5206e\fR" 4
 .IX Item "-m5206e"
-Generate output for a 5206e ColdFire \s-1CPU\s0.  The option is now
+Generate output for a 5206e ColdFire \s-1CPU. \s0 The option is now
 deprecated in favor of the equivalent \fB\-mcpu=5206e\fR.
 .IP "\fB\-m528x\fR" 4
 .IX Item "-m528x"
@@ -15492,15 +15501,15 @@
 \&\fB\-mcpu=528x\fR.
 .IP "\fB\-m5307\fR" 4
 .IX Item "-m5307"
-Generate output for a ColdFire 5307 \s-1CPU\s0.  The option is now deprecated
+Generate output for a ColdFire 5307 \s-1CPU. \s0 The option is now deprecated
 in favor of the equivalent \fB\-mcpu=5307\fR.
 .IP "\fB\-m5407\fR" 4
 .IX Item "-m5407"
-Generate output for a ColdFire 5407 \s-1CPU\s0.  The option is now deprecated
+Generate output for a ColdFire 5407 \s-1CPU. \s0 The option is now deprecated
 in favor of the equivalent \fB\-mcpu=5407\fR.
 .IP "\fB\-mcfv4e\fR" 4
 .IX Item "-mcfv4e"
-Generate output for a ColdFire V4e family \s-1CPU\s0 (e.g. 547x/548x).
+Generate output for a ColdFire V4e family \s-1CPU \s0(e.g. 547x/548x).
 This includes use of hardware floating-point instructions.
 The option is equivalent to \fB\-mcpu=547x\fR, and is now
 deprecated in favor of that option.
@@ -15527,14 +15536,14 @@
 .IX Item "-m68881"
 .PD
 Generate floating-point instructions.  This is the default for 68020
-and above, and for ColdFire devices that have an \s-1FPU\s0.  It defines the
+and above, and for ColdFire devices that have an \s-1FPU. \s0 It defines the
 macro \fB_\|_HAVE_68881_\|_\fR on M680x0 targets and \fB_\|_mcffpu_\|_\fR
 on ColdFire targets.
 .IP "\fB\-msoft\-float\fR" 4
 .IX Item "-msoft-float"
 Do not generate floating-point instructions; use library calls instead.
 This is the default for 68000, 68010, and 68832 targets.  It is also
-the default for ColdFire devices that have no \s-1FPU\s0.
+the default for ColdFire devices that have no \s-1FPU.\s0
 .IP "\fB\-mdiv\fR" 4
 .IX Item "-mdiv"
 .PD 0
@@ -15544,8 +15553,8 @@
 Generate (do not generate) ColdFire hardware divide and remainder
 instructions.  If \fB\-march\fR is used without \fB\-mcpu\fR,
 the default is \*(L"on\*(R" for ColdFire architectures and \*(L"off\*(R" for M680x0
-architectures.  Otherwise, the default is taken from the target \s-1CPU\s0
-(either the default \s-1CPU\s0, or the one specified by \fB\-mcpu\fR).  For
+architectures.  Otherwise, the default is taken from the target \s-1CPU
+\&\s0(either the default \s-1CPU,\s0 or the one specified by \fB\-mcpu\fR).  For
 example, the default is \*(L"off\*(R" for \fB\-mcpu=5206\fR and \*(L"on\*(R" for
 \&\fB\-mcpu=5206e\fR.
 .Sp
@@ -15664,7 +15673,7 @@
 larger and slower than code generated without this option.  On M680x0
 processors, this option is not needed; \fB\-fPIC\fR suffices.
 .Sp
-\&\s-1GCC\s0 normally uses a single instruction to load values from the \s-1GOT\s0.
+\&\s-1GCC\s0 normally uses a single instruction to load values from the \s-1GOT.\s0
 While this is relatively efficient, it only works if the \s-1GOT\s0
 is smaller than about 64k.  Anything larger causes the linker
 to report an error such as:
@@ -15806,7 +15815,7 @@
 Selects one of the built-in core configurations.  Each MeP chip has
 one or more modules in it; each module has a core \s-1CPU\s0 and a variety of
 coprocessors, optional instructions, and peripherals.  The
-\&\f(CW\*(C`MeP\-Integrator\*(C'\fR tool, not part of \s-1GCC\s0, provides these
+\&\f(CW\*(C`MeP\-Integrator\*(C'\fR tool, not part of \s-1GCC,\s0 provides these
 configurations through this option; using this option is the same as
 using all the corresponding command-line options.  The default
 configuration is \f(CW\*(C`default\*(C'\fR.
@@ -15909,7 +15918,7 @@
 This option is deprecated.  Use \fB\-fno\-zero\-initialized\-in\-bss\fR instead.
 .IP "\fB\-mcpu=\fR\fIcpu-type\fR" 4
 .IX Item "-mcpu=cpu-type"
-Use features of, and schedule code for, the given \s-1CPU\s0.
+Use features of, and schedule code for, the given \s-1CPU.\s0
 Supported values are in the format \fBv\fR\fIX\fR\fB.\fR\fI\s-1YY\s0\fR\fB.\fR\fIZ\fR,
 where \fIX\fR is a major version, \fI\s-1YY\s0\fR is the minor version, and
 \&\fIZ\fR is compatibility code.  Example values are \fBv3.00.a\fR,
@@ -15995,7 +16004,7 @@
 .IP "\fB\-march=\fR\fIarch\fR" 4
 .IX Item "-march=arch"
 Generate code that runs on \fIarch\fR, which can be the name of a
-generic \s-1MIPS\s0 \s-1ISA\s0, or the name of a particular processor.
+generic \s-1MIPS ISA,\s0 or the name of a particular processor.
 The \s-1ISA\s0 names are:
 \&\fBmips1\fR, \fBmips2\fR, \fBmips3\fR, \fBmips4\fR,
 \&\fBmips32\fR, \fBmips32r2\fR, \fBmips64\fR and \fBmips64r2\fR.
@@ -16024,7 +16033,7 @@
 \&\fBvr5000\fR, \fBvr5400\fR, \fBvr5500\fR,
 \&\fBxlr\fR and \fBxlp\fR.
 The special value \fBfrom-abi\fR selects the
-most compatible architecture for the selected \s-1ABI\s0 (that is,
+most compatible architecture for the selected \s-1ABI \s0(that is,
 \&\fBmips1\fR for 32\-bit ABIs and \fBmips3\fR for 64\-bit ABIs).
 .Sp
 The native Linux/GNU toolchain also supports the value \fBnative\fR,
@@ -16105,7 +16114,7 @@
 .IX Item "-mno-mips16"
 .PD
 Generate (do not generate) \s-1MIPS16\s0 code.  If \s-1GCC\s0 is targeting a
-\&\s-1MIPS32\s0 or \s-1MIPS64\s0 architecture, it makes use of the MIPS16e \s-1ASE\s0.
+\&\s-1MIPS32\s0 or \s-1MIPS64\s0 architecture, it makes use of the MIPS16e \s-1ASE.\s0
 .Sp
 \&\s-1MIPS16\s0 code generation can also be controlled on a per-function basis
 by means of \f(CW\*(C`mips16\*(C'\fR and \f(CW\*(C`nomips16\*(C'\fR attributes.
@@ -16120,7 +16129,7 @@
 .IP "\fB\-mno\-interlink\-compressed\fR" 4
 .IX Item "-mno-interlink-compressed"
 .PD
-Require (do not require) that code using the standard (uncompressed) \s-1MIPS\s0 \s-1ISA\s0
+Require (do not require) that code using the standard (uncompressed) \s-1MIPS ISA\s0
 be link-compatible with \s-1MIPS16\s0 and microMIPS code, and vice versa.
 .Sp
 For example, code using the standard \s-1ISA\s0 encoding cannot jump directly
@@ -16148,13 +16157,13 @@
 .IP "\fB\-mabi=eabi\fR" 4
 .IX Item "-mabi=eabi"
 .PD
-Generate code for the given \s-1ABI\s0.
+Generate code for the given \s-1ABI.\s0
 .Sp
 Note that the \s-1EABI\s0 has a 32\-bit and a 64\-bit variant.  \s-1GCC\s0 normally
 generates 64\-bit code when you select a 64\-bit architecture, but you
 can use \fB\-mgp32\fR to get 32\-bit code instead.
 .Sp
-For information about the O64 \s-1ABI\s0, see
+For information about the O64 \s-1ABI,\s0 see
 <\fBhttp://gcc.gnu.org/projects/mipso64\-abi.html\fR>.
 .Sp
 \&\s-1GCC\s0 supports a variant of the o32 \s-1ABI\s0 in which floating-point registers
@@ -16210,7 +16219,7 @@
 .PD
 Assume (do not assume) that the static and dynamic linkers
 support PLTs and copy relocations.  This option only affects
-\&\fB\-mno\-shared \-mabicalls\fR.  For the n64 \s-1ABI\s0, this option
+\&\fB\-mno\-shared \-mabicalls\fR.  For the n64 \s-1ABI,\s0 this option
 has no effect without \fB\-msym32\fR.
 .Sp
 You can make \fB\-mplt\fR the default by configuring
@@ -16225,7 +16234,7 @@
 Lift (do not lift) the usual restrictions on the size of the global
 offset table.
 .Sp
-\&\s-1GCC\s0 normally uses a single instruction to load values from the \s-1GOT\s0.
+\&\s-1GCC\s0 normally uses a single instruction to load values from the \s-1GOT.\s0
 While this is relatively efficient, it only works if the \s-1GOT\s0
 is smaller than about 64k.  Anything larger causes the linker
 to report an error such as:
@@ -16290,7 +16299,7 @@
 .IX Item "-mabs=legacy"
 .PD
 These options control the treatment of the special not-a-number (NaN)
-\&\s-1IEEE\s0 754 floating-point data with the \f(CW\*(C`abs.\f(CIfmt\f(CW\*(C'\fR and
+\&\s-1IEEE 754\s0 floating-point data with the \f(CW\*(C`abs.\f(CIfmt\f(CW\*(C'\fR and
 \&\f(CW\*(C`neg.\f(CIfmt\f(CW\*(C'\fR machine instructions.
 .Sp
 By default or when the \fB\-mabs=legacy\fR is used the legacy
@@ -16301,7 +16310,7 @@
 instead unless the \fB\-ffinite\-math\-only\fR option has also been
 specified.
 .Sp
-The \fB\-mabs=2008\fR option selects the \s-1IEEE\s0 754\-2008 treatment.  In
+The \fB\-mabs=2008\fR option selects the \s-1IEEE 754\-2008\s0 treatment.  In
 this case these instructions are considered non-arithmetic and therefore
 operating correctly in all cases, including in particular where the
 input operand is a NaN.  These instructions are therefore always used
@@ -16313,14 +16322,14 @@
 .IX Item "-mnan=legacy"
 .PD
 These options control the encoding of the special not-a-number (NaN)
-\&\s-1IEEE\s0 754 floating-point data.
+\&\s-1IEEE 754\s0 floating-point data.
 .Sp
 The \fB\-mnan=legacy\fR option selects the legacy encoding.  In this
 case quiet NaNs (qNaNs) are denoted by the first bit of their trailing
 significand field being 0, whereas signalling NaNs (sNaNs) are denoted
 by the first bit of their trailing significand field being 1.
 .Sp
-The \fB\-mnan=2008\fR option selects the \s-1IEEE\s0 754\-2008 encoding.  In
+The \fB\-mnan=2008\fR option selects the \s-1IEEE 754\-2008\s0 encoding.  In
 this case qNaNs are denoted by the first bit of their trailing
 significand field being 1, whereas sNaNs are denoted by the first bit of
 their trailing significand field being 0.
@@ -16350,8 +16359,8 @@
 .IP "\fB\-mno\-dsp\fR" 4
 .IX Item "-mno-dsp"
 .PD
-Use (do not use) revision 1 of the \s-1MIPS\s0 \s-1DSP\s0 \s-1ASE\s0.
-  This option defines the
+Use (do not use) revision 1 of the \s-1MIPS DSP ASE.
+ \s0 This option defines the
 preprocessor macro \fB_\|_mips_dsp\fR.  It also defines
 \&\fB_\|_mips_dsp_rev\fR to 1.
 .IP "\fB\-mdspr2\fR" 4
@@ -16360,8 +16369,8 @@
 .IP "\fB\-mno\-dspr2\fR" 4
 .IX Item "-mno-dspr2"
 .PD
-Use (do not use) revision 2 of the \s-1MIPS\s0 \s-1DSP\s0 \s-1ASE\s0.
-  This option defines the
+Use (do not use) revision 2 of the \s-1MIPS DSP ASE.
+ \s0 This option defines the
 preprocessor macros \fB_\|_mips_dsp\fR and \fB_\|_mips_dspr2\fR.
 It also defines \fB_\|_mips_dsp_rev\fR to 2.
 .IP "\fB\-msmartmips\fR" 4
@@ -16370,7 +16379,7 @@
 .IP "\fB\-mno\-smartmips\fR" 4
 .IX Item "-mno-smartmips"
 .PD
-Use (do not use) the \s-1MIPS\s0 SmartMIPS \s-1ASE\s0.
+Use (do not use) the \s-1MIPS\s0 SmartMIPS \s-1ASE.\s0
 .IP "\fB\-mpaired\-single\fR" 4
 .IX Item "-mpaired-single"
 .PD 0
@@ -16395,7 +16404,7 @@
 .IP "\fB\-mno\-mips3d\fR" 4
 .IX Item "-mno-mips3d"
 .PD
-Use (do not use) the \s-1MIPS\-3D\s0 \s-1ASE\s0.  
+Use (do not use) the \s-1MIPS\-3D ASE.  \s0
 The option \fB\-mips3d\fR implies \fB\-mpaired\-single\fR.
 .IP "\fB\-mmicromips\fR" 4
 .IX Item "-mmicromips"
@@ -16420,7 +16429,7 @@
 .IP "\fB\-mno\-mcu\fR" 4
 .IX Item "-mno-mcu"
 .PD
-Use (do not use) the \s-1MIPS\s0 \s-1MCU\s0 \s-1ASE\s0 instructions.
+Use (do not use) the \s-1MIPS MCU ASE\s0 instructions.
 .IP "\fB\-meva\fR" 4
 .IX Item "-meva"
 .PD 0
@@ -16445,7 +16454,7 @@
 Force \f(CW\*(C`long\*(C'\fR, \f(CW\*(C`int\*(C'\fR, and pointer types to be 32 bits wide.
 .Sp
 The default size of \f(CW\*(C`int\*(C'\fRs, \f(CW\*(C`long\*(C'\fRs and pointers depends on
-the \s-1ABI\s0.  All the supported ABIs use 32\-bit \f(CW\*(C`int\*(C'\fRs.  The n64 \s-1ABI\s0
+the \s-1ABI. \s0 All the supported ABIs use 32\-bit \f(CW\*(C`int\*(C'\fRs.  The n64 \s-1ABI\s0
 uses 64\-bit \f(CW\*(C`long\*(C'\fRs, as does the 64\-bit \s-1EABI\s0; the others use
 32\-bit \f(CW\*(C`long\*(C'\fRs.  Pointers are the same size as \f(CW\*(C`long\*(C'\fRs,
 or the same size as integer registers, whichever is smaller.
@@ -16456,7 +16465,7 @@
 .IX Item "-mno-sym32"
 .PD
 Assume (do not assume) that all symbols have 32\-bit values, regardless
-of the selected \s-1ABI\s0.  This option is useful in combination with
+of the selected \s-1ABI. \s0 This option is useful in combination with
 \&\fB\-mabi=64\fR and \fB\-mno\-abicalls\fR because it allows \s-1GCC\s0
 to generate shorter and faster references to symbolic addresses.
 .IP "\fB\-G\fR \fInum\fR" 4
@@ -16561,13 +16570,13 @@
 and 4KSd processors when the code TLBs have the Read Inhibit bit set.
 It is also useful on processors that can be configured to have a dual
 instruction/data \s-1SRAM\s0 interface and that, like the M4K, automatically
-redirect PC-relative loads to the instruction \s-1RAM\s0.
+redirect PC-relative loads to the instruction \s-1RAM.\s0
 .IP "\fB\-mcode\-readable=no\fR" 4
 .IX Item "-mcode-readable=no"
 Instructions must not access executable sections.  This option can be
 useful on targets that are configured to have a dual instruction/data
 \&\s-1SRAM\s0 interface but that (unlike the M4K) do not automatically redirect
-PC-relative loads to the instruction \s-1RAM\s0.
+PC-relative loads to the instruction \s-1RAM.\s0
 .RE
 .RS 4
 .RE
@@ -16609,7 +16618,7 @@
 .PD
 \&\s-1MIPS\s0 systems check for division by zero by generating either a
 conditional trap or a break instruction.  Using traps results in
-smaller code, but is only supported on \s-1MIPS\s0 \s-1II\s0 and later.  Also, some
+smaller code, but is only supported on \s-1MIPS II\s0 and later.  Also, some
 versions of the Linux kernel have a bug that prevents trap from
 generating the proper signal (\f(CW\*(C`SIGFPE\*(C'\fR).  Use \fB\-mdivide\-traps\fR to
 allow conditional traps on architectures that support them and
@@ -16647,7 +16656,7 @@
 .IX Item "-mno-mad"
 .PD
 Enable (disable) use of the \f(CW\*(C`mad\*(C'\fR, \f(CW\*(C`madu\*(C'\fR and \f(CW\*(C`mul\*(C'\fR
-instructions, as provided by the R4650 \s-1ISA\s0.
+instructions, as provided by the R4650 \s-1ISA.\s0
 .IP "\fB\-mimadd\fR" 4
 .IX Item "-mimadd"
 .PD 0
@@ -16685,7 +16694,7 @@
 .IX Item "-mno-fix-24k"
 .PD
 Work around the 24K E48 (lost data on stores during refill) errata.
-The workarounds are implemented by the assembler rather than by \s-1GCC\s0.
+The workarounds are implemented by the assembler rather than by \s-1GCC.\s0
 .IP "\fB\-mfix\-r4000\fR" 4
 .IX Item "-mfix-r4000"
 .PD 0
@@ -16745,8 +16754,8 @@
 .IP "\fB\-mno\-fix\-rm7000\fR" 4
 .IX Item "-mno-fix-rm7000"
 .PD
-Work around the \s-1RM7000\s0 \f(CW\*(C`dmult\*(C'\fR/\f(CW\*(C`dmultu\*(C'\fR errata.  The
-workarounds are implemented by the assembler rather than by \s-1GCC\s0.
+Work around the \s-1RM7000 \s0\f(CW\*(C`dmult\*(C'\fR/\f(CW\*(C`dmultu\*(C'\fR errata.  The
+workarounds are implemented by the assembler rather than by \s-1GCC.\s0
 .IP "\fB\-mfix\-vr4120\fR" 4
 .IX Item "-mfix-vr4120"
 .PD 0
@@ -16772,10 +16781,10 @@
 .RE
 .IP "\fB\-mfix\-vr4130\fR" 4
 .IX Item "-mfix-vr4130"
-Work around the \s-1VR4130\s0 \f(CW\*(C`mflo\*(C'\fR/\f(CW\*(C`mfhi\*(C'\fR errata.  The
-workarounds are implemented by the assembler rather than by \s-1GCC\s0,
+Work around the \s-1VR4130 \s0\f(CW\*(C`mflo\*(C'\fR/\f(CW\*(C`mfhi\*(C'\fR errata.  The
+workarounds are implemented by the assembler rather than by \s-1GCC,\s0
 although \s-1GCC\s0 avoids using \f(CW\*(C`mflo\*(C'\fR and \f(CW\*(C`mfhi\*(C'\fR if the
-\&\s-1VR4130\s0 \f(CW\*(C`macc\*(C'\fR, \f(CW\*(C`macchi\*(C'\fR, \f(CW\*(C`dmacc\*(C'\fR and \f(CW\*(C`dmacchi\*(C'\fR
+\&\s-1VR4130 \s0\f(CW\*(C`macc\*(C'\fR, \f(CW\*(C`macchi\*(C'\fR, \f(CW\*(C`dmacc\*(C'\fR and \f(CW\*(C`dmacchi\*(C'\fR
 instructions are available instead.
 .IP "\fB\-mfix\-sb1\fR" 4
 .IX Item "-mfix-sb1"
@@ -16783,7 +16792,7 @@
 .IP "\fB\-mno\-fix\-sb1\fR" 4
 .IX Item "-mno-fix-sb1"
 .PD
-Work around certain \s-1SB\-1\s0 \s-1CPU\s0 core errata.
+Work around certain \s-1SB\-1 CPU\s0 core errata.
 (This flag currently works around the \s-1SB\-1\s0 revision 2
 \&\*(L"F1\*(R" and \*(L"F2\*(R" floating-point errata.)
 .IP "\fB\-mr10k\-cache\-barrier=\fR\fIsetting\fR" 4
@@ -16894,7 +16903,7 @@
 The default is that \s-1FP\s0 exceptions are
 enabled.
 .Sp
-For instance, on the \s-1SB\-1\s0, if \s-1FP\s0 exceptions are disabled, and we are emitting
+For instance, on the \s-1SB\-1,\s0 if \s-1FP\s0 exceptions are disabled, and we are emitting
 64\-bit code, then we can use both \s-1FP\s0 pipes.  Otherwise, we can only use one
 \&\s-1FP\s0 pipe.
 .IP "\fB\-mvr4130\-align\fR" 4
@@ -16908,7 +16917,7 @@
 option is enabled, \s-1GCC\s0 aligns pairs of instructions that it
 thinks should execute in parallel.
 .Sp
-This option only has an effect when optimizing for the \s-1VR4130\s0.
+This option only has an effect when optimizing for the \s-1VR4130.\s0
 It normally makes code faster, but at the expense of making it bigger.
 It is enabled by default at optimization level \fB\-O3\fR.
 .IP "\fB\-msynci\fR" 4
@@ -16997,7 +17006,7 @@
 .PD
 Generate code that passes function parameters and return values that (in
 the called function) are seen as registers \f(CW$0\fR and up, as opposed to
-the \s-1GNU\s0 \s-1ABI\s0 which uses global registers \f(CW$231\fR and up.
+the \s-1GNU ABI\s0 which uses global registers \f(CW$231\fR and up.
 .IP "\fB\-mzero\-extend\fR" 4
 .IX Item "-mzero-extend"
 .PD 0
@@ -17081,7 +17090,7 @@
 is the default.
 .IP "\fB\-mam33\-2\fR" 4
 .IX Item "-mam33-2"
-Generate code using features specific to the \s-1AM33/2\s0.0 processor.
+Generate code using features specific to the \s-1AM33/2.0\s0 processor.
 .IP "\fB\-mam34\fR" 4
 .IX Item "-mam34"
 Generate code using features specific to the \s-1AM34\s0 processor.
@@ -17162,8 +17171,8 @@
 The option also sets the \s-1ISA\s0 to use.  If the \s-1MCU\s0 name is one that is
 known to only support the 430 \s-1ISA\s0 then that is selected, otherwise the
 430X \s-1ISA\s0 is selected.  A generic \s-1MCU\s0 name of \f(CW\*(C`msp430\*(C'\fR can also be
-used to select the 430 \s-1ISA\s0.  Similarly the generic \f(CW\*(C`msp430x\*(C'\fR \s-1MCU\s0
-name will select the 430X \s-1ISA\s0.
+used to select the 430 \s-1ISA. \s0 Similarly the generic \f(CW\*(C`msp430x\*(C'\fR \s-1MCU\s0
+name will select the 430X \s-1ISA.\s0
 .Sp
 In addition an \s-1MCU\s0 specific linker script will be added to the linker
 command line.  The script's name is the name of the \s-1MCU\s0 with
@@ -17176,7 +17185,7 @@
 .IX Item "-mcpu="
 Specifies the \s-1ISA\s0 to use.  Accepted values are \f(CW\*(C`msp430\*(C'\fR,
 \&\f(CW\*(C`msp430x\*(C'\fR and \f(CW\*(C`msp430xv2\*(C'\fR.  This option is deprecated.  The
-\&\fB\-mmcu=\fR option should be used to select the \s-1ISA\s0.
+\&\fB\-mmcu=\fR option should be used to select the \s-1ISA.\s0
 .IP "\fB\-msim\fR" 4
 .IX Item "-msim"
 Link to the simulator runtime libraries and linker script.  Overrides
@@ -17307,7 +17316,7 @@
 Generate (do not generate) GP-relative accesses for objects in the
 small data or \s-1BSS\s0 sections.  The default is \fB\-mgpopt\fR except
 when \fB\-fpic\fR or \fB\-fPIC\fR is specified to generate
-position-independent code.  Note that the Nios \s-1II\s0 \s-1ABI\s0 does not permit
+position-independent code.  Note that the Nios \s-1II ABI\s0 does not permit
 GP-relative accesses from shared libraries.
 .Sp
 You may need to specify \fB\-mno\-gpopt\fR explicitly when building
@@ -17379,7 +17388,7 @@
 .Sp
 The following values of \fIinsn\fR are supported.  Except as otherwise
 noted, floating-point operations are expected to be implemented with
-normal \s-1IEEE\s0 754 semantics and correspond directly to the C operators or the
+normal \s-1IEEE 754\s0 semantics and correspond directly to the C operators or the
 equivalent \s-1GCC\s0 built-in functions.
 .Sp
 Single-precision floating point:
@@ -17532,14 +17541,14 @@
 function attribute
 or pragma.
 .PP
-These additional \fB\-m\fR options are available for the Altera Nios \s-1II\s0
-\&\s-1ELF\s0 (bare-metal) target:
+These additional \fB\-m\fR options are available for the Altera Nios \s-1II
+ELF \s0(bare-metal) target:
 .IP "\fB\-mhal\fR" 4
 .IX Item "-mhal"
-Link with \s-1HAL\s0 \s-1BSP\s0.  This suppresses linking with the GCC-provided C runtime
+Link with \s-1HAL BSP. \s0 This suppresses linking with the GCC-provided C runtime
 startup and termination code, and is typically used in conjunction with
 \&\fB\-msys\-crt0=\fR to specify the location of the alternate startup code
-provided by the \s-1HAL\s0 \s-1BSP\s0.
+provided by the \s-1HAL BSP.\s0
 .IP "\fB\-msmallc\fR" 4
 .IX Item "-msmallc"
 Link with a limited version of the C library, \fB\-lsmallc\fR, rather than
@@ -17553,7 +17562,7 @@
 \&\fIsystemlib\fR is the library name of the library that provides
 low-level system calls required by the C library,
 e.g. \f(CW\*(C`read\*(C'\fR and \f(CW\*(C`write\*(C'\fR.
-This option is typically used to link with a library provided by a \s-1HAL\s0 \s-1BSP\s0.
+This option is typically used to link with a library provided by a \s-1HAL BSP.\s0
 .PP
 \fI\s-1PDP\-11\s0 Options\fR
 .IX Subsection "PDP-11 Options"
@@ -17574,13 +17583,13 @@
 Return floating-point results in memory.  This is the default.
 .IP "\fB\-m40\fR" 4
 .IX Item "-m40"
-Generate code for a \s-1PDP\-11/40\s0.
+Generate code for a \s-1PDP\-11/40.\s0
 .IP "\fB\-m45\fR" 4
 .IX Item "-m45"
-Generate code for a \s-1PDP\-11/45\s0.  This is the default.
+Generate code for a \s-1PDP\-11/45. \s0 This is the default.
 .IP "\fB\-m10\fR" 4
 .IX Item "-m10"
-Generate code for a \s-1PDP\-11/10\s0.
+Generate code for a \s-1PDP\-11/10.\s0
 .IP "\fB\-mbcopy\-builtin\fR" 4
 .IX Item "-mbcopy-builtin"
 Use inline \f(CW\*(C`movmemhi\*(C'\fR patterns for copying memory.  This is the
@@ -17652,14 +17661,14 @@
 generated with this option runs on any of the other \s-1AE\s0 types.  The
 code is not as efficient as it would be if compiled for a specific
 \&\s-1AE\s0 type, and some types of operation (e.g., multiplication) do not
-work properly on all types of \s-1AE\s0.
+work properly on all types of \s-1AE.\s0
 .Sp
-\&\fB\-mae=MUL\fR selects a \s-1MUL\s0 \s-1AE\s0 type.  This is the most useful \s-1AE\s0 type
+\&\fB\-mae=MUL\fR selects a \s-1MUL AE\s0 type.  This is the most useful \s-1AE\s0 type
 for compiled code, and is the default.
 .Sp
-\&\fB\-mae=MAC\fR selects a DSP-style \s-1MAC\s0 \s-1AE\s0.  Code compiled with this
+\&\fB\-mae=MAC\fR selects a DSP-style \s-1MAC AE. \s0 Code compiled with this
 option may suffer from poor performance of byte (char) manipulation,
-since the \s-1DSP\s0 \s-1AE\s0 does not provide hardware support for byte load/stores.
+since the \s-1DSP AE\s0 does not provide hardware support for byte load/stores.
 .IP "\fB\-msymbol\-as\-address\fR" 4
 .IX Item "-msymbol-as-address"
 Enable the compiler to directly use a symbol name as an address in a
@@ -17672,7 +17681,7 @@
 .IX Item "-mno-inefficient-warnings"
 Disables warnings about the generation of inefficient code.  These
 warnings can be generated, for example, when compiling code that
-performs byte-level memory operations on the \s-1MAC\s0 \s-1AE\s0 type.  The \s-1MAC\s0 \s-1AE\s0 has
+performs byte-level memory operations on the \s-1MAC AE\s0 type.  The \s-1MAC AE\s0 has
 no hardware support for byte-level memory operations, so all byte
 load/stores must be synthesized from word load/store operations.  This is
 inefficient and a warning is generated to indicate
@@ -17705,10 +17714,10 @@
 only on the \s-1RL78/G13\s0 targets.  The \f(CW\*(C`rl78\*(C'\fR option is for the
 standard hardware multiplication defined in the \s-1RL78\s0 software manual.
 .PP
-\fI\s-1IBM\s0 \s-1RS/6000\s0 and PowerPC Options\fR
+\fI\s-1IBM RS/6000\s0 and PowerPC Options\fR
 .IX Subsection "IBM RS/6000 and PowerPC Options"
 .PP
-These \fB\-m\fR options are defined for the \s-1IBM\s0 \s-1RS/6000\s0 and PowerPC:
+These \fB\-m\fR options are defined for the \s-1IBM RS/6000\s0 and PowerPC:
 .IP "\fB\-mpowerpc\-gpopt\fR" 4
 .IX Item "-mpowerpc-gpopt"
 .PD 0
@@ -17753,7 +17762,7 @@
 .PD
 You use these options to specify which instructions are available on the
 processor you are using.  The default value of these options is
-determined when configuring \s-1GCC\s0.  Specifying the
+determined when configuring \s-1GCC. \s0 Specifying the
 \&\fB\-mcpu=\fR\fIcpu_type\fR overrides the specification of these
 options.  We recommend you use the \fB\-mcpu=\fR\fIcpu_type\fR option
 rather than the options listed above.
@@ -17835,7 +17844,7 @@
 value, you may specify it after the \fB\-mcpu\fR option, like
 \&\fB\-mcpu=970 \-mno\-altivec\fR.
 .Sp
-On \s-1AIX\s0, the \fB\-maltivec\fR and \fB\-mpowerpc64\fR options are
+On \s-1AIX,\s0 the \fB\-maltivec\fR and \fB\-mpowerpc64\fR options are
 not enabled or disabled by the \fB\-mcpu\fR option at present because
 \&\s-1AIX\s0 does not have full support for these options.  You may still
 enable or disable them individually if you're sure it'll work in your
@@ -17923,14 +17932,14 @@
 to build executables and shared
 libraries with non-executable \f(CW\*(C`.plt\*(C'\fR and \f(CW\*(C`.got\*(C'\fR sections.
 This is a PowerPC
-32\-bit \s-1SYSV\s0 \s-1ABI\s0 option.
+32\-bit \s-1SYSV ABI\s0 option.
 .IP "\fB\-mbss\-plt\fR" 4
 .IX Item "-mbss-plt"
-Generate code that uses a \s-1BSS\s0 \f(CW\*(C`.plt\*(C'\fR section that \fBld.so\fR
+Generate code that uses a \s-1BSS \s0\f(CW\*(C`.plt\*(C'\fR section that \fBld.so\fR
 fills in, and
 requires \f(CW\*(C`.plt\*(C'\fR and \f(CW\*(C`.got\*(C'\fR
 sections that are both writable and executable.
-This is a PowerPC 32\-bit \s-1SYSV\s0 \s-1ABI\s0 option.
+This is a PowerPC 32\-bit \s-1SYSV ABI\s0 option.
 .IP "\fB\-misel\fR" 4
 .IX Item "-misel"
 .PD 0
@@ -17979,7 +17988,7 @@
 .PD
 Enable the use (disable) of the built-in functions that allow direct
 access to the cryptographic instructions that were added in version
-2.07 of the PowerPC \s-1ISA\s0.
+2.07 of the PowerPC \s-1ISA.\s0
 .IP "\fB\-mdirect\-move\fR" 4
 .IX Item "-mdirect-move"
 .PD 0
@@ -17988,7 +17997,7 @@
 .PD
 Generate code that uses (does not use) the instructions to move data
 between the general purpose registers and the vector/scalar (\s-1VSX\s0)
-registers that were added in version 2.07 of the PowerPC \s-1ISA\s0.
+registers that were added in version 2.07 of the PowerPC \s-1ISA.\s0
 .IP "\fB\-mpower8\-fusion\fR" 4
 .IX Item "-mpower8-fusion"
 .PD 0
@@ -18005,7 +18014,7 @@
 .IX Item "-mno-power8-vector"
 .PD
 Generate code that uses (does not use) the vector and scalar
-instructions that were added in version 2.07 of the PowerPC \s-1ISA\s0.  Also
+instructions that were added in version 2.07 of the PowerPC \s-1ISA. \s0 Also
 enable the use of built-in functions that allow more direct access to
 the vector instructions.
 .IP "\fB\-mquad\-memory\fR" 4
@@ -18068,12 +18077,12 @@
 .IP "\fB\-mminimal\-toc\fR" 4
 .IX Item "-mminimal-toc"
 .PD
-Modify generation of the \s-1TOC\s0 (Table Of Contents), which is created for
+Modify generation of the \s-1TOC \s0(Table Of Contents), which is created for
 every executable file.  The \fB\-mfull\-toc\fR option is selected by
 default.  In that case, \s-1GCC\s0 allocates at least one \s-1TOC\s0 entry for
 each unique non-automatic variable reference in your program.  \s-1GCC\s0
-also places floating-point constants in the \s-1TOC\s0.  However, only
-16,384 entries are available in the \s-1TOC\s0.
+also places floating-point constants in the \s-1TOC. \s0 However, only
+16,384 entries are available in the \s-1TOC.\s0
 .Sp
 If you receive a linker error message that saying you have overflowed
 the available \s-1TOC\s0 space, you can reduce the amount of \s-1TOC\s0 space used
@@ -18081,7 +18090,7 @@
 \&\fB\-mno\-fp\-in\-toc\fR prevents \s-1GCC\s0 from putting floating-point
 constants in the \s-1TOC\s0 and \fB\-mno\-sum\-in\-toc\fR forces \s-1GCC\s0 to
 generate code to calculate the sum of an address and a constant at
-run time instead of putting that sum into the \s-1TOC\s0.  You may specify one
+run time instead of putting that sum into the \s-1TOC. \s0 You may specify one
 or both of these options.  Each causes \s-1GCC\s0 to produce very slightly
 slower and larger code at the expense of conserving \s-1TOC\s0 space.
 .Sp
@@ -18097,7 +18106,7 @@
 .IP "\fB\-maix32\fR" 4
 .IX Item "-maix32"
 .PD
-Enable 64\-bit \s-1AIX\s0 \s-1ABI\s0 and calling convention: 64\-bit pointers, 64\-bit
+Enable 64\-bit \s-1AIX ABI\s0 and calling convention: 64\-bit pointers, 64\-bit
 \&\f(CW\*(C`long\*(C'\fR type, and the infrastructure needed to support them.
 Specifying \fB\-maix64\fR implies \fB\-mpowerpc64\fR,
 while \fB\-maix32\fR disables the 64\-bit \s-1ABI\s0 and
@@ -18108,8 +18117,8 @@
 .IP "\fB\-mno\-xl\-compat\fR" 4
 .IX Item "-mno-xl-compat"
 .PD
-Produce code that conforms more closely to \s-1IBM\s0 \s-1XL\s0 compiler semantics
-when using AIX-compatible \s-1ABI\s0.  Pass floating-point arguments to
+Produce code that conforms more closely to \s-1IBM XL\s0 compiler semantics
+when using AIX-compatible \s-1ABI. \s0 Pass floating-point arguments to
 prototyped functions beyond the register save area (\s-1RSA\s0) on the stack
 in addition to argument FPRs.  Do not assume that most significant
 double in 128\-bit long double value is properly rounded when comparing
@@ -18118,16 +18127,16 @@
 .Sp
 The \s-1AIX\s0 calling convention was extended but not initially documented to
 handle an obscure K&R C case of calling a function that takes the
-address of its arguments with fewer arguments than declared.  \s-1IBM\s0 \s-1XL\s0
+address of its arguments with fewer arguments than declared.  \s-1IBM XL\s0
 compilers access floating-point arguments that do not fit in the
 \&\s-1RSA\s0 from the stack when a subroutine is compiled without
 optimization.  Because always storing floating-point arguments on the
 stack is inefficient and rarely needed, this option is not enabled by
-default and only is necessary when calling subroutines compiled by \s-1IBM\s0
-\&\s-1XL\s0 compilers without optimization.
+default and only is necessary when calling subroutines compiled by \s-1IBM
+XL\s0 compilers without optimization.
 .IP "\fB\-mpe\fR" 4
 .IX Item "-mpe"
-Support \fI\s-1IBM\s0 \s-1RS/6000\s0 \s-1SP\s0\fR \fIParallel Environment\fR (\s-1PE\s0).  Link an
+Support \fI\s-1IBM RS/6000 SP\s0\fR \fIParallel Environment\fR (\s-1PE\s0).  Link an
 application written to use message passing with special startup code to
 enable the application to run.  The system must have \s-1PE\s0 installed in the
 standard location (\fI/usr/lpp/ppe.poe/\fR), or the \fIspecs\fR file
@@ -18141,11 +18150,11 @@
 .IP "\fB\-malign\-power\fR" 4
 .IX Item "-malign-power"
 .PD
-On \s-1AIX\s0, 32\-bit Darwin, and 64\-bit PowerPC GNU/Linux, the option
+On \s-1AIX,\s0 32\-bit Darwin, and 64\-bit PowerPC GNU/Linux, the option
 \&\fB\-malign\-natural\fR overrides the ABI-defined alignment of larger
 types, such as floating-point doubles, on their natural size-based boundary.
 The option \fB\-malign\-power\fR instructs \s-1GCC\s0 to follow the ABI-specified
-alignment rules.  \s-1GCC\s0 defaults to the standard alignment defined in the \s-1ABI\s0.
+alignment rules.  \s-1GCC\s0 defaults to the standard alignment defined in the \s-1ABI.\s0
 .Sp
 On 64\-bit Darwin, natural alignment is the default, and \fB\-malign\-power\fR
 is not supported.
@@ -18179,7 +18188,7 @@
 and \fBdp_full\fR (equivalent to \fB\-mdouble\-float\fR).
 .IP "\fB\-mxilinx\-fpu\fR" 4
 .IX Item "-mxilinx-fpu"
-Perform optimizations for the floating-point unit on Xilinx \s-1PPC\s0 405/440.
+Perform optimizations for the floating-point unit on Xilinx \s-1PPC 405/440.\s0
 .IP "\fB\-mmultiple\fR" 4
 .IX Item "-mmultiple"
 .PD 0
@@ -18250,7 +18259,7 @@
 .IX Item "-mno-mulhw"
 .PD
 Generate code that uses (does not use) the half-word multiply and
-multiply-accumulate instructions on the \s-1IBM\s0 405, 440, 464 and 476 processors.
+multiply-accumulate instructions on the \s-1IBM 405, 440, 464\s0 and 476 processors.
 These instructions are generated by default when targeting those
 processors.
 .IP "\fB\-mdlmzb\fR" 4
@@ -18260,7 +18269,7 @@
 .IX Item "-mno-dlmzb"
 .PD
 Generate code that uses (does not use) the string-search \fBdlmzb\fR
-instruction on the \s-1IBM\s0 405, 440, 464 and 476 processors.  This instruction is
+instruction on the \s-1IBM 405, 440, 464\s0 and 476 processors.  This instruction is
 generated by default when targeting those processors.
 .IP "\fB\-mno\-bit\-align\fR" 4
 .IX Item "-mno-bit-align"
@@ -18340,7 +18349,7 @@
 the same as \fB\-mbig\fR.
 .IP "\fB\-mdynamic\-no\-pic\fR" 4
 .IX Item "-mdynamic-no-pic"
-On Darwin and Mac \s-1OS\s0 X systems, compile code so that it is not
+On Darwin and Mac \s-1OS X\s0 systems, compile code so that it is not
 relocatable, but that its external references are relocatable.  The
 resulting code is suitable for applications, but not shared
 libraries.
@@ -18446,11 +18455,11 @@
 OpenBSD operating system.
 .IP "\fB\-maix\-struct\-return\fR" 4
 .IX Item "-maix-struct-return"
-Return all structures in memory (as specified by the \s-1AIX\s0 \s-1ABI\s0).
+Return all structures in memory (as specified by the \s-1AIX ABI\s0).
 .IP "\fB\-msvr4\-struct\-return\fR" 4
 .IX Item "-msvr4-struct-return"
 Return structures smaller than 8 bytes in registers (as specified by the
-\&\s-1SVR4\s0 \s-1ABI\s0).
+\&\s-1SVR4 ABI\s0).
 .IP "\fB\-mabi=\fR\fIabi-type\fR" 4
 .IX Item "-mabi=abi-type"
 Extend the current \s-1ABI\s0 with a particular extension, or remove such extension.
@@ -18459,29 +18468,29 @@
 \&\fIelfv1\fR, \fIelfv2\fR.
 .IP "\fB\-mabi=spe\fR" 4
 .IX Item "-mabi=spe"
-Extend the current \s-1ABI\s0 with \s-1SPE\s0 \s-1ABI\s0 extensions.  This does not change
-the default \s-1ABI\s0, instead it adds the \s-1SPE\s0 \s-1ABI\s0 extensions to the current
-\&\s-1ABI\s0.
+Extend the current \s-1ABI\s0 with \s-1SPE ABI\s0 extensions.  This does not change
+the default \s-1ABI,\s0 instead it adds the \s-1SPE ABI\s0 extensions to the current
+\&\s-1ABI.\s0
 .IP "\fB\-mabi=no\-spe\fR" 4
 .IX Item "-mabi=no-spe"
-Disable Book-E \s-1SPE\s0 \s-1ABI\s0 extensions for the current \s-1ABI\s0.
+Disable Book-E \s-1SPE ABI\s0 extensions for the current \s-1ABI.\s0
 .IP "\fB\-mabi=ibmlongdouble\fR" 4
 .IX Item "-mabi=ibmlongdouble"
 Change the current \s-1ABI\s0 to use \s-1IBM\s0 extended-precision long double.
-This is a PowerPC 32\-bit \s-1SYSV\s0 \s-1ABI\s0 option.
+This is a PowerPC 32\-bit \s-1SYSV ABI\s0 option.
 .IP "\fB\-mabi=ieeelongdouble\fR" 4
 .IX Item "-mabi=ieeelongdouble"
 Change the current \s-1ABI\s0 to use \s-1IEEE\s0 extended-precision long double.
 This is a PowerPC 32\-bit Linux \s-1ABI\s0 option.
 .IP "\fB\-mabi=elfv1\fR" 4
 .IX Item "-mabi=elfv1"
-Change the current \s-1ABI\s0 to use the ELFv1 \s-1ABI\s0.
+Change the current \s-1ABI\s0 to use the ELFv1 \s-1ABI.\s0
 This is the default \s-1ABI\s0 for big-endian PowerPC 64\-bit Linux.
 Overriding the default \s-1ABI\s0 requires special system support and is
 likely to fail in spectacular ways.
 .IP "\fB\-mabi=elfv2\fR" 4
 .IX Item "-mabi=elfv2"
-Change the current \s-1ABI\s0 to use the ELFv2 \s-1ABI\s0.
+Change the current \s-1ABI\s0 to use the ELFv2 \s-1ABI.\s0
 This is the default \s-1ABI\s0 for little-endian PowerPC 64\-bit Linux.
 Overriding the default \s-1ABI\s0 requires special system support and is
 likely to fail in spectacular ways.
@@ -18635,7 +18644,7 @@
 callee, L42\*(C'\fR, plus a \fIbranch island\fR (glue code).  The two target
 addresses represent the callee and the branch island.  The
 Darwin/PPC linker prefers the first address and generates a \f(CW\*(C`bl
-callee\*(C'\fR if the \s-1PPC\s0 \f(CW\*(C`bl\*(C'\fR instruction reaches the callee directly;
+callee\*(C'\fR if the \s-1PPC \s0\f(CW\*(C`bl\*(C'\fR instruction reaches the callee directly;
 otherwise, the linker generates \f(CW\*(C`bl L42\*(C'\fR to call the branch
 island.  The branch island is appended to the body of the
 calling function; it computes the full 32\-bit address of the callee
@@ -18707,7 +18716,7 @@
 .PD
 Assume (do not assume) that the reciprocal estimate instructions
 provide higher-precision estimates than is mandated by the PowerPC
-\&\s-1ABI\s0.  Selecting \fB\-mcpu=power6\fR, \fB\-mcpu=power7\fR or
+\&\s-1ABI. \s0 Selecting \fB\-mcpu=power6\fR, \fB\-mcpu=power7\fR or
 \&\fB\-mcpu=power8\fR automatically selects \fB\-mrecip\-precision\fR.
 The double-precision square root estimate instructions are not generated by
 default on low-precision machines, since they do not provide an
@@ -18780,14 +18789,14 @@
 .PD
 Generate (do not generate) code to pass structure parameters with a
 maximum alignment of 64 bits, for compatibility with older versions
-of \s-1GCC\s0.
+of \s-1GCC.\s0
 .Sp
-Older versions of \s-1GCC\s0 (prior to 4.9.0) incorrectly did not align a
+Older versions of \s-1GCC \s0(prior to 4.9.0) incorrectly did not align a
 structure parameter on a 128\-bit boundary when that structure contained
 a member requiring 128\-bit alignment.  This is corrected in more
-recent versions of \s-1GCC\s0.  This option may be used to generate code
+recent versions of \s-1GCC. \s0 This option may be used to generate code
 that is compatible with functions compiled with older versions of
-\&\s-1GCC\s0.
+\&\s-1GCC.\s0
 .Sp
 The \fB\-mno\-compat\-align\-parm\fR option is the default.
 .PP
@@ -18822,12 +18831,12 @@
 .Sp
 \&\fINote\fR If the \fB\-fpu\fR option is enabled then
 \&\fB\-funsafe\-math\-optimizations\fR is also enabled automatically.
-This is because the \s-1RX\s0 \s-1FPU\s0 instructions are themselves unsafe.
+This is because the \s-1RX FPU\s0 instructions are themselves unsafe.
 .IP "\fB\-mcpu=\fR\fIname\fR" 4
 .IX Item "-mcpu=name"
-Selects the type of \s-1RX\s0 \s-1CPU\s0 to be targeted.  Currently three types are
+Selects the type of \s-1RX CPU\s0 to be targeted.  Currently three types are
 supported, the generic \fI\s-1RX600\s0\fR and \fI\s-1RX200\s0\fR series hardware and
-the specific \fI\s-1RX610\s0\fR \s-1CPU\s0.  The default is \fI\s-1RX600\s0\fR.
+the specific \fI\s-1RX610\s0\fR \s-1CPU. \s0 The default is \fI\s-1RX600\s0\fR.
 .Sp
 The only difference between \fI\s-1RX600\s0\fR and \fI\s-1RX610\s0\fR is that the
 \&\fI\s-1RX610\s0\fR does not support the \f(CW\*(C`MVTIPL\*(C'\fR instruction.
@@ -19013,7 +19022,7 @@
 Store (do not store) the address of the caller's frame as backchain pointer
 into the callee's stack frame.
 A backchain may be needed to allow debugging using tools that do not understand
-\&\s-1DWARF\s0 2 call frame information.
+\&\s-1DWARF 2\s0 call frame information.
 When \fB\-mno\-packed\-stack\fR is in effect, the backchain pointer is stored
 at the bottom of the stack frame; when \fB\-mpacked\-stack\fR is in effect,
 the backchain is placed into the topmost word of the 96/160 byte register
@@ -19045,7 +19054,7 @@
 .Sp
 As long as the stack frame backchain is not used, code generated with
 \&\fB\-mpacked\-stack\fR is call-compatible with code generated with
-\&\fB\-mno\-packed\-stack\fR.  Note that some non-FSF releases of \s-1GCC\s0 2.95 for
+\&\fB\-mno\-packed\-stack\fR.  Note that some non-FSF releases of \s-1GCC 2.95\s0 for
 S/390 or zSeries generated code that uses the stack frame backchain at run
 time, not just for debugging purposes.  Such code is not call-compatible
 with code compiled with \fB\-mpacked\-stack\fR.  Also, note that the
@@ -19072,8 +19081,8 @@
 .IX Item "-m31"
 .PD
 When \fB\-m31\fR is specified, generate code compliant to the
-GNU/Linux for S/390 \s-1ABI\s0.  When \fB\-m64\fR is specified, generate
-code compliant to the GNU/Linux for zSeries \s-1ABI\s0.  This allows \s-1GCC\s0 in
+GNU/Linux for S/390 \s-1ABI. \s0 When \fB\-m64\fR is specified, generate
+code compliant to the GNU/Linux for zSeries \s-1ABI. \s0 This allows \s-1GCC\s0 in
 particular to generate 64\-bit instructions.  For the \fBs390\fR
 targets, the default is \fB\-m31\fR, while the \fBs390x\fR
 targets default to \fB\-m64\fR.
@@ -19086,11 +19095,11 @@
 When \fB\-mzarch\fR is specified, generate code using the
 instructions available on z/Architecture.
 When \fB\-mesa\fR is specified, generate code using the
-instructions available on \s-1ESA/390\s0.  Note that \fB\-mesa\fR is
+instructions available on \s-1ESA/390. \s0 Note that \fB\-mesa\fR is
 not possible with \fB\-m64\fR.
-When generating code compliant to the GNU/Linux for S/390 \s-1ABI\s0,
+When generating code compliant to the GNU/Linux for S/390 \s-1ABI,\s0
 the default is \fB\-mesa\fR.  When generating code compliant
-to the GNU/Linux for zSeries \s-1ABI\s0, the default is \fB\-mzarch\fR.
+to the GNU/Linux for zSeries \s-1ABI,\s0 the default is \fB\-mzarch\fR.
 .IP "\fB\-mmvcle\fR" 4
 .IX Item "-mmvcle"
 .PD 0
@@ -19130,9 +19139,9 @@
 .IP "\fB\-mno\-tpf\-trace\fR" 4
 .IX Item "-mno-tpf-trace"
 .PD
-Generate code that adds (does not add) in \s-1TPF\s0 \s-1OS\s0 specific branches to trace
+Generate code that adds (does not add) in \s-1TPF OS\s0 specific branches to trace
 routines in the operating system.  This option is off by default, even
-when compiling for the \s-1TPF\s0 \s-1OS\s0.
+when compiling for the \s-1TPF OS.\s0
 .IP "\fB\-mfused\-madd\fR" 4
 .IX Item "-mfused-madd"
 .PD 0
@@ -19228,16 +19237,16 @@
 These \fB\-m\fR options are defined for the \s-1SH\s0 implementations:
 .IP "\fB\-m1\fR" 4
 .IX Item "-m1"
-Generate code for the \s-1SH1\s0.
+Generate code for the \s-1SH1.\s0
 .IP "\fB\-m2\fR" 4
 .IX Item "-m2"
-Generate code for the \s-1SH2\s0.
+Generate code for the \s-1SH2.\s0
 .IP "\fB\-m2e\fR" 4
 .IX Item "-m2e"
 Generate code for the SH2e.
 .IP "\fB\-m2a\-nofpu\fR" 4
 .IX Item "-m2a-nofpu"
-Generate code for the SH2a without \s-1FPU\s0, or for a SH2a\-FPU in such a way
+Generate code for the SH2a without \s-1FPU,\s0 or for a SH2a\-FPU in such a way
 that the floating-point unit is not used.
 .IP "\fB\-m2a\-single\-only\fR" 4
 .IX Item "-m2a-single-only"
@@ -19253,7 +19262,7 @@
 double-precision mode by default.
 .IP "\fB\-m3\fR" 4
 .IX Item "-m3"
-Generate code for the \s-1SH3\s0.
+Generate code for the \s-1SH3.\s0
 .IP "\fB\-m3e\fR" 4
 .IX Item "-m3e"
 Generate code for the SH3e.
@@ -19270,7 +19279,7 @@
 single-precision mode by default.
 .IP "\fB\-m4\fR" 4
 .IX Item "-m4"
-Generate code for the \s-1SH4\s0.
+Generate code for the \s-1SH4.\s0
 .IP "\fB\-m4a\-nofpu\fR" 4
 .IX Item "-m4a-nofpu"
 Generate code for the SH4al\-dsp, or for a SH4a in such a way that the
@@ -19312,7 +19321,7 @@
 16\-bit offsets.
 .IP "\fB\-mbitops\fR" 4
 .IX Item "-mbitops"
-Enable the use of bit manipulation instructions on \s-1SH2A\s0.
+Enable the use of bit manipulation instructions on \s-1SH2A.\s0
 .IP "\fB\-mfmovd\fR" 4
 .IX Item "-mfmovd"
 Enable the use of the instruction \f(CW\*(C`fmovd\*(C'\fR.  Check \fB\-mdalign\fR for
@@ -19362,7 +19371,7 @@
 .IP "\fB\-mpadstruct\fR" 4
 .IX Item "-mpadstruct"
 This option is deprecated.  It pads structures to multiple of 4 bytes,
-which is incompatible with the \s-1SH\s0 \s-1ABI\s0.
+which is incompatible with the \s-1SH ABI.\s0
 .IP "\fB\-matomic\-model=\fR\fImodel\fR" 4
 .IX Item "-matomic-model=model"
 Sets the model of atomic operations and additional parameters as a comma
@@ -19379,7 +19388,7 @@
 built-in functions.  The generated atomic sequences require additional support
 from the interrupt/exception handling code of the system and are only suitable
 for SH3* and SH4* single-core systems.  This option is enabled by default when
-the target is \f(CW\*(C`sh\-*\-linux*\*(C'\fR and SH3* or SH4*.  When the target is \s-1SH4A\s0,
+the target is \f(CW\*(C`sh\-*\-linux*\*(C'\fR and SH3* or SH4*.  When the target is \s-1SH4A,\s0
 this option will also partially utilize the hardware atomic instructions
 \&\f(CW\*(C`movli.l\*(C'\fR and \f(CW\*(C`movco.l\*(C'\fR to create more efficient code, unless
 \&\fBstrict\fR is specified.
@@ -19520,20 +19529,20 @@
 .IX Item "call-div1"
 Calls a library function that uses the single-step division instruction
 \&\f(CW\*(C`div1\*(C'\fR to perform the operation.  Division by zero calculates an
-unspecified result and does not trap.  This is the default except for \s-1SH4\s0,
-\&\s-1SH2A\s0 and SHcompact.
+unspecified result and does not trap.  This is the default except for \s-1SH4,
+SH2A\s0 and SHcompact.
 .IP "\fBcall-fp\fR" 4
 .IX Item "call-fp"
 Calls a library function that performs the operation in double precision
 floating point.  Division by zero causes a floating-point exception.  This is
-the default for SHcompact with \s-1FPU\s0.  Specifying this for targets that do not
+the default for SHcompact with \s-1FPU. \s0 Specifying this for targets that do not
 have a double precision \s-1FPU\s0 will default to \f(CW\*(C`call\-div1\*(C'\fR.
 .IP "\fBcall-table\fR" 4
 .IX Item "call-table"
 Calls a library function that uses a lookup table for small divisors and
 the \f(CW\*(C`div1\*(C'\fR instruction with case distinction for larger divisors.  Division
 by zero calculates an unspecified result and does not trap.  This is the default
-for \s-1SH4\s0.  Specifying this for targets that do not have dynamic shift
+for \s-1SH4. \s0 Specifying this for targets that do not have dynamic shift
 instructions will default to \f(CW\*(C`call\-div1\*(C'\fR.
 .RE
 .RS 4
@@ -19567,10 +19576,10 @@
 Enable the use of the indexed addressing mode for SHmedia32/SHcompact.
 This is only safe if the hardware and/or \s-1OS\s0 implement 32\-bit wrap-around
 semantics for the indexed addressing mode.  The architecture allows the
-implementation of processors with 64\-bit \s-1MMU\s0, which the \s-1OS\s0 could use to
+implementation of processors with 64\-bit \s-1MMU,\s0 which the \s-1OS\s0 could use to
 get 32\-bit addressing, but since no current hardware implementation supports
 this or any other way to make the indexed addressing mode safe to use in
-the 32\-bit \s-1ABI\s0, the default is \fB\-mno\-indexed\-addressing\fR.
+the 32\-bit \s-1ABI,\s0 the default is \fB\-mno\-indexed\-addressing\fR.
 .IP "\fB\-mgettrcost=\fR\fInumber\fR" 4
 .IX Item "-mgettrcost=number"
 Set the cost assumed for the \f(CW\*(C`gettr\*(C'\fR instruction to \fInumber\fR.
@@ -19607,7 +19616,7 @@
 but with assembler and/or linker tricks it is possible
 to generate symbols that cause \f(CW\*(C`ptabs\*(C'\fR or \f(CW\*(C`ptrel\*(C'\fR to trap.
 This option is only meaningful when \fB\-mno\-pt\-fixed\fR is in effect.
-It prevents cross-basic-block \s-1CSE\s0, hoisting and most scheduling
+It prevents cross-basic-block \s-1CSE,\s0 hoisting and most scheduling
 of symbol loads.  The default is \fB\-mno\-invalid\-symbols\fR.
 .IP "\fB\-mbranch\-cost=\fR\fInum\fR" 4
 .IX Item "-mbranch-cost=num"
@@ -19624,7 +19633,7 @@
 Assume (do not assume) that zero displacement conditional branch instructions
 \&\f(CW\*(C`bt\*(C'\fR and \f(CW\*(C`bf\*(C'\fR are fast.  If \fB\-mzdcbranch\fR is specified, the
 compiler will try to prefer zero displacement branch code sequences.  This is
-enabled by default when generating code for \s-1SH4\s0 and \s-1SH4A\s0.  It can be explicitly
+enabled by default when generating code for \s-1SH4\s0 and \s-1SH4A. \s0 It can be explicitly
 disabled by specifying \fB\-mno\-zdcbranch\fR.
 .IP "\fB\-mfused\-madd\fR" 4
 .IX Item "-mfused-madd"
@@ -19647,7 +19656,7 @@
 Allow or disallow the compiler to emit the \f(CW\*(C`fsca\*(C'\fR instruction for sine
 and cosine approximations.  The option \f(CW\*(C`\-mfsca\*(C'\fR must be used in
 combination with \f(CW\*(C`\-funsafe\-math\-optimizations\*(C'\fR.  It is enabled by default
-when generating code for \s-1SH4A\s0.  Using \f(CW\*(C`\-mno\-fsca\*(C'\fR disables sine and cosine
+when generating code for \s-1SH4A. \s0 Using \f(CW\*(C`\-mno\-fsca\*(C'\fR disables sine and cosine
 approximations even if \f(CW\*(C`\-funsafe\-math\-optimizations\*(C'\fR is in effect.
 .IP "\fB\-mfsrra\fR" 4
 .IX Item "-mfsrra"
@@ -19659,7 +19668,7 @@
 reciprocal square root approximations.  The option \f(CW\*(C`\-mfsrra\*(C'\fR must be used
 in combination with \f(CW\*(C`\-funsafe\-math\-optimizations\*(C'\fR and
 \&\f(CW\*(C`\-ffinite\-math\-only\*(C'\fR.  It is enabled by default when generating code for
-\&\s-1SH4A\s0.  Using \f(CW\*(C`\-mno\-fsrra\*(C'\fR disables reciprocal square root approximations
+\&\s-1SH4A. \s0 Using \f(CW\*(C`\-mno\-fsrra\*(C'\fR disables reciprocal square root approximations
 even if \f(CW\*(C`\-funsafe\-math\-optimizations\*(C'\fR and \f(CW\*(C`\-ffinite\-math\-only\*(C'\fR are
 in effect.
 .IP "\fB\-mpretend\-cmove\fR" 4
@@ -19713,7 +19722,7 @@
 .IX Item "-mapp-regs"
 .PD
 Specify \fB\-mapp\-regs\fR to generate output using the global registers
-2 through 4, which the \s-1SPARC\s0 \s-1SVR4\s0 \s-1ABI\s0 reserves for applications.  Like the
+2 through 4, which the \s-1SPARC SVR4 ABI\s0 reserves for applications.  Like the
 global register 1, each global register 2 through 4 is then treated as an
 allocable register that is clobbered by function calls.  This is the default.
 .Sp
@@ -19759,7 +19768,7 @@
 \&\fB\-msoft\-float\fR changes the calling convention in the output file;
 therefore, it is only useful if you compile \fIall\fR of a program with
 this option.  In particular, you need to compile \fIlibgcc.a\fR, the
-library that comes with \s-1GCC\s0, with \fB\-msoft\-float\fR in order for
+library that comes with \s-1GCC,\s0 with \fB\-msoft\-float\fR in order for
 this to work.
 .IP "\fB\-mhard\-quad\-float\fR" 4
 .IX Item "-mhard-quad-float"
@@ -19769,7 +19778,7 @@
 .IX Item "-msoft-quad-float"
 Generate output containing library calls for quad-word (long double)
 floating-point instructions.  The functions called are those specified
-in the \s-1SPARC\s0 \s-1ABI\s0.  This is the default.
+in the \s-1SPARC ABI. \s0 This is the default.
 .Sp
 As of this writing, there are no \s-1SPARC\s0 implementations that have hardware
 support for the quad-word floating-point instructions.  They all invoke
@@ -19810,10 +19819,10 @@
 should have 8\-byte alignment.  This enables the use of pairs of
 \&\f(CW\*(C`ldd\*(C'\fR and \f(CW\*(C`std\*(C'\fR instructions for copies in structure
 assignment, in place of twice as many \f(CW\*(C`ld\*(C'\fR and \f(CW\*(C`st\*(C'\fR pairs.
-However, the use of this changed alignment directly violates the \s-1SPARC\s0
-\&\s-1ABI\s0.  Thus, it's intended only for use on targets where the developer
+However, the use of this changed alignment directly violates the \s-1SPARC
+ABI. \s0 Thus, it's intended only for use on targets where the developer
 acknowledges that their resulting code is not directly in line with
-the rules of the \s-1ABI\s0.
+the rules of the \s-1ABI.\s0
 .IP "\fB\-mcpu=\fR\fIcpu_type\fR" 4
 .IX Item "-mcpu=cpu_type"
 Set the instruction set, register set, and instruction scheduling parameters
@@ -19863,22 +19872,22 @@
 With \fB\-mcpu=v8\fR, \s-1GCC\s0 generates code for the V8 variant of the \s-1SPARC\s0
 architecture.  The only difference from V7 code is that the compiler emits
 the integer multiply and integer divide instructions which exist in \s-1SPARC\-V8\s0
-but not in \s-1SPARC\-V7\s0.  With \fB\-mcpu=supersparc\fR, the compiler additionally
+but not in \s-1SPARC\-V7. \s0 With \fB\-mcpu=supersparc\fR, the compiler additionally
 optimizes it for the SuperSPARC chip, as used in the SPARCStation 10, 1000 and
 2000 series.
 .Sp
 With \fB\-mcpu=sparclite\fR, \s-1GCC\s0 generates code for the SPARClite variant of
 the \s-1SPARC\s0 architecture.  This adds the integer multiply, integer divide step
-and scan (\f(CW\*(C`ffs\*(C'\fR) instructions which exist in SPARClite but not in \s-1SPARC\-V7\s0.
+and scan (\f(CW\*(C`ffs\*(C'\fR) instructions which exist in SPARClite but not in \s-1SPARC\-V7.\s0
 With \fB\-mcpu=f930\fR, the compiler additionally optimizes it for the
-Fujitsu \s-1MB86930\s0 chip, which is the original SPARClite, with no \s-1FPU\s0.  With
+Fujitsu \s-1MB86930\s0 chip, which is the original SPARClite, with no \s-1FPU. \s0 With
 \&\fB\-mcpu=f934\fR, the compiler additionally optimizes it for the Fujitsu
-\&\s-1MB86934\s0 chip, which is the more recent SPARClite with \s-1FPU\s0.
+\&\s-1MB86934\s0 chip, which is the more recent SPARClite with \s-1FPU.\s0
 .Sp
 With \fB\-mcpu=sparclet\fR, \s-1GCC\s0 generates code for the SPARClet variant of
 the \s-1SPARC\s0 architecture.  This adds the integer multiply, multiply/accumulate,
 integer divide step and scan (\f(CW\*(C`ffs\*(C'\fR) instructions which exist in SPARClet
-but not in \s-1SPARC\-V7\s0.  With \fB\-mcpu=tsc701\fR, the compiler additionally
+but not in \s-1SPARC\-V7. \s0 With \fB\-mcpu=tsc701\fR, the compiler additionally
 optimizes it for the \s-1TEMIC\s0 SPARClet chip.
 .Sp
 With \fB\-mcpu=v9\fR, \s-1GCC\s0 generates code for the V9 variant of the \s-1SPARC\s0
@@ -19915,7 +19924,7 @@
 .IP "\fB\-mno\-v8plus\fR" 4
 .IX Item "-mno-v8plus"
 .PD
-With \fB\-mv8plus\fR, \s-1GCC\s0 generates code for the \s-1SPARC\-V8+\s0 \s-1ABI\s0.  The
+With \fB\-mv8plus\fR, \s-1GCC\s0 generates code for the \s-1SPARC\-V8+ ABI. \s0 The
 difference from the V8 \s-1ABI\s0 is that the global and out registers are
 considered 64 bits wide.  This is enabled by default on Solaris in 32\-bit
 mode for all \s-1SPARC\-V9\s0 processors.
@@ -20370,9 +20379,9 @@
 v850e, v850e1, v850e2, v850e2v3 and v850e3v5 flavors of the v850
 architecture.
 .Sp
-This option is enabled by default when the \s-1RH850\s0 \s-1ABI\s0 is
+This option is enabled by default when the \s-1RH850 ABI\s0 is
 in use (see \fB\-mrh850\-abi\fR), and disabled by default when the
-\&\s-1GCC\s0 \s-1ABI\s0 is in use.  If \f(CW\*(C`CALLT\*(C'\fR instructions are being generated
+\&\s-1GCC ABI\s0 is in use.  If \f(CW\*(C`CALLT\*(C'\fR instructions are being generated
 then the C preprocessor symbol \f(CW\*(C`_\|_V850_CALLT_\|_\*(C'\fR will be defined.
 .IP "\fB\-mrelax\fR" 4
 .IX Item "-mrelax"
@@ -20412,7 +20421,7 @@
 .IP "\fB\-mghs\fR" 4
 .IX Item "-mghs"
 .PD
-Enables support for the \s-1RH850\s0 version of the V850 \s-1ABI\s0.  This is the
+Enables support for the \s-1RH850\s0 version of the V850 \s-1ABI. \s0 This is the
 default.  With this version of the \s-1ABI\s0 the following rules apply:
 .RS 4
 .IP "\(bu" 4
@@ -20437,7 +20446,7 @@
 .RE
 .IP "\fB\-mgcc\-abi\fR" 4
 .IX Item "-mgcc-abi"
-Enables support for the old \s-1GCC\s0 version of the V850 \s-1ABI\s0.  With this
+Enables support for the old \s-1GCC\s0 version of the V850 \s-1ABI. \s0 With this
 version of the \s-1ABI\s0 the following rules apply:
 .RS 4
 .IP "\(bu" 4
@@ -20627,7 +20636,7 @@
 Control the treatment of literal pools.  The default is
 \&\fB\-mno\-text\-section\-literals\fR, which places literals in a separate
 section in the output file.  This allows the literal pool to be placed
-in a data \s-1RAM/ROM\s0, and it also allows the linker to combine literal
+in a data \s-1RAM/ROM,\s0 and it also allows the linker to combine literal
 pools from separate object files to remove redundant literals and
 improve code size.  With \fB\-mtext\-section\-literals\fR, the literals
 are interspersed in the text section in order to keep them as close as
@@ -20812,7 +20821,7 @@
 that needs this handling enables it on your behalf.
 .IP "\fB\-fasynchronous\-unwind\-tables\fR" 4
 .IX Item "-fasynchronous-unwind-tables"
-Generate unwind table in \s-1DWARF\s0 2 format, if supported by target machine.  The
+Generate unwind table in \s-1DWARF 2\s0 format, if supported by target machine.  The
 table is exact at each instruction boundary, so it can be used for stack
 unwinding from asynchronous events (such as debugger or garbage collector).
 .IP "\fB\-fno\-gnu\-unique\fR" 4
@@ -20883,7 +20892,7 @@
 .IX Item "-fshort-wchar"
 Override the underlying type for \fBwchar_t\fR to be \fBshort
 unsigned int\fR instead of the default for the target.  This option is
-useful for building programs to run under \s-1WINE\s0.
+useful for building programs to run under \s-1WINE.\s0
 .Sp
 \&\fBWarning:\fR the \fB\-fshort\-wchar\fR switch causes \s-1GCC\s0 to generate
 code that is not binary compatible with code generated without that switch.
@@ -20896,7 +20905,7 @@
 in a common block.
 This is the behavior specified by \fB\-fcommon\fR, and is the default
 for \s-1GCC\s0 on most targets.
-On the other hand, this behavior is not required by \s-1ISO\s0 C, and on some
+On the other hand, this behavior is not required by \s-1ISO C,\s0 and on some
 targets may carry a speed or code size penalty on variable references.
 The \fB\-fno\-common\fR option specifies that the compiler should place
 uninitialized global variables in the data section of the object file,
@@ -20952,11 +20961,11 @@
 maximum size, you get an error message from the linker indicating that
 \&\fB\-fpic\fR does not work; in that case, recompile with \fB\-fPIC\fR
 instead.  (These maximums are 8k on the \s-1SPARC\s0 and 32k
-on the m68k and \s-1RS/6000\s0.  The 386 has no such limit.)
+on the m68k and \s-1RS/6000. \s0 The 386 has no such limit.)
 .Sp
 Position-independent code requires special support, and therefore works
 only on certain machines.  For the 386, \s-1GCC\s0 supports \s-1PIC\s0 for System V
-but not for the Sun 386i.  Code generated for the \s-1IBM\s0 \s-1RS/6000\s0 is always
+but not for the Sun 386i.  Code generated for the \s-1IBM RS/6000\s0 is always
 position-independent.
 .Sp
 When this flag is set, the macros \f(CW\*(C`_\|_pic_\|_\*(C'\fR and \f(CW\*(C`_\|_PIC_\|_\*(C'\fR
@@ -20966,7 +20975,7 @@
 If supported for the target machine, emit position-independent code,
 suitable for dynamic linking and avoiding any limit on the size of the
 global offset table.  This option makes a difference on the m68k,
-PowerPC and \s-1SPARC\s0.
+PowerPC and \s-1SPARC.\s0
 .Sp
 Position-independent code requires special support, and therefore works
 only on certain machines.
@@ -21116,7 +21125,7 @@
 internal mangled name (e.g., \f(CW\*(C`_Z4blahRSt6vectorIiSaIiEE\*(C'\fR).  The
 match is done on substrings: if the \fIsym\fR parameter is a substring
 of the function name, it is considered to be a match.  For C99 and \*(C+
-extended identifiers, the function name must be given in \s-1UTF\-8\s0, not
+extended identifiers, the function name must be given in \s-1UTF\-8,\s0 not
 using universal character names.
 .IP "\fB\-fstack\-check\fR" 4
 .IX Item "-fstack-check"
@@ -21229,7 +21238,7 @@
 The default if \fB\-fvisibility\fR isn't specified is
 \&\f(CW\*(C`default\*(C'\fR, i.e., make every
 symbol public\-\-\-this causes the same behavior as previous versions of
-\&\s-1GCC\s0.
+\&\s-1GCC.\s0
 .Sp
 A good explanation of the benefits offered by ensuring \s-1ELF\s0
 symbols have the correct visibility is given by \*(L"How To Write
@@ -21254,7 +21263,7 @@
 only for use within the local \s-1DSO\s0 should \fBalways\fR be marked explicitly
 as hidden as so to avoid \s-1PLT\s0 indirection overheads\-\-\-making this
 abundantly clear also aids readability and self-documentation of the code.
-Note that due to \s-1ISO\s0 \*(C+ specification requirements, \f(CW\*(C`operator new\*(C'\fR and
+Note that due to \s-1ISO \*(C+\s0 specification requirements, \f(CW\*(C`operator new\*(C'\fR and
 \&\f(CW\*(C`operator delete\*(C'\fR must always be of default visibility.
 .Sp
 Be aware that headers from outside your project, in particular system
@@ -21266,7 +21275,7 @@
 \&\fBextern\fR declarations are not affected by \fB\-fvisibility\fR, so
 a lot of code can be recompiled with \fB\-fvisibility=hidden\fR with
 no modifications.  However, this means that calls to \f(CW\*(C`extern\*(C'\fR
-functions with no explicit visibility use the \s-1PLT\s0, so it is more
+functions with no explicit visibility use the \s-1PLT,\s0 so it is more
 effective to use \f(CW\*(C`_\|_attribute ((visibility))\*(C'\fR and/or
 \&\f(CW\*(C`#pragma GCC visibility\*(C'\fR to tell the compiler which \f(CW\*(C`extern\*(C'\fR
 declarations should be treated as hidden.
@@ -21328,7 +21337,7 @@
 Note that you can also specify places to search using options such as
 \&\fB\-B\fR, \fB\-I\fR and \fB\-L\fR.  These
 take precedence over places specified using environment variables, which
-in turn take precedence over those specified by the configuration of \s-1GCC\s0.
+in turn take precedence over those specified by the configuration of \s-1GCC.\s0
 .IP "\fB\s-1LANG\s0\fR" 4
 .IX Item "LANG"
 .PD 0
@@ -21345,7 +21354,7 @@
 \&\fB\s-1LC_CTYPE\s0\fR and \fB\s-1LC_MESSAGES\s0\fR if it has been configured to do
 so.  These locale categories can be set to any value supported by your
 installation.  A typical value is \fBen_GB.UTF\-8\fR for English in the United
-Kingdom encoded in \s-1UTF\-8\s0.
+Kingdom encoded in \s-1UTF\-8.\s0
 .Sp
 The \fB\s-1LC_CTYPE\s0\fR environment variable specifies character
 classification.  \s-1GCC\s0 uses it to determine the character boundaries in
@@ -21525,7 +21534,7 @@
 .IX Header "AUTHOR"
 See the Info entry for \fBgcc\fR, or
 <\fBhttp://gcc.gnu.org/onlinedocs/gcc/Contributors.html\fR>,
-for contributors to \s-1GCC\s0.
+for contributors to \s-1GCC.\s0
 .SH "COPYRIGHT"
 .IX Header "COPYRIGHT"
 Copyright (c) 1988\-2014 Free Software Foundation, Inc.
diff --git a/share/man/man7/gpl.7 b/share/man/man7/gpl.7
index ac64e25..56df74b 100644
--- a/share/man/man7/gpl.7
+++ b/share/man/man7/gpl.7
@@ -1,4 +1,4 @@
-.\" Automatically generated by Pod::Man 2.25 (Pod::Simple 3.16)
+.\" Automatically generated by Pod::Man 2.27 (Pod::Simple 3.28)
 .\"
 .\" Standard preamble:
 .\" ========================================================================
@@ -38,6 +38,8 @@
 .    ds PI \(*p
 .    ds L" ``
 .    ds R" ''
+.    ds C`
+.    ds C'
 'br\}
 .\"
 .\" Escape single quotes in literal strings from groff's Unicode transform.
@@ -48,17 +50,24 @@
 .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
 .\" entries marked with X<> in POD.  Of course, you'll have to process the
 .\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
 ..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{
+.    if \nF \{
+.        de IX
+.        tm Index:\\$1\t\\n%\t"\\$2"
 ..
+.        if !\nF==2 \{
+.            nr % 0
+.            nr F 2
+.        \}
+.    \}
 .\}
+.rr rF
 .\"
 .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
 .\" Fear.  Run.  Save yourself.  No user-serviceable parts.
@@ -176,7 +185,7 @@
 receive or can get the source code.  And you must show them these
 terms so they know their rights.
 .PP
-Developers that use the \s-1GNU\s0 \s-1GPL\s0 protect your rights with two steps:
+Developers that use the \s-1GNU GPL\s0 protect your rights with two steps:
 (1) assert copyright on the software, and (2) offer you this License
 giving you legal permission to copy, distribute and/or modify it.
 .PP
@@ -195,7 +204,7 @@
 Therefore, we have designed this version of the \s-1GPL\s0 to prohibit the
 practice for those products.  If such problems arise substantially in
 other domains, we stand ready to extend this provision to those
-domains in future versions of the \s-1GPL\s0, as needed to protect the
+domains in future versions of the \s-1GPL,\s0 as needed to protect the
 freedom of users.
 .PP
 Finally, every program is threatened constantly by software patents.
@@ -207,7 +216,7 @@
 .PP
 The precise terms and conditions for copying, distribution and
 modification follow.
-.SS "\s-1TERMS\s0 \s-1AND\s0 \s-1CONDITIONS\s0"
+.SS "\s-1TERMS AND CONDITIONS\s0"
 .IX Subsection "TERMS AND CONDITIONS"
 .IP "0. Definitions." 4
 .IX Item "0. Definitions."
@@ -742,26 +751,26 @@
 later version.
 .IP "15. Disclaimer of Warranty." 4
 .IX Item "15. Disclaimer of Warranty."
-\&\s-1THERE\s0 \s-1IS\s0 \s-1NO\s0 \s-1WARRANTY\s0 \s-1FOR\s0 \s-1THE\s0 \s-1PROGRAM\s0, \s-1TO\s0 \s-1THE\s0 \s-1EXTENT\s0 \s-1PERMITTED\s0 \s-1BY\s0
-\&\s-1APPLICABLE\s0 \s-1LAW\s0.  \s-1EXCEPT\s0 \s-1WHEN\s0 \s-1OTHERWISE\s0 \s-1STATED\s0 \s-1IN\s0 \s-1WRITING\s0 \s-1THE\s0 \s-1COPYRIGHT\s0
-\&\s-1HOLDERS\s0 \s-1AND/OR\s0 \s-1OTHER\s0 \s-1PARTIES\s0 \s-1PROVIDE\s0 \s-1THE\s0 \s-1PROGRAM\s0 \*(L"\s-1AS\s0 \s-1IS\s0\*(R" \s-1WITHOUT\s0
-\&\s-1WARRANTY\s0 \s-1OF\s0 \s-1ANY\s0 \s-1KIND\s0, \s-1EITHER\s0 \s-1EXPRESSED\s0 \s-1OR\s0 \s-1IMPLIED\s0, \s-1INCLUDING\s0, \s-1BUT\s0 \s-1NOT\s0
-\&\s-1LIMITED\s0 \s-1TO\s0, \s-1THE\s0 \s-1IMPLIED\s0 \s-1WARRANTIES\s0 \s-1OF\s0 \s-1MERCHANTABILITY\s0 \s-1AND\s0 \s-1FITNESS\s0 \s-1FOR\s0
-A \s-1PARTICULAR\s0 \s-1PURPOSE\s0.  \s-1THE\s0 \s-1ENTIRE\s0 \s-1RISK\s0 \s-1AS\s0 \s-1TO\s0 \s-1THE\s0 \s-1QUALITY\s0 \s-1AND\s0
-\&\s-1PERFORMANCE\s0 \s-1OF\s0 \s-1THE\s0 \s-1PROGRAM\s0 \s-1IS\s0 \s-1WITH\s0 \s-1YOU\s0.  \s-1SHOULD\s0 \s-1THE\s0 \s-1PROGRAM\s0 \s-1PROVE\s0
-\&\s-1DEFECTIVE\s0, \s-1YOU\s0 \s-1ASSUME\s0 \s-1THE\s0 \s-1COST\s0 \s-1OF\s0 \s-1ALL\s0 \s-1NECESSARY\s0 \s-1SERVICING\s0, \s-1REPAIR\s0 \s-1OR\s0
-\&\s-1CORRECTION\s0.
+\&\s-1THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \*(L"AS IS\*(R" WITHOUT
+WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE
+DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
+CORRECTION.\s0
 .IP "16. Limitation of Liability." 4
 .IX Item "16. Limitation of Liability."
-\&\s-1IN\s0 \s-1NO\s0 \s-1EVENT\s0 \s-1UNLESS\s0 \s-1REQUIRED\s0 \s-1BY\s0 \s-1APPLICABLE\s0 \s-1LAW\s0 \s-1OR\s0 \s-1AGREED\s0 \s-1TO\s0 \s-1IN\s0 \s-1WRITING\s0
-\&\s-1WILL\s0 \s-1ANY\s0 \s-1COPYRIGHT\s0 \s-1HOLDER\s0, \s-1OR\s0 \s-1ANY\s0 \s-1OTHER\s0 \s-1PARTY\s0 \s-1WHO\s0 \s-1MODIFIES\s0 \s-1AND/OR\s0
-\&\s-1CONVEYS\s0 \s-1THE\s0 \s-1PROGRAM\s0 \s-1AS\s0 \s-1PERMITTED\s0 \s-1ABOVE\s0, \s-1BE\s0 \s-1LIABLE\s0 \s-1TO\s0 \s-1YOU\s0 \s-1FOR\s0 \s-1DAMAGES\s0,
-\&\s-1INCLUDING\s0 \s-1ANY\s0 \s-1GENERAL\s0, \s-1SPECIAL\s0, \s-1INCIDENTAL\s0 \s-1OR\s0 \s-1CONSEQUENTIAL\s0 \s-1DAMAGES\s0
-\&\s-1ARISING\s0 \s-1OUT\s0 \s-1OF\s0 \s-1THE\s0 \s-1USE\s0 \s-1OR\s0 \s-1INABILITY\s0 \s-1TO\s0 \s-1USE\s0 \s-1THE\s0 \s-1PROGRAM\s0 (\s-1INCLUDING\s0 \s-1BUT\s0
-\&\s-1NOT\s0 \s-1LIMITED\s0 \s-1TO\s0 \s-1LOSS\s0 \s-1OF\s0 \s-1DATA\s0 \s-1OR\s0 \s-1DATA\s0 \s-1BEING\s0 \s-1RENDERED\s0 \s-1INACCURATE\s0 \s-1OR\s0
-\&\s-1LOSSES\s0 \s-1SUSTAINED\s0 \s-1BY\s0 \s-1YOU\s0 \s-1OR\s0 \s-1THIRD\s0 \s-1PARTIES\s0 \s-1OR\s0 A \s-1FAILURE\s0 \s-1OF\s0 \s-1THE\s0 \s-1PROGRAM\s0
-\&\s-1TO\s0 \s-1OPERATE\s0 \s-1WITH\s0 \s-1ANY\s0 \s-1OTHER\s0 \s-1PROGRAMS\s0), \s-1EVEN\s0 \s-1IF\s0 \s-1SUCH\s0 \s-1HOLDER\s0 \s-1OR\s0 \s-1OTHER\s0
-\&\s-1PARTY\s0 \s-1HAS\s0 \s-1BEEN\s0 \s-1ADVISED\s0 \s-1OF\s0 \s-1THE\s0 \s-1POSSIBILITY\s0 \s-1OF\s0 \s-1SUCH\s0 \s-1DAMAGES\s0.
+\&\s-1IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR
+CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM \s0(\s-1INCLUDING BUT
+NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR
+LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM
+TO OPERATE WITH ANY OTHER PROGRAMS\s0), \s-1EVEN IF SUCH HOLDER OR OTHER
+PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\s0
 .IP "17. Interpretation of Sections 15 and 16." 4
 .IX Item "17. Interpretation of Sections 15 and 16."
 If the disclaimer of warranty and limitation of liability provided
@@ -770,7 +779,7 @@
 an absolute waiver of all civil liability in connection with the
 Program, unless a warranty or assumption of liability accompanies a
 copy of the Program in return for a fee.
-.SS "\s-1END\s0 \s-1OF\s0 \s-1TERMS\s0 \s-1AND\s0 \s-1CONDITIONS\s0"
+.SS "\s-1END OF TERMS AND CONDITIONS\s0"
 .IX Subsection "END OF TERMS AND CONDITIONS"
 .SS "How to Apply These Terms to Your New Programs"
 .IX Subsection "How to Apply These Terms to Your New Programs"
@@ -821,7 +830,7 @@
 .PP
 You should also get your employer (if you work as a programmer) or school,
 if any, to sign a \*(L"copyright disclaimer\*(R" for the program, if necessary.
-For more information on this, and how to apply and follow the \s-1GNU\s0 \s-1GPL\s0, see
+For more information on this, and how to apply and follow the \s-1GNU GPL,\s0 see
 <\fBhttp://www.gnu.org/licenses/\fR>.
 .PP
 The \s-1GNU\s0 General Public License does not permit incorporating your
